var Synergy = {};
Synergy.App = {};

/**
 * Turn off the no javascript elements and turn on the javascript interface
 */
Synergy.App.activateInterface = function()
{
	$(".noJavascript, #welcome").hide();

	$("#toolbar, #mapControls, #innerNav, #compDetails, #compDetailsButton").css('visibility', 'visible');
};

/**
 * Setup the resize of the map so it remains full screen
 */
Synergy.App.setupResizer = function()
{
	$(window).resize(function()
	{
		var height = $(window).height() - $('#header').height() - $('#footer').height();

		if( height < Synergy.Options.minMapHeight ) {
			height = Synergy.Options.minMapHeight;
		}

		Synergy.Options.mapContainer.height(height);
		Synergy.App.addShadows();
	});
	$(window).resize();
};

/**
 * Close any overlay that is open.
 */
Synergy.App.closeOverlay = function()
{
	$('#overlay .close').click();
};

/**
 * Setup the map controls
 */
Synergy.App.setupMapControls = function()
{
	var slider = $('#mapControls .slider');

	slider.slider( {
		min : 6,
		max : 11,
		orientation : 'vertical',
		change : function( event, ui )
		{
			Synergy.Options.map.setZoom(ui.value);
		},
		stop : function( event, ui )
		{
			if( ui.value > Synergy.Options.maxZoomLevel ) {
				slider.slider('option', 'value', Synergy.Options.maxZoomLevel);
			}

			if( ui.value < Synergy.Options.maxZoomLevel ) {
				slider.slider('option', 'value', Synergy.Options.minZoomLevel);
			}
		},
		value : Synergy.Options.defaultZoomLevel
	});

	$('#mapControls .zoomIn').click(function()
	{
		var newValue = (slider.slider('option', 'value') + 1);

		if( newValue <= 10 ) {
			slider.slider('option', 'value', newValue);
		}
	});

	$('#mapControls .zoomOut').click(function()
	{
		var newValue = (slider.slider('option', 'value') - 1);

		if( newValue >= 7 ) {
			slider.slider('option', 'value', newValue);
		}
	});

	GEvent.addListener(Synergy.Options.map, "zoomend", function()
	{
		slider.slider('option', 'value', Synergy.Options.map.getZoom());
	});

};

/**
 * Populate the map data.
 * <p>
 * This will clear all markers from the map then query for pins
 * </p>
 *
 * @param {Object} filter A key/value set of options to be set with the query.
 */
Synergy.App.populateData = function( filter, callback )
{
	Synergy.Options.map.clear();

	var filterKey = $.param(filter);

	if( Synergy.App.populateData.feedData[filterKey] === undefined ) {

		$.getJSON(Synergy.Options.markerFeedUrl, filter, function( data )
		{
			Synergy.App.populateData.feedData[filterKey] = data;
			onComplete(data);
		});
	}
	else {
		onComplete(Synergy.App.populateData.feedData[filterKey]);
	}

	function onComplete( data )
	{
		$.each(data, function( counter, basicInfo )
		{
			Synergy.Options.map.addMarker(new Synergy.Options.advancedPointClass(new Synergy.Point(basicInfo)));
		});

		if( callback !== undefined ) {
			callback();
		}
	}
};
Synergy.App.populateData.feedData = {};

Synergy.App.addCompDetailsPopup = function( type )
{

	var container = $('#detailsContainer');

	$.get('/json/content', {
		type : type
	}, function( response )
	{
		var response = $(response);

		var detailsBox = $('#compDetails');
		$('a', response).each(function( i, aTag )
		{
			aTag = $(aTag);
			aTag.attr( {
				href : aTag.attr('href')
			});
		});

		//$('a', response).overlay(Synergy.App.overlayOptions);

		if( detailsBox.length > 0 ) {
			detailsBox.html(response);
			detailsBox.replaceWith(response);
		}
		else {
			container.append(response);

			var popup = new Synergy.Popup('#compDetailsButton');
			popup.open();

			Synergy.App.addShadows();
		}

	});
};

/**
 * Centre the map on the lat lng point.
 * <p>
 * This will will set the toolbox to the default values
 * </p>
 */
Synergy.App.centreOnLatLng = function( lat, lng )
{
	var point = new GLatLng(lat, lng);
	Synergy.Options.map.setCenter(point, Synergy.Options.maxZoomLevel);
	Synergy.Options.toolbox.setDefault();
};

/**
 * Add shadows.
 */
Synergy.App.addShadows = function()
{
	$('.shadow').boxShadow();
	$('#compDetailsButton').boxShadow('hide');
};

/**
 * Set all the a links to be opened in an overlay.
 */
Synergy.App.setupOverlays = function()
{
	$('body').append('<div id="overlay"><div class="wrap"></div></div>');

/*	$('#login a').attr( {
		href : $('#login a').attr('href') + '?simple',
		rel : '#overlay'
	});*/

	// Setup the flag for later hooks
	Synergy.App.reloadOnOverlayClose = false;

	$("a[rel]").overlay(Synergy.App.overlayOptions);

	$(window).resize(function()
	{
		if( $('div#overlay').css('display') != 'none' )
		{
			Synergy.App.resizeOverlay();
		}
	});
};

