/* *** dealer locator *** */
function dealer_locator_form(){
	var form = $('dealer-locator-search-form');
	if(! form) return false;
	var action = form.get('action');	

	form.addEvent('submit',function (e) {
		if($type(e)) e.stop();
		var data = form.toQueryString();
		// query_dealers_results //onComplete function
		var jsonRequest = new Request.JSON({url:'/dealer/results',method:'post',onRequest: loadingDealerResutls,onComplete: query_dealers_results}).send(data);
		
		return false;
	});
	
}
window.addEvent('domready',dealer_locator_form);

function loadingDealerResutls() {
	// dealer-locator-results-loader
	$('dealer-locator-results').empty();
	$('dealer-locator-results-loader').clone().inject($('dealer-locator-results')).setStyle('display','block');
}

function query_dealers_results(json,text) {
	DEALERS = [];
	$('search-results_title').setStyle('visibility','visible');
	if(!$type(json)){
		var dealer_entry = new Element('div',{
			'class':'dealer-entry',
			'id':'no_dealer'
		}).inject(results_target,'bottom');
		
		var line_item = new Element('p',{
			'class':'no-results'
		}).inject(dealer_entry);
		line_item.appendText('No Results');
	}
	
	
	var dealers = json.dealers;
	var dealerTotal = json.dealers.length;
	
	var results_target = $('dealer-locator-results');
	results_target.scrollTo(0,0);
	results_target.empty();
	window.map.clearOverlays();
	if(dealers.length > 0){
		dealers.each(function(dealer,i){
			dealer = new Hash(dealer);
			var address = dealer.dealer_address+" "+dealer.dealer_city+", "+dealer.dealer_state+" "+dealer.dealer_postal;
			createGoogleMarker(address, dealer, results_target,i,dealerTotal);
		});
		
	}
	else{
		var dealer_entry = new Element('div',{
			'class':'dealer',
			'id':'no_dealer'
		}).inject(results_target,'bottom');
		
		var line_item = new Element('h2',{
			'class':'no-results'
		}).inject(dealer_entry);
		
		line_item.appendText('No Results');
		
	}
	
}
DEALERS = [];
function createGoogleMarker(address, dealer, results_target,i,total){
	var marker = null;
	var dealerEntry = createDealerEntry(dealer,i);
	if(window.geocoder){
		window.geocoder.getLatLng(address,function(point){
			if(point){
				// marker = new GMarker(point);
				marker = createMarker(point,i,dealerEntry);
				window.map.addOverlay(marker);
				dealerEntry.addEvent('click',function(e){
					window.map.panTo(marker.getLatLng());
					marker.openInfoWindowHtml(dealerEntry.clone());
				});
				if(i == 0){
					window.map.setCenter(marker.getLatLng(),11);
					dealerEntry.fireEvent('click');
				}
				// dealerEntry.inject(results_target,"bottom");

			}
			else{

				dealerEntry.setStyles({
					'cursor':'default',
					'opacity':0.5
				});
			}
		});	
	}
	
	DEALERS.push(dealerEntry);
	if(DEALERS.length == total){
		DEALERS.each(function(el,i,group){
			el.inject(results_target,"bottom");
		});
	}
}

// Creates a marker whose info window displays the letter corresponding
// to the given index.
// Create a base icon for all of our markers that specifies the
// shadow, icon dimensions, etc.

function createMarker(point, index, dealerEntry) {
	var baseIcon = new GIcon(G_DEFAULT_ICON);
	// should have this be configurable too //
	baseIcon.shadow = "/admin/templates/resources/images/Google_Maps_Marker_Images/shadow50.png";
	baseIcon.iconSize = new GSize(20, 31);
	baseIcon.shadowSize = new GSize(37, 34);
	baseIcon.iconAnchor = new GPoint(9, 34);
	baseIcon.infoWindowAnchor = new GPoint(9, 2);
	
  // Create a lettered icon for this point using our icon class
  var letter = String.fromCharCode("A".charCodeAt(0) + index);

  var letteredIcon = new GIcon(baseIcon);
	if(index >= 26){
		letter = 'default'; 
	}
  letteredIcon.image = "/admin/templates/resources/images/Google_Maps_Marker_Images/" + letter + ".png";

  // Set up our GMarkerOptions object
  markerOptions = { icon:letteredIcon };
  var marker = new GMarker(point, markerOptions);

  GEvent.addListener(marker, "click", function() {
  	marker.openInfoWindowHtml(dealerEntry.clone());
  });

  return marker;
}

