var map;
var geocoder;
var markers = new Array;
var mgr;
var minZoom = 8;

var letBIcon = new GIcon(G_DEFAULT_ICON);
letBIcon.image = "images/markerB.png";
var letDIcon = new GIcon(G_DEFAULT_ICON);
letDIcon.image = "images/markerD.png";

function load() {
  if (GBrowserIsCompatible()) {
    G_PHYSICAL_MAP.getMinimumResolution = function () { return 4 };
    G_NORMAL_MAP.getMinimumResolution = function () { return 4 };
    G_SATELLITE_MAP.getMinimumResolution = function () { return 4 };
    G_HYBRID_MAP.getMinimumResolution = function () { return 4 }; 

    map = new GMap2(document.getElementById("map"));
    geocoder = new GClientGeocoder();

//    map.setCenter(new GLatLng(38,-96),4);  // United States
//    map.setCenter(new GLatLng(41.5,-81.8),10);  // Cleveland
    map.setCenter(new GLatLng(40.15,-82.76),7); // Ohio
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.enableScrollWheelZoom();
    map.enableContinuousZoom();
    mgr = new MarkerManager(map);

    GEvent.addListener(map,"zoomend",function() {
      if (!document.getElementById("curStore")) {
        if (map.getZoom() < minZoom) {
          var myHtml = "<div style=\'width: 100%; text-align: center;\'><br /><br />Enter your zipcode/city above or zoom in to display stores in the area.</div>";
          document.getElementById("info").innerHTML = myHtml;
        } else {
          var myHtml = "<div style=\'width: 100%; text-align: center;\'><br /><br />Select a brand to get prices or click on a store to begin.</div>";
          document.getElementById("info").innerHTML = myHtml;
        }
      } else if (map.getZoom() < minZoom) {
        map.closeInfoWindow();
      }
    });

    if (document.cookie != "") {
      document.getElementById("login").innerHTML = 'Logged in as <span style="font-weight: bold;">'+document.cookie.split("=")[1]+'</span> [<a href="javascript:void(0);" onclick="doLogout();">Log Out</a>] ';
      GDownloadUrl("getpage.php?r="+Math.random()+"&page=mcc", function(data, responseCode) {
        document.getElementById("mcc").innerHTML = data;
      });
    }

    refreshMarkers();
  }
}

function refreshMarkers() {
//  map.clearOverlays();
  var bounds = map.getBounds();
  var boundsSW = bounds.getSouthWest();
  var boundsNE = bounds.getNorthEast();
  GDownloadUrl("getstores.php?r="+Math.random()+"&swlat="+boundsSW.lat()+"&swlng="+boundsSW.lng()+"&nelat="+boundsNE.lat()+"&nelng="+boundsNE.lng(), function(data, responseCode) {
    var xml = GXml.parse(data);
    var mrkrs = xml.documentElement.getElementsByTagName("marker");
    for (i = 0; i < mrkrs.length; i++) {
      addMarker(mrkrs[i]);
    }
  });
}

function addMarker(mkrData) {
  var point = new GLatLng(parseFloat(mkrData.getAttribute("lat")),parseFloat(mkrData.getAttribute("lng")));
  var mkrID = parseInt(mkrData.getAttribute("id"));
  if (mkrData.getAttribute("type") == "B") {
    markers[mkrID] = new GMarker(point,{ icon: letBIcon });
  } else {
    markers[mkrID] = new GMarker(point,{ icon: letDIcon });
  }
  var myHtml = '<span class="iWin"><b>'+mkrData.getAttribute("name")+'</b><br />'+mkrData.getAttribute("address")+'<br />'+mkrData.getAttribute("city")+'<br /></span><img src="images/getinfo.png" alt="Get Info" style="width: 50px; height: 50px; position: absolute; right: 10px; top: 6px; cursor: pointer;" onclick="dispInfo('+mkrData.getAttribute("id")+');" /><span><a href="http://maps.google.com/maps?q='+mkrData.getAttribute("address")+', '+mkrData.getAttribute("city")+' ('+mkrData.getAttribute("name")+')" class="iWin" target="_blank">Get Directions</a></span>';
  GEvent.addListener(markers[mkrID],"click",function() {
    map.openInfoWindowHtml(point,myHtml);
  });
//  map.addOverlay(markers[mkrID]);
    mgr.addMarker(markers[mkrID],minZoom);
}

