/*
#########################################################################################

	Validation Script Version - 1.0

	Purpose					: To validate the form elements
	Functions & Parameters	: 

		Name of the Function		Parameters							Return Type

	1.	validate_form()				Referernce of the form				Boolean
	2.	lr_trim()														String
	3.	chkSplCharacters()			Reference of an text element	
	4.	chkSplFormat()				Reference of an text element

#########################################################################################
*/

var bValid = 1;

function lr_trim()
{
	return this.replace(/^\s+/,'').replace(/\s+$/,'');
}
String.prototype.trim = lr_trim;

function chkSplCharacters(cntrl)
{
	var discardChars = "`~!@#$%^&*():;<>";
	var splChars = "`~!@#$%^&*():;<>";
	var splCharCounter = 0;
    for (var i = 0; i < cntrl.value.length; i++)
    {
		if (discardChars.indexOf(cntrl.value.charAt(i)) != -1)
		{
			alert ("Following special characters are not allowed in "+  cntrl.getAttribute("label")+".\n\n" + discardChars);
			cntrl.select();
            bValid = 0;
            break;
        }
        if (splChars.indexOf(cntrl.value.charAt(i)) != -1)
			splCharCounter++; 
		else
			splCharCounter = 0;
		if (splCharCounter > 2)
		{
		    alert ("Following special characters are not allowed in "+  cntrl.getAttribute("label")+".\n\n" + discardChars);
			//alert ("Invalid input for " + cntrl.getAttribute("label"));
			cntrl.select();
            bValid = 0;
            break;			
		}
	}
}

