var totalZips=175,PR_ZIPS=Array([totalZips]);PR_ZIPS[0]="00601";PR_ZIPS[1]="00602";PR_ZIPS[2]="00603";PR_ZIPS[3]="00604";PR_ZIPS[4]="00605";PR_ZIPS[5]="00690";PR_ZIPS[6]="00703";PR_ZIPS[7]="00705";PR_ZIPS[8]="00786";PR_ZIPS[9]="00610";PR_ZIPS[10]="00612";PR_ZIPS[11]="00613";PR_ZIPS[12]="00614";PR_ZIPS[13]="00616";PR_ZIPS[14]="00652";PR_ZIPS[15]="00688";PR_ZIPS[16]="00714";PR_ZIPS[17]="00617";PR_ZIPS[18]="00794";PR_ZIPS[19]="00956";PR_ZIPS[20]="00957";PR_ZIPS[21]="00958";PR_ZIPS[22]="00959";
PR_ZIPS[23]="00960";PR_ZIPS[24]="00961";PR_ZIPS[25]="00622";PR_ZIPS[26]="00623";PR_ZIPS[27]="00725";PR_ZIPS[28]="00726";PR_ZIPS[29]="00727";PR_ZIPS[30]="00627";PR_ZIPS[31]="00729";PR_ZIPS[32]="00979";PR_ZIPS[33]="00981";PR_ZIPS[34]="00982";PR_ZIPS[35]="00983";PR_ZIPS[36]="00984";PR_ZIPS[37]="00985";PR_ZIPS[38]="00986";PR_ZIPS[39]="00987";PR_ZIPS[40]="00988";PR_ZIPS[41]="00962";PR_ZIPS[42]="00963";PR_ZIPS[43]="00736";PR_ZIPS[44]="00737";PR_ZIPS[45]="00735";PR_ZIPS[46]="00742";PR_ZIPS[47]="00638";
PR_ZIPS[48]="00739";PR_ZIPS[49]="00769";PR_ZIPS[50]="00782";PR_ZIPS[51]="00783";PR_ZIPS[52]="00775";PR_ZIPS[53]="00646";PR_ZIPS[54]="00738";PR_ZIPS[55]="00740";PR_ZIPS[56]="00650";PR_ZIPS[57]="00647";PR_ZIPS[58]="00653";PR_ZIPS[59]="00784";PR_ZIPS[60]="00785";PR_ZIPS[61]="00656";PR_ZIPS[62]="00965";PR_ZIPS[63]="00966";PR_ZIPS[64]="00968";PR_ZIPS[65]="00969";PR_ZIPS[66]="00970";PR_ZIPS[67]="00971";PR_ZIPS[68]="00778";PR_ZIPS[69]="00659";PR_ZIPS[70]="00660";PR_ZIPS[71]="00741";PR_ZIPS[72]="00791";
PR_ZIPS[73]="00792";PR_ZIPS[74]="00662";PR_ZIPS[75]="00664";PR_ZIPS[76]="00795";PR_ZIPS[77]="00777";PR_ZIPS[78]="00667";PR_ZIPS[79]="00631";PR_ZIPS[80]="00669";PR_ZIPS[81]="00670";PR_ZIPS[82]="00771";PR_ZIPS[83]="00772";PR_ZIPS[84]="00773";PR_ZIPS[85]="00674";PR_ZIPS[86]="00606";PR_ZIPS[87]="00707";PR_ZIPS[88]="00680";PR_ZIPS[89]="00681";PR_ZIPS[90]="00682";PR_ZIPS[91]="00676";PR_ZIPS[92]="00687";PR_ZIPS[93]="00718";PR_ZIPS[94]="00744";PR_ZIPS[95]="00719";PR_ZIPS[96]="00720";PR_ZIPS[97]="00723";
PR_ZIPS[98]="00624";PR_ZIPS[99]="00715";PR_ZIPS[100]="00716";PR_ZIPS[101]="00717";PR_ZIPS[102]="00728";PR_ZIPS[103]="00730";PR_ZIPS[104]="00731";PR_ZIPS[105]="00732";PR_ZIPS[106]="00733";PR_ZIPS[107]="00734";PR_ZIPS[108]="00780";PR_ZIPS[109]="00678";PR_ZIPS[110]="00677";PR_ZIPS[111]="00721";PR_ZIPS[112]="00745";PR_ZIPS[113]="00637";PR_ZIPS[114]="00704";PR_ZIPS[115]="00751";PR_ZIPS[116]="00636";PR_ZIPS[117]="00683";PR_ZIPS[118]="00901";PR_ZIPS[119]="00902";PR_ZIPS[120]="00906";PR_ZIPS[121]="00907";
PR_ZIPS[122]="00908";PR_ZIPS[123]="00909";PR_ZIPS[124]="00910";PR_ZIPS[125]="00911";PR_ZIPS[126]="00912";PR_ZIPS[127]="00913";PR_ZIPS[128]="00914";PR_ZIPS[129]="00915";PR_ZIPS[130]="00916";PR_ZIPS[131]="00917";PR_ZIPS[132]="00918";PR_ZIPS[133]="00919";PR_ZIPS[134]="00920";PR_ZIPS[135]="00921";PR_ZIPS[136]="00922";PR_ZIPS[137]="00923";PR_ZIPS[138]="00924";PR_ZIPS[139]="00925";PR_ZIPS[140]="00926";PR_ZIPS[141]="00927";PR_ZIPS[142]="00928";PR_ZIPS[143]="00929";PR_ZIPS[144]="00930";PR_ZIPS[145]="00931";
PR_ZIPS[146]="00933";PR_ZIPS[147]="00934";PR_ZIPS[148]="00935";PR_ZIPS[149]="00936";PR_ZIPS[150]="00937";PR_ZIPS[151]="00939";PR_ZIPS[152]="00940";PR_ZIPS[153]="00955";PR_ZIPS[154]="00975";PR_ZIPS[155]="00754";PR_ZIPS[156]="00685";PR_ZIPS[157]="00757";PR_ZIPS[158]="00954";PR_ZIPS[159]="00949";PR_ZIPS[160]="00950";PR_ZIPS[161]="00951";PR_ZIPS[162]="00952";PR_ZIPS[163]="00976";PR_ZIPS[164]="00977";PR_ZIPS[165]="00978";PR_ZIPS[166]="00611";PR_ZIPS[167]="00641";PR_ZIPS[168]="00692";PR_ZIPS[169]="00693";
PR_ZIPS[170]="00694";PR_ZIPS[171]="00765";PR_ZIPS[172]="00766";PR_ZIPS[173]="00767";PR_ZIPS[174]="00698";

