var request; var zipCodeInput; var rangeInput; var list;

function goToStore(lat, lng, name, add1, city, state, zip, phone) {
  var pnt = new GLatLng(lat, lng);
  map.panTo(pnt);
  map.setCenter(pnt, 13);

  map.clearOverlays();
  var marker = new GMarker(pnt);
  map.addOverlay(marker);
  marker.showMapBlowup();
  var html = '<span style="font-weight: bold;">' + name + '</span><br>';
  html += '<span>' + add1 + '</span><br>';
  html += '<span>' + city + ', ' + state + ' ' + zip + '</span><br>';
  html += '<span>(' + phone.substr(0, 3) + ') ' + phone.substr(3, 3) + '-' + phone.substr(6, 4) + '</span><br>';
  marker.openInfoWindowHtml(html);
}

function addStores(txt) {
  if (typeof DOMParser != 'undefined') {
    var parser = new DOMParser();
    var doc = parser.parseFromString(txt, 'text/xml');
  } else if (document.all) {
    var doc = createIEDoc();
    doc.async = false;
    doc.loadXML(txt);
  }

  var rootTag = doc.documentElement;
  if (rootTag.nodeName == "parsererror") {
    alert("Zip Code Locator has encountered an error while processing the locations.");
  } else if (rootTag.nodeName == 'results') {
    var kiddies = doc.getElementsByTagName('store');
    for (var i = 0; i < kiddies.length; i++) {
      var name = kiddies[i].childNodes.item(0).lastChild.nodeValue;
      var lat = kiddies[i].childNodes.item(8).lastChild.nodeValue;
      var lng = kiddies[i].childNodes.item(9).lastChild.nodeValue;
      var zip = (typeof kiddies[i].childNodes.item(5).lastChild != 'undefined') ? kiddies[i].childNodes.item(5).lastChild.nodeValue : null;
      var address1 = kiddies[i].childNodes.item(1).lastChild.nodeValue;
      var city = kiddies[i].childNodes.item(3).lastChild.nodeValue;
      var state = kiddies[i].childNodes.item(4).lastChild.nodeValue;
      var phone = kiddies[i].childNodes.item(6).lastChild.nodeValue;
      var distance = (kiddies[i].childNodes.item(10)) ? kiddies[i].childNodes.item(10).lastChild.nodeValue : 'ERROR';
      if (zip) {
        var lnk = document.createElement('a');
        lnk.setAttribute('href', 'javascript:goToStore('+lat+', '+lng+', "' + name + '", "' + address1 + '", "' + city + '", "' + state + '", "' + zip + '", "' + phone + '");');
        lnk.appendChild(document.createTextNode(name));
      } else {
        lnk = name;
      }
      var newDiv = document.createElement('DIV');
      
      var dst = document.createTextNode(' (' + (Math.round(distance * 100) / 100) + ' miles)');
      //var newLine = document.createTextNode(', ' + address1 + ', ' + city);
      list.appendChild(newDiv);
      newDiv.appendChild(lnk);
      newDiv.appendChild(dst);
      //newDiv.appendChild(newLine);
    }
  } else if (rootTag.nodeName == 'errors') {
    var errors = doc.getElementsByTagName('error');
    for (var i = 0; i < errors.length; i++) {
      //var errCode = errors[i].childNodes.item(0).lastChild.nodeValue;
      var errDesc = errors[i].childNodes.item(1).lastChild.nodeValue;
      var newDiv = document.createElement('DIV');
      var newLine = document.createTextNode(errDesc);
      list.appendChild(newDiv);
      newDiv.appendChild(newLine);
    }
  } else {
    alert('Zip Code Locator has encountered an unknow error');
  }
}

function createIEDoc() {
  var domVersions = ['MSXML2.DOMDocument.5.0', 'MSXML2.DOMDocument.4.0', 'MSXML2.DOMDocument.3.0', 'MSXML2.DOMDocument', 'Microsoft.XmlDom'];
  for (var i = 0; i < domVersions.length; i++) {
    try {
      var ieDom = new ActiveXObject(domVersions[i]);
      return ieDom;
    } catch (e) {
    }
  }

  throw new Error('can\'t make dom for IE');
}

function onStateChange(){
  var ready = request.readyState;
  if (ready == 4) {
    addStores(request.responseText);
  }
}

function sendRequest(params, HttpMethod) {
  if (!HttpMethod) {
    HttpMethod = "POST";
  }
  request = getReq();
  if (request) {
    request.onreadystatechange = onStateChange;
    request.open(HttpMethod, 'getStores.php', true);
    request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    request.send(params);
  }
}

function getReq() {
  var req;

  if (window.XMLHttpRequest) {
    req = new XMLHttpRequest();
  } else if (typeof ActiveXObject != "undefined") {
    req = new ActiveXObject("Microsoft.XMLHTTP");
  }

  return req;
}

function getStores(event) {
  var e = (event) ? event : window.event;

  if (zipCodeInput.value == '' || rangeInput.value == '') {
    alert('Please enter a value for Zip Code and Range.');
  } else {
    // clear existing locations
    while (list.childNodes.length > 0) {
      list.removeChild(list.lastChild);
    }

    // make sure the zip code is 5 chars long and that the range is selected
    if (zipCodeInput.value.length == 5) {
      var params = 'zipCode=' + zipCodeInput.value + '&range=' + rangeInput.value;
      sendRequest(params, 'POST');
    }
  }
}

function getElm(elmId) {
  var elm;
  if (document.getElementById) {
    elm = document.getElementById(elmId);
  } else if (document.all) {
    elm = document.all[elmId];
  }
  return elm;
}

function boot() {
  if (GBrowserIsCompatible()) {
    // get all the page elements
    zipCodeInput = getElm('zipCode');
    rangeInput = getElm('range');
    list = getElm('list');
    
    var bodyElm = document.getElementsByTagName('BODY').item(0);
    if (bodyElm) {
      if (bodyElm.addEventListener) {
      bodyElm.addEventListener('unload', GUnload, false);
      } else if (bodyElm.attachEvent) {
      bodyElm.attachEvent('onunload', GUnload);
      }
    }
  } else {
    alert('Our Zip Code Store Locator will not work with your browser. Please upgrade your browser.');
  }
}

if (window.addEventListener) {
  window.addEventListener('load', boot, false);
} else if (window.attachEvent) {
  window.attachEvent('onload', boot);
} else {
  window.onload = boot;
}