
//###########################################################
//### Overlay manager add and remove overlays dynamically ###
//###########################################################

/* Overlayer manager interface

	.intersects(bounds) //return true if self or part of self in bounds
	.overlay 	    //if true contains the actual overlay if false meNS NOT DISPLAYED 

*/


with(jzGMap){ // add to jzGMap name space...
$.initOverlays = function(div){
	if (!div) return
	var vMap=div.vMap
	if (!vMap) return

	var id=div.id
	var names=div.getAttribute('jz:overlays')
	if (!names) names=id.slice(0,id.lastIndexOf('.'))+'._overlays'

	var elem
	div.overlays=[]
	dof(names.split(','),function(nam){
		if (elem=document.getElementById(nam)) {
			var overlays=parseDataFor(nam)
			if (overlays) div.overlays= div.overlays.concat(overlays)
			}
		})
			
	var overlays= div.overlays
	var attraits=div.attraits=[]
	var paths=div.paths=[]
	var ovls=div.ovl=[]
	dof(overlays,  function(ovlName) {
		//Log('looking at '+ovlName)
		var ovl
		if (ovl=parseDataFor(ovlName)) {
			/*
			m='ovl='+ovl
			m+='ovl.makeOvl='+ovl['makeOvl']
			if (ovl instanceof GLatLngBounds) m+='\nis GLatLngBounds'
			if (ovl instanceof GOverlay) m+='\nis GOverlay'
			if (ovl instanceof GPolyline) m+='\nis GPolyline'
			if (ovl instanceof Array){
				m+='\nis Array len='+ovl.length
				if (ovl.length && ovl[0] instanceof GPolyline) m+='\n [0] is GPolyline'
				}
			if (ovl instanceof GLatLng) m+='\nis GLatLng'
			if (ovl instanceof GTileLayerOverlay) m+='\nis GTileLayerOverlay'
			/* for (v in ovl){
				var val= ovl[v]
				if ( typeof val == 'function') val='function'
				m+='\n'+v+'='+(val||'false')
				}
			alert(m)
			*/
			if (ovl.makeOvl){ //This is a 'managable' overlay
				if (ovl instanceof GLatLng) attraits.push(ovl)
				else if (ovl instanceof GLatLngBounds) paths.push(ovl)
				else alert('Unkownen with makeOvl'+ovl)
				}
			else if (ovl instanceof GOverlay){
				ovls.push(ovl)
				vMap.addOverlay(ovl)
				}
			else {
				alert('Unkownen '+ovl)
				}
			}
		})

	//else Log('_overlay not found')
	div.bounds=vMap.getBounds()

	//############### Event listeners ########################
	GEvent.addListener(vMap,'moveend',function(){ doMoveEnd(div)})
	//alert('before shows')
	doMoveEnd(div,'force')
	}

	
$.parseDataFor = function(elemName){
	var elemx
	if (!(elemx=document.getElementById(elemName))) return false

	if (elemx.jz_data) {
		if (elemx.jz_data.__delaiedInit__) elemx.jz_data = elemx.jz_data.__delaiedInit__(elemx.jz_data)
		return elemx.jz_data }
	if (elemx['_data']) return elemx._data
	if (!elemx['value']) return false
	elemx._data=eval(elemx.value)
	//delete elemx.value
	//alert('did '+elemName+' got:'+elemx._data)
	return elemx._data
	}

$.zmcnt=0
$.doMoveEnd = function(div,force) {
	
	//Log('do moveend for '+div+' force='+force)
	//LogObj(div)
	// do show new markers
	// hidden markers old markers 
	if (!div.vMap) return // no map cant do much
	var vMap=div.vMap
	var bounds=vMap.getBounds()
	//var x={inputmode:pathDiv.inputMode, showmarkers:pathDiv.showmarkers(), eq:newBounds.equals(pathDiv.bounds), force:force }
	//Log('data2'+jzon(x))
	if (bounds.equals(div.bounds) && force!='force') return  // bounds have not changed so do nothing ...
	// ok got a map and bounds have changed
	div.bounds=bounds
	if (div.updater) div.updater=clearTimeout(div.updater)
	var adds=div.ovl2add=[]
	var removes=div.ovl2remove=[]
	if (div.attraits) updateAttraits(div)
	if (div.points) updateMarkers(div)
	if (div.paths) updatePaths(div)
	var wait=true
	ovlUpdater(div,wait)
	//if (removes.length || adds.length) alert('timeout set r='+removes+' a='+adds)
	/* if (removes.length || adds.length) {
		window.status="Nombre d'attraits: à ajouter = "+adds.length+", à enlever = "+removes.length
		alert('timeout set r='+removes+' a='+adds)
		div.updater=setTimeout(function(){ovlUpdater(div)},stepWait)
		}
	else window.status='Terminé'
	*/

	var center=bounds.getCenter()
	if (div.getAttribute('jz:id')) setPositionCookie(div.getAttribute('jz:id'),center.lat(),center.lng(),vMap.getZoom())
	else if (div.id)  setPositionCookie(div.id,center.lat(),center.lng(),vMap.getZoom())

	}

$.ovlUpdater = function(div,wait){
	//Log('in ovl updater div='+div)
	//LogObj(div)
	var step=2, stepWait=10
	if (wait) step=0
	var obj, ovl
	if (!div.vMap) return

	var adds=div.ovl2add || []
	while (adds.length && --step>0) {
		obj=adds.pop()
		if (obj) {
			ovl=obj.makeOvl()
			if (!ovl) continue
			obj.overlay=ovl
			if (!(ovl instanceof Array)) {
				ovl.forObj=obj
				//if (newGP.marker) alert('marker overrun on '+newGP.id)
				try { div.vMap.addOverlay(ovl) }
				catch(e) {}// jz.Log('Catched error in addOverlay for '+ovl+' got:'+e.name+':'+e.message) }
				}
			else dof(ovl,function(ovl){
				ovl.forObj=obj
				//if (newGP.marker) alert('marker overrun on '+newGP.id)
				try { div.vMap.addOverlay(ovl) }
				catch(e) { }//jz.Log('Catched error in addOverlay for '+ovl+' got:'+e.name+':'+e.message) }
				})

			}
		}
	var removes=div.ovl2remove || []
	while (removes.length && --step>0) {
		obj=removes.pop()
		if (obj) {
			ovl=obj.overlay
			if (!ovl) continue
			obj.overlay=false 
			if (!(ovl instanceof Array)) {
				ovl.forObj=false
				//if (newGP.marker) alert('marker overrun on '+newGP.id)
				//try {
					div.vMap.removeOverlay(ovl)
					if (ovl.jz_doRemoved) ovl.jz_doRemoved(obj) //}
				//catch(e) {}//jz.Log('Catched error in removeOverlay for '+ovl+' got:'+e.name+':'+e.message) }
				}
			else dof(ovl,function(subovl){
				subovl.forObj=false
				//if (newGP.marker) alert('marker overrun on '+newGP.id)
				//Log('removing '+subovl)
				try {
					div.vMap.removeOverlay(subovl)
					if (subovl.jz_doRemoved) subovl.jz_doRemoved(obj)}
				catch(e) {  }//jz.Log('Catched error in removeSubOverlay for '+subovl+' got:'+e.name+':'+e.message) }
				})
			}
		}
	if (removes.length || adds.length) {
		window.status='Segments left: to add = '+adds.length+', to remove = '+removes.length
		div.updater=setTimeout(function(){ ovlUpdater(div) },stepWait)
		}
	else window.status='Finished map update ...'
	}
 
$.updateOverlaysGen = function(div, objList, showOverlays,cntxt) {
	//alert('in update overlay gen for '+objList)
	if (!objList) return
	var adds   = div.ovl2add
	var removes= div.ovl2remove
	var bounds = div.bounds
	var added=adds.length, removed=removes.length, remove=[]
	var maxAdd=75
	//scan markers to see if they should be added or removed
	dof(objList, function(obj){
		var hit=false
		if (obj.intersects) hit=obj.intersects(bounds)
		//alert('did hit test for '+obj+' on '+bounds+' got '+hit)
		// test if overlay should be added or removed
		if (obj.overlay) { // got an overlay can only be removed
			if (!showOverlays || !hit || (obj.showable && !obj.showable(cntxt))){
				if (! (obj.removeable  && !obj.removeable())) removes.push(obj) // then special dont remove
				}
		 	return //continue
			}
		//So no overlay
		if ((!showOverlays) || !hit || (obj.showable && !obj.showable(cntxt))) return//no need to add continue
		//so add a marker
		adds.push(obj)
		})
	added=adds.length-added
	removed= removes.length-removed
	//if (cntxt && ( cntxt.mode == 'path')){
	//	if (added || removed) alert('ovlm paths r='+removed+' a='+added)
	//	}
	}


$.updateMarkers = function(div) { 
	if (!div.points) return
	updateOverlaysGen(div, div.points, div.showmarkers())
	}

$.updateAttraits = function(div,adds,removes) {
	//Log('start update Attraits')
	updateOverlaysGen(div, div.attraits, true,{filtre:div.filtreattraits})
	//Log('end update Attraits')
	}

$.updatePaths = function(div, adds,removes) {
	var bounds=div.bounds
	var diagDst=bounds.getSouthWest().distanceFrom(bounds.getNorthEast())
	var zoomLevel=div.vMap.getZoom()

	updateOverlaysGen(div, div.paths, true, {diagDst:diagDst,zoomLevel:zoomLevel,mode:'path'})
	}

}//close jzMap name space ...
