function gsdlPreferenceState() {
	this.savedHrefs = new Array();
	this.savedLinks = new Array();
	this.savedLocation = new Object();
	this.PrefForm = null;

	this.argt = gsdlGetCookie('t', gsdl.defaults.args.t);
	this.argk = gsdlGetCookie('k', gsdl.defaults.args.k);
	this.args = gsdlGetCookie('s', gsdl.defaults.args.s);
	this.argm = gsdlGetCookie('m', gsdl.defaults.args.m);
	this.argo = gsdlGetCookie('o', gsdl.defaults.args.o);
	this.argsd = gsdlGetCookie('sd', '1');
	this.arggca = gsdlGetCookie('gca', '0');
	this.argclmd = gsdlGetCookie('clmd', gsdl.defaults.args.clmd);

	this.Initialize = __gsdlPrefInitialize;
	this.GetArgs = __gsdlPrefGetArgs;
	this.SetFormArgs = __gsdlPrefSetFormArgs;
	this.UpdateHrefs = __gsdlPrefUpdateHrefs;

	this.UpdateArg = __gsdlPrefUpdateArg;
}

g_gsdlPreferenceState = new gsdlPreferenceState();

function gsdlFixLocation(oLocationObj) {
	if (typeof(oLocationObj.hostname) != 'undefined' && oLocationObj.hostname != null) {
		var idx = oLocationObj.hostname.indexOf(':');
		if (idx > 0) {
			var tmp = oLocationObj.hostname;
			oLocationObj.hostname = oLocationObj.host;
			oLocationObj.host = tmp;
		}
	}
	if (IE4 && typeof(oLocationObj.search) != 'undefined' && oLocationObj.search != null) {
		var re = new RegExp ('#.*');
		var arrMatch = oLocationObj.search.match(re);

		if (arrMatch != null && arrMatch.length) {
			oLocationObj.hash = arrMatch[0];
			oLocationObj.search = oLocationObj.search.replace(re, '');
		}
	}
}

function gsdlGetUpdatedHref(obj, args) {
	var strNewURL = obj.protocol + '//' + obj.host;
	if (obj.pathname.substr(0,1) != '/')
		strNewURL += '/';
	strNewURL += obj.pathname;
	if (obj.search.length > 0) {
		strNewURL += obj.search + (args.length > 0 ? '&' + args : '');
	} else if (args.length > 0) {
		strNewURL += "?" + args;
	}
	if (obj.hash.length) strNewURL += obj.hash;
	return strNewURL;
}

function __gsdlPrefInitialize() {
	this.savedLinks = new Array(document.links.length);
	this.savedHrefs = new Array(document.links.length);
	for (var i = 0; i < document.links.length; ++i) {
		this.savedHrefs[i] = document.links[i].href;
		this.savedLinks[i] = {hash:document.links[i].hash,host:document.links[i].host,port:document.links[i].port,hostname:document.links[i].hostname,
				pathname:document.links[i].pathname,protocol:document.links[i].protocol,search:document.links[i].search};
		gsdlFixLocation(this.savedLinks[i]);
	}
	gLocationObj = {hash:location.hash,host:location.host,port:location.port,hostname:location.hostname,
				pathname:location.pathname,protocol:location.protocol,search:location.search,href:location.href};
	this.savedLocation = {hash:location.hash,host:location.host,port:location.port,hostname:location.hostname,
				pathname:location.pathname,protocol:location.protocol,search:location.search};

	this.PrefForm = document.PrefForm;
	if (typeof(this.PrefForm) != 'undefined' && this.PrefForm != null) {
		if (typeof(this.PrefForm.t) != 'undefined' && this.PrefForm.t != null)
			gsdlInitRadioValue(this.PrefForm.t, gsdlGetCookie('t', gsdl.defaults.args.t));
		if (typeof(this.PrefForm.k) != 'undefined' && this.PrefForm.k != null)
			gsdlInitRadioValue(this.PrefForm.k, gsdlGetCookie('k', gsdl.defaults.args.k));
		if (typeof(this.PrefForm.s) != 'undefined' && this.PrefForm.s != null)
			gsdlInitRadioValue(this.PrefForm.s, gsdlGetCookie('s', gsdl.defaults.args.s));
		if (typeof(this.PrefForm.m) != 'undefined' && this.PrefForm.m != null)
			gsdlInitValue(this.PrefForm.m, gsdlGetCookie('m', gsdl.defaults.args.m));
		if (typeof(this.PrefForm.o) != 'undefined' && this.PrefForm.o != null)
			gsdlInitValue(this.PrefForm.o, gsdlGetCookie('o', gsdl.defaults.args.o));
	}
}

