﻿var map;
var currentMarker;
var timerID = null;
var timerRunning = false;
var MarkerTimerRunning = false;
var delay = 15000;
var cssRef;
var lat;
var lon;
var zoom;
var HashArray;
var MarkerArray;

var prevNELatInt;
var prevNELonInt;
var curNELatInt;
var curNELonInt;

var prevSWLatInt;
var prevSWLonInt;
var curSWLatInt;
var curSWLonInt;

function addManifestArray()
{
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.setAttribute("id", "mapscript-Manifest");
    //script.src = '/hacameras/Scripts/Manifest.js';
    script.src = 'http://svcs.jpress.co.uk/hacameras/bin/scripts/Manifest.js';
    document.getElementsByTagName('head')[0].appendChild(script);
}

function initMaps(_lat, _lon, _zoom)
{
    if (GBrowserIsCompatible())
    {
        addManifestArray();
        lat = _lat;
        lon = _lon;
        zoom = _zoom;
        t = _lat;

        if (t)
            lat = t;

        t = null;
        t = _lon;

        if (t)
            lon = t;

        t = null;
        t = _zoom;

        if (t)
            zoom = t;

        t = null;

        try
        {
            map = new GMap2(document.getElementById("map"));

            var centre = new GLatLng(lat, lon);
            var zoomInt = parseInt(zoom);
            map.setCenter(centre, zoomInt);
            map.enableDoubleClickZoom();
            map.enableScrollWheelZoom();
            GEvent.addListener(map, "infowindowclose", function() { onInfoWindowClose(); });
            GEvent.addListener(map, "moveend", function() { onMoveEnd(); });
            
            if (window.addEventListener)
            {
                window.addEventListener("load", waitForMapLoad, false);
            }
            else if (window.attachEvent)
            {
                window.attachEvent("onload", waitForMapLoad);
            }

            map.addControl(new GLargeMapControl());
        }
        catch (e)
        {

        }
    }
}

function waitForMapLoad()
{
    onMoveEnd();
}

function RemoveMarkersForArrayFile(ArrayFileAsHashString)
{
    var Array;
    var evalString = "Array = TCData" + ArrayFileAsHashString + " ";
    try
    {
        eval(evalString);
        RemoveOverlays(Array)
    }
    catch (e)
    {
        try
        {
            eval(evalString);
            RemoveOverlays(Array)
        }
        catch (e)
        {
        }
    }
}

function RemoveOverlays(array)
{
    for (var i = 0; i < array.length; i++)
    {
        try
        {
            var marker = array[i].gM;
            array[i].gM = null;
            map.removeroverlay(marker);
        }
        catch (e)
        {
        }
    }
}

function GetArrayForView()
{
    var arrayIndex;
    var oldList = HashArray;
    HashArray = new Array();
    arrayIndex = 0;
    //POPULATE THE ARRAY OF HASHES THAT ARE IN VIEW
    if (curNELatInt != null)
    {
        var nelat = convertArrayNameToFloat(curNELatInt);
        var swlat = convertArrayNameToFloat(curSWLatInt);

        while (nelat >= swlat)
        {

            var nelon = convertArrayNameToFloat(curNELonInt);
            var swlon = convertArrayNameToFloat(curSWLonInt);

            while (parseFloat(nelon) >= parseFloat(swlon))
            {
                var man = Manifest;
                var tempLat = convertFloatToArrayName(nelat);
                var tempLon = convertFloatToArrayName(nelon);
                var hashstring = tempLat.toString() + tempLon.toString();

                if (man.match(hashstring + ".js "))
                {
                    HashArray[arrayIndex] = hashstring;
                    arrayIndex++;
                }

                nelon = nelon - 1;
            }

            nelat = nelat - 1;
        }
    }

    //REMOVE ALL OF THE OLD MARKERS
    if (oldList != null)
    {
        for (var i = 0; i < oldList.length; i++)
        {
            var ArrayFile = oldList[i]
            RemoveMarkersForArrayFile(ArrayFile);
        }
    }
}

function AddScript(hashstring)
{
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.setAttribute("id", "mapscript-" + hashstring);
    //script.src = '/hacameras/Scripts/' + hashstring + '.js';
    script.src = 'http://svcs.jpress.co.uk/hacameras/bin/scripts/' + hashstring + '.js';
    document.getElementsByTagName('head')[0].appendChild(script);
}

function AddNeededScriptArrays()
{
    var req;
    var xml;
    var urlPrefix;

    var TCDataArray;
    MarkerArray = new Array();
    var markerCounter = 0;
    var arrayLength = HashArray.length - 1;

    for (arrayLength; arrayLength >= 0; arrayLength--)
    {
        TCDataArray = null;
        var arrayName = HashArray[arrayLength];
        AddScript(arrayName);
    }
}

function AddYourselfFunction(arrayName)
{
    var TCDataArray = null;
    TCDataArray = arrayName;
    for (var j = 0; j < TCDataArray.length - 1; j++)
    {
        var arrayObject = TCDataArray[j];
        if (arrayObject.gM != null)
        {
            var marker = arrayObject.gM;
            marker.show();
        }
        else
        {
            AddNewMarker(arrayObject);
        }
    }
}

