﻿submitted = false;
autocompleter = null;

var refresh = true;
var lastswlat = 0;
var lastswlong = 0;
var lastnelat = 0;
var lastnelong = 0;
var selected_marker = null;
var shopRedirect;

global_markers = new Array;
    var events = "";

function search_stores_initial() {

	if (GBrowserIsCompatible()) {
		Element.show('gmap');
		map = new GMap2(document.getElementById("map"));
				
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());	

  	    var get = '' + window.location.search;
	    var query = get.substring((get.indexOf('?'))+1);

	    var llRegex = new RegExp(/[\?|\&]ll=(-?\d+(\.\d+)?),(-?\d+(\.\d+)?)/);
	    var llSearchResult = llRegex.exec(get);

	    var shopRegex = new RegExp(/[\?|\&]shop=(\d+)/i);
	    var shopSearchResult = shopRegex.exec(get);

	    shopRedirect = shopSearchResult != null && shopSearchResult[1] == '1';

	    if (llSearchResult != null) {
	        map.setCenter(new GLatLng(llSearchResult[1], llSearchResult[3]));
	        map.setZoom(18);

	        getPoints(map);
	    }
//	    else if (query != '') {
//            initialSearch(query); 
//        } 
        else {
            map.setCenter(new GLatLng(38.41055825094609, -95.80078125));
		    map.setZoom(3);            
		    getPoints(map);
        }

        GEvent.addListener(map, "moveend", function(){ getPoints(map); });
        GEvent.addListener(map, "zoomend", function(){
          if (selected_marker != null)
          {
          	    var my_window = $('overlay');

	            var vert_loc = parseInt(map_point.y) - my_window.offsetHeight - 44;
	            my_window.style.top = vert_loc  + "px";
	            var horiz_loc = parseInt(map_point.x) - 55;
	            my_window.style.left = horiz_loc + "px";
            	
	            var pan_to = new GLatLng( selected_marker.getPoint().lat(), selected_marker.getPoint().lng() )
            	
	            var gPoint = map.fromLatLngToDivPixel(pan_to);
	            gPoint.x = gPoint.x + 55;
	            gPoint.y = gPoint.y - 85;
	            var new_point = map.fromDivPixelToLatLng(gPoint);

	            map.panTo( new_point );
	            
	            show_custom_info_window(selected_marker);
	        }
	        else
	        {
	            close_window();
	        }
          
          refresh = true;
          getPoints(map);

          if (selected_marker != null)
          {
              if (global_markers[selected_marker.internal_id] == undefined)
              {
                close_window();
              }
          }
          
        });

        GEvent.addListener(map, "click", function(marker, point){ if (!marker) { map.closeInfoWindow(); } });     
    }    
}

function updateSearchResultsOnUpdate() { }

function initialSearch(query)
{
	var pairs = query.split('&');
	var keys = new Array();
	for(var i in pairs){
		if(isNaN(i) == false){
			var pair = pairs[i];
			var vals = pair.split('=');
			keys[vals[0]] = vals[1];
		}
	}
	var search = document.forms["search_form"];
	
	if(keys['q'] != '' && keys['q'] != null){
		search.q.value = keys['q'].replace(/\%20/g,' ');
		search.q.value = search.q.value.replace(/\%2C/g,',');
		search.q.value = search.q.value.replace(/\+/g,' ');
	    get_search_results();
	}	
}

function getPoints(map) {

  var center = map.getCenter();
  var bounds = map.getBounds();
  var mapsw = bounds.getSouthWest();
  var mapne = bounds.getNorthEast();
  var mapswlat = mapsw.lat();
  var mapswlong = mapsw.lng();
  var mapnelat = mapne.lat();
  var mapnelong = mapne.lng();
  
  var dataswlat = mapswlat - ((mapnelat-mapswlat)*2)/2;
  var dataswlong = mapswlong - ((mapnelong-mapswlong)*2)/2;
  var datanelat = mapnelat + ((mapnelat-mapswlat)*2)/2;
  var datanelong = mapnelong + ((mapnelong-mapswlong)*2)/2;


  if (refresh || mapswlat < lastswlat || mapswlong < lastswlong || mapnelat > lastnelat || mapnelong > lastnelong) {
    
        lastswlat = dataswlat;
        lastswlong = dataswlong;
        lastnelat = datanelat;
        lastnelong = datanelong;
    
    map.clearOverlays();
    global_markers.length = 0;
    
    var zoom = map.getZoom();   
    var url = "/stores/xml_cluster.aspx?zoom="+ zoom +"&swlat="+ mapswlat +"&swlng="+ mapswlong +"&nelat="+ mapnelat +"&nelng=" + mapnelong;

    GDownloadUrl(url, function(data, responseCode) {
      var xml = GXml.parse(data);
      var markers = xml.documentElement.getElementsByTagName("Location");

      for (var i = 0; i < markers.length; i++) {
        var point = new GLatLng(parseFloat(markers[i].getAttribute("geo_lat")), parseFloat(markers[i].getAttribute("geo_lng")));
          map.addOverlay(addStore(point,markers[i]));           
      }

      updateSearchResultsOnUpdate();

    });
    refresh = false;
  } 
}

