(function(page) {

	// note: page.gotopage.rewriteurl can be defined
	// as a function that preprocesses the url passed
	// to the page before it is sent.
	
	// public
	page.gotopage = function(page,params) {
		// Version: 2009 06 19
		// params
		if (typeof params == 'undefined') {
			params = {};
		}
		if (typeof params == 'object') {
			params = private.rewriteparams(params);
			params = '?'+private.objtoqstring(params);
		} else {
			params = '';
		}
		// url
		var url = page+".php"+params;
		url = private.rewriteurl(url);
		// go to location
		window.location.href = url;
	}
	page.reloadpage = function(params) {
		// Version: 2009 06 19
		// get location
		if (typeof params == 'undefined') {
			params = {};
		}
		if (typeof params == 'object') {
			params = private.rewriteparams(params);
			params = '?'+private.objtoqstring(params);
		} else {
			params = '';
		}
		var url = (window.location+"").split('?')[0]+params;
		url = private.rewriteurl(url);
		// go to location
		window.location.href = url;
	}

	// private
	var private = {};
	private.rewriteurl = function(url) {
		if (typeof page.gotopage.rewriteurl == "function") {
			url = page.gotopage.rewriteurl(url);
		}
		return url;
	}
	private.rewriteparams = function(params) {
		if (typeof page.gotopage.rewriteparams == "function") {
			params = page.gotopage.rewriteparams(params);
		}
		return params;
	}
	private.objtoqstring = function(obj, path) {
		// Version: 2009 06 19
		var result = []; 
		if (!path) path = [];
		var indexcount = 0;
		for(index in obj) {
			if (obj[index]==null) { continue; }
			indexcount++;
			path.push(index);
			if (typeof(obj[index])!=='object') { 
				var front = path[0];
				var rest = path.slice(1).join('][');
				if (rest!='') { 
					var name = front+"["+rest+"]"; 
				}
				else { 
					var name = front 
				};
				if (typeof obj[index] == 'boolean') {
					obj[index] = obj[index] ? 1 : 0;
				}
				if (typeof u == 'function') {
					var topush = ""+u(name)+"="+u(obj[index]);
					result.push( topush );
				} else {
					result.push( name+"="+obj[index] );					
				} 
			}
			if (typeof(obj[index])=='object') {
				result.push( private.objtoqstring(obj[index],path) );
			}
			path.pop();
		}
		if (indexcount==0) {
			var front = path[0];
			var rest = path.slice(1).join('][');
			if (rest!='') { 
				var name = front+"["+rest+"]"; 
			}
			else { 
				var name = front+"" 
			};			
			var topush = ""+u(name)+"=";
			result.push( topush );
		}
		return result.join('&');
	}
	//alert(private.objtoqstring({ 'abc':'123', 'def':0, 'ghi':'', 'jkl':null }))

})(window.page = (window.page) ? window.page : {});