var resizing = false; //Sätts till true när man ändrar storlek på fönstret.
var resizeTimer = null;
var ajaxEnabled = true; //Anger om Ajaxanropen ska köras. Används i fetchAjaxPoints.
var ajaxCalls = 0; //Håller reda på hur många Ajax-anrop som är igång.

/* sökning i karta efter privatpersoner och företag */
var mapSearchMode = "none";             // Anger vilket läge sökningen sker i. Giltiga lägen är "none" (sökresultatet döljs), "mixed", "white" eller "pink".
var mapSearchLimitFirstPage = 10;       // Anger hur många träffar per del som visas när träfflistan är uppdelad på white/pink.
var mapSearchLimit = 20;                // Anger hur många träffar som visas när vi endast har white el. pink-träffar att visa (även sida 2+)
var mapSearchWhiteHits = 0;             // Håller reda på sidans antal privatpersonsträffar.
var mapSearchPinkHits = 0;              // Håller reda på sidans antal företagsträffar.
var offset = 0;                         // Anger hur många träffar som ska "räknas bort" när vi går från blandade träffar till endast personer eller företag. öööh, glasklart? Fråga mej. /ME
var wasMixed = false;                   // Håller ordning på om vi på första sidan fick blandade träffar.
var whiteHitsShown = 0;                 // Antalet visade privatpersonsträffar (för paging)
var pinkHitsShown = 0;                  // Antalet visade företagsträffar (för paging)
var retainPageNo = false;               // Visar om vi ska hålla kvar sidnumret. True vid paging, annars false.

var trafficFilterFlags = 0;
var lastTrafficFilter = 0;
var trafficinfo = false;
var syncTimerActive = false;
var syncTimerFetchAjaxPoints = null;
var syncTimerInterval = 60000; // 1 min 
var getExternalPoints = false;
var getExternalPointsFromUrl = false;
var streetImagePoint;
var isMapLoaded = false;
var largeMap = false;
var mapGadget = false;
var pageNo = 1;
var pointId = -1;
var portbildMarker = null;
var dsStreetXY; // Innehåller resultat från AjaxMethods.GetStreetImageByCoords.
var zoomlevel = 3;
var fetchedByZoomCallback = false;
var redrawMoreHits = false;
var resizeLoad = false; // Håller reda på om vi laddar om kartan på grund av storleksändring på fönstret (zoomnivån ska ej återställas och vi ska inte intitialisera StarMap)
var arrPoints = new Array();
var externalPointsLoadedListeners = [];
var printMapPoints = false;

// Klass för hantering av kartlägen

var MapMode = {

    appRootPath: '',
    resultFieldWidth: 0,
    mode: '',
    doBoundarySearch: true,

    init: function() {
        MapMode.mode = MapMode.getMapMode();
    },

    getMapDiv: function() {
        return document.getElementById('mapContainer');
    },


    getMapMode: function() {

        if (readCookie('MapMode'))
            return readCookie('MapMode');
        else if (MapMode.mode.length > 0)
            return MapMode.mode;
        else
            return 'map';

    },

    setSatMode: function() {

        MapMode.setMode('sat');
    },

    setMapMode: function() {

        MapMode.setMode('map');
    },

    setAppMode: function(style) {

        if (typeof (style) == 'undefined')
            style = '';

        OnHittaMapLoaded.add(function() { TDapplet.init(appRootpath, largeMap, '100%', '100%', style); });
        MapMode.setMode('app');
        MapModeControl.hideMenu();
    },

    setMode: function(mode) {
        var previousMode = MapMode.mode;

        MapMode.changeLinkState(mode);

        if (previousMode == mode)
            return;

        MapMode.mode = mode;

        //createCookie('MapMode', mode, 0);

        if (mode == 'map' || mode == 'sat' || mode == 'mj') {
            if (previousMode == 'app') {
                document.getElementById('MiscLinksHolder').style.display = 'block';
                TDapplet.hide();
                Map.show();
                MapModeControl.showMenu();
                var pos = TDapplet.getPosition();
                pos = MapMode.offsetPosition(pos, Map.getZoomLevelFromResolution(pos[2]));

                var center = hittaMap.map.getCenter();

                var positionChanged = (pos != null && (center.east != pos[1] || center.north != pos[0] || (10 - hittaMap.map.getZoom()) != Map.getZoomLevelFromResolution(pos[2])));
                if (positionChanged) {
                    var lowestCurrentZoomLevel = 10 - hittaMap.map.getMaxZoomLevel();
                    var zoomLevel;
                    if (lowestCurrentZoomLevel > Map.getZoomLevelFromResolution(pos[2]))
                        zoomLevel = 10 - Map.getZoomLevelFromResolution(lowestCurrentZoomLevel);
                    else
                        zoomLevel = 10 - Map.getZoomLevelFromResolution(pos[2]);

                    if (zoomLevel == hittaMap.map.getZoom())
                        hittaMap.map.panTo(new HPointRT90(pos[0], pos[1]));
                    else
                        hittaMap.map.setZoom(zoomLevel, new HPointRT90(pos[0], pos[1]));
                }

                Map.onresize.invoke();
            }

            if (mode == 'map') {
                if (typeof (hittaMap) != 'undefined') hittaMap.map.setMapType(0);
            } else if (mode == 'sat') {
                if (typeof (hittaMap) != 'undefined') hittaMap.map.setMapType(1);
            }

            Map.onviewchange.invoke();

            if (document.getElementById('closeResultAjax'))
                document.getElementById('closeResultAjax').style.display = 'block';
        }
        else if (mode == 'app') {
            if (document.getElementById('MiscLinksHolder')) {
                MapMode.loadApp();
            }
            else {
                OnHittaMapLoaded.add(MapMode.loadApp);
            }
        }

        MapSearch.positionHitlist();

    },


    exchangeLogos: function(mode) {
        if (document.getElementById('panSE1div')) {
            if (mode == 'app') {
                document.getElementById('panSE1div').style.display = 'none';
                document.getElementById('panSE2div').style.display = 'none';
                document.getElementById('panSE3div').style.display = 'none';
                document.getElementById('panSE1AG9div').style.display = 'block';
                document.getElementById('panSE2AG9div').style.display = 'block';
                document.getElementById('panSE3AG9div').style.display = 'block';

            }
            else {
                document.getElementById('panSE1div').style.display = 'block';
                document.getElementById('panSE2div').style.display = 'block';
                document.getElementById('panSE3div').style.display = 'block';
                document.getElementById('panSE1AG9div').style.display = 'none';
                document.getElementById('panSE2AG9div').style.display = 'none';
                document.getElementById('panSE3AG9div').style.display = 'none';

            }
        }
    },


    loadApp: function() {
        if (hittaMap == null || hittaMap.map == null) {
            // fix for IE null object
            setTimeout(arguments.callee, 100);
            return;
        }
        var isAutoFocus = false;
        /*
        if (TDapplet.cy != CarmentaMap.cy || TDapplet.cx != CarmentaMap.cx) {
        isAutoFocus = true;
        TDapplet.cy = CarmentaMap.cy();
        TDapplet.cx = CarmentaMap.cx();
        }*/

        TDapplet.cx = hittaMap.map.getCenter().east;
        TDapplet.cy = hittaMap.map.getCenter().north;

        // Dölj portbild om den finns på sidan.        
        if (document.getElementById('imgdiv'))
            document.getElementById('imgdiv').style.display = 'none';

        if (!largeMap || !hasExternalPoints)
            TDapplet.offsetPosition(TDapplet.cx, TDapplet.cy, 10 - hittaMap.map.getZoom());

        // Om vi är på stor karta...
        if (largeMap) {
            //...ska vi visa 3D-kartan med resultat som vi kan ha synliga på 2D-kartan.
            //TDapplet.showWithResults(MapSearch.currentPlaceHitTable, MapSearch.currentWhiteHitTable, MapSearch.currentPinkHitTable);                
            TDapplet.show(isAutoFocus);

            // Dölj "Fler kartfunktioner".
            document.getElementById('MiscLinksHolder').style.display = 'none';
            if (MapModeControl.menu) MapModeControl.hideMenu();

            // Om träfflistan existerar och är tom, ska vi visa instruktioner för 3D-kartan där i stället.
            if (document.getElementById('resultAjax') && document.getElementById('resultAjax').innerHTML.length == 0 && !hasExternalPoints) {
                //CarmentaMap.callWhenInitialized(function() { document.getElementById('tdInfo').style.display = 'block'; })                
                document.getElementById('tdInfo').style.display = 'block';
            }

        }
        else {
            document.getElementById('MiscLinksHolder').style.display = 'none';
            TDapplet.showSmallMap();
        }

        TDapplet.setMapDivPosition();

        if (typeof (hasExternalPoints) != 'undefined' && hasExternalPoints)
            callWhenExternalPointsLoaded(Map.hide);
        else
            Map.hide();

        if (browser == 'Safari')
            window.setTimeout("MapMode.nudgeSafari();", 5000);

        if (!largeMap)
            MapMode.exchangeLogos('app');
    },


    // This very ugly hack is for making the 3D app load correctly in Safari under certain versions of OS X.
    nudgeSafari: function() {
        var w = document.getElementById('mozApplet').offsetWidth - 1;
        document.getElementById('mozApplet').style.width = w + 'px';
        document.getElementById('mozApplet').style.width = (w + 1) + 'px';
    },

    changeLinkState: function(mode) {
        if (typeof (mode) == 'undefined')
            mode = MapMode.getMapMode();

        if (document.getElementById('ordinaryMap')) {
            var mapName;
            var biggerScreenLink = document.getElementById('biggerScreen');
            var smallerScreenLink = document.getElementById('smallerScreen');

            switch (mode) {
                case 'map': mapName = 'karta'; break;
                case 'sat': mapName = 'satellitbild'; break;
                case 'app': mapName = '3D-karta'; break;
                case 'mj': mapName = 'gatubild'; break;
                default: mapName = 'karta'; break;
            }

            if (document.getElementById('ordinaryMap')) {
                document.getElementById('ordinaryMap').style.fontWeight = (mode == 'map' ? 'bold' : 'normal');
                document.getElementById('ordinaryMap').style.textDecoration = (mode == 'map' ? 'none' : 'underline');
            }

            if (document.getElementById('satelliteMap')) {
                document.getElementById('satelliteMap').style.fontWeight = (mode == 'sat' ? 'bold' : 'normal');
                document.getElementById('satelliteMap').style.textDecoration = (mode == 'sat' ? 'none' : 'underline');
            }

            if (document.getElementById('mjMap')) {
                document.getElementById('mjMap').style.fontWeight = (mode == 'mj' ? 'bold' : 'normal');
                document.getElementById('mjMap').style.textDecoration = (mode == 'mj' ? 'none' : 'underline');
            }

            if (document.getElementById('appMap')) {
                document.getElementById('appMap').style.fontWeight = (mode == 'app' ? 'bold' : 'normal');
                document.getElementById('appMap').style.textDecoration = (mode == 'app' ? 'none' : 'underline');
            }

            if (biggerScreenLink)
                biggerScreenLink.innerHTML = 'Större ' + mapName;
            else if (smallerScreenLink) {
                smallerScreenLink.innerHTML = 'Mindre ' + mapName;
            }
        }
    },

    // Används när vi växlar från 3D till vanlig karta.
    offsetPosition: function(pos, z) {

        if (typeof (z) == 'undefined')
            z = hittaMap.map.getZoom();
        else
            z = 10 - z;

        //z = CarmentaMap.zoomIndex;

        resultWidth = (largeMap && MapSearch) ? MapSearch.getHitlistWidth() : 0;

        var oldx = pos[0];
        var oldy = pos[1];

        pos[1] = Math.round(pos[1]) - Math.round(((resultWidth * HMap.ZOOM_LEVELS[z]) / 2));
        pos[0] = Math.round(pos[0]) + Math.round(((_MapToolbarsTop.getHeight() * HMap.ZOOM_LEVELS[z]) / 2));

        return pos;
    }

};

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function TransparentImage(src) {
    var img = document.createElement('img');
    img.border = 0;
   
    if ('Internet Explorer' == browser && version <= 6) {
        var cssFilter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\')';
        img.src = appRootpath + 'images/transp.gif';
        img.style.filter = cssFilter;
    } else {
        img.src = src;
    }
    
    return img;
}