function goZip(zip) {
  document.getElementById("info").innerHTML = "<span style=\'font-style: italic;\'><br /><br />Loading . . .</span>";
  geocoder.getLatLng(
    zip,
    function(point) {
      if (!point) {
        alert(zip + " not found");
      } else {
        GDownloadUrl("getzoom.php?r="+Math.random()+"&lat=" + point.lat() + "&lng=" + point.lng(), function(data, responseCode) {
          var xml = GXml.parse(data);
          var result = xml.documentElement.getElementsByTagName("result");
          var zoom = parseInt(result[0].getAttribute("zoom"));
          if (zoom < minZoom) {
            document.getElementById("info").innerHTML = "<br /><br />There are no stores registered in your area at this time.  Please check back later.";
            return;
          }
          var lat = parseFloat(result[0].getAttribute("lat"));
          var lng = parseFloat(result[0].getAttribute("lng"));
          var storeid = parseInt(result[0].getAttribute("storeid"));
          point = new GLatLng(lat,lng);
          map.setCenter(point,Math.min(zoom,15));
          GEvent.trigger(markers[storeid],"click");
          dispInfo(storeid);
        });
      }
    }
  );
}

function dispInfo(id) {
  document.getElementById("info").innerHTML = "<span style=\'font-style: italic;\'><br /><br />Loading . . .</span>";
  GDownloadUrl("getinfo.php?r="+Math.random()+"&id=" + id, function(data, responseCode) {
    document.getElementById("info").innerHTML = data + '<input type="hidden" id="curStore" value="'+id+'" />';
  });
}

function getPrices(brand) {
  if (brand == "") {
    return;
  }
  if (map.getZoom() < minZoom) {
    alert("The search area is too large.  Please zoom in.");
    return;
  }
  document.getElementById("info").innerHTML = "<span style=\'font-style: italic;\'><br /><br />Loading . . .</span>";
  var bounds = map.getBounds();
  var boundsSW = bounds.getSouthWest();
  var boundsNE = bounds.getNorthEast();
  GDownloadUrl("getprices.php?r="+Math.random()+"&brand="+brand+"&swlat="+boundsSW.lat()+"&swlng="+boundsSW.lng()+"&nelat="+boundsNE.lat()+"&nelng="+boundsNE.lng(), function(data, responseCode) {
    document.getElementById("info").innerHTML = data;
  });
}

function showLogin() {
  GDownloadUrl("getpage.php?r="+Math.random()+"&page=login", function(data, responseCode) {
    document.getElementById("info").innerHTML = data;
  });
}

function showSignup() {
  GDownloadUrl("getpage.php?r="+Math.random()+"&page=signup", function(data, responseCode) {
    document.getElementById("info").innerHTML = data;
  });}

function showHelp() {
  document.getElementById("info").innerHTML = "<br /><br />This feature is coming soon.  Please check back later.";
}

function authLogin(email,pass) {
  GDownloadUrl("auth.php?r="+Math.random()+"&email="+email+"&pass="+pass, function(data, responseCode) {
    if (data == "") {
      document.getElementById("err").innerHTML = "Invalid e-mail/password";
      document.getElementById("email").value = "";
      document.getElementById("pass").value = "";
    } else {
      var expireDate = new Date();
      expireDate.setDate(expireDate.getDate()+1);
      document.cookie = "user=" + data + ";expires=" + expireDate.toGMTString();
      document.getElementById("info").innerHTML = '<br /><br />Welcome back <span style="font-weight: bold;">'+data+'</span>!';
      document.getElementById("login").innerHTML = 'Logged in as <span style="font-weight: bold;">'+data+'</span> [<a href="javascript:void(0);" onclick="doLogout();">Log Out</a>] ';
      GDownloadUrl("getpage.php?r="+Math.random()+"&page=mcc", function(data, responseCode) {
        document.getElementById("mcc").innerHTML = data;
      });
    }
  });
}

