﻿/***** 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],unescape(results[2]));
        
        results = re.exec(data);
    }
    if (retVal.exists("ERROR")) {
        alert(retVal.item("ERROR"));
    }
    return retVal;
}

/***** forms *****/
$(function () {
    $("input:submit[name^='ssform:']").each(function () {
        attachSubmit(this);
    });
    $("input:image[name^='ssform:']").each(function () {
        attachSubmit(this);
    });
});
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 = /^(?=\d)(?:(?!(?:1582(?:\.|-|\/)10(?:\.|-|\/)(?:0?[5-9]|1[0-4]))|(?:1752(?:\.|-|\/)0?9(?:\.|-|\/)(?:0?[3-9]|1[0-3])))(?=(?:(?!000[04]|(?:(?:1[^0-6]|[2468][^048]|[3579][^26])00))(?:(?:\d\d)(?:[02468][048]|[13579][26]))\D0?2\D29)|(?:\d{4}\D(?!(?:0?[2469]|11)\D31)(?!0?2(?:\.|-|\/)(?:29|30))))(\d{4})([-\/.])(0?\d|1[012])\2((?!00)[012]?\d|3[01])(?:$|(?=\x20\d)\x20))?((?:(?:0?[1-9]|1[012])(?::[0-5]\d){0,2}(?:\x20[aApP][mM]))|(?:[01]\d|2[0-3])(?::[0-5]\d){1,2})?$/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) {
    if ($(o).attr("dataerror") && ($(o).attr("dataerror") != '')) {
        $(o).after("<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'));
        }
        $(o).after("<div class=\"ssformErrorMessageBox\"><div class=\"ssformErrorMessage\">" + errormsg + "</div></div>");
    }
    $(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).wrap("<span id=\"callbackcontent\" />");
            $("#callbackcontent").load($(o).attr('href') + delim + 'callback=true ' + callbackid, function () {
                $(callbackid).unwrap();
                $(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 () {
                $(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 () {
                    $($(o).attr('ref')).fadeTo(50, 1);
                    setCallbacks();
                });
            });
        }
        return false;
    } else {
        return true;
    }
}
$(function () { setCallbacks(); });

