﻿var oMyAlertOptions = new Object();
var fSetAlertOptions = function(oOptions){
	oMyAlertOptions.iAlertWidth = (oOptions && oOptions.width) ||  200;
	oMyAlertOptions.bAlertAll = (oOptions && oOptions.displayAll) ||  false;
	oMyAlertOptions.bAlertOnBlur = (oOptions && oOptions.bAlertOnBlur) || false;
	oMyAlertOptions.iAlertAutoHide = (oOptions && oOptions.iAlertAutoHide) || false;
	oMyAlertOptions.fOnBeginValid = (oOptions && oOptions.fOnBeginValid) || null;
	oMyAlertOptions.fOnValidShow = (oOptions && oOptions.fOnValidShow) || null;
	oMyAlertOptions.fOnErrorShow = (oOptions && oOptions.fOnErrorShow) || null;
	oMyAlertOptions.fOnErrorHide = (oOptions && oOptions.fOnErrorHide) || null;
	oMyAlertOptions.fOnSubmitForm = (oOptions && oOptions.fOnSubmitForm) || null;
}
fSetAlertOptions();
var fValiderAlert = new Class({
	initialize: function(sXmlName, sSubmitButtonId, oOptions){
		var oThis = this;
		var oSubmitButton = $(sSubmitButtonId);
		if (!oSubmitButton) {
			return false;
		}
		//
		this.id = sSubmitButtonId+"AlertBox";
		this.form = $(oSubmitButton.form);
		this.oSubmitButton = oSubmitButton;
	
		this.iAlertWidth = (oOptions && oOptions.width) || oMyAlertOptions.iAlertWidth;
		this.bAlertAll = (oOptions && oOptions.displayAll) || oMyAlertOptions.bAlertAll;
		this.bAlertOnBlur = (oOptions && oOptions.bAlertOnBlur) || oMyAlertOptions.bAlertOnBlur;
		this.iAlertAutoHide = (oOptions && oOptions.iAlertAutoHide) || oMyAlertOptions.iAlertAutoHide;
		this.fOnBeginValid = (oOptions && oOptions.fOnBeginValid) || oMyAlertOptions.fOnBeginValid;
		this.fOnValidShow = (oOptions && oOptions.fOnValidShow) || oMyAlertOptions.fOnValidShow;
		this.fOnErrorShow = (oOptions && oOptions.fOnErrorShow) || oMyAlertOptions.fOnErrorShow;
		this.fOnErrorHide = (oOptions && oOptions.fOnErrorHide) || oMyAlertOptions.fOnErrorHide;
		this.fOnSubmitForm = (oOptions && oOptions.fOnSubmitForm) || oMyAlertOptions.fOnSubmitForm;
		
		this.oInputError = null;
		this.oFirstInputError = null;
		this.iWaitTimeout = null;
		new fLoadXML(sXmlName, function(xml, oXMLObject){
			oThis.oAlertXML = oXMLObject["form"][0].field;
			oThis.fInitForm();
		});
	},

	fInitForm: function() {
		var oThis = this;
		// Create alert box HTML elements
		var oBackgDiv = new Element("div").setProperties({id: oThis.id}).addClass("alertClassBox").setStyle("width", oThis.iAlertWidth+"px").injectInside($$("body")[0]);
		var oCloseImg = new Element("a").setProperties({
			id: oThis.id+"Close", 
			href: "javascript:void(0);"
		}).addClass("closeImage").injectInside(oBackgDiv);
		oCloseImg.addEvent("click", function(){
			clearTimeout(oThis.iWaitTimeout);
			oThis.hide();
		});
		var oContDiv = new Element("p").setProperties({
			id: oThis.id+"Cont"
		}).injectInside(oBackgDiv);
		if (window.ie) {
			var oIframeDiv = new Element("iframe").setProperties({
				id: oThis.id+"Iframe"
			}).setStyles({
				width: oThis.alertStyle && oThis.alertStyle.width ? oThis.alertStyle.width : "120px",
				filter: "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)"
			}).addClass("alertClassIframe").injectInside($$("body")[0]);
		}
		//
		// Init Form Element with behaviours
		for (var iInc = 0; iInc < oThis.oAlertXML.length; iInc++) {
			var oInputCtrl = $(oThis.oAlertXML[iInc].name[0].data);
			if (oInputCtrl) {
				for (var iIncElem = 0; iIncElem < oThis.form.elements.length; iIncElem++) {
					var oThisInput = oThis.form.elements[iIncElem];
					if (oThisInput.name == oInputCtrl.name) {
						if (typeof(oThis.oAlertXML[iInc].popup) != "undefined" && oThis.oAlertXML[iInc].popup[0].data == "true") {
							oThisInput.popup = true;
						}
						// restrict input
						if (typeof(oThis.oAlertXML[iInc].restrict) != "undefined") {
							oThisInput.restrict = this.oAlertXML[iInc].restrict[0].data.replace("{number}","0-9").replace("number","[0-9]");
							oThisInput.addEvent("keypress", function(event){
								var eEvent = new Event(event);
								var iCode = eEvent.code;
								var bCode = ( iCode == null || iCode == 0 || iCode == 8 || iCode == 9 || iCode == 13 || iCode == 27 || iCode == 35|| iCode == 36 || iCode == 37 || iCode == 39 || iCode == 46);
								var sKey = eEvent.key;
								var oRegExp = new RegExp(this.restrict);
								if (!sKey.test(oRegExp) && !bCode) {
									eEvent.stop();
								}
							});
						}
						// has initialized value.
						if (typeof(oThis.oAlertXML[iInc].init) != "undefined") {
							oThisInput.init = oThis.oAlertXML[iInc].init[0].data.toString().trim();
							oThisInput.value = oThisInput.init;
							oThisInput.addEvent("focus", function(event){
								if (this.value.trim() == this.init){
									this.value = "";
								}
							});
							oThisInput.addEvent("blur", function(event){
								if (this.value.trim() == ""){
									this.value = this.init;
								}
							});
						}
						//
						oThisInput.addEvents({
							"keyup": function(){
								oThis.hide();
							},
							"click": function(){
								oThis.hide();
							},
							"blur" : function() {
								if (oThis.bAlertOnBlur == true) {
									setTimeout(function(){
										oThis.fValidForm();
									}, 50);
								}
							}
						});
					} // end if oInputCtrl.name
				} // end for
			} // end if oInputCtrl
		} // end for
		//
		oThis.oSubmitButton.onclick = function(event) {
			new Event(event).stop();
			//
			if (oThis.fOnBeginValid) {
				oThis.fOnBeginValid(oThis.form);
			}
			//
			if (oThis.fValidForm()) {
				if (oThis.fOnSubmitForm) {
					oThis.fOnSubmitForm(oThis.form);
				} else {
					//alert(oThis.form);
					oThis.form.submit();
				}
			}
		};
	},
	
	fShowAlert: function(sElementId, sWarning, bExt) {
		var oThis = this;
		var oInput = $(sElementId);
		// Callback function
		if (oThis.fOnErrorShow) {
			oThis.fOnErrorShow(oInput);
		}
		oThis.oInputError = oInput;
		//
		//
		if (oThis.bAlertAll && !bExt) {
			return;
		}
		$(oThis.id+"Cont").setHTML(sWarning);
		var iShowTop = oInput.popup ? window.getScrollTop()+(window.getHeight()-$(oThis.id).getCoordinates().height)/2 : $(sElementId).getPosition().y+$(sElementId).getCoordinates().height;
		var iShowLeft = oInput.popup ? (window.getWidth()-$(oThis.id).getCoordinates().width)/2 : $(sElementId).getPosition().x;
		//
		$(oThis.id).setStyles({
			top: iShowTop+"px",
			left: iShowLeft+"px"
		}).setOpacity(1);
		if (window.ie) {
			$(oThis.id+"Iframe").setStyles({
				visibility: "visible",
				top: iShowTop+"px",
				left: iShowLeft+"px",
				width: $(oThis.id).getCoordinates().width,
				height: $(oThis.id).getCoordinates().height
			})
		}
		//
		clearTimeout(oThis.iWaitTimeout);
		if (oThis.iAlertAutoHide != false) {
			oThis.iWaitTimeout = setTimeout(function() {
				oThis.hide();
			}, oThis.iAlertAutoHide);
		}
		//
		oInput.focus();
	},
	
	hide: function() {
		var oThis = this;
		if (oThis.oInputError == null) {
			return;
		}
		//
		if ($(oThis.id)) $(oThis.id).setStyles({visibility: "hidden"});
		if (window.ie) {
			$(oThis.id+"Iframe").setStyles({visibility: "hidden"});
		}
		// Callback function
		if (oThis.fOnErrorHide) {
			oThis.fOnErrorHide(oThis.oInputError);
		}
		//
		oThis.oInputError = null;
	},
	
	fValidForm: function() {
		var oThis = this;
		var aValidArray = new Array();
		for (var iInc = 0; iInc < oThis.oAlertXML.length; iInc++) {
			var oInputCtrl = $(oThis.oAlertXML[iInc].name[0].data);
			if (oInputCtrl) {
				for (var iIncElem = 0; iIncElem < oThis.form.elements.length; iIncElem++) {
					var oThisInput = oThis.form.elements[iIncElem];
					if (oThisInput.name == oInputCtrl.name) {
						aValidArray.push({
							control: oThisInput, 
							type: oThis.oAlertXML[iInc].type[0].data, 
							alert: oThis.oAlertXML[iInc].alert[0].data
						});
					}
				}
			}
		}
		//
		var bIsValid = true;
		for (iInc = 0; iInc < aValidArray.length; iInc++) {
			if (fnIsVisible(aValidArray[iInc].control) && !oThis.fCheckForm(aValidArray[iInc].control, aValidArray[iInc].type)) {
				if (bIsValid == true) {
					oThis.oFirstInputError = aValidArray[iInc].control;
				}
				oThis.fShowAlert(aValidArray[iInc].control, aValidArray[iInc].alert);
				bIsValid = false;
				iInc = aValidArray.length;
				return false;
			} else if (oThis.fOnValidShow) {
				oThis.fOnValidShow(aValidArray[iInc].control);
			}
		}
		return true;
		//
	},
	
	fCheckForm: function(sElementId, sCondition) {
		var oFormElement = $(sElementId);
		var form = oFormElement.form;
		if (typeof(oFormElement.init) != "undefined" && oFormElement.value.trim() == oFormElement.init && sCondition.indexOf("required") !== -1 && fnGetQuote(sCondition, "[", "]") == "") {
			return false;
		}
		var bCheckConditionsIndex= fnCheckConditionIndexOf({sCondition:sCondition, sElementId:sElementId})
		var bCheckConditions= fnCheckConditions({sCondition:sCondition, sElementId:sElementId})
		var bCheckBoth=bCheckConditionsIndex+bCheckConditions==1 ?  false :  true
		return bCheckBoth;
	}
});


