/**
* Map
*/
var m = null;
/**
* Loket Order
*/
var l = null;
/**
* Identifier
*/
var i = null;
/**
* CrossSection
*/
var c = null; 
/**
 * Id of active toolbar button 
 */
var activeBtn = null;
/**
 * TimeoutID of the reload timer
 */
var reloadTimer   = 0;	
/**
 * Indication if resizing is already in progress
 */
var resizing = false;

/**
 * Save state of buttons in array between disabling and enabling
 */
var svBtnState = new Array();

/**
* Initialization
*/
function init(contextPath) {
	if(!contextPath) {
		contextPath = "";
	}
	try{
		window.onresize = startResize; //doResize;

		// prevent text selection when the shift key is pressed and the mouse is down
		// Internet Explorer:
		if (document.all)
		  document.onselectstart =
		    function () { return false; };

		// Netscape 6:
		document.onmousedown = function () { return false; };

		// style the overview text div dependent on the browser
		if (document.all) {
			document.getElementById('overview_txt').style.position = 'relative';
		} else {
			document.getElementById('overview_txt').style.position = 'static';
		}
		
		// init toolbar buttons
		activeBtn = null;
		
	    var reactiveButtons = new Array();
	    reactiveButtons[0] = "idButton";
	    reactiveButtons[1] = "selectButton";
	    reactiveButtons[2] = "selectPolygonButton";
        styleButtons(reactiveButtons,"Disabled");

        // init map object
		m = new Map(document.getElementById('map'), 
				document.getElementById('toc'),
				document.getElementById('legend'),
				document.getElementById('overview'));

		//m.onIdentify(handleIdentifiedIds, "DINO_NR");
		//m.onSelect(handleSelectedIds, "DINO_NR");
		
		m.setShowBackgroundLayers(true);
		m.setActivationEnabled(true);
		m.setActivationWarning('Activeer a.u.b eerst een laag.');
		m.onActivelayerChanged(function(){
				// enable buttons
				styleButtons(reactiveButtons,"");
				})
		
		m.onStartOfAction(disableToolbar);
		m.onEndOfAction(enableToolbar);
				
		m.setMapUrl(contextPath + "/map");
		m.setTocUrl(contextPath + "/map/toc.jsp");
		m.setWaitImageUrl(contextPath + "/map/images/loadData.gif");
		
		displaySelectedAreas(false);

		/*
		 * Modified initialization for DINO Loket. 
		 */
		if(getUrlParameter("setLayerId")) {
			m.waitImage(true);
			m.setLayer(getUrlParameter("setLayerId"));
			m.waitImage(false);
		} else if(getUrlParameter("addLayerId")) {
			m.waitImage(true);
			m.addLayer(getUrlParameter("addLayerId"));
			m.waitImage(false);
		} else if (getUrlParameter("selectionLoaded")) {
			// no action here;
			// a new selection has been loaded and will be displayed on this map
		} else {
			m.waitImage(true);
			m.setLayer("M07M0001 Grenzen");
			m.waitImage(false);
		}
		
		if(getUrlParameter("setActiveLayerId")) {
			m.setActiveLayer(getUrlParameter("setActiveLayerId"));
		}
		
		doResize();	// also refreshes map

		i = new MapIdentifier(contextPath);
		l = new LoketOrder(document.getElementById('orderButton'), contextPath);
		c = new MapCrossSection();
		//c.setUrl(contextPath + '/map/section.jsp');
		c.setUrl(contextPath + '/map/SectionModels');
		/*
		 * End of modified initialization for DINO Loket. 
		 */

		m.getPolyLineState().onNewPoint(addCrossSectionPoint);
		
		m.onActivelayerChanged(function(layer){
			// enable buttons
			styleButtons(reactiveButtons,"");
			setFeatureProperty(layer);
			})
		
		//check for active layers and selected ids on the servlet
		m.initActiveLayer(true);	// if no layer is active, activate the first visible
		m.refreshToc(); // refresh toc because a layer might have been activated
		m.drawSelectionAreas();
		if (m.isSelectPropertyUndefined()) return;
		m.identifyMapImage("", "", m.getSelectProperty(), m.getOnSelect(), false, true);
	} catch(err) {
		alert("Unable to show map: " + err);
	}	
}	

/**
 * Save selected areas as text
 */
function saveSelection() {
	location.href=m.getMapUrl() + "?saveSelection";
}

/**
 * Toggle display of map and selected areas screen
 * @param display  true : show div, false : hide div
 */
