var allChecked = false;
var lastFieldToCheck = 0;

//set all errors to false, the checks will set them to true if some occurs
var errMsg = new Array();
errMsg['fehler_required'] = new ErrorMsg();
errMsg['fehler_datum'] = new ErrorMsg();
errMsg['fehler_mobiltelefon'] = new ErrorMsg();
errMsg['fehler_festnetztelefon'] = new ErrorMsg();
errMsg['fehler_cli'] = new ErrorMsg();
errMsg['fehler_internationaltelefon'] = new ErrorMsg();
errMsg['fehler_plz'] = new ErrorMsg();
errMsg['fehler_email'] = new ErrorMsg();
errMsg['fehler_fax'] = new ErrorMsg();
errMsg['fehler_upload'] = new ErrorMsg();
errMsg['fehler_doppeltmail'] = new ErrorMsg();
errMsg['fehler_smscode'] = new ErrorMsg();
errMsg['fehler_dberror'] = new ErrorMsg();
errMsg['fehler_surpriselabel'] = new ErrorMsg();
errMsg['fehler_codefailed'] = new ErrorMsg();
errMsg['fehler_simnummer'] = new ErrorMsg();
errMsg['fehler_land'] = new ErrorMsg();
errMsg['fehler_date_time'] = new ErrorMsg();
errMsg['fehler_netz'] = new ErrorMsg();
errMsg['fehler_aufenthaltsort'] = new ErrorMsg();
errMsg['fehler_handytyp'] = new ErrorMsg();
errMsg['fehler_meinung'] = new ErrorMsg();
errMsg['fehler_verkaufsstelle'] = new ErrorMsg();
errMsg['fehler_antragsnr'] = new ErrorMsg();
errMsg['fehler_imei'] = new ErrorMsg();

errMsg['fehler_space'] = new ErrorMsg();

var checkUploadFormat = false;
if (navigator.appVersion.indexOf("Win")!=-1) {
	checkUploadFormat = true;
}

/**
 * Javascript strings are kind of sh.... We add some more functionality to them ;-) 
 * 
 * Following functions allows to trim strings which removes whitespace at the end and at start of String
 */
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
};

/**
 * Following functions allows to test for a character sequence at the end of a string
 *
 * @param suffix charachter sequence to test for
 */

String.prototype.endsWith = function(suffix) {
	return this.toLowerCase().lastIndexOf(suffix.toLowerCase()) !== -1 && this.toLowerCase().lastIndexOf(suffix.toLowerCase()) === (this.length-suffix.length);
}

/**
 * A class modeling Error messages
 */
function ErrorMsg () {
	//this.show = false;
	this.fields = new Array();
	//this.fields = [1,2,3];
	return this; 
}


//if the checks set or delete some errors, display/hide them with this function
//this function must be called after the checks, so that the detected errors can be displayed
function showErrors(currentField,form,submitButtonPressed) {
	//console.log('showErrors()');
	var errorCount = 0;
	for(error in errMsg) { 
		if(!document.getElementById(error)) {
			continue;
		}
		if(errMsg[error].fields.length > 0) {
			document.getElementById(error).style.display = "block";
			errorCount++;
		} else {
			//alert(error);
			document.getElementById(error).style.display = "none";
		}
	}
	
	var formLength = form.length;
	formLength -=2; //because array starts with 0 instead of 1 and submit button is not really a field	

	if(allChecked && errorCount == 0) {
		if(submitButtonPressed) {
			var mysubmitform = document.forms["formular"];
			
			jQuery(mysubmitform).submit();
			if(document.getElementById("submit_error") != null)
				document.getElementById("submit_error").style.display = "none";
			//Don't submit form twice
			return false;
		} 
		if(document.getElementById("submit_error") != null)
			document.getElementById("submit_error").style.display = "none";
		return true;
	} else {
		if(submitButtonPressed) {
			if(document.getElementById("submit_error") != null)
				document.getElementById("submit_error").style.display = "block";
		}
		return false;
	}	
}


function fieldcheck(currentField) {

	var form = document.getElementById("formular");
	//whole form
	var formfield = form.length;	
	
	//form part to check
	var checkformfield = form.length;		
	
	//result from this loop is the checkformfield at the position of the currentField
	while(checkformfield > 0) {		
		checkformfield --;		
		if(currentField.name == form.elements[checkformfield].name) {
			break;
		}
	}
	//alert("formfield:" + formfield);
	checkFieldsBelow(formfield-1,checkformfield,form);
	//alert("checkformfield:" + checkformfield);
	//alert("formfield-1:" + (formfield-1) + " and checkformfield:" + checkformfield);
	return checkFieldsAbove(formfield-1,checkformfield,form);
}