function doSignup() {
  var email = document.getElementById("email");
  var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
  if (!filter.test(email.value)) {
    alert("Please provide a valid email address");
    email.focus
    return false;
  }
  var user = document.getElementById("user").value.replace(/^\s+|\s+$/g, '') ;
  if (user == "") {
    alert("Please enter a username");
    return false;
  }
  var pass = document.getElementById("pass").value.replace(/^\s+|\s+$/g, '') ;
  if (pass == "") {
    alert("Please enter a password");
    return false;
  } else if (pass.length < 8) {
    alert("Password must be at least 8 characters long");
    return false;
  }
  GDownloadUrl("auth.php?r="+Math.random()+"&check=1&user="+user+"&email="+document.getElementById("email").value, function(data, responseCode) {
    if (data == "") {
      geocoder.getLocations(document.getElementById("cityst").value,verifyCitySt);
    } else {
      alert(data);
    }
  });
}

function doLogout() {
  var expireDate = new Date();
  expireDate.setDate(expireDate.getDate()-1);
  document.cookie = "user=;expires=" + expireDate.toGMTString();
  document.getElementById("login").innerHTML = '[<a href="javascript:void(0);" onclick="showLogin();">Log In</a>] [<a href="javascript:void(0);" onclick="showSignup();">Sign Up</a>] ';
  document.getElementById("mcc").innerHTML = '';
  GEvent.trigger(map,"zoomend");
}

function addStore() {
    GDownloadUrl("getpage.php?r="+Math.random()+"&page=addstore", function(data, responseCode) {
      document.getElementById("info").innerHTML = data;
    });
}

function editStore() {
  if (document.getElementById("curStore")) {
    id = document.getElementById("curStore").value;
    document.getElementById("info").innerHTML = "<span style=\'font-style: italic;\'><br /><br />Loading . . .</span>";
    GDownloadUrl("getpage.php?r="+Math.random()+"&page=editstore&store="+id, function(data, responseCode) {
      document.getElementById("info").innerHTML = data;
    });
  } else {
    alert("Please select a store by clicking the KEG INFO button in the store's info balloon on the map.");
  }
}

function addKeg() {
  if (document.getElementById("curStore")) {
    id = document.getElementById("curStore").value;
    document.getElementById("info").innerHTML = "<span style=\'font-style: italic;\'><br /><br />Loading . . .</span>";
    GDownloadUrl("getpage.php?r="+Math.random()+"&page=addkeg&store="+id, function(data, responseCode) {
      document.getElementById("info").innerHTML = data;
    });
  } else {
    alert("Please select a store by clicking the KEG INFO button in the store's info balloon on the map.");
  }
}

function editKeg() {
  document.getElementById("info").innerHTML = "<span><br /><br />This feature is not available yet.  Please check back later.</span>";
}

function doEditStore(doCheck) {
  if (doCheck) {
    if (validateStoreForm()) {
      geocoder.getLocations(document.getElementById("address").value,function(response) {
        verifyAddress(response,doEditStore);
      });
    }
    return false;
  } else {
    updateStores("updatestore");
  }
}

function doAddStore(doCheck) {
  if (doCheck) {
    if (validateStoreForm()) {
      geocoder.getLocations(document.getElementById("address").value,function(response) {
        verifyAddress(response,doAddStore);
      });
    }
    return false;
  } else {
    updateStores("insertstore");
  }
}

function doAddKeg() {
  if (validateKegForm()) {
    updateKegs("insertkeg");
  }
  return false;
}