/* Begin Map class */
var Map = { 
    mapPointHolder:null 
    ,mapPointUrl:null
    ,mapPinPoints:false
    ,displayingPOITool:false
    ,displayingRouteTool:false
    ,displayingPointEditor:false
    ,helpWindowCount:0
    ,points:null
    ,progressbar:null
    ,onviewchange:new EventHandler()
    ,onresize:new EventHandler()
    ,rwcConfigFilePath:null
    ,mapServerPath:null
    ,mapTileService: null
};

Map.addPoint = function(x,y)
{
//    if (CarmentaMap)
//    {
//        CarmentaMap.addPoint(y,x, 'här!', 'images/point.png');
//    }
    
    if (TDapplet.isVisible)
    {
        var point = new Point(x, y);
        TDapplet.addPoint(1, point, false, 'här!');    
    }    
}

Map.show = function() {    
    MapMode.getMapDiv().style.display = 'block';   
    //document.getElementById('zoomControlInlineHorizontal').style.display = 'block';         
}

Map.hide = function() {
    MapMode.getMapDiv().style.display = 'none';
    //document.getElementById('zoomControlInlineHorizontal').style.display = 'none';
}

Map.getCursor=function() { return CarmentaMap.wrapper.style.cursor; }
//Map.setCursor=function(newCursor) { CarmentaMap.wrapper.style.cursor = newCursor ? newCursor : 'move'; }
//Map.resetCursor=function() { Map.setCursor('move'); }
Map.hasTopToolbars=function() { return 'undefined' != typeof(_MapToolbarsTop) && null != _MapToolbarsTop; }
Map.hasBottomToolbars=function() { return 'undefined' != typeof(_MapToolbarsBottom) && null != _MapToolbarsBottom; }
Map.hasToolbars=function() { return Map.hasTopToolbars() || Map.hasBottomToolbars(); }
Map.isFullscreen=function() { return largeMap; }
Map.isInline=function() { return self != top; }
Map.isGadget=function() { return mapGadget; }
Map.isLoaded=function() { return isMapLoaded; }
Map.isMapPinPoints=function() { return Map.mapPinPoints; }
Map.shouldGetExternalPointsFromUrl=function() {
    /*  Standardvärdet (false) på getExternalPointsFromUrl ska returneras första gången denna funktion anropas.
        Därefter ska funktionen returnera true om Map.mapPointUrl innehåller någonting och 
        då ska vi också sätta getExternalPoints till false så att vi bara laddar externa punkter från URL. */
    
    var result = getExternalPointsFromUrl; 
      
    getExternalPointsFromUrl = Map.mapPointUrl != null && Map.mapPointUrl.length > 0; 
    
    if (getExternalPointsFromUrl && !largeMap && hittaMap.map.getZoom() != 1)
        result = true;    
    
    if (getExternalPointsFromUrl) {
        getExternalPoints = false;
    }
    
    return result;
}

Map.getLeft = function() { return findPosX(document.getElementById('mapContainer')); }
Map.getRight=function() { return Map.getLeft() + Map.getWidth(); }
Map.getTop = function() { return findPosY(document.getElementById('mapContainer')); }
Map.getBottom=function() { return Map.getTop() + Map.getHeight(); }
Map.getWidth = function() { return document.getElementById('mapContainer').clientWidth; }
Map.getHeight = function() { return document.getElementById('mapContainer').clientHeight; }

Map.createFloatingLogo = function() {
    if (hittaMap == null || hittaMap.map == null) {
        // fix for IE null object
        setTimeout(arguments.callee, 100);
        return;
    }
    var logoControl = new HLogoControl("http://www.hitta.se/images/logo.png", 35, 35);

    var offsetVert = 10;
    
    /*
    Removed, since just caused a bug?
    if (Map.hasTopToolbars() && browser == "Internet Explorer") {
        offsetVert += _MapToolbarsTop.getHeight();
    }*/

    hittaMap.map.addControl(
        logoControl,
        new HControlPosition(HControlPosition.ANCHOR_TOP_LEFT, new HPoint(10, offsetVert))
    );

    /* Capitex quick fix
    var logoElement = logoControl.getElement();    
    HMapHelpers.applyStyle([logoElement], {
    "cursor": "pointer"
    });

    HEvent.addDomListener(logoElement, "click", function() { window.open(appRootpath, 'hittawin'); });
    */
}

/* Skapar progressbar */
Map.createProgress=function() {
Map.progressbar = new ProgressBar('mapContainer', appRootpath + 'images/loading.gif', 40, 40);
}

/* Döljer eventell progessbar */
Map.hideProgress=function() {
    if (ajaxCalls <= 0) {
        ajaxCalls = 0;
        if (null != Map.progressbar) { 
            Map.progressbar.hide(); 
        }
    } else {
        window.setTimeout('Map.hideProgress();', 50);
    }
}

/* Visar eventuell progressbar */
Map.showProgress=function() {
    if (Map.progressbar) {
        Map.progressbar.show(); 
    }
}

/* Döljer alla verktygsfält i kartan */
Map.hideToolbars=function() {
    if (Map.hasTopToolbars()) {
        _MapToolbarsTop.hide();
    }
    if (Map.hasBottomToolbars()) {        
        _MapToolbarsBottom.hide();
    }
}

/* Hjälpfunktion som avgör om kartan ska dimmas eller inte. */
Map.dim=function() {
    /*if (CarmentaMap.sat) {
        return false;
    } else {*/
        return Weather.visible || Map.helpWindowCount > 0 || Map.displayingPOITool || Map.displayingRouteTool || Map.displayingPointEditor;
    //}
}

/* Visar eventuell adressplupp */
Map.showPoint=function() {
    if ('object' == typeof(pointId)) {
        CarmentaMap.showToolTip(pointId);
        CarmentaMap.showPoint(pointId);
    }
}

/* Döljer eventuell adressplupp */
Map.hidePoint = function() {
    if ('object' == typeof(pointId)) {
        CarmentaMap.hidePoint(pointId);
        CarmentaMap.hideToolTip(pointId);
    }
}

/* Returnerar de koordinater användaren skickat med som anchor (#points=x,y,x,y) */
Map.getPointsFromHref=function() {
    if (null == Map.points) {
        var pos = document.location.href.indexOf('#');
        if (pos > -1) {
            var anchor=document.location.href.substring(pos + 1).split('&');
            for (var i = 0; i < anchor.length; i++) {
                var param = anchor[i].split('=');
                if ('points' == param[0].toLowerCase() || 'polygon' == param[0].toLowerCase()) {
                    Map.points = param.length > 0 ? param[1] : '';
                    break;
                }
            }
        } else {
            Map.points = '';
        }
    }
    return Map.points;
}

Map.getBoundary = function(coords)
{
	var coordArrays = coords.split(';');
	var coordXYArray = new Array();
	
	var maxX = 0;
	var maxY = 0;
	var minX = 0;
	var minY = 0;
	var tempX = 0;
	var tempY = 0;
	
	for (var i=0;i < coordArrays.length; i++)
	{
		coordXYArray = coordArrays[i].split(',');
		tempX = coordXYArray[0];
		tempY = coordXYArray[1];
		
		if(maxX == 0 && maxY == 0)
		{
			maxX = tempX;
			maxY = tempY;
			minX = tempX;
			minY = tempY;
		}
		else
		{
			if(tempX > maxX)
			{
				maxX = tempX;
			}
			if(tempY > maxY)
			{
				maxY = tempY;
			}
			if(tempX < minX)
			{
				minX = tempX;
			}
			if(tempY < minY)
			{
				minY = tempY;
			}
		}
	}

    return [ maxX, maxY, minX, minY ];   
}


Map.getBoundaryCenter = function(boundary)
{
	var centerX = 0;
	var centerY = 0;

	centerX = parseInt(boundary[2]) + ((boundary[0] - boundary[2])/2);
	centerY = parseInt(boundary[3]) + ((boundary[1] - boundary[3])/2);
	
	return [ Math.ceil(centerX), Math.ceil(centerY) ];
}

