var form_enterPressed = false;

/**
 * @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;
var Form_DontShowErrorMessage = false;
var Form_RequiredGroups = new Array();
function requiredGroup()
{
    this.Elements = new Array();
    this.id = '';
    this.filled = false;
}

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.HasTime = 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.RequiredGroup = '';
	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 getRequiredGroup(name)
{
    var i;
    for (i = 0; i < Form_RequiredGroups.length; i++)
    {
        if (Form_RequiredGroups[i].id == name)
        {
            return Form_RequiredGroups[i];
        }
    }
    var r = new requiredGroup();
    r.id = name;
    Form_RequiredGroups.push(r);
    return r;
    
}

function formValidate(elemList)
{
    var requiredGroups = new Array();
	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 && (sval.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 == '' || sval == 'NULL');
		            required = err;
		            if (err) errmsg = '> ' + desc + ' is required';
	            }
	            if ((valParams.RequiredGroup != '') && (requiredGroups[valParams.RequiredGroup] == null || requiredGroups[valParams.RequiredGroup].filled == false))
	            {
	                var currRG = getRequiredGroup(valParams.RequiredGroup);
	                currRG.Elements.push(elemList[i]);
	                if (sval != '' && sval != null)
	                {
	                    currRG.filled = true;
	                }
	            }
	            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,spacepos,shour,smin,ssec;
		                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);
				                spacepos = tmp.substr(slash).indexOf(' ');
				                if (spacepos > -1)
				                    spacepos += slash;
				                else
				                    spacepos = tmp.length;
				                tmp = tmp.substr(slash+1, spacepos-(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)
		                {
		                    if (valParams.HasTime)
		                    {
		                        shour = '';
		                        smin = '';
		                        ssec = '0';
		                        tmp = sval;
		                        spacepos = tmp.indexOf(' ');
		                        if (spacepos != -1)
		                        {
	                                tmp = tmp.substr(spacepos + 1);
	                                var colonpos = tmp.indexOf(':');
	                                if (colonpos > -1)
	                                {
	                                    shour = tmp.substr(0,colonpos);
	                                    tmp = tmp.substr(colonpos+1);
	                                    colonpos = tmp.indexOf(':');
    	                                if (colonpos == -1)
	                                        colonpos = tmp.length;
	                                    if (colonpos > -1)
	                                    {
	                                        smin = tmp.substr(0,colonpos);
	                                        tmp = tmp.substr(colonpos+1);
	                                        if (tmp != '')
	                                        {
	                                            ssec = tmp
	                                        }
	                                    }
	                                }
	                                
		                        }
		                        err = (isNaN(shour) || isNaN(smin) || isNaN(ssec) || (shour == '') || (smin == '') || (ssec == ''));
                                if (err)
                                {
                                    errmsg = '> ' + desc + ' must contain a time in 24hour format, hh:mm:ss (seconds optional)';
                                }
		                    }
		                    
			                var iday,imonth,iyear,daymax,ihour,imin,isec
        					if (!err &&  valParams.HasTime)
        					{
        					    ihour = parseInt(parseFloat(shour));
        					    imin = parseInt(parseFloat(smin));
        					    isec= parseInt(parseFloat(ssec));
        					    
        					}
			                iday = parseInt(parseFloat(sday));
			                imonth = parseInt(parseFloat(smonth));
			                iyear =  parseInt(parseFloat(syear));
        					
			                err = 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;
				            }
				            if (!err && (valParams.HasTime) && sval != '')
				            {
				                if ((!err) && (ihour < 0 || ihour > 23))
				                {
				                    err = true;
				                    errmsg = '> ' + desc + ' must have its hour value between 0 and 23';
				                }
				                if ((!err) && (imin < 0 || imin > 59))
				                {
				                    err = true;
				                    errmsg = '> ' + desc + ' must have its minute value between 0 and 59';
				                }
				                
				                if ((!err) && (isec < 0 || isec > 59 ))
				                {
				                    err = true;
				                    errmsg = '> ' + desc + ' must have its second value between 0 and 59';
				                }
				            }
        				
		                }
		                else
			                errmsg = '> ' + desc + ' must contain a date value [dd/mm/yyyy]';
		                if (!err)
		                {
			                elem.value = padNumber(iday,2) + '/' + padNumber(imonth,2) + '/' + iyear;
			                if (valParams.HasTime)
			                {
			                    elem.value += ' ' + padNumber(ihour,2) + ':' + padNumber(imin,2) + ':' + padNumber(isec,2);
			                }
			            }
			                
	                }
		            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.IsNumeric) && ((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;
	        }
		}
		
	}
	for (i = 0; i < Form_RequiredGroups.length; i++)
	{
	    if (Form_RequiredGroups[i] != null)
	    {
	        if (!Form_RequiredGroups[i].filled)
	        {
	            tmp = '';
	            for (j = 0; j < Form_RequiredGroups[i].Elements.length; j++)
	            {
					var currElem = getElem(Form_RequiredGroups[i].Elements[j].ID);
					var currDesc = Form_RequiredGroups[i].Elements[j].description;
					var currErrTxt = document.getElementById(currElem.id + "_err");
            
					errorClass = Form_RequiredGroups[i].Elements[j].errorClass;
					normalClass = Form_RequiredGroups[i].Elements[j].normalClass;

					if (j < Form_RequiredGroups[i].Elements.length-1)
					{
		                if (tmp != '')
		                    tmp += ', ';
		                tmp += currDesc;
					}
					
					if (Form_RequiredGroups[i].filled)
					{
						currErrTxt.value = 'false';
						currElem.className = normalClass;
					}
					else
					{
						if (firstElem == null)
						{
							firstElem = currElem;
						}
						currErrTxt.value = 'true';
						currElem.className = errorClass;
					}
	            }
	            if (Form_RequiredGroups[i].Elements.length > 1)
	            {
	                tmp += ' or ' + Form_RequiredGroups[i].Elements[Form_RequiredGroups[i].Elements.length-1].description;
	            }
	            allErrMsg += ' > One of ' + tmp + ' is required';
	        }
	        
	    }
	}
	if (firstElem != null)
	{ 
	
		try
		{
		    firstElem.focus();
		    if (firstElem.type.toLowerCase().indexOf('select') == -1)
			    firstElem.select();
	    }
	    catch (ex)
	    {
	    }
	    if (!Form_DontShowErrorMessage)
		    alert(allErrMsg);
		else
		    alert('Please fill in as required all the marked fields in red');
		    
		    
	}
	return (firstElem == null);
	
	
}
