var YWSID = "xke6qxFuEX64IblQ5_7ryQ"; // common required parameter (api key)

var yelpMarkers = new Array();

function toggleKml(category) {
	var yelpRequestURL = createYelpUrl();

	/* clear existing markers */
	clearYelpPlacemarks();

	if(yelpRequestURL != '')
	{				
		/* do the api request */
		var script = document.createElement('script');
		script.src = yelpRequestURL;
		script.type = 'text/javascript';
		var head = document.getElementsByTagName('head').item(0);
		head.appendChild(script);
	}
	return false;
}

function createYelpUrl () {		
	var yelpCategory = document.getElementById("term").value;

	var north;
	var south;
	var east;
	var west;
	
	if(map.getCurrentMapType().getName() == 'Earth') {
		map.getEarthInstance(function(object) {
			ge = object;
			var bbox = ge.getView().getViewportGlobeBounds();
			north = bbox.getNorth();
			south = bbox.getSouth();
			east  = bbox.getEast();
			west  = bbox.getWest();
		});
	}
	else {
		var bbox = map.getBounds();
		north = bbox.getNorthEast().lat();
		south = bbox.getSouthWest().lat();
		east  = bbox.getNorthEast().lng();
		west  = bbox.getSouthWest().lng();
	}
	
	var url = "http://api.yelp.com/"
		+ "business_review_search?"
		+ "callback=" + "handleResults1"
		+ "&term=" + document.getElementById("term").value
		+ "&num_biz_requested=20"
		+ "&tl_lat=" + south
		+ "&tl_long=" + west
		+ "&br_lat=" + north
		+ "&br_long=" + east
		+ "&ywsid=" + YWSID
		+ "&category=";

		// alert(url);
		return url;
}

function handleResults1(data) {
	$(".yelpError").remove();
	if(data.message.text == "OK") {
		if (data.businesses.length == 0) {
			// $("#term").after('<span class="yelpError">No results were found near that location.</span>');
			alert("No results were found near that location.");
			return;
		}
		for(var i=0; i<data.businesses.length; i++) {
			biz = data.businesses[i];
			createMarker1(biz, biz.latitude, biz.longitude);
		}
	}
	else {
		switch(data.message.text) {
			case 'Area too large':
				// $("#term").after('<span class="yelpError">The area you are looking at is too large.  Please zoom in to view the results.</span>');
				alert("The area you are looking at is too large.  Please zoom in to view the results.");
		}
	}
}

function createMarker1(biz, lat, lng) {
	GEvent.addListener(map, 'maptypechanged', function () {
		if(map.getCurrentMapType().getName() == 'Earth') {
			for(var i = 0; i < yelpMarkers.length; i++)
				yelpMarkers[i].hide();
		} else {
			for(var i = 0; i < yelpMarkers.length; i++)
				yelpMarkers[i].show();
		}
	});

	var eIcon = new GIcon(G_DEFAULT_ICON);
	eIcon.image = 'http://www.myvailbroker.com/img/marker_star.png';
	eIcon.iconSize = new GSize(10, 16);
	eIcon.shadowSize = new GSize(0, 0);
	eIcon.iconAnchor = new GPoint(5,16);
	
	// Set up our GMarkerOptions object
	markerOptions = { title: 'yelp', icon:eIcon };
	
	var point = new GLatLng(lat, lng);
	var marker = new GMarker(point, markerOptions);
	map.addOverlay(marker);
	yelpMarkers.push(marker);

	if(map.getCurrentMapType().getName() == 'Earth') {
		marker.hide();
	}
	
	var infoWindowHtml = generateInfoWindowHtml(biz);
	GEvent.addListener(marker, "click", function() {
		map.openInfoWindowHtml(point, infoWindowHtml);
	});

	
	map.getEarthInstance(function(object) {
		ge = object;
		
		if(ge) {
			// Placemark
			var placemark = ge.createPlacemark('');
			placemark.setName(biz.name);
			placemark.setSnippet('yelp');
		
			// Placemark/Point
			var point = ge.createPoint('');
			var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
			point.setLatitude(lat);
			point.setLongitude(lng);
			placemark.setGeometry(point);
			
			// Placemark/Style
			var style = ge.createStyle('');
			placemark.setStyleSelector(style);
			
			eIconHref = 'http://www.myvailbroker.com/img/marker_star.png';
			// Placemark/Style/IconStyle
			var icon = ge.createIcon('');
			icon.setHref(eIconHref);	
			style.getIconStyle().setIcon(icon);
			style.getIconStyle().setScale(0.7);
			style.getLabelStyle().setScale(0.65);
	
			// add the placemark to Earth
			ge.getFeatures().appendChild(placemark);
		
			var balloon = ge.createHtmlStringBalloon('');
			balloon.setFeature(placemark); // optional
			balloon.setMaxWidth(400);
			balloon.setContentString(infoWindowHtml);
			
			google.earth.addEventListener(placemark, 'click', function (event) {
				event.preventDefault();
				ge.setBalloon(balloon);
			});
		}
	});
}

