﻿/***** general *****/
function Collection() {
    var collection = {};
    var order = [];

    this.item = function (property) {
        return collection[property];
    }

    this.add = function (property, value) {
        if (!this.exists(property)) {
            collection[property] = value;
            order.push(property);
        }
    }
    this.remove = function (property) {
        collection[property] = null;
        var ii = order.length;
        while (ii-- > 0) {
            if (order[ii] == property) {
                order[ii] = null;
                break;
            }
        }
    }
    this.toString = function () {
        var output = [];
        for (var ii = 0; ii < order.length; ++ii) {
            if (order[ii] != null) {
                output.push(collection[order[ii]]);
            }
        }
        return output;
    }
    this.getKeys = function () {
        var keys = [];
        for (var ii = 0; ii < order.length; ++ii) {
            if (order[ii] != null) {
                keys.push(order[ii]);
            }
        }
        return keys;
    }
    this.update = function (property, value) {
        if (value != null) {
            collection[property] = value;
        }
        var ii = order.length;
        while (ii-- > 0) {
            if (order[ii] == property) {
                order[ii] = null;
                order.push(property);
                break;
            }
        }
    }
    this.exists = function (property) {
        return collection[property] != null;
    }
}

function parseQuerystring(data) {
    data = data.replace(/&amp;/gi, "&");
    if (data.substring(0, 1) == '<') {
        data = data.substr(5);
        data = data.substr(0, data.length - 6);
    }
    var retVal = new Collection();
    var re = /&?([^=]+)=([^&]+)/g;
    re.lastIndex = 0;
    var results = re.exec(data);
    while (results) {
        retVal.add(results[1], decodeURIComponent(results[2]));
        
        results = re.exec(data);
    }
    if (retVal.exists("ERROR")) {
        alert(retVal.item("ERROR"));
    }
    return retVal;
}
/***** extend jQuery *****/
(function ($) { 
    /* a = function to run when user hits enter
        -or-
       a = control id to trigger event
       b = (optional) event to trigger.  defaults to "click"
    */
    $.fn.bindToEnter = function(a,b) {        
        return this.each(function()
        {
            $(this).keypress(function(event) {  
                 if (event.keyCode == 13) {  
                    event.preventDefault();
                    if (typeof a == 'function') {
                        eval(a)
                    } else {
                        if (b) { 
                            $(a).trigger(b);
                        } else {
                            if ($(a).attr("href")) {
                                if ($(a).attr("href").substr(0,10) == 'javascript') {
                                    eval($(a).attr("href"));
                                } else {
                                    $(a).trigger('click');
                                }
                            } else {
                                $(a).trigger('click');
                            }
                        }
                    }
                 }  
             });  
        });
    }
})(jQuery);

