var map;
var data;
var back = null;
var defaultColor = "#729aca";
var absNode;

var tablaIconos =   {
						comercial : "comercial.gif",
						sede : "sede.gif",
						fabrica : "fabrica.gif"
					}

var isIE = (window.navigator.userAgent.indexOf("MSIE") > 0);

function readTextValue(node) {
	if (! isIE) {
		return node.textContent;
	} else {
		return node.text;
	}
}

function mkLatLng(xmlPoint) {
	var lat = parseFloat(xmlPoint.getAttribute("lat"));
    var lng = parseFloat(xmlPoint.getAttribute("lng"));

	return new GLatLng(lat, lng);
}

function displayHtml(html) {
	var divInfo = document.getElementById("info");
	divInfo.innerHTML = html;
}

function centrarVista(xmlData) {
	map.clearOverlays();

	var zoom = parseFloat(xmlData.getAttribute("zoom"));
	var centro = mkLatLng(xmlData);

	map.setCenter(centro);
	map.setZoom(zoom);
}

function getXmlParent(xmlData) {
	var aux;
	(xmlData == absNode) ? aux = null : aux = xmlData.parentNode;
	return aux;
}

function setBack(xmlData) {
	back = getXmlParent(xmlData);
}

function getElement(tag, attrName) {
	var xmlData = null;
	var items = data.getElementsByTagName(tag);
	for (var i=0; i<items.length; i++) {
		if (items[i].getAttribute("name") == attrName) {
			xmlData = items[i];
			break;
		}
	}

	return xmlData;
}

function openElement(tag, attrName) {
	var xmlData = getElement(tag, attrName);
	if (xmlData != null) {
		enfocar(xmlData);
		return xmlData;
	}
}

function goBack() {
	if (back != null) {
		enfocar(back);
	}
}

function goToLevel(nivel) {
	var aux = back;
	while (aux != null) {
		if (aux.nodeName == nivel) {
			enfocar(aux);
			break;
		}
		aux = getXmlParent(aux);
	}
}

function cargarListaAreas(xmlData) {
	cargarItems(xmlData, "pais", false);
}

function cargarElementosEmpresa(xmlData) {
	cargarItems(xmlData, "sede", true);
	cargarItems(xmlData, "comercial", true);
	cargarItems(xmlData, "fabrica", true);
}

function cargarItems(xmlData, tag, generarHtml) {
	var auxStr = "";
	var items = xmlData.getElementsByTagName(tag);

	for (var i = 0; i < items.length; i++) {
		var xmlItem = items[i];
		if (generarHtml) auxStr += createHtmlElement(xmlItem);

		switch (xmlItem.nodeName) {
			case "continente":
				cargarListaAreas(xmlItem);
				break;

			case "pais":
				// create a polygon
				cargarArea(xmlItem);
				break;

			case "empresa":
				cargarElementosEmpresa(xmlItem);
				break;

			case "sede":
			case "comercial":
			case "fabrica":
				createMark(xmlItem);
				break;
		}
	}

	return auxStr;
}

function cargarArea(xmlData, noClick) {
	var polylines = xmlData.getElementsByTagName("polyline");

	for (var i=0; i<polylines.length; i++) {
		var pts = [];
		var points = polylines[i].getElementsByTagName("point");
		var color = polylines[i].getAttribute("color");
		color = (color != null) ? color : defaultColor;
		for (var j=0; j < points.length; j++) {
			pts[j] = mkLatLng(points[j]);
		}
		pts[points.length] = pts[0]; // para cerrar el area

		var polygon = new GPolygon(pts, color, 1, 0.7, color, 0.5 );
		map.addOverlay(polygon);
		if (!noClick) GEvent.addListener(polygon, "click", function() { enfocar(xmlData) } );
	}
}

