function navback() {
    document.location.href = pagedata.path_back;
}

var _dlgAlert;
var _dlgLogin;
function initAlertDlg() {
    _dlgAlert = new YAHOO.widget.Dialog("_dlgAlert", {
        modal: true,
        close: true,
        visible: false,
        draggable: true,
        fixedcenter: true,
        constraintoviewport: true,
        width: '300px'
    });
    var _dlgAlertListeners = new YAHOO.util.KeyListener(document, { keys: 27 }, { fn: function() { _dlgAlert.hide(); } });
    _dlgAlert.cfg.queueProperty("keylisteners", _dlgAlertListeners);
    _dlgAlert.cfg.queueProperty("buttons", [{ text: pagedata.text_ok, handler: function() { _dlgAlert.hide(); }, isDefault: true}]);
    _dlgAlertListeners.enable();
    _dlgAlert.render();

    //look for a default Search button on the page, attach the Enter key to it;
    var btnDefault = document.getElementById('btnSearch');
    if (!btnDefault) btnDefault = document.getElementById('btnSearch_btn');
    if (btnDefault) {
        var enterAction = new YAHOO.util.KeyListener(document, { keys: 13 }, function() { btnDefault.click(); });
        enterAction.enable();

        btnDefault.focus();
    }

    _dlgLogin = new YAHOO.widget.Dialog("_dlgLogin", {
        modal: true,
        close: true,
        visible: false,
        draggable: true,
        fixedcenter: true,
        constraintoviewport: true,
        width: '250px'
    });
    var _dlgLoginListenerEscape = new YAHOO.util.KeyListener("_dlgLogin", { keys: 27 }, { fn: function() { _dlgLogin.hide(); } });
    var _dlgLoginListenerEnter = new YAHOO.util.KeyListener("_dlgLogin", { keys: 13 }, loginSubmit);
    _dlgLogin.cfg.queueProperty("keylistenerEscape", _dlgLoginListenerEscape);
    _dlgLogin.cfg.queueProperty("keylistenerEnter", _dlgLoginListenerEnter);
    _dlgLogin.cfg.queueProperty("buttons", [{ text: pagedata.text_ok, handler: loginSubmit, isDefault: true },
	                                        { text: pagedata.text_cancel, handler: function() { _dlgLogin.hide(); } }]);
    _dlgLogin.render();
    _dlgLoginListenerEscape.enable();
    _dlgLoginListenerEnter.enable();

    //attach login handler to forcelogin class objects
    var obs = YAHOO.util.Dom.getElementsByClassName("forcelogin");
    for (var i = 0; i < obs.length; i++) {
        var tgt = typeof (obs[i].onclick) == 'function' ? obs[i].onclick : obs[i];
        obs[i].onclick = null;
        YAHOO.util.Event.addListener(obs[i], 'click', createLoginDelegate(obs[i], tgt));
    }

    if (pagedata.text_pageloaderr != '') alertDlg('<span class="SectionText-Error">' + pagedata.text_pageloaderr + '</span>');

}

function createLoginDelegate(object, method) {
    return function(e) {
        YAHOO.util.Event.preventDefault(e);
        if (typeof (method) == 'function') {
            _dlgLogin.request = function(e) {
                method.apply(object, arguments);
            };
        } else if (method.href) {
            _dlgLogin.request = function() {
                document.location.href = method.href;
            };
        } else {
            _dlgLogin.request = function() {
                document.forms[0].submit();
            }
        }
        _dlgLogin.show();
    }
}

function loginSubmit() {

    var callback =
	{
	    success: loginSuccess,
	    failure: loginFailure,
	    argument: []
	};
    var lgnform = document.getElementById("frmInlineLogin");
    YAHOO.util.Connect.setForm(lgnform);
    var request = YAHOO.util.Connect.asyncRequest('POST', pagedata.path_base + 'api/api.aspx?login', callback, null);
    _dlgLogin.hide();

}

