/**
*	Validator Klasse zum validieren der Formularfelder 
*	welche über ein XML configuriert werden.
*
*	autor: René Penner penner@comspace.de
*	date : 04.09.2008
*/
var Validator = new Class(
{

	Implements: Events,
	
	options: {
		baseurl:		'https://' + document.location.host + '/eneronline_rc2/',
		xmlfile:		'validconfig.xml',
		requestHandler:	'handleRequest.php',
		formidField: 	'formid',
		channelIdField:	'channelid'
	},

	errors: [],

	init: function()
	{
		this.options.dataurl = this.options.baseurl + 'data/';		
		
		this.formid 	= $$('input[name='+this.options.formidField+']')[0].value;
		this.channel	= $$('input[name='+this.options.channelIdField+']')[0].value;
		this.data 		= this.getDataFromXml();		// Speichert das XML als Objekt
	
		this.form =  $$('form[name=bestellung]')[0];	
		this.form.addEvent('submit', this.validate.bind(this));
		
		this.initBackButton();
	},
	
	initBackButton: function()
	{
		if($('backbutton') != null){
			$('backbutton').addEvent('click', function(){
				this.form.removeEvents('submit');
			});
		}
	},
	
	validate: function()
	{
		this.errors = [];	
		this.data.each(function(item, index){
			obj = this.form[index];
			var breakforeach = false;						
			item.each(function(item2){
				if(! breakforeach){
					var params = item2.type.split('=');					
					var type = params[0];
					var parm = params[1] == 'undefined' ? null : params[1];

					if(typeof(this['check_'+type]) != 'function'){
						alert('ERROR: No Valid Function check_'+type+' found.');
					}else{
						if(!this['check_'+type](obj, parm)){
							this.errors.extend( [ new Hash( {field: index, type: type, parm: parm, msg: item2.msg} ) ] );
							breakforeach = true;
						}
					}
				}
			}.bind(this));		
		}.bind(this));
		if(this.errors.length > 0){
			this.fireEvent('error');
			return false;
		}else{
			return true;
		}
	},
	
	getDataFromXml: function()
	{
		var myAjax = new Ajax(); 
		var json = xml2json.parser(myAjax.getData(this.options.dataurl + this.options.xmlfile));
		var temp = json.validator.validation.filter(this.dataFilter, this);
		var data = new Hash();
		if(temp.length != 0){
			if(typeof(temp[0].valid.length) == 'undefined'){
				data.include(temp[0].valid.field, [new Hash({type: temp[0].valid.type, msg: temp[0].valid.msg})]);
			}else{
				temp[0].valid.each(function(item){
					var myHash = new Hash({type: item.type, msg: item.msg})
					if(data.get(item.field) == null)
						data.include(item.field, [myHash]);
					else
						data[item.field].extend([myHash]);		
				});
			}
		}
		return data;
    },
    
    dataFilter: function(item){
    	if(item.channel == this.channel && item.id == this.formid){    		
    		return item;
    	}
    },

	// DIE VALIDATOREN
	
	ajax_validator: function(method, parms){
	    var parm = '';
	    parms.each(function(item, index){
	    	parm = parm + '&' + index + '=' + item;
	    });
	    var myAjax = new Ajax();
    	var res = myAjax.getData( this.options.baseurl + this.options.requestHandler + '?method='+method+parm);
    	return res == 'true';
	},

   	check_req: function(obj, parm){
    	if($type(obj) == 'collection'){    		
    		var mybool = false;
    		for(i=0;obj.length>i;i++){
    			if(obj[i].checked)
    				mybool = true;
    		}
    		return mybool;
    	 }else{
    	 	if(obj.type == "checkbox")
    	 		return obj.checked;
    	 	else
    	 		if(typeof(parm) != 'undefined'){
    	 			
    	 			if(document.forms['bestellung'].elements['channelid'].value == 'rechner'){    	 				
    	 				if(parm == 'electricity' && obj.id == 'gas') 
    	 					return true;
    	 			}
    	 			
    	 			if($(parm).value.test(/^.{1,}$/)){    	 				
    	 				return true
    	 			}else{
    	 				return obj.value.test(/^.{1,}$/);
    	 			}
    	 		}else{    	 		
    	 			return obj.value.test(/^.{1,}$/);
    	 		}
    	 }
    },
    
    check_regexp: function(obj, parm){
    	return obj.value.test(eval(parm));
    },
    
    check_num: function(obj, parm){
    	if(obj.value == '')
			return true;
		return obj.value.test(/^[0-9]*$/);
    },
    
    check_minlen: function(obj, parm){
		if(obj.value == '')
			return true;
   		return obj.value.test( eval('/^.{'+parm+',}$/') );
    },
    
    check_maxlen: function(obj, parm){
		if(obj.value == '')
			return true;
   		return obj.value.test( eval('/^.{,'+parm+'}$/') );
    },
    
    check_lt: function(obj, parm){
    	return parseInt(obj.value) < parm;
    },
    
    check_gt: function(obj, parm){
    	if(obj.value.test(/^.{1,}$/))
    		return parseInt(obj.value) > parm;
    	else
    		return true;
    },

    check_inplzrange: function(obj, parm){
    	return this.ajax_validator('plzinrange', new Hash({plz: obj.value}));
    },
    
    check_dateformat: function(obj, parm){
    	return obj.value.test(/^([0-9]{2})(\.)([0-9]{2})(\.)([0-9]{4})$/);    	
    },
    
    check_olderthen: function(obj, parm){
    	return this.ajax_validator('olderthan', new Hash({years: parm, value: obj.value}));
    },
    
    check_email: function(obj, parm){
    	return obj.value.test(/^([a-zA-Z0-9_\-])+(\.([a-zA-Z0-9_\-])+)*@((\[(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))\]))|((([a-zA-Z0-9])+(([\-])+([a-zA-Z0-9])+)*\.)+([a-zA-Z])+(([\-])+([a-zA-Z0-9])+)*))$/); 	
    },
    
    check_doppeltarifzaehler: function(obj, parm){
    	for(i=0;obj.length>i;i++){
   			if(obj[i].checked && obj[i].value == 'ja')
   				return false; 
   		}
    	return true;	
    } ,
    
    check_lifertermin: function(obj, parm){
    	var past = false;
    	$$('input[name=past]').each(function(item){
    		if(item.value == 'ja')
    			past = item.checked;
    	});
    	return this.ajax_validator('lifertermin', new Hash({date: obj.value, kunde: parm, past: past}));
    },
    
    check_login: function (obj, parm){
    	return true; // wird vom Server gecheckt
    },
    
    check_reqRelaltionBi: function(obj, parm){
    	if($('ortinfo').innerHTML == 'Bielefeld'){
	    	if($type(obj) == 'collection'){
	    		for(var i=0;i<obj.length;i++){
	    			if(obj[i].checked) return true;
	    		}
	    		return false
	    	}
	    }
	    return true;
    },
    
    check_blz: function (obj, parm){
		if(obj.value == '')
			return true;
    	return this.ajax_validator('checkblz', new Hash({blz: obj.value}));;
    }
    
});

