/* requires that prototype*.js has been loaded */
if (!OpenSRS) var OpenSRS = new Function ();
OpenSRS.onLoad = function (funcRef) {
    return Event.observe(window, 'load', funcRef); // provided by prototype
};
OpenSRS.modifyPeriod = function (cbox, url) {
    if (! ( cbox || url ) ) return false;
    if (! cbox.checked ) cbox.checked = true;
    else location.href = url;
};
OpenSRS.addSubitem = function (cbox, add_item_url) {
    if (! ( cbox || add_item_url ) ) return false;
    if (! cbox.checked ) {
        add_item_url = add_item_url.replace(/\/add_subitem/, '/remove_subitem');
    }
    location.href = add_item_url;
};
OpenSRS.disableUncheck = function (cbox) {
    if (! cbox.checked ) cbox.checked = true;
};
OpenSRS.showHideText = function (show_link_id, hide_link_id, glossary_item_id) {
    OpenSRS.onLoad(function () {
        $(show_link_id).onmousedown = function () {
            OpenSRS.showHide(hide_link_id, show_link_id, 'inline');
            $(glossary_item_id).show();
        };
        $(hide_link_id).onmousedown = function () {
            $(glossary_item_id).hide();
            OpenSRS.showHide(show_link_id, hide_link_id, 'inline');
        };
    });
};
OpenSRS.ajax = function (url, prototypeParams) {
    if (!url) return;
    if (!prototypeParams) prototypeParams = {}; // argument to prototype Ajax.Request()
    var onSuccess = prototypeParams['onSuccess'] || new Function ();
    // this adds "Content-Type: application/json" handling to prototype
    prototypeParams['onSuccess'] = function (transport) {
        var isJson = /^application\/json;/i.test( transport.getHeader('Content-Type') )
            || /^application\/x-javascript/i.test( transport.getHeader('Content-Type') ) ?
                1 : 0; // because opera sees different content-type
        if ( isJson ) {
            /****************************************************************\
            \***** see: http://www.ietf.org/rfc/rfc4627.txt?number=4627 *****/
            var jsonObj = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
                 transport.responseText.replace(/"(\\.|[^"\\])*"/g, ''))) &&
                 eval('(' + transport.responseText + ')');
            /****************************************************************/
            onSuccess(transport, jsonObj);
        } else {
            onSuccess(transport);
        }
    };
    return new Ajax.Request(url, prototypeParams);
};
OpenSRS.submitLogin = function (url, parameters) {
    var login_errors = 'login_errors';
    var username = 'username';
    var password = 'password';
    var success_url;

    /*
        XXX: svk -r 568 introduced a kludge to try to fix a problem (most likely opera
             only) which caused the browser not to redirect after login success.
             more than likely this was related to opera rewriting the HTTP response
             "Content-Type:" from "application/x-json" to "application/x-javascript"
             the problem doesn't appear to exist after a fix for the opera headers.
    */

    if (parameters) {
        login_errors = parameters.login_errors || 'login_errors';
        username = parameters.username || 'username';
        password = parameters.password || 'password';
        success_url = parameters.success_url || url;
    }
    var prototypeParams = {
        'method'    : 'POST',
        'onSuccess' : function (transport, json) {
            var success = new Number (json.success);
            if (success != 0) { /* should be using json.success_url or whathaveyou */
                success_url = json.redirect_url || success_url || url.replace(/\/json/, '');
                document.location.href = success_url;
            } else {
                var txt         = document.createTextNode(json.message);
                $(login_errors).style.display = 'block';
                while ( $(login_errors).firstChild )
                    $(login_errors).removeChild( $(login_errors).firstChild );
                $(login_errors).appendChild(txt);
            }
        },
        'onFailure' : function (transport) {
            var txt         = document.createTextNode(transport.responseText);
            while ( $(login_errors).firstChild )
                $(login_errors).removeChild( $(login_errors).firstChild );
            $(login_errors).style.display = 'block';
            $(login_errors).appendChild(txt);
        },
        'parameters'    : {
            'username'  : $(username).value,
            'password'  : $(password).value
        }
    };
    OpenSRS.ajax(url, prototypeParams);
};
OpenSRS.clearInput = function (elem) {
    if (elem.value && elem.defaultValue == elem.value) {
        elem.value = new String();
    }

    elem.style.color = 'black';
};
OpenSRS.addToCart = function (url, item_id_prefix) { // for searchresults page
    var item_cbox = $(item_id_prefix + '_checkbox');
    var remove_item = item_cbox.checked ? false : true;
    if (remove_item) url = url.replace(/add_item/, 'remove_item');
    var item_saved = $(item_id_prefix + '_saved');
    var item_error = $(item_id_prefix + '_error');
    var prototypeParams = {
        'method'    : 'POST',
        'onSuccess' : function (transport, json) {
            var success = new Number (json.success);
            if (success != 0) {
                item_cbox.checked = remove_item ? false : true;
                item_saved.style.display = remove_item ? 'none' : 'inline';
                item_error.style.display = 'none';
            } else {
                item_cbox.checked = remove_item ? true : false;
                item_saved.style.display = remove_item ? 'inline' : 'none';
                item_error.style.display = 'inline';
                var html = OpenSRS.htmlToDOM(json.message);
                while ( item_error.firstChild ) item_error.removeChild( item_error.firstChild );
                item_error.appendChild( html );
            }
        },
        'onFailure' : function (transport) {
            var html = OpenSRS.htmlToDOM(transport.statusText);
            while ( item_error.firstChild ) item_error.removeChild( item_error.firstChild );
            item_error.appendChild( html );
        }
    };
    OpenSRS.ajax(url, prototypeParams);
};