function createDealerEntry(dealer,i) {
	var letter = String.fromCharCode("A".charCodeAt(0) + i);
	
	if(i >= 26) letter = 'default';
	
	var dealerEntry = new Element('div',{
		'class':'dealer dealer_'+i,
		'styles':{
			'background': "url(/admin/templates/resources/images/Google_Maps_Marker_Images/" + letter + ".png) no-repeat left top"
		}
	});
	
	var dealerName = new Element('h2',{
		'class': 'dealerName',
		'text': dealer.dealer_name
	}).inject(dealerEntry);
	
	var dealerAddress = new Element('p',{
			'class': 'dealerAddress',
			'text':dealer.dealer_address
	}).inject(dealerEntry);
		
	var dealerAddress = new Element('p',{
			'class': 'dealerCityStateZip',
			'text':dealer.dealer_city+", "+dealer.dealer_state+" "+dealer.dealer_postal
	}).inject(dealerEntry);
	
	var dealerPhone = new Element('p',{
		'class':'dealerPhone',
		'text':dealer.dealer_phone
	}).inject(dealerEntry);
	
	var dealerDirections = new Element('a',{
		'class':'dealerDirections',
		'text':'Get Directions',
		'target':'_blank',
		'href':'http://maps.google.com/maps?f=d&source=s_d&daddr='+dealer.dealer_address+' '+dealer.dealer_city+', '+dealer.dealer_state+' '+dealer.dealer_postal+'&hl=en&ie=UTF8&t=h&z=10'
	}).inject(dealerEntry);
	
	return dealerEntry;
	
}
function mapsLoaded() {
	window.map = new google.maps.Map2(document.getElementById("map_canvas"));
	window.map.setUIToDefault();
	window.geocoder = new GClientGeocoder();
	window.markerCollection = [];
	var map = window.map;
	GEvent.addListener(map, "click", function(overlay,latLng){
		geocoder.getLocations(latLng, function(response){
			console.log(response)
			if(response && response.Status.code == 200){
				place = response.Placemark[0];
				if(place.address.test('[0-9]{5}')){
					RE = new RegExp("[0-9]{5}");
					var zip = RE.exec(place.address)[0];
					$('postal_code').set('value',zip);

					$('dealer-locator-search-form').fireEvent('submit');
				}
			}
		});
	});
	console.log('GLC: ',google.loader.ClientLocation);
	if (google.loader.ClientLocation){
		map.setCenter(new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude), 11);
	}
	else{
		window.geocoder.getLatLng('Seattle, Washington',function(point){
			if(!point) {
				return false
			}
			map.setCenter(point, 4);
			console.log('point: ', point)
		});
	}
}

function loadMaps() {
  google.load("maps", "2", {"callback" : mapsLoaded});
}

function initLoader() {
  var script = document.createElement("script");

  if(document.location.href.contains('dev')){
	// dev
    script.src = "http://www.google.com/jsapi?key=ABQIAAAA3ZZCPOBTMSTIFVGXDi09PxTePGJL8jiS-JGLsLys39usl-xFERTIuENo7-GN5Z9y3ckohUWbIchKAg&callback=loadMaps";
  }else if(document.location.href.contains('stage')){
	// stage
    script.src = "http://www.google.com/jsapi?key=ABQIAAAAiJWjVUNNogJTlCpAH0VycBTwZcuYK5Te86v2recfC-wpz49WfBTuPMKHmxPgTQ5nIMjZKHrUnQk91g&callback=loadMaps";
  }else{
	// live
    script.src = "http://www.google.com/jsapi?key=ABQIAAAAOJ7GNgwrDhKnh75RquPIzRQbsPBOMKSfxo1i7EArDfTf-p0KBRSmyb8qG_GHPjMJ80g5N5189hOO_g&callback=loadMaps";
  }


  script.type = "text/javascript";
  document.getElementsByTagName("head")[0].appendChild(script);
}
initLoader();