function chkSplFormat(cntrl)
{
	var format = cntrl.getAttribute("format").toLowerCase();
	switch(format)
	{
		case 'email':
			var addr = cntrl.value;
			var addr_array = addr.split(",");
			var iCurrPos =0;
			if (addr_array.length > 1)
			{
				for (var iCtr = 0; iCtr < addr_array.length; iCtr++)
				{
					if (!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(addr_array[iCtr].trim()))
					{
						//alert("Invalid email adderss,\n as it is not in the correct format: xxx@xxx.xxx");
						alert("Please enter a valid Email Address");
						var oRange = cntrl.createTextRange();
						var iPos = addr.indexOf(addr_array[iCtr].trim(), iCurrPos);
						oRange.moveStart("character", iPos);
						oRange.moveEnd("character", (iPos + addr_array[iCtr].trim().length) - addr.length);
						oRange.select();
						bValid = 0;
						break;					
					}
					iCurrPos += addr_array[iCtr].length;
				}
			}
			else
			{
				if (!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(addr))
				//if (!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,6})+$/.test(addr))
				{
					//alert("Your email address does not look correct: xxx@xxx.xxx\nPlease check and try again");
					alert("Please enter a valid Email Address");
					cntrl.select();
					bValid = 0;
				}
			}
			break;
		case 'url':
			var url = cntrl.value;
			if (!/^http[s]*\:\/\/[wW]{3}\.+[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}.*$|^http[s]*\:\/\/[^w]{3}[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}.*$|http[s]*\:\/\/[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}.*$/.test(url))
			//if (!/^(ftp|https?):\/\/(www\.)?[a-z0-9\-\_\.]{3,}\.[a-z]{2,6}(\/)?([a-z0-9\-\#\%\&\.\?\=])+$/.test(url))
			{
				alert("This is not a valid url,\n as it is not in the correct format: http://www.xxxxxx.xxx");
				cntrl.select();
				bValid = 0;
			}
			break;		
		case 'phone/fax':
			var phoneFax = cntrl.value;
			if (cntrl.getAttribute("country") != null)
			{
				var country = cntrl.getAttribute("country").toUpperCase();
				switch (country)
				{
					case 'UK' :
						if (!/^0[1|2|7]{1}[0-9\s]{9,12}/i.test(phoneFax))
						{
							alert("Please enter a valid " + cntrl.getAttribute("label") + " to a UK number beginning with 01, 02 or 07");
							cntrl.select();
							bValid = 0;						
						}
						break;
				}
			}
			else
			{
				var validChars = ", +-()0123456789";
				for(i=0;i < phoneFax.length;i++)
				{
					if(validChars.indexOf(phoneFax.charAt(i)) == -1)
					{
						alert("Please enter a valid " + cntrl.getAttribute("label"));
						cntrl.select();
						bValid = 0;
						break;
					}
				}
			}
			break;
		case 'postcode' :
			var postCode = cntrl.value;
			if (!/^[a-pr-uwyz]((\d{1,2})|([a-hk-y]\d{1,2})|(\d[a-hjks-uw])|([a-hk-y]\d[abehmnprv-y]))\s{0,1}\d[abd-hjlnp-uw-z]{2}$/i.test(postCode))
			{
				alert("Please enter a valid Postcode");
				cntrl.select();
				bValid = 0;
				return false;
			}
			break;
		case 'numeric' :
			var val = cntrl.value;
			var data_type = cntrl.getAttribute("data-type").toLowerCase();
			switch (data_type)
			{
				case 'int':
					if(!/^(\+|-)?\d+$/.test(cntrl.value))
					{
						alert("Please enter only numeric value for " + cntrl.getAttribute("label"));
						cntrl.select();
						bValid = 0;
					}
					break;
				case 'unsigned int' :
					if(!/^\d+$/.test(cntrl.value))
					{
						alert("Please enter only digits for " + cntrl.getAttribute("label"));
						cntrl.select();
						bValid = 0;
					}				
					break;
				case 'decimal':
					if(!/^-{0,1}\d*\.{0,1}\d+$/.test(cntrl.value))
					{
						alert("Please enter only numeric value for " + cntrl.getAttribute("label"));
						cntrl.select();
						bValid = 0;
					}
					break;
				case 'unsigned decimal' :
					if(!/^\d*\.{0,1}\d+$/.test(cntrl.value))
					{
						alert("Please enter only digits for " + cntrl.getAttribute("label"));
						cntrl.select();
						bValid = 0;
					}				
					break;					
			}
			if(data_type.indexOf('unsigned') > 0 && val < 0)
			{
				alert("Negative value is not allowed for " + cntrl.getAttribute("label"));
				cntrl.select();
				bValid = 0;
			}
			if(cntrl.getAttribute("zero-allowed") == null && val == 0)
			{
				alert("Zero (0) value is not allowed for " + cntrl.getAttribute("label"));
				cntrl.select();
				bValid = 0;
			}
			break;
		case 'text' :
			var val = cntrl.value;
			if(!/^[a-z][-a-z0-9 ]+$/i.test(cntrl.value))
			{
				alert("Please enter your " + cntrl.getAttribute("label") + " correctly (with alphabetic characters)");
				cntrl.select();
				bValid = 0;
			}
			break;
		case 'date' :
			var dtTargetDate = new Date(cntrl.value.replace(/-/g, " "));
			if(cntrl.getAttribute("discard-past-dates") != null && dtTargetDate <= new Date())
			{
				alert("Please select a valid future date for " + cntrl.getAttribute("label"));
				cntrl.select();
				bValid = 0;
			}			
			break;			
		case 'username/password':
			var splChars = " ";
			for (var i = 0; i < cntrl.value.length; i++)
			{
				if (splChars.indexOf(cntrl.value.charAt(i)) != -1)
				{
					alert ("Blank spaces are allowed for " + cntrl.getAttribute("label"));
					cntrl.select();
			        bValid = 0;
			        break;
			    }
			}
	}
}

function doComparision(cntrl1, cntrl2)
{
	if(cntrl1.value != cntrl2.value)
	{
		alert("\"" + cntrl2.getAttribute("label") + "\" and \"" + cntrl1.getAttribute("label") + "\" do not match");
		cntrl1.value="";
		cntrl2.value="";
		cntrl2.focus();
		bValid = 0;
	}
}

