/******************************************************************************
 *
 * To customize startUp:
 *
 * 1) modify toolbar Layout
 *  act on screen.css file and modify the funcion myMapInitialized().
 *  If you change pan and identifyer images edit switchMode() function too.
 *
 *****************************************************************************/

var myKaMap = myKaNavigator = myKaQuery = myScalebar = null;
var queryParams = null;

/**
 * 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 '';
    }
}

function myOnLoad() {
    initDHTMLAPI();

	window.onresize=drawPage;
	
	document.aActiveTools = [];

	myKaMap = new kaMap( 'viewport' );

	var szMap = getQueryParam('map');
    var szExtents = getQueryParam('extents');
    var szCPS = getQueryParam('cps');
	
	//Display the tools in the tool bar and download the code dynamically
	//document.sideBarCurrent says which is loaded first	
	var myPanTool = new toolItem( myKaMap, 'arunaPan', 'Pan', '', 'panTool' );
	//var myIdentifyTool = new toolItem( myKaMap, 'arunaIdentify', 'Identify', '/map/system/compress/?name=js/identify/arunaIdentify.js,js/wz_library/wz_jsgraphics.js', 'sideBar' );
	//var myQueryTool = new toolItem( myKaMap, 'arunaQuery', 'Advanced Query', '/map/system/compress/?name=js/query/arunaQuery.js', 'sideBar' );
	var myLegendTool = new toolItem( myKaMap, 'arunaLegend', 'Legend', '/map/system/compress/?name=js/legend/arunaLegend.js', 'sideBar' );
	var mySearchTool = new toolItem( myKaMap, 'arunaSearch', 'Search', '/map/system/compress/?name=js/search/arunaSearch.js', 'sideBar' );
	var myPrintTool = new toolItem( myKaMap, 'arunaPrint', 'Print', '/map/system/compress/?name=js/print/arunaPrint.js', 'sideBar' );
	//var myScratchpadTool = new toolItem( myKaMap, 'scratchpad', 'Scratchpad', '/map/system/compress/?name=js/scratchpad/scratchpad.js,js/scratchpad/polygonTool.js', 'sideBar' );	
	
    var myKaKeymap = new kaKeymap( myKaMap, 'keymap' );

	//Navigation controls
    myKaNavigator = new kaNavigator( myKaMap );
	myKaNavigator.activate();
	
	//Load the legend
	myArunaLegend = new arunaLegend(myKaMap);
	
    //Get the tracker going
	var myKaTracker = new kaMouseTracker(myKaMap);
	myKaTracker.activate();
	
	// Only needs to be activated in kaMap.js line 1992
	var arunaBallisticZoom = new theZoomedLayer(myKaMap)
	
    myKaMap.registerForEvent( KAMAP_INITIALIZED, null, myInitialized );
    myKaMap.registerForEvent( KAMAP_MAP_INITIALIZED, null, myMapInitialized );
	//For ballistic zoom
	myKaMap.registerForEvent( KAMAP_MAP_INITIALIZED, null, setBallistecTimer );
    myKaMap.registerForEvent( KAMAP_SCALE_CHANGED, null, myScaleChanged );
    myKaMap.registerForEvent( KAMAP_EXTENTS_CHANGED, null, myExtentChanged );
    myKaMap.registerForEvent( KAMAP_LAYERS_CHANGED, null, myLayersChanged );
    myKaMap.registerForEvent( KAMAP_LAYER_STATUS_CHANGED, null, myLayersChanged );
    //myKaMap.registerForEvent( KAMAP_QUERY, null, myQuery );
    //myKaMap.registerForEvent( KAMAP_MAP_CLICKED, null, myMapClicked );
    myKaMap.registerForEvent( KAMAP_MOUSE_TRACKER, null, myMouseMoved );

    //Here we call the first tool directly
	document.sideBarCurrent = 'arunaLegend';
	
	//Hide the loader image
	var loader = getRawObject('arunaLoading');
	loader.style.display = 'none';
	
	//Scalebar settings
	myScalebar = new ScaleBar(1);
    myScalebar.divisions = 3;
    myScalebar.subdivisions = 2;
    myScalebar.minWidth = 150;
    myScalebar.maxWidth = 194;
    myScalebar.place('scaleReference');

	drawPage();
    myKaMap.initialize( szMap, szExtents, szCPS );
}


/**
 * event handler for KAMAP_INITIALIZED.
 *
 * at this point, ka-Map! knows what map files are available and we have
 * access to them.
 */