Synergy.App.overlayOptions = {
	mask : '#000000',
	left : 'center',
	oneInstance : false,
	top : 'center',
	onBeforeLoad : function()
	{
		var iframe = $('iframe', this.getOverlay());
		if( 0 == iframe.length ) {
			iframe = $('<iframe border="0" frameborder="0"></iframe>');
			iframe.attr( {
				width : '100%',
				height : '100%'
			});
			this.getOverlay().append(iframe);
		}

		iframe.attr('src', this.getTrigger().attr("href"));

		this.getOverlay().height(400);
		this.getOverlay().width(530);

		Synergy.MapAnimation.cancelTimer();
	},
	onClose : function()
	{
		Synergy.MapAnimation.startTimer();
		if( Synergy.App.reloadOnOverlayClose )
		{
			window.location.reload(true);
		}
	}
};

/**
 * Show the initial welcome message.
 */
Synergy.App.showWelcomeMessage = function()
{
	if( readCookie('showWelcome') != 'false' ) {
		$("#welcome").appendTo('body');
		show();

		createCookie('showWelcome', 'false', 365);

		// Setup buttons in Welcome Window
		$("#welcome #welcomeBrowseButton").click(function( e )
		{
			e.preventDefault();
			Synergy.App.closeWelcomeMessage();
		});
	}

	function createCookie( name, value, days )
	{
		if( days ) {
			var date = new Date();
			date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
			var expires = "; expires=" + date.toGMTString();
		}
		else {
			var expires = "";
		}
		document.cookie = name + "=" + value + expires + "; path=/";
	}

	function readCookie( name )
	{
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for( var i = 0; i < ca.length; i++ ) {
			var c = ca[i];
			while (c.charAt(0) == ' ') {
				c = c.substring(1, c.length);
			}
			if( c.indexOf(nameEQ) == 0 ) {
				return c.substring(nameEQ.length, c.length);
			}
		}
		return null;
	}

	function show()
	{
		$('#welcome').overlay( {
			load : true,
			mask : '#000000',
			left : 'center',
			oneInstance : false,
			top : 'center'
		});
	}
};

/**
 * Close the welcome message.
 */
Synergy.App.closeWelcomeMessage = function()
{
	var api = $('#welcome').data("overlay");
	api.close();
};

Synergy.App.removeFooterShadow = function()
{
	$('#footerShadow').hide();
};

Synergy.App.resizeOverlay = function( newHeight, newWidth )
{
	if( newHeight == undefined ) {
		newHeight = $('#overlay').height() - 20;
	}

	if( newWidth == undefined ) {
		newWidth = $('#overlay').width();
	}

	if( newHeight > $(window).height() ) {
		newHeight = $(window).height() - 100;
		newWidth = newWidth + 20;
	}
	var newTop = Math.floor(($(window).height() - newHeight - 10) / 2);
	var newLeft = Math.floor(($(window).width() - newWidth - 10) / 2);
	$('#overlay').animate( {
		'top' : newTop + 'px',
		'left' : newLeft + 'px',
		'height' : newHeight + 20 + 'px',
		'width' : newWidth + 'px'
	}, 500);

};

Synergy.App.resizeNav = function()
{
	var width = 0;
	$('#innerNav ul li').each(function( count, li )
	{
		width += $(li).width();
	});

	$('#innerNav ul').width(width);
};

Synergy.App.getSuggestionParam = function()
{
	function getUrlVars()
	{
		var vars = [], hash;
		var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
		for( var i = 0; i < hashes.length; i++ ) {
			hash = hashes[i].split('=');
			vars.push(hash[0]);
			vars[hash[0]] = hash[1];
		}
		return vars;
	}

	var param = parseInt(getUrlVars()['suggestion'], 10);
	if( isNaN(param) ) {
		return null;
	}

	return param;
};

Synergy.App.focusSuggestion = function()
{
	var suggestionId = Synergy.App.getSuggestionParam();

	if( suggestionId !== null ) {
		var link = $('<a href="/html/suggestion/' + suggestionId + '?simple" rel="#overlay">');
		link.overlay(Synergy.App.overlayOptions);
		link.click();
		Synergy.Options.toolbox.setDefault(function()
		{
			Synergy.App.centerOnSuggestion(suggestionId);
		});
		return true;
	}

	return false;
};

Synergy.App.centerOnSuggestion = function( suggestionId )
{
	var cluster = Synergy.Options.map.findClusterWithSuggestion(suggestionId);
	if( cluster !== null ) {
		Synergy.App.centreOnLatLng(cluster.getLatLng().lat(), cluster.getLatLng().lng());
		cluster.openInfoWindow();
	}
};

