function validate_on_input(elem, regexp) {
    var value = elem.value;
    var newvalue = value.match(regexp);
    if(newvalue == null) {
        elem.value = "";
        window.status = "Zeichen war nicht erlaubt!";
    }
	else if(newvalue[0] == value) {
        window.status = "OK";
        return true;
	 }
    else  { // if (newvalue != null) {
        elem.value = newvalue[0];
        window.status = "Zeichen war nicht erlaubt!";
    }    
    return false;
}

function validate_on_submit(elem, regexp) {
    var value = elem.value;
    var newvalue =  value.match(regexp);
	 if(newvalue == value) {
        return true;
	 }
    return false;
}

function validate_float(elem, clamp_min, clamp_max, decimal) {
    value = elem.value;
    regexp = /[+-]?\d+[,.]?\d*/;
    match = value.match(regexp);
    value = value.replace(/\./g, '');
    value = value.replace(/,/g, '.');
    floatvalue = parseFloat(value);
    decimalOK = true;

    if (value.lastIndexOf('.') > 0) {
        decimalOK = (value.substring(value.lastIndexOf('.') + 1, value.length).length <= decimal);
    }

    if (match && (floatvalue >= clamp_min) && (floatvalue <= clamp_max) && decimalOK) {
        window.status = value + " entspricht den Bedingungen. (" + floatvalue + ")";
        return floatvalue;
    } else {
        window.status = value + " entspricht den Bedingungen NICHT.";
        return false;
    }
}

//#############################################################################
// Wrapper - Common Cases

function validate_on_input_posint(elem) {
    return validate_on_input(elem, /\d+/);
}

function validate_on_input_int(elem) {
    return validate_on_input(elem, /[+-]?\d*/);
}

function validate_on_input_float(elem) {
   // return validate_on_input(elem, /[+-]?\d*[,.]?\d*/);
    return validate_on_input(elem, /^[+-]\d*(\.\d\d\d)*(\.\d{0,2})?(,\d*)?/);
}

function validate_on_input_posfloat(elem) {
    //log('elem: ' + elem.value);
    // stimmt so fast - nur 123., waere noch erlaubt
    return validate_on_input(elem, /^\d*(\.\d\d\d)*(\.\d{0,2})?(,\d*)?/);
//    return validate_on_input(elem, /\d+[,.]?\d*/);
}

function validate_on_input_date(elem) {
	// 1. variante
	// erst mal schauen ob mit ., oder / oder -
	var val = elem.value;
	var idx = val.indexOf('.'); 
	if( idx > -1) {
		// dd.MM.yyyy
		if(val.length > (idx +1 )) {
			if(val.indexOf('.',idx+1) > -1) {
			    return validate_on_input(elem, /^(\d{1,2}\.){2,2}\d{0,4}/);
			}
		}
	    return validate_on_input(elem, /^(\d{1,2}\.)\d{0,2}/);
	}
	else {
		idx = val.indexOf('/'); 
		if( idx > -1) {
			if(val.length > (idx +1 )) {
				//  dd/MM/yyyy
				if(val.indexOf('/',idx+1) > -1) {
					return validate_on_input(elem, /^(\d{1,2}\/){2,2}\d{0,4}/);
				}
			}
			return validate_on_input(elem, /^(\d{1,2}\/)\d{0,2}/);
		}
		else  {
			// ddMMyyyy
		    return validate_on_input(elem, /^\d{0,8}/);
		}
	}
}

function validate_on_input_time(elem) {
	// 1. variante
	// erst mal schauen ob mit ., oder / oder -
	var val = elem.value;
	var idx = val.indexOf('.'); 
	if( idx > -1) {
		// HH.mm
	    return validate_on_input(elem, /^(\d{1,2}\.)\d{0,2}/);
	}
	else {
		idx = val.indexOf(':'); 
		if( idx > -1) {
			// HH.mm
		    return validate_on_input(elem, /^(\d{1,2}\:)\d{0,2}/);
		}
		else  {
			// HHmm
		    return validate_on_input(elem, /^\d{0,4}/);
		}
	}
}


function validate_posfloat(elem) {
    return validate_float(elem, 0, Number.MAX_VALUE, 8);
}