Map.getZoomLevel = function(maxX, maxY, minX, minY, mapCy, mapCx)
{	
	var _minX,_maxX,_minY,_maxY = 0;
	var mapWidth = document.getElementById('mapContainer').offsetWidth;
	var mapHeight = document.getElementById('mapContainer').offsetHeight;

	for(var i=2;i<CarmentaMap.zoomLevels.length;i++)
	{
		_minX = mapCy - CarmentaMap.zoomLevels[i] * (mapHeight / 2);
		_maxX = mapCy + CarmentaMap.zoomLevels[i] * (mapHeight / 2);
		_minY = mapCx - CarmentaMap.zoomLevels[i] * (mapWidth / 2);
		_maxY = mapCx + CarmentaMap.zoomLevels[i] * (mapWidth / 2);

		if((_minX < minX) && 
			(_maxX > maxX) && 
			(_minY < minY) && 
			(_maxY > maxY))
		{
			return i;
		}

	}

	return 3;
}

Map.getPointArray=function() {
    var points = Map.getPointsFromHref();
    if (null == points) {
        return [];
    } else {    
        points = points.split(',');
        var retval = new Array();
        for (var i = 0; i < points.length; i += 2) {
            if (i + 1 < points.length && !isNaN(parseInt(points[i])) && !isNaN(parseInt(points[i + 1]))) {
                retval.push(new HPointRT90(parseInt(points[i]),parseInt(points[i + 1])));
            }
        }
        return retval;
    }
}

Map.setPoints=function(coordinatesSeparatedByComma) {
    if (coordinatesSeparatedByComma && coordinatesSeparatedByComma.length > 0) {
        Map.points = coordinatesSeparatedByComma;
    }
}



Map.AppendApplet=function(objHTML) {
    document.getElementById('3DMapDiv').innerHTML = objHTML;
}

    
/*  Ursprungsvärden */
Map.getResolutionFromZoomLevel=function(level) {

    if (typeof(level) == 'undefined')
        level = 10 - hittaMap.map.getZoom();
        
    switch(level) {
        case 0:// 10
            return '0.53';
        case 1://9
            return '1.2';
        case 2://8
            return '2.5';
        case 3://7
            return '4.2';
        case 4://6
            return '10.3';
        case 5://5
            return '25.0';
        case 6://4
            return '70.0';
        case 7://3
            return '200.0';
        case 8://2
            return '700.0';
        case 9://1
            return '3400.0';
        default:
            return '3400.0';
    }
}

Map.getAltitudeFromZoomLevel = function (level) {

    if (typeof (level) == 'undefined')
        level = 10 - hittaMap.map.getZoom();

    switch (level) {
        case 0: // 10
            return '105';
        case 1: //9
            return '243';
        case 2: //8
            return '1042';
        case 3: //7
            return '1922';
        case 4: //6
            return '4828';
        case 5: //5
            return '13425';
        case 6: //4
            return '32738';
        case 7: //3
            return '111104';
        case 8: //2
            return '352656';
        case 9: //1
            return '1727874';
        default:
            return '243';
    }
}


Map.getZoomLevelFromResolution = function(resolution) {
    resolution = parseInt(resolution);
    if(resolution < 1.0) {
        return 0;
    }
    else if(resolution >= 1.0 && resolution < 1.8) {
        return 1;
    }
    else if(resolution >= 1.8 && resolution < 3) {
        return 2;
    }
    else if(resolution >= 3 && resolution < 7) {
        return 3;
    }
    else if(resolution >= 7 && resolution < 18) {
        return 4;
    }
    else if(resolution >= 18 && resolution < 40) {
        return 5;
    }
    else if(resolution >= 40 && resolution < 120) {
        return 6;
    }
    else if(resolution >= 120 && resolution < 400) {
        return 7;
    }
    else if(resolution >= 400 && resolution < 2500) {
        return 8;
    }
    else if(resolution >= 2500) {
        return 9;
    }
}



Map.getCurrentResolution=function() {
    var applet = getApplet();
    
    if(applet) {
        var pos = applet.call('cameraPositionRT90Res').split(';');
        if(pos.length > 2) {
            return pos[2];
        }
    }
    else {
        return 3400;
    }
}

Map.zoomOut = function()
{        
    if (TDapplet.isVisible)
        TDapplet.zoomOut();
    else
    {
        hittaMap.map.zoomOut();        
    }
}

Map.zoomIn = function()
{                
    if (TDapplet.isVisible)
        TDapplet.zoomIn();
    else
    {
        hittaMap.map.zoomIn();
    }
}

//Används för att placera ut en punkt när man går från 3d till vanligt kartläge
var threeDMapPointValue;

/* End Map class */

/* Begin EventHandler class */
function EventHandler() { 
    this.handler = new Array(); 
}
/* EventHandler class methods */
EventHandler.prototype.clear = function() { 
    while (this.handler.length > 0) { 
        this.handler.pop(); 
    } 
}
EventHandler.prototype.add = function(method) { 
    EventHandler.add(this.handler, method); 
}
EventHandler.prototype.remove = function(method) { 
    EventHandler.remove(this.handler, method); 
}
EventHandler.prototype.invoke = function() { 
    EventHandler.invoke(this.handler);
}
/* EventHandler static methods */
EventHandler.add = function(handler, method) {
    if (handler.push) {
        for (var i = 0; i < handler.length; i++) {
            if (handler[i] == method) {
                return;
            }
        }    
        handler.push(method);
    }        
}
EventHandler.remove = function(handler, method) {
    if (handler.splice) {
        for (var i = 0; i < handler.length; i++) {
            if (handler[i] == method) {
                handler.splice(i, 1);
                return;
            }
        }
    }
}
EventHandler.invoke = function(handler) {
    if (handler.push) {
        for (var i = 0; i < handler.length; i++) {
            handler[i]();
        }
    }
}
/* End EventHandler class */
    
/* ---- Extends java script's date handling ---- */
/* Instance methods */
Date.prototype.toString=function() {
    if (0 == arguments.length) {
        return this.toDateString() + ' ' + this.toTimeString();
    } else {
        var out = '';
        var min = this.getMinutes();
        var sec = this.getSeconds();
        var h = this.getHours();
        var mon = this.getMonth() + 1;
        var y = this.getFullYear();
        var d = this.getDate();
        sec = sec < 10 ? "0" + sec : sec;
        min = min < 10 ? "0" + min : min;
        h = h < 10 ? "0" + h : h;
        d = d < 10 ? "0" + d : d;
        mon = mon < 10 ? "0" + mon : mon;
        switch (arguments[0]) {
            case "d":
                return mon+'/'+d+'/'+y
            case "D":                
                return this.getDayName() + ", " + this.getMonthName() + " " + this.getDate() + " " + y;
            case "f":
                return this.getDayName() + ", " + this.getMonthName() + " " + this.getDate() + " " + y + " " + h + ":" + min;
            case "F":   
                return this.getDayName() + ", " + this.getMonthName() + " " + this.getDate() + " " + y + " " + h + ":" + min + ":" + sec;                
            case "g":
                return mon+"/"+d+"/"+y+" "+h+":"+min;
            case "G":                
                return mon+"/"+d+"/"+y+" "+h+":"+min+":"+sec;
            case "m":
                return this.getMonthName() + " " + this.getDate();
            case "s":
                return y+"-"+mon+"-"+d+"T"+h+":"+min+":"+sec;
            case "t":
                return h+':'+min;
            case "T":
                return h+':'+min+':'+sec;                
            case "u":
                var utch = this.getUTCHours();
                var utcm = this.getUTCMinutes();
                var utcs = this.getUTCSeconds();
                utch = utch < 10 ? "0" + utch : utch;
                utcm = utcm < 10 ? "0" + utcm : utcm;
                utcs = utcs < 10 ? "0" + utcs : utcs;
                return this.getUTCFullYear()+"-"+(this.getUTCMonth()+1)+"-"+this.getUTCDate()+" "+utch+":"+utcm+":"+utcs+"Z";
            case "U":
                var utch = this.getUTCHours();
                var utcm = this.getUTCMinutes();
                var utcs = this.getUTCSeconds();
                utch = utch < 10 ? "0" + utch : utch;
                utcm = utcm < 10 ? "0" + utcm : utcm;
                utcs = utcs < 10 ? "0" + utcs : utcs;
                return this.getUTCDayName() + ", " + this.getUTCMonthName() + " " + this.getUTCDate() + ", " + this.getUTCFullYear() + " "+utch+":"+utcm+":"+utcs;
            case "y":
                return this.getMonthName() + ", " + y;
            default:
                throw "Invalid date format string";
                break;
        }
    }
}
Date.prototype.noon=function() {
    var d = new Date((this.getMonth()+1)+'/'+this.getDate()+'/'+this.getFullYear());
    d.setHours(12);
    d.setMinutes(0);
    d.setSeconds(0);
    d.setMilliseconds(0);
    return d;
}
Date.prototype.midnight=function() {
    return new Date((this.getMonth()+1)+'/'+this.getDate()+'/'+this.getFullYear());
}
Date.prototype.noon=function() {
    return this.midnight().addHours(12);
}
Date.prototype.compareTo=function(date2) {
    return Date.compare(this, date2);
}
Date.prototype.equals=function(date2) {
    return Date.equals(this, date2);
}
Date.prototype.getUTCMonthName=function() {
    return this.getMonthName(this.getUTCMonth());
}
Date.prototype.getUTCDayName=function() {
    return this.getDayName(this.getUTCDay());
}
Date.prototype.getMonthName=function() {
    var m = arguments.length > 0 ? arguments[0] : this.getMonth();
    if ('undefined' == typeof(Date.monthNames)) { return (['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'])[m]; } 
    else { return Date.monthNames[m]; }        
}
Date.prototype.getDayName=function() {
    var d = this.getDay();
    if ('undefined' == typeof(Date.dayNames)) { return (['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'])[d]; } 
    else { return Date.dayNames[d]; }
}
Date.prototype.isLeapYear=function() {
    return Date.isLeapYear(this.getFullYear());
}
Date.prototype.daysInYear=function() {
    return this.isLeapYear() ? 366 : 365;
}
Date.prototype.daysInMonth=function() {
    var month = this.getMonth()+1;
    switch (month) {
        case 2:
            return Date.isLeapYear(this.getFullYear()) ? 29 : 28;
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
        default:
            return 31;
    }
}
Date.prototype.addMilliseconds=function(ms) {
    return new Date((new Date()).setTime(this.getTime() + parseInt(ms)));
}
Date.prototype.addSeconds=function(s) {
    return this.addMilliseconds(parseInt(s) * 1000);
}
Date.prototype.addMinutes=function(m) {
    return this.addMilliseconds(parseInt(m) * 60 * 1000);
}
Date.prototype.addHours=function(h) {
    return this.addMilliseconds(parseInt(h) * 60 * 60 * 1000);
}
Date.prototype.addDays=function(d) {
    return this.addMilliseconds(parseInt(d) * 24 * 60 * 60 * 1000);
}
Date.prototype.addWeeks=function(w) {
    return this.addMilliseconds(parseInt(w) * 7 * 24 * 60 * 60 * 1000);
}
Date.prototype.addMonths=function(m) {
    var date = this;
    for (var i = 0; i < m; i++) { date = date.addDays(date.daysInMonth()); }
    return date;
}
Date.prototype.addYears=function(y) {
    return this.addMonths(12);
}
/* Static methods and properties */
Date.dayNames=['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'];
Date.monthNames=['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'];
Date.now=(new Date());
Date.today=(new Date((Date.now.getMonth()+1)+'/'+Date.now.getDate()+'/'+Date.now.getFullYear()));
Date.tomorrow=Date.today.addDays(1);
Date.yesterday=Date.today.addDays(-1);
Date.compare=function(date1, date2) {
    if (null == date2 || 'undefined' == typeof(date2) || null == date1 || 'undefined' == typeof(date1)) { throw 'Invalid argument'; } 
    else if (date1.getTime() > date2.getTime()) { return 1; } 
    else if (date1.getTime() < date2.getTime()) { return -1; } 
    else if (date1.getTime() == date2.getTime()) { return 0; } 
    else { throw 'Invalid argument'; }
}
Date.equals=function(date1, date2) {
    if (null == date1 || null == date2) { return false; }
    else { return 0==Date.compare(date1, date2); }
}
Date.isLeapYear=function(year) {
  if (0 == year % 400) { return true; }
  if (0 == year % 100) { return false; }
  return (0 == year % 4) ? true : false;
}
Date.parse=function(String) {
    //TODO: Implementera fler datumformat.
    var s = ''+String+'';
    if (s.indexOf("T") > -1) {
        var d = s.substring(0, s.indexOf("T")).split("-");
        var t;
        if (s.indexOf("+") > -1) { t = s.substring(s.indexOf("T")+1, s.indexOf("+")).split(":"); } 
        else { t = s.substring(s.indexOf("T")+1).split(":"); }
        var year = d[0];
        var month = d[1];
        var day = d[2]; 
        var date = new Date(month+'/'+day+'/'+year);
        date.setHours('0' == t[0][0] ? t[0][1] : t[0]);
        date.setMinutes('0' == t[1][0] ? t[1][1] : t[1]);
        date.setSeconds('0' == t[2][0] ? t2[2][1] : t[2]);
        date.setMilliseconds(0);
        return date.getTime();
    } else if (14 == s.length) {
        var year = s.substring(0, 4);
        var month = s.substring(4, 6);
        month = '0' == month[0] ? month[1] : month;
        var day = s.substring(6, 8);
        day = '0' == day[0] ? day[1] : day;
        var date = new Date(month+'/'+day+'/'+year);
        var hours = s.substring(8, 10);
        hours = '0' == hours[0] ? hours[1] : hours;
        var minutes = s.substring(10, 12);
        minutes = '0' == minutes[0] ? minutes[1] : minutes;
        var seconds = s.substring(12);
        seconds = '0' == seconds[0] ? seconds[1] : seconds;
        date.setHours(hours);
        date.setMinutes(minutes);
        date.setSeconds(seconds);
        date.setMilliseconds(0);
        return date.getTime();
    } else {
        return new Date(s).getTime();
    }
}

