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

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

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

var _pieces=new Array();
function toDocument(struct,encode)	{
	_pieces=new Array();
	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>';
	}
}
/**
*   Invia una richiesta ajax.
*   1. "struct" = parametri per la ricerca
*   2. "url_json_rpc" = script a cui inviare la richiesta
*   3. "encoding" = codifica
*   4. "cb" = nome della funzione di ritorno
*   5. "type" = se uguale a "filter" invia una richiesta con dataType in html, altrimenti in json
*/
function json_request(struct,url_json_rpc,encoding,cb,type) {
   //var request=toDocument(struct,encoding);
   var request = $.toJSON(struct);
   if(type=='filter')
       var dataType = 'html';
   else
       var dataType = 'json';
   var htype=struct['header']['type']+'';
   $.ajax({
   url: url_json_rpc,
   processData: false,
   type: 'POST',
   contentType: 'text/xml',
   data: request,
   dataType: dataType,
   success: function(res){
       if(typeof(res)=='object') cb(res['response']['result'],htype);
       else cb(res,htype);
   }
   });
}

function html_request(struct,url_xml_rpc,encoding,callback,where) {
	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);
		}
	}
	messenger.setRequestHeader("Content-Type", "text/html");
	messenger.send(template.xml);
}

function print_error(text,el) {
	alert(text);
	/*
	if (el !=null) {
		var pos=findPos(el);
		var left=parseInt(pos[0])+20;
		var top=parseInt(pos[1])-30;
	}
	else {
		var left=240;
		var top=210;
	}
	hg('error').style.left=left;
	hg('error').style.top=top;
	hg('error_text').innerHTML=text;
	hg('error').style.display='block';
	hg('error').style.visibility='visible';
	window.location='#eanchor';
	*/
}

//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);
}

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();
			/* TOLGO TEMPORANEAMENTE IL CONTROLLO
			for (var o=0; o < js_global_email_ext.length; o++)
				if (ext==js_global_email_ext[o])
					return true;
			return false;
			*/
			return true;
		}
	}
}

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 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;
}

// 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('');
}

// 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';
}

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) {}
}

// 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;
}

// 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;
}