function loginSuccess(o) {
    if (checkComError(o.responseXML)) return false;
    _dlgLogin.request();
}

function loginFailure(o) {
    alertDlg(o.status + '\n' + o.statusText);
}

var _pollProcessId = null;
function setPolling() {
    if (pagedata.poll_interval > 0) {
        _pollProcessId = setTimeout(function() { pollServer(true); }, pagedata.poll_nextpoll);

        var msgCount = pagedata.msg_count;
        var ancCount = pagedata.anc_count;

        if (msgCount != "") setLinkCount('lnkNavMesg', msgCount);
        if (ancCount != "") setLinkCount('lnkNavAnnc', ancCount);
    }
}

function pollServer(log) {
    var callback =
	{
	    success: pollServerSuccess,
	    failure: pollServerFailure,
	    argument: []
	};

	var l = log;
	var interval = pagedata.poll_interval;
	if (l != true) interval = -1;

    try {
        var request = YAHOO.util.Connect.asyncRequest('GET', pagedata.path_base + 'ws/serverpoll.aspx?interval=' + interval, callback, null);

        if (_pollProcessId) clearTimeout(_pollProcessId);
        _pollProcessId = setTimeout(function() { pollServer(true); }, pagedata.poll_interval);
    }
    catch (e) { }
}

function pollServerSuccess(o) {
    var err = o.responseXML.documentElement.attributes.getNamedItem("error").value;
    if (err != "") {
        if (err == "INVALID_SESSION") {
            //if (pagedata.anonymous == "Y") {
            //    YAHOO.util.Connect.asyncRequest('GET', pagedata.path_base + 'api/?restart', {}, null);
            //} else {
            document.location.href = pagedata.path_base + 'error_session.aspx';
            //}
        }
        else if (err.indexOf('SYSTEM_MESSAGE:') == 0) {
            alertDlg(err.substr(15));
        }
        else if (err.indexOf('SYSTEM_REDIRECT:') == 0) {
            var redirURL = err.substr(16);

            //prevent DOM based XSS attack, redirection target should be a plain URL, no scripting characters or querystring args.
            if (redirURL.match(/^[Hh][Tt][Tt][Pp]:\/\/[\d\w\/\.]+$/)) {
                document.location.href = redirURL;
            }
        }
        return false;
    }

    var msgCount = 0;
    var ancCount = 0;

    //result/UserData/[Data @Name="NewAnnouncements" Value="1"][Data @Name="NewAnnouncements" Value="1"] ;
    var userData = o.responseXML.documentElement.childNodes[0].childNodes[0];

    var xndAnc = searchXmlNodeList(userData.childNodes, 'Data', 'Name', 'NewAnnouncements');
    var xndMsg = searchXmlNodeList(userData.childNodes, 'Data', 'Name', 'NewMessages');

    if (xndAnc) {
        ancCount = xndAnc.attributes.getNamedItem('Value').value;
    }

    if (xndMsg) {
        msgCount = xndMsg.attributes.getNamedItem('Value').value;
    }

    setLinkCount('lnkNavMesg', msgCount);
    setLinkCount('lnkNavAnnc', ancCount);
}

function pollServerFailure(o)
{ }

function alertDlg(ttl, msg) {
    if (!msg) {
        msg = ttl;
        try {
            ttl = pagedata.text_error;
            ttl = document.getElementById('objBodyHeader_divBodyTitle').innerHTML;
        }
        catch (err) {

        }
    }

    try {
        var ttlDiv = document.getElementById('_dlgAlert_ttl');
        var msgDiv = document.getElementById('_dlgAlert_msg');

        ttlDiv.innerHTML = ttl;
        msgDiv.innerHTML = msg;
        _dlgAlert.show();
    }
    catch (err) {
        alert(msg);
    }
}

