/*
	*********************************************
	Must Do :-
	-------
	
	1) Must write id attribute of the field no matter whether element is a button or textbox or listbox or hidden field etc.
	*********************************************

	*********************************************
	Extra Attributes :-
	----------------
	
	 1) Mandatory : For compulsory field. For list box, attribute value ==> particular option must not be selected.
	 2) Msg : For displaying the msg in the alert box.
	 3) Validchar : List of valid characters.
	 4) Invalidchar : List of in-valid characters.
	 5) Maxlength : Maximum number of characters allowed.
	 6) email_format : For email field.
	 7) same_val : Used in those fields where the value of that field is same as the other field. Its value is the id of the field with which we have to compare the value. 
	 8) file_type : Used to specify that only this type of file can be selected.
	 9) notallzero : Specify that the particular field won't contain all zero values.
	10)	compareDates = For comparing the dates. Must contain name of the date fields in the predefined order :- sday, smon, syear, eday, emon, eyear, operator". sday : Sart Day, smon : Start Month, syear : Start Year, eday : End Day, emon : End Month, eyear : End Year, Operator : Comparison operator. Comparison operator value must be one of the following : LT, LE, GT, GE, EQ
	*********************************************
	
	*********************************************
	Browser Compatibility :-
	---------------------
	
	1) IE
	*********************************************
	
	*********************************************
	Functions Description :-
	---------------------
	
	1) complusory_check(ele_type, ele_id, msg, comp_val) :-
		Parameters Passed : 
			  (i) Element Type
			 (ii) Element Id	
			(iii) Msg required in the alert box.
			 (iv) For list box, this value specifies that parcular option must not be selected.
		Description : Called for the function for which 'mandatory' attribute has been defined in the element tag.
			
	2) alert_msg(attr, msg) :-
		Parameters Passed : 
			 (i) For which case message is required.
			(ii) Message for the field to be flashed.	
		Description : Used to alert the message.
	
	3) sel_focus(obj) :-
		Parameters Passed : 
			 (i) Object Id.
		Description : To set the focus to the required field.
	
	4) Trim(TRIM_VALUE) :-
		Parameters Passed : 
			 (i) Value of the field.
		Description : To find the trim (Left trim + Right trim) value of the field.
		
	5) RTrim(VALUE) :-
		Parameters Passed : 
			 (i) Value of the field.
		Description : To find the Right trim value of the field.
		
	6) LTrim(VALUE) :-
		Parameters Passed : 
			 (i) Value of the field.
		Description : To find the Left trim value of the field.	
		
	7) validate(arg) :-
		Parameters Passed : 
			 (i) Id of the form.
		Description : Called to validate the form.	
	
	8) validchar_check(ele_id, ele_att_msg_val, ele_valid_char) :-
		Parameters Passed : 	
			 (i) Id of the element.
			(ii) Msg to be displayed in the alert box.
		   (iii) List of valid characters as on string.
		Description : Check for the valid characters.	
	
	9) invalidchar_check(ele_id, ele_att_msg_val, ele_invalid_char) :-
		Parameters Passed : 	
			 (i) Id of the element.
			(ii) Msg to be displayed in the alert box.
		   (iii) List of valid characters as on string.
		Description : Check for the in-valid characters.
	
	10) maxlength_check(ele_id, ele_att_msg_val, ele_maxlength)
		Parameters Passed : 	
			 (i) Id of the element.
			(ii) Msg to be displayed in the alert box.
		   (iii) Maximum number of characters allowed.
		Description : Check for maximum characters allowed.
	
	11) emformat(fnm)
		Parameters Passed : 	
			 (i) Id of the form element.
		Description : Check for the correct email format.
	
	12) comp_sameval(ele_id, ele_sameval) :-
		Parameters Passed : 	
			 (i)  Id of the form element.
			 (ii) Id of the field with which we have to confirm the value.
		Description : Used for comparing two fields value.
	
	13) chk_ftype(ele_id, ele_filetype) :-
		Parameters Passed : 	
			 (i)  Id of the form element.
			 (ii) Type of file allowed.
		Description : Used for checking the file format
	
	14) chk_allzero(ele_id) :-
		Parameters Passed : 	
			 (i)  Id of the form element.
		Description : Used for to check that value entered in the field must not all be zero
		
	15) compareDates(LHSday, LHSmon, LHSyear, RHSday, RHSmon, RHSyear, operator) :-
		Parameters Passed : 
			  (i) LHSday, LHSmon, LHSyear : Day, Month, Year Values (LHS values in the comparison)
			 (ii) RHSday, RHSmon, RHSyear : Day, Month, Year Values (RHS values in the comparison)	
			(iii) operator : Comparison operator.
		Description : Called for comparing the two dates.
		
	16) isLegalDateCombination(day, month, year)	
			Parameters Passed : 
				   (i) day : Day of the date.
				  (ii) month : Month of the date.
				 (iii) year : Year of the date.
			Description : Called for comparing the two dates.
	
	17) chk_selVal(obj, notSelVal)	
			Parameters Passed : 
				   (i) obj : Reference to the object whose value to be matched.
				  (ii) notSelVal : Value which should not be selected.
			Description : Called for checking which value is selected.
			
	18) isLeapYear(year)	
			Parameters Passed : 
				   (i) year : Date Year.
			Description : Called to find whether the year is leap year or not.
			
	19) totalDays(month, isLeapYr) : 
			Parameters Passed : 
				   (i) month : Date Month.
				  (ii) isLeapYr : Boolean value.
			Description : Find total number of days in a month.	
	*********************************************		
*/

