// Declaring valid date character, minimum year and maximum year
var dtCh= "-";
var minYear=1900;
var maxYear=2100;
var nameIndex = 0;
var typeIndex = 1;
var requiredIndex = 2;
var msgIndex = 3;
var jstypeIndex = 5;
var minIndex = 5;
var maxIndex = 6;
var compareToIndex = 7;
var allowblank = 8;
var validate = new Array();
var maxHours = 24;
var requiredTxt = 'Missing Required Field:'
var invalidTxt = 'Invalid Value:'
var secondsSinceLoad = 0;

var alertList = new Array();
function addAlert(type, name,subtitle, description,time, redirect){
	var addIndex = alertList.length;
	alertList[addIndex]= new Array();
	alertList[addIndex]['name'] = name;
	alertList[addIndex]['type'] = type;
	alertList[addIndex]['subtitle'] = subtitle;
	alertList[addIndex]['description'] = description.replace(/<br>/gi, "\n").replace(/&amp;/gi,'&').replace(/&lt;/gi,'<').replace(/&gt;/gi,'>').replace(/&#039;/gi,'\'').replace(/&quot;/gi,'"');
	alertList[addIndex]['time'] = time;
	alertList[addIndex]['done'] = 0;
	alertList[addIndex]['redirect'] = redirect;
} 
function checkAlerts(){
	secondsSinceLoad += 1;
	var mj = 0;
	var alertmsg = '';
	for(mj = 0 ; mj < alertList.length; mj++){
		if(alertList[mj]['done'] == 0){
			if(alertList[mj]['time'] < secondsSinceLoad && alertList[mj]['time'] > -1 ){
				alertmsg = alertList[mj]['type'] + ":" + alertList[mj]['name'] + "\n" +alertList[mj]['subtitle']+ "\n"+ alertList[mj]['description'] + "\n\n";
				alertList[mj]['done'] = 1;
				if(alertList[mj]['redirect'] == ''){
					alert(alertmsg);
				}else if(confirm(alertmsg)){
					window.location = alertList[mj]['redirect'];
				}
			}
		}
	}
	
	
	setTimeout("checkAlerts()", 1000);

}
function toggleDisplay(id){
		
			if(this.document.getElementById( id).style.display=='none'){
				this.document.getElementById( id).style.display=''
				if(this.document.getElementById(id+"link") != undefined){
					this.document.getElementById(id+"link").style.display='none';
				}
						
			}else{
				this.document.getElementById(  id).style.display='none'
				if(this.document.getElementById(id+"link") != undefined){
					this.document.getElementById(id+"link").style.display='';
				}
			}
		}
function checkAll(form, field, value)
{
	for (i = 0; i < form.elements.length; i++){
		if(form.elements[i].name == field)
			form.elements[i].checked = value;
	}
}

function replaceAll(text, src, rep){
		offset = text.toLowerCase().indexOf(src.toLowerCase());
		while ( offset != -1 ) {                         
		text = text.substring(0, offset) + rep + text.substring(offset + src.length ,text.length);
		offset = text.indexOf( src, offset + rep.length + 1);
		}
		return text;
		}


function addForm(formname){
	validate[formname] = new Array();
}
function addToValidate(formname, name, type,required,  msg){
	if( typeof validate[formname] == 'undefined'){
		addForm(formname);
	}
	validate[formname][validate[formname].length] = new Array(name, type,required, msg);	
}
function addToValidateRange(formname, name, type,required,  msg,min,max){
	addToValidate(formname, name, type,required,  msg);
	validate[formname][validate[formname].length - 1][jstypeIndex] = 'range'
	validate[formname][validate[formname].length - 1][minIndex] = min;
	validate[formname][validate[formname].length - 1][maxIndex] = max;
}

function addToValidateDateBefore(formname, name, type, required, msg, compareTo){
	addToValidate(formname, name, type,required,  msg);
	validate[formname][validate[formname].length - 1][jstypeIndex] = 'isbefore'
	validate[formname][validate[formname].length - 1][compareToIndex] = compareTo;
}

function addToValidateDateBeforeAllowBlank(formname, name, type, required, msg, compareTo, allowBlank){
	addToValidate(formname, name, type,required,  msg);
	validate[formname][validate[formname].length - 1][jstypeIndex] = 'isbefore'
	validate[formname][validate[formname].length - 1][compareToIndex] = compareTo;
	validate[formname][validate[formname].length - 1][allowblank] = allowBlank;
}

function addToValidateBinaryDependency(formname, name, type, required, msg, compareTo) {
	addToValidate(formname, name, type, required, msg);
	validate[formname][validate[formname].length - 1][jstypeIndex] = 'binarydep';
	validate[formname][validate[formname].length - 1][compareToIndex] = compareTo;
}

function removeFromValidate(formname, name){
	for(i = 0; i < validate[formname].length; i++){
		if(validate[formname][i][nameIndex] == name){
			validate[formname].splice(i, 1);
		}
	}
}

function toDecimal(original){
	temp = Math.round(original*100)/100;
	if((original * 100) % 100 == 0)
		return temp + '.00';
	if((original * 10) % 10 == 0)
		return temp + '0';
	return temp
}

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function isNumeric(s){
  if(!/^-*[0-9\.]+$/.test(s))
   {
   		return false
   }
   else
   {
   		return true;
   }
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   }
   return this
}
var date_reg_positions = {'Y': 1,'m': 2,'d': 3};
var date_reg_format = '([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})'
function isDate(dtStr){
	if(dtStr.length== 0){
		return true;
	}
	myregexp = new RegExp(date_reg_format)
	if(!myregexp.test(dtStr))
		return false

return true
}