var fnCheckConditions=function(oOptions){
	sCondition=(oOptions && oOptions.sCondition) || null;
	sElementId=oOptions.sElementId
	var oFormElement = $(sElementId);
	var form = oFormElement.form;
	switch(sCondition){
		case "check": 
			if (oFormElement.type == "checkbox") {
				return (oFormElement.checked);
			}
			if (oFormElement.type == "radio") {
				var sRadioGroup = form[oFormElement.name];
				if (sRadioGroup && !sRadioGroup.length) {
					return sRadioGroup.checked;
				}
				var bRadioChecked = false;
				$A(sRadioGroup).each(function(oRadioInput){
					if (oRadioInput.checked) {
						bRadioChecked = true;
					}
				});
				return bRadioChecked;
			}
			return true;
		break;
		case "image":
			return fnIsImage(oFormElement.value);
		break;
		case "[image]":
			if (fnIsBlank(oFormElement.value) || oFormElement.value == oFormElement.init) {
				return true;
			}
			return fnIsImage(oFormElement.value);
		break;
		case "phone": 
			return fnIsPhone(oFormElement.value);
		break;
		case "none": 
			return true;
		break;
		default:
			return true;
		break;
		
	}
}
var fnCheckConditionIndexOf=function(oOptions){
	//sIndexOfString = (oOptions && oOptions.sIndexOfString) || null;
	sCondition=(oOptions && oOptions.sCondition) || null;
	sElementId=oOptions.sElementId
	var oFormElement = $(sElementId);
	
	if (sCondition.indexOf("=") !== -1 && sCondition.indexOf(">") == -1 && sCondition.indexOf("<") == -1 && sCondition.indexOf("EVAL") == -1) {
		return (oFormElement.value == $(sCondition.replace("=","")).value);
	}
	if (sCondition.indexOf("required") !== -1) {
		if (fnGetQuote(sCondition, "[", "]") != "") {
			var aInputs = fnGetQuote(sCondition, "[", "]").split(",");
			var bIsEntered = false;
			aInputs.each(function(el){
				if (!fnIsBlank($(el).value) && $(el).value != $(el).init) {
					bIsEntered = true;
				}
			});
			return bIsEntered;
		} else {
			return (oFormElement.value.trim().length >= Math.max(Number(fnGetQuote(sCondition, "(", ")")), 1));
		}
	}
	if (sCondition.indexOf("future") !== -1) {
		var sConditionQuote = fnGetQuote(sCondition, "(", ")").toString();
		var aConditions = sConditionQuote.split(",");
		if (aConditions.length == 0) {
			return false;
		}
		var sCond0 = aConditions[0];
		var sCond1 = aConditions[1];
		var oCond1 = $(sCond1);
		var sCond2 = aConditions[2];
		if (sCond2 && sCond2 == "false" && fnIsBlank(oFormElement.value)) {
			return true;
		}
		if (!fnIsDate(sCond0, oFormElement.value) || (sCond1 && oCond1 && !fnIsDate(sCond0, oCond1.value))) {
			return false;
		}
		if (sCond1 && oCond1) {
			return (fnCompareDate(sCond0, oFormElement.value, oCond1.value) == -1);
		} else {
			return (fnCompareDate(sCond0, oFormElement.value) == -1);
		}
	}
	if (sCondition.indexOf("EVAL") !== -1) {
		return eval(fnGetQuote(sCondition, "[", "]"));
	}
	if (sCondition.indexOf("email") !== -1) {
		if (sCondition == "[email]" && (fnIsBlank(oFormElement.value) || oFormElement.value == oFormElement.init)) {
			return true;
		}
		var bIsEmailOK = true;
		var aEmailArray = oFormElement.value.split(";");
		$A(aEmailArray).each(function(sEmail){
			if (!fnIsEmail(sEmail.trim())) {
				bIsEmailOK =  false;
			}
		});
		return bIsEmailOK;
	}
	if (sCondition.indexOf("date") !== -1) {
		return fnIsDate(fnGetQuote(sCondition, "(", ")"), oFormElement.value);
	}
	if (sCondition.indexOf(">") !== -1) {
		if (sCondition.indexOf(">=") !== -1) {
			return (oFormElement.value >= $(sCondition.replace(">=","")).value);
		} else {
			return (oFormElement.value > $(sCondition.replace(">","")).value);
		}
	}
	if (sCondition.indexOf("<") !== -1) {
		if (sCondition.indexOf("<=") !== -1) {
			return (oFormElement.value <= $(sCondition.replace("<=","")).value);
		} else {
			return (oFormElement.value < $(sCondition.replace(">","")).value);
		}
	}
	if (sCondition.indexOf("max") !== -1 || sCondition.indexOf("min") !== -1) {
		var bMax=true, bMin=true;
		if(sCondition.indexOf("max") !== -1) bMax=Number(oFormElement.value) <= fnGetQuoteNumber(sCondition, "max");
		if(sCondition.indexOf("min") !== -1) bMin =Number(oFormElement.value) >= fnGetQuoteNumber(sCondition, "min");
		if(bMax==false || bMin==false) return false;
	}
	if (sCondition.indexOf("select") !== -1) {
		var refSelect = $(fnGetQuote(sCondition, "[", "]"));
		if (refSelect) {
			if (refSelect.selectedIndex != 0) {
				return (oFormElement.selectedIndex !== 0);
			} else {
				return true;
			}
		} else {
			return (oFormElement.selectedIndex !== 0);
		}
	}
	return true;
}
/////////Define all format checking functions
var fnGetQuote=function (sString, sStart, sEnd) {
	return sString.substring(sString.indexOf(sStart)+sStart.length, sString.indexOf(sEnd));
}
 var fnGetQuoteNumber=function (sString, sStart) {
	var oRegExp = new RegExp(sStart+":[0-9]+");
	var sStrResult=sString.match(oRegExp)
	var oRegExp = new RegExp("[0-9]+");
	var sStrResult2=sStrResult[0].match(oRegExp)
	return(Number(sStrResult2));
 }