function findInArray(array, arrayElement) {
	for(var i=0;i<array.length;i++) {
		if(array[i] == arrayElement) {
			return i;
		}
	}
	return -1;
}

function setError(feldname, classFeldname, feld, classFeld, errorlist) {
	jQuery("#"+feldname).addClass(classFeld);
	jQuery("label[for="+feldname+"]").addClass(classFeldname);
	var errors = errorlist.split(",");
	for(var i=0;i < errors.length;i++) {
		document.getElementById(errors[i]).style.display = "block";
		errMsg[errors[i]].show = true;
		if(findInArray(errMsg[errors[i]].fields,feldname) < 0) { 
			errMsg[errors[i]].fields.push(feldname);
			//alert("field not found, push");
		}
		//alert(errMsg[errors[i]].fields);
	}	
}


function delError(feldname, classFeldname, feld, classFeld, errorlist) {
	jQuery("#"+feldname).removeClass(classFeld);
	jQuery("label[for="+feldname+"]").removeClass(classFeldname);
	var errors = errorlist.split(",");
	for(var i=0;i < errors.length;i++) { //loop every error from the errorlist
		//document.getElementById(errors[i]).style.display = "none";
		//errMsg[errors[i]].show = true;
		var c = 0;
		for(error in errMsg) { //now loop every error in the predefined errmsgs
			if(error == errors[i]) { //if the to be deleted error is found in the predef. errors:
				//alert("remove field:" + feldname +" in list: " + errMsg[error].fields);
				if(errMsg[error].fields.length > 0) {
					var failedFields = errMsg[error].fields.toString();
					//alert("failedFields:" + typeof(failedFields));
					failedFields = failedFields.split(",");
					var f = 0;
					
					for(field in failedFields) { //find and remove the now correct field from the errmsg-object					
						if(failedFields[field] == feldname) {
							failedFields.splice(f,1);
						}
						f++;
						
						errMsg[error].fields = new Array(); //delete all fields from errmsg-object
						for(field in failedFields) {
						//alert("failedFields:" + failedFields.toSource());						
							errMsg[error].fields.push(failedFields[field]); //and set the new fields here after removing the correct one
						}
					}
				}				
			}
			c++;
		}		
	}
	//now all errMsg are cleaned and are containing the fields which currently have this error
}

function checkFieldsAbove(formfield,checkformfield,form) {
	var submitButtonPressed = false;
	if(formfield == checkformfield) {
		//alert("send button pressed");
		submitButtonPressed = true;
	}

	var currentField = checkformfield;	
	
	while(checkformfield > 0) {
		//alert("current field:" + form.elements[checkformfield].name);
		checkSingleField(form.elements[checkformfield],form,checkformfield);
		checkformfield--;
	}

	if (lastFieldToCheck == 0) {
		var theForm = document.getElementById("formular");
		var elementLength = theForm.elements.length;
		//alert(elementLength);
		for (var i=0; i < (elementLength - 1); i++) {
			//log(theForm.elements[i].getAttribute("name")+': '+theForm.elements[i].getAttribute("req"));
			if (theForm.elements[i].getAttribute("req") == "true") {
				//lastFieldToCheck = i+1; //+1 is the last element plus 1 = submit button
				lastFieldToCheck = i;
			}
		}
	}

	log(lastFieldToCheck +"=="+ currentField);
	// CHANGED BY UD FROM == TO <= ON 5.april 09
	if(lastFieldToCheck <= currentField) {
		//alert("allChecked!");
		allChecked = true;
	}
	
	return showErrors(currentField,form,submitButtonPressed);
}

function checkFieldsBelow(formfield,checkformfield,form) { //THIS FUNCTION IS NOT USED YET, BUT CAN BE USABLE IN THE FUTURE
	while(formfield > checkformfield) {	
		if(jQuery(form.elements[formfield]).is(".error"))		{
			//do something with the fields below the checked fields			
		}
		formfield--;
	}
}

