
String.prototype.startsWith = function(str) {
	return this.indexOf(str)==0;	
}

String.prototype.endsWith = function(str) {
	var startPos = this.length-str.length;
	if (startPos<0) return false;
	else return this.lastIndexOf(str,startPos)==startPos;
}

String.prototype.trim = function() {
    return this.replace(/^\s+|\s$/g,"");
}

String.prototype.trimStart = function() {
    return this.replace(/^\s+/,"");
}

String.prototype.trimEnd = function() {
    return this.replace(/^\s$/,"");
}

Date.prototype.toFullDate = function() {
	var hour = this.getTime();
	var amPm = 'AM';
	if (hour>11) amPm = 'PM';
	if (hour>12) hour -= 12;
	if (hour==0) hour = 12;
	return (this.getMonth()+1)+'/'+this.getDate()+'/'+this.getFullYear()+' '+hour+':'+this.getMinutes()+' '+amPm;
}

function Now() {
	var date = new Date();
	return date.toFullDate();
}

function AppendOnLoad(handler) {
	if (window.addEventListener)  window.addEventListener("load", handler, false);    
	else window.attachEvent('onload',handler);	
}

function GetIdValue(id) {
    return GetValue(document.getElementById(id));
}

if (document.captureEvents&&Event.KEYPRESS) document.captureEvents(Event.KEYPRESS)
document.onkeypress = KeyPressHandler; 

function KeyPressHandler(e) {
	if (!e) {
		if (window.event) e = window.event;
		else if (event) e = event;
		else return true;
	}
	var code;
	if (typeof(e.keyCode)=='number') code = e.keyCode;
	else if(typeof(e.which)=='number') code = e.which;
	else if(typeof(e.charCode)=='number' ) code = e.charCode;
	else return true;
	if (code==13) {
		if (e.srcElement) {
			if (e.srcElement.type!='textarea'&&e.srcElement.type!='submit') return false;
			else return true;
		} else if (e.target&&e.target.type) {		
        	if (e.target.type!='textarea'&&e.target.type!='submit') return false;
       		else return true;
		} else return true;
	} else return true;
}


function EnterClicked(e,button) {
	if (!e) {
		if (window.event) e = window.event;
		else if (event) e = event;
		else return;
	}
	var code;
	if (typeof(e.keyCode)=='number') code = e.keyCode;
	else if(typeof(e.which)=='number') code = e.which;
	else if(typeof(e.charCode)=='number' ) code = e.charCode;
	else return;
	if (code==13) {
		if (e.srcElement) {
			if (e.srcElement.type!='textarea') {
            	e.returnValue = false;
            	e.cancel = true;
            	document.getElementById(button).click();			
			}
		} else if (e.target&&e.target.type) {		
        	if (e.target.type!='textarea') {
            	document.getElementById(button).click();
            	return false;		
			}
		}
	}
}

/// <summary>
/// Return the value of an object for any type of object on the mage
/// <summary>
/// <param name="obj">The object on the page</param>
function GetValue(obj) {
    if (obj==null) return '';
    if (obj.type=='select-multiple') {
        var selected = new Array();
        for (var i=0; i<obj.options.length; i++) {
            if (obj.options[i].selected) selected[selected.length] = obj.options[i].value;
        }
        return selected;
    } else if (obj.type=='select-one') {
        if (obj.selectedIndex!=null) return obj.options[obj.selectedIndex].value;
    } else {
        if (obj.value!=null) return obj.value;
    }
    return '';
}



function IsWindows() {
	return (navigator.appVersion.indexOf("Win")!=-1);
}

function IsMac() {
	return (navigator.appVersion.indexOf("Mac")!=-1);
}

function IsIE() {
	return (navigator.appName=='Microsoft Internet Explorer');
}

function IsNetscape() {
	return (navigator.appName=='Netscape');
}

function Sliced_SetFocus(obj, focusing, focusRoot, blurRoot) {
    var url = ((focusing)?focusRoot:blurRoot);
    var id = obj.id;
    var imgToChange = new Array('TopLeft','TopRight','BottomLeft','BottomRight','Top','Left','Right','Bottom');
    for (var i=0; i<imgToChange.length; i++) {
        if (i<4) document.getElementById(id+'_'+imgToChange[i]).src = url+'_'+imgToChange[i]+'.jpg';
        else {
			if (IsIE()) document.getElementById(id+'_'+imgToChange[i]).background = url+'_'+imgToChange[i]+'.jpg';
			else document.getElementById(id+'_'+imgToChange[i]).style.backgroundImage = 'url('+url+'_'+imgToChange[i]+'.jpg);';
		}
    }
}


