
var myKaMap = myKaNavigator = myKaQuery = null;
var queryParams = null;

// MAIN PROJECT MAP NAME
//var projectMapName = "ortsplanOnline";
//var projectMapName = "mapgate24";

function myOnLoad() {
	
	// preload some images
	var img1 = new Image();
	img1.src = "/OPO/tools/progZoomer/images/slider.gif";
	var img1 = new Image();
	img1.src = "/OPO/tools/progZoomer/images/support.gif";
	var img1 = new Image();
	img1.src = "/OPO/tools/opacityController/images/slider.gif";
	var img1 = new Image();
	img1.src = "/OPO/tools/opacityController/images/support.gif";
	
    initDHTMLAPI();

	myKaMap = new kaMap( 'viewport' );

	var szMap = getQueryParam('map');

	// we get the map of the project, except if we specify another in the URL
	if(szMap == "") {
		szMap = projectMapName;
	}
	var szExtents = getQueryParam('extents');
    var szCPS = getQueryParam('cps');
    
    // set default image while tiles are loading
    myKaMap.tileLoadingImg = new Image(256,256);
    myKaMap.tileLoadingImg.src = "/OPO/images/tileLoading.gif";
    //myKaMap.tileLoadingImg.src = myKaMap.aPixel.src;

	myKaNavigator = new kaNavigator( myKaMap );
    myKaNavigator.activate();
    
    // Bug correction : avoid to pan if the onmouseup event occurs out of the viewport
    document.onmouseup = function(){myKaNavigator.bMouseDown = false; myKaNavigator.cursor = myKaNavigator.cursorNormal; myKaMap.setCursor(myKaNavigator.cursorNormal)};
    
    // custom tools
    
    //var myZoomBoxes = new zoomBoxes(myKaMap, "zoomBoxes", 22, 10, 25);
    
    var myOpacityController = new opacityController(myKaMap);
    
    var myProgZoomer = new progZoomer(myKaMap);
    
    var interaction = new interact(myKaMap);
    
    new admin(myKaMap);
    new utils(myKaMap);

    var routingFunctions = new routingFuncs(myKaMap);
    
    var myKaKeymap = new kaKeymap(myKaMap, "keymap");
    
    myKaMap.registerForEvent( KAMAP_INITIALIZED, null, initOPOContext );
 	myKaMap.registerForEvent( KAMAP_EXTENTS_CHANGED, null, myExtentChanged );
 	myKaMap.registerForEvent( KAMAP_SCALE_CHANGED, null, updateCopyright );
 	if (projectMapName=='mapgate24') {
		myKaMap.registerForEvent(KAMAP_MAP_CLICKED,null,mapClicked);
		myKaMap.registerForEvent( KAMAP_EXTENTS_CHANGED, null, updateBoxes );
	}
	// Resize IE6 viewport every 500ms (or it crashes...)
    if(navigator.userAgent.toLowerCase().indexOf("msie 6.")!= -1){
    	window.onresize = triggerChronoDrawPage;
    }
    else{
    	window.onresize = drawPage;	
    }
    
	drawPage();

	// Are we already logged in?
	if (projectMapName!='mapgate24' && callMode!='rkey') {
		myKaMap.admin.checkLogin();
	}
    myKaMap.initializeFromRemoteServer( szMap, szExtents, szCPS, "/OPO/proxy.php" );


};



