// page init
$(function() {
    ieHover('#menu li');
    VSA_initScrollbars();
    initCustomForms();
    initAccordion();
    initSliders();
    initPopups();
    initInputs();
    initTabs();
    initFadeTabs();
    initTableSorting();
});

// hover for IE
function ieHover(_list) {
    if ($.browser.msie && $.browser.version < 7) {
        $(_list).hover(function() {
            $(this).addClass('hover');
        }, function() {
            $(this).removeClass('hover');
        });
    }
}

// clear inputs onfocus
function initInputs() {
    var _inputs = $('input[type="text"],input[type="password"],textarea');
    _inputs.each(function() {
        var _input = $(this);
        var _val = _input.val();
        if (_val.length) {
            _input.focus(function() {
                if (_input.val() == _val) _input.val('');
            });
            _input.blur(function() {
                if (!_input.val().length) _input.val(_val);
            });
        }
    });
}


// tabs function
function initTabs() {
    $('div.tabset').each(function() {
        var _list = $(this);
        var _links = _list.find('a.tab');
        _links.each(function() {
            var _link = $(this);
            var _href = _link.attr('href');
            var _tab = $(_href);

            if (_link.hasClass('active')) _tab.show();
            else _tab.hide();

            _link.click(function() {
                _links.filter('.active').each(function() {
                    $($(this).removeClass('active').attr('href')).hide();
                });
                _link.addClass('active');
                _tab.show();
                return false;
            });
        });
    });
}

// tabs function
function initFadeTabs() {
    var _fadeSpeed = 300;
    var _activeClass = 'active';
    $('div.fade-tabset').each(function() {
        var _list = $(this);
        var _links = _list.find('a.tab');
        _links.each(function() {
            var _link = $(this);
            var _tab = $(_link.attr('href'));

            if (_link.hasClass(_activeClass)) _tab.show();
            else _tab.hide();
            _link.unbind('click');

            _link.click(function() {
                _links.filter('.' + _activeClass).each(function() {
                    _link.addClass(_activeClass);
                    $($(this).removeClass(_activeClass).attr('href')).fadeOut(_fadeSpeed, function() {
                        _tab.fadeIn(_fadeSpeed);
                    });
                });
                return false;
            });
        });
    });
}

// jquery ui sliders init
function initSliders() {
    $('div.slider-holder').each(function() {
        var _holder = $(this);
        var _slider = _holder.find('div.slider');
        var _minVal = _holder.find('span.min-val');
        var _maxVal = _holder.find('span.max-val');
        var _inputMin = _holder.find('input.min');
        var _inputMax = _holder.find('input.max');

        _slider.slider({
            range: true,
            min: parseInt(_minVal.text()),
            max: parseInt(_maxVal.text()),
            values: [parseInt(_minVal.text()), parseInt(_maxVal.text())],
            slide: function(event, ui) {
                refreshSliderValues(ui);
            }
        });

        function refreshSliderValues(_ui) {
            _minVal.text(_ui.values[0]);
            _maxVal.text(_ui.values[1]);
            _inputMin.val(_ui.values[0])
            _inputMax.val(_ui.values[1])
        }
    });
}

// accordion function
function initAccordion() {
    var _activeClass = 'active';
    var _slideSpeed = 500;
    $('ul.accordion').each(function() {
        var _accordion = $(this);
        var _items = _accordion.find('li:has(div)');
        _items.each(function() {
            var _holder = $(this);
            var _opener = _holder.find('>a');
            var _slider = _holder.find('>div');

            _opener.click(function() {
                var _levelItems = _holder.parent().children(':has(div)').not(_holder);

                if (_holder.hasClass(_activeClass)) {
                    _slider.slideUp(_slideSpeed, function() {
                        _holder.removeClass(_activeClass);
                    });
                } else {
                    _holder.addClass(_activeClass);
                    _slider.slideDown(_slideSpeed);

                    // collapse others
                    _levelItems.find('>div:visible').slideUp(_slideSpeed, function() {
                        _levelItems.removeClass(_activeClass);
                    })
                }
                return false;
            });

            if (_holder.hasClass(_activeClass)) _slider.show();
            else _slider.hide();
        });
    });
}

// table sorting
function initTableSorting() {
    var _colorClass = 'color';

    $('table.sorting-table').each(function() {
        var _table = $(this);
        var _tableRows = _table.find('tbody > tr');
        _table.tablesorter({
            cssAsc: 'sortAsc',
            cssDesc: 'sortDesc',
            cssHeader: 'sortDefault'
        });
        _table.bind("sortStart", function() {
            _tableRows.removeClass(_colorClass);
        }).bind("sortEnd", function() {
            _tableRows.removeClass(_colorClass).filter(':nth-child(2n-1)').addClass(_colorClass);
            if (typeof (showPage) == 'function') {
                showPage();
            }
        });
    });

    $('.table-mask-holder').each(function() {
        var _holder = $(this);
        var _pseudoLinks = _holder.find('.table-header th');
        var _normalLinks = _holder.find('.scrollable th');
        _pseudoLinks.each(function(_ind) {
            $(this).click(function() {
                _normalLinks.eq(_ind).trigger('click');
                setTimeout(function() { _normalLinks.each(function(_num) { _pseudoLinks.eq(_num).attr('class', $(this).attr('class')); }) }, 100)
                return false;
            });
        });
    })
}

