function hg(id) { return document.getElementById(id); };

function isSet(variable) {
    try { 
        eval(variable + ';'); 
        return true;
    }
    catch(ex) {
        return false;
    }
}

function field_control(callback,reload_url) {
	reset_asterisk();
	var arraycampi=form_obj.getElementsByTagName('input');
	var elem_name;
	var elem_value;
	var elem_type;
	var elem_id;
	div_form.style.display='none';
	div_loading.style.display='block';
	document.body.style.display='none';
	document.body.style.display='block';
	for (i=0; i < arraycampi.length; i++) {
		elem_type=arraycampi[i].getAttribute('type');
		if((elem_type!="button")&&(elem_type!="hidden")&&(elem_type!="reset")) {
			elem_id=arraycampi[i].getAttribute('id');
			elem_name=arraycampi[i].getAttribute('name');
			elem_value=arraycampi[i].value;
			if((elem_value=='' || elem_value.match(/^\s*$/)) && hg('ast_'+elem_name)){
				div_loading.style.display='none';
				div_form.style.display='block';
				hg('ast_'+elem_name).innerHTML='*';
				print_error(js_dic_NOALLFIELDS,'ast_'+elem_name);
				return false;
			}
			// Controllo email
			if(elem_id.indexOf('mail')>=0 && hg('ast_'+elem_name)) {
				if (!emailControl(elem_value)) {
					div_loading.style.display='none';
					hg('ast_'+elem_name).innerHTML='*';
					div_form.style.display='block';
					print_error(js_dic_NOALLFIELDS,'ast_'+elem_name);
					return false;
				}
			}			
			// Controllo della login
			if(elem_id.indexOf('login')>=0 && hg('ast_'+elem_name)) {
				if(elem_value.length<5 || elem_value.length>12) {
					hg('ast_'+elem_name).innerHTML='*';
					print_error(js_dic_PWDUSERWRONG,'ast_'+elem_name);
					div_loading.style.display='none';
					div_form.style.display='block';
					return false;
				}
			}
			// Controllo delle password
			if(elem_id.indexOf('password')>=0 && hg('ast_'+elem_name)) {
				if(!pwd_control(elem_name,elem_name.replace('password','repwd'))) {
					div_loading.style.display='none';
					div_form.style.display='block';
					return false;
				}
			}
		}
	}
	// sezione per i tag di tipo textarea
	var arraycampi_txtarea=form_obj.getElementsByTagName('textarea');
	var elem_name_txtarea;
	var elem_value_txtarea;
	var elem_type_txtarea;
	var elem_id_txtarea;
	for (i=0; i < arraycampi_txtarea.length; i++) {
		elem_id_txtarea=arraycampi_txtarea[i].getAttribute('id');
		elem_name_txtarea=arraycampi_txtarea[i].getAttribute('name');
		elem_value_txtarea=arraycampi_txtarea[i].value;
		if(elem_value_txtarea=='' && hg('ast_'+elem_name_txtarea)) {
			div_loading.style.display='none';
			div_form.style.display='block';
			hg('ast_'+elem_name_txtarea).innerHTML='*';
			print_error(js_dic_NOALLFIELDS,'ast_'+elem_name_txtarea);
			return false;
		}
	}
	//se mi e' stata richiesta una funzione la chiamo altrimenti ritorno true
	if (callback !='') callback(reload_url);
	else return true;
}

// Controllo delle password
function pwd_control(password,repwd) {
	var pwd1=hg(password).value;
	var pwd2=hg(repwd).value
	if(pwd1!=pwd2) print_error(js_dic_PWDNOMATCH);
	if(pwd1.length<5 || pwd2.length<5 || pwd1.length>12 || pwd2.length>12) {
		hg('ast_'+repwd).innerHTML='*';
		hg('ast_'+password).innerHTML='*';
		print_error(js_dic_PWDUSERWRONG);
		return false;
	}
	else if(pwd1!=pwd2) {
		hg('ast_'+repwd).innerHTML='*';
		hg('ast_'+password).innerHTML='*';
		print_error(js_dic_PWDNOMATCH);
		return false;
	}
	else return true;
}