//event handler for KAMAP_INITIALIZED.
// at this point, ka-Map! knows what map files are available and we have
// access to them. 
function initOPOContext() {
	if (dataLink['ismapit']==1) {
		dataOPO['LOCATE_X']=dataLink['locateX'];
		dataOPO['LOCATE_Y']=dataLink['locateY'];
		dataOPO['BASESCALE']=dataLink['zoom'];
		dataOPO['ismapit']=1;
	}
	if (dataLink['isdirect']==1) {
		dataOPO['LOCATE_X']=dataLink['X'];
		dataOPO['LOCATE_Y']=dataLink['Y'];
		dataOPO['ismapit']=0;
		dataOPO['BASESCALE']=6000;
	}
	if (dataOPO['LOCATE_X']!="" && dataOPO['LOCATE_Y']!="") {
		myKaMap.zoomTo(parseInt(dataOPO['LOCATE_X']),parseInt(dataOPO['LOCATE_Y']),parseInt(dataOPO['BASESCALE']));
		if (dataOPO['ismapit']==1) {
			var innerInfo = new Array;
			innerInfo.COORDX=dataOPO['LOCATE_X'];
			innerInfo.COORDY=dataOPO['LOCATE_Y'];
			var a = new Array;
			a.innerInfo = innerInfo;
			a.identifier = -1;
			myKaMap.interact.tipItem(a);
			$('SMLayer').style.display='none';
			var infoContainer = myKaMap.getRawObject("poiInfoContainer");
			while(infoContainer.childNodes.length > 0){
				infoContainer.removeChild(infoContainer.childNodes[0]);
			}
			new Ajax.Updater('poiInfoContainer','/OPO/fetchdata.php?action=drawMapItInfo&id='+dataLink['id']);
			data = new Object();
			data.COORDX=dataLink['locateX'];
			data.COORDY=dataLink['locateY'];
			data.NPA=dataLink['npa'];
			data.LOCALITE_18=dataLink['localite_18'];
			data.NOM_RUE=dataLink['nom_rue'];
			data.NO_MAISON=dataLink['no_maison'];
			myKaMap.interact.showActions('link',data);
		}
		if (dataLink['isdirect']==1) {
			var params=null;
			if (dataLink['objclass']=="poi") {
				params = "isdirect="+dataLink['ID_POINT_INTERET']+"&action=getPOI&type="+dataLink['cat'];
				var selectBox=$('selectBoxPOI');
				var cb=myKaMap.interact.POIselectedCallback;
				var sab=$("POIsablier");
			}
			if (dataLink['objclass']=="firm") {
				params = "isdirect="+dataLink['ID_POINT_INTERET']+"&action=getFirm&type="+dataLink['cat'];
				var selectBox=$('selectBoxFirms');
				var cb=myKaMap.interact.firmSelectedCallback;
				var sab=$("firmSablier");
			}
			if (dataLink['objclass']=="chalet") {
				params = "isdirect="+dataLink['ID_POINT_INTERET']+"&action=getChalet&name="+escape(dataLink['name']);
				var cb=myKaMap.interact.chaletSearchCallback;
				var sab=$("chaletSablier");
			}
			if (dataLink['objclass']=="adr") {
				params = "isdirect="+dataLink['ID_POINT_INTERET']+"&action=addressSearch&type=1&id="+dataLink['ID_POINT_INTERET'];
				var cb=myKaMap.interact.addressSearchCallback;
				var sab=$("adresseSablier");
			}
			if (typeof(selectBox)!="undefined") {
				for (var i=0;i<selectBox.options.length;i++) {
					if (selectBox.options[i].value==dataLink['cat']) selectBox.selectedIndex=selectBox.options[i].index;
				}
			}
			if (params) {
				sab.style.display = "block";
				myKaMap.interact.callPHP(params, cb);
			}
		}
	}
	myKaMap.getCurrentMap().setMaxExtents(parseInt(dataOPO['LEFT']), parseInt(dataOPO['BOTTOM']), parseInt(dataOPO['RIGHT']), parseInt(dataOPO['TOP']));
	
	if(dataOPO['EXTRA_LAYERS']){
		//new extraLayers(myKaMap);
	}
	if (callModeType!='') {
		if (callModeType=='w') {
			var obj=$('WanderBtn');
			var name='Wanderland-Choice';
		}
		if (callModeType=='v') {
			var obj=$('VeloBtn');
			var name='Veloland';
		}
		if (callModeType=='m') {
			var obj=$('BikeBtn');
			var name='Mountainbikeland';
		}
		if (callModeType=='s') {
			var obj=$('SkatingBtn');
			var name='Skatingland';
		}
		if (callModeType=='k') {
			var obj=$('KanuBtn');
			var name='Kanuland';
		}
		myKaMap.interact.setSMLayerVisibility(obj,name);
	}
};