// popups function
function initPopups() {
    var _zIndex = 1000;
    var _fadeSpeed = 350;
    var _faderOpacity = 0.65;
    var _faderBackground = '#fff';
    var _faderId = 'lightbox-overlay';
    var _closeLink = 'a.close, a.cancel';
    var _fader;
    var _lightbox = null;
    var _openers = $('a.open-popup');
    var _hoverOpeners = $('input.open-popup-field');
    var _signupOpener = $('#signup-opener-link');
    var _page = $('body > div:eq(0)');
    var _minWidth = _page.outerWidth();

    // init popup fader
    _fader = $('#' + _faderId);
    if (!_fader.length) {
        _fader = $('<div />');
        _fader.attr('id', _faderId);
        $('body').append(_fader);
    }
    _fader.css({
        opacity: _faderOpacity,
        backgroundColor: _faderBackground,
        position: 'absolute',
        overflow: 'hidden',
        display: 'none',
        top: 0,
        left: 0,
        zIndex: _zIndex
    });

    // IE6 iframe fix
    if (jQuery.browser.msie && jQuery.browser.version < 7) {
        if (!_fader.children().length) {
            var _frame = jQuery('<iframe src="javascript:false" frameborder="0" scrolling="no" />');
            _frame.css({
                opacity: 0,
                width: '100%',
                height: '100%'
            })
            _fader.empty().append(_frame);
        }
    }

    // modal window function
    function showModal() {
        toggleState(true);
        positionLightbox();
    }

    // lightbox positioning function
    function positionLightbox() {
        if (_lightbox) {
            var _windowHeight = $(window).height();
            var _windowWidth = $(window).width();
            var _lightboxWidth = _lightbox.outerWidth();
            var _lightboxHeight = _lightbox.outerHeight();
            var _pageHeight = _page.outerHeight(true);

            if (_windowWidth < _minWidth) _fader.css('width', _minWidth);
            else _fader.css('width', '100%');
            if (_windowHeight < _pageHeight) _fader.css('height', _pageHeight);
            else _fader.css('height', _windowHeight);

            _lightbox.css({
                position: 'absolute',
                zIndex: (_zIndex + 1),
                top: 0,
                left: 0
            });

            // vertical position
            if (_windowHeight > _lightboxHeight) {
                if ($.browser.msie && $.browser.version < 7) {
                    _lightbox.css({
                        position: 'absolute',
                        top: document.documentElement.scrollTop + (_windowHeight - _lightboxHeight) / 2
                    });
                } else {
                    _lightbox.css({
                        position: 'fixed',
                        top: (_windowHeight - _lightboxHeight) / 2
                    });
                }
            } else {
                _lightbox.css({
                    position: 'absolute',
                    top: 0
                });
                if (_fader.height() < _lightboxHeight) _fader.css('height', _lightboxHeight);
            }

            // horizontal position
            if (_fader.width() > _lightbox.outerWidth()) _lightbox.css({ left: (_fader.width() - _lightbox.outerWidth()) / 2 });
            else _lightbox.css({ left: 0 });
        }
    }

    function focusPopup() {
        $('.popup :text:visible:enabled:first').focus();
    }
    
    // show/hide lightbox
    function toggleState(_state) {
        if (!_lightbox) return;
        if (_state) {
            _fader.fadeIn(_fadeSpeed, function() {
                _lightbox.fadeIn(_fadeSpeed, focusPopup);
            });
        } else {
            _lightbox.fadeOut(_fadeSpeed, function() {
                _fader.fadeOut(_fadeSpeed);
            });
        }
    }

    // popup actions
    function initPopupActions(_obj) {
        if (!_obj.get(0).jsInit) {
            _obj.get(0).jsInit = true;
            // close link
            _obj.find(_closeLink).click(function() {
                _lightbox = _obj;
                toggleState(false);
                return false;
            });
        }
    }

    // lightbox openers
    _openers.each(function() {
        var _opener = $(this);
        var _target = _opener.attr('href');
        if ($(_target).length) {
            var _popup = $(_target);
            initPopupActions(_popup);
            _opener.click(function(e) {
                if (_lightbox) {
                    _lightbox.fadeOut(_fadeSpeed, function() {
                        _lightbox = _popup.hide();
                        showModal();
                    })
                } else {
                    _lightbox = _popup.hide();
                    showModal();
                }
                e.preventDefault();
                return false;
            });
        }

    });

    _signupOpener.each(function() {
        var _opener = $(this);
        var _target = _opener.attr('alt');
        if ($(_target).length) {
            var _popup = $(_target);
            initPopupActions(_popup);
            _opener.click(function() {
                if (_lightbox) {
                    _lightbox.fadeOut(_fadeSpeed, function() {
                        _lightbox = _popup.hide();
                        showModal();
                    })
                } else {
                    _lightbox = _popup.hide();
                    showModal();
                }
            });
        }
    });

    _hoverOpeners.each(function() {
        var _opener = $(this);
        var _target = _opener.attr('alt');
        if ($(_target).length) {
            var _popup = $(_target);
            initPopupActions(_popup);
            _opener.focus(function() {
                if (_lightbox) {
                    _lightbox.fadeOut(_fadeSpeed, function() {
                        _lightbox = _popup.hide();
                        showModal();
                    })
                } else {
                    _lightbox = _popup.hide();
                    showModal();
                }
            });


        }
    });

    // event handlers
    $(window).resize(function() {
        positionLightbox();
    })
    $(window).scroll(function() {
        positionLightbox();
    })
    $(document).keydown(function(e) {
        if (!e) evt = window.event;
        if (e.keyCode == 27) {
            toggleState(false);
        }
    })
    _fader.click(function() {
        toggleState(false);
        return false;
    })

    // custom selects fix
    $(window).scroll(function() {
        var _visible = $('div.optionsDivVisible');
        if (_visible.length) {
            _visible.removeClass('optionsDivVisible').addClass('optionsDivInvisible');
            /* scroll options with popup */
            //var _idNum = _visible.attr('id').replace('optionsDiv','');
            //var _selectParent = $('#sarea'+_idNum);
            //_visible.css({top:_selectParent.offset().top+_selectParent.height()})
        }
    });

    if (show_newsletter_signup) {
        _lightbox = $("#signup-popup").hide();
        showModal();
    }
}

// custom forms script
var _selectHeight = 21;
var _forms = document.getElementsByTagName('form');
var inputs = new Array();
var selects = new Array();
var labels = new Array();
var radios = new Array();
var radioLabels = new Array();
var checkboxes = new Array();
var checkboxLabels = new Array();
var buttons = new Array();
var selects = new Array();
var all_selects = false;
var active_select = null;
var agt = navigator.userAgent.toLowerCase();
var isMac = is_mac();
var selectText = "please select";
var IN_CFORMS = true;

function is_mac() {
    if (navigator.appVersion.indexOf("Safari") != -1) {
        if (!window.getComputedStyle) {
            return true;
        }
    }
    return false;
}