//create custom map markers
function DQMarker(opt_options){
	this.setValues(opt_options);
	// DQMarker specific
	var span = this.span_ = document.createElement('span');
	var div = this.div_ = document.createElement('div');
	div.appendChild(span);
	div.className = 'dqMarker';
}
DQMarker.prototype = new google.maps.OverlayView;
// Implement onAdd
DQMarker.prototype.onAdd = function() {
	var pane = this.getPanes().floatShadow;
	pane.appendChild(this.div_);

	// Ensures the label is redrawn if the text or position is changed.
	var me = this;
	this.listeners_ = [
		google.maps.event.addListener(this, 'position_changed',
		function() { me.draw(); }),
		google.maps.event.addListener(this, 'text_changed',
		function() { me.draw(); })
	];
};
// Implement onRemove
DQMarker.prototype.onRemove = function() {
	var mDiv = $(this.div_);
	mDiv.remove();

	// Label is removed from the map, stop updating its position/text.
	for (var i=0, I=this.listeners_.length; i < I; ++i) {
		google.maps.event.removeListener(this.listeners_[i]);
	}
};
// Implement draw
DQMarker.prototype.draw = function() {
	var projection = this.getProjection();
	var position = projection.fromLatLngToDivPixel(this.get('position'));
	var div = this.div_;
	div.style.left = position.x - 24 + 'px';
	div.style.top = position.y - 47 + 'px';
	div.style.display = 'block';
	div.id = 'marker_'+this.get('text').toString();
	this.span_.innerHTML = this.get('text').toString();
};

//create custom PR overlay
function PRMarker(opt_options){
	this.setValues(opt_options);
	// DQMarker specific
	var span = this.span_ = document.createElement('span');
	var div = this.div_ = document.createElement('div');
	div.appendChild(span);
	div.className = 'prMarker';
}
PRMarker.prototype = new google.maps.OverlayView;
// Implement onAdd
PRMarker.prototype.onAdd = function() {
	var pane = this.getPanes().floatShadow;
	pane.appendChild(this.div_);

	// Ensures the label is redrawn if the text or position is changed.
	var me = this;
	this.listeners_ = [
		google.maps.event.addListener(this, 'position_changed',
		function() { me.draw(); }),
		google.maps.event.addListener(this, 'text_changed',
		function() { me.draw(); })
	];
};
// Implement onRemove
PRMarker.prototype.onRemove = function() {
	var mDiv = $(this.div_);
	mDiv.remove();

	// Label is removed from the map, stop updating its position/text.
	for (var i=0, I=this.listeners_.length; i < I; ++i) {
		google.maps.event.removeListener(this.listeners_[i]);
	}
};
// Implement draw
PRMarker.prototype.draw = function() {
	var projection = this.getProjection();
	var position = projection.fromLatLngToDivPixel(this.get('position'));
	var div = this.div_;
	div.style.left = position.x + 'px';
	div.style.top = position.y -203 +'px';
	div.style.display = 'block';
};