//
var fnIsEmail=function (sString){
	var oRegExp = new RegExp("^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]{2,4}$");
	return (sString.search(oRegExp) != -1);
}
//
var fnIsImage=function (sString){
	var oRegExp = new RegExp("\\.(png|gif|bmp|jpg|jpeg|jpe)$", "i");
	return (sString.search(oRegExp) != -1);
}
//
var fnIsPhone=function (sString) {
	var oRegExp = new RegExp("^[ .0-9]{3,}$");
	return (sString.search(oRegExp) != -1);
}
//
var fnIsDate=function (format, sString) {
	var oRegExp = new RegExp("[.\/-]");
	var aSplitedString = sString.split(oRegExp);
	if (aSplitedString.length != 3) {
		return false;
	}
	var y = Number(p[format.indexOf("y")]);
	var m = Number(p[format.indexOf("m")]);
	var d = Number(p[format.indexOf("d")]);
	var oDate = new Date(y, m-1, d);
	return (y == oDate.getFullYear() && m == oDate.getMonth()+1 && d == oDate.getDate());
}
//
var fnCompareDate=function fnCompareDate(format, oDate1, oDate2){
	var oRegExp = new RegExp("[.\/-]");
	var aDate1 = oDate1.split(oRegExp);
	var y1 = Number(aDate1[format.indexOf("y")]);
	var m1 = Number(aDate1[format.indexOf("m")]);
	var iDate1 = Number(aDate1[format.indexOf("d")]);
	if (oDate2) {
		var aDate2 = oDate2.split(s);
		var y2 = Number(aDate2[format.indexOf("y")]);
		var m2 = Number(aDate2[format.indexOf("m")]);
		var iDate2 = Number(aDate2[format.indexOf("d")]);
	} else {
		var oDate2 = new Date();
		var y2 = oDate2.getFullYear();
		var m2 = oDate2.getMonth()+1;
		var iDate2 = oDate2.getDate();
	}
	//
	if (y2 > y1) {
		return 1;
	} else if (y2 < y1) {
		return -1;
	} else {
		if (m2 > m1) {
			return 1;
		} else if (m2 < m1) {
			return -1;
		} else {
			if (iDate2 > iDate1) {
				return 1;
			} else if (iDate2 < iDate1) {
				return -1;
			} else {
				return 0;
			}
		}
	}
}
//
var fnIsBlank=function fnIsBlank(sString) {
	return (sString.trim() == "");
}
//
var fnIsVisible = function(el){
	var oObject = $(el).getParent();
	while (oObject && oObject.getStyle) {
		if (oObject.getStyle("display") == "none" || oObject.getStyle("visibility") == "hidden") {
			return false;
		}
		oObject = oObject.getParent();
	}
	return true;
}