function displaySelectedAreas(display) {
	if (display) {
		// show selection div
		//document.getElementById('mapToolbar').style.display = "none"; //hide 
		//document.getElementById('mapAndLegend').style.display = "none"; //hide 
		//document.getElementById('selAreas').style.display = "block"; //show 
		el = document.getElementById("selAreas");
		el.style.visibility = "visible";
	} else {
		// hide selection div
		//document.getElementById('mapToolbar').style.display = "block"; //hide 
		//document.getElementById('mapAndLegend').style.display = "block"; //hide 
		//document.getElementById('selAreas').style.display = "none"; //show 
		el = document.getElementById("selAreas");
		el.style.visibility = "hidden";
	}
}

/**
 * Toggle display of legend and toc
 * @param display  true : show legend, false : show toc
 * @param srcpath  path where images are located 
 */
function displayLegend(display,srcpath) {
	if (display) {
		// show legend
		document.getElementById('toc').style.display = "none"; //hide TOC
		document.getElementById('legend').style.display = "block"; //show legend
		// so enable toc button
		document.getElementById('tocButton').disabled = false; 
		document.getElementById('legendButton').disabled = true; 
		document.getElementById('tocButton').src = srcpath + '/t.gif'; 
		document.getElementById('legendButton').src = srcpath + '/l_d.gif'; 
	} else {
		// show toc
		document.getElementById('legend').style.display = "none"; //hide legend
		document.getElementById('toc').style.display = "block"; //show TOC
		// so enable legend button
		document.getElementById('tocButton').disabled = true; 
		document.getElementById('legendButton').disabled = false; 
		document.getElementById('tocButton').src = srcpath + '/t_d.gif'; 
		document.getElementById('legendButton').src = srcpath + '/l.gif'; 
	}
}

/**
 * Toggle display of overview map
 * @param text for alt when div is displayed
 * @param text for title when div is displayed
 * @param text for alt when div is hidden
 * @param text for title when div is hidden
 */
function toggleOverview(alt_text_show, title_text_show, alt_text_hide, title_text_hide) {
	elOvM = document.getElementById("overviewMap");
	elOv = document.getElementById("overview");
	elBtn = document.getElementById("overviewButton");
	if (elOv.style.visibility == "visible") {
		// hide overview div
		elOv.style.visibility = "hidden";
		elOvM.style.visibility = "hidden";
		elBtn.className = "toolbar overviewButton";
		elBtn.setAttribute('alt',alt_text_show);
		elBtn.setAttribute('title',title_text_show);
	} else {
		// show overview div
		elOv.style.visibility = "visible";
		elOvM.style.visibility = "visible";
		elBtn.className = "toolbar overviewButtonHide";
		elBtn.setAttribute('alt',alt_text_hide);
		elBtn.setAttribute('title',title_text_hide);
	}
}


/** 
 * Initializes resizing when the resize event is triggered
 * @return
 */
function startResize() {
	// skip this when resizing is caused by the doResize it self
	if (!resizing) {
		window.clearTimeout(reloadTimer);
		reloadTimer = window.setTimeout("doResize();", 1000);
	}
}

/**
 * Resizes and redisplays the map
 * @return
 */
function doResize() {
	resizing = true;	// prevent an infinite loop 
	disableToolbar();
	resizeMapAndToc()
	m.refreshMap();
	enableToolbar();
	resizing = false;
}

/**
 * Resizes the map (and toc) to take advantage of all available space
 * @return
 */
function resizeMapAndToc() {
	var frameHeight = window.innerHeight;
	if (frameHeight == null) {
		if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		    //IE 6+ in 'standards compliant mode'
		    frameHeight = document.documentElement.clientHeight;
		} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		    //IE 4 compatible
		    frameHeight = document.body.clientHeight;
		}
	}
	var divHeight  = frameHeight - findPosY(document.getElementById('mapOverflow')) - 8;
	document.getElementById('mapOverflow').style.height = divHeight  + 'px';
	document.getElementById('map').style.height = divHeight  + 'px';
	document.getElementById('tocAndLegend').style.height = divHeight  + 'px';
	document.getElementById('legend').style.height = (divHeight-30)  + 'px';
	document.getElementById('toc').style.height = (divHeight-30)  + 'px';
}

/**
 * Finds absolute vertical position of an element
 * @param obj
 * @return
 */
