Array.prototype.in_array = function(needle) {
for(var i=0; i < this.length; i++) if(this[ i] === needle) return true;
return false;
}


 

var curFieldValue = null;

var FormValidator = $.inherit({
	
	__constructor:function(form, config) {
		this.form = form;
		this.config = config;
        this.elements = 'input,checkbox,select,textarea';
        this.formData = {};
	},
    
	/*
	 * Validate entire Form via validateSubpart(formId))
	 */
	validateForm:function(submit) {
	   //log(this.formData);
	   var allValid = this.validateSubpart(this.form);
        if(submit && allValid){
            $('#'+this.form).submit();
        }
        else
            return allValid;
	},
	
    /*
     * Validate Subpart by Id
     */
    validateSubpart:function(id, noswitch) {
    

        var allValid = true;
        var oneValid = true;
        var elements = this.elements.split(',');
        var expression = '';
        var eid= new Array();
        
        // generate expression (#formId tag1, #formId tag2,...)
        for (var i = 0; i < elements.length; i++){
            if (i != 0) expression = expression+',';
            expression = expression+'#'+id+' '+elements[i]+' ';
        }
        
        // build array of input-element-Ids
        $(expression).each(function(){
            var curid = $(this).attr('id');
            if ($(this).attr('type') != 'image' && curid != '')
            eid.push(curid);
        });
        
        //validate by id
        for(var i = 0; i < eid.length; i++){
            oneValid = this.validate2(eid[i]);
            allValid = allValid && oneValid;
        }
        
        //switch to next subpart if all valid
        if(allValid && !noswitch){
            var jqobj = $('#'+id);
            if (jqobj.hasClass('formSubPart') && jqobj.next().hasClass('formSubPart')) jqobj.css('display','none').next().css('display','block');
        }
        

        return allValid;
    },
    
    
    
    // switch to previous Subpart
    switchBack:function(id) {
        var jqobj = $('#'+id).next();
        if (jqobj.hasClass('formSubPart') && jqobj.prev().hasClass('formSubPart')) jqobj.css('display','none').prev().css('display','block');
    },
    
    /*
     * Validate field by Id
     * ->collect Formdata in this.formData
     * ->switch error state
     */
	validate2:function(fieldId, field2) {
		var fid = this.getFieldId(fieldId);
		
        
        if (typeof(fieldId) == 'string')
			var field = $('#'+fieldId)[0];
		else
			var field = fieldId;
		
		if (field == null) {
			field = field2;
            
		}
        this.formData[fid] = field.value;
        
        if(typeof this.config[fid] != 'undefined'){
            
            if(typeof this.config[fid].config.validate != 'undefined'){
                var validators = this.config[fid].config.validate.split(';')
                
            } 
            else {
                return true;
            }
        }
        else {
            return true;
        }
        
            
		var isValid = true;
		var newValid = true;
		var label = this.config[fid].label
        if (validators.in_array('required')) label = label+' *';
        
        this.formData[fid] = (this.formData[fid] == label) ? null : field.value;

		if (field.value == curFieldValue)
			return true;
        
        if (field.value == label) {
			field.value = "";
		}
        
        
        
		for(var i=0;i<validators.length;i++) {
            
			var valids = validators[i].split(',');
            
			newValid = this.validate(field, fid, valids[0], validators[i])
			if (newValid){
			     this.formData[fid] = field.value;
                 }
			else {
                this.formData[fid] = null;
            }
            isValid = isValid && newValid;
            
            this.switchFieldState(field, fid, isValid, valids[0]);
		};
        
        if (field.value == "") {
			field.value = label;
		}
		
		return isValid;
	},
	
    // subroutine for Validation
	validate:function(field, fieldId, type, config) {
		
		if (config[1] == 'nojs')
			return true;
		
		switch(type) {
			case 'email':isValid = this.validateEmail(field, config);break;
			case 'url':isValid = this.validateUrl(field, config);break;
			case 'length':isValid = this.validateLength(field, config);break;
			case 'range':isValid = this.validateRange(field, config);break;
			case 'required':isValid = this.validateRequired(field, config, fieldId);break;
			case 'number':isValid = this.validateNumber(field, config);break;
			case 'date':isValid = this.validateDate(field, config);break;
			case 'list':isValid = this.validateList(field, config);break;
			case 'creditcard':isValid = this.validateCreditCard(field, config);break;
			case 'captcha':isValid = true;break;
			default:isValid = false;
		}
		
		return isValid;
	},
		
	validateUrl:function(field, config) {
		//
	},
	
    
    // ok
	validateLength:function (field, config) {
	    
		var values = config.split(',');
		var length = field.value.length;
		isValid = (length >= values[1]);
		if (values[2])
			isValid = isValid && (length <= values[2]);
        
		return isValid;
	},
	
    // ?
	validateRange:function (field, config) {
		var values = config.split(',');
		var isValid = (field.value >= values[1]);
		if (values[2])
			isValid = isValid && (field.value <= values[2]);
		
		return isValid;
	},
	
    // ok
	validateRequired:function (field, config, fieldId) {
    //log(field.value);
		var tmp = new Number(field.value); 
        if (tmp != NaN)    
			return tmp !=0 ;
        else
            return field.value.length > 0 ;
		
	},
	
	validateNumber:function (field, config) {
		return !isNaN(field.value);
	},
	
	validateDate:function (field, config) {
		var values = field.value.split('.');
		var dateValue = new Date(values[2], values[1], values[0]);
		var configs = config.split(',');

		if (values[0] == -1 || values[1] == -1 || values[2] == -1)
			return false;
		
		if (isNaN(dateValue.getTime()))
			return false;

		if (configs[1]) {
			var minDateValues = configs[1].split('.');
			var minDate = new Date(minDateValues[2], minDateValues[1], minDateValues[0]);
			if (minDate > dateValue)
				return false;
		}
		if (configs[2]) {
			var maxDateValues = configs[2].split('.');
			var maxDate = new Date(maxDateValues[2], maxDateValues[1], maxDateValues[0]);
			if (maxDate < dateValue)
				return false;
		}
		
		return true;
	},
	
	validateList:function (field, config) {
		var values = config.split(',');
		return values.indexOf(field.value) != -1;
	},
	
	validateRegex:function (input, config) {
		return config[1].test(input);
	},
	
	validateCreditCard:function (field, config) {
		return this.validateRegex(field.value, new Array('', /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/));
	},
	
	validateEmail:function (field) {
		return this.validateRegex(field.value, new Array('', /^[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+\.[a-zA-Z]{2,6}$/));
	},
	
	switchFieldState:function (field, fieldId, isValid, type){

    if (isValid){
        
			if (type == 'date') {
				$('#'+field.id+'day')[0].className = field.className.replace(/error/g, '');
				$('#'+field.id+'month')[0].className = field.className.replace(/error/g, '');
				$('#'+field.id+'year')[0].className = field.className.replace(/error/g, '');
			}
			field.className = field.className.replace(/error/g, '');
			this.removeErrorMessage(fieldId, type);
		}
		else {
		  
			
				if (type == 'date') {
					$('#'+field.id+'day')[0].className = field.className + ' error';
					$('#'+field.id+'month')[0].className = field.className + ' error';
					$('#'+field.id+'year')[0].className = field.className + ' error';
				}
				field.className = field.className + ' error';

				this.addErrorMessage(field, fieldId, type);
			
		}
	},
	
	addErrorMessage:function (field, fieldId, messageType) {
		//fid = this.getFieldId(field.id);
	
		if ($('#'+this.getFullFieldId(fieldId) + '-error')[0] == null) {
			msg = this.config[fieldId].errorMessages[messageType];
			$(field).parent().append('<div id="' + this.getFullFieldId(fieldId)+ '-error' + '" class="error">'+ msg + '</div>');
		}
	},
	
	removeErrorMessage:function (fieldId) {
		//console.log($('#'+this.getFullFieldId(fieldId) + '-error')[0]);
		if ($('#'+this.getFullFieldId(fieldId) + '-error')[0] != null)
			$($('#'+this.getFullFieldId(fieldId) + '-error')[0]).remove();
	},
	
	getFieldId:function(field) {
		return field.replace(this.form + "-", '');
	},
	getFullFieldId:function(field) {
		return this.form + "-" + field;
	}
});

var FormUtils = $.inherit({
	addTableRow : function (id,config) {
		var tbody = $$("#"+id +" tbody")[0];
		var newRow = Builder.node('tr');
		
		var trLen = $$("#"+id +" tbody tr").length;
		var tr = $$("#"+id +" tbody tr")[0];
		
		var newTr  = tr.cloneNode(true);
		newTr.className = 'tmp-newRow';
		tbody.appendChild(newTr);
		
		var tdEl = $$("#"+id +" tbody tr.tmp-newRow td");
		for ( var i = 0; i < tdEl.length; i++) {
			tdEl[i].innerHTML = tdEl[i].innerHTML.replace(/\[0\]/g,"["+trLen+"]");
			tdEl[i].innerHTML = tdEl[i].innerHTML.replace(/error/g,"");
		}
		
		var inpEl = $$("#"+id +" tbody tr.tmp-newRow input");
		for ( var i = 0; i < inpEl.length; i++) {
			inpEl[i].value = "";
		}
		$$("#"+id +" tbody tr.tmp-newRow")[0].className = "";
		
		
	},
    
   	 setBlank : function(element,label) {
		if ($(element).attr("value") == label) {
			$(element).attr("value", "");
		}
	},
	setDefault : function(element,label) {
		if ($(element).attr("value") == "") {
			$(element).attr("value",label);
		}
	},
	
	setBlankPassword : function(element,label) {
		element.type = "password";
		this.setBlank(element,label);
	},
	
	setDefaultPassword : function(element,label) {
		//element.type = "text";
		this.setDefault(element,label);
	},
	
	addSampleFormValue : function (id,config) {
		var newVals = [], dispVals = [];
		var inpEl = $$("#"+id +" tr td input");
		for ( var i = 0; i < inpEl.length; i++) {
			newVals.push([inpEl[i].name,inpEl[i].value]);
			dispVals.push(inpEl[i].value);
			inpEl[i].value = "";
		}
		
		var valLen=0;
		if ($$('#'+config.config.addNewTarget + ' ul li').length > 0) {
			valLen = parseInt($$('#'+config.config.addNewTarget + ' ul li').last().id.split("-").last())+1;
		}else{
			valLen = 1;
		}
		
		if ($$('#'+config.config.addNewTarget + ' ul').length == 0) {
			var sampleList = Builder.node('ul');
			var sampleListLi = Builder.node('li',{id : id+"-"+valLen});
			sampleListLi.innerHTML = '<div style="float: left;">'+dispVals.join(", ")+'</div>';
			sampleList.appendChild(sampleListLi);
			
			$(config.config.addNewTarget).appendChild(sampleList);
		}else{
			$$('#'+config.config.addNewTarget + ' ul')[0];
			var sampleListLi = Builder.node('li',{id : id+"-"+valLen});
			sampleListLi.innerHTML = '<div style="float: left;">'+dispVals.join(", ")+'</div>';
			$$('#'+config.config.addNewTarget + ' ul')[0].appendChild(sampleListLi);
		}
		var utName = id.split("-")[0];
		sampleListLi.innerHTML += '<a href="javascript:'+utName+'util.removeSampleFormValue(\''+id+'\',\''+valLen+'\',\''+config.config.addNewTarget+'\');">'+config.config.deleteIcon+'</a><div style="clear: both;"></div>';
		
		for ( var i = 0; i < newVals.length; i++) {
			var hName = newVals[i][0].replace(/\[0\]/g,"["+valLen+"]");
			var tmpInput = Builder.node('input',{type : 'hidden',name : hName, id : hName, value: newVals[i][1]});
			$(config.config.addNewTarget).appendChild(tmpInput);
		}
		
		
		
		//if($$('#'+config.config.addNewTarget + ' ul').length);
	},
	
	removeSampleFormValue : function (id,num,valueContainer) {
		$(id+"-"+num).parentNode.removeChild($(id+"-"+num));
		
		if($$('#'+valueContainer + ' ul li').length == 0){
			$(valueContainer).removeChild($$('#'+valueContainer + ' ul')[0]);
		}
		
		var inpEl = $$("#"+id +" tr td input");
		for ( var i = 0; i < inpEl.length; i++) {
			var hName = inpEl[i].id.replace(/\[0\]/g,"["+num+"]");
			$(hName).parentNode.removeChild($(hName));
		}
	}
    

    
});

/*
 * generates summary/ confirmation info based on formIdvalidator.data
 */
function eventRegistrationSum() {
    var noswitch = true
    eventRegistrationvalidator.validateSubpart('subPartTwo', noswitch);
    eventRegistrationvalidator.validateSubpart('subPartOne', noswitch);
    var data = eventRegistrationvalidator.formData;
    
    
    var participant = $('#eventRegistration-gender :selected').text() + ' ' + data.first_name + ' '+ data.last_name;
    participant = participant +  '<br />' + data.address + '<br />'+ data.zip + ' ' + data.city + '<br/>' +$('#eventRegistration-country :selected').text();
    if(data.company != 'Firma') participant = data.company +'<br/>'+participant;
    $('#summaryPart .content').html(participant);
    
    
    if(data.invoice_address_check == "1"){
      var invoiceaddress = data.address + '<br />'+ data.invoice_zip + ' ' + data.invoice_city + '<br/>' +$('#eventRegistration-invoice_country :selected').text();
      $('#summaryInv .content').html(invoiceaddress);
      $('#summaryInv').css('display','block');
    }
    else{
      $('#summaryInv').css('display','none');
    }

    if(data.member_check == "1" && $(".event_"+$("#eventRegistration-event").val()).children('.membersprice').length) {
      $('.membersprice').css('display','block');
      $('.price').css('display','none');
    }
    else{
      $('.membersprice').css('display','none');
      $('.price').css('display','block');
    }
    
    var anzahl = $('#eventRegistration-participants :selected').text()+'<br/><br/>';
    $('#summaryEvent .content').html(anzahl);
    

        
    return false;
    }
/*
 * woow
 */
function updateCheckboxValue(id, value, checked) {

	var tmp = $('#'+id);
	if (checked)
		tmp.val(tmp.val()*1 + value);
	else
		tmp.val(tmp.val()*1 - value);

}
