// -- Infogate AB's formulärvalideringsscript
// -- av Mattias Rundqvist
// --
// -- CVS version: $Revision: 5299 $

function IG_form( formname ) {
	
	// -- Kontrollera så nödvändiga funktioner finns ----
	try {
		if(typeof window.IG_prototypes == "undefined")
			throw "Fel: 'IG_prototypes.js' krävs för att köra 'IG_form'";
	} catch(err) {
		alert(err);
	}
	// --------------------------------------------------
	
	// -- Deklarationer ---------------------------------
	var fields = new Array();
	var conditions = new Array();
	var parameters = new Array();
	var testCondition = new Array();
	
	var TYPE_COMPARE_WITH = "comparewith";
	var TYPE_COPY_TO = "copyto";
	var TYPE_EMAIL = "email";
	var TYPE_FIXEDLENGTH = "fixedlength";
	var TYPE_MANDATORY = "mandatory";
	var TYPE_MATCH = "match";
	var TYPE_MAXLENGTH = "maxlength";
	var TYPE_NUMERIC = "numeric";
	var TYPE_PATTERN = "pattern";
	
	var ERROR_FIELD = "";
	var ERROR_CONDITION = "";
	// --------------------------------------------------
	
	// -- Interna funktioner för att lägga till ett fält
	function addField( field ) {
		if( !fields.exists(field) ) {
			fields[fields.length] = field;
		}
	}
	
	function addCondition( field, condition ) {
		if( typeof conditions[field] == "undefined" ) {
			conditions[field] = new Array();
		}
		conditions[field][conditions[field].length]=condition;
	}
	
	function addParameter( field, condition, parameter ) {
		if( typeof parameters[field] == "undefined" ) {
			parameters[field] = new Array();
		}
		parameters[field][condition]=parameter;
	}
	// --------------------------------------------------
	
	// -- Interna funktioner för att hämta data ---------
	function getFieldObject( fieldObj ) {
		if( typeof fieldObj == "string" )
			fieldObj = document[formname][fieldObj];
		return fieldObj;
	}
	
	function getFieldValue( fieldObj ) {
		fieldObj = getFieldObject( fieldObj );
		var value = "";

		switch( getFieldType(fieldObj)) {
			case "checkbox": value = getFieldValueCheckbox(fieldObj); break;
			case "radio": value = getFieldValueRadio(fieldObj); break;
			case "select": value = getFieldValueSelect(fieldObj); break;
			case "select-one": value = getFieldValueSelect(fieldObj); break;
			case "select-multiple": value = getFieldValueSelect(fieldObj); break;
			case "text": value = getFieldValueText(fieldObj); break;
			case "textarea": value = getFieldValueText(fieldObj); break;
			default: value = getFieldValueText(fieldObj);
		}
		return value;
	}
	
	function getFieldType( fieldObj ) {
		fieldObj = (typeof fieldObj == "string" ) ? getFieldObject(fieldObj):fieldObj;
		var type;
		if( fieldObj.length ) {
			type =  fieldObj[0].type;
		}
		if( typeof type == "undefined" ) {
			type = fieldObj.type;
		}
		return type;
	}
	
	function getFieldName( fieldObj ) {
		fieldObj = (typeof fieldObj == "string" ) ? getFieldObject(fieldObj):fieldObj;
		var name;
		if( fieldObj.length ) {
			name = fieldObj[0].name;
		}
		if( typeof name == "undefined" ) {
			name = fieldObj.name;
		}
		return name;
	}
	
	function getFieldValueCheckbox( fieldObj ) {
		var value = "";
		
		if(typeof fieldObj.length=="undefined") {
			if( fieldObj.checked ) {
				value = fieldObj.value;
			}
		} else {
			for( var count = 0; count < fieldObj.length; count++ ) {
				if( fieldObj[count].checked ) {
					value += fieldObj[count].value + " ";
				}
			}
		}
		return value.trim();
	}
	
	function getFieldValueRadio( fieldObj ) {
		var value = "";
		for( var count = 0; count < fieldObj.length; count++ ) {
			if( fieldObj[count].checked ) {
				value = fieldObj[count].value;
				count = fieldObj.length;
			}
		}
		return value;
	}
	
	function getFieldValueSelect( fieldObj ) {
		var value = "";
		for( var count = 0; count < fieldObj.options.length; count++ ) {
			if( fieldObj.options[count].selected ) {
				value += fieldObj.options[count].value + " ";
			}
		}
		return value.trim();
	}
	
	function getFieldValueText( fieldObj ) {
		return fieldObj.value;
	}
	// --------------------------------------------------
	
	// -- Interna funktioner för att validera typer -----
	testCondition[TYPE_COMPARE_WITH] = function(field){
		var value = getFieldValue(field);
		var target_value = getFieldValue(parameters[field.name][TYPE_COMPARE_WITH]);
		if( value ==  target_value )
			return true;
		return false;
	}
	
	testCondition[TYPE_COPY_TO] = function(field){
		var value = getFieldValue(field);
		getFieldObject( parameters[field.name][TYPE_COPY_TO] ).value = value;
		return true;
	}
	
	testCondition[TYPE_EMAIL] = function(field){
		
		var value = getFieldValue(field);
		var expression = new RegExp(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/);
		if(!value.length || value.search(expression)==0)
			return true;
		return false;
	}
	
	testCondition[TYPE_FIXEDLENGTH] = function(field){
		if(getFieldValue(field).length==parameters[field.name][TYPE_FIXEDLENGTH])
			return true;
		return false;
	}
	
	testCondition[TYPE_MANDATORY] = function(field){
		return getFieldValue(field).length?true:false;
	}
	
	testCondition[TYPE_MATCH] = function(field){
		return getFieldValue(field).isMatch(parameters[field.name][TYPE_MATCH]);
	}
	
	testCondition[TYPE_MAXLENGTH] = function(field){
		if(getFieldValue(field).length<=parameters[field.name][TYPE_MAXLENGTH])
			return true;
		return false;
	}
	
	testCondition[TYPE_NUMERIC] = function(field){
		return getFieldValue(field).isNum();
	}
	
	testCondition[TYPE_PATTERN] = function(field){
		var value = getFieldValue(field);
		if(!value.length || value.isPattern(parameters[field.name][TYPE_PATTERN]) )
			return true;
		return false;
	}
	// --------------------------------------------------
	
	// -- Externa funktioner ----------------------------
	this.setCompareWith = function( field, target_field ) {
		addField(field);
		addCondition(field,TYPE_COMPARE_WITH);
		addParameter(field,TYPE_COMPARE_WITH,target_field);
	}
	
	this.setCopyTo = function( field, target_field ) {
		addField(field);
		addCondition(field,TYPE_COPY_TO);
		addParameter(field,TYPE_COPY_TO,target_field);
	}
	
	this.setEmail = function( field ) {
		addField(field);
		addCondition(field,TYPE_EMAIL);
	}
	
	this.setFixedLength = function( field, length ) {
		addField(field);
		addCondition(field,TYPE_FIXEDLENGTH);
		addParameter(field,TYPE_FIXEDLENGTH,length);
	}
	
	this.setMandatory = function( field ) {
		addField(field);
		addCondition(field,TYPE_MANDATORY);
	}
	
	this.setMatch = function( field, match ) {
		addField(field);
		addCondition(field,TYPE_MATCH);
		addParameter(field,TYPE_MATCH,match);
	}
	
	this.setMaxLength = function( field, length ) {
		addField(field);
		addCondition(field,TYPE_MAXLENGTH);
		addParameter(field,TYPE_MAXLENGTH,length);
	}
	
	this.setNumeric = function( field ) {
		addField(field);
		addCondition(field,TYPE_NUMERIC);
	}
	
	this.setPattern = function( field, pattern ) {
		addField(field);
		addCondition(field,TYPE_PATTERN);
		addParameter(field,TYPE_PATTERN,pattern);
	}
	// --------------------------------------------------
	
	// -- Huvudfunktion ---------------------------------
	this.validate = function() {
		
		ERROR_FIELD = "";
		ERROR_CONDITION = "";
		
		var obj = document[formname];
		var field,value;
		var valid = true;
		for( count = 0; count<fields.length; count++ ) {
			field = obj[fields[count]];
			for( condition_count = 0; condition_count<conditions[getFieldName(field)].length; condition_count++ ) {
				valid = testCondition[conditions[getFieldName(field)][condition_count]](field);
				if( !valid ) {
					ERROR_FIELD = getFieldName(field);
					ERROR_CONDITION = conditions[getFieldName(field)][condition_count];
					return false;
				}
			}
		}
		return true;
	}
	// --------------------------------------------------
	
	// -- Felhantering ----------------------------------
	this.errorField = function() {
		return document[formname][ERROR_FIELD];
	}
	this.errorFieldName = function() {
		return ERROR_FIELD;
	}
	
	this.errorType = function() {
		return ERROR_CONDITION;
	}
	// --------------------------------------------------
	
}
