/*****************************************************************************
	validator.js
	Die Klasse stellt Grundroutinen für die Validierung von Formularen zur Verfügung
	Teilweise auf die Verwendung innerhalb von flightonline spezialisiert.
	
	Online Travel AG - sma
	Letzte Aktualisierung 12.02.09 
*****************************************************************************/


/*****************************************************************************
- Ausnahme: Phonecheck ist auf flight angepasst: Es werden alle Felder, 
  die mit phone beginnen gesucht mindestens eines davon muss eine gültige Nummer aufweisen
- man kann eine Kreditkarten Validierungs funktion mitgeben, 
	wenn nicht wird kein check durchgeführt.
	Sie wird mit zwei Parameternaufgerufen: der Nummer und der Form. 
	Somit muss der Validator nicht wissen wie das Feld mit dem CC-Typ benannt 
	ist. Die mitgegebene Funktion muss diesen selber ermitteln.
	Die Funktion muss 0 im Erfolgsfall liefern
*****************************************************************************/
var Validator = function(theForm, check_cc_number, error_border_style) { 
	this.form = theForm;
	this.check_cc_number = check_cc_number || this.cc_no_check;
	this.num_errors = 0;
	this.error_border_style = error_border_style || '1px solid #ff0000';
};

Validator.prototype = {
	/* if num is given, fieldname and num  will be concatenated. (field = 'title' , num =2 -> checks title2) */
	check_fields_in_array: function(field_array, num) {
		var ext = ''; 
		if(arguments.length == 2)  {
			ext = String(num);
		}
		for (var i = 0; i < field_array.length; i++) {
			var field = field_array[i].field + ext;
			var element = this.form.elements[field];
			if (element) {
				var type = 	field_array[i].type;
				if(!this.check_field(element, field_array[i].type)) {
					this.push_error(element, field_array[i].type, field_array[i].msg);
					this.num_errors++;
					/* at the moment we break after the first error); */
					return(false);
				} 
				else {
					this.clear_error(element, type, field_array[i].borderstyle);
				}
			}
		}
		return(true);
	},
	check_field: function(element, type) {
		switch (type) {
	        case "text":
	        case "password": 
	        case "textarea":
	       		if (element.value == "") {
		        	return (false);
				} 
	        	break;
	        case "select-one":
		        if ($(element).value == "" || $(element).value == '0') {
		        	return (false);
				} 
	        	break;
	        case "checkbox": 
	        	if (!element.checked) {
	            	return (false);
	            }
	            break;
			case "select-multiple":
	        	if (element.selectedIndex < 0) {
	              return (false);
	            }
	            break;
			case "radio":
				if(getCheckedValue(element) == 'undefined') {
					return (false);
				}
				break;
			case "email":
				return(this.check_email(element.value));
				break;
			case "phone":
				return(this.check_phone(element.value));
				break;
			case "cc-number":
				if(this.check_cc_number) {
					return(this.check_cc_number(element.value, this.form) == 0); // gibt 0 bei Erfolg zurück damit man die Ursache im Fehlerfalls besser aufbröseln kann
				}
				break;
		}
		return(true);
		
	},
	push_error: function(element, type, msg) {
		switch (type) {
			case "text":
	        case "password": 
	        case "textarea":
	        case "email": 
	        case "phone": 
	        case "checkbox": 
	        case "cc-number":
		        element.style.border = this.error_border_style;
		        element.focus();
	        	break;
	        case "select-one":
	        	//element.style.backgroundColor = '#ff0000';
	        	element.style.border = this.error_border_style;
		        element.focus();
	        	break;
			case "radio":
				element[0].style.border = this.error_border_style;
		        element[0].focus();
				break;
		}
		alert(msg);
		return(false);
	},
	clear_error: function (element, type, org_style) {
		try {
			if(type == 'radio') {
				element[0].style.border = org_style;
				if (Prototype.Browser.IE) element[0].removeAttribute('style');
			}
			else {
				element.style.border = org_style;
				if (Prototype.Browser.IE) element.removeAttribute('style');
			}
		}
		catch(e) {;}
	},
	/* remember original style  */
	get_org_styles: function (field_array, num) {
		var ext = ''; 
		if(arguments.length == 2)  {
			ext = String(num);
		}
		for (var i = 0, len = field_array.length; i < len; i++) {
			var field = field_array[i].field + ext;
			var e = null;
			if (field_array[i].type == 'radio') e = this.form.elements[field][0];
			else e = this.form.elements[field];

			if (e) field_array[i].borderstyle = e.style.border;
		}
	},
	check_email:  function (email) {
		var usr = "([a-zA-Z0-9][a-zA-Z0-9_.-]*|\"([^\\\\\x80-\xff\015\012\"]|\\\\[^\x80-\xff])+\")";
		var domain = "([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}";
		var regex = "^"+usr+"\@"+domain+"$";
		var myrxp = new RegExp(regex);
		return (myrxp.test(email));
	},
	check_phone:  function (phone) {
		var allowed = "01234567890 '/()-+";
		if(phone.length < 5)  return (false);
		for (var i = 0, len = phone.length; i < len; i++) {
   	 		if (allowed.indexOf (phone.charAt(i)) < 0) return (false);
		}
		return (true);
	}, 
	cc_no_check:  function (arg1, arg2) {
		return 0; // muss bei Erfolg 0 liefern
	}
	
};

