var images = new Array();

/*
preload the image first, by using the function PRELOADIMG

parameters are:  the imgname, which is the NAME attribute of the image
				the relevant location, of the Up and Over image
				
After that, on the mouseover and mouseout event, the function CHANGEIMG must be called

	img must be the IMAGE object, (passing it thourgh GetElementById) of the Image to be changed
	type is either over or up, according to situation
	
	the ASP function rollover can automatically set the image for rollover, once the image is preloaded



*/

function MyDate(dt)
{
    var day,month,year;
    var tmp = dt;
    if (dt == null || dt == "")
    {
        var tmpDate = new Date();
        tmp = tmpDate.getDate() + "/" + tmpDate.getMonth() + "/" + tmpDate.getFullYear();
    }
    var pos1,pos2;
    tmp = tmp.replace("-","/");
    pos1 = tmp.indexOf("/");
    pos2 = tmp.indexOf("/",pos1+1);
    day = Number(tmp.substr(0,pos1));
    month = Number(tmp.substr(pos1+1,(pos2-pos1-1)));
    year = Number(tmp.substr(pos2+1));
    if ((year + "").length < 4) 
    {
        if (year < 70)
            year += 2000;
        else
            year += 1900;
        
    }
    
    var months = new Array();
    months[1] = 31;
    months[2] = 28;
    months[3] = 31;
    months[4] = 30;
    months[5] = 31;
    months[6] = 30;
    months[7] = 31;
    months[8] = 31;
    months[9] = 30;
    months[10] = 31;
    months[11] = 30;
    months[12] = 31;
    
    this.Date = tmp;
    
    this.isInvalid = false;
    var tmpMaxMonth = 0;
    if (month < 1 || month > 13)
        this.isInvalid = true;
    else
    {
        tmpMaxMonth = months[month];
        if ((year % 4) == 0 && month == 2)
            tmpMaxMonth++;
        if (day < 1 || day > tmpMaxMonth)
            this.isInvalid = true;
    }
    
    
    this.addDays = function addDays(num)
    {
        if (!this.isInvalid)
        {
            var left = num;
            var isLeapYear = ((year % 4) == 0)
            var maxMonth;
            while (left > 0)
            {
                maxMonth = months[month];
                if (month == 2 && isLeapYear)
                    maxMonth++;
                day++;
                if (day > maxMonth)
                {
                    day = 1;
                    month++;
                }
                if (month > 12)
                {
                    year++;
                    month = 1;
                }
                left--;
            }
        }
    }
    
    this.getDate = function getDate()
    {
        if (!this.isInvalid)
        {
            var tmpstr = padNumber(day,2) + "/" + padNumber(month,2) + "/" + year;
            return tmpstr;
        }
        else
            return null;
    }
}

function visibilityElem(elemID,state)
{
    this.elementID = elemID;
    this.state = state;
    
}

function imagePreload(up,over)
{
    this.img = new Image();
    this.imgUp = up; //Up Image URL
    this.imgOver = over; // Over Image URL
    this.img.src = this.imgOver; // Changes source to the Over image,for preloading
    
    this.changeImage = function changeImage(up,over)
    {
        this.imgUp = up;
        this.imgOver = over;
        this.img.src = this.imgOver;
    }

}

function preloadimg(imgname,up,over)
{	
	images[imgname] = new imagePreload(up,over);
}


function changeimg(img,type)
{
/*img is the object of type image, that will have its image changed.
  it must have had images preloaded using preload images, and specified its correct ID
  type is either 'over' or 'up', according to what it is now
  */
	if (type.toLowerCase() == 'over')
	{
		img.src = images[img.id].img.src;
	}
	else
		img.src = images[img.id].imgUp;;
}

function validateForm()
//form_validationGroup is the validation group

