﻿
google.load("earth", "1");
var ge = null;
var networkLink = null;
var myMask = null;
var kmlTreePanel = null;
var mess = true;
var lastRadioClicked = null;

function geInit()
{
	google.earth.createInstance("map3d", initCallback);
}

function initCallback(object)
{
	ge = object;
	ge.getWindow().setVisibility(true);
	ge.getOptions().setStatusBarVisibility(false);
	ge.getOptions().setGridVisibility(false);
	ge.getOptions().setOverviewMapVisibility(false);
	ge.getOptions().setScaleLegendVisibility(false);
	ge.getOptions().setAtmosphereVisibility(true);
	ge.getOptions().setMouseNavigationEnabled(true);
	ge.getNavigationControl().setVisibility(ge.VISIBILITY_SHOW);
	
	fetchKmlFile(kmz_file);
}

var currentKmlObject = null;

// supprime le NetworkLink qui a juste servi à zoomer sur la zone d'intéret
function removeNetworkLink()
{
	networkLink.setFlyToView(true);
	ge.getFeatures().removeChild(networkLink);
}

function fetchKmlFile(fileName)
{
	if (!light_loading)
	{
		networkLink = ge.createNetworkLink('');
		var link = ge.createLink('');
		link.setHref(fileName);
		networkLink.setLink(link);
		ge.getFeatures().appendChild(networkLink);
		networkLink.setFlyToView(true);
	}
	
	this.google.earth.fetchKml(this.ge, fileName, finishFetchKml);
}



function finishFetchKml(kmlObject)
{
	if (kmlObject)
	{
		currentKmlObject = kmlObject;
		ge.getFeatures().appendChild(currentKmlObject);
		
		kmlTreePanel = new Ext.tree.TreePanel({
			renderTo: 'treeDiv',
			border: false,
			height: "100%",
			autoScroll: true,
			root: new Ext.tree.TreeNode({
				text: 'KML Documents',
				iconCls: 'folder',
				expanded: true
			}),
			rootVisible: false,
			listeners: {checkchange: {fn: function(node, checked){
						node.attributes.kml.setVisibility(checked);
						
						if (node.radio != null)
						{
							if (node.radio.checked != checked)
								node.radio.checked = checked;
						}
						
						// coche les parents si besoin
						if (node.getUI().isChecked()) {
							if (!node.parentNode.getUI().isChecked()) {
								node.parentNode.getUI().toggleCheck();
							}
						}
					}
				}
			}
		});
		
		kmlTreePanel.root.appendChild(createKmlTreeNode(kmlObject, ""));
		
		parseRadio(kmlTreePanel.root.childNodes);
		parseChecked(kmlTreePanel.root.childNodes);
		
		collapseNotOpen(kmlTreePanel.root.childNodes);
		
		kmlTreePanel.body.setHeight("" + document.getElementById("treeDiv").clientHeight + "px");
	}
	else
	{
		alert('Bad KML');
	}
	
	if (!light_loading)
	{
		setTimeout(removeNetworkLink, 1000);
		networkLink.setFlyToView(true);
		
		//var bounds = gex.dom.computeBounds(kmlObject);
		//gex.view.setToBoundsView(bounds, { aspectRatio: 1.0 });
	}
	else
	{
//		KmlLatLonBox kllb = ge.getView().getViewportGlobeBounds(); 
		
		// LOOKAT
		var lookAt = ge.createLookAt('');
		lookAt.setLatitude(lookat_latitude);
		lookAt.setLongitude(lookat_longitude);
		lookAt.setRange(lookat_altitude);
		ge.getView().setAbstractView(lookAt);
	}


	//ge.getView().getViewportGlobeBounds(); 
	
	
	
	myMask.hide();
}

