/**
 * Generella funktioner
 */

/**
 Lägger på inskickad featurecollection på inskickat kartobjekt
 Argument:
 mapobj: (object) OpenLayers Map-objekt som symbolerna ska ritas ut på
 geocollection: (object) FeatureCollection, Symbolvärden, GeoJSON formaterad för OpenLayers
 display_pointname: (boolean) Om punktnamn ska visas
 display_weathersymb: (boolean) Om vädersymbolen ska visas
 display_wind: (boolean) Om vindtexten ska visas
 display_temp: (boolean) Om Temperaturen ska visas

 Index: 0 = platsnamn, 1 = vädersymbol, 2 = vindtext, 3 = temperaturtext
 **/
function addData(mapobj, geocollecion, symbolFolder, display_pointname, display_weathersymb, display_wind, display_temp, centerpoint, allClickable){
	var returnLayerArr = Array();
	var vector_layer;
	var location_layer;
	var geojson_format = new OpenLayers.Format.GeoJSON();
	var styleMap = new OpenLayers.StyleMap(OpenLayers.Util.applyDefaults(
			{fillColor: "#2A7ECB", fillOpacity: 1, strokeColor: "white", pointRadius: 5
			},
			OpenLayers.Feature.Vector.style["default"]));

	vector_layer = new OpenLayers.Layer.Vector("points",{styleMap: styleMap});
	mapobj.addLayer(vector_layer);
	returnLayerArr.push(vector_layer);

	location_layer = new OpenLayers.Layer.Vector("locations",{styleMap: styleMap});
	mapobj.addLayer(location_layer);
	returnLayerArr.push(location_layer);

	// Skaper ett lager som symbolerna skall placeras i.
	var markers = new OpenLayers.Layer.Markers("weather_symbols");
	mapobj.addLayer(markers);
	returnLayerArr.push(markers);

	//Tilldelar css-klasser utifrån om detta är en cetrumpunkt eller inte.
	if ((allClickable != "undefined" && allClickable) && (centerpoint != "undefined" && centerpoint)) {
		var placename_css = 'placenameBig';
		var weathersymb_css = "wsymbcontent";
		var wind_css = "windcontent";
		var temp_css = 'tempcontentBig';
		var imagepath = mapobj.rootdir +"/images/smhi_std_15/90x62/" + symbolFolder + "/";
		//Om markeringspunkt vid namnet ska visas
		var showpoint = true;
		var imgWidth = 90;
		var imgHeight = 62;
		var isClickable = true; //false;
    }
    else if (centerpoint != "undefined" && centerpoint) {
		var placename_css = 'placenameBig';
		var weathersymb_css = "wsymbcontent";
		var wind_css = "windcontent";
		var temp_css = 'tempcontentBig';
		var imagepath = mapobj.rootdir +"/images/smhi_std_15/90x62/" + symbolFolder + "/";
		//Om markeringspunkt vid namnet ska visas
		var showpoint = true;
		var imgWidth = 90;
		var imgHeight = 62;
		var isClickable = false;
	}
	else {
		var placename_css = "placename";
		var link_placename_css = 'linkPlacename';
		var weathersymb_css = "wsymbcontent";
		var wind_css = "windcontent";
		var temp_css = "tempcontent";
		var imagepath = mapobj.rootdir + "/images/smhi_std_15/40x28/" + symbolFolder + "/";
		//Om markeringspunkt vid namnet ska visas
		var showpoint = false;		
		var imgWidth = 40;
		var imgHeight = 28;
		var isClickable = true;
	}

	var block_y_position = 0;
	for(var i=0;i<geocollecion.geometries.length;i++){    	    	
		// Code to choose different styling for "kustväder"
		var coast = false;
		var windsymboltype = "text"
		if (geocollecion.geometries[i].modeltype == "coast"){
			coast = true;
			windsymboltype = "arrow"
			display_wind = true;
			display_temp = false;   	
		}
		else {

			coast = false;
			display_wind = false;
			display_temp = true;    		
		}

		var geoobj = geocollecion.geometries[i];
		var position = new OpenLayers.LonLat(geoobj.coordinates[0],geoobj.coordinates[1]);

		block_y_position = 0;

		if(showpoint){
			location_layer.addFeatures(geojson_format.read(geoobj));
			block_y_position = block_y_position + 5;
		}else{
			block_y_position = block_y_position - 7;
		}

		if(display_weathersymb){
			var size = new OpenLayers.Size(imgWidth, imgHeight);
			var offset = new OpenLayers.Pixel(-size.w / 2, -size.h -5);
			if (geoobj.weathersymbol != "null") {                    
				icon = new OpenLayers.Icon(imagepath + geoobj.weathersymbol + '.png', size, offset);
				marker = new OpenLayers.Marker(position, icon);
				markers.addMarker(marker);
			}

		}

		if(display_pointname){
			var noOfChars = geoobj.pointname.length;                      
			var temporaryposition = getNewPosition(mapobj, position, 0, 0);
            if ((location_layer.map.productURL != "" && isClickable && allClickable)) {
                var nameobject = getTextObject(location_layer, temporaryposition, "<div class='"+placename_css+"'><a href='" + location_layer.map.productURL + "' target=_top>"+geoobj.pointname+"</a></div>");
            } else if(location_layer.map.productURL != "" && isClickable){
				var nameobject = getTextObject(location_layer, temporaryposition, "<div class='"+placename_css+"'><a href='" + location_layer.map.productURL + "&geonameid_map=" + geoobj.geonameid+"'>"+geoobj.pointname+"</a></div>");
			} else{
				var nameobject = getTextObject(location_layer, temporaryposition, "<div class='"+placename_css+"'>"+geoobj.pointname+"</div>");
			}
			location_layer.map.addPopup(nameobject);      
			//Justerar den tillfälliga placeringen av texten så att den blir centrerad och placerad rätt i höjdled                   
			var newleft_x = (nameobject.size.w/2) - nameobject.size.w;
			var newlonlat = getNewPosition(location_layer.map, position, newleft_x, block_y_position);
			var newpixelpos = location_layer.map.getPixelFromLonLat(newlonlat);
			nameobject.autoSize = false;
			nameobject.setSize(new OpenLayers.Size(nameobject.size.w+2,nameobject.size.h));
			
			nameobject.moveTo(newpixelpos); 

			block_y_position = block_y_position + nameobject.size.h-3;
		}

		if(display_temp){
			if (geoobj.temp != "null") {
				var tempobject = getTextObject(vector_layer, getNewPosition(mapobj,position, 0, 0), "<span class='"+temp_css+"'>"+ parseInt(geoobj.temp)+"&#186</span>");
				vector_layer.map.addPopup(tempobject);
				//Justerar den tillfälliga placeringen av texten så att den blir centrerad
				var newleft_x = (tempobject.size.w/2) - tempobject.size.w;
				var newlonlat = getNewPosition(vector_layer.map, position, newleft_x, block_y_position);
				var newpixelpos = vector_layer.map.getPixelFromLonLat(newlonlat);
				tempobject.moveTo(newpixelpos);
				block_y_position = block_y_position + tempobject.size.h-2;
			}
		}

		if(display_wind || centerpoint){
			var windsymb = degrees2windsymbol(geoobj.winddir);
			if(windsymb != false){                
				if(windsymboltype == "arrow"){
					var wtext = "<img src='"+mapobj.rootdir + "/images/smhi_map_wind_icons/"+windsymb+".gif' align='left' /> "+Math.round(geoobj.windspeed)+" m/s";
				} else {
					var wtext = windphrases[windsymb]+" "+Math.round(geoobj.windspeed)+" m/s";
				}
				var windobject = getTextObject(vector_layer, getNewPosition(mapobj, position, 0, 0), "<div class='"+wind_css+"'>"+wtext+"</div>");
				vector_layer.map.addPopup(windobject);
				//Justerar den tillfälliga placeringen av texten så att den blir centrerad
				var newleft_x = (windobject.size.w/2) - windobject.size.w;
				var newlonlat = getNewPosition(vector_layer.map, position, newleft_x, block_y_position);
				var newpixelpos = vector_layer.map.getPixelFromLonLat(newlonlat);
				windobject.moveTo(newpixelpos);

				block_y_position = block_y_position + windobject.size.h;
			}
		}



	}
	return returnLayerArr;
}