/* ---- End of Date extensions ---- */

function MM_swapImgRestore() {
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() {
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) {
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); return x;
}

function MM_swapImage() {
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function findX(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curleft += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	} else if (obj.x) {
		curleft += obj.x;
	}
	return curleft;
}

function findY(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	} else if (obj.y) {
		curtop += obj.y;
	}
	return curtop;
}

function SetZoom(level) {
    zoomlevel = level;
	hittaMap.map.setZoom(level);
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}


////////////////////// STREETIMAGES ////////////////////////////////
var imgLyr = "null";
var imgPreview = false;
var theObj="null";

function browserCheck() {
	if ((OS == "Windows" && (browser == "Internet Explorer" || browser == "Netscape Navigator") && version < 5) || (OS == "Windows" && browser == "Opera" && version < 7)){
		document.getElementById("jsNotice").style.display = "block";
		return false;
	} else if (OS == "Mac" && browser == "Internet Explorer"){
		document.getElementById("jsNotice").style.display = "block";
		return false;
	} else {
		return true;
	}
}

function positionInfoDiv(obj) {
	theObj = obj;
	curleft = findPosX(obj);
	curtop = findPosY(obj);
	var searchInMapDiv = document.getElementById("SearchInMapDiv");
	var infoDiv = document.getElementById("infoDiv");
	var mapDiv = document.getElementById("mapContainer");
	
	if (null == infoDiv) {
	    return;
	}
	
	if (null != searchInMapDiv) {
	    curtop += searchInMapDiv.offsetHeight + 1;
	}

    if (!largeMap) {
        if (browser=="Safari" || browser =="Internet Explorer" || browser=="Opera") {
            curtop -= 8;
        } else {
	        curtop -= 1;
        }
    }
    
	if (Map.hasToolbars()) { //Positionera infodiv under nedersta synliga top-dockad toolbar.
	    curtop += _MapToolbarsTop.getHeight();
	}
	
	var height= mapDiv.offsetHeight;
	var width= mapDiv.offsetWidth;
	
	// Bredden på kartan (och på skylten) är samma i alla browsrar och därför används denna numer för att positionera skylten.
	// vänsterpositionen = kartans övre vänstra hörn + halva kartvidden - halva skyltvidden.
	if (!largeMap) {
	    infoDiv.style.left = curleft + width/2 - 81 +"px";
	}
	infoDiv.style.top = curtop + "px";
}

function positionObj(child, parent, horizontalAlign, verticalAlign, offsetX, offsetY) {
	var hAlign = horizontalAlign ? horizontalAlign.toLowerCase() : "left";
	var vAlign = verticalAlign ? verticalAlign.toLowerCase() : "top";
	var parentX = findPosX(parent);
	var parentY = findPosY(parent);
	var childX = 0;
	var childY = 0;

	if ("right" == hAlign) {
		childX = (parentX + parent.offsetWidth) - child.offsetWidth;
	} else if("center" == hAlign) {
		childX = (parentX + parent.offsetWidth / 2) - (child.offsetWidth / 2);
	} else { //default is left.
		childX = parentX;
    }		
		
	if ("bottom" == vAlign) {
		childY = (parentY + parent.offsetHeight) - child.offsetHeight;
	} else if ("middle" == vAlign) {
		childY = (parentY + parent.offsetHeight / 2) - (child.offsetHeight / 2);
	} else { //default is top.
		childY = parentY;
    }
	
	childX += offsetX ? offsetX : 0;
	childY += offsetY ? offsetY : 0;
	
	child.style.left = childX;
	child.style.top = childY;
}

function positionImgDiv(obj) {

    if (null == obj) {
        return;
    }
    if (typeof (hittaMap) == 'undefined') {
        window.setTimeout('positionImgDiv(document.getElementById("' + obj.id + '"));', 10);
        return;
    }
    
	var imgDiv = document.getElementById('imgdiv');
	var mapDiv = document.getElementById('mapContainer');
	
	imgLyr = obj;
	curleft = findPosX(obj);
	curtop = Map.hasToolbars() ? findPosY(mapDiv) : findPosY(obj);

	var addLeftPos = 460;	

	if (browser == "Safari") {
	    curleft += (addLeftPos + 9);
	    curtop += Map.hasToolbars() ? -1 : 25;
	} else if (browser == "Internet Explorer") {
	    curleft += (addLeftPos + 9);
	    curtop += Map.hasToolbars() ? 0 : 27;
	} else if (browser == "Opera") {
	    curleft += (addLeftPos + 10);
	    curtop += Map.hasToolbars() ? -7 : 25;
	} else if (browser == "Firefox") {
	    if (OS == "Windows") {
	        curleft += (addLeftPos + 17);
	        curtop += Map.hasToolbars() ? 7 : 34;
	    } else if (OS == "Mac") {
	        curleft += (addLeftPos + 18);
	        curtop += Map.hasToolbars() ? 12 : 35;
	    }	    
	} else {
	    if (OS == "Mac") {
	        curleft += (addLeftPos + 20);
	        curtop += Map.hasToolbars() ? 12 : 35;
	    }
	    else {
	        curleft += (addLeftPos + 15);
	        curtop += Map.hasToolbars() ? 5 : 34;
	    }
	}

    if (Map.hasToolbars()) { //Positionera imgdiv under nedersta synliga top-dockad toolbar (Kartsöktoolbaren borträknad).
        curtop += _MapToolbarsTop.getHeight() - _MapToolbarsTop.toolbars[_MapToolbarsTop.getLength() - 1].element.offsetHeight;
    }

    if (imgDiv != null) {
        imgDiv.style.top = curtop + "px";    
        imgDiv.style.left = curleft + "px";
        imgDiv.style.display = imgDiv.style.display == '' ? "block" : imgDiv.style.display;
        imgDiv = null;
    }
}



function findPosX(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
	    while (obj.offsetParent) {
			curleft += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	} else if (obj.x) {
		curleft += obj.x;
	}
	return curleft;
}

function findPosY(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	} else if (obj.y) {
		curtop += obj.y;
	}
	return curtop;
}

function portbildUpdateData(street, number, literal, zip) {
    ds = AjaxMethods.GetStreet(street, number, literal, zip).value;
}

