var map;
var mapName;
var geoCoder;
var markers = new Array;
var bounds;
var activeMarker;
var pinIconURL;
var rssFeed;
var resultBounds;

function setGoogleMapAndControls(mapID, detailsURL, iconURL) {
	if ($.address.value() == '/') {
		$.address.value(feedURL + '?ld=' + urlEncode(detailsURL));
	};
			
	rssFeed = $('.rssLink').attr('href');
	mapName = mapID;
	pinIconURL = iconURL;
	map = new GMap2(document.getElementById(mapID));
	geoCoder = new GClientGeocoder();
	map.setCenter(new GLatLng(42.3584308, -71.2597732), 10);
	map.addControl(new GLargeMapControl3D());
	resultsBounds = new GLatLngBounds(new GLatLng(42.205124759706145, -71.76338195800781),new GLatLng(42.64810165693524, -70.60981750488281));
	$(".mapListingMessage").appendTo(map.getPane(G_MAP_FLOAT_SHADOW_PANE));
	GEvent.addListener(map, 'zoomend', function() {
		setGoogleMapPopUpPosition(false);
	});
}

function fetchListings(variableString) {
	var xmlFeed;
	var url;

	xmlFeed = '/coreXMLListingsFeed.php';
	
	if (variableString.substr(0,1) == '/') {
		variableString = variableString.substr(1);
	}
	
	activeMarker = '';
	hideListings($('.loading'));
	url = xmlFeed + '?' + variableString + '&v=2';
	$('.rssLink').attr('href',rssFeed + '?' + variableString);
	//alert(rssFeed + '?' + variableString);

	$.get(url, function(xml) {
//		alert(xml);
		for ( var i = 0; i < markers.length; i++) {
			map.removeOverlay(markers[i]);
		}
		
		bounds = new GLatLngBounds();
		markers = new Array();
		
		if (buildListings(xml)) {
			buildNavigation(xml, xmlFeed[0]);
			showListings();
		} else {
			buildSearchForm(xmlFeed, false);
		}
	});
}

function buildSearchForm(xmlFeed, listingsFound) {
	var stringURL;
	var searchForm = $('.searchForm');
	hideListings(searchForm);

	if (listingsFound) {
		$('.searchFormMessage').html('Refine your search');
	} else {
		$('.searchFormMessage').html(
				'No listings could be found. Please try again.');
	}

	searchForm.unbind('submit');
	searchForm.submit(function() {
		var stringURL = "";
		var inputs = $('.' + $(this).attr('class') + ' :input');
		var values = new Array();
		var i = 0;

		inputs.each(function() {
			if ($(this).attr('type') != 'checkbox') {
				values[i] = new Array();
				values[i]['name'] = $(this).attr('name');
				values[i]['value'] = $(this).val();
				i++;
			} else {
				if ($(this).attr('checked')) {
					values[i] = new Array();
					values[i]['name'] = $(this).attr('name');
					values[i]['value'] = $(this).val();
					i++;
				}
			}
		});

		searchForm.hide();
		stringURL = numericArrayToURL(values);

		if ('#/' + stringURL != location.hash) {
			$.address.value(stringURL);
		} else if (listingsFound) {
			showListings();
		} else {
			$(this).fadeTo('fast', 1);
		}

		return false;
	});
}

function buildNavigation(xml, xmlFeed) {
	var pageNav;
	
	$(".newSearch").unbind('click');
	$(".newSearch").click(function() {
		buildSearchForm(xmlFeed, true);
		return false;
	});
	$(".pageNav").remove();
	$(".navigation").append('<div class="pageNav"></div>');
	pageNav = jQuery.trim(unescape($(xml).find('pageNav').text()));
	$(".pageNav").html(pageNav);
	$(".pageNav a").address();
	$(".sortOptions").remove();
	$(".navigation").append(jQuery.trim(unescape($(xml).find('sort').text())));
	$('.sortOptions').unbind('submit');
	$('.sortOptions').submit(function() {
		var i = 0;
		var inputs = $(this).children(':input');
		var values = new Array();

		inputs.each(function() {
			values[i] = new Array();
			values[i]['name'] = this.name;
			values[i]['value'] = $(this).val();
			i++;
		});

		$.address.value(numericArrayToURL(values));
		return false;
	});

}

/**
 * Assemble each listing and add javascript capabilities
 * 
 * @param object xml
 * @return boolean listingsFound
 */