function __gsdlPrefSetFormArgs(frm) {
	var regExp = new RegExp('^arg');
	var value, ctrl;
	for (var argument in this) {
		if (argument.match(regExp)) {
			eval('ctrl = frm.' + argument.substr(3));
			if (typeof(ctrl) != 'undefined' && ctrl != null) {
				value = this[argument];
				if (typeof(value) != 'undefined' && value != null) {
					if (value.indexOf(argument.substr(3) + '=') == 0)
						value = value.substr(argument.length - 2);
					ctrl.value = value;
				}
			}
		}
	}
}

function __gsdlPrefGetArgs() {
	var regExp = new RegExp('^arg');
	var ret = '', value;
	for (var argument in this) {
		if (argument.match(regExp)) {
			value = this[argument];
			if (typeof(value) != 'undefined' && value != null) {
				value = '' + value;
				if (value.indexOf(argument.substr(3) + '=') != 0)
					value = argument.substr(3) + '=' + value;
				if (ret.length > 0) ret += '&';
				ret += value;
			}
		}
	}
	return ret;
}

function __gsdlPrefUpdateHrefs () {
	var strNewURL = '', i = 0, doclink;
	var args = this.GetArgs();
	if (args.length && args.charAt(0) == '&')
	{
		if (args.length == 5 && args == '&amp;')
			args = '';
		else if (args.length > 5 && args.substr(1, 4) == 'amp;')
			args = args.substr(5);
		else
			args = args.substr(1);
	}

	var excludeRegExp = new RegExp('x');
	var rdot = '\\.';
	excludeRegExp.compile(rdot + '(pdf|gif|png|jpg|js|css|html?|doc|xls|ppt|pps|xml)$');
	var includeRegExp = new RegExp('x');
	includeRegExp.compile('^(' + gsdl.serverURL + '|http://(www' + rdot + ')?who' + rdot + 'int)' + gsdlCGI);
	
	for (i = 0; i < this.savedLinks.length; ++i) {
		doclink = document.links[i];
		if (includeRegExp.test(doclink.href) && !excludeRegExp.test(doclink.href))
		{
			doclink.href = gsdlGetUpdatedHref(this.savedLinks[i], args);
		}
	}
	if (this.savedLocation.search.length)
		gLocationObj.search = this.savedLocation.search + (args.length > 0 ? '&' + args : '');
	else if (args.length > 0)
		gLocationObj.search = '?' + args;
	else
		gLocationObj.search = '';
	gLocationObj.href = gsdlGetUpdatedHref(this.savedLocation, args);
}

function gsdlPrefUpdateArg(arg, value) {
	var f;
	eval('f = __gsdlPrefUpdateArg__' + arg + ';');
	if (typeof(value) == 'boolean')
		value = value ? '1' : '0';
	else if (typeof(value) != 'undefined' && value != null)
		value = '' + value;
	f(value, g_gsdlPreferenceState);
}

function __gsdlPrefUpdateArg(arg, value) {
	var f;
	eval('f = __gsdlPrefUpdateArg__' + arg + ';');
	if (typeof(value) == 'boolean')
		value = value ? '1' : '0';
	else if (typeof(value) != 'undefined' && value != null)
		value = '' + value;
	f(value, this);
}

function __gsdlPrefUpdateArg__el(value, state) {
	value = gsdlGetValue(state.PrefForm.el);
	if (value != cgiarg.el) state.argel = '&el=' + value;
	else state.argel = '';
	state.UpdateHrefs();
}

function __gsdlPrefUpdateArg__il(value, state) {
	value = gsdlGetValue(state.PrefForm.il);
	if (value != cgiarg.il) state.argil = '&il=' + value;
	else state.argil = '';
	state.UpdateHrefs();
}

function __gsdlPrefUpdateArg__cc(value, state) {
	if (value != cgiarg.fc) state.argfc = '&fc=' + value + '&f=' + value;
	else state.argfc = '';
	state.UpdateHrefs();
}

function __gsdlPrefUpdateArg__hl(value, state) {
	gsdlSetCookie('hl', value);
	state.arghl = value;
}

function __gsdlPrefUpdateArg__t(value, state) {
	gsdlSetCookie('t', value);
	state.argt = value;
}

function __gsdlPrefUpdateArg__k(value, state) {
	gsdlSetCookie('k', value);
	gsdlSetCookie('fqk', '0,' + value);
	state.argk = value;
}

function __gsdlPrefUpdateArg__ihs(value, state) {
	if (value != cgiarg.ihs) {
		argihs = '&ihs=' + value;
		state.UpdateHrefs();
		location.href = gLocationObj.href;
		return;
	}
	else state.argihs = '';
	state.UpdateHrefs();
}

function __gsdlPrefUpdateArg__s(value, state) {
	gsdlSetCookie('s', value);
	gsdlSetCookie('fqs', '0,' + value);
	state.args = value;
}

