var hasPrintMode = false;
//Define native Herborvi projection used for transformation
var proj = new OpenLayers.Projection("EPSG:32632");
var rproj = new OpenLayers.Projection("EPSG:4326");
var map;
var routeFeature;
var newRoute = false;
var marker1;
var marker2;
var c1;
var c2;
		
function Map()
{
    //Get the coordinate for routing etc.
    c2 = new OpenLayers.LonLat(parseInt(jQuery('#LinkRoadx').val()),parseInt(jQuery('#LinkRoady').val()));
    c2.transform(proj, rproj);
    
    //set height and width of mapContainer
    $('#mapContainer').height($('#LinkMapHeight').val()+'px');
    $('#mapContainer').width($('#LinkMapWidth').val()+'px');

    //read and set zoomlevel from querystring:
    var zl = Shared.Util.GetQs('zl');
    if(0 < parseInt(zl)){
        $('#MapZoomLevel').val(zl);
    }
    
    //read and set location offset from querystring:
    var lo = Shared.Util.GetQs('lo');
    if(lo){
      var loSplit,lox,loy;
      loSplit = lo.split('|');
      lox=loSplit[0];
      loy=loSplit[1];
      $('#linkx').val(lox);
      $('#linky').val(loy);
    }
    
    var ai = Shared.Util.GetQs('ai');
    if(ai){
        document.title = unescape(ai);
    }
    
    var lnkx = parseFloat($('#linkx').val());
    var lnky = parseFloat($('#linky').val());
    var mvx = parseFloat($('#MapViewCenterX').val());
    var mvy = parseFloat($('#MapViewCenterY').val());
    
  
    // Create instance of Enrio Map API    
    if(jQuery('#HasOblique').val() == "true"){
        map = new Eniro.API.Map('mapContainer', '/Js/Frameworks/EniroMapAPI-1.2.4', Shared.Settings.EniroMapApiExtended);
    }else{
        map = new Eniro.API.Map('mapContainer', '/Js/Frameworks/EniroMapAPI-1.2.4', Shared.Settings.EniroMapApiBasic);
    }

    // Define coordinates
    var poiCenter = new OpenLayers.LonLat(lnkx, lnky);
    var viewCenter = new OpenLayers.LonLat(mvx, mvy);

    // Transform to correct map projection (web mercator)
    poiCenter.transform(proj, map.getProjectionObject());
    viewCenter.transform(proj, map.getProjectionObject());
    
    //Create Marker
    var arPT = jQuery('#DestImgGif').attr('alt').split('|');
    var popupText = "<span class='popupHeader'>" + arPT[0] + "</span>"
    if(1 < arPT.length){ 
        popupText = popupText + "<br /><span class='popupAddress'>" + arPT[1] + "</span>";
        if(2 < arPT.length){ 
        popupText = popupText + "<br /><span class='popupAddress'>" + arPT[2] + "</span>";
        }
    }
    //jQuery('#DestImgGif').attr('alt').replace(', ','<br>').replace(', ','<br>');//$('#LinkRoadName').val() + " " + $('#LinkHouseNumberNumeric').val() + $('#LinkHouseNumberAlpha').val() + ", " + $('#LinkPostalCode').val() + " " + $('#LinkPostalDistrict').val()
    
    var marker_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
    var marker_url = 'http://' + window.location.host + $('#DestImgGif').attr('src');
    marker_style.graphicWidth = $('#DestImgGif').width();
    marker_style.graphicHeight = $('#DestImgGif').height();
    marker_style.graphicOpacity = 1;
    marker_style.externalGraphic = marker_url;
    
    var marker = new Eniro.Feature.PopupFeature(poiCenter, {}, {
      popupContents: function() { return popupText; },
      mouseover: true,
      style: marker_style
    });
    
    
    //get the zoomlevel
    var emapZl = Shared.Util.TransformZlTcToEmap(parseInt($('#MapZoomLevel').val()));
    
    //Add Marker to Map
    map.addFeature(marker);
    
    //Choose center from viewCenter, alternative from poiCenter
    if((mvx + '').length > 0 && (mvy + '').length > 0)
	{
	    map.setCenter(viewCenter,emapZl);
    }else{
        map.setCenter(poiCenter,emapZl);
    }

    //Get the maptype
    if('kvec' === $('#MapType').val()){
        map.setMapType(Eniro.Map.LAYER_MAP);
    }else if('ortho' === $('#MapType').val()){
        map.setMapType(Eniro.Map.LAYER_AERIAL);
    }else if('ovc' === $('#MapType').val()){
        map.setMapType(Eniro.Map.LAYER_HYBRID);
    }else if('oblique' === $('#MapType').val()){
        //map.setMapType(Eniro.Map.LAYER_OBLIQUE);
        map.setMapType(Eniro.Map.LAYER_AERIAL);
    }
    
    //Add themes.
    if($('#HasThemes').val() == "true"){
        addThemesControl(map);
        smc.toggleShowOnMapControl();
    }
 
    //Add Print.
    var printControl = new OpenLayers.Control();
    OpenLayers.Util.extend(printControl, {
        div: 'PrintControlContainer',
        draw: function() {
            $('#PrintControlContainer').append('<img id="printgif" src="/Js/Frameworks/EniroMapAPI-1.2.4/media/print5.png" alt="Print" title="Print">').click(function() {
              window.print();
            });
        }
    });
    //Add printing control to map
    map.addControl(printControl);
    
    //Add Route.
    var routeControl = new OpenLayers.Control();
    OpenLayers.Util.extend(routeControl, {
        div: 'RouteControlContainer',
        draw: function() {
              jQuery('#RouteControlContainer').append('<img id="routegif" src="/Js/Frameworks/EniroMapAPI-1.2.4/media/route5.png" alt="Rute" title="Rute">').click(function() {
              jQuery('#RouteCalcContainer').toggle();
               
              //Disable keyboard scroll
              for( var c in map.controls ){
                 if( map.controls[c].CLASS_NAME == "OpenLayers.Control.KeyboardDefaults" ){
                    if(map.controls[c].active){
                        map.controls[c].deactivate();
                    }else{
                        map.controls[c].activate();
                    }
                 }
              }   
            });
        }
    });
    
    //populate html and functionality into routing div
    populateRouteCalcDiv();
    
    //enable aoutocomplete
    jQuery("#fromaddress").autocomplete(Eniro.AppNode.appUrl("/api/geocode"), {
			dataType: 'jsonp',
			parse: function(data) {
				var rows = new Array();
				if(data.search.geocodingResponse.totalHits > 0){//If Responsedata exists	
				    var _data = data.search.geocodingResponse.locations;
					for(var i=0; i<_data.length; i++){
	                	rows[i] = { data:_data[i], value:(_data[i].roadname + ' ' + _data[i].housenumber + ', ' + _data[i].zip + ' ' + _data[i].postarea), result:(_data[i].roadname + ' ' + _data[i].housenumber + ', ' + _data[i].zip + ' ' + _data[i].postarea) };
					}
		        	return rows;
			 	}else{
		            return [];
		        }
			},
			formatItem: function(row, i, n) {
			    jQuery("#fromaddress").flushCache(); 
		        return row.roadname + ' ' + row.housenumber + ', ' + row.zip + ' ' + row.postarea;
			},
			extraParams: {
				q: '',
				limit: '',
				contentType: "json",
				callbackParameter: "callback",
				country: 'dk',
				hits: 25,
				name: function () { 
				          return jQuery("#fromaddress").val().replace(',','') ; //Little fix to ensure that "sydmarken 44 a," leads to "sydmarken 44a, 2860 Søborg", since the getAPI doesnt accept such addresses with ",". 
				      }
			},
			max: 25,
			minChars: 3
	}); 
    jQuery('#fromaddress').result(function(event, data, formatted) { 
         c1 = new OpenLayers.LonLat(data.accessRoadCoordinate.x,data.accessRoadCoordinate.y);
    });
    
    var orientationContainer = jQuery(".eniro-obliqueorientation");
    if (orientationContainer) {
        jQuery(orientationContainer).click(obliqueClick);
    }
    
	//add route control to map	
    map.addControl(routeControl);
            
	// register event listener
	map.events.on({
       "zoomend": onZoom,
       "changebaselayer": LayerSwitchListener
   });

}

