if (typeof(window["acms"]) == "undefined") var acms = {};

var _gaq = _gaq || []; // global Google Analytics Client

jQuery(document).ready(function(){
	
	
	// define GLOBALS //
	acms.settings = null;
	
	acms.formData = null;
	
	acms.pageClosed = false;
	acms.introLoaded = false;
	acms.loadingTimer = null;
	
	acms.currentPage = "";
	acms.currentState = "";
	// ------- //
	
	
		
		
	// define INIT //
	acms.init = function(options) {
		acms.utils.log("acms.init()");
		
		// settings
		var settings = {
				googleAnalytics : null,
				pagePreloaded : false,	// specifica se il contenuto è già presente nella pagina nel caso in cui venga specificato ?p=PAGE&s=STATE
				loadingDelay: 1000,		// il tempo che trascorre da quando parte la richiesta AJAX a quando viene visualizzato il loading
				
				loadIntro	: null,		// if defined, must call acms.showIntro()
				showIntro 	: null,		// must call acms.gotoPage("somepage")
				openPage 	: null,		// function(page,state){}			// must set acms.pageClosed = false
				closePage 	: null,		// function(page,state,immediate){}	// must set acms.pageClosed = true // if immediate == true, please do not use animations
				showLoading	: null,
				hideLoading : null
		};
		if (options) { 
			$.extend(settings, options);
		}
		acms.settings = settings;
		
		
		// address initialization
		var pParam = decodeURIComponent(acms.utils.getQueryParam("p"));
		var sParam = decodeURIComponent(acms.utils.getQueryParam("s"));
				
		$.address.change(function(event) {
			
			event.value = decodeURIComponent(event.value);
			
			if (event.value!="/" || pParam!="") { // if a specific page is requested, show it!
				var pieces = event.value.toString().substring(1).split("/");
				var page = pieces[0];
				var state = pieces[1];
				
				page = (page) ? page : pParam;
				state = (state) ? state : sParam;

				acms.loadPage(page,state);
			} else {
				acms.loadIntro();
			}
		
		});
		
		// hide the page! - called before setting curPage & curState, in this way, we can check: if p="" && s="" => no animation
		acms.closePage();
		
		if (acms.settings.pagePreloaded) {
			acms.currentPage = pParam;
			acms.currentState = sParam;
		}
		
		
		
		
		// form submit
		$("form[action]").live("submit",function(){
			
			acms.formData = {};
			var data = $(this).serializeArray();
			for(var i=0; i<data.length; i++){
				acms.formData[data[i].name] = data[i].value;
			}

			var action = $(this).attr("action");
			var p = acms.utils.getQueryParam("p",action);
			var s = acms.utils.getQueryParam("s",action);
			acms.gotoPage(p,s);
			return false;
		});
		
		
		// Google Analytics Init
		if (acms.settings.googleAnalytics) {
			  _gaq.push(['_setAccount', acms.settings.googleAnalytics]);
			  (function() {
			    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
			    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
			    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
			  })();
		}
		
	};
	// ------- //
	
	
	
	// define LOADINTRO //
	acms.loadIntro = function(){
		acms.utils.log("acms.loadIntro()");
				
		// callback
		if ($.isFunction(acms.settings.loadIntro)) 
			acms.settings.loadIntro();
		else
			acms.showIntro();
	};
	// ------- //
	
	
	// define SHOWINTRO //
	acms.showIntro = function(){
		acms.utils.log("acms.showIntro()");
				
		// callback
		if ($.isFunction(acms.settings.showIntro)) acms.settings.showIntro();
	};
	// ------- //
	
	
	// define GOTOPAGE //
	acms.gotoPage = function(page,state){
		acms.utils.log("acms.gotoPage("+page+","+state+")");
		
		if (state)
			location.href="#/"+page+"/"+state;
		else
			location.href="#/"+page;
	};	
	// ------- //
	
	
	// define LOADPAGE //
	acms.loadPage = function(page,state){
		acms.utils.log("acms.loadPage("+page+","+state+")");
		
		if (acms.currentPage == page && acms.currentState == state) {
			// the page is already loaded!
			if (acms.pageClosed) acms.openPage();
			return;
		}
							
		if (!acms.pageClosed) acms.closePage();
		
		acms.currentPage = page;
		acms.currentState = state;
		
		
		acms.showLoading();
		
		$.ajax({
			url: 'php/getPage.php',
			data: {p:page, s:state, _ajax:true, data:acms.utils.toJSON(acms.formData)},
			type: 'POST',
			dataType: "text",				
			success: function(data) {
				acms.injectPage($($.parseXML(data)));	
				acms.hideLoading();
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {		
				acms.alertError("Si e' verificato un errore imprevisto...\n"+textStatus+" : "+errorThrown); /*	TODO	*/
			}
		});
		acms.formData = null;
		
	};
	// ------- //
	
	
	// define OPENPAGE //
	acms.openPage = function(){
		
		if (!acms.pageClosed) {
			setTimeout(acms.openPage,100);
			return;
		}
		
		acms.utils.log("acms.openPage()");
		
		
		// N.B.: GA pageview is tracked automatically by jquey.address-1.4
		
		// callback
		if ($.isFunction(acms.settings.openPage)) acms.settings.openPage(acms.currentPage,acms.currentState);
	};
	// ------- //
	
	
	// define CLOSEPAGE //
	acms.closePage = function(){
		acms.utils.log("acms.closePage()");
		
		// callback
		var immediate = (acms.currentPage=="" && acms.currentState=="") ? true : false;
		if ($.isFunction(acms.settings.closePage)) acms.settings.closePage(acms.currentPage,acms.currentState,immediate);
	};
	// ------- //
	
	
	
	// define INJECTPAGE //
	acms.injectPage = function(xml){
		
		if (!acms.pageClosed) {
			setTimeout(function(){acms.injectPage(xml);},100);
			return;
		}
		
		acms.utils.log("acms.injectPage(xml)");
				
		
		// callback
		if ($.isFunction(acms.settings.injectPage)) acms.settings.injectPage(xml);
		
		acms.openPage();
		
	};
	// ------- //
	
	
	
	// define PROCESSHTML //
	acms.processHtml = function(html){
		html = $(html);
		
		// form validation
		$("form",html).validate();
		
		// address
		$("a",html).each(function() {  
			var href = $(this).attr('href');
			var baseAddress = location.protocol+"//"+location.hostname+"/";
			var p,s,external;
			if (href.indexOf(baseAddress+"?")==0) {// http://www.thissite.com/? ?=> http://www.thissite.com/?p=page&s=state
				p = acms.utils.getQueryParam("p",href.replace(baseAddress,""));
				s = acms.utils.getQueryParam("s",href.replace(baseAddress,""));
				if (p)
					external = false;
				else
					external = true;
			} else if (href.indexOf("?")==0) {// ?  =>  ?p=page&s=state
				p = acms.utils.getQueryParam("p",href);
				s = acms.utils.getQueryParam("s",href);
				if (p)
					external = false;
				else
					external = true;
			} else {
				external = true;
			}	
			
			if (!external)
				$(this).address(function(){
					if (s)
						return p+"/"+s; 
					else return p;
				});
		});
		
	};
	// ------- //
	
	
	
	// define SHOWLOADING //
	acms.showLoading = function(){
		if (acms.loadingTimer == null) {
			acms.loadingTimer = setTimeout(acms.showLoading,acms.settings.loadingDelay);
			return;
		} 
		
		acms.utils.log("acms.showLoading()");
		
		
		// callback
		if ($.isFunction(acms.settings.showLoading)) acms.settings.showLoading();
	};
	// ------- //
	
	
	// define HIDELOADING //
	acms.hideLoading = function(){
		acms.utils.log("acms.hideLoading()");
		
		if (acms.loadingTimer != null) {
			clearTimeout(acms.loadingTimer);
			acms.loadingTimer = null;
		}
		
		// callback
		if ($.isFunction(acms.settings.hideLoading)) acms.settings.hideLoading();
	};
	// ------- //
	
	
	
	// define ALERTERROR //
	acms.alertError = function(errorText){
		alert(errorText);
	};
	// ------- //
	
	
	
	
	
	
});
