var player = new nokiaMapLoader.getPlayer({jsPlugin: "supported", uiLanguage: "en", token: "6138e4c1d6ba83174e2888be2bdc72", onInitDone: startSearching, debug: {"console": true}});
var layer = null;
var layerRadius = null;
var layerUser = null;
var currentPosition = null;
var userData = {type: "marker", clickable: true, icon: "http://i2tecnologia.com.br/fuelup/you-ico.png"};
var userMark = null;
var polygonItem = null;
var currentLongitude = null;
var currentLatitude = null;
var currentId = null;
var currentRadius = 1;
var markerData = [];
var markersObjectArray = [];
var currentUpdateLatitude = null;
var currentUpdateLongitude = null;

var polygonData = {type: "polygon", 
				   visible: true,
				   points: [{latitude: 51.7534, longitude: -1.2539},  
							 {latitude: 51.7173, longitude: -1.9713},     
							 {latitude: 51.5774, longitude: -1.5648}],
				   width: 3, 
				   color: {red: 255, blue: 123, green: 197, alpha: 255}
				   };


/*
 *
*/
$(document).ready(function()
{
  //close the message box when cross red image is clicked
  $("#close_message").click(function()
  {
     $("#object").fadeOut("slow");
	 $("#object").animate({
							top: "-170px"
						  }, 1000 );
  });

});

function showAlert(title, message)
{
	 $("#object").fadeIn("fast");

	//first slide down and blink the message box
	$("#object").animate({
		top: "0px"
	}, 1000 );
	
	$("#titleMessage").html('<strong>' + title + '</strong>');
	$("#descMessage").html(message);
	
}

/*
 *
*/
function startSearching()
{
	layerRadius = player.map.createLayer({name: "radius"});
	layer = player.map.createLayer({name: "gasStations"});
	layerUser = player.map.createLayer({name: "user"});
	
	userMark = layerUser.addMapObjects(userData)[0];
	polygonItem = layerRadius.addMapObjects(polygonData)[0];
	
	if(player.position.isPositioningEnabled() && 
	   player.position.isLivePositioningData()) {

		currentPosition = player.position.getPosition();
		userMark.setPosition({ longitude: currentPosition.longitude, 
								latitude: currentPosition.latitude });
	} else {
		userMark.setPosition({ latitude: 43.7830000, 
							   longitude: 7.4300000 });
	}

	player.map.addEventHandler(nokia.maps.pfw.MapModel.EVENT_POSITION_CHANGED, mapPropertyEventHandler);
	player.map.addEventHandler(nokia.maps.pfw.MapModel.EVENT_ANIMATION_DONE, mapClickedEventHandler);
	player.map.addEventHandler(nokia.maps.pfw.MapModel.EVENT_MAPOBJECT_SELECTED, markerClickedEventHandler);
	player.map.addEventHandler(nokia.maps.pfw.MapModel.EVENT_MAPOBJECT_UNSELECTED, markerClickedEventHandler);
	
	player.map.moveTo({position: userMark.getPosition(), scale: 8000});
	drawCircle(userMark, currentRadius/10, 40);
	searchLocationsNearMe();
}


function markerClickedEventHandler(ev)
{
	try {
		var mObjSelected = ev.getData();
		if(mObjSelected != null)
		{
			if(ev.type === nokia.maps.pfw.MapModel.EVENT_MAPOBJECT_SELECTED)
			{
				if(mObjSelected.getId() != userMark.getId()) {
					for(var k = 0; k < markersObjectArray.length; k++) 
					{
						if(String(mObjSelected.getId()) == String(markersObjectArray[k].getId()) || (markersObjectArray[k].latitude == mObjSelected.getPosition().latitude && markersObjectArray[k].longitude == mObjSelected.getPosition().longitude)) 
						{
							$("#setUpName").val(markerData[k].name);
							$("#addressUpInput").val(markerData[k].address);
							$('#setUpPrice').val(markerData[k].price);
							$('#setUpGas').val(markerData[k].fuel);
							
							currentId = markerData[k].id;
							currentUpdateLatitude = markerData[k].latitude;
							currentUpdateLongitude = markerData[k].longitude;
							
							player.map.reverseGeoCode({latitude: currentUpdateLatitude, 
													  longitude: currentUpdateLongitude}, 
													  revGeoCallBack,
													  this);
							
						}
					}
					
					showUpdateGasStation();
				}
			}
		}
	} catch(e) {
		alert(e);	
	}
}