function updateCopyright(){
	myKaMap.getCurrentScale();
	//myKaMap.getRawObject("copyrightText").innerHTML = ...;
};

function updateBoxes() {
	myKaMap.interact.updateBoxes();
};
function mapClicked(eventID,p) {
	myKaMap.interact.mapClicked(eventID,p);
};

var drawPageChronoIsRunning = false;
drawPageChrono = null;
function triggerChronoDrawPage(){
	if(drawPageChronoIsRunning == false){
		drawPageChronoIsRunning = true;
		drawPageChrono = window.setTimeout(function(){drawPage()}, 1500);
	}
};

/**
 * parse the query string sent to this window into a global array of key = value pairs
 * this function should only be called once
 */
function parseQueryString() {
    queryParams = {};
    var s=window.location.search;
    if (s!='') {
        s=s.substring( 1 );
        var p=s.split('&');
        for (var i=0;i<p.length;i++) {
            var q=p[i].split('=');
            queryParams[q[0]]=q[1];
        }
    }
};

/**
 * get a query value by key.  If the query string hasn't been parsed yet, parse it first.
 * Return an empty string if not found
 */
function getQueryParam(p) {
    if (!queryParams) {
        parseQueryString();
    }
    if (queryParams[p]) {
        return queryParams[p];
    } else {
        return '';
    }
};

/**
 * handle the extents changing by updating a link in the interface that links
 * to the current view
 */
function myExtentChanged( eventID, extents ) {
	updateLinkToView();
};


function myLayersChanged(eventID, map) {
	updateLinkToView();
};

function updateLinkToView()  {
	var url = window.location.protocol+'/'+'/'+window.location.host +':'+window.location.port+'/'+window.location.pathname+'?';
	var extents = myKaMap.getGeoExtents();
	var cx = (extents[2] + extents[0])/2;
	var cy = (extents[3] + extents[1])/2;
	var cpsURL = 'cps='+cx+','+cy+','+myKaMap.getCurrentScale();
	var mapURL = 'map=' + myKaMap.currentMap;
	var theMap = myKaMap.getCurrentMap();
	var aLayers = theMap.getLayers();
	var layersURL = 'layers=';
	var sep = '';
	for (var i=0;i<aLayers.length;i++) {
		layersURL += sep + aLayers[i].name;
		sep = ',';
	}

	var link = document.getElementById('linkToView');
	if(link) // MOD
		link.href = url + mapURL + '&' + cpsURL + '&' + layersURL;
};

/**
 * called when kaMap tells us the scale has changed
 */
function myScaleChanged( eventID, scale ) {
    //todo: update scale select and enable/disable zoomin/zoomout
    var currentMap = myKaMap.getCurrentMap();
    var scales = currentMap.getScales();
    for(var i in scales){
        var imgString = 'img'+scales[i];
        var scaleString = 'img'+scale;
        if(getRawObject(imgString)) {
            if(imgString == scaleString) {
                getRawObject(scaleString).src = 'images/pixel-red.png';
            } else {
                getRawObject(imgString).src = 'images/pixel-blue.png';
            }
        }
    }
    if(typeof(myScalebar) != "undefined"){ //MOD
	    myScalebar.update(scale);
    	if (scale >= 1000000) {
        	scale = scale / 1000000;
        	scale = scale + " Million";
    	}
    	var outString = 'current scale 1:'+ scale;
		try{
			getRawObject('scale').innerHTML = outString;
		}
		catch(e){}
    }
};

/**
 * called when the user changes scales.  This will cause the map to zoom to
 * the new scale and trigger a bunch of events, including:
 * KAMAP_SCALE_CHANGED
 * KAMAP_EXTENTS_CHANGED
 */