function AddNewMarker(arrayObject)
{
    var lat = arrayObject.T;
    var lon = arrayObject.G;
    var camUrl = arrayObject.U;
    var desc = arrayObject.d;
    var type = arrayObject.type;
    var provider = arrayObject.pro;
    var point = new GLatLng(lat, lon);
    gM = new GMarker(point);
    gM.description = desc;
    gM.cameraCode = camUrl;
    gM.type = type;
    gM.provider = provider;
    map.addOverlay(gM);
    arrayObject.gM = gM;
    delegateListener(gM);
}

function onMoveEnd()
{
    updateLatInts();
    GetArrayForView();
    AddNeededScriptArrays();
}

function RemoveAllScriptLinks()
{
    var head = document.getElementsByTagName('head')[0];

    if (HashArray != null)
    {
        for (var i = 0; i < HashArray.length; i++)
        {
            var scriptTag = document.getElementById("mapscript-" + HashArray[i]);
            document.getElementsByTagName('head')[0].removeChild(scriptTag);
        }

        HashArray = null;
    }
}

function getHashedCoord(coord)
{
    var inputcoord = parseFloat(coord);
    var isnegativevalue = false;
    var hashstring;

    if (inputcoord < 0)
    {
        isnegativevalue = true;
    }

    inputcoord = inputcoord * 10;

    if (isnegativevalue)
    {
        inputcoord *= -1;
        inputcoord++;
    }

    var hashint = parseInt(inputcoord);

    hashstring = "0000" + hashint.toString();

    var length = hashstring.length;

    hashstring = hashstring.substring(length - 4);

    if (isnegativevalue)
    {
        hashstring = "n" + hashstring;
    }
    else
    {
        hashstring = "p" + hashstring;
    }

    return hashstring;

}

function updateLatInts()
{
    var bounds = map.getBounds()

    var southWest = bounds.getSouthWest();
    var SWLatInt = getHashedCoord(southWest.lat());
    var SWLonInt = getHashedCoord(southWest.lng());

    if (curSWLatInt != null && curSWLonInt != null)
    {
        prevSWLatInt = curSWLatInt;
        prevNELonInt = curNELonInt;
        curSWLatInt = SWLatInt;
        curSWLonInt = SWLonInt;
    }
    else
    {
        curSWLatInt = SWLatInt;
        prevSWLatInt = 0;
        curSWLonInt = SWLonInt;
        prevNELonInt = 0;
    }

    var northEast = bounds.getNorthEast();
    var NELatInt = getHashedCoord(northEast.lat());
    var NELonInt = getHashedCoord(northEast.lng());


    if (curNELatInt != null && curNELonInt != null)
    {
        prevNELatInt = curNELatInt;
        prevNELonInt = curNELonInt;
        curNELatInt = NELatInt;
        curNELonInt = NELonInt;
    }
    else
    {
        curNELatInt = NELatInt;
        prevNELatInt = 0;
        curNELonInt = NELonInt;
        prevNELonInt = 0;
    }
}

function convertArrayNameToFloat(value)
{
    var coord;
    if (value.toString().indexOf('n') == 0)
    {
        coord = value.substring(1, value.length);
        coord = '-' + coord;
        return parseFloat(coord);
    }
    else
    {
        coord = value.substring(1, value.length);
        return parseFloat(coord);
    }
}

function convertFloatToArrayName(value)
{
    var isnegativevalue = false;
    var hashstring;

    if (value < 0)
    {
        isnegativevalue = true;
    }

    if (isnegativevalue)
    {
        value *= -1;
    }

    var hashint = parseInt(value);

    hashstring = "0000" + hashint.toString();

    var length = hashstring.length;

    hashstring = hashstring.substring(length - 4);

    if (isnegativevalue)
    {
        hashstring = "n" + hashstring;
    }
    else
    {
        hashstring = "p" + hashstring;
    }

    return hashstring;
}

function delegateListener(gM)
{
    GEvent.addListener(gM, "mouseover", function() { onMouseOverPin(gM) });
}

function onInfoWindowClose()
{
    currentMarker = null;
    stopTimer();
}

function setWaitingImage()
{
    var picImage = document.getElementById('camImg');
    picImage.setAttribute("src", 'http://svcs.jpress.co.uk/hacameras/Images/NoImage.png');
}

function onMouseOffPin(gM)
{
    map.closeInfoWindow();
}

function onMouseOverPin(gM)
{
    setWaitingImage();

    var htmlPinDesc = "<span>" + gM.description + "<br/>Images provided by " + gM.provider + "<br />" + "</span>";
    map.openInfoWindowHtml(gM.getLatLng(), htmlPinDesc);

    currentMarker = gM;

    setPicture();
    startTimer();
}

function setPicture()
{
    var picImage = document.getElementById('camImg');

    if (picImage != null)
    {
        if (currentMarker != null)
            picImage.setAttribute("src", "http://svcs.jpress.co.uk/hacameras/Images.aspx?cc=" + currentMarker.cameraCode + "&cb=" + new Date().getTime() + "&type=" + currentMarker.type);
            //picImage.setAttribute("src", "http://localhost:2351/Images.aspx?cc=" + currentMarker.cameraCode + "&cb=" + new Date().getTime() + "&type=" + currentMarker.type);
    }
}

function startTimer()
{
    timerRunning = true;
    timerID = window.setInterval("setPicture();", delay);
}

function stopTimer()
{
    if (timerRunning)
    {
        window.clearInterval(timerID);
        timerRunning = false;
    }
}
