/* Copyright (c) 2006-2009 Philip Gladstone All rights reserved
 **************************************/
var geocoder;

function setClickPos(point, div, doel) {
    if (point) {
        var d = document.getElementById('themapclick');
        if (d) {
            var ns = point.lat() >= 0 ? "N" : "S";
            var lat = Math.abs(point.lat()) + 0.5 / 3600;
            document.getElementById('latdms').innerHTML = "%d&deg; %d' %d&quot; %s".sprintf(Math.floor(lat), Math.floor(lat * 60) % 60, Math.floor(lat * 3600) % 60, ns);
            document.getElementById('latdec').innerHTML = "%.5f&deg;".sprintf(point.lat());
            document.getElementById('latloran').innerHTML = "%02d%02d.%02d%s".sprintf(Math.floor(lat), Math.floor(lat * 60) % 60, Math.floor(lat * 6000) % 100, ns);
            var ew = point.lng() >= 0 ? "E" : "W";
            var lng = Math.abs(point.lng()) + 0.5 / 3600;
            document.getElementById('londms').innerHTML = "%d&deg; %d' %d&quot; %s".sprintf(Math.floor(lng), Math.floor(lng * 60) % 60, Math.floor(lng * 3600) % 60, ew);
            document.getElementById('londec').innerHTML = "%.5f&deg;".sprintf(point.lng());
            document.getElementById('lonloran').innerHTML = "%03d%02d.%02d%s".sprintf(Math.floor(lng), Math.floor(lng * 60) % 60, Math.floor(lng * 6000) % 100, ew);
            d.style.position = 'static';
            d.style.visibility = 'visible';
        }
        d = document.getElementById('click' + div);
        d.style.position = 'static';
        d.style.visibility = 'visible';
        d = document.getElementById('click' + (1 - div));
        d.style.position = 'absolute';
        d.style.visibility = 'hidden';
        document.updateform.position.value = point.toString();
        document.updateform.thepoint = point;
        document.updateform.elevation.value = "";
        d = document.getElementById('clickel');
        d.style.visibility = 'hidden';
        d = document.getElementById('clickloc');
        if (d) {
            d.style.visibility = 'hidden';
        }
        if (doel) {
            loadXMLDoc("/cgi-bin/wx-get-elevation.pl?lat=" + point.lat() + "&lng=" + point.lng(), GotElevation);
            if (!geocoder) {
                geocoder = new GClientGeocoder();
            }
            geocoder.getLocations(point, showClickPosAddress);
        }
    }
}

function showClickPosAddress(response) {
    if (response && response.Status.code == 200) {
        var place = response.Placemark[0];
        var d = document.getElementById('clicklocval');
        if (d) {
            d.innerHTML = escapeHTML(place.address);
            d = document.getElementById('clickloc');
            d.style.visibility = 'visible';
        }
    }
}

function GotElevation(req) {
  if (req.readyState == 4 && req.status == 200 && req.responseXML != null) {
    var position = req.responseXML.getElementsByTagName( 'position' )[0];

    if (position && 
        position.getAttribute('lat').toString() == document.updateform.thepoint.lat() &&
        position.getAttribute('lng').toString() == document.updateform.thepoint.lng()) {
        d = document.getElementById('clickel');
        d.style.visibility = 'visible';
        d = document.getElementById('clickelval');
        document.updateform.elevation.value = position.getAttribute('ele').toString();
        d.innerHTML = "%d".sprintf(position.getAttribute('ele').toString());
        d = document.getElementById('clickelvalfeet');
        d.innerHTML = "%d".sprintf(position.getAttribute('ele').toString() * 3.281);
        d = document.getElementById('clickelsrc');
        d.innerHTML = position.getAttribute('id').toString();
    }
  }
}

function validateUpdateForm() {
    var email = document.updateform.from.value;
    if (email.search(/^[^@]+@[-a-z0-9.]+ *$/i) < 0) {
        alert("Please enter a valid email address.");
        return false;
    }
    if (document.updateform.position.value == "") {
        alert("Please drag the marker on the map to select the correct location of the station.");
        return false;
    }
    if (document.updateform.body.value.length < 10) {
        alert("Please explain how you know that the point you have marked is the correct location of the weather station. If it is not, then please just press cancel on the form.");
        return false;
    }
    return true;
}

