var rt90map;
var centerpointLayer;
var surroundingpointsLayer;
var PMPlayerArray = new Array();
var loadingimagepath = null;
function addCoastData(parentDiv, geoAreaId, datetime, symbolBaseUrl, symbolTableUrl, symbolFolder, shouldClearMap) {
    //Kollar s� att bakgrundskartan �r laddad
    if (typeof olMap != "undefined") {
    	loadingimagepath = olMap.rootdir;
    	__createLoadingMessage(parentDiv, 'loadDiv');
        // H�mtar centrumpunkten fr�n kartan
        var centerPoint = olMap.getCenter();
        var centerpoint_x = centerPoint.lon;
        var centerpoint_y = centerPoint.lat;
        var zoomlevel = olMap.getZoom();
        //Nuvarande vy:s boundingbox
        //H�mtar prognos/ortdata
        var currentBBOXarray = olMap.getExtent().toArray(); //left, bottom, right, top
        var featurecollection;
        var epsgCode = olMap.getProjection();
        var cleanEPSGcode = epsgCode.substring(epsgCode.indexOf(":")+1,epsgCode.length);
        var inProjection = cleanEPSGcode;
        var outProjection = cleanEPSGcode;

        // Fetch data and populate UI
        LocationManager.getCoastWeather(geoAreaId, currentBBOXarray[2], currentBBOXarray[1], currentBBOXarray[0],
                currentBBOXarray[3], datetime, zoomlevel, inProjection, outProjection, function(res)
        {
            featurecollection = eval('(' + res + ')');

            if (typeof olMap.popups != "undefined") {
                var popuparray = new Array();
                for (var i = 0; i < olMap.popups.length; i++) {
                    popuparray.push(olMap.popups[i]);
                }
                for (var i = 0; i < popuparray.length; i++) {
                    if (typeof popuparray[i] != "undefined") {
                        if (i > 0)
                        	olMap.removePopup(popuparray[i]);
                        else if (shouldClearMap)
                        	olMap.removePopup(popuparray[i]);
                    }
                }

            }

            // tar bort lagren som inneh�ller prognosdata
            // if (shouldClearMap)
            clearMap(shouldClearMap);


            //var dataurl =  "http://produktportal-utv.smhi.se/produktportal-1.0/geoWeatherSearch?topx="+currentBBOXarray[2]+"&topy="+currentBBOXarray[3]+"&downx="+currentBBOXarray[0]+"&downy="+currentBBOXarray[1]+"&outprojection=3021&inprojection=3021&date="+datetime;
            try {
                //var featurecollection = eval('(' + res + ')');
                if (featurecollection.geometries.length == 0) {
                    throw 'Forecast data is missing!';
                }
                var centerpointFeaturecollection;
                //Letar upp centrumpunkten i de h�mtade geografierna
               /* for (var c = 0; c < featurecollection.geometries.length; c++) {
                    var geoobj = featurecollection.geometries[c];
                    /**
                     Om kartans centrumpunkt finns representerad i det h�mtade datat
                     s� bryts denna ut ur dataarrayen och l�ggs in i en egen array.
                     Detta f�r att "huvudorten" ska kunna behandlas separat n�r det g�ller
                     informationsm�ngd och stil
                     **/
                    //if (geoobj.coordinates[0] == centerpoint_x && geoobj.coordinates[1] == centerpoint_y) {
                  /*  if (geoobj.geoAreaId == geoAreaId) {
                        centerpointFeaturecollection = {
                            'type': 'GeometryCollection',
                            'geometries': [geoobj]
                        };
                        featurecollection.geometries.splice(c, 1);
                        break;
                    }
                }*/
                clearMapFromSymbols();
                addLayersToArray(addData(olMap, featurecollection, symbolBaseUrl, symbolTableUrl, symbolFolder, true, true, true, true, false, false));
                if (typeof centerpointFeaturecollection != "undefined") {
                    //L�gger p� ev. hittad centrumpunkt. addData() i filen commons.js
                    //centerpointLayer = addData(rt90map, centerpointFeaturecollection, true, true, true, true, new Array('placenameBig shadow','','','tempcontentBig shadow'));                    
                    clearMapFromLocations();
                    addLayersToArray(addData(olMap, centerpointFeaturecollection, symbolBaseUrl, symbolTableUrl, symbolFolder, true, true, true, true, true, false));
                }
            }
            catch(errormsg) {
                alert('ERROR on page!\n' + errormsg);
            }
           __closeLoadingMessage('loadDiv');
        });

    }
}

