//<!--
// <![CDATA[


var lockToggle = false;
var elheight = 54;

var scalec = null;
var scalegroups = new Array("currents","charts","models");
var scalelayers = new Array("Surface Currents (6Km)","Wave Height","Peak Wave Period","Average Wave Period","Wave Direction");
var scalefiles = new Array( "swell_files/currents-scale-fixed.png",
                            "swell_files/Southern_California-Hs-scale-fixed.png",
                           "swell_files/Southern_California-Tp-scale-fixed.png",
                           "swell_files/Southern_California-Ta-scale-fixed.png",
                           "swell_files/Southern_California-Dp-scale-fixed.png");



function getRecentSurfaceCurrentTimeStamp(res) {
    var request = GXmlHttp.create();
    request.open("GET","http://www.sccoos.org/data/hfrnet/xml/tilesStatus.php",false);
    request.send(null);

    if (request.status == 200 ) {
        if ( document.all ) {
            var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.loadXML(request.responseText);
        } else {
            var xmlDoc = (new DOMParser()).parseFromString(request.responseText,"text/xml");
        }
    }

    var tiles = xmlDoc.getElementsByTagName("tiles");
    for ( var i = 0; i < tiles.length; i++ ) {
        if ( tiles[i].getAttribute("res") == res && tiles[i].getAttribute("pfx") == "a" ) {
            var ts = tiles[i].getAttribute("time");
            break;
        }
    }
 
    return ts;
}

var ts = getRecentSurfaceCurrentTimeStamp("6km");

var currentsicon = new GIcon();
currentsicon.image = 'icons/currentsmarker.png';
currentsicon.Size = new GSize(20,12);
currentsicon.iconAnchor = new GPoint(6,20);
currentsicon.infoWindowAnchor = new GPoint(6,3);

GMapWrapper.prototype.onMapAreaClick = function (pt) {
    var currentslayer = this.getLayerWithLabel("Surface Currents (6Km)");

    if ( this.layers[currentslayer].shown != true ) {
        return;
    } else {
        mapobj = this;
        GEvent.addListener(this.objMap,"removeoverlay", function(overlay) {
            if ( overlay == mapobj.layers[currentslayer].overlay && mapobj.mapAreaMarker ) {
                mapobj.objMap.removeOverlay(mapobj.mapAreaMarker);
                mapobj.mapAreaMarker = null;
            }
        });
    }

    ts = getRecentSurfaceCurrentTimeStamp("6km");
    var resolution = "6km";
    var response_str = getRemoteText("http://www.sccoos.org/data/hfrnet/xml/nearestneighbor.php?lat=" + pt.y + "&lon=" + pt.x + "&time=" + ts + "&res=" + resolution + "&avgs=1");

    var response = response_str.split(",");
    if ( response.length < 2 ) {
        var link = '';
        var iw = "<div class=\"iwwrapper\"><div class=\"iwheader\"><a href=\"" + link + "\" target=\"_blank\">Surface Currents (" + resolution + ")</a></div><div class=\"iwbody\"><div class=\"currentswrapper\"><div><span class=\"obslabel\">Location</span><span class=\"obsvalue\">" + pt.x + ", " + pt.y + "</span></div></div></div></div>" ;
    } else {
    
        var magnitude = Math.sqrt((response[2]*response[2]) + (response[3]*response[3]));
        magnitude = parseInt(magnitude *100) / 100;
        var magnitude_kts = parseInt(magnitude *1.94384449) / 100;
        var magnitude_str = magnitude + " cm/s (" + magnitude_kts + " knots)";

        var dir = (450.0 - (180 * Math.atan2(response[3],response[2]) / Math.PI)) % 360;
        dir = parseInt(dir*100)/100;
        direction_str = dir + "&deg; from North";

        dateobj = new Date();
        dateobj.setTime(ts*1000);
        date_str = dateobj.getUTCFullYear() + "-" + (dateobj.getUTCMonth()+1) + "-" + dateobj.getUTCDate() + " " + dateobj.getUTCHours() + ":00:00 UTC";
        localdate_str = dateobj.getFullYear() + "-" + (dateobj.getMonth()+1) + "-" + dateobj.getDate() + " " + dateobj.getHours() + ":00:00 Local";
        link = "http://cordc.ucsd.edu/projects/mapping/maps/showplots.php?lat=" + parseFloat(response[0]) + "&lon=" + parseFloat(response[1]) + "&mask=" + resolution + "&time=" + ts + "&avgs=1";
        
        var iw = "<div class=\"iwwrapper\">";

        iw  += "<div class=\"iwheader\"><a href=\"" + link + "\" target=\"_blank\">Surface Currents (" + resolution + ")</a></div>";
        iw += "<div class=\"iwbody\">";
        iw += "<div class=\"currents_wrapper\">";

        iw  += "<div class=\"location\"><span class=\"obslabel\">Location</span><span class=\"obsvalue\">" + response[0] + " &deg;N, " + response[1] + " &deg E</span></div>";
        iw += "<div class=\"resolution\"><span class=\"obslabel\">Resolution</span><span class=\"obsvalue\">" + resolution + "</span></div>" ;
        iw += "<div class=\"magnitude\"><span class=\"obslabel\">Magnitude</span><span class=\"obsvalue\">" + magnitude_str + "</span></div>";
        iw += "<div class=\"direction\"><span class=\"obslabel\">Direction</span><span class=\"obsvalue\">" + direction_str + "</span></div>" ;
        iw += "<div class=\"timescale\"><span class=\"obslabel\">Timescale</span><span class=\"obsvalue\">" + date_str + "<br />" + localdate_str+"</span></div>" ;

        iw += "</div>";
        iw += "</div>";
        iw += "</div>";
        tabs = new Array();
        tabs[0] = new GInfoWindowTab("Surface Currents",iw);


        if ( this.mapAreaMarker ) {
            this.objMap.removeOverlay(this.mapAreaMarker);
        }
        this.mapAreaMarker = new GMarker(new GLatLng(response[0],response[1]),currentsicon);

        this.objMap.addOverlay(this.mapAreaMarker);
        if ( this.showInfoWindow ) {
            this.mapAreaMarker.openInfoWindowTabsHtml(tabs);
        }
    }

    if ( this.showInfoBlock ) {
        var mapinfo = document.getElementById("mapinfoblock");
        mapinfo.innerHTML = iw;
        var parentclasses = mapinfo.parentNode.className;
        if (! parentclasses || (parentclasses && !parentclasses.match("openediw"))) {
            mapinfo.parentNode.className = parentclasses + " openediw";
        }
    } 
}