function transferForm(target) {
    //prevent window scrolling from the href="#" attribute
    var e = this.event || this || window.event;
    if (e) {
        if (e.preventDefault) {
            e.preventDefault();
        } else {
            e.returnValue = false;
        }
    }

    var tgt = target;
    var win = '';

    //if target has a comma in it, then it's targetPage, targetWindow
    if (target.indexOf(',') > 0) {
        tgt = target.split(',')[0];
        win = target.split(',')[1];
    }
    
    document.forms[0].action = tgt;
    if (win != '')
        document.forms[0].target = win;
    else
        document.forms[0].target = "";

    //if any arguments are supplied after the target, 
    //they should be name/value pairs to be set into hidden variables, 
    //which will be created if they don't already exist in the document
    for (i = 1; i < arguments.length; i += 2) {
        if (arguments[i])// && arguments[i+1]) : changed; arg name required, but arg val can be blank
        {
            //does the input element already exist?						
            var els = document.forms[0].getElementsByTagName('input');
            var arg = null;
            for (var j = 0; j < els.length; j++) {
                if (els[j].name == arguments[i]) {
                    arg = els[j];
                    break;
                }
            }

            if (arg == null) {
                arg = document.createElement("input");
                arg.setAttribute("name", arguments[i]);
                arg.setAttribute("type", "hidden");
                arg.style["display"] = "none";
                document.forms[0].appendChild(arg);
            }
            arg.value = arguments[i + 1];
        }
    }
    document.forms[0].submit();
}

//usage example, for numeric entry only: <input type="text" onKeyPress="filterKeys(event,'0123456789');">
var lastKeyDownCode;
function filterKeys(e, filter) {
    if (!e) e = window.event;
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;

    if (e.type == 'keydown') {
        //save keycode for use in keypress event
        lastKeyDownCode = code;
        return;
    }
    //always allow control keys (tab, backspace, return, left, right, up, down, del, insert, pgup, pgdn, home, end, esc)				
    //NOTE: Removed keycode 45 (insert) because it's also they hypen character. Always allowing insert means you can't restrict the hyphen key :(
    if (lastKeyDownCode == 8 || lastKeyDownCode == 9 || lastKeyDownCode == 13) return true;
    if (lastKeyDownCode >= 33 && lastKeyDownCode <= 40) return true;
    //if(lastKeyDownCode == 45 || lastKeyDownCode == 46) return true;
    if (lastKeyDownCode == 46) return true;

    if (code == 8 || code == 9 || code == 13) return true;
    if (code >= 33 && code <= 40) return true;
    //if(code == 45 || code == 46) return true;				
    if (code == 46) return true;

    var keychar = String.fromCharCode(code);
    if (filter.indexOf(keychar) >= 0) {
        return true
    } else {
        //throw the book at it
        e.returnValue = false;
        e.cancel = true;
        if (e.stopPropagation) e.stopPropagation();
        if (e.preventDefault) e.preventDefault();
        return false;
    }
}

function filterText(ctl, filter) {
    var txt1 = ctl.value;
    var txt2 = '';
    for (i = 0; i < txt1.length; i++) {
        if (filter.indexOf(txt1.substr(i, 1)) > -1) txt2 += txt1.substr(i, 1);
    }
    if (txt2 != txt1) {
        ctl.value = txt2;
        return false;
    }
}

