/*********************************************************************/
/* Title: Generic HTML Form Validator                                */
/*								     */
/* Original Idea         : Emre Sevinc(*), emres at bilgi edu tr     */
/* Initial Implementation: Ferhat Can(*), ferhatc at bilgi edu tr    */
/* Final Code            : Emre Sevinc                               */
/* Testing & Coding Ideas: Serkan Guzeller, natilius at bilgi edu tr */
/* Mozilla Compatibility : Huseyin Asliturk, asliturk at yahoo com   */
/*                                                                   */
/* This code is released under GPL licence                           */
/* see http://www.gnu.org/copyleft/gpl.html for details		     */
/* July, 2003                                                        */
/*								     */
/*                                                                   */
/* TO-DO:                                                            */
/* - Add some more utility "RegEx"es                                 */
/*                                                                   */
/* NOTES:                                                            */
/* Thanks to http://fazlamesai.net community for peer                */
/* code reviews and technical support.                               */
/*                                                                   */
/*                                                                   */
/* See GenericValidator.html included with distribution              */
/* which has a demo showing the example usage of functionality       */
/*                                                                   */
/* (*): Istanbul Bilgi University (http://www.bilgi.edu.tr)          */
/* eMBA Software Development Team.                                   */
/*********************************************************************/

function validate(targetForm) {
	
    /* various predefined reg ex patterns, of course neither complete, nor guaranteed*/
    var EMAIL = "^[a-zA-Z0-9_-]+(\.([a-zA-Z0-9_-])+)*@[a-zA-Z0-9_-]+[.][a-zA-Z0-9_-]+([.][a-zA-Z0-9_-]+)*$"
    var URL = "http://"
    var NUMBER = "^[0-9]*$"
    
    for (var i = 0; i < targetForm.elements.length; i++) {
	if(targetForm.elements[i].getAttribute("strValue") != null) {
	    var message = targetForm.elements[i].getAttribute("message");
	    var strBound = targetForm.elements[i].getAttribute("strBound");	
	    var strVal = targetForm.elements[i].getAttribute("strValue");
   
	    if(eval('document.' + strBound + '.type') == 'select-one') {
		var sIndex = eval('document.' + strBound + '.selectedIndex');
		var strBoundVal = eval('document.' + strBound + '[' + sIndex + '].value'); 
	    }
	    if(strVal == strBoundVal){
		if(targetForm.elements[i].value == '') {
		    alert(message);
		    targetForm.elements[i].focus();	
		    return false;
		}						
	    }
				
	}
	
	if(targetForm.elements[i].getAttribute("isReq")) {

	    var message = targetForm.elements[i].getAttribute("message");
	    
	    if(targetForm.elements[i].type == 'checkbox') {
		if(!targetForm.elements[i].checked) {
		    alert(message);
		    targetForm.elements[i].focus();	
		    return false;
		}
	    }
	    else if(targetForm.elements[i].type == 'text' || targetForm.elements[i].type == 'password' || targetForm.elements[i].type == 'file') {
		if(targetForm.elements[i].value == '') {
		    alert(message);
		    targetForm.elements[i].focus();	
		    return false;								
		}
		if(targetForm.elements[i].getAttribute("regex") != null) {
		    var UserRegEx = targetForm.elements[i].getAttribute("regex");
		    var InputValue = targetForm.elements[i].value;
		    if(UserRegEx == 'EMAIL') {
			var re = new RegExp(EMAIL);
			if(!InputValue.match(re)) {
			    alert(message);
			    targetForm.elements[i].focus();	
			    return false;	
			}
		    }
		    else if(UserRegEx == 'URL') {
			var re = new RegExp(URL);
			if(!InputValue.match(re)) {
			    alert(message);
			    targetForm.elements[i].focus();	
			    return false;	
			}
		    }
		    else if(UserRegEx == 'NUMBER') {
			var re = new RegExp(NUMBER);
			if(!InputValue.match(re)) {
			    alert(message);
			    targetForm.elements[i].focus();	
			    return false;	
			}
		    }
		    else {
			var re = new RegExp(UserRegEx);
			if(!InputValue.match(re)) {
			    alert(message);
			    targetForm.elements[i].focus();	
			    return false;	
			}
		    }
		}
	    }
	    else if(targetForm.elements[i].type == 'select-one') {
		if(targetForm.elements[i].value == '') {
		    alert(message);
		    targetForm.elements[i].focus();	
		    return false;								
		}
	    }
	    else if(targetForm.elements[i].type == 'textarea') {
		if(targetForm.elements[i].value == '') {
		    alert(message);
		    targetForm.elements[i].focus();	
		    return false;								
		}
	    }
	    else if(targetForm.elements[i].type == 'radio') {
		var isSelected = false;
		var j = 0;
		while(targetForm.elements[i+j].type == 'radio' && 
		      targetForm.elements[i].name == targetForm.elements[i+j].name) {
		    if(targetForm.elements[i+j].checked) {
			isSelected = true;
		    }
		    j++;
					
		}
		
		j = 0;
		
		while(targetForm.elements[i-j].type == 'radio' && 
		      targetForm.elements[i].name == targetForm.elements[i-j].name) {
		    if(targetForm.elements[i-j].checked) {
			isSelected = true;
		    }
		
		    if(i-j <= 0) {
			break;
		    }
		
		    j++;					
		}				
		
		if(!isSelected) {
		    alert(message);
		    targetForm.elements[i].focus();	
		    return false;				
		}
	    }
	    else {
		return true;
	    }
	}


	if (targetForm.elements[i].getAttribute("depRequired") != null) {
	    var o = document.getElementById(targetForm.elements[i].getAttribute('depRequired'));

	    if (o.value != null) {
		if (o.value.length > 0 && targetForm.elements[i].value.length <= 0 ) {
		    alert(targetForm.elements[i].getAttribute("depMessage"));
		    targetForm.elements[i].focus();	
		    return false;
		}
	    }
	}

	if (targetForm.elements[i].getAttribute("regex") != null) {
	    var message = targetForm.elements[i].getAttribute("message");
	    var UserRegEx = targetForm.elements[i].getAttribute("regex");
	    var InputValue = targetForm.elements[i].value;
	    
	    if(UserRegEx == 'EMAIL') {
		var re = new RegExp(EMAIL);
		if(!InputValue.match(re)) {
		    alert(message);
		    targetForm.elements[i].focus();	
		    return false;	
		}
	    }
	    else if(UserRegEx == 'URL') {
		var re = new RegExp(URL);
		if(!InputValue.match(re)) {
		    alert(message);
		    targetForm.elements[i].focus();	
		    return false;	
		}
	    }
	    else if(UserRegEx == 'NUMBER') {
		var re = new RegExp(NUMBER);
		if(!InputValue.match(re)) {
		    alert(message);
		    targetForm.elements[i].focus();	
		    return false;	
		}
	    }
	    else {
		var re = new RegExp(UserRegEx);
		if(!InputValue.match(re)) {
		    alert(message);
		    targetForm.elements[i].focus();	
		    return false;	
		}
	    }
	}


	/*
	    Existential RegEx use. This means that check if the 
	    field value length is bigger than zero and only if that is satisfied
	    check for the RegEx
	*/
	if (targetForm.elements[i].getAttribute("eregex") != null) {
	    var message = targetForm.elements[i].getAttribute("message");
	    var UserRegEx = targetForm.elements[i].getAttribute("eregex");
	    var InputValue = targetForm.elements[i].value;
	    
	    if (targetForm.elements[i].value.length > 0) {
		if(UserRegEx == 'EMAIL') {
		    var re = new RegExp(EMAIL);
		    if(!InputValue.match(re)) {
			alert(message);
			targetForm.elements[i].focus();	
			return false;	
		    }
		}
		else if(UserRegEx == 'URL') {
		    var re = new RegExp(URL);
		    if(!InputValue.match(re)) {
			alert(message);
			targetForm.elements[i].focus();	
			return false;	
		    }
		}
		else if(UserRegEx == 'NUMBER') {
		    var re = new RegExp(NUMBER);
		    if(!InputValue.match(re)) {
			alert(message);
			targetForm.elements[i].focus();	
			return false;	
		    }
		}
		else {
		    var re = new RegExp(UserRegEx);
		    if(!InputValue.match(re)) {
			alert(message);
			targetForm.elements[i].focus();	
			return false;	
		    }
		}
	    }
	} // end Existential RegEx


    }
    return true;		
}