/***** forms *****/
$(function () {
    $("input:submit[name^='ssform:']").each(function () {
        attachSubmit(this);
    });
    $("input:image[name^='ssform:']").each(function () {
        attachSubmit(this);
    });
    $("[OnEnter]").each(function () { $(this).bindToEnter('#' + $(this).attr('OnEnter')); });
});
function attachSubmit(o) {
    $(o).click(function () {
        var formname = $(o).attr('name').substring(7, $(o).attr('name').indexOf(':', 8));
        if (ssvalidate(formname)) {
            $("input[name='ssform:postbackform']").val(formname);
        } else {
            return false;
        }
    });
}
function ssvalidate(formname) {
    $('.ssformErrorMessage').remove();
    var isValid = true;
    $("input[name^='ssform:" + formname + "'], textarea[name^='ssform:" + formname + "'], select[name^='ssform:" + formname + "']").each(function () {
        $(this).removeClass('ssformErrorField');
        if ($(this).attr('datarequired') && ($(this).attr('datarequired') == 'true') && ($(this).attr('type') != 'checkbox') && ($(this).val() == '')) { isValid = false; ssvalidateError(this, 'required'); }
        if ($(this).attr('datarequired') && ($(this).attr('datarequired') == 'true') && ($(this).attr('type') == 'checkbox') && (!$(this).checked)) { isValid = false; ssvalidateError(this, 'required'); }
        if (($(this).val() != '') && ($(this).attr('type') == 'text')) {  // test type only for text fields and if data exists
            switch ($(this).attr('datatype')) {
                case 'text':
                    break;
                case 'email':
                    var reg = /^([\w\.!#\$%\-+.'_]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]{2,})+)$/i;
                    if (!reg.test($(this).val())) { isValid = false; ssvalidateError(this, 'email'); }
                    break;
                case 'website':
                    var reg = /^(?:|http\:\/\/|https\:\/\/)?(\w+\@)?(www\.)?\w+(\.\w+)+(\:\d+)?\??[-\w\d\.=&\;\/\$_\+\!\*\'\(\)]*/i;
                    if (!reg.test($(this).val())) { isValid = false; ssvalidateError(this, 'website'); }
                    break;
                case 'usphone':
                    var reg = /^(([1])?\s*(\(\d{3}\))?\s*\d{3}[\s\-]?\d{4})|(([1])?[\s-]?\d{3}-\d{3}-\d{4})$/i;
                    if (!reg.test($(this).val())) { isValid = false; ssvalidateError(this, 'usphone'); }
                    break;
                case 'uszipcode':
                    var reg = /^(\d{5}-\d{4}|\d{5})$/i;
                    if (!reg.test($(this).val())) { isValid = false; ssvalidateError(this, 'uszipcode'); }
                    break;
                case 'date':
                    var reg = /^[01]?[0-9][\s-\/\.]((\d)|([0-2]\d)|(3[01]))[\s-\/\.]((\d{2})|(\d{4}))$/i;
                    if (!reg.test($(this).val())) { isValid = false; ssvalidateError(this, 'date'); break; }
                    break;
                case 'integer':
                    var reg = /^-?\d+$/i;
                    if (!reg.test($(this).val())) { isValid = false; ssvalidateError(this, 'integer'); break; }
                    if ($(this).attr('datamin') != '') {
                        if (parseInt($(this).val()) < parseInt($(this).attr('datamin'))) { isValid = false; ssvalidateError(this, 'minimum'); break; }
                    }
                    if ($(this).attr('datamax') != '') {
                        if (parseInt($(this).val()) > parseInt($(this).attr('datamax'))) { isValid = false; ssvalidateError(this, 'maximum'); break; }
                    }
                    break;
                case 'decimal':
                    var reg = /^-?\d+(\.\d+)?$/i;
                    if (!reg.test($(this).val())) { isValid = false; ssvalidateError(this, 'decimal'); break; }
                    if ($(this).attr('datamin') != '') {
                        if (parseFloat($(this).val()) < parseFloat($(this).attr('datamin'))) { isValid = false; ssvalidateError(this, 'minimum'); break; }
                    }
                    if ($(this).attr('datamax') != '') {
                        if (parseFloat($(this).val()) > parseFloat($(this).attr('datamax'))) { isValid = false; ssvalidateError(this, 'maximum'); break; }
                    }
                    break;
                case 'currency':
                    var reg = /^(\$)?(([1-9]\d{0,2}(\,\d{3})*)|([1-9]\d*)|(0))(\.\d{2})?$/i;
                    if (!reg.test($(this).val())) { isValid = false; ssvalidateError(this, 'currency'); break; }
                    if ($(this).attr('datamin') != '') {
                        if (parseFloat($(this).val().substr(1)) < parseFloat($(this).attr('datamin'))) { isValid = false; ssvalidateError(this, 'minimum'); break; }
                    }
                    if ($(this).attr('datamax') != '') {
                        if (parseFloat($(this).val().substr(1)) > parseFloat($(this).attr('datamax'))) { isValid = false; ssvalidateError(this, 'maximum'); break; }
                    }
                    break;
            }
        }
        if ($(this).attr('dataregex') && ($(this).attr('dataregex') != '')) {
            var r = new RegExp($(this).attr('dataregex'));
            if (!r.test($(this).val())) { isValid = false; ssvalidateError(this, 'regex'); }
        }
    });
    $(".ssformErrorMessage").show();
    return isValid;
}
function ssvalidateError(o, type) {
    var oError;
    if ($(o).attr("dataerror") && ($(o).attr("dataerror") != '')) {
        oError = $("<div class=\"ssformErrorMessageBox\"><div class=\"ssformErrorMessage\">" + $(o).attr("dataerror") + "</div></div>");
    } else {
        var errormsg = ssformERRORS['defaultformfield' + type];
        if (type == 'minimum') {
            errormsg = errormsg.replace('{MINIMUM}', $(o).attr('datamin'));
        } else if (type == 'maximum') {
            errormsg = errormsg.replace('{MAXIMUM}', $(o).attr('datamax'));
        }
        oError = $("<div class=\"ssformErrorMessageBox\"><div class=\"ssformErrorMessage\">" + errormsg + "</div></div>");
    }
    $(oError).css("left", ($(o).position().left + $(o).width()) + 'px');
    $(oError).css("top", $(o).position().top + 'px');
    $(o).after(oError);

    $(o).addClass("ssformErrorField");
}

/**** paging ****/
function setCallbacks() {
    $("a[ref^='callback:']").click(function () {
        return pageClick(this);
    });
    $("select[ref^='callback:']").change(function () {
        return pageSort(this);
    });
    $("input[type='text'][ref^='callback:']").click(function () {
        return searchClick(this);
    });
}
function pageClick(o) {
    if ($(o).attr('ref') != 'callback:') {
        var callbackid = '#' + $(o).attr('ref').substr(9);
        $(callbackid).fadeTo(100, 0.5, function () {
            var delim = '?';
            if ($(o).attr('href').indexOf('?') > -1) { delim = '&'; }
            $(callbackid).load($(o).attr('href') + delim + 'callback=true ' + callbackid, function () {
                execCallback(callbackid);
                $(callbackid).fadeTo(50, 1);
                setCallbacks();
            });
        });
        return false;
    } else {
        return true;
    }
}

function pageSort(o) {
    if ($(o).attr('ref') != '') {
        var callbackid = '#' + $(o).attr('ref').substr(9);
        $(callbackid).fadeTo(100, 0.5, function () {
            var delim = '?';
            if ($(o).children(':selected').val().indexOf('?') > -1) { delim = '&'; }
            $(callbackid).load($(o).children(':selected').val() + delim + 'callback=true ' + callbackid, function () {
                execCallback(callbackid);
                $(callbackid).fadeTo(50, 1);
                setCallbacks();
            });
        });
        return false;
    } else {
        return true;
    }
}
function searchClick(o) {
    if ($(o).attr('ref') != '') {
        if (DES_ValidateGroup($(o).attr('group'))) {
            $($(o).attr('ref')).fadeTo(100, 0.5, function () {
                var delim = '?';
                if ($(o).attr('href').indexOf('?') > -1) { delim = '&'; }
                $($(o).attr('ref')).load($(o).attr('href') + delim + 'k=' + escape($('#' + $(o).attr('field')).val()) + '&callback=true ' + $(o).attr('ref'), function () {
                    execCallback($(o).attr('ref'));
                    $($(o).attr('ref')).fadeTo(50, 1);
                    setCallbacks();
                });
            });
        }
        return false;
    } else {
        return true;
    }
}
function execCallback(id) {
    var re = /callback:([\w\d\-_]+)/gi;
    re.lastIndex = 0;
    var results = re.exec($(id).attr("ref"));
    if (results) {
        eval(results[1] + "();");
    }
}
$(function () { setCallbacks(); });

function setCookie(c_name, value, exdays) {
    var exdate = new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate.toUTCString()) + "; path=/";
    document.cookie = c_name + "=" + c_value;
}
function getCookie(c_name) {
    var i, x, y, ARRcookies = document.cookie.split(";");
    for (i = 0; i < ARRcookies.length; i++) {
        x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));
        y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);
        x = x.replace(/^\s+|\s+$/g, "");
        if (x == c_name) {
            return unescape(y);
        }
    }
}

function SimpleEncode(text) {
    var retval = ""; /* the function will return this string */;
    for (i = 1; i < (text.length + 1); i++) {
        k = text.charCodeAt(i - 1);
        if (k >= 97 && k <= 109) {
            k = k + 13;
        } else
            if (k >= 110 && k <= 122) {
                k = k - 13;
            } else
                if (k >= 65 && k <= 77) {
                    k = k + 13;
                } else
                    if (k >= 78 && k <= 90) {
                        k = k - 13;
                    }
        retval = retval + String.fromCharCode(k);
    }
    return retval;
}
