
/***************************
 * Google Map functions 
 ***************************/
function showLocation(){
	var address = $('#address').val();
	
	if(address.length > 0){
		var geocoder = new google.maps.Geocoder();
		geocoder.geocode({ 'address': address, 'partialmatch': true}, setMarkerByAdress);
	}
}

function setLatLng(lat, lng){
	$('#lat').val(lat);
	$('#lng').val(lng);
}

function setLatLngAndAddress(lat, lng, address){
	$('#lat').val(lat);
	$('#lng').val(lng);
	
	var geocoder = new google.maps.Geocoder();
	var latlng = new google.maps.LatLng(lat, lng);
	geocoder.geocode({'latLng': latlng}, function(results, status) {
		if (status == google.maps.GeocoderStatus.OK) {
			if (results[1]) {
				$('#address').val(results[0].formatted_address);
			}
		}
	});
}

function setMarkerByAdress(results, status) {
	if (status == 'OK' && results.length > 0) {
		$.goMap.clearMarkers();
			$.goMap.createMarker({
			id: 'concertLocationMarker',
			latitude: results[0].geometry.location.lat(), 
			longitude: results[0].geometry.location.lng(), 
			draggable: true,
			html: { 
				content: 'You can move the marker', 
				popup: true,
				hideByClick: true 
			}
		});

		//setLatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng());
		setLatLngAndAddress(results[0].geometry.location.lat(), results[0].geometry.location.lng(), results[0].formatted_address);
		
		$.goMap.setMap({latitude:results[0].geometry.location.lat(), longitude:results[0].geometry.location.lng(), zoom: 14});

		$.goMap.createListener({type:'marker', marker:'concertLocationMarker'}, 'dragstart', function() {
			$.goMap.clearInfo();
		});

		$.goMap.createListener({type:'marker', marker:'concertLocationMarker'}, 'dragend', function() {
			var markerPosition = $("#map_canvas").data("concertLocationMarker").getPosition();
			$.goMap.setMap({latitude:markerPosition.lat(), longitude:markerPosition.lng()});
			//setLatLng(markerPosition.lat(), markerPosition.lng());
			setLatLngAndAddress(markerPosition.lat(), markerPosition.lng(), '');
		});
	}else{
		alert("Geocode was not successful for the following reason: " + status);
	}
}

/***************************
 * Misc 
 ***************************/
function closeBox(s_id){
	$("#" + s_id).hide();
	return false;
}

/***************************
 * Ajax page loading and 
 * browser history handling 
 ***************************/
//Functions for loading indicator
var loadingIndicator = function() {
	return {
		hide : function() {
			dojo.query('#loadingIndicator').addClass('hide');
		},
		show : function() {
			dojo.query('#loadingIndicator').removeClass('hide');
		},
		showWaitButton : function(){
			dojo.query('#pleaseWaitButton').removeClass('hide');
			dojo.query('.ajaxSubmit').addClass('hide');
		}
	};
}();

//Fetching bookmarked state
var myModuleBookmarkedState = YAHOO.util.History.getBookmarkedState("p");

//If there is no bookmarked state, assign the default state:
var myModuleInitialState = myModuleBookmarkedState || '';

//Register initial state in history 
YAHOO.util.History.register("p", myModuleInitialState, myModuleStateChangeHandler);

//Loading page on load from current state
YAHOO.util.History.onReady(function () {
    //Fetching current state
    var myModuleCurrentState = YAHOO.util.History.getCurrentState("p");
    
    //Update the UI according to "myModuleCurrentState"
    if(myModuleCurrentState){
        Spring.remoting.getResource(myModuleCurrentState, '', false);
    }
});

//Variable for correct handling of the browser back event.
//Is set to false in the ajaxLink click event
var historyBack = true;

//Handling browser back button
function myModuleStateChangeHandler (state) {
	loadingIndicator.show();						//Show the loading indicator
	if(historyBack){
		Spring.remoting.getResource(state, '', false);	//Update the UI according to the "state" parameter
	}
}

//Function which runs on every submit (only effects GUI)
function handleSubmit(){
	loadingIndicator.show();
	loadingIndicator.showWaitButton();
}

//Init for all ajax handling and Yahoo History Management
//Looping through all links with the class 'ajaxLink'
//and all forms with the class 'ajaxForm'.
function initSpring30(){

	//Google analytics
	if(demotape.usingAnalytics == 'true'){
		YAHOO.util.History.onReady(function () {
			_gaq.push(['_trackPageview', YAHOO.util.History.getCurrentState("p")]);
		});
	}
	
	historyBack = true;
	
	//Init YUI History Management
	YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
	
	//Init ajax links
	dojo.query(".ajaxLink").forEach(function(element) {
		//Loading the page with ajax
        Spring.addDecoration(new Spring.AjaxEventDecoration({
            elementId: element.id,
            event: 'onclick',
			params: { fragments: 'content'}
        }));

        //Showing loading indicator and adds the state to history
		dojo.connect(element, "onclick", function(){
			loadingIndicator.show();
			historyBack = false;
			YAHOO.util.History.navigate("p", element.href.replace(demotape.webRoot, '/'));
			return false;
		});
		
	});
	
	//Init ajax forms
	dojo.query('.ajaxForm').forEach(function(formElement) {
		var txt_formId = dojo.attr(formElement,'id');
		var txt_submitButtonId = dojo.query('#' + txt_formId + ' .ajaxSubmit').attr('id');

		//Validation
		Spring.addDecoration(new Spring.ValidateAllDecoration({
			elementId:'' + txt_submitButtonId + '', 
			event:'onclick'
		}));
		
		//Submit
		Spring.addDecoration(new Spring.AjaxEventDecoration({
			elementId:'' + txt_submitButtonId + '',
			event: 'onclick',
			formId: '' + txt_formId + '',
			params: { fragments:'content' }
		}));
	});
}