/**
Beräknar fram en ny position utifrån inskickad x/y i pixlar. Returnerar ett OpenLayers.LonLat-objekt

 Argument:
 position: {object} OpenLayers.LonLat Ursprungspositionen som beräkningen sker ifrån
 pixel_x: {integer}. Antalet pixlar i x-led som förflyttningen till den nya positionen ska beräknas från
 pixel_y: {integer}. Antalet pixlar i y-led som förflyttningen till den nya positionen ska beräknas från
 **/
function getNewPosition(mapobj, position, pixel_x, pixel_y) {
	var originalpixel = mapobj.getPixelFromLonLat(position);
	var new_x = originalpixel.x;
	var new_y = originalpixel.y;

	new_x = new_x + pixel_x;
	new_y = new_y + pixel_y;

	return mapobj.getLonLatFromPixel(new OpenLayers.Pixel(new_x,new_y));
}

/*
Skapar ett "textobjekt" och returnerar det

 Argument:
 position: {OpenLayers.LonLat} Objekt med positionen för texten
 htmlcontent: {string} Innehållet i texten (html)
 */
function getTextObject(vector_layer, position,htmlcontent){
	var newpopup = new OpenLayers.Popup(null, position, new OpenLayers.Size(1,1),htmlcontent,false);
	newpopup.autoSize = true;
	newpopup.setBackgroundColor("transparent");
	newpopup.setOpacity(1.0);

	return newpopup ;
}



