// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// @license: Mad4Media Javascipt License - copyright Mad4Media - Fahrettin Kutyol - All rights reserved    ++
// (re-) publishing or forking for any purpose of commercial or non-commercial use is not allowed.		   ++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

function comparisonDummy(){}; 

comparisonDummy.prototype = {
	equals: function(){return this},
	lower: function(){return this},
	lowerOrEqual: function(){return this},
	higher: function(){return this},
	higherOrEqual: function(){return this},
	errorTextIfNot: function(){return this}
};


function MCompare(element){
	this.element = element;
	this.name = "compare";
}

MCompare.prototype = {
		equals : function(el){
			this.element2 = el;
			this.action = "==";
			return this;
		},

		lower : function(el){
			this.element2 = el;
			this.action = "<";
			return this;
		},

		lowerOrEqual : function(el){
			this.element2 = el;
			this.action = "<=";
			return this;
		},

		higher : function(el){
			this.element2 = el;
			this.action = ">";
			return this;
		},

		higherOrEqual : function(el){
			this.element2 = el;
			this.action = ">=";
			return this;
		},

		errorTextIfNot : function(text){
			this.onError = text;
			return this;
		},
	
		lowerThan: function(el){return this.lower(el);},
		higherThan: function(el){return this.higher(el);},
		
		deleteHandle : function(){
	
			var w1 = (this.node1.formType != "checkbox") ? this.node1 : this.node1.parentNode;
			var w2 = (this.node2.formType != "checkbox") ? this.node2 : this.node2.parentNode;
			
			if(this.node1.validationError){
				this.node1.bubbleInfo = this.node1.bubbleInfo.replace("<br>"+this.onError,"").replace(this.onError,"");
			}else{
				m4jKillBubbleHandle(w1, this.node1);
			}
			
			if(this.node2.validationError){
				this.node2.bubbleInfo = this.node2.bubbleInfo.replace("<br>"+this.onError,"").replace(this.onError,"");
			}else{
				m4jKillBubbleHandle(w2, this.node2);
			}
			
			dojo.disconnect(this.node1.compareOnChangeHandle);
			this.node1.compareOnChangeHandle = undefined;
			dojo.disconnect(this.node2.compareOnChangeHandle);
			this.node2.compareOnChangeHandle = undefined;
		},

		checkCondition : function(){
				var isError = 0;
				var el1 = _byName("m4j-"+this.element);
				var el2 = _byName("m4j-"+this.element2);
				if( el1 == undefined ||  el2 == undefined  ) return 0 ;
				this.node1 = el1;
				this.node2 = el2;		
				
				switch (this.action) {
				case "==":
					if (!(el1.value == el2.value ) ) isError = 1;
					break;
					
				case "<":
					if (!(el1.value < el2.value ) ) isError = 1;
					break;
					
				case ">":
					if (!(el1.value > el2.value ) ) isError = 1;
					break;
		
				case "<=":
					if (!(el1.value <= el2.value ) ) isError = 1;
					break;
					
				case ">=":
					if (!(el1.value >= el2.value ) ) isError = 1;
					break;
					
				default:
					return 0;
					break;
				}
		
				if(el1.compare == undefined) el1.compare = this;
				if(el2.compare == undefined) el2.compare = this;
		
				if(! el1.compareOnChangeHandle){
					el1.compareOnChangeHandle = dojo.connect(el1,"onchange", compareOnChange);
				}
				
				if(! el2.compareOnChangeHandle){
					el2.compareOnChangeHandle = dojo.connect(el2,"onchange", compareOnChange);
				}
				
				if(isError){
					var w1 = (el1.formType != "checkbox") ? el1 : el1.parentNode;
					var w2 = (el2.formType != "checkbox") ? el2 : el2.parentNode;
					
					if(! w1.errorOverHandle && m4jShowTooltip){
						el1.errorOverHandle = dojo.connect(el1,"onmouseover", showErrorTooltip);
						el1.errorOutHandle = dojo.connect(el1,"onmouseout", hideErrorTooltip);
						el1.bubbleInfo = this.onError;
						m4jHighliteError(w1, el1);
					}else{
						if(el1.bubbleInfo.indexOf(this.onError) == -1){
							el1.bubbleInfo += "<br>"+this.onError;
						}
					}
					
					if(! w2.errorOverHandle && m4jShowTooltip){
						el2.errorOverHandle = dojo.connect(el2,"onmouseover", showErrorTooltip);
						el2.errorOutHandle = dojo.connect(el2,"onmouseout", hideErrorTooltip);
						el2.bubbleInfo = this.onError;
						m4jHighliteError(w2, el2);
					}else{
						if(el2.bubbleInfo.indexOf(this.onError) == -1){
							el2.bubbleInfo += "<br>"+this.onError;
						}
					}
				}//EOF isError
				
				return isError;
		}
}//EOF extending MCompare