function showAllGasStation() 
{
	drawCircle(userMark, 100, 40);
	searchLocationsNearMe();
}

/*
* show user location on map  
*/
function showOnMap(lat, long)
{
	updateUserLocation(lat, long);	
	searchLocationsNearMe();
}

/*
* showSearchPanel  
*/
function showSearchPanel()
{
	$("#searchResultsPanel").attr("style", "display:none;");
	$("#searchPanel").attr("style", "display:block;");
	$("#addPanel").attr("style", "display:none;");
	$("#updatePanel").attr("style", "display:none;");
}

/*
* searchResultsPanel  
*/
function searchResultsPanel()
{
	$("#searchResultsPanel").attr("style", "display:block;");
	$("#searchPanel").attr("style", "display:none;");
	$("#addPanel").attr("style", "display:none;");
	$("#updatePanel").attr("style", "display:none;");
}

/*
* showAddGasStation  
*/
function showAddGasStation()
{
	$("#addPanel").attr("style", "display:block;");
	$("#searchResultsPanel").attr("style", "display:none;");
	$("#searchPanel").attr("style", "display:none;");
	$("#updatePanel").attr("style", "display:none;");
}

/*
* showUpdateGasStation  
*/
function showUpdateGasStation()
{
	$("#updatePanel").attr("style", "display:block;");
	$("#searchResultsPanel").attr("style", "display:none;");
	$("#searchPanel").attr("style", "display:none;");
	$("#addPanel").attr("style", "display:none;");
}

/*
* Callback function – a reference to it is passed to geoCode(), see below  
*/
function geoCallBack(resultList)  
{ 
	var len = resultList.length;
	if(len == 0) {
		showAlert("Info" ,"No results found.");	
	} else {
		if(len == 1) {
			updateUserLocation(resultList[0].latitude,
							   resultList[0].longitude);
		} else {
			if(len > 1) {
				searchResultsPanel();
				var codeHTML = 'Results found: <br/><br/>';
				
				for(var k = 0; k < len; k++) {
					//<a href="#" class="resultItem">search results</a>
					codeHTML += '<a href="#" class="resultItem" onclick="javascript:showOnMap(' + resultList[k].latitude + ' , ' + resultList[k].longitude + ')">';
					codeHTML += (resultList[k].ADDR_CITY_NAME == undefined) ? "" : (resultList[k].ADDR_CITY_NAME + ", ");
					codeHTML += (resultList[k].ADDR_POSTAL_CODE == undefined) ? "" : (resultList[k].ADDR_POSTAL_CODE);
					codeHTML += '</a>';
				}
				
				codeHTML += '<br/><br/><a href="#" class="back" onclick="javascript:showSearchPanel()">Back</a>';
				$("#searchResultsPanel").html(codeHTML);
			}
		}
	}
}

/* searchLocation
 *
*/
function searchLocation()
{
	nokia.aduno.utils.info("searchLocation"); 
	player.map.geoCode($("#query").val(), 10, geoCallBack, this);
}

function updateUserLocation(lat, long)
{
	nokia.aduno.utils.info("updateUserLocation"); 

	userMark.setPosition({ longitude: long, 
						    latitude: lat});
	player.map.moveTo({position: {latitude: lat, longitude: long}, scale: player.map.getZoomScale()});
	drawCircle(userMark, currentRadius/10, 40);	
	searchLocationsNearMe();
}

function revGeoCallBack(location)
{
	if(location)
	{
		var addressValue = (location[0].ADDR_COUNTRY_CODE == undefined) ? "" : (location[0].ADDR_COUNTRY_CODE + ",");
		addressValue += (location[0].ADDR_STREET_NAME == undefined) ? "" : (location[0].ADDR_STREET_NAME + ",");
		addressValue += (location[0].ADDR_CITY_NAME == undefined) ? "" : (location[0].ADDR_CITY_NAME + ",");
		addressValue += (location[0].ADDR_COUNTRY_NAME == undefined) ? "" : location[0].ADDR_COUNTRY_NAME;
		
		$("#addressInput").val(addressValue);
		$("#addressUpInput").val(addressValue);
	} else {	
		showAlert("Warn", "Nothing found.");
	}
}

/* mapPropertyEventHandler 
 *
*/
function mapPropertyEventHandler(ev) {
	currentLatitude = ev.getData().latitude;
	currentLongitude = ev.getData().longitude;
}

