//<![CDATA[
var map;
var markers = [];
var searchmarkers = [];
var infoWindow;
var searchinfoWindow;

//Used for grabbing the query string for address, status, etc.
function getQuerystring(key, default_)
{
    if (default_==null) default_==null;
    key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
    var qs = regex.exec(window.location.href);

    if(qs == null)
	return default_;
    else
	return qs[1];
}


//Custom Pin icons used for the markers on the map.
var customIcons = {
    platinum: {
	icon: '/images/map/Dealer-Locator-Plat-Pin.png',
	shadow: '/images/map/Dealer-Locator-Premier-Shadow.png',
	type: 'premier'
    },
    gold: {
	icon: '/images/map/Dealer-Locator-Gold-Pin.png',
	shadow: '/images/map/Dealer-Locator-Premier-Shadow.png',
	type: 'premier'

    },
    retail: {
	icon: '/images/map/Dealer-Locator-Retail-Pin.png',
	shadow: '/images/map/Dealer-Locator-Premier-Shadow.png',
	type: 'premier'
    },
    none: {
	icon: '/images/map/Dealer-Locator-Dealer-Pin.png',
	shadow: '/images/map/Dealer-Locator-Dealer-Shadow.png',
	type: 'none'
    }

};


//Load function is called upon page load.
function load() {
    var address = document.getElementById('addressInput');
    var distance = document.getElementById('distanceSelect');
    var status = document.getElementById('dealerstatusSelect');
    var buttonSearch = document.getElementById('btnSearch');

   map = new google.maps.Map(document.getElementById("map-canvas"), {
	    center: new google.maps.LatLng(40, -97),
	    zoom: 4,
	    mapTypeControl: true,
	    navigationControl: true,
	    navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},
	    mapTypeId: google.maps.MapTypeId.ROADMAP,      
	    mapTypeId: 'roadmap',
	    mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU},
	    scrollwheel: false
	});

    infoWindow = new google.maps.InfoWindow({
	    maxWidth: 300});
    var countrySelect = document.getElementById("country");
    countrySelect.onchange = function() {
        var country = document.getElementById("country").value;
	if(country != 'US' && country != 'CA'){
	    window.location = 'http://www.control4.com/index.php?page=' + country; 
	}

   }

    var qAddress = getQuerystring('addr'); 
    var qDistance = getQuerystring('distance'); 
    var qStatus = getQuerystring('status'); 
    
    if(qAddress==null){
    address.value = "";
    distance.value = "25";
    status.value = "0";
    }

    else{
    qAddress = qAddress.replace(new RegExp("[\\+]", "g" ), " ");
    address.value = qAddress;
    distance.value = qDistance;
    status.value = qStatus;
	buttonSearch.click();

    }


    var addInput = document.getElementById('addressInput');
		addInput.focus();


}


//Geocode the address entered to get latitude and longitude for searched address.
function searchLocations() {

    var geocoder = new google.maps.Geocoder();
    var address = document.getElementById('addressInput').value;
    geocoder.geocode({address: address}, function(results, status) {
	    if (status == google.maps.GeocoderStatus.OK) {
		searchLocationsNear(results[0].geometry.location);
	    } else {
		alert("The following address was not found.\n" + "Please enter a valid address.\n" + address);
	    }
	});
    }

//Function to clear locations and results.
function clearLocations() {
    for (var i = 0; i < markers.length; i++) {
	markers[i].setMap(null);
    }
    markers.length = 0;
    for (var i = 0; i < searchmarkers.length; i++) {
	searchmarkers[i].setMap(null);
    }
    searchmarkers.length = 0;

}

