var jPrototype = {
  Version: '0.15',
  nightly: '20071121'
}

function dump(o){
	var level_current=arguments[1]||0;
	var level_next=level_current+1;
	var indent_single="    ";
	var indent_current="";
	var indent_next="";
	for(var i=0;i<level_current;i++)indent_current+=indent_single;
	var indent_next=indent_current+indent_single;
	var result = ''; 
	     if(is.Null(o))   result += '{ } null';
	else if(is.U(o)) result += '{ } undefined';
	else if(is.S(o)) result += '{s:'+o.length+'} "' + o.replace(/"/,'\\"') + '"' ;
	else if(is.B(o)) result += '{b} ' + (o?"true":"false") ;
	else if(is.N(o)) result += '{n} ' + o ;
	else if(is.F(o)) result += '{f} ' + String(o).split("\n").join("\n"+indent_current) ;
	else if(is.Time(o)) result += '{d} '+o.getFullYear().zeroFill()+'-'+(o.getMonth()+1).zeroFill()+'-'+o.getDate().zeroFill()+' '+o.getHours().zeroFill()+':'+o.getMinutes().zeroFill()+':'+o.getSeconds().zeroFill()+' '+o.getMilliseconds().zeroFill(3);
	else if(is.Array(o)){
		var l=o.length;
		result += '{a:'+l+') [';
		o.each(function(v,k){
			result += '\n'+indent_next+k+': ';
			result += dump(v,level_next) ;
			result += "," ;
		});
		if (l>0) result  = result.substr(0,result.length-1)+'\n';
		result += indent_current+']' ;
	}else if(is.Object(o)){
		var l=$AA(o).length;
		result += '{o:'+l+') {';
		for(k in o){
			v=o[k];
			result += '\n'+indent_next+k+': ';
			result += dump(v,level_next) ;
			result += "," ;
		}
		if (l>0) result  = result.substr(0,result.length-1)+'\n';
		result += indent_current+'}' ;
	}
	return result;
}

function log(q){
	var console=byId("log");
	if(console)console.innerHTML="<div>["+d.getMinutes().zeroFill()+":"+d.getSeconds().zeroFill()+"] "+q.replace(/</,"&lt;")+"</div>"+console.innerHTML;
}

function trace(){alert($AA(arguments))};

function AND(check,values){
	result=true;
	values.each(function(v){if(check!=v)result=false;});
	return result;
}
function NAND(check,values){
	var result=true;
	values.each(function(v){if(check==v)result=false;});
	return result;
}
function OR(check,values){
	var result=false;
	values.each(function(v){if(check==v)result=true;});
	return result;
}
function NOR(check,values){
	result=false;
	values.each(function(v){if(check!=v)result=true;});
	return result;
}

function $AA(o){
	if(is.Array(o)||!is.Defined(o))return o;
	if(!is.Array(o)&&!is.Object(o))return [o];
	var a=[];
	var valid=false;
	if(is.Defined(o.length)){
		for(var i=0;i<o.length;i++){
			if(is.Defined(o[i])){
				a[i]=o[i];
				valid=true;
			}else break;
		}
	}
	if(!valid){
		a=[];
		for(k in o)a[a.length]=o[k];
	}
	return a;
}

function byId(tagId){
	if(!is.S(tagId))return undefined;
	var src;
	if(arguments.length>1){
		var arg = arguments[1] ;
		if(is.S(arg)){
			if(document.getElementById) src=document.getElementById(arguments[1]) ;
			if(document.all)            src=document.all[arguments[1]] ;
			if(document.layers)         src=document.layers[arguments[1]] ;
		}else src = arg ;
	}else src = document ;
	
	if(src.getElementById) return src.getElementById(tagId);
	if(src.all)            return src.all[tagId];
	if(src.layers)         return src.layers[tagId];
	
	return undefined;
}
function byTag(tagName){
	return $A( ($(arguments[1])||document).getElementsByTagName(tagName) );
}
function byClass(className){
	return $A( ($(arguments[1])||document).getElementsByClassName(className) );
}
function $EX(element){
	// Extract Value
	if(is.S(element))if(is.U(byId(element)))	return element;
	if(is.formElement(element))					return $F(element);
	if(is.Defined(element.innerHTML))			return element.innerHTML;
	return element;
}

Element.addMethods({
	byId:function(element,q){return byId(q,$(element))},
	byTag:function(element,q){return byTag(q,$(element))},
	byClass:function(element,q){return byClass(q,$(element))},
	setDimensions:function(element,dim){
		var d=$AA(dim),element=$(element);
		$(element).style.width=px(d[0]);
		$(element).style.height=px(d[1]);
	},
	setWidth:function(element,dim){
		$(element).style.width=px(dim);
	},
	setHeight:function(element,dim){
		$(element).style.height=px(dim);
	},
	get:function(element){
		q=$(element);
		// se non è l'elemento di una form: return false
		if(!is.formElement(element))return false;
		// se non ha un nome: return value
		if(is.Empty(q.name))return $F(q);
		// se invece ha un nome: recupero l'elemento tramite il suo nome
		var i=q.form.elements[q.name];
		// controllo se è un array di elementi
		if(!is.Defined(i.length)){
			// se non è un array: return value
			return $F(i);
		}else if(i[0].type.upper()=="RADIO"){
			// se è un array di radio: return array value
			for(var j=0;j<i.length;j++){
				if(i[j].checked)return i[j].value;
			}
			return null;
		}else{
			// se è un array di input: return array value
			var r=[];
			for(var j=0;j<i.length;j++){
				if(is.Defined(i[j].checked)){
					// array di checkbox
					if(i[j].checked)r.push(i[j].value);
				}else{
					// array di input text o textarea
					r.push(i[j].value);
				}
			}
			return r;
		}
	},
	getIndex:function(element){
		// WORK IN PROGRESS: NON SOLO SELECT
		q=$(element);
		if(q.tagName!="SELECT")return -1;
		if(arguments.length==1)return q.options.selectedIndex;
		
		var value=arguments[1];
		var r=[];
		$AA(q.options).each(function(o,i){
			if(o.value==value)r.push(i);
		});
		return (r.length==1)?r[0]:r;
	},
	set:function(element,value){
		q=$(element);
		if(!is.formElement(q))return false;
		if(is.Defined(q.value)){
			q.value=(is.Array(value))?value.first():value;
		}else{
			if(q.tagName!="SELECT"){
				value=$AA(value);
				$AA(q.options).each(function(o,i){
					     if(is.Defined(o.selected))o.selected=(value.indexOf(o.value)!=-1)?1:0;
					else if(is.Defined(o.checked) )o.checked =(value.indexOf(o.value)!=-1)?1:0;
				});
			}
		}
	},
	setIndex:function(element,index){
		// WORK IN PROGRESS: NON SOLO SELECT
		q=$(element);
		if(q.tagName!="SELECT")return -1;
		$AA(index).each(function(v){
			q.options[v].selected=1;
		})
	}
}); 

function wri(q){document.write(q)};
function xmp(q){wri("<xmp>"+q+"</xmp>")};
function wr(q){wri("<div>"+q+"</div>")};
function ce(q){return document.createElement(q)};
function ac(q,p){p.appendChild(q)};
function rc(q,p){p.removeChild(q)};
function px(q){return parseInt(q)+"px"};

var is = {
	// browser
	IE: Prototype.Browser.IE,
	Opera: Prototype.Browser.Opera,
	Safari: (navigator.userAgent.indexOf("Safari")!=-1),
	Win:(navigator.appVersion.toLowerCase().indexOf("win")!=-1),
	Mac:(navigator.userAgent.indexOf("Mac")!=-1),
	// objects
	formElement: function(q){
		q=$(q);
		if(q)switch(q.tagName.upper()){case"TEXTAREA":case"INPUT":case"SELECT":return true;}
		return false;
	},
	// normal types
	S : function(q){ return typeof q == "string" },
	B : function(q){ return typeof q == "boolean" },
	N : function(q){ return typeof q == "number" },
	F : function(q){ return typeof q == "function" },
	O : function(q){ return typeof q == "object" },
	U : function(q){ return typeof q == "undefined" },
	// special types
	D : function(q){
		// Date object
		if(!is.O(q))return false;
		if(!is.Defined(q.toUTCString))return false;
		var s=q.toUTCString();
		if(!(/^\w{3}, \d{1,2} \w{3} \d{4} \d{1,2}:\d{1,2}:\d{1,2} \w{3}/.test(s)))return false;
		return is.F(q.getFullYear);
	},
	Num     : function(q){ return (!isNaN(q)) ? (String(q).strip()!="") : false },
	Array   : function(q){
		// Se è non è un oggetto non può essere un Array
		if (!is.O(q)) return false;
		// Un oggetto stringato diventa "[object Object]"
		// e un array stringato diventa l'elenco dei suoi elementi, ad esempio "1,2,3"
		// quindi un array di oggetti stringato potrebbe diventare "[object Object],[object Object],[object Object]"
		// e invalidare il controllo .indexOf("[object ")
		var maybe = String(q).indexOf("[object ")==0 ;
		// Se l'oggetto stringato non comincia con "[object " è una data o un array
		if(is.Defined(q.getMinutes))return false;
		if(!maybe)return true;
		// altrimenti controllo se mi trovo in presenza di un array di oggetti
		if(is.Defined(q.length)){
			if(q.length>0){
				return String(q[0]).indexOf("[object ")==0 ;
			}
		}
		return false;
	},
	Time    : function(q){ return is.D(q) },
	Object  : function(q){ return !is.Array(q) && !is.Time(q) && is.O(q) },
	Defined : function(q){ return !is.U(q) },
	Null    : function(q){ return is.O(q) && q==undefined },
	// not reliable types
	Collection:function(q){
		if(!is.Defined(q.length))return false;
		if(String(q)=="[object HTMLCollection]")return true;
		return is.Object(q);
	},
	// validation
	Date:function(yyyy,mm,gg){
		function y2k(q){return(q<1000)?q+1900:q;}
		var today=new Date();
		yyyy = ((!yyyy) ? y2k(today.getFullYear()):yyyy)
		mm = ((!mm) ? today.getMonth():mm-1)
		if (!gg) return false
		var test = new Date(yyyy,mm,gg)
		if ((y2k(test.getFullYear()) == yyyy) && (mm == test.getMonth()) && (gg == test.getDate()) ){
			return true
		}else{
			return false
		}
	},
	Empty	: function(q){
		var str=$EX(q);
		return (is.S(str)||is.N(str))?(String(str).trim()==""):false;
		
	},
	Email  : function(q){
		var str=$EX(q);
		var re = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		return re.test(str);
	},
	Url    : function(q){
		var str=$EX(q);
		var re = /^[A-Za-z]+:\/\/[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+$/;
		return re.test(str);
	},
	CreditCard : function(q) {
		// Encoding only works on cards with less than 19 digits
		var str=$EX(q);
		if(typeof str!="string")return false;
		if (str.length > 19)return (false);
		var sum=0, mul=1, l=str.length;
		for (i = 0; i < l; i++) {
			var digit = str.substring(l-i-1,l-i);
			var tproduct = parseInt(digit ,10)*mul;
			sum += (tproduct >= 10) ? ((tproduct%10)+1) : tproduct ;
			mul += (mul == 1) ? 1 : -1 ;
		}
		return ((sum % 10)==0) ;
	},
	CodiceFiscale : function(q){
		var str=$EX(q);
		var re = /^[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]$/;
		return re.test(str);
	}
}

var Cookie = {
  set: function(name, value, daysToExpire) {
    var expire = '';
    if (daysToExpire != undefined) {
      var d = new Date();
      d.setTime(d.getTime() + (86400000 * parseFloat(daysToExpire)));
      expire = '; expires=' + d.toGMTString();
    }
    return (document.cookie = escape(name) + '=' + escape(value || '') + expire);
  },
  get: function(name) {
    var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]*)'));
    return (cookie ? unescape(cookie[2]) : null);
  },
  del: function(name) {
    var cookie = Cookie.get(name) || true;
    Cookie.set(name, '', -1);
    return cookie;
  },
  isEnabled: function() {
    if (typeof navigator.cookieEnabled == 'boolean') {
      return navigator.cookieEnabled;
    }
    Cookie.set('_test', '1');
    return (Cookie.erase('_test') === '1');
  }
};

