/******************************************************************************\
*  geoxml.js		                               by Lance Dyas          *
*  A Google Maps API Extension  GeoXml parser                                 *
*  GeoXml Parser based on my maps kml parser by Mike Williams called egeoxml  *
*  Additions include:   GML/WFS/GeoRSS/GPX expanded GE KML style support      *                                            
\******************************************************************************/
var me ;
function MyGMap(id_map){
    this.map = new GMap2($(id_map));
    this.opts = {messagebox:false,nozoom:true,icontype:"style",noshadow:true};
    this.geoXml = new GeoXml ("this.geoXml",this.map,this.opts);
    me = this ;
    GEvent.addListener(this.geoXml,'parsed',parse_geoxml2);
    this.map.setCenter(new GLatLng(46.89023157359399, 3.04296875), 5);
    this.inputInitialized = false ;
    this.map.MyGMap = this;
    
	this.map.addControl(new GMapTypeControl());
	this.map.addControl(new GSmallZoomControl());
	this.map.removeMapType(G_HYBRID_MAP);
	//this.map.addMapType(G_PHYSICAL_MAP);
	this.map.enableScrollWheelZoom(); 
	this.nbMarkers = 0 ;		
}
function parse_geoxml2(){
document.body.style.cursor = 'default';
    if(me){
        me.nbMarkers = me.geoXml.markers.length ;
       
        me.SetCenterAutomaticly();
         if(me.sortfinished)
            me.sortfinished();
    }
}
MyGMap.prototype.loadKML = function(url){

 setTimeout("document.body.style.cursor = 'wait';",0);
    this.map.clearOverlays();
    this.geoXml.url = url;    
    this.geoXml.parse();   
}
MyGMap.prototype.SetCenterAutomaticly = function(){
    var bou = new GLatLngBounds();
    for(var i = 0;i<this.geoXml.markers.length;i++){
        var m = this.geoXml.markers[i];
        
        bou.extend(m.getLatLng());
    }
    this.map.setCenter(bou.getCenter(),this.map.getBoundsZoomLevel(bou));
}
    





var obj_temp ;
var drawDone = false ;
var indiceDraw = 0 ;







