/*
 *  
 */

var urlHandler = {
	// keep track of the hash, in order to measure a change
	hash 				: '',
	// list of registered urls and their properties
	registeredUrls 		: [],
	
	// initialize - check the hash every half-a-second
	init	: function(){
		urlHandler.hash = urlHandler.getHash();
		setInterval(urlHandler.checkHash, 500);
	},
	// get the hash from the url of the browser
	getHash : function(){
		var i, href;
		href = top.location.href;
		i = href.indexOf("#");
		return i >= 0 ? href.substr(i + 1) : "";
	},
	// this function will be called every x millisecond, to check if our administrated hash has become
	// different to the actual url#hash of the browser
	checkHash : function(){
		var hash = urlHandler.getHash();
		
		if(urlHandler.hash != hash){
			appUtils.log('hash changed ' + hash);
			if(hash.charAt(0) == '!'){
				urlHandler.load(hash.substring(1), true);
			}
		}
	},
	
	/*
	 * register a url for the url handler
	 * maxAge in milliseconds
	 * preload=boolean, to indicate immediate preloading
	 */
	registerUrl : function(url, maxAge, preload){
		urlHandler.registeredUrls[url] = {data : false, maxAge : maxAge, timeFetched : false, preload : preload};
		if(preload){
			appUtils.loadJSON(url, {}, function(data){
				appUtils.log('preloaded: ');
				appUtils.log(data);
				urlHandler.registeredUrls[url].data = data;
				urlHandler.registeredUrls[url].timeFetched = new Date();
				
				urlHandler._triggerEvent({ type : "url_preloaded", url : url, returnData : data});
				// 
			});
		}
	},
	
	_setHashOfurl : function(url){
		var hash = '!' + escape(url);
		top.location.hash = hash;
		urlHandler.hash = hash;
	},
	
	/* loading url and trigget event with (cached) data, bypassing the checkhash for faster reaction - the url#hash is set in code */
	load : function(url, setHash){
		
		if(setHash){
			urlHandler._setHashOfurl(url);
		}
		
		if(urlHandler.registeredUrls[url]){
			appUtils.log('load() to registered url:' + url);
			load = true;
			
			// in case we have allready fetched the data, check if it is younger than max-age
			if(urlHandler.registeredUrls[url].timeFetched){
				// then we don't have to fetch
				if((new Date()).getTime() - urlHandler.registeredUrls[url].timeFetched.getTime() < urlHandler.registeredUrls[url].maxAge){
					load = false;
				}
			} else {
				// not fetched, check if it is currently preloading
				if(urlHandler.registeredUrls[url].preload){
					appUtils.log('still preloading');
					setTimeout(function(){urlHandler.load(url, setHash);}, 200);
					return;
				}
			} 
			if(load){
				// load and then trigger event with fetched data
				appUtils.loadJSON(url, {}, function(data){
					urlHandler.registeredUrls[url].data = data;
					urlHandler.registeredUrls[url].timeFetched = new Date();
					urlHandler._triggerEvent({ type : "url_loaded", url : url, returnData : data});
				});
			} else {
				urlHandler._triggerEvent({ type : "url_loaded", url : url, returnData : urlHandler.registeredUrls[url].data});
			}
			
		} else {
			// url was not registered
			urlHandler._triggerEvent({ type : "url_changed", url : url});
		} 
	},
	
	_triggerEvent : function(eventData){
		if(eventData.url && eventData.url.indexOf('/') > 0){
			eventData.module = eventData.url.substring(0, eventData.url.indexOf('/'));
		}
		$("body").trigger(eventData);
		appUtils.log('triggered on body:');
		appUtils.log(eventData);
		
		/* Update Google Analytics */
		if (eventData.type==="url_changed" || eventData.type==="url_loaded") {
			var slug	= '/#!'+eventData.url;
			_gaq.push(['_trackPageview', slug])
		}
		
	}
};