GMapLegend.prototype.getLayerGroup = function(layernum) {
    var label = this.objmap.layers[layernum].abbreviation;

    if ( label == "Surface Currents (6Km)" ) return "currents";
    if ( label == "Wave Height" || label == "Peak Wave Period" || label == "Average Wave Period" || label == "Wave Direction" )
        return "models";
    for ( var i = 0; i < charts.length; i++ ) {
        if ( label == (charts[i][1] + " (" + charts[i][0].replace(/_.*/,'') + ")" ) ) 
            return "charts";
    }
    return "";
}

GMapLegend.prototype.checkIfGroupShown = function(groupname) {
    var elems = document.getElementsByName("group_" + groupname);
    for ( var i = 0; i < elems.length; i++ ) {
        var layer = elems[i].layer;
        if ( layer && this.objmap.layerIsShown(layer) ) {
            return true;
        }
    }
    return false;
}


GMapLegend.prototype.onLayerChange = function(legendlayer,layernum,id) {
    var shown = false;
    var scaleidx = -1;
    if ( layernum != null ) {
        shown = this.objmap.layers[layernum].shown;
        var layergroup = this.getLayerGroup(layernum);
        var layername = this.objmap.layers[layernum].abbreviation;
        scaleidx = scalelayers.indexOf(layername);

        if ( scaleidx > -1 ) {
            if ( shown && this.objmap.scalesShown ) {
                this.objmap.addScale(scalefiles[scaleidx],layergroup);
            } else {
                this.objmap.removeScale(layergroup);
            }
        } 
    } else {
        var layergroup = id.replace(/group_(.*)_deselect/,"$1").toLowerCase();
        this.objmap.removeScale(layergroup);
    }

    if ( shown && layergroup == "models" ) {
        if ( this.checkIfGroupShown("NOAA Nautical Charts")) {
            this.objmap.setMessage("Nautical charts will be disabled while models are shown.");
        }
        this.legendlock += 1;
        this.deselectRadioLayer("group_NOAA Nautical Charts_deselect")
        this.legendlock -= 1;
    }

    if ( shown && layergroup == "charts" ) {
        if ( this.checkIfGroupShown("Models") ) {
            this.objmap.setMessage("Models will be disabled while nautical charts are shown.");
        }
        this.legendlock += 1;
        this.deselectRadioLayer("group_Models_deselect")
        this.legendlock -= 1;
        this.objmap.removeScale("models");
    }

}

GMapWrapper.prototype.customLoadMap = function () {
    this.fixScale();
}