//first argument is the characters to show in the relevant _msg tags
//other arguments are of the form ['TEXTBOX'],['GROUP'],['ERRORCLASS'],
//                                ['DESCRIPTION'],['PARAMS'],{OPTIONAL-NEXT TXT}
//if params have either notIn, sameAs, valueIn, the 6th argument must be textbox
// that contains the values, and the 5th its description.
{	
//Note:  Uses the ID attribute to describe the textbox in error messages
//R,isNum,isPos,isEmail,ofLen000,maxLen000,Between00000To00000,isAlpha,sameAs,#,notIn-___,$,isFile-###|###|...#,addBR
/*	Can validate these types:
			integer -> No decimal places are allowed
			R-> Required
			isAlpha-> Allows only 'a..z', 'A..Z', '0..9', _ ^
			allowedValuesXXX$-[VAL1],[VAL2],[VAL3]# -> Apart from normal validation, these 
			                            values are allowed even if they do not adher to 
			                            validation rules.  Pipeline (|) can be replaced by
			                            the delimeter attribute, if there is a 3-char
			                            string followed by a $ exactly after allowedValues
			isNum -> Is numeric
			isEmail -> Is email
			isDate -> is a date
			isDateBefore -> Date must be before next mentioned textbox
			DateFromDDMMYYYY -> Date must be after the specified date
			DateToDDMMYYYY -> Date must be before the specified date
			ofLen000 -> minimum length of [num]
			maxLen000 -> maximum length of [num]
			valueIn -> next argument is textbox that contains values of which it must be
			valueIn-___ -> next argument is textbox that contains values of which it must be, with delimeter
			notIn -> next argument is textbox that contains values
			notIn-___ -> Means next 3 characters are the delimeter
			Between00000To00000 -> number between [num1] to [num2]
			sameAs -> next argument is textbox that contains same value
			# -> means if error, dont set focus (done on controls that dont accept focus) [must be 1st, 2nd or 3rd character]
			$ -> means that no new html code will be written, if an error is generated [must be 1st, 2nd or 3rd character]
			addBR -> means to add a br to the html code being generated
			isFile -> only the filename is considered.  I.e The text after the last / or \
			isFile- -> Means that after it will follow a series of extensions, divided by a pipeline. Ended with a hash (#)
			isPos -> only positive numbers & zere allowed.

*/	
	var err,firsterr,firstmsg,errmsg,sparam,sval,txtbox,passedval,passedvalstr;
	var group,moved,firstparam,firsttxtbox,errmsgall,lastname,requiredVal;
	var Group = form_validationGroup.toLowerCase();
	var errorclass;
	var nexttxtbox,nexttxtboxdesc,rqeuired;
	
	args = validateForm.arguments;
	err=false;
	firsterr = false;
	errmsgall = '';
	lastname = '(Start)';
	
	for (i = 1; i < args.length; i+=5)
	{
		err=false;
		passedval = false;
		required = false;
		passedvalstr = "";
		//
		
		sparam = args[i+4];
		desc = args[i+3];
		group = args[i+1].toLowerCase();
		if (Group == group)
		{
		    errorclass = args[i+2].toLowerCase();
		    txtbox = getElem(args[i]);
		    if (txtbox == null)
		    {
		    
		        alert('[' + resolveID(args[i]) + '] text box does not exist');
		        break;
		    }
		    nexttxtbox = getElem(args[i+5]);
    		
		    try
		    {
		        requiredVal = getElem(txtbox.id + '_required').value;
		    }
		    catch (ex)
		    {
		        alert('Could not find [' + txtbox.id + '_required] text box!');
		        break;
		    }
		    nexttxtboxdesc = args[i+6];
		    if (txtbox == null)
		    {
			    alert('Textbox name \'' + args[i] + '\' does not exist! \n\nThis is the text box after \'' + lastname + '\'.  \n\nCould be because a parameter that takes 2 textboxes was given only one.');
			    return false;
		    }
		    errtxt = getElem(txtbox.id + "_err");
		    sval = txtbox.value;
		    lastname = txtbox.id;
		    //alert(txtbox.name + ": " + sval+ " Validation Type: " + sparam);
		    if (!txtbox.disabled)
		    {
		        if (!err && sparam.indexOf('allowedValues') != -1)
		        {
		            ;
		            parampos = sparam.indexOf('allowedValues');
    		        
		            ipos = sparam.substring(parampos).indexOf('$') + parampos;
		            delim = '|';
		            hashpos = sparam.substring(parampos).indexOf('#') + parampos;
    		        
		            if (ipos == parampos + 'allowedValues'.length + 3)
		            {
		                delim = sparam.substr(parampos + 'allowedValues'.length,3);
		                values = sparam.substring(parampos+'allowedValues'.length+5,hashpos);
		            }
		            else
		                values = sparam.substring(parampos+'allowedValues'.length+1,hashpos);
		            values += delim;
		            passedvalstr = ' or one of these values - ';
		            while (values.indexOf(delim) > -1)
		            {
		                delimpos = values.indexOf(delim);
		                tmp = values.substr(0,delimpos);
		                values = values.substring(delimpos+delim.length);
		                if (sval.toLowerCase() == tmp.toLowerCase())
		                {
		                    passedval = true;
		                    break;
		                }
		                else
		                    passedvalstr += tmp + ","; 
		            }
		            if (passedvalstr.length > 3)
		                passedvalstr = passedvalstr.substring(0,passedvalstr.length-2);
		        }
		        if (!passedval)
		        {
    		
			        if ( !err && sparam.indexOf('isFile') != -1)
			        {
				        ipos = sval.lastIndexOf('\\');
				        if (ipos == -1) 
					        ipos = sval.lastIndexOf('/');
				        sval = sval.substr(ipos+1);
				        ipos = sparam.indexOf('isFile') + 'isFile'.length;
			        }
        			
			        if ((!err && sparam.charAt(0) == 'R' && !txtbox.disabled &&
			            requiredVal == 'form') ||
			            (requiredVal == 'yes')) //Required
			        {
			            err = (sval == '');
				        required = err;
				        if (err) errmsg = '> ' + desc + ' is required';
			        }
			        if (!err && sparam.indexOf('isFile-') != -1 && sval != '')
			        {
				        ipos = sparam.indexOf('isFile-') + 'isFile-'.length;
				        //Check for the extension of file being in the set specified
				        //ipos++;
				        dotpos = sval.lastIndexOf('.');
				        fileext = sval.substr(dotpos+1).toLowerCase();
				        tmpstr = sparam.substr(ipos);
				        ipos2 = tmpstr.indexOf('#');
				        tmpstr = (tmpstr.substring(0,ipos2));
				        err = true;
				        extstr = '';
        				
				        while (tmpstr.indexOf('|') != -1)
				        {
					        ipos = tmpstr.indexOf('|');
					        ext = tmpstr.substring(0,ipos).toLowerCase();
					        if (extstr != '') extstr = extstr + ', ';
					        extstr = extstr + ext;
					        err = !(!err || fileext == ext)
					        tmpstr = tmpstr.substr(ipos+1);
				        }
				        ext = tmpstr.toLowerCase();
				        if (extstr != '') extstr = extstr + ' or ';
				        extstr = extstr + ext;
				        err = !(!err || fileext == ext)
				        if (err) errmsg = '> ' + desc + ' must have an extension of ' + extstr;
			        }
			        if (!err && sparam.indexOf('isNum') > -1 && sval != '')
			        {
				        num = parseFloat(sval);
				        err = (isNaN(sval));
				        if (err) errmsg = '> ' + desc + ' must contain a numerical value';
				        if (!err && sparam.indexOf('isPos') > -1 && sval != '')
				        {
					        err = (num < 0);
					        if (err) errmsg = '> ' + desc + ' must contain a positive value';
        				
				        }
			        }
                    if (!err && sparam.indexOf('isDate') > -1 && 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)) || sday == '' ||
				                smonth == '' || 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 && sparam.indexOf('isDateBefore') > -1 && sval != '' && sparam.indexOf('isDate') > -1)
					        {
					            var err2 = false;
					            dttxtbox = nexttxtbox;
					            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 ' + nexttxtboxdesc + '!';
        					        
                					
                				
				                }
					        }
					        var cday,cmonth,cyear;
    					    
    					    if (!err && sparam.indexOf('DateFrom') > -1 && sval != '' && sparam.indexOf('isDate') > -1)
    					    {
        					
    					        tmp = sparam.indexOf('DateFrom') + 'DateFrom'.length;
        					    
    					        cday = Number(sparam.substr(tmp,2));
    					        tmp += 2;
    					        cmonth = Number(sparam.substr(tmp,2));
    					        tmp += 2;
    					        cyear = Number(sparam.substr(tmp,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 && sparam.indexOf('DateTo') > -1 && sval != '' && sparam.indexOf('isDate') > -1)
    					    {
    					        tmp = sparam.indexOf('DateTo') + 'DateTo'.length;
        					    
    					        cday = parseInt(sparam.substr(tmp,2));
    					        tmp += 2;
    					        cmonth = parseInt(sparam.substr(tmp,2));
    					        tmp += 2;
    					        cyear = parseInt(sparam.substr(tmp,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)
					        txtbox.value = padNumber(iday,2) + '/' + padNumber(imonth,2) + '/' + iyear;
			        }
			        if (!err && sparam.indexOf('isEmail') > -1  && sval != '')
			        {
        				
				        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 && sparam.indexOf('Between') > -1  && sval != '' && sparam.indexOf('isNum') > -1)
			        {
        				
				        tmp = sparam.indexOf('Between');
				        num = parseFloat(sval);
        				
				        startn = parseFloat(sparam.substr(tmp+7,5));
				        tmp = sparam.indexOf('To');
				        endn = parseFloat(sparam.substr(tmp+2,5));
				        err = (num < startn || num > endn)
				        if (err) errmsg = '> ' + desc + ' must contain a numerical value, from ' + startn + ' to ' + endn;
			        }
			        if (!err && sparam.indexOf('ofLen') > -1 )
			        {
				        tmp = sparam.indexOf('ofLen');
				        num = parseFloat(sparam.substr(tmp+5,3));
        	
				        err = (sval.length < num)
				        if (err) errmsg = '> ' + desc + ' must contain at least ' + num + ' characters';
			        }
			        if (!err && sparam.indexOf('maxLen') != -1 && sval != '')
			        {
				        tmp = sparam.indexOf('maxLen');
				        num = parseFloat(sparam.substr(tmp+6,3));
        	
				        err = (sval.length > num)
				        if (err) errmsg = '> ' + desc + ' must not be longer than ' + num + ' characters';
        			
			        }
			        if (!err && sparam.indexOf('isAlpha') > -1  && 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 && sparam.indexOf('notIn') > -1  && sval != '')
			        {
        				
				        ipos = sparam.indexOf('notIn') + 'notIn'.length;
				        if (sparam.charAt(ipos) == '-')
				        {
					        delim = sparam.substr(ipos+1,3);
				        }
				        else
					        delim = ',';
        					
				        nottxtbox = nexttxtbox;
				        if (nottxtbox == null)
				        {
					        alert('Not Textbox is null!\n\n' +
						          'Name of main textbox: ' + txtbox.id + '\nName of current textbox: ' + nexttxtbox.id);
        					
				        }
				        notstr= nottxtbox.value.toUpperCase();
				        thistxt = sval.toUpperCase();
				        if (notstr != '') notstr = notstr + delim;
				        while (notstr.indexOf(delim) > -1)
				        {
					        delimpos = notstr.indexOf(delim);
					        if (delimpos > -1)
					        {
						        tmptxt = notstr.substr(0,delimpos);
						        err= (thistxt == tmptxt)
						        if (err)
						        {
							         errmsg = '> ' + desc + ' already exists! Please choose another one'
							         break;
						        }
        	
						        notstr = notstr.substr(delimpos+delim.length);
					        }
        				
				        }
        			
			        }
			        if (!err && sparam.indexOf('valueIn') > -1  && sval != '')
			        {
        				
				        ipos = sparam.indexOf('valueIn') + 'valueIn'.length;
				        if (sparam.charAt(ipos) == '-')
				        {
					        delim = sparam.substr(ipos+1,3);
				        }
				        else
					        delim = ',';
				        nottxtbox = nexttxtbox;
				        notstr= nottxtbox.value.toUpperCase();
				        thistxt = sval.toUpperCase();
				        if (notstr != '') notstr = notstr + delim;
				        matched=false;
				        while (notstr.indexOf(delim) > -1 && !matched)
				        {
					        delimpos = notstr.indexOf(delim);
					        if (delimpos > -1)
					        {
						        tmptxt = notstr.substr(0,delimpos);
						        matched = (thistxt == tmptxt)

						        notstr = notstr.substr(delimpos+delim.length);
					        }
        				
				        }
				        err = !matched;
				        if (err)		 errmsg = '> ' + desc + ' does not exist!'
        			
			        }
			        if (!err && sparam.indexOf('sameAs') > -1  && sval != '')
			        {
				        sametxtbox = nexttxtbox;
				        nextdesc = args[i+4];
        				
				        err = (txtbox.value != sametxtbox.value);
				        if (err) errmsg = '> ' + desc + ' and ' + nextdesc + ' must contain the same value';
			        }
			        if (!err && sparam.indexOf('integer') > -1  && sval != '')
			        {
        				
				        tmp = sparam.indexOf('integer');
				        numf = parseFloat(sval);
				        numi = parseInt(sval);
        				
				        err = (numf != numi)
				        if (err) errmsg = '> ' + txtbox.id + ' must contain only whole numbers (no decimal places)';
			        }
    	        }
		    }
		    if (txtbox.id.charAt(0) == '#') errmsg= txtbox.id.substr(1);
		    if (sparam.indexOf('sameAs') > -1 || sparam.indexOf('notIn') > -1 ||
		        sparam.indexOf('valueIn') > -1 || sparam.indexOf('isDateBefore') > -1)
			    i += 2;
    /*		if (sparam.charAt(0) != '$' && sparam.charAt(1) != '$' && sparam.charAt(0) != '$') {
			    tmp = '';
			    elem = getElem(txtbox.name + '_msg');
			    if (elem == null)
				    alert(txtbox.name + ' has no error element defined!');
			    else
			    {
				    if (err) {
					    elem.innerHTML = errorchar; //hawnhekk kien hawn TMP
					    if (sparam.indexOf('addBR') != -1) {tmp = '<br>'};
					    tmp = tmp + ' &#9632; ' + errmsg + '';
				    }
				    else 
					    elem.innerHTML = "
			    }
		    }*/
		    if (err)
		        errtxt.value = "true";
		    else
		        errtxt.value = "false";
		    if (passedvalstr != '' && !passedval && !required)
		        errmsg += passedvalstr;
    /*	if (sparam.charAt(0) != '#' && sparam.charAt(1) != '#' && sparam.charAt(2) != '#' ) 
			    if (txtbox.type != "hidden") 
			    {
			        txtbox.focus();
			    }*/
    		
    		
		    if (!firsterr) {firsterr = err; firsttxtbox=txtbox;firstparam = sparam;};
		    if (err) 
		    {
		        errmsgall = errmsgall + errmsg + '\n';
		        txtbox.className = errorclass;
		    }
		    else if (!err && !txtbox.disabled)
		        txtbox.className = class_enabled[txtbox.id];

            /*if (err && sparam.charAt(0) != '#' && sparam.charAt(1) != '#'
		        && sparam.charAt(2) != '#' ) {
			    if (txtbox.type != "hidden") {
    				
				    txtbox.focus();
				    if (txtbox.type.toLowerCase().indexOf('select') == -1)
					    txtbox.select();
			    }
		    }*/
		}
	}
	
	if (firsterr)
	{ 
	
		if (firstparam.charAt(0) != '#' && firstparam.charAt(1) != '#'
		    && firstparam.charAt(2) != '#' ) {
			if (firsttxtbox.type != "hidden") {
				
				try
				{
				    firsttxtbox.focus();
				    if (firsttxtbox.type.toLowerCase().indexOf('select') == -1)
					    firsttxtbox.select();
			    }
			    catch (ex)
			    {
			    }
			    
			}
		}
		alert(errmsgall);
	}
		
	return !firsterr;
	
}
function txtforhtml(txt)
{
	tmp = txt
	tmp = replaceall(tmp,'<','&lt;');
	tmp = replaceall(tmp,'>','&gt;');
	tmp = replaceall(tmp,' ','&nbsp;');
	tmp = replaceall(tmp,'\n','<br>');
	return tmp;
}

