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

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) != null)
	{
		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>';
				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);
		target_node.parentNode.replaceChild(documentFragment, target_node);
	}
}

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)
{
	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);
					dom_html_set (to_replace_node, xml);
				}
			
			}
		}
			
	}
}
	



function dom_xml_set (target_node, xml_node)
{
	node_to_import = document.importNode (xml_node, true);
	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('');

}

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 == 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_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');
}