function reset_asterisk() {
	hg('error').style.display='none';
	var arraycampi=form_obj.getElementsByTagName('input');
	var elem_name;
	var elem_type;
	for (i=0; i < arraycampi.length; i++) {
		elem_type=arraycampi[i].getAttribute('type');
		if((elem_type!="button")&&(elem_type!="hidden")&&(elem_type!="reset")) {
			elem_name=arraycampi[i].getAttribute('name');
			if(hg('ast_'+elem_name)) hg('ast_'+elem_name).innerHTML='';
		}
	}
}

function reset_all_asterisk() {
	hg('error').style.display='none';
	var arraycampi=document.getElementsByTagName('input');
	var elem_name;
	var elem_type;
	for (i=0; i < arraycampi.length; i++) {
		elem_type=arraycampi[i].getAttribute('type');
		if((elem_type!="button")&&(elem_type!="hidden")&&(elem_type!="reset")) {
			elem_name=arraycampi[i].getAttribute('name');
			if(hg('ast_'+elem_name)) hg('ast_'+elem_name).innerHTML='';
		}
	}
}

function struct_length(struct) {
	var lunghezza=0;
	for(i in struct)
		lunghezza++;
	return lunghezza;
}

var _pieces=new Array();
function toDocument(struct,encode)	{
	var xml_request='<?xml version="1.0" encoding="'+encode+'" ?>';
	_toDocument(struct);
	for(i in _pieces) {
		var elt=_pieces[i];
		xml_request +=elt;
	}	
	return xml_request;
}

function _toDocument(struct)	{
	if (struct==null)
		_pieces[_pieces.length]='<element type="NIL">NIL</element>';
	else if(struct.replace) {
		// Text handling
		var value=struct.replace(/&/g, '&amp;'); // Escaping entities
		value=value.replace(/</g, '&lt;');
		value=value.replace(/>/g, '&gt;');
		_pieces[_pieces.length]='<element type="string">'+value+'</element>';
	}
	else if(struct.length>0) {
		// Sequence handling
		_pieces[_pieces.length]='<sequence length="'+struct.length+'">';
		for(var item in struct) {
			var elt=struct[item];
			// For every item in the sequence
			_pieces[_pieces.length]='<item>';
			_toDocument(elt); // Recursively create internal items
			_pieces[_pieces.length]='</item>';
		}
		_pieces[_pieces.length]='</sequence>';
	}
	else if(struct.length==0) {
		// Map handling
		_pieces[_pieces.length]='<map length="'+struct_length(struct)+'">';
		for(var key in struct) {
			var value=struct[key];
			// For every (key, value) in the map
			_pieces[_pieces.length]='<key name="'+key+'">';
			_toDocument(value); // Recursively create internal elements
			_pieces[_pieces.length]='</key>';
		}
		_pieces[_pieces.length]='</map>';
	}
	else if(typeof(struct)=='boolean') {
		// Text handling
		if(struct) var value='True'; 
		else var value='False'; 
		_pieces[_pieces.length]='<element type="boolean">'+value+'</element>';
	}
	else if(isFinite(struct)) {
		// Integer handling
		// controllo se il numero e' un intero o un float confrontandolo con se stesso troncato
		var struct_floor=Math.floor(struct);
		if(struct==struct_floor)
			_pieces[_pieces.length]='<element type="integer">'+struct+'</element>';
		else
			_pieces[_pieces.length]='<element type="float">'+struct+'</element>';
	}
}

function fromDocument(elem)	{
	var tag_name=elem.nodeName;
	if(tag_name=='element') {
		// Text handling
		if(elem.firstChild) var value=elem.firstChild.data;
		else var value='';
		return value;
	}
	else if(tag_name=='sequence') {
		// Sequence handling
		var _array_pieces=new Array();
		var items=elem.childNodes;
		for(var i=0; i<items.length; i++)
			_array_pieces[_array_pieces.length]=fromDocument(items[i].firstChild);
		return _array_pieces;
	}
	else if(tag_name=='map') {
		// Map handling
		var _array_pieces=new Array();
		var keys=elem.childNodes;
		for(var i=0; i<keys.length; i++) {
			var k=keys[i].getAttribute('name');
			_array_pieces[k]=fromDocument(keys[i].firstChild);
		}
		return _array_pieces;
	}
}