function myInitialized() {
	var myNavBar = new arunaNavBar(myKaMap);
}

/**
 * event handler for KAMAP_MAP_INITIALIZED
 *
 * the scales are put into a select ... this will be used for zooming
 */
function myMapInitialized( eventID, mapName ) {
    //get list of maps and populate the maps select box
    var aMaps = myKaMap.getMaps();
    // Update map selection list if one is available
    var oSelect = document.forms[0].maps;
    if (oSelect)
    {
        var j = 0;
        var opt = new Option( 'select a map', '', true, true );
        oSelect[j++] = opt;
        for(var i in aMaps) {
          oSelect[j++] = new Option(aMaps[i].title,aMaps[i].name,false,false);
        }

        //make sure the map is selected ...
        var oSelect = document.forms[0].maps;
        if (oSelect.options[oSelect.selectedIndex].value != mapName) {
            for(var i = 0; i < oSelect.options.length; i++ ) {
                if (oSelect.options[i].value == mapName) {
                    oSelect.options[i].selected = true;
                    break;
                }
           }
        }
    } 

    //update the scales select
    var currentMap = myKaMap.getCurrentMap();
    var scales = currentMap.getScales();
    var currentScale = myKaMap.getCurrentScale();
}

//Chris set ballistic timer on instialized
function setBallistecTimer(){
	goQueueManager.enqueue( 15000, null, zoomedLayerStopWatch, [null] )
}

/**
 * handle the extents changing by updating a link in the interface that links
 * to the current view
 */
function myExtentChanged( eventID, extents ) {
	updateLinkToView();
}

function myMouseMoved( eventID, position) {
    var geoposX = $('#topXpos').element();
	var geoposY = $('#topYpos').element();	
	geoposX.innerHTML = 'x: ' + roundIt(position.x,2);
	geoposY.innerHTML = 'y: ' + roundIt(position.y,2);
	
}

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 = ',';
	}
	
	//Store the view URL in the document
	document.viewURL = 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';
            }
        }
    }
    myScalebar.update(scale);
    if (scale >= 1000000) {
        scale = scale / 1000000;
        scale = scale + " Million";
    }
    var outString = 'scale 1:'+ scale;
    $('#topScale').element().innerHTML = outString;
}

/**
 * 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( map )
{
    var extents = myKaMap.getGeoExtents();
    myKaMap.selectMap(map, extents);
}

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 myMapClicked( eventID, coords ) {
    //alert( 'myMapClicked('+coords+')');
	//myKaMap.zoomTo(coords[0],coords[1]);
}

function myZoomIn() {
    myKaMap.zoomIn();
}

function myZoomOut() {
    myKaMap.zoomOut();
}

function myPrint() {
    var szLayers = '';
    
    var layers = myKaMap.getCurrentMap().getLayers();
    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 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+'&extent='+extent[0]+'|'+extent[1]+'|'+extent[2]+'|'+extent[3];
 
    WOOpenWin( 'Print', 'tools/print/print_map.php?'+params, 'resizable=yes,scrollbars=yes,width=600,height=400' );
    
}


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';
    }
}

/**
 * CHRIS drawPage - calculate sizes of the various divs to make the app full screen.
 */
function drawPage() {
    var browserWidth = getInsideWindowWidth();
    var browserHeight = getInsideWindowHeight();

    var viewport = getRawObject('viewport');
	var infoWindow = getRawObject('infoWindow');
	var bottomBar = getRawObject('bottomBar');
	var sideBar = getRawObject('sideBar');

    //Set Viewport Width
    if(myKaMap.isIE4) {
        //terrible hack to avoid IE to show scrollbar
        viewport.style.width = (browserWidth -2) + "px";
		viewport.style.height = (browserHeight -2) + "px";
		
        infoWindow.style.width = (browserWidth -428) + "px";
		infoWindow.style.height = (browserHeight - 92) + "px";
		
		bottomBar.style.width = (browserWidth - 15) + "px";

		sideBar.style.height = (browserHeight - 82) + "px";				
						
    } else {
        viewport.style.width = browserWidth + "px";
		viewport.style.height = browserHeight + "px";
		
        infoWindow.style.width = (browserWidth - 428) + "px";
		infoWindow.style.height = (browserHeight - 90) + "px";	
		
		bottomBar.style.width = (browserWidth - 12) + "px";	
		//110
		sideBar.style.height = (browserHeight - 80) + "px";				
    }	
	
    myKaMap.resize();
}