function checkSingleField(field,form,formfeld) {

	//define regex patterns
	var EMAIL = "^[a-zA-Z0-9_-]+(\.([a-zA-Z0-9_-])+)*@[a-zA-Z0-9_-]+[.][a-zA-Z0-9_-]+([.][a-zA-Z0-9_-]+)*$";
    var PLZ = "^[0-9]{4}$";
	var MOBILTELEFON = "^(076|078|079|077)[0-9]{7}$";
	var FESTNETZTELEFON = "^0[0-9]{9}$";
	var CLI = "^0[0-9]{9}$";
	var INTERNATIONALTELEFON = "^00[0-9]{11}$";
	var DATUM = "^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]([0-9][0-9][0-9][0-9])$";
	var SIMNUMMER = "^[0-9]{20}$";
	var VKSTELLE = "^[0-9]{5}$";
	var ATNUMMER = "^[0-9]{12}$";
	var IMEI = "^[0-9]{15}$";

	//define field data				
	feld = field;
	var feldwert = feld.value;
	var feldname = feld.name;
	var feldtyp = feld.type;
	var req = feld.getAttribute("req");
	req = req ? req : "false";
	var attribut = feld.getAttribute("attribut");
	var regexp;

	//log( "feldname: " + feldname + ";feldtyp: " + feldtyp + ";feldwert: " + feldwert + ";req: " + req );
			
	if(req == "true" || req.indexOf("depends=") > -1) {
		var depends = null;
		if(req.indexOf("depends=") > -1) {
			depends = document.getElementById(req.split("=")[1]);
		}
		if(feldtyp == "text" || feldtyp == "password" ||  feldtyp == "file" ||  feldtyp == "textarea" || feldtyp == "select-one")	{
			if((feldwert == "" && depends === null) || (depends !== null && (depends.value == "" && feldwert == ""))) {
				setError(feldname,'error', feld, 'error', 'fehler_required,fehler_space');
				if(depends) {
					setError(depends.name,'error', depends, 'error', 'fehler_required,fehler_space');
				}
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_required,fehler_space');
				if(depends) {
					delError(depends.name,'error', depends, 'error', 'fehler_required,fehler_space');
				}
			}
		} else if(feldtyp == 'radio') {		
			delError(feld.name,'error', feld.name+"label", 'error', 'fehler_required,fehler_space');
			
			var radioGroup = document.getElementsByName(feld.name);
			var i = radioGroup.length-1;
			while(i >= 0 && radioGroup[i].type == 'radio') {
				if(radioGroup[i].checked) {
					var radioselected = 1;
					var radionamehash = feld.name;
	  			}
				i--;
			}
			
			if(radioselected != 1 || radionamehash != feld.name) {
				setError(form.elements[formfeld].name,'error', form.elements[formfeld].name+"label", 'error', 'fehler_required,fehler_space');
			} 
		} else if(feldtyp == 'checkbox') {
			delError(form.elements[formfeld].name,'error', form.elements[formfeld].name+"label", 'error', 'fehler_required,fehler_space');
						
			var checkboxGroup = document.getElementsByName(feld.name);
			var i = checkboxGroup.length-1;
			while(i >= 0 && checkboxGroup[i].type == 'checkbox') {
				if(checkboxGroup[i].checked) {
					var checkboxselected = 1;
					var checkboxnamehash = form.elements[formfeld].name;
	  			}
				i--;
			}
		
			if(checkboxselected != 1 || checkboxnamehash != form.elements[formfeld].name) {
				setError(form.elements[formfeld].name,'error', form.elements[formfeld].name+"label", 'error', 'fehler_required,fehler_space');
			} 
		} 
	}

	if(feldtyp == 'file' && checkUploadFormat==true && feldwert && feldwert.trim().length > 0 ) {
		// check attachment
		var allowedSuffixes = field.getAttribute( "allowedSuffix" );
		var isAllowed = false;
		if ( allowedSuffixes ) {
			allowedSuffixes = allowedSuffixes.split( "," );
			for ( var i = 0; i < allowedSuffixes.length; i++ ) {
				var suff = allowedSuffixes[i].trim();
				if ( feldwert.endsWith( suff ) ) {
					isAllowed = true;
					break;
				}
			}
		}
		if(isAllowed != true ) {			
			setError(feldname,'error', feld, 'error', 'fehler_upload');
		} else {
			delError(feldname,'error',feld,'error','fehler_upload');			
		}
	}
		
	if (attribut != null) {
		if(attribut == "plz") {
			regexp = new RegExp(PLZ);
			if(!feldwert.match(regexp)) {	
				if(feldwert != "") {
					setError(feldname,'error', feld, 'error', 'fehler_plz,fehler_space');					
	    		}	
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_plz,fehler_space');
			}
		} else if(attribut == "mobiltelefon") {
			feldwert = feldwert.replace( /\s/g, "" );
			feld.value = feldwert;
			regexp = new RegExp(MOBILTELEFON);
			if(!feldwert.match(regexp)) {	
				if(feldwert != "") {
					setError(feldname,'error', feld, 'error', 'fehler_mobiltelefon,fehler_space');
	    		}	
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_mobiltelefon,fehler_space');
			}
		} else if(attribut == "festnetztelefon") {
			feldwert = feldwert.replace( /\s/g, "" );
			feld.value = feldwert;
			regexp = new RegExp(FESTNETZTELEFON);
			if(!feldwert.match(regexp)) {	
				if(feldwert != "") {
					setError(feldname,'error', feld, 'error', 'fehler_festnetztelefon,fehler_space');
	    		}	
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_festnetztelefon,fehler_space');
			}
		} else if(attribut == "simnummer") {
			regexp = new RegExp(SIMNUMMER);
			if(!feldwert.match(regexp)) {	
				if(feldwert != "") {
					setError(feldname,'error', feld, 'error', 'fehler_simnummer,fehler_space');					
	    		}	
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_simnummer,fehler_space');
			}
		} else if(attribut == "telefon") {
			if(feldname == "telefon2" && (!feldwert || feldwert == "")) // telefon2 muss keinen Wert drin haben
			{
				delError(feldname,'error', feld, 'error', 'fehler_festnetztelefon,fehler_space');
			}
			else
			{
				feldwert = feldwert.replace( /\s/g, "" );
				feld.value = feldwert;
				regexp = new RegExp(FESTNETZTELEFON);
				if(!feldwert.match(regexp)) 
				{	
					if(feldwert != "") 
					{
						regexp = new RegExp(MOBILTELEFON);
						if(!feldwert.match(regexp))
						{
							regexp = new RegExp(INTERNATIONALTELEFON);
							if(!feldwert.match(regexp))
								setError(feldname,'error', feld, 'error', 'fehler_festnetztelefon,fehler_space');
							else 
								delError(feldname,'error', feld, 'error', 'fehler_festnetztelefon,fehler_space');
						} 
						else 
						{
							delError(feldname,'error', feld, 'error', 'fehler_festnetztelefon,fehler_space');
		    			}
					}
				} 
				else 
				{
					delError(feldname,'error', feld, 'error', 'fehler_festnetztelefon,fehler_space');
				}
			}
		} else if(attribut == "cli") {
			feldwert = feldwert.replace( /\s/g, "" );
			feld.value = feldwert;
			regexp = new RegExp(CLI);
			if(!feldwert.match(regexp)) {	
				if(feldwert != "") {
					setError(feldname,'error', feld, 'error', 'fehler_cli,fehler_space');
	    		}	
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_cli,fehler_space');
			}
		} else if(attribut == "internationaltelefon") {
			feldwert = feldwert.replace( /\s/g, "" );
			feld.value = feldwert;
			regexp = new RegExp(INTERNATIONALTELEFON);
			if(!feldwert.match(regexp)) {	
				if(feldwert != "") {
					setError(feldname,'error', feld, 'error', 'fehler_internationaltelefon,fehler_space');
	    		}	
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_internationaltelefon,fehler_space');
			}
		} else if(attribut == "datum") {
			regexp = new RegExp(DATUM);
			if(!feldwert.match(regexp)) {	
				if(feldwert != "") {
					setError(feldname,'error', feld, 'error', 'fehler_datum,fehler_space');
	    		}	
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_datum,fehler_space');
			}
		} else if(attribut == "email") {
			regexp = new RegExp(EMAIL);
			if(!feldwert.match(regexp)) {	
				if(feldwert != "") {
					setError(feldname,'error', feld, 'error', 'fehler_email,fehler_space');
	   			}	
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_email,fehler_space');
			}
		} else if(attribut == "emaildoppelt") {
			if(feldwert != document.getElementById('email').value) {	
				setError(feldname,'error', feld, 'error', 'fehler_doppeltmail,fehler_space');
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_doppeltmail,fehler_space');
			}
		} else if(attribut == "verkaufsstelle") {
			regexp = new RegExp(VKSTELLE);
			if(!feldwert.match(regexp)) {	
				if(feldwert != "") {	
					setError(feldname,'error', feld, 'error', 'fehler_verkaufsstelle,fehler_space');
				}					
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_verkaufsstelle,fehler_space');
			}
		} else if(attribut == "antragsnr") {
			regexp = new RegExp(ATNUMMER);
			if(!feldwert.match(regexp)) {
				if(feldwert != "") {
					setError(feldname,'error', feld, 'error', 'fehler_antragsnr,fehler_space');	
				}			
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_antragsnr,fehler_space');
			}
		} else if(attribut == "imei") {
			regexp = new RegExp(IMEI);
			if(!feldwert.match(regexp)) {	
				if(feldwert != "") {	
					setError(feldname,'error', feld, 'error', 'fehler_imei,fehler_space');
				}				
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_imei,fehler_space');
			}
		} else if(attribut == "fax") {
			feldwert = feldwert.replace( /\s/g, "" );
			feld.value = feldwert;
			var regexp1 = new RegExp(FESTNETZTELEFON);
			var regexp2 = new RegExp(INTERNATIONALTELEFON);
			if(!feldwert.match(regexp1) && !feldwert.match(regexp2)) {	
				if(feldwert != "") {
					setError(feldname,'error', feld, 'error', 'fehler_fax,fehler_space');
	   			} else {
				   // reset error
					delError(feldname,'error', feld, 'error', 'fehler_fax,fehler_space');
				}
			} else {
				delError(feldname,'error', feld, 'error', 'fehler_fax,fehler_space');
			}
		} 
	} 	
}