function addPMP(parentDiv, datetime, geonameid, symbolBaseUrl, symbolTableUrl, symbolFolder, shouldClearMap, lang, allClickable) {
    //Kollar s� att bakgrundskartan �r laddad (skapas i mapbuilder.js)
    if (typeof olMap != "undefined") {
    	loadingimagepath = olMap.rootdir;
    	__createLoadingMessage(parentDiv, 'loadDiv');
    	
        // H�mtar centrumpunkten fr�n kartan
        var centerPoint = olMap.getCenter();
        var zoomlevel = olMap.getZoom()
        var centerpoint_x = centerPoint.lon;
        var centerpoint_y = centerPoint.lat;
                        
        //Nuvarande vy:s boundingbox
        //H�mtar prognos/ortdata
        var currentBBOXarray = olMap.getExtent().toArray(); //left, bottom, right, top
        var featurecollection;

        // Fetch data and populate UI
        var epsgCode = olMap.getProjection();
        var cleanEPSGcode = epsgCode.substring(epsgCode.indexOf(":")+1,epsgCode.length);              
        if (geonameid != "") {
            LocationManager.geoWeatherSearch(currentBBOXarray[2], currentBBOXarray[1], currentBBOXarray[0], currentBBOXarray[3],
                    cleanEPSGcode, cleanEPSGcode, datetime, geonameid, zoomlevel, lang, function(res)
            {
                featurecollection = eval('(' + res + ')');

                if (typeof olMap.popups != "undefined") {
                    var popuparray = new Array();
                    for (var i = 0; i < olMap.popups.length; i++) {
                        popuparray.push(olMap.popups[i]);
                    }
                    for (var i = 0; i < popuparray.length; i++) {
                        if (typeof popuparray[i] != "undefined") {
                            if (i > 0)
                                olMap.removePopup(popuparray[i]);
                            else if (shouldClearMap)
                                olMap.removePopup(popuparray[i]);
                        }
                    }

                }

                // tar bort lagren som inneh�ller prognosdata
                // if (shouldClearMap)
                clearMap(shouldClearMap);


                //var dataurl =  "http://produktportal-utv.smhi.se/produktportal-1.0/geoWeatherSearch?topx="+currentBBOXarray[2]+"&topy="+currentBBOXarray[3]+"&downx="+currentBBOXarray[0]+"&downy="+currentBBOXarray[1]+"&outprojection=3021&inprojection=3021&date="+datetime;
                try {
                    //var featurecollection = eval('(' + res + ')');
                    if (featurecollection.geometries.length == 0) {
                        throw 'Forecast data is missing!';
                    }
                    var centerpointFeaturecollection;
                    //Letar upp centrumpunkten i de h�mtade geografierna
                    for (var c = 0; c < featurecollection.geometries.length; c++) {
                        var geoobj = featurecollection.geometries[c];
                        /**
                         Om kartans centrumpunkt finns representerad i det h�mtade datat
                         s� bryts denna ut ur dataarrayen och l�ggs in i en egen array.
                         Detta f�r att "huvudorten" ska kunna behandlas separat n�r det g�ller
                         informationsm�ngd och stil
                         **/
                        //if (geoobj.coordinates[0] == centerpoint_x && geoobj.coordinates[1] == centerpoint_y) {
                        if (geoobj.geonameid == geonameid) {
                            centerpointFeaturecollection = {
                                'type': 'GeometryCollection',
                                'geometries': [geoobj]
                            };
                            featurecollection.geometries.splice(c, 1);
                            break;
                        }
                    }
                    clearMapFromSymbols();
                    addLayersToArray(addData(olMap, featurecollection, symbolBaseUrl, symbolTableUrl, symbolFolder, true, true, false, true, false, allClickable));
                    if (typeof centerpointFeaturecollection != "undefined") {
                        //L�gger p� ev. hittad centrumpunkt. addData() i filen commons.js
                        //centerpointLayer = addData(rt90map, centerpointFeaturecollection, true, true, true, true, new Array('placenameBig shadow','','','tempcontentBig shadow'));
                        clearMapFromLocations();
                        addLayersToArray(addData(olMap, centerpointFeaturecollection, symbolBaseUrl, symbolTableUrl, symbolFolder, true, true, true, true, true, allClickable));
                    }
                }
                catch(errormsg) {
                    __closeLoadingMessage('loadDiv');
                    alert('ERROR on page!\n' + errormsg);
                }
                __closeLoadingMessage('loadDiv');
            });
        } else {
                LocationManager.geoWeatherSearchNoCenter(currentBBOXarray[2], currentBBOXarray[1], currentBBOXarray[0], currentBBOXarray[3],
                    cleanEPSGcode, cleanEPSGcode, datetime, zoomlevel, lang, function(res)
            {
                featurecollection = eval('(' + res + ')');

                if (typeof olMap.popups != "undefined") {
                    var popuparray = new Array();
                    for (var i = 0; i < olMap.popups.length; i++) {
                        popuparray.push(olMap.popups[i]);
                    }
                    for (var i = 0; i < popuparray.length; i++) {
                        if (typeof popuparray[i] != "undefined") {
                            if (i > 0)
                                olMap.removePopup(popuparray[i]);
                            else if (shouldClearMap)
                                olMap.removePopup(popuparray[i]);
                        }
                    }

                }

                // tar bort lagren som inneh�ller prognosdata
                // if (shouldClearMap)
                clearMap(shouldClearMap);


                //var dataurl =  "http://produktportal-utv.smhi.se/produktportal-1.0/geoWeatherSearch?topx="+currentBBOXarray[2]+"&topy="+currentBBOXarray[3]+"&downx="+currentBBOXarray[0]+"&downy="+currentBBOXarray[1]+"&outprojection=3021&inprojection=3021&date="+datetime;
                try {
                    //var featurecollection = eval('(' + res + ')');
                    if (featurecollection.geometries.length == 0) {
                        throw 'Forecast data is missing!';
                    }
                    var centerpointFeaturecollection;
                    //Letar upp centrumpunkten i de h�mtade geografierna
                    for (var c = 0; c < featurecollection.geometries.length; c++) {
                        var geoobj = featurecollection.geometries[c];                        
                    }
                    clearMapFromSymbols();
                    addLayersToArray(addData(olMap, featurecollection, symbolBaseUrl, symbolTableUrl, symbolFolder, true, true, false, true, false, allClickable));
                    if (typeof centerpointFeaturecollection != "undefined") {
                        //L�gger p� ev. hittad centrumpunkt. addData() i filen commons.js
                        //centerpointLayer = addData(rt90map, centerpointFeaturecollection, true, true, true, true, new Array('placenameBig shadow','','','tempcontentBig shadow'));
                        clearMapFromLocations();
                        addLayersToArray(addData(olMap, centerpointFeaturecollection, symbolBaseUrl, symbolTableUrl, symbolFolder, true, true, true, true, true, allClickable));
                    }
                }
                catch(errormsg) {
                    __closeLoadingMessage('loadDiv');
                    alert('ERROR on page!\n' + errormsg);
                }
                __closeLoadingMessage('loadDiv');
            });
        }
    }
}

