/**
 * @author Karl Cassar
 * LAST MODIFIED: 14/03/2007
 */


///GENERIC VARIABLES
///-----------------
/// form_validationGroup 


//const INT_MAX_VALUE =  2147483647;
//const INT_MIN_VALUE = -2147483648;
var INT_MAX_VALUE =  2147483647;
var INT_MIN_VALUE = -2147483648;

function validationParams()
{
	this.AlphaNumericOnly = false;
	this.AlwaysAllowedValues = '';
	this.DateBeforeTxt = '';
	this.DateFrom = '';
	this.DateTo = '';
	this.FileExtensions = '';
	this.InitValue = '';
	this.IsInteger = false;
	this.IsFile = false;
	this.IsNumeric = false;
	this.IsDate = false;
	this.IsEmail = false;
	this.MinLength = -1;
	this.MaxLength = -1;
	this.NumFrom = INT_MIN_VALUE;
	this.NumTo = INT_MAX_VALUE;
	this.NegativeOnly = false;
	this.PositiveOnly = false;
	this.Required = false;
	this.SameAsTxt = '';
	this.ValueInTxt = '';
	this.ValueNotInTxt = '';
	this.ValueIn = '';
	this.ValueNotIn = '';
}
function validationElem()
{
	this.params = new validationParams();
	this.errorClass = "";
	this.normalClass = "";
	this.ID = "";
	this.validationGroup = "";
	this.description = '';
	this.otherTxtDescription = '';
	this.delimeter = "";
}