var finderMap = function(){
	var gc = new google.maps.Geocoder();
	var map;
	var markerImage = 'assets/images/map_marker.png';
	var markerImageShadow = 'assets/images/map_marker_shadow.png'
	var center_us = new google.maps.LatLng(39.50, -98.35);
	var center_pr = new google.maps.LatLng(18.1949, -66.5095);
	var addresses = [];
	var markers = [];
	var dqMarkers = [];
	var bounds;
	var mapProj;
	var sr = $('#searchResults');
	var results = $('#results');
	var xhrURL = "";
	var storeList = [];
	var mapOptions;
	var pr = false;
	var prString1 = 'Don Q Rums can be found everywhere in Puerto Rico.';
	var prString2 = 'Just check out your<br/> local market.';
		
	var init = function(){
		sr.fadeTo(0,0);
		//initialize the map and place it at the center of the US
		mapOptions = {
			zoom: 4,
			backgroundColor: '#151514',
			center: center_us,
			mapTypeId: google.maps.MapTypeId.ROADMAP,
			navigationControl:false,
			mapTypeControl:false,
			scrollwheel:false,
			disableDoubleClickZoom:true
		};
		map = new google.maps.Map(document.getElementById("map"), mapOptions);
		// google.maps.event.addListener(map, 'zoom_changed', function(){console.log(map.getCenter())});
		bounds = new google.maps.LatLngBounds();
		
		if(preZip != 'nothing' && preRange != 'nothing'){
			$('#zip').val(preZip);
			$('#radius').val(preRange);
			getAddresses(preZip, preRange);
			
		}
			
		$('#finderHeader #controls input#submit').bind('click', function(e){
			e.preventDefault();
			var zip = $('#zip').val();
			var range = $('#radius').val();
			
			if(zip.isValidZipCode()){
				if(PR_ZIPS.indexOf(zip) == -1){
					getAddresses(zip, range);
				}else{
					goPR();		
				}
			}else{
				sr.find('h4').html('That doesn\'t appear to be a valid zip code. Please try again.');
				clearMap();
				sr.fadeTo(100,1);
				results.empty().hide();
			}
		});
	}
	var goPR = function(){
		map.setCenter(center_pr);
		map.setZoom(10);
		sr.fadeTo(200, 1);
		sr.find('h4').text('Search Results');
		results.html('<h3>'+prString1+'</h3><p class="prResult">'+prString2+'</p>').show();
		
		var latlng = new google.maps.LatLng(18.014, -66.61);
		
		var prMarker = new PRMarker({
			position:latlng,
			map : map
		});
		
		dqMarkers.push(prMarker);
	}
	
	var getAddresses = function(zip, range){
		//this is the AJAX function that will query
		//the database for stores in the zip code range returned
		
		/// --- START XHR SAMPLE REQUEST ----
		var reporter;
		var z = zip;
		xhrURL = '/finder/xhr/'+zip+"/"+range +"/";
		$.getJSON(xhrURL, function(data) {
			//reportObj(data,true);
			if(data[0].empty){
				sr.find('h4').html('Sorry, we found no results within '+range+' miles of '+ z +'.<br/> Try expanding your search.');
				clearMap();
				sr.fadeTo(100,1);
				results.empty().hide();
			}else{
				reporter = "-- " + data.length + " Results --\n";
				for (var i = 0; i < data.length; i++){
					reporter += " -- Result # "+ (i+1) +" -- \n";
					reporter += "Name: " + data[i].storeName + "\n";
					reporter += "Address 1: " + data[i].address1 + "\n";
					reporter += "Address 2: " + data[i].address2 + "\n";
					reporter += "City: " + data[i].city + "\n";
					reporter += "State: " + data[i].state + "\n";
					reporter += "Zip: " + data[i].zip + "\n";
					reporter += "Phone: " + data[i].phone + "\n";
					reporter += "Website: " + data[i].website + "\n";				
				}
				storeList = data;

				//in the callback to the above ajax query, i'll parse out the addresses,
				//build the address array, and create the results display
				sr.find('h4').text('Search Results');
				var list = '<ul>';
				var addNode = '';
				addresses = [];
				for(var s=0;s<storeList.length;s++){
					var store = storeList[s];
					var title = store.storeName == null ? 'store name not available':store.storeName;
					var add = store.address1 == null ? 'address not available':store.address1;
					var city = store.city == null ? 'city not available':store.city;
					var state = store.state == null ? 'state not available':store.state;
					var zip = store.zip == null ? '':store.zip;
					var phone = store.phone == null ? '':store.phone;
					var site = store.website;
					
					var link = "http://maps.google.com/maps?q="+title+" "+add+" "+city+", "+state+" "+zip;
					// console.log(link);

					//add the addresses to the addresses array so that we can map em
					var storeString = add + ' ' + city + ', ' + state + ' ' + zip;
					addresses.push(storeString);
					//create the markup for the addresses in the address overlay
					addNode +='<li id="result_'+(parseInt(s) + 1).toString()+'">';
					addNode +='<h5 class="subHead">'+(parseInt(s) + 1).toString()+'</h5>';
					addNode +='<p class="adr">';
					addNode +='<span class="title">';
					addNode += '<a href="'+link+'" target="_blank">';
					addNode += title + '</a></span>';
					addNode +='<span class="street-address">' + add + '</span>';
					addNode +='<span class="region">' + city + ', ' + state + '</span>';
					addNode +='<span class="postal-code">' + zip + '</span>';
					addNode +='</p>';
					addNode +='<p class="tel">'+phone+'</p>';
					addNode += '</li>';
				}

				list += addNode + '</ul>';
				results.show().html(list).find('ul li').mouseover(
					function(e){
						hovElem = $(this);
						resultHover(hovElem);
					}
				);
				
				results.find('ul').jScrollPane({scrollbarWidth:12}).mouseout( function(){
					markers = $($('#map').find('.dqMarker'));
					markers.removeClass('on');
					$(this).find('li').removeClass('over');
				}).show();

				clearMap();	
				parseAddresses();
			}
		});			
	}
	
	//results hover functions
	var resultHover = function(hovElem){
		var theId = hovElem.attr('id');
		var hovNum = theId.substring(theId.lastIndexOf('_')+1);
		var mapDiv = $('#map');
		var selMarker = $('#marker_'+hovNum);
		
		selMarker.addClass('on').css('z-index', 3).siblings().removeClass('on').css('z-index', 1);
		hovElem.addClass('over').siblings().removeClass('over');		
	}
	
	//remove the markers
	var clearMap = function(){
		for(var m=0;m<dqMarkers.length;m++){
			dqMarkers[m].setMap(null);
			dqMarkers[m].onRemove();
		}
	}
	
	//grab the returned address and send em to the geocoder
	var parseAddresses = function(){
		var ind = 0;
		bounds = new google.maps.LatLngBounds();
		var pointz = [];
		//clear the marker array
		dqMarkers = [];
		
		var getGeoCode = function(){//this whole thing is kinda weird because of the randomly-order results from google maps
			gc.geocode( { 'address': addresses[ind] }, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK) {

					pointz.push(results[0].geometry.location);
					// plotPoint(results[0].geometry.location, ind);

				} else {
					console.log("Geocode was not successful for the following reason: " + status);
				}
				
				if(ind < addresses.length -1){
					ind++;
					getGeoCode();
				}else{
					for (var i=0;i<pointz.length; i++) {
						plotPoint(pointz[i], i);
					};
				}
			});
		}
		getGeoCode();
	}
	
	//create and place each marker
	var plotPoint = function(point, num){
		
		//var latlng = new google.maps.LatLng(point[0], point[1]);
		var dqMarker = new DQMarker({
			//position:latlng,
			position:point,			
			map : map,
			text:(parseInt(num) + 1).toString()
		});
		
		dqMarkers.push(dqMarker);
		
		//extend the map bounds and then fit the map
		bounds.extend(point); // previously bounds.extend(latlng)
		map.fitBounds(bounds);
		map.panBy(-240, 0);		
		sr.fadeTo(900,1);
	}
	
	//let's get this map party started!
	init();
	
	//expose public methods
	return {
		getAddresses:getAddresses
	}
}

$(document).ready(function() {
	if(document.getElementById('map')){ fm = new finderMap(); }
});

