var gmarkers = [];
var n=0;
var icon;
var icon2;
var map;
var baseIcon;
var moveHandle;
var ut = 0;
var currentID = -1;
var zoom = 5;
var BLINK_RATE = 500;
var world = false;

var initLat;
var initLng;

var fullButton;
var haveForecast = false;

//var infoWindow;
//var currentMarker;


function loadSystem(latC, longC) {
    if (GBrowserIsCompatible()) {
        
        initLat = latC;
        initLng = longC;

        map = new GMap2(document.getElementById("map"));
        
        map.disableDoubleClickZoom();
        map.disableContinuousZoom();
        map.disableScrollWheelZoom();
        
        map.setCenter(new GLatLng(latC, longC), zoom);
        map.addControl(new GOverviewMapControl());
        map.addControl(new GMapTypeControl());

        baseIcon = new GIcon();
        baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
        baseIcon.iconSize = new GSize(12, 20);
        baseIcon.shadowSize = new GSize(22, 20);
        baseIcon.iconAnchor = new GPoint(6, 20);
        baseIcon.infoWindowAnchor = new GPoint(9, 2);
        baseIcon.infoShadowAnchor = new GPoint(18, 25);

        icon = new GIcon(baseIcon);
        icon.image = "images/pins/206.png";
        icon2 = new GIcon(baseIcon);
        icon2.image = "images/pins/216.png";

        fetchMarkers();
        addMoveListener();

        fullButton = new YAHOO.widget.Button("viewFullButton");
        var regInfoEl = document.getElementById("regionInfo");
        regInfoEl.style.display = 'none';
    }
}


function handleMapTabClick(ev) {
    //map.setCenter(new GLatLng(initLat, initLng), zoom);
    //map.checkResize();
    fetchMarkers();
}


function addMoveListener() {
    moveHandle = GEvent.addListener(map, 'moveend', function() {fetchMarkers();} );
}
        

function createMarker(point, id) {
    var marker;
    marker = new PdMarker(point, icon);
    marker.setId(id);    

    GEvent.addListener(marker, "click", function() {
        fetchSummary(marker, id, -1);
        //currentMarker = marker;
        //GEvent.removeListener(moveHandle);
    });
    map.addOverlay(marker);
}

/**
function doSomething() {
    infoWindow = map.getInfoWindow();
    GEvent.addListener(infoWindow, "closeclick", function() { alert("HERE") });
}
**/



/////////////////////////  AJAX Requests  ////////////////////////////////////

function fetchMarkers() {
    map.checkResize();
    var gBounds = map.getBounds();
    var topLeftLat = parseInt(gBounds.getNorthEast().lat());
    var topLeftLng = parseInt(gBounds.getSouthWest().lng());
    var botRightLat = parseInt(gBounds.getSouthWest().lat());
    var botRightLng = parseInt(gBounds.getNorthEast().lng());

   // alert("topLeftLat : " + topLeftLat + ", topLeftLng: " + topLeftLng + ", botRightLat: " + botRightLat + ", botRightLng: " + botRightLng);

//alert("center lat: " + map.getCenter().lng());
//alert("bounds lng: " + gBounds.getSouthWest().lng());

    var gLatLng = map.getCenter();
    var latC = gLatLng.lat();
    var lngC = gLatLng.lng();

    var url = "fetchMarkers.htm?lat1=" + topLeftLat + "&lng1=" + topLeftLng + "&lat2=" + botRightLat + "&lng2=" + botRightLng + "&latC=" + latC + "&lngC=" + lngC;
    if (world) {
        url += "world=1"
    }


    var req = GXmlHttp.create();
    req.open("GET", url, true);
    req.onreadystatechange = getCallbackFunction(req, processMarkers);
    req.send('');
}


function fetchMaxValueMarkers() {
    var req = GXmlHttp.create();
    req.open("GET", "fetchMaxValueMarkers.htm", true);
    req.onreadystatechange = getCallbackFunction(req, processMaxValues);
    req.send(null);
}


function fetchSummary(marker, id, stat) {
    var req = GXmlHttp.create();
    req.open("GET", "fetchRegionSummary.htm?regionID=" + id + "&stat=" + stat, true);
    req.onreadystatechange = getCallbackFunction(req, processSummary);
    req.send(null);
}