function addStore(point, marker_xml) {
    var type = marker_xml.getAttribute("type");
    var store_type = marker_xml.getAttribute("store_type");
      
    var icon = new GIcon();
    if (type == "cluster") {
        icon.image = "/stores/images/magnify.png";
        icon.iconSize = new GSize(30, 30);
        icon.iconAnchor = new GPoint(15, 15);
        icon.infoWindowAnchor = new GPoint(11, 1);
    }
    else {
	   	icon.image = "/stores/images/icon_store.png";
	   	icon.iconSize = new GSize(25, 25);
		icon.iconAnchor = new GPoint(12, 12);
		icon.infoWindowAnchor = new GPoint(0, 0);
    }
    
    var marker = new GMarker(point, icon);  
    var id = marker_xml.getAttribute("location_id");

    marker.tabContent = new Object();
    marker.tabContent.location = marker_xml.getAttribute("address_1") + "<br>" + 
        marker_xml.getAttribute("city") + ", " +  
        marker_xml.getAttribute("state") + " " + 
        marker_xml.getAttribute("zip") + "<br>" +
        "<a href='/stores/selectstore.aspx?store=" +
        marker_xml.getAttribute("location_id") +
        (shopRedirect ? "&shop=1" : "") +
        "'>Select Location</a>";

    marker.tabContent.store_hours = "<p id='directions_subtab'>" +
        "Start address:" +
        "<br >" +
        "<input id='to_addr' type='text' style='width:95%'>" +
        "<br >" +
        "<button class='directions' onclick=\"submit_gmap_form($('to_addr').value,'" +
         marker_xml.getAttribute("address_1") + " , " + marker_xml.getAttribute("city") +
         ", " + marker_xml.getAttribute("state") + " " +
         marker_xml.getAttribute("zip") + "');return false;\">Get Directions</button></p>";
         
    marker.internal_id = marker_xml.getAttribute("location_id");
    marker.id = marker_xml.getAttribute("location_id");
	
       if (type == "cluster") {
            GEvent.addListener(marker, "click", function() {
              close_window(); 
              selected_marker = null;          
              map.setCenter(marker.getPoint());
              map.zoomIn();
            });
   
      } else {
            GEvent.addListener(marker, "click", function() {
	            clear_location_highlights();
                show_custom_info_window(marker);
            });
            GEvent.addListener(marker, "click_action", function() { show_custom_info_window(marker); });
      }

      global_markers[marker.internal_id] = marker;
   
	return marker
}


function addSearchResult(marker_xml){
	
	var location = document.createElement("li");
	location.internal_id =  marker_xml.getAttribute("location_id");
	location.id = "location_" + location.internal_id;
	
	var class_names = "";
	if ($('results_list').getElementsByTagName('li').length == 0){ // This is the first location
		class_names += " first";
	}
	location.style.className = class_names;
	
	var address = document.createElement("store");
	address.innerHTML = "<span><strong>" + marker_xml.getAttribute("name") + "</strong></span><br >"+ marker_xml.getAttribute("address_1") + "<BR>" + marker_xml.getAttribute("city") + ", " +  marker_xml.getAttribute("state") + " " + marker_xml.getAttribute("zip");
	address.innerHTML += "<BR><strong>" + marker_xml.getAttribute("phone") + "</strong>";

	location.appendChild(address);

	$('results_list').appendChild(location);
}

first_load = true;