function Actieve_UpdateCalender(id,allowFrom,allowTo,changeTo,theValue,weekDayArray,cellPadding,cellSpacing,borderWidth,dayCellHeight,weekdayNameClass,selectDayClass,todayClass,selectedClass,weekendClass,cantSelectClass,otherMonthClass,highlightClass,allowSelectOtherMonth,allowSelectWeekend,showOtherMonthDate) {
	var myDate = new Date();
	var today = new Date();
	var newDate = new Date();
	var yearField = document.getElementById(id+'_SelectYear');
	var monthField = document.getElementById(id+'_SelectMonth');
	var startDate = new Date();
	var endDate = new Date();
	
	if (allowFrom!=''&&allowFrom!='undefined'&&allowFrom!=null) startDate = new Date(allowFrom);
	else startDate.setFullYear(startDate.getYear()-10,thisMonth,1)
	
	if (allowTo!=''&&allowTo!='undefined'&&allowTo!=null) endDate = new Date(allowTo);
	else endDate.setFullYear(endDate.getYear()+10,thisMonth,1);
	
	var thisMonth = Number(monthField.options[monthField.selectedIndex].value);	
	newDate.setFullYear(yearField.options[yearField.selectedIndex].value,thisMonth,1);	
	
	if (theValue!=''&&theValue!='undefined'&&theValue!=null) {
		var vals = theValue.split('/');
		if (vals.length==3) {
			myDate.setFullYear(vals[2],vals[0]-1,vals[1]);
			newDate.setFullYear(vals[2],vals[0]-1,vals[1]);
		}
	}	
	
	if (changeTo!=0) {
		if (changeTo<0) {
			if (newDate.getMonth()==0) {
				if (yearField.selectedIndex!=0) {
					yearField.selectedIndex = yearField.selectedIndex+changeTo;
					monthField.selectedIndex = monthField.options.length-1;
				} else alert('Invalid Date');
			} else monthField.selectedIndex = monthField.selectedIndex+changeTo;
		} else {
			if (newDate.getMonth()==11) {
				if (yearField.selectedIndex!=yearField.options.length-1) {
					yearField.selectedIndex = yearField.selectedIndex+changeTo;
					monthField.selectedIndex = 0;
				} else alert('Invalid Date');
			} else monthField.selectedIndex = monthField.selectedIndex+changeTo;
		}
	} else {
		for (var i=0; i<monthField.options.length; i++) {
			if (monthField.options[i].value==newDate.getMonth()) {
				monthField.selectedIndex = i;
				break;
			}
		}
		for (var i=0; i<yearField.options.length; i++) {
			if (yearField.options[i].value==newDate.getFullYear()) {
				yearField.selectedIndex = i;
				break;
			}
		}
	}			
	thisMonth = Number(monthField.options[monthField.selectedIndex].value);		
	myDate.setFullYear(yearField.options[yearField.selectedIndex].value,thisMonth,1);
	var startIndex = myDate.getDay();
	var useClass = '';
	myDate.setDate(myDate.getDate()-startIndex);
	var html = '<table width="100%" cellSpacing="'+cellSpacing+'" cellPadding="'+cellPadding+'" border="'+borderWidth+'"><tr'+((weekdayNameClass!='')?' class="'+weekdayNameClass+'"':'')+'">';
	for (var i=0; i<weekDayArray.length; i++) html += '<td width="14%"><div align="center">'+weekDayArray[i]+'</div></td>';
	html += '</tr><tr>';
 	endDate = endDate.setDate(endDate.getDate()+1);
	for (var i=0; i<42; i++) {
		useClass = '';
		if (myDate<startDate||myDate>endDate) {
			useClass = cantSelectClass;
			if (i<startIndex&&myDate.getMonth()!=thisMonth&&otherMonthClass!='') useClass = otherMonthClass;
			else {
				if (myDate.getDay()==0||myDate.getDay()==6&&weekendClass!='') useClass = weekendClass;
			}
			html += '<td height="'+dayCellHeight+'" valign="top" id="'+id+'_Day_'+i+'"'+((useClass!='')?' class="'+useClass+'"':'')+'>'+myDate.getDate()+'</td>';
		} else {
			if (i>=startIndex&&myDate.getMonth()==thisMonth) {
				if (myDate.getDay()==0||myDate.getDay()==6) {
					useClass = weekendClass;
					if (allowSelectWeekend) {
						if (weekendClass=='') useClass = selectDayClass;
						if (todayClass!=''&&myDate.getMonth()==today.getMonth()&&myDate.getFullYear()==today.getFullYear()&&myDate.getDate()==today.getDate()) useClass = todayClass;
						if (selectDayClass!=''&&theValue!=''&&myDate.getMonth()==newDate.getMonth()&&myDate.getFullYear()==newDate.getFullYear()&&myDate.getDate()==newDate.getDate()) useClass = selectedClass;
						html += '<td height="'+dayCellHeight+'" style="cursor:pointer;" valign="top" id="'+id+'_Day_'+i+'"'+((useClass!='')?' class="'+useClass+'"':'')+((highlightClass!='')?' onMouseOver="this.className=\''+highlightClass+'\';"':'')+((highlightClass!='')?' onMouseOut="this.className=\''+useClass+'\';"':'')+' onClick="document.getElementById(\''+id+'\').value=\''+(myDate.getMonth()+1)+'/'+myDate.getDate()+'/'+myDate.getFullYear()+'\';document.getElementById(\''+id+'_layer\').style.display=\'none\';">'+myDate.getDate()+'</td>';
					} else {
						if (weekendClass=='') useClass = cantSelectClass;
						if (todayClass!=''&&myDate.getMonth()==today.getMonth()&&myDate.getFullYear()==today.getFullYear()&&myDate.getDate()==today.getDate()) useClass = todayClass;
						if (selectDayClass!=''&&theValue!=''&&myDate.getMonth()==newDate.getMonth()&&myDate.getFullYear()==newDate.getFullYear()&&myDate.getDate()==newDate.getDate()) useClass = selectedClass;
						html += '<td height="'+dayCellHeight+'" valign="top" id="'+id+'_Day_'+i+'"'+((useClass!='')?' class="'+useClass+'"':'')+'>'+myDate.getDate()+'</td>';
					}
				} else {
					useClass = selectDayClass;
					if (todayClass!=''&&myDate.getMonth()==today.getMonth()&&myDate.getFullYear()==today.getFullYear()&&myDate.getDate()==today.getDate()) useClass = todayClass;
					if (selectDayClass!=''&&theValue!=''&&myDate.getMonth()==newDate.getMonth()&&myDate.getFullYear()==newDate.getFullYear()&&myDate.getDate()==newDate.getDate()) useClass = selectedClass;
					html += '<td height="'+dayCellHeight+'" style="cursor:pointer;" valign="top" id="'+id+'_Day_'+i+'"'+((useClass!='')?' class="'+useClass+'"':'')+((highlightClass!='')?' onMouseOver="this.className=\''+highlightClass+'\';"':'')+((highlightClass!='')?' onMouseOut="this.className=\''+useClass+'\';"':'')+' onClick="document.getElementById(\''+id+'\').value=\''+(myDate.getMonth()+1)+'/'+myDate.getDate()+'/'+myDate.getFullYear()+'\';document.getElementById(\''+id+'_layer\').style.display=\'none\';">'+myDate.getDate()+'</td>';
				}
			} else {
				if (allowSelectOtherMonth) {
					useClass = selectDayClass;
					if (otherMonthClass!='') useClass = otherMonthClass;
					html += '<td style="cursor:pointer;" height="'+dayCellHeight+'" valign="top" id="'+id+'_Day_'+i+'"'+((useClass!='')?' class="'+useClass+'"':'')+((highlightClass!='')?' onMouseOver="this.className=\''+highlightClass+'\';"':'')+((highlightClass!='')?' onMouseOut="this.className=\''+useClass+'\';"':'')+' onClick="document.getElementById(\''+id+'\').value=\''+(myDate.getMonth()+1)+'/'+myDate.getDate()+'/'+myDate.getFullYear()+'\';document.getElementById(\''+id+'_layer\').style.display=\'none\';">'+myDate.getDate()+'</td>';
				} else {
					useClass = cantSelectClass;
					if (otherMonthClass!='') useClass = otherMonthClass;
					html += '<td height="'+dayCellHeight+'" valign="top" id="'+id+'_Day_'+i+'"'+((useClass!='')?' class="'+useClass+'"':'')+'>'+((showOtherMonthDate)?myDate.getDate():'&nbsp;')+'</td>';
				}				
			}
		}
		myDate.setDate(myDate.getDate()+1);
		if ((i+1)%7==0) html += '</tr><tr>';
	}
	html += '</tr></table>';
	
	if (yearField.selectedIndex==0&&monthField.selectedIndex==0) document.getElementById(id+'_PreviousButtonDiv').style.display = 'none';
	else document.getElementById(id+'_PreviousButtonDiv').style.display = ((navigator.appName=='Microsoft Internet Explorer')?'inline':'table-cell');
	
	if (yearField.selectedIndex==yearField.options.length-1&&monthField.selectedIndex==monthField.options.length-1) document.getElementById(id+'_NextButtonDiv').style.display = 'none';
	else document.getElementById(id+'_NextButtonDiv').style.display = ((navigator.appName=='Microsoft Internet Explorer')?'inline':'table-cell');
	
	document.getElementById(id+'_CalendarRow').innerHTML = html;
    if (document.getElementById(id+'_layer').style.display=='none') {
        document.getElementById(id+'_layer').style.display=((navigator.appName=='Microsoft Internet Explorer')?'inline':'table-row');
    }
    document.getElementById(id+'_ShimFrame').width = document.getElementById(id+'_ShimDiv').offsetWidth;
    document.getElementById(id+'_ShimFrame').height = document.getElementById(id+'_ShimDiv').offsetHeight;
}