function hidePopup(div) {
    var d = document.getElementById(div);
    var ds = document.getElementById(div + "_shadow");
    d.style.visibility = 'hidden';
    ds.style.visibility = 'hidden';
}

function hideUpdate() {
    var d = document.getElementById("updatediv");
    var ds = document.getElementById("updatediv_shadow");
    d.style.visibility = 'hidden';
    ds.style.visibility = 'hidden';
}

function generatePopup(event, div) {
    var d = document.getElementById(div);
    var ds = document.getElementById(div + "_shadow");

    if (event == null) {
        event = window.event;
    }

    var pos = mouseCoords(event);

    d.style.top = pos.y + "px";
    d.style.left = pos.x + "px";
    ds.style.top = (pos.y + 6) + "px";
    ds.style.left = (pos.x + 6) + "px";

    ds.style.width = d.offsetWidth + "px";
    ds.style.height = d.offsetHeight + "px";

    d.style.visibility = 'visible';
    ds.style.visibility = 'visible';

    return false;
}

function generateUpdate(event, site) {
    var d = document.getElementById("updatediv");
    var ds = document.getElementById("updatediv_shadow");

    if (document.updateform.position.value == "") {
        alert("Please drag the marker on the map to select the correct location of the station.");
        return false;
    }

    if (event == null) {
        event = window.event;
    }

    var pos = mouseCoords(event);

    d.style.top = pos.y + "px";
    d.style.left = pos.x + "px";
    ds.style.top = (pos.y + 6) + "px";
    ds.style.left = (pos.x + 6) + "px";

    ds.style.width = d.offsetWidth + "px";
    ds.style.height = d.offsetHeight + "px";

    document.updateform.from.style.width = (document.updateform.body.offsetWidth - (document.updateform.from.offsetLeft - document.updateform.body.offsetLeft)) + "px";

    d.style.visibility = 'visible';
    ds.style.visibility = 'visible';
    if (document.updateform.thepoint != null) {
        var map = document.getElementById("mapthemap").gmapobject;
        map.panTo(document.updateform.thepoint);
        getBestZoom(map, document.updateform.thepoint, 3);
    }

    return false;
}

function escapeHTML(str) {
    var div = document.createElement('div');
    var text = document.createTextNode(str);
    div.appendChild(text);
    return div.innerHTML;
} 

function hideClickLocDiv() {
    var d = document.getElementById("clicklocdiv");
    var ds = document.getElementById("clicklocdiv_shadow");
    var de = document.getElementById("clicklocerror");
    d.style.visibility = 'hidden';
    ds.style.visibility = 'hidden';
    de.style.visibility = 'hidden';
    return false;
}

function moveMarkerToAddress(addr) {
    geocoder.getLatLng(addr, function (point) {
        if (!point) {
            var d = document.getElementById('clicklocerror');
            d.style.visibility = 'visible';
        } else {
            setClickPos(point, 1, 1);
            var map = document.getElementById("mapthemap").gmapobject;
            map.dragLatLng = point;
            map.dragLabel.setPoint(point);
            map.panTo(point);
            FlickrPoint(point);
            if (map.streetviewname) {
                streetviewStart(point, map.streetviewname);
            }
            hideClickLocDiv();
        }
    });

    return false;
}

function enableClickLocDiv(event, addr) {
    var d = document.getElementById("clicklocdiv");
    var ds = document.getElementById("clicklocdiv_shadow");
    var de = document.getElementById("clicklocerror");

    if (event == null) {
        event = window.event;
    }

    var pos = mouseCoords(event);

    d.style.top = pos.y + "px";
    d.style.left = pos.x + "px";
    ds.style.top = (pos.y + 6) + "px";
    ds.style.left = (pos.x + 6) + "px";

    ds.style.width = d.offsetWidth + "px";
    ds.style.height = d.offsetHeight + "px";

    document.locupdateform.address.style.width = (parseInt(d.style.width, 10) - document.locupdateform.address.offsetLeft) + "px";

    document.locupdateform.address.value = addr;

    d.style.visibility = 'visible';
    ds.style.visibility = 'visible';
    de.style.visibility = 'hidden';

    return false;
}