/////////////////////////  URL Requests  ////////////////////////////////////

function fetchDetails(evt, id) {
    top.location.href = "chartForecast.htm?region=" + id;
}


/////////////////////////  Map Functions  ////////////////////////////////////

function reCentre(latC, longC) {
    map.setCenter(new GLatLng(latC, longC), zoom);
}


function removeMarkers() {
    var marker = map.getFirstMarker();
    while (marker != null) {
	marker.remove();	
	marker = map.getFirstMarker();
    }
}


function getMarkerById(id) {
    var marker = map.getMarkerById(id);
    return marker;
}


function updateBlink(id, value, rate) {
clearTimeout(meTimeout); 
    var marker = getMarkerById(id);
    if (marker != null) {
        marker.blink(value, rate);
    }
}


////////////////////////  Callback Function  ///////////////////////////////////

function getCallbackFunction(req, processData) {
    // Return an anonymous function that listens to the XMLHttpRequest instance
    return function () {
        // If the request's status is "complete"
        if (req.readyState == 4) {
            if (req.status == 200) {
                // Pass the XML payload of the response to the handler function
                processData(req.responseXML);
            } else {
                // trouble!!
                alert("HTTP error was encountered : " + req.status);
            }
        }
    }
}


////////////////////////  XML processing Functions  ///////////////////////////////////

function processMarkers(xmlDoc) {
    removeMarkers();
    var markers = xmlDoc.documentElement.getElementsByTagName("mapMarker");
    /**
    if (ut==1) {
        //var updateTime = xmlDoc.documentElement.getElementsByTagName("updateTime")[0].firstChild.nodeValue;
        //////////////////// document.getElementById('ut').innerHTML = updateTime;
    }
    **/
    for (var i=0; i < markers.length; i++) {
        var lat = parseFloat(markers[i].getElementsByTagName("lattitude")[0].firstChild.nodeValue);
        var longVal = parseFloat(markers[i].getElementsByTagName("longitude")[0].firstChild.nodeValue);
        var id = markers[i].getElementsByTagName("id")[0].firstChild.nodeValue
        var maxStat = markers[i].getElementsByTagName("maxStat")[0].firstChild.nodeValue
        var marker = createMarker(new GLatLng(lat, longVal), id);

        if (currentID == id) {
            updateBlink(id, true, BLINK_RATE);
        }
    }
    markers = null;
    //ut=1;
}