function portbildIsDataValid() {
    return (ds != null && typeof (ds) == "object" && ds.Tables != null);
}

function portbildUpdateImages() {
    var current = portbildGetCurrent();
    var images = portbildGetImages();

    setAddressText();
    portbildSetImages(images.left, images.right, images.center);
    portbildSetMap(current.x, current.y, current.street + ' ' + current.number + ' ' + current.literal);
}

function portbildPopulateDataStructure(arr) {
    if (typeof (arr) == 'undefined' || arr == null || arr.length < 4) {
        return null;
    }

    return {
        street: arr[0],
        number: arr[1],
        literal: arr[2],
        zip: arr[3]
    };
}

function portbildGetCurrent() {
    if (!portbildIsDataValid()) {
        return null;
    }

    return {
        street: ds.Tables[0].Rows[0].street,
        number: ds.Tables[0].Rows[0].streetno,
        literal: ds.Tables[0].Rows[0].litera,
        zip: ds.Tables[0].Rows[0].zip,
        x: ds.Tables[0].Rows[0].x,
        y: ds.Tables[0].Rows[0].y
    };
}

function portbildGetImages() {
    if (!portbildIsDataValid()) {
        return null;
    }

    return {
        thumb: ds.Tables[0].Rows[0].thumb,
        center: ds.Tables[0].Rows[0].center,
        left: ds.Tables[0].Rows[0].left,
        right: ds.Tables[0].Rows[0].right
    };
}

function portbildGetLeft() {
    if (!portbildIsDataValid()) {
        return null;
    }

    var arr = ds.Tables[1].Rows[0].neighbour_Text.split(';');
    return portbildPopulateDataStructure(arr);
}

function portbildGetRight() {
    if (!portbildIsDataValid()) {
        return null;
    }

    var arr = ds.Tables[1].Rows[1].neighbour_Text.split(';');
    return portbildPopulateDataStructure(arr);
}

function portbildGetOpposite() {
    if (!portbildIsDataValid()) {
        return null;
    }

    var arr = ds.Tables[1].Rows[2].neighbour_Text.split(';');
    return portbildPopulateDataStructure(arr);
}

function goLeft() {
	if(document.getElementById('addressLeft').innerHTML != '') {
	    var left = portbildGetLeft();

	    if (left != null) {
	        portbildUpdateData(left.street, left.number, left.literal, left.zip);
	        portbildUpdateImages();
	    }
	}
	checkArrow();
}

function goRight() {
    if (document.getElementById('addressRight').innerHTML != '') {
        var right = portbildGetRight();

        if (right != null) {
            portbildUpdateData(right.street, right.number, right.literal, right.zip);
            portbildUpdateImages();
	    }
	}
	checkArrow();
}

function goOpposite() {
    var opposite = portbildGetOpposite();

    if (opposite != null) {
        portbildUpdateData(opposite.street, opposite.number, opposite.literal, opposite.zip);
        portbildUpdateImages();
    }
	checkArrow();
}

function setAddressText(action) {
    var addressSet = function(link, image, text) {
        link.innerHTML = text;

        if (text == '' && image != null) {
            image.alt = '';
            image.title = '';
        }
    }	

	var current = portbildGetCurrent();
	document.getElementById('addressCurrent').innerHTML = current.street + ' ' + current.number + ' ' + current.literal;

	var left = portbildGetLeft();
	addressSet(
	    document.getElementById('addressLeft'),
	    document.getElementById('leftImage'),
        (left != null ? 'Gå till ' + left.street + ' ' + left.number + ' ' + left.literal : '')
	);

	var opposite = portbildGetOpposite();
	addressSet(
	    document.getElementById('addressOpposite'),
	    null,
	    (opposite != null ? 'Porten mitt emot' : '')
	);

	var right = portbildGetRight()
	addressSet(
	    document.getElementById('addressRight'),
	    document.getElementById('rightImage'),
	    (right != null ? 'Gå till ' + right.street + ' ' + right.number + ' ' + right.literal : '')
	);
}

function portbildSetImages(left, right, center) {
    var leftImage = document.getElementById('leftImage');
    var rightImage = document.getElementById('rightImage');
    var centerImage = document.getElementById('centerImage');

    leftImage.src = (left == '' ? appRootpath + 'images/map/bildsaknas.gif' : left);
    rightImage.src = (right == '' ? appRootpath + 'images/map/bildsaknas.gif' : right);
    centerImage.src = (center == '' ? appRootpath + 'images/map/bildsaknas_center.gif' : center);
}

function portbildSetMap(pointX, pointY, title) {
    if (portbildMarker != null) {
        hittaMap.map.removeOverlay(portbildMarker);
    }

    portbildMarker = hittaMap.addPoint(new HPointRT90(pointX, pointY), null, 'PortbildSetMap', '<font face=verdana>' + title + '</font>', InfoBoxMode.DisplayOnMouseOver);
}

/*
function GetStreetXY(x, y) {
    ajaxCalls++;
	dsStreetXY = AjaxMethods.GetStreetImageByCoords(x, y).value;
	
	if (dsStreetXY != null && typeof(dsStreetXY) == "object" && dsStreetXY.Tables != null) {	
		if (dsStreetXY.Tables.length > 0) {	
		    if (null != streetImagePoint) {
		        try { CarmentaMap.removePoint(streetImagePoint); }
		        catch (error) {}
		        streetImagePoint = null;
		    }
			if(walkStreet) {
				streetImagePoint = CarmentaMap.addPoint(dsStreetXY.Tables[0].Rows[0].x,dsStreetXY.Tables[0].Rows[0].y,'<div id=imgdiv2 name=imgdiv2><div><p><a class=toplinks href="javascript:showAllXYImages();">Promenera här</a><span class="bullet">&#149;</span><a class=toplinks href="javascript:CarmentaMap.hideToolTip(streetImagePoint);">Stäng</a></p><a href="javascript:showAllXYImages();"><img src="'+dsStreetXY.Tables[0].Rows[0].thumb+'" width=130 height=173 alt="Klicka här att promenera här" title="Klicka här för att promenera här" border=0></a><p><img class=noIE src="Images/MapPoint_NoNumber.gif" width=10 height=10 border=0> <a class=noIE href="javascript:showAllXYImages();">' + dsStreetXY.Tables[0].Rows[0].street + ' ' + dsStreetXY.Tables[0].Rows[0].streetno + ' ' + dsStreetXY.Tables[0].Rows[0].litera + '</a></p></div></div>', 'images/point.png');
			} else {
				streetImagePoint = CarmentaMap.addPoint(dsStreetXY.Tables[0].Rows[0].x,dsStreetXY.Tables[0].Rows[0].y,'<div id=imgdiv2 name=imgdiv2><div><p><a class=toplinks href="javascript:CarmentaMap.hideToolTip(streetImagePoint);">Stäng</a></p><img src="'+dsStreetXY.Tables[0].Rows[0].thumb+'" width=130 height=173 alt="" title="" border=0><p><img class=noIE src="Images/MapPoint_NoNumber.gif" width=10 height=10 border=0> ' + dsStreetXY.Tables[0].Rows[0].street + ' ' + dsStreetXY.Tables[0].Rows[0].streetno + ' ' + dsStreetXY.Tables[0].Rows[0].litera + '</p></div></div>', 'images/point.png');
			}
			// Pelle, Carmenta AB: lagt till makePersistent() för att inte streetImagePoint ska raderas vid det direkt följande fetchAjaxPoints()
			CarmentaMap.makePersistent(streetImagePoint);
			window.setTimeout('showPoint()', 500); 
		}
	}
	ajaxCalls--;
}

function showPoint() {
	CarmentaMap.showToolTip(streetImagePoint);
}

function showAllXYImages() {
	ds = dsStreetXY;
	CarmentaMap.hideToolTip(streetImagePoint);

	if(ds != null && typeof(ds) == "object" && ds.Tables != null && ds.Tables.length > 0 && ds.Tables[0].Rows.length > 0) {
		setImages(ds.Tables[0].Rows[0].left, ds.Tables[0].Rows[0].right, ds.Tables[0].Rows[0].center, ds.Tables[0].Rows[0].street + ' ' + ds.Tables[0].Rows[0].streetno + ds.Tables[0].Rows[0].litera);
		setAddressText();
		_minX = cy - (parseInt(ZOOM_LEVELS[i]) * (parseInt(mapHeight) / 2));
	}
	ShowAllStreetImages();
	checkArrow();
}
*/

function GetZoomLevel(maxX, maxY, minX, minY, mapHeight, mapWidth) {	
	var _minX = 0;
	var _maxX = 0;
	var _minY = 0;
	var _maxY = 0;
	
    if (null == mapHeight) { mapHeight = CarmentaMap.mapHeight; }
    if (null == mapWidth) { mapWidth = CarmentaMap.mapWidth; }

	for(var i=2;i<ZOOM_LEVELS.length;i++) {   
		_minX = cy - (parseInt(ZOOM_LEVELS[i]) * (parseInt(mapHeight) / 2));
		_maxX = cy + (parseInt(ZOOM_LEVELS[i]) * (parseInt(mapHeight) / 2));
		_minY = cx - (parseInt(ZOOM_LEVELS[i]) * (parseInt(mapWidth) / 2));
		_maxY = cx + (parseInt(ZOOM_LEVELS[i]) * (parseInt(mapWidth) / 2));
		if((_minX < minX) && (_maxX > maxX) && (_minY < minY) && (_maxY > maxY)) {
		    return ZOOM_LEVELS.length-i;
		}
	}

	return 3;
}

function GetBoundaryCenter(maxX, maxY, minX, minY) {
	var centerX = 0;
	var centerY = 0;

	centerX = new String(minX + ((maxX - minX)/2));
	centerY = new String(minY + ((maxY - minY)/2));
	
	return new Array(parseInt(centerX.substring(0, 7)),parseInt(centerY.substring(0, 7)));
}