function search_stores(xml_location, start) {

	if (GBrowserIsCompatible()) {
		Element.show('gmap');
		GDownloadUrl(xml_location, function(data, responseCode) {
		    var xml = GXml.parse(data);
		    if (xml.getElementsByTagName("Location").length > 0) {
		        document.getElementById("results_heading").innerHTML = "";
		        $('results_list').className = "locations";
		        var default_location = xml.documentElement.getElementsByTagName("default_location")[0];
		        var citystate = default_location.getAttribute("city");
		        var markers = xml.documentElement.getElementsByTagName("Location");
		        var bounds = new GLatLngBounds;

		        if (markers.length <= 5 || (start + 5) >= markers.length) { end = markers.length; } else { end = start + 5; }
		        var marknum = 0;

		        for (var i = start; i < end; i++) {
		            var point = new GLatLng(parseFloat(markers[i].getAttribute("geo_lat")), parseFloat(markers[i].getAttribute("geo_lng")));

		            addSearchResult(markers[i]);
		            bounds.extend(point);
		        }

		        $('page_nav').innerHTML = "";
		        if (start > 0) {
		            paging_prev = document.createElement("a");
		            paging_prev_img = document.createElement("img");
		            paging_prev_img.src = "/images/layout/btn_previous.jpg";
		            paging_prev_img.className = "left";
		            paging_prev.appendChild(paging_prev_img);

		            paging_prev.href = "#";
		            paging_prev.onclick = function() { prev_page(); return false; }
		            $('page_nav').appendChild(paging_prev)
		        }
		        if ((page_num + 1) < markers.length / 6) {
		            paging_next = document.createElement("a");
		            paging_next_img = document.createElement("img");
		            paging_next_img.src = "/images/layout/btn_next.jpg";
		            paging_next_img.className = "right";
		            paging_next.appendChild(paging_next_img);
		            paging_next.href = "#";
		            paging_next.onclick = function() { next_page(); return false; }
		            $('page_nav').appendChild(paging_next)
		        }

		        var center_point = new GLatLng((bounds.getSouthWest().lat() + bounds.getNorthEast().lat()) / 2, (bounds.getSouthWest().lng() + bounds.getNorthEast().lng()) / 2);
		        map.setCenter(center_point, map.getBoundsZoomLevel(bounds));

		        Effect.Fade('activity', { duration: 0.25, queue: 'front' });
		    }
		    else {
		        search_stores_initial();
		        document.getElementById("results_heading").innerHTML = "<span class=\"noresults\">No stores were found near the zip code or city you've entered.<br/><br/>Please try again.</span>";
		        $('page_nav').innerHTML = "";
		    }

		    //detect if IE7
		    var agent = navigator.userAgent.toLowerCase();
		    var isIE7 = (agent.indexOf('msie') != -1);


		    if (isIE7) {
		        Effect.BlindDown('results', { afterFinish: function() { $('results').style.height = "1%"; } }); // IE weirdness
		    }
		    else {
		        Effect.BlindDown('results');
		        Effect.Fade('activity', { duration: 0.25, queue: 'end' });
		    }
		    
		    highlight_locations();
		    submitted = false;

		});
	}
}

Event.observe (window,'load',search_stores_initial,false);
Event.observe (window,'load',highlight_locations,false);
Event.observe (window,'load',set_search_form,false);	
Event.observe (window,'load',set_advsearch_slider,false);	
Event.observe (window,'unload',GUnload,false);

selected_location = false;
function highlight_locations(){
	var locations = $('results_list').getElementsByTagName('li');
	for(i=0;i<locations.length;i++){
		var location = locations[i];
		location.onmouseover = function(){ Element.addClassName(this, 'hover') }
		location.onmouseout = function(){ Element.removeClassName(this, 'hover') }
		location.onclick = function(){ activate_marker(this); }
	}
}

function clear_location_highlights() {
    var locations = $('results_list').getElementsByTagName('li');
	for(i=0;i<locations.length;i++){
		var location = locations[i];
		deactivate_marker(locations[i]);	
	}
	selected_marker = null;
}
		
function activate_marker(element){
	if (selected_location == element){ return false; }
	if (global_markers[element.internal_id] == undefined)
	{  
	    var search = document.forms[0];	
	    search.q.value = element;
	    get_search_results();
	}
	Element.addClassName(element, 'selected'); 
    GEvent.trigger(global_markers[element.internal_id], "click_action");
    if (selected_location){ Element.removeClassName(selected_location, 'selected'); } 
    selected_location = element; 
}
		
function deactivate_marker(element){
	Element.removeClassName(element, 'selected');
	selected_location = false;
}
		
function set_advsearch_slider(){
	if (!$('advsearch')) return false;
	$('advsearch').onclick = function(){
		if (!this.active){
		    if (is_ie)
			{
				Effect.BlindDown('advsearch-content', {afterFinish: function(){$('advsearch-content').style.height = "1%";}});
            }
            else
			{
				Effect.BlindDown('advsearch-content');
			}
			Element.addClassName(this, 'active');
			this.active = true;
			return false;
		}else{
			Effect.BlindUp('advsearch-content');
			Element.removeClassName(this, 'active');
			this.active = false;
			return false;
		}
	}
}