function mySetScale( scale ) {
    myKaMap.zoomToScale( scale );
};

/**
 * called when the map selection changes due to the user selecting a new map.
 * By calling myKaMap.selectMap, this triggers the KAMAP_MAP_INITIALIZED event
 * after the new map is initialized which, in turn, causes myMapInitialized
 * to be called
 */
function mySetMap( name ) {
    myKaMap.selectMap( name );
};

function myQuery( eventID, queryType, coords ) {
    var szLayers = '';
    var layers = myKaMap.getCurrentMap().getQueryableLayers();
    if(layers.length==0) {
		alert("No queryable layers at this scale and extent");
		return;
    }
    for (var i=0;i<layers.length;i++) {
        szLayers = szLayers + "," + layers[i].name;
    }


    var extent = myKaMap.getGeoExtents();
    var scale = myKaMap.getCurrentScale();
    var cMap = myKaMap.getCurrentMap().name;
	var params='map='+cMap+'&q_type='+queryType+'&scale='+scale+'&groups='+szLayers+'&coords='+coords+'&extent='+extent[0]+'|'+extent[1]+'|'+extent[2]+'|'+extent[3];

	WOOpenWin( 'Query', 'map_query.php?'+params, 'resizable=yes,scrollbars=yes,width=600,height=400' );

//    alert( "Map: " + cMap + " | Scale: " + scale + " | Extent: " + extent + " | QUERY: " + queryType + " " + coords + " on layers " + szLayers );
};



function myZoomIn() {
    myKaMap.zoomIn();
};

function myZoomOut() {
    myKaMap.zoomOut();
};

function myPrint(info) {
	var szLayers = '';
	var szOpacitys = '';

	if (info==null) {
		var info = new Object();
		info['PLACE']=dataOPO['NAME'];
	}
	var layers = myKaMap.getCurrentMap().getLayers();
	for (var i=0;i<layers.length;i++) {
		szLayers = szLayers + "," + layers[i].name;
		szOpacitys = szOpacitys + "," + layers[i].opacity;
	}

	var extent = myKaMap.getGeoExtents();
	var scale = myKaMap.getCurrentScale();
	var cMap = myKaMap.getCurrentMap().name;

	var img_width = '600';// pixel dimension. max_img_width set inside print_map.php

	var params='map='+cMap+'&scale='+scale+'&img_width='+img_width+'&groups='+szLayers+'&opacitys='+szOpacitys+'&extent='+extent[0]+'|'+extent[1]+'|'+extent[2]+'|'+extent[3];
	for (var i in info) {
		params+="&info["+i+"]="+escape(info[i]);
	}

	WOOpenWin( 'Print', '/OPO/tools/print/print_map.php?'+params, 'resizable=yes,scrollbars=yes,width=600,height=400' );
};


function toggleToolbar(obj) {
    if (obj.style.backgroundImage == '') {
        obj.isOpen = true;
    }

    if (obj.isOpen) {
        obj.title = 'show toolbar';
        obj.style.backgroundImage = 'url(images/arrow_down.png)';
        var bValue = getObjectTop(obj);;
        var d = getObject('toolbar');
        d.display = "none";
        obj.isOpen = false;
        obj.style.top = "3px";
    } else {
        obj.title = 'hide toolbar';
        obj.style.backgroundImage = 'url(images/arrow_up.png)';
        var d = getObject('toolbar');
        d.display="block";
        obj.isOpen = true;
        var h = getObjectHeight('toolbar');
        obj.style.top = (h + 3) + "px";
    }
};