function xml_request(struct,url_xml_rpc,encoding,callback,params) {
	request = toDocument(struct,encoding);
	_pieces = new Array();
	var messenger = XmlHttp.create();
	messenger.open("POST", url_xml_rpc, true);
	messenger.onreadystatechange = function() {
        if(messenger.readyState == 4) {
            try {
                try {
                    messenger.responseXML.documentElement.getElementsByTagName('map')[0].firstChild;
                    var res = fromDocument(messenger.responseXML.documentElement);
                }
                catch(ex) { 
                    var res = JSON.parse(messenger.responseText, function (k, v) { return v; });
                }
			}
            catch(ex) {
                alert(messenger.responseText);
			    print_error(js_dic_ERRORSESSION);
			    return false;
			}
            if (params == undefined)
                callback(res['response']['result'],struct['header']['type']);
            else
                callback(res['response']['result'],struct['header']['type'],params);
			}
            try {
				window.parent.document.getElementById('iframe').contentWindow.document.body.onclick();
			}
			catch(ex) { }
	}
	messenger.setRequestHeader("Content-Type", "text/xml");
	messenger.send(request);
}

function html_request(struct,url_xml_rpc,encoding,callback,where) {
	try { window.parent.document.getElementById('iframe').focus(); }
	catch(ex) {}
	request=toDocument(struct,encoding);
	_pieces=new Array();
	var template=XmlDocument.create();
	template.loadXML(request);
	var messenger=XmlHttp.create();
	messenger.open("POST", url_xml_rpc, true);
	messenger.onreadystatechange=function() {
		if(messenger.readyState==4) {
			callback(messenger.responseText,where);
			try {
				window.parent.document.getElementById('iframe').contentWindow.document.body.onclick();
			}
			catch(ex) { }
		}
	}
	messenger.setRequestHeader("Content-Type", "text/html");
	messenger.send(template.xml);
}

function get_page(url, callback) {
	var messenger = XmlHttp.create();
	messenger.open('GET', url, true);
	messenger.onreadystatechange = function() {
	    if (messenger.readyState == 4) {
	        callback(messenger.responseText);
	    }
	}
	messenger.send(null);
}

function print_error(text,el) {
	if (el !=null) {
		var pos=findPos(el);
		var left=parseInt(pos[0])+20;
		var top=parseInt(pos[1])-20;
	}
	else {
		var size = getPageSize();
		var left=(size[0]/2) - 150;
		var top=null;
	}
	hg('error').style.left=left;
	if (top!=null)
		hg('error').style.top=top;
	hg('error_text').innerHTML=text;
	hg('error').style.display='block';
	hg('error').style.visibility='visible';
	window.location='#error_anchor';
}

function hide_error() {
	hg('error').style.display='none';
}

function capitalize(str) {
	if(!str) return '';
	str=str.toLowerCase();
	var ap=str.split(' ');
	var new_str='';
	for(var i=0; i<ap.length; i++)
		new_str+=ap[i].substr(0,1).toUpperCase()+ap[i].substr(1,ap[i].length-1)+' ';
	return new_str.substr(0,new_str.length-1);
}

//Funzione per la formattazione di un prezzo (in base al locale)
function format_price(price, lingua) {
	lingua='it';
	var sub=Math.floor(price * 100)/100;
	var comma=lingua=='it' ? ',' : '.';
	var parts=('' + sub).split('.');
	var res='';
	if(parts.length==1) res=parts[0]+comma+'00';
	else if(parts[1].length==1) res=parts[0]+comma+parts[1]+'0';
	else res=parts[0]+comma+parts[1];
	return(res);
}

//Funzione per la formattazione di una data (in base al locale)
function format_data(data, lingua) {
	var res=data.charAt(8)+data.charAt(9)+'/'+data.charAt(5)+data.charAt(6)+'/'+data.charAt(0)+data.charAt(1)+data.charAt(2)+data.charAt(3);
	return(res);
}

//Funzione per la formattazione di una data e ora (in base al locale)
function format_timestamp(data, lingua) {
	var res=format_data(data, lingua);
	res +=' '+data.charAt(11)+data.charAt(12)+data.charAt(13)+data.charAt(14)+data.charAt(15);
	return(res);
}

//Dato l'ID di un elemento, restituisce la sua posizione [x,y].
function findPos(id) {
	try {
	var pos=new Array(0, 0, 0);
	var el=hg(id);
	var fieldset=0; // Altezza del fieldset, utilizzata per workaround
	if(!el) el=id;
	var obj=el;
	while(obj.tagName !='BODY') {
	if(obj.tagName=='FIELDSET') {
	fieldset=obj.offsetTop;
	}
	pos[1] +=obj.offsetTop;
	pos[0] +=obj.offsetLeft;
	obj=obj.offsetParent;
	}
	pos[2]=fieldset;
	return pos;
	}
	catch(ex) {alert('Elemento cercato: '+id+' Errore: '+ex);}
}