/*
 * 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 createLatestUpdateText(parentDivId, updateTextDivId, msg, posLeft, posRight, posTop, posBottom){
/*
	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(updateTextDivId);
    var parentDiv = document.getElementById(parentDivId);

        if (messageDiv != null) {
            parentDiv.removeChild(messageDiv);
        }

    var loadDiv = document.getElementById('loadDiv');

	//The loading message does not exists, create one

		var parentDivHeight = parentDiv.style.height;
		var parentDivWidth = parentDiv.style.width;
		parentDivHeight = parentDivHeight.substring(0, parentDivHeight.indexOf('px'));
		parentDivWidth = parentDivWidth.substring(0, parentDivWidth.indexOf('px'));

		var messageDiv = document.createElement('div');
		messageDiv.id = updateTextDivId;
		messageDiv.style.position = 'relative';
		var messageWidth = parentDivWidth;//200;
		var messageHeight = parentDivHeight;//140;
		messageDiv.style.width = messageWidth-10 +'px';
		messageDiv.style.height = '25px';
        messageDiv.style.border = '2px';
		messageDiv.style.zIndex = 2500;
        messageDiv.style.cssFloat = 'left'; // FF, and the good guys...
        messageDiv.style.styleFloat = 'left'; // IE hack
        messageDiv.style.marginTop = "-25px";
        messageDiv.style.marginLeft = "5px";
		messageDiv.style.left = '0px';//(parentDivWidth/2)-(messageWidth/2) + 'px';
        messageDiv.style.textAlign = 'left';
        messageDiv.style.verticalAlign = 'text-bottom';
        messageDiv.style.display = jQuery("#viewUpdateText").attr("title");

        msg = msg.replace(/\{/g, "<");
        msg = msg.replace(/\}/g, ">");

        var innerDiv = document.createElement('span');
		var transparency = 8; //(0-10)0=genomskinlig, 10 = full faerg
        innerDiv.style.background = '#FFF';
		innerDiv.style.opacity = transparency/10; //FF, Opera m.m.
		innerDiv.style.filter = 'alpha(opacity=' + transparency*10 + ')'; //IE
        innerDiv.style.padding = '2px';
        innerDiv.style.zIndex = 2500;
        innerDiv.style.border = '2px';
        innerDiv.innerHTML = msg ;

		//appends the created loading div to the parent div (the map div)    
        parentDiv.appendChild(messageDiv);
        messageDiv.appendChild(innerDiv);
}

    // converts from yyyy-mm-dd hh:mm:ss --> (Javascript format, yyyy, MM-1, dd, HH, mm, ss)
    function convertDateToJavascriptDate(fulldate) {
        var datepart = fulldate.split(" ");
        var yearMonthDay = datepart[0].split("-");
        var hourMinSec = datepart[1].split(":");
        var year =  yearMonthDay[0];
        var month = yearMonthDay[1];
        var day = yearMonthDay[2];
        var hour = hourMinSec[0];
        var min = hourMinSec[1];
        var sec = hourMinSec[2];

        return new Date(year, month - 1, day, hour, min, sec, 0);
    }



