/* Fix 'TextBoxWatermarkExtender breaks validation controls'
  ========================================================== */
function AjaxControlToolkit$TextBoxWatermarkBehavior$ValidatorValidate(val, validationGroup, event) {
	var w = null;
    if ((typeof(val.enabled) == "undefined" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) {
		var c = $get(val.controltovalidate);
		if ( c ) {
			w = AjaxControlToolkit.TextBoxWrapper.get_Wrapper(c);
		}
	}
	if ( w && w.get_IsWatermarked() ) {
		// Clear watermark
		w.set_Value("");
		w.set_IsWatermarked(false);
	}
	AjaxControlToolkit$TextBoxWatermarkBehavior$_originalValidatorValidate(val, validationGroup, event);
	if ( w && w.get_Value() == "" ) {
		// Restore watermark
		w.set_Value("");
	}
}

function AjaxControlToolkit$TextBoxWatermarkBehavior$HookValidate() {
	// Hook into the ASP.NET ValidatorValidate function to clear watermarks prior to validating
	if ((typeof(ValidatorValidate) == 'function') && typeof(AjaxControlToolkit$TextBoxWatermarkBehavior$_originalValidatorValidate) == 'undefined' ) {
		AjaxControlToolkit$TextBoxWatermarkBehavior$_originalValidatorValidate = ValidatorValidate;
		ValidatorValidate = AjaxControlToolkit$TextBoxWatermarkBehavior$ValidatorValidate;
	}
}
Sys.Application.add_load(AjaxControlToolkit$TextBoxWatermarkBehavior$HookValidate);

/* Show the Popup Validators on UpdatePanel EndRequest based on Server's status of it too
  ======================================================================================= */
/* To limit to a validation group, put this in page:
var current_validation_group = 'validationgroupname';
*/
// Though I could parse out btn.getAttribute('onclick') for the validation group, it seems simpler to require it of the page
//function AjaxControlToolkit$ValidatorCalloutBehavior$BeginRequestHandler(sender, args) {
//	var btn = args.get_postBackElement(); // the control causing the postback
//	current_validation_group = btn.value;
//}
function AjaxControlToolkit$ValidatorCalloutBehavior$EndRequestHandler(sender, args) {
	if (typeof(Page_Validators) == "undefined") {
		return; // Nothing to do here
	}
	var i;
	var val;
	var valBeh;
	for (i = 0; i < Page_Validators.length; i++) {
		val = Page_Validators[i];
		if (typeof(val.enabled) == "undefined" || val.enabled != false) {
			if ( typeof(current_validation_group) == "undefined" || IsValidationGroupMatch(val, current_validation_group)) {
				if ( typeof(val.ValidatorCalloutBehavior) != "undefined" ) {
					valBeh = val.ValidatorCalloutBehavior;
					if ( valBeh.get_isOpen() !== !val.isvalid ) {
						if ( val.isvalid ) {
							var hideDel = Function.createDelegate(valBeh, valBeh.hide);
							hideDel();
							hideDel = null;
						} else {
							var ensureDel = Function.createDelegate(valBeh, valBeh._ensureCallout);
							ensureDel();
							ensureDel = null;
							var showDel = Function.createDelegate(valBeh, valBeh.show);
							showDel(true);
							showDel = null;
							break; // ValidatorCallout can only show 1 at a time, so show the first one
						}
					}
				}
			}
		}
	}
	valBeh = null;
	val = null;
}
    
function AjaxControlToolkit$ValidatorCalloutBehavior$HookRequestHandlers() {
	var prm = Sys.WebForms.PageRequestManager.getInstance();
//	prm.add_beginRequest(AjaxControlToolkit$ValidatorCalloutBehavior$BeginRequestHandler);
	prm.add_endRequest(AjaxControlToolkit$ValidatorCalloutBehavior$EndRequestHandler);
}
Sys.Application.add_init(AjaxControlToolkit$ValidatorCalloutBehavior$HookRequestHandlers);


/* Common validation scenarios
  ======================================================================================= */

function RequiredZip(sender, args) {
	if ( args.Value ) {
		ValidZip(sender, args);
	} else {
		args.IsValid = false; // Required
	}
}
function RequiredPhone(sender, args) {
	if ( args.Value ) {
		ValidPhone(sender, args);
	} else {
		args.IsValid = false; // Required
	}
}
function ValidZip(sender, args) {
	if ( args.Value ) {
		var remo = /[^0-9]/gi;
		var s = args.Value.replace(remo, '');
		var reva = /^\d{5}(\d{4})?$/;
		args.IsValid = (reva.test(s));
		if ( s.length > 5 ) {
			s = s.slice(0,5)+'-'+s.slice(5);
		}
		$get(sender.controltovalidate).value = s;
	} else {
		args.IsValid = true; // Not required
	}
}
function ValidPhone(sender, args) {
	if ( args.Value ) {
		var remo = /[^0-9]/gi;
		var s = args.Value.replace(remo, '');
		if ( s[0] == '0' || s[0] == '1' ) {
			s = s.slice(1);
		}
		var reva = /^\d{10}$/;
		args.IsValid = (reva.test(s));
		if ( s.length > 3 ) {
			s = s.slice(0,3)+'-'+s.slice(3);
		}
		if ( s.length > 7 ) {
			s = s.slice(0,7)+'-'+s.slice(7);
		}
		$get(sender.controltovalidate).value = s;
	} else {
		args.IsValid = true; // Not required
	}
}

function RequiredDate(sender, args) {
	if ( args.Value ) {

		// RegExp the date
		var pattern = /[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,4}/;
		var dateParts = args.Value.split('/');
		if ( dateParts.length != 3 || !pattern.test(args.Value) ) {
			args.IsValid = false;
			return;
		}

		// Split it into pieces, build a Date object, and compare
		try {
			var now = new Date();
			var year = parseInt(dateParts[2]);
			if ( year < 1 ) {
				year = Date().getFullYear();
			} else if ( year < now.getFullYear()-2000 ) {
				year += 2000;
			} else if ( year < 100 ) {
				year += 1900;
			}
			var month = parseInt(dateParts[0]);
			var day = parseInt(dateParts[1]);

			if ( year == 0 || month == 0 || day == 0 ) {
				args.IsValid = false;
				return;
			}
			if ( year > 2100 || month > 12 || day > 31 ) {
				args.IsValid = false;
				return;
			}

			var dt = new Date(year,month-1,day); // No idea why it wants month-1
			if ( isNaN(dt) ) {
				args.IsValid = false;
				return;
			}

			if ( (day!=dt.getDate()) || (month!=(dt.getMonth()+1)) || (year!=dt.getFullYear()) ) {
				args.IsValid = false;
				return;
			}

			args.IsValid = true;

		} catch (Err) {
			args.IsValid = false; // Not a valid date if it blows chunks
		}

	} else {
		args.IsValid = false; // Required
	}
}
function ValidDate(sender, args) {
	if ( args.Value ) {
		return RequiredDate(sender, args);
	} else {
		args.IsValid = true; // Not required
	}
}

// FRAGILE: Assumes "select" item's value is "NotSet"
function RequiredTransactionType(sender, args) {
	args.IsValid = ( args.Value && args.Value != 'NotSet' );
}

function PosativeIntSelected(sender, args) {
	args.IsValid = ( args.Value && args.Value > 0 );
}

if (typeof (Sys) != 'undefined') {
	Sys.Application.notifyScriptLoaded();
}