function updateStores(page) {
    var str = "&name="+document.getElementById("name").value;
    str += "&address="+document.getElementById("address").value;
    str += "&phone="+document.getElementById("phone").value;
    str += "&website="+document.getElementById("website").value;
    var types = document.getElementsByName("type");
    for (var i=0;i<types.length;i++) {
      if (types[i].checked) {
        str += "&type="+types[i].value;
      }
    }
    str += "&tax="+document.getElementById("tax").value;
    str += "&kdeposit="+document.getElementById("kdeposit").value;
    str += "&tdeposit="+document.getElementById("tdeposit").value;
    str += "&tapfee="+document.getElementById("tapfee").value;
    var pmts = document.getElementsByName("payments");
    var payments = new Array();
    for (i=0;i<pmts.length;i++) {
      if(pmts[i].checked) {
        payments[i] = pmts[i].value;
      }
    }
    str += "&payments="+payments.join("/");
    var clsd = document.getElementsByName("closed");
    var hours = new Array();
    for (var i=0;i<clsd.length;i++) {
      if (clsd[i].checked) {
        hours[i] = "CLOSED";
      } else {
        hours[i] = document.getElementById("hrs_o"+i).value+document.getElementById("ampm_o"+i).value+"-"+document.getElementById("hrs_c"+i).value+document.getElementById("ampm_c"+i).value;
      }
    }
    str += "&hours="+hours.join(",");
    str += "&lat="+document.getElementById("lat").value;
    str += "&lng="+document.getElementById("lng").value;
    if (page == "updatestore") {
      str += "&id="+document.getElementById("curStore").value;
    }
    GDownloadUrl("getpage.php?r="+Math.random()+"&page="+page+str, function(data, responseCode) {
      if (page == "updatestore") {
        mgr.removeMarker(markers[parseInt(data)]);
        GEvent.clearInstanceListeners(markers[parseInt(data)]);
      }
      map.setCenter(new GLatLng(parseFloat(document.getElementById("lat").value),parseFloat(document.getElementById("lng").value)),15);
      refreshMarkers();
      mgr.refresh();
      GEvent.trigger(markers[parseInt(document.getElementById("curStore").value)],"click");
      dispInfo(document.getElementById("curStore").value);
    });
}

function updateKegs(page) {
  var str = "&store="+document.getElementById("curStore").value;
  str += "&brand="+document.getElementById("brand").value;
  var szs = document.getElementsByName("size");
  var sizes = new Array();
  for (i=0;i<szs.length;i++) {
    if (szs[i].checked) {
      sizes[i] = szs[i].value;
    }
  }
  str += "&sizes="+sizes.join(",");
  str += "&type="+document.getElementById("type").options[document.getElementById("type").selectedIndex].value;
  str += "&tap="+document.getElementById("tap").options[document.getElementById("tap").selectedIndex].value;
  str += "&price="+document.getElementById("price").value;
  str += "&stock="+document.getElementById("stock").value;
  GDownloadUrl("getpage.php?r="+Math.random()+"&page="+page+str, function(data, responseCode) {
    dispInfo(document.getElementById("curStore").value);
  });
}