function KMLObj(title,desc) {
	this.title = title;
	this.description = escape(desc);
	this.marks = [];
	this.folders = [];
	this.groundOverlays = [];
}
function GeoXml(myvar, map, url, opts) {
	// store the parameters
	this.myvar = myvar;
	this.opts = opts || {};	
	this.map = map;	
	this.url = url;

	this.bounds = new GLatLngBounds();	
	this.kml = [new KMLObj("GeoXML","")];	
	this.styles = new Array();
	this.markers = new Array();
}
function $(mid){ return document.getElementById(mid);}
GeoXml.prototype.parse = function(titles) {
	var that = this;
	this.markers = new Array();
	that.loadXMLUrl(this.url);
};
var xml_doc_temp ;
GeoXml.prototype.loadXMLUrl = function (url, title, latlon, desc, idx) {
	var that = this;	
	that.DownloadURL(url, function(doc) { that.processing(doc, title, latlon, desc, idx) }, title);
}
GeoXml.prototype.DownloadURL = function (url, callback, title) {
	var xmlDoc, t; 
	var that = this;
	var req;		
	if (! req && typeof XMLHttpRequest != 'undefined') {
		req = new XMLHttpRequest();
	}
	else {
		if (typeof ActiveXObject != "undefined") {
			req = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	data = (this.chaine_id_cpg && this.chaine_id_cpg != "") ? "idc="+this.chaine_id_cpg : null
	method = (this.chaine_id_cpg && this.chaine_id_cpg != "") ? "POST" : "GET";
	if(req.overrideMimeType)req.overrideMimeType("text/plain");
	req.open(method,url, true);
	req.onreadystatechange = function () {
		
		
		switch (req.readyState) {
		case 4:
			
			if (typeof ActiveXObject != "undefined") {
				callback(req.responseText);					
			}
			else {
				if (req.responseText) {
					
					xmlDoc = req.responseText;
					xml_doc_temp = xmlDoc ;
					callback(xmlDoc, title);
					cmlrepeats = 0;
				}
				else {
					if (req.status == 200) {
						var resp = req.responseText;
						var sresp = resp.substring(0, 400);
						var eresp = resp.substring(400);
						var isXML = resp.substring(0, 5);
						if (isXML == "<?xml") {
							if (typeof DOMParser != "undefined") {
								var parser = new DOMParser();
								xmlDoc = parser.parseFromString(resp, "text/xml");
								var roottag = xmlDoc.documentElement;
								if (roottag.tagName != "parserError") {
									callback(xmlDoc,title); 
								}
							}
						}							
					}
					else {
						if (req.responseText) alert(req.responseText);
					}                       
				}
			}
			break;
		}
	};
	if(this.chaine_id_cpg != ""){
		req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	}
	req.send(data);
}
var json_temp ;
GeoXml.prototype.processing = function(xmlDoc,title, latlon, desc, sbid) {
		jsonfromxml = xml2json.parser(xmlDoc);
		json_temp = jsonfromxml;
	if(!desc)desc = title;
	var that = this;
	if(!sbid)sbid = 0;
	var root = jsonfromxml.kml;
	var placemarks = [];
	basename = jsonfromxml.kml;	
	if(basename.document.style){
	var styles = basename.document.Style; 
	    if(styles.length){
		    for (var i = 0; i <styles.length; i++) {
			    var sid= styles[i].id;
			    if(sid){ 
				    this.handleStyle(styles[i],sid);
			    }
		    }	
	    }
	    else{
		    var sid= styles.id;
		    this.handleStyle(styles,sid);
	    }
	}
		if(!title)title = name;
	this.title = title;
	if(title.length >this.maxtitlewidth){
		this.maxtitlewidth = title.length;
	}
	this.processJSON(basename.document);	

};
var self 
GeoXml.prototype.processJSON = function(node) {  
	this.nodes = node ;
	self = this;
	if(this.nodes && node.placemark){
		if(node.placemark.length){
		var len = node.placemark.length ;
			for(i=0;i<len;i++) {
				//setTimeout("self.handlePlacemark2("+i+")",i*10);
				self.handlePlacemark2(i);
			}
		}
		else{			
			//setTimeout("self.handlePlacemark2(-1)",0);
			self.handlePlacemark2(-1)
		}
	}
};
GeoXml.prototype.handlePlacemark = function (mark) {	
	var that = this;
	var desc, title, name, style;
	title = "";
	desc = "";
	var styleid = 0;
	var lat, lon;
	var visible = true;
	var newcoords = false;
	var coordset=mark.point.coordinates;
	var coords = "";
	name = (mark.name) ? mark.name : "";		
	desc = (mark.description) ? mark.description : "";
	var cor = mark.point.coordinates.split(',');		
	styleid = mark.styleurl ;
	if(!name && title)name = title; 	
	if(styleid){
		style = this.styles[styleid];		
	}	
	/*	cor[1] = cor[1].replace(".",",");
	cor[0] = cor[0].replace(".",",");*/
	if(cor[0] != "0"){
	    var point = new GLatLng(cor[1],cor[0]);	

	    that.createMarker(point, name, desc, style,mark.extendeddata);
	    if(!this.nodes.placemark.indexOf || this.nodes.placemark.indexOf(mark) == this.nodes.placemark.length - 1)	
	        GEvent.trigger(that,"parsed");				
	}	    
};
GeoXml.prototype.handlePlacemark2 = function(index){
	if(index >= 0){
		this.handlePlacemark(this.nodes.placemark[index]);
	}
	else{
		this.handlePlacemark(this.nodes.placemark);
	}
}
var temp_drag ;
var mark_temp ;
function jeval(str){
	return eval("("+str+")");
}
GeoXml.prototype.createMarker = function(point,name,desc,instyle,data) {
	var icon;	
	var markeroptions =  /*{zIndexProcess:markerTop}*/{};
	var icontype =  "style";		
	markeroptions.icon = (!this.opts.icon) ? this.makeIcon(instyle,"./style/camping.png") : this.makeIcon(instyle,this.opts.icon);
	markeroptions.title = (name.length >= 4) ? name : "";
	var data_temp = jeval(data); 
	ie4 = ((navigator.appName == "Microsoft Internet Explorer") && (parseInt(navigator.appVersion) >= 4 ));
    ns4 = ((navigator.appName == "Netscape") && (parseInt(navigator.appVersion) >= 4 ));
    if (ns4) {
       if(data_temp.NomDepartement && data_temp.NomDepartement != "") markeroptions.title += " - "+data_temp.NomDepartement;
    } else {
        if(data_temp.NomDepartement && data_temp.NomDepartement != "") markeroptions.title += " \n "+data_temp.NomDepartement;
    }

	
	
	
	var m = new GMarker(point, markeroptions);
	var taille = parseInt(name) ;
	m.title = (name.length >= 4) ? name : "";
	
	//m.title =  name;
	var obj = {"type":"point","title":name,"description":escape(desc),"x":point.x,"y": point.y};
	if(typeof(clickMarker) != "undefined")
	    GEvent.addListener(m, "click", clickMarker);
	this.markers.push(m);
	m.getIcon().shadow = "";
	m.data = data_temp;
	if(typeof(overMarker) != "undefined")
	    GEvent.addListener(m,"mouseover",overMarker);
	if(typeof(outMarker) != "undefined")
	    GEvent.addListener(m,"mouseout",outMarker);
	this.map.addOverlay(m);
};
/*function markerTop (marker,b) {
    return GOverlay.getZIndex(marker.getPoint().lat()) + marker.importance*1000000;
}*/
GeoXml.prototype.handleStyle = function(style,sid){
	var icons=style.iconstyle.icon;
	var tempstyle;
	var href=icons.href;			
	tempstyle = this.makeIcon(tempstyle,href);		
	if(sid){this.styles["#"+sid] = tempstyle;			}
	return tempstyle;
}
var temp_icon ;
GeoXml.prototype.makeIcon = function(tempstyle, href){
	if (!!href) {
		tempstyle = new GIcon();
		var taille = ImageSize(href);
		var width_icon ;
		var height_icon ;
		if(taille.width == 0 || taille.height == 0){
			taille = {width:32,height:32};	
		}
		//cas ou je done une largeur mais que ça n'agrandi pas l'icone
		if(this.opts.width_icon && this.opts.width_icon < taille.width){
			//si on a pas pu renseigner les dimension de l'icone			
			width_icon = this.opts.width_icon ;
			height_icon = ((taille.height * width_icon) / taille.width ) ;
		}
		else{			
			width_icon = taille.width  ;
			height_icon = taille.height  ;
		}
		
		tempstyle.infoWindowAnchor = new GPoint(width_icon/2,height_icon/2);
		tempstyle.iconSize = new GSize(width_icon,height_icon);
		tempstyle.iconAnchor = new GPoint(width_icon/2,height_icon/2);
		tempstyle.imageMap = [0,0,(width_icon - 1),0,(height_icon - 1),(width_icon - 1),0,(height_icon - 1)];
		tempstyle.image = href;	
		tempstyle.shadow="";		
		temp_icon = tempstyle;
	}
	return tempstyle;
};

function decodehtml_twice(str){
    return html_entity_decode(html_entity_decode(str));
}
function html_entity_decode(texte) {
    if(texte)
    texte = texte.replace(/&amp;/g,'&'); // 38 26	
	return texte;
}

