

function ValidateTextbox(validateType,obj){
	var pattern;
	switch(validateType.toUpperCase())
	{
		case "INTEGER":
					
			break;
		case "NAME":
		
			break;
		case "EMAIL":
			pattern = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
			break;
		case "PHONE":
			break;
		case "TEXTAREA":
			break;
		case "FILENAME":
			break;
		case "CURRENCY":
			break;
		case "TEXTAREA":
			// arg[2] = size
			break;
		default:
			return true;	
	}

	if(pattern != ""){
		var re = new RegExp(pattern);
		return obj.value.match(re)
	}else{
		return true;
	}
}


function ValidateForm(formObj){
	if (isValid(formObj)){
		return formConfirm(formObj)
	}else{
		return false;
	}
}

function DMS_Form_Validation_Item_(required,datatype,label,validation,inputtype,maxlength){
	this.required = required;
	this.datatype = datatype;
	this.label = label;
	this.validation = validation;
	this.maxlength = maxlength;
	this.inputtype = inputtype;
}




function isValid(formObj){
	// runs the forms required and data types. 
	// if an error occurs return false and set errorMessage
	// otherwise return true
	

	
	try{
		if(!DMS_Form_Validation_) return true;
	}catch(e){
		return true;
	}
	
	try{
		var myprefix = user_control_prefix  ? form_element_prefix+user_control_prefix : form_element_prefix;
	}catch(e){
		myprefix = form_element_prefix;
	}
	// otherwise run over the array
	for (var obj in DMS_Form_Validation_){
		var elm = document.getElementById(obj) ? document.getElementById(obj) : document.getElementById(myprefix+obj);
		if(elm){
			// required
			var item_ = DMS_Form_Validation_[obj];
			if(item_.required=="1" && !isValue(elm,item_.inputtype)){
				alert(item_.label + ' is a required field');
				elm.focus();
				return false;
			}
			// data type
			if(isValue(elm,item_.inputtype) && !isDataType(elm,item_.datatype,item_.inputtype)){
				alert(item_.label + ' is not a valid '+item_.datatype);
				elm.focus();
				return false;
			}
			// validation
			if(isValue(elm,item_.inputtype) && item_.validation!="" && !ValidateTextbox(item_.validation,elm)){
				alert(item_.label + ' is not a valid '+item_.validation);
				elm.focus();
				return false;
			}
			// max length
			if(item_.maxlength && isMaxLength(elm,item_.inputtype,item_.maxlength)){
				alert('The max length of '+item_.label+' is '+item_.maxlength);
				elm.focus();
				return false;
			}
			// input type
			if(!ValidateInputType(elm,item_.inputtype)){
				elm.focus();
				return false;
			}
		}
	}
	return true;		
}



function ValidateInputType(obj,inputtype){

	switch (inputtype.toUpperCase())
	{
		case "PHONE":
			if(obj.value=="() -"){
				obj.value = "";
			}
		default:
	}

	return true;

}





function isMaxLength(obj,inputtype,maxlength){

	if(maxlength <= 0) return false;

	switch (inputtype.toUpperCase())
	{
		case "SOMETHING" :
			return true;
		default :
			return obj.value.length > maxlength;	
	}
}

function isValue(obj,inputtype){
	switch (inputtype.toUpperCase())
	{
		case "CHECKBOX" :
			return obj.checked;
		default :
			return obj.value != "";
	
	}

}


function isDataType(elm,datatype,inputtype){
	var pattern;

	switch(datatype.toUpperCase())
	{
		case "NUMBER":
			pattern = /[\d|.]*?/;
			break;
		case "STRING":
			return true;
			break;
		case "DATE":
			return isDate(elm.value);
			break;
		default:
			return true;
			break;	
	}
    if(pattern != ""){
		var re = new RegExp(pattern);
		return obj.value.match(re)
	}else{
		return true;
	}
}

function isNumeric(value){
	return value.match(/[\d|.]*?/);	
}

function isDate(p_Expression){
	return !isNaN(new Date(p_Expression));		// <<--- this needs checking
}


// REQUIRES: isDate()
function dateAdd(p_Interval, p_Number, p_Date){
	if(!isDate(p_Date)){return "invalid date: '" + p_Date + "'";}
	if(isNaN(p_Number)){return "invalid number: '" + p_Number + "'";}	

	p_Number = new Number(p_Number);
	var dt = new Date(p_Date);
	switch(p_Interval.toLowerCase()){
		case "yyyy": {// year
			dt.setFullYear(dt.getFullYear() + p_Number);
			break;
		}
		case "q": {		// quarter
			dt.setMonth(dt.getMonth() + (p_Number*3));
			break;
		}
		case "m": {		// month
			dt.setMonth(dt.getMonth() + p_Number);
			break;
		}
		case "y":		// day of year
		case "d":		// day
		case "w": {		// weekday
			dt.setDate(dt.getDate() + p_Number);
			break;
		}
		case "ww": {	// week of year
			dt.setDate(dt.getDate() + (p_Number*7));
			break;
		}
		case "h": {		// hour
			dt.setHours(dt.getHours() + p_Number);
			break;
		}
		case "n": {		// minute
			dt.setMinutes(dt.getMinutes() + p_Number);
			break;
		}
		case "s": {		// second
			dt.setSeconds(dt.getSeconds() + p_Number);
			break;
		}
		case "ms": {		// second
			dt.setMilliseconds(dt.getMilliseconds() + p_Number);
			break;
		}
		default: {
			return "invalid interval: '" + p_Interval + "'";
		}
	}
	
	if (dt.getYear() < 2000){
		var year = dt.getYear() + 1900;
	}else{
		var year = dt.getYear();
	}
	
	return dt.getMonth() + "/" + dt.getDay() + "/" + year
}



