var checks = new Array();
var rules = new Array();
var _version = 1;

/**
 * Validate the input of a user if it is a valid email address
 * @param src HTMLInputElement
 * @return Boolean
 */
function validateEmail ( src ) {
	var emailreg = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,5}$/;
	return emailreg.test(src.value);
}

function validateZendMail ( src ) {
	return validateEmail ( src );
}

/**
 * Validate a Dutch zipcode
 * 
 * @param src HTMLInputElement
 * @return Boolean
 */
function validateZipcode ( src ) {
	var emailreg = /^[0-9]{4}\s*[a-zA-Z]{2}$/;
	return emailreg.test(src.value);
}

/**
 * Validate if a radiobutton group has a checked version
 * 
 * @param src HTMLInputElement
 * @return Boolean
 */
function validateRadio ( src ) {
	var radios = collectRadios ( src.form );
	for(var name in radios) {
		if ( name = src.name ) {
			for ( var i = 0 ; i < radios[name].length ; i++ ) {
		  		if(radios[name][i].checked) {
		  			return true;
		  		}
		  	}
  		}
	}
	return false;
}


/**
 * Validate a date input with the value dd-mm-yyyy
 * 
 * @param src HTMLInputElement
 * @return Boolean
 */
function validateDate ( src ) {
	// dd-mm-yyyy
	var datereg = /^[0-3]{1}\d{1}-[0-1]\d{1}-\d{4}$/;
	return datereg.test(src.value);
}

/**
 * Validate a string, does it has more characters than 1
 * 
 * @param src HTMLInputElement
 * @return Boolean
 */
function validateString ( src ) {
	if ( src.type == "radio") {
		return validateRadio( src );
	}else{
		return ( src.value.length > 0 );
	}
}

/**
 * Validate a phonenumber (Dutch)
 * 
 * @param src HTMLInputElement
 * @return Boolean
 */
function validatePhone ( src ) {
	var phonereg = /^([0]{1}[6]{1}[-\s]*[1-9]{1}[\s]*([0-9]{1}[\s]*){7})|([0]{1}[1-9]{1}[0-9]{1}[0-9]{1}[-\s]*[1-9]{1}[\s]*([0-9]{1}[\s]*){5})|([0]{1}[1-9]{1}[0-9]{1}[-\s]*[1-9]{1}[\s]*([0-9]{1}[\s]*){6})$/;
	return phonereg.test(src.value);
}

/**
 * Validate if a password has a certain length
 * 
 * @param src HTMLInputElement
 * @return Boolean
 */
function validatePasswdLength ( src ) {
	return ( src.value.length > 5 );
}

/**
 * Validate a number
 * 
 * @param src HTMLInputElement
 * @return Boolean
 */
function validateNumber ( src ) {
	if ( validateString ( src ) ) {
		return !isNaN(src.value);
	}else{
		return false;
	}
}

/**
 * Validate a checkbox
 * 
 * @param src HTMLInputElement
 * @return Boolean
 */
function validateCheckbox (src) {
	return src.checked;
}

/**
 * Call a method with obj as argument
 * 
 * @param method Function
 * @param obj HTMLInputElement
 * @return Boolean
 */
function checkValidation(method,obj) {
	if ( typeof(method) == 'function') {
		return method.apply(this,[obj]);
	}else{
		alert("Method: "+method+" not found");
	}
}

/**
 * 
 * @param obj HTMLInputElement
 * @param result Boolean
 * @param error String
 */
function handleVisualError(obj , result , error ) {
	if ( result ) {
		error = '';
		document.getElementById('e'+obj.name).style.display = 'none'
		obj.className = obj.className.split(' ')[0];
		obj.validated = '1';
	}else{
		document.getElementById('e'+obj.name).style.display = ''
		obj.className = obj.className+' error';
		obj.validated = '0';
	}
	document.getElementById('e'+obj.name).innerHTML = error;
}