function initCustomForms() {
    if (!document.getElementById) { return false; }
    getElements();
    separateElements();
    //	replaceRadios();
    //	replaceCheckboxes();
    replaceSelects();

    var _selects = document.getElementsByTagName('select');
    var _SelctClassName = [];
    if (_selects) {
        for (var i = 0; i < _selects.length; i++) {
            if (_selects[i].className != '' && _selects[i].className != 'outtaHere')
                _SelctClassName[i] = ' drop-' + _selects[i].className;
        }
        for (var i = 0; i < _SelctClassName.length; i++) {
            var _selectDrop = document.getElementById('optionsDiv' + i);
            if (_selectDrop) {
                if (_SelctClassName[i])
                    _selectDrop.className += _SelctClassName[i];
            }
        }
    }
}
// getting all the required elements
function getElements() {
    for (var nf = 0; nf < document.getElementsByTagName("form").length; nf++) {
        for (var nfi = 0; nfi < document.forms[nf].getElementsByTagName("input").length; nfi++) { inputs.push(document.forms[nf].getElementsByTagName("input")[nfi]); }
        for (var nfl = 0; nfl < document.forms[nf].getElementsByTagName("label").length; nfl++) { labels.push(document.forms[nf].getElementsByTagName("label")[nfl]); }
        for (var nfs = 0; nfs < document.forms[nf].getElementsByTagName("select").length; nfs++) { selects.push(document.forms[nf].getElementsByTagName("select")[nfs]); }
    }
}
// separating all the elements in their respective arrays
function separateElements() {
    var r = 0; var c = 0; var t = 0; var rl = 0; var cl = 0; var tl = 0; var b = 0;
    for (var q = 0; q < inputs.length; q++) {
        if (inputs[q].type == "radio") {
            radios[r] = inputs[q]; ++r;
            for (var w = 0; w < labels.length; w++) {
                if ((inputs[q].id) && labels[w].htmlFor == inputs[q].id) {
                    radioLabels[rl] = labels[w];
                    ++rl;
                }
            }
        }
        if (inputs[q].type == "checkbox") {
            checkboxes[c] = inputs[q]; ++c;
            for (var w = 0; w < labels.length; w++) {
                if ((inputs[q].id) && (labels[w].htmlFor == inputs[q].id)) {
                    checkboxLabels[cl] = labels[w];
                    ++cl;
                }
            }
        }
        if ((inputs[q].type == "submit") || (inputs[q].type == "button")) {
            buttons[b] = inputs[q]; ++b;
        }
    }
}
//replacing radio buttons
function replaceRadios() {
    for (var q = 0; q < radios.length; q++) {
        radios[q].className += " outtaHere";
        var radioArea = document.createElement("div");
        if (radios[q].checked) {
            radioArea.className = "radioAreaChecked";
        }
        else {
            radioArea.className = "radioArea";
        }
        radioArea.id = "myRadio" + q;
        radios[q].parentNode.insertBefore(radioArea, radios[q]);
        radios[q]._ra = radioArea;

        radioArea.onclick = new Function('rechangeRadios(' + q + ')');
        if (radioLabels[q]) {
            radioLabels[q].onclick = new Function('rechangeRadios(' + q + ')');
        }
    }
    return true;
}
//checking radios
function checkRadios(who) {
    var what = radios[who]._ra;
    for (var q = 0; q < radios.length; q++) {
        if ((radios[q]._ra.className == "radioAreaChecked") && (radios[q]._ra.nextSibling.name == radios[who].name)) {
            radios[q]._ra.className = "radioArea";
        }
    }
    what.className = "radioAreaChecked";
}
//changing radios
function changeRadios(who) {
    if (radios[who].checked) {
        for (var q = 0; q < radios.length; q++) {
            if (radios[q].name == radios[who].name) {
                radios[q].checked = false;
            }
            radios[who].checked = true;
            checkRadios(who);
        }
    }
}
//rechanging radios
function rechangeRadios(who) {
    if (!radios[who].checked) {
        for (var q = 0; q < radios.length; q++) {
            if (radios[q].name == radios[who].name) {
                radios[q].checked = false;
            }
            radios[who].checked = true;
            checkRadios(who);
        }
    }
}
//replacing checkboxes
function replaceCheckboxes() {
    for (var q = 0; q < checkboxes.length; q++) {
        checkboxes[q].className += " outtaHere";
        var checkboxArea = document.createElement("div");
        if (checkboxes[q].checked) {
            checkboxArea.className = "checkboxAreaChecked";
        }
        else {
            checkboxArea.className = "checkboxArea";
        }
        checkboxArea.id = "myCheckbox" + q;
        checkboxes[q].parentNode.insertBefore(checkboxArea, checkboxes[q]);
        checkboxes[q]._ca = checkboxArea;
        checkboxArea.onclick = checkboxArea.onclick2 = new Function('rechangeCheckboxes(' + q + ')');
        if (checkboxLabels[q]) {
            checkboxLabels[q].onclick = new Function('changeCheckboxes(' + q + ')');
        }

        checkboxes[q].onkeydown = checkEvent;
    }
    return true;
}
//checking checkboxes
function checkCheckboxes(who, action) {
    var what = checkboxes[who]._ca;
    if (action == true) {
        what.className = "checkboxAreaChecked";
        what.checked = true;
    }
    if (action == false) {
        what.className = "checkboxArea";
        what.checked = false;
    }
}
//changing checkboxes
function changeCheckboxes(who) {
    if (checkboxes[who].checked) {
        checkCheckboxes(who, false);
    }
    else {
        checkCheckboxes(who, true);
    }
}
//rechanging checkboxes
function rechangeCheckboxes(who) {
    var tester = false;
    if (checkboxes[who].checked == true) {
        tester = false;
    }
    else {
        tester = true;
    }
    checkboxes[who].checked = tester;
    checkCheckboxes(who, tester);
}
//check event
function checkEvent(e) {
    if (!e) var e = window.event;
    if (e.keyCode == 32) { for (var q = 0; q < checkboxes.length; q++) { if (this == checkboxes[q]) { changeCheckboxes(q); } } } //check if space is pressed
}
function replaceSelects() {
    for (var q = 0; q < selects.length; q++) {
        if (!selects[q].replaced && selects[q].offsetWidth) {
            selects[q]._number = q;
            //create and build div structure
            var selectArea = document.createElement("div");
            var left = document.createElement("span");
            left.className = "left";
            selectArea.appendChild(left);

            var disabled = document.createElement("span");
            disabled.className = "disabled";
            selectArea.appendChild(disabled);

            selects[q]._disabled = disabled;
            var center = document.createElement("span");
            var button = document.createElement("a");
            var text = document.createTextNode(selectText);
            center.id = "mySelectText" + q;

            var stWidth = selects[q].offsetWidth;
            selectArea.style.width = stWidth + "px";
            if (selects[q].parentNode.className.indexOf("type2") != -1) {
                button.href = "javascript:showOptions(" + q + ",true)";
            } else {
                button.href = "javascript:showOptions(" + q + ",false)";
            }
            button.className = "selectButton";
            selectArea.className = "selectArea";

            selectArea.className += " " + selects[q].className;
            selectArea.id = "sarea" + q;
            center.className = "center";
            center.appendChild(text);
            selectArea.appendChild(center);
            selectArea.appendChild(button);

            //hide the select field
            selects[q].className += " outtaHere";
            //insert select div
            selects[q].parentNode.insertBefore(selectArea, selects[q]);
            //build & place options div

            var optionsDiv = document.createElement("div");

            var optionsList = document.createElement("ul");
            optionsDiv.innerHTML += "<div class='select-top'><div></div></div>";
            optionsDiv.appendChild(optionsList);

            selects[q]._options = optionsList;

            optionsDiv.style.width = stWidth + "px";
            optionsDiv._parent = selectArea;

            optionsDiv.className = "optionsDivInvisible";
            optionsDiv.id = "optionsDiv" + q;

            populateSelectOptions(selects[q]);
            optionsDiv.innerHTML += "<div class='select-bottom'><div class='select-bottom-left'></div><div class='select-bottom-right'></div></div>";
            document.getElementsByTagName("body")[0].appendChild(optionsDiv);
            selects[q].replaced = true;
        }
        all_selects = true;
    }
}

//collecting select options
function populateSelectOptions(me) {
    me._options.innerHTML = "";
    for (var w = 0; w < me.options.length; w++) {
        var optionHolder = document.createElement('li');
        var optionLink = document.createElement('a');
        var optionTxt;
        if (me.options[w].title.indexOf('image') != -1) {
            optionTxt = document.createElement('img');
            optionSpan = document.createElement('span');
            optionTxt.src = me.options[w].title;
            optionSpan = document.createTextNode(me.options[w].text);
        } else {
            optionTxt = document.createTextNode(me.options[w].text);
        }
        optionLink.href = "javascript:showOptions(" + me._number + "); selectMe('" + me.id + "'," + w + "," + me._number + ");";
        if (me.options[w].title.indexOf('image') != -1) {
            optionLink.appendChild(optionTxt);
            optionLink.appendChild(optionSpan);
        } else {
            optionLink.appendChild(optionTxt);
        }
        optionHolder.appendChild(optionLink);
        me._options.appendChild(optionHolder);
        //check for pre-selected items
        if (me.options[w].selected) {
            selectMe(me.id, w, me._number);
        }
    }
    if (me.disabled) {
        me._disabled.style.display = "block";
    }
    else {
        me._disabled.style.display = "none";
    }
}