function onRadioChange()
{
	var radio = lastRadioClicked;
	
	if (Ext.isIE)
		radio.checked = !radio.checked;
		
	if (radio.node.getUI().isChecked() != radio.checked)
		radio.node.getUI().toggleCheck(radio.checked);
	
	if (radio.checked == true)
	{
		// on décoche tous les autres radios du même niveau
		var nodes = radio.node.parentNode.childNodes;
		for (var i=0; i<nodes.length; i++)
		{
			if (nodes[i] != radio.node)
			{
				if (nodes[i].getUI().isChecked())
				{
					nodes[i].getUI().toggleCheck(false);
					nodes[i].attributes.kml.setVisibility(false);
				}
			}
		}
		radio.node.attributes.kml.setVisibility(true);
	}
	else
	{
		radio.node.attributes.kml.setVisibility(false);
	}

}

// on coche les parents des noeuds cochés
function parseChecked(nodes)
{
	for (var i=0; i<nodes.length; i++)
	{
		if (nodes[i].hasChildNodes())
			parseChecked(nodes[i].childNodes);
			
		// s'il est coché on doit cocher ses parents
		if (nodes[i].getUI().isChecked()) {
			if (!nodes[i].parentNode.getUI().isChecked()) {
				nodes[i].parentNode.getUI().toggleCheck();
			}
		}
	}
}
		
function parseRadio(nodes)
{
	for (var i=0; i<nodes.length; i++)
	{
		if (nodes[i].getUI().checkbox != null)
		{
			if (layerStyle[nodes[i].attributes.folderPath + "_radio"] == true)
			{
				forceRadio(nodes[i].childNodes);
			}
		}
		if (nodes[i].hasChildNodes())
			parseRadio(nodes[i].childNodes);
	}
}

function forceRadio(nodes)
{
	for (var i=0; i<nodes.length; i++)
	{
		if (/*isLayer(nodes[i].attributes.kml) && */nodes[i].getUI().checkbox != null)
		{
			changeToRadio(nodes[i]);
		}
	}
}

function changeToRadio(node)
{
	var radio = document.createElement("input");
	setType(radio, "radio");
	radio.onclick = function(){lastRadioClicked = this; setTimeout(onRadioChange, 1);};
	radio.node = node;
	
	var checkbox = node.getUI().checkbox;
	var parent = checkbox.parentNode;
	var next = checkbox.nextSibling;
	
	checkbox.style.visibility = "hidden";
	checkbox.style.marginRight = "-13px";
	
	//setType(checkbox, "radio");
	//checkbox.onclick = function(){lastRadioClicked = this; setTimeout(onRadioChange, 2000);};
	//checkbox.node = node;
	
//	parent.removeChild(checkbox);
	parent.insertBefore(radio, next);
	
	node.radio = radio;
	
	
	
}

function collapseNotOpen(nodes)
{
	for (var i=0; i<nodes.length; i++)
	{
		if (nodes[i].attributes.kml != null)
		{
			if (nodes[i].attributes.kml.getOpen() == false)
			{
				nodes[i].collapse();
			}
		}
		if (nodes[i].hasChildNodes())
			collapseNotOpen(nodes[i].childNodes);
	}
}

function setType(node, type)
{
	try
	{
		node.type = type;
	}
	catch(e)
	{
		if (node.outerHTML)
			node.outerHTML=node.outerHTML.replace(/\btype=\w+\b/,'type="' + type + '"');
	}
}

// retourne le chemin de l'icone en fonction du type et su nom du noeud
function getIconFilePath(kmlNode, folderPath)
{
	if (isLayer(kmlNode))
	{
		return "./icons/" + folderPath + "_" + escapeSpecialChars(kmlNode.getName()) + ".png";
	}
	return "";
}

// remplace tout caractère non alphanumérique par un '_'
function escapeSpecialChars(str)
{
	var result = "";
	for (i=0; i<str.length; i++)
	{
		asc = str.charAt(i);
		if (asc < '0' || (asc > '9' && asc < 'A') || (asc > 'Z' && asc < 'a') || asc > 'z')
			result += "_";
		else
			result += str.charAt(i);
	}
	return result;
}

