/*  Copyright 2005, CAH Consulting  All rights reserved.
 *   v.0.6.3 fix Xslt to work with safari
 *   v.0.6.2 display infowindows using Xslt
 *   v.0.6.1 faster reloads by eliminating a lot of string concatentations
 *   v.0.6 Support for LoadSmall() a bare bones map for inclusion in other pages via frames.
 *          deleted some bad function calls.(fx,ie,op)
 *   v.0.5.1    tooltips added  (ie,fx,op,online check)
 *   v.0.5      multiple markers available
 * DEPENDS ON
 *  gauge.xsl to produce info box
 */
// Class to buffer strings.  Marginal speed up.
 function StrBuffer() {this.buffer = [];}
 StrBuffer.prototype.add = function add(string) {this.buffer.push(string);return this; }
 StrBuffer.prototype.output = function output() {   return this.buffer.join(""); }
// === Draw initialPage - standard
function initialPage(){
    printLegend("default");
    addElementText("comform",'<h3>Add a Gauge:</h3><form name="usgsform"><input type="text" name="usgsid" value="" size="10"/><button type="reset" onclick="addUSGS(this.form.usgsid.value,icon);">+USGS</button><button type="reset" onclick="addAFWS(this.form.usgsid.value,icon);">+AFWS</button><a href="http://waterdata.usgs.gov/nwis/" target="_new">usgs</a> | <a href="http://www.afws.net">afws</a></form>');
    addElementText ("footer",'&copy;2005 CAH Consulting, Inc - <a href="priacy.html">Privacy Policy</a> - <a href=/help/>Help</a> ');
    addElementText("localAds",'<a href="http://www.americanwhitewater.org">Support American Whitewater</a><br />');
}
// ====  Methods to adjust parts of documents - standard
function addCommessage (txt){document.getElementById("commessage").innerHTML=txt;}
function addMessage(txt){document.getElementById("message").innerHTML=txt;}
function addElementText(elem,txt){document.getElementById(elem).innerHTML=txt;}
//====Browser utilities =======================================
//----set cookies----------------------------------------------
function setCookie(c_name,value,expiredays){
    var exdate=new Date();
    exdate.setDate(expiredays);
    document.cookie=c_name+ "=" +escape(value)
        +((expiredays==null) ? "" : ";expires="+exdate);
}
//----get cookies - standard
function getCookie(c_name){
    if (document.cookie.length>0){
        c_start=document.cookie.indexOf(c_name + "=");
        if (c_start!=-1){
            c_start=c_start + c_name.length+1;
            c_end=document.cookie.indexOf(";",c_start);
            if (c_end==-1)
                {c_end=document.cookie.length;}
            return unescape(document.cookie.substring(c_start,c_end));
        }
    }
    return null;
}
//---- set map cookies --------------------------------------------
function setMapCookie(){
    var point = map.getCenterLatLng();
    var zoom = map.getZoomLevel();
    setCookie("map",point.x+"|"+point.y+"|"+zoom,365);
}
//==== Marker Manipulation ====================================
//---- update gauges in database + forecasts -------------------
function UpdateMarkers(map,gmarker,icon){
    GetMarkersXML(map,gmarker,icon);
//    UpdateGauges("num=1");
    UpdateForecasts("num=1");
}
function UpdateGauges(str){
    var request = GXmlHttp.create();
    var url ="/services/gaugePing.php?"+str;
    request.open("GET",url,true);
    request.send(null);
    request.onreadystatechange=function (){
      if(request.readyState==4){
        addCommessage("gauges updated");
      }
    }
}
//---- update forecasts in database -------------------
function UpdateForecasts(str){
    var request = GXmlHttp.create();
    var url ="/services/weatherPing.php?"+str;
    request.open("GET",url,true);
    request.send(null);
    request.onreadystatechange=function(){
        if (request.readyState==4){
            addCommessage("weather updated...ready");};};
}
//---- create a AFWS marker - add to DB------------------------
function addAFWS(id,icon){
    addCommessage("downloading USGS data--sending request");
    var request = GXmlHttp.create();var url ="/services/gaugeXML.php?afwsid="+id;
    request.open("GET",url,true);
    request.onreadystatechange = function(){
        if(request.readyState==4){
            var xmlDoc = request.responseXML;
            GetMarkersXML(map,gmarker,icon);}};
    request.send(null);
}
//---- create a USGS marker - add to DB------------------------
function addUSGS(id,icon){
    addCommessage("downloading USGS data--sending request");
    var request = GXmlHttp.create();var url ="/services/gaugeXML.php?usgsid="+id;
    request.open("GET",url,true);
    request.onreadystatechange = function(){
        if(request.readyState==4){
            var xmlDoc = request.responseXML;
            GetMarkersXML(map,gmarker,icon);}};
    request.send(null);
}
//---- display markers on current screen ----------------------
//  This code uses a marker array
function GetMarkersXML(map,gmarker,ricon) {
    addCommessage('loading');
    var request=GXmlHttp.create();
    var bounds=map.getBoundsLatLng();
    var url="/services/markers.php?maxX="+bounds.maxX+"&minX="+bounds.minX
        +"&minY="+bounds.minY+"&maxY="+bounds.maxY;
    request.open("GET", url, true);
    // ===== handle ready state change ============================
    request.onreadystatechange=function() {
    if (request.readyState==4) {
        var xmlDoc=request.responseXML;
        var markers=xmlDoc.documentElement.getElementsByTagName("mrk");
        var index=new Array();
        // ---- move markers off map -------------------------------------
        for (var c in gmarker){
            index[c]=0;
            for (var i=0; i<gmarker[c].length;i++){
                gmarker[c][i].point.y=90;
                gmarker[c][i].redraw(true);
            }
        }
        // ---- now draw relevant markers ---
        for (var i = 0; i < markers.length; i++) {
            var color =markers[i].getAttribute("color");
            if (gmarker[color].status){
                var j = index[color];
                index[color]++;
                if (j < gmarker[color].length){
                    gmarker[color][j].point.x=parseFloat(markers[i].getAttribute("lng"));
                    gmarker[color][j].point.y=parseFloat(markers[i].getAttribute("lat"));
                    // make sure to mover marker
                    gmarker[color][j].redraw(true);
                }else{
                    gmarker[color][j]= new GMarker(
                        new GPoint(parseFloat(markers[i].getAttribute("lng")),
                        parseFloat(markers[i].getAttribute("lat"))),
                        ricon[color]);
                    map.addOverlay(gmarker[color][j]);
                    // LOCAL add local info as the .gauge attribute
                    gmarker[color][j].gauge = new Array();
                    // TOOLTIP try to figure out which is the tooltip... sort of a hack
                    if (gmarker[color][j].transparentIcon){
                        gmarker[color][j].gauge.ToolTip = gmarker[color][j].transparentIcon;
                    } else if (gmarker[color][j].imageMap){
                        gmarker[color][j].gauge.ToolTip = gmarker[color][j].imageMap;
                    } else {
                        gmarker[color][j].gauge.ToolTip = gmarker[color][j].iconImage;
                    }
                }
                gmarker[color][j].gauge.id=markers[i].getAttribute("id");
                gmarker[color][j].gauge.forecast = markers[i].getAttribute("rain24");
                gmarker[color][j].gauge.ToolTip.setAttribute(
                        "title" , markers[i].getAttribute("name")+" click marker for info");
            }
        }
        addCommessage('done.');
    }}
    request.send(null);
}
// ====  A few utilities to create icons and markers =======================
// ---- create an icon of specified color ----------------------------------
function makeIcon(color){
    var ricon = new GIcon();
    ricon.image = "/pics/mm_20_"+color+".png";
    ricon.shadow = "/pics/mm_20_shadow.png";
    ricon.iconSize = new GSize(12,20);
    ricon.shadowSize=  new GSize(22,20);
    ricon.iconAnchor=new GPoint(6,17);
    ricon.infoWindowAnchor=new GPoint(5,10);
    return ricon;
}
// ---- create an array of icons -----------------------------------------
function makeIconArray(){
    var icon=new Array();
    icon['white']=makeIcon("white");
    icon['red']=makeIcon("red");
    icon['yellow']=makeIcon("yellow");
    icon['green']=makeIcon("green");
    icon['blue'] =makeIcon("blue");
    return icon;
}
// ---- create marker array ---------------------------------------------
function markerArray(){
    var gmarker=new Array();
    gmarker['white']=new Array();
    gmarker['green']=new Array();
    gmarker['red']=new Array();
    gmarker['yellow']=new Array();
    gmarker['blue']=new Array();
    gmarker.white.status = true;
    gmarker.green.status =true;
    gmarker.red.status=true;
    gmarker.yellow.status=true;
    gmarker.blue.status=true;
    return gmarker;
}
// ==== Display functions ============================================
// ---- put form to add interpretation on screen ---------------------
function submitInterpretationForm (){
    var form=document.getElementById("interp");
    var request= GXmlHttp.create()
    request.open('POST', form.action , true);
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    request.send('id='+form.id.value+'&s_low='+form.s_low.value+'&s_good='
        +form.s_good.value+'&s_high='+form.s_high.value+'&type='+form.type.value);
    addMessage('thanks for the submission');
    setTimeout("GetMarkersXML(map,gmarker,icon)",4000);
}
function displayInterpretationForm (id,riverName){
   var html = new StrBuffer();
   html.add('<h2>' + riverName + '</h2>');
   html.add('<form id="interp" action="/services/interp.php" target=_blank method="POST" > <select name="type"><option value="cfs" >cfs</option> <option value="stage" >stage</option> </select><br /> Minimum runnable:<input type="text" name="s_low"/><br /> Minimum good: <input type="text" name="s_good"/><br /> Minimum high: <input type="text" name="s_high"/> <input type="hidden" name="id" value="');
   html.add(  id  +  '"><br />');
   html.add(' <input type="button" value="Submit" onClick="return submitInterpretationForm()"/><br /></form>');
    addMessage(html.output());
}
// --- this function changes the document
function changeCheck(color){
   gmarker[color].status= !gmarker[color].status;
   GetMarkersXML(map,gmarker,icon);// addCommessage(color);
}
function colorCode(white,blue,green,yellow,red){
    a=new Array();
    a.white=white;
    a.blue=blue;
    a.green=green;
    a.yellow=yellow;
    a.red=red;
    return a;
}
function printLegend(type){
    var html="<h2>Legend - Gauge Interpretation</h2>"+"<table>";
    var a=colorCode('Unknown','High Water','Normal Water','Low','Too Low');
    var j=0;

    for (var i in a){
        if (j%3==0){ html += "<tr>";}
        html += "<td><input type='checkbox' checked='checked' onClick=\"changeCheck('"
            +i+"');\"/></td>"+"<td><img src='/pics/mm_20_"+i+".png' /></td><td>"+a[i]+"</td>";
        if(j%3==2) { html += '</tr>';}
        j++;
    }
    html+="<td colspan='3'>"+"</td>"+"</table>";
    addElementText("legend",html);//  document.getElementById("legend").innerHTML =html;
}
// ==== Start by updating all of this stuff=========================
//====  Main Body - Global Code ==========================================================
// Listening function
function drawInfo(overlay,mapStyle){
  var url="/services/gaugeXML.php?id="+overlay.gauge.id;
  var request=GXmlHttp.create();
  request.open("GET", url, true);
  request.send(null);
  request.onreadystatechange=function() {
    if (request.readyState==4) {
        var html = xsltProcess(request.responseXML, xmlHttp.responseXML);
        overlay.openInfoWindowHtml(html);
        if (mapStyle=='large'){
            var xmlDoc = request.responseXML;
            var tp = xmlDoc.documentElement.getElementsByTagName("type");
            if(tp[0].childNodes[0].nodeValue=='usgs'||tp[0].childNodes[0].nodeValue=='USGS'){
                var sid=xmlDoc.documentElement.getElementsByTagName("source-id")[0].childNodes[0].nodeValue;
                var imgwidth=300;
                addElementText("message", "<img src=/services/thumb.php?w="
                    +imgwidth+"&usgs="+sid+" alt='downloading...'/>"
              );

            } 
        }
    }
  }
}
function displayMap(map,x,y,zoom){
    map.centerAndZoom(new GPoint(x,y), zoom);
//    map.addControl(new GSmallZoomControl());
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    map.addControl(new GScaleControl());
}
function LoadRegular(){
    // ==== download settings from Cookie ==========
    var str= getCookie("map");
    if (!str) {str="-82|36|11";}
    var ar = str.split("|");
    // ==== Display map with small map conrols ==========================
    displayMap(map,ar[0],ar[1],ar[2]);
    //==== Draw markers initially ====
    GetMarkersXML(map,gmarker,icon);
    // ==== display intial page ==============================================
    initialPage ();
    //====  Create some event listeners ===========
    //----  Click a marker, bring up InfoWindow ----
    GEvent.addListener(map,"click",function(overlay, point){
        if (overlay){
          drawInfo(overlay,'large');
        }
        setMapCookie(map);
//        var pt = map.getCenterLatLng();
//        addElementText("URLfooter","?lng="+pt.x+"&lat="+pt.y+"&zoom="+map.getZoomLevel());
    });
    //==== if map moves redraw and set cookies
    var MaxZoom=12;
    GEvent.addListener(map,"moveend",function(){
        if(map.getZoomLevel()>MaxZoom)
            {map.zoomTo(MaxZoom);}
        else
            {setMapCookie(map);}
        UpdateMarkers(map,gmarker,icon);
    });
}
function LoadSmall(lat,lng,zoom){
    // ==== Display map with small map conrols ==========================
    map.centerAndZoom(new GPoint(lng,lat), zoom);
    map.addControl(new GSmallZoomControl());
    map.addControl(new GMapTypeControl());
    map.addControl(new GScaleControl());
    //==== Draw markers initially ====
    GetMarkersXML(map,gmarker,icon);
    //====  Create some event listeners ===========
    //----  Click a marker, bring up InfoWindow ----
    GEvent.addListener(map,"click",function(overlay, point){
        if (overlay){drawInfo(overlay,"small");}
    });
    //==== if map moves redraw and set cookies
    GEvent.addListener(map,"moveend",function(){
        UpdateMarkers(map,gmarker,icon);
    });
}
// =====
// ===== Global Script ==============================
// turn off annoying debugging info
logging__ = false;
xsltdebug = false;
xpathdebug = false;
// ===== ==========
if (GBrowserIsCompatible()){
    // import style sheet
    var xmlHttp = GXmlHttp.create();
    xmlHttp.open("GET", "gauge.xsl", false);
    xmlHttp.send(null);
    // update some gauges
    UpdateGauges("all");
    UpdateForecasts("num=1");
    var map = new GMap(document.getElementById("map"));
    var icon=makeIconArray();
    var gmarker=markerArray();
}