function LoadMap() {
    if (largeMap) {
        MapSearch.init(
            document.getElementById('mapContainer').offsetWidth, 
            document.getElementById('mapContainer').offsetHeight
        );
    }
    
    fetchExternalPoints();

    // detaljsida, ingen träff - isf centrera karta och visa "ADRESS SAKNAS"
    if (cx === 0) {
        (function() {
            if (hittaMap == null || hittaMap.map == null) {
                // timeout to avoid "object null" error in IE
                setTimeout(arguments.callee, 100);
            } else {
                hittaMap.map.setCenter(new HPointRT90(mapStart.y, mapStart.x), 1);
                hittaMap.map.addControl(new HLabel('<span style="font-size:24px;font-weight:bold;color:White">ADRESS SAKNAS</span>'));
            }
        })();
    }

    if (typeof(LoadStreetImage) == 'function') {
        LoadStreetImage();
    }
}

/*
function LoadMap() {
    return;
	//Tar hand om problemet med navigationsrutans fixering på Helskärmskartan i Firefox tidigare än 1.5
	firefoxFix();
   
    var loadMapDiv = document.getElementById('loadMap');
    var imgdiv = document.getElementById('imgdiv');

	if (document.getElementById && CarmentaMap) {
        var viewName = "Hitta.MainView";
        if (0 == cx) {
            CarmentaMap.init("mapContainer", mapStart.x, mapStart.y, zoomlevel, viewName, Map.rwcConfigFilePath, Map.mapServerPath, Map.mapTileService);
        } else {
            CarmentaMap.init("mapContainer", cx, cy, zoomlevel, viewName, Map.rwcConfigFilePath, Map.mapServerPath, Map.mapTileService);
        }			
					
	    // rensa alla listeners innan vi lägger till nya.		    
        CarmentaMap.zoomListeners.clear();
        CarmentaMap.zoomChangeListeners.clear();
        CarmentaMap.clickListeners.clear();
        CarmentaMap.satBoundsListeners.clear();
        CarmentaMap.panListeners.clear();
			                                               
		CarmentaMap.addZoomListener(function() { MapSearch.dynamicSearch('zoom'); });
		CarmentaMap.addPanListener(function() { MapSearch.dynamicSearch('pan'); });

		try {
			LoadStreetImage();
		} catch(Error) {}
		
		// Återställ flaggan som säger att vi just har ändrat storlek på fönstret.
		if (resizeLoad)
		    resizeLoad = false;
	}
	
    //ToggleBold();
    MapMode.changeLinkState();
    
	if(!largeMap && 'undefined' != typeof(_MapToolbarsTop)) {
		positionInfoDiv(document.getElementById('mapContainer'));
	}
	
	isMapLoaded = CarmentaMap.isInitialized;
    
    //Visa hittaloggan under översta toolbar om kartan visas i en frame
    if (Map.isFullscreen() && Map.isInline()) {
        Map.createFloatingLogo();
        try
        {
            document.getElementById('appMap').style.display='none';
            document.getElementById('newSign').style.display='none';
        }
        catch(err)
        {}
    }
    
    //Kör avslutningen av LoadMap() asynkront när kartkontrollen initierats färdigt
    CarmentaMap.callWhenInitialized(LoadMap2);
    
    if (largeMap)
    {
        //initMapSearch();               
        MapSearch.init(document.getElementById('mapContainer').offsetWidth, document.getElementById('mapContainer').offsetHeight);
    }
        
}

function LoadMap2()
{
	if ('undefined' != typeof(SetPoint)) {
        SetPoint();
    }

    
    
    fetchAjaxPoints('loadmap2');
    
    // Verktyg för att markera upp en box på kartan
    if (typeof(selectAreaMode) != 'undefined' && selectAreaMode && AreaBox)
    {
        AreaBox.init('mapContainer');
    }   
             
}*/

var trafficVisibilityLabel = null;

function checkTrafficFilterVisibility(level, checked, type) {    
    var typeName = type ? type : "Denna information";

	level = 10 - level;
	var zoomLevel = hittaMap.map.getZoom();

	if (zoomLevel < level && checked) {
	    if (trafficVisibilityLabel) {
	        // remove any current message
	        hittaMap.map.removeControl(trafficVisibilityLabel);
	        trafficVisibilityLabel = null;
	    }

	    var content = document.createElement("div");
	    content.innerHTML = typeName + ' syns från nivå ' + level + ' och ner.<br/>Tips: ';
	    
	    var link = document.createElement("a");
	    link.href = "#";
	    link.innerHTML = "Zooma in";

	    content.appendChild(link);

	    trafficVisibilityLabel = hittaMap.showMessage(content, function() { trafficVisibilityLabel = null; });

	    link.onclick = function(e) {
	        e.stopPropagation();
	        hittaMap.map.setZoom(level);
	        hittaMap.map.removeControl(trafficVisibilityLabel);
	        trafficVisibilityLabel = null;
	        return false;
	    };
	}
}

function GetExternalObjectsFromUrl(url) {    

    if (url) {
        hittaMap.clearPoints('externalPoints');
        var arrBounds =	hittaMap.map.getBounds();
        var maxX = hittaMap.map.getBounds().ne.east;
        var maxY = hittaMap.map.getBounds().ne.north;
        var minX = hittaMap.map.getBounds().sw.east;
        var minY = hittaMap.map.getBounds().sw.north;
        var zl = 10 - hittaMap.map.getZoom();
    	       
        ajaxCalls++;
       Map.mapPointHolder ="";
        if (onlyGroupOverLevel)	{  	
            	Hitta.PublicWeb.Web.AjaxMethods.GetExternalObjectsFromUrl(url, parseInt(hittaMap.map.getCenter().east), parseInt(hittaMap.map.getCenter().north), parseInt(minX), parseInt(minY), parseInt(maxX), parseInt(maxY), parseInt(zl), onlyGroupOverLevel, GetExternalObjects_Callback);
	    } else{
            Hitta.PublicWeb.Web.AjaxMethods.GetExternalObjectsFromUrl(url, parseInt(hittaMap.map.getCenter().east), parseInt(hittaMap.map.getCenter().north), parseInt(minX), parseInt(minY), parseInt(maxX), parseInt(maxY), parseInt(zl), 0, GetExternalObjects_Callback);
        }
    }
}

function GetExternalObjects(xml) {
    if (hittaMap == null ) {          
        setTimeout(function(){ GetExternalObjects(xml); }, 100);
        return;
    }
    
    hittaMap.clearPoints('externalPoints');
    if (xml.length > 1) {	
		// Get boundaries of map only to set points within it
        var bounds = hittaMap.map.getBounds();
		var tdBounds = TDapplet.getBoundary();
		
		var getBoundsFromTD = (MapMode.getMapMode() == 'app' && tdBounds != null);
		var maxX = getBoundsFromTD ? Math.round(tdBounds[7]) : Math.round(bounds.ne.north);
		var maxY = getBoundsFromTD ? Math.round(tdBounds[6]) : Math.round(bounds.ne.east);
		var minX = getBoundsFromTD ? Math.round(tdBounds[1]) : Math.round(bounds.sw.north);
		var minY = getBoundsFromTD ? Math.round(tdBounds[0]) : Math.round(bounds.sw.east);
		var zoomLevel = getBoundsFromTD ? TDapplet.getZoomLevel() : 10 - hittaMap.map.getZoom();
        
	    TDapplet.removeAllLabels();
	    ajaxCalls++;
	            
        Hitta.PublicWeb.Web.AjaxMethods.GetExternalObjects(xml, true, zoomLevel, parseInt(minX), parseInt(minY), parseInt(maxX), parseInt(maxY), GetExternalObjects_Callback);
	}
}

function GetExternalObjects_Callback(response) {
      if (hittaMap == null || hittaMap.map == null) {
        // fix for IE null object
        setTimeout(arguments.callee, 100);
        return;
    }
    if (null != response && null != response.value && 'object' == typeof(response.value)) {
        var table = response.value.Tables[0];
        
        // Rensa punkterna i 3D-appen innan vi lägger till externa punkter.
        if (table.Rows.length > 0)
        {
            TDapplet.removeAllLabels();        
            TDapplet.points = [];
        }
        
        for (var i = 0; i < table.Rows.length;i++) {
            var pointRow = table.Rows[i];
            var content = '';
            var icon = '';
           
          
            if (pointRow.GroupIconImage && pointRow.Count && pointRow.Count > 1) {
                icon = pointRow.GroupIconImage;
                if(icon.indexOf('sj_kartnal') > -1)
				{
					content = pointRow.Count + ' ställen';
				}
				else
				{
					content = pointRow.Count + ' objekt';
				}
            } else {
                icon = pointRow.IconImage;

                if (pointRow.Name) {
                 
                    content = '<b>' + pointRow.Name + '</b><br />';
                }
                content += pointRow.Content;
            }
            
            var point = null;

            /*
            // This function is removed due to performance O(n^2)
            // offset map point if overlapping existing. 
            if (CarmentaMap.findPoint(pointRow.X, pointRow.Y)) {
                pointRow.X = Number(pointRow.X) + (8 * CarmentaMap.zoomIndex);
                pointRow.Y = Number(pointRow.Y) + (8 * CarmentaMap.zoomIndex);
            }
            */

            var infoBoxDisplayMode = InfoBoxMode.DisplayOnMouseOver;
            if (table.Rows.length == 1) infoBoxDisplayMode = InfoBoxMode.AlwaysDisplay;

            var iconObj = null;
            if (icon) {
                iconObj = new HIcon(icon);
                iconObj.anchor = new HPoint(12, 12);
                iconObj.infoBoxAnchorBottom = new HPoint(11, 22);
                iconObj.infoBoxAnchorTop = new HPoint(11, 0);
            }

            var infoBoxSize = new HSize(null, null);//  null;
            var closeLink = false;

            if (document.referrer.indexOf('sftest.svenskfast') != -1) {
            }
            else if (document.referrer.indexOf('svenskfast') != -1) {
                /*if (content.length > 50) {
                    infoBoxSize = new HSize(400, 150);
                }
                closeLink = true;*/
            }

            if (content.indexOf('SvD_SatellitePlayer') != -1) {
                infoBoxSize = new HSize(350, 300);
            }
          
                point = hittaMap.addPoint(new HPointRT90(pointRow.Y, pointRow.X), iconObj, 'externalPoints', content, infoBoxDisplayMode, null, infoBoxSize, closeLink);
                TDapplet.addPoint(i + 1, point, false, content);
            
            point = null;
        }
        hittaMap.addExtenalPointsListeners();
        callExternalPointsLoadedListeners();
    }
    ajaxCalls--;
}


