var msg;
var error = new Array(); //customized error message for individual controls
var validated = false;   // tool tip is to be displayed only if page is validated at least once
var controlValidated = new Array(); //if a control has multiple validations ... its error-color shall be maintained 
var checkBoxGroup = new Array();
var count;
var mode;
var errFontColor = 'red';
var errFontSize = '11px';
var errFontFace = 'arial';
var focusControl;


function ValidateForm(frm,mode)
{  
	this.mode = mode.toUpperCase();
	
	validated=true;
	var flag = true;
	msg="";
	count = 0;
	focusControl = undefined;
	var elem;
	
	for (var i=0; i<frm.elements.length; i++)
	{
		elem = frm.elements[i];  // accessing each element of the form
		controlValidated[elem.id]=true;
		var valid = elem.getAttribute("validate"); // getting the validate value of the element
		
		var errorMessage = elem.getAttribute("errorMessage");//ErrorMessage;
		var elementValue = elem.value;
		//alert("1"+elementValue);
		elementValue = elementValue.trim();
		
			
			if(valid != undefined && elem.disabled == false) // check if validate attribute is present in each element
			{
			
			if(elem.type == "text" || elem.type == "password" ||elem.type == "textarea" || elem.type == "hidden" && elem.disabled==false) // check if element type is text and enabled
			 {
			   var valid_array = valid.split(":"); // split validate contents
				 var errorMessages = errorMessage.split(":");//split error messages
				for(var j=0; j<valid_array.length; j++)
				{
					var valid_contents = valid_array[j].split("="); //split the contents of each value of the validate attribute
							
					switch(valid_contents[0].toLowerCase())
					{
						case "alphabet":
						if(!checkAlphabet(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
							break;
						
					case "numeric":
						if(!checkNumeric(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";//errorMessages[j]);
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
							break;
								
						case "alphanumeric":
							if(!checkAlphanumeric(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag=false;
							}
							break;
							
						case "alphanumericspecial":
							if(!checkAlphanumericSpecial(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag=false;
							}
							break;
						case "alphabetspecial":
							if(!checkAlphaSpecial(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag=false;
							}
							break;
									
						case "maxlength":
							if(!checkMaxlength(elementValue,valid_contents[1]))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
							break;
								
						case "minlength":
							if(!checkMinlength(elementValue,valid_contents[1]))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
							break;
									
						case "phone":
							if(!checkPhone(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
							break;
									
						case "phonewithextension":
							var controlExtension = valid_contents[1];
                            var secondElement = frm.elements[controlExtension];
							
							if(!checkPhone(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
							else
							{
						        if(elementValue == "" && secondElement.value.trim() != "")
						        {
							        msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
							        error[elem.id]=getErrormessage(errorMessages[j]);
							        controlValidated[elem.id] = false;
							        flag = false;	
							        focusControl=secondElement;				    
						        }						        
							}
							
							break;
							
						case "zip":
							if(!checkZipcode(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
							break;
									
						case "date":
						
							if(elementValue!="" && !checkDate(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
						break;
									
						case "email":
							if(!checkEmail(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
							break;
									
						case "required":
							if(!checkNonempty(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
								
							}
							break;
							
					case "taxid":
						 if(!checkTaxId(elementValue))
							{	msg+="<li>"+getErrormessage(errorMessages[j])+"<br/>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
							break;		
							
						case "webaddress":
							if(!checkWebAddress(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag=false;
							}
						break;
						
						case "compare":
							var controlToCompare = valid_contents[1];
							var secondElement = frm.elements[controlToCompare];
							if(!matchStrings(elementValue,secondElement.value))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
							
							break;
						case "default":
					       if(hasAngleBracket(elementValue))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br/>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
							
					        break;
					}//end switch
				}//end for each validations for a control 
				displayControlErrors(elem);
			}// end type
			else if(elem.type == "select-one" && elem.disabled==false) // enabled drop down lists
			{
				var errorMessages = errorMessage.split(":");//split error messages
				var valid_array = valid.split(":"); // split validate contents
				for(var j=0; j<valid_array.length; j++)
				{
					var valid_contents = valid_array[j].split("="); //split the contents of each value of the validate attribute
					switch(valid_contents[0].toLowerCase())
					{
						case "default":
							if(!checkSelection(valid_contents[1],elem.options[elem.selectedIndex].value))
							{
								msg+="<li>"+getErrormessage(errorMessages[j])+"<br>";
								error[elem.id]=getErrormessage(errorMessages[j]);
								controlValidated[elem.id] = false;
								flag = false;
							}
							break;
					}//end switch
				}//end for
				displayControlErrors(elem);
			}//end type
		 }//end if not undefined
		  else if(elem.type == "checkbox")
		  {
		     totalCheckBoxes=0;
		     var parent = elem.parentNode;
		 
		    valid = parent.getAttribute("validate");
		    if(valid != undefined)
		    {
		     //repeatdirection = vertical
		     if((parent.childNodes.length+1)%3==0)
		       totalCheckBoxes=(parent.childNodes.length+1)/3;
		     else  //repeatdirection = horizontal
				totalCheckBoxes=parent.childNodes.length/2
		     errorMessage = parent.getAttribute("ErrorMessage");
		      if(count == 0)
				{ checkBoxGroup[parent.id] = 0;
				  count = 1;
				}
			else
				count ++;
				valid = valid.split("=");
			if(elem.checked)
			{
				checkBoxGroup[parent.id] = checkBoxGroup[parent.id]+1;
			}
			 chkmsg="";
			
		    if(checkBoxGroup[parent.id] < valid[1])
		    {
				chkmsg = "<li>"+getErrormessage(errorMessage)+"<br>";
				error[parent.id]=getErrormessage(errorMessage);
		    }
		    else
		    {
				chkmsg = "";
				error[parent.id]='';
		    }
		  if(count>=totalCheckBoxes && checkBoxGroup[parent.id] < valid[1])
				{	msg+=chkmsg;
					controlValidated[parent.id] = false;
					flag = false;
					displayControlErrors(parent);
				}
			else if (count>=totalCheckBoxes && checkBoxGroup[parent.id] >= valid[1])
			{
				controlValidated[parent.id] = true;
				displayControlErrors(parent);
			}
		  }
		}//checkbox
	
    if(controlValidated[elem.id]!=null && focusControl==undefined&&controlValidated[elem.id] == false)
		focusControl=elem;
	
  }
	if(!flag)
	{ 
		if(mode == 'SUMMARY')
		{
			document.all.errSummary.style.color=errFontColor;
			document.all.errSummary.style.fontSize =errFontSize;
			document.all.errSummary.style.fontFamily =errFontFace;
			document.all.errSummary.innerHTML= "<b>Error Message:</b> <br>"+msg;
			document.all.errSummary.style.visibility="visible";
		}
		else if(mode=='ALERT')
		{
			msg = msg.replace(/\<br\>/g,"").replace(/\<li\>/g,"");
			alert(msg);
		}
		else if(mode != 'CONTROL')
		{
		  if(document.all.errSummary != null)
		    {
				document.all.errSummary.style.color=errFontColor;
				document.all.errSummary.style.fontSize =errFontSize;
				document.all.errSummary.style.fontFamily =errFontFace;
				document.all.errSummary.innerHTML= "Error Message <br>"+msg;
				document.all.errSummary.style.visibility="visible";
		    }
		    else
		    {
				msg = msg.replace(/\<br\>/g,"").replace(/\<li\>/g,"");
				alert(msg);
			}
	 }	
	}
	
	if(focusControl!=undefined)
		focusControl.focus();
	
	return flag;
}

function displayControlErrors(elem)
{

 
  if(controlValidated[elem.id]==true)
		{
			
			error[elem.id]="";
			if(mode=='CONTROL')
			{
				errControl = document.getElementById("err"+getControlName(elem.id));
				if(errControl!=null)
				{
					errControl.innerHTML=''
					
					errControl.style.visibility="hidden";
				}
			}
		}//end if
		else
		{
			if(mode=='CONTROL')
			{
				errControl = document.getElementById("err"+getControlName(elem.id));
			

				if(errControl!=null)
				{
					errControl.style.color=errFontColor;
					errControl.style.fontSize =errFontSize;
					errControl.style.fontFamily =errFontFace;
					errControl.innerHTML=error[elem.id]+"<br>";
					errControl.style.visibility="visible";
				}
			}//end CONTROL
			//elem.style.backgroundColor = 'pink';
		}//end else
	}

//introduced to work with ASP NET 2.0 with master page
function getControlName(longId)
{
    strings = longId.split("_");    
    tmpStr = strings[strings.length-1];
    strLen  =tmpStr.length;
    tmpChar = tmpStr.substring(0,1).toUpperCase();
    postString = tmpStr.substring(1,strLen);
    tmpStr = tmpChar + postString;   
    return tmpStr;
}

// Declaring valid date character, minimum year and maximum year
// Updated by AM on 12/29/2005
// Old checkDate() function is deprecated
var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function isInteger(text){
	var i;
    for (i = 0; i < text.length; i++){   
        // Check that current character is number.
        var digit = text.charAt(i);
        if (((digit < "0") || (digit > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}


		

function stripCharsInBag(string, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < string.length; i++){   
        var newCharacter = string.charAt(i);
        if (bag.indexOf(newCharacter) == -1) returnString += newCharacter;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

function DaysArray(numberOfMonths) {
	for (var i = 1; i <= numberOfMonths; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}


function checkDate(dateString){
	var daysInMonth = DaysArray(12)
	var pos1=dateString.indexOf(dtCh)
	var pos2=dateString.indexOf(dtCh,pos1+1)
	var strMonth=dateString.substring(0,pos1)
	var strDay=dateString.substring(pos1+1,pos2)
	var strYear=dateString.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) 
	{
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		//alert("The date format should be : mm/dd/yyyy")
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		//alert("Please enter a valid month")
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		//alert("Please enter a valid day")
		return false
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		//alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
		return false
	}
	if (dateString.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dateString, dtCh))==false){
		//alert("Please enter a valid date")
		return false
	}
return true
}

String.prototype.trim = function() 
{
	return this.replace(/^\s*(\b.*\b|)\s*$/, "$1");
}

function getErrormessage(message) // function to get the relevant error message
{
	if(message != undefined)
		return "\n"+message;
	else
		return "\nInvalid data entered";
}

//use to replace RequiredFieldValidator of DotNet
function checkNonempty(fieldContent)
{
	if(fieldContent == "")
		return false;
	else
		return true;
}


function checkSelection(defaultVal,currentVal)//function to check whether something is selected in dropdown list
{
	if (defaultVal == currentVal)
		return false;
	else
		return true;
}
function checkAlphabet(value) // function to check alphabet
{
	var alphabetPattern = /^([a-z]|[A-Z])+$/;
	if (value!=""&&value.match(alphabetPattern)==null)
		return false;
	else
		return true;
}

function checkNumeric(value) // function to check number
{
	var numberPattern = /^([0-9]+)?$/;
	if (value!=""&&value.match(numberPattern)==null)
		return false;
	else
		return true;
}
function checkAlphanumeric(value) // function to check alpha numeric value
{
	var AlphaNumPattern = /^([a-z]|[A-Z]|[0-9])+$/;
	if (value!=""&&value.match(AlphaNumPattern)==null)
		return false;
	else
		return true;
}

function checkAlphanumericSpecial(value) // function to check alpha numeric value
{
	var AlphaNumPattern = /^([a-z]|[A-Z]|[0-9]|\-|\,|\'|\ )+$/;
	if (value!=""&&value.match(AlphaNumPattern)==null)
		return false;
	else
		return true;
}

function checkAlphaSpecial(value) // function to check alpha numeric value
{
	var AlphaNumPattern = /^([a-z]|[A-Z])+([a-z]|[A-Z]|\-|\,|\'|\ )*$/;
	if (value!=""&&value.match(AlphaNumPattern)==null)
		return false;
	else
		return true;
}

function checkPhone(value) // function to check phone number
{
	var PhonePattern = /^\d{3}-\d{3}-\d{4}$/;
	if (value!=""&&value.match(PhonePattern)==null)
		return false;
	else
		return true;
}

function checkMaxlength(value,length) // function to check max length
{
	if(value.length <= length)
		return true;
	else
		return false;
}
function checkMinlength(value,length) // function to check min length
{
	if(value.length >= length)
		return true;
	else
		return false;
}
function checkEmail(email) // function to check email
{
    var txtEmailPattern = /^([a-zA-Z0-9''_]+)([a-zA-Z0-9''_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
    
	if (email!=""&&email.match(txtEmailPattern)==null)
		return false;
	else
		return true;
}

function checkTaxId(taxId) // function to check the tax Id
{
	//var TaxIdPattern = /^(\d{2}-\d{7})$/;
	var TaxIdPattern = /^(\d{2}-\d{7}(-\d{2})?)$/;
	if (taxId!=""&&taxId.match(TaxIdPattern)==null)
		return false;
	else
		return true;
}


function checkZipcode(zip) // function to check the zip code
{
	var ZipPattern = /^(\d{5}|\d{5}-\d{4})$/;
	if (zip!=""&&zip.match(ZipPattern)==null)
		return false;
	else
		return true;
}

function matchStrings(str1,str2) // function to check if two strings are equal
{
	if(str1 != str2)
		return false;
	else
		return true;
}

function hasAngleBracket(text)
{
    if(text.indexOf('<') > -1 || text.indexOf('>') > -1 ) 
     return true 
     else
      return false;
}

function checkWebAddress(address) //validating a web address
{
	var webPattern = /^(http|https):\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?$/;
	if(address!=""&&address.match(webPattern)==null)
		return false;
	else
		return true;
}

function showToolTip(current,e)
{

	if (validated && document.all&&document.readyState=="complete")
	{
	document.all.toolTipText.innerHTML='<style="border:1px solid black">'+error[current.id]
	document.all.toolTipText.style.pixelLeft=event.clientX+document.body.scrollLeft+10
	document.all.toolTipText.style.pixelTop=event.clientY+document.body.scrollTop+10
	document.all.toolTipText.style.width=error[current.id].length*6;
	document.all.toolTipText.style.visibility="visible"
	}
}
function hideToolTip()
{
	if (document.all)
		document.all.toolTipText.style.visibility="hidden"
}