function buildListings(xml) {
	var listingsFound = false;
	var demoID = '#listingDemo';
	var id;
	var url;
	var address;
	var location;
	var features;
	var thumbnail;
	var tagline;
	var summary;
	var bedrooms;
	var price;
	var bathrooms;
	var availDate;
	var availability;
	var email;
	var agent;
	var idS;
	var imageComposition;
	var latitude;
	var longitude;
	var companyName;
	var companyAddress;
	var companyPhone;
	var companyIcon;
	var listingDetailsWidth;


	$('.listingsHolder').children('div:not(' + demoID + ')').remove();
	//$(demoID).show();
	//alert($(demoID).width());
	//$(demoID).hide();
	$(xml).find("listing").each(
		function(){
			listingsFound = true;
			id = jQuery.trim(unescape($(this).find("listingID").text()));
			url = window.location.protocol + "//" + window.location.hostname + '/' + jQuery.trim(unescape($(this).find("listingURL").text()));
			thumbnail = jQuery.trim(unescape($(this).find("thumbnail").text()));
			location = jQuery.trim(unescape($(this).find("city").text()));
			features = jQuery.trim(unescape($(this).find("features").text()));
			tagline = jQuery.trim(unescape($(this).find("tagline").text()));
			bedrooms = jQuery.trim(unescape($(this).find("bedrooms").text()));
			price = jQuery.trim(unescape($(this).find("price").text()));
			bathrooms = jQuery.trim(unescape($(this).find("bathrooms").text()));
			availability = jQuery.trim(unescape($(this).find("availability").text()));
			agent = jQuery.trim(unescape($(this).find("agentName").text()));
			email = jQuery.trim(unescape($(this).find("agentEmail").text()));
			summary = jQuery.trim(unescape($(this).find("summary").text())) + '...';
			latitude = parseFloat(jQuery.trim(unescape($(this).find("latitude").text())));
			longitude = parseFloat(jQuery.trim(unescape($(this).find("longitude").text())));
			companyName = jQuery.trim(unescape($(this).find("agentCompanyName").text()));
			companyAddress = jQuery.trim(unescape($(this).find("agentCompanyStreetAddress").text())) + '<br/>';
			companyAddress += jQuery.trim(unescape($(this).find("agentCompanyCityStateZip").text()));
			companyPhone = jQuery.trim(unescape($(this).find("agentCompanyPhone").text()));
			companyIcon = jQuery.trim(unescape($(this).find("agentCompanyIcon").text()));
	
			if (parseFloat(bedrooms)) {
				bedrooms += ' Bed';
	
				if (parseFloat(bedrooms) > 1
						|| parseFloat(bedrooms) < 1) {
					bedrooms += 's';
				}
			}
	
			if (parseFloat(bathrooms)) {
				bathrooms += ' Bath';
	
				if (parseFloat(bathrooms) > 1
						|| parseFloat(bathrooms) < 1) {
					bathrooms += 's';
				}
			}
	
			$(demoID).clone().appendTo('.listingsHolder').attr(
					"id", id);
			idS = '#' + id;
			$(idS + ' .listingTitle').html(location);
			$(idS + ' .listingImagesHolder').html(function(index, oldHTML) {
				imageComposition = '<a href="' + url + '" ';
				imageComposition += 'title="View more images and details">';
				imageComposition += thumbnail;
				imageComposition += '</a>';
				imageComposition += features;
				return imageComposition;
			});
			$(idS + ' .listingBedrooms').html(bedrooms);
			$(idS + ' .listingPrice').html(price);
			$(idS + ' .listingBathrooms').html(bathrooms);
			
			//alert(listingDetailsWidth);
			if(availability == 'Now'){
				$(idS + ' .listingAvailability').html('Available ' + availability);
			} else
			{
				availDate = new Date(availability);
				$(idS + ' .listingAvailability').html((availDate.getMonth()+1) + '/' + availDate.getDate() + '/' + availDate.getFullYear());
			}
			
			
			$(idS + ' .listingSummary').html(summary);
			$(demoID + ' .more').clone().appendTo($(idS + ' .listingSummary'));
			$(idS + ' .more').attr('href', url);
			$(idS + ' .listingContact').html(agent + '<br/>' + jQuery.trim(unescape($(this).find("agentPhone").text())));
			
			$(idS + ' .listingCompanyDetails .companyName').html(companyName);
			$(idS + ' .listingCompanyDetails .companyAddress').html(companyAddress);
			$(idS + ' .listingCompanyDetails .companyPhone').html(companyPhone);
			$(idS + ' .viewListing').attr('href', url);
			$(idS + ' .emailAgent').attr('href',$(idS + ' .emailAgent').attr('href') + '?listingLink=' + url + '&agentEmail=' + urlEncode(email) + '&agentName=' + urlEncode(agent) + '&listingTagline=' + urlEncode(tagline));
			$(idS + ' .emailAgent').click(function(){
				return hs.htmlExpand(this, {
					objectType : 'iframe',
					useControls : false,
					outlineWhileAnimating : true,
					preserveContent : false,
					width : 390,
					height : 500
				});
			});
			$(idS + ' .bookmark').click(function() {
				return addthis_sendto('favorites');
			});
			$(idS + ' .addThis').hover(function() {
				return addthis_open(this, '', url);
			}, function() {
				addthis_close();
			}).click(function() {
				return addthis_sendto()
			});
			
			//alert(idS);
			//$(idS + ' .listingButtonHolder').append(companyIcon);
			$(idS).show();
	
			// Google Map Pop Up
			var listingData = new Array();
			listingData['id'] = id;
			listingData['location'] = location;
			listingData['thumbnail'] = thumbnail;
			listingData['bedrooms'] = bedrooms;
			listingData['price'] = price;
			listingData['bathrooms'] = bathrooms;
			listingData['availability'] = availability;
			listingData['summary'] = summary + '...';
			listingData['features'] = features;
			listingData['companyName'] = companyName;
			listingData['companyAddress'] = companyAddress;
			listingData['companyPhone'] = companyPhone;

			if (latitude == "" || longitude == "") {
				geoEncode(jQuery.trim(unescape($(this).find(
						"address").text())), true, listingData);
			} else {
				var point = new GLatLng(latitude, longitude);
				addPointToMap(point, listingData);
			}
		}
	);
	$(demoID).hide();
	return listingsFound;
}

