// Optional JavaScript from google must be included before this file

tip = {
	sXHR: 'Caricamento...',
	sXHRError: 'Dati non disponibili',
	aObjects: [],
	bDOM: false,	// Is the browser DOM capable?
	oXHR: null,	// The common XMLHttpRequest instance

	init:function() {
		tip.initCompat();
		tip.initXHR();
		tip.addEvent(window, 'load', tip.processOnLoad);
		if (typeof GSearch != 'undefined') {
			GSearch.setOnLoadCallback(tip.onGoogle);
		}
	},

	processOnLoad:function() {
		tip.bDOM = document.getElementById && document.createTextNode;

		for (var i=0; i < tip.aObjects.length; i++) {
			tip.aObjects[i].onLoad();
		}
	},

	initCompat:function() {
		if (!document.ELEMENT_NODE) {
			document.ELEMENT_NODE = 1;
			document.ATTRIBUTE_NODE = 2;
			document.TEXT_NODE = 3;
			document.CDATA_SECTION_NODE = 4;
			document.ENTITY_REFERENCE_NODE = 5;
			document.ENTITY_NODE = 6;
			document.PROCESSING_INSTRUCTION_NODE = 7;
			document.COMMENT_NODE = 8;
			document.DOCUMENT_NODE = 9;
			document.DOCUMENT_TYPE_NODE = 10;
			document.DOCUMENT_FRAGMENT_NODE = 11;
			document.NOTATION_NODE = 12;
		}
	},

	initXHR:function() {
		if (window.XMLHttpRequest) {
			tip.oXHR = new XMLHttpRequest();
		}
		if (!tip.oXHR && window.ActiveXObject) {
			var aSignatures = [
				'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0',
				'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP',
				'Microsoft.XMLHTTP'];
			for (var i=0; i < aSignatures.length && !tip.oXHR; i++) {
				try {
					tip.oXHR = new ActiveXObject(aSignatures[i]);
				} catch (oError) {
					tip.oXHR = null;
				}
			}
		}
		if (!tip.oXHR && window.createRequest) {
			try {
				tip.oXHR = window.createRequest();
			} catch (oError) {
				tip.oXHR = null;
			}
		}
	},

	addEvent:function(o, sEvent, fnCallback) {
		if (o.addEventListener) {
			o.addEventListener(sEvent, fnCallback, false);
		} else if (o.attachEvent) {
			o.attachEvent('on' + sEvent, fnCallback);
		} else if (typeof(o['on' + sEvent]) == 'function') {
			var fnOldCallback = o['on' + sEvent];
			o['on' + sEvent] = function() {
				fnOldCallback();
				fnCallback();
			}
		} else {
			o['on' + sEvent] = fnCallback;
		}
	},

	onFalse:function() {
		return false;
	},

	onGoogle:function() {
		var oSearcher = new GsearcherOptions();
		oSearcher.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);
		oSearcher.setNoResultsString('Nessun riferimento trovato');

		var oSearch = new GwebSearch();
		oSearch.setSiteRestriction('www.entidi.it');

		var oOptions = new GdrawOptions();
		oOptions.setSearchFormRoot(document.getElementById('idSearch'));

		var searchControl = new GSearchControl();
		searchControl.addSearcher(oSearch, oSearcher);
		searchControl.setResultSetSize(GSearch.LARGE_RESULTSET);
		searchControl.setLinkTarget(GSearch.LINK_TARGET_SELF);
		searchControl.draw(document.getElementById('idResults'), oOptions);
	},

	isElement:function(o, sTag) {
		return o.nodeType == document.ELEMENT_NODE && (sTag == null || o.tagName.toLowerCase() == sTag);
	},
		
	parentElement:function(o, sTag) {
		while (o && !tip.isElement(o, sTag)) {
			o = o.parentNode;
		}
		return o;
	},

	firstChildElement:function(o, sTag) {
		while (o) {
			o = o.firstChild;
			if (o && tip.isElement(o, sTag)) {
				break;
			}
		}
		return o;
	},

	nextElement:function(o, sTag) {
		while (o && !tip.isElement(o, sTag)) {
			o = o.nextSibling;
		}
		return o;
	},

	cancelPropagation:function(oEvent) {
		if (!oEvent) {
			oEvent = window.event;
		}

		if (oEvent.preventDefault) {
			oEvent.preventDefault();
		}
		oEvent.returnValue = false;

		if (oEvent.stopPropagation) {
			oEvent.stopPropagation();
		}
		oEvent.cancelBubble = true;
	},

	/* The following code is adapted from:
	 * http://www.alistapart.com/articles/crossbrowserscripting
	 * by Anthony T. Holdener III */
	importNode:function(o, bSubrequest) {
		var oResult = null;

		switch (o.nodeType) {
		case document.ELEMENT_NODE:
			oResult = document.createElement(o.nodeName);
			if (o.attributes) {
				for (var i = 0; i < o.attributes.length; ++i) {
					oResult.setAttribute(o.attributes[i].nodeName, o.getAttribute(o.attributes[i].nodeName));
				}
			}
			if (o.childNodes) {
				for (var i = 0; i < o.childNodes.length; ++i) {
		  			oResult.appendChild(tip.importNode(o.childNodes[i], true));
				}
			}
			break;
		case document.TEXT_NODE:
		case document.CDATA_SECTION_NODE:
		case document.COMMENT_NODE:
			oResult = document.createTextNode(o.nodeValue);
			break;
		}

		// Needed to make the fucking explorer happy
		if (!bSubrequest && !document.importNode) {
			oResult.innerHTML = oResult.innerHTML;
		}

		return oResult;
	},

	getXHR_ul:function(oUL, sUrl) {
		var oLI, oSPAN, oText;
		oLI = document.createElement('li');
		oSPAN = document.createElement('span');
		oText = document.createTextNode(tip.sXHR);

		oSPAN.setAttribute('class', 'loading');
		oSPAN.appendChild(oText);
		oLI.appendChild(oSPAN);
		oUL.appendChild(oLI);

		tip.oXHR.open('get', sUrl, true);
		tip.oXHR.setRequestHeader('If-Modified-Since', 'Thu, 01 Jan 1970 00:00:00 GMT');
		tip.oXHR.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
		tip.oXHR.onreadystatechange = function() {
			switch (tip.oXHR.readyState) {
			case 1: break;
			case 4: var o;
				if (tip.oXHR.status == 200) {
					oUL.removeChild(oLI);
					o = tip.nextElement(tip.oXHR.responseXML.firstChild);
					o = tip.nextElement(o.firstChild);
					o = o.firstChild;
					while (o = tip.nextElement(o)) {
						oUL.appendChild(tip.importNode(o));
						o = o.nextSibling;
					}
				} else {
					oSPAN.replaceChild(document.createTextNode(tip.sXHRError), oText);
				}
				break;
			default:return;
			}
		}
		tip.oXHR.send(null);
	}
}