function ExecuteAjax(url,method,names,values) {
    var ajax = null;
    if (!IsIE()) ajax = new XMLHttpRequest();
    else ajax = new ActiveXObject("Microsoft.XMLHTTP");
    var xmlData = GetAJAXData(url,method,names,values);
    ajax.open("POST",url,false);
    ajax.setRequestHeader("Content-Type","text/xml");
    ajax.send(xmlData);
}

function AjaxGetString(url,method,names,values) {
    var ajax = null;
    if (!IsIE()) ajax = new XMLHttpRequest();
    else ajax = new ActiveXObject("Microsoft.XMLHTTP");
    var xmlData = GetAJAXData(url,method,names,values);
    ajax.open("POST",url,false);
    ajax.setRequestHeader("Content-Type","text/xml");
    ajax.send(xmlData);
    var toReturn = stripHtml(ajax.responseText).trim();
	return toReturn;
}

function ExecuteBoolean(url,method,names,values) {
    var ajax = null;
    if (!IsIE()) ajax = new XMLHttpRequest();
    else ajax = new ActiveXObject("Microsoft.XMLHTTP");
    var xmlData = GetAJAXData(url,method,names,values);
    ajax.open("POST",url,false);
    ajax.setRequestHeader("Content-Type","text/xml");
    ajax.send(xmlData);
    return stripHtml(ajax.responseText).trim()=='true';
}