function clearYelpPlacemarks()
{
	for (var i = 0; i < yelpMarkers.length; i++)
	{
		map.removeOverlay(yelpMarkers[i]);
	}
	map.getEarthInstance(function(object) {
		ge = object;
		
		if(ge) {
			var c = ge.getFeatures().getFirstChild();
			while (c) {
				var s = c.getNextSibling();
				if(c.getSnippet() == 'yelp')
					ge.getFeatures().removeChild(c);
				c = s;
			}
		}
	});
}


/*
 * Formats and returns the Info Window HTML 
 * (displayed in a balloon when a marker is clicked)
 */
function generateInfoWindowHtml(biz) {
	var text = '<div class="marker" style="height:210px">';
	
	// image and rating
	text += '<img class="businessimage" src="'+biz.photo_url+'"/>';
	
	// div start
	text += '<div class="businessinfo">';
	// name/url
	text += '<a href="'+biz.url+'" target="_blank">'+biz.name+'</a><br/>';
	// stars
	text += '<img class="ratingsimage" src="'+biz.rating_img_url_small+'"/>&nbsp;based&nbsp;on&nbsp;';
	// reviews
	text += biz.review_count + '&nbsp;reviews<br/><br />';
	// categories
	text += formatCategories(biz.categories);
	// neighborhoods
	if(biz.neighborhoods.length)
	text += formatNeighborhoods(biz.neighborhoods);
	// address
	text += biz.address1 + '<br/>';
	// address2
	if(biz.address2.length) 
	text += biz.address2+ '<br/>';
	// city, state and zip
	text += biz.city + ',&nbsp;' + biz.state + '&nbsp;' + biz.zip + '<br/>';
	// phone number
	if(biz.phone.length)
	text += formatPhoneNumber(biz.phone);
	// Read the reviews
	text += '<br/><a href="'+biz.url+'" target="_blank">Read the reviews »</a><br/>';
	// div end
	text += '</div></div>'
	return text;
}

/*
 * Formats the categories HTML
 */
function formatCategories(cats) {
	var s = 'Categories: ';
	for(var i=0; i<cats.length; i++) {
		s+= cats[i].category_filter;//name;
		if(i != cats.length-1) s += ', ';
	}
	s += '<br/>';
	return s;
}

/*
 * Formats the neighborhoods HTML
 */
function formatNeighborhoods(neighborhoods) {
	s = 'Neighborhoods: ';
	for(var i=0; i<neighborhoods.length; i++) {
		s += '<a href="' + neighborhoods[i].url + '" target="_blank">' + neighborhoods[i].name + '</a>';
		if (i != neighborhoods.length-1) s += ', ';
	}
	s += '<br/>';
	return s;
}

/*
 * Formats the phone number HTML
 */
function formatPhoneNumber(num) {
	if(num.length != 10) return '';
	return '(' + num.slice(0,3) + ') ' + num.slice(3,6) + '-' + num.slice(6,10) + '<br/>';
}