﻿var validatorDefaults =
{
    errorPlacement: function(error, element) {
        if (error.html().length > 0) {
            //error.appendTo($('<li/>').appendTo('#messagebox'));            
            error.appendTo('#messagebox');
        }
    },
    highlight: function(element, errorClass) {
        if (element.tagName.toUpperCase() == "INPUT" && element.type.toUpperCase() == "RADIO") {
            var name = element.name;
            var elements = $('input[name=' + name + ']');
            elements.each(function(index, item) {
                $(element.form).find(".inputlist label[for=" + item.id + "]").addClass('highlightlabel');
            });
        }
        else
            $(element).addClass(errorClass);
    },
    unhighlight: function(element, errorClass) {
        if (element.tagName.toUpperCase() == "INPUT" && element.type.toUpperCase() == "RADIO") {
            var name = element.name;
            var elements = $('input[name=' + name + ']');
            elements.each(function(index, item) {
                $(element.form).find(".inputlist label[for=" + item.id + "]").removeClass('highlightlabel');
            });
        }
        else
            $(element).removeClass(errorClass);
    },
    errorContainer: "#messagebox, #errorHeading",
    errorClass: "input-validation-error"
}

$.validator.messages.required = "";

function CancelClick(action, url) {
    var regex = new RegExp("(/\\d+[/]?)", "gi");
    var results = url.match(regex);
    if (results)
        document.location.href = "../" + action;
    else
        document.location.href = action;
}

function showFeedback(title, message, buttonList) {
    var feedback = $('#feedback');
    if (feedback.length == 0) {
        feedback = $('<div id="feedback"></div>');
        feedback.appendTo('body');
    }

    $('#feedback').html(message);
    $('#feedback').dialog({ width: 400, resizable:false, closeOnEscape: false, modal: true, title: title, buttons: buttonList });
}

$.fn.processDataList = function() {
    $.each(this, function(i, table) {
        table = $(table);
        if (table.attr('tagName') != 'TABLE') {
            if (table.find('table').length > 0)
                table = table.find('table');
            else
                return this;
        }

        var cols = table.find('col');
        $.each(cols, function(index, col) {
            var align = $(col).attr('align');

            if (align) {
                var rows = table.find('tr');
                $.each(rows, function(i, p) {
                    $(p).children('th:eq(' + index + ')').addClass(align);
                    $(p).children('td:eq(' + index + ')').addClass(align);
                });
            }
        });

        table.find('tbody tr:odd').addClass('odd');
    });

    return this;
}

var _tmplCache = {}

