/*
* jQuery databinding plugin
* Version 1.0  (06/14/2007)
* @requires jQuery v1.1.1
*
* Copyright (c) 2007 JingleQ
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*/

/**
* bind the datas to the dom node talbe which like 
* <table border="0" cellspacing="5" cellpadding="5" id="ta">
* <tbody>
* 	<!-- 定制menu是为了使标题和下面的列表可以有不一样的样式布局 -->
* 	<tr id="menu">
* 		<td>用户名</td>
* 		<td>密码</td>
* 	</tr>
* 	<!--　用于数据绑定 -->
* 	<tr id="def">
* 		<td bindingData="name" bindingPattern="[function] changeName({0})"></td>
* 		<td bindingData="password"></td>
* 	</tr>
* 	<!-- 下面是其它的布局辅助绑定数据后依然位于表格底部 -->
* 	<tr>
* 		<td colspan="2">&nbsp;--- 分页 ---</td>
* 	</tr>
* </tbody>
* </table>
* 
* 
* itemCallBackFunction is a callback function
* using like this
* 
* $("#ta").bindingItemsData(dataMap,function(l,it){					
* 	$(it).hover(function(){
* 		$(it).addClass("blue");
* 	},function(){
* 		$(it).removeClass("blue");
* 	})
* });
*
* @example $("#ta").bindingItemsData(dataMap);
* @example with callback function $("#ta").bindingItemsData(dataMap,function(l,it) {});
* @name bindingItemsData
* @type jQuery
*/
jQuery.fn.bindingItemsData = function(datas, itemCallBackFunction, currPage, pageSize) {
    var self = this;
    $(this).find("[@item=true]").remove();
    this.find("#def").each(function(i, n) {
        //var j = 0;
        for (index in datas) {
            var newTr = $(n).clone();
            // ---　标记列表 ---
            newTr.attr("item", "true");
            newTr.find("td").each(function(k, o) {

                if ($(o).attr("bindingPattern") != undefined || $(o).attr("bindingPattern") == "") {
                    try {
                        var flag = $(o).attr("bindingPattern").indexOf("[function]");

                        $(o).attr("bindingPattern", $(o).attr("bindingPattern").replace("[function]", ""));
                        $(o).attr("bindingPattern", $(o).attr("bindingPattern").replace("[index]", (parseInt(index) + 1 + parseInt(currPage) * parseInt(pageSize))));
                        //$(o).html(eval($(o).attr("bindingPattern").replace("\{0\}","'" + datas[index][$(o).attr("bindingData")] + "'")));

                        var str = $(o).attr("bindingPattern");
                        var reg = str.match(/{\d+}/g);

                        if (!(reg == null || $(o).attr("bindingData") == null)) {
                            var array = $(o).attr("bindingData").split(",");

                            for (var i = 0; i < reg.length; i++) {
                                str = str.replace("{" + i + "}", datas[index][array[i]]);
                            }


                        }

                        if (flag >= 0) {
                            $(o).html(eval(str));
                        }
                        else {
                            $(o).html(str);
                        }

                    } catch (e) {
                        alert(e);
                    }
                } else {
                    o.innerHTML = datas[index][$(o).attr("bindingData")];
                }

                if ($(o).attr("bindingWidth") != undefined || $(o).attr("bindingWidth") == "") {

                    $(o).html("<div style=\"height:12px;width:" + $(o).attr("bindingWidth") + "px; overflow:hidden;\">" + $(o).html() + "</div>");


                }
            })
            self.append(newTr);
        }
    })

    // ---　通过回调添加列表样式 ---
    if (itemCallBackFunction != undefined) {
        $(this).find("tr[@item]").each(function(l, it) {
            itemCallBackFunction(l, it)
        }
		);
    }

    $(this).find("[@item=true]").show();
    this.find("#def").hide();
    return $(this);
}

/**
* bind the data to the dom node which like 
* <span id="dt" 
* 			bindingData="name" 
* 			bindingPattern="[function] changeName({0})">
* </span>
*
* @example $("span").bindingSpanData(dataMap);
* @name bindingSpanData
* @type jQuery
*/
jQuery.fn.bindingSpanData = function(datas, currPage, pageSize) {
    var self = this;
    $(this).find("[@item=true]").remove();
    this.find("#def").each(function(i, n) {
        //var j = 0;
        for (index in datas) {
            var newTr = $(n).clone();
            // ---　标记列表 ---
            newTr.attr("item", "true");
            newTr.find("span").each(function(k, o) {

                if ($(o).attr("bindingPattern") != undefined || $(o).attr("bindingPattern") == "") {
                    try {
                        var flag = $(o).attr("bindingPattern").indexOf("[function]");

                        $(o).attr("bindingPattern", $(o).attr("bindingPattern").replace("[function]", ""));
                        $(o).attr("bindingPattern", $(o).attr("bindingPattern").replace("[index]", (parseInt(index) + 1 + parseInt(currPage) * parseInt(pageSize))));
                        //$(o).html(eval($(o).attr("bindingPattern").replace("\{0\}","'" + datas[index][$(o).attr("bindingData")] + "'")));

                        var str = $(o).attr("bindingPattern");
                        var reg = str.match(/{\d+}/g);

                        if (!(reg == null || $(o).attr("bindingData") == null)) {
                            var array = $(o).attr("bindingData").split(",");

                            for (var i = 0; i < reg.length; i++) {
                                str = str.replace("{" + i + "}", datas[index][array[i]]);
                            }


                        }

                        if (flag >= 0) {
                            $(o).html(eval(str));
                        }
                        else {
                            $(o).html(str);
                        }

                    } catch (e) {
                        alert(e);
                    }
                } else {
                    o.innerHTML = datas[index][$(o).attr("bindingData")];
                }

                if ($(o).attr("bindingWidth") != undefined || $(o).attr("bindingWidth") == "") {

                    $(o).html("<div style=\"height:12px;width:" + $(o).attr("bindingWidth") + "px; overflow:hidden;\">" + $(o).html() + "</div>");


                }
            })
            self.append(newTr);
        }
    })

    $(this).find("[@item=true]").show();
    this.find("#def").hide();
    return $(this);

}