/*
 * CHRIS draw info window for meta data and help
 */

function drawInfoWindow (layerName, oKaMap){
	var infoWindow = getRawObject('infoWindow');
	infoWindow.style.display = 'inline';
	new arunaMetaData(layerName, oKaMap);
}

/**
 * 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();
        getRawObject('toolQuery').style.backgroundImage = 'url(images/icon_set_nomad/tool_query_2.png)';
        getRawObject('toolPan').style.backgroundImage = 'url(images/icon_set_nomad/tool_pan_1.png)';
        getRawObject('toolZoomRubber').style.backgroundImage = 'url(images/icon_set_nomad/tool_rubberzoom_1.png)';
    } else if (id=='toolPan') {
        myKaNavigator.activate();
        getRawObject('toolQuery').style.backgroundImage = 'url(images/icon_set_nomad/tool_query_1.png)';
        getRawObject('toolPan').style.backgroundImage = 'url(images/icon_set_nomad/tool_pan_2.png)';
        getRawObject('toolZoomRubber').style.backgroundImage = 'url(images/icon_set_nomad/tool_rubberzoom_1.png)';
    } else if (id=='toolZoomRubber') {
        myKaRubberZoom.activate();
        getRawObject('toolQuery').style.backgroundImage = 'url(images/icon_set_nomad/tool_query_1.png)';
        getRawObject('toolPan').style.backgroundImage = 'url(images/icon_set_nomad/tool_pan_1.png)';
        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;
}

//MATH FUNCTIONs
function roundIt(number,decimals){
	var base10 = 10;
	for(var i=0;i<decimals-1;i++)
		base10 = base10 *10;
	 
	return Math.round(number * base10)/base10;
}

//Chris - This function is directly tied in to the Ballistic zoom function
function removeZoomedLayer(oKaMap){
	var previousZoom = getRawObject('theZoomedLayer');
	if(previousZoom){
		oKaMap.domObj.removeChild(previousZoom);
		return true;
	}
	else{
		return false;
	}
}
//Chris - This function is directly tied in to the Ballistic zoom function
function zoomedLayerStopWatch(){
	document.ballisticReady = true;
}

//Chris 
function expandCollapseLeft(id){
	//Get the arrow object
	var oImgArrow = getRawObject(id);
	var displayObject = getRawObject('sideBar');
	//Look in the src string to see if it is the left or right image
	var search = oImgArrow.src.search('leftArrow.png');
	if(search != -1){
		oImgArrow.src = "/images/buttons/rightArrow.png";
		displayObject.style.display = 'none';
	}
	else{
		oImgArrow.src = "/images/buttons/leftArrow.png";
		displayObject.style.display = '';
	}
}

//Chris - get the index of a value in an array
function getArrayIndex(array, value){
	for(var i = 0; i < array.length; i++){
		if(array[i].name == value){
			return i;
		}
	}
	return false;
}

//Chris 
function expandCollapseRight(id){
	//Get the arrow object
	var oImgArrow = getRawObject(id);
	var scaleReference = getRawObject('scaleReference');
	var keymap = getRawObject('keymap');
	//Look in the src string to see if it is the left or right image
	var search = oImgArrow.src.search('rightArrow.png');
	if(search != -1){
		oImgArrow.src = "/images/buttons/leftArrow.png";
		scaleReference.style.display = 'none';
		keymap.style.display = 'none';
	}
	else{
		oImgArrow.src = "/images/buttons/rightArrow.png";
		scaleReference.style.display = '';
		keymap.style.display = '';
	}
}