function validate(arg)
{
	var frm_len, ele, ele_id, ele_type;
	var ele_comp_val, ele_att_msg_val, ele_valid_char, ele_invalid_char, ele_maxlength;
	var ele_email, ele_sameval, ele_sameid, ele_filetype, ele_notallzero, ele_compareDates;
	var i, j, spVar;
	
	frm_len = arg.length;
	for(i=0;i<=eval(frm_len)-1;++i)
	{
		ele = arg.elements[i];	
		ele_id = document.getElementById(ele.id);
		ele_type = ele.type;
		if((ele_type.toLowerCase()!='submit')&&(ele_type.toLowerCase()!='reset')&&(ele_type.toLowerCase()!='hidden'))
		{
			ele_att_msg_val = ele.getAttribute("msg");	
			
			/*Begin : Mandatory Check*/
			ele_comp_val = ele.getAttribute("mandatory");
			if(ele_comp_val!=null)
			{
				if(complusory_check(ele_type, ele_id, ele_att_msg_val, ele_comp_val)==false)
				{return false;}
			}
			/*End : Mandatory Check*/
			
			/*Begin : Valid characters Check*/
			if((ele_type.toLowerCase()=='text')||(ele_type.toLowerCase()=='password')||(ele_type.toLowerCase()=='textarea'))
			{
				ele_valid_char = ele.getAttribute("validchar");	
				if(ele_valid_char!=null)
				{
					if(validchar_check(ele_id, ele_att_msg_val, ele_valid_char)==false)
					{return false;}
				}
			}
			/*End : Valid characters Check*/
			
			/*Begin : Invalid characters Check*/
			if((ele_type.toLowerCase()=='text')||(ele_type.toLowerCase()=='password')||(ele_type.toLowerCase()=='textarea'))
			{
				ele_invalid_char = ele.getAttribute("invalidchar");	
				if(ele_invalid_char!=null)
				{
					if(invalidchar_check(ele_id, ele_att_msg_val, ele_invalid_char)==false)
					{return false;}
				}
			}
			/*End : Invalid characters Check*/
			
			/*Begin : Characters Maxlength Check*/
			if((ele_type.toLowerCase()=='text')||(ele_type.toLowerCase()=='password')||(ele_type.toLowerCase()=='textarea'))
			{
				ele_maxlength = ele.getAttribute("maxlength");	
				if(ele_maxlength!=null)
				{
					if(maxlength_check(ele_id, ele_att_msg_val, ele_maxlength)==false)
					{return false;}
				}
			}
			/*End : Characters Maxlength Check*/
			
			/*Begin : E-mail Format*/
			if((ele_type.toLowerCase()=='text')||(ele_type.toLowerCase()=='textarea'))
			{
				ele_email = ele.getAttribute("email_format");	
				if(ele_email!=null)
				{	
					if(ele_id.value!='')
					{
						if(emformat(ele_id)==false)
						{return false;}
					}
				}
			}
			/*End : E-mail Format*/
			
			/*Begin : Same Value Comparison*/
			if((ele_type.toLowerCase()=='text')||(ele_type.toLowerCase()=='password')||(ele_type.toLowerCase()=='textarea'))
			{
				ele_sameval = ele.getAttribute("same_val");	
				if(ele_sameval!=null)
				{
					ele_sameid = document.getElementById(ele_sameval);
					if(comp_sameval(ele_id, ele_sameid)==false)
					{return false;}
				}
			}
			/*End : Same Value Comparison*/
			
			/*Begin : File Type*/
			if(ele_type.toLowerCase()=='file')
			{
				ele_filetype = ele.getAttribute("file_type");
				if(ele_filetype!=null)
				{
					if(chk_ftype(ele_id, ele_filetype)==false)
					{return false;}
				}
			}
			/*End : File Type*/
			
			/*Begin : Not all zero*/
			if(ele_type.toLowerCase()=='text')
			{
				ele_notallzero = ele.getAttribute("notallzero");
				if(ele_notallzero!=null)
				{
					/*if(complusory_check(ele_type, ele_id, ele_att_msg_val, ele_comp_val)==false)
					{return false;}*/
					
					if(chk_allzero(ele_id)==false)
					{return false;}
				}
			}
			/*End : Not all zero*/
			
			/*Begin : Date Comparison*/
			ele_compareDates = ele.getAttribute("compareDates");
			if(ele_compareDates!=null)
			{
				spVar = ele_compareDates.split(",", 7); 
				if(isLegalDateCombination(document.getElementById(Trim(spVar[0])).value, document.getElementById(Trim(spVar[1])).value, document.getElementById(Trim(spVar[2]).value)) == false)
				{
					alert('Please select the correct Start Date');
					return false;
				}
				
				if(isLegalDateCombination(document.getElementById(Trim(spVar[3])).value, document.getElementById(Trim(spVar[4])).value, document.getElementById(Trim(spVar[5]).value)) == false)
				{
					alert('Please select the correct End Date');
					return false;
				}
				
				if(compareDates(document.getElementById(Trim(spVar[0])).value, document.getElementById(Trim(spVar[1])).value, document.getElementById(Trim(spVar[2])).value, document.getElementById(Trim(spVar[3])).value, document.getElementById(Trim(spVar[4])).value, document.getElementById(Trim(spVar[5])).value, document.getElementById(Trim(spVar[6])).value) == false)
				{return false;}
			}
			/*End : Date Comparison*/
		}
	}
	return true;
}

