try{document.execCommand('BackgroundImageCache',false,true);}catch(e){}; //fixes background image flickering problem in IE6

function _(name)
{
    //can't cache because objects might change
    return document.getElementById(name);
} //function _

function $()
{
    //this function is made to be compatible with prototype (it is an optimized copy), we use prototype in lightbox
    if (arguments.length == 1) {
        if (typeof arguments[0] == 'string') {
            return document.getElementById(arguments[0]);
        } else {
            return arguments[0];
        }
    } else {
        elements = new Array();
        for (i=0; i<arguments.length; ++i) {
            element = arguments[i];
            if (typeof element == 'string') {
                element = document.getElementById(element);
            }
            elements[i] = element;
        }
        return elements;
    }
} //function $

function trim(s)
{
    s = s.replace( /^\s+/g, '' );// strip leading
    return s.replace( /\s+$/g, '' );// strip trailing
} //function trim

var base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var base64DecodeChars = new Array(
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
    -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);

function base64encode(str)
{
    var out, i, len;
    var c1, c2, c3;

    len = str.length;
    i = 0;
    out = '';
    while(i < len) {
        c1 = str.charCodeAt(i++) & 0xff;
        if(i == len)
        {
            out += base64EncodeChars.charAt(c1 >> 2);
            out += base64EncodeChars.charAt((c1 & 0x3) << 4);
            out += '==';
            break;
        }
        c2 = str.charCodeAt(i++);
        if(i == len)
        {
            out += base64EncodeChars.charAt(c1 >> 2);
            out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
            out += base64EncodeChars.charAt((c2 & 0xF) << 2);
            out += '=';
            break;
        }
        c3 = str.charCodeAt(i++);
        out += base64EncodeChars.charAt(c1 >> 2);
        out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
        out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
        out += base64EncodeChars.charAt(c3 & 0x3F);
    }
    return out;
} //function base64encode

function cm_encode(s)
{
    if (!s && s+'') { //value was false or null, but not '' or 0 (because false+'' results in 'false')
        return '';
    }
    r = base64encode(s+'');
    tmp = '';
    for (i=0;i<r.length;i++) {
        switch (r.charAt(i)) {
            case '+':  tmp += '_p'; break;
            case '/':  tmp += '_s'; break;
            default:   tmp += r.charAt(i);
        }
    }
    return tmp;
} //function cm_encode

function cm_html(s)
{
    s = s+'';
    s = s.replace(/&/g,  '&amp;');
    s = s.replace(/\"/g, '&quot;');
    s = s.replace(/</g,  '&lt;');
    s = s.replace(/>/g,  '&gt;');
    return s;
} //function cm_html

function addslashes(s)
{
    s = s+'';
    s = s.replace(/\'/g, '\\\'');
    return s;
} //function addslashes

function cm_htmlJs(s)
{
    return addslashes(cm_html(s));
} //function cm_htmlJs

function checkEmail(s)
{
    return s.search(/^[a-z0-9!#$%&*+-=?^_{|}~]+(\.[a-z0-9!#$%&*+-=?^_{|}~]+)*@([-a-z0-9]+\.)+([a-z]{2,3}|info|arpa|aero|coop|name|museum)$/i) != -1;
} //function checkEmail

function cm_urlIsHtml(url)
{
    return (url.indexOf(url, '&amp;')==-1);
} //function cm_urlIsHtml

function formRadioSelect(radioField, value)
{
    for (i=0; i<radioField.length; i++) {
        if (radioField[i].value == value) {
            radioField[i].checked = true;
        }
    }
} //function formRadioSelect

function formSelectSelect(radioField, value)
{

} //function formSelectSelect

function formRadioValue(radioField)
{
    for (i=0; i<radioField.length; i++) {
        if (radioField[i].checked) {
            return radioField[i].value;
        }
    }
    return false;
} //function formRadioValue

function formSelectValue(selectField)
{
    return selectField.options[selectField.selectedIndex].value;
} //function formSelectValue

function formSetTextValue(id, text)
{
    var f;
    f = document.getElementById(id);
    f.value = text;
} //function formSetTextValue

function formGetTextValue(id)
{
    var f;
    f = document.getElementById(id);
    return f.value;
} //function formGetTextValue

function displayPrice(cents, sign, separator)
{
    if (!separator) {
        separator = '.';
    }
    return sign+((cents-cents%100)/100)+separator+(cents%100<10?'0':'')+(cents%100);
} //function displayPrice

function isNumeric(s)
{
    s += ''; //convert to string
    return (s.search(/^\d+$/)!=-1);
} //function isNumeric

function xToggleDisplay(elem, display)
{
    if (!display) {
        display = 'block';
    }
    e = xGetElementById(elem);
    d = xDisplay(e);
    xDisplay(e, (d=='none'?display:'none'));
} //function xToggleDisplay

function bracket_replace(text, replaces, links)
{
    for (i in replaces) {
        text = text.replace(new RegExp('\\['+i+'\\]', 'g'), replaces[i]);
    }
    for (i in links) {
        text = text.replace(new RegExp('\\['+i+'\\](.*?)\\[\/'+i+'\\]'), '<a href="'+html(links[i])+'">$1</a>');
        text = text.replace(new RegExp('\\['+i+'\\]'), '<a href="'+html(links[i])+'">'+html(links[i])+'</a>');
    }
    return text;
} //function bracket_replace

function urlArgumentsRecursive(ar)
{
    var retVal = {};
    if (typeof ar!='object') {
        throw new Error('urlArgumentsRecursive: object expected!'+ar);
    }
    for (var i in ar) {
        if (typeof ar[i] == 'object') {
            var processedAr = urlArgumentsRecursive(ar[i]);
            for (var j in processedAr) {
                retVal['['+i+']'+j] = processedAr[j];
            }
        } else {
            retVal['['+encodeURIComponent(i)+']'] = ar[i];
        }
    }
    return retVal;
} //function urlArgumentsRecursive

function urlArguments(ar)
{
    if (typeof ar!='object') {
        throw new Error('urlArguments: object expected!');
    }
    var retVal = '';
    for (var i in ar) {
        if (typeof ar[i] == 'object') {
            var processedAr = urlArgumentsRecursive(ar[i]);
            for (var j in processedAr) {
                if (retVal!=='') {
                    retVal += '&';
                }
                retVal += encodeURIComponent(i)+j+'='+encodeURIComponent(processedAr[j]);
            }
        } else {
            if (retVal!=='') {
                retVal += '&';
            }
            retVal += encodeURIComponent(i)+'='+encodeURIComponent(ar[i]);
        }
    }
    return retVal;
} //function urlArguments