OpenSRS.htmlToDOM = function (html) { // this is taken/modified from sourcery.ca under BSD license
    /*
        The "html" must have a single wrapper element such as a <table> <div> or <span>
    */
    if (!document.all || window.opera) {
        var xml = '<?xml version="1.0" ?><inserthtml>'+ html +'</inserthtml>';
        var xsl = '<?xml version="1.0" ?><xsl:stylesheet version="1.0" '
            +'xmlns:xsl="http://www.w3.org/1999/XSL/Transform">'
            +'<xsl:output method="html"/><xsl:template match="inserthtml">'
            +'<xsl:copy-of select="node()"/></xsl:template></xsl:stylesheet>';
        var xmlDoc = (new DOMParser ()).parseFromString(xml, 'text/xml');
        var xslDoc = (new DOMParser ()).parseFromString(xsl, 'text/xml');
        var xsltProcessor = new XSLTProcessor();
        xsltProcessor.importStylesheet(xslDoc);
        return xsltProcessor.transformToFragment(xmlDoc, document)
    } else {
        var div = document.createElement('DIV');
        div.insertAdjacentHTML('AfterBegin', html);
        return div.firstChild;
    }
};
OpenSRS.positionRelative = function (positioned_element, relative_to_element, quadrant) {
    // quadrant is one of the following options: (top|middle|bottom) + (left|center|right)
    // get height/width/position of elements
    var ph = positioned_element.offsetHeight;
    var pw = positioned_element.offsetWidth;
    var rh = relative_to_element.offsetHeight;
    var rw = relative_to_element.offsetWidth;
    var elem = relative_to_element;
    var rleft = new Number (elem.offsetLeft);
    while (elem = elem.offsetParent) rleft += new Number (elem.offsetLeft);
    elem = relative_to_element;
    var rtop = new Number (elem.offsetTop);
    while (elem = elem.offsetParent) rtop += new Number (elem.offsetTop);
    // determine absolute position relative to element
    var position = {};
    if (/^top/.test(quadrant)) position.top = rtop - ph;
    if (/^middle/.test(quadrant)) position.top = rtop + ( ( rh - ph ) / 2 );
    if (/^bottom/.test(quadrant)) position.top = rtop + rh;
    if (/left$/.test(quadrant)) position.left = rleft - pw;
    if (/center$/.test(quadrant)) position.left = rleft + ( rw / 2 ) - ( pw / 2 );
    if (/right$/.test(quadrant)) position.left = rleft + rw;
    if (!position.top) position.top = 0;
    if (!position.left) position.left = 0;
    return position;
};
OpenSRS.dataCache = {}; // someplace to store arbitrary state info
OpenSRS.toolTip = function (e, params) {
    /********************************************/
    e                   = params.event_obj || e || window.event;
    var trigger_element = params.trigger_element;
    var tooltip_id      = params.tooltip_id;
    var html_text       = params.html_text;
    var show_tooltip    = params.show_tooltip;
    var quadrant        = params.position_quadrant; // see: OpenSRS.positionRelative()
    var offsets         = params.position_offsets; // { top: #, left: # }
    /********************************************/
    if (!offsets) offsets = {};
    if (!offsets.top) offsets.top = 0;
    if (!offsets.left) offsets.left = 0;
    var tt = $(tooltip_id);
    if (!show_tooltip) { // hide element
        if (tt) tt.style.display = 'none';
        return;
    }
    if (!tt) { // create tooltip element
        var tooltip = document.createElement('div');
        tooltip.id = tooltip_id;
        document.getElementsByTagName('body')[0].appendChild(tooltip);
        tt = $(tooltip_id); // now get it again
    }
    var dom = OpenSRS.htmlToDOM(html_text);
    while (tt.firstChild) tt.removeChild(tt.firstChild);
    tt.appendChild(dom);
    tt.style.display = 'block';
    tt.style.position = 'absolute';
    var position = OpenSRS.positionRelative(tt, trigger_element, quadrant);
    tt.style.top = position.top + offsets.top + 'px';
    tt.style.left = position.left + offsets.left + 'px';
    return tt;
};
OpenSRS.cartTooltip = function (e, element, bool, url) {
    e = e || window.event;
    if (!bool && $('view_cart_tooltip')) $('view_cart_tooltip').style.display = 'none';
    var cartTooltip = function (transport, json) {
        var text = '<table>'; // now generate the tooltip textual contents
        for (var i = 0; i < json.length; i++)
            text += '<tr><td>' + json[i].action + '</td><td>' + json[i].type + '</td><td><b>' +
                json[i].display_name + '</b></td><td>' + json[i].period + ' year' +
                ( new Number ( json[i].period ) > 1 ? 's' : '' )+ '</td></tr>';
        text += '</table>';
        OpenSRS.toolTip(e, {
            'trigger_element'   : element,
            'tooltip_id'        : 'view_cart_tooltip',
            'html_text'         : text,
            'show_tooltip'      : bool,
            'position_quadrant' : 'bottom left',
            'position_offsets'  : { 'top' : 4, 'left' : 30 }
        });
    };
    OpenSRS.ajax(url, { method: 'get', onSuccess: cartTooltip });
};
OpenSRS.nextSearchTip = function () {
    OpenSRS.ajax('/json/searchtip', {
        method: 'get',
        onSuccess: function (transport, jsonObj) {
            if (jsonObj['tip']) $('domain_tip').update(jsonObj['tip']);
        }
    });
};
OpenSRS.rememberMe = function (cbox) {
    var input_id = cbox.id.replace(/checkbox/, 'input');
    var bool = $(input_id).value == 1 ? true : false;
    cbox.className = bool ?
        cbox.className.replace(/checkbox_on/, 'checkbox_off') :
        cbox.className.replace(/checkbox_off/, 'checkbox_on');
    $(input_id).value = bool ? 0 : 1;
};
OpenSRS.showHide = function (show_id, hide_id, display) {
    $(hide_id).style.display = 'none';
    $(show_id).style.display = display || 'block';
};
OpenSRS.objToString = function (obj) { // for debugging
    var str = '';
    for (var key in obj) str += key + ': ' + obj[key] + "\n";
    return str;
};