//selecting me
function selectMe(selectFieldId, linkNo, selectNo) {
    selectField = selects[selectNo];
    for (var k = 0; k < selectField.options.length; k++) {
        if (k == linkNo) {
            selectField.options[k].selected = true;
        }
        else {
            selectField.options[k].selected = false;
        }
    }
    //show selected option
    textVar = document.getElementById("mySelectText" + selectNo);
    var newText;
    var optionSpan;
    if (selectField.options[linkNo].title.indexOf('image') != -1) {
        newText = document.createElement('img');
        newText.src = selectField.options[linkNo].title;
        optionSpan = document.createElement('span');
        optionSpan = document.createTextNode(selectField.options[linkNo].text);
    } else {
        newText = document.createTextNode(selectField.options[linkNo].text);
    }
    if (selectField.options[linkNo].title.indexOf('image') != -1) {
        if (textVar.childNodes.length > 1) textVar.removeChild(textVar.childNodes[0]);
        textVar.replaceChild(newText, textVar.childNodes[0]);
        textVar.appendChild(optionSpan);
    } else {
        if (textVar.childNodes.length > 1) textVar.removeChild(textVar.childNodes[0]);
        textVar.replaceChild(newText, textVar.childNodes[0]);
    }
    if (selectField.onchange && all_selects) {
        eval(selectField.onchange());
    }
}
//showing options
function showOptions(g) {
    _elem = document.getElementById("optionsDiv" + g);
    var divArea = document.getElementById("sarea" + g);
    if (active_select && active_select != _elem) {
        active_select.className = active_select.className.replace('optionsDivVisible', '');
        active_select.className += " optionsDivInvisible";
        active_select.style.height = "auto";
    }
    if (_elem.className.indexOf("optionsDivInvisible") != -1) {
        _elem.style.left = "-9999px";
        _elem.style.top = $(divArea).offset().top + _selectHeight + 'px';
        _elem.className = _elem.className.replace('optionsDivInvisible', '');
        _elem.className += " optionsDivVisible";
        /*if (_elem.offsetHeight > 200)
        {
        _elem.style.height = "200px";
        }*/
        _elem.style.left = $(divArea).offset().left + 'px';

        active_select = _elem;
        if (document.documentElement) {
            document.documentElement.onclick = hideSelectOptions;
        }
        else {
            window.onclick = hideSelectOptions;
        }
    }
    else if (_elem.className.indexOf("optionsDivVisible") != -1) {
        _elem.style.height = "auto";
        _elem.className = _elem.className.replace('optionsDivVisible', '');
        _elem.className += " optionsDivInvisible";
    }

    // for mouseout
    /*_elem.timer = false;
    _elem.onmouseover = function() {
    if (this.timer) clearTimeout(this.timer);
    }
    _elem.onmouseout = function() {
    var _this = this;
    this.timer = setTimeout(function(){
    _this.style.height = "auto";
    _this.className = _this.className.replace('optionsDivVisible','');
    if (_elem.className.indexOf('optionsDivInvisible') == -1)
    _this.className += " optionsDivInvisible";
    },200);
    }*/
}

function hideSelectOptions(e) {
    if (active_select) {
        if (!e) e = window.event;
        var _target = (e.target || e.srcElement);
        if (isElementBefore(_target, 'selectArea') == 0 && isElementBefore(_target, 'optionsDiv') == 0) {
            active_select.className = active_select.className.replace('optionsDivVisible', '');
            active_select.className = active_select.className.replace('optionsDivInvisible', '');
            active_select.className += " optionsDivInvisible";
            active_select = false;

            if (document.documentElement) {
                document.documentElement.onclick = function() { };
            }
            else {
                window.onclick = null;
            }
        }
    }
}

function isElementBefore(_el, _class) {
    var _parent = _el;
    do {
        _parent = _parent.parentNode;
    }
    while (_parent && _parent.className != null && _parent.className.indexOf(_class) == -1)
    if (_parent.className && _parent.className.indexOf(_class) != -1) {
        return 1;
    }
    else {
        return 0;
    }
}
function findPosY(obj) {
    var posTop = 0;
    while (obj.offsetParent) { posTop += obj.offsetTop; obj = obj.offsetParent; }
    return posTop;
}
function findPosX(obj) {
    var posLeft = 0;
    while (obj.offsetParent) { posLeft += obj.offsetLeft; obj = obj.offsetParent; }
    return posLeft;
}

// custom scrollbars script
var VSA_scrollAreas = new Array();
var VSA_default_imagesPath = "/Content/images";
var VSA_default_btnUpImage = "button-up.gif";
var VSA_default_btnDownImage = "button-down.gif";
var VSA_default_scrollStep = 5;
var VSA_default_wheelSensitivity = 10;
var VSA_default_scrollbarPosition = 'right'; //'left','right','inline';
var VSA_default_scrollButtonHeight = 19;
var VSA_default_scrollbarWidth = 20;

var VSA_resizeTimer = 2000;

function VSA_initScrollbars() {
    var scrollElements = VSA_getElements("scrollable", "DIV", document, "class");
    for (var i = 0; i < scrollElements.length; i++) {
        VSA_scrollAreas[i] = new ScrollArea(i, scrollElements[i]);
    }
}

function ScrollArea(index, elem) //constructor
{
    this.index = index;
    this.element = elem;

    var attr = this.element.getAttribute("imagesPath");
    this.imagesPath = attr ? attr : VSA_default_imagesPath;

    attr = this.element.getAttribute("btnUpImage");
    this.btnUpImage = attr ? attr : VSA_default_btnUpImage;

    attr = this.element.getAttribute("btnDownImage");
    this.btnDownImage = attr ? attr : VSA_default_btnDownImage;

    attr = Number(this.element.getAttribute("scrollStep"));
    this.scrollStep = attr ? attr : VSA_default_scrollStep;

    attr = Number(this.element.getAttribute("wheelSensitivity"));
    this.wheelSensitivity = attr ? attr : VSA_default_wheelSensitivity;

    attr = this.element.getAttribute("scrollbarPosition");
    this.scrollbarPosition = attr ? attr : VSA_default_scrollbarPosition;

    attr = this.element.getAttribute("scrollButtonHeight");
    this.scrollButtonHeight = attr ? attr : VSA_default_scrollButtonHeight;

    attr = this.element.getAttribute("scrollbarWidth");
    this.scrollbarWidth = attr ? attr : VSA_default_scrollbarWidth;

    this.scrolling = false;

    this.iOffsetY = 0;
    this.scrollHeight = 0;
    this.scrollContent = null;
    this.scrollbar = null;
    this.scrollup = null;
    this.scrolldown = null;
    this.scrollslider = null;
    this.scroll = null;
    this.enableScrollbar = false;
    this.scrollFactor = 1;
    this.scrollingLimit = 0;
    this.topPosition = 0;

    //functions declaration
    this.init = VSA_init;
    this.scrollUp = VSA_scrollUp;
    this.scrollDown = VSA_scrollDown;
    this.createScrollBar = VSA_createScrollBar;
    this.scrollIt = VSA_scrollIt;

    this.init();

}


function VSA_init() {

    this.scrollContent = document.createElement("DIV");
    this.scrollContent.style.position = "absolute";
    this.scrollContent.innerHTML = this.element.innerHTML;
    this.scrollContent.style.overflow = "hidden";

    this.scrollContent.style.width = this.element.offsetWidth + "px";
    this.scrollContent.style.height = this.element.offsetHeight + "px";


    this.element.innerHTML = "";
    this.element.style.overflow = "hidden";
    this.element.style.display = "block";
    this.element.style.visibility = "visible";
    this.element.style.position = "relative";
    this.element.appendChild(this.scrollContent);

    this.scrollContent.className = 'scroll-content';

    this.element.index = this.index;
    this.element.over = false;

    var _this = this;
    this.element.onmouseover = function() {
        _this.element.over = true;
    };
    this.element.onmouseout = function() {
        _this.element.over = false;
    }

    if (document.all) {
        this.element.onscroll = VSA_handleOnScroll;
        this.element.onresize = VSA_handleResize;
    }
    else {
        window.onresize = VSA_handleResize;
    }

    this.createScrollBar();

    if (window.addEventListener)
    /** DOMMouseScroll is for mozilla. */
        this.element.addEventListener('DOMMouseScroll', VSA_handleMouseWheel, false);
    /** IE/Opera. */
    this.element.onmousewheel = document.onmousewheel = VSA_handleMouseWheel;

}

