/**
 * UrbexInit.js
 * Contains all initial operation to perform as well as HTTP AJAX connections code and fields and buttons responses code (Except geocoding).
 */

var g_sUrbexToken = null;
var g_iInitialX = null;
var g_iInitialY = null;
var g_iInitialZoom = 17;
var g_iInitialOrientation = "ORTHO";
var g_iInitialView = "SINGLE";
var g_sLayoutId = null;
var g_plugins = [];
var g_rememberMe=false;
var g_isLogout=false;
var g_sMapProvider = null;
var g_GeocodingProvider = null;
var g_RoutingProvider = null;
var g_isFirstLaunch = true;

var SESSION_USER_TOKEN = "UrbexToken";
var SESSION_INITIAL_X = "InitialX";
var SESSION_INITIAL_Y = "InitialY";
var SESSION_LAYOUT_ID = "LayoutId";
var SESSION_PLUGINS = "UserDefinedPlugins";
var SESSION_REMEMBER_ME = "RememberMe";
var SESSION_MAP_PROVIDER = "MapProvider";
var SESSION_GEOCODING_PROVIDER = "GeocodingProvider"; 
var SESSION_ROUTING_PROVIDER = "RoutingProvider";
var TEMPORARY_INITIAL_X = "tempInitialX";
var TEMPORARY_INITIAL_Y = "tempInitialY";
var TEMPORARY_INITIAL_VIEW = "tempInitialView";
var TEMPORARY_INITIAL_ORIENTATION = "tempInitialOrientation";
var TEMPORARY_INITIAL_ZOOM = "tempInitialZoom";

//Object of the Urbex.Geocoder. 
var g_oGeoCoder = null;
//Object of the Urbex.Router
var g_oRouter=null;
var g_oGoogleGeocoder = null;

var g_bPopupChooserActive = false;

var g_numberOfViews = 0;
var g_mapsArray = [];

var coordsPlaceholder = "lon,lat or Sph.Mercator X,Sph.MercatorY ...";
var geocodingPlaceholder = "Type the address to geocode ...";

var ERROR_USER_NAME_TOO_LONG_PLEASE_CHECK = "User name too long. Please check it and try again.";
var ERROR_INVALID_DATA_PLEASE_CHECK = "Please check the entered data and try again.";
var ERROR_MALFORMED_RESPONSE_PLEASE_RELOAD = "An unexpected error occurred while processing the received data. Please reload this page and try again.";
var ERROR_NETWORK_PLEASE_RETRY = "A network error occurred while checking User and Password. Please try again later.";
var ERROR_NETWORK_TIMEOUT_PLEASE_RETRY = "A network timeout occurred while checking User and Password. Please try again later.";
var NETWORK_REQUEST_TIMEOUT = 30000;
var g_oAutoCheckTimer = null;
var NETWORK_AUTOCHECK_TIMEOUT = 60000;

var sessionMaxAge = 3*24*3600; //3Days default session if no 

/**
 * Initializes the view
 */
function initMap(){
	
	switch (g_iInitialView){
		case "DUAL":
			dualView(null, new Urbex.XY(g_iInitialX, g_iInitialY), g_iInitialZoom, true);
			break;
		case "PENTA":
			pentaView(null, new Urbex.XY(g_iInitialX, g_iInitialY), g_iInitialZoom, true);
			break;
		case "BLOMSTREET":
			blomStreetView(null, new Urbex.XY(g_iInitialX, g_iInitialY), g_iInitialZoom, true);
			break;
		case "3D":
			threedView(null, new Urbex.XY(g_iInitialX, g_iInitialY), g_iInitialZoom, true);
			break;
		case "LIDAR":
			lidarView(new Urbex.XY(g_iInitialX, g_iInitialY), 250, g_iInitialZoom, true);
			break;
		default:
			singleView(null, new Urbex.XY(g_iInitialX, g_iInitialY), g_iInitialZoom, true, "ORTHO", g_iInitialOrientation);
			break;
	}
	
	//Set correct Baselayer provider
	if (g_mapsArray[0])
		checkMapProvider();
}


/**
 * FIELDS TREATMENT
 */

function clearSearchFields(){
	var selector = document.getElementById("country");
	selector.selectedIndex = 0;
	document.getElementById("deCartaStrStreet").value = "";
	document.getElementById("deCartaStrNumber").value = "";
	document.getElementById("deCartaStrCity").value = "";
	document.getElementById("deCartaStrPcode").value = "";
	
	document.getElementById("viewSelector").selectedIndex = 0;
}


function onFormIntroKeypress(e){
	var keynum;
	var keychar;
	var numcheck;
	
	if (window.event) // IE
		keynum = e.keyCode;
	else if (e.which) // Netscape/Firefox/Opera
		keynum = e.which;
	if (keynum == 13) {
		var event = e || window.event;
		
		jQuery(this).parents("form").submit();
		if (event.stopPropagation) {
			event.stopPropagation();
		} else {
			event.cancelBubble = true;
		} 
	}
}

