if (window.focus) self.focus();
// check for IE3
var isIE3 = (navigator.appVersion.indexOf('MSIE 3') != -1);
var error_msg_holder;
var real_name_holder;
var format_holder;
 var hardReturn = "\r\n";
 var customError='';
 function JsFormtrim(s) {
  while (s.substring(0,1) == ' ') {
	s = s.substring(1,s.length);
  }
  while (s.substring(s.length-1,s.length) == ' ') {
	s = s.substring(0,s.length-1);
  }
  return s;
}

function isHTMLArea(form,name,req,maxl)
{
	var te=eval('form.'+name);
	var tedit=eval(name+'_htA');
	te.value=tedit.getHTML();
	var strippa=te.value.replace(/<[^>]*>/g, "");
	var strippa=strippa.replace("\r", "");
	var strippa=strippa.replace("\n", "");
	var strippa=strippa.replace(" ", "");
	if(strippa.match(/[a-zA-Z0-9]/g) || !req) 
	return true; 
	else return false;
}

function isTinymce(obj,name,req,maxl)
{
	var str = tinyMCE.get(name).getContent();
	if( req > 0 && !str.length)
		return false;

	return true;
}

function isFCK(form,name,req,maxl)
{
	//alert(name);
	return true; 
}

function name2number(form,elname)
{
	for (var i = 0; i < form.elements.length; i++)
	{
		if(form.elements[i].name==elname)
		{
			return i;
		}
	}
}
// object definition
function validation(realName, formEltName, eltType, upToSnuff, format) {
  this.realName = realName;
  if(formEltName.substring(0,3)=='dc_') this.formEltName = formEltName.substring(3);
  else this.formEltName = formEltName;
  this.eltType = eltType;
  this.upToSnuff = upToSnuff;
  this.format = format;
}
var validating='';
function isPwd(str,n,conf,vname)
{
   // var name;
  if (
	  (!(str.length>0))
	  &&
	  (n==1)
	  )
	  return false;
  if(conf==1)
  {
   checkme=eval(name+'.'+vname+'_confirm');
  //  alert(checkme.value);
   if(checkme.value!=str)
   {
	   customError=fields_dont_match;
	   return false;
   }
  }
  return true;
}
function isText(str,n) {
 if (!(str.length>0))
				 {if (n==1){return false}else{return true}}
else {return true;}
}
function isMLText(str,n,l) {
 if (!(str.length>0))
			 //{if (n==1){return false}else{return true}}
			 {if (n==1){return false}}
	if(l>0)
		 {
		if(str.length<=l)return true;
		else
		   {
		   customError=real_name_holder + ' ' + is_too_long + hardReturn;
		  customError+=max_length+':'+l;
		   return false;
			}
		}
	return true;
}
function isSelect(formObj) {
  //return (formObj.options[formObj.selectedIndex].value != 0);
 // alert('pizza');
  return (formObj.selectedIndex > 0);
  //return false;
}
function isMultiSelect(formObj) {
  conta=formObj.options;
//  alert(conta.length);
for (var i = 0; i < conta.length; i++)
  {
   if (formObj.options[i].selected)
   return true;
  }
  return false;
}
function isRadio(formObj) {
  for (j=0; j<formObj.length; j++) {
	if (formObj[j].checked) {
	  return true;
	}
  }
  return false;
}
function isMultiCheck(oname, form) {
  for (j=0; j<form.elements.length; j++) 
  {
  //alert(form.elements[j].name.substring(0,oname.length));
  	if(form.elements[j].name.substring(0,oname.length)==oname){
		if (form.elements[j].checked) 
		{
		  return true;
		}
  	}	
 }
  return false;
}
function isCheck(form,box) {
eval('cb=document.forms.'+form+'.'+box);
return cb.checked;
}
/*function isEmail(str,n) {
	 if ((str.length<1))
				 {if (n==1){return false}else{return true}}
//var oRegExp = /^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/g;
var emailReg = "^[\\w-_\.]*[\\w-_\.]\@[A-Za-z]\.+[\\w]+[\\w]$";
	 var oRegExp = new RegExp(emailReg);
alert(emailReg+' - return: ' + oRegExp.test(str));
return (oRegExp.test(str));
//  return ((str != "") && ((str.indexOf("@") != -1) && (str.indexOf("@") > 1)) && ((str.indexOf(".") != -1) && (str.length - str.indexOf(".") > 2)));
}*/

