var AnchorParams = new function() {
	this.params = new Object();
	
	var self = this;
	
	/**
	 * Initializes
	 */
	this.init = function()
	{
		var hash = window.location.hash.substr(1);
		
		var i, splitParams, splits = hash.split(';');
		
		for ( i = 0 ; i < splits.length ; i++ ) {
			splitParams = splits[i].split('=', 2);
			self.params[splitParams[0]] = self._unserializeValue(splitParams[1]);
		}
	};
	
	this.reset = function()
	{
		window.location.hash = '';
	};
	
	this.set = function(key, value)
	{
		if ( key == '' )
			return false;
		
		self.params[key] = value;
		
		var url = self._getParamsUrl(self.params);
		window.location.hash = url;
	};
	
	this.get = function(key)
	{
		if ( self.params[key] != undefined )
			return self.params[key];
		else
			return '';
	};
	
	this._serializeValue = function(input)
	{
		if ( typeof(input) == 'string' ) {
			input.replace(/;/g, "%3B");
			input.replace(/=/g, "%3D");
			input.replace(/%/g, "%%");
		}
		
		return input;
	};
	
	this._unserializeValue = function(input)
	{
		if ( input ) {
			input.replace(/%3D/g, "=");
			input.replace(/%3B/g, ";");
			input.replace(/%%/g, "%");
			return input;
		}
		
		return '';
	};
	
	this._getParamsUrl = function(params)
	{
		var i, url = '';
		
		var keys = Object.keys(params);
		for ( i = 0 ; i < keys.length ; i++ ) {
			if ( keys[i] == '' )
				continue;
			if ( i > 0 )
				url += ';';
			url += keys[i] + '=' + self._serializeValue(params[keys[i]]);
		}
		
		return url;
	};
	
}

AnchorParams.init();