/*
 * Adds specified places to the map, geonameid:s is an array of the placesids to show on the map
 */
function addPMPspecifiedPlaces(parentDiv, datetime, geonameids, symbolBaseUrl, symbolTableUrl, symbolFolder, shouldClearMap, lang, allClickable) {
    //Kollar s� att bakgrundskartan �r laddad (skapas i mapbuilder.js)
    if (typeof olMap != "undefined") {
    	loadingimagepath = olMap.rootdir;
    	__createLoadingMessage(parentDiv, 'loadDiv');
    	
        // H�mtar centrumpunkten fr�n kartan
        var centerPoint = olMap.getCenter();
        var zoomlevel = 100;
        var centerpoint_x = centerPoint.lon;
        var centerpoint_y = centerPoint.lat;
                        
        //Nuvarande vy:s boundingbox
        //H�mtar prognos/ortdata
        var currentBBOXarray = olMap.getExtent().toArray(); //left, bottom, right, top
        var featurecollection;

        // Fetch data and populate UI
        var epsgCode = olMap.getProjection();
        var cleanEPSGcode = epsgCode.substring(epsgCode.indexOf(":")+1,epsgCode.length);              
        if (geonameids.length > 0) {

                LocationManager.geoWeatherSpecifiedPlaces(cleanEPSGcode, datetime, geonameids, zoomlevel, lang, function(res)
            {
                featurecollection = eval('(' + res + ')');

                if (typeof olMap.popups != "undefined") {
                    var popuparray = new Array();
                    for (var i = 0; i < olMap.popups.length; i++) {
                        popuparray.push(olMap.popups[i]);
                    }
                    for (var i = 0; i < popuparray.length; i++) {
                        if (typeof popuparray[i] != "undefined") {
                            if (i > 0)
                                olMap.removePopup(popuparray[i]);
                            else if (shouldClearMap)
                                olMap.removePopup(popuparray[i]);
                        }
                    }

                }

                // tar bort lagren som inneh�ller prognosdata
                // if (shouldClearMap)
                clearMap(shouldClearMap);


                //var dataurl =  "http://produktportal-utv.smhi.se/produktportal-1.0/geoWeatherSearch?topx="+currentBBOXarray[2]+"&topy="+currentBBOXarray[3]+"&downx="+currentBBOXarray[0]+"&downy="+currentBBOXarray[1]+"&outprojection=3021&inprojection=3021&date="+datetime;
                try {
                    //var featurecollection = eval('(' + res + ')');
                    if (featurecollection.geometries.length == 0) {
                        throw 'Forecast data is missing!';
                    }
                    var centerpointFeaturecollection;
                    //Letar upp centrumpunkten i de h�mtade geografierna
                    for (var c = 0; c < featurecollection.geometries.length; c++) {
                        var geoobj = featurecollection.geometries[c];                        
                    }
                    clearMapFromSymbols();
                    addLayersToArray(addData(olMap, featurecollection, symbolBaseUrl, symbolTableUrl, symbolFolder, true, true, false, true, false, allClickable));
                    if (typeof centerpointFeaturecollection != "undefined") {
                        //L�gger p� ev. hittad centrumpunkt. addData() i filen commons.js
                        //centerpointLayer = addData(rt90map, centerpointFeaturecollection, true, true, true, true, new Array('placenameBig shadow','','','tempcontentBig shadow'));
                        clearMapFromLocations();
                        addLayersToArray(addData(olMap, centerpointFeaturecollection, symbolBaseUrl, symbolTableUrl, symbolFolder, true, true, true, true, true, allClickable));
                    }
                }
                catch(errormsg) {
                    __closeLoadingMessage('loadDiv');
                    alert('ERROR on page!\n' + errormsg);
                }
                __closeLoadingMessage('loadDiv');
            });
        }
    }
}