function VSA_createScrollBar() {

    if (this.scrollbar != null) {
        this.element.removeChild(this.scrollbar);
        this.scrollbar = null;
    }

    if (this.scrollContent.scrollHeight <= this.scrollContent.offsetHeight)
        this.enableScrollbar = false;
    else if (this.element.offsetHeight > 2 * this.scrollButtonHeight)
        this.enableScrollbar = true;
    else
        this.enableScrollbar = false;

    if (this.scrollContent.scrollHeight - Math.abs(this.scrollContent.scrollTop) < this.element.offsetHeight)
        this.scrollContent.style.top = 0;

    if (this.enableScrollbar) {

        this.scrollbar = document.createElement("DIV");
        this.element.appendChild(this.scrollbar);
        this.scrollbar.style.position = "absolute";
        this.scrollbar.style.top = "0px";
        this.scrollbar.style.height = this.element.offsetHeight + "px";
        this.scrollbar.style.width = this.scrollbarWidth + "px";

        this.scrollbar.className = 'vscroll-bar';

        if (this.scrollbarWidth != this.scrollbar.offsetWidth) {
            this.scrollbarWidth = this.scrollbar.offsetHeight;
        }

        this.scrollbarWidth = this.scrollbar.offsetWidth;

        if (this.scrollbarPosition == 'left') {
            this.scrollContent.style.left = this.scrollbarWidth + 5 + "px";
            this.scrollContent.style.width = this.element.offsetWidth - this.scrollbarWidth - 5 + "px";
        }
        else if (this.scrollbarPosition == 'right') {
            this.scrollbar.style.left = this.element.offsetWidth - this.scrollbarWidth + "px";
            this.scrollContent.style.width = this.element.offsetWidth - this.scrollbarWidth - 5 + "px";
        }

        //create scroll up button
        this.scrollup = document.createElement("DIV");
        this.scrollup.index = this.index;
        this.scrollup.onmousedown = VSA_handleBtnUpMouseDown;
        this.scrollup.onmouseup = VSA_handleBtnUpMouseUp;
        this.scrollup.onmouseout = VSA_handleBtnUpMouseOut;
        this.scrollup.style.position = "absolute";
        this.scrollup.style.top = "0px";
        this.scrollup.style.left = "0px";
        this.scrollup.style.height = this.scrollButtonHeight + "px";
        this.scrollup.style.width = this.scrollbarWidth + "px";

        this.scrollup.innerHTML = '<img src="' + this.imagesPath + '/' + this.btnUpImage + '" border="0"/>';
        this.scrollbar.appendChild(this.scrollup);

        this.scrollup.className = 'vscroll-up';

        if (this.scrollButtonHeight != this.scrollup.offsetHeight) {
            this.scrollButtonHeight = this.scrollup.offsetHeight;
        }

        //create scroll down button
        this.scrolldown = document.createElement("DIV");
        this.scrolldown.index = this.index;
        this.scrolldown.onmousedown = VSA_handleBtnDownMouseDown;
        this.scrolldown.onmouseup = VSA_handleBtnDownMouseUp;
        this.scrolldown.onmouseout = VSA_handleBtnDownMouseOut;
        this.scrolldown.style.position = "absolute";
        this.scrolldown.style.left = "0px";
        this.scrolldown.style.top = this.scrollbar.offsetHeight - this.scrollButtonHeight + "px";
        this.scrolldown.style.width = this.scrollbarWidth + "px";
        this.scrolldown.innerHTML = '<img src="' + this.imagesPath + '/' + this.btnDownImage + '" border="0"/>';
        this.scrollbar.appendChild(this.scrolldown);

        this.scrolldown.className = 'vscroll-down';

        //create scroll
        this.scroll = document.createElement("DIV");
        this.scroll.index = this.index;
        this.scroll.style.position = "absolute";
        this.scroll.style.zIndex = 0;
        this.scroll.style.textAlign = "center";
        this.scroll.style.top = this.scrollButtonHeight + "px";
        this.scroll.style.left = "0px";
        this.scroll.style.width = this.scrollbarWidth + "px";

        var h = this.scrollbar.offsetHeight - 2 * this.scrollButtonHeight;
        this.scroll.style.height = ((h > 0) ? h : 0) + "px";

        this.scroll.innerHTML = '';
        this.scroll.onclick = VSA_handleScrollbarClick;
        this.scrollbar.appendChild(this.scroll);
        this.scroll.style.overflow = "hidden";

        this.scroll.className = "vscroll-line";

        //create slider
        this.scrollslider = document.createElement("DIV");
        this.scrollslider.index = this.index;
        this.scrollslider.style.position = "absolute";
        this.scrollslider.style.zIndex = 1000;
        this.scrollslider.style.textAlign = "center";
        this.scrollslider.innerHTML = '<div id="scrollslider' + this.index + '" style="padding:0;margin:0;"><div class="scroll-bar-top">&nbsp;</div><div class="scroll-bar-bottom">&nbsp;</div></div>';
        this.scrollbar.appendChild(this.scrollslider);

        this.subscrollslider = document.getElementById("scrollslider" + this.index);
        this.subscrollslider.style.height = Math.round((this.scrollContent.offsetHeight / this.scrollContent.scrollHeight) * (this.scrollbar.offsetHeight - 2 * this.scrollButtonHeight)) + "px";

        this.scrollslider.className = "vscroll-slider";

        this.scrollHeight = this.scrollbar.offsetHeight - 2 * this.scrollButtonHeight - this.scrollslider.offsetHeight;
        this.scrollFactor = (this.scrollContent.scrollHeight - this.scrollContent.offsetHeight) / this.scrollHeight;
        this.topPosition = getRealTop(this.scrollbar) + this.scrollButtonHeight;
        /* this.scrollbarHeight = this.scrollbar.offsetHeight - 2*this.scrollButtonHeight - this.scrollslider.offsetHeight; */

        this.scrollslider.style.top = 1 / this.scrollFactor * Math.abs(this.scrollContent.scrollTop) + this.scrollButtonHeight + "px";
        this.scrollslider.style.left = "0px";
        this.scrollslider.style.width = "100%";
        this.scrollslider.onmousedown = VSA_handleSliderMouseDown;
        if (document.all)
            this.scrollslider.onmouseup = VSA_handleSliderMouseUp;
    }
    else
        this.scrollContent.style.width = this.element.offsetWidth + "px";
}

function VSA_handleBtnUpMouseDown() {
    var sa = VSA_scrollAreas[this.index];
    sa.scrolling = true;
    sa.scrollUp();
}

function VSA_handleBtnUpMouseUp() {
    VSA_scrollAreas[this.index].scrolling = false;
}

function VSA_handleBtnUpMouseOut() {
    VSA_scrollAreas[this.index].scrolling = false;
}

function VSA_handleBtnDownMouseDown() {
    var sa = VSA_scrollAreas[this.index];
    sa.scrolling = true;
    sa.scrollDown();
}

function VSA_handleBtnDownMouseUp() {
    VSA_scrollAreas[this.index].scrolling = false;
}

function VSA_handleBtnDownMouseOut() {
    VSA_scrollAreas[this.index].scrolling = false;
}

function VSA_scrollIt() {
    this.scrollContent.scrollTop = this.scrollFactor * ((this.scrollslider.offsetTop + this.scrollslider.offsetHeight / 2) - this.scrollButtonHeight - this.scrollslider.offsetHeight / 2);
}