function handleGroupError( name , result , error ) {
	if ( result ) {
		document.getElementById('e'+name).style.display = 'none';
	}else{
		document.getElementById('e'+name).style.display = ''
	}
	for ( var u = 0 ; u < groupedElements[name].length ; u++ ) {
		var element = document.getElementById(groupedElements[name][u]);
		if ( element != null ){ 
			if ( result ) {
				element.className = element.className;
				element.validated = '1';
			}else{
				element.className = element.className+' error';
				element.validated = '0';
			}
		}
	}
	document.getElementById('e'+name).innerHTML = error;
}

/**
 * Set the  required fields array
 *  
 * @param required Array
 */
function setRequiredFields(required) {
	checks = required;
}

/**
 * Does the HTMLInputElement needs validation
 * 
 * @param obj HTMLInputElement
 * @return Boolean
 */
function hasValidation( name ) {
	for ( var i = 0 ; i < checks.length ; i++ ) {
		if( name == checks[i] ) {
			return true;
		}
	}
	return false;
}

/**
 * Collect all radiobuttons form the form
 * 
 * @param fObj HTMlForm
 * @return Object
 */
function collectRadios (fObj) {
	var radios = new Object();
	for ( var i = 0 ; i < fObj.elements.length ; i++ ) {
		var obj = fObj.elements[i];
		if ( obj.type == 'radio' ) {
			if ( typeof ( radios[obj.name] ) != 'object'  ) {
				radios[obj.name] = new Array ();
			}
			radios[obj.name].push ( obj );
		}
	}
	return radios;
}

/**
 * Set the checked radiobutton of a radiobutton
 * 
 * @param element HTMLInputElement (radiobuttongroup)
 * @param value String
 */
function setRadioValue( element , value ) {
	for (var i = 0 ; i < element.length ; i ++ ) {
		if ( element[i].value == value ) {
			element[i].checked = true;
		}
	}
}

/**
 * Set the correct value of a combobox
 * 
 * @param element HTMLInputElement (combobox)
 * @param value String
 */
function setSelectValue( element , value ) {
	for (var i = 0 ; i < element.length ; i ++ ) {
		if ( element[i].value == value ) {
			element.selectedIndex = i;
		}
	}
}

/**
 * Submit a form via Ajax
 * 
 * @param fObj HTMLForm
 * @param ajaxFrame DivElement
 * @return
 */
function submitAjaxForm ( fObj , ajaxFrame ) {
	if ( _submitForm ( fObj ) ) {
		new Ajax.Updater(ajaxFrame, fObj.action, {asynchronous:true, parameters:Form.serialize(fObj)})
	}
	return false;
}

/**
 * Set the wizard version
 * 
 * @param version
 */
function setWizardVersion( version ) {
	_version = version;
}

var groupedElements = {};
function addGroupedElement(elementName , elements ) {
	groupedElements[elementName] = elements;
}

/**
 * Validate the form
 * 
 * @private
 * @param fObj HTMLForm
 * @return Boolean
 */
function _submitForm ( fObj ) {
	var _validated = true;
	var elementChecked = [];
	var radios = collectRadios(fObj);
	for ( var i = fObj.elements.length -1 ; i >= 0  ; i-- ) {
		var obj = fObj.elements[i];
		
		var name = obj.name;
		var type = obj.type;
		
		var isChecked = false;
		// check if element is already checked (radiobuttons especially)
		for ( var u = 0; u < elementChecked.length ; u++ ) {
			if( elementChecked[u] == name ) {
				isChecked = true;
			}
		}
		
		name = name.replace("[]","");
		
		if ( ! isChecked  ) {
			report("[submitForm] "+name);
			
			var cont = false;
			if ( _version == 2 && rules.length > 0 ) { // does the wizard is in version 2 then rules can apply
				var htmlContainer = document.getElementById("li-"+name);
				if ( htmlContainer != null ) {
					report("[submitForm] li-"+name+" - "+htmlContainer.style.display);
					if ( htmlContainer.style.display != 'none') {
						cont = true;
					}
				}
			}else{
				cont = true;
			}
			
			if ( cont ) {
				var groupName = getGroupName(name);
				if ( groupName != '' ) {
					var val = false;
					report("[submitForm] "+name+"/"+type+" is part of a group: "+groupName+" - "+groupedElements[groupName]);
					for ( var u = 0 ; u < groupedElements[groupName].length ; u++ ) {
						var element = document.getElementById(groupedElements[groupName][u]);
						if ( element != null ){ 
							if ( validateElement( element , radios) ) {
								val = true;
							}
						}
						elementChecked.push( groupedElements[groupName][u] );
					}
					if ( !val ) {
						_validated = false;
					}
				}else{
					if ( hasValidation( name ) ) {
						report("[submitForm] "+name+"/"+type+" needs validation");
						if ( !validateElement( obj , radios) ) {
							_validated = false;
						}
					}
				}
			}
			elementChecked.push( name );
		}
	}
	//return false;
	if ( _validated ) {
		return true
	}else{
		return false;
	}
}