function replaceall(txt,from,to)
{
	tmp = txt;
	while (tmp.indexOf(from) != -1)
	{
		tmp = tmp.replace(from,to);
	}
	return tmp;

}

function resizeimage(img,maxwidth,maxheight)
{
	if (maxwidth > 0)
	{
		if (img.width > maxwidth)
			img.width = 440;
	}
	if (maxheight > 0)
	{
		if (img.height > maxheight)
			img.height = maxheight;
	}
}

function doForQueryStr(str)
{
	var tmp = str;
	tmp = tmp.replace('%','%25');
	tmp = tmp.replace('&','%26');
	tmp = tmp.replace('=','%3D');
	tmp = tmp.replace('?','%3F');
	return tmp;
	
}

function formatNumber(num,dp)
{
	var tmp = num;
	
	var mult = 1;
	for (var i = 0; i < dp; i++)
		mult *= 10;
	tmp = Math.round(tmp * mult);
	if (tmp != 0)
	{
		tmp = '' + tmp;
		tmp = tmp.substr(0,tmp.length - dp) + '.' + tmp.substr(tmp.length-2,dp);
	}
	else
	{
		tmp = '0.';
		for (var i = 0; i < dp; i++)
			tmp = tmp + '0';
	}
	
	
	
	return tmp;
	
}

