var gMap;
var gMarkers = Array();
var gMarkerGeos = Array();
var gMarkerHtml = Array();
var gBounds = false;

function initSearchResults()
{
	var pars = 'k='+K;

	if (gSearchParams.type == 'monthly')
		var method = 'getMonthlyByGeo/';
	else {
		var method = 'getListingsByGeo/'
		pars += '&start='+ escape(gSearchParams.start) +
		'&end='+ escape(gSearchParams.end);
	}

	if (gSearchParams.overnight) pars += '&overnight=1';
	if (gSearchParams.indoor) pars += '&indoor=1';
	if (gSearchParams.valet) pars += '&valet=1';
	if (gSearchParams.reservation && gSearchParams.reservation != 0) pars += '&reservation=1';
	
	pars += '&lat=' + gSearchParams.lat +
		'&lng=' + gSearchParams.lng +
		'&venue=' + gSearchParams.venue +
		'&page=' + gSearchParams.page +
		'&sortCol=' + gSearchParams.sortCol +
		'&sortDir=' + gSearchParams.sortDir;
		
	if (gSearchParams.dist)
		pars += '&dist=' + gSearchParams.dist;
		
	if (gSearchParams.price)
		pars += '&price=' + gSearchParams.price;
	
	jQuery.get("/api/"+method, pars, displaySearchResults);
};

function displaySearchResults(xml)
{
	// clear old markers
	for(var i=0; i<gMarkers.length; i++){
		gMarkers[i].setMap(null);
		gMarkers[i] = null;
	} 
	
	gMarkers = Array();
	gMarkerGeos = Array();
	gMarkerHtml = Array();
	gBounds = new google.maps.LatLngBounds;
	
	var errorXML = xml.getElementsByTagName('error');
	if (errorXML.length > 0) {
		jQuery('#resultsContainer').html('');
		jQuery('#statusArea').addClass('msg').html('Sorry, no listings matched your search. <a href="/support/faq.php#find0">See the frequently asked questions for more info</a>.');
		return;
	}

	var html = xml.getElementsByTagName('html')[0];

	var metaXML = xml.getElementsByTagName('meta')[0];
	var tot_results = metaXML.getAttribute('total_results');
	
	if ($('#matches')) {
		$('#matches').html(' '+tot_results+' ');
	}
	
	jQuery('#statusArea').attr('class', '').html('');
	
	jQuery('#resultsContainer').html(html.firstChild.data);
	
	var js = xml.getElementsByTagName('json')[0];
	eval(js.firstChild.data);
	buildSearchMap();
	
};

var infowindow;
function attachInfoWindow(marker, content)
{
	google.maps.event.addListener(marker, "click", function() {
		infowindow.setContent(content);
		infowindow.open(gMap, this);
	});
}

function buildSearchMap(dontCount)
{
	if (!gSearchParams)
		return false;
	
	gMapCenterGeo = new google.maps.LatLng(gSearchParams.lat, gSearchParams.lng);
	
	if (!gMap) {
		gMap = new google.maps.Map(document.getElementById('yMapContainer'), {mapTypeId: google.maps.MapTypeId.ROADMAP});
	}
	
	if (gMarkerGeos.length) {
		gBounds.extend(gMapCenterGeo);
		gMap.setCenter(gBounds.getCenter());
		gMap.fitBounds(gBounds)
	} else {
		gMap.setCenter(gMapCenterGeo);
		gMap.setZoom(15);
	}

	// build basic map
	
	if (dontCount) {
		var iconSize = new google.maps.Size(22,25);
		var iconAnchor = new google.maps.Point(6, 6);
	} else {
		var iconSize = new google.maps.Size(29,26);
		var iconAnchor = new google.maps.Point(6, 6);
	}
	
	infowindow = new google.maps.InfoWindow({
		size: new google.maps.Size(150,70),
		pixelOffset: new google.maps.Size(0,13)
	});
	
	//place parking images
	for (var i=gMarkerGeos.length-1; i>=0; i--) {
		var num = i+1;
		
		var iconSrc = (dontCount) ? '/images/buttons/map_blue.png' : '/images/map/p_'+num+'.png';
		
		var image = new google.maps.MarkerImage(iconSrc,
			iconSize,
			new google.maps.Point(0,0),
			iconAnchor);

		var marker = new google.maps.Marker({
			position: gMarkerGeos[i],
			map: gMap,
			icon: image
			}); 
		
		attachInfoWindow(marker, gMarkerHtml[i]);
		
		gMarkers[i] = marker;
	}

	var image = new google.maps.MarkerImage('/images/buttons/map_star.png',
		new google.maps.Size(42,42),
		new google.maps.Point(0,0),
		new google.maps.Point(6, 6));

	var destMarker = new google.maps.Marker({
		position: gMapCenterGeo,
		map: gMap,
		icon: image
		});

	if (gSearchParams.destHtml) {
				
		google.maps.event.addListener(destMarker, "click", function() {
			infowindow.setOptions({content: gSearchParams.destHtml, pixelOffset: new google.maps.Size(20, 20)});
			infowindow.open(gMap, this);
		});
	}
};

