var tdPositionTimer = null;

function statisticsReport(uid, status, description){
    HMapHelpers.initJSONP("http://hitta-3d2.mon.pi.se/JavaLog/Log?data=" + encodeURIComponent( uid + ";" + status + ";" + description ) );
}


function javaLoading(status) {
    var src = 'http://eas.hitta.se/eas?cu=1095;kw=madlix_javaloading_' + status.replace(" ", "_") + "_" + browser;
    new Image().src = src;    
}


function javaCertificateFailed() {
    var src = 'http://eas.hitta.se/eas?cu=1095;kw=madlix_certificate_failed_' + browser;
    new Image().src = src;
}

function localRegionChanged(x1, y1, x2, y2, x3, y3, x4, y4) 
{
    window.clearTimeout(tdPositionTimer);
    tdPositionTimer = window.setTimeout("localRegionChangedFinished()", 1000);   
    TDapplet.hasStopped = false; 
}

function localRegionChangedFinished()
{
    TDapplet.hasStopped = true;
    //fetchAjaxPoints("3D pos change");    
    if (TDapplet.autoFocusing)
        TDapplet.autoFocusing = false;
    else
    {
        MapSearch.dynamicSearch('3D pos change');
        
        if (largeMap && hasExternalPoints)
            fetchExternalPoints();
    }
}

// Anropas av appen när den laddats klart.
function systemInfo(osName, detailLevel, aero, vistaSp1, javaVersion)
{
    callLoadedListeners();
}

function callLoadedListeners()
{
    if (TDapplet.respondsToCalls())
    {        
        TDapplet.isLoaded = true;
        for (var i=0; i<TDapplet.loadedListeners.length; i++)
        {
            TDapplet.loadedListeners[i]();
        }
    }    
    else
    {
        window.setTimeout('callLoadedListeners()', 250);
    }
}

function copyrightClicked(owner) {    
    switch(owner) {
        case "0":
            window.location = 'http://www.agency9.com' ;
            break;
       
        case "2":
            window.location = 'http://www.c3technologies.com';
            break;
    }
}


// Behövs eftersom applet försöker anropa funktionen vid givna tillfällen.
function deviceError(message)
{
}

// Behövs eftersom applet försöker anropa funktionen vid givna tillfällen.
function usedMapData(data)
{
}

function TDpoint (x,y,text) {
    this.x = x;
    this.y = y;

    // Do some neccessary character replacements                    
    var newText = text.replace(/\r\n/g, '\\\\');        
    newText = newText.replace(/<br \/>/g, '\\\\').replace(/<br>/g, '\\\\');
    
    // Remove any HTML content from tooltip text as the 3D applet can't display this.
    newText = stripHtml(newText);      
    
    this.text = newText;
}