function callWhenExternalPointsLoaded(fn)
{
    externalPointsLoadedListeners.push(fn);
}

function callExternalPointsLoadedListeners()
{
    for (var i=0; i < externalPointsLoadedListeners.length; i++)
    {
        externalPointsLoadedListeners[i]();
    }    
}

/* ------- Väderfunktioner/klasser ------ */

function WindDirection(degrees) {
    this.direction;
    this.text;
    if (degrees > 348.75 || degrees <= 11.25) {
        this.direction = 'N';
        this.text = 'Nord';
    } else if (degrees > 11.25 && degrees <= 33.75) {
        this.direction = 'NNE';
        this.text = 'Nord-nordost';
    } else if (degrees > 33.75 && degrees <= 56.25) {
        this.direction = 'NE';
        this.text = 'Nordost';    
    } else if (degrees > 56.25 && degrees <= 78.75) {
        this.direction = 'ENE';
        this.text = 'Ost-nordost';
    } else if (degrees > 78.75 && degrees <= 101.25) {
        this.direction = 'E';
        this.text = 'Ost';
    } else if (degrees > 101.25 && degrees <= 123.75) {
        this.direction = 'ESE';
        this.text = 'Ost-sydost';
    } else if (degrees > 123.75 && degrees <= 146.25) {
        this.direction = 'SE';
        this.text = 'Sydost';
    } else if (degrees > 146.25 && degrees <= 168.75) {
        this.direction = 'SSE';
        this.text = 'Syd-sydost';
    } else if (degrees > 168.75 && degrees <= 191.25) {
        this.direction = 'S';
        this.text = 'Syd';
    } else if (degrees > 191.25 && degrees <= 213.75) {
        this.direction = 'SSW';
        this.text = 'Syd-sydväst';
    } else if (degrees > 213.75 && degrees <= 236.25) {
        this.direction = 'SW';
        this.text = 'Sydväst';
    } else if (degrees > 236.25 && degrees <= 258.75) {
        this.direction = 'WSW';
        this.text = 'Väst-sydväst';
    } else if (degrees > 258.75 && degrees <= 281.25) {
        this.direction = 'W';
        this.text = 'Väst';
    } else if (degrees > 281.25 && degrees <= 303.75) {
        this.direction = 'WNW';
        this.text = 'Väst-nordväst';
    } else if (degrees > 303.75 && degrees <= 326.25) {
        this.direction = 'NW';
        this.text = 'Nordväst';
    } else {    
        this.direction = 'NNW';     
        this.text = 'Nord-nordväst';
    }
}

function WeatherStation(_id, _name) {
    this.id = _id;
    this.name = _name;
}
WeatherStation.prototype.getName=function() { return this.name; }
WeatherStation.prototype.getId=function() { return this.id; }
WeatherStation.stations=null;
WeatherStation.getStations=function() {
    if (null == WeatherStation.stations) {
        WeatherStation.stations = new Array();
        var response = Hitta.PublicWeb.Web.AjaxMethods.GetWeatherStations();
        if (null != response && null != response.value && 'object' == typeof(response.value)) {
            for (var i = 0; i < response.value.Rows.length; i++) {
                WeatherStation.stations.push(new WeatherStation(response.value.Rows[i].PKID, response.value.Rows[i].StationName));
            }
        }
    }
    return WeatherStation.stations;
}

WeatherStation.get=function(id) {
    var stations = WeatherStation.getStations();
    for (var i = 0; i < stations.length; i++) {
        if (id == stations[i].getId()) {
            return stations[i];
        }
    }
    return null;
}

/* Wrapper för informationen i en pointforecast-nod i XML-resultatet från vädertjänsten */
function WeatherPoint(p) {
    this.date;
    this.lat;
    this.lon;
    this.x;
    this.y;
    this.windDirection;
    this.windDirectionDegrees;
    this.windSpeed;
    this.symbol;
    this.temperature;
    this.source;
    this.init(p);
}

WeatherPoint.prototype.init = function(p) {
    this.lat = p.lat;
    this.lon = p.lon;
    this.windDirectionDegrees = p.winddirection;
    this.windDirectionText = '';
    this.windSpeed = Math.round(p.windspeed);
    this.symbol = p.symbol;
    this.temperature = Math.round(p.temperature);
    this.source = p.source;
    this.date = new Date(Date.parse(null == p.localtime ? p.datetime : p.localtime));
    var xy = CarmentaMap.getXY(this.lat, this.lon);
    this.x = xy.x;
    this.y = xy.y;
    if (CarmentaMap.zoomIndex <= 3 && pointId != null && pointId != -1 && this.x == pointId.x && this.y == pointId.y) {
        //Om väderinformationen och adresspunkten har samma koordinater flyttas väderikonens koordinater aningen åt nordväst.
        this.x -= (120 * CarmentaMap.zoomLevels[CarmentaMap.zoomIndex]);
        this.y += (80 * CarmentaMap.zoomLevels[CarmentaMap.zoomIndex]);
    }
    this.windDirection = new WindDirection(p.winddirection);
}

/* WeatherLayer klassen representerar en vädersymbol. */
function WeatherLayer(point) {
    this.x = parseInt(point.x);
    this.y = parseInt(point.y);
    this.symbol = parseInt(point.symbol);
    var point = CarmentaMap.addWeatherPoint(this.x, this.y, point.temperature, point.windDirection.direction, point.windSpeed, this.symbol);
}

var Weather = { 
    requestType: 'forecast' 
    ,visible: false
    ,onload: new EventHandler()
    ,smallIconsOverThisZoomLevel: -1
};

Weather.getRequestType=function() {
    return Weather.requestType;
}

Weather.setRequestType=function(type) {
    type = type.toLowerCase();
    switch (type) {
        case 'observation':
        case 'forecast':
            Weather.requestType=type;
            break;
        default:
            Weather.requestType='forecast';
            break;
    }
}

/* Laddar in väderdata i kartan */
Weather.load = function() {
    if (Weather.visible) {
        if ('observation' == Weather.getRequestType()) {
            Observation.load();
        } else {
            Forecast.load();
        }
    }
}

/* Observation innehåller metoder för att visa väderobservationer */
var Observation = {
    visible:false
};

Observation.show = function() {
    Weather.setRequestType('observation');
    if ('undefined' != typeof (fetchAjaxPoints)) {
        fetchAjaxPoints();
    } else {
        Observation.load();
    }
}

Observation.load = function() {

    if (Weather.visible && typeof (hittaMap) != 'undefined') {        
        ajaxCalls++;
        Weather.setRequestType('observation');
        WeatherToolbar.hideMessage();
        var bounds = hittaMap.map.getBounds();
        var min = hittaMap.map.fromRT90ToLatLng(bounds.ne);
        var max = hittaMap.map.fromRT90ToLatLng(bounds.sw);
        Hitta.PublicWeb.Web.AjaxMethods.GetObservationInArea(min.getLat(), max.getLng(), max.getLat(), min.getLng(), 10 - hittaMap.map.getZoom(), function() { });

        Weather.onload.invoke();
    } else if (Weather.visible) {
        window.setTimeout('Observation.load();', 50);
    }
}

Observation.render=function(response) {
    hittaMap.map.clearOverlaysByCategory('Weather');
    if (null != response && null != response.value && response.value.Rows.length > 0) {
        var rows = response.value.Rows;
        if (rows.length > 0) {
            for (var i = 0; i < rows.length; i++) {
            
                var position = hittaMap.map.fromLatLngToRT90(new HPointLatLng(rows[i].lat, rows[i].lon));
                var weatherSymbol = rows[i].symbol;
                var temperature = rows[i].temperature;
                var windDirection = rows[i].winddirection;
                var windSpeed = rows[i].windspeed;

                var weatherMarker = new HWeatherMarker(position, weatherSymbol, temperature, windDirection, windSpeed);

                hittaMap.map.addOverlay(weatherMarker, 'Weather');          
            }
        } else {
            hittaMap.map.zoomOut();
        }            
    }
    ajaxCalls--;
}

/* Forecast innehåller globala metoder för att hämta och rendera en väderprognos. */
var Forecast = {
    date: null,
    BASE_URL: "http://public.api.hitta.se/weather/forecast/"
}


Forecast.allowWeatherIconAdd = function(index)
{
    return (!isModularWeather() || (isModularWeather() && (index % 4 == 0 || hittaMap.map.getZoom() != 3)));
}

//Körs när Ajaxanropet i Forecast.load är klart. Ritar ut väderprognosen.
Forecast.render = function(data) {

    if (!isModularWeather())
        WeatherToolbar.hideMessage();

    hittaMap.map.clearOverlaysByCategory('Weather');

    if (null != data && data.measuring_points) {
        for (pointIndex = 0; pointIndex < data.measuring_points.length; pointIndex++) {
            Forecast.addMeasuringPoint(data.measuring_points[pointIndex]);
        }
    }
    else if (null != data && data.forecasts) { 
        Forecast.addMeasuringPoint(data);
    }

    ajaxCalls--;
}

Forecast.addMeasuringPoint = function(measuringPoint){
    for (forecastIndex = 0; forecastIndex < measuringPoint.forecasts.length; forecastIndex++) {
        var forecast = measuringPoint.forecasts[forecastIndex];

        var date = new Date(forecast.time);

        if (date.equals(Forecast.getDate())/* && Forecast.allowWeatherIconAdd(forecastIndex)*/) {

            var position = new HPointRT90(measuringPoint.north, measuringPoint.east);
            var weatherMarker = new HWeatherMarker(position, forecast.symbol, forecast.temperature, forecast.wind_direction, forecast.wind_speed);

            hittaMap.map.addOverlay(weatherMarker, 'Weather');
        }

    }
}