var gFilterElements;
function initControls(meta)
{	
	var distCurVal = jQuery('#distVal').first();
	
	jQuery('#distSlider').slider({
		min: Math.floor(meta.min_dist / 260.0),
		max: Math.ceil(meta.max_dist /260.0),
		value: Math.ceil(meta.max_dist /260.0),
		slide: function(event, ui) {
			distCurVal.html(ui.value);
		},
		change: function(event, ui) {
			if (ui.value == Math.ceil(meta.max_dist /260.0)) {
				gSearchParams.dist = false;
			} else {
				gSearchParams.dist = ui.value*260;
			}
			
			initSearchResults();
		}
	});
	distCurVal.html(Math.floor(meta.max_dist / 260.0));
	
	var priceCurVal = jQuery('#priceVal').first();
	
	jQuery('#priceSlider').slider({
		min: Math.floor(meta.min_price),
		max: Math.ceil(meta.max_price),
		value: Math.ceil(meta.max_price),
		slide: function(event, ui) {
			priceCurVal.html(ui.value);
		},
		change: function(event, ui) {
			if (ui.value == Math.ceil(meta.max_price)) {
				gSearchParams.price = false;
			} else {
				gSearchParams.price = ui.value;
			}
			
			initSearchResults();
		}
	});
	priceCurVal.html(Math.floor(meta.max_price));
	
	gFilterElements = jQuery('input.filter_cbox');
	gFilterElements.bind('click', featureFilter);	
};

function featureFilter(e)
{
	if (this.id == 'showall') {
		gFilterElements.attr('checked', false);
		this.checked = true;
		return true;
	}
	
	var showall = jQuery('#showall');
	showall.attr('checked', true);
	gFilterElements.each(function() { 
		
		if (this.id == 'showall') {
			return;
		}
		
		gSearchParams[this.id] = this.checked;
		
		if (this.checked) {
			jQuery('#showall').attr('checked', false);
		}
	});

	initSearchResults();
};

jQuery('#resultsTable').find('a.timesLink').live('click', function() {
	alert('TODO:!');
});

var listingLinks = jQuery('#resultsTable').find('a.listingLink');

function listingLinkOver(e)
{
	var event = new Event(e);
	
	$clear(gTimer);
	
	var obj = event.target;

	if (obj.nodeName != 'A')
		obj = obj.parentNode;
	
	var index = obj.id.split('_')[1];
	
	if (gMarkers[index]) {
		
		gTimer = (function(marker, content) {

			infowindow.setContent(content);
			infowindow.open(gMap, marker);
		}).delay(600, false, Array(gMarkers[index], gMarkerHtml[index]));
	}
};

function listingLinkOut(e)
{
	$clear(gTimer);
};

jQuery('.searchSortLink').live('click', sortResults);
function sortResults(e)
{
	gSearchParams.sortDir = getQueryVar('sortDir', this.href);
	gSearchParams.sortCol = getQueryVar('sortCol', this.href);

	initSearchResults();
	
	return false;
};