function revCharAt(str,tofind)
{
	for (var i = str.length - tofind.length; i--; i >= 0)
		if (str.substr(i,tofind.length) == tofind)
			return i;
	return -1;	
	
}

function addInPlaceInCmb(cmb,txt,value,noduplicates)
{
	if (noduplicates)
	{
		for (var i = 0; i < cmb.options.length; i++)
		{
			if (cmb.options[i].text.toLowerCase() == txt.toLowerCase() && cmb.options[i].value.toLowerCase() == value.toLowerCase())
				return;
		}
	}
	var newprod = document.createElement('option');
	newprod.text = txt;
	newprod.value = value;
	ffplace = null;
	ieplace = 0;
	for (var i = 0; i < cmb.options.length; i++)
		if (cmb.options[i].text > txt)
		{
			ffplace = cmb.options[i];
			ieplace = i;
			break;
		}
	
	try {
		cmb.add(newprod,ffplace);
	}
	catch(ex)
	{
		cmb.add(newprod,ieplace);
	}
	return;
}


//returns the resolved id, through the resolvedIDs array.  If it resolves,
//returns the resolved id, else returns the same id as passed.
function resolveID(id)
{
    try
    {
        var tmp = resolvedIDs[id];
        if (tmp == null || tmp == "")
            return id;
        else
            return tmp;
    }
    catch (ex)
    {
        return id;
    }
}

