/**
 * initializes google map
 */
var mayfield = new google.maps.LatLng(41.552, -81.439);
var initialLocation = mayfield;
var newyork = new google.maps.LatLng(40.69847032728747, -73.9514422416687);
// var testLocation = new google.maps.LatLng(-33.8665433, 151.1956316);
var browserSupportFlag = new Boolean();
var geocoder;
var map;
var infoWindow = new google.maps.InfoWindow();
var service;

function initializeMap(initialLat, initialLng, detectCurrentLocation, radius,
		zoomLevel, defaultType) {
	initialLocation = new google.maps.LatLng(initialLat, initialLng);
	geocoder = new google.maps.Geocoder();

	var myOptions = {
		zoom : zoomLevel,
		mapTypeId : google.maps.MapTypeId.ROADMAP
	};
	map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

	if (detectCurrentLocation != 'false') {
		// Try W3C Geolocation (Preferred)
		if (navigator.geolocation) {
			browserSupportFlag = true;
			// alert("in here 1 ");
			navigator.geolocation.getCurrentPosition(function(position) {
				initialLocation = new google.maps.LatLng(
						position.coords.latitude, position.coords.longitude);
				// map.setCenter(initialLocation);
			}, function() {
				handleNoGeolocation(browserSupportFlag);
			});
			// Try Google Gears Geolocation
		} else {
			// alert("in here 2");
			browserSupportFlag = false;
			handleNoGeolocation(browserSupportFlag);
		}

		function handleNoGeolocation(errorFlag) {
			if (errorFlag == true) {
				// alert("Geolocation service failed.");
				initialLocation = mayfield;
			} else {
				// alert("Your browser doesn't support geolocation. We've placed
				// you
				// in Mayfield.");
				initialLocation = new google.maps.LatLng(initialLat, initialLng);
			}
			// map.setCenter(initialLocation);
		}
	} else {
		initialLocation = new google.maps.LatLng(initialLat, initialLng);
		// map.setCenter(initialLocation);
	}
	map.setCenter(initialLocation);

	var request = {
		location : initialLocation,
		radius : radius,
		types : [ defaultType ]
	};
	loadFusionTable(request);
	createMarkerClickEvent();
	// alert("initialLocation:"+ map.getCenter());

	service = new google.maps.places.PlacesService(map);
	service.search(request, callback);
}

/**
 * initializes google map
 * 
 * var geocoder; var map; function initializeMap() { geocoder = new
 * google.maps.Geocoder(); var latlng = new
 * google.maps.LatLng(40.714224,-73.961452); var myOptions = { zoom : 8, center :
 * latlng, mapTypeId : google.maps.MapTypeId.ROADMAP } map = new
 * google.maps.Map(document.getElementById("map_canvas"), myOptions); }
 */
/**
 * invoked by Maps.jsp <div id="map_canvas"></div>
 * $("#map_canvas").ready(initializeMap);
 */

/**
 * 
 */
// var image = "http://www.google.com/mapfiles/arrow.png";
var image = "../images/arrow.png";
function codeAddress() {
	var address = document.getElementById("map_address").value;
	geocoder.geocode({
		'address' : address
	}, function(results, status) {
		if (status == google.maps.GeocoderStatus.OK) {
			map.setCenter(results[0].geometry.location);
			var marker = new google.maps.Marker({
				map : map,
				position : results[0].geometry.location,
				icon : image
			});
		} else {
//			alert("Geocode was not successful for the following reason: "
//					+ status);
		}
	});
}

/**
 * get and show data from fusion table name: ResidentialServiceProvider id:
 * 1771020
 */
var tableid1 = 1771020;
var fusionlayer;
function loadFusionTable(request) {
	// alert("request_types are:"+request.types);
	fusionlayer = new google.maps.FusionTablesLayer({
		suppressInfoWindows : true,
		query : {
			select : 'Geocodable location',
			from : tableid1,
			where : 'category = \'' + request.types + '\''
		},
		styles : [ {
			markerOptions : {
				iconName : "large_red"
			}
		// {where: "'style' = 11", markerOptions:{iconName:"placemark_square"}},
		} ],
		map : map
	});
	// layer.setMap(map);
}

/**
 * marker click event: will add marker to the list
 */