function toggleKeymap(obj) {
    if (obj.style.backgroundImage == '') {
        obj.isOpen = true;
    }

    if (obj.isOpen) {
        obj.title = 'show keymap';
        obj.style.backgroundImage = 'url(images/arrow_left.png)';
        var bValue = getObjectTop(obj);;
        var d = getObject('keymap');
        d.display = "none";
        obj.isOpen = false;
    } else {
        obj.title = 'hide keymap';
        obj.style.backgroundImage = 'url(images/arrow_right.png)';
        var d = getObject('keymap');
        d.display="block";
        obj.isOpen = true;
    }
};

function toggleReference(obj) {
    if (obj.style.backgroundImage == '') {
        obj.isOpen = true;
    }

    if (obj.isOpen) {
        obj.title = 'show reference';
        obj.style.backgroundImage = 'url(images/arrow_up.png)';
        var d = getObject('reference');
        d.display = 'none';
        obj.isOpen = false;
        obj.style.bottom = '3px';
    } else {
        obj.title = 'hide reference';
        obj.style.backgroundImage = 'url(images/arrow_down.png)';
        var d = getObject('reference');
        d.display = 'block';
        obj.isOpen = true;
        obj.style.bottom = (getObjectHeight('reference') + 3) + 'px';
    }
};
function toggleSearch(obj) {
    if (obj.style.backgroundImage == '') {
        obj.isOpen = true;
    }

    if (obj.isOpen) {
        obj.title = 'show search results';
        obj.style.backgroundImage = 'url(images/arrow_up.png)';
        var d = getObject('searchOut');
        d.display = 'none';
        obj.isOpen = false;
        obj.style.bottom = '3px';
    } else {
        obj.title = 'hide  search results';
        obj.style.backgroundImage = 'url(images/arrow_down.png)';
        var d = getObject('searchOut');
        d.display = 'block';
        obj.isOpen = true;
        obj.style.bottom = (getObjectHeight('searchOut') + 3) + 'px';
    }
};

function dialogToggle( href, szObj) {
    var obj = getObject(szObj);
    if (obj.display == 'none') {
        obj.display = 'block';
        href.childNodes[0].src = 'images/dialog_shut.png';
    } else {
        obj.display = 'none';
        href.childNodes[0].src = 'images/dialog_open.png';
    }
};

/**
 * drawPage
 */
function drawPage() {
	// set minimums
	var minWidth = 400;
	var minHeight = 600;
	
	// Get the different elements
	var viewport = myKaMap.getRawObject('viewport');
	var viewportContainer = myKaMap.getRawObject('viewportContainer');
	var mainContainer = myKaMap.getRawObject("mainContainer");
	var tabLeft = myKaMap.getRawObject("tabLeft");
	var tabRight = myKaMap.getRawObject("tabRight");
	var tabCenter = myKaMap.getRawObject("tabCenter");
	
    // Get the inner dimension of the window
    var winH = getInsideWindowHeight();
	var winW = getInsideWindowWidth();

    // Find the height of the header
    var topMainContainer = mainContainer.offsetTop;
	var borderWidth = 19;
	
    // Do not forget to substract top and bottom border of divs
    var availHeight = winH - topMainContainer - 2*borderWidth;
    
    // minimal height is minHeight
    availHeight = Math.max(availHeight,minHeight);
	
	// avoid scroll bars in IE
	if(document.all){
		availHeight -= 20;
	}
	
	mainContainer.style.height = availHeight + "px";
	tabLeft.style.height = availHeight + "px";
	tabRight.style.height = availHeight + "px";
	tabCenter.style.height = availHeight + "px";
	

	var availMapHeight = availHeight;
	viewportContainer.style.height = availMapHeight + "px";
	
	var paddingViewport = 10;
	viewport.style.top = paddingViewport + "px";
	viewport.style.height = availMapHeight - 2*paddingViewport - 2 + "px"; // 2 pixels for borders
	
	//getRawObject("viewer").innerHTML = winW - tabLeft.offsetWidth - tabRight.offsetWidth - 10;
	
	if(winW - tabLeft.offsetWidth - tabRight.offsetWidth - 10 < minWidth){
		viewportContainer.style.width = minWidth + "px";
		tabRight.style.left = tabLeft.offsetWidth + 5 + tabCenter.offsetWidth + 5 + "px"; 
	}
	else{
		viewportContainer.style.width = "auto";
		tabRight.style.right = "0px";
		tabRight.style.left = "auto";
	}
	
	viewport.style.width = viewportContainer.offsetWidth - 2*paddingViewport - 2 + "px"; // 2 pixels for borders
	
	myKaMap.getRawObject("OPOactions").style.height = paddingViewport + "px";

	myKaMap.resize();
	drawPageChronoIsRunning = false;
	clearTimeout(drawPageChrono);
	return;
};