//Laddar prognosen
Forecast.load = function() {
    
    if (Weather.visible && typeof (hittaMap) != 'undefined') {
        ajaxCalls++;
        Weather.onload.invoke();

        var zoom = hittaMap.map.getZoom();
        
        // Snabbhack för att få fler ikoner på default-zoomnivå för det modulära vädret (Aftonbladets väder).
        if (isModularWeather() && hittaMap.map.getZoom() == 3)
            zoom = 4;

        if (hittaMap.map.getZoom() < 5) {
            //Hämtar ett antal fördefinierade punkter.
            var bounds = hittaMap.map.getBounds();
            var url = Forecast.BASE_URL + hittaMap.map.getResolution() + "/" + bounds.sw.north + ":" + bounds.sw.east + "," + bounds.ne.north + ":" + bounds.ne.east;
            HMapHelpers.getJSONP(url, Forecast.render, this);            
            Weather.onload.invoke();
        } else {
            //Hämtar en punkt från väderstjänsten.
            var center = hittaMap.map.getCenter();
            var url = Forecast.BASE_URL + center.north + ":" + center.east;
            HMapHelpers.getJSONP(url, Forecast.render, this);           
        }

    } else if (Weather.visible) {
        window.setTimeout('Forecast.load();', 10);
    }
}

//Returnerar Forecast.date.
Forecast.getDate=function() {
    if (null == Forecast.date) {
        Forecast.date = Date.today.addHours(15);
    }
    return Forecast.date;
}

//Sätter Forecast.date. Om refresh=false laddas prognosen inte om.
Forecast.setDate = function(date, refresh) {
    
    Weather.setRequestType('forecast');

    Forecast.date = new Date(date);
    createCookie('forecastDate', Forecast.date.toString('G'), 0);

    if ('undefined' == typeof (refresh) || refresh) {
        Forecast.load();
        /*if ('undefined' != typeof(fetchAjaxPoints)) { 
        fetchAjaxPoints(); 
        } else { 
        Forecast.load(); 
        }*/
    }
}

//Inträffar om något väderanrop timar ut
Forecast.timeout=function() {
    ajaxCalls--;
    WeatherToolbar.showMessage('Prognos saknas');
    return false;
}
/* ------- Slut Väderfunktioner ------ */



function fetchAjaxPoints(reason) {
    ajaxCalls = 0;

    if (!isModularWeather())
        Weather.load();
 
    if (typeof(reason) == 'undefined'){
        reason = 'unknown';            
    }
    
    if (!ajaxEnabled) {
        return;
    }
            
    if ('object' == typeof(Posten) && Posten.isVisible()) {
        Posten.load();
    }    
  
    fetchExternalPoints();
}

function fetchExternalPoints()
{ 
    if (MapMode.getMapMode() == 'app') {
        if (true == getExternalPoints && null != Map.mapPointHolder) {
            TDapplet.callWhenLoaded(function() { GetExternalObjects(Map.mapPointHolder.value); });
        } 
        if (Map.shouldGetExternalPointsFromUrl()) {
            TDapplet.callWhenLoaded(function() { GetExternalObjectsFromUrl(Map.mapPointUrl); });
        }    
    }
    else {
        if (Map.shouldGetExternalPointsFromUrl()) { 
             
            GetExternalObjectsFromUrl(Map.mapPointUrl);
        }  else{
            if (true == getExternalPoints && null != Map.mapPointHolder) {
                GetExternalObjects(Map.mapPointHolder.value);
            }           
        }
    }
}

// Function called by refresh timer
function syncFetchAjaxPoints() {
	fetchAjaxPoints('syncFetchAjaxPoints');
}

function hideInfoDiv() {
	document.getElementById("infoDiv").style.display = "none";
}

/* ------- Trafiknyttfunktioner ------- */
//Hämtar stationer och hållplatser.
function GetStations() {
	if (zoomlevel < 4) {
		var arrIconTypes = new Array();
		var arr = CarmentaMap.getBounds();	
		arrIconTypes[arrIconTypes.length] = "Lidingobanan";
		arrIconTypes[arrIconTypes.length] = "Nockebybanan";
		arrIconTypes[arrIconTypes.length] = "Roslagsbanan";
		arrIconTypes[arrIconTypes.length] = "Saltsjobanan";
		arrIconTypes[arrIconTypes.length] = "Pendeltag";
		arrIconTypes[arrIconTypes.length] = "Sparvagnstation";
		arrIconTypes[arrIconTypes.length] = "Tunnelbaneuppgang";
		arrIconTypes[arrIconTypes.length] = "Tunnelbanestation";
		try {
            ajaxCalls++;
			Hitta.PublicWeb.Web.AjaxMethods.GetMapPoints(arrIconTypes, parseInt(arr[0]), parseInt(arr[2]), parseInt(arr[1]), parseInt(arr[3]), parseInt(zoomlevel), GetStations_Callback);
		} catch(error) {
		    ajaxCalls--;
		}
	}
}

//Körs när ajaxanropet i GetStations är klart. Ritar ut stationer och hållplatser i kartan.
function GetStations_Callback(response) {
	try {
		var dsMapPoints = response.value;
		if(dsMapPoints != null && typeof(dsMapPoints) == "object" && dsMapPoints.Tables != null && dsMapPoints.Tables.length == 1) {	
			for (var i = 0; i < dsMapPoints.Tables[0].Rows.length; i++) {	
				CarmentaMap.addPoint(dsMapPoints.Tables[0].Rows[i].Y, dsMapPoints.Tables[0].Rows[i].X, '<b>' + dsMapPoints.Tables[0].Rows[i].HeaderText + '</b><br/>' + dsMapPoints.Tables[0].Rows[i].HtmlBody, dsMapPoints.Tables[0].Rows[i].MapPointType, dsMapPoints.Tables[0].Rows[i].StackingOrder);
			}			
			dsMapPoints = null;
		}
	} catch (error) {
	}
	ajaxCalls--;	
}

/* ------- Sök i karta funktioner ------- */
function Trunc(text, maxLength)
{
    if (text.length > maxLength)
        return text.substr(0,maxLength-3) + "...";
    else
        return text;
}
/* ------- Slut Sök i karta funktioner ------- */

/* -------------- Begin ProgressBar -------------- */
//Progressbar constructor
function ProgressBar(_parent, _icon, _width, _height) {
	this.parent = "object" == typeof(_parent) ? _parent : document.getElementById(_parent);
	this.icon = _icon;
	this.width = _width;
	this.height = _height;
	function init(what) {
	    if (what.parent) {
	        what.element = document.createElement('img');
	        what.element.border=0;
	        if (null != what.width) { what.element.style.width = what.width; }
	        if (null != what.height) { what.element.style.height = what.height; }
	        what.element.src=what.icon;
	        what.element.alt='Laddar...';
	        what.element.style.zIndex=10001;
	        what.element.style.position='absolute';
	        what.element.style.display='none';
	        what.element.style.left = '50%';
	        what.element.style.top = '50%';
	        what.element.style.display = 'none';
	        if (what.parent.offsetParent) {
	            what.parent.offsetParent.appendChild(what.element);
	        }
        }	        
	}
	init(this);
}
//Positionerar progressbar.
ProgressBar.prototype.position = function() {
    if (null == this.element || null == this.parent) { return; }
    this.element.style.left = (this.parent.offsetWidth / 2) - (this.element.offsetWidth / 2);
    this.element.style.top = (this.parent.offsetHeight / 2) - (this.element.offsetHeight / 2);
}
//Visar progressbar
ProgressBar.prototype.show = function() {
   	if (null == this.element) { return; }
	this.position();
	this.element.style.display = "block";
}
//Döljer progressbar
ProgressBar.prototype.hide = function() {    
	if (null == this.element) { return; }
	this.element.style.display = "none";
}
/* -------------- End ProgressBar -------------- */

function resize() {    

    if ('undefined' == typeof (CarmentaMap)) { return; }

    if (imgPreview) {
        positionImgDiv(imgLyr);
    }
    /*
    if ('undefined' != typeof (mapSearchTipContainer) && null != mapSearchTipContainer) {
        var width = window.innerWidth ? window.innerWidth : document.body.offsetWidth;
        var height = window.innerHeight ? window.innerHeight : document.body.offsetHeight;
        mapSearchTipContainer.style.display = width < 980 ? 'none' : '';
    }*/

    fetchAjaxPoints("resize");

    if (MapMode.getMapMode() != 'app')
        MapSearch.dynamicSearch();
    //else        
    TDapplet.resize();

    Map.onresize.invoke();    

}

//Hanterar fönstrets onresize event
function windowResizeHandler() {
    window.clearTimeout(resizeTimer);
    resizing = true;
    resizeTimer = window.setTimeout("resize()", 10);
}

/* Register resize event handlers */
if (window.attachEvent) {

    window.attachEvent("onresize", windowResizeHandler);
} else if (window.addEventListener) {

    window.addEventListener("resize", windowResizeHandler, false);
} else {

    window.onresize = windowResizeHandler;
}

function closeResultList(){
 
}

function positionPrintImage() { }



function openPrintMap() {
    var centerPoint = hittaMap.map.getCenter();
    var printUrl = "printMap.aspx?cx=" + centerPoint.east + "&cy=" + centerPoint.north + "&maptype=" + hittaMap.map.getMapType() + "&z=" + hittaMap.map.getZoom();
    printMapPoints = generatePointJSON();
    var printPage = window.open(printUrl, 'mapPrint', 'top=0,left=0,width=680,location=no,toolbar=no,directories=no,status=no,menubar=yes,scrollbars=yes,resizable=yes');
    printPage.focus();
}

function generatePointJSON() {
    var points = [];
    var markers = hittaMap.map.getMarkers(hittaMap.map.getBounds());
    for (var i = 0; i < markers.length; i++) {
        if (markers[i].getInfoBox()) {
            var point = {
                url: markers[i].getIcon(),
                north: markers[i].getRT90Point().north,
                east: markers[i].getRT90Point().east,
                text: escape(markers[i].getInfoBox().getContentContainer().innerHTML.replace(/<BR>/g, "<br>").replace(/<br><br>/g, "<br>").replace(/<br>/g, "1B1B").replace(/<\/?[^>]+(>|$)/g, "").replace(/1B1B/g, "<br/>").replace("Stäng", "").replace("Detaljerad info", "").replace("Se gatubild", ""))
            }
            points.push(point);
        }
    }

    if (points.length > 0) {
        return JSON.stringify(points);
    }

    return false;
}

