// funzione che controlla se i campi di un form sono compilati correttamente
function field_control(callback, reload_url) {	
	reset_errors();
	var elem_name; 	var elem_value; var elem_type; var elem_id;
	
	// controllo eventuali select siano state settate e non lasciate sull'opzione 'scegli'
	var arraycampi = form_obj.getElementsByTagName('select');
	for (i = 0; i < arraycampi.length; i++) {
		elem_id = arraycampi[i].getAttribute('id');
		elem_value = arraycampi[i].value;
		if(elem_value == '***' && document.getElementById('err_'+elem_id)) {
			document.getElementById('err_'+elem_id).innerHTML = ' '+js_dic_ERRORNOTYPE;
			return false;
		}
	}
	
	// controllo che i campi obbligatori non siano vuoti e la correttezza di eventuali mail
	var arraycampi = form_obj.getElementsByTagName('input');
	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 == '' && document.getElementById('err_'+elem_name)) {
				document.getElementById('err_'+elem_name).innerHTML = ' '+js_dic_ERRORCOMPULSORYFIELD;
				return false;
			}
			if(elem_name.indexOf('email') >= 0 && document.getElementById('err_'+elem_name)) {
				if(!emailControl(elem_value)) {
					document.getElementById('err_'+elem_name).innerHTML = ' '+js_dic_ERRORWRONGMAIL;
					return false;
				}
			}
		}
	}	
	callback(reload_url);
}


// funzione che controlla se un campo ha lunghezza compres tra 5 e 12
function lenght_control(value) {
	var_dump('lenght control in utilities.js')
	if(value.length < 5 || value.length > 12)
		return false;
	else
		return true;
}

//funzione che controlla se la un campo ha lunghezza almeno 6 caratteri
function length_pwd(value){
	if(value.length >= 6)
		return true;
	else 
		return false;
}

// funzione che controlla la correttezza di un indirizzo email
function emailControl(email){
	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];
			for (var o = 0; o < js_email_ext.length; o++) {
				if (ext == js_email_ext[o])
					return true;
			}
			return false;
		}
	}
}

function reset_errors() {
	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(document.getElementById('err_'+elem_name))
				document.getElementById('err_'+elem_name).innerHTML = '';
		}
	}
	
	var arraycampi = document.getElementsByTagName('select');
	var elem_name;
	var elem_type;
	for (i = 0; i < arraycampi.length; i++) {
		elem_type=arraycampi[i].getAttribute('type');
		elem_name = arraycampi[i].getAttribute('name');
		if(document.getElementById('err_'+elem_name))
			document.getElementById('err_'+elem_name).innerHTML = '';
	}
	if(document.getElementById('error') != null){
		document.getElementById('error').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('&', '&amp;'); 			// Escaping entities
		value = value.replace('<', '&lt;');
		value = value.replace('>', '&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
		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 = '';
		        //var type = elem.getAttribute('type');
		        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;
	        }
}

//@param:
//struct: struttura da passare in xml
//url_xml_rpc: url per chiamare la call
//encoding: tipo di codifica xml
//callback: funzione da richiamare dopo aver finito il tutto
function xml_request(struct, url_xml_rpc, encoding, callback) {
	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){
			try{
				messenger.responseXML.documentElement.getElementsByTagName('map')[0].firstChild;				
				var res = fromDocument(messenger.responseXML.documentElement);
			}
			catch(ex){
				alert(messenger.responseText);
				//alert("errore");
				print_error(js_dic_ERRORSESSION);
				return false;
			}
			
			callback(res['response']['result'],struct['header']['type']);
		}
	}
	messenger.setRequestHeader("Content-Type", "text/xml");
	messenger.send(template.xml);
}

//@param: 
//struct: array contenente la struttura da mettere in XML
//url_xml_rpc: url con l'indirizzo della call.php
//encoding: struttura della codifica xml
//callback: puntatore alla funzione da chiamare alla fine
//where: dice dove, nella pagina, andr� visualizzato il testo che gli riporto
//@return: null
function html_request(struct,url_xml_rpc,encoding,callback,where) {
	//in request metto l'xml creato dalla toDocument
	request = toDocument(struct,encoding);
	_pieces = new Array();
	//in template inserisco l'XML
	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) {
					//chiamo la funzione che ho passato come parametro
					callback(messenger.responseText,where);
				}
	}   
	messenger.setRequestHeader("Content-Type", "text/xml");
	messenger.send(template.xml);
}

function print_error(text) {
	// document.getElementById('error').innerHTML = text;
	alert(text);
}

function print_warning(text) {
	var warning=document.getElementById('warning');
	if(warning){
		warning.innerHTML = text;
		warning.style.visibility = 'visible';
	}
}

function hide_error() {
	document.getElementById('error').style.visibility = 'hidden';
}

function hide_warning() {
	var warning=document.getElementById('warning');
	if(warning)
		warning.style.visibility = 'hidden';
}

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);
}