function chk_allzero(ele_id)
{
	if((ele_id.disabled==false) && (eval(Trim(ele_id.value).length)>0))
	{
		var pos_dot, all_zero, sp;
		
		if(validchar_check(ele_id, 'Price', '1234567890.')==false)
		{
			sel_focus(ele_id);
			return false ;
		}
		else
		{
			pos_dot = Trim(ele_id.value).indexOf(".");
			switch(pos_dot)
			{
				case -1 :
					all_zero = allzero(ele_id.value);
					break;
				default : 
					sp = ele_id.value.split(".");
					if(eval(sp.length)>2)
					{
						alert_msg('not_allzero');
						sel_focus(ele_id);
						return false;
					}
					all_zero = allzero(sp[0]);
					if(Trim(sp[1]).length==0){}
					else
					{
						if(all_zero==true)
						{
							if(eval(sp[1].charAt(0))!=0)
							{all_zero = false;}
							if(sp[1].length>1)
							{
								if(eval(sp[1].charAt(1))!=0)
								{all_zero = false;}
							}	
						}
					}
			}
			if(all_zero==true)
			{
				alert_msg('not_allzero');
				sel_focus(ele_id);
				return false ;
			}
		}
	}
	return true;
}

function allzero(fval)
{
	var all_zero=true;
	for(i=0;i<=eval(fval.length)-1;++i)
	{
		if(eval(fval.charAt(i))!=0)
		{all_zero = false;}
	}
	return all_zero;
}

function comp_sameval(ele_id, ele_sameval)
{
	if((ele_id!=null)&&(ele_sameval!=null))
	{
		if(Trim(ele_id.value)==Trim(ele_sameval.value))
		{return true;}
		else
		{
			alert_msg('same_val');
			sel_focus(ele_id);
			return false;
		}
	}
}