function clearMap(shouldClear) {
    if (PMPlayerArray.length > 0) {
        for (var i = 0; i < PMPlayerArray.length; i++) {
            if (typeof PMPlayerArray[i] != "undefined") {
                if (shouldClear) {
                	olMap.removeLayer(PMPlayerArray[i]);
                }
                else if (PMPlayerArray[i].name != "locations") {
                	olMap.removeLayer(PMPlayerArray[i]);
                }
            }
        }
        PMPlayerArray = Array();
    }
}

function clearMapFromSymbols() {
    if (PMPlayerArray.length > 0) {
        for (var i = 0; i < PMPlayerArray.length; i++) {
            if (typeof PMPlayerArray[i] != "undefined" && PMPlayerArray[i].name != "points") {
            	olMap.removeLayer(PMPlayerArray[i]);
            }
        }
        PMPlayerArray = Array();
    }
}

function clearMapFromLocations() {
    if (typeof olMap.popups != "undefined") {
        var popuparray = new Array();
        for (var i = 0; i < olMap.popups.length; i++) {
            popuparray.push(olMap.popups[i]);
        }
        /*for (var i = 0; i < popuparray.length; i++) {
         if (typeof popuparray[i] != "undefined") {
         alert("tar bort ort");
         if (i > 0)
        	 olMap.removePopup(popuparray[i]);
         else
        	 olMap.removePopup(popuparray[i]);
         }
         } */

    }
}

function addLayersToArray(inArray) {
    if (PMPlayerArray.length > 0) {
        PMPlayerArray = PMPlayerArray.concat(inArray);
    }
    else {
        clearMap();
        PMPlayerArray = inArray;
    }

}

var timer = null;
//The amount of delay (in milliseconds) until the loading message should be displayed
var loaderMessageDelay = 500;