ntd = {
	aPanels: ['idPanel'],
	sExpanded: 'opened',
	sCollapsed: 'closed',

	init: function() {
		// Force submenu hiding to avoid FOUC
		var aStyles = new Array();
		for (var iStyle = 0; iStyle < ntd.aPanels.length; ++ iStyle) {
			aStyles[iStyle] = '#' + ntd.aPanels[iStyle] + ' ul ul';
		}
		document.write('<style>\n' + aStyles.join(',\n') + ' {display: none}\n</style>');
		tip.aObjects.push(this);
	},

	onLoad:function() {
		// TODO: if not pass this test, a fallback callback must be
		// provided (to open the closed branches for FOUC avoiding)
		if (!tip.bDOM) {
			return;
		}

  		var oPanel, aEM;
		for (var iPanel = 0; iPanel < ntd.aPanels.length; ++ iPanel) {
			oPanel = document.getElementById(ntd.aPanels[iPanel]);
			if (!oPanel)
				continue;

			aEM = oPanel.getElementsByTagName('em');
			if (aEM) {
				for (var i = 0; i < aEM.length; ++ i) {
					ntd.prepareBranch(aEM[i]);
				}
			}
		}
	},

	prepareBranch:function(oEM) {
  		var oA;

		oA = oEM.parentNode;
		if (oA.tagName.toLowerCase() == 'a') {
			// Ajax branch
			if (tip.oXHR) {
				oA.className = ntd.sCollapsed;
				oA._oldUrl = oA.getAttribute('href');
				oA.setAttribute('href', '#');
				oA.onClick = tip.onFalse;
				tip.addEvent(oA, 'click', ntd.onAjaxClick);
				ntd.switchFolding(oA, false);
			}
		} else {
			// Embedded branch
			oA = document.createElement('a');
			oA.className = ntd.sCollapsed;
			oA.setAttribute('href', '#');
			oA.onClick = tip.onFalse;
			tip.addEvent(oA, 'click', ntd.onMenuClick);
			oEM.parentNode.replaceChild(oA, oEM);
			oA.appendChild(oEM);
			ntd.switchFolding(oA, false);
		}
	},

	switchFolding:function(oA, bToSwitch) {
		if (bToSwitch == null)
			bToSwitch = true;

		var oUL = tip.nextElement(oA, 'ul');
		var bCollapse;
		if (oUL) {
			bCollapse = oUL.className != ntd.sExpanded ^ bToSwitch;
			oUL.className = bCollapse ? ntd.sCollapsed : ntd.sExpanded;
		} else {
			bCollapse = oA.className != ntd.sExpanded ^ bToSwitch;
		}

		oA.className = bCollapse ? ntd.sCollapsed : ntd.sExpanded;
	},

	onMenuClick:function(oEvent) {
		var oA = tip.parentElement(oEvent.target ? oEvent.target : oEvent.srcElement, 'a');
		if (oA) {
			ntd.switchFolding(oA);
		}

		tip.cancelPropagation(oEvent);
	},

	onAjaxClick:function(oEvent) {
		var oA = tip.parentElement(oEvent.target ? oEvent.target : oEvent.srcElement, 'a');
		if (oA) {
			var o = tip.nextElement(oA, 'ul');
			if (!o) {
				o = document.createElement('ul');
				oA.parentNode.appendChild(o);
				tip.getXHR_ul(o, oA._oldUrl);
			}
			ntd.switchFolding(oA);
		}

		tip.cancelPropagation(oEvent);
	}
}

tip.init();
ntd.init();
