/*
Global Function that runs validation and notification;
INPUT STRING: id of form element to validate sepetated | followed by functions to validate against; seperated by commas...
I.E. txtbox1|IsRequired|IsNumeric|IsDate,txtbox2|IsRequired

OPTIONAL INPUT:
Error Message: To specify the error message create a variable called "message" in page containing a string of the message you wish to write!
To specify the location where the error message is to appear include a HTML element in page with the ID of notifyError 
*/
var message = null;

function ValidateForm(strValidate) {

	removeAsterisk(); //sets display:none if a feild has been validated before!
	var status = true;
	if (strValidate.indexOf(",") != -1) {
		var toValidate = strValidate.split(',');
	} else {
		var toValidate = new Array(strValidate);		
	}
	
	for (var i=0; i<toValidate.length; i++) {
		control = toValidate[i].split('|');
		
		for (var x=0; x<control.length; x++) {
			var id = control[0];
			
			if (x>0) {
				switch (control[x]) {
					case 'IsRequired':
						if (IsRequired(id) == false) {
							status = false;
							createAsterisk(id);
						} // ends if for IsRequired
						break;
					case 'IsNumeric':
						if (IsNumeric(id) == false) {
							status = false;
							createAsterisk(id);
						} //ends if for IsNumeric
						break;
					case 'IsFloat':
						if (IsFloat(id) == false) {
							status = false;
							createAsterisk(id);
						} //ends if for IsFloat
						break;
					case 'IsDate':
						if (IsDate(id) == false) {
							status = false;
							createAsterisk(id);
						} //ends if for IsDate
						break;
					case 'IsLegalFileName':
						if (IsLegalFileName(id) == false) {
							status = false;
							createAsterisk(id);
						} // ends if for IsLegalFileName
						break;
					case 'IsLegalFolderName':
						if (IsLegalFileName(id) == false) {
							status = false;
							createAsterisk(id);
						} // ends if for IsLegalFileName
						break;
						case 'IsEmailAddress':
						if (IsEmailAddress(id) == false) {
							status = false;
							createAsterisk(id);
						} // ends if for IsEmailAddress
						break;
				} //ends switch
			} //ends if
		} //ends inner for			
	} //ends outer for

	return status;
}; // ends function


function trim(sString) {
	while (sString.substring(0,1) == ' ') {
		sString = sString.substring(1, sString.length);
	}
	while (sString.substring(sString.length-1, sString.length) == ' ') {
		sString = sString.substring(0,sString.length-1);
	}
	return sString;
};

function createAsterisk(formId) {
	if (!document.getElementById('err_' + formId)) {
		var pTag = document.getElementById(formId).parentNode; //Gets the "parent" tag around the input tag (defined by id)
		var createSpan = true;
		var labels = document.getElementsByTagName("label"); //used to discover a label tag if one exists for the current form element! if one does then put the noification in the label
		for (x=0; x<labels.length; x++) {
			//alert(labels[x].outerHTML);
			try {
				var tag = labels[x].outerHTML;
				if (tag.indexOf('for=' + formId) > -1) {
					var spanTag = labels[x].appendChild(document.createElement('span'));
					createSpan = false;
					break;	
				}
			} catch(err) {
				try {
					if (labels[x].getAttribute('for')==formId ) {
						var spanTag = labels[x].appendChild(document.createElement('span'));
						createSpan = false;
						break;
					}
				} catch(err) {
					if (labels[x].getAttributeNS('for')==formId ) {
						var spanTag = labels[x].appendChild(document.createElement('span'));
						createSpan = false;
						break;
					}
				}
			}
			
			//alert('contents: ' + tag + ', id: ' + formId + ' ' + tag.indexOf('for=' + formId));
			
		}
		if (createSpan==true) {
			var spanTag = pTag.appendChild(document.createElement('span')); //Builds a span tag at the end of the parent tag defined above
		}
		spanTag.id = 'err_' + formId; //Assigns an id to the span tag		
		spanTag.className = 'formError';
		document.getElementById('err_' + formId).innerHTML = document.getElementById('err_' + formId).innerHTML + '<strong>&nbsp;*</strong>';
		createErrorLog();
		return true;
	} else {
		document.getElementById('err_' + formId).style.display = '';
		return false;
	}
};
function createErrorLog() { // Builds div for Page Level error notification
//NOTE: Future extension, to build in ability to enter what caused the validation error; e.g. "Date is in valid"
	if (message == null) { message = '* Errors were found on this page!'; }
	if (document.getElementById('errorLog')==null || document.getElementById('notifyError')==null) { 
		if (!document.getElementById('notifyError')) { //if no position is specified for error notification then create one at top of document
			var divTag = document.body.insertBefore(document.createElement('div'), document.body.firstChild);
			divTag.id = 'errorLog';
			divTag.className = 'formError';
			divTag.innerHTML = message; //put error message in page!
		} else {
			var notifyError = document.getElementById('notifyError');
			notifyError.className = 'formError';
			notifyError.innerHTML = message; //put error message in page!
		}
	}
	
	/*if (document.getElementById('errorLog')==null || document.getElementById('notifyErrorUpdate')==null) { 
		if (!document.getElementById('notifyErrorUpdate')) { //if no position is specified for error notification then create one at top of document
			var divTag = document.body.insertBefore(document.createElement('div'), document.body.firstChild);
			divTag.id = 'errorLog';
			divTag.className = 'formError';
			divTag.innerHTML = message; //put error message in page!
		} else {
			var notifyError = document.getElementById('notifyErrorUpdate');
			notifyError.className = 'formError';
			notifyError.innerHTML = message; //put error message in page!
		}
	}  */
};