function maxlength_check(ele_id, ele_att_msg_val, ele_maxlength)
{
	var i, fval;
	fval = Trim(ele_id.value).length;
	if(eval(fval)>eval(ele_maxlength))
	{
		//alert_msg('maxlength',ele_att_msg_val);
		if(ele_att_msg_val != null)
		{alert('\''+ele_att_msg_val+'\' field must contain less then '+ele_maxlength+' characters.');}
		else
		{alert('You have entered more then '+ele_maxlength+' characters.');}
		
		sel_focus(ele_id);
		return false;	
	}
	return true;
}

function chk_ftype(ele_id, ele_filetype)
{
	if(ele_id.getAttribute("mandatory")!=null)
	{
		if(Trim(ele_id.value).length==0)
		{
			alert_msg('mandatory_file','Image');
			sel_focus(ele_id);
			return false;	
		}
	}
	
	if(Trim(ele_id.value).length!=0)
	{
		var sp, i, ftype_fg;
		var fd = ele_id.value;
		var filelen_1 = fd.length;
		
		var arr1 = fd.split("\\");
		
		var pos_1 = fd.lastIndexOf(".");
		pos_1 = pos_1+1;
		
		var extn_1 = fd.substr(pos_1,filelen_1);
		extn_1 = extn_1.toUpperCase();
		if(ele_id.value.lastIndexOf(".")==-1)
		{
			alert_msg('file_type');
			sel_focus(ele_id);
			return false;
		}
		ele_filetype = ele_filetype.toUpperCase();
		sp = ele_filetype.split(",");
		ftype_fg = 0;
		for(i=0;i<=eval(sp.length)-1;++i)
		{
			if(extn_1==Trim(sp[i]))
			{ftype_fg=1;}
		}
		if(eval(ftype_fg)==0)
		{
			alert_msg('file_type');
			sel_focus(ele_id);
			return false;
		}
		else
		{return true;}
	}
	else
	{return true;}
}

function validchar_check(ele_id, ele_att_msg_val, ele_valid_char)
{
	var i, fval;
	fval = Trim(ele_id.value.toLowerCase());
	ele_valid_char = ele_valid_char.toLowerCase();
	for(i=0;i<=eval(fval.length)-1;++i)
	{
		if(ele_valid_char.indexOf(fval.charAt(i))==-1)
		{
			alert_msg('valid_char',ele_att_msg_val);
			sel_focus(ele_id);
			return false;
		}
	}
	return true;
}

function invalidchar_check(ele_id, ele_att_msg_val, ele_invalid_char)
{
	var i, fval;
	fval = Trim(ele_id.value.toLowerCase());
	ele_invalid_char = ele_invalid_char.toLowerCase();
	for(i=0;i<=eval(fval.length)-1;++i)
	{
		if(ele_invalid_char.indexOf(fval.charAt(i))!=-1)
		{
			alert_msg('invalid_char',ele_att_msg_val);
			sel_focus(ele_id);
			return false;
		}
	}
	return true;
}

function complusory_check(ele_type, ele_id, ele_val, ele_comp_val)
{
	switch(ele_type.toLowerCase())
	{
		case 'text' :
		case 'password' :
		case 'textarea' : 
			if(Trim(ele_id.value).length==0)
			{
				alert_msg('mandatory',ele_val);
				sel_focus(ele_id);
				return false;
			}
			break;
		
		case 'select-one' :
			if(ele_id.value==ele_comp_val)
			{
				alert_msg('mandatory_select-one',ele_val);
				sel_focus(ele_id);
				return false;	
			}
			break;
	}
	return true;
}