function GetAJAXData(url,method,names,vals) {
	var val = '';
	val += '<?xml version="1.0" encoding="utf-8"?>';
	val += '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">';
	val += '<soap:Body>';
	val += '<'+method+'  xmlns="'+url.replace('https:','http:')+'">';
	if (names!=null) {
		for (var i=0; i<names.length&&i<vals.length; i++) val += '<'+names[i]+'>'+vals[i]+'</'+names[i]+'>';
	}
	val += '</'+method+'>';
	val += '</soap:Body>';
	val += '</soap:Envelope>';
	return val;
}

/* String Parsing */

function stripHtml(oldString) {
   var newString = "";
   var inTag = false;
   for(var i = 0; i < oldString.length; i++) {
        if(oldString.charAt(i) == '<') inTag = true;
        if(oldString.charAt(i) == '>') {
			inTag = false;
			continue;
		}
        if(!inTag) newString += oldString.charAt(i);
   }
   return newString;
}

function restoreHtml(oldString) {
	var newString = oldString.replace(/&lt;/g,'<');
	newString = newString.replace(/&amp;/g,'&');
	return newString.replace(/&gt;/g,'>');
}

/* Div Visibilty */

function ShowDiv(id) {
   if (document.layers) document.layers[id].visibility='show';
   else document.getElementById(id).style.visibility='visible';
}

function HideDiv(id) {
   if (document.layers) document.layers[id].visibility='hide';
   else document.getElementById(id).style.visibility='hidden';
}

function ToggleDiv(id) {
	 if (document.layers) {
		 if (document.layers[id].visibility=='hide') document.layers[divid].visibility='show';
		 else document.layers[id].visibility='hide';
	 } else {
		 if (document.getElementById(id).style.visibility=='hidden') document.getElementById(divid).style.visibility='visible';
		 else document.getElementById(id).style.visibility='hidden';
	 }
}

/* Table Cell Visibilty */

function ShowCell(objName) {
	if (document.getElementById(objName).style.display=='none') ToggleCell(objName);
}

function HideCell(objName) {
	if (document.getElementById(objName).style.display!='none') ToggleCell(objName);
}

function ToggleCell(objName) {
	var showing = ((IsIE())?'inline':'table-cell');
	if (document.getElementById(objName).style.display=='none') document.getElementById(objName).style.display=showing;
	else document.getElementById(objName).style.display='none';
}

/* Table Column Visibilty */

function ShowColumn(objName) {
	if (document.getElementById(objName).style.display=='none') ToggleRow(objName);
}

function HideColumn(objName) {
	if (document.getElementById(objName).style.display!='none') ToggleRow(objName);
}

function ToggleColumn(objName) {
	var showing = (IsIE()?'inline':'table-column');
	if (document.getElementById(objName).style.display=='none') document.getElementById(objName).style.display=showing;
	else document.getElementById(objName).style.display='none';
}

/* Table Row Visibilty */

function ShowRow(objName) {
	if (document.getElementById(objName).style.display=='none') ToggleRow(objName);
}

function HideRow(objName) {
	if (document.getElementById(objName).style.display!='none') ToggleRow(objName);
}

function ToggleRow(objName) {
	var showing = ((IsIE())?'inline':'table-row');
	if (document.getElementById(objName).style.display=='none') document.getElementById(objName).style.display=showing;
	else document.getElementById(objName).style.display='none';
}

function ShowRowIfChecked(objName,checkName) {
	if (document.getElementById(checkName).checked) ShowRow(objName);
	else HideRow(objName);
}

function ShowRowIf(objName,is,val) {
	if (val==is) ShowRow(objName);
	else HideRow(objName);
}

function HideRowIf(objName,is,val) {
	if (val==is) HideRow(objName);
	else ShowRow(objName);
}

/* Element Visibilty */

function ShowElement(objName) {
	if (document.getElementById(objName).style.display=='none') ToggleElement(objName);
}

function HideElement(objName) {
	if (document.getElementById(objName).style.display!='none') ToggleElement(objName);
}

function ToggleElement(objName) {
	if (document.getElementById(objName).style.display=='none') document.getElementById(objName).style.display='inline';
	else document.getElementById(objName).style.display='none';
}

function ShowElementIf(id,val1,val2) {
	if (val1==val2) ShowElement(id);	
	else HideElement(id);
}

/* Block Visibilty */

function ToggleBlock(objName) {
	if (document.getElementById(objName).style.display=='none') document.getElementById(objName).style.display='block';
	else document.getElementById(objName).style.display='none';
}

/* Advanced Visibilty */

function HideDivs() {
	var args = new Array();
	args = HideDivs.arguments;
	for(var i=0; i<args.length; i++) {
        if (document.getElementById(args[i])) HideDiv(args[i]);
	}
}

