/** * @author Roger Wu v1.0 * @author ZhangHuihua@msn.com 2011-4-1 */ (function($){ $.fn.jTable = function(options){ return this.each(function(){ var $table = $(this), nowrapTD = $table.attr("nowrapTD"); var tlength = $table.width(); var aStyles = []; var $tc = $table.parent().addClass("j-resizeGrid"); // table parent container var layoutH = $(this).attr("layoutH"); var oldThs = $table.find("thead>tr:last-child").find("th"); for(var i = 0, l = oldThs.size(); i < l; i++) { var $th = $(oldThs[i]); var style = [], width = $th.innerWidth() - (100 * $th.innerWidth() / tlength)-2; style[0] = parseInt(width); style[1] = $th.attr("align"); aStyles[aStyles.length] = style; } $(this).wrap("
"); var $grid = $table.parent().html($table.html()); var thead = $grid.find("thead"); thead.wrap("
"); var lastH = $(">tr:last-child", thead); var ths = $(">th", lastH); $("th",thead).each(function(){ var $th = $(this); $th.html("
"+ $th.html() +"
"); }); ths.each(function(i){ var $th = $(this), style = aStyles[i]; $th.addClass(style[1]).hoverClass("hover").removeAttr("align").removeAttr("width").width(style[0]); }).filter("[orderField]").orderBy({ targetType: $table.attr("targetType"), rel:$table.attr("rel"), asc: $table.attr("asc") || "asc", desc: $table.attr("desc") || "desc" }); var tbody = $grid.find(">tbody"); var layoutStr = layoutH ? " layoutH='" + layoutH + "'" : ""; tbody.wrap("
"); var ftr = $(">tr:first-child", tbody); var $trs = tbody.find('>tr'); $trs.hoverClass().each(function(){ var $tr = $(this); var $ftds = $(">td", this); for (var i=0; i < $ftds.size(); i++) { var $ftd = $($ftds[i]); if (nowrapTD != "false") $ftd.html("
" + $ftd.html() + "
"); if (i < aStyles.length) $ftd.addClass(aStyles[i][1]); } $tr.click(function(){ $trs.filter(".selected").removeClass("selected"); $tr.addClass("selected"); var sTarget = $tr.attr("target"); if (sTarget) { if ($("#"+sTarget, $grid).size() == 0) { $grid.prepend(''); } $("#"+sTarget, $grid).val($tr.attr("rel")); } }); }); $(">td",ftr).each(function(i){ if (i < aStyles.length) $(this).width(aStyles[i][0]); }); $grid.append(""); var scroller = $(".gridScroller", $grid); scroller.scroll(function(event){ var header = $(".gridThead", $grid); if(scroller.scrollLeft() > 0){ header.css("position", "relative"); var scroll = scroller.scrollLeft(); header.css("left", scroller.cssv("left") - scroll); } if(scroller.scrollLeft() == 0) { header.css("position", "relative"); header.css("left", "0px"); } return false; }); $(">tr", thead).each(function(){ $(">th", this).each(function(i){ var th = this, $th = $(this); $th.mouseover(function(event){ var offset = $.jTableTool.getOffset(th, event).offsetX; if($th.outerWidth() - offset < 5) { $th.css("cursor", "col-resize").mousedown(function(event){ $(".resizeProxy", $grid).show().css({ left: $.jTableTool.getRight(th)- $(".gridScroller", $grid).scrollLeft(), top:$.jTableTool.getTop(th), height:$.jTableTool.getHeight(th,$grid), cursor:"col-resize" }); $(".resizeMarker", $grid).show().css({ left: $.jTableTool.getLeft(th) + 1 - $(".gridScroller", $grid).scrollLeft(), top: $.jTableTool.getTop(th), height:$.jTableTool.getHeight(th,$grid) }); $(".resizeProxy", $grid).jDrag($.extend(options, {scop:true, cellMinW:20, relObj:$(".resizeMarker", $grid)[0], move: "horizontal", event:event, stop: function(){ var pleft = $(".resizeProxy", $grid).position().left; var mleft = $(".resizeMarker", $grid).position().left; var move = pleft - mleft - $th.outerWidth() -9; var cols = $.jTableTool.getColspan($th); var cellNum = $.jTableTool.getCellNum($th); var oldW = $th.width(), newW = $th.width() + move; var $dcell = $(">td", ftr).eq(cellNum - 1); $th.width(newW + "px"); $dcell.width(newW+"px"); var $table1 = $(thead).parent(); $table1.width(($table1.width() - oldW + newW)+"px"); var $table2 = $(tbody).parent(); $table2.width(($table2.width() - oldW + newW)+"px"); $(".resizeMarker,.resizeProxy", $grid).hide(); } }) ); }); } else { $th.css("cursor", $th.attr("orderField") ? "pointer" : "default"); $th.unbind("mousedown"); } return false; }); }); }); function _resizeGrid(){ $("div.j-resizeGrid").each(function(){ var width = $(this).innerWidth(); if (width){ $("div.gridScroller", this).width(width+"px"); } }); } $(window).unbind(DWZ.eventType.resizeGrid).bind("resizeGrid", _resizeGrid); }); }; $.jTableTool = { getLeft:function(obj) { var width = 0; $(obj).prevAll().each(function(){ width += $(this).outerWidth(); }); return width - 1; }, getRight:function(obj) { var width = 0; $(obj).prevAll().andSelf().each(function(){ width += $(this).outerWidth(); }); return width - 1; }, getTop:function(obj) { var height = 0; $(obj).parent().prevAll().each(function(){ height += $(this).outerHeight(); }); return height; }, getHeight:function(obj, parent) { var height = 0; var head = $(obj).parent(); head.nextAll().andSelf().each(function(){ height += $(this).outerHeight(); }); $(".gridTbody", parent).children().each(function(){ height += $(this).outerHeight(); }); return height; }, getCellNum:function(obj) { return $(obj).prevAll().andSelf().size(); }, getColspan:function(obj) { return $(obj).attr("colspan") || 1; }, getStart:function(obj) { var start = 1; $(obj).prevAll().each(function(){ start += parseInt($(this).attr("colspan") || 1); }); return start; }, getPageCoord:function(element){ var coord = {x: 0, y: 0}; while (element){ coord.x += element.offsetLeft; coord.y += element.offsetTop; element = element.offsetParent; } return coord; }, getOffset:function(obj, evt){ if($.browser.msie ) { var objset = $(obj).offset(); var evtset = { offsetX:evt.pageX || evt.screenX, offsetY:evt.pageY || evt.screenY }; var offset ={ offsetX: evtset.offsetX - objset.left, offsetY: evtset.offsetY - objset.top }; return offset; } var target = evt.target; if (target.offsetLeft == undefined){ target = target.parentNode; } var pageCoord = $.jTableTool.getPageCoord(target); var eventCoord ={ x: window.pageXOffset + evt.clientX, y: window.pageYOffset + evt.clientY }; var offset ={ offsetX: eventCoord.x - pageCoord.x, offsetY: eventCoord.y - pageCoord.y }; return offset; } }; })(jQuery);