function VSA_scrollUp() {
    if (this.scrollingLimit > 0) {
        this.scrollingLimit--;
        if (this.scrollingLimit == 0) this.scrolling = false;
    }
    if (!this.scrolling) return;
    if (this.scrollContent.scrollTop - this.scrollStep > 0) {
        this.scrollContent.scrollTop -= this.scrollStep;
        this.scrollslider.style.top = 1 / this.scrollFactor * Math.abs(this.scrollContent.scrollTop) + this.scrollButtonHeight + "px";
    }
    else {
        this.scrollContent.scrollTop = "0";
        this.scrollslider.style.top = this.scrollButtonHeight + "px";
        return;
    }
    setTimeout("VSA_Ext_scrollUp(" + this.index + ")", 30);
}

function VSA_Ext_scrollUp(index) {
    VSA_scrollAreas[index].scrollUp();
}

function VSA_scrollDown() {
    if (this.scrollingLimit > 0) {
        this.scrollingLimit--;
        if (this.scrollingLimit == 0) this.scrolling = false;
    }
    if (!this.scrolling) return;


    this.scrollContent.scrollTop += this.scrollStep;
    this.scrollslider.style.top = 1 / this.scrollFactor * Math.abs(this.scrollContent.scrollTop) + this.scrollButtonHeight + "px";

    if (this.scrollContent.scrollTop >= (this.scrollContent.scrollHeight - this.scrollContent.offsetHeight)) {
        this.scrollContent.scrollTop = (this.scrollContent.scrollHeight - this.scrollContent.offsetHeight);
        this.scrollslider.style.top = this.scrollbar.offsetHeight - this.scrollButtonHeight - this.scrollslider.offsetHeight + "px";
        return;
    }

    setTimeout("VSA_Ext_scrollDown(" + this.index + ")", 30);
}

function VSA_Ext_scrollDown(index) {
    VSA_scrollAreas[index].scrollDown();
}

function VSA_handleMouseMove(evt) {
    var sa = VSA_scrollAreas[((document.all && !window.opera) ? this.index : document.documentElement.scrollAreaIndex)];
    var posy = 0;
    if (!evt) var evt = window.event;

    if (evt.pageY)
        posy = evt.pageY;
    else if (evt.clientY)
        posy = evt.clientY;

    if (document.all && !window.opera) {
        posy += document.documentElement.scrollTop;
    }

    var iNewY = posy - sa.iOffsetY - getRealTop(sa.scrollbar);
    iNewY += sa.scrollButtonHeight;

    if (iNewY < sa.scrollButtonHeight)
        iNewY = sa.scrollButtonHeight;
    if (iNewY > (sa.scrollbar.offsetHeight - sa.scrollButtonHeight) - sa.scrollslider.offsetHeight)
        iNewY = (sa.scrollbar.offsetHeight - sa.scrollButtonHeight) - sa.scrollslider.offsetHeight;

    sa.scrollslider.style.top = iNewY + "px";

    sa.scrollIt();
}

function VSA_handleSliderMouseDown(evt) {
    if (!(document.uniqueID && document.compatMode && !window.XMLHttpRequest)) {
        document.onselectstart = function() { return false; }
        document.onmousedown = function() { return false; }
    }

    var sa = VSA_scrollAreas[this.index];
    if (document.all && !window.opera) {
        sa.scrollslider.setCapture()
        sa.iOffsetY = event.offsetY;
        sa.scrollslider.onmousemove = VSA_handleMouseMove;
    }
    else {
        if (window.opera) {
            sa.iOffsetY = event.offsetY;
        }
        else {
            sa.iOffsetY = evt.layerY;
        }
        document.documentElement.scrollAreaIndex = sa.index;
        document.documentElement.addEventListener("mousemove", VSA_handleMouseMove, true);
        document.documentElement.addEventListener("mouseup", VSA_handleSliderMouseUp, true);
    }
    return false;
}

function VSA_handleSliderMouseUp() {
    if (!(document.uniqueID && document.compatMode && !window.XMLHttpRequest)) {
        document.onmousedown = null;
        document.onselectstart = null;
    }

    if (document.all && !window.opera) {
        var sa = VSA_scrollAreas[this.index];
        sa.scrollslider.onmousemove = null;
        sa.scrollslider.releaseCapture();
        sa.scrollIt();
    }
    else {
        var sa = VSA_scrollAreas[document.documentElement.scrollAreaIndex];
        document.documentElement.removeEventListener("mousemove", VSA_handleMouseMove, true);
        document.documentElement.removeEventListener("mouseup", VSA_handleSliderMouseUp, true);
        sa.scrollIt();
    }
    return false;
}

function VSA_handleResize() {
    if (VSA_resizeTimer) {
        clearTimeout(VSA_resizeTimer);
        VSA_resizeTimer = 0;
    }
    VSA_resizeTimer = setTimeout("VSA_performResizeEvent()", 100);
}

function VSA_performResizeEvent() {
    for (var i = 0; i < VSA_scrollAreas.length; i++)
        VSA_scrollAreas[i].createScrollBar();
}
function VSA_handleMouseWheel(event) {
    if (this.index != null) {
        var sa = VSA_scrollAreas[this.index];

        if (sa.scrollbar == null) return;
        sa.scrolling = true;
        sa.scrollingLimit = sa.wheelSensitivity;

        var delta = 0;
        if (!event) /* For IE. */
            event = window.event;
        if (event.wheelDelta) { /* IE/Opera. */
            delta = event.wheelDelta / 120;

            /*if (window.opera)
            delta = -delta;*/
        } else if (event.detail) { /** Mozilla case. */
            delta = -event.detail / 3;
        }
        if (delta && sa.element.over) {
            if (delta > 0) sa.scrollUp();
            else sa.scrollDown();
            if (event.preventDefault) event.preventDefault();
            event.returnValue = false;
        }
    }
}

function VSA_handleSelectStart() {
    event.returnValue = false;
}

function VSA_handleScrollbarClick(evt) {
    var sa = VSA_scrollAreas[this.index];
    var offsetY = (document.all ? event.offsetY : evt.layerY);

    if (offsetY < (sa.scrollButtonHeight + sa.scrollslider.offsetHeight / 2))
        sa.scrollslider.style.top = sa.scrollButtonHeight + "px";
    else if (offsetY > (sa.scrollbar.offsetHeight - sa.scrollButtonHeight - sa.scrollslider.offsetHeight))
        sa.scrollslider.style.top = sa.scrollbar.offsetHeight - sa.scrollButtonHeight - sa.scrollslider.offsetHeight + "px";
    else {
        sa.scrollslider.style.top = offsetY + sa.scrollButtonHeight - sa.scrollslider.offsetHeight / 2 + "px";
    }
    sa.scrollIt();
}

function VSA_handleOnScroll() {
    //event.srcElement.doScroll("pageUp");
}

//--- common functions ----

function VSA_getElements(attrValue, tagName, ownerNode, attrName) //get Elements By Attribute Name
{
    if (!tagName) tagName = "*";
    if (!ownerNode) ownerNode = document;
    if (!attrName) attrName = "name";
    var result = [];
    var nl = ownerNode.getElementsByTagName(tagName);
    for (var i = 0; i < nl.length; i++) {
        //	if (nl.item(i).getAttribute(attrName) == attrValue)
        //		result.push(nl.item(i));
        if (nl.item(i).className.indexOf(attrValue) != -1)
            result.push(nl.item(i));
    }
    return result;
}

var _ie = false;
if (navigator.userAgent.toLowerCase().indexOf("msie") != -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1) _ie = true;