//Posts input to .php script to invoke webservice.
function searchLocationsNear(center) {
    clearLocations();
    var address = document.getElementById('addressInput').value;
    var status = document.getElementById('dealerstatusSelect').value;
    var distance = document.getElementById('distanceSelect').value;
    var country = document.getElementById('country').value;

    //Generate XML
    var searchUrl = '../geocode.php?country=' + country + '&lat=' + center.lat() + '&lng=' + center.lng() + '&premier=' + status + '&distance=' + distance;
    downloadUrl(searchUrl, function(data) {
	    var xml = parseXml(data);
	    var markerNodes = xml.documentElement.getElementsByTagName("marker");
	    var bounds = new google.maps.LatLngBounds();

	    var sidebar = document.getElementById('sidebar');
	    var sidebarEntry = document.createElement("sidebarEntry");

	    if (markerNodes.length == 0) {
		infoWindow.close();
                sidebar.innerHTML = '';
	    var sidetitle = document.getElementById('sidetitle');
	    var address = document.getElementById('addressInput').value;
	    sidebar.innerHTML = '<div id="lin\
ebreak"></div><div class="error" style="word-wrap: break-word; padding:2px;">No dealers found near the following address. Please try increasing your search distance or try another address.<br /><br />' + address + '<br /><br />' + 'Examples<br />11734 Election Rd. Draper, UT 84020<br />60652<br />San Diego, CA</div>';
	    //map.LatLng(40, -97);
	    }
	    else{
		infoWindow.close();
		var sidetitle = document.getElementById('sidetitle');
		var address = document.getElementById('addressInput').value;
		var markersFound = markerNodes.length;
		sidetitle.innerHTML = "<div id='dTitle'>Dealers<div id='linebreak'></div></div><div id='dFound'><b>" + markersFound  + "</b> dealers near " + address + '</div><div id="linebreak"></div>';
		sidebar.innerHTML = "";

	    }
	    //Iterate through XML
	    for (var i = 0; i < markerNodes.length; i++) {
		var name = markerNodes[i].getAttribute("name");
		var address = markerNodes[i].getAttribute("address");
		var distance = parseFloat(markerNodes[i].getAttribute("distance"));
		var city = markerNodes[i].getAttribute("city");
		var state = markerNodes[i].getAttribute("state");
		var zip = markerNodes[i].getAttribute("zip");
		var phone = markerNodes[i].getAttribute("phone");
		var website = markerNodes[i].getAttribute("website");
		var email = markerNodes[i].getAttribute("email");
		var type = markerNodes[i].getAttribute("type");
		var icon = markerNodes[i].getAttribute("icon");
		var latlng = new google.maps.LatLng(
		    parseFloat(markerNodes[i].getAttribute("lat")),
		    parseFloat(markerNodes[i].getAttribute("lng")));


	
		var sidebarEntry = createSidebarEntry(name, distance, latlng, address, city, state, zip, phone, website, email, type, icon);
	sidebar.appendChild(sidebarEntry);	


	bounds.extend(latlng);
        
    }
    var searchLatlng = new google.maps.LatLng(center.lat(), center.lng());
    bounds.extend(searchLatlng);
    var searchIcon = '/images/map/searchIcon.png';

    var searchMarker = new google.maps.Marker({
	    map: map,
	    position: searchLatlng,
	    icon: searchIcon
	});
    var searchAddress = document.getElementById('addressInput').value; 
    var searchhtml = '<b>' + searchAddress + '<b>';
    searchinfoWindow = new google.maps.InfoWindow({
	    maxWidth: 300});

     google.maps.event.addDomListener(searchMarker, 'click', function() {
            infoWindow.setContent(searchhtml);
            infoWindow.open(map, searchMarker);
	    map.panTo(searchLatlng);
	});

	    searchmarkers.push(searchMarker);
	    map.fitBounds(bounds);
	});


}



function createSidebarEntry(name, distance, latlng, address, city, state, zip, phone, website, email, type, icon) {
    var div = document.createElement('div');
    var divhtml = '<b>' + name + '</b>' + '<br /> (' + distance.toFixed(1) + ' miles) <hr/>';
    var divclickhtml = '<b>' + name + '</b><br />' + "<img src='" + type + "'/>" + '<br /> ' + address + '<br />' + city + ', ' + state + " " + zip + '<br />' + phone + "<br /><a href='http://" + website + "'>" + website + '</a><br /><a href="mailto:' + email + '">' + email + '</a><br />' + '( ' + distance.toFixed(1) + ' miles) <div id="linebreak"></div>';
    var html = "<b>" + name + "</b> <br />" + address + "<br />" + city + ", " + state + " " + zip + "<br />" + phone + "<br /><a href='http://" + website + "'>" + website + "</a><br /><a href='mailto:" + email + "'>" + email + "</a><br />(" + distance.toFixed(1) + " miles)";
    

    var icon = customIcons[icon] || {};
    var dtype = icon.type;
    var imicon = icon.icon;
    var imshadow = icon.shadow;
    if (dtype != 'none'){
    var image = new google.maps.MarkerImage(imicon,
					    new google.maps.Size(45, 71),
					    new google.maps.Point(0,0),
					    new google.maps.Point(0,71));

    var shadow = new google.maps.MarkerImage(imshadow,
					    new google.maps.Size(65, 39),
					    new google.maps.Point(0,0),
					    new google.maps.Point(-12,40));

    }
    else
	{
	        var image = new google.maps.MarkerImage(imicon,
					    new google.maps.Size(24, 47),
					    new google.maps.Point(0,0),
					    new google.maps.Point(0,47));

    var shadow = new google.maps.MarkerImage(imshadow,
					    new google.maps.Size(39, 26),
					    new google.maps.Point(0,0),
					     new google.maps.Point(-5,27));
	}
    var marker = new google.maps.Marker({
	    map: map,
	    position: latlng,
	    icon: image,
	    shadow: shadow
	});

    div.innerHTML = divclickhtml;
    div.style.cursor = "pointer";
    div.style.padding = "1px";

    google.maps.event.addDomListener(marker, 'click', function() {
            infoWindow.setContent(html);
            infoWindow.open(map, marker);
	    map.panTo(latlng);
	});


    google.maps.event.addDomListener(div, 'click', function() {
		div.innerHTML = divclickhtml;
		div.style.cursor = "pointer";
		div.style.padding = "1px";
		infoWindow.setContent(html);
		infoWindow.open(map, marker);
		map.panTo(latlng);
	});

    markers.push(marker);
    return div;

}


//Used to generate XML. Don't Change.
function downloadUrl(url, callback) {
      var request = window.ActiveXObject ?
          new ActiveXObject('Microsoft.XMLHTTP') :
          new XMLHttpRequest;

      request.onreadystatechange = function() {
	  if (request.readyState == 4) {
	      request.onreadystatechange = doNothing;
	      callback(request.responseText, request.status);
	  }
      };

      request.open('GET', url, true);
      request.send(null);
}


//Function to Parse XML generated by webservice. Don't Change.
function parseXml(str) {
    if (window.ActiveXObject) {
        var doc = new ActiveXObject('Microsoft.XMLDOM');
        doc.loadXML(str);
        return doc;
    } else if (window.DOMParser) {
        return (new DOMParser).parseFromString(str, 'text/xml');
    }
}

//Don't Change.
function doNothing() {}


//]]>