function popup(url, name, width, height) {
    //Determine whether Netscape is being used
    var agt = navigator.userAgent.toLowerCase();
    var isNav = ((agt.indexOf('mozilla') != -1) && (agt.indexOf('spoofer') == -1) &&
								(agt.indexOf('compatible') == -1) && (agt.indexOf('opera') == -1) &&
								(agt.indexOf('webtv') == -1) && (agt.indexOf('hotjava') == -1));

    //Get the window position on the monitor
    var x, y, w, h;
    if (isNav) {
        x = window.screenX;
        y = window.screenY;
        w = window.innerWidth;
        h = window.innerHeight;
    } else {
        x = window.screenLeft;
        y = window.screenTop;
        w = document.body.clientWidth;
        h = document.body.clientHeight;
    }

    //Calculate the position for the new window in relation to the calling window
    var newX, newY;
    newX = Math.round(x + (w / 2) - (width / 2));
    if (isNav)
        newY = Math.round(y + (h / 2) - (height / 2) + 60);
    else
        newY = Math.round(y + (h / 2) - (height / 2) - 60);

    //Set the new window's parameters
    var parameters
    parameters += "fullscreen=no,";
    parameters += "toolbar=no,";
    parameters += "status=no,";
    parameters += "menubar=no,";
    parameters += "scrollbars=yes,";
    parameters += "resizable=yes,";
    parameters += "directories=no,";
    parameters += "location=no,";
    parameters += "width=" + width + ",";
    parameters += "height=" + height + ",";
    parameters += "screenx=" + newX + ",";
    parameters += "screeny=" + newY + ",";
    parameters += "left=" + newX + ",";
    parameters += "top=" + newY + "";

    if (name == "") {
        name = "popup" + Math.round(Math.random() * 101);
    }

    //Open the new window
    var objWindow = document[name];
    if ((typeof (objWindow) == 'object') && (!objWindow.closed)) {
        objWindow.location.href = url;
    } else {
        objWindow = window.open(url, name, parameters);
        document[name] = objWindow;
    }
    objWindow.focus();
    return objWindow;

}

function checkComError(xml) {
    var err = xml.documentElement.attributes.getNamedItem("error").value;
    if (err == "") return false;

    alertDlg(err);
    return true;
}

function extractMarkup(text) {
    if (text.indexOf("<![CDATA[") == 0) {
        text = text.substr(9);
        text = text.substr(0, text.length - 3);
    }
    return text;
}

function setLinkCount(linkid, count) {
    var lnk = document.getElementById(linkid);
    if (lnk) {
        var txt = lnk.innerHTML;
        var p1 = txt.toUpperCase().indexOf(' <B>(');
        if (p1 > 0) {
            txt = txt.substr(0, p1)
        }
        if (count > 0) {
            txt += ' <b>(' + count + ')</b>';
        }
        lnk.innerHTML = txt;
    }
}

function searchXmlNodeList(nodeList, nodeName, attributeName, attributeValue) {
    for (var i = 0; i < nodeList.length; i++) {
        var xnd = nodeList[i];
        if (nodeName == '*' || nodeName == '' || xnd.nodeName == nodeName) {
            if (!attributeName) return xnd;

            if (attributeName == '*' || attributeName == '' || xnd.attributes.getNamedItem(attributeName)) {
                if (!attributeValue || attributeValue == '*' || attributeValue == '' || xnd.attributes.getNamedItem(attributeName).value == attributeValue) {
                    return xnd;
                }
            }
        }
    }
}

function searchXml(parentNode, nodeName, attributeName, attributeValue) {
    var match = searchXmlNodeList(parentNode.childNodes, nodeName, attributeName, attributeValue);
    if (!match) {
        for (var child = 0; child < parentNode.childNodes.length; child++) {
            var match = searchXml(parentNode.childNodes[child], nodeName, attributeName, attributeValue);
            if (match) {
                break;
            }
        }
    }
    return match;
}

function docWrite(html) {
    document.write(html);
}

function toggleSideNav(state) {
    var bd = document.getElementById('bd');

    if (state == 'on' || YAHOO.util.Dom.hasClass(bd, 'fullwidth')) {
        YAHOO.util.Dom.removeClass(bd, 'fullwidth');
        state = 'on';
    }
    else {
        YAHOO.util.Dom.addClass(bd, 'fullwidth');
        state = 'off';
    }
    var callback = {};
    var request = YAHOO.util.Connect.asyncRequest('GET', pagedata.path_base + 'user/account/account_view_server.aspx?do=tglnav&sidenav=' + state, callback, null);
}

