var jpForm = null;

function jpDefaultValidation(myform) {
	jpForm = document.forms[myform];
	var n = jpForm.elements.length;
	var errorMsg = '';
	for (var i = 0 ; i < n ; ++i)
	{
		var element = jpForm.elements[i];
		var tmpError = '';
		if (element.getAttribute("jprequired") == 'true') {
			try {
				var test = new jpIsRequired();
				test.check(element);
				
			} catch (err) {
				tmpError += err + '\n';
			}
		}

		var jpvalidation = element.getAttribute("jpvalidation");
		if (jpvalidation) {
			try {
				var test = eval('new ' + jpvalidation);
				test.check(element);
			} catch (err) {
				tmpError += err + '\n';
			}
		}
		
		if (tmpError.length > 0) {
			
			errorMsg += '*   ' + element.getAttribute("jpLabel") + '\t ' + tmpError ;
		}
	}
	if (errorMsg.length > 0)
	{	
		alert(jpDefaultValidation.errorMessage() + errorMsg);
		return false;
	}
	else
		return true;
}

jpDefaultValidation.errorMessage = function() {
	var language = jpForm.getAttribute("jplanguage");
	/*Modificata pe runa richiesta specifica di OSRAM*/
	if (language == 'ITA')
		//return "Attenzione!\nPer continuare è necessario soddisfare i seguenti requisiti:\n\n";
		return "Attenzione prego.\nPer inviare i dati è necessario compilare i seguenti campi obbligatori:\n\n";
	else 
		return "Attention!\nPlease control the field:\n\n";
}


function jpIsRequired() {
}

jpIsRequired.prototype.check = function(element) {

	var s = element.value;

	if (s.length && (s.trim() != ""))
		return element;
	else
		throw this.errorMessage();
}

jpIsRequired.prototype.errorMessage = function() {
	var language = jpForm.getAttribute("jplanguage");
	/*Modificata per una richiesta specifica di OSRAM*/
	if (language == 'ITA')
//		return "obbligatorio";
		return "";
	else 
		return "required";
}

function jpIsNumber(length) {
	this.length = length;
}

jpIsNumber.prototype.check = function(element) {
	var s = element.value;
	if (isNaN(s))
		throw "jpIsNumber";
	else {
		if (this.length != null)
			if ((new Number(s)) > (Math.pow(10,this.length)-1))
				throw "jpIsNumber L";
			
		return element;
	}
}




function jpIsZipCode() { 
}

jpIsZipCode.prototype.check = function(element) {
	var s = element.value;
	if ((s != null) && (s != "")) {
		var a = s.match(/\d{5}(-?\d{4}){0,1}/g);
		if (a != null && a.length)
			return element;
		else
			throw new Error("jpIsZipCode");
	}
}

jpIsZipCode.prototype.errorMessage = function() {
	var language = jpForm.getAttribute("jplanguage");
	if (language == 'ITA')
		return "Formato errato";
	else 
		return "Format error";
}

function jpIsCardNumber() {
}

jpIsCardNumber.prototype.check = function(element) {
	var s = element.value;
	s = s.replace(/\D+/g, '');
	
	var p=0, e=8, t=0, c=[], r=0, l=0, i;
	if (s.length != 16) {
		t = 1;
		e = s.length == 13 && 6 || s.length == 15 && 7;
	}
	for (i=p; i<e; i++)
		r += (c[i] = s.charAt(i*2+t) * 2) > 9 ? Math.floor(c[i]/10 + c[i]%10) : c[i];
	for (i=p; i<e+t; i++) l += s.charAt(i*2+1-t)-0;
		l += r;
	if ( !(e && l%10 == 0) )
		throw new Error("jpIsCardNumber");
	else
		return element;
}



function jpIsEmail(element) {
}

jpIsEmail.prototype.check = function(element) {

	var s = element.value;
	
	a = s.match(/\S+@([-\w]+\.)+\w+/g);
	
	if (a != null && a.length)
		return element;
	else 
		throw this.errorMessage();
}

jpIsEmail.prototype.errorMessage = function() {
	var language = jpForm.getAttribute("jplanguage");
	if (language == 'ITA')
		return "Formato errato";
	else 
		return "Format error";
}

function jpIsUrl() {
}

jpIsUrl.prototype.check = function(element) {
	var s = element.value;
	a = s.match(/\w{2,}:\/{2}([-\w]+\.)+\w+\S*/g);
	if (a != null && a.length)
	 	return element;
	else
		throw new Error("jpIsUrl");
}



function jpIsDate() {
}

jpIsDate.prototype.check = function(element) {
	var s = element.value;
	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
	var matchArray = datePat.match(s);
	if (matchArray == null){ 
		return new Error("is date");
	}else{
		month = matchArray[1];
		day = matchArray[3];
		year = matchArray[5];
		if ( (month >= 1 && month <= 12) && (day >= 1 && day <= 31) && ( ( month==4 || month==6 || month==9 || month==11) && day!=31) ){  
			if (month == 2) {
				var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
				if (day > 29 || (day==29 && !isleap)){ 
					throw new JPError("jpIsDate");
	 			}	
			}
		}
	}
	return element;
}

/*
	Corregge il valore di un campo "text" in modo che contenga solo i
	caratteri specificati nel parametro "allowed".
	
	obj: campo di tipo text.
	allowed: stringa contenente tutti i caratteri consentiti
	do_focus: se true, viene forzato il focus al campo se il suo valore
	          viene corretto.
*/
function jpFilterDigit(obj, allowed, do_focus) {
	var result = "";
	for (i=0; i<obj.value.length; i++) {
		chr = obj.value.charAt(i);
		if (allowed.indexOf(chr) >= 0)
			result += chr;
	}
	if (obj.value != result) {
		obj.value = result;
		if (do_focus)
			obj.select();
	}
}

function jpTimeFilterDigit(obj) {
	jpFilterDigit(obj, ".0123456789", false);
}

function jpValidateTime(obj) {
	var value = obj.value;
	var result = "";
	if (value.length > 0) {
		if (value.indexOf(".") >= 0) {
			hour = value.substr(0, value.indexOf("."));
			min = value.substr(value.indexOf(".") + 1, value.length);
			
			while (min.indexOf(".") >= 0)
				min = min.substr(0, min.indexOf(".")) + min.substr(min.indexOf(".") + 1, min.length);
			
			if (hour < 0) 
				hour = 0;
			if (hour > 23)
				hour = 23;
			if (min < 0) 
				min = 0;
			if (min > 59)
				min = 59;
			if ((min >= 6) && (min < 10))
				min = "0" + min;
				
			while (hour.length < 2)
				hour = "0" + hour;
			while (min.length < 2)
				min = min + "0";
				
			result = hour + "." + min;
		} 
		else if ((value.length <= 2) && (value < 24)) {
			while (value.length < 2)
				value = "0" + value;
			result = value + ".00";
		}
		else
			result = "00.00";
	}
	if (result != "")
		obj.value = result;
}