function __gsdlPrefUpdateArg__sd(value, state) {
	gsdlSetCookie('sd', value);
	state.argsd = value;
	if (typeof(document.QueryFormPost) != 'undefined' && document.QueryFormPost != null)
		gsdlInitValue(document.QueryFormPost.sd, value);
}

function __gsdlPrefUpdateArg__m(value, state) {
	value = gsdlGetValue(state.PrefForm.m);
	gsdlSetCookie('m', value);
	gsdlSetCookie('r', '1');
	state.argm = value;
}

function __gsdlPrefUpdateArg__gca(value, state) {
	if (typeof(value) == 'undefined' || value == null)
		value = gsdlGetValue(gsdlGetElement('GeneralForm').gca);
	gsdlSetCookie('gca', value);
	state.arggca = value;
}

function __gsdlPrefUpdateArg__rd(value, state) {
	if (state.PrefForm.rd.checked)
		if (cgiarg.rd == 1)
			argrd = '';
		else
			argrd = '&rd=1';
	else
		if (cgiarg.rd != 1)
			argrd = '';
		else
			argrd = '&rd=1';
	state.UpdateHrefs();
}

function __gsdlPrefUpdateArg__o(value, state) {
	if (typeof(value) == 'undefined' || value == null)
		value = gsdlGetValue(state.PrefForm.o);
	gsdlSetCookie('o', value);
	gsdlSetCookie('r', '1');
	state.argo = value;
	state.argr = value;
	__gsdlPrefUpdateArg__clmd(value, state);
}

function __gsdlPrefUpdateArg__fqn(value, state) {
	value = gsdlGetValue(state.PrefForm.fqn);
	if (value != cgiarg.fqn) state.argfqn = '&fqn=' + value;
	else state.argfqn = '';
	state.UpdateHrefs();
}

function __gsdlPrefUpdateArg__b(value, state) {
	if (value != cgiarg.b) state.argb = '&b=' + value;
	else state.argb = '';
	state.UpdateHrefs();
}

function __gsdlPrefUpdateArg__hd(value, state) {
	arghd = '';
	if (state.PrefForm.hd[0].checked) {
		if (cgiarg.hd != 0) state.arghd = '&hd=0';
	}
	else {
		value = gsdlGetValue(state.PrefForm.hdn);
		if (cgiarg.hd != value) state.arghd = '&hd=' + value;
	}
	state.UpdateHrefs();
}

function __gsdlPrefUpdateArg__qb(value, state) {
	if (value != cgiarg.qb) state.argqb = '&qb=' + value;
	else state.argqb = '';
	state.UpdateHrefs();
}

function __gsdlPrefUpdateArg__l(value, state) {
	value = gsdlGetValue(state.PrefForm.l);
	href = location.href;
	if (href.match(/&l=\w\w/)) href = href.replace(/&l=\w\w/, '&l=' + value);
	else href += '&l=' + value;
	if (!location.href.match(/&nl=1$/)) href += '&nl=1';
	location.href = href + state.GetArgs();
}

function __gsdlPrefUpdateArg__v(value, state) {
	value = gsdlGetValue(state.PrefForm.v);
	href = location.href;
	if (href.match(/&v=\d/)) href = href.replace(/&v=\d/, '&v=' + value);
	else href += '&v=' + value;
	location.href = href + state.GetArgs();
}

function __gsdlPrefUpdateArg__w(value, state) {
	value = gsdlGetValue(state.PrefForm.w);
	href = location.href;
	if (href.match(/&nw=[^&]+/)) href = href.replace(/&nw=[^&]+/, '&nw=' + value);
	else href += '&nw=' + value;
	if (!location.href.match(/&nl=0$/)) href += '&nl=0';
	location.href = href + state.GetArgs();
}

function __gsdlPrefUpdateArg__qt(value, state) {
	value = gsdlGetValue(state.PrefForm.qt);
	location.href = location.href + '&qt=' + value + state.GetArgs();
}

function __gsdlPrefUpdateArg__clmd (value, state) {
	if (typeof(value) == 'undefined' || value == null)
		value = gsdlGetValue(state.PrefForm.o);
	gsdlSetCookie('o', value);
	gsdlSetCookie('r', '1');
	state.argo = value;
	state.argr = value;
	if (value != state.argclmd) {
		gsdlUpdateLinksForCLMD(value);
		gsdlSetCookie('clmd', value);
		state.argclmd = value;
	}
}

function __gsdlPrefUpdateArg__pr(value, state) {
	gsdlSetCookie('pr', value);
	state.argpr = value;
}

function __gsdlPrefUpdateArg__prx(value, state) {
	gsdlSetCookie('prx', value);
	state.argprx = value;
}

function __gsdlPrefUpdateArg__bo(value, state) {
	gsdlSetCookie('bo', value);
	state.argbo = value;
}