query = false;
page_num = false;
function set_search_form(){
	if (!$('search_form')) return false;
	$('search_form').onsubmit = get_search_results;
}

var get_search_results = function(){
    selected_marker = null;

	if(!submitted) {
		submitted = true;		
		close_window();
		Effect.Appear('activity',{duration: 0.25, queue: 'front'});
		query = $('search_form').getAttribute('remoteaction') + '?' + Form.serialize($('search_form')) + '&results=15';
		$('results_list').innerHTML = '';
		page_num = 0;
		search_stores(query, page_num);
	}
	return false;
}
		
function next_page(){
	Effect.Appear('activity',{duration: 0.25, queue: 'front'});
	Effect.BlindUp('results', {afterFinish: function(){
	$('results_list').innerHTML = "";
	page_num++;
	first_load = false;
	search_stores(query, (page_num)*7);
	}});
}

function prev_page(){
	Effect.Appear('activity',{duration: 0.25, queue: 'front'});
	Effect.BlindUp('results', {afterFinish: function(){
	
	$('results_list').innerHTML = "";
	page_num--;
	first_load = false;
	search_stores(query, (page_num)*7);
	
	}});
}
		
function change_tab(element, type){
	var my_window = $('overlay');
	var my_tab = $('overlay_tab');
	var alltabs = my_window.getElementsByTagName('ul')[0];
	var tabs = element.parentNode.parentNode.getElementsByTagName("a");
	for(i=0;i<tabs.length;i++){
		tab = tabs[i];
		Element.removeClassName(tab, 'selected');
	}
	Element.addClassName(element, 'selected');
	if (type == 'store_hours') {
		Element.removeClassName(alltabs,'tabs');
		Element.addClassName(alltabs,'tabs2');
		my_tab.innerHTML = my_window.marker.tabContent.store_hours;
		setTimeout("$('to_addr').focus()", 500);
    }
	else {
		Element.removeClassName(alltabs,'tabs2');
		Element.addClassName(alltabs,'tabs');
		my_tab.innerHTML = my_window.marker.tabContent.location;
	}
	position_window(my_window, my_window.marker);
	return false;
}

function close_window(){
    if ($('overlay')) {
	    $('overlay').style.display = 'none';
	    deactivate_marker( $("location_" + $('overlay').marker.internal_id) );
	}	
	return false;
}
		
function show_custom_info_window(marker){
	selected_marker = marker;
	map_point = map.fromLatLngToDivPixel(marker.getPoint());
	if (!$('overlay')) {
		var new_obj = document.createElement("div");
		new_obj.style.display = 'none';
		new_obj.innerHTML = $('overlay_temp').innerHTML;
		new_obj.getElementsByTagName('div')[0].id = 'overlay_tab';
		new_obj.id = 'overlay';
		document.body.appendChild(new_obj);
	}
	var my_window = $('overlay');
	my_window.marker = marker;
	var alltabs = my_window.getElementsByTagName('ul')[0];
	Element.removeClassName(alltabs,'tabs2');
	Element.addClassName(alltabs,'tabs');

	var tabs = alltabs.getElementsByTagName("a");
	for(i=0;i<tabs.length;i++){
		tab = tabs[i];
		Element.removeClassName(tab, 'selected');
	}
	Element.addClassName(tabs[0], 'selected');
	
	var my_tab = $('overlay_tab');
	my_tab.innerHTML = marker.tabContent.location;

	map.getPane(G_MAP_MARKER_PANE).appendChild(my_window);
	my_window.style.display = 'block';
	
	position_window(my_window, marker);
	highlight_locations();
}	
		
function position_window(my_window, marker){
	var vert_loc = parseInt(map_point.y) - my_window.offsetHeight - 25;
	my_window.style.top = vert_loc  + "px";
	var horiz_loc = parseInt(map_point.x) - 56;
	my_window.style.left = horiz_loc + "px";
	var pan_to = new GLatLng( marker.getPoint().lat(), marker.getPoint().lng() )
	var gPoint = map.fromLatLngToDivPixel(pan_to);
	gPoint.x = gPoint.x + 40;
	gPoint.y = gPoint.y - 80;
	var new_point = map.fromDivPixelToLatLng(gPoint);
	map.panTo( new_point );
}

function submit_gmap_form(from_addr, to_addr) {
    var query = "from: " + from_addr + " to: " + to_addr;

    window.location = 'http://maps.google.com/maps?saddr=' + escape(from_addr) +
        '&daddr=' + escape(to_addr);
	
	return false;
}