function ToggleElementImage(objName,plus,minus) {
	if (document.getElementById(objName).style.display=='none') document.getElementById(objName).style.display='block';
	else document.getElementById(objName).style.display='none';
	if (document.getElementById(plus).style.display=='none') {
		document.getElementById(minus).style.display='none';
		document.getElementById(plus).style.display='inline';		
	} else {
		document.getElementById(plus).style.display='none';
		document.getElementById(minus).style.display='inline';		
	}
}

function ToggleRowImage(objName,plus,minus) {
	ToggleRow(objName);
	ToggleElement(plus);
	ToggleElement(minus);
}
/// A List of Validation Types
var ValidateChecked = 1;
var ValidateUnChecked = 2;
var ValidateNonEmpty = 3;
var ValidateEmpty = 4;
var ValidateIsInteger = 5;
var ValidateIsPositiveInteger = 6;
var ValidateIsLength = 7;
var ValidateIsMoney = 8;
var ValidateIsNumber = 9;
var ValidateIsPositiveNumber = 10;
var ValidateIsNumberBetween = 11;
var ValidateIsNumberGreaterThan = 12;
var ValidateIsNumberGreaterThanOrEqualTo = 13;
var ValidateIsNumberLessThan = 14;
var ValidateIsNumberLessThanOrEqualTo = 15;
var ValidateIsDate = 16;
var ValidateIsDateBetween = 17;
var ValidateIsDateGreaterThan = 18;
var ValidateIsDateGreaterThanOrEqualTo = 19;
var ValidateIsDateLessThan = 20;
var ValidateIsDateLessThanOrEqualTo = 21;
var ValidateIsInArray = 22;
var ValidateIsNotInArray = 23;
var ValidateIsLengthGreaterThan = 24;
var ValidateIsLengthGreaterThanOrEqualTo = 25;
var ValidateIsLengthLessThan = 26;
var ValidateIsLengthLessThanOrEqualTo = 27;
var ValidateIsEqualTo = 28;
var ValidateIsEqualToIgnoreCase = 29;
var ValidateIsNotEqualTo = 30;
var ValidateIsNotEqualToIgnoreCase = 31;
var ValidateIsSelectionEqualTo = 32;
var ValidateIsSelectionNotEqualTo = 33;
var ValidateSelectedAmountGreaterThan = 34;
var ValidateSelectedAmountGreaterThanOrEqualTo = 35;
var ValidateSelectedAmountLessThan = 36;
var ValidateSelectedAmountLessThanOrEqualTo = 37;
var ValidateIsPostalCode = 38;
var ValidateIsEMailAddress = 39;
var ValidateWebService = 40;
var ValidateIsEqualToField = 41;
var ValidateIsLengthEmptyGreaterThanOrEqualTo = 42;
var ValidateIsNumericLength = 43;

/// An Array of Arrays that contains Validation Information
var validationItems = new Array();

/// <summary>
/// A Function for appending Validation objects to a form
/// </summary>
/// <param name="buttonId">The forms submit button identifier</param>
/// <param name="fieldId">The Identifier for the object on the page</param>
/// <param name="validateAs">The Validation Enumeration to use</param>
/// <param name="argument1">An Argument required to validate based on the Validation Type</param>
/// <param name="argument2">An Argument required to validate based on the Validation Type</param>
/// <param name="argument3">An Argument required to validate based on the Validation Type</param>
function AddValidation(buttonId,fieldId,validateAs,argument1,argument2,argument3) {
    var items = new Array();
    if (validationItems[buttonId]!=null) items = validationItems[buttonId];
    items[items.length] = new ValidateObject(fieldId,validateAs,argument1,argument2,argument3);
    validationItems[buttonId] = items;
}

/// <summary>
/// Validates the form identified via a button identifier. Should be placed prior to form submission
/// </summary>
/// <param name="buttonId">The forms submit button identifier</param>
function ValidateForm(buttonId) {
    var hasError = false;
	try {
		if (validationItems[buttonId]!=null) {
			var items = validationItems[buttonId];
			for (var i=0; i<items.length; i++) {
				if (items[i].IsValid()) {
					HideRow(items[i].id+'_ErrorMessage');
				} else {			
					hasError = true;
					ShowRow(items[i].id+'_ErrorMessage');
				}
			}
		}
	} catch (e) {
		hasError = false;
		//alert('Unable to Validate Form, due to programming exception: '+e.message);	
	}
    return !hasError;
}