// Aggiungi ai preferiti
function addPage() {
	if((navigator.appName=="Microsoft Internet Explorer") && (parseInt(navigator.appVersion)>=4))
		window.external.addFavorite(js_global_root_url, js_dic_PAGETITLE);
        else {
		var msg = eval('top.vuoto.no_addbookmarks_'+top.vuoto.client_language);
		alert(msg);
        }
        var template = XmlDocument.create();
        var request = '<?xml version="1.0" encoding="UTF-8" ?><query type="add_bookmark">nessun parametro</query>';
        template.loadXML(request);
        var messenger = XmlHttp.create();
        messenger.open("POST", js_global_root_url+"include/xml_request/addBookmark.php", true);
        messenger.setRequestHeader("Content-Type", "text/xml");
        messenger.send(template.xml);
}

// Funzione per la formattazione di un prezzo (in base al locale)
function format_price(price, lingua) {
	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) {
	if(lingua=='it')
		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);
	else 
		var res = data;
	return(res);
}

// Dato l'ID di un elemento, restituisce la sua posizione [x,y]
function findPos(id) {
	var pos = new Array(0, 0, 0);
	var el = document.getElementById(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;
}

// Controlla se una data è valida
function check_date(year, month, day) { 
	date = new Date(year, month-1, day);
	
	if(date.getDate() == day)
		return true;
	return false;
}

// Calcola il numero di giorni tra due date (aaaa-mm-gg)
function compute_days(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 = datap.getTime() - dataa.getTime();
	secs = Math.round(secs / (24 * 60 * 60 * 1000));
	
	return secs;
}

// mostra la scritta loading
function start_loading() {
	document.getElementById('loading').style.display ='inline';
}

// nasconde la scritta loading
function stop_loading() {
	document.getElementById('loading').style.display ='none';
}

// trasforma la Y in true e N in false
function toBoolean(str) {
	if(str=='Y') return true;
	else return false;
}

// ritorna il simbolo corrispondente al codice ISO di una valuta
function currency_symbol(iso) {
	if(js_dic_CURRENCYSYMBOLS[iso]) return js_dic_CURRENCYSYMBOLS[iso];
	else return iso;
}

// nasconde e rivisualizza il box interno per fargli prendere le dimensioni giuste
function refresh_box() {
	document.body.style.display = 'none';
	document.body.style.display = 'block';
}

// passate due date nel formato gg/mm/aaaa, ritorna true se la prima è maggiore/uguale alla seconda
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
}

// forza una stringa rappresentante un numero ad essere float
function format_float(number) {
	return Number(0.0 + number.replace(',','.'));
}

// forza una stringa rappresentante un numero ad essere float
function format_two_digits(number) {
	if(number < 10)
		return '0'+number;
	else
		return number;
}

// 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';
}

/* FUNZIONE VAR_DUMP PER JAVA SCRIPT */
var box;
function var_dump(obj) {
	box = window.open('','Var_dump','resizable=yes,toolbar=no,width=200,height=200');
	explore(obj,0,0,0,0,0);
}

// 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 (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;
}
/*
    autore: Marco Noiman
    release 1 - 25-03-2009
    descrizione : copia della funzione field_control a cui è stata tolta la collback() per disaccopiare
    le funzioni
    controlla  e valida i campi della form controllandone la obbligatorietà
    return : false mostrando accanto al campo l'obbligatorieta
             true se ok
 
*/
function validate_field(){
   	reset_errors();
    var elem_name; 	var elem_value; var elem_type; var elem_id;
	
   	// controllo eventuali select siano state settate e non lasciate sull'opzione 'scegli'
	var arraycampi = form_obj.getElementsByTagName('select');
	for (i = 0; i < arraycampi.length; i++) {
		elem_id = arraycampi[i].getAttribute('id');
		elem_value = arraycampi[i].value;
		if(elem_value == '***' && document.getElementById('err_'+elem_id)) {
			document.getElementById('err_'+elem_id).innerHTML = ' '+js_dic_ERRORNOTYPE;
			return false;
		}
	}
	// controllo che i campi obbligatori non siano vuoti e la correttezza di eventuali mail
	var arraycampi = form_obj.getElementsByTagName('input');
	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 == '' && document.getElementById('err_'+elem_name)) {
				document.getElementById('err_'+elem_name).innerHTML = ' '+js_dic_ERRORCOMPULSORYFIELD;
				return false;
			}
			if(elem_name.indexOf('email') >= 0 && document.getElementById('err_'+elem_name)) {
				if(!emailControl(elem_value)) {
					document.getElementById('err_'+elem_name).innerHTML = ' '+js_dic_ERRORWRONGMAIL;
					return false;
				}
			}
		}
	}
	return true;
}

