﻿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() {
    $('.datalist').processDataList();
    var qb = $('.querybox.default');
    qb.val(qb.attr('title'));
    qb.focus(function() {
        if ($(this).hasClass('.querybox.default')) {
            $(this).val('');
            $(this).removeClass('default');
        }
    });
    qb.blur(function() {
        if (!$(this).val().length) {
            $(this).addClass('default');
            $(this).val($(this).attr('title'));
        }
    });
    qb.keypress(function(ev) {
        if (ev.which == 13) {//enter
            if ($(ev.target).data('enterpush') != null) {
                $(ev.target).data('enterpush')();
            }

            return false;
        }
    });



    //corners for footer
    if (!$.support.style) {
        $('<div id="left"></div>').appendTo('#footer');
        $('<div id="right"></div>').appendTo('#footer');
    }
});

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');
        //        $(this.buttonid).click(createDelegate(this, function() {
        //            var pageInfo = this.getPageInfo();
        //            pageInfo.SortBy = null;
        //            pageInfo.SortDirection = false;
        //            $(this.listid + ' thead th.sorter').removeClass('desc').removeClass('asc');
        //            this.runQuery(0);
        //        }));
        $(this.formid).submit(createDelegate(this, 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;
        }));
        $(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);
        }));
    },
    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('');
                        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":
                            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;
}

function MenuSelection() {
    var controller = document.location.href.split('/');

    // array of links
    var link = $('#menu ul li a');
    var cnt = 0;
    for (i = 0; i < link.length; i++) {
        var lnk = link[i].href.toLowerCase();
        if (lnk.indexOf(controller[3].toLowerCase()) > -1) {
            cnt++;
        }
    }
    
    //select clicked menu item 
    for (i = 0; i < link.length; i++) {
        var lnk = link[i].href.toLowerCase();
        if (cnt > 1) {

            if (controller.length > 5) {
                if (lnk.indexOf(controller[3].toLowerCase()) > -1 && lnk.indexOf(controller[4].toLowerCase()) > -1 && lnk.indexOf(controller[5].toLowerCase()) > -1) { link[i].className = 'selected'; return; }
            }
            else if (controller.length > 4) {
                if (lnk.indexOf(controller[3].toLowerCase()) > -1 && lnk.indexOf(controller[4].toLowerCase()) > -1) { link[i].className = 'selected'; return; }
            }
        }
        else if (cnt == 1) {
            if (lnk.indexOf(controller[3].toLowerCase()) > -1) { link[i].className = 'selected'; return; }
        }
        else
        //remove css
            link[i].className = '';
    }
}