function processSummary(xmlDoc) {

    //currentMarker.openInfoWindowHtml("Retrieving summary");
    //doSomething();

    var regInfoEl = document.getElementById("regionInfo");
    regInfoEl.style.display = 'block';
    var imgInfoEl = document.getElementById("imgInfo");
    imgInfoEl.style.display = 'none';
    haveForecast = true;
    var sumGraphEl = document.getElementById("sumGraph");
    sumGraphEl.style.display = 'block';
    
    updateBlink(currentID, false, 0);

    var forecasts = xmlDoc.documentElement.getElementsByTagName("forecastData");
    var id = xmlDoc.documentElement.getElementsByTagName("regionID")[0].firstChild.nodeValue;
    currentID = id;
    fullButton.on("click", fetchDetails, id);

    var waveX = xmlDoc.documentElement.getElementsByTagName("waveMultiplier")[0].firstChild.nodeValue;
    var windX = xmlDoc.documentElement.getElementsByTagName("windMultiplier")[0].firstChild.nodeValue;

    var tz = xmlDoc.documentElement.getElementsByTagName("timeZone")[0].firstChild.nodeValue;
    var regionName = xmlDoc.documentElement.getElementsByTagName("region")[0].firstChild.nodeValue;
    var hour = parseInt(xmlDoc.documentElement.getElementsByTagName("startHour")[0].firstChild.nodeValue);
    var count = 50;


    var regNameTxt = document.createTextNode(regionName);
    regNameEl = document.getElementById("regName")
    removeChildren(regNameEl);
    regNameEl.appendChild(regNameTxt);

    var tzTxt = document.createTextNode(tz);
    tzEl = document.getElementById("tZone");
    removeChildren(tzEl);
    tzEl.appendChild(tzTxt);

/**
    infoDiv = document.createElement("div");
    regNameDiv = document.createElement("div");
    //regNameDiv.id = "regName"
    regNameDiv.appendChild(regNameTxt);
    infoDiv.appendChild(regNameDiv);

    uList = document.createElement("ul");
    uList.id = "q-graph";

    fList = document.createElement("li");
    fList.className = "forecast";
    ufList = document.createElement("ul");

    hl = document.createElement("li");
    hl.className = "hour block";

    var hLabel = document.createTextNode("Hour");
    hl.appendChild(hLabel);

    ufList.appendChild(hl);
    fList.appendChild(ufList);
    uList.appendChild(fList);
    infoDiv.appendChild(uList);

    currentMarker.openInfoWindowHtml(infoDiv);
    doSomething();

**/
    
    for (var i = 0; i < forecasts.length; i++) {
        var htsgw = parseFloat(forecasts[i].getElementsByTagName("htsgw")[0].firstChild.nodeValue);
        var waveImage = forecasts[i].getElementsByTagName("waveImage")[0].firstChild.nodeValue;
        var waveText = forecasts[i].getElementsByTagName("waveTextDirection")[0].firstChild.nodeValue;
        var pwper = parseFloat(forecasts[i].getElementsByTagName("pwper")[0].firstChild.nodeValue);
        var wind = parseFloat(forecasts[i].getElementsByTagName("wind")[0].firstChild.nodeValue);
        var windImage = forecasts[i].getElementsByTagName("windImage")[0].firstChild.nodeValue;
        var windText = forecasts[i].getElementsByTagName("windTextDirection")[0].firstChild.nodeValue;    

        var waveH = waveX*htsgw;
        var windH = windX*wind;

        var hrTxt = document.createTextNode(hour+":00");
        var hrEl = document.getElementById("hour"+i);
        removeChildren(hrEl);
        hrEl.appendChild(hrTxt);

        var htsgwTxt = document.createTextNode(htsgw);
        var htsgwEl = document.getElementById("htsgw"+i);
        removeChildren(htsgwEl);
        htsgwEl.appendChild(htsgwTxt);
        var height = waveH+20;
        htsgwEl.style.height = height+"px";

        var wvBlkEl = document.getElementById("wvBlk"+i);
        wvBlkEl.style.height = waveH+"px";

        var wvTxt = document.createTextNode(waveText);
        var wvEl = document.getElementById("wvTxt"+i);
        removeChildren(wvEl);
        wvEl.appendChild(wvTxt);

        var wvImg = document.createElement("img");
        wvImg.src = "images/chart/"+waveImage;
        var wvImgEl = document.getElementById("wvImg"+i);
        removeChildren(wvImgEl);
        wvImgEl.appendChild(wvImg);

        var perTxt = document.createTextNode(pwper);
        var perEl = document.getElementById("per"+i);
        removeChildren(perEl);
        perEl.appendChild(perTxt);


        var wspdTxt = document.createTextNode(wind);
        var wspdEl = document.getElementById("wSpd"+i);
        removeChildren(wspdEl);
        wspdEl.appendChild(wspdTxt);
        height = windH+30;
        wspdEl.style.height = height+"px";

        var wndBlkEl = document.getElementById("wndBlk"+i);
        wndBlkEl.style.height = windH+"px";

        var wndImg = document.createElement("img");
        wndImg.src = "images/chart/"+windImage;
        var wndImgEl = document.getElementById("wndImg"+i);
        removeChildren(wndImgEl);
        wndImgEl.appendChild(wndImg);

        var wndTxt = document.createTextNode(windText);
        var wndEl = document.getElementById("wndTxt"+i);
        removeChildren(wndEl);
        wndEl.appendChild(wndTxt);

        hour+= 3;
        if (hour >= 24)
            hour-= 24;
        count+= 28;
    }
    updateBlink(id, true, BLINK_RATE);
}



function processMaxValues(xmlDoc) {
    GEvent.removeListener(moveHandle);
    zoom = 1;
    map.setCenter(new GLatLng(0,0), zoom);
    processMarkers(xmlDoc);   
}


function removeChildren(node) {
    while (node.hasChildNodes()) {
        node.removeChild(node.lastChild);
    }
}