Object.extend(String.prototype, {
	find: function(q){return this.indexOf(q) != - 1;},
	zeroFill:function(){
		var q=arguments[0]||2;
		var s=String(this);
		if(s.length>=q)return this;
		for(var i=s.length;i<q;i++)s="0"+s;
		return s;
	},
	timestamp2date:function(q){
		q=this.replace(/\D/g,"");
		return new Date(q.substr(0,4),q.substr(4,2)-1,q.substr(6,2),q.substr(8,2),q.substr(10,2),q.substr(12,2));
	},
	fileext:function(){
		var s = this;
		if(s.indexOf("?")!=-1)s=s.substr(0,s.indexOf("?"));
		if(s.indexOf("#")!=-1)s=s.substr(0,s.indexOf("#"));
		return (s.lastIndexOf(".")!=-1) ? s.substring(s.lastIndexOf(".")+1,s.length) : s ;
	},
	filename:function(){
		var s = this;
		if(s.indexOf("?")!=-1)s=s.substr(0,s.indexOf("?"));
		if(s.indexOf("#")!=-1)s=s.substr(0,s.indexOf("#"));
		return (s.lastIndexOf("/")!=-1) ? s.substring(s.lastIndexOf("/")+1,s.length) : s ;
	},
	trim:function(){
		  return this.replace(/^[\n\r\t\v\f\u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]+/, '').replace(/[\n\r\t\v\f\u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]+$/, '');
	},
	lower:function(){
		  return this.toLowerCase();
	},
	upper:function(){
		  return this.toUpperCase();
	}
});

