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

function xml_request(struct,url_xml_rpc,encoding,cb) {
   var request=toDocument(struct,encoding);
   var htype=struct['header']['type']+'';
   $.ajax({
   url: url_xml_rpc,
   processData: false,
   type: 'POST',
   contentType: 'text/xml',
   data: request,
   dataType: 'json',
   success: function(res){cb(res['response']['result'],htype);}
   });
}

function print_error(text,el) {
	alert(text);
}

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

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

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 addslashes(string) {
	return string.replace(/'/g,"\\'");
}

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

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

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

// 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_loading() {
	if(hg('loading'))
		hg('loading').style.display='none';
}

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

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