/*
 * Creates the loading message-div (or just "un-hides" it if the div already exists)
 * 
 * Arguments:
 * parentDivId: The id of the div that the loading message should appear in (eg. the id of the map-div)
 * loadingDivId: the id for the loading message div, could be anything.
 */
function __createLoadingMessage(parentDivId, loadingDivId){
    var pEventObject = new ppEventObject("hideUpdateText");
    pEventObject.setParameter("caller", "data_pmp_layer.js");
	jQuery("#defaultDispatcher").triggerHandler('changestate',pEventObject);

	if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){ 
		var ieversion=new Number(RegExp.$1) // capture x.x portion and store as a number
		if(ieversion < 7 ){return;}
	}
	 
	var messageDiv = document.getElementById(loadingDivId);
	//The loading message does not exists, create one
	if(messageDiv == null){
		var parentDiv = document.getElementById(parentDivId);
		var parentDivHeight = parentDiv.style.height;
		var parentDivWidth = parentDiv.style.width;
		parentDivHeight = parentDivHeight.substring(0, parentDivHeight.indexOf('px'));
		parentDivWidth = parentDivWidth.substring(0, parentDivWidth.indexOf('px'));
		
		/*
		 * messageDiv: the frame around the real loading image
		 */
		var messageDiv = document.createElement('div');
		messageDiv.id = loadingDivId;
		messageDiv.style.display = 'none';
		messageDiv.style.position = 'relative';
		var messageWidth = parentDivWidth;//200;
		var messageHeight = parentDivHeight;//140;		
		messageDiv.style.width = messageWidth +'px';
		messageDiv.style.height = messageHeight + 'px';
		messageDiv.style.zIndex = 1000;
		messageDiv.style.background = '#FFFFFF';
		var transparency = 8; //(0-10)0=genomskinlig, 10 = full faerg
		messageDiv.style.opacity = transparency/10; //FF, Opera m.m.
		messageDiv.style.filter = 'alpha(opacity=' + transparency*10 + ')'; //IE

		//The actual loading image
		//var imgTag = document.createElement('img');		
		var imageURL = loadingimagepath + "/images/loading.gif";
		
		messageDiv.style.backgroundImage = "url(" + imageURL + ")";
		messageDiv.style.backgroundPosition = "center center";
		messageDiv.style.backgroundRepeat = "no-repeat";
		
		messageDiv.style.top = parentDivHeight - (parentDivHeight*2)+'px';//((parentDivHeight/2)-parentDivHeight)-(messageHeight/2) + 'px';
		messageDiv.style.left = '0px';//(parentDivWidth/2)-(messageWidth/2) + 'px';
		
		//appends the created loading div to the parent div (the map div)
		parentDiv.appendChild(messageDiv);

   		//Puts the display of the loading message "on hold" for X milliseconds, this is to avoid a flickering loading image
		timer = setTimeout("document.getElementById('"+messageDiv.id+"').style.display = 'block';", loaderMessageDelay);
				
	}
	//The loading message already exists, just show it.
	else{
		//Puts the display of the loading message "on hold" for X milliseconds, this is to avoid a flickering loading image
		timer = setTimeout("document.getElementById('"+messageDiv.id+"').style.display = 'block';", loaderMessageDelay);
	}
		
}

/*
 * Hides the loading message
 * Arguments:
 * loadingDivId: the id of the loading message (same id used to create it)
 */
function __closeLoadingMessage(loadingDivId){
        var pEventObject = new ppEventObject("viewUpdateText");
       	pEventObject.setParameter("caller", "data_pmp_layer.js");
	  	jQuery("#defaultDispatcher").triggerHandler('changestate',pEventObject);

	if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){ 
			var ieversion=new Number(RegExp.$1) // capture x.x portion and store as a number
			if(ieversion < 7 ){return;}
	}
	if(timer != null){
		/*
		 * If the call to this function is made before the message is visible (the delay in __createLoadingMessage)
		 * then clear the timeout so that the message stays hidden.
		 */ 
		clearTimeout(timer);
	}
	var messageDiv = document.getElementById(loadingDivId);

	if(messageDiv != null){		
		//Hides the loading message
		messageDiv.style.display = 'none';
	}
	/*
	 * Backup solution if something as gone wrong so that the loading div never closes
	 * Waits for 0.25 seconds and then tries to hide the loading div again.
	 */
	 var backuptimer = setTimeout("document.getElementById('"+loadingDivId+"').style.display = 'none';", 250);
}