function isEmail( str, n)
{
	if ((str.length<1))
		{ if (n==1) return false; else return true; }
	var r1 = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)");
	var r2 = new RegExp("^[\-_\.0-9a-zA-Z]+@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,6}|[0-9]{1,3})(\\]?)$");
	return (!r1.test(str) && r2.test(str));
}

function isZipCode(str) {
  var l = str.length;
  if ((l != 5) && (l != 10)) { return false }
  for (j=0; j<l; j++) {
	if ((l == 10) && (j == 5)) {
	  if (str.charAt(j) != "-") { return false }
	} else {
	  if ((str.charAt(j) < "0") || (str.charAt(j) > "9")) { return false }
	}
  }
  return true;
}
function isNum(str,good,n) {
 if ((str.length<1))
				 {if (n==1){return false}else{return true}}
  for (j=0; j<str.length; j++) {
		if(good.indexOf(str.charAt(j))==-1){return false; }
  }
  return true;
}
function isDate(day,month,year) {
 //alert(day+month+year);
  if (day == 0) { return false }
  if (month == 0 || month > 12) { return false }
  if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
	if (day > 31) { return false }
  } else {
	if (month == 4 || month == 6 || month == 9 || month == 11) {
	  if (day > 30) { return false }
	} else {
	  if (year%4 != 0) {
		if (day > 28) { return false }
	  } else {
		if (day > 29) { return false }
	  }
	}
  }
  return true;
}
function errorMsg(type,rname)
{
	if(customError.length>0)
	{
		mzg=rname+':'+ customError+ hardReturn;
		customError='';
	 }
	 else
	 {
		 if(type=='emptytext')  mzg=beginRequestAlertForText + rname + endRequestAlert + hardReturn;
		 else if(type=='wrongtext')  mzg=beginInvalidAlert+ rname + endInvalidAlert  + hardReturn;
		 else	 mzg = beginInvalidAlert + rname + endInvalidAlert + hardReturn;
	 }
	 return mzg;
}
function isVisible(element) {
	if(element.tagName == "BODY") return true;
	else {
		if(typeof element.currentStyle == "object") {
			var display = element.currentStyle.display;
			var visibility = element.currentStyle.visibility;
		} else if(typeof window.getComputedStyle == "function") {
			var display = window.getComputedStyle(element, "").getPropertyValue('display');
			var visibility = window.getComputedStyle(element, "").getPropertyValue('visibility');
		}
		if(display == "none") return false;
		else if(visibility == "hidden") return false;
		else return isVisible(element.parentNode);
	}
}
function validateForm(form) {
	var formEltName = "";
	var formObj = "";
	var str = "";
	var realName = "";
	var alertText = "";
	var firstMissingElt = null;
	// var hardReturn = "\r\n";
	//var name;
	
	for (i=0; i<elts.length; i++) 
	{
		if(elts[i]!= undefined)
		{
			formEltName = elts[i].formEltName;
			//alert(formEltName);
			//code= "form.elements['" + formEltName+"']";//alert(code)
			code= "document.forms."+form.name+".elements['" + formEltName+"']";//

			if (elts[i].eltType != "date")formObj = eval(code);
			realName = elts[i].realName;
			real_name_holder=realName;
			format_holder=elts[i].format;
			// alert('calling '+elts[i].upToSnuff);
			//alert(realName+'is'+elts[i].eltType);
			if (elts[i].eltType == "text") {
			str = formObj.value;
			// if(!str)str=new String('');
			/*  alert(str);
			alert('calling '+elts[i].upToSnuff);	*/
			if (eval(elts[i].upToSnuff)){signal(formObj,0);continue;}
			if (str == "") {
			if (allAtOnce) {
			alertText += errorMsg('emptytext',realName);
			if(signaling>0)
			signal(formObj,1);
			if (firstMissingElt == null) {firstMissingElt = formObj};
			} else {
			signal(formObj,1);
			alertText = errorMsg('emptytext',realName);
			alert(alertText);
			// return false;
			}
			}//str==''
			else {
			if (allAtOnce) {
			alertText += errorMsg('wrongtext',realName);
			if(signaling>0)
			signal(formObj,1);
			} else {
			signal(formObj,1);
			alertText = errorMsg('wrongtext',realName);
			}
			if(elts[i].format)
			//if (temp.length > 0)
			alertText += beginFormatAlert + elts[i].format + hardReturn;
			// alert('bon');
			if (allAtOnce) {
			if (firstMissingElt == null) firstMissingElt = formObj;
			} else {
			alert(alertText);
			}
			}
			} else {
			//alert('calling'+elts[i].upToSnuff);
			//alert(elts[i].eltType);
			if (eval(elts[i].upToSnuff))
			{
			signal(formObj,0);
			continue;
			}
			if (allAtOnce) {
			//alert(elts[i].eltType);
			alertText  += errorMsg('nottext',realName);
			if (firstMissingElt == null) {firstMissingElt = formObj};
			if(signaling>0)
			signal(formObj,1);
			} else {
			signal(formObj,1);
			alertText+= errorMsg('nottext',realName);
			alert(alertText);
			}
			}
			if (!isIE3) {
					  
			var goToObj = (allAtOnce) ? firstMissingElt : formObj;

			if(goToObj  )
			{
			if (goToObj.select) goToObj.select();
			if(goToObj[0]) {
				if (isVisible(goToObj[0]) && goToObj[0].focus) goToObj[0].focus();
			}
			else {
				if (isVisible(goToObj) && goToObj.focus) goToObj.focus();
			} 
			
			}
			}
			if (!allAtOnce) {return false};
		}
	}
  if (allAtOnce) {
	if (alertText != "") {
	  alert(alertText);
	  return false;
	}
  }
  return true; //change this to return true
}
function validate(obj)
{
var ok=true;
var formEltName = eval(obj.name+'.formEltName');
//var hardReturn = "\r\n";
var realName = eval(obj.name+'.realName');
var eltType = eval(obj.name+'.eltType');
var func=eval(obj.name+'.upToSnuff');
var format=eval(obj.name+'.format');
var formObj=obj;
//alert(validating);
if (!((validating==formEltName)||(validating==''))) {return true}
validating=formEltName;
// leggiamo i dati
//checkiamo!
	if (eltType == "text") {
			  str = obj.value;
		 if (!eval(func))
				{
				 ok=false;
				if (str == "") alertText = +beginRequestAlertForText + realName + endRequestAlert + hardReturn
				else alertText = str + beginInvalidAlert + realName + endInvalidAlert + hardReturn;
				 if ((format) && (format.length > 0))
alertText += beginFormatAlert + format + hardReturn;
				}
		} // text
	 else
		{
		if (!eval(func))
				{
				 ok=false;
			   alertText = beginRequestAlertGeneric + realName + endRequestAlert + hardReturn;
				}
		}//not text
if (!ok) {
				signal(obj,1);
				if ((obj.value)&&(clearWrong)){obj.value='';}
				alert(alertText);
		 if (!isIE3) {
					  if (obj.focus) {obj.focus()} else
					  {if (obj.select) obj.select();}
						 }
				}
		else {
		validating='';
		signal(obj,0);
		return true;
		}
}
function signal(el, bg) {
 if (el.style)
		{
				if (bg)
				el.style.backgroundColor = bgBad
				else
				el.style.backgroundColor = bgGood;
		}
}
function checkTime(str,fmt)
{
if (
	 	(fmt.indexOf('h')>=0)
		||
		(fmt.indexOf('H')>=0)	  
	)
	{
	var ora=eval(str+'h');
	if(ora.selectedIndex==0) return false;
	}
if  (fmt.indexOf('m')>=0)
	{
	var min=eval(str+'mi');
	if(min.selectedIndex==0) return false;
	}
if  (fmt.indexOf('s')>=0)
	{
	var sec=eval(str+'s');
	if(sec.selectedIndex==0) return false;
	}	
return true;
}
function checkdatetime(str,fmt)
{
if(!checkdate(str))return false;
var parts=fmt.split('|');
if(!checkTime(str,parts[2]))return false;
return true;
}
function checkdate(str)
{
eval('mon='+str+'m;');
var i = mon.selectedIndex;
eval('zday='+str+'d;');
eval('zyear='+str+'y;');
var j = zyear.selectedIndex;
var ok=true;
if(mon.options[i].value == "02") {
	zday.options[31] = null;
	zday.options[30] = null;
	var j = zyear.selectedIndex;
	var year = eval(zyear.options[j].value);
	if ( ((year%400)==0) || (((year%100)!=0) && ((year%4)==0)) ) {
	  if (zday.options[29] == null) {
		zday.options[29] = new Option("29");
		zday.options[29].value = "29";
	  }
	} else {
	  zday.options[29] = null;
	}
   }
if(mon.options[i].value == "01" ||
	 mon.options[i].value == "03" ||
	 mon.options[i].value == "05" ||
	 mon.options[i].value == "07" ||
	 mon.options[i].value == "08" ||
	 mon.options[i].value == "10" ||
	 mon.options[i].value == "12")
  {
	if (zday.options[29] == null) {
	  zday.options[29] = new Option("29");
	  zday.options[29].value = "29";
	}
	if (zday.options[30] == null) {
	  zday.options[30] = new Option("30");
	  zday.options[30].value = "30";
	}
	if (zday.options[31] == null) {
	  zday.options[31] = new Option("31");
	  zday.options[31].value = "31";
	}
  }
  if(mon.options[i].value == "04" ||
	 mon.options[i].value == "06" ||
	 mon.options[i].value == "09" ||
	 mon.options[i].value == "11")
  {
	if (zday.options[29] == null) {
	  zday.options[29] = new Option("29");
	  zday.options[29].value = "29";
	}
	if (zday.options[30] == null) {
	  zday.options[30] = new Option("30");
	  zday.options[30].value = "30";
	}
	zday.options[31] = null;
  }
  if (zday.selectedIndex == -1)
   { zday.selectedIndex = 0;}
   if((j*i*zday.selectedIndex)==0)
{
		return false;
}
  return isDate(zday.options[zday.selectedIndex].value,mon.options[mon.selectedIndex].value,zyear.options[zyear.selectedIndex].value);
}
function set2today(str)
{
eval('mon='+str+'m;');
eval('zday='+str+'d;');
eval('zyear='+str+'y;');
var mydate = new Date();
mon.selectedIndex = mydate.getMonth()+1;
zday.selectedIndex = mydate.getDate();
zyear.selectedIndex = 1;
checkdate(str);
}
function set2date(str,d,m,y)
{
eval('mon='+str+'m;');
eval('zday='+str+'d;');
eval('zyear='+str+'y;');
mon.selectedIndex = d+1;
zday.selectedIndex = m+1;
zyear.selectedIndex = y+1;
checkdate(str);
}
function resetdate(str)
{
eval('mon='+str+'m;');
eval('zday='+str+'d;');
eval('zyear='+str+'y;');
mon.selectedIndex = 0;
zday.selectedIndex = 0;
zyear.selectedIndex = 0;
checkdate(str);
}
// these funx are for multi line text field size check and counter, NOT USED AT THE MOMENT
/*function name2obj(name)
{
str='obj=document.forms[0].'+name;// not netscape friendly yet
eval(str);
return obj;
}
function stop(name)
{
str='clearTimeout('+name+'Count);';
eval(str);
}
function startCount(name,len)
{
mess=name2obj(name);
tot=name2obj(name+'Tot');
if (mess.value.length>Math.abs(len)) mess.value=mess.value.substring(0,Math.abs(len));
if (len>0) {tot.value=mess.value.length;} else {tot.value=Math.abs(len) - mess.value.length;}
str=name+"Count=setTimeout(\"startCount('"+name+"',"+len+")\",1000)";
eval(str);
}*/
////////////////////////////////////////////////////////////////////////////////////////