//Fix gulped return with textareas in standardformulars
jQuery(document).ready(function(){
	jQuery("#formular textarea").bind("keypress", function(event) {
		if(event.keyCode == 13)
			event.stopPropagation();
	});
});

// switch to false to avoid logging
var DEBUG = false;

/**
 * logging helps to develop and is easely to be avoided
 *
 * @param msg the message to log
 */
var logDivAttached = false;
function log( msg ) {

	if ( DEBUG == true ) {
		if (!logDivAttached) {
			var logEl = document.createElement( "div" );
			
			logEl.id = 'logDiv';
			logEl.style.position = 'absolute';
			logEl.style.top = '10px';
			logEl.style.left = '10px';
			logEl.style.width = '400px';
			logEl.style.height = '200px';
			logEl.style.overflow = 'auto';
			logEl.style.zIndex = 99999;
			logEl.style.paddingTop = '5px';
			logEl.style.paddingRight = '5px';
			logEl.style.paddingBottom = '5px';
			logEl.style.paddingLeft = '5px';
			logEl.style.backgroundColor = '#EEEEEE';
			logEl.style.fontWeight= 'bold';
						
			document.body.appendChild( logEl );
			
			jQuery("#logDiv").draggable();  
						
			var clearDiv = document.createElement( "div" );
			clearDiv.id = 'clearDiv';
			clearDiv.style.position = 'absolute';
			clearDiv.style.top = '10px';
			clearDiv.style.right = '10px';
			
			var clearButton = document.createElement( "button" );
			clearButton.value = 'clear';
			clearButton.name = 'clear';
			clearButton.onclick = function() {
				jQuery('#logDiv').html('');
				clearDiv.style.top = '10px';
				clearDiv.style.right = '10px';
				jQuery('#logDiv').append(clearDiv);
			};
			
			clearButton.appendChild( document.createTextNode('Clear Log') );
			
			clearDiv.appendChild( clearButton );
						
			logEl.appendChild( clearDiv );
			
			logEl.appendChild( document.createTextNode('--------------------------------------------') );
			logEl.appendChild( document.createElement( "br" ) );
			logEl.appendChild( document.createTextNode('This Debug Log Area is draggable!') );
			logEl.appendChild( document.createElement( "br" ) );
			logEl.appendChild( document.createTextNode('--------------------------------------------') );
			logEl.appendChild( document.createElement( "br" ) );

			
			logDivAttached = true;
		}
		
		logEl = document.getElementById('logDiv');
		var logDate = new Date();
		logEl.appendChild( document.createTextNode(logDate.getDate() + '.' + (logDate.getMonth()+1) + '.' + logDate.getFullYear() + ' ' + logDate.getHours() + ':' + logDate.getMinutes() + ':' + logDate.getSeconds() + '> ') );
		//logEl.appendChild( document.createElement( "br" ) );
		logEl.appendChild( document.createTextNode(msg) );
		logEl.appendChild( document.createElement( "br" ) );
		logEl.appendChild( document.createTextNode('--------------------------------------------') );
		logEl.appendChild( document.createElement( "br" ) );
		logEl.scrollTop = logEl.scrollHeight;
		document.getElementById('clearDiv').style.top = (logEl.scrollHeight - 200) + 'px';

	}
}