function uncheckCheckbox(serie){
	for ( var u = 0 ; u < serie.length ; u++ ) {
		document.getElementById(serie[u]).checked = false;
	}
}

function getGroupName( name ){
	var groupName = "";
	for( var g in groupedElements ) {
		for ( var u = 0 ; u < groupedElements[g].length ; u++ ) {
			if ( groupedElements[g][u] == name ) {
				groupName = g;
			}
		}
	}
	return groupName;
}

function validateElement( obj , radios ){
	var name = obj.name;
	var type = obj.type;
	var _validated = true;
	report("validate "+name+"/"+type);
	switch ( type ) {
		case "radio":
			if ( typeof ( radios[name] ) == 'object' ) {
				var checked = false;
				for ( var u = 0 ; u < radios[name].length ; u++ ) {
					var radioObj = radios[name][u];
					report ("[submitForm] "+ radioObj ) ;
					if ( radioObj.checked ) {
						checked = true;
					}else{
						if ( typeof ( radioObj.onchange ) == 'function' ) {
							report("[submitForm] "+name+" - onchange")
							radioObj.onchange();
						}
					}
				}
				if ( ! checked ) {
					_validated = false;
					report("[submitForm] "+name+" - not validated");
				}
				delete radios[name];
			}
			break;
		default:
		case "text":
		case "checkbox":
			if ( typeof ( obj.onblur ) == 'function' ) {
				report("validating field (onblur): "+name);
				obj.onblur();
			}
			if ( typeof ( obj.onchange ) == 'function' ) {
				report("validating field (onchange): "+name);
				obj.onchange();
			}
			if ( obj.validated == '0' ) {
				_validated = false;
				report("[submitForm] "+name+" - not validated");
			}
			break;
	}
	return _validated;
}


/**
 * Public method for submitting the form
 * 
 * @param fObj HTMLForm
 * @return Boolean
 */
function submitForm ( fObj ) {
	if ( _submitForm ( fObj ) ) {
		if ( _version == 2 ) {
			return true;
		}else{
			fObj.submit();
		}
	}else{
		return false;
	}
}


/**
 * Debug method to invoke Firebug or Safari's console (or any other console style logging)
 * 
 * @param msg String
 */
function report( msg ) {
	if ( typeof(console) == "object" ) {
		console.log(msg);
	}
}


function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function handleVisualErrorFloater (obj , result , error ) {
	var div = document.getElementById('error'),e;
	if ( result ) {
		e='';
		div.style.display = 'none'
		obj.className = obj.className.replace(" error", '');
		obj.validated = '1';
	}
	else{
		e = error;
		div.style.display = ''
		obj.className = obj.className.replace(" error", '');
		obj.className = obj.className+' error';
		obj.validated = '0';
	}
	document.getElementById('error-text').innerHTML = e;
	pos = findPos(obj);
	div.style.left = (pos[0]+50)+"px";
	div.style.top  = (pos[1]-30)+"px";
}
 