/**
 * Handles zoomend event and gets the route in the new resolution
 */
var onZoom = function (evt)
{
    //Get the route if any
  	if(routeFeature != undefined){
	    Shared.Data.Route(c1,c2,false);
	 }
}

var LayerSwitchListener = function (evt){
    if (map.baseLayer.layerId === "oblique")
    {
        jQuery('.eniro-showonmapcontrol').hide();
        jQuery('#RouteControlContainer').hide();
        jQuery('#RouteCalcContainer').hide();
        //hide route
        map.wfs.setVisibility(false);
        map.zoomTo('0'); //0,1 or 2
    }else{
        jQuery('.eniro-showonmapcontrol').show();
        jQuery('#RouteControlContainer').show();
        //show route, if any
        map.wfs.setVisibility(true);
    }
}

var populateRouteCalcDiv = function(){
    var _html = [
                    '<div id="addrSearchContainer">',
                    '<div id="addresslblContainer">Fra&nbsp;adresse:&nbsp;</div>',
                    '<div id="addressInputContainer"><input id="fromaddress" name="fromaddress"></div>',
                    '<div id="routeSearchBtnContainer"><input type="button" value="ok" id="initRouteSearchBtn" name="initRouteSearchBtn" onclick="initRouting();"></div>',
                    '<div id="hideRouteSearchBtn" id="hideRouteSearchBtn" onclick="hideRoutingDiv();"></div></div>',
                    '<div id="routeSearchContainer">',
                    '<div id="routeDescBtnContainer"><input type="button" value="Rutebeskrivelse" id="openRouteDescBtn" name="openRouteDescBtn" onclick="openRouteDesc();"></div>',
                    '<div id="travelBtnContainer"><input type="button" value="Rejseplanen" id="openTravelBtn" name="openTravelBtn" onclick="openTravelDesc();"></div>',
                   '</div>'
                ].join('');
    
    jQuery('#RouteCalcContainer').append(_html);
    
}
var hideRoutingDiv = function()
{
    jQuery('#RouteCalcContainer').hide();
    jQuery('#routeSearchContainer').hide();
    jQuery('#fromaddress').val('');
    
    //add keyboard scroll
    for( var c in map.controls )
     if( map.controls[c].CLASS_NAME == "OpenLayers.Control.KeyboardDefaults" )
    map.controls[c].activate();
}

