﻿
//顺序依次执行。 a 是数据，index是要开始执行的元素，一般0 开始。 f 是要执行的函数。 f 要求2个参数，1是元素，2是回调callback.
//如果f里面ok了，继续下一个就 callback()，如果要终止就callback(true);
//finish 是所有元素遍历完了的回调。
String.prototype.GetUrlParVal = function(para) {
    var reg = new RegExp("(^|&)" + para + "=([^&]*)(&|$)");
    var r = this.substr(this.indexOf("\?") + 1).replace(/&amp;/gi, "&").match(reg); 
    if (r != null) return unescape(r[2]); return null;
}

$.OrderExec = function(a, f, index, finish) {
    if (index < a.size())
        f(a.slice(index, index + 1), function(end) { if (end) finish(); else  $.OrderExec(a, f, index + 1, finish); });
    else finish();
}


$.getResponse = function(data) {
    var err = false;
    try {
        var r = (eval("(" + data + ")"));

    }
    catch (e) {
        err = true;
    }
    if (err || (!r.OK)) {

        //var dialog = 
        if (r) alert(r.Message);
        else if (data.indexOf("window.open( '/Account/Login');") >= 0)
            $("<div />").html(data);
        else alert(data);
        //if (dialog)
        //if ($.fn.dialog)
        //d.dialog();
        if (!err) {
            return r;
        } else return null;
    } else return r;
}

$.fn.showIndicator = function(small) {
    return this.each(function() {
        var img = small ? 'indicator_s.gif' : 'indicator.gif';
        $('<img src=/Content/Images/' + img + '>').addClass('indicator').appendTo(this);
    });
}

$.fn.onLookup = function(data) {
    alert(data);
}

$.fn.smartLookup = function(p) {
    return this.each(function() {
        var id = $(this).attr("id");
        $("#" + id + " input[f=" + p.keyField + "]").bind("keyup.lookup", function(event) {
            if (event.keyCode == 27) $(p.from).hide();
            else {
                $(p.from).css("left", $(this).offset().left);
                $(p.from).css("top", $(this).offset().top + $(this).height + 1);
                $(p.from).show();
                p.query($(this).val());
            }
        }).bind("blur.lookup", function() {
            // $(p.from).hide();
        });

        //$(p.from + " tr").click
        $(p.btnOk).click(function(event) {
            $("#" + id + " input[f=" + p.keyField + "]").val(data);
        });
        //alert($(this).html());
    });
}

$.fn.smartLoad = function(u, callback, small) {
    return this.each(function() {
        $(this).showIndicator(small).load(u, callback);
    });
}

$.fn.ajaxShowDetail = function(callback, cell) {
    return this.each(function() {
        var grid = "#" + $(this).attr("id");
        if (cell) var a = $(grid + " tbody tr td:nth-child(" + cell + ") a");
        else var a = $(grid + " a");
        a.click(function() {

            var tr = $(this).parent().parent();
            if (tr[0].rowIndex == $(grid + ' tr.detail').attr('tag')) {
                $(grid + ' tr.detail').remove();
                $(grid + ' tr').removeClass("selected");
            }
            else {
                $(grid + ' tr.detail').remove();
                $(grid + ' tr').removeClass("selected");
                tr.toggleClass("selected");
                var colCount = $(this).parent().parent().children().size();
                var newTr = $('<tr class="detail"><td colspan="' + colCount + '"></td></tr>').insertAfter(tr);
                newTr.attr('tag', tr[0].rowIndex);

                if (callback) callback(this, newTr);
            }

            return false;
        });
    });
}


$.fn.smartQuickRec = function(grid) {
    return this.each(function() {
        $(grid).find("td input").unbind("keydown.quickRec").bind("keydown.quickRec", function(event) {
            if ((event).keyCode == 13) {
                if ($(this).keyup == undefined)
                    $(this).parent().next().find("input").focus();

            }
        });
    });
}

$.fn.smartSelRow = function(grid, selected) {
    return this.each(function() {
        $(this).find("td input").focus(function() {
            $(grid).find("tbody tr").removeClass("selected");
            $(this).parent().parent().addClass('selected');
        });
    });
}