function createKmlTreeNode(kmlNode, folderPath)
{
	
	if(kmlNode.getFeatures() != null && kmlNode.getFeatures().hasChildNodes())
	{
		var treeNode = new Ext.tree.TreeNode({
			text: "<span style='font-size: " + menu_font_size + ";font-family: " + menu_font_family + "' title='" + kmlNode.getName() +"'>" + kmlNode.getName() + "</span>",
			checked: (kmlNode.getVisibility() ? true : false),
			expanded: true,//(kmlNode.getOpen() ? true : false),
			//icon: "./icon/icon_info.png",
			icon: getIconFilePath(kmlNode, folderPath),
			//iconCls: kmlNode.getType(),
			kml: kmlNode,
			folderPath: folderPath + "_" + escapeSpecialChars(kmlNode.getName())
		});
	
		var checkHideChildren = true;
		var radioFolder = false;
		if (kmlNode.getType() == 'KmlFolder')
		{
			folderPath = folderPath + "_" + escapeSpecialChars(kmlNode.getName());
		
			// style du node
			checkHideChildren = layerStyle[folderPath + "_hide"];
			radioFolder = layerStyle[folderPath + "_radio"];
		}
		
		var subNodes = kmlNode.getFeatures().getChildNodes();
		// on affiche les fils que s'ils sont moins de 100
		if (subNodes.getLength() < 100)
		{
			for(var i = 0; i < subNodes.getLength(); i++)
			{
				var subNode = subNodes.item(i);
				if (subNode.getType() == 'KmlFolder' && !isHiddenLayer(subNode))
				{
					treeNode.appendChild(createKmlTreeNode(subNode, folderPath));
				}
				else if (subNode.getType() == 'KmlPlacemark' && !checkHideChildren)
				{
					treeNode.appendChild(new Ext.tree.TreeNode({
						text: "<span style='font-size: " + menu_font_size + ";font-family: " + menu_font_family + "' title='" + subNode.getName() +"'>" + subNode.getName() + "</span>",
						checked: (subNode.getVisibility() ? true : false),
						kml: subNode
					}));
				}

			}
		}
	}

	return treeNode;
}


function isLayer(kmlNode)
{
	var subNodes = kmlNode.getFeatures().getChildNodes();
	for(var i = 0; i < subNodes.getLength(); i++)
	{
		var subNode = subNodes.item(i);
		if (subNode.getType() == 'KmlFolder' && !isHiddenLayer(subNode))
		{
			return false;
		}
	}
	return true;
}

//pour les layer qui s’appelent « Légendes », « Legends » ou « Logos »
//il ne faut pas créer une entrée dans l’arborescence
function isHiddenLayer(kmlNode)
{
	return (kmlNode.getName() == "Légendes"
			||	kmlNode.getName() == "Legends"
			||	kmlNode.getName() == "Logos");
}

Ext.onReady(function(){

	myMask = new Ext.LoadMask(Ext.get('left_menu'), {msg:"Chargement..."});
	myMask.show();
	
    var viewport = new Ext.Viewport({
		layout:'border', 
		border:true,
		background:border_color,
		items:[
	    {   region:'west',
			contentEl:'left_menu',
			width:"260px",
			border:true,
			margins:border_size + ' 0 ' + border_size + ' ' + border_size,
			layout:'border',
			items:[
		    {   region:'north',
				contentEl:'menu_top',
				width:"260px",
				border:false
		    },
			{	region:'center',
				contentEl:'menu_center',
				//autoScroll: true,
				width:"auto",
				border:false
		    },
			{   region:'south',
				contentEl:'menu_bottom',
				width:"260px",
				border:false
		    }
			]	
	    }, {
	        region:'center',
			contentEl:'map3d_container',
			border:true,
			id: "id_infos",
			margins:border_size + ' ' + border_size + ' ' + border_size + ' ' + border_size

	    }
		]	
	});	

});


function showRoutes(show)
{
	ge.getLayerRoot().enableLayerById(ge.LAYER_ROADS, show);
}

function showFrontieres(show)
{
	ge.getLayerRoot().enableLayerById(ge.LAYER_BORDERS, show);
}

function showRelief(show)
{
	ge.getLayerRoot().enableLayerById(ge.LAYER_TERRAIN, show);
}

function resizeScroll()
{
	if (kmlTreePanel != null)
		kmlTreePanel.body.setHeight("" + document.getElementById("treeDiv").clientHeight + "px");
}