function getAcceptableZoom(map, point, limit) {
    getAcceptableZoomInt(map, point, 0, function () { getAcceptableZoomInt(map, point, limit, 0); } );
}

function getAcceptableZoomInt(map, point, limit, onerror) {
    var z = map.getZoom();
    var mt = map.getCurrentMapType();
    var mnz = mt.getMinimumResolution(point);
    var prj = mt.getProjection();
    var size = mt.getTileSize();
    var layers = mt.getTileLayers();

    map.acceptableZoom = z - limit;

    for (var i = 0; i <= limit; i++) {
        if (z - i < mnz) break;
        // Find the tile layer
        for (var j = 0; j < layers.length; j++) {
            var layer = layers[j];

            if ((z-i) <= layer.maxResolution() && (z-i) >= layer.minResolution()) {
                // Got the layer
                var tile = prj.fromLatLngToPixel(point, z - i);
                var url = layer.getTileUrl(new GPoint(Math.floor(tile.x / size), Math.floor(tile.y/size)), (z - i));
                var im = new Image();
                im.onload = makeAcceptableZoom(im, map, point, z - i, onerror);
                if (onerror) {
                    im.onerror = onerror;
                    im.onabort = onerror;
                }
                im.src = url;
            }
        }
    }
}
 
function makeAcceptableZoom(im, map, point, zoom, onerror) {
    return function () { if (im.width > 0) { acceptableZoom(map, point, zoom); } else { if (onerror) onerror(); }}
}

function acceptableZoom(map, point, zoom) {
    if (map.acceptableZoom <= zoom) {
        map.acceptableZoom = zoom;
        map.setCenter(point, zoom);
    }
}

function getBestZoom(map, point, limit) {
    var z = map.getZoom();
    var mt = map.getCurrentMapType();
    var mxz = mt.getMaximumResolution(point);
    var prj = mt.getProjection();
    var size = mt.getTileSize();
    var layers = mt.getTileLayers();

    for (var i = 1; i <= limit; i++) {
        if (i + z > mxz) break;
        // Find the tile layer
        for (var j = 0; j < layers.length; j++) {
            var layer = layers[j];

            if ((i+z) <= layer.maxResolution() && (i+z) >= layer.minResolution()) {
                // Got the layer
                var tile = prj.fromLatLngToPixel(point, i + z);
                var url = layer.getTileUrl(new GPoint(Math.floor(tile.x / size), Math.floor(tile.y/size)), (i + z));
                var im = new Image();
                im.onload = makeIncreaseZoom(im, map, point, i + z);
                im.src = url;
            }
        }
    }
}
 
function makeIncreaseZoom(im, map, point, zoom) {
    return function () { if (im.width > 0) { increaseZoom(map, point, zoom); } }
}

function increaseZoom(map, point, zoom) {
    if (map.getZoom() < zoom) {
        map.setCenter(point, zoom);
    }
}

function getPos(el) {
    var x = el.offsetLeft;
    var y = el.offsetTop;
    while ((el = el.offsetParent) != null) {
        x += el.offsetLeft;
        y += el.offsetTop;
    }

    return new GPoint(x, y);
}

function tlCoords(obj) {
    return {x: obj.left, y: obj.top };
}