/**
 * getFullExtent
 * ...
 */
function getFullExtent() {
    var exStr = myKaMap.getCurrentMap().defaultExtents.toString();
    var ex = myKaMap.getCurrentMap().defaultExtents;
    myKaMap.zoomToExtents(ex[0],ex[1],ex[2],ex[3]);
};

/**
 * switchMode
 * ...
 */
function switchMode(id) {
    if (id=='toolQuery') {
        myKaQuery.activate();
        if(getRawObject('toolQuery')) getRawObject('toolQuery').style.backgroundImage = 'url(images/icon_set_nomad/tool_query_2.png)';
        if(getRawObject('toolPan')) getRawObject('toolPan').style.backgroundImage = 'url(images/icon_set_nomad/tool_pan_1.png)';
        if(getRawObject('toolZoomRubber')) getRawObject('toolZoomRubber').style.backgroundImage = 'url(images/icon_set_nomad/tool_rubberzoom_1.png)';
    } else if (id=='toolPan') {
        myKaNavigator.activate();
        if(getRawObject('toolQuery')) getRawObject('toolQuery').style.backgroundImage = 'url(images/icon_set_nomad/tool_query_1.png)';
        if(getRawObject('toolPan')) getRawObject('toolPan').style.backgroundImage = 'url(images/icon_set_nomad/tool_pan_2.png)';
        if(getRawObject('toolZoomRubber')) getRawObject('toolZoomRubber').style.backgroundImage = 'url(images/icon_set_nomad/tool_rubberzoom_1.png)';
    } else if (id=='toolZoomRubber') {
        myKaRubberZoom.activate();
        if(getRawObject('toolQuery')) getRawObject('toolQuery').style.backgroundImage = 'url(images/icon_set_nomad/tool_query_1.png)';
        if(getRawObject('toolPan')) getRawObject('toolPan').style.backgroundImage = 'url(images/icon_set_nomad/tool_pan_1.png)';
        if(getRawObject('toolZoomRubber')) getRawObject('toolZoomRubber').style.backgroundImage = 'url(images/icon_set_nomad/tool_rubberzoom_2.png)';
    } else {
        myKaNavigator.activate();
    }
};

/*
 *  applyPNGFilter(o)
 *
 *  Applies the PNG Filter Hack for IE browsers when showing 24bit PNG's
 *
 *  var o = object (this png element in the page)
 *
 * The filter is applied using a nifty feature of IE that allows javascript to
 * be executed as part of a CSS style rule - this ensures that the hack only
 * gets applied on IE browsers :)
 */
function applyPNGFilter(o) {
    var t="/images/a_pixel.gif";
    if( o.src != t ) {
        var s=o.src;
        o.src = t;
        o.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+s+"',sizingMethod='scale')";
    }
};

//functions to open popup

function WOFocusWin( nn ) {
	eval( "if( this."+name+") this."+name+".moveTo(50,50); this."+name+".focus();" );
};

function WOOpenWin( name, url, ctrl ) {
    eval( "this."+name+"=window.open('"+url+"','"+name+"','"+ctrl+"');" );

    /*IE needs a delay to move forward the popup*/
    // window.setTimeout( "WOFocusWin(nome);", 300 );
};

function WinOpener() {
    this.openWin=WOOpenWin;
	this.focusWin=WOFocusWin;
};