function compareOnChange(e){
	if(this.compare == undefined) return true;
	var isError =  this.compare.checkCondition();
	if(!isError){
		this.compare.deleteHandle();
	}
	return true;
}

function m4jHighliteError(node,el){
	switch(node.formType){
		case "select":
			if(_Browser.IE && _Browser.IEVersion() < 8){
				el.parentNode.style.border = "1px solid " + errorColor;
			}else{
				el.style.borderColor = errorColor;
			}
		break;
	
		case "checkbox":
			el.style.border = "1px solid " + errorColor;
		break;
		
		default:
			el.style.borderColor = errorColor;
		break;
	}
}

function m4jKillBubbleHandle(node,el){
	switch(node.formType){
		case "select":
			if(_Browser.IE && _Browser.IEVersion() < 8){
				el.parentNode.style.border = "";
			}else{
				el.style.borderColor = "";
			}
		break;
		
		case "checkbox":
			el.style.border = "";
			bubbleWrap.style.left = "-9999em";
		break;
		
		default:
			el.style.borderColor = "";
		break;
	}
	
	el.validationError = 0; 
	dojo.disconnect(el.errorOverHandle);
	dojo.disconnect(el.errorOutHandle);
	el.errorOverHandle = undefined;
	el.errorOutHandle = undefined;
}


var m4jAllowSubmission = false;
var m4jCancelSubmit = false;

function validateField(node){
	var error = false;
	var rError = false;
	var validateType = node.validateType;
	var errorText = "";

	var el = (node.formType != "checkbox") ? node : node.parentNode;
	
	el.bubbleInfo = "";
	
	
	
	// Check Required
	if(validateType >999){
		validateType -= 1000;
		
		switch(node.formType){
			case "select":
			case "textarea":
			case "field":
				if(node.value == ""){
					rError = true;
					el.bubbleInfo = MText.required+"<br/>";
				}else{

					el.bubbleInfo = el.bubbleInfo.replace(MText.required+"<br/>","");
				}
			break;
			
			case "checkbox":
				if(node.checked == ""){
					rError = true;
					el.bubbleInfo = MText.required+"<br/>";
				}else{
					el.bubbleInfo = el.bubbleInfo.replace(MText.required+"<br/>","");
				}
			break;	
		}
	}
	
	switch (validateType) {
	case 1:
//		if(checkRegEx(node.value, "[^A-Za-z\\s]") || rError){
		if(checkRegEx(node.value, "[^\\D\\s]") || rError){
			error = true;
			el.bubbleInfo += MText.alphabetic;
		}
		errorText = MText.alphabetic;
		break;

	case 2:
		if(checkRegEx(node.value, "[^0-9\.]") || rError){
			error = true;
			el.bubbleInfo += MText.numeric;
		}
		errorText = MText.numeric;
		break;	

	case 3:
		if(checkRegEx(node.value, "[^0-9]") || rError){
			error = true;
			el.bubbleInfo += MText.integer;
		}
		errorText = MText.integer;
		break;	

	case 4:
		var filter = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,6})$/;		
		if(!filter.test(node.value) && node.value.length != 0 || rError){
			error = true;
			el.bubbleInfo += MText.email;
		}
		errorText = MText.email;
		break;	

	case 5:
		var filter = /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$/;		
		if(!filter.test(node.value) && node.value.length != 0 || rError){
			error = true;
			el.bubbleInfo += MText.url;
		}
		errorText = MText.url;
		break;	
		
	case 6:
		if(checkRegEx(node.value, "[^A-Za-z0-9\\s]") || rError){
			error = true;
			el.bubbleInfo += MText.alphanumeric;
		}
		errorText = MText.alphanumeric;
		break;				
	default:
		break;
	}
	
	
	if(error || rError){
		globalError = true;
		
		m4jHighliteError(node,el);
		el.validationError = 1; 
		if(! node.errorOverHandle && m4jShowTooltip){
			el.errorOverHandle = dojo.connect(el,"onmouseover", showErrorTooltip);
			el.errorOutHandle = dojo.connect(el,"onmouseout", hideErrorTooltip);
			
		}
	}else{
		if(el.errorOverHandle){
			
			if(el.compare){
				el.bubbleInfo = el.bubbleInfo.replace(errorText+"<br>", "").replace(errorText, "");
			}else{
				m4jKillBubbleHandle(node, el);
			}
			
/*			dojo.disconnect(el.errorChangeHandle);
		el.errorChangeHandle = null; */
			el.validationError = 0; 
		}
	}
	
}