/* Event handler for a map clicked event 
 *
*/
function mapClickedEventHandler(ev)
{
	//nokia.aduno.utils.info("mapClickedEventHandler"); 
	updateUserLocation( currentLatitude,
					    currentLongitude);
	var codeHTML = '<a href="#" class="resultItem" onclick="javascript:showOnMap(' + currentLatitude + ' , ' + currentLongitude + ')">Show on map</a>';
	$("#addLocation").html(codeHTML);
	player.map.reverseGeoCode({latitude: currentLatitude, longitude: currentLongitude}, 
							  revGeoCallBack,
							  this);
}

/**
* searchLocationsNearMe
*/
function searchLocationsNearMe() {
	var searchUrl = 'http://maps.i2tecnologia.com.br/php/phpsqlsearch_genxml2.php';
	var dataUrl = 'lat=' + userMark.getPosition().latitude + '&lng=' + userMark.getPosition().longitude + '&radius=' + currentRadius;
	var mapObj = layer.getMapObjects(true); 
	layer.removeMapObjects(mapObj);

	$.ajax({type: "GET",
		    data: dataUrl,
			url: searchUrl,
			dataType: "xml",
			success: function(response) {
				//alert("XML Root Tag Name: " + response.documentElement.tagName);
				//alert(response.getElementsByTagName("marker"));
				//nokia.aduno.utils.info("response: " + response);
				var markers = response.getElementsByTagName("marker");
				var markerLength = markers.length;
				
				var mapObj = layer.getMapObjects(true); 
				layer.removeMapObjects(mapObj);
	
				markerData = [];
				markersArray = [];
				markersObjectArray = [];
				
				for (var i = 0; i < markerLength; i++)
				{
					var id = markers[i].getAttribute('id');
					var name = markers[i].getAttribute('name');
					var address = markers[i].getAttribute('address');
					var price = markers[i].getAttribute('price');
					var fuel = markers[i].getAttribute('fuel');
					var currency = markers[i].getAttribute('currency');
					var distance = parseFloat(markers[i].getAttribute('distance'));
					var point = { latitude: parseFloat(markers[i].getAttribute('lat')), longitude: parseFloat(markers[i].getAttribute('lng')) };
					
					if(distHaversine(userMark.getPosition().latitude, userMark.getPosition().longitude, point.latitude, point.longitude) < currentRadius) 
					{
						markerData.push({id: id,
										name: name,
										address: address,
										price: price,
										fuel: fuel,
										currency: currency,
										latitude: point.latitude,
										longitude: point.longitude
										});

						markersArray.push({type: "marker", 
										clickable: true,
										latitude: point.latitude,
										longitude: point.longitude,
										infoTitle: name,
										infoDescription: (address + "\n" + currency + " " + price),
										category: "PETROL_STATION",
										icon: "http://i2tecnologia.com.br/fuelup/gas-station-ico.png"});
					}
				}

				markersObjectArray = layer.addMapObjects(markersArray);
			}
	});
}

function distHaversine(lat1, lon1, lat2, lon2) {
	var R = 6371; // earth's mean radius in km
	var dLat = (lat2-lat1).toRad();
	var dLon = (lon2-lon1).toRad();
	lat1 = lat1.toRad(), lat2 = lat2.toRad();
	
	var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
			Math.cos(lat1) * Math.cos(lat2) * 
			Math.sin(dLon/2) * Math.sin(dLon/2);
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
	var d = R * c;
	return d;
}

/** 
 * Remove withspaces from given string
 */
function trim(str) {
	var	str = str.replace(/^\s\s*/, ''),
		ws = /\s/,
		i = str.length;
	while (ws.test(str.charAt(--i)));
	return str.slice(0, i + 1);
}