Object.extend(Number.prototype, {
	prev: function(){return this - 1;},
	next: function(){return this + 1;},
	zeroFill:function(){
		var q=arguments[0]||2;
		var s=String(this);
		if(s.length>=q)return this;
		for(var i=s.length;i<q;i++)s="0"+s;
		return s;
	},
	timestamp2date:function(){
		q=this.replace(/\D/g,"");
		return new Date(q.substr(0,4),q.substr(4,2)-1,q.substr(6,2),q.substr(8,2),q.substr(10,2),q.substr(12,2));
	}
});

Object.extend(Math,{
	baseConvert:function(n,b1,b2){return parseInt(String(n),b1).toString(b2).toUpperCase();},
	gra2rad:function(G){return G*Math.PI/180;},
	rad2gra:function(R){return R*180/Math.PI;}
});

Object.extend(Form,{
	submit:function(form){
		form=$(form);
		if(form.onsubmit!=null){
			switch(form.onsubmit()){
				case true:case undefined:form.submit();
			}
		}else form.submit();
	}
});

Object.extend(Position,{
	setLeft:function(element,left){
		$(element).style.left=parseInt(left)+"px";
	},
	setTop:function(element,top){
		$(element).style.top=parseInt(top)+"px";
	},
	setMidLeft:function(element,left){
		$(element).style.left=(parseInt(left)-Element.getDimensions(element).width/2)+"px";
	},
	setMidTop:function(element,top){
		$(element).style.top=(parseInt(top)-Element.getDimensions(element).height/2)+"px";
	},
	set:function(element,pos){
		element=$(element);
		if(OR(Element.getStyle(element,'position'),["absolute","relative"])){
			pos=$A(pos);
			Position.setLeft(element,pos[0]);
			Position.setTop(element,pos[1]);
		}
	},
	setMid:function(element,pos){
		element=$(element);
		if(OR(element.style.position,["absolute","relative"])){
			pos=$A(pos);
			var dim=element.getDimensions();
			Position.setLeft(element,pos[0]-dim.width/2);
			Position.setTop(element,pos[1]-dim.height/2);
		}
	},
	get:function(element){
		element=$(element);
		if(OR(element.style.position,["absolute","relative"])){
			return [element.style.left,element.style.top];
		}else{
			return Position.cumulativeOffset(element);
		}
	},
	getMid:function(element){
		element=$(element);
		var pos,dim=Element.getDimensions(element);
		if(OR(element.style.position,["absolute","relative"])){
			pos=[element.style.left,element.style.top];
		}else{
			pos=Position.cumulativeOffset(element);
		}
		return [pos[0]+dim.width/2,pos[1]+dim.height/2];
	}
});
Function.prototype.name=function(q){
	// q can be a function or an "arguments.callee"
	var results = String(q).match(/function (\S+)\(/); // in Opera the regexp doesn't work if i put "^" at the beginning
	if(results)if(results.length>1)return results[1];
	return null;
}

Object.extend(window,{
	getScroll:function(){
		var x,y;
		if( typeof( window.pageYOffset ) == 'number' ) {
			//Netscape compliant
			y = window.pageYOffset;
			x = window.pageXOffset;
		} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
			//DOM compliant
			y = document.body.scrollTop;
			x = document.body.scrollLeft;
		} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
			//IE6 standards compliant mode
			y = document.documentElement.scrollTop;
			x = document.documentElement.scrollLeft;
		}
		return [x,y];	
	},
	getDimensions:function(){
		var w,h;
		if (typeof window.innerWidth!="undefined"){
			w = window.innerWidth;
			h = window.innerHeight;
		}else if (document.documentElement && typeof document.documentElement.clientWidth!="undefined" && document.documentElement.clientWidth!=0){
			w = document.documentElement.clientWidth
			h = document.documentElement.clientHeight
		}else if (document.body && typeof document.body.clientWidth!="undefined"){
		    w = document.body.clientWidth
		    h = document.body.clientHeight
		}
		return {width:w,height:h};
	},
	pop:function(){
		// pop ( href [,target] [,x] [,y] [,"maximized"] [,"fullscreen"] [,"resizable"] [,"nocenter"] [,"scroll"] [,"return"] )
		// eg: pop('http://www.google.com',400,300,'myTarget','scroll')
		if(arguments.length>0){
			_url=arguments[0];
			var x,y,o,_target="",_params=[],center=true,maximized=false,fullscreen=false,resizable=true,scroll=false,returnObj=false;
			if(!document.all || (document.all && navigator.userAgent.indexOf("Mac")!=-1) ){
				for(i=1;i<arguments.length;i++){
					if(arguments[i]=="fullscreen"){
						arguments[i]="maximized";
						break;
					}
				}
			}
			if(arguments.length>1){
				for(i=1;i<arguments.length;i++){
					if(isNaN(arguments[i])){
						switch(arguments[i]){
							case"nocenter":
								center=false;
							break;
							case"scroll":
								scroll=true;
							break;
							case"maximized":
								maximized=true;
								_params[_params.length]="left=0";
								_params[_params.length]="top=0";
								_params[_params.length]="width="+(screen.width-6);
								_params[_params.length]="height="+(screen.height-26);
							break;
							case"fullscreen":
								fullscreen=true;
								_params[_params.length]="fullscreen=yes";
								if(document.all)_params[_params.length]="channelmode=yes"; 
							break;
							case"noresize":
								resizable=false;
								_params[_params.length]="resizable=no";
							break;
							case"return":
								returnObj=true;
							break;
							default:
								_target=arguments[i];
							break;
						}
					}
				}
				if(!fullscreen && !window[_target])_params[_params.length]="scrollbars="+((scroll)?"yes":"no");
				if(!maximized && !fullscreen &&  !window[_target]){
					for(i=1;i<arguments.length;i++){
						if(!isNaN(arguments[i]) && !maximized){
							if(x==undefined){
								x=arguments[i];
								_params[_params.length]="width="+x;
							}else{
								y=arguments[i];
								_params[_params.length]="height="+y;
							}
						}
					}
					if(center && !window[_target]){
						_params[_params.length]="left="+((screen.width-x)/2);
						_params[_params.length]="top="+((screen.height-y)/2);
					}
				}
			}
			o=window.open(_url,_target,_params.join(","));
			if(o==undefined)alert("L'apertura della finestra è stata bloccata");
			if(returnObj)return o;
		}
	}
});

Object.extend(Date.prototype,{
	toTimestamp:function(){
		var Y=this.getFullYear();
		var m=(this.getMonth()+1).zeroFill();
		var d=(this.getDate()).zeroFill();
		var H=(this.getHours()).zeroFill();
		var i=(this.getMinutes()).zeroFill();
		var s=(this.getSeconds()).zeroFill();
		return ""+Y+m+d+H+i+s;
	}
});


$_GET=location.href.toQueryParams();
$_SERVER={PHP_SELF:location.pathname};