function checkRegEx(value,regex){
	 var pos = value.search(regex); 
	 if(pos != -1 ) return true;
	 else return false;
}

var m4jValidationFunctions = new Array();

function addValidationFunction(functionName){
	m4jValidationFunctions.push(functionName);
}


var globalError = false;
var m4jForm = dojo.byId("m4jForm");
m4jForm.onsubmit = function(){
	
	if(m4jCancelSubmit) return false;
	
	if(m4jAllowSubmission){
		return true;
	}
		
	globalError = false;
	var items = new Array();
	var inputs = m4jForm.getElementsByTagName("INPUT");
	var textAreas = m4jForm.getElementsByTagName("TEXTAREA");
	
	for(t=0; t < inputs.length; t++){
		var alt = Number(inputs[t].alt);
		if(alt > 0) {
			if(inputs[t].type == "checkbox"){
				inputs[t].formType = "checkbox";	
			}else {
				inputs[t].formType = "field";
			}
			inputs[t].validateType = alt;
			items.push(inputs[t]);
			inputs[t].errorChangeHandle = dojo.connect(inputs[t],"onchange", function(){
				validateField(this);
			});
		}
	}
	for(t=0; t < textAreas.length; t++){
		var lang = Number(textAreas[t].lang);
		if(lang > 0) {
			textAreas[t].formType = "textarea";
			textAreas[t].validateType = lang;
			items.push(textAreas[t]);
			textAreas[t].errorChangeHandle = dojo.connect(textAreas[t],"onchange", function(){
				validateField(this);
			});
		}
	}
	
	for(t=0; t < items.length; t++){
		validateField(items[t]);
	}
	
	// Non field / area required queries
	var selects = m4jForm.getElementsByTagName("SELECT");
	for(t=0; t < selects.length; t++){
		var lang = Number(selects[t].lang);
		if(lang > 0) {
			selects[t].formType = "select";
			selects[t].validateType = lang;
			items.push(selects[t]);
			selects[t].errorChangeHandle = dojo.connect(selects[t],"onchange", function(){
				bubbleWrap.style.left = "-9999em";
				validateField(this);
			});
			validateField(selects[t]);
		}
	}
	
	var radioWrap = dojo.query("div.m4jRadioWrap, div.m4jCheckboxWrap");
	radioWrap.forEach(function(wrap){
		m4jEvalWrap(wrap);			
	});
	
	//Check Comparison
	var compare = proforms.comparisonArray;
	dojo.forEach(compare,dojo.hitch(this,function(com){
		if( com.checkCondition() ) globalError = true;		
	}));
	
	//Custom Validation CallBacks
	var funcsSize = m4jValidationFunctions.length;
	for(var t= 0; t< funcsSize; t++){
		var funcName = (typeof m4jValidationFunctions[t] === "string") ? m4jValidationFunctions[t] : null;
		
		if(funcName && ( dojo.isFunction(window[funcName]) || dojo.isObject(window[funcName]) ) ){
			
			var isError = window[funcName]();
			if(isError){
				globalError = true;
			}
		}	
	};
	
	
	// Cancel if error
	if(globalError) {
		alert(MText.errorPrompt);
		return false;
	}else {
		return true;
	}
}