function getRealTop(elem) {
    if (_ie) {
        var nTop = 0;
        if (elem) {
            do {
                nTop += elem.offsetTop - elem.scrollTop;
                elem = elem.offsetParent;
            }
            while (elem)
        }
        return nTop;
    }
    else {
        var posTop = 0;
        while (elem.offsetParent) {
            posTop += elem.offsetTop;
            elem = elem.offsetParent;
        }
        var _res = new Object();
        return posTop;
    }
}


/*submitting forms*/
// error class adding
function addError(_obj) {
    _obj.parent().addClass( 'error-validation');
}

/*
* TableSorter 2.0 - Client-side table sorting with ease!
* Version 2.0.3
*/
(function($) { $.extend({ tablesorter: new function() { var parsers = [], widgets = []; this.defaults = { cssHeader: "header", cssAsc: "headerSortUp", cssDesc: "headerSortDown", sortInitialOrder: "asc", sortMultiSortKey: "shiftKey", sortForce: null, sortAppend: null, textExtraction: "simple", parsers: {}, widgets: [], widgetZebra: { css: ["even", "odd"] }, headers: {}, widthFixed: false, cancelSelection: true, sortList: [], headerList: [], dateFormat: "us", decimal: '.', debug: false }; function benchmark(s, d) { log(s + "," + (new Date().getTime() - d.getTime()) + "ms"); } this.benchmark = benchmark; function log(s) { if (typeof console != "undefined" && typeof console.debug != "undefined") { console.log(s); } else { alert(s); } } function buildParserCache(table, $headers) { if (table.config.debug) { var parsersDebug = ""; } var rows = table.tBodies[0].rows; if (table.tBodies[0].rows[0]) { var list = [], cells = rows[0].cells, l = cells.length; for (var i = 0; i < l; i++) { var p = false; if ($.metadata && ($($headers[i]).metadata() && $($headers[i]).metadata().sorter)) { p = getParserById($($headers[i]).metadata().sorter); } else if ((table.config.headers[i] && table.config.headers[i].sorter)) { p = getParserById(table.config.headers[i].sorter); } if (!p) { p = detectParserForColumn(table, cells[i]); } if (table.config.debug) { parsersDebug += "column:" + i + " parser:" + p.id + "\n"; } list.push(p); } } if (table.config.debug) { log(parsersDebug); } return list; }; function detectParserForColumn(table, node) { var l = parsers.length; for (var i = 1; i < l; i++) { if (parsers[i].is($.trim(getElementText(table.config, node)), table, node)) { return parsers[i]; } } return parsers[0]; } function getParserById(name) { var l = parsers.length; for (var i = 0; i < l; i++) { if (parsers[i].id.toLowerCase() == name.toLowerCase()) { return parsers[i]; } } return false; } function buildCache(table) { if (table.config.debug) { var cacheTime = new Date(); } var totalRows = (table.tBodies[0] && table.tBodies[0].rows.length) || 0, totalCells = (table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length) || 0, parsers = table.config.parsers, cache = { row: [], normalized: [] }; for (var i = 0; i < totalRows; ++i) { var c = table.tBodies[0].rows[i], cols = []; cache.row.push($(c)); for (var j = 0; j < totalCells; ++j) { cols.push(parsers[j].format(getElementText(table.config, c.cells[j]), table, c.cells[j])); } cols.push(i); cache.normalized.push(cols); cols = null; }; if (table.config.debug) { benchmark("Building cache for " + totalRows + " rows:", cacheTime); } return cache; }; function getElementText(config, node) { if (!node) return ""; var t = ""; if (config.textExtraction == "simple") { if (node.childNodes[0] && node.childNodes[0].hasChildNodes()) { t = node.childNodes[0].innerHTML; } else { t = node.innerHTML; } } else { if (typeof (config.textExtraction) == "function") { t = config.textExtraction(node); } else { t = $(node).text(); } } return t; } function appendToTable(table, cache) { if (table.config.debug) { var appendTime = new Date() } var c = cache, r = c.row, n = c.normalized, totalRows = n.length, checkCell = (n[0].length - 1), tableBody = $(table.tBodies[0]), rows = []; for (var i = 0; i < totalRows; i++) { rows.push(r[n[i][checkCell]]); if (!table.config.appender) { var o = r[n[i][checkCell]]; var l = o.length; for (var j = 0; j < l; j++) { tableBody[0].appendChild(o[j]); } } } if (table.config.appender) { table.config.appender(table, rows); } rows = null; if (table.config.debug) { benchmark("Rebuilt table:", appendTime); } applyWidget(table); setTimeout(function() { $(table).trigger("sortEnd"); }, 0); }; function buildHeaders(table) { if (table.config.debug) { var time = new Date(); } var meta = ($.metadata) ? true : false, tableHeadersRows = []; for (var i = 0; i < table.tHead.rows.length; i++) { tableHeadersRows[i] = 0; }; $tableHeaders = $("thead th", table); $tableHeaders.each(function(index) { this.count = 0; this.column = index; this.order = formatSortingOrder(table.config.sortInitialOrder); if (checkHeaderMetadata(this) || checkHeaderOptions(table, index)) this.sortDisabled = true; if (!this.sortDisabled) { $(this).addClass(table.config.cssHeader); } table.config.headerList[index] = this; }); if (table.config.debug) { benchmark("Built headers:", time); log($tableHeaders); } return $tableHeaders; }; function checkCellColSpan(table, rows, row) { var arr = [], r = table.tHead.rows, c = r[row].cells; for (var i = 0; i < c.length; i++) { var cell = c[i]; if (cell.colSpan > 1) { arr = arr.concat(checkCellColSpan(table, headerArr, row++)); } else { if (table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row + 1])) { arr.push(cell); } } } return arr; }; function checkHeaderMetadata(cell) { if (($.metadata) && ($(cell).metadata().sorter === false)) { return true; }; return false; } function checkHeaderOptions(table, i) { if ((table.config.headers[i]) && (table.config.headers[i].sorter === false)) { return true; }; return false; } function applyWidget(table) { var c = table.config.widgets; var l = c.length; for (var i = 0; i < l; i++) { getWidgetById(c[i]).format(table); } } function getWidgetById(name) { var l = widgets.length; for (var i = 0; i < l; i++) { if (widgets[i].id.toLowerCase() == name.toLowerCase()) { return widgets[i]; } } }; function formatSortingOrder(v) { if (typeof (v) != "Number") { i = (v.toLowerCase() == "desc") ? 1 : 0; } else { i = (v == (0 || 1)) ? v : 0; } return i; } function isValueInArray(v, a) { var l = a.length; for (var i = 0; i < l; i++) { if (a[i][0] == v) { return true; } } return false; } function setHeadersCss(table, $headers, list, css) { $headers.removeClass(css[0]).removeClass(css[1]); var h = []; $headers.each(function(offset) { if (!this.sortDisabled) { h[this.column] = $(this); } }); var l = list.length; for (var i = 0; i < l; i++) { h[list[i][0]].addClass(css[list[i][1]]); } } function fixColumnWidth(table, $headers) { var c = table.config; if (c.widthFixed) { var colgroup = $('<colgroup>'); $("tr:first td", table.tBodies[0]).each(function() { colgroup.append($('<col>').css('width', $(this).width())); }); $(table).prepend(colgroup); }; } function updateHeaderSortCount(table, sortList) { var c = table.config, l = sortList.length; for (var i = 0; i < l; i++) { var s = sortList[i], o = c.headerList[s[0]]; o.count = s[1]; o.count++; } } function multisort(table, sortList, cache) { if (table.config.debug) { var sortTime = new Date(); } var dynamicExp = "var sortWrapper = function(a,b) {", l = sortList.length; for (var i = 0; i < l; i++) { var c = sortList[i][0]; var order = sortList[i][1]; var s = (getCachedSortType(table.config.parsers, c) == "text") ? ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ? "sortNumeric" : "sortNumericDesc"); var e = "e" + i; dynamicExp += "var " + e + " = " + s + "(a[" + c + "],b[" + c + "]); "; dynamicExp += "if(" + e + ") { return " + e + "; } "; dynamicExp += "else { "; } var orgOrderCol = cache.normalized[0].length - 1; dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];"; for (var i = 0; i < l; i++) { dynamicExp += "}; "; } dynamicExp += "return 0; "; dynamicExp += "}; "; eval(dynamicExp); cache.normalized.sort(sortWrapper); if (table.config.debug) { benchmark("Sorting on " + sortList.toString() + " and dir " + order + " time:", sortTime); } return cache; }; function sortText(a, b) { return ((a < b) ? -1 : ((a > b) ? 1 : 0)); }; function sortTextDesc(a, b) { return ((b < a) ? -1 : ((b > a) ? 1 : 0)); }; function sortNumeric(a, b) { return a - b; }; function sortNumericDesc(a, b) { return b - a; }; function getCachedSortType(parsers, i) { return parsers[i].type; }; this.construct = function(settings) { return this.each(function() { if (!this.tHead || !this.tBodies) return; var $this, $document, $headers, cache, config, shiftDown = 0, sortOrder; this.config = {}; config = $.extend(this.config, $.tablesorter.defaults, settings); $this = $(this); $headers = buildHeaders(this); this.config.parsers = buildParserCache(this, $headers); cache = buildCache(this); var sortCSS = [config.cssDesc, config.cssAsc]; fixColumnWidth(this); $headers.click(function(e) { $this.trigger("sortStart"); var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0; if (!this.sortDisabled && totalRows > 0) { var $cell = $(this); var i = this.column; this.order = this.count++ % 2; if (!e[config.sortMultiSortKey]) { config.sortList = []; if (config.sortForce != null) { var a = config.sortForce; for (var j = 0; j < a.length; j++) { if (a[j][0] != i) { config.sortList.push(a[j]); } } } config.sortList.push([i, this.order]); } else { if (isValueInArray(i, config.sortList)) { for (var j = 0; j < config.sortList.length; j++) { var s = config.sortList[j], o = config.headerList[s[0]]; if (s[0] == i) { o.count = s[1]; o.count++; s[1] = o.count % 2; } } } else { config.sortList.push([i, this.order]); } }; setTimeout(function() { setHeadersCss($this[0], $headers, config.sortList, sortCSS); appendToTable($this[0], multisort($this[0], config.sortList, cache)); }, 1); return false; } }).mousedown(function() { if (config.cancelSelection) { this.onselectstart = function() { return false }; return false; } }); $this.bind("update", function() { this.config.parsers = buildParserCache(this, $headers); cache = buildCache(this); }).bind("sorton", function(e, list) { $(this).trigger("sortStart"); config.sortList = list; var sortList = config.sortList; updateHeaderSortCount(this, sortList); setHeadersCss(this, $headers, sortList, sortCSS); appendToTable(this, multisort(this, sortList, cache)); }).bind("appendCache", function() { appendToTable(this, cache); }).bind("applyWidgetId", function(e, id) { getWidgetById(id).format(this); }).bind("applyWidgets", function() { applyWidget(this); }); if ($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) { config.sortList = $(this).metadata().sortlist; } if (config.sortList.length > 0) { $this.trigger("sorton", [config.sortList]); } applyWidget(this); }); }; this.addParser = function(parser) { var l = parsers.length, a = true; for (var i = 0; i < l; i++) { if (parsers[i].id.toLowerCase() == parser.id.toLowerCase()) { a = false; } } if (a) { parsers.push(parser); }; }; this.addWidget = function(widget) { widgets.push(widget); }; this.formatFloat = function(s) { var i = parseFloat(s); return (isNaN(i)) ? 0 : i; }; this.formatInt = function(s) { var i = parseInt(s); return (isNaN(i)) ? 0 : i; }; this.isDigit = function(s, config) { var DECIMAL = '\\' + config.decimal; var exp = '/(^[+]?0(' + DECIMAL + '0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)' + DECIMAL + '(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*' + DECIMAL + '0+$)/'; return RegExp(exp).test($.trim(s)); }; this.clearTableBody = function(table) { if ($.browser.msie) { function empty() { while (this.firstChild) this.removeChild(this.firstChild); } empty.apply(table.tBodies[0]); } else { table.tBodies[0].innerHTML = ""; } }; } }); $.fn.extend({ tablesorter: $.tablesorter.construct }); var ts = $.tablesorter; ts.addParser({ id: "text", is: function(s) { return true; }, format: function(s) { return $.trim(s.toLowerCase()); }, type: "text" }); ts.addParser({ id: "digit", is: function(s, table) { var c = table.config; return $.tablesorter.isDigit(s, c); }, format: function(s) { return $.tablesorter.formatFloat(s); }, type: "numeric" }); ts.addParser({ id: "currency", is: function(s) { return /^[?$ˆ?.]/.test(s); }, format: function(s) { return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g), "")); }, type: "numeric" }); ts.addParser({ id: "ipAddress", is: function(s) { return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s); }, format: function(s) { var a = s.split("."), r = "", l = a.length; for (var i = 0; i < l; i++) { var item = a[i]; if (item.length == 2) { r += "0" + item; } else { r += item; } } return $.tablesorter.formatFloat(r); }, type: "numeric" }); ts.addParser({ id: "url", is: function(s) { return /^(https?|ftp|file):\/\/$/.test(s); }, format: function(s) { return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//), '')); }, type: "text" }); ts.addParser({ id: "isoDate", is: function(s) { return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s); }, format: function(s) { return $.tablesorter.formatFloat((s != "") ? new Date(s.replace(new RegExp(/-/g), "/")).getTime() : "0"); }, type: "numeric" }); ts.addParser({ id: "percent", is: function(s) { return /\%$/.test($.trim(s)); }, format: function(s) { return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g), "")); }, type: "numeric" }); ts.addParser({ id: "usLongDate", is: function(s) { return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/)); }, format: function(s) { return $.tablesorter.formatFloat(new Date(s).getTime()); }, type: "numeric" }); ts.addParser({ id: "shortDate", is: function(s) { return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s); }, format: function(s, table) { var c = table.config; s = s.replace(/\-/g, "/"); if (c.dateFormat == "us") { s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2"); } else if (c.dateFormat == "uk") { s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1"); } else if (c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") { s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3"); } return $.tablesorter.formatFloat(new Date(s).getTime()); }, type: "numeric" }); ts.addParser({ id: "time", is: function(s) { return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s); }, format: function(s) { return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime()); }, type: "numeric" }); ts.addParser({ id: "metadata", is: function(s) { return false; }, format: function(s, table, cell) { var c = table.config, p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName; return $(cell).metadata()[p]; }, type: "numeric" }); ts.addWidget({ id: "zebra", format: function(table) { if (table.config.debug) { var time = new Date(); } $("tr:visible", table.tBodies[0]).filter(':even').removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0]).end().filter(':odd').removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]); if (table.config.debug) { $.tablesorter.benchmark("Applying Zebra widget", time); } } }); })(jQuery);