/**
 * END
 */


/**
 * LOGIN ZONE
 */

function clearUserCredentials(){
	jQuery("#user").val("");
	jQuery("#passwd").val("");
}

function clearLoadingImage(){
	jQuery("#loadingImgDiv").css('display','none');	
}
function loadLoadingImage(){
	jQuery("#loadingImgDiv").css('display','block');
}
var g_checkingUserCredentials = false;

function checkUserCredentials(){
	// Generic Login
	var user = jQuery("#user").val();
	var passwd = jQuery("#passwd").val();
	
	_checkUserCredentials(user, passwd);
}

function _checkUserCredentials(user, passwd) {
	var USER_NAME_MAX_LENGTH = 50;
	if (!g_checkingUserCredentials) {
		g_checkingUserCredentials = true;

		var url = "/BUAV/Login";
		// Check constraints
		if (user.length > USER_NAME_MAX_LENGTH) {
			alert(ERROR_USER_NAME_TOO_LONG_PLEASE_CHECK);
			clearUserCredentials();
			g_checkingUserCredentials = false;
			return;
		}
		var t = composeToken(user, passwd);
		if (t == null) {
			alert(ERROR_INVALID_DATA_PLEASE_CHECK);
			clearUserCredentials();
			g_checkingUserCredentials = false;
			return;
		}
		var body = "tok=" + encodeURIComponent(t);
		
		loadLoadingImage();
		
		jQuery.ajax({
			type: "POST",
			url: url,
			data: body,
			timeout: NETWORK_REQUEST_TIMEOUT,
			//dataType: "text",
			success: checkUserCredentials_success,
			error: checkUserCredentials_error
		});
	}
}

function checkUserCredentials_success(data, textStatus, jqXHR) {
	g_checkingUserCredentials = false;
	//var response = eval("(" + data + ")");
	var response = data;

	if (response == null) {
		clearLoadingImage();
		alert(ERROR_MALFORMED_RESPONSE_PLEASE_RELOAD);
		clearUserCredentials();
		return;
	}
	if (!response.success) {
		clearLoadingImage();
		alert(response.error);
		clearUserCredentials();
		return;
	}
	if (!response.data || !response.data.userToken || !response.data.layoutId) {
		clearLoadingImage();
		alert(ERROR_MALFORMED_RESPONSE_PLEASE_RELOAD);
		clearUserCredentials();
		return;
	}
	if(document.getElementById("rememberMe").checked)
	{
		g_rememberMe=true;
	}
	else{
		g_rememberMe=false;
	}
	g_sUrbexToken = response.data.userToken;
	g_iInitialX = response.data.x;
	g_iInitialY = response.data.y;
	g_sLayoutId = response.data.layoutId;
	providers = response.data.serviceProviders;
	
	for(var index = 0; index < providers.length; index++){
		var temp = providers[index];
		if((""+temp).indexOf("Map")!=-1){
			g_sMapProvider = temp.replace("Map","");
		}else if ((""+temp).indexOf("Route")!=-1){
			g_RoutingProvider = temp.replace("Route","");
		}else{
			g_GeocodingProvider = temp;
		}		
	}
	//When user has no choices
	
	if (!g_sMapProvider){
		g_sMapProvider = "ubiest";
	}
	if(!g_RoutingProvider){
		g_RoutingProvider = "oym";
	}
	if(g_GeocodingProvider === null){
		g_GeocodingProvider = "provider5";
	}	
	
	sessionMaxAge = response.data.maxAge - 2*60; //Anticipate to server
	
	// Store session data, expires along with the token
	SetLocalStorageItem(SESSION_USER_TOKEN, g_sUrbexToken, sessionMaxAge);
	SetLocalStorageItem(SESSION_INITIAL_X, g_iInitialX, sessionMaxAge);
	SetLocalStorageItem(SESSION_INITIAL_Y, g_iInitialY, sessionMaxAge);
	SetLocalStorageItem(SESSION_LAYOUT_ID, g_sLayoutId, sessionMaxAge);
	SetLocalStorageItem(SESSION_PLUGINS,jQuery.toJSON(g_plugins), sessionMaxAge);
	SetLocalStorageItem(SESSION_REMEMBER_ME, g_rememberMe, sessionMaxAge);
	SetLocalStorageItem(SESSION_MAP_PROVIDER,g_sMapProvider, sessionMaxAge);
	SetLocalStorageItem(SESSION_GEOCODING_PROVIDER,g_GeocodingProvider, sessionMaxAge);
	SetLocalStorageItem(SESSION_ROUTING_PROVIDER,g_RoutingProvider, sessionMaxAge);
	// Redirect
	window.location = "map.html";
}