/*===========================================*/
/*
* rowdomid:<tr id="rowdomid"></tr>
*/
jQuery.fn.bindingItemsData_2 = function(datas, rowdomid, itemCallBackFunction, currPage, pageSize) {
    var self = this;
    $(this).find("[@item=true]").remove();
    this.find(rowdomid).each(function(i, n) {
        //var j = 0;
        for (index in datas) {
            var newTr = $(n).clone();
            // ---　标记列表 ---
            newTr.attr("item", "true");
            newTr.find("td").each(function(k, o) {

                if ($(o).attr("bindingPattern") != undefined || $(o).attr("bindingPattern") == "") {
                    try {
                        var flag = $(o).attr("bindingPattern").indexOf("[function]");

                        $(o).attr("bindingPattern", $(o).attr("bindingPattern").replace("[function]", ""));
                        $(o).attr("bindingPattern", $(o).attr("bindingPattern").replace("[index]", (parseInt(index) + 1 + parseInt(currPage) * parseInt(pageSize))));
                        //$(o).html(eval($(o).attr("bindingPattern").replace("\{0\}","'" + datas[index][$(o).attr("bindingData")] + "'")));

                        var str = $(o).attr("bindingPattern");
                        var reg = str.match(/{\d+}/g);

                        if (!(reg == null || $(o).attr("bindingData") == null)) {
                            var array = $(o).attr("bindingData").split(",");

                            for (var i = 0; i < reg.length; i++) {
                                str = str.replace("{" + i + "}", datas[index][array[i]]);
                            }


                        }

                        if (flag >= 0) {
                            $(o).html(eval(str));
                        }
                        else {
                            $(o).html(str);
                        }

                    } catch (e) {
                        alert(e);
                    }
                } else {
                    o.innerHTML = datas[index][$(o).attr("bindingData")];
                }

                if ($(o).attr("bindingWidth") != undefined || $(o).attr("bindingWidth") == "") {

                    $(o).html("<div style=\"height:12px;width:" + $(o).attr("bindingWidth") + "px; overflow:hidden;\">" + $(o).html() + "</div>");


                }
            })
            self.append(newTr);
        }
    })

    // ---　通过回调添加列表样式 ---
    if (itemCallBackFunction != undefined) {
        $(this).find("tr[@item]").each(function(l, it) {
            itemCallBackFunction(l, it)
        }
		);
    }

    $(this).find("[@item=true]").show();
    this.find(rowdomid).hide();
    return $(this);
}

/*===========================================*/
/*
* rowdomid:<tr id="rowdomid"></tr>
*/
jQuery.fn.bindingItemsUlLi = function(datas, rowdomid, itemCallBackFunction, currPage, pageSize) {
    var self = this;
    $(this).find("[@item=true]").remove();
    this.find(rowdomid).each(function(i, n) {
        //var j = 0;
        for (index in datas) {
            var newTr = $(n).clone();
            // ---　标记列表 ---
            newTr.attr("item", "true");
            newTr.find("li").each(function(k, o) {
                if ($(o).attr("bindingPattern") != undefined || $(o).attr("bindingPattern") == "") {
                    try {
                        var flag = $(o).attr("bindingPattern").indexOf("[function]");

                        $(o).attr("bindingPattern", $(o).attr("bindingPattern").replace("[function]", ""));
                        $(o).attr("bindingPattern", $(o).attr("bindingPattern").replace("[index]", (parseInt(index) + 1 + parseInt(currPage) * parseInt(pageSize))));
                        //$(o).html(eval($(o).attr("bindingPattern").replace("\{0\}","'" + datas[index][$(o).attr("bindingData")] + "'")));

                        var str = $(o).attr("bindingPattern");
                        var reg = str.match(/{\d+}/g);

                        if (!(reg == null || $(o).attr("bindingData") == null)) {
                            var array = $(o).attr("bindingData").split(",");

                            for (var i = 0; i < reg.length; i++) {
                                str = str.replace("{" + i + "}", datas[index][array[i]]);
                            }


                        }

                        if (flag >= 0) {
                            $(o).html(eval(str));
                        }
                        else {
                            $(o).html(str);
                        }

                    } catch (e) {
                        alert(e);
                    }
                } else {
                    o.innerHTML = datas[index][$(o).attr("bindingData")];
                }

                if ($(o).attr("bindingWidth") != undefined || $(o).attr("bindingWidth") == "") {

                    $(o).html("<div style=\"height:12px;width:" + $(o).attr("bindingWidth") + "px; overflow:hidden;\">" + $(o).html() + "</div>");


                }
            })
            self.append(newTr);
        }
    })

    // ---　通过回调添加列表样式 ---
    if (itemCallBackFunction != undefined) {
        $(this).find("tr[@item]").each(function(l, it) {
            itemCallBackFunction(l, it)
        }
		);
    }

    $(this).find("[@item=true]").show();
    this.find(rowdomid).hide();
    return $(this);
}