﻿
var MapJack = {
    MAPJACK_MINIMUM_FLASH_VERSION: "9.0.28",
    MAPJACK_ELEMENT_ID: "MapJackGUI",
    MAPJACK_CONTAINER_ELEMENT_ID: "mapjackContainer",
    MAPJACK_HMAP_ELEMENT_ID: "mapContainer",
    MAPJACK_HELP_ID: "mapjackHelp",
    MAPJACK_STREETVIEW_ID: "makeLink",
    MAPJACK_OUTER_DIV_ID: "mapjackOuterDiv",
    gatubildCities: [{ city: 'Stockholm', centerPoint: new HPointRT90(6580986, 1628286), bounds: new HBoundsRT90(new HPointRT90(6567024, 1607824), new HPointRT90(6597614, 1645134)) },
                     { city: 'Göteborg', centerPoint: new HPointRT90(6403880, 1271603), bounds: new HBoundsRT90(new HPointRT90(6386624, 1258824), new HPointRT90(6419424, 1291024)) },
                     { city: 'Malmö', centerPoint: new HPointRT90(6167903, 1323219), bounds: new HBoundsRT90(new HPointRT90(6155424, 1312024), new HPointRT90(6185224, 1344024)) },
                     { city: 'Borlänge', centerPoint: new HPointRT90(6707246, 1479259), bounds: new HBoundsRT90(new HPointRT90(6714224, 1471624), new HPointRT90(6697624, 1488624)) },
                     { city: 'Borås', centerPoint: new HPointRT90(6403129, 1328883), bounds: new HBoundsRT90(new HPointRT90(6420624, 1309024), new HPointRT90(6386024, 1350624)) },
                     { city: 'Eskilstuna', centerPoint: new HPointRT90(6583425, 1539834), bounds: new HBoundsRT90(new HPointRT90(6570424, 1523024), new HPointRT90(6593224, 1551824)) }, // Needs centerpoint check
                     {city: 'Falun', centerPoint: new HPointRT90(6720846, 1490988), bounds: new HBoundsRT90(new HPointRT90(6713954, 1481614), new HPointRT90(6731594, 1510384)) }, // Needs centerpoint check
                     {city: 'Gävle', centerPoint: new HPointRT90(6729428, 1573547), bounds: new HBoundsRT90(new HPointRT90(6749628, 1548622), new HPointRT90(6710615, 1594824)) },
                     { city: 'Halmstad', centerPoint: new HPointRT90(6286631, 1319729), bounds: new HBoundsRT90(new HPointRT90(6295624, 1307424), new HPointRT90(6278824, 1330224)) },
                     { city: 'Helsingborg', centerPoint: new HPointRT90(6217235, 1306186), bounds: new HBoundsRT90(new HPointRT90(6224099, 1302024), new HPointRT90(6208424, 1316224)) },
                     { city: 'Jönköping', centerPoint: new HPointRT90(6407783, 1402321), bounds: new HBoundsRT90(new HPointRT90(6412625, 1396888), new HPointRT90(6396415, 1411918)) },
                     { city: 'Kalmar', centerPoint: new HPointRT90(6281756, 1534049), bounds: new HBoundsRT90(new HPointRT90(6294620, 1524427), new HPointRT90(6277022, 1537625)) },
                     { city: 'Karlskrona', centerPoint: new HPointRT90(6226423, 1486282), bounds: new HBoundsRT90(new HPointRT90(6237813, 1481025), new HPointRT90(6217628, 1501827)) },
                     { city: 'Karlstad', centerPoint: new HPointRT90(6586454, 1368938), bounds: new HBoundsRT90(new HPointRT90(6574794, 1355894), new HPointRT90(6602624, 1387824)) }, // Needs centerpoint check
                     {city: 'Kristianstad', centerPoint: new HPointRT90(6211859, 1397128), bounds: new HBoundsRT90(new HPointRT90(6202024, 1384424), new HPointRT90(6223224, 1411024)) }, // Needs centerpoint check
                     {city: 'Linköping', centerPoint: new HPointRT90(6476983, 1489498), bounds: new HBoundsRT90(new HPointRT90(6482759, 1479174), new HPointRT90(6470705, 1496236)) },
                     { city: 'Luleå', centerPoint: new HPointRT90(7290637, 1793002), bounds: new HBoundsRT90(new HPointRT90(7276824, 1780024), new HPointRT90(7306924, 1822024)) }, // Needs centerpoint check
                     {city: 'Lund', centerPoint: new HPointRT90(6178258, 1335459), bounds: new HBoundsRT90(new HPointRT90(6174420, 1315069), new HPointRT90(6159131, 1341264)) },
                     { city: 'Norrköping', centerPoint: new HPointRT90(6497113, 1522030), bounds: new HBoundsRT90(new HPointRT90(6506363, 1511321), new HPointRT90(6489153, 1532624)) },
                     { city: 'Skövde', centerPoint: new HPointRT90(6475721, 1385740), bounds: new HBoundsRT90(new HPointRT90(6468824, 1376424), new HPointRT90(6485024, 1397424)) }, // Needs centerpoint check
                     {city: 'Sundsvall', centerPoint: new HPointRT90(6920391, 1578136), bounds: new HBoundsRT90(new HPointRT90(6945026, 1553922), new HPointRT90(6895329, 1606426)) },
                     { city: 'Södertälje', centerPoint: new HPointRT90(6564658, 1604095), bounds: new HBoundsRT90(new HPointRT90(6569424, 1596821), new HPointRT90(6556621, 1611221)) },
                     { city: 'Trollhättan', centerPoint: new HPointRT90(6467960, 1294366), bounds: new HBoundsRT90(new HPointRT90(6458224, 1283624), new HPointRT90(6484424, 1309824)) }, // Needs centerpoint check
                     {city: 'Umeå', centerPoint: new HPointRT90(7087926, 1719505), bounds: new HBoundsRT90(new HPointRT90(7071424, 1703624), new HPointRT90(7095824, 1728424)) }, // Centerpoint needs check
                     {city: 'Uppsala', centerPoint: new HPointRT90(6639121, 1602775), bounds: new HBoundsRT90(new HPointRT90(6647024, 1592626), new HPointRT90(6626822, 1615221)) },
                     { city: 'Västerås', centerPoint: new HPointRT90(6609984, 1542139), bounds: new HBoundsRT90(new HPointRT90(6602824, 1532224), new HPointRT90(6618424, 1550624)) }, // Centerpoint needs check
                     {city: 'Växjö', centerPoint: new HPointRT90(6307928, 1438856), bounds: new HBoundsRT90(new HPointRT90(6313201, 1431829), new HPointRT90(6301454, 1445017)) },
                     { city: 'Örebro', centerPoint: new HPointRT90(6573217, 1466238), bounds: new HBoundsRT90(new HPointRT90(6563224, 1453624), new HPointRT90(6582624, 1478224)) },
                     { city: 'Östersund', centerPoint: new HPointRT90(7007325, 1441228), bounds: new HBoundsRT90(new HPointRT90(6997424, 1429424), new HPointRT90(7016424, 1452824))}], // Centerpoint needs check
    swfHeight: 368,
    mj: null,
    splitter: null,
    mapTypeControl: null,
    splitterMovable: null,
    isLoaded: false,
    statusUpdateListener: null,
    loadedListener: null,
    turning: false,
    msgContainer: null,     // used for "Flash required" error message
    mapjackHelp: null,
    makeLink: null,
    goToPointWithParams: true,
    eventHandle: null,
    checkPlace: true,
    isHealthy: false,

    load: function () {
        if (!swfobject.hasFlashPlayerVersion(MapJack.MAPJACK_MINIMUM_FLASH_VERSION)) {
            var playerVersion = swfobject.getFlashPlayerVersion();
            MapJack.showFlashVersionMsg(playerVersion.major + "." + playerVersion.minor + "." + playerVersion.release);
            return;
        }
        if (!MapJack.makeLink) {
            MapJack.showLink();
        }

        if (!document.getElementById(MapJack.MAPJACK_ELEMENT_ID)) {
            MapJack.embedFlash(MapJack.swfHeight);
        } else {
            document.getElementById(MapJack.MAPJACK_OUTER_DIV_ID).style.display = 'block';
        }

        if (!MapJack.isLoaded) {
            MapJack.start();

            if (MapSearch) {
                MapSearch.singleHitCallback = MapJack.centerAndTurnAvatar;
            }
        }
    },

    reset: function () {

        MapJack.mj = null;
        MapJack.splitter = null;
        MapJack.mapTypeControl = null;
        MapJack.splitterMovable = null;
        MapJack.isLoaded = false;
        MapJack.statusUpdateListener = null;
        MapJack.loadedListener = null;
        MapJack.turning = false;
        MapJack.msgContainer = null;     // used for "Flash required" error message
        MapJack.mapjackHelp = null;
        MapJack.makeLink = null;
        MapJack.goToPointWithParams = true;
        MapJack.eventHandle = null;
        MapJack.checkPlace = true;
        MapJack.isHealthy = false;

        HEvent.clearSource(MapJack);
        HEvent.clearSource(HViewer);

        MapJack.isLoaded = false;
    },

    unload: function () {

        if (MapJack.makeLink) {
            document.getElementById('outerMapContainer').removeChild(MapJack.makeLink);
            MapJack.makeLink = null;
        }

        if (MapJack.mapjackHelp) {
            document.getElementById('outerMapContainer').removeChild(MapJack.mapjackHelp);
            MapJack.mapjackHelp = null;
        }

        if (MapJack.msgContainer) {
            document.getElementById('outerMapContainer').removeChild(MapJack.msgContainer);
            MapJack.msgContainer = null;
        }
        else {
            HViewer.remove();
            MapJack.msgContainer = null;
            MapJack.unembedFlash();
        }

        document.getElementById(MapJack.MAPJACK_HMAP_ELEMENT_ID).style.height = '100%';
        document.getElementById(MapJack.MAPJACK_HMAP_ELEMENT_ID).style.top = '0px';
        document.getElementById('mapjackSplitter').style.display = 'none';

        hittaMap.map.checkResize();
        MapSearch.singleHitCallback = null;

        MapJack.reset();

    },

    /**
    * Loads and embeds flash object in page
    */
    embedFlash: function (swfHeight) {
        var flashvars = {};

        flashvars.pictureUrl = "http://bf.static.hitta.se/static/v1/mapjack/Pictures";
        flashvars.dataUrl = "http://bf.static.hitta.se/static/v1/mapjack/Data";

        var params = {};
        params.quality = "autohigh";
        params.menu = "false";
        params.align = "middle";
        params.play = true;
        params.loop = false;
        params.scale = "showall";
        params.wmode = "transparent";
        params.devicefont = false;
        params.allowScriptAccess = "sameDomain";
        params.allowFullScreen = false;
        params.salign = "";

        var attributes = {};
        attributes.id = MapJack.MAPJACK_ELEMENT_ID;

        swfobject.embedSWF(appRootpath + 'MapJack/MapJackGUI.swf', MapJack.MAPJACK_CONTAINER_ELEMENT_ID, "100%", swfHeight, MapJack.MAPJACK_MINIMUM_FLASH_VERSION, false, flashvars, params, attributes);
    },

    unembedFlash: function () {
        document.getElementById('mapjackOuterDiv').style.display = 'none';
        MapJack.mj = null;
    },

    /**
    * Initializes viewer when Flash client has loaded. HViewer
    * integrates the MapJack Flash client with the Hitta map.
    */
    start: function () {
        MapJack.mj = document.getElementById(MapJack.MAPJACK_ELEMENT_ID);
        if (!(MapJack.mj && MapJack.mj.navigateTo)) {
            setTimeout("MapJack.start()", 200);
            return;
        }

        MapJack.finalStages();
    },

    finalStages: function () {
        HViewer.initialize(MapJack.mj, hittaMap.map);

        // Center map on valid data if we are off in the bushes somewhere...
        var centerPoint = hittaMap.map.getCenter();
        var isPositioned = false;
        for (var i = 0; i < MapJack.gatubildCities.length; i++) {
            if (MapJack.gatubildCities[i].bounds.containsRT90(centerPoint)) {
                HViewer.setAvatarPosition(centerPoint);
                isPositioned = true;
            }
        }
        if (!isPositioned) {
            HViewer.avatar.setRT90Point(new HPointRT90(6581028, 1628112));
        }
        HViewer.avatar.setZIndex(3000000);
        /*if (hittaMap.map.getCenter().north > 6610984 || hittaMap.map.getCenter().north < 6557504 || hittaMap.map.getCenter().east < 1611744 || hittaMap.map.getCenter().east > 1656404) {
        HViewer.avatar.setRT90Point(new HPointRT90(6581028, 1628112));
        } else {
        HViewer.avatar.setRT90Point(hittaMap.map.getCenter());
        }*/
        hittaMap.map.setCenter(HViewer.avatar.getRT90Point());
        // If the user has not selected a zoom level, the default zoom level is 6.
        if (!MapModeControl.isZoomSelected) {
            hittaMap.map.setZoom(6);
        }

        MapJack.splitterMovable = new Movable(document.getElementById('mapjackSplitter'));
        MapJack.splitterMovable.endMoveCallback = function () { MapJack.setSizeAndPosition(true); MapJack.splitter.style.borderColor = "black"; hittaMap.map.checkResize(); MapSearch.positionHitlist(); };
        MapJack.splitterMovable.lockVertical = true;

        MapJack.splitter = document.getElementById('mapjackSplitter');
        MapJack.splitter.style.display = 'block';
        MapJack.splitterMovable.initMoveCallback = function () { MapJack.splitter.style.borderColor = "white"; };

        MapJack.setSizeAndPosition();
        hittaMap.map.checkResize();
        if (MapJack.checkPlace) {
            MapJack.checkPlaceUrl();
            MapJack.checkPlace = false;
        }

        MapSearch.positionHitlist();
        /*if (readCookie('doNotShowHelpAgain') != '1') {
        MapJack.showHelpText();
        MapJack.positionHelpText();
        }*/
        MapJack.isLoaded = true;

        if (typeof (MapJack.loadedListener) == 'function') {
            MapJack.loadedListener();
        }

        var statusUpdateHandle = HEvent.addListener(HViewer, HViewer.EVENT_STATUS_UPDATE, function (rt90point, heading) { MapJack.statusUpdateCallback(rt90point, heading, statusUpdateHandle); });

        MapJack.selfTest();
        HEvent.trigger(MapJack, "isLoaded");
    },

    /**
    * Updates the size and position of both the map area and the
    * MapJack area according to screen size. Typically called after a window resize.
    */
    setSizeAndPosition: function (splitChanged) {
        if (MapJack.mj && MapJack.mj.navigateTo) {
            var screenHeight = document.getElementById('outerMapContainer').offsetHeight;
            var visibleMapHeight = screenHeight - _MapToolbarsTop.getHeight();
            var mapPortion = splitChanged ? (MapJack.splitter.offsetTop - _MapToolbarsTop.getHeight()) / visibleMapHeight : 0.65;
            var mapElem = document.getElementById(MapJack.MAPJACK_HMAP_ELEMENT_ID);
            var mapJackElem = document.getElementById(MapJack.MAPJACK_ELEMENT_ID);
            var mapJackHeight = parseInt(visibleMapHeight * mapPortion);
            var mapHeight = parseInt(visibleMapHeight * (1 - mapPortion));



            mapElem.style.height = (mapHeight - 1) + 'px';
            mapJackElem.style.height = mapJackHeight;

            mapJackElem.style.top = _MapToolbarsTop.getHeight() + 'px';
            MapJack.splitter.style.top = _MapToolbarsTop.getHeight() + mapJackHeight;



            if (MapJack.makeLink) {
                MapJack.makeLink.style.top = (_MapToolbarsTop.getHeight() + mapJackHeight - 31) + 'px';
            }

            mapElem.style.top = (_MapToolbarsTop.getHeight() + mapJackHeight) + 'px';

            MapJack.embedFlash(mapJackHeight - 1);
            HViewer.navigateToRT90(HViewer.avatar.getRT90Point(), true);
        }
    },

    checkPlaceUrl: function () {
        //  if (!MapJack.goToPointWithParams) { return; }

        var params = HMapHelpers.parseUrl(document.location.search);
        var point;

        if (!params.gvX || !params.gvY) {
            return;
        } else {
            point = new HPointRT90(parseInt(params.gvX), parseInt(params.gvY));
            MapJack.goToPointWithParams = false;
        }

        // turn avatar to given heading, or calculated heading if point is not same as avatar location
        MapJack.statusUpdateListener = HEvent.addListener(HViewer, HViewer.EVENT_STATUS_UPDATE,
            function (currentPoint, heading) {
                if (params.gvH) {
                    HViewer.turnTo(parseFloat(params.gvH));
                } else if (!currentPoint.equals(point)) {
                    HViewer.turnToRT90(point);
                }

                HEvent.removeListener(MapJack.statusUpdateListener);
            }
        );

        HViewer.navigateToRT90(point, true);
    },
    positionHelpText: function () {
        var el = MapJack.mapjackHelp;
        var parent = el.parentNode;
        var height;
        height = _MapToolbarsTop.getHeight();

        el.style.position = 'absolute';
        el.style.left = '20px';
        el.style.top = (height + 20) + 'px';
    },
    showHelpText: function () {
        if (MapJack.mapjackHelp) { MapJack.mapjackHelp.style.display = ''; return; };
        var _html;
        MapJack.mapjackHelp = document.createElement('div');
        var paddedDiv = document.createElement('div');
        var innerDiv = document.createElement('div');

        MapJack.mapjackHelp.id = MapJack.MAPJACK_HELP_ID;
        paddedDiv.innerHTML = 'Se dig omkring genom att klicka och dra i bilden. Klicka på de blå cirklarna för att gå i bilden. Byt plats genom att dra och flytta figuren i kartan, eller klicka i kartan dit du vill.';
        paddedDiv.style.padding = "8px";
        //_html = '<label for="cbDoNotShowHelpAgain">Visa inte igen</label><input class="CheckBox" type="checkbox" id="cbDoNotShowHelpAgain"/>';

        _html = '<span id="mapjackHelpLink" class="tinyTextGrey" style="float:right; position:relative; top:-10px" onclick="javascript:document.getElementById(\'mapjackHelp\').style.display=\'none\';">Stäng</span>';
        innerDiv.innerHTML = _html;
        paddedDiv.appendChild(innerDiv);
        MapJack.mapjackHelp.appendChild(paddedDiv);
        document.getElementById('outerMapContainer').appendChild(MapJack.mapjackHelp);
    },

    showLink: function () {
        MapJack.makeLink = document.createElement('div');
        MapJack.makeLink.style.position = 'absolute';
        MapJack.makeLink.style.left = '70px';
        MapJack.makeLink.style.zIndex = '10000';

        var linkImg = document.createElement('img');
        linkImg.src = appRootpath + 'images/hmap/save_streetview_link.gif';
        linkImg.style.cursor = 'pointer';
        linkImg.alt = 'Skapa länk till aktuell vy';
        linkImg.id = "mjLink";


        linkImg.onclick = function () {
            var link = document.getElementById('linkText');
            link.value = MapJack.getLink();
            link.style.display = 'inline';
        }

        HEvent.addListener(HViewer, HViewer.EVENT_STATUS_UPDATE, function () {
            document.getElementById('linkText').style.display = 'none';
        });

        var linkText = document.createElement('input');
        linkText.id = 'linkText';
        linkText.type = 'text';
        linkText.onclick = function () { this.select(); };
        linkText.className = 'streetViewLinkText';

        MapJack.makeLink.appendChild(linkImg);
        MapJack.makeLink.appendChild(linkText);

        document.getElementById('outerMapContainer').appendChild(MapJack.makeLink);
    },

    getLink: function () {
        var url = String(document.location).toLowerCase().split('largemap.aspx')[0] + 'LargeMap.aspx?gatubild&';
        var location = HViewer.avatar.getRT90Point();
        var heading = Math.ceil(HViewer.getHeading());
        url += 'gvX=' + location.north + '&gvY=' + location.east + '&gvH=' + heading;
        return url;
    },

    showFlashVersionMsg: function (current) {
        var screenHeight = document.getElementById('outerMapContainer').offsetHeight;
        var visibleMapHeight = screenHeight - _MapToolbarsTop.getHeight();
        var mapElem = document.getElementById(MapJack.MAPJACK_HMAP_ELEMENT_ID);
        var msgHeight = 100;
        var mapHeight = visibleMapHeight - msgHeight;

        MapJack.msgContainer = document.createElement("div");

        MapJack.msgContainer.style.position = "absolute";
        MapJack.msgContainer.style.width = "100%";
        MapJack.msgContainer.style.height = msgHeight;
        MapJack.msgContainer.style.top = _MapToolbarsTop.getHeight() + 'px';

        var msg = '<div style="margin: 15px; padding: 10px; border: 1px solid #ccc; background-color: #faa;">';
        if (current == "0.0.0") {
            msg += "Hitta.se Gatubild kräver Flash.";
        } else {
            msg += "Hitta.se Gatubild kräver en senare version av Flash än den du har installerad.";
        }
        msg += '<br /><a href="http://get.adobe.com/flashplayer/">Hämta och installera Adobe Flash Player här.</a></div>';

        MapJack.msgContainer.innerHTML = msg;

        document.getElementById('outerMapContainer').appendChild(MapJack.msgContainer);

        mapElem.style.height = (mapHeight - 1) + 'px';
        mapElem.style.top = _MapToolbarsTop.getHeight() + msgHeight + 'px';

        MapJack.isLoaded = true;
    },

    centerAndTurnAvatar: function () {
        var hit = MapModeControl.getHit();
        var point = new HPointRT90(hit.xPos, hit.yPos);
        HViewer.navigateToRT90(point, true);
        MapJack.statusUpdateListener = HEvent.addListener(HViewer, HViewer.EVENT_STATUS_UPDATE, function (point, heading) {
            MapJack.turnAvatar(point, heading, true);
            HEvent.removeListener(MapJack.statusUpdateListener);
        });
        if (!MapJack.checkPoint(point)) {
            MapModeControl.showStreetviewPopup();
        }
    },

    turnAvatar: function (point, heading, removeEvent) {
        HViewer.turnToRT90(hittaMap.map.getCenter());

        window.setTimeout("HEvent.removeListener(MapJack.statusUpdateListener)", 500);
    },

    hasGatubildAtCurrentLocation: function () {
        var returnValue = false;
        var centerPoint = hittaMap.map.getCenter();
        returnValue = MapJack.checkPoint(centerPoint);
        return returnValue;
    },

    checkPoint: function (centerPoint) {
        for (i = 0; i < MapJack.gatubildCities.length; i++) {
            if (MapJack.gatubildCities[i].bounds.containsRT90(centerPoint)) {
                return true;
            }
        }
        return false;
    },

    /**
    * To combat Safari bug whereby revisiting the page showed a white screen
    * instead of the MapJack Flash app.
    */
    selfTest: function () {

        if (MapJack.isHealthy) {
            MapJack.setSizeAndPosition(true);
            hittaMap.map.checkResize();
            hittaMap.map.setCenter(HViewer.avatar.getRT90Point());
            return;
        }

        if (HViewer.avatar && MapJack.mj.navigateTo) {
            HViewer.navigateToRT90(HViewer.avatar.getRT90Point(), true);
        }

        setTimeout("MapJack.selfTest()", 500);
    },

    statusUpdateCallback: function (rt90point, heading, handle) {
        MapJack.isHealthy = true;
        HEvent.removeListener(handle);
    }
}