function removeAsterisk() {
	var tags = document.getElementsByTagName('span');
	for (var i=0; i<tags.length; i++) {
		var tagId = tags[i].id;
		if (tagId.indexOf('err_') > -1) {
			document.getElementById(tagId).style.display = 'none';
		}
	}
};

/*-------------- VALIDATION FUNCTIONS BEGIN ---------------*/
//checks if the value has had some input! i.e. is NOT null
function IsRequired(id) {
	var val = trim(document.getElementById(id).value);
	if (val.length ==0) {
		return false;
	} else {
		return true;
	}
};


//Checks for a numeric value
function IsNumeric(id) {
	var sText = trim(document.getElementById(id).value);
	if (sText.length == 0) { return true; } //Note: Returns true if nothing was entered. OPTION: Use IsRequired in combo with IsNumeric
   	var ValidChars = "0123456789";
   	var IsNumber=true;
   	var Char;

   	for (i = 0; i < sText.length && IsNumber == true; i++) { 
      	Char = sText.charAt(i); 
      	if (ValidChars.indexOf(Char) == -1) {
         	IsNumber = false;
      	}
   	}
	return IsNumber;
};

//Checks for a floating point value
function IsFloat(id) {
	var sText = trim(document.getElementById(id).value);
	if (sText.length == 0) { return true; } //Note: Returns true if nothing was entered. OPTION: Use IsRequired in combo with IsFloat
   	var ValidChars = "0123456789.";
   	var IsNumber=true;
   	var Char;
	var Decimal = 0;

   	for (i = 0; i < sText.length && IsNumber == true; i++) { 
      	Char = sText.charAt(i); 
		if (Char=='.') { Decimal++; }
		if (Decimal>1) { IsNumber = false; }
      	if (ValidChars.indexOf(Char) == -1) {
         	IsNumber = false;
      	}
   	}
	return IsNumber;
};
   
//Checks for a valid date!
function IsDate(id) {
	var inputStr = trim(document.getElementById(id).value); //NOTE: Input string must be in form of dd/mm/yyyy
	if (inputStr.length == 0) { 
		return true; //Note: Returns true if no date was entered. OPTION: Use IsRequired in combo with IsDate
	} else if (inputStr.length!=10) {
		return false; //NOTE: Returns false if input str is NOT 8 Chars
	}
	
	var dt = inputStr.split("/");
	var day = dt[0];
	var month = ((dt[1]*1) -1); // Months in Javascript work from 0-11 NOT 1-12! So take 1 away from entered value!
	var year = dt[2];
	
	var dteDate;
	dteDate = new Date(year,month,day);
	return ((day==dteDate.getDate()) && (month==dteDate.getMonth()) && (year==dteDate.getFullYear()));
};

//Checks for illegal chars in file names e.g. abcdefghijklmnopqrstuvwxyz0123456789_ are the only chars that are allowed
function IsLegalFileName(id) {
	var sText = trim(document.getElementById(id).value.toLowerCase());
	if (sText.length == 0) { return true; } //Note: Returns true if nothing was entered. OPTION: Use IsRequired in combo with IsLegal
   	var ValidChars = "abcdefghijklmnopqrstuvwxyz0123456789_(). ";
   	var Status=true;
   	var Char;

   	for (i = 0; i < sText.length && Status == true; i++) { 
      	Char = sText.charAt(i); 
      	if (ValidChars.indexOf(Char) == -1) {
         	Status = false;
      	}
   	}
	return Status;
};

function IsLegalFolderName(id) {
	var sText = trim(document.getElementById(id).value.toLowerCase());
	if (sText.length == 0) { return true; } //Note: Returns true if nothing was entered. OPTION: Use IsRequired in combo with IsLegal
   	var ValidChars = "abcdefghijklmnopqrstuvwxyz0123456789-_ ";
   	var Status=true;
   	var Char;
	for (i = 0; i < sText.length && Status == true; i++) { 
		Char = sText.charAt(i); 
		if (ValidChars.indexOf(Char) == -1) {
			Status = false;
		}
	}
	return Status;
};

//Checks for a valid email address
function IsEmailAddress(id) {
	var Status=true;
	var eText = trim(document.getElementById(id).value.toLowerCase());
	if (eText.length == 0) { return true; } //Note: Returns true if nothing was entered. OPTION: Use IsRequired in combo with IsEmailAddress
	if (eText.indexOf('@') == -1) {
		Status = false;
	}
	return Status;
};