/**
*   form.js
*   form validation purpose
*		@author Olaf Höft <olaf@edotz.de>
*/

function isMaxLength(obj){
  var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : ""
  if (obj.getAttribute && obj.value.length>mlength)
  obj.value=obj.value.substring(0,mlength)
}

//Browsercheck (needed) ***************
function lib_bwcheck(){
  this.ver=navigator.appVersion
  this.agent=navigator.userAgent
  this.dom=document.getElementById?1:0
  this.opera5=this.agent.indexOf("Opera 5")>-1
  this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera5)?1:0;
  this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera5)?1:0;
  this.ie4=(document.all && !this.dom && !this.opera5)?1:0;
  this.ie=this.ie4||this.ie5||this.ie6
  this.mac=this.agent.indexOf("Mac")>-1
  this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0;
  this.ns4=(document.layers && !this.dom)?1:0;
  this.bw=(this.ie6||this.ie5||this.ie4||this.ns4||this.ns6||this.opera5)
  return this
}

var bw = new lib_bwcheck() //Browsercheck object

function libObj( name ){
	obj = bw.dom?document.getElementById(name):bw.ie4?document.body.all[name]:0;
  	return obj;
}

var sElementHTML = false;

/*==========================================================================
* script wide neede variables
* ==========================================================================*/
var debug = 1;
if(debug) {
	window.onerror = throwError;
}
function throwError(message,file,row) {
	error = "Fehlermeldung:\n"+message+"\n"+file+"\n"+row;
	alert(window.error);
	return true;
}
//different regular expressions
//see regExpr();
var num = /(\d)/;
var alpha = /[a-z_üöä\s\.-]/i;
var noalpha = /[^a-z_üöä\s\.-]/i;
var email = /^([_a-zA-Z0-9-]+)(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+\.([a-z\.A-Z]{2,10})$/;
//assign here get parameter in order to mark validation by javascript
var fieldValidated = "validated";
//default string for no value in elements
var strNoValue = "Bitte ausfuellen";
//assign here different javascript tags
var jscriptWrap = "<script type=\"text/javascript\">\n<!--:jscript://-->\n</script>\n";
//config array will be filled dynamically
//se setFormularConfig();
var elements = new Array();
var errorMsg = new Array();
var errorType = new Array();
var noValue = new Array();
var userFunc = new Array();
var aFormElements = new Array();
var sAlert = '';

//standard error messages for above defined regualr expressions
errorMsg['alpha']= 'Keine Zahlen + Sonderzeichen';
errorMsg['alphanum'] = 'Namen und Nr. bitte angeben';
errorMsg['num']= 'Nur Zahlen erlaubt';
errorMsg['email']= 'kein gueltige email Adresse';

/**
*   creates new config array for different config fields
*   @param	string	config field eg. elements,errorMsg
*		@param	string 	form element name
*		@retun 	void
*/
function setNewConfigArray(conf,formName){
	eval(''+conf+'["'+formName+'"] = new Array();');
}
/**
*	sets dynamically form config made in script
*   @param	string	form element name
*	@param	array 	containing different configurations
*   @return boolean true on success, false on failure
*/
function setFormularConfig(formName,arrConf){
	var conf, tmp, field, arrFields, arrSplit, strUserFunc;
	if(!arrConf["elements"]){
		throwDebugMessage("config array is not specified");
   }else {
        for(conf in arrConf){
    		setNewConfigArray(conf,formName);
    		//string operation assures string var
    		tmp = arrConf[conf]+"";
    		arrFields = tmp.split("#");
    		for(var i=0;i<arrFields.length;i++){
      			//string operation assures string var
      			var field = arrFields[i]+"";
                if( field.indexOf(':') > 0 ){
                    arrSplit = field.split(":");
                    field = arrSplit[0];
                }
      			switch(conf){
     				case "elements":
                        elements[formName].push( field );
                    break;
        			case "errorMsg":
          				errorMsg[formName][field] = arrSplit[1];
        			break;
                    case "regExpr":
                        regExpr[formName][field] = arrSplit[1];
                    break;
        			case "errorType":
        				errorType[formName][field] = arrSplit[1];
        			break;
        			case "noValue":
                        noValue[formName][field] = arrSplit[1];
        			break;
                    case "userFunc":
          				userFunc[formName][field]= 1;
          				strUserFunc = "function "+field+"() {\n";
          				for(var j=1;j<arrSplit.length;j++){
             				strUserFunc += arrSplit[j]+";\n";
          				}
          				strUserFunc += "}";
          				arrSplit = jscriptWrap.split(":");
          				arrSplit[1] = strUserFunc;
          				document.write(arrSplit.join("\n"));
        			break;
    			}//switch
    		}//for
  		}//for
  }//else
  return;
}

/**
*   process no value handling
*   @param	string  element type eg. input,radio
*	@param	string  form element name
*   @return mixed
*/
function throwErrorMessage( sType, Field, sMsg){
	if( sMsg ) {
  		switch( errorType[formName][sType] ){
			case "value":
      			setValue( sType, Field, sMsg);
      			setColor( sType, Field, "#FF0000");
			break;
    		case "alert":
            	sAlert += sMsg+"\n";
    		break;
            default:
                if( !errorType[formName]['all']){
      				throwDebugMessage('No Error type specified for '+Field.name);
                }else {
                    throwErrorMessage('all', Field, sMsg);
                }
    		break;
  		}
  	}
  	return;
}

/**
*  	Returns "no value" string assigned for form element
* 	if a "no value" string has been assigned than function takes default "no value" string
*   @param	string  form element name
*	@return string	"no value"
*/
function getNoValue( sFieldName ) {
	if(!noValue.length && !noValue[formName]){
		return strNoValue;
  	}
  	return (!noValue[formName][sFieldName]) ? false : noValue[formName][sFieldName];
}

/**
*   Calls user defined function
*   @param	string  function name
*	@param	mixed 	form field value
*	@param	boolean
*/
function callUserFunc( func, value ){
	if(!userFunc.length && !userFunc[formName]){
    	return false;
  	}
  	if(!userFunc[formName][func]){
   		throwDebugMessage("Userfunc "+func+" does not exists");
    	return false;
  	}
  	return eval(''+func+'("'+value+'");');
}

/**
*   Applies global defined regular expression in different validation cases
*   @param	string  form element name
*		@param	mixed 	form element value
*   @return boolean true if validation is succesful, false if not
*/
function regExpr( sFieldName, mValue ){

    if(!regExpr[formName][sFieldName]){
      	return true;
    }
	var sType =  regExpr[formName][sFieldName];

    switch(sType){
		case "alpha":
      		if(!isNaN(mValue))
      		return false;
			if(num.exec(mValue) || noalpha.exec(mValue))
    		return false;
		break;
		case "alphanum":
			if(!isNaN(mValue))
				return false;
			if(!num.exec(mValue) || !alpha.exec(mValue) )
				return false;
    	break;
        case "num":
			if(isNaN(mValue))
      		return false;
   		break;
    	case "email":
      		if(!email.test(mValue))
      		return false;
    	break;
    	default:
      		return callUserFunc(sType, mValue);
    	break;
	}
  	return true;
}

/**
*   Returns error messag assign in config array errorMsg
*   @param	string  form element name
*   @return string 	error message
*/
function getErrorMsg(field){
  	if(!errorMsg.length && !errorMsg[formName]){
    	return false;
  	}
  	if(errorMsg[formName][field]){
  		return errorMsg[formName][field];
  	}
  	return false;
}

/**
*   Checks whether one of a group of radio buttons has been clicked
*   @param	string  form radio element name
*   @return mixed 	value of form element radio if checked otherwise false
*/
function isChecked( group ){
	for(var i=0;i < group.length;i++){
    	if(group[i].checked == true){
      		return group[i].value;
    	}
  	}
  	return false;
}

/**
*   Returns value according form element type
*   @param	string  form element type
*   @param	object  form element object
*   @return mixed 	value of form element radio if set otherwise false
*/
function getValue2Type( sType, Field){
    var mValue = false;
    switch(sType){
        case "textarea":
        case "text":
    		mValue = Field.value;
    	break;
		case "checkbox":
    	case "radio":
      		mValue = Field.value;
      		if( !mValue ) {
       			mValue = isChecked(Field);
    		}else {
       			mValue = (Field.checked)? mValue : false;
      		}
    	break;
        default:
        	if(Field.options){
             	for(var j=0; j< Field.options.length; j++){
                    var Options = Field.options[j];
                    if( Options.selected == true ){
                        return Options.value;
                    }
                }
            }

        break;
  }
  return mValue;
}

/**
*   Sets font color if method "getElementById" is available
*   @param	string  form element type
*   @param	object  form element object
*   @param	string  hex font color
*   @return boolean
*/
function setColor(type,fieldObj,color){
  	if(!document.getElementById){
		return false;
  	}
  	switch(type){
    	case "input":
      		fieldObj.style.color = color;
    	break;
	}
  	return true;
}

/**
*   Sets form element value according element type
*   @param	string  form element type
*   @param	object  form element object
*   @param	mixed		form element value
*   @return void
*/
function setValue(type,fieldObj,value){
	if(!value)return false;
  	switch(type){
    	case "text":
    	case "input":
    		fieldObj.value = value;
    	break;
    	case "checkbox":
    	case "radio":
    	break;
  	}
  	return true;
}

/**
*   Returns form element type specified in config
*   @param	string  form element name
*   @return mixed 	form element type if specified otherwise false
*/
function getType( Field ) {
    var sType = Field.type;
    if( sType )return sType;
    if(Field.length){
		return Field[0].type;
	}
	if( Field.options ){
		return "select";
	}
}


/**
*   Check if form element value has been set taking into account possible error message
*   @param	string  form element name
*   @param	object  form element object
*   @return mixed 	form element value if set otherwise false
*/
function hasFilledOut( sFieldName, Field ){

    var sType = getType( Field );
    var mValue = getValue2Type( sType, Field);

    //set no value
  	if( !mValue ){
    	var sNoValue = getNoValue( sFieldName );
        if( sNoValue)throwErrorMessage( sType, Field, sNoValue );
    	return false;
  	}
  	//if error type is value check error messages
  	if( errorType[formName][sType] == "value") {
    	if( ( mValue == getNoValue(sFieldName) ) || ( mValue == getErrorMsg(sFieldName) ) )return false;
  	}
  	setColor(sType,Field,"#000000");
  	return mValue;
}

function __doPostBack( sFormName) {
	Form = ( document.forms[ sFormName ] ) ? document.forms[ sFormName ] : ( document.getElementById(sFormName) ) ? document.getElementById(sFormName) : false;
    if( !Form ){
		throwDebugMessage("Formular "+sFormName+" does not exist");
    }else if(!elements[ sFormName ].length){
        throwDebugMessage("No formular elements defined for "+sFormName);
    }else {
    	Form = document.forms[ sFormName ];
    	formName = sFormName;
        if( validate( Form  ) ){
           Form.submit();
        }
    }
}

/**
*   main form validation function
*		iterates and validates specified form elements, calls form.submit() if validation was successful
*   @param	string  form name
*   @return boolean false
*/
function validate( Form ){
    var bSubmit = true, mValue, FormFields;
    FormFields = Form.elements;
     //iterate required formular fields
    for(var j = 0; j < elements[formName].length; j++ ){
        var sFieldName = elements[formName][j];
        if(!FormFields[sFieldName])continue;
        var Field = FormFields[sFieldName];
        mValue = hasFilledOut( sFieldName, Field );
        if(!mValue){
         	bSubmit = false;
            continue;
        }
        if( !regExpr( sFieldName, mValue ) ) {
        	var sType = getType( Field );
            var sErrorMsg = getErrorMsg( sFieldName );
            if( sErrorMsg ){
              	throwErrorMessage( sType, Field, sErrorMsg);
                bSubmit = false;
			}
        }
    }
    if( !bSubmit ) {
        if( getNoValue('all') ){
			throwErrorMessage('all', '', getNoValue('all'));
        }
        alert( sAlert );
		//unset alert string
		sAlert = '';
  	}
    return bSubmit;
}


/**
*   Resets form
*		@return void
*/
function formReset(){
	if(!arguments[0]){
  		document.forms[0].reset();
  	}else {
    	document.forms[arguments[0]].reset();
  	}
}
/**
*   Alert debug message if flag has been set
*		@return void
*/
function throwDebugMessage(strMessage){
	if(!debug)return false;
  	alert(strMessage);
}

/**
* checkStatus
* checks radio button status and resets button if checked
* return void
*/
function checkStatus(butt){
 	if(butt.on == 0 || !butt.on){
  		butt.on = 1;
  		return;
 	}
 	butt.on = 0;
 	butt.checked = false;
}