/// <summary>
/// An Object for validating various types of input fields
/// </summary>
/// <param name="id">The Identifier for the object on the page</param>
/// <param name="validateAs">The Validation Enumeration to use</param>
/// <param name="argument1">An Argument required to validate based on the Validation Type</param>
/// <param name="argument2">An Argument required to validate based on the Validation Type</param>
/// <param name="argument3">An Argument required to validate based on the Validation Type</param>
function ValidateObject(id,validateAs,argument1,argument2,argument3) {

    // Properties
    this.id = id;
    this.validateAs = validateAs;
    this.argument1 = argument1;
    this.argument2 = argument2;
    this.argument3 = argument3;
    
    // Validation Methods
    this.IsValid = function() {
        var obj = document.getElementById(this.id);
        if (obj==null) return false;
        if (obj.type=='checkbox'||obj.type=='radio') {
            if (validateAs==ValidateChecked) return obj.checked;
            else if (validateAs==ValidateUnChecked) return !obj.checked;
            else if (validateAs==ValidateIsEqualTo) return IsEqualTo(GetValue(obj),argument1,false);
            else if (validateAs==ValidateIsEqualToIgnoreCase) return IsEqualTo(GetValue(obj),argument1,true);
            else if (validateAs==ValidateIsNotEqualTo) return !IsEqualTo(GetValue(obj),argument1,false);
            else if (validateAs==ValidateIsNotEqualToIgnoreCase) return !IsEqualTo(GetValue(obj),argument1,true);
            else if (validateAs==ValidateWebService) return IsValidFromWebService(GetValue(obj),argument1,argument2,argument3);
            else if (validateAs==ValidateIsEqualToField) return GetValue(obj)==GetIdValue(argument1);
            else return false;
        } else if (obj.type=='text'||obj.type=='textarea'||obj.type=='select-one'||obj.type=='password') {
            if (validateAs==ValidateNonEmpty) return !IsEmpty(GetValue(obj));
            else if (validateAs==ValidateEmpty) return IsEmpty(GetValue(obj));
            else if (validateAs==ValidateIsInteger) return IsInt(GetValue(obj),false,true);
            else if (validateAs==ValidateIsPositiveInteger) return IsInt(GetValue(obj),false,false);
            else if (validateAs==ValidateIsLength) return GetValue(obj).trim().length==Number(argument1);
            else if (validateAs==ValidateIsLengthGreaterThan) return GetValue(obj).trim().length>Number(argument1);
            else if (validateAs==ValidateIsLengthGreaterThanOrEqualTo) return GetValue(obj).trim().length>=Number(argument1);
            else if (validateAs==ValidateIsLengthLessThan) return GetValue(obj).trim().length<Number(argument1);
            else if (validateAs==ValidateIsLengthLessThanOrEqualTo) return GetValue(obj).trim().length<=Number(argument1);
            else if (validateAs==ValidateIsMoney) return IsMoney(GetValue(obj));
            else if (validateAs==ValidateIsNumber) return IsNumber(GetValue(obj),false,true);
            else if (validateAs==ValidateIsPositiveNumber) return IsNumber(GetValue(obj),false,false);
            else if (validateAs==ValidateIsNumberBetween) return IsNumberBetween(GetValue(obj),argument1,argument2);
            else if (validateAs==ValidateIsNumberGreaterThan) return IsNumberGreaterThan(GetValue(obj),argument1);
            else if (validateAs==ValidateIsNumberGreaterThanOrEqualTo) return IsNumberGreaterThanOrEqualTo(GetValue(obj),argument1);
            else if (validateAs==ValidateIsNumberLessThan) return IsNumberLessThan(GetValue(obj),argument1);
            else if (validateAs==ValidateIsNumberLessThanOrEqualTo) return IsNumberLessThanOrEqualTo(GetValue(obj),argument1);
            else if (validateAs==ValidateIsDate) return IsDate(GetValue(obj),argument1);
            else if (validateAs==ValidateIsDateBetween) return IsDateBetween(GetValue(obj),argument1,argument2,argument3);
            else if (validateAs==ValidateIsDateGreaterThan) return IsDateGreaterThan(GetValue(obj),argument1);
            else if (validateAs==ValidateIsDateGreaterThanOrEqualTo) return IsDateGreaterThanOrEqualTo(GetValue(obj),argument1);
            else if (validateAs==ValidateIsDateLessThan) return IsDateLessThan(GetValue(obj),argument1);
            else if (validateAs==ValidateIsDateLessThanOrEqualTo) return IsDateLessThanOrEqualTo(GetValue(obj),argument1);
            else if (validateAs==ValidateIsInArray) return IsInArray(GetValue(obj),argument1,false);
            else if (validateAs==ValidateIsNotInArray) return IsNotInArray(GetValue(obj),false);
            else if (validateAs==ValidateIsEqualTo) return IsEqualTo(GetValue(obj),argument1,false);
            else if (validateAs==ValidateIsEqualToIgnoreCase) return IsEqualTo(GetValue(obj),argument1,true);
            else if (validateAs==ValidateIsNotEqualTo) return !IsEqualTo(GetValue(obj),argument1,false);
            else if (validateAs==ValidateIsNotEqualToIgnoreCase) return !IsEqualTo(GetValue(obj),argument1,true);
            else if (validateAs==ValidateIsPostalCode) return IsPostalCode(GetValue(obj),argument1);
            else if (validateAs==ValidateIsEMailAddress) return IsEMailAddress(GetValue(obj));
            else if (validateAs==ValidateWebService) return IsValidFromWebService(GetValue(obj),argument1,argument2,argument3);
            else if (validateAs==ValidateIsEqualToField) return GetValue(obj)==GetIdValue(argument1);
            else if (validateAs==ValidateIsLengthEmptyGreaterThanOrEqualTo) return GetValue(obj).trim()==''||GetValue(obj).trim().length>=Number(argument1);
            else if (validateAs==ValidateIsNumericLength) return IsNumericLength(GetValue(obj).trim(),Number(argument1));
            else {
                if (obj.type=='select-one') {
                    if (validateAs==ValidateIsSelectionEqualTo) return IsEqualTo(GetValue(obj),argument1,true);
                    else if (validateAs==ValidateIsSelectionNotEqualTo) return IsNotEqualTo(GetValue(obj),argument1,true);
                    else if (validateAs==ValidateSelected) return obj.selectedIndex!=null&&obj.selectedIndex!=-1;
                } else return false;
            }
        } else if (obj.type=='select-multiple') {
            if (validateAs==ValidateSelected) return selected.length>0;
            else if (validateAs==ValidateSelectedAmountGreaterThan) return selected.length>Number(argument1);
            else if (validateAs==ValidateSelectedAmountGreaterThanOrEqualTo) return selected.length>=Number(argument1);
            else if (validateAs==ValidateSelectedAmountLessThan) return selected.length<Number(argument1);
            else if (validateAs==ValidateSelectedAmountLessThanOrEqualTo) return selected.length<=Number(argument1);  
            else if (validateAs==ValidateWebService) return IsValidFromWebService(GetValue(obj),argument1,argument2,argument3);
            else if (validateAs==ValidateIsEqualToField) return GetValue(obj)==GetIdValue(argument1);
        } else {
			if (validateAs==ValidateChecked) return IaRadioSelected(this.id,Number(argument1));
		}
    }
}