var ValidationObj = function(id, name, req, type, range, format) {

    var _id, _name, _req, _type, _range, _format;
    var _valMessage = [];

    _id = id;
    _name = name;
    _req = req;
    _type = type;
    _range = range;
    _format = format;

    this.IsValid = function() {
        var result = true;
        var element = document.getElementById(_id);

        var val = getvalue(element);

        //check required
        if (typeof (_req) == 'function') _req = req();
        if (_req && !val) {
            result = false;
            _valMessage.push(_name + ' is required.');
            return result;
        }

        //check type
        var typecast = null;
        if (typeof (_type) == 'function') {
            typecast = _type(val);
        }
        else {
            typecast = gettype(val, _type);
        }

        if (!typecast) {
            result = false;
            _valMessage.push(_name + ' does not appear to be a valid ' + _type);
            return result;
        }
        else {
            val = typecast;
        }

        var inrange = true;
        if (_range) {
            if (typeof (_range) == 'function') {
                inrange = _range(val);
            }
            else {
                inrange = checkrange(val, _range);
            }
        }

        if (!inrange) {
            result = false;
            _valMessage.push(_name + ' must be between ' + _range.min + ' and ' + _range.max);
            return result;
        }

        return result;
    }

    this.ValidationMessage = function() { return _valMessage.join('<br>'); };
}

function checkrange(value, range) {
    var result = true;
    if (range.min && (range.min > value)) result = false;
    if (range.max && (range.max < value)) result = false;
    return result;
}

function gettype(value, type) {
    var istype = true;

    if (typeof (value) == type) return value;

    switch (type) {
        case "date":
            try {
                var dt = new Date(value);

                if (!dt.getFullYear()) dt = null;

            }
            catch (e) {
                dt = null;
            }

            if (dt) {
                return dt;
            }
            break;

        case "number":
            try {
                var n = new Number(value);
                if (!n >= Number.MIN_VALUE || !n <= Number.MAX_VALUE) n = null;
            }
            catch (e) {
                n = null;
            }

            if (n) {
                return n;
            }
            break;

        case "string":
            return value.toString();
            break;
    }
    return istype;
}

function isdirty(element) {
    var dirty = false;

    switch (element.type) {
        case 'text':
            if (element.value != element.defaultValue) dirty = true;
            break;

        case 'password':
            if (element.value != element.defaultValue) dirty = true;
            break;

        case 'textarea':
            if (element.value != element.defaultValue) dirty = true;
            break;

        case 'checkbox':
            //see if there's more than one checkbox with this element name by checking the form
            //first, make sure we get the right form, in case there's more than one
            var form = null;
            for (i = 0; i < document.forms.length; i++) if (document.forms[i][element.name]) { form = document.forms[i]; break; }
            if (form && form[element.name].length) {
                for (i = 0; i < form[element.name].length; i++) {
                    el = form[element.name][i];
                    if (el.checked != el.defaultChecked) {
                        dirty = true;
                        break;
                    }
                }
            }
            else //single checkbox
                if (element.checked != element.defaultChecked) dirty = true;

            break;

        case 'radio':
            if (element.checked != element.defaultChecked) dirty = true;
            break;

        case 'select-one':
            for (i = 0; i < element.options.length; i++) {
                if (element[i].defaultSelected != element[i].selected) {
                    dirty = true;
                    break;
                }
            }
            break;

        case 'select-multiple':
            for (i = 0; i < element.options.length; i++) {
                if (element[i].defaultSelected != element[i].selected) {
                    dirty = true;
                    break;
                }
            }
            break;

    }
    return dirty;

}