//gets an element, but first checks if id can be resolved
function getElem(id)
{
    
	var tmp, currid;
	currid = resolveID(id);
	tmp = document.getElementById(currid) ;
	if (tmp == null)
		tmp = document.getElementsByName(currid)[0];
	return tmp;
}
function getElemName(name)
{	return document.getElementsByName(name); }


function padNumber(num,digits)
{
	var tmp,snum,sret
	snum = "" + num;
	tmp = digits - snum.length;
	sret = num
	for (k = 1; k <= tmp; k++)
		sret = "0" + sret
	return sret
}

function addToCmb(cmb,txt,val)
{
    var opt = document.createElement("OPTION");
	opt.text = txt;
	opt.value = val;
    try 
        {cmb.add(opt);}
    catch (ex)
       {cmb.add(opt,null);}
}

//adds an element, to a certain location in the option
function addToCmbByIndex(cmb,txt,val,index)
{
    var opt = document.createElement("OPTION");
	opt.text = txt;
	opt.value = val;
	var nodeIndex;
	
    try 
        {cmb.add(opt,index);}
    catch (ex)
       {
         cmb.add(opt,cmb.options[index]);
       }

}

function addToCmbInOrder(cmb,txt,val,addifexists,noitemsfromend)
//noitemsfromend is the number of items NOT to count from the end
{
    if (noitemsfromend == "") noitemsfromend = 0;
    var opt = document.createElement("OPTION");
    var nodeIE,nodeMoz;
    var index;
	opt.text = txt;
	opt.value = val;
	var i,found;
	found=false;
	if (!addifexists)
	{
	    for (i = 0; i < cmb.options.length-noitemsfromend; i++)
	    {
	        if (cmb.options[i].value == val)
	        {
	            found = true;
	            break;
	        }
	    }
	}
	if (!found)
	{
	    if (noitemsfromend > 0)
	    {
	        nodeMoz = cmb.options[cmb.options.length-noitemsfromend];
	        nodeIE = cmb.options.length-noitemsfromend;
	    }
	    else
	    {
	        nodeMoz = null;
	        nodeIE = -1;
	    }
        index = cmb.options.length-noitemsfromend;
	    for (i = 0; i < cmb.options.length-noitemsfromend; i++)
	    {
	        if (cmb.options[i].text.toLowerCase() > txt.toLowerCase())
	        {
	            nodeIE = i;
	            nodeMoz = cmb.options[i];
	            index = i;
	            break;
	        }
	    }
        try 
            {cmb.add(opt,nodeIE);}
        catch (ex)
           {cmb.add(opt,nodeMoz);}
        cmb.selectedIndex = index;
    }
    return !found;

    
}