function checkUserCredentials_error(jqXHR, textStatus, errorThrown) {
	g_checkingUserCredentials = false;

	switch (textStatus) {
		case "timeout":
			clearLoadingImage();
			alert(ERROR_NETWORK_TIMEOUT_PLEASE_RETRY);
			clearUserCredentials();
			break;
		case "parsererror":
			clearLoadingImage();
			alert(ERROR_MALFORMED_RESPONSE_PLEASE_RELOAD);
			clearUserCredentials();
			break;
		default:
			clearLoadingImage();
			alert(ERROR_NETWORK_PLEASE_RETRY);
			clearUserCredentials();
			break;
	}
	
}

function composeToken(a,b){
	var m = "a02b3fe4b657ef516d68d78267a243ae57217292c5d3a411d9d9651629948333f3b7badf43db8a903f4c94ef719f051550e2fbf89df780d71768d2601a6d41ab3c9df852fad95e6a5929b755b557336b206b11e586931854892bd4e11ee752767045a301b29485044e32f6f9b049140886d98b9092247b4fdf9ad356da536c51820b3d608ea6e7cc194c8b2e6e2f420d069a6654987c2a3233eb5e8777a5ebf928c09d55c39668ed06d6b17309776e04b96361a3ffce343ad34c1d395f5f580867a907ecaca279a223433e03a6c042f5a10c00a681531c455347e5100d2a09e83127c6c778cda6ba600911e3ba29d8f53f9d555cf11514e3337d81ca3ca75737";
	var e = "10001";
	var r = new RSAKey();
	r.setPublic(m, e)
	var t = a+','+b;
 	// TODO: Limitar la longitud máxima de los campos user y pass
 	// NOTE: 2048 bits / 8 - 11 = 245
	if (t.length > 245) {
		// Houston, we've got a problem!
		return null;
	}
	return r.encrypt(t);
}

function checkSession() {
	// Session expired?
	var urbexTokenTest = GetLocalStorageItem(SESSION_USER_TOKEN);
	if (urbexTokenTest == null) {
		logout();
		return;
	}
	
	// Server session expired?
	var url = "/BUAV/CheckSession?userToken=" + encodeURIComponent(urbexTokenTest);
	jQuery.ajax({
		type: "GET",
		url: url,
		timeout: NETWORK_REQUEST_TIMEOUT,
		//dataType: "text",
		success: function(data, textStatus, jqXHR) {
			//var response = eval("(" + data + ")");
			var response = data;
			if (response.success) {
				autoCheckSession(true);
			}
			else {
				// Only warn when autochecking
				if (g_oAutoCheckTimer) {
					alert("Session expired. Logging out...");
				}
				logout();
			}
		},
		error: function(jqXHR, textStatus, errorThrown) {
			logout();
		}
	});
	
	g_sUrbexToken = urbexTokenTest;
	
	if (g_isFirstLaunch){
		var tempX = GetLocalStorageItem(TEMPORARY_INITIAL_X);
		var tempY = GetLocalStorageItem(TEMPORARY_INITIAL_Y);
		
		if (tempX && tempY) {
			g_iInitialX = parseFloat(tempX);
			g_iInitialY = parseFloat(tempY);
		} else {
			g_iInitialX = GetLocalStorageItem(SESSION_INITIAL_X);
			g_iInitialY = GetLocalStorageItem(SESSION_INITIAL_Y);
		}
		g_sLayoutId = GetLocalStorageItem(SESSION_LAYOUT_ID);
		g_plugins = jQuery.evalJSON(GetLocalStorageItem(SESSION_PLUGINS));
		if(g_plugins == null){
			g_plugins = [];
		}
		g_sMapProvider = GetLocalStorageItem(SESSION_MAP_PROVIDER);
		g_GeocodingProvider = GetLocalStorageItem(SESSION_GEOCODING_PROVIDER);
		g_RoutingProvider = GetLocalStorageItem(SESSION_ROUTING_PROVIDER);
		
		//Optional parameters in URL
		var tempOrientation = GetLocalStorageItem(TEMPORARY_INITIAL_ORIENTATION);
		if (tempOrientation) {
			g_iInitialOrientation = tempOrientation.toUpperCase();
		}
		
		var tempView = GetLocalStorageItem(TEMPORARY_INITIAL_VIEW);
		if (tempView) {
			g_iInitialView = tempView.toUpperCase();
		}
		
		var tempZoom = GetLocalStorageItem(TEMPORARY_INITIAL_ZOOM);
		if (tempZoom) {
			g_iInitialZoom = parseInt(tempZoom);
		}
		g_isFirstLaunch = false;
	}
}

function checkRememberMe(){
	g_RememberMe = GetLocalStorageItem(SESSION_REMEMBER_ME);
	// Redirect
	if(g_RememberMe=="true")
	{
		window.location = "map.html";
	}
}