/* Add location 
 *
*/
function addLocation()
{
	var name = $("#setName").val();
	var address = $("#addressInput").val();
	var currency = $('#currency').find('option').filter(':selected').html();
	var fuel = $('#setGas').find('option').filter(':selected').val();
	var price = $('#setPrice').attr("value");
	
	var insertUrl = 'http://maps.i2tecnologia.com.br/php/phpinsert_newmarker.php';
	var dataUrl = 'name=' + escape(name)  + '&address=' + escape(address) + '&currency=' + currency;
	dataUrl += '&fuel=' + fuel + '&price=' + price + '&lat=' + currentLatitude + '&lng=' + currentLongitude + '&id_marker=undefined';
	
	if(trim(name).length <= 0) {
		showAlert("Warn", "Please, set the gas station name.");
		return null;	
	}
	
	if(trim(address).length <= 0) {
		showAlert("Warn", "Please, set the gas station address.");
		return null;	
	}
	
	if(!isNumber(price) && (price.length > 0)) {
		showAlert("Warn", "Please, set a valid number.");
		$('#setPrice').val('');
		return null;	
	}
	
	$.ajax({type: "GET",
			data: dataUrl,
			url: insertUrl,
			success: function(response) {
				showAlert("Info", "Gas Station successfully added.");
				searchLocationsNearMe();
				
				 $("#setName").val('');
				 $("#addressInput").val('');
				 $('#setPrice').val('');
			},
			error: function (err) {
				showAlert("Error", "Error when adding the gas station. Please, check your internet connection or try again later.");
			}
	});
}

/* udpdateLocation 
 *
*/
function udpdateLocation()
{
	var name = $("#setUpName").val();
	var address = $("#addressUpInput").val();
	var currency = $('#upCurrency').find('option').filter(':selected').html();
	var fuel = $('#setUpGas').find('option').filter(':selected').val();
	var price = $('#setUpPrice').attr("value");
	
	var insertUrl = 'http://maps.i2tecnologia.com.br/php/phpinsert_newmarker.php';
	var dataUrl = 'id_marker=' + currentId + '&name=' + escape(name)  + '&address=' + escape(address) + '&currency=' + currency;
	dataUrl += '&fuel=' + fuel + '&price=' + price + '&lat=' + currentUpdateLatitude + '&lng=' + currentUpdateLongitude;

	alert(insertUrl + '?' + dataUrl);

	if(trim(name).length <= 0) {
		showAlert("Warn", "Please, set the gas station name.");
		return null;	
	}
	
	if(trim(address).length <= 0) {
		showAlert("Warn", "Please, set the gas station address.");
		return null;	
	}
	
	if(!isNumber(price) && (price.length > 0)) {
		showAlert("Warn", "Please, set a valid number.");
		$('#setPrice').val('');
		return null;	
	}
	
	$.ajax({type: "GET",
			data: dataUrl,
			url: insertUrl,
			success: function(response) {
				showAlert("Info", "Gas Station successfully updated.");
				searchLocationsNearMe();
				
				 $("#setUpName").val('');
				 $("#addressUpInput").val('');
				 $('#setUpPrice').val('');
			},
			error: function (err) {
				showAlert("Error", "Error when adding the gas station. Please, check your internet connection or try again later.");
			}
	});
}

/* Use Law of Cosines to calculate distance (in km) between two points specified by latitude/longitude 
 * (in numeric degrees).
 */
function distanceFrom(lat1, lon1, lat2, lon2) {
	var R = 6371; // earth's mean radius in km
	var d = Math.acos(Math.sin((lat1).toRad())*Math.sin((lat2).toRad()) +
					Math.cos((lat1).toRad())*Math.cos((lat2).toRad())*Math.cos((lon2-lon1).toRad())) * R;
	return d;
}

/*
 *
*/
Number.prototype.toRad = function() {  // convert degrees to radians
	return this * Math.PI / 180;
}

/*
 *
*/
function drawCircle(center, radius, nodes)
{
	var centerPosition = center.getPosition();
	var latConv = distanceFrom(centerPosition.latitude, centerPosition.longitude, 
							   centerPosition.latitude + 0.1, centerPosition.longitude);
	var lngConv = distanceFrom(centerPosition.latitude, centerPosition.longitude, 
							   centerPosition.latitude, centerPosition.longitude + 0.1);

	//Loop 
	var arrPoints = [];
	var step = parseInt(360 / nodes) || 10;
	
	for(var i = 0; i <= 360; i += step)
	{
		var point ={latitude: centerPosition.latitude + (radius/latConv * Math.cos(i * Math.PI/180)), 
				   longitude: centerPosition.longitude + (radius/lngConv * Math.sin(i * Math.PI/180))};
		arrPoints.push(point);
	}
	
	arrPoints.push(arrPoints[0]); 
	polygonItem.setPoints(arrPoints);
}

/**
* isNumber
* check to see if input is number
*/
function isNumber(val)
{
	if (isNaN(val))
	{
		return false;
	}
	else
	{
		return true;
	}	
}