// REQUIRES: isDate()
// NOT SUPPORTED: firstdayofweek and firstweekofyear (defaults for both)
function dateDiff(p_Interval, p_Date1, p_Date2, p_firstdayofweek, p_firstweekofyear){
	if(!isDate(p_Date1)){return "invalid date: '" + p_Date1 + "'";}
	if(!isDate(p_Date2)){return "invalid date: '" + p_Date2 + "'";}
	var dt1 = new Date(p_Date1);
	var dt2 = new Date(p_Date2);

	// get ms between dates (UTC) and make into "difference" date
	var iDiffMS = dt2.valueOf() - dt1.valueOf();
	var dtDiff = new Date(iDiffMS);

	// calc various diffs
	var nYears  = dt2.getUTCFullYear() - dt1.getUTCFullYear();
	var nMonths = dt2.getUTCMonth() - dt1.getUTCMonth() + (nYears!=0 ? nYears*12 : 0);
	var nQuarters = parseInt(nMonths/3);	//<<-- different than VBScript, which watches rollover not completion
	
	var nMilliseconds = iDiffMS;
	var nSeconds = parseInt(iDiffMS/1000);
	var nMinutes = parseInt(nSeconds/60);
	var nHours = parseInt(nMinutes/60);
	var nDays  = parseInt(nHours/24);
	var nWeeks = parseInt(nDays/7);


	// return requested difference
	var iDiff = 0;		
	switch(p_Interval.toLowerCase()){
		case "yyyy": return nYears;
		case "q": return nQuarters;
		case "m": return nMonths;
		case "y": 		// day of year
		case "d": return nDays;
		case "w": return nDays;
		case "ww":return nWeeks;		// week of year	// <-- inaccurate, WW should count calendar weeks (# of sundays) between
		case "h": return nHours;
		case "n": return nMinutes;
		case "s": return nSeconds;
		case "ms":return nMilliseconds;	// millisecond	// <-- extension for JS, NOT available in VBScript
		default: return "invalid interval: '" + p_Interval + "'";
	}
}



// REQUIRES: isDate(), dateDiff()
// NOT SUPPORTED: firstdayofweek and firstweekofyear (does system default for both)
function datePart(p_Interval, p_Date, p_firstdayofweek, p_firstweekofyear){
	if(!isDate(p_Date)){return "invalid date: '" + p_Date + "'";}

	var dtPart = new Date(p_Date);
	switch(p_Interval.toLowerCase()){
		case "yyyy": return dtPart.getFullYear();
		case "q": return parseInt(dtPart.getMonth()/3)+1;
		case "m": return dtPart.getMonth()+1;
		case "y": return dateDiff("y", "1/1/" + dtPart.getFullYear(), dtPart);			// day of year
		case "d": return dtPart.getDate();
		case "w": return dtPart.getDay();	// weekday
		case "ww":return dateDiff("ww", "1/1/" + dtPart.getFullYear(), dtPart);		// week of year
		case "h": return dtPart.getHours();
		case "n": return dtPart.getMinutes();
		case "s": return dtPart.getSeconds();
		case "ms":return dtPart.getMilliseconds();	// millisecond	// <-- extension for JS, NOT available in VBScript
		default: return "invalid interval: '" + p_Interval + "'";
	}
}


// REQUIRES: isDate()
// NOT SUPPORTED: firstdayofweek (does system default)
function weekdayName(p_Date, p_abbreviate){
	if(!isDate(p_Date)){return "invalid date: '" + p_Date + "'";}
	var dt = new Date(p_Date);
	var retVal = dt.toString().split(' ')[0];
	var retVal = Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[dt.getDay()];
	if(p_abbreviate==true){retVal = retVal.substring(0, 3)}	// abbr to 1st 3 chars
	return retVal;
}
// REQUIRES: isDate()
function monthName(p_Date, p_abbreviate){
	if(!isDate(p_Date)){return "invalid date: '" + p_Date + "'";}
	var dt = new Date(p_Date);	
	var retVal = Array('January','February','March','April','May','June','July','August','September','October','November','December')[dt.getMonth()];
	if(p_abbreviate==true){retVal = retVal.substring(0, 3)}	// abbr to 1st 3 chars
	return retVal;
}