$.fn.smartDelRow = function(settings) {
    return this.each(function() {
        var grid = $(this).parent().parent();
        if (grid.find("thead th.del").size() == 0) {
            $("<th class='del'></th>").insertBefore(grid.find("thead th:first-child"));
            $("<td><input class='btnDelRow' type='button' value='×' /></td>").insertBefore(grid.find("tbody tr:not(.newRowCmd) td:first-child"));
        }

        $(this).find("input.btnDelRow").unbind('click').click(function() {
            if ($(grid).find(".btnNewRow").parent().parent().css('display') == "none") {
                if ($(grid).find("tbody tr:not(.newRowCmd)").size() == 1) {
                    grid.NewRow($(grid).find("tbody tr:first-child"), {});
                } else {
                    $(grid).find(".btnNewRow").parent().parent().show();
                    $(this).parent().parent().remove();
                }
            }
            else {
                var row = $(this).parent().parent();
                var uf = row.find("input.uf").val();
                if (uf == "I") {
                    if (confirm('确认要删除吗')) row.remove();
                }
                else if (uf == "UD") { row.find("input.uf").val("U"); row.toggleClass('removed'); }
                else if (uf == "D") { row.find("input.uf").val(""); row.toggleClass('removed'); }
                else if (uf == "U") { row.find("input.uf").val("UD"); row.toggleClass('removed'); }
                else if (uf == "N") row.remove();

                else { row.find("input.uf").val("D"); row.toggleClass('removed'); }
            }

        });
    });
}

$.fn.smartUpdateFlag = function(settings) {
    return this.each(function() {
        var editorClass = settings.editorClass;
        var grid = $(this).parent().parent();
        var id = "#" + $(this).attr("id");
        if (grid.find("thead th.uf").size() == 0) {
            $("<th class='uf'><a href='#'>■</a></th>").insertBefore(grid.find("thead th:first-child"));

            grid.find("tbody tr:not(.newRowCmd)").each(function() {
                var name = $(this).find("input." + editorClass + ":first-child").attr("name");
                var reg = /\[(\w+\d*)\]\[/i;
                name = name.replace(reg, '[' + settings.updateFlag + '][');

                $("<td class='uf'><input class='uf' name='" + name + "' style='width:20px;display:none' /></td>").insertBefore($(this).find("td:first-child"));
            });
            grid.find("tr.newRow input.uf").val("N");
            grid.find("th.uf a").click(function() { grid.find('tbody td.uf input.uf').show(); return false; });
        }

        $(this).find("input." + editorClass).unbind('change.uf').bind('change.uf', function() {
            var row = $(this).parent().parent();
            var uf = row.find("input.uf").val();
            if (uf == "N") row.find("input.uf").val("I");
            else if (uf == "") row.find("input.uf").val("U");
        });
    });
}

$.fn.NewRow = function(tr, option) {
    return this.each(function() {
        var r = tr;
        var grid = $(this);
        var newCmdRow = grid.find("tr.newRowCmd");
        if (!(r)) {
            var r = $(this).find("tbody tr:first-child").clone().insertBefore(newCmdRow).addClass('newRow').removeClass('removed');
        }
        r.attr('id', grid.attr('id') + "_tr_" + r[0].rowIndex);
        r.find('input').bind("change.newRow", function() { newCmdRow.show(); });
        newCmdRow.hide();
        r.find("td[f]").filter(function() { return $(this).find("input").size() == 0; }).text('');
        r.find("." + option.editorClass).val('').slice(0, 1).focus();
        r.find(".uf").val('N');

        r.find("input." + option.editorClass + ", input.uf").each(function() {
            var name = $(this).attr("name");
            var reg = /\[(\d+)\]$/i;
            name = name.replace(reg, '[' + (parseInt(r[0].rowIndex) + 1) + ']');
            $(this).attr('name', name).attr('id', name);
        })
        if (option.callback) {
            option.callback(grid, r);
        }
        r.find(".uf").val('N'); //再调一次
    });
}


$.fn.smartNewRow = function(option, callback) {
    return this.each(function() {
        var grid = $(this);

        var colCount = $(this).find("tr:first-child td").size();
        var newCmdRow = $("<tr class='newRowCmd'><td colspan='" + colCount + "'><input class='btnNewRow' type='button' value='增加一行' /></td></tr>").appendTo(this);
        if (option.firstNewRow) {
            var tr = grid.find("tbody tr:first-child");
            grid.NewRow(tr, option);
        }
        $(this).find(".btnNewRow").unbind('click').click(function() {
            $(grid).find("tr").removeClass("newRow");
            $(grid).find("input").unbind("change.newRow");

            grid.NewRow(null, option);
        });
        if (option.callback) {
            $(this).find("tbody tr").each(function() { option.callback(grid, this); });
        }
    });
}

$.fn.smartGrid = function(option) {
    return this.each(function() {
        $(this).smartNewRow(function(table, tr) {
            $(tr).smartUpdateFlag({ editorClass: "userEditor" }).smartDelRow().smartSelRow(table);
        });
    });
}