function logout(){
	autoCheckSession(false);
	saveUserPreferences();
	g_isLogout = true;
	deleteSessionItems();
	//Invalidate session
	jQuery.ajax({
		type: "GET",
		url: "/BUAV/Logout",
		complete : function(){				
			// Redirect
			window.location = "index.html";	
		},		
		cache: false
	});
	
}

function deleteSessionItems(){
	// Cleanup
	DeleteLocalStorageItem(SESSION_USER_TOKEN);
	DeleteLocalStorageItem(SESSION_INITIAL_X);
	DeleteLocalStorageItem(SESSION_INITIAL_Y);
	DeleteLocalStorageItem(SESSION_LAYOUT_ID);
	DeleteLocalStorageItem(SESSION_PLUGINS);
	DeleteLocalStorageItem(SESSION_REMEMBER_ME);
	DeleteLocalStorageItem(SESSION_MAP_PROVIDER);
	DeleteLocalStorageItem(SESSION_GEOCODING_PROVIDER);
	DeleteLocalStorageItem(SESSION_ROUTING_PROVIDER);
	deleteTemporarySessionItems();
}

/**
 * 
 */
function deleteTemporarySessionItems() {
	DeleteLocalStorageItem(TEMPORARY_INITIAL_X);
	DeleteLocalStorageItem(TEMPORARY_INITIAL_Y);
	DeleteLocalStorageItem(TEMPORARY_INITIAL_ORIENTATION);
	DeleteLocalStorageItem(TEMPORARY_INITIAL_VIEW);
	DeleteLocalStorageItem(TEMPORARY_INITIAL_ZOOM);
}

function autoCheckSession(keepChecking){
	if (g_oAutoCheckTimer) {
		clearTimeout(g_oAutoCheckTimer);
		g_oAutoCheckTimer = null;
	}
	if (keepChecking) {
		g_oAutoCheckTimer = setTimeout(checkSession, NETWORK_AUTOCHECK_TIMEOUT);
	}
}

/**
 * Get the google geocoder
 */
function getGoogleGeocoder(){
	return g_oGoogleGeocoder;
}

/**
 * Set the googleGeocoder
 * @param googleGeocoder
 */
function setGoogleGeocoder(googleGeocoder){
	g_oGoogleGeocoder = googleGeocoder;
}


/**
 * Checks for initialization parameters in the URL
 */
function checkURLInitialParameters() {
	
	//var user = parseQueryString("user");
	//var password = parseQueryString("passwd");
	
	var centerX = parseQueryString("x");
	var centerY = parseQueryString("y");
	
	if (centerX == "" || centerY == ""){
		var lon = parseQueryString("lon");
		var lat = parseQueryString("lat");
		
		if (lon != "" && lat != ""){
			lon = parseFloat(lon);
			lat = parseFloat(lat);
			
			var mercCoords = Urbex.Util.WGS84ToSphericalMercator(lon, lat);
			centerX = ""+mercCoords[0];
			centerY = ""+mercCoords[1];
		}
	}
	
	if (centerX != "" && centerY != ""){
		SetLocalStorageItem(TEMPORARY_INITIAL_X, centerX, sessionMaxAge);
		SetLocalStorageItem(TEMPORARY_INITIAL_Y, centerY, sessionMaxAge);
		
		var orientation = parseQueryString("orientation");
		if (orientation != ""){
			SetLocalStorageItem(TEMPORARY_INITIAL_ORIENTATION, orientation, sessionMaxAge);
		} else {
			//Just in case
			DeleteLocalStorageItem(TEMPORARY_INITIAL_ORIENTATION);
		}
		var view = parseQueryString("view");
		if (view != ""){
			SetLocalStorageItem(TEMPORARY_INITIAL_VIEW, view, sessionMaxAge);
		} else {
			//Just in case
			DeleteLocalStorageItem(TEMPORARY_INITIAL_VIEW);
		}
		
		var zoom = parseQueryString("zoom");
		if (zoom != ""){
			SetLocalStorageItem(TEMPORARY_INITIAL_ZOOM, zoom, sessionMaxAge);
		} else {
			//Just in case
			DeleteLocalStorageItem(TEMPORARY_INITIAL_ZOOM);
		}
	
	} else {
		//Just in case
		deleteTemporarySessionItems();
	}
	
	/*if (user != "" && password != ""){
		
	}*/
}

/**
 * Parses query string for parameters
 */

function parseQueryString( name ){
	var regexS = "[\\?&]"+name+"=([^&#]*)";
	var regex = new RegExp ( regexS );
	var tmpURL = window.location.href;
	var results = regex.exec( tmpURL );
	if( results == null )
		return "";
	else
		return results[1];
}

/**
 * END
 */