function m4jChecker(wrap){
	var checked = false;
	var radioButtons = wrap.getElementsByTagName("INPUT");
	for(t=0; t < radioButtons.length; t++){
		if(!radioButtons[t].wrap){
			radioButtons[t].wrap = wrap;
			radioButtons[t].errorChangeHandle = dojo.connect(radioButtons[t],"onclick", function(){
				m4jEvalWrap(this.wrap);
			});
		}
		if(radioButtons[t].checked != ""){
			checked = true;
		}
	}
	return checked;	
}


function m4jEvalWrap(wrap){
	var lang = Number(wrap.lang);
	if(lang > 999 ){
		var check = m4jChecker(wrap);
		if(! check){
			wrap.style.border = "1px solid " + errorColor ;
			wrap.bubbleInfo = MText.required+"<br/>";
			if(! wrap.errorOverHandle){
				wrap.errorOverHandle = dojo.connect(wrap,"onmouseover", showErrorTooltip);
				wrap.errorOutHandle = dojo.connect(wrap,"onmouseout", hideErrorTooltip);
				globalError = true;
			}
		}else{
			wrap.style.border = "";
			wrap.bubbleInfo = "";
			if(wrap.errorOverHandle){
				dojo.disconnect(wrap.errorOverHandle);
				dojo.disconnect(wrap.errorOutHandle);
				wrap.errorOverHandle = undefined;
				wrap.errorOutHandle = undefined;
				bubbleWrap.style.left = "-9999em";
			}
		}
	}
	
}



var showErrorTooltip = function(e){
	var bW = bubbleWrap;
	dojo.byId("bubble_tooltip_content").innerHTML = this.bubbleInfo;
	
	var myBounds = _ViewportOffset(this,true);
	var docScroll = _docScroll(this);
	myBounds.t += docScroll.top;
	myBounds.l += docScroll.left;
	var bwDim = _Dimensions(bW);
	var top = myBounds.t - bwDim.height +5; 
	var left = (myBounds.l+myBounds.w)-140;
	
	bW.style.top = top + "px";
	bW.style.left = left + "px";
}

var hideErrorTooltip = function(e){
	bubbleWrap.style.left = "-9999em";
}

function m4jEvalReset(){
	var forms = dojo.query("input,select,textarea",m4jForm);
	forms.forEach(function(node){
		if(node.errorOverHandle){
			dojo.disconnect(node.errorOverHandle);
			dojo.disconnect(node.errorOutHandle);
			node.errorOverHandle = undefined;
			node.errorOutHandle = undefined;
			bubbleWrap.style.left = "-9999em";
			switch(node.formType){
				case "select":
					if(_Browser.IE && _Browser.IEVersion() < 8){
						node.parentNode.style.border = "";
					}else{
						node.style.borderColor = "green";
					}
				break;
				
				case "checkbox":
					node.style.border = "";
					bubbleWrap.style.left = "-9999em";
				break;
				
				default:
					node.style.borderColor = "";
				break;
			}
			
			node.bubbleInfo = "";
		}
		if(node.wrap){
			if(node.formType == "select" && (_Browser.IE && _Browser.IEVersion() >= 8) ) return;
			node.wrap.style.border = "";
			if(node.wrap.errorOverHandle){
				dojo.disconnect(node.wrap.errorOverHandle);
				dojo.disconnect(node.wrap.errorOutHandle);
				node.wrap.errorOverHandle = undefined;
				node.wrap.errorOutHandle = undefined;
			}
		}
	});
}


dojo.addOnLoad(function(){
	dojo.connect(dojo.byId("m4jResetButton"),"onclick",m4jEvalReset);
});