// SWB errorHandler
var ErrorHandler = new Class(
{
	handler: function()
	{
		$('formmessage').empty();
		$('formmessage').setStyle('border', '0px solid #f7c100');
		
		$$('dt[class=warningBackground]').removeClass('warningBackground');
		
		
		
		this.errors.each(function(item){			
			item.msg = item.msg.replace(/&lt;/g, '<').replace(/&gt;/g, '>');				
			var myWarn = '<label class="warning" for="' + item.field + '">' + item.msg + '</label>';
			$('formmessage').innerHTML = $('formmessage').innerHTML + myWarn;			
			
			var obj = this.form[item.field];
			
			if(obj == 'undefined'){
				alert('fobar');
			}
			
			if($type(obj) == 'collection'){
				for(var i=0;i<obj.length;i++){
					if($(obj[i]).getParent('dd'))				
						$(obj[i]).getParent('dd').getPrevious('dt').addClass('warningBackground');
				}
			}else{
				if($(obj).getParent('dd')){
					$(obj).getParent('dd').getPrevious('dt').addClass('warningBackground');
				}				
			}			
			
		}.bind(this));
		if(this.errors.length > 0)
			$('formmessage').setStyle('border', '1px solid #f7c100');
			$('formmessage').setStyle('padding', '10px');
	}
});

// init
window.addEvent('domready', function() {
	var valid 	= new Validator();
	var handler = new ErrorHandler()
	valid.init();
	valid.addEvent('error', handler.handler);
});