function formValidate(elemList)
{
	var i,j,currGroup,allErrMsg = '',errtxt,errmsg,tmp,slash,list,tmpstr,num,dotpos,chr,delim;
	var firstElem = null,firstDesc = '';
	errMsg = '';
	currGroup = form_validationGroup.toLowerCase();
	for (i = 0; i < elemList.length; i++)
	{
	    var valParams = elemList[i].params;
        var elem = getElem(elemList[i].ID);
        if (elem != null)
        {
            var err = false;
            var errorclass = elemList[i].errorClass;
            var normalClass = elemList[i].normalClass;
            errtxt = document.getElementById(elem.id + "_err");
            var desc = elemList[i].description;
            

	        if (elemList[i].validationGroup.toLowerCase() == currGroup)
	        {
		        if (elem.disabled)
			        continue;
		        var sval = elem.value;
		        if (valParams.InitValue != "")
		        {
		            if (sval == valParams.InitValue)
		                sval = '';
		        }
		        var required = false;
		        var ipos;
		        var allowedList = "",extensionList = "";
		        if ((!err) && (valParams.AlwaysAllowedValues))
	            {
			        delim = elemList[i].delimeter;
			        if (delim == '')
				        delim = "|";
	                var list = valParams.AlwaysAllowedValues.split(elemList[i].delimeter);
			        var found = false;
			        for (j = 0; j < list.length; j++)
			        {
				        if (allowedList != '') 
					        allowedList += ", ";
				        allowedList += list[j];
				        if (!found && (val.toLowerCase() == list[i].toLowerCase()))
				        {
					        found = true;
				        }
			        }
			        if (found)
			        {
				        err = false;
				        continue;
			        }
    				
	            }
		        if ( !err && (valParams.IsFile))
	            {
		            ipos = sval.lastIndexOf('\\');
		            if (ipos == -1) 
			            ipos = sval.lastIndexOf('/');
		            sval = sval.substr(ipos+1);
    			    
	            }
		        if (!err && (valParams.Required))
	            {
	                err = (sval == '');
		            required = err;
		            if (err) errmsg = '> ' + desc + ' is required';
	            }
	            if (required || (!required && sval != ''))
	            {
		            if (!err && (valParams.FileExtensions != '') && sval != "")
	                {
		                dotpos = sval.lastIndexOf('.');
		                fileext = sval.substr(dotpos+1).toLowerCase();
        				
		                list = valParams.FileExtensions.split("|");
		                err = true;
			            for (j = 0; j < list.length; j++)
			            {
			                if (extensionList != "") 
					            extensionList +=  ", ";
				            extensionList += list[j].toLowerCase();
				            err = !(!err || fileext == list[j].toLowerCase());
			            }
		                if (err) errmsg = '> ' + desc + ' must have an extension of ' + extensionList;
	                }
		            if (!err && valParams.IsNumeric && sval != "")
	                {
		                num = parseFloat(sval);
		                err = (isNaN(sval));
		                if (err) errmsg = '> ' + desc + ' must contain a numerical value';
		                if (!err && valParams.PositiveOnly)
		                {
			                err = (num < 0);
			                if (err) errmsg = '> ' + desc + ' must contain a positive value';
        				
		                }
			            else if(!err && valParams.PositiveOnly)
		                {
			                err = (num > 0);
			                if (err) errmsg = '> ' + desc + ' must contain a negative value';
		                }
	                }
		            if (!err && valParams.IsDate && sval != '')
	                {
		                //Format is [dd/mm/yyyy], [dd-mm-yyyy]
		                tmp = sval;
		                slash = tmp.indexOf('/')
		                var sday,tmp,slash,smonth,syear;
		                sday = '';
		                smonth = '';
		                syear = '';
		                if (slash == -1) slash = tmp.indexOf('-');
		                if (slash > -1)
		                {
			                sday = tmp.substr(0,slash);
			                tmp = tmp.substr(slash+1);
			                slash = tmp.indexOf('/')
			                if (slash == -1) slash = tmp.indexOf('-');
			                if (slash > -1)
			                {
				                smonth = tmp.substr(0,slash);
				                tmp = tmp.substr(slash+1);
				                if (tmp != '')
					                syear = tmp;
			                }
        					
		                }
		                err =  (isNaN(sday) || isNaN(smonth) || isNaN(syear)) || 
			                   ((sval.indexOf('.') == -1) && (sval.indexOf('-') == -1) && (sval.indexOf('/') == -1))
		                var dt = new Date();
		                if (!err)
		                {
			                var iday,imonth,iyear,daymax
        					
			                iday = parseInt(parseFloat(sday));
			                imonth = parseInt(parseFloat(smonth));
			                iyear =  parseInt(parseFloat(syear));
        					
			                err = (iyear < 0) || (iyear > 100 && iyear < 1900) || (iyear > dt.getFullYear() + 20);
			                if (!err)
			                {
				                if (iyear <= dt.getFullYear() + 5 - 2000)
					                iyear += 2000;
				                else if (iyear <= 100)
					                iyear += 1900;
				                err = (imonth < 1 || imonth > 12);
				                if (!err)
				                {
        							
					                switch (imonth)
					                {
						                case 1:
						                case 3:
						                case 5:
						                case 7:
						                case 8:
						                case 10:
						                case 12:	daymax = 31;
												                break;
						                case 4:
						                case 6:
						                case 9:
						                case 11: daymax = 30;
										                break;
						                case 2: if (iyear % 4 == 0)
									                daymax = 29;
								                else
									                daymax = 28;
								                break;
					                }
        							
					                err =  (iday < 1 || iday > daymax)
				                }
			                }
			                if (err) errmsg = '> ' + desc + ' is out of range!';
			                if (!err && (valParams.DateBeforeTxt != '') && sval != '')
			                {
			                    var err2 = false;
			                    var dttxtbox = getElem(valParams.DateBeforeTxt);
			                    var sday2,smonth2,syear2,iday2,imonth2,iyear2
			                    tmp = dttxtbox.value;
		                        slash = tmp.indexOf('/')
		                        sday2 = '';
		                        smonth2 = '';
		                        syear2 = '';
		                        if (slash == -1) slash = tmp.indexOf('-');
		                        if (slash > -1)
		                        {
			                        sday2 = tmp.substr(0,slash);
			                        tmp = tmp.substr(slash+1);
			                        slash = tmp.indexOf('/')
			                        if (slash == -1) slash = tmp.indexOf('-');
			                        if (slash > -1)
			                        {
				                        smonth2 = tmp.substr(0,slash);
				                        tmp = tmp.substr(slash+1);
				                        if (tmp != '')
					                        syear2 = tmp;
			                        }
                					
		                        }
		                        err2 =  (isNaN(sday2) || isNaN(smonth2) || isNaN(syear2)) || 
			                           ((sval.indexOf('.') == -1) && (sval.indexOf('-') == -1) && (sval.indexOf('/') == -1))
		                        dt = new Date();
		                        if (!err2)
		                        {
                					
			                        iday2 = parseInt(parseFloat(sday2));
			                        imonth2 = parseInt(parseFloat(smonth2));
			                        iyear2 =  parseInt(parseFloat(syear2));
                					
			                        err2 = (iyear2 < 0) || (iyear2 > 100 && iyear2 < 1900) || 
			                                (iyear2 > dt.getFullYear() + 20);
			                        if (!err2)
			                        {
				                        if (iyear2 <= dt.getFullYear() + 5 - 2000)
					                        iyear2 += 2000;
				                        else if (iyear2 <= 100)
					                        iyear2 += 1900;
				                        err2 = (imonth2 < 1 || imonth2 > 12);
				                        if (!err2)
				                        {
                							
					                        switch (imonth2)
					                        {
						                        case 1:
						                        case 3:
						                        case 5:
						                        case 7:
						                        case 8:
						                        case 10:
						                        case 12:	daymax = 31;
												                        break;
						                        case 4:
						                        case 6:
						                        case 9:
						                        case 11: daymax = 30;
										                        break;
						                        case 2: if (iyear2 % 4 == 0)
									                        daymax = 29;
								                        else
									                        daymax = 28;
								                        break;
					                        }
                							
					                        err2 =  (iday2 < 1 || iday2 > daymax)
				                        }
			                        }
			                        if (!err2)
			                        {
			                            err = ((iyear2 < iyear) || 
			                                  ((iyear2 == iyear) && (imonth2 < imonth)) ||
			                                  ((iyear2 == iyear) && (imonth2 == imonth) && (iday2 < iday)));
        			       	            
        				
			                        }
        				
			                        if (err) errmsg = '> ' + desc + ' must be before or same as ' + elemList[i].otherTxtDescription + '!';
        					        
                					
                				
		                        }
			                }
			                var cday,cmonth,cyear;
				            if (!err && (valParams.DateFrom != '') && sval != '')
				            {
        					    
				                cday = Number(valParams.DateFrom.substr(0,2));
				                cmonth = Number(valParams.DateFrom.substr(2,2));
				                cyear = Number(valParams.DateFrom.substr(4,4));
				                err = ((iyear < cyear) ||
				                      (iyear == cyear && imonth < cmonth) ||
				                      (iyear == cyear && imonth == cmonth && iday < cday));
				                if (err) errmsg = '> ' + desc + ' must be after ' + 
				                            padNumber(cday,2) + '/' + padNumber(cmonth,2) + '/' + cyear;
				            }
				            if (!err && (valParams.DateTo!= '') && sval != '')
				            {
				                cday = Number(valParams.DateTo.substr(0,2));
				                cmonth = Number(valParams.DateTo.substr(2,2));
				                cyear = Number(valParams.DateTo.substr(4,4));
				                err = ((iyear > cyear) ||
				                      (iyear == cyear && imonth > cmonth) ||
				                      (iyear == cyear && imonth == cmonth && iday > cday));
				                if (err) errmsg = '> ' + desc + ' must be before ' + 
				                            padNumber(cday,2) + '/' + padNumber(cmonth,2) + '/' + cyear;
				            }
        				
		                }
		                else
			                errmsg = '> ' + desc + ' must contain a date value [dd/mm/yyyy]';
		                if (!err)
			                elem.value = padNumber(iday,2) + '/' + padNumber(imonth,2) + '/' + iyear;
	                }
		            if (!err && (valParams.IsEmail)  && sval != '')
	                {
        				
		                var atpos = sval.indexOf('@');
		                if (atpos != -1)
		                {
			                dotpos = sval.substr(atpos+1).indexOf('.');
			                err = (dotpos == -1);
		                }
		                else
			                err = true;
		                if (err)	errmsg = '> ' + desc + ' must contain an e-mail address';
	                }
		            if (!err && ((valParams.NumFrom > INT_MIN_VALUE) ||
					            (valParams.NumTo < INT_MAX_VALUE)) && sval != '')
	                {
		                num = parseFloat(sval);
			            if (valParams.NumFrom > INT_MIN_VALUE &&
				            valParams.NumTo < INT_MAX_VALUE)
			            {
				            err = (num < valParams.NumFrom) ||
						            (num > valParams.NumTo);
			            }
			            else if (valParams.NumFrom > INT_MIN_VALUE)
			            {
				            err = (num < valParams.NumFrom);
			            }
			            else if (valParams.NumTo < INT_MAX_VALUE)
			            {
				            err = (num > valParams.NumTo);
			            }
			            if (err)
			            {
				            if (valParams.NumFrom > INT_MIN_VALUE &&
					            valParams.NumTo < INT_MAX_VALUE)
				            {
					            errmsg = '> ' + desc + ' must contain a number from  ' + valParams.NumFrom + ' to ' + valParams.NumTo;
				            }
				            else if (valParams.NumFrom > INT_MIN_VALUE)
				            {
					            errmsg = '> ' + desc + ' must contain a number greater than or equal to ' + valParams.NumFrom;
				            }
				            else if (valParams.NumTo < INT_MAX_VALUE)
				            {
					            errmsg = '> ' + desc + ' must contain a number less than or equal to ' + valParams.NumTo;
				            }
			            }
	                }
	                if (!err && (valParams.MinLength > -1) )
	                {
		                err = (sval.length < valParams.MinLength)
		                if (err) errmsg = '> ' + desc + ' must contain at least ' + valParams.MinLength + ' characters';
	                }
	                if (!err && (valParams.MaxLength > -1 )&& sval != '')
	                {
		                err = (sval.length > valParams.MaxLength)
		                if (err) errmsg = '> ' + desc + ' must not be longer than ' + valParams.MaxLength + ' characters';
        			
	                }
	                if (!err && (valParams.AlphaNumericOnly)  && sval != '')
	                {
        	
		                for (j = 0; j < sval.length; j++)
		                {
			                chr = sval.substr(j,1);
			                err= !((chr >= 'a' && chr <= 'z') || (chr >= 'A' && chr <= 'Z') || (chr >= '0' && chr <= '9') || chr == '_' || chr == '^');
			                if (err) {
				                errmsg = '> ' + desc + " must contain only alpha-numerical characters, and '_' or '^'";
				                break;
			                }
		                }
	                }
	                if (!err && ((valParams.ValueNotInTxt != '') || (valParams.ValueNotIn != ''))  && sval != '')
	                {
        				
		                delim = elemList[i].delimeter;
			            if (delim == '')
				            delim = ",";
        			    	
        			    
		                var notstr;
		                if (valParams.ValueNotInTxt != '')
		                {
                            var nottxtbox = getElem(valParams.ValueNotInTxt);
                            if (nottxtbox == null)
                            {
	                            alert('Not Textbox is null!\n\n' +
		                              'Name of main textbox: ' + elem.id + '\nName of current textbox: ' + valParams.ValueNotInTxt);
            					
			                }
		                    notstr= nottxtbox.value.toUpperCase();
		                }
		                else
		                    notstr = valParams.ValueNotIn;
        			    
		                var thistxt = sval.toUpperCase();
			            list = notstr.split(delim);
			            for (j = 0; j < list.length; j++)
			            {
			                err = (list[j].toUpperCase() == thistxt)
			                if (err)
			                {
				                 errmsg = '> ' + desc + ' already exists! Please choose another one'
				                 break;
			                }
			            }
        			
	                }
		            if (!err && ((valParams.ValueInTxt != '') || (valParams.ValueIn != ''))  && sval != '')
	                {
			            delim = elemList[i].delimeter;
			            if (delim == '')
				            delim = ',';
		                nottxtbox = getElem(valParams.ValueInTxt);
		                var notstr;
		                if (valParams.ValueNotInTxt != '')
		                    notstr= nottxtbox.value.toUpperCase();
		                else
		                    notstr = valParams.ValueNotIn;
		                thistxt = sval.toUpperCase();
		                if (notstr != '') notstr += delim;
		                matched=false;
			            list = notstr.split(delim);
			            for (j = 0; j <list.length; j++)
		                {
			                tmptxt = list[j].toUpperCase();
			                matched = (thistxt == tmptxt)

				            if (matched)
					            break;
        				
		                }
		                err = !matched;
		                if (err)		 errmsg = '> ' + desc + ' does not exist!'
        			
	                }
	                if (!err && (valParams.SameAsTxt != '')  && sval != '')
	                {
		                sametxtbox = getElem(valParams.SameAsTxt);
		                nextdesc = elemList[i].otherTxtDescription;
        				
		                err = (elem.value != sametxtbox.value);
		                if (err) errmsg = '> ' + desc + ' and ' + nextdesc + ' must contain the same value';
	                }
	                if (!err && (valParams.IsInteger) && sval != '')
	                {
		                numf = parseFloat(sval);
		                numi = parseInt(sval);
        				
		                err = (numf != numi)
		                if (err) errmsg = '> ' + desc + ' must contain only whole numbers (no decimal places)';
	                }
		            if (allowedList != '' && !required)
		                errmsg += allowedList;
	            }
	        }
	        if (err) 
	        {
    	        errtxt.value = "true";
		        if (firstElem == null)
			        firstElem = elem;
	            allErrMsg = allErrMsg + errmsg + '\n';
	            elem.className = errorclass;
	        }
	        else 
	        {
	            errtxt.value = "false";
		        if (!elem.disabled)
	    	        elem.className = class_enabled[elem.id];
		        elem.className = normalClass;
	        }
		}
		
	}
	
	if (firstElem != null)
	{ 
	
		try
		{
		    firstElem.focus();
		    if (firstElem.type.toLowerCase().indexOf('select') == -1)
			    firstElem.select();
	    }
	    catch (ex)
	    {
	    }
		alert(allErrMsg);
	}
	return (firstElem == null);
	
	
}