function compute_nights(from,to) {
	var ap=from.split('-');
	var new_from=ap[1]+'/'+ap[2]+'/'+ap[0];
	var ap=to.split('-');
	var new_to=ap[1]+'/'+ap[2]+'/'+ap[0];
	dataa=new Date(new_from);
	datap=new Date(new_to);
	secs=Math.abs(datap.getTime() - dataa.getTime());
	secs=Math.round(secs / (24 * 60 * 60 * 1000));
	return secs;
}

function emailControl(email) {
	if(email=='') return true;
	var at_pos=email.indexOf('@',0);
	if (at_pos==-1) return false;
	else {
		var dot_pos=email.indexOf('.',at_pos);
		if(dot_pos==-1) return false;
		else {
			var array_ext=new Array();
			var array_ext=email.substr(dot_pos+1,email.length).split('.');
			var ext=array_ext[array_ext.length-1].toLowerCase();
			for (var o=0; o < js_global_email_ext.length; o++)
				if (ext==js_global_email_ext[o])
					return true;
			return false;
		}
	}
}

// Trasforma la Y in true e N in false
function toBoolean(str) {
	if(str=='Y') return true;
	else return false;
}

function currency_symbol(iso) {
	if(js_dic_CURRENCYSYMBOLS[iso]) return js_dic_CURRENCYSYMBOLS[iso];
	else return iso;
}

function show_obj(obj_id) {
	hg(obj_id).style.display='block';
}

function hide_obj(obj_id) {
	hg(obj_id).style.display='none';
}

function inline_obj(obj_id) {
	hg(obj_id).style.display='inline';
}

function abilita(field_id) {
	hg(field_id).disabled=false;
}

function disabilita(field_id) {
	hg(field_id).disabled=true;
}