function getDateObject(dtStr){
		if(dtStr.length== 0){
		return true;
	}
	myregexp = new RegExp(date_reg_format)
	var dt = myregexp.exec(dtStr)
	var yr = dt[date_reg_positions['Y']];
	var mh = dt[date_reg_positions['m']];
	var dy = dt[date_reg_positions['d']];
	var date1 = new Date();
	date1.setFullYear(yr);
	 date1.setMonth(mh);
	 date1.setDate(dy);
	return date1;
}

function isBefore(value1, value2){
	var d1 = getDateObject(value1);
	var d2 = getDateObject(value2);
	return d2 >= d1;
}

function isValidEmail(emailStr){
	if(emailStr.length== 0){
		return true;
	}
	var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
	if(!filter.test(emailStr))
		return false
	return true	
}

function isValidPhone(phoneStr){
	if(phoneStr.length== 0){
		return true;
	}
	if(!/^[0-9\-\(\)]+$/.test(phoneStr))
		return false
	return true	
}
function isFloat(floatStr){
	if(floatStr.length== 0){
		return true;
	}
	if(!/^[0-9\.]+$/.test(floatStr))
		return false
	return true	
}
var time_reg_format = "[0-9]{1,2}\:[0-9]{2}";
function isTime(timeStr){
	time_reg_format = time_reg_format.replace('([ap]m)', '');
	time_reg_format = time_reg_format.replace('([AP]M)', '');
	if(timeStr.length== 0){
		return true;
	}
	//we now support multiple time formats
	myregexp = new RegExp(time_reg_format)
	if(!myregexp.test(timeStr))
		return false

return true
}

function inRange(value, min, max){
	return value >= min && value <= max;
}

function bothExist(item1, item2) {
	if(	typeof item1 == 'undefined') { return false; }
	if(	typeof item2 == 'undefined') { return false; }
	if(	(item1 == '' && item2 != '') || (item1 != '' && item2 == '') ) { return false; }
	return true;
}

function trim(s) {
	if(typeof(s) == 'undefined')  
		return s;
	while (s.substring(0,1) == " ") {
		s = s.substring(1, s.length);
	}
	while (s.substring(s.length-1, s.length) == ' ') {
		s = s.substring(0,s.length-1);
	}

	return s;
}


function check_form(formname){
	if (typeof(siw) != 'undefined' && siw 
		&& typeof(siw.selectingSomething) != 'undefined' && siw.selectingSomething)
			return false;
	return validate_form(formname, '');	
}