function validate_file(oFile)
{
	var vFileName = oFile.value.trim();
	if (vFileName == "")
		return false;
	iDotPos = vFileName.lastIndexOf(".")
	if(iDotPos <= 0)
	{
		alert("You must specified the valid value for the field \"" + oFile.getAttribute("label") + "\"");
		oFile.focus();
		bValid = 0;
		return false;
	}
	else
	{
		if(oFile.getAttribute("filter") != null)
		{
			var aValidFileTypes = oFile.getAttribute("filter").split("/");
			var bValidFile = false;
			for(var ctr = 0; ctr < aValidFileTypes.length; ctr++)
			{
				var vFileExt = vFileName.substring(iDotPos);
				if(vFileExt.toLowerCase() == aValidFileTypes[ctr])
				{
					bValidFile = true; break;
				}
			}
			if(!bValidFile)
			{
				alert("System allows only the following file types\n\n{" + oFile.getAttribute("filter") + "}");
				oFile.focus();
				bValid = 0;
				return false;
			}
		}
	}
	return true;
}

function validate_form(oFrm)
{
	var aElements = oFrm.elements;
	bValid = 1;
	for(var i=0;i < aElements.length;i++)
	{
		if(!(aElements[i].disabled || aElements[i].getAttribute("with-no-check") != null || aElements[i].type == "button" || aElements[i].type == "submit"))
		{
			if(aElements[i].type=="text" || aElements[i].type=="password")
			{
				if(aElements[i].type != "password")
					aElements[i].value = aElements[i].value.trim();
				if(aElements[i].value.length == 0 || (aElements[i].getAttribute("null-value") != null && aElements[i].getAttribute("null-value").toLowerCase() == aElements[i].value.toLowerCase()))
				{
					if(aElements[i].getAttribute("required") != null)
					{
						alert("Please enter " + aElements[i].getAttribute("label"));
						aElements[i].focus();
						bValid = 0;
					}
				}
				if(aElements[i].value.length > 0)
				{
					if(aElements[i].getAttribute("format") == null)
						chkSplCharacters(aElements[i]);
					else if(aElements[i].getAttribute("format").toLowerCase() != "none")
					{
						if(aElements[i].getAttribute("default") != null)
						{
							if(aElements[i].value.toLowerCase() != aElements[i].getAttribute("default").toLowerCase())
								chkSplFormat(aElements[i]);
						}
						else
							chkSplFormat(aElements[i]);
					}
					if(aElements[i].getAttribute("compareWith") != null && bValid==1)
						doComparision(aElements[i], eval(aElements[i].getAttribute("compareWith")));
					if(aElements[i].getAttribute("minlength") != null && bValid==1)
					{
						if(aElements[i].value.length < aElements[i].getAttribute("minlength"))
						{
							alert("You have not entered the minimum required text (" + aElements[i].getAttribute("minlength") + " characters) for " + aElements[i].getAttribute("label") + "\nPlease edit your entry and re-submit");
							aElements[i].focus();
							bValid = 0;
						}
					}					
				}
			}
			else if(aElements[i].type == "textarea")
			{
				var iframe = false;
				if (document.all)
				{
					var editor_obj = eval(document.all["_" + aElements[i].name + "_editor"]);
					if (typeof(editor_obj) == "object")
						if (editor_obj.tagName.toLowerCase() == 'iframe')
							iframe = true;
				}					
				else
				{
					var editor_obj = document.getElementsByTagName("_" + aElements[i].name + "_editor");
					if (typeof(editor_obj) == "object" && editor_obj.length != 0)
						if (editor_obj.tagName.toLowerCase() == 'iframe')
							iframe = true;	
				}
				if (iframe)
				{
					var editdoc = editor_obj.contentWindow.document;
					var contents = editdoc.body.createTextRange().htmlText;
					if (contents.length == 0 && aElements[i].getAttribute("required") != null)
					{
						alert("Please enter " + aElements[i].getAttribute("label"));
						editor_obj.focus();
						bValid = 0;							
					}
					else if (contents.length > aElements[i].getAttribute("maxlength"))
					{
						alert(aElements[i].getAttribute("label") + " should not exceed the maximum length of " + aElements[i].getAttribute("maxlength") + " characters");
						editor_obj.focus();
						bValid = 0;
					}
				}
				else
				{
					
					if (aElements[i].value.length == 0 && aElements[i].getAttribute("required") != null)
					{
						alert("Please enter " + aElements[i].getAttribute("label"));
						aElements[i].focus();
						bValid = 0;
					}				
					else if (aElements[i].value.length > aElements[i].getAttribute("maxlength"))
					{
						alert(aElements[i].getAttribute("label") + " should not exceed the maximum length of " + aElements[i].getAttribute("maxlength") + " characters");
						aElements[i].focus();
						bValid = 0;
					}						
				}
			}
			else if(aElements[i].type=="file")
			{
				if(aElements[i].value.trim() == "")
				{
					if(aElements[i].getAttribute("required") != null)
					{
						alert("Please select " + aElements[i].getAttribute("label"));
						aElements[i].select();
						bValid = 0;
					}
				}
				else
				{
					validate_file(aElements[i]);
				}
			}
			else if(aElements[i].type == "select" || aElements[i].type == "select-one") // If it is a combox box
			{
				if(aElements[i][aElements[i].selectedIndex].value=="" && aElements[i].getAttribute("required") != null)
				{
					alert("Please enter " + aElements[i].getAttribute("label") + " from the list");
					aElements[i].focus();
					bValid = 0;
				}
			}
			else if(aElements[i].type == "select-multiple") // If it is a list box
			{
				if(aElements[i].length==0 && aElements[i].getAttribute("required") != null)
				{
					alert("Please enter \"" + aElements[i].getAttribute("label") + "\"");
					aElements[i].focus();
					bValid = 0;
				}
			}
			else if(aElements[i].type == "radio") // If it is a radio button
			{
				var objRadioGroup = oFrm.elements[aElements[i].name];
				var bChecked = false;
				if (objRadioGroup.length == null)
				{
					if (objRadioGroup.checked)
						bChecked = true;
				}
				else
				{
					for(var j=0; j< objRadioGroup.length; j++)
					{
						if(objRadioGroup[j].checked)
						{
							bChecked = true;
							break;
						}
					}
				}
				if(!bChecked && aElements[i].getAttribute("required") != null)
				{
					alert("Please select " + aElements[i].getAttribute("label"));
					aElements[i].focus();
					bValid = 0;
				}
			}
		}
		if(!bValid) 
			return false;
	}
	return true;
}

function checkDeleteThis(p_strDatagridId, p_strCheckBoxName, p_strMessage)
{
	var flg = 0;
	var objtbl = document.getElementById(p_strDatagridId);	
	var RowID = objtbl.rows.length;
	var strObjName = "";
	try
	{
		for(i=1;i<=objtbl.rows.length;i++)
		{
		
		    if(i>=10)
			    strObjName = p_strDatagridId + '_ctl' + i + '_' + p_strCheckBoxName;
			else
			    strObjName = p_strDatagridId + '_ctl' + 0+i + '_' + p_strCheckBoxName;
			
			var objChk = document.getElementById(strObjName);
			if((objChk!=null)&&(objChk.type == 'checkbox'))
			if(objChk.checked)
			{
				flg = 1;
			}
		}
	}
	catch(e)
	{
		flg = 0
	}
	if(flg == 0)
	{
		alert(p_strMessage);
		return false;
	}
	else 
	{
		return confirm(GetDeleteMsg("Template(s)"));
	}
}