function findPosY(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
        while(1) {
          curtop += obj.offsetTop;
          if (!obj.offsetParent) break;
          obj = obj.offsetParent;
        } 
    } else if(obj.y) 
        curtop += obj.y;
    return curtop;
}

/**
 * Sets the style of the specified buttons
 * @param buttons
 * @param act
 * @return
 */
function styleButtons(buttons, act) {
    for (btn in buttons) {
    	document.getElementById(buttons[btn]).disabled = (act == "Disabled");
    	document.getElementById(buttons[btn]).className = "toolbar " + buttons[btn] + act;
	}
}

/**
 * Disables all buttons of toolbar
 */
function disableToolbar() {
	var buttons = document.getElementById("toolbarForm").getElementsByTagName("input");
	if (svBtnState.length==0) {
	    for (btn in buttons) {
	    	svBtnState[btn] = (buttons[btn].disabled ? "0" : "1");
	    	buttons[btn].disabled = true;
		}
	}
}

/**
 * Enables the buttons of the toolbar that were enabled before calling disableToolbar
 */
function enableToolbar() {
	var buttons = document.getElementById("toolbarForm").getElementsByTagName("input");
	if (svBtnState.length > 0) {
	    for (btn in buttons) {
	    	buttons[btn].disabled = (svBtnState[btn] == "0");
		}
	    svBtnState=new Array();
	}
}

/**
 * Activates a pushed button and deactivates the previous one
 * @param btnToActivate
 * @return
 */
function activateButton(btnToActivate) {
    var reactiveButtons = new Array();
	if (btnToActivate) {
		reactiveButtons[0] = btnToActivate;
		styleButtons(reactiveButtons,"Active");
	}
	if (activeBtn) {
	    reactiveButtons[0] = activeBtn;
	    styleButtons(reactiveButtons,"");
	}
	activeBtn = btnToActivate;
}

/**
 * Depending on the active layer set the feature property on the right value
 * @param layer  the activated layer
 */
function setFeatureProperty(layer) {
	if (layer) {
		i.setLayerName(layer);
		m.onIdentify(handleIdentifiedIds, i.getFeatureProperty());
		l.setLayerName(layer);
		m.onSelect(handleSelectedIds, l.getFeatureProperty());
	}
}

/**
* Identification
*/
function handleIdentifiedIds(ids, activeLayer) {
	if(i && ids) {
		disableToolbar();
		i.setLayerName(activeLayer);
		i.identify(ids);
		enableToolbar();
	}
}

/**
* Selection.
*/
function handleSelectedIds(ids, activeLayer) {
	if(l) {
		// no disabling/enabling of toolbar, because the orderbutton
		// might have been enabled in between
		l.setLayerName(activeLayer);
		l.setIds(ids);
		var btn = l.getOrderButton();
    	var saveSelectBtn = document.getElementById("saveSelectionButton");
		if (btn.disabled) {
			btn.className = "toolbar " + btn.id + "Disabled";
			saveSelectBtn.disabled = true;
			saveSelectBtn.className = "toolbar " + saveSelectBtn.id + "Disabled";
		}else {
			btn.className = "toolbar " + btn.id;
			saveSelectBtn.disabled = false;
			saveSelectBtn.className = "toolbar " + saveSelectBtn.id;
		}
	}		
}
function orderIds() {
	disableToolbar();
	l.order();
	enableToolbar();
}

/**
* CrossSection.
*/
function addCrossSectionPoint(point, layer) {
	if(point) {
		c.setLayerName(layer);
		c.addCoord(point);
	}			
}
function csDrawCrossSection() {
	disableToolbar();
	c.drawCrossSection(m.getActivationWarning());
	enableToolbar();
}

/**
* CrossSection or Selection
*/
function pointsRemoveLast() {
	disableToolbar();
	m.polyLineRemoveLast();

	c.removeLastCoord();
	enableToolbar();
}
function pointsRemoveAll() {
	disableToolbar();
	m.polyLineRemoveAll();

	c.removeAllCoords();
	enableToolbar();
}

function setActivationWarning(text) {
	m.setActivationWarning(text);
}

function setObjectSelectionWarning(text) {
	m.setObjectSelectionWarning(text);
}

/**Gets a parameter from the url*/
function getUrlParameter(name) {
	if (name) {
		name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
		var regexS = "[\\?&]" + name + "=([^&#]*)";
		var regex = new RegExp(regexS);
		var results = regex.exec(window.location.href);
		if (results == null)
			return "";
		else
			//return results[1];
			return HttpEncoding.decode(results[1]);
	}
	return null;
}