function validate_form(formname, startsWith){
	if ( typeof (formname) == 'undefined')
	{
		return false;
	}
	if ( typeof (validate[formname]) == 'undefined')
	{
		return true;
	}
	var form = "document." + formname;
	var isError = false;
	var errorMsg = "";
	for(var i = 0; i < validate[formname].length; i++){
			if(validate[formname][i][nameIndex].indexOf(startsWith) == 0){
				if(typeof eval(form + "." + validate[formname][i][nameIndex] ) != 'undefined'){
					var bail = false;
					if(validate[formname][i][requiredIndex]){
						if(typeof eval(form + "." + validate[formname][i][nameIndex]) == 'undefined' || trim(eval(form + "." + validate[formname][i][nameIndex] + ".value")) == ""){
							errorMsg += '\n' + requiredTxt +' ' + validate[formname][i][msgIndex];
							isError = true;
							bail = true;
						}
					}
					if(!bail){
			
						switch(validate[formname][i][typeIndex]){
						case 'email':
							if(!isValidEmail(trim(eval(form + "." + validate[formname][i][nameIndex] + ".value")))){
								isError = true;
								errorMsg += "\n "+ invalidTxt + " " +	validate[formname][i][msgIndex];
							}
							 break;
						case 'time':
							if( !isTime(trim(eval(form+"." + validate[formname][i][nameIndex] + ".value")))){
								isError = true;
								errorMsg += "\n "+ invalidTxt + " " +	validate[formname][i][msgIndex];
							} break;
						case 'date': if(!isDate(trim(eval(form + "." + validate[formname][i][nameIndex] + ".value")))){
								isError = true;
								errorMsg += "\n "+ invalidTxt + " " +	validate[formname][i][msgIndex];
							}  break;
						case 'alpha': 
							break;
						case 'alphanumeric': 
							break;
						case 'int':
							if(!isInteger(trim(eval(form + "." + validate[formname][i][nameIndex] + ".value")))){
								isError = true;
								errorMsg += "\n "+ invalidTxt + " " + 	validate[formname][i][msgIndex];
							}
							break;
						case 'float':
							if(!isFloat(trim(eval(form + "." + validate[formname][i][nameIndex] + ".value")))){
								isError = true;
								errorMsg += "\n "+ invalidTxt + " " + 	validate[formname][i][msgIndex];
							} 
							break;
						}

						if(typeof validate[formname][i][jstypeIndex]  != 'undefined' && !isError){

							switch(validate[formname][i][jstypeIndex]){
							case 'range':
								if(!inRange(trim(eval(form + "." + validate[formname][i][nameIndex] + ".value")), validate[formname][i][minIndex], validate[formname][i][maxIndex])){
									isError = true;
									errorMsg += "\n " + validate[formname][i][msgIndex] + " value " + eval(form + "." + validate[formname][i][nameIndex] + ".value") + " is not within the valid range (" +validate[formname][i][minIndex] + " - " + validate[formname][i][maxIndex] +  ") " 	;
								}
							break;
							case 'isbefore':
								compareTo = form + "." + validate[formname][i][compareToIndex];
								if(	typeof compareTo != 'undefined'){
									if( trim(eval(compareTo + '.value')) == '' && (validate[formname][i][allowblank] == 'true') ) {
										date2 = '2200-01-01';
									} else {
										date2 = trim(eval(compareTo + '.value'));
									}
																		
									date1 = trim(eval(form + "." + validate[formname][i][nameIndex] + ".value"));

									if(!isBefore(date1,date2)){ 		
										isError = true;
										errorMsg += "\n " + validate[formname][i][msgIndex] + "(" + date1 + ") is not before " + date2;
									}
								}
							break;
							case 'binarydep':
								compareTo = form + "." + validate[formname][i][compareToIndex];
								if( typeof compareTo != 'undefined') {
									item1 = trim(eval(form + "." + validate[formname][i][nameIndex] + ".value"));
									item2 = trim(eval(compareTo + '.value'));
									if(!bothExist(item1, item2)) {
										isError = true;
										errorMsg += "\n " + validate[formname][i][msgIndex];
									}
								}
							break;
							}
						}
					}
				}
			}
		}
	if (isError == true) {
				alert(errorMsg);
				return false;
			}
		
		return true;
	
}