// requires parseUri
// alex@regio.ee

$(function() {
	Regio.URLState = function() {
		
		function getCurrentKeys() {
			var pairs = parseUri(window.location).query.split('&');
			var pairs2 = parseUri(window.location).anchor.split('&');

			if(pairs[0]) {
				var keys = {};
				for(var i=0;i<pairs.length;i++) {
					keys[pairs[i].split('=')[0]] = decodeURIComponent(pairs[i].split('=')[1]);
				}
				if(pairs2[0]){
					for(var i=0;i<pairs2.length;i++) {
						keys[pairs2[i].split('=')[0]] = decodeURIComponent(pairs2[i].split('=')[1]);
					}
				}
				return keys;
			} else {
				return {};
			}
		}
		
		function createURLPart(keys) {
			var arr = [];
			for(var k in keys) {
				arr.push([k, encodeURIComponent(keys[k])].join('='));
			}
			return '#' + arr.join('&');
		}
		
		var ret = function(key, value) {
			if((typeof value == "undefined") && (typeof key == "undefined")) {
				return getCurrentKeys();
			} else
			if((typeof value == "undefined") && (typeof key == "string")) {
				// getter
				var keys = getCurrentKeys();
				return keys[key];
			} else {
				// setter
				var keys = getCurrentKeys();
				var o = createURLPart(keys);
				
				if(typeof key == "object") {
					for(var k in key) {
						keys[k] = key[k];
					}
				} else {
					keys[key] = value;
				}
				
				var s = createURLPart(keys);
				if(o != s) {
					window.location.replace(s);
				}
				
			}
		}
		
		ret.remove = function() {
			
			var keys = getCurrentKeys();
			var o = createURLPart(keys);
			
			for(var i=0; i<arguments.length; i++) {
				delete keys[arguments[i]];
			}
			
			var s = createURLPart(keys);
			if(o != s) {
				window.location.replace(s);
			}
			
		}
		
		ret.getAnchor = function() {
			return createURLPart(getCurrentKeys());
		}
		
		return ret;
	}
});