/* ***********************************************************************************************
 * Inline Form Validation Engine 1.0, jQuery plugin **********************************************
 * ***********************************************************************************************
 * Copyright(c) 2009, Daniel Benkenstein *********************************************************
 * http://www.danielbenkenstein.de ***************************************************************
 *	**********************************************************************************************
 * Licenced under the MIT Licence ****************************************************************
 * ******************************************************************************************** */

(function($) {
	
	$.fn.validator = function(options) {
		
		// build main options before element iteration
			var options = $.extend({}, $.fn.validator.defaults, options);
		
		//submit button
			$('#submit').click( function () {
				var form = $(this).parent().parent();
				$.fn.validator.submit(form);
			});
		
		// submit event
			$(this).submit( function () {
				var valid = $.fn.validator.defaults.valid;
				return valid;
			});

		// iterate and reformat each matched element
			var v = $('.validate');
			return v.each(function() {
				$this = $(this);
				var opt = $.meta ? $.extend({}, options, $this.data()) : options;
				var id = $this.attr('id');
				var n = $this.attr('name');
				var c = $this.attr('class');
				var t = getType(c);
				
				
				if(t=='select'||t=='radio'||t=='checkbox'){
					$this.change(function(e){
						var v = $(this).val();
						var loading = showLoadingIcon(t,v,id,n);
					});
				}
				else{
					$this.blur(function(e){
						var v = $(this).val();
						var loading = showLoadingIcon(t,v,id,n);
					});
				}
			});
	};
	
	function setSendStatus(state){
		$.fn.validator.defaults.sent = state;
	}
	

	//
	// plugin defaults ***********************************************************************************************
	//
	$.fn.validator.defaults = {
		valid: false,
		sent: false
	};
	
	//
	// validation methods ***********************************************************************************************
	//
	function showLoadingIcon(t, v, id, n, s){
		//Abbruch Bedingungen
			var p = $('#'+id).parent();
			if(!p.hasClass('success')&&!p.hasClass('error')&&!s){
				if(id=='street'||id=='streetnr'){
					var v1 = $('#street').val();
					var v2 = $('#streetnr').val();
					if(!v1||!v2) return false;
				}else if(id=='tel_areacode'||id=='tel_number'){
					var v1 = $('#tel_areacode').val();
					var v2 = $('#tel_number').val();
					if(!v1||!v2) return false;
				}else if(id=='zipcode'||id=='city'){
					var v1 = $('#zipcode').val();
					var v2 = $('#city').val();
					if(!v1||!v2) return false;
				}else if(id=='dayofbirth'||id=='monthofbirth'||id=='yearofbirth'){
					var v1 = $('#dayofbirth').val();
					var v2 = $('#monthofbirth').val();
					var v3 = $('#yearofbirth').val();
					if(!v1||!v2||!v3) return false;
				}
			}
		//Loading anzeigen
			format(id,'load',t,n);
			setTimeout("$.fn.validator.validationSpecials('"+t+"', '"+v+"', '"+id+"', '"+n+"', '"+s+"')",300);
			return true;
	}
	
	$.fn.validator.validationSpecials = function(t, v, id, n, s){
		var check;		
		if(id=='street'||id=='streetnr')
			check = validateStreet(t,v,id,n,s);
		else if(id=='tel_areacode'||id=='tel_number')
			check = validatePhone(t,v,id,n,s);
		else if(id=='dayofbirth'||id=='monthofbirth'||id=='yearofbirth')
			check = validateBirthday(t,v,id,n,s);
		else if(id=='email'){
			check = validateEmail(t,v,id,n,s);
		}
        else if(id=='zipcode'||id=='city')
			check = validateZipcode(t,v,id,n,s);
        else if(id=='land')
			check = validateCountry(t,v,id,n,s);
		else //default
			check = validate(t,v,id,n);
        return check;
	}


	//
	// private function validate(type:string, value:string, id:string, name:string) ***********************************************************************************************
	// 
	function validate(t, v, id, n) { // 
		var state = true;
		
		//Type
		switch(t) {
			case 'name':
				var reg_exp = v.match(/^\D*(\d\D*){1,2}$/,"gi");
				(reg_exp) ? state=false : state=true; 
				var m = 2;
				break;
			case 'nonumber':
                var reg = v.match(/^\[a-zA-Z+-._]+$/,"g");
                (reg==null) ? state=false : state=true;
				break;
            case 'email':
				var r = new RegExp("[a-zA-Z0-9+%-._]+@[a-zA-Z0-9.\\-_]+\\.[a-zA-Z]{2,4}","g");
				var m = 5;
				break;
			case 'number':
				var r = new RegExp("[0-9]","g");
				break;
			case 'zipcode':
				var r = new RegExp("[A-PR-UWYZ][A-HK-Y0-9][A-HJKSTUW0-9]?[ABEHMNPRVWXY0-9]? *[0-9][ABD-HJLN-UW-Z]{2}", "i");
				break;
			case 'select':
				var chk = $('#'+id).val();
				(chk=='') ? state=false : state=true;
				break;
            case 'checkbox':
				var chk = $('input:checked[name='+n+']:checked').val();
				(chk==undefined) ? state=false : state=true;
				break;
			case 'radio':
				var chk = $('input:radio[name='+n+']:checked').val();
				(chk==undefined) ? state=false : state=true;
				break;
			case 'text':
				var m = 2;
				break;
		}
		
		//Überprüfung
		if (state && m) {
			if (v.length>=m){ state = true; }
			else{ state = false; }
		}
		if (state && r) {
			if (r.exec(v)){ state = true; }
			else{ state = false; }
		}
		
		format(id,state,t,n);	
		return state;
	};
	
	
	//
	// Special Validations ***********************************************************************************************
	//
	function validateStreet(t,v,id,n,s) {
		var state = false;
		var v1 = $('#street').val();
		var v2 = $('#streetnr').val();
        var reg1 = v1.match(/^[a-zA-Z+%-._ßöäüÖÄÜ.\s]+$/,"g");
        var reg2 = v2.match(/^[0-9]/,"g");
		(v1.length>2 && v2.length>0 && reg1 && reg2) ? state = true : state = false;
		format(id,state,t,n);
		return state;
	};
	
	function validatePhone(t,v,id,n,s) {
		var state = false;
		var v1 = $('#tel_areacode').val();
		var v2 = $('#tel_number').val();
        var reg = v1.match(/^\+?[0-9]+$/,"g");
        (v1.length>1 && v2.length>2 && reg && !isNaN(v2)) ? state = true : state = false;
        format(id,state,t,n);
		return state;
	};
	
	function validateBirthday(t,v,id,n,s) {
		var state = false;
		var v1 = $('#dayofbirth').val();
		var v2 = $('#monthofbirth').val();
		var v3 = $('#yearofbirth').val();
        var p = $('#'+id).parent();

		(v1.length>0 && v2.length>0 && v3.length==4 && !isNaN(v1) && !isNaN(v2) && !isNaN(v3)) ? state = true : state = false;
		
		if(state){ //Mindestalter 18 prüfen
			$.ajax({
				type: "POST",
				async: false,
				url: "/cgi-bin/wingame_precheck.pl",
				data: "todo=check_birthday&monthofbirth="+v2+"&yearofbirth="+v3+"&dayofbirth="+v1,
				success: function(msg){
					(msg=='true') ? state = true : state = false;
					format(id,state,t,n);
				}
			});
		}
		else{
			format(id,state,t,n);
		}
        return state;
	};
	
	function validateEmail(t,v,id,n,s) {
		var state = false;
		$.ajax({
			type: "POST",
            async: true,
			url: "/cgi-bin/wingame_precheck.pl",
			data: "email="+v+"&todo=check_email",
			success: function(msg){
				(msg=='true') ? state = true : state = false;
				format(id,state,t,n);
			}
		});
		return state;
	};
    
    function validateZipcode(t,v,id,n,s){
        var state = false;
        var v1 = $('#zipcode').val();
		var v2 = $('#city').val();
        var v3 = $('#land').val();
		var reg1 = v2.match(/^[a-zA-Z+ßöäüÖÄÜ]/,"g");
        
        (v1.length>3 && v2.length>1 && !isNaN(v1) && reg1) ? state = true : state = false;
        format(id,state,t,n);
        
        if(state && v3){
            return validateZipcodeForCountry(v1,v3);
        }
        return state;
    }
    
    function validateCountry(t,v,id,n){
        var state = false;
        var v1 = $('#zipcode').val();
		var v2 = $('#city').val();
        var v3 = $('#land').val();
        
        state = validate(t,v,id,n);
        format(id,state,t,n);
        
        if(state && v1 && v2){
            validateZipcodeForCountry(v1,v3);
        }        
        return state;
    }
    
    function validateZipcodeForCountry(v1,v3) {
		var state = false;
        format('city','load','text');
        $.ajax({
            type: "POST",
            async: true,
            url: "/cgi-bin/wingame_precheck.pl",
            data: "todo=check_zipcode&land="+v3+"&zipcode="+v1,
            success: function(msg){
                (msg=='true') ? state = true : state = false;
                format('city',state,'text');
            }
        });        
		return state;
	};
	
	
	//
	// Formatierung ***********************************************************************************************
	//
	function format(id, state, t, n){		
		var area = $('#'+id).parent();
		var i = id.indexOf('_');
		var uid; (i==-1) ? uid=id : uid=id.substr(0,i);
		var status = area.find('.status');
		var db = $('#db');
		
        if(state=='load'){
            area.addClass('loading');
			area.removeClass('success');
            area.removeClass('error');
        }
		else if(!state){
			if (uid == 'agb') area.addClass('error_big');
			else area.addClass('error');
			area.removeClass('success');
            area.removeClass('loading');
			$.fn.validator.defaults.valid = false; //globales flag
		}
		else{
			area.addClass('success');
			if (uid == 'agb') area.removeClass('error_big');
			else area.removeClass('error');
            area.removeClass('loading');
		}
		
		//1.Aufruf
		if(status.css('visibility')=='hidden'){
			status.html('<span>'+status.html()+'</span>');
			status.css('visibility','visible');
		}
	}

	function getType(c){
		var t;
		if(c.indexOf('email')!=-1) t='email';
		else if(c.indexOf('zipcode')!=-1) t='zipcode';
		else if(c.indexOf('number')!=-1) t='number';
        else if(c.indexOf('nonumber')!=-1) t='nonumber';
		else if(c.indexOf('name')!=-1) t='name';
		else if(c.indexOf('radio')!=-1) t='radio';
        else if(c.indexOf('checkbox')!=-1) t='checkbox';
		else if(c.indexOf('select')!=-1) t='select';
		else t='text';
		return t;
	}
	
	//
	// debugging ***********************************************************************************************
	//
	function debug(output) {
		if (window.console && window.console.log) window.console.log(output);
	};

	//
	// submit function and final validation ***********************************************************************************************
	//
	$.fn.validator.submit = function(form) {
		var v = $('.validate');
		v.each(function(e) {
			var $this = $(this);
			var id = $this.attr('id');
			var c = $this.attr('class');
			var n = $this.attr('name');
			var t = getType(c);
			var v = $this.val();
			var loading = showLoadingIcon(t,v,id,n,true);
		});
		
		$.fn.validator.finalCheck(form,0);		

	};
	
	$.fn.validator.finalCheck = function(form,x) {
		var lo = $('.loading');
		if(lo.size()>0){ //wenn noch geladen wird, kurz warten
			x++;
			submit_timer = setTimeout("$.fn.validator.finalCheck('"+form+"','"+x+"')",300);
		}
		else{
			var err = $('.error');
			var err_big = $('.error_big');
			if(err.size()>0 || err_big.size()>0){ //Fehler anzeigen
				debug(err.size() + " Fehler");
				$.fn.validator.defaults.valid = false;
			}
			else{  //Keine Fehler, Formular kann gesendet werden
				debug("Keine Fehler, Formular kann gesendet werden");
				$.fn.validator.defaults.valid = true;
				$('#form_master').submit();
				return true;
			}
		}
		$.fn.validator.defaults.valid = false;
		return false;
	};


})(jQuery);