function getvalue(element) {
    switch (element.type) {
        case 'text':
            return element.value;
            break;

        case 'password':
            return element.value;
            break;

        case 'textarea':
            return element.value;
            break;

        case 'checkbox':
            //see if there's more than one checkbox with this element name by checking the form
            //first, make sure we get the right form, in case there's more than one
            var form = null;
            var val = null;
            for (i = 0; i < document.forms.length; i++) if (document.forms[i][element.name]) { form = document.forms[i]; break; }
            if (form && form[element.name].length) {
                for (i = 0; i < form[element.name].length; i++) {
                    el = form[element.name][i];

                    if (el.checked) {
                        val = val == null ? el.value : val + ',' + el.value;
                    }
                }
            }
            else //single checkbox
                if (element.checked) val = el.value;

            return val;
            break;

        case 'radio':
            if (element.checked) return element.value;
            break;

        case 'select-one':
            for (i = 0; i < element.options.length; i++) {
                if (element[i].selected) return element.value;
            }
            break;

        case 'select-multiple':
            var val = null;
            for (i = 0; i < element.options.length; i++) {
                if (element[i].selected) {
                    val = val == null ? element.value : val + ',' + element.value;
                }
            }
            return val;
            break;
    }
}

function _updtLang() {
    var sel = document.getElementById('_selLang');
    var lng = sel[sel.selectedIndex].value;
    var dsc = sel[sel.selectedIndex].innerHTML;
    var hdn = null;
    for (var i = 0; i < document.forms.length; i++) {
        if (document.forms[i]._hdnLangCrnt) {
            hdn = document.forms[i]._hdnLangCrnt;
            break;
        }
    }

    if (!hdn) {
        return false;
    }

    sel[sel.selectedIndex].innerHTML = '...........';
    sel.style["backgroundColor"] = "yellow";
    hdn.value = lng;

    var callback =
	{
	    success: _updLangReturn,
	    failure: _updLangReturn,
	    argument: [lng, dsc]
	}
    var request = YAHOO.util.Connect.asyncRequest('GET', pagedata.path_base + 'controls/languageSelectorServer.aspx?do=setlang&lang=' + lng, callback, null);

}

function _updLangReturn(o) {
    var sel = document.getElementById('_selLang');
    var lng = o.argument[0];
    var dsc = o.argument[1];

    sel.style["backgroundColor"] = "white";
    sel[sel.selectedIndex].innerHTML = dsc;

    if (typeof (_onLanguageChanged) == 'function') _onLanguageChanged(lng);
}

function setLang() {
    var sel = document.getElementById('_selLang');
    var crnt = null;

    for (var i = 0; i < document.forms.length; i++) {
        if (document.forms[i]._hdnLangCrnt) {
            crnt = document.forms[i]._hdnLangCrnt;
            break;
        }
    }

    if (!crnt) {
        return false;
    }

    if (sel) {
        for (var i = 0; i < sel.length; i++) {
            if (sel[i].value == crnt) {
                sel[i].selected = true;
                break;
            }
        }
    }
}

var _dlgDebug;
function debugMessage(msg, append) {
    if (!_dlgDebug) {
        _dlgDebug = new YAHOO.widget.Panel("dlgDebug", { width: '600px', visible: false, draggable: true, dragonly: true, height: '400px', fixedcenter: true, close: true });
        _dlgDebug.render();
    }
    if (append) {
        _dlgDebug.body.innerHTML += msg;
    }
    else {
        _dlgDebug.setBody(msg);
    }
    _dlgDebug.show();
}

function string2xml(text) {
    if (window.ActiveXObject) {
        var doc = new ActiveXObject('Microsoft.XMLDOM');
        doc.async = 'false';
        doc.loadXML(text);
    } else {
        var parser = new DOMParser();
        var doc = parser.parseFromString(text, 'text/xml');
    }
    return doc;
}

function xml2json(xmlNode, jsonParent) {
    var nodeName = xmlNode.nodeName;
    if (!jsonParent[nodeName]) {
        jsonParent[nodeName] = [];
    }
    var newNode = {};
    for (var i = 0; i < xmlNode.attributes.length; i++) {
        var a = xmlNode.attributes[i];
        newNode[a.name] = a.value;
    }
    jsonParent[nodeName].push(newNode);
    for (var i = 0; i < xmlNode.childNodes.length; i++) {
        xml2json(xmlNode.childNodes[i], newNode);
    }    
    return newNode;
}