var TDapplet = {

    loadedListeners: [],
    points: [],
    idPoint: null,
    labelMarkerAppearance: 'id',
    appRootPath: '',
    isFullScreen: true,
    width: 0,
    height: 0,
    style: '',
    applet: null,
    mapDiv: null,
    isVisible: false,
    isLoaded: false,
    hasStopped: false,
    minX: 0,
    maxX: 0,
    minY: 0,
    maxY: 0,
    dragging: false,
    cx: 0,
    cy: 0,
    pitch: 90,
    direction: 0,
    outShown: false,
    autoFocusing: false,

    mapDiv: function () {
        return document.getElementById('3DMapDiv');
    },

    init: function (hittaPath, isFullScreen, width, height, style) {

        TDapplet.appRootPath = hittaPath;
        TDapplet.isVisible = false;
        TDapplet.width = width;
        TDapplet.height = height;

        // Frivilliga parametrar
        if (typeof (isFullScreen != 'undefined'))
            TDapplet.isFullScreen = isFullScreen;

    },

    respondsToCalls: function () {
        return (TDapplet.applet && TDapplet.applet.call('cameraPositionRT90Res') != null);
    },

    call: function (method) {
        var call = "TDapplet.applet.call('" + method + "'";

        try {
            for (i = 1; i < arguments.length; i++) {
                call += ", '" + String(arguments[i]).replace(/'/g, "") + "'";
            }

            call += ');';

            if (TDapplet.respondsToCalls()) {
                //can call directly
                return String(eval(call));
            }
            else {
                //begin waiting for valid call
                return TDapplet.waitForValidCall(call);
            }
        }
        catch (ex) {
            throw (ex);
        }
    },

    waitForValidCall: function (call) {
        if (!TDapplet.respondsToCalls()) {
            //still waiting for valid call
            window.setTimeout("TDapplet.waitForValidCall(\"" + call + "\")", 100);
        }
        else {
            //waiting complete. calling...
            return String(eval(call));
        }
    },

    offsetAndRepos: function (cx, cy, z, res) {
        TDapplet.offsetPosition(cx, cy, z, res);
        //TDapplet.applet.call('relocateCameraRt90Res', TDapplet.cy, TDapplet.cx,  Map.getResolutionFromZoomLevel(), 'a');
        TDapplet.call('relocateCameraRt90Res', TDapplet.cy, TDapplet.cx, Map.getResolutionFromZoomLevel(), true, 'a');
    },

    forceRelocate: function () {
        //TDapplet.applet.call('relocateCameraRt90Res', TDapplet.cy, TDapplet.cx,  Map.getResolutionFromZoomLevel(), 'a');
        TDapplet.call('relocateCameraRt90Res', TDapplet.cy, TDapplet.cx, Map.getResolutionFromZoomLevel(), true, 'a');
    },

    // Används när vi växlar TILL 3D-läget. Då ska vi alltid ta med träfflistans vidd i beräkningen.
    offsetPosition: function (cx, cy, z, res) {

        if (typeof (res) == 'undefined') {
            //res = CarmentaMap.zoomLevels[z];
            res = HMap.ZOOM_LEVELS[10 - z];
        }

        resultWidth = largeMap && typeof (MapSearch) != 'undefined' ? MapSearch.getHitlistWidth(true) : 0;
        var newx = cx + Math.round(((resultWidth * res) / 2));
        var newy = cy - Math.round(((_MapToolbarsTop.getHeight() * res) / 2));

        if (TDapplet.cx != newx || TDapplet.cy != newy) {
            TDapplet.cx = newx;
            TDapplet.cy = newy;
            return true;
        }
        else
            return false;

    },

    panNorth: function () {
        TDapplet.pan('north');
    },

    panSouth: function () {
        TDapplet.pan('south');
    },

    panEast: function () {
        TDapplet.pan('east');
    },

    panWest: function () {
        TDapplet.pan('west');
    },

    panNorthWest: function () {
        TDapplet.pan('northwest');
    },

    panNorthEast: function () {
        TDapplet.pan('northeast');
    },

    panSouthWest: function () {
        TDapplet.pan('southwest');
    },

    panSouthEast: function () {
        TDapplet.pan('southeast');
    },

    pan: function (direction) {
        var distance = 100;
        var pos = TDapplet.getPosition();
        var cx = Math.round(pos[0]);
        var cy = Math.round(pos[1]);
        var res = pos[2];
        var newx = cx;
        var newy = cy;

        if (direction == 'north')
            newx = cx + Math.round(distance * res);
        else if (direction == 'south')
            newx = cx - Math.round(distance * res);
        else if (direction == 'west')
            newy = cy - Math.round(distance * res);
        else if (direction == 'east')
            newy = cy + Math.round(distance * res);
        else if (direction == 'northeast') {
            newx = cx + Math.round(distance * res);
            newy = cy + Math.round(distance * res);
        }
        else if (direction == 'northwest') {
            newx = cx + Math.round(distance * res);
            newy = cy - Math.round(distance * res);
        }
        else if (direction == 'southeast') {
            newx = cx - Math.round(distance * res);
            newy = cy + Math.round(distance * res);
        }
        else if (direction == 'southwest') {
            newx = cx - Math.round(distance * res);
            newy = cy - Math.round(distance * res);
        }

        TDapplet.setPosition(newy, newx, res);
    },

    getZoomLevel: function () {

        if (TDapplet.applet != null) {
            var params = TDapplet.call('CameraPositionRt90Res');
            return Map.getZoomLevelFromResolution(params.split(';')[2]);
        }
        else
            return 10;
    },

    getPosition: function () {
        var result = null;
        if (TDapplet.applet) {
            var pos = TDapplet.call('cameraPositionRT90Res');
            if (pos != null) {
                result = pos.split(';')
            }
            return result;
        }
        else
            return "";
    },

    testArr: function () {
        var arr = TDapplet.pos.split(';');
        document.getElementById('miniDebug').innerHTML += '<br />' + arr.length;
    },

    setPosition: function (x, y, res, isAutoFocus) {
        if (TDapplet.applet) {
            TDapplet.autoFocusing = true;
            TDapplet.call("RelocateCameraRt90Res", y, x, res, true, 'a');
        }
    },

    // Relocates the camera to the new position (x, y) while preserving the camera's pitch, heading and altitude
    setPositionLockedCamera: function (x, y) {
        if (TDapplet.applet) {
            TDapplet.autoFocusing = true;
            var cameraPosition = TDapplet.call('CameraPositionRt90Alt');
            var altitude = parseFloat(cameraPosition.split(';')[2]);

            var cameraOrientation = TDapplet.call('CameraOrientation');
            var heading = parseFloat(cameraOrientation.split(';')[0]);
            var pitch = parseFloat(cameraOrientation.split(';')[1]);

            var distanceToObject = Math.tan(Math.PI * (90 + pitch) / 180) * altitude;
            var cameraPitch = (Math.atan(distanceToObject / altitude) * 180 / Math.PI) - 90;

            TDapplet.setCameraFocalPoint(y, x, distanceToObject, heading, altitude);
        }
    },

    setCameraFocalPoint: function (focalNorth, focalEast, cameraDistance, cameraDirection, cameraHeight, animation) {
        var transition = arguments[5] || 'a';
        var oposite = cameraDistance;
        var adjacent = cameraHeight;
        var cameraPitch = (Math.atan(oposite / adjacent) * 180 / Math.PI) - 90;
        var yOffset = cameraDistance * Math.cos(cameraDirection * Math.PI / 180);
        var xOffset = cameraDistance * Math.sin(cameraDirection * Math.PI / 180);
        var cameraNorth = focalNorth - yOffset;
        var cameraEast = focalEast + xOffset;

        if (TDapplet.applet) {
            TDapplet.autoFocusing = true;
            TDapplet.call('RelocateCameraRt90AltDir', cameraNorth, cameraEast, cameraHeight, cameraDirection, cameraPitch, transition);
        }
    },

    getCameraFocalPoint: function () {
        var cameraPosition = TDapplet.call('CameraPositionRt90Alt');
        var xpos = parseFloat(cameraPosition.split(';')[0]);
        var ypos = parseFloat(cameraPosition.split(';')[1]);
        var altitude = parseFloat(cameraPosition.split(';')[2]);

        var cameraOrientation = TDapplet.call('CameraOrientation');
        var heading = parseFloat(cameraOrientation.split(';')[0]);
        var pitch = parseFloat(cameraOrientation.split(';')[1]);

        var distanceToObject = Math.tan(Math.PI * (90 + pitch) / 180) * altitude;

        var northOffset = Math.sin(Math.PI * heading / 180) * distanceToObject;
        var eastOffset = Math.cos(Math.PI * heading / 180) * distanceToObject;
        var xObject = parseInt(xpos + eastOffset);
        var yObject = parseInt(ypos - northOffset);

        return new HPointRT90(yObject, xObject);
    },

    setCameraPositionDirection: function (x, y, alt, pitch, direction, animation) {
        if (TDapplet.applet) {
            TDapplet.autoFocusing = true;
            TDapplet.call('RelocateCameraRt90AltDir', y, x, alt, pitch, direction, animation);
        }
    },

    setMapDivPosition: function () {
        if (largeMap) {
            document.getElementById('3DMapDiv').style.top = _MapToolbarsTop.getHeight() + 'px';
            if (!hasExternalPoints)
                document.getElementById('3DMapDiv').style.left = (MapSearch.getHitlistWidth(true)) + 'px';
            else
                document.getElementById('3DMapDiv').style.left = '0px';
        }
        else {
            var containerHeight = document.getElementById('mapContainer').offsetHeight;
            var thisHeight = (containerHeight - _MapToolbarsTop.getHeight()) + 'px';
            document.getElementById('3DMapDiv').style.top = _MapToolbarsTop.getHeight() + 'px';
            document.getElementById('3DMapDiv').style.left = '0px';
            document.getElementById('3DMapDiv').style.height = thisHeight;
        }
    },

    getXpos: function () {
        var params = TDapplet.call('CameraPositionRt90Res');
        return params.split(';')[0];
    },

    getYpos: function () {
        var params = TDapplet.call('CameraPositionRt90Res');
        return params.split(';')[1];
    },

    getBoundary: function () {
        if (TDapplet.respondsToCalls && TDapplet.hasStopped) {
            var params = TDapplet.call('LocalRegionRT90');
            return params.split(';');
        }
        else
            return null;
    },

    getZoomLevel: function () {
        var pos = TDapplet.getPosition();
        return Map.getZoomLevelFromResolution(pos[2]);
    },

    zoomOut: function () {
        var zoomLevel = Map.getZoomLevelFromResolution(TDapplet.getPosition()[2]);
        if (zoomLevel != 9)
            zoomLevel++;

        TDapplet.call('RelocateCameraRes', Map.getResolutionFromZoomLevel(zoomLevel), 'a');
    },

    zoomIn: function () {
        var zoomLevel = Map.getZoomLevelFromResolution(TDapplet.getPosition()[2]);
        if (zoomLevel != 0)
            zoomLevel--;

        TDapplet.call('RelocateCameraRes', Map.getResolutionFromZoomLevel(zoomLevel), 'a');
    },



    resize: function () {

        var app = TDapplet.applet;

        if (app != null && largeMap) {
            if (browser != "Internet Explorer") {
                document.getElementById('3DMapDiv').style.left = hasExternalPoints ? '0px' : (MapSearch.getHitlistWidth(true)) + 'px';
                app.style.height = (document.body.offsetHeight - _MapToolbarsTop.getHeight()) + 'px';
                app.style.width = hasExternalPoints ? document.body.offsetWidth + 'px' : document.body.offsetWidth - MapSearch.getHitlistWidth(true) + 'px';

                TDapplet.mapDiv().style.height = app.offsetHeight + 'px';
                TDapplet.mapDiv().style.width = app.offsetWidth + 'px';
            }
            else {
                document.getElementById('3DMapDiv').style.left = hasExternalPoints ? '0px' : (MapSearch.getHitlistWidth(true)) + 'px';
                app.style.height = document.body.offsetHeight - _MapToolbarsTop.getHeight() + 'px';
                app.style.width = hasExternalPoints ? document.body.offsetWidth + 'px' : document.body.offsetWidth - MapSearch.getHitlistWidth(true) + 'px';

                TDapplet.mapDiv().style.height = app.offsetHeight + 'px';
                TDapplet.mapDiv().style.width = app.offsetWidth + 'px';
            }
        }
    },

    getHeight: function () {
        if (largeMap)
            return document.body.offsetHeight - _MapToolbarsTop.getHeight();
        else
            return document.getElementById('mapContainer').offsetHeight - _MapToolbarsTop.getHeight();
    },

    getWidth: function () {
        var v = largeMap && !hasExternalPoints ? (document.body.offsetWidth - MapSearch.getHitlistWidth(true)) : document.getElementById('mapContainer').offsetWidth;
        return v;
    },

    orientMap: function () {
        var focalPoint = TDapplet.getCameraFocalPoint();
        var cameraPosition = TDapplet.call('CameraPositionRt90Alt');
        var altitude = parseFloat(cameraPosition.split(';')[2]);
        var cameraOrientation = TDapplet.call('CameraOrientation');
        var pitch = parseFloat(cameraOrientation.split(';')[1]);
        var radius = altitude / Math.cos((90 + pitch) * Math.PI / 180);
        // Orient 3D-map and locate camera straight above
        TDapplet.call('RelocateCameraRt90AltDir', focalPoint.north, focalPoint.east, radius, 0, -89, 'a');
    },

    checkJavaInstalled: function () {

        var active = -1;
        var installed = deployJava.getJREs().length > 0;

        if (browser == "Firefox" || browser == "Safari")
            active = navigator.javaEnabled() ? 1 : 0;

        return (installed && active != 0)
    },

    logJavaInstalled: function (installed) {
        if (installed)
            new Image().src = 'http://eas.hitta.se/eas?cu=1095;kw=madlix_java_installed_' + browser;
        else
            new Image().src = 'http://eas.hitta.se/eas?cu=1095;kw=madlix_java_not_installed_' + browser;
    },

    logAppletLoaded: function () {
        new Image().src = 'http://eas.hitta.se/eas?cu=1095;kw=madlix_loaded_ok_' + browser;
    },

    // Visar 3D-appen.
    show: function (isAutoFocus) {

        var hasHits = false;
        var altitude = Map.getAltitudeFromZoomLevel();


        if (TDapplet.mapDiv() && getApplet())     // appleten redan utritad en gång - visa den bara
        {
            if (browser == 'Internet Explorer') {
                TDapplet.mapDiv().style.display = 'block';
            }
            else {
                TDapplet.mapDiv().style.visibility = 'visible';
            }

            var useId = (TDapplet.idPoint == null || TDapplet.points.length > 1);

            TDapplet.drawPoints(useId);
            TDapplet.resize(true);

            TDapplet.setCameraFocalPoint(TDapplet.cy, TDapplet.cx, altitude, 0, altitude);
        }
        else    // Vi visar applet för första gången
        {

            var objHtml;
            var placeHTML = '';
            var pointText = '';
            var startPink = 0;

            TDapplet.logJavaInstalled(TDapplet.checkJavaInstalled());

            // Se till att köra vissa metoder först när kartan visats så att anrop inte blir ogiltiga.
            TDapplet.callWhenLoaded(TDapplet.finishUp);
            TDapplet.callWhenLoaded(TDapplet.logAppletLoaded);
            var deepZoomDisplayed = getCookie("deepZoomDisplayed");
            var transition = 'a';
            if (deepZoomDisplayed == "true") {
                transition = 'i';
            } else {
                setCookie("deepZoomDisplayed", "true", 365);
            }
            TDapplet.callWhenLoaded(function () {
                TDapplet.setCameraFocalPoint(TDapplet.cy, TDapplet.cx, altitude, 0, altitude, transition);
            });

            if (browser == 'Internet Explorer') {
                objHtml = '<object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" id="ieApplet"  mayscript>';
            }
            else {
                objHtml = '<object type="application/x-java-applet" archive="3DMapsEXApplet.jar" width="' + TDapplet.getWidth() + '" height="' + TDapplet.getHeight() + '" id="mozApplet">';
            }

            objHtml += '<param name="mapUrl" value="http://bf.static.hitta.se/static/v1/3d/2008-10-24/" />';
            //objHtml += '<param name="mapUrl" value="http://hitta-3d1.mon.pi.se/data/2008-06-19/" />';		    		                    		    
            // objHtml += '<param name="mapUrl" value="http://hitta-3d3.mon.pi.se/data/2008-10-24/" />';
            //objHtml += '<param name="mapUrl" value="http://213.88.244.248/~a9/maps/2/2da3m/" />';

            objHtml += '<param name="runmode" value="release" />';
            objHtml += '<param name="codebase" value="' + TDapplet.appRootPath + 'MadLix/" />';


            objHtml += '<param name="code" value="com.agency9.maps.applet.MapsApplet" />';
            objHtml += '<param name="archive" value="3DMapsEXApplet.jar" />';
            objHtml += '<param name="mayscript" value="true" />';

            TDapplet.autoFocusing = true;

            objHtml += '<param name="RotateCamera" value="' + TDapplet.pitch + ' ' + TDapplet.direction + ' a" />';

            var relocateString = '<param name="RelocateCameraRt90Res" value="' + TDapplet.cy + ' ' + TDapplet.cx + ' ' + Map.getResolutionFromZoomLevel(10 - hittaMap.map.getZoom()) + ' true a" />'

            if (tdcity.toLowerCase() == 'stockholm')
                relocateString = '<param name="RelocateCameraRt90Res" value="6580400 1628938 0.53575675 false a" />';
            else if (tdcity.toLowerCase() == 'vasteras')
                relocateString = '<param name="RelocateCameraRt90Res" value="6609976 1541378 0.53575675 false a" />';
            else if (tdcity.toLowerCase() == 'malmo')
                relocateString = '<param name="RelocateCameraRt90Res" value="6167129 1323263 0.53575675 false a" />';
            else if (tdcity.toLowerCase() == 'goteborg')
                relocateString = '<param name="RelocateCameraRt90Res" value="6403927 1271075 0.53575675 false a" />';
            else if (tdcity.toLowerCase() == 'linkoping')
                relocateString = '<param name="RelocateCameraRt90Res" value="6476896 1489508 0.53575675 false a" />';
            else if (tdcity.toLowerCase() == 'helsingborg')
                relocateString = '<param name="RelocateCameraRt90Res" value="6217170 1306092 0.53575675 false a" />';
            else if (tdcity.toLowerCase() == 'orebro')
                relocateString = '<param name="RelocateCameraRt90Res" value="6573087 1466194 0.53575675 false a" />';
            else if (tdcity.toLowerCase() == 'jonkoping')
                relocateString = '<param name="RelocateCameraRt90Res" value="6407309 1402028 0.53575675 false a" />';
            else if (tdcity.toLowerCase() == 'norrkoping')
                relocateString = '<param name="RelocateCameraRt90Res" value="6497074 1522001 0.53575675 false a" />';
            else if (do3d)
                relocateString = '<param name="RelocateCameraRt90Res" value="6609976 1541378 0.53575675 false a" />';

            objHtml += relocateString;

            // Defaultmeddelande om ingen giltig Java-version hittades.
            objHtml += "No supported Java versions found. To view 3D Maps you need Java 1.5 or higher installed.<a href='http://www.java.com/getjava' target='_blank'>Click here to install Java.</a>";
            objHtml += '</object>';
            // Nedanstående kodblock visar och startar laddningen av 3D-kartan.
            document.getElementById('3DMapDiv').innerHTML = objHtml;
            threeDMapWrapper = document.getElementById('3DMapDiv');
            threeDMapWrapper.style.display = 'block';

            // Kommenterade bort pga att det blev strul med att hämta bounds från carmentamap med mappointurls.
            // CarmentaMap.wrapper.style.display = 'none';

            TDapplet.applet = (browser == 'Internet Explorer') ? document.getElementById('ieApplet') : document.getElementById('mozApplet');
            TDapplet.resize(true);
        }

        TDapplet.isVisible = true;
        TDapplet.width = TDapplet.mapDiv().offsetWidth;
        TDapplet.height = TDapplet.mapDiv().offsetHeight;

    },

    showSmallMap: function () {
        if (TDapplet.mapDiv() && getApplet()) {
            if (browser == 'Internet Explorer') {
                TDapplet.mapDiv().style.display = 'block';
            }
            else {
                TDapplet.mapDiv().style.visibility = 'visible';
            }
            var altitude = Map.getAltitudeFromZoomLevel();
            TDapplet.setCameraFocalPoint(TDapplet.cy, TDapplet.cx, altitude, 0, altitude);

        }
        else {
            var objHtml;
            var twidth = TDapplet.getWidth();
            var theight = TDapplet.getHeight();

            TDapplet.logJavaInstalled(TDapplet.checkJavaInstalled());

            if (browser == 'Internet Explorer') {
                objHtml = '<object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width="' + twidth + '" height="' + theight + '" id="ieApplet" mayscript>';
            }
            else {
                objHtml = '<object type="application/x-java-applet" archive="3DMapsEXApplet.jar" width="' + twidth + '" height="' + theight + '" id="mozApplet">';
            }
            //objHtml += '<param name="mapUrl" value="http://hitta-3d1.mon.pi.se/data/2008-06-19/" />';		    		    
            objHtml += '<param name="mapUrl" value="http://static.hitta.se/static/3d/2008-10-24/" />';
            objHtml += '<param name="runmode" value="release" />';
            objHtml += '<param name="codebase" value="' + TDapplet.appRootPath + 'MadLix/" />';
            objHtml += '<param name="code" value="com.agency9.maps.applet.MapsApplet" />';
            objHtml += '<param name="archive" value="3DMapsEXApplet.jar" />';
            objHtml += '<param name="mayscript" value="true" />';

            TDapplet.autoFocusing = true;
            var relocateString = '<param name="RelocateCameraRt90Res" value="' + TDapplet.cy + ' ' + TDapplet.cx + ' ' + Map.getResolutionFromZoomLevel(hittaMap.map.getZoom()) + ' true a" />';
            objHtml += relocateString;
            objHtml += 'No supported Java versions found. To view 3D Maps you need Java 1.5 or higher installed.<a href="http://www.java.com/getjava" target="_blank">Click here to install Java.</a>';
            objHtml += '</object>';

            document.getElementById('3DMapDiv').innerHTML = objHtml;

            TDapplet.callWhenLoaded(TDapplet.finishUp);
            TDapplet.callWhenLoaded(TDapplet.logAppletLoaded);
            var altitude = Map.getAltitudeFromZoomLevel();

            var deepZoomDisplayed = getCookie("deepZoomDisplayed");
            var transition = 'a';
            if (deepZoomDisplayed == "true") {
                transition = 'i';
            } else {
                setCookie("deepZoomDisplayed", "true", 365);
            }
            TDapplet.callWhenLoaded(function () {
                TDapplet.setCameraFocalPoint(TDapplet.cy, TDapplet.cx, 250, 0, 250, transition);
            });

            threeDMapWrapper = document.getElementById('3DMapDiv');
            threeDMapWrapper.style.display = 'block';

            TDapplet.applet = (browser == 'Internet Explorer') ? document.getElementById('ieApplet') : document.getElementById('mozApplet');

            document.getElementById('3DMapDiv').parentNode.setAttribute('width', twidth);
            document.getElementById('3DMapDiv').parentNode.setAttribute('height', theight);
        }
    },

    finishUp: function () {
        if (TDapplet.idPoint != null) {
            TDapplet.call('addLabelRT90', 0, TDapplet.idPoint.y, TDapplet.idPoint.x, unescape(TDapplet.idPoint.text), 'void', 'void', true);
        }

        TDapplet.drawPoints(true);

        if (!largeMap || TDapplet.idPoint != null || hasExternalPoints)
            TDapplet.setLabelMarkerAppearance('target', 'finishup');
    },

    plotPointsInMap: function (useId) {
        var appearance = (typeof (useId) == 'undefined' || !useId) ? 'target' : 'id';
        TDapplet.setLabelMarkerAppearance(appearance, 'plotpoints');
        var showToolTip = (TDapplet.points.length == 1);

        // om det finns punkter just nu
        if (TDapplet.points.length > 0) {
            for (var i = 0; i < TDapplet.points.length; i++) {
                TDapplet.call('addLabelRT90', i + 1, TDapplet.points[i].y, TDapplet.points[i].x, 'punkt ' + i, 'void', 'void', false);
            }
        }
    },

    drawPoints: function (useId) {
        var appearance = (typeof (useId) == 'undefined' || !useId) ? 'target' : 'id';
        var showToolTip = (TDapplet.points.length == 1);
        TDapplet.setLabelMarkerAppearance(appearance, 'drawPoints');
        var paramString;

        // if there are points at this moment
        if (TDapplet.points.length > 0) {
            for (var i = 0; i < TDapplet.points.length; i++) {
                if (TDapplet.isLoaded)
                    TDapplet.call('addLabelRT90', i + 1, TDapplet.points[i].y, TDapplet.points[i].x, unescape(TDapplet.points[i].text), 'void', 'void', showToolTip);

                paramString += '<param name="AddLabelRT90_' + (i) + '" value="' + (i + 1) + ';' + TDapplet.points[i].y + ';' + TDapplet.points[i].x + ';' + unescape(TDapplet.points[i].text) + ';void;void;' + showToolTip + '" />';
            }
        }
        return paramString;
    },


    dummyShow: function () {


    },

    hide: function () {
        if (browser == "Internet Explorer")
            TDapplet.mapDiv().style.display = 'none';
        else
            TDapplet.mapDiv().style.visibility = 'hidden';

        TDapplet.isVisible = false;
    },

    addPoint: function (id, point, showToolTip, newText) {
        // Do some neccessary character replacements                    
        newText = newText.replace(/\r\n/g, '\\\\');
        newText = newText.replace(/<br \/>/g, '\\\\').replace(/<br>/g, '\\\\');

        // Remove any HTML content from tooltip text as the 3D applet can't display this.
        newText = stripHtml(newText);

        var markerPointX = point.getRT90Point().north;
        var markerPointY = point.getRT90Point().east;

        TDapplet.points.push(new TDpoint(markerPointY, markerPointX, newText));

        if (TDapplet.isVisible) {
            try {
                TDapplet.call('AddLabelRt90', id, markerPointX, markerPointY, newText, 'void', 'void', showToolTip);
            }
            catch (ex) {
                TDapplet.call('AddLabelRt90', id, markerPointX, markerPointY, id, 'void', 'void', showToolTip);
            }
        }
        /*TDapplet.points.push(new TDpoint(point.x, point.y, newText));

        if (TDapplet.isVisible) {
        try {
        TDapplet.call('AddLabelRt90', id, point.y, point.x, newText, 'void', 'void', showToolTip);
        }
        catch (ex) {
        TDapplet.call('AddLabelRt90', id, point.y, point.x, id, 'void', 'void', showToolTip);
        }
        }*/
    },

    removeAllLabels: function () {
        TDapplet.points = [];

        if (TDapplet.applet != null && typeof (TDapplet.applet) != 'undefined')
            TDapplet.call('RemoveAllLabels');
    },

    showToolTip: function (id) {
        TDapplet.call('SetLabelVisible', id + 1, 'true');
    },

    hideToolTip: function (id) {
        TDapplet.call('SetLabelVisible', id + 1, 'false');
    },

    callWhenLoaded: function (fn) {

        if (TDapplet.isLoaded)
            fn();
        else
            TDapplet.loadedListeners.push(fn);

    },

    setLabelMarkerAppearance: function (appearance, source) {

        if (typeof (appearance) == 'undefined')
            appearance = TDapplet.labelMarkerAppearance;
        else
            TDapplet.labelMarkerAppearance = appearance;

        TDapplet.call('labelMarkerAppearance', 1, 1, appearance);

    }

}