//GESTIONE DEL SUBMIT VIA AJAX

jsForm = {};

// Funzione presa da PHP.js
jsForm.urlencode = function(str) {
	str = (str+'').toString();
	
	// Tilde should be allowed unescaped in future versions of PHP (as reflected below), but if you want to reflect current
	// PHP behavior, you would need to add ".replace(/~/g, '%7E');" to the following.
	return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+').replace(/~/g, '%7E');
};

jsForm.AjaxRequest = function(method, url, params, callback, failure) {
	var _req;
	var _params = new Array();
	var _send = "";
	var _method = "";
	var _url = "";
	
	if(params) {
		for(var k in params) {
			if(typeof params[k] == "string" || typeof params[k] == "number") _params.push(k + "=" + jsForm.urlencode(params[k]));
			else if(params[k] instanceof Array) {
				var array = params[k];
				for(var i = 0; i < array.length; i++) {
					if(typeof array[i] == "string" || typeof array[i] == "number") _params.push(k + "=" + jsForm.urlencode(array[i]));
					else throw(new Error("Parametri array troppo in profondit�"));
				}
			} else throw(new Error("Parametri non validi. Usa la forma {param1: value1, param2: value2} con value = stringa, numero o array. params['" + k + "'] = " + typeof(params[k])));
		}
	}

	if(_params.length) _params = _params.join("&");
	else _params = "";

	if(typeof url != "string") throw(new Error("Url non valido"));
	else _url = url;
	
	if(method.toLowerCase() == "get") {
		_method = "get";
		
		if(_params) _url += "?" + _params;
	} else if(method.toLowerCase() == "post") {
		_method = "post";
		_send = _params;
	} else throw(new Error("Metodo non valido"));
	
	function _processReqChange() {
		if (_req.readyState == 4) {
			if (_req.status == 200) {
				if(callback) {
				   if(typeof callback == "function") callback(_req.responseText);
				   else throw(new Error("Funzione callback non valida"));
				}
			} else {
				if(failure) {
					if(typeof failure == "function") failure();
					else throw(new Error("Funzione failure non valida"));
				}
			}
		}
	}

	if(window.XMLHttpRequest && !(window.ActiveXObject)) {
		try {
			_req = new XMLHttpRequest();
		} catch(e) {
			_req = false;
		}
	} else if(window.ActiveXObject) {
		try {
			_req = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				_req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				_req = false;
			}
		}
	}

	this.send = function() {
		if(_req) {
			_req.onreadystatechange = _processReqChange;
			_req.open(_method, _url, true);
			
			if(_method == "post") {
				_req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				_req.setRequestHeader("Content-length", _send.length);
				_req.setRequestHeader("Connection", "close");
			}
			
			_req.send(_send);
		}
	};
};