function forMySql(txt)
{
    var tmp = txt;
    tmp = tmp.replace("\\","\\\\");
    tmp = tmp.replace("'","\\'");
    return tmp;
    

}

function clearCmb(cmb)
{
    while (cmb.options.length > 0)
    {
        cmb.remove(0);
    }
}

function getCmbText(cmb)
{
    var txt = "";
    if (cmb.selectedIndex > -1)
        txt = cmb.options[cmb.selectedIndex].text;
    return txt;
}


function checkItemExistsInCmb(cmb,val)
{
    var i;
    for (i = 0; i < cmb.options.length; i++)
    {
        if (cmb.options[i].value.toLowerCase() == val.toLowerCase())
        {
            return true;
        }
    }
    return false;

}

function getKey(e)
{
    if (window.event)
       return window.event.keyCode;
    else if (e)
       return e.which;
    else
       return null;
}

function hideRow(row)
{
    row.style.display = 'none';
}

function showRow(row)
{
    try
    { //firefox
        row.style.display = "table-row";
    }
    catch (ex)
    { // ie
        row.style.display = "";
    }

}

function noValidation() {
    form_doValidation = 'no'
};

function validationGroup(group) { 
   form_validationGroup = group;
};

function isRequired(id)
{
   var ctrl = getElem(id);
   ctrl = getElem(ctrl.id + '_required');
   if (ctrl == null) {
       alert('Control [' + id + '_required] does not exist for function ISREQUIRED'); }
   ctrl.value = 'yes';
}