GMapWrapper.prototype.customLoadData = function () {
}

GMapWrapper.prototype.addScale = function(filename,group) {
    if ( ! this.scales ) this.scales = new Array();
    if ( ! this.scalec ) {
        this.scalec = document.getElementById("scalecontainer");
    }
    if ( ! this.scalec ) {
        this.scalec = document.createElement("div");
        this.scalec.id = "scalecontainer";
        var bodies = document.getElementsByTagName("body");
        bodies[0].appendChild(this.scalec);
    }
    if ( this.scales[group] == null ) {
        var scale = document.createElement("img");
        scale.id="scalegroup_"+group;
        scale.className="scale";
        this.scalec.appendChild(scale);
        this.scales[group] = scale;
        this.loadOffsetDone = false;
        var objmap = this;

        GEvent.addDomListener(scale,"load", function(e) {
            objmap.showScale(scale);
            objmap.mbl.addBlock(scale.id);
            this.loadOffsetDone = true;
        });
        scale.src=filename;
    } else {
        this.loadOffsetDone = false;
        this.scales[group].src = filename;
    }
}


GMapWrapper.prototype.showScale = function(scale) {
    if ( true ) {
        var position = this.getNewScalePosition(scale.clientHeight+2,scale.clientWidth+2,scale.id);
        var mapcont = document.getElementById(this.mapid);
        var scalec = document.getElementById("scalecontainer");
        var gn = scale.id;
        if ( scale.parentNode == scalec ) {
            var ch = scalec.removeChild(scale);
            mapcont.appendChild(ch); 
            scale = ch;
        }
        scale.style.left = position[0] + "px";
        scale.style.top = position[1] + "px";
        scale.style.display = "block";
    }
}

GMapWrapper.prototype.removeScale = function(group) {
    if ( this.scales && this.scales[group] != null ) {
        scale = this.scales[group];
        this.scales[group] = null;
        scale.style.display = "none";
        this.mbl.removeBlock(scale.id);
        sc = scale.parentNode.removeChild(scale);
    }
}

GMapWrapper.prototype.fixScale = function () {
    this.createScaleButton();
    this.scales = new Array();

    objmap = this;
    this.width = document.body.clientWidth;
    this.height = document.body.clientHeight;
    GEvent.addDomListener(window, "resize", function(event) {
        for ( var i = 0 ; i < scalegroups.length; i++ ) {
            var j = scalegroups[i];
            if ( objmap.scales[j] ) {
                if ( objmap.scalePlacement == "topRight" ) {
                    objmap.scales[j].style.left = ((document.body.clientWidth-objmap.width)+(parseInt(objmap.scales[j].style.left.replace(/px/,"")))) + "px";
                }
            }
        }
        objmap.width = document.body.clientWidth;
        objmap.height = document.body.clientHeight;
    });

    if ( this.scalesShownOnLoad ) {
        this.toggleScalesOn();
    } else {
        this.toggleScalesOff();
    }
}

function overlap(b1,b2) {
    if ( ((b1[0]<b2[2])&&(b1[2]>b2[0])) &&
         ((b1[3]<b2[7])&&(b1[4]>b2[1])) ) {
        return true
    } else {
        return false;
    }
}


GMapWrapper.prototype.getNewScalePosition = function(height,width,id) {
    var mapcont = document.getElementById(this.mapid);
    var spacer = 4;
    if ( this.scalePlacement == "topRight" ) {
        var left = mapcont.offsetWidth - width - 6;
        // Google maps in IE offsets the control buttons by 2px, correct for
        // this
        if ( document.all ) left -= 3;
        var top = 29;
    }
    if ( this.scalePlacement == "topRightOutside" ) {
        var left = mapcont.offsetWidth + 17;
        var top = 0;
    }
    var found = false;
    var rfound = false;
    while ( ! found ) {
        var rfound = false;
        var scount = 0;
        for ( var i = 0; i < scalegroups.length; i++ ) {
            var sid = "scalegroup_" + scalegroups[i];
            var news = new Array(left-spacer,top-spacer,left+width+spacer,top-spacer,left+width+spacer,top+height+spacer,left-spacer,top+height+spacer);
            var el = document.getElementById(sid);
            if ( id != sid && el && el.style.display != "none" && el.parentNode != this.scalec ) {
                scount += 1;
                var l = parseInt(el.style.left.replace(/px/,""));
                var w = el.offsetWidth;
                var t = parseInt(el.style.top.replace(/px/,""));
                var h = el.offsetHeight;
                var olds = new Array(l,t,l+w,t,l+w,t+h,l,t+h);
                if ( overlap(news,olds) ) {
                    if ( this.scalePlacement == "topRight" ) {
                        top = t+h+spacer;
                        left = l+w-width;
                        continue;
                    }
                    if ( this.scalePlacement == "topRightOutside" ) {
                        top = t+h+spacer;
                        left = l;
                        continue;
                    }
                    top = Math.random()*mapcont.offsetHeight;
                    left = Math.random()*mapcont.offsetWidth;
                    continue;
                } else {
                    rfound = true;
                }
            } 
            if ( scount == 0 || rfound == true  ) {
                found = true;
            }
        }
    }

    return new Array(left,top);
}