function validate_email(elem) {
	var value = elem.value;
	if(value != '') {
		var suche = /.*@.*\...+/;
		return suche.test(value);
	}
	else {
		return true;
	}
}

function validate_on_submit_cambio_phone(elem) {
	// kann sein, dass wir altlasten aus cwo haben
	// die etwas anders formatiert sind
	
	var str = elem.value;
	str = str.replace(/ /g,'');
	str = str.replace(/\(/g,' (');
	str = str.replace(/\)/g,') ');
	elem.value = str;
    return validate_on_submit(elem, /^[+]\d\d\d?\s\(0\d+\)\s\d\d\d\d*/);
}

function validate_on_input_cambio_phone(elem) {
	// grobe Struktur sollte zumindest vorhanden sein
	var regexp = new Array();
	var cnt = 0;
	regexp[cnt++] = /[+]/;
	regexp[cnt++] =	/[+]\d/;
	regexp[cnt++] =	/[+]\d\d\d?/;
	regexp[cnt++] =	/[+]\d\d\d?\s/;
	regexp[cnt++] =	/[+]\d\d\d?\s\(/;
	regexp[cnt++] =	/[+]\d\d\d?\s\(0/;
	regexp[cnt++] =	/[+]\d\d\d?\s\(0\d*/;
	regexp[cnt++] =	/[+]\d\d\d?\s\(0\d+\)/;
	regexp[cnt++] =	/[+]\d\d\d?\s\(0\d+\)\s/;
	regexp[cnt++] =	/[+]\d\d\d?\s\(0\d+\)\s\d*/;
	
    //return validate_on_submit(elem, /[+]\d*\s?\(?\d*\)?\s?\d*/);
    return validate_on_input_progressiv(elem, regexp);
}

function validate_on_input_progressiv(elem, regexp) {
	if(!regexp || regexp.length < 1) {
		return true;
	}
    var value = elem.value;
    var lastgood = "";
    
    for(var i=0; i< regexp.length; ++i) {
	    var newvalue = value.match(regexp[i]);
		 if(newvalue == value) {
	    	//log(i + ' OK newvalue: ' + newvalue);
	        lastgood = newvalue;
		 }
	    else if (newvalue != null) {
	    	//log(i + ' Not quite newvalue: ' + newvalue);
	        lastgood = newvalue;
	    } else {
	        //elem.value = lastgood;
	    	//log(i + ' Not at all newvalue: ' + newvalue);
	        window.status = "Zeichen war nicht erlaubt!";
	    }
	}
    elem.value = lastgood;
	
    return true;
}


function validate_on_input_cambio_phone3(id) {
	var land = document.getElementById(id + '_land');
	validate_on_input_posint(land);
	var vorwahl = document.getElementById(id + '_vorwahl');
	validate_on_input_posint(vorwahl);
	var nummer = document.getElementById(id + '_nummer');
	validate_on_input_posint(nummer);

	var phone = document.getElementById(id);
	if(vorwahl.value == "" || !(vorwahl.value.substring(0,1) == '0')) {
		vorwahl.value = "0" + vorwahl.value;
	}
	phone.value='+' + land.value + ' (' + vorwahl.value + ') ' + nummer.value;
}

function split_cambio_phone3(val) {
	var str = val.replace(/ /g,'');
	var regex = /^[+](\d\d\d?)\((0\d+)\)(\d\d\d\d*)$/ ;
	var split = regex.exec(str);
	//log(val + " is not a cambio telephone number");
	//alert(split[1] + " " + split[2] + " " + split[3] ); 
	
	return split;
}

function init_new_cambio_phone3(oldid,id,defland) {

	var land = document.getElementById(id + '_land');
	var vorwahl = document.getElementById(id + '_vorwahl');
	var nummer = document.getElementById(id + '_nummer');


	if(!land || !vorwahl || !nummer) {
		return;
	}

	if(	land.value != '' 
		|| vorwahl.value != ''
		|| nummer.value != ''
		) {
		return;
	}
	
	
	var phone = null;
	if(oldid) {
		phone = document.getElementById(oldid);
	}
	
	if(phone) {
		var split = split_cambio_phone3(phone.value);
		if(split != null) {
			land.value = split[1];
			vorwahl.value = split[2];
			return;
		}
	}
	if(defland) {
		land.value = defland;
	}
}