function validateStoreForm() {
  if (document.getElementById("name").value == "") {
    alert("Please enter a store name");
    return false;
  }
  if (document.getElementById("phone").value.length != 10 || isNaN(document.getElementById("phone").value)) {
    alert("Please enter a valid 10-digit phone number (numbers only)");
    return false;
  }
  var website = document.getElementById("website").value;
  if (website.indexOf(":") > -1 || website.indexOf("//") > -1 || (website.length > 5 && website.indexOf(".") == -1)) {
    alert("Invalid website URL.  Please make sure it does not include 'http://'");
    return false;
  }
  var types = document.getElementsByName("type");
  var chkd = false;
  for (var i=0;i<types.length;i++) {
    chkd = chkd || types[i].checked;
  }
  if (!chkd) {
    alert("Please select a store type");
    return false;
  }
  if (document.getElementById("tax").value.length < 1 || parseFloat(document.getElementById("tax").value) < 0) {
    alert("Please enter a valid sales tax (0 if none)");
    return false;
  }
  if (document.getElementById("kdeposit").value.length < 1 || parseFloat(document.getElementById("kdeposit").value) < 0) {
    alert("Please enter a valid keg deposit (0 if none)");
    return false;
  }
  if (document.getElementById("tdeposit").value.length < 1 || parseFloat(document.getElementById("tdeposit").value) < 0) {
    alert("Please enter a valid tap deposit (0 if none or N/A if not available)");
    return false;
  }
  if (document.getElementById("tapfee").value.length < 1 || parseFloat(document.getElementById("tapfee").value) < 0) {
    alert("Please enter a valid tap fee (0 if none)");
    return false;
  }
  var pmts = document.getElementsByName("payments");
  chkd = false;
  for (i=0;i<pmts.length;i++) {
    chkd = chkd || pmts[i].checked;
  }
  if (!chkd) {
    alert("Please select at least one payment method");
    return false;
  }
  var myDays = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
  var clsd = document.getElementsByName("closed");
  for (i=0;i<clsd.length;i++) {
    if (!clsd[i].checked) {
      if (!validateTime(document.getElementById("hrs_o"+i).value)) {
        alert ("Please enter a valid opening time (hh:mm) for "+myDays[i]);
        return false;
      }
      if (!validateTime(document.getElementById("hrs_c"+i).value)) {
        alert ("Please enter a valid closing time (hh:mm) for "+myDays[i]);
        return false;
      }
      var d = new Date();
      var hrs_o = document.getElementById("hrs_o"+i).value.split(":");
      var ampm_o = document.getElementById("ampm_o"+i).options[document.getElementById("ampm_o"+i).selectedIndex].value;
      var hrs_c = document.getElementById("hrs_c"+i).value.split(":");
      var ampm_c = document.getElementById("ampm_c"+i).options[document.getElementById("ampm_c"+i).selectedIndex].value;
      var hr_o = Math.round(d.getTime()/1000/60) + hrs_o[0]*60 + hrs_o[1];
      if ((ampm_o == "pm" && hrs_o[0] != "12") || (ampm_o == "am" && hrs_o[0] == "12")) {
        hr_o += 12*60;
      }
      hr_c = Math.round(d.getTime()/1000/60) + hrs_c[0]*60 + hrs_c[1];
      if ((ampm_c == "pm" && hrs_c[0] != "12") || (ampm_c == "am" && hrs_c[0] == "12")) {
        hr_c += 12*60;
      }
      if (hr_c - hr_o <= 0) {
        alert("Closing time must be after opening time on "+myDays[i]);
        return false;
      }
    }
  }
  return true;
}

function validateTime(time) {
  if (time.indexOf(":") == -1) {
  } else if (isNaN(time.substring(0,time.indexOf(":")))) {
  } else if (isNaN(time.substr(-2))) {
  } else if (time.length < 4) {
  } else if (parseInt(time) > 12) {
  } else if (parseInt(time) < 1) {
  } else if (parseInt(time.substr(-2)) > 59) {
  } else {
    return true;
  }
  return false;
}

function validateKegForm() {
  if (document.getElementById("brand").value == "") {
    alert("Please enter a brand");
    return false;
  }
  var sizes = document.getElementsByName("size");
  var chkd = false;
  for (var i=0;i<sizes.length;i++) {
    chkd = chkd || sizes[i].checked;
  }
  if (!chkd) {
    alert("Please select a keg size");
    return false;
  }
  if (isNaN(document.getElementById("price").value) || document.getElementById("price").value.length < 2) {
    alert("Please enter a price");
    return false;
  }
  return true;
}

function hrsClosed(id) {
  document.getElementById("hrs_o"+id).disabled = !document.getElementById("hrs_o"+id).disabled;
  document.getElementById("hrs_c"+id).disabled = !document.getElementById("hrs_c"+id).disabled;
  document.getElementById("ampm_o"+id).disabled = !document.getElementById("ampm_o"+id).disabled;
  document.getElementById("ampm_c"+id).disabled = !document.getElementById("ampm_c"+id).disabled;
}

function retCheck(e,obj)
{
  var keynum;
  if(window.event) // IE
  {
    keynum = e.keyCode;
  } else if(e.which) // Netscape/Firefox/Opera
  {
    keynum = e.which;
  }
  if (keynum == 13)
  {
    obj.onclick();
  }
}