/***************************
 * GMapLegend.createScaleButton
 * 
 * Creates a scale button if it doesn't already
 * exist and scale has been active.
 ****************************/
GMapWrapper.prototype.createScaleButton = function() {
    var sbutton = document.getElementById("ScaleButton");
    if ( sbutton ) {
        if ( this.showScalesOnLoad ) {
             sbutton.className="selected";
             this.scalesShown = true;
        } else {
             sbutton.className="normal";
             this.scalesShown = false;
        }
        return sbutton;
    }

    var gbuttons = document.getElementById("GButtons");
    if ( ! gbuttons ) {
        var gbuttons = document.createElement("div");
        gbuttons.id = "GButtons";
        var wrapper = document.getElementById(this.mapid);
        if ( ! wrapper ) {
            return null;
        }
        wrapper.appendChild(gbuttons);
    }
   
    outer = document.createElement("div");
    outer.className="outer"
    gbuttons.appendChild(outer);
    
    var sbutton = document.getElementById("ScaleButton");
    if ( ! sbutton ) {
        sbutton = document.createElement("div");
        sbutton.id = "ScaleButton";
        sbutton.setAttribute("title","Show Scale");
        sbutton.className = "normal";
        sbutton.innerHTML = "Scale";
        outer.appendChild(sbutton);
    }

    scalec = document.getElementById("scalecontainer");
    if ( ! scalec ) {
        scalec = document.createElement("div");
        scalec.id = "scalecontainer";
        bodies = document.getElementsByTagName("body");
        bodies[0].appendChild(scalec);
    }

    if ( this.showScalesOnLoad ) {
         sbutton.className="selected";
         this.scalesShown = true;
    } else {
         sbutton.className="normal";
         this.scalesShown = false;
    }

    var obj = this;
    GEvent.addDomListener(sbutton, "click", function(event) {
        obj.toggleScale(event); });
    return sbutton;
}

GMapWrapper.prototype.toggleScalesOn = function () {
    var sb = document.getElementById("ScaleButton");
    sb.className = "selected";
    this.scalesShown = true;

    for ( var i = 0; i < scalegroups.length; i++ ) {
        var id = "scalegroup_" + scalegroups[i];
        var el = document.getElementById(id);
        if ( el && el.parentNode != "scalecontainer" ) {
            el.style.display = "block";
        }
    }

    for ( var i = 0; i < scalefiles.length; i++ ) {
        var idx = this.getLayerWithLabel(scalelayers[i]);
        if ( this.layers[idx].shown ) {
            if ( this.layers[idx].abbreviation == "Surface Currents (6Km)") {
                var layergroup = "currents";
            } else {
                var layergroup = "models";
            }
            if ( (! this.scales || (this.scales.length < 1) || this.scales[layergroup] != null )) {
                this.addScale(scalefiles[i],layergroup);
            }
        }
    } 
}

GMapWrapper.prototype.toggleScalesOff = function () {
    var sb = document.getElementById("ScaleButton");
    this.scalesShown = false;
    if ( sb ) sb.className = "normal";
    for ( var i = 0; i < scalegroups.length; i++ ) {
        var id = "scalegroup_" + scalegroups[i];
        var el = document.getElementById(id);
        if ( el ) {
            el.style.display = "none";
        }
    }
}

GMapWrapper.prototype.toggleScale = function (event) {
    var scalec = document.getElementById("scalecontainer");
    event.cancelBubble = true;
    if ( this.scalesShown == true ) {
        this.toggleScalesOff();
    } else {
        this.toggleScalesOn();
    }
}


function local_onload() {
}


function closeInfoWindow(event) {
    if ( !event ) event = window.event;
    var target = (event.target) ? event.target : event.srcElement; 
    var parent = target.parentNode;
    parent.className = parent.className.replace(/openediw/,"");
    var iw = document.getElementById("mapinfoblock");
    iw.innerHTML = "";
}

// ]]>
//-->