function read_data_write_param(){
	struct_param['query'] = new Array();
	var fields = form_obj.getElementsByTagName('input');
	var elem_name;
	var elem_value;
	var elem_type;
	for (i = 0; i < fields.length; i++){
		elem_type = fields[i].getAttribute('type');
		elem_name = fields[i].getAttribute('name');
		if(elem_type != "reset" && elem_type != "button" && elem_name != "pwdconfirm" && elem_type != "radio"){
			elem_value = fields[i].value;
			if(elem_value != '' && fields[i].parentNode.parentNode.style.display != 'none')     // passo solo i campi non vuoti e non nascosti da js
				struct_param['query'][elem_name] = elem_value;
		} else if(elem_type == "radio" && fields[i].checked){
			elem_value = fields[i].value;
			struct_param['query'][elem_name] = elem_value;			
		}
	}
	
	var fields = form_obj.getElementsByTagName('select');
	for (i = 0; i < fields.length; i++){
		if(fields[i].parentNode.parentNode.style.display != 'none') {     // passo solo i valori delle select non nascoste da js
			elem_name = fields[i].getAttribute('name');
			elem_value = fields[i].value;
			struct_param['query'][elem_name] = elem_value;
		}
	}

}
/* FINE VAR_DUMP */
function open_new_window(path_link){
	window.location(path_link);
}
/**************************************
Controllo del Codice Fiscale
Linguaggio: JavaScript
***************************************/

function ControllaCF(cf){
	var validi, i, s, set1, set2, setpari, setdisp;
	
	if( cf == '' )  return "ko";
 
	cf = cf.toUpperCase();
	
	if( cf.length != 16 ){
		return js_dic_ERROR_TAX_LENGTH;
	}
	validi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	for( i = 0; i < 16; i++ ){
		if( validi.indexOf( cf.charAt(i) ) == -1 ){
			return  js_dic_ERROR_TAX_CHAR_HEAD + cf.charAt(i) +	js_dic_ERROR_TAX_CHAR_FOOT;
		}
	}
	set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
	setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX";
	s = 0;
	for( i = 1; i <= 13; i += 2 )
		s += setpari.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
	for( i = 0; i <= 14; i += 2 )
		s += setdisp.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
	if( s%26 != cf.charCodeAt(15)-'A'.charCodeAt(0) ){
		return js_dic_ERROR_TAX_CODE_CONTROLL;		
	}
	return "ok";
}
/*****************************************
Controllo della Partita I.V.A.
Linguaggio: JavaScript
******************************************/

function ControllaPIVA(pi){
	if( pi == '' )  return 'ko';
	if( pi.length != 11 ){
		return js_dic_ERROR_VAT_NUMBER_LENGTH;
	}
	validi = "0123456789";
	for( i = 0; i < 11; i++ ){
		if( validi.indexOf( pi.charAt(i) ) == -1 ){
			return js_dic_ERROR_VAT_NUMBER_CHAR_HEAD + pi.charAt(i) + js_dic_ERROR_VAT_NUMBER_CHAR_FOOT;			
		}
	}
	s = 0;
	for( i = 0; i <= 9; i += 2 ){
		s += pi.charCodeAt(i) - '0'.charCodeAt(0);	
	}
	
	for( i = 1; i <= 9; i += 2 ){
		c = 2*( pi.charCodeAt(i) - '0'.charCodeAt(0) );
		if( c > 9 )  c = c - 9;
		s += c;
	}
	if( ( 10 - s%10 )%10 != pi.charCodeAt(10) - '0'.charCodeAt(0) ){
		return js_dic_ERROR_VAT_NUMBER_CODE_CONTROLL;
		
	}
	return 'ok';
}

// get the text description from selectio obj
// parameters : selection,value

function get_text_selection(objSelection, valueSelect){
	var descriptionText = "";
	if (objSelection != null){
		 for (i=0;i < objSelection.length; i++){
			 if(objSelection.options[i].value == valueSelect){
				 descriptionText = objSelection.options[i].text;
			 }
		 }		
	}
	return descriptionText;
}


function build_box(content,table_width){
	//  ;
	var $box_layout = "";
	
	if(table_width != null){
		$box_layout += 	'<table cellspacing="0" cellpadding="0" width="' + table_width + 'px;">';
	} else {
		$box_layout += 	'<table cellspacing="0" cellpadding="0">';
	}
	
	$box_layout += 	'<table cellspacing="0" cellpadding="0">';
	$box_layout += 	'<tr>';
	$box_layout += 	'<td class="box_main_lt"><img alt="" src="'+ js_global_images_url +'corner_lt.gif"></img></td>';
	$box_layout += 	'<td class="box_main_ct"></td>';
	$box_layout += 	'<td class="box_main_rt"><img alt="" src="'+ js_global_images_url +'corner_rt.gif"></img></td>';
	$box_layout += 	'</tr>';
	$box_layout += 	'<tr>';
	$box_layout += 	'<td class="box_main_content_l"></td>';
	$box_layout += 	'<td class="box_main_content_c">' + content + '</td>';
	$box_layout += 	'<td class="box_main_content_r"></td>';
	$box_layout += 	'</tr>';
	$box_layout += 	'<tr>';
	$box_layout += 	'<td class="box_main_lb"><img alt="" src="'+ js_global_images_url +'corner_lb.gif"></img></td>';
	$box_layout += 	'<td class="box_main_cb"></td>';
	$box_layout += 	'<td class="box_main_rb"><img alt="" src="'+ js_global_images_url +'corner_rb.gif"></img></td>';
	$box_layout += 	'</tr></table>';
	return $box_layout;
	
}