var isOpera = navigator.userAgent.indexOf("Opera") > -1;
var isIE = navigator.userAgent.indexOf("MSIE") > 1 && !isOpera;
var isMoz = navigator.userAgent.indexOf("Mozilla/5.") == 0 && !isOpera;

function finishBrand(oEvent) {
  var oTextbox = document.getElementById("brand");
  switch (oEvent.keyCode) {
     case 38: //up arrow  
     case 40: //down arrow
     case 37: //left arrow
     case 39: //right arrow
     case 33: //page up  
     case 34: //page down  
     case 36: //home  
     case 35: //end                  
     case 13: //enter  
     case 9: //tab  
     case 27: //esc  
     case 16: //shift  
     case 17: //ctrl  
     case 18: //alt  
     case 20: //caps lock
     case 8: //backspace  
     case 46: //delete
       return true;
       break;
     default:
       textboxReplaceSelect(oTextbox, String.fromCharCode(isIE ? oEvent.keyCode : oEvent.charCode));
       var iLen = oTextbox.value.length;
       GDownloadUrl("getbrand.php?r="+Math.random()+"&q="+document.getElementById("brand").value.replace(" ","+"), function(data, responseCode) {
         if (data != null) {
           oTextbox.value = data;
           textboxSelect(oTextbox, iLen, oTextbox.value.length);
         }
       });
     return false;
   } 
}

function textboxSelect (oTextbox, iStart, iEnd) {

   switch(arguments.length) {
       case 1:
           oTextbox.select();
           break;

       case 2:
           iEnd = oTextbox.value.length;
           /* falls through */
           
       case 3:          
           if (isIE) {
               var oRange = oTextbox.createTextRange();
               oRange.moveStart("character", iStart);
               oRange.moveEnd("character", -oTextbox.value.length + iEnd);      
               oRange.select();                                              
           } else if (isMoz){
               oTextbox.setSelectionRange(iStart, iEnd);
           }                    
   }

   oTextbox.focus();
}

function textboxReplaceSelect (oTextbox, sText) {

   if (isIE) {
       var oRange = document.selection.createRange();
       oRange.text = sText;
       oRange.collapse(true);
       oRange.select();                                
   } else if (isMoz) {
      var iStart = oTextbox.selectionStart;
       oTextbox.value = oTextbox.value.substring(0, iStart) + sText + oTextbox.value.substring(oTextbox.selectionEnd, oTextbox.value.length);
       oTextbox.setSelectionRange(iStart + sText.length, iStart + sText.length);
   }

   oTextbox.focus();
}

function verifyCitySt(response) {
  if (!response || response.Status.code != 200) {
    alert("Google was unable to geocode that location.  Please verify your location.");
  } else {
    var state = response.Placemark[0].AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
    if (response.Placemark[0].AddressDetails.Country.AdministrativeArea.Locality) {
      var cityst = response.Placemark[0].AddressDetails.Country.AdministrativeArea.Locality.LocalityName + ", " + state;
    } else {
      var cityst = state;
    }
    if (confirm("\tIs '"+cityst+"' your correct location?")) {
      document.getElementById("cityst").value = cityst;
      GDownloadUrl("auth.php?r="+Math.random()+"&email="+document.getElementById("email").value+"&user="+document.getElementById("user").value+"&pass="+document.getElementById("pass").value+"&cityst="+document.getElementById("cityst").value, function(data, responseCode) {
        document.getElementById("info").innerHTML = data;
      });
    }
  }
}

function verifyAddress(response,callback) {
  if (!response || response.Status.code != 200) {
    alert("Sorry, Google was unable to geocode that address. Please use another address.");
  } else {
    var place = response.Placemark[0];
    if (confirm("Is '"+place.address+"' the correct address?")) {
      document.getElementById("address").value = place.address;
      document.getElementById("lat").value = place.Point.coordinates[1];
      document.getElementById("lng").value = place.Point.coordinates[0];
      callback(false);
    }
  }
}