var map;
var infoWindow;
var mapIcons=[];
var markers=[];
var jsl;

(function($) {
	var ji_sl=function(){
		var obj=function(){
		
		}
		obj.prototype.init=function(){
			this.form=$('#jsl_form');
			this.field=$('#jsl_zipcode');
			this.btn=$('#jsl_submit');
			this.div=$('#jsl_div');
			this.results=$('#jsl_results');
			this.results_info=$('#jsl_results_info');
			this.mapdiv=$('#jsl_map');
			this.resultswrap=$('#jsl_results_wrap');
			
			var that=this;
			this.form.submit(function(){
				that.submit();
				return false;
			});
			
			this.btn.attr('disabled',false);
			this.div.slideDown();
			if(this.field.val()!=''){
				this.submit();
			}else{
				//get empty list
				this.submit();
			}
		}
		obj.prototype.submit=function(){
			var that=this;
			//var zip=this.field.val();
			/*$.post(this.form.attr('action'),
				$('#jsl_form').serialize(),
				function(qdata){
					that.show_result(qdata)
				},"json"
			);*/
			var address = this.field.val();
			if(address == ''){
				var default_addresses = ['California','New York'];
				var ran = Math.floor(Math.random()*default_addresses.length);
				address = default_addresses[ran];
			}
			var geocoder = new google.maps.Geocoder();
			geocoder.geocode({'address': address}, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK && results.length>0) {
					for(var i=0;i<markers.length;i++){
						markers[i].setMap(null);
					}
					markers=[];
					that.results.html('');
					that.results_info.html('');
					that.resultswrap.hide();
					//that.mapdiv.hide();
			
					that.do_search(results[0].geometry.location);
				} else {
					that.btn.attr('disabled',false);
					that.no_results();
				}
			});
		}
		obj.prototype.do_search=function(qlocation){
			var that=this;
			var data = {
				lat: qlocation.lat(),
				lon: qlocation.lng(),
				action: 'jsl_search',
				labels: $('#jsl_labels').val()
			}
			$.post(this.form.attr('action'),
				data,
				function(qdata){
					that.show_result(qdata)
				},"json"
			);
		}
		obj.prototype.show_result=function(qdata){
			this.results.html('');
			var bounds = new google.maps.LatLngBounds();
			if(qdata.distance===0){
				var info_html='We couldn\'t find any stores near the requested location.';
				this.results_info.html('<div class="jsl_noresults_top">'+info_html+'</div>');
				$('#jsl_results_header').text('Other stores:');
			}else{
				$('#jsl_results_header').text('Stores:');
			}
			if(qdata.records && qdata.records.length>0){
				if(!map){
					init_map();
				}
				for(var i=0;i<qdata.records.length;i++){
					var record=qdata.records[i];
					var latlng = new google.maps.LatLng(
						parseFloat(record.lat),
						parseFloat(record.lon)
					);
					var addressStr=record.address+'<br/>';
					if(record.city) addressStr+=' '+record.city;
					if(record.zip_code) addressStr+=' '+record.zip_code;
					if(record.state && (record.zip_code || record.city)) addressStr+=', ';
					if(record.state) addressStr+=' '+record.state;
					if(record.country) addressStr+='<br/>'+record.country;
					if(!record.comments || record.comments=='<br>') record.comments='';
					var marker=createMarker(latlng, record.name, record.comments, record.link,addressStr, i, record);
					markers.push(marker);
					this.add_result(record, marker, i);
					bounds.extend(latlng);
				}
					
				map.fitBounds(bounds);
				map.panToBounds(bounds);
				bounds=null;
				this.resultswrap.slideDown();
				this.mapdiv.show();
				var that=this;
				setTimeout(function(){
					that.activate_marker(0);
				},50);
			}else{
				this.no_results();
				this.resultswrap.slideDown();
			}
			this.btn.attr('disabled',false).val('Search');
				 
		}
		obj.prototype.add_result=function(qrecord,qmarker, qid){
			var link=$('<a>'+qrecord.name+'</a>').addClass('jsl_storename').attr('href','#');
			var marker=qmarker;
			link.click(function(){
				google.maps.event.trigger(marker, 'click');
				return false;
			});
			var holder=$('<div></div>').addClass('jsl_item').append(link).attr('id','jsl_link_'+qid);
			this.results.append(
				holder
			);
		}
		obj.prototype.no_results=function(){
			this.results.html(
				['<div class="jsl_item jsl_noresults">No stores found for this location</div>'
				].join('')
			);
		}
		obj.prototype.activate_marker=function(qid, qignoreclick){
			if(!qignoreclick){
				google.maps.event.trigger(markers[qid], 'click');
			}
			$('.jsl_item').removeClass('jsl_active_marker');
			$('#jsl_link_'+qid).addClass('jsl_active_marker');
		}
		return obj;
	}();
	jsl=new ji_sl();
	jsl.init();
	
	function init_map(){
		var latlng = new google.maps.LatLng(29, -120);
			var myOptions = {
				zoom: 4,
				center: latlng,
				mapTypeId: google.maps.MapTypeId.ROADMAP
			};
			map = new google.maps.Map(document.getElementById("jsl_map"), myOptions);
			infoWindow = new google.maps.InfoWindow();
			
			var agicon = new google.maps.MarkerImage('http://www.alter-g.com/wp-content/plugins/ji-storelocator/images/agicon.png',
				new google.maps.Size(19, 28),
				new google.maps.Point(0,0),
				new google.maps.Point(9, 28)
			);
			var agicon_performance = new google.maps.MarkerImage('http://www.alter-g.com/wp-content/plugins/ji-storelocator/images/agicon-performance.png',
				new google.maps.Size(19, 28),
				new google.maps.Point(0,0),
				new google.maps.Point(9, 28)
			);
			var agicon_private = new google.maps.MarkerImage('http://www.alter-g.com/wp-content/plugins/ji-storelocator/images/agicon-private.png',
				new google.maps.Size(19, 28),
				new google.maps.Point(0,0),
				new google.maps.Point(9, 28)
			);
			var agicon_senior = new google.maps.MarkerImage('http://www.alter-g.com/wp-content/plugins/ji-storelocator/images/agicon-senior.png',
				new google.maps.Size(19, 28),
				new google.maps.Point(0,0),
				new google.maps.Point(9, 28)
			);
			var agiconshadow = new google.maps.MarkerImage('http://www.alter-g.com/wp-content/plugins/ji-storelocator/images/agiconshade.png',
				new google.maps.Size(26, 28),
				new google.maps.Point(0,0),
				new google.maps.Point(0, 28)
			);

			mapIcons['store']=agicon;
			mapIcons['performance']=agicon_performance;
			mapIcons['senior']=agicon_senior;
			mapIcons['private']=agicon_private;
			mapIcons['storeshadow']=agiconshadow;
	}	
})(jQuery);
function createMarker(latlng, name, comments, link,address, qid, qrecord) {
	var phonetxt=(qrecord.phone && qrecord.phone!='')? '<div style="color:#00172B;font-size:11px;margin-top:3px;"><strong>Phone: </strong>'+qrecord.phone+'</div>':'';
	if(link){
		var linkUrl=(link.indexOf('http')!==0)? 'http://'+link : link;
		var linktxt=(link)?'<a href="'+linkUrl+'" target="_blank" style="font-size:11px;color:#ff9933;font-weight:bold;" rel="nofollow">visit website</a>':'';
	}
	
	var cat_subtitle;
	switch (qrecord.subcategory){
		case 'Performance Enhancement Center': 
		case 'Private Practice PT':
		case 'Senior Care Facility':
			cat_subtitle='<div style="font-size:11px;font-weight:bold;color:#666;">'+qrecord.subcategory+"</div>";
		break;
	}
	cat_subtitle='<div style="font-size:11px;font-weight:bold;color:#666;">'+qrecord.subcategory+"</div>";
  var html = [
	"<div><b style='color:#003A6A'>" + name + "</b> <br/>",
	cat_subtitle,
	comments,
	phonetxt,
	linktxt,
	'<p style="font-size:12px;color:#333;margin-top:4px;margin-right:10px;border-top:1px solid #efefef;">',address,'</p>',
	'</div>'
	].join('');
  
	/*if(qrecord.subcategory){
		switch(qrecord.subcategory){
			case 'Performance Enhancement Center':
				icon = mapIcons['performance'];
			break;
			case 'Private Practice PT':
				icon = mapIcons['private'];
			break;
			case 'Senior Care Facility':
				icon = mapIcons['senior'];
			break;
			default:
				icon = mapIcons['store'];
			break;
		}
	}else{*/
	var	icon = mapIcons['store'];
	//}
  var marker = new google.maps.Marker({
    map: map,
    position: latlng,
	'icon':icon,
	shadow:mapIcons['storeshadow']
  });
  google.maps.event.addListener(marker, 'click', function() {
    infoWindow.setContent(html);
    infoWindow.open(map, marker);
	jsl.activate_marker(qid, true);
  });
  return marker;
}
