	
	var g_display = new Object;
	g_display['table'] = 'table'; 				
	g_display['tr'] = 'table-row'; 					
	g_display['td'] = 'table-cell'; 				
	g_display['th'] = 'table-cell'; 				
	g_display['li'] = 'list-item'; 					
	g_display['caption'] = 'table-caption'; 		
	g_display['tbody'] = 'table-row'; 		//Temporary change to resolve Safari bugs to render 'table-row-group';
	g_display['thead'] = 'table-header-group'; 		
	g_display['tfoot'] = 'table-footer-group'; 		
	g_display['col'] = 'table-column';				
	g_display['colgroup'] = 'table-column-group';	

	function dom_include(script_filename)
	{
		//not work in safari 2.0!! use document.writ
		var html_doc = document.getElementsByTagName('head').item(0);
		var js = document.createElement('script');
		js.setAttribute('language', 'javascript');
		js.setAttribute('type', 'text/javascript');
		js.setAttribute('src', script_filename);
		html_doc.appendChild(js);
		return false;
	}

	function dom_display (obj, is_vis)
	{
		if (!obj) return;
		if (is_vis)
		{
			if (document.all)
				display = 'block';
			else
			{
				var display = g_display[obj.nodeName.toLowerCase()];
				if (!display)
					display = 'block';
			}
		}
		else
			display = 'none';
		obj.style.display = (display);
	}
	
	function dom_display_toggle (obj, default_value)
	{
		if (!obj) return;
		if (!obj.style.display || obj.style.display=='')
			dom_display (obj, default_value ? 'block' : 'none');
		else
			dom_display (obj, (obj.style.display == 'none') ? true : false);
	}

	function dom_show (obj, is_vis)
	{
		if (!obj) return;
		obj.style.visibility = (is_vis ? 'visible' : 'hidden');
	}

	function dom_class_remove (obj, deleting_class)
	{
		if (obj && obj.className)
		{
			if (obj.className.indexOf (deleting_class != -1))
			{
				if (!document.reg_hash)
					document.reg_hash = new Object();
				if (!document.reg_hash[deleting_class])
					document.reg_hash[deleting_class] = new RegExp ('\\s*' + deleting_class, 'gi');

				obj.className = obj.className.replace (document.reg_hash[deleting_class], '');
			}
		}
	}
	
	

	function dom_class (obj, toggle_class, is_to_add)
	{
		if (obj)
		{
			if (is_to_add)
			{
				if (obj.className.indexOf (toggle_class) == -1)
					obj.className += ' ' + toggle_class;
			}
			else if (toggle_class)
				dom_class_remove (obj, toggle_class);
			else
			{
				try			{	return  obj.className;	}
				catch (exc)	{ 	return null;			}
			}
		}
	}

	function dom_remove_all_childs (obj)
	{
		if (!obj) return;
		while (obj.firstChild)
		{
			obj.removeChild (obj.firstChild);
		}
	}


	function dom_prev (cur_obj, node_name)
	{
		while ((cur_obj = cur_obj.previousSibling) != null)
		{
			if (cur_obj.nodeName == node_name || cur_obj.nodeName == node_name.toUpperCase())
			{
				return cur_obj;
			}
		}
		return null;
	}

	function dom_next (cur_obj, node_name)
	{
		if (cur_obj != null)
		{
			while ((cur_obj = cur_obj.nextSibling) != null)
			{
				if (cur_obj.nodeName == node_name || cur_obj.nodeName == node_name.toUpperCase())
				{
					return cur_obj;
				}
			}
		}
		return null;
	}

	function dom_up (cur_obj, node_name)
	{
		do
		{
			if (cur_obj.nodeName == node_name || cur_obj.nodeName == node_name.toUpperCase())
			{
				return cur_obj;
			}
		}
		while ((cur_obj = cur_obj.parentNode) != null);

		return null;
	}

	function dom_upper (cur_obj, node_name)
	{
		while ((cur_obj = cur_obj.parentNode) != null)
		{
			if (cur_obj.nodeName == node_name || cur_obj.nodeName == node_name.toUpperCase())
			{
				return cur_obj;
			}
		}

		return null;
	}

	function dom_down (cur_obj, node_name, all_found)
	{
		if (!cur_obj)
			return null;
		if (all_found)
		{
			var child_found = new Array ();
			childs = cur_obj.childNodes;
			for (child_index = 0; child_index < childs.length; child_index++)
			{
				child = childs[child_index];
				if (child.nodeName && (child.nodeName == node_name || child.nodeName == node_name.toUpperCase()))
				{
					child_found[child_found.length] = child;
				}
			}
			return child_found;
		}
		else
		{
			childs = cur_obj.childNodes;
			for (child_index = 0; child_index < childs.length; child_index++)
			{
				child = childs[child_index];
				if (child.nodeName && (child.nodeName == node_name || child.nodeName == node_name.toUpperCase()))
				{
					return child;
				}
			}
			return null;
		}
		return null;
	}


	
	function dom_first_child (obj) {
		childs = obj.childNodes;
		for (child_index = 0; child_index < childs.length; child_index++)
		{
			child = childs[child_index];
			if (child.nodeType == Node.ELEMENT_NODE)
				return child;
		}
		return null;
	}

	function dom_child (obj, name)
	{
		childs = obj.childNodes;
		for (child_index = 0; child_index < childs.length; child_index++)
		{
			child = childs[child_index];
			if (child.getAttribute && child.getAttribute ('name') == name)
				return child;
		}
		return null;
	}


	function dom_anchestor (cur_obj, node_name)
	{
		while ((cur_obj = cur_obj.parentNode))
		{
			if (cur_obj.getAttribute && cur_obj.getAttribute('name') == node_name)
			{
				return cur_obj;
			}
		}

		return null;
	}
	
	function dom_descendants(obj, filter, dest_array) {
		var childs = obj.childNodes
		for (var child_index = 0; child_index < childs.length; child_index++)
		{
			var child = childs[child_index];
			if (child.nodeType == Node.ELEMENT_NODE)
			{
				if (filter)
				{
					if (filter(child))
						dest_array.push(child);
				}
				else
					dest_array.push(child);
				dom_descendants(child, filter, dest_array);
			}
		}
	}
	
	function dom_xml_string (xml_doc)
	{
		var serializer = new XMLSerializer();
		var xml = serializer.serializeToString(xml_doc);
		return xml;
	}

	function namedTagChild (obj, tag, name)
	{
		childs = obj.getElementsByTagName (tag);
		for (child_index = 0; child_index < childs.length; child_index++)
		{
			child = childs[child_index];
			if (child.getAttribute && child.getAttribute ('name') == name)
				return child;
		}
		return null;
	}

	//smart method without father node and new_node as last params, compatible with  '#document-fragment' insertion

		function dom_remove (obj)
		{
			obj.parentNode.removeChild (obj);
		}
	
		function dom_delete (obj)
		{
			if (obj && obj.parentNode)
			{
				obj.parentNode.removeChild (obj);
				obj = null;
			}
		}

		function dom_insert_before (father, obj, new_node)
		{
			output_node =  (new_node.nodeName == '#document-fragment') ?  new_node.firstChild : new_node;
			father.insertBefore (new_node, obj);
			return output_node;
		}
	
		function dom_insert_after (cur_obj, new_node)
		{
			next_obj = dom_next (cur_obj, cur_obj.nodeName);
			return dom_insert_before (cur_obj.parentNode, next_obj, new_node)
		}
	
		function dom_replace (cur_obj, new_node)
		{
			new_node = dom_insert_before (cur_obj.parentNode, cur_obj, new_node)
			dom_remove (cur_obj);
			return new_node;
		}
	
		function dom_insert_first_child (cur_father, new_node)
		{
			childs = cur_father.childNodes;
			return dom_insert_before (cur_father, ((childs && childs[0]) ? childs[0] : null), new_node) ;
		}


		function dom_page_pos(obj) 
		{
			var curleft = curtop = 0;
			if (obj.offsetParent) {
				curleft = obj.offsetLeft
				curtop = obj.offsetTop
				while (obj = obj.offsetParent) {
					curleft += obj.offsetLeft
					curtop += obj.offsetTop
				}
			}
			return [curleft,curtop];
		}

	function dom_props (node)
	{
		dom_prop_text = '';
		for (prop in node)
		{
			value = '-';
			try
			{
				value = node[prop];
			}
			catch (err)
			{
			}
			dom_prop_text += (prop + "= " + value + '\n');
		}
		return dom_prop_text;
	}

	//xslt

	function dom_html_set (target_node, html_text)
	{
		if (target_node.outerHTML)
		{
			try
			{
      			target_node.outerHTML = html_text;
      		}
      		catch (e) 
      		{
      			var tn = target_node.tagName;
				if (tn=='TBODY' || tn=='TR' || tn=='TD')
				{
					var tempDiv = document.createElement("div");
					tempDiv.innerHTML = '<table id="tempTable" style="display: none">' + html_text + '</table>';
					return target_node.parentNode.replaceChild(tempDiv.getElementsByTagName(tn).item(0), target_node);
				}
			}
      	}
      	else
      	{
			var range = document.createRange();
			range.selectNode(target_node);
			var documentFragment = range.createContextualFragment(html_text);
			return target_node.parentNode.replaceChild(documentFragment, target_node);
		}
	}
	
	function dom_html_node (father_node, text) 
	{
		var range = document.createRange();
		range.selectNode(father_node);
		var documentFragment = range.createContextualFragment(text);
		return documentFragment;
	}
	
	
	
	function dom_xml_string (node) 
	{ 
		if (!window.XMLSerializer && node.xml)
		{
			return node.xml;
		}
		else
		{
			var serializer = new XMLSerializer();
			return serializer.serializeToString(node);
		}
	}
	
	function dom_xml_islands_update  (ajax_req)
	{
		var objects = new Array ();
		xml_doc = dom_ajax_req_xml (ajax_req);
		childs = xml_doc.firstChild.childNodes;

		for (child_index = 0; child_index < childs.length; child_index++)
		{
			child = childs[child_index];
			
			if (child && child.nodeType == 1)
			{
				id=child.getAttribute ('id');
				if (id)
				{
					to_replace_node = $(id);
					if (to_replace_node)
					{
						var xml = dom_xml_string (child);
						
						var new_node = dom_html_set (to_replace_node, xml);
						objects[objects.length] = new_node;
					}
				
				}
			}
				
		}
		return objects;
	}
	
	function dom_xml_set (target_node, xml_node)
	{
		node_to_import = document.importNode (xml_node, true);
		return dom_replace (target_node, node_to_import);
	}


	function dom_process_node (xsltProcessor, cur_obj)
	{
		var xml_doc = document.implementation.createDocument('', '', null);
		imported_node = xml_doc.importNode(cur_obj, true);
		xml_doc.appendChild (imported_node);
		return xsltProcessor.transformToFragment(xml_doc, document);
	}

	function dom_process_xml_strange (xsltProcessor, xml_doc)
	{
		new_doc = document.implementation.createDocument('', '', null);
		new_doc.appendChild(xml_doc.documentElement);
		return xsltProcessor.transformToFragment(new_doc, document);
	}

	function dom_process_xml (xsltProcessor, xml_doc)
	{
		return xsltProcessor.transformToFragment(xml_doc, document);
	}

	function dom_xsl (xsltProcessor, url)
	{
		var ajax_req = createXMLHTTPObject();
		ajax_req.open("GET", url, false);
		ajax_req.send(null);
		xsltProcessor.importStylesheet(ajax_req.responseXML);
	}

	//ajax

	var ajax_pool = new Array;

	var XMLHttpFactories = [
		function () {return new XMLHttpRequest()},
		function () {return new ActiveXObject("Msxml2.XMLHTTP")},
		function () {return new ActiveXObject("Msxml3.XMLHTTP")},
		function () {return new ActiveXObject("Microsoft.XMLHTTP")}
	];
	
	function createXMLHTTPObject() {
		var xmlhttp = false;
		for (var i=0;i<XMLHttpFactories.length;i++) {
			try {
				xmlhttp = XMLHttpFactories[i]();
			}
			catch (e) {
				continue;
			}
			break;
		}
		return xmlhttp;
	}	
		

	//ajax solo get. Attenzione max 4069
	function dom_ajax_get (url, track_function, param1, param2)
	{
		var ajax_req = new Object();
		ajax_index = ajax_pool.length;
		ajax_pool[ajax_index] = ajax_req;

		ajax_req.xml_request = createXMLHTTPObject();
		ajax_req.ajax_index = ajax_index;
		ajax_req.track_function = track_function;
		ajax_req.url = url;
		ajax_req.param1 = param1;
		ajax_req.param2 = param2;
		ajax_req.xml_request.onreadystatechange = dom_ajax_track;
		ajax_req.xml_request.open ('GET', url, true);
		ajax_req.xml_request.send('');
		return ajax_req;
	}

	function dom_ajax_post (url, track_function, xml_node, param1, param2)
	{
		var ajax_req = new Object();
		ajax_index = ajax_pool.length;
		ajax_pool[ajax_index] = ajax_req;

		ajax_req.xml_request = createXMLHTTPObject();
		ajax_req.ajax_index = ajax_index;
		ajax_req.track_function = track_function;
		ajax_req.url = url;
		ajax_req.param1 = param1;
		ajax_req.param2 = param2;
		ajax_req.xml_request.onreadystatechange = dom_ajax_track;
		ajax_req.xml_request.open ('POST', url, true);
		ajax_req.xml_request.send(xml_node);
	}

	function dom_ajax_post_form (url, track_function, xml_node, param1, param2)
	{
		var ajax_req = new Object();
		ajax_index = ajax_pool.length;
		ajax_pool[ajax_index] = ajax_req;

		ajax_req.xml_request = createXMLHTTPObject();
		ajax_req.ajax_index = ajax_index;
		ajax_req.track_function = track_function;
		ajax_req.url = url;
		ajax_req.param1 = param1;
		ajax_req.param2 = param2;
		ajax_req.xml_request.onreadystatechange = dom_ajax_track;
		ajax_req.xml_request.open ('POST', url, true);
		ajax_req.xml_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		ajax_req.xml_request.send(xml_node);
	}

	function dom_ajax_request_xml(xml_request)
	{	
		if ((xml_request.responseXML) && (xml_request.responseXML.childNodes.length !=0))
		{
			return xml_request.responseXML;
		}
		else if (typeof ActiveXObject != "undefined")
		{ 
			var xml_doc = new ActiveXObject("MSXML.DomDocument"); 
			xml_doc.loadXML(xml_request.responseText);
			return xml_doc; 
		}
	}


	function dom_ajax_req_xml(ajax_req)
	{	
		if ((ajax_req.xml_request.responseXML) && (ajax_req.xml_request.responseXML.childNodes.length !=0))
		{
			return ajax_req.xml_request.responseXML;
		}
		else if (typeof ActiveXObject != "undefined")
		{ 
			var xml_doc = new ActiveXObject("MSXML.DomDocument"); 
			xml_doc.loadXML(ajax_req.xml_request.responseText);
			return xml_doc; 
		}
	}


	function dom_ajax_track()
	{
		for (var cur_index = 0; cur_index < ajax_pool.length; cur_index++)
		{
			ajax_req = ajax_pool[cur_index];
			xml_request = ajax_req.xml_request;
			if (xml_request.readyState == 4 && xml_request.status && xml_request.status!=12029)
			{
				try
				{
					if (xml_request.status && xml_request.status == 200)
					{
						if (xml_request.responseText)
						{
							text_doc =  xml_request.responseText;
							ajax_pool.splice (cur_index, 1);
							ajax_req.track_function (ajax_req, text_doc, ajax_req.param1, ajax_req.param2);
						}
						else
							i2_error ("i2: dom_ajax_track error: answer empty:\n" + xml_request.statusText);
					}
					else if (xml_request.status && xml_request.status == 202)
					{
						i2_error ("i2: dom_ajax_track error: internal server error:\n");
						error_window = window.open('');
						if (xml_request.responseXML)
						{
							var xsltProcessor = new XSLTProcessor();
							dom_xsl (xsltProcessor, '/i2/_xsl/clog.xsl');
							var str = new XMLSerializer().serializeToString(dom_process_xml (xsltProcessor, xml_request.responseXML));
							error_window.document.open();
							error_window.document.write (str);
							error_window.document.close();
						}
						else
						{
							dom_html_set (error_window.document, xml_request.responseText);
						}
							
					}
					else if (xml_request.status && xml_request.status == 203)
					{
						document.write (xml_request.responseText);
					}
					else if (xml_request.status && xml_request.status == 205)
					{
						window.location.reload(true);
					}
					else if (xml_request.status && xml_request.status == 206)
					{
						xml_doc = dom_ajax_req_xml (ajax_req);
						url = xml_doc.firstChild.getAttribute ('url');
						window.location= url;
					}
					else if (xml_request.status && xml_request.status == 207)
					{
						i2_msg (xml_request.statusText, 'error');

					}
					else if (xml_request.status && xml_request.status == 404)
						i2_error ("i2: dom_ajax_track error: url not found:\n" + xml_request.statusText);
					else
					{
						alert ( 'url:' + ajax_req.url + ';status:' +  xml_request.status);
						i2_error ("i2: dom_ajax_track error: answer empty:\n" + xml_request.statusText);
					}
				}
				catch (e)
				{
					i2_error ("i2: dom_ajax_track error: " + e);
				}
			}
		}
	}
	

	//Experimental interface for clean message, substitute alert

	function formatDate(cur_date) {
		return cur_date;
	}

	function i2_msg (msg_text, style)
	{
		var error_div = document.createElement('div');
		dom_insert_first_child (document.body, error_div);
		error_div.innerHTML = msg_text  + msg_text;
		error_div.className ='i2_msg ' + style;

	}


	function i2_error_msg (msg_text, style)
	{
		var error_div = document.createElement('div');
		dom_insert_first_child (document.body, error_div);
		cur_date = new Date();
		error_div.innerHTML = 'i2#' + formatDate(cur_date, 'hh:mm:ss' + '. ')  + msg_text;
		error_div.className ='i2_msg ' + style;

	}

	function i2_error (msg_text)
	{
		i2_error_msg ('error: ' + msg_text, 'error');
	}

	function i2_alert (msg_text)
	{
		i2_error_msg (msg_text, 'alert');
	}