function createIcon(tipo) {
	eval("var ico = tablaIconos." + tipo);
	var ruta = "/images/" + ico;
	var icono = new GIcon;
	icono.image = ruta;
	icono.iconSize = new GSize(20, 20);
	icono.iconAnchor = new GPoint(6, 20);
	return icono;
}

function createMark(xmlData) {
	var mkPoint = mkLatLng(xmlData);

	var icon = createIcon(xmlData.nodeName);
	var mark = new GMarker(mkPoint, icon);
	GEvent.addListener(mark, "click", function() { enfocar(xmlData) } );
	map.addOverlay(mark);
}

function createHtmlElement(xmlData) {
	var tipo = xmlData.nodeName;
	var nombre = xmlData.getAttribute("name");
	if (tipo == 'global') {
		var display = 'RCR GROUP';
	} else {
		var display = readTextValue(xmlData.getElementsByTagName("nombre")[0]);
	}

	var auxStr = "<a class=\"" + tipo + "\" id=\"" + nombre + "\" href=\"#\" onclick=\"openElement('" + tipo + "', '" + nombre + "')\" >" + display + "</a>";
	return auxStr;
}

function crearHtmlInfo(xmlData) {
	var auxStr = ""
	auxStr += "<div id=\"datossede\"><span>" + readTextValue(xmlData.getElementsByTagName("direccion")[0]) + "</span>";
	auxStr += "<span class=\"telefono\">" + readTextValue(xmlData.getElementsByTagName("telefono")[0]) + "</span>";
	auxStr += "<span class=\"fax\">" + readTextValue(xmlData.getElementsByTagName("fax")[0]) + "</span>";
	auxStr += "<span class=\"web\">" + readTextValue(xmlData.getElementsByTagName("web")[0]) + "</span> </div>";
	return auxStr;
}

function iniciarListado(xmlData) {
	var auxStr = "";
	var aux = xmlData;
	while (aux != null) {
		auxStr = createHtmlElement(aux) + auxStr;
		aux = getXmlParent(aux);
	}
	return auxStr;
}

function enfocar(xmlData) {
	setBack(xmlData);
	var html = iniciarListado(xmlData);

	switch (xmlData.nodeName) {
		case "global":
			centrarVista(xmlData);
			html += cargarItems(xmlData, "continente", true);
			break;

		case "continente":
			centrarVista(xmlData);
			html += cargarItems(xmlData, "pais", true);
			break;

		case "pais":
			centrarVista(xmlData);
			cargarArea(xmlData, true);
			html += cargarItems(xmlData, "empresa", true);
			break;

		case "empresa":
			centrarVista(xmlData.parentNode);
			cargarArea(xmlData.parentNode, true);
			html += cargarItems(xmlData, "sede", true);
			html += cargarItems(xmlData, "comercial", true);
			html += cargarItems(xmlData, "fabrica", true);
			break;

		case "sede":
		case "comercial":
		case "fabrica":
			centrarVista(xmlData);
			createMark(xmlData);
			html += crearHtmlInfo(xmlData);
			break;
	}
	displayHtml(html);
}

function cargarDatosXml(xmlFile, tagBase, nameBase) {
	var request = GXmlHttp.create();
	request.open("GET", xmlFile, true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			var xmlDoc = GXml.parse(request.responseText);
			data = xmlDoc.documentElement;

			// las siguientes lineas son para evitar que se pueda "volver" a una posicion superior al nodo de inicio
			absNode = getElement(tagBase, nameBase);
			if (absNode != null ) {
				setBack(absNode);
				enfocar(absNode);
			}
		}
	}
	request.send(null)
}

function init(xmlFile, tagBase, nameBase) {
	if (GBrowserIsCompatible()) {
		_mFlags = {}
		//inicializamos el mapa
		map = new GMap2(document.getElementById("map"));
		map.disableDoubleClickZoom();

    	cargarDatosXml(xmlFile, tagBase, nameBase);

	} else {
		alert("Lo sentimos, la API de Google Maps no es compatible con este navegador.");
	}
}