function alert_msg(attr, msg)
{
	switch(attr.toLowerCase())
	{
		case 'mandatory' : 	
			if(msg!=null)
			{alert('Please enter the '+msg);}
			else
			{alert('Please enter the value.');}
			break;
		
		case 'mandatory_file' : 	
			if(msg!=null)
			{alert('Please select the file');}
			else
			{alert('Please select the file.');}
			break;
			
		case 'mandatory_select-one' : 	
			if(msg!=null)
			{alert('Please select the '+msg);}
			else
			{alert('Please select');}
			break;
			
		case 'valid_char' :	
			if(msg!=null)
			{alert('Please enter valid characters in the field '+msg);}
			else
			{alert('Please enter valid characters only.');}
			break;
		
		case 'invalid_char' :	
			if(msg!=null)
			{alert('You have entered some invalid characters in the field '+msg);}
			else
			{alert('You have entered some invalid characters.');}
			break;
		
		case 'maxlength' :
			if(msg!=null)
			{alert('\''+msg+'\' field must contain less characters.');}
			else
			{alert('You have entered more characters.');}
			break;
		
		case 'emil_format' :
			alert('Incorrect email format! Format should be abc@xyz.com');
			break;
		
		case 'same_val' :
			alert('New password doesn\'t matches. Please enter the same value.');
			break;
		
		case 'file_type' :
			alert('Please select doc or txt or rtf file only.');
			break;
		
		case 'not_allzero' : 
			alert('Price could not be zero.');
			break;
	}
}

function emformat(obj)
{
	if(Trim(obj.value).length==0)
	{ 
		alert_msg('emil_format', null);sel_focus(obj);
		return false;
	}
	
	if((Trim(obj.value).length!=0))
	{
		if(obj.value.indexOf(' ')!=-1)
		{
			alert_msg('emil_format', null);sel_focus(obj);
			return false;
		}
		
		if(obj.value.indexOf('@')==-1)
		{
			alert_msg('emil_format', null);sel_focus(obj);
			return false;
		}
		
		pos = obj.value.indexOf('@'); //Finding the position of the @ character.
		smstr = obj.value.substr(eval(pos)+1) //Reteriving the string after the @ character
		if(smstr.indexOf('.')==-1)
		{
			alert_msg('emil_format', null);sel_focus(obj);
			return false;
		}
		
		if(smstr.length<3)
		{
			alert_msg('emil_format', null);sel_focus(obj);
			return false;
		}
		
		ansmstr = obj.value.substr(0,eval(pos)) //Reteriving the string before the @ character
		if(ansmstr.length<2)
		{
			alert_msg('emil_format', null);sel_focus(obj);
			return false;
		}
	}
	return true;
}

function sel_focus(obj)
{
	var type;
	type = obj.type;
	if((type.toLowerCase()!="hidden")&&(obj.disabled!=true))
	{
		obj.focus();
		switch(type.toLowerCase())
		{
			case 'text' : 
			case 'password' : 
			case 'textarea' : 
			case 'file' : 
				obj.select();
				break;
		}
	}
}

function compareDates(LHSday, LHSmon, LHSyear, RHSday, RHSmon, RHSyear, operator)
{
	var resultObj, resultFlag;
	
	resultFlag = true;
	resultObj = document.getElementById("resultTxt");
	switch(operator.toUpperCase())
	{
		case 'LT' : 
					if(eval(RHSyear) < eval(LHSyear))
					{resultFlag = false;}
					else if(eval(RHSyear) == eval(LHSyear))
					{
						if(eval(RHSmon) < eval(LHSmon))
						{resultFlag = false;}
						else if(eval(RHSmon) == eval(LHSmon))
						{
							if(eval(RHSday) <= eval(LHSday))
							{resultFlag = false;}
						}
					}
					
					if(resultFlag == false)
					{/*alert('\'From Date\' must be less then \'To Date\'.');*/}
					break;
		
		case 'LE' : 
					if(eval(RHSyear) < eval(LHSyear))
					{resultFlag = false;}
					else if(eval(RHSyear) == eval(LHSyear))
					{
						if(eval(RHSmon) < eval(LHSmon))
						{resultFlag = false;}
						else if(eval(RHSmon) == eval(LHSmon))
						{
							if(eval(RHSday) < eval(LHSday))
							{resultFlag = false;}
						}
					}
					
					if(resultFlag == false)
					{/*alert('\'From Date\' must be Less Then Equal To \'To Date\'.');*/}
					break;
		
		case 'GT' : 
					if(eval(RHSyear) > eval(LHSyear))
					{resultFlag = false;}
					else if(eval(RHSyear) == eval(LHSyear))
					{
						if(eval(RHSmon) > eval(LHSmon))
						{resultFlag = false;}
						else if(eval(RHSmon) == eval(LHSmon))
						{
							if(eval(RHSday) >= eval(LHSday))
							{resultFlag = false;}
						}
					}
					
					if(resultFlag == false)
					{/*alert('\'From Date\' must be Greater Then \'To Date\'.');*/}
					break;
					
		case 'GE' : 
					if(eval(RHSyear) > eval(LHSyear))
					{resultFlag = false;}
					else if(eval(RHSyear) == eval(LHSyear))
					{
						if(eval(RHSmon) > eval(LHSmon))
						{resultFlag = false;}
						else if(eval(RHSmon) == eval(LHSmon))
						{
							if(eval(RHSday) > eval(LHSday))
							{resultFlag = false;}
						}
					}
					
					if(resultFlag == false)
					{/*alert('\'From Date\' must be Greater Then Equal To \'To Date\'.');*/}
					break;	
		
		case 'EQ' : 
					if((eval(LHSday)!=eval(RHSday)) || (eval(LHSmon)!=eval(RHSmon)) || (eval(LHSyear)!=eval(RHSyear)))
					{resultFlag = false;}
					
					if(resultFlag == false)
					{/*alert('\'From Date\' must be Equal To \'To Date\'.');*/}
					break;								
	}
	return resultFlag;
}

