//
//
//  Uses HashListener from forge
//  HashListener authors:
//		- Arieh Glazer
//		- Dave De Vos
//		- Digitarald
//
var HashHandler = new Class({
        //
		//  initialize
		//
		Implements: [Options,Events],
		options: {
				parent_id:"main_border",
				content_id:"main_content",
				content_path:"/",
				error_htmlstr:"<div id='load_error'>LOAD ERROR(0)</div>",
				fixedExt:'',
				index:'index'
		},
		initialize: function(options){
				this.setOptions(options);
				this.hashListener = new HashListener();
				this.hashListener.addEvent('hashChanged',function(new_hash){
						this.hash = new_hash
						if (!this.isUpdate) this.fireEvent("HASH_CHANGED")
						this.isUpdate = false
				}.bind(this));
		},
		//
		//  Public 
		//
		checkHash: function(){
				var uri = new URI()
				if (uri.get('fragment')) this.redirect(uri.get('fragment'))
				else {
						this.update(this.options.fixedExt ? uri.get('file').split('.')[0] : uri.get('file'))
						this.fireEvent('HASH_READY')
				}		
		},
		update: function(path){
				this.isUpdate = true
				if (path.charAt(0) != "/") path = "/" + path
				if (path != this.hash) this.hashListener.updateHash(path)
				else this.isUpdate = false
		},
		//
		//  Internal 
		//
		redirect: function(hash){
				var content_url = this.contentURL(hash)
				var req = new Request({
						url: content_url,					   
						onSuccess: function(htmlstring) {                    
								this.replace(htmlstring)
								this.fireEvent('HASH_READY')
						}.bind(this),
						onFailure: function() {
								this.replace(this.options.error_htmlstr+"[redirect]:  "+content_url)
								this.fireEvent('HASH_READY')
						}.bind(this)
				})	
				req.send()
		},
		replace: function(htmlstr){
				document.id(this.options.content_id).destroy()
				var holder = new Element('div').set('html',htmlstr)
				var new_content = holder.getElement("[id='"+this.options.content_id+"']")
				if (!new_content) new_content = new Element('div',{id:this.options.content_id}).set('html',this.options.error_htmlstr+"[replace]:  "+htmlstr)
				document.id(this.options.parent_id).grab(new_content)
		},
		contentURL: function(url){
				if (this.options.fixedExt){
						if (url.length == 0 || url == "/") url = this.options.index
						if (url.search(this.options.fixedExt) == -1) url = url + "." + this.options.fixedExt
				}
				if (this.options.content_path.length == 0) return url
				else if (url.charAt(0) == "/" && this.options.content_path.charAt(this.options.content_path.length-1)) return this.options.content_path + url.substr(1) 
				else if (url.charAt(0) == "/" || this.options.content_path.charAt(this.options.content_path.length-1)) return this.options.content_path + url 
				else return this.options.content_path + "/" + url
		}
});