function notRequired(id)
{
   var ctrl = getElem(id);
   ctrl = getElem(ctrl.id + '_required');
   if (ctrl == null) {
       alert('Control [' + id + '_required] does not exist for function NOTREQUIRED'); }
   ctrl.value = 'no';
}

//changes enabled state
function changeState(id,state)
{
   var ctrl = getElem(id);
   ctrl.disabled = !state;
   if (ctrl.type != 'checkbox' && ctrl.type != 'radio') 
   {
      if (state) 
      {
          ctrl.className = class_enabled[ctrl.id];   
      } else 
      { 
          ctrl.className = class_disabled[ctrl.id];   
      }
   }
}


function markError(state,id)
{
    var errtxt,ctrl;
    ctrl = getElem(id);
    errtxt = getElem(ctrl.id + '_err');
    if (state)
    {
        ctrl.className = class_error[ctrl.id];
        errtxt.value = 'true';
    }
    else
    {
        errtxt.value = 'false';
        ctrl.className = class_enabled[ctrl.id];
    }
}
            
function disable(id)
{
   var ctrl = getElem(id);
   ctrl.disabled = true;
   if (ctrl.type != 'checkbox' && ctrl.type != 'radio') 
       { ctrl.className = class_disabled[ctrl.id]; }   
}

function enable(id)
{
   var ctrl = getElem(id);
   var ctrlerr = getElem(ctrl.id + '_err');

   ctrl.disabled = false;
   if (ctrl.type != 'checkbox' && ctrl.type != 'radio') 
       { ctrl.className = class_enabled[ctrl.id]; }   
   if (ctrlerr != null)
   {
      if (ctrlerr.value == 'true') 
      {
         if (ctrl.type != 'checkbox' && ctrl.type != 'radio') 
             { ctrl.className = class_error[ctrl.id]; }
      }
   }
}

            