/// <summary>
/// Validate that the value of the string is empaty
/// </summary>
/// <param name="val">The Value to test</param>
function IsEmpty(val) {
    if (val==null) return true;
    if (val.toString().trim()=='') return true;
	return false;
}

function IsNumericLength(val,size) {
	if (val.length!=size) return false;
	else return !isNaN(val);
}

/// <summary>
/// Validate that the value can be converted to an int
/// </summary>
/// <param name="val">The Value to test</param>
/// <param name="allowNegative">Sets whether or not this is testing for a positive integer</param>
function IsInt(val,allowEmpty,allowNegative) {
	var allow = ((IsEmpty(allowEmpty))?false:allowEmpty);
	if (IsEmpty(val)) return allow;
	for (var i=0; i<val.length; i++) {
		if (val.charCodeAt(i)>57||val.charCodeAt(i)<48) {
		    if (!allowNegative) return false;
		    else {
		        if (val.charCode(i)!=45) return false;
		    }
		}
	}
	return true;
}

/// <summary>
/// Validate that the value can be represented as money
/// </summary>
/// <param name="val">The Value to test</param>
function IsMoney(val) {
	if (IsEmpty(val)) return false;
	var usedPeriod = false;
	var pastPeriod = 0;
	for (var i=0; i<val.length; i++) {
		if (pastPeriod>=2) return false;
		if (usedPeriod) pastPeriod++;
		if (val.charCodeAt(i)==46) {
			if (usedPeriod) return false;
			else usedPeriod = true;
		} else {
			if (val.charCodeAt(i)>57||val.charCodeAt(i)<48) return false;
		}
	}
	return true;	
}

function IsNumber(val,allowEmpty,allowNegative) {
	var allow = ((IsEmpty(allowEmpty))?false:allowEmpty);
	if (IsEmpty(val)) return allow;
	var usedPeriod = false;
	for (var i=0; i<val.length; i++) {
		if (val.charCodeAt(i)==46) {
			if (usedPeriod) return false;
			else usedPeriod = true;
		} else {
			if (val.charCodeAt(i)>57||val.charCodeAt(i)<48) {
		        if (!allowNegative) return false;
		        else {
		            if (val.charCode(i)!=45) return false;
		        }			
			}
		}
	}
	return true;	
}

function IsNumberLessThan(val,num) {
    if (!IsNumber(num)) return false;
    return IsNumberBetween(val,null,Number(num)-1);
}

function IsNumberLessThanOrEqualTo(val,num) {
    return IsNumberBetween(val,null,num);
}

function IsNumberGreaterThan(val,num) {
    if (!IsNumber(num)) return false;
    return IsNumberBetween(val,Number(num)+1);
}

function IsNumberGreaterThanOrEqualTo(val,num) {
    return IsNumberBetween(val,num);
}

function IsNumberBetween(val,start,end) {
    if (!IsNumber(val)) return false;
    if (IsNumber(start)&&IsNumber(end)) return (Number(val)>=Number(start)&&Number(val)<=Number(end));
    else if (IsNumber(start)&&!IsNumber(end)) return (Number(val)>=Number(start));
    else if (!IsNumber(start)&&IsNumber(end)) return (Number(val)<=Number(end));
    else return true;
}

function GetDaysInFebruary(year) {
    return (((year%4==0)&&((!(year%100==0))||(year%400==0)))?29:28);
}

function GetDaysInMonth(month,year) {
    var days = 31;
    if (month==4||i==6||i==9||i==11) return 30;
    if (month==2) return GetDaysInFebruary(year);
}