function geoEncode(address, addToMap, listingData) {
	geoCoder.getLatLng(
		address,
		function(point) {
			if (addToMap && point) {
				$.get("/resources/recordListingLatLng.php",
					{
						id : listingData['id'],
						lat : point.y,
						lng : point.x
					});
				addPointToMap(point, listingData);
			} else {
				return (point);
			}
		}
	);
}

function addPointToMap(point, listingData) {
	var marker;
	if (point && resultsBounds.containsLatLng(point)) {
		var markerIcon = new GIcon();
		markerIcon.image = pinIconURL;
		markerIcon.iconSize = new GSize(40, 40);
		markerIcon.iconAnchor = new GPoint(35, 0);

		var markerOptions = {
			icon : markerIcon
		};
		
		var marker = new GMarker(point, markerOptions);
		GEvent.addListener(marker, "click", function() {
			displayPoint(marker, listingData);
		});
			map.addOverlay(marker);
			markers[markers.length] = marker;
	
			bounds.extend(point);
			map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
	}
	//console.log(point.x + ' | ' + point.y);
}

function displayPoint(marker, listingData) {
	activeMarker = marker;
	buildGoogleMapPopUp(listingData);
	map.panTo(map.fromDivPixelToLatLng(setGoogleMapPopUpPosition(true))); // requires
																			// GLatLong
}

function setGoogleMapPopUpPosition(click) {

	var markerPoint; // GLatLng
	var markerOffset; // GPoint
	var mapCenter; // GPoint

	if (typeof (activeMarker) != 'undefined' && activeMarker != ''
			&& (click || $(".mapListingMessage").is(':visible'))) {
		markerPoint = activeMarker.getPoint();
		markerOffset = map.fromLatLngToDivPixel(markerPoint);
		mapCenter = map.fromLatLngToDivPixel(markerPoint);

		$(".mapListingMessage").css("height", "auto");
		$(".mapListingMessage").show().corner().css( {
			top : markerOffset.y,
			left : markerOffset.x,
			height : $(".mapListingMessage").height()
		});
		mapCenter.y += Math.floor(($(".mapListingMessage").height()) / 2);
		mapCenter.x += Math.floor(($(".mapListingMessage").width()) / 2);

		return mapCenter;
	} else {
		return false;
	}
}

function buildGoogleMapPopUp(listingData) {
	var pClass = '.mapListingMessage';
	var closeImage = new Array();
	closeImage['src'] = $(pClass + ' .closeListing').attr('src');
	closeImage['style'] = $(pClass + ' .closeListing').attr('style');

	$(pClass + " .listingTitle").html(listingData['location']);
	$(pClass + " .listingTitle").append(
			'<img src="' + closeImage['src'] + '" class="closeListing" style="'
					+ closeImage['style'] + '" />');
	$(pClass + " .closeListing").css("opacity", .5);
	$(pClass + " .closeListing").unbind("click");
	$(pClass + " .closeListing").click(function() {
		$(pClass).hide();
	});
	$(pClass + " .closeListing").unbind("hover");
	$(pClass + " .closeListing").hover(function() {
		$(this).css('opacity', 1);
	}, function() {
		$(this).css('opacity', .5);
	});
	$(pClass + " .listingImagesHolder").html(
			listingData['thumbnail'] + listingData['features']);
	$(pClass + " .listingBedrooms").html(listingData['bedrooms']);
	$(pClass + " .listingPrice").html(listingData['price']);
	$(pClass + " .listingBathrooms").html(listingData['bathrooms']);
	$(pClass + " .listingAvailability").html(listingData['availability']);
	$(pClass + " .listingSummary").html(listingData['summary']);
	$(pClass + " .listingSummary").append('<div class="more">Read More</div>');
	$(pClass + " .more").unbind('click');
	$(pClass + " .listingSingleThumb").unbind("click").css( {
		'cursor' : 'pointer'
	});
	$(pClass + " .companyDetails .companyName").html(listingData['companyName']);
	$(pClass + " .companyDetails .companyAddress").html(listingData['companyAddress']);
	$(pClass + " .companyDetails .companyPhone").html(listingData['companyPhone']);
	$(pClass + " .more").click(
			function() {
				window.location = $('#' + listingData['id'] + '  .viewListing')
						.attr('href');
			});
	$(pClass + " .listingSingleThumb").click(
			function() {
				window.location = $('#' + listingData['id'] + '  .viewListing')
						.attr('href');
			});
}