var initRouting = function(){
	//call route
	newRoute = true;
	Shared.Data.Route(c1,c2);
}

var openTravelDesc = function(){
    var _lp = Shared.Util.GetQs('lp');
    if(_lp){
        var _lpx,_lpy;
        _lpx=$('#linkx').val();
        _lpy=$('#linky').val();
        var _c = new OpenLayers.LonLat(_lpx, _lpy);
        
        // Transform to correct map projection (web mercator)
        _c.transform(proj, rproj);
        //call reverse geocode
        Shared.Data.ReverseGeocode(_c);
    }else{
        createTravelPlaneLink($('#LinkRoadName').val(),
            $('#LinkHouseNumberNumeric').val() + ' ' +
            $('#LinkHouseNumberAlpha').val(),
            $('#LinkPostalCode').val(),
            $('#LinkPostalDistrict').val(),
            $('#fromaddress').val()
        );
    }
}

var openRouteDesc = function(){
	if(c1.lon > 0 && c1.lat > 0){
        createDescriptionLink(Shared.Util.GetQs('lid'),c1.lon, c1.lat, document.title, $('#LinkMapWidth').val(),$('#LinkMapHeight').val()); 
    }
    else
    {
        return false;
    }
}

var obliqueClick = function(event) {
        var element = jQuery(event.target);
        jQuery(this).children().css('border', 'solid 1px transparent');
		jQuery(element).css('border', 'solid 1px yellow');
        
}


//void main $(function()
jQuery(window).load(function()
{
    //init map page
    new Map();
});