function IsDate(theDate,seperator){
    var seperationChar = '/';
    if (!IsEmpty(seperator)) seperationChar = seperator;
    var items = theDate.split(seperationChar);
    if (items.length!=3) return false;
    if (!IsInt(items[0])||!IsInt(items[1])||!IsInt(items[2])) return false;
    if (!IsNumberBetween(items[0],'1','12')) return false;
    if (!IsNumberBetween(items[1],'1',GetDaysInMonth(items[1],items[2]))) return false;
    return true
}

function IsDateGreaterThan(theDate,checkDate,seperator) {
    if (IsDate(checkDate)) IsDateBetween(theDate,Date.parse(checkDate)+1,null,seperator);
    else return false;
}

function IsDateGreaterThanOrEqualTo(theDate,checkDate,seperator) {
    return IsDateBetween(theDate,checkDate,null,seperator);;
}

function IsDateLessThan(theDate,checkDate,seperator) {
    if (IsDate(checkDate)) IsDateBetween(theDate,null,Date.parse(checkDate)-1,seperator);
    else return false;
}

function IsDateLessThanOrEqualTo(theDate,checkDate,seperator) {
    if (IsDate(checkDate)) IsDateBetween(theDate,null,checkDate,seperator);
    else return false;
}

function IsDateBetween(theDate,startDate,endDate,seperator) {
    if (!IsDate(theDate,seperator)) return false;
        var toCheck = Date.parse(theDate);
    if (IsDate(startDate,seperator)&&IsDate(endDate,seperator)) {
        var start = Date.parse(startDate);
        var end = Date.parse(endDate);
        return (toCheck>=start&&toCheck<=end);
    } else if (IsDate(startDate,seperator)&&!IsDate(endDate,seperator)) {
        var start = Date.parse(startDate);
        return (toCheck>=start);
    } else if (!IsDate(startDate,seperator)&&IsDate(endDate,seperator)) {
        var end = Date.parse(endDate);
        return (toCheck<=end);
    } else return false;
}

function IsInArray(val,array,allowEmpty) {
	var allow = ((IsEmpty(allowEmpty))?false:allowEmpty);
	if (IsEmpty(val)) return allow;
	for (var i=0; i<array.length; i++) {
		if (val==array[i]) return true;
	}
	return false;
}

function IsNotInArray(val,array,allowEmpty) {
	var allow = ((IsEmpty(allowEmpty))?false:allowEmpty);
	if (IsEmpty(val)) return allow;
	for (var i=0; i<array.length; i++) {
		if (val==array[i]) return false;
	}
	return true;
}

function IsEqualTo(val, toCheck, ignoreCase) {
    if (IsEmpty(val)) return IsEmpty(toCheck);
    if (ignoreCase) return val.trim().toLowerCase()==toCheck.trim().toLowerCase();
    else return val.trim()==toCheck.trim();
}

function IsNotEqualTo(val, toCheck, ignoreCase) {
    if (IsEmpty(val)) return !IsEmpty(toCheck);
    if (ignoreCase) return val.trim().toLowerCase()!=toCheck.trim().toLowerCase();
    else return val.trim()!=toCheck.trim();
}

function IsPostalCode(val,countryId) {
    var allowEmpty = true;
    if (countryId!=null) {
        var country = GetIdValue(countryId);
        if (country=='US'||country=='CA') allowEmpty = false;
    } else allowEmpty = false;
    if (!allowEmpty) {
        if (IsEmpty(val)) return false;
        if (val.length!=5&&val.length!=10) return false;
        if (val.length==10&&val.indexOf('-')!=5) return false;
        var foundBar = false;
        for (var i=0; i<val.length; i++) {
            if (isNaN(val.charAt(i))) {
                if (val.charAt(i)=='-') {
                    if (foundBar) return false;
                    else foundBar = true;
                }
            }
        }
        return true;
    } else return true;
}

function IsEMailAddress(val) {
    var foundAt = false;
    var foundDot = false;
    var index = 0;
    for (var i=0; i<val.length; i++) {
        if (val.charAt(i)=='@'&&index>0) {
            if (!foundAt) {
                foundAt = true;
                index == 0;
            } else return false;
        } else if (val.charAt(i)=='.'&&index>0) {
            if (!foundDot) {
                foundDot = true;
                index==0;
            } else index++;
        } else index++;
    }
    return foundAt&&foundDot&&index>1;
}

function IsValidFromWebService(val,url,method,definitions) {
	var names = new Array();
	var values = new Array();
	var items = definitions.split('|');
	for (var i=0; i<items.length; i++) {
		var current = items[i].split('=');
		if (current.length==2) {
			names[names.length] = current[0];
			var theValue = current[1];
			if (theValue=='[VALUE]') theValue = val;
			else if (theValue.startsWith('[')&&theValue.endsWith(']')) {
				var idValue = GetIdValue(theValue.substr(1,theValue.length-2));
				theValue = idValue
			}
			values[values.length] = theValue;
		}
	}
    return ExecuteBoolean(url,method,names,values);
}

function IaRadioSelected(id,count) {
	for (var i=0; i<count; i++) {
		if (document.getElementById(id+'_'+i).checked) return true;	
	}
	return false;
}