function isLegalDateCombination(day, month, year)
{
	if(eval(totalDays(month, isLeapYear(year))) < eval(day))
	{return false;}
			
	return true;
}

function chk_selVal(obj, notSelVal)
{
	if(obj.value == notSelVal)
	{obj.focus();return false;}
	else
	{return true;}
}

function isLeapYear(year)
{
	var v1;
	if(eval(eval(year)%400) == 0)
	{return true;}
	else
	{
		v1 = eval(year)%100;
		v1 = eval(year)%4;
		
		if(eval(v1) == 0)
		{return true;}
		else
		{return false;}
	}
}

function totalDays(month, isLeapYr)
{
	switch(eval(month))
	{
		case 1 : return 31; break;   	
		case 2 : 
				if(isLeapYr==true)
				{return 29; break;}
				else
				{return 28; break;}
		case 3 : return 31; break;   
		case 4 : return 30; break;   
		case 5 : return 31; break;   
		case 6 : return 30; break;   
		case 7 : return 31; break;   
		case 8 : return 31; break;   
		case 9 : return 30; break;   
		case 10 : return 31; break;   
		case 11 : return 30; break;   
		case 12 : return 31; break;    
	}
}

function Trim(TRIM_VALUE)
{
	if(TRIM_VALUE.length < 1)
		{return"";}
	TRIM_VALUE = RTrim(TRIM_VALUE);
	TRIM_VALUE = LTrim(TRIM_VALUE);
	if(TRIM_VALUE=="")
		{return "";}
	else
		{return TRIM_VALUE;}
} 

function RTrim(VALUE)
{
	var w_space = String.fromCharCode(32);
	var v_length = VALUE.length;
	var strTemp = "";
	if(v_length < 0)
		{return"";}
	var iTemp = v_length -1;

	while(iTemp > -1)
	{
		if(VALUE.charAt(iTemp) == w_space){}
		else
		{
			strTemp = VALUE.substring(0,iTemp +1);
			break;
		}
		iTemp = iTemp-1;
	}
	return strTemp;
} 

function LTrim(VALUE)
{
	var w_space = String.fromCharCode(32);
	if(v_length < 1)
		{return"";}
	var v_length = VALUE.length;
	var strTemp = "";
	var iTemp = 0;

	while(iTemp < v_length)
	{
		if(VALUE.charAt(iTemp) == w_space){}
		else
		{
			strTemp = VALUE.substring(iTemp,v_length);
			break;
		}
		iTemp = iTemp + 1;
	}
	return strTemp;
}

/**********To validate the URL**********/ 
function validURL(obj)
{
	var url = obj.value.replace(/ /g,"");
	var urlexp = /http:\/\/([\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*)?/; 
	if (url!=="")
	{
		if (urlexp.test(url)==false)		
		{
			alert ("Invalid URL ! Please re-enter.\n e.g. http://www.domainname.com"); 
			obj.focus(); 
			return false;
		}
	}	
}