parseTemplate = function(str, data) {
    var err = "";
    try {
        var func = _tmplCache[str];
        if (!func) {
            var strFunc =
            "var p=[],print=function(){p.push.apply(p,arguments);};" +
                        "with(obj){p.push('" +

            str.replace(/[\r\t\n]/g, " ")
               .replace(/'(?=[^#]*#>)/g, "\t")
               .split("'").join("\\'")
               .split("\t").join("'")
               .replace(/<#=(.+?)#>/g, "',$1,'")
               .split("<#").join("');")
               .split("#>").join("p.push('")
               + "');}return p.join('');";

            func = new Function("obj", strFunc);
            _tmplCache[str] = func;
        }
        return func(data);
    } catch (e) { return "< # ERROR: " + e.message + " # >"; }
}



function checkJsonResponse(data, options) {
    if (!data && data.Response && data.Message)
        return false;

    if (data.Response == "Redirect") {
        document.location.href = data.Data;
        return false;
    }

    if (options.showErrors && data.Response.toLowerCase() == "error") {
        if (options.showInDialog) {
            //do dialog code
        }
        else {
            if (options.writeTo) {
                options.writeTo.html(data.Message);
                options.writeTo.show();
            }
            if (options.alert) {
                alert(data.Message);
            }
        }

        return false;
    }

    return true;
}

function createDelegate(obj, method) {
    return function() { return method.apply(obj, arguments) };
}

function listManager(listid, formid, /*query, */rowTemplate, postPath, pageSize, maxPages, runQueryCallback) {
    this.listid = listid;
    this.maxPages = maxPages;
    this.formid = formid;
    this.list = $(listid);
    //this.query = query;
    this.rowTemplate = rowTemplate;
    this.postPath = postPath;
    this.runQueryCallback = runQueryCallback;
    this.pagetemplate = null;
    this.list.hide();
    this.firstSubmit = true;

    this.list.data('pageInfo', { PageSize: pageSize, PageIndex: 0, TotalItems: null, SortBy: null, SortDirection: false });
    this.init();
    
}

listManager.prototype = {
    init: function() {
        $.get('/scripts/pagingtemplate.htm', null, createDelegate(this, function(data) {
            this.pagetemplate = data;
            //alert(data);
        }), 'text');

        var explicitButtons = $(this.formid).find('.ajaxsubmit');
        var call;
        if (explicitButtons.length)
            explicitButtons.click(createDelegate(this, this.createFormHandler));
        else
            $(this.formid).submit(createDelegate(this, this.createFormHandler));

        $(this.listid + ' th.sorter').click(createDelegate(this, function(ev) {
            if ($(this.listid + ' tbody tr').length == 0)
                return;
            $(this.listid + ' thead th.sorter').removeClass('desc').removeClass('asc');
            var target = $(ev.target);
            var sortBy = target.attr('id').split('_')[1];
            var pageInfo = this.getPageInfo();
            if (pageInfo.SortBy == sortBy || pageInfo.sortBy == null) {
                if (pageInfo.SortDirection = !pageInfo.SortDirection)
                    target.addClass('desc');
                else
                    target.addClass('asc');
            }
            pageInfo.SortBy = sortBy;
            this.list.data('pageInfo', pageInfo);
            this.runQuery(pageInfo.PageIndex);
        }));
    },
    createFormHandler: function() {
        var pageInfo = this.getPageInfo();
        pageInfo.SortBy = null;
        pageInfo.SortDirection = false;
        $(this.listid + ' thead th.sorter').removeClass('desc').removeClass('asc');
        var val;
        if (this.firstSubmit && (val = document.location.hash) && val.length > 1) {
            val = val.substring(1);
            val = parseInt(val);
            if (!isNaN(val))
                this.runQuery(val - 1);
            else
                this.runQuery(0);
        }
        else
            this.runQuery(0);
        this.firstSubmit = false;
        return false;
    },
    getPageInfo: function() {
        var pageInfo = this.list.data('pageInfo');
        return pageInfo;
    },
    runQuery: function(pageIndex) {
        var pageInfo = this.list.data('pageInfo');
        pageInfo.PageIndex = pageIndex;
        var postData = { pageSize: pageInfo.PageSize, pageIndex: pageInfo.PageIndex, totalItems: pageInfo.TotalItems, sortBy: pageInfo.SortBy, sortDirection: pageInfo.SortDirection };

        //        for (p in this.query) {
        //            var field = $('#' + p);
        //            if (field.hasClass('.querybox.default') && field.val() == field.attr('title'))
        //                postData[p] = '';
        //            else
        //                postData[p] = field.val();
        //        }
        $.extend(postData, constructFormPost($(this.formid)));

        $.post(this.postPath, postData,
                createDelegate(this, function(data) {
                    pageInfo = data.Data.PageInfo;
                    results = data.Data.Data;
                    try {
                        this.list.data('pageInfo', pageInfo);
                        this.list.show();
                        if (pageInfo.PageIndex > 0 && results.length == 0) {
                            this.runQuery(pageInfo.PageIndex - 1);
                            return;
                        }
                        else {
                            if (results.length == 0) {
                                $(this.listid + ' tbody').html('');
                                $(this.listid + ' tfoot td').html('No results found.');
                                return;
                            }
                        }

                        var rowTemplate = this.rowTemplate.html();

                        var rows = [];
                        $.each(results, function(i, item) {
                            var row = $(parseTemplate(rowTemplate, item));
                            rows[rows.length] = row;
                        });

                        $(this.listid + ' tbody').html('');
                        $.each(rows, createDelegate(this, function(i, item) {
                            item.appendTo(this.listid + ' tbody');
                        }));
                        //paging
                        pageCount = parseInt(pageInfo.TotalItems / pageInfo.PageSize) + (pageInfo.TotalItems % pageInfo.PageSize > 0 ? 1 : 0);
                        
                        if (pageCount > this.maxPages)
                            pageCount = this.maxPages;

                        endIndex = (pageInfo.PageSize * pageInfo.PageIndex) + pageInfo.PageSize;

                        if (endIndex > pageInfo.TotalItems)
                            endIndex = pageInfo.TotalItems;

                        var pagerInfo = {
                            pageIndex: pageInfo.PageIndex,
                            startIndex: (pageInfo.PageSize * pageInfo.PageIndex) + 1,
                            endIndex: endIndex,
                            pageCount: pageCount,
                            totalCount: pageInfo.TotalItems > (pageCount * pageInfo.PageSize) ? (pageCount * pageInfo.PageSize) : pageInfo.TotalItems
                        };

                        $(this.listid + ' tfoot td').html('');
                        if (pageCount > 1) {
                            var footerSrc = parseTemplate(this.pagetemplate, pagerInfo);
                            var pageHtml = $(footerSrc).appendTo(this.listid + ' tfoot td');

                            $(this.listid + ' tfoot ul a').click(createDelegate(this, function(ev) {
                                var pageIndex = parseInt($(ev.target).html());
                                pageIndex--;

                                this.runQuery(pageIndex);
                            }));
                            $(this.listid + ' tfoot a.link').click(createDelegate(this, function(ev) {
                                var pageInfo = $(this.listid).data('pageInfo');
                                if ($(ev.target).html().toLowerCase().indexOf('back') > -1)
                                    this.runQuery(pageInfo.PageIndex - 1);
                                if ($(ev.target).html().toLowerCase().indexOf('next') > -1)
                                    this.runQuery(pageInfo.PageIndex + 1);
                            }));
                        }
                    }
                    finally {
                        if (this.runQueryCallback != null)
                            this.runQueryCallback();
                    }
                }), 'json');
    }
}

/**********************/

$.fn.fillSelect = function(data) {
    return this.clearSelect().each(function() {
        if (this.tagName == 'SELECT') {
            var dropdownList = this;

            $.each(data, function(index, optionData) {
                var option = new Option(optionData.Text, optionData.Value);
                if ($.browser.msie) {
                    dropdownList.add(option);
                }
                else {
                    dropdownList.add(option, null);
                }
            });
        }
    });
}

$.fn.clearSelect = function() {
    return this.each(function() {
        if (this.tagName == 'SELECT')
            this.options.length = 0;
    });
}

/************************/

function constructFormPost(form) {
    var elements = form.find('input, select, textarea');
    var postData = {};

    $.each(elements, function(i, item) {
        var name = $(item).attr('name');
        if (postData[name])
            return;

        var selector = '*[name=' + name + ']';
        result = form.find(selector);
        if (!result.length)
            return;

        var value = [];
        $.each(result, function(x, xitem) {
            switch (xitem.tagName.toLowerCase()) {
                case "input":
                    switch (xitem.type.toLowerCase()) {
                        case "radio":
                            if (xitem.checked)
                                value[value.length] = $(xitem).val();
                            break;
                        case "checkbox":
                            if (xitem.checked)
                                value[value.length] = $(xitem).val();
                            break;
                        case "hidden":
                            value[value.length] = $(xitem).val();
                            break;
                        case "text":
                            if ($(xitem).hasClass('querybox') && $(xitem).attr('title') == $(xitem).val())
                                break;
                            value[value.length] = $(xitem).val();
                            break;
                        case "password":
                            value[value.length] = $(xitem).val();
                            break;
                        case "file":
                            return;
                    }
                    break;
                case "select":
                    var options = $(xitem).find('option:selected');
                    $.each(options, function(z, zitem) {
                        value[value.length] = $(zitem).val();
                    });
                    break;
                case "textarea":
                    value[value.length] = $(xitem).val();
                    break;
                default:
                    return;
            }

        });

        if (!value.length)
            return;

        //value = value.join(',');
        postData[name] = value;
    });

    return postData;
}

jQuery.fn.queryBox = function(settings) {
    $ = jQuery;
    settings = $.extend({
        valueAttribute: 'title',
        defaultStateClass: 'default',
        blockEnter: false,
        blockEnterFunc: null
    }, settings);

    $.each(this, function(i, item) {
        if ($(item).val().length && $(item).val() != $(item).attr(settings.valueAttribute))
            $(item).removeClass(settings.defaultStateClass);
        else
            $(item).val($(item).attr(settings.valueAttribute));
    });

    this.focus(function() {
        if ($(this).hasClass(settings.defaultStateClass)) {
            $(this).val('');
            $(this).removeClass(settings.defaultStateClass);
        }
    });

    this.blur(function() {
        if (!$(this).val().length) {
            $(this).addClass(settings.defaultStateClass);
            $(this).val($(this).attr(settings.valueAttribute));
        }
    });

    if (settings.blockEnter)
        this.keypress(function(ev) {
            if (ev.which == 13) {//enter key
                if (settings.blockEnterFunc)
                    appUtil.createDelegate(this, settings.blockEnterFunc)();

                return false;
            }
        });
};

function printPage() {
    window.print();
}
