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;
}

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;
}