function setupDraggableObject(map) {
    if (map.draggableObject) {
        GEvent.addListener(map.draggableObject, 'clearlisteners', function(event) {
            setupDraggableObject(map);
        });
        GEvent.addListener(map.draggableObject, 'dragstart', function(event) {
            map.dragStart = tlCoords(this);
            if (map.clickMarker) {
                map.removeOverlay(map.clickMarker);
                map.clickMarker = null;
            }
        });
        GEvent.addListener(map.draggableObject, 'drag', function(event) {
            var newPos = tlCoords(this);
            var pt = map.fromLatLngToDivPixel(map.dragLatLng);
            var point = new GPoint(newPos.x - map.dragStart.x + pt.x, newPos.y - map.dragStart.y + pt.y);
            setClickPos(map.fromDivPixelToLatLng(point), 1);
        });
        GEvent.addListener(map.draggableObject, 'dragend', function(event) {
            var newPos = tlCoords(this);
            var pt = map.fromLatLngToDivPixel(map.dragLatLng);
            var point = new GPoint(newPos.x - map.dragStart.x + pt.x, newPos.y - map.dragStart.y + pt.y);
            var ll = map.fromDivPixelToLatLng(point);
            //var pt2 = map.fromLatLngToDivPixel(ll);

            //if (point.x != pt2.x || point.y != pt2.y) {
                //alert("point.x=" + point.x + ", point.y=" + point.y + ", x=" + pt2.x + ", y=" + pt2.y);
            //}
            
            setClickPos(ll, 1, 1);
            map.dragLatLng = ll;
            map.dragLabel.setPoint(ll);
            FlickrPoint(ll);
            if (map.streetviewname) {
                streetviewStart(ll, map.streetviewname);
            }
        });
    }
}

function handleClick(map, point) {
    if (point) {
        var icon = new GIcon(baseicon); 
        icon.image = "/llmarker/" + point.y + "," + point.x + ",mark.png"; 
        if (icon.image != map.lastClickMarker) {
            map.lastClickMarker = icon.image;
            icon.iconSize = new GSize(125,44);
            icon.iconAnchor = new GPoint(1, 41);
            if (map.clickMarker) {
                map.removeOverlay(map.clickMarker);
            }
            map.clickMarker = new GMarker(point, icon);
            map.addOverlay(map.clickMarker);
        }

        setClickPos(point, 0, 1);
    }
}


/* Copyright (c) 2005 Scott S. McCoy
 * This was originally a non-object oriented interface
 * Function printf(format_string,arguments...)
 * Javascript emulation of the C printf function (modifiers and argument types 
 *    "p" and "n" are not supported due to language restrictions)
 *
 * Copyright 2003 K&L Productions. All rights reserved
 * http://www.klproductions.com 
 *
 * Terms of use: This function can be used free of charge IF this header is not
 *               modified and remains with the function code.
 * 
 * Legal: Use this code at your own risk. K&L Productions assumes NO resposibility
 *        for anything.
 ********************************************************************************/