function createMarkerClickEvent() {
	google.maps.event.addListener(fusionlayer, 'click', openFusionIW);
	google.maps.event.addListener(map, "click", function() {
		infoWindow.close();
	});
	google.maps.event.addDomListener(document.getElementById("displayText"),
			'click', function() {
				infoWindow.close();
			});
	// google.maps.event.addDomListener(document.getElementById("request_data"),
	// 'click', function() {
	// infoWindow.close();
	// });
	// setTimeout(function () { infowindow.close(); }, 5000);

	// google.maps.event.addListener(map, 'center_changed', function() {
	// alert("center changed to "+map.getCenter());
	// });

	// google.maps.event.addListener(map, 'zoom_changed', function() {
	// alert("zoom changed to "+map.getCenter());
	// });

	google.maps.event.addListener(map, 'bounds_changed', function() {
		// setTimeout(moveToDarwin, 3000);
		// alert("bounds changed to "+map.getCenter());
		filterPlacesDataAndCloseIW();
	});

}
function makeAHref(website) {
	var hrefWebsite = "<a href='" + website + "' target='_blank'>" + website
			+ "</a>";
	return hrefWebsite
}
var keyvalueArray = [];
var data;
function openFusionIW(event) {
	data = {
		"id" : event.row['residentialServiceProviderId'].value,
		"reference" : "",
		"name" : event.row['name'].value,
		"category" : event.row['category'].value,
		"layer" : "Fusion",
		"international_phone_number" : event.row['phoneNumber'].value,
		"website" : event.row['website'].value,
		"vicinity" : ""
	};

	if (data.website == undefined) {
		data.website = "";
	}
	if (data.international_phone_number == undefined) {
		data.international_phone_number = "";
	}

	// alert("data.id"+data+", "+data.id);
	// var datatext = JSON.stringify(data);
	// alert("datatext:"+datatext);
	// dataid = event.row['residentialServiceProviderId'].value;
	// dataname = event.row['name'].value;
	// datacategory = event.row['category'].value;
	// update the content of the InfoWindow
	event.infoWindowHtml = data.name + "<br/>&nbsp;&nbsp;&nbsp;"
			+ data.international_phone_number + "<br/>&nbsp;&nbsp;&nbsp;"
			+ makeAHref(data.website);
	checkedString = isAlreadySelected(data.id, this);
	// alert("checkedString:" + checkedString)
	var datalink = "<input id=\"rsp\" type=\"checkbox\" name=\"rsp\" value=\""
			+ data.id + "\"" + checkedString + " onclick=\"addSelectedMarker('"
			+ data.id + "', '" + data.reference + "', "
			+ quoteEncodingWithRemovedApostrophe(data.name) + ",'"
			+ data.category + "', this);\" />";
	// alert(datalink);
	event.infoWindowHtml = datalink + event.infoWindowHtml;
	infoWindow.setOptions({
		content : event.infoWindowHtml,
		position : event.latLng,
		pixelOffset : event.pixelOffset
	});
	infoWindow.open(map);

}
function quoteEncoding(strvalue) {
	var strquotes = /(')/g;
	return "'" + strvalue.replace(strquotes, "''") + "'";
}
function quoteEncodingWithRemovedApostrophe(strvalue) {
	var strquotes = /(')/g;
	return "'" + strvalue.replace(strquotes, "") + "'";
}
function wrapInCdata(strvalue) {
	return "<![CDATA[" + strvalue + "]]>";
}
function escapeSpecialXmlCharacters(stringToEscape) {
	if (stringToEscape != undefined) {
		var findReplace = [ [ /&/g, "&amp;" ], [ /</g, "&lt;" ],
				[ />/g, "&gt;" ], [ /"/g, "&quot;" ], [ /'/g, "&apos;" ] ]
		for ( var item in findReplace) {
			stringToEscape = stringToEscape.replace(findReplace[item][0],
					findReplace[item][1]);
		}
	}
	return stringToEscape;
}

function openPlacesIW(place, event) {
	// alert("name:"+place.types);
	data = {
		"id" : place.id,
		"reference" : place.reference,
		"name" : place.name,
		"category" : place.types,
		"layer" : "Places",
		"international_phone_number" : place.international_phone_number,
		"website" : place.website,
		"vicinity" : ""
	};

	if (data.website == undefined) {
		data.website = "";
	}
	if (data.international_phone_number == undefined) {
		data.international_phone_number = "";
	}

	// alert("data.id"+data+", "+data.id);
	// var datatext = JSON.stringify(data);
	// alert("datatext:"+datatext);
	// dataid = event.row['residentialServiceProviderId'].value;
	// dataname = event.row['name'].value;
	// datacategory = event.row['category'].value;
	// update the content of the InfoWindow
	var infoWindowHtml = data.name + "<br/>&nbsp;&nbsp;&nbsp;"
			+ data.international_phone_number + "<br/>&nbsp;&nbsp;&nbsp;"
			+ makeAHref(data.website);
	checkedString = isAlreadySelected(data.id, this);
	// alert("checkedString:" + checkedString)
	var datalink = "<input id=\"rsp\" type=\"checkbox\" name=\"rsp\" value=\""
			+ data.id + "\"" + checkedString + " onclick=\"addSelectedMarker('"
			+ data.id + "', '" + data.reference + "', "
			+ quoteEncodingWithRemovedApostrophe(data.name) + ",'"
			+ data.category + "', this);\" />";
	// alert(datalink);
	infoWindowHtml = datalink + infoWindowHtml;

	// alert("latLng:"+event.latLng+", offset:"+event.pixelOffset);
	infoWindow.setOptions({
		content : infoWindowHtml,
		position : event.latLng,
		pixelOffset : event.pixelOffset
	});
	infoWindow.open(map);

}

function isAlreadySelected(dataid, control) {
	// alert(keyvalue);
	// var dataobject = JSON.parse(keyvalue);
	// alert(dataobject.id);
	if ($('#' + dataid).length > 0) {
		// control.attr('checked', true);
		return " checked=\"checked\"";
	} else {
		// alert(dated +" not found");
		// control.attr('checked', false);
		return " ";
	}
}
/**
 * called from infoWindow adds/removes keyvalue as a li to selectedRSP ul
 */
function addSelectedMarker(dataid, datareference, dataname, datacategory,
		control) {
	// this works here replace all references to dated, datareference, etc. with
	// this.data.id, this.data.reference
	// alert("this.data.international_phone_number:"+this.data.international_phone_number);

	data = {
		"id" : dataid,
		"reference" : datareference,
		"name" : dataname,
		"category" : datacategory,
		"layer" : "",
		"international_phone_number" : this.data.international_phone_number,
		"website" : this.data.website,
		"vicinity" : ""
	};
	// var dataobject = JSON.parse(keyvalue);
	// alert("in here: "+ dataid);
	if (control.checked) {
		if ((isAlreadySelected(dataid, control) == false)) {
			keyvalueArray.push(data);
			$('#selectedRSP').append(
					"<li id=\"" + dataid + "\" >" + dataname + "["
							+ datacategory + "]" + "</li>");
			// getPlaceDetails(data);
			// showPanel("submitRequestPanel");
			checkVendorList();
		}

	} else {
		removeByValue(keyvalueArray, dataid);
		// $('#' + dataid).remove();
		// isShowSubmitRequestPanel();
		checkVendorList();
	}
	// test
	// $.each($('#selectedRSP li:contains('+datacategory+')').get(),
	// function(i, l) {
	// alert("Index #" + i + ": " + $(l).text() +", "+$(l).attr('id'));
	// // removeByValue(keyvalueArray, dataid);
	// });

}

/**
 * 
 */
function removeByValue(arr, val) {
	for ( var i = 0; i < arr.length; i++) {
		if (arr[i].id == val) {
			arr.splice(i, 1);
			break;
		}
	}
	$('#' + val).remove();
	if ($('#selectedRSP li').length > 0) {
		// alert("yes - there is at least one LI element");
	} else {
		// alert("no - there is not a single LI element");
		// clear and hide the block
		clearblock('#request_data');
		defaultText();
		loadblock('#request_data', '#displaytext', 'Send Email/SMS',
				'Do you want to submit another requirement?');
		$('#response_data').html("");

	}
}

/**
 * filter map data
 */
function filterFusionData(categories) {
	// infoWindow.close();

	var filter = [];
	// var categories = document.getElementsByName('category');
	for ( var i = 0, category; category = categories[i]; i++) {
		// category.value = parseProductName(category);
		if (category.checked) {
			// alert(category.value);
			// filter.push('\'' + category.value + '\'');
			filter.push('\'' + parseProductName(category) + '\'');
		} else {
			// alert("remove all selected vendors of category:" +
			// category.value);
			// get all dataid that contain category
			// iterate through the list
			// remove it from the list and then remove the element from DOM

			$.each($(
					'#selectedRSP li:contains(' + parseProductName(category)
							+ ')').get(), function(i, l) {
				// alert("Index #" + i + ": " + $(l).text() +",
				// "+$(l).attr('id'));
				removeByValue(keyvalueArray, $(l).attr('id'));
				// $(l).remove();
			});
		}
	}

	if (filter.length) {
		if (!fusionlayer.getMap()) {
			fusionlayer.setMap(map);
		}
		// alert("building fusion query:"+filter.join(','));
		fusionlayer.setOptions({
			query : {
				select : 'location',
				from : tableid1,
				where : '\'category\' IN (' + filter.join(',') + ')'
			}
		});

	} else {
		fusionlayer.setMap(null);
	}
}

function filterPlacesDataAndCloseIW() {
	// infoWindow.close();
	var categories = document.getElementsByName('productID');
	filterPlacesData(categories);
	filterFusionData(categories);
}

function parseProductName(category) {
	prefix = "Product_InputRadio_" + category.value;
	// alert(prefix.length);
	// alert(category.id.substring(prefix.length)+1);
	return category.id.substring(prefix.length + 1);
}
function filterPlacesData(categories) {
	// infoWindow.close();

	var filter = [];
	// var categories = document.getElementsByName('productID');
	for ( var i = 0, category; category = categories[i]; i++) {
		// category.value = parseProductName(category);

		if (category.checked) {
			// alert(category.value);
			// filter.push(category.value);
			filter.push(parseProductName(category));
		} else {
			// alert("remove all selected vendors of category:" +
			// category.value);
			// get all dataid that contain category
			// iterate through the list
			// remove it from the list and then remove the element from DOM

			$.each($(
					'#selectedRSP li:contains(' + parseProductName(category)
							+ ')').get(), function(i, l) {
				// alert("Index #" + i + ": " + $(l).text() +",
				// "+$(l).attr('id'));
				removeByValue(keyvalueArray, $(l).attr('id'));
				// $(l).remove();
			});
		}
	}

	clearOverlays();
	if (filter.length) {
		var request = {
			location : map.getCenter(),
			radius : '10000',
			types : filter
		};

		service = new google.maps.places.PlacesService(map);
		service.search(request, callback);

	}

}

// $(document).ready(submitRequirement);
/**
 * $(document).ready(function() { // to show it in an alert window
 * alert(window.location); // to store it in a variable var loc =
 * window.location; });
 * 
 */

/**
 * google places api integration
 */
function callback(results, status) {
	// alert("callback:"+results+", "+status);
	if (status == google.maps.places.PlacesServiceStatus.OK) {
		for ( var i = 0; i < results.length; i++) {
			createMarker(results[i]);
		}
	}
}

function createMarker(place) {
	// alert("2"+place.name+":"+place.geometry.location+",
	// ref:"+place.reference+", ph:"+place.international_phone_number);
	// alert("place.type:"+place.type)
	var placeLoc = place.geometry.location;
	// var marker = new google.maps.Marker({
	// map : map,
	// position : place.geometry.location
	// });
	var marker = addMarker(place.geometry.location);

	google.maps.event.addListener(marker, 'click', function(event) {
		// infoWindow.setContent(place.name);
		// infoWindow.open(map, this);
		var request = {
			reference : place.reference
		};

		service.getDetails(request, function(place, status) {
			callbackPlaceDetails(place, status, event);
		});
		// alert("place2:"+ place.international_phone_number);
		// openPlacesIW(event, place);
	});
}

/**
 * function getPlaceDetails(data) { var request = { reference : data.reference };
 *  // service.getDetails(request, function(place, //
 * status){callbackPlaceDetails(place, status);}); //
 * alert("1:"+data.international_phone_number); }
 */
// var vendorDetails = [];
function callbackPlaceDetails(place, status, event) {
	if (status == google.maps.places.PlacesServiceStatus.OK) {
		var data = {
			"id" : place.id,
			"reference" : place.reference,
			"name" : place.name,
			"category" : place.types,
			"layer" : "Places",
			"international_phone_number" : place.international_phone_number,
			"website" : place.website,
			"vicinity" : place.vicinity
		};
		// vendorDetails.push(vendorDetail);

		$
				.each(
						keyvalueArray,
						function() {
							if (this.id == (data.id)) {
								// alert("matched:"+this.name+"="+data.name +
								// "|"
								// +
								// this.international_phone_number+"="+data.international_phone_number
								// + "|"
								// + this.vicinity+"="+data.vicinity);
								this.international_phone_number = place.international_phone_number;
								this.website = place.website;
								this.vicinity = data.vicinity;
								return; // break;
							}
						});
	}
	openPlacesIW(place, event);

	// alert("place1:"+ place.international_phone_number);

}

var markersArray = [];
function addMarker(location) {
	marker = new google.maps.Marker({
		position : location,
		map : map
	});
	markersArray.push(marker);
	return marker;
}

// Removes the overlays from the map, but keeps them in the array
function clearOverlays() {
	if (markersArray) {
		for (i in markersArray) {
			markersArray[i].setMap(null);
		}
	}
}

// Shows any overlays currently in the array
function showOverlays() {
	if (markersArray) {
		for (i in markersArray) {
			markersArray[i].setMap(map);
		}
	}
}

// Deletes all markers in the array by removing references to them
function deleteOverlays() {
	if (markersArray) {
		for (i in markersArray) {
			markersArray[i].setMap(null);
		}
		markersArray.length = 0;
	}
}