/**
 * Turn numeric array into string
 * 
 * @param Array
 *            numericArray
 * @return String string
 */
function numericArrayToURL(numericArray) {
	var string = "";

	for ( var i = 0; i < numericArray.length; i++) {
		if (string != "") {
			string += '&';
		}

		string += numericArray[i]['name'] + '='
				+ urlEncode(numericArray[i]['value']);
	}

	return string;
}

/**
 * Hide listings and show element passed
 * 
 * @param DOM
 *            Element element
 */
function hideListings(element) {
	/*
	 * OBJECTS: .results .navigation .lisitingsHolder .searchFormMessage
	 * .loading .mapListingMessage
	 */

	var modifyingObjectClasses = new Array('searchForm', 'loading');

	for ( var x in markers) {
		markers[x].hide();
	}

	if ($('.results').is(':visible')) {
		$('.results').fadeTo('fast', 0, function() {
			$('.mapListingMessage').hide();
			$('.navigation').hide();
			$('.listingsHolder').hide();
			$('.results').hide().css('opacity', 1);

			for ( var i = 0; i < modifyingObjectClasses.length; i++) {
				if (modifyingObjectClasses[i] != element.attr('id')) {
					$('.' + modifyingObjectClasses[i]).hide();
				}
			}

			element.show();
		});
	} else {
		$('.results').hide().css('opacity', 1);
		$('.mapListingMessage').hide();
		$('.navigation').hide();
		$('.listingsHolder').hide();

		for ( var i = 0; i < modifyingObjectClasses.length; i++) {
			if (modifyingObjectClasses[i] != element.attr('id')) {
				$('.' + modifyingObjectClasses[i]).hide();
			}
		}

		element.css('opacity', 1).show();
	}
}

/**
 * Hide listings and show element passed
 * 
 * @param DOM
 *            Element element
 */
function showListings() {
	/*
	 * OBJECTS: .results .navigation .lisitingHolder .searchFormMessage .loading
	 * .mapListingMessage
	 */
	var modifyingObjectClasses = new Array('searchForm', 'loading');

	$('.navigation').show();
	$('.listingsHolder').show();
	$('.mapListingMessage').hide();

	for ( var x = 0; x < modifyingObjectClasses.length; x++) {
		$('.' + modifyingObjectClasses[x]).hide();
	}

	if ($('.results').is(':visible')) {
		$('.results').css('opacity', 0);
	}

	$('.results').fadeTo('fast', 1, function() {
		for ( var i in markers) {
			markers[i].show();
		}
	});
}

function highlightListing(id) {
	$('.listingsHolder').children('div:not(#' + id + ')').hide();
	$('.listingsHolder .viewAllListings').remove();
	$('.navigation').hide();
	map.setZoom(16);
	map.panTo(map.fromDivPixelToLatLng(setGoogleMapPopUpPosition(false)));
	setGoogleMapPopUpPosition(false);
	$('.viewAllListings').clone().appendTo('.listingsHolder').show().unbind(
			'click').click(function() {
		$(this).remove();
		$('#' + id).prependTo('.listingsHolder');
		$('.navigation').show();
		$('.listingsHolder').children('div:not(#listingDemo)').show();
		map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
		$('.mapListingMessage').hide();
		return false;
	});
	$('html,body').animate( {
		scrollTop : $('#' + id).show().offset().top - 10
	}, 750);
}

function buildRSSLink()
{
	
}

/**
 * Encode string so it can be decoded by PHP
 * 
 * @param String
 *            string
 * @return String
 */
function urlEncode(string) {
	string = (string + '').toString();
	return encodeURIComponent(string).replace(/!/g, '%21').replace(/'/g, '%27')
			.replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A')
			.replace(/%20/g, '+').replace(/~/g, '%7E');
}