jsForm.createInputElement = function(type, name, value) {
	var element = document.createElement("input");
	
	element.type = type;
	element.name = name;
	element.value = value;
	
	return element;
};

jsForm.keyExists = function(key, object) {
	for(var k in object) {
		if(k == key) return true;
	}
	
	return false;
};

jsForm.inArray = function(object, array) {
	var length = array.length;
	
	for(var i = 0; i < array.length; i++) {
		if(array[i] == object) return true;
	}
	
	return false;
};

// Funzione che analizza gli elementi della form e ne costruisce un oggetto JSON che simula la struttura
// di una query string
jsForm.getInputsObject = function(form) {
	var elements = form.elements;
	var length = elements.length;
	
	// Oggetto JSON
	var object = {};
	
	if(length) {
		var element = null;
	
		// Ciclo su tutti gli elementi della form
		for(var i = 0; i < length; i++) {
			element = elements[i];
			
			// Se nell'oggetto JSON esiste gi� un elemento con lo stesso nome,
			// devo metterlo comunque, non sovrascriverlo come page.php?elem=1&elem=2
			if(jsForm.keyExists(element.name, object)) {
				// Controllo che non ne abbia gi� aggiunti degli altri,
				// se s� li aggiungo semplicemente all'array degli elementi con quel nome,
				// altrimenti devo convertire l'elemento dal precedente tipo String al tipo Array.
				
				// Checkbox e radio non usano la propriet� value, ma la propriet� checked. E vengono
				// spediti solamente quando checked � true, a differenza degli altri campi che vengono spediti
				// anche quando value = ''
				// mce usa tinyMCE.get(element.name).getContent() perch� gli elementi mce sono iframe
				if(object[element.name] instanceof Array) {
					if(element.type == "checkbox") {
						if(element.checked) object[element.name].push(element.value);
					} else if(element.className == "mce") {
						object[element.name].push(tinyMCE.get(element.name).getContent());
					} else object[element.name].push(element.value);
				} else {
					// Gli elementi radio non possono avere pi� di un valore, a differenza di tutti gli
					// altri campi della form
					if(element.type != "radio") {
						if(element.type == "checkbox") {
							if(element.checked) object[element.name] = [object[element.name], element.value];
						} else if(element.className == "mce") {
							object[element.name] = [object[element.name], tinyMCE.get(element.name).getContent()];
						} else object[element.name] = [object[element.name], element.value];
					}
				}
			} else {
				// Checkbox e radio non usano la propriet� value, ma la propriet� checked. E vengono
				// spediti solamente quando checked � true, a differenza degli altri campi che vengono spediti
				// anche quando value = ''
				if(element.type == "checkbox") {
					if(element.checked) {
						object[element.name] = element.value;
					}
				} else if(element.type == "radio") {
					if(element.checked) object[element.name] = element.value;
				} else if(element.className == "mce") {
					object[element.name] = tinyMCE.get(element.name).getContent();
				} else if(element.type != "submit" && element.type != "reset") {
					object[element.name] = element.value;
				}
			}
		}
	}
	
	return object;
};

// Funzione per fare il submit di un'intera form tramite Ajax
jsForm.submitAjax = function(form, callback) {
	// Valido la form
	if(validateForm(form)) {
		var elements = form.elements;
		var length = elements.length;
		
		// L'action della form, per sapere a che file inviare la richiesta Ajax
		var action = form.attributes["action"].value;

		// Se action non esiste, assumo che sia uguale alla pagina della form. Come
		// fanno le normali form
		if(!action) action = window.location.href;
		
		// Se esistono elementi nella form procedo con la spedizione
		if(length) {
			// Ricevo tutti gli elementi
			var params = jsForm.getInputsObject(form);
			
			// Imposto apply ad ajax, diverso da apply reload
			params["apply"] = "ajax";
			
			// Invio la form in post
			new jsForm.AjaxRequest("post", action, params, function(response) {
				var object = eval("(" + response + ")");
 
				if(object.error) alert(object.content);
				else if(typeof callback == "function") callback(object);
			}).send();
		}
	}
};

jsForm.submitReload = function(form) {
	if(validateForm(form)) {
		form.invia.disabled = true;
		form.apply.value = "reload";
		form.submit();
	}
};
