var JSQueryString = {
	
	//properties
	currentQuery : "",
	defaultQuery : "",
	prevQuery : "",
	queryChangeCallback : function(){},
	
	//public methods
	init : function(opts){
		JSQueryString.defaultQuery = (typeof opts.defaultQuery == "string") ? opts.defaultQuery : JSUtils.serialize(opts.defaultQuery);
		JSQueryString.queryChangeCallback = opts.queryChangeCallback || function(){}
		JSQueryString.start();
	},
	start : function(){
		JSQueryString.currentQuery = (window.location.hash != "") ? String(window.location.hash).substring(1) : "";
		JSQueryString.prevQuery = JSQueryString.currentQuery;
		
		JSQueryString._setCurrentQuery(JSQueryString.currentQuery);
	},
	changeQuery : function(url){
		var q = (typeof url == "object" || typeof url == "array") ? JSUtils.serialize(url) : url;
		window.location.hash = q;
		JSQueryString._setCurrentQuery(q)
	},
	getDefaultQuery : function(type){
		return ret = (type == "object") ? JSUtils.queryToObject(JSQueryString.defaultQuery) : JSQueryString.defaultQuery;
	},
	getCurrentQuery : function(type){
		return ret = (type == "object") ? JSUtils.queryToObject(JSQueryString.currentQuery) : JSQueryString.currentQuery;
	},
	getPrevQuery : function(type){
		return ret = (type == "object") ? JSUtils.queryToObject(JSQueryString.prevQuery) : JSQueryString.prevQuery;
	},
	
	//internal methods
	_setCurrentQuery : function(query){
		if(query != ""){
			JSQueryString.prevQuery = JSQueryString.currentQuery;
			JSQueryString.currentQuery = query;
		} else {
			JSQueryString.currentQuery = JSQueryString.defaultQuery;
			JSQueryString.prevQuery = JSQueryString.currentQuery;
		}
		JSQueryString.queryChangeCallback();
	}
}