function addslashes(string) {
	return string.replace(/'/g,"\\'");
}

function stripslashes(string) {
	return string.replace(/\'/g,"\'");
}

function getFloat(value) {
	return Number(0.0 + value.replace(',','.'));
}

// ritorna true se la data e' valida
function isValidDate(day,month,year) {
	var valid=new Date(year,month-1,day); // decremento il mese * Js
	if((y2k(valid.getYear())==Number(year)) && (valid.getMonth()==Number(month-1)) && (valid.getDate()==Number(day)))
		return true;
	else
		return false
}

// mi assicuro che l'anno sia di 4 cifre (IE docet)
function y2k(number) {
	return (number < 1000) ? number + 1900 : number; 
}

//funzione simile a htmlentities
function e_h(string) {
	string=string.replace(new RegExp(/&/gi),'&amp;');
	string=string.replace(new RegExp(/"/gi),'&quot;');
	string=string.replace(new RegExp(/'/gi),'&apos;');
	string=string.replace(new RegExp(/</gi),'&lt;');
	string=string.replace(new RegExp(/>/gi),'&gt;');
	return string
}

//funzione simile al decode htmlentities
function decode_e_h(string) {
	string=string.replace(new RegExp(/&amp;/gi),'&');
	string=string.replace(new RegExp(/&quot;/gi),'"');
	string=string.replace(new RegExp(/&apos;/gi),"'");
	string=string.replace(new RegExp(/&lt;/gi),'<');
	string=string.replace(new RegExp(/&gt;/gi),'>');
	return string
}

// funzione per la creazione del menu dei comandi
// pre: riceve un array "commands" di n array associativi con due campi: label, action;
//	inoltre possono essere specificati: la label del primo elemento (che non sarà mai
//	una azione), il name della select (di default=commands_menu), l'id (di default=commands_menu)
// post:select con il menu dei comandi
function commands_menu(commands, c_first_element, c_name, c_id, c_class){
	// inizializzo le variabili
	var c_menu_name='';
	var c_menu_id='';
	var c_menu_first_element='--'+js_dic_COMMANDS+'--';
	var c_menu_class='commands_menu';
	if (c_name)
		c_menu_name=c_name;
	if (c_id)
		c_menu_id=c_id;
	if (c_first_element)
		c_menu_first_element=c_first_element;
	if (c_class)
		c_menu_class=c_class;
	// inizializzo la select
	var command_menu_code='<select id='+c_menu_id+' name='+c_menu_name+' class="'+c_menu_class+'" onChange="eval(this.value)">';
	// opzione base
	command_menu_code+='<option value="">'+c_menu_first_element+'</option>';
	// ciclo sull'array per creare tutte le opzioni
	for (i in commands)
		command_menu_code+='<option value="'+commands[i]['action']+'">'+commands[i]['label']+'</option>';
	// chiudo la select
	command_menu_code+='</select>';
	// ritorno il codice con la select popolata!
	return command_menu_code;
}

// FUNZIONE VAR_DUMP PER JAVA SCRIPT//
var box;
function var_dump(obj) {
	box=window.open('','Var_dump','resizable=yes,toolbar=no,scrollbars=yes,width=200,height=200');
	explore(obj,0,0,0,0,0);
	box.document.close();
}

// funzione ricorsiva che esamina l'elemento passato
function explore(obj,eln,inside,level) {
	var index='';
	var spaces='';
	for (var i=0; i < level;i++)
		spaces +='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
	index +=spaces;
	if (inside==0)
		index +='';
	else
		index +='[' + eln + ']&nbsp;=>&nbsp;';
	if (obj==null) {
	box.document.write(index + 'NULL<br>');
		return;
	}
	else if (typeof(obj)=='number') {
		box.document.write(index + 'number(' + obj + ')<br>');
		return;
	}
	else if (typeof(obj)=='string') {
		box.document.write(index + 'string(' + obj.length + ')&nbsp;"' + obj + '"<br>');
		return;
	}
	else if (typeof(obj)=='boolean') {
		box.document.write(index + 'bool(' + obj + ')<br>');
		return;
	}
	else if (typeof(obj)=='object') {
		var count=0;
		for (var i in obj)
			count++;
		if (count==0)
			box.document.write(index + 'array(' + count + ')&nbsp;{&nbsp;}<br>');
		else {
			box.document.write(index + 'array(' + count + ')&nbsp;{<br>');
			for (var i in obj) 
				explore(obj[i],i,1,level+1);
			box.document.write(spaces + spaces + '}<br>');
		}
		return;
	}
	else {
	box.document.write(index + 'NULL<br>');
		return;
	}
	return;
}

// Funzione per il controllo sui dati inseriti che devono essere di tipo "number". Elem rappresenta l'id dell'elemento da cui proviene l'input 
// (original_class la sua classe di stile che in caso di inserimento di dati non corretti, a seguito di una evidenziazione dell'errore, verrebbe persa).
// Type rappresenta il tipo del numero default float. Default_value e' il valore di default (default 0) che viene impostato al posto di un numero errato.
// Se viene dato il valore "admit_null" a default_value viene ammesso un valore nullo
// La funzione sostituisce le virgole con il punto.
function is_number(number, elem, type, default_value, original_class){
	// controllo se esiste una classe
	if (!original_class)
		original_class='';
	// se non e' settato il default impostalo a 0
	if (!default_value)
		default_value=0;
	// controllo se viene definito il type del numero
	if (!type)
		type='float';
	// altrimenti se non e' ammesso un valore e number non e' null
	if(number.length>0){
		// sostituisco eventuali virgole con il punto
		number=number.replace(new RegExp(/,/gi),'.');
		// se non e' un numero reimposto il value al suo valore di default
		if (isNaN(number)){
			hg(elem).value=default_value;
			hg(elem).className=' hightlight';
		}
		else{
			if (type=='float')
				hg(elem).value=number;	// così modifico anche eventuali numeri formattati con la virgola
			else
				hg(elem).value=parseInt(number);	 // così modifico il numero impostandolo a numero intero
			hg(elem).className=original_class;
		}
	}
	else if(default_value !='admit_null'){
		hg(elem).value=default_value;
		hg(elem).className=' hightlight';
	}
}

// Aggiungi ai preferiti
function bookmark(url_page,title) {
	if ((navigator.appName=="Microsoft Internet Explorer")&&(parseInt(navigator.appVersion)>=4))
		window.external.addFavorite(url_page, title);
	else
	 alert(js_dic_NOADDBOOKMARKS);
	
	// Traccio la pressione del bottone
	    var mess_debug = XmlHttp.create();
	    mess_debug.open("GET", js_global_root_url+"xml_rpc/bookmark_alert.php", true);
	    mess_debug.send('');
}

// passato l'id di un menu select ne ritorna il testo della voce selezionata
function get_select_name(selectname) {
	var name='';
	var select=hg(selectname);
	var options=select.options;
	for (var o=0; o<options.length; o++)
		if(options[o].selected) name=options[o].text;
	if(name=='***') name='';
	return name;
}

// controlla che tipo di display fare sulle righe di una tabella in base al tipo di browser
function display_for_browser() {
	if(navigator.appName=='Microsoft Internet Explorer') return 'block';
	else return 'table-row';
}

function hide_selects() {
	BrowserDetect.init();
	if (BrowserDetect.browser=='Explorer') {
		var selects=document.getElementsByTagName('select');
		for (var i=0; i < selects.length; i++)
		selects[i].style.visibility='hidden';
	}
}

function show_selects() {
	var selects=document.getElementsByTagName('select');
	for (var i=0; i < selects.length; i++)
	selects[i].style.visibility='visible';
}

function after(date1, date2) {
	var major=new Array();
	var minor=new Array();
	major=date1.split('/');
	minor=date2.split('/');
	if(major[2] > minor[2]) return true;	// se l'anno della prima è maggiore allora torna vero
	else if(major[2] < minor[2]) return false; // se l'anno della prima è minore allora torna falso
	else if(major[1] > minor[1]) return true; // a parita' di anno, se il mese della prima è maggiore ritorna vero
	else if(major[1] < minor[1]) return false;	// se invece è minore torna falso
	else if(major[0] >=minor[0]) return true; // a parita' di anno e mese, se il primo giorno è maggiore o uguale torno vero
	else return false;	// altrimenti torno falso
}

// passate due date nel formato gg/mm/aa, ritorna true se la prima è minore/uguale della seconda
function before(date1, date2) {
	var minor=new Array();
	var major=new Array();
	minor=date1.split('/');
	major=date2.split('/');
	if(major[2] > minor[2]) return true;	// se l'anno della prima è maggiore allora torna vero
	else if(major[2] < minor[2]) return false; // se l'anno della prima è minore allora torna falso
	else if(major[1] > minor[1]) return true; // a parita' di anno, se il mese della prima è maggiore ritorna vero
	else if(major[1] < minor[1]) return false;	// se invece è minore torna falso
	else if(major[0] >=minor[0]) return true; // a parita' di anno e mese, se il primo giorno è maggiore o uguale torno vero
	else return false;	// altrimenti torno falso
}

// passate due date nel formato aaaa-mm-gg, ritorna true se la prima è minore/uguale della seconda
function tsbefore(date1, date2) {
	var minor=new Array();
	var major=new Array();
	minor=date1.split('-');
	major=date2.split('-');
	if(major[0] > minor[0]) return true;	// se l'anno della prima è maggiore allora torna vero
	else if(major[0] < minor[0]) return false; // se l'anno della prima è minore allora torna falso
	else if(major[1] > minor[1]) return true; // a parita' di anno, se il mese della prima è maggiore ritorna vero
	else if(major[1] < minor[1]) return false;	// se invece è minore torna falso
	else if(major[2] >=minor[2]) return true; // a parita' di anno e mese, se il primo giorno è maggiore o uguale torno vero
	else return false;	// altrimenti torno falso
}

// mostrano i puntini animati dopo la scritta loading
function show_loading() {
	if(hg('loading')) {
		var loading=hg('loading');
		loading.innerHTML='';
		loading.style.display='block';
		loading.innerHTML=js_dic_LOADING;
		write_loading('');
	}
}

function write_loading(dots) {
	var loading=hg('loading');
	dots +='.';
	// limito la scrittura di puntini
	if(loading.innerHTML==js_dic_LOADING+'...')
		loading.innerHTML=js_dic_LOADING;
	else
		loading.innerHTML +='.';
	// metto un controllo per fermare l'esecuzione ciclica
	if(dots !='..........')
		window.setTimeout('write_loading(\''+dots+'\')', 1500);
}

function hide_loading() {
	if(hg('loading'))
		hg('loading').style.display='none';
}

function print_page() {
	self.print();
}

function session_keep_alive()	{
	var url_xml_rpc_=js_global_root_url+'xml_rpc/call.php';
	var struct_param_=new Array();
	struct_param_['header']=new Array();
	struct_param_['query']=new Array();
	struct_param_['header']['version']='1.0.0';
	struct_param_['header']['product']='session';
	struct_param_['header']['sessid']=sessid;
	var iso_encoding_='utf-8';
	struct_param_['header']['type']='keep_alive';
	xml_request(struct_param_,url_xml_rpc_,iso_encoding_,no_action);
}

// Nessuna azione
function no_action()	{
	setTimeout(session_keep_alive,300000);
	return true;	
}

// Apre una box
function show_box(id,intest) {
	var text='';
	var pos=findPos(intest);
	var elt=hg(id);
	elt.style.display='block';
	var delta=findPos(elt);
	elt.style.top=pos[1]+15;
	elt.style.left=pos[0];
	return true;
}

// Nasconde una box
function hide_box(id) {
	var elt=hg(id);
	elt.style.display='none';
	return true;
}

var BrowserDetect={
	init: function () {
		this.browser=this.searchString(this.dataBrowser) || "An unknown browser";
		this.version=this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || "an unknown version";
		this.OS=this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString=data[i].string;
			var dataProp=data[i].prop;
			this.versionSearchString=data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) !=-1)
					return data[i].identity;
			}
			else if (dataProp) return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index=dataString.indexOf(this.versionSearchString);
		if (index==-1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [ 
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{	// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 	// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};

//applica opacita' ad un oggetto
function setOpacity(id, value) {
	if (typeof(id)=='string') element=hg(id);
	else element=id;
	BrowserDetect.init();
	try {
		switch(BrowserDetect.browser) {
			case 'Explorer':
				element.filters.alpha.opacity=value;
				break;
			case 'Mozilla':
			case 'Firefox':
			case 'Netscape':
				element.style.MozOpacity=value / 100;
				break;
			default:
				element.style.opacity=value / 100;
				break;
		}
	}
	catch(ex) {}
}

function inputsOpacity(id, value) {
	if (id==null)	var inputs=document.getElementsByTagName('input');
	else var inputs=hg(id).getElementsByTagName('input');
	for (var i=0; i < inputs.length; i++)
		setOpacity(inputs[i], value);
}

// se esiste, ritorna il value di un elemento della pagina
// (da usare SOLO con elementi che ammettono un value, ovviamente!)
function get_value(obj_id) {
	if(hg(obj_id)) return hg(obj_id).value;
	else return false;
}

// funziona che ritorna true o false in base all'esistenza nel document di un elemento con l'id passato
function exist(id_obj) {
	if(hg(id_obj)) return true;
	else return false;
}

function in_array(element, array){
	try {
		for (var i=0; i < array.length; i++)
			if (array[i]==element) return true;
	}
	catch(ex) {
		for (var i in array)
			if (array[i]==element) return true;
	}
	return false;
}

// se esiste, ritorna true o false se un elemento di tipo checkbox o radiobutton è selezionato o meno
// (se l'elemento non è un checkbox o un radiobutton, ritorna errore)
function is_checked(obj_id) {
	if(hg(obj_id)) {
		var obj=hg(obj_id);
		// poi controllo che sia di tipo checkbox o di tipo radiobutton
		if(obj.getAttribute('type')=='checkbox' || obj.getAttribute('type')=='radio')
			if(obj.checked) // e infine se è selezionato
				return true;
	}
	return false;
}

// passati giorno, mese e anno, ritorna il codice del giorno della settimana corrispondente
function get_week_day(day, month, year) {
	month=Number(month)-1;
	var currentdate=new Date(year, month, day, 0, 0, 0);
	return currentdate.getUTCDay();
}

// scrive un numero in 2 cifre (CHI HA VOGLIA SOSTITUISCA CON UN ESPRESSIONE REGOLARE, TNX)
function format_number(num) {
	if(num<10) return '0'+num;
	else return num;
}

function compute_landing_time() {
	// Signal appena carico la landing page
	var mess_debug=XmlHttp.create();
	mess_debug.open("GET", "http://www.hotelsclick.com/xml_rpc/landing_time.php?PHPSESSID="+sessid, true);
	mess_debug.send('');
}

function showbody() {document.body.style.display='block';}
function hidebody() {document.body.style.display='none';}

function getPageSize() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return [myWidth, myHeight];
}