String.prototype.sprintf = function () {
  var fstring = this.toString();

  var pad = function(str,ch,len) { var ps='';
      for(var i=0; i<Math.abs(len); i++) {
          ps+=ch;
      }
      return len>0?str+ps:ps+str;
  };
  var processFlags = function(flags,width,rs,arg) { 
      var pn = function(flags,arg,rs) {
          if(arg>=0) { 
              if(flags.indexOf(' ')>=0) {
                  rs = ' ' + rs;
              } else if(flags.indexOf('+')>=0) {
                  rs = '+' + rs;
              }
          } else {
              rs = '-' + rs;
          }
          return rs;
      };
      var iWidth = parseInt(width,10);
      if(width.charAt(0) == '0') {
          var ec=0;
          if(flags.indexOf(' ')>=0 || flags.indexOf('+')>=0) {
              ec++;
          }
          if(rs.length<(iWidth-ec)) {
              rs = pad(rs,'0',rs.length-(iWidth-ec));
          }
          return pn(flags,arg,rs);
      }
      rs = pn(flags,arg,rs);
      if(rs.length<iWidth) {
          if(flags.indexOf('-')<0) {
              rs = pad(rs,' ',rs.length-iWidth);
          } else {
              rs = pad(rs,' ',iWidth - rs.length);
          }
      }    
      return rs;
  };
  var converters = [];
  converters.c = function(flags,width,precision,arg) { 
      if (typeof(arg) == 'number') {
          return String.fromCharCode(arg);
      } else if (typeof(arg) == 'string') {
          return arg.charAt(0);
      } else {
          return '';
      }
  };
  converters.d = function(flags,width,precision,arg) { 
      return converters.i(flags,width,precision,arg); 
  };
  converters.u = function(flags,width,precision,arg) { 
      return converters.i(flags,width,precision,Math.abs(arg)); 
  };
  converters.i =  function(flags,width,precision,arg) {
      var iPrecision=parseInt(precision, 10);
      var rs = ((Math.abs(arg)).toString().split('.'))[0];
      if(rs.length<iPrecision) {
          rs=pad(rs,' ',iPrecision - rs.length);
      }
      return processFlags(flags,width,rs,arg); 
  };
  converters.E = function(flags,width,precision,arg) {
      return (converters.e(flags,width,precision,arg)).toUpperCase();
  };
  converters.e = function(flags,width,precision,arg) {
      iPrecision = parseInt(precision, 10);
      if(isNaN(iPrecision)) {
          iPrecision = 6;
      }
      rs = (Math.abs(arg)).toExponential(iPrecision);
      if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) {
          rs = rs.replace(/^(.*)(e.*)$/,'$1.$2');
      }
      return processFlags(flags,width,rs,arg);        
  };
  converters.f = function(flags,width,precision,arg) { 
      iPrecision = parseInt(precision, 10);
      if(isNaN(iPrecision)) {
          iPrecision = 6;
      }
      rs = (Math.abs(arg)).toFixed(iPrecision);
      if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) {
          rs = rs + '.';
      }
      return processFlags(flags,width,rs,arg);
  };
  converters.G = function(flags,width,precision,arg) { 
      return (converters.g(flags,width,precision,arg)).toUpperCase();
  };
  converters.g = function(flags,width,precision,arg) {
      iPrecision = parseInt(precision, 10);
      absArg = Math.abs(arg);
      rse = absArg.toExponential();
      rsf = absArg.toFixed(6);
      if(!isNaN(iPrecision)) { 
          rsep = absArg.toExponential(iPrecision);
          rse = rsep.length < rse.length ? rsep : rse;
          rsfp = absArg.toFixed(iPrecision);
          rsf = rsfp.length < rsf.length ? rsfp : rsf;
      }
      if(rse.indexOf('.')<0 && flags.indexOf('#')>=0) {
          rse = rse.replace(/^(.*)(e.*)$/,'$1.$2');
      }
      if(rsf.indexOf('.')<0 && flags.indexOf('#')>=0) {
          rsf = rsf + '.';
      }
      rs = rse.length<rsf.length ? rse : rsf;
      return processFlags(flags,width,rs,arg);        
  };  
  converters.o = function(flags,width,precision,arg) { 
      var iPrecision=parseInt(precision, 10);
      var rs = Math.round(Math.abs(arg)).toString(8);
      if(rs.length<iPrecision) {
          rs=pad(rs,' ',iPrecision - rs.length);
      }
      if(flags.indexOf('#')>=0) {
          rs='0'+rs;
      }
      return processFlags(flags,width,rs,arg); 
  };
  converters.X = function(flags,width,precision,arg) { 
      return (converters.x(flags,width,precision,arg)).toUpperCase();
  };
  converters.x = function(flags,width,precision,arg) { 
      var iPrecision=parseInt(precision, 10);
      arg = Math.abs(arg);
      var rs = Math.round(arg).toString(16);
      if(rs.length<iPrecision) {
          rs=pad(rs,' ',iPrecision - rs.length);
      }
      if(flags.indexOf('#')>=0) {
          rs='0x'+rs;
      }
      return processFlags(flags,width,rs,arg); 
  };
  converters.s = function(flags,width,precision,arg) { 
      var iPrecision=parseInt(precision, 10);
      var rs = arg;
      if(rs.length > iPrecision) {
          rs = rs.substring(0,iPrecision);
      }
      return processFlags(flags,width,rs,0);
  };

  farr = fstring.split('%');
  retstr = farr[0];
  fpRE = /^([-+ #]*)(?:(\d*)\$|)(\d*)\.?(\d*)([cdieEfFgGosuxX])(.*)$/;
  for(var i = 1; i<farr.length; i++) { 
      fps=fpRE.exec(farr[i]);
      if(!fps) {
          continue;
      }
      var my_i = fps[2] ? fps[2] : i;
      //if(arguments[my_i-1]) {
          retstr+=converters[fps[5]](fps[1],fps[3],fps[4],arguments[my_i-1]);
      //}
      retstr += fps[6];
  }
  return retstr;
};


