1 (function($){
2 if(!Array.prototype.indexOf){
3 Array.prototype.indexOf=function(obj,index){
4 var start =index||0;
5 if(start<0){
6 start=this.length+start;
7 }
8 for(;this[start];start++){
9 if(this[start]===obj){
10 return start;
11 }
12 }
13 return -1;
14 }
15 }
16 var setCookie=function(key,val){document.cookie=(key+"="+escape(val)+";");},
17 getCookie=function(key){
18 var cookie=document.cookie;
19 if(cookie.length>0){
20 var start=cookie.indexOf(key+"="),end;
21 if(start!=-1){
22 end=cookie.indexOf(";",String(key).length+1);
23 if(end==-1){end=cookie.length;}
24 return unescape(cookie.substring(start+String(key).length+1,end));
25 }
26 }
27 return "";
28 },
29 filterCol=function(defCol,srcCol){
30 var i=srcCol.length;
31 while(i--){
32 defCol.indexOf(srcCol[i])==-1&&(srcCol.splice(i,1));
33 }
34 return !!srcCol.length?srcCol:defCol;
35 },
36 getHideCol=function(uuid){
37 var start,
38 end,
39 hideCols=getCookie("hideCol");
40 if(hideCols){
41 if((start=hideCols.indexOf(uuid+"_"))!=-1){
42 end=hideCols.indexOf(",",start+String(uuid).length+2);
43 if(end==-1){
44 end=hideCols.length;
45 }
46 return hideCols.substring(start+String(uuid).length+1,end).split("@");
47 }
48 }
49 return [];
50
51 },
52 addMenuCookie=function(uuid,fieldName){
53 var hideCols=getCookie("hideCol"),
54 hideColArr=getHideCol(uuid);
55 if(hideCols){
56 if(hideColArr.length>0){
57 hideColArr.push(fieldName);
58 hideCols=hideCols.replace(new RegExp(uuid+"_[^\,]+$"),uuid+"_"+hideColArr.join("@"));
59 }else{
60 hideCols+=(","+uuid+"_"+fieldName);
61 }
62 }else{
63 hideCols=(uuid+"_"+fieldName);
64 }
65 setCookie("hideCol",hideCols);
66 },
67 delMenuCookie=function(uuid,fieldName){
68 var hideCols=getCookie("hideCol"),
69 hideColArr=getHideCol(uuid),
70 i=hideColArr.length;
71 if(hideCols){
72 if(hideColArr.length>0){
73 while(i--){hideColArr[i]==fieldName&&(hideColArr.splice(i,1));}
74 if(hideColArr.length>0){
75 hideCols=hideCols.replace(new RegExp(uuid+"_[^\,]+$"),uuid+"_"+hideColArr.join("@"));
76 }else{
77 hideCols=hideCols.replace(new RegExp(uuid+"_[^\,]+\,?$"),"");
78 }
79 setCookie("hideCol",hideCols);
80 }
81 }
82 },
83 createMenu=function(jq,options,hideCol){
84 var menuHtml="<div style='width:100px;position:absolute;' id='"+options.uuid+"'>",
85 col=options.col,
86 i=col.length;
87 while(i--){
88 if(hideCol.indexOf(col[i])!=-1){
89 menuHtml+="<div iconCls='icon-empty' fieldName='"+col[i]+"'>"+jq.datagrid("getColumnOption",col[i]).title+"</div>";
90 jq.datagrid("hideColumn",col[i]);
91 }else{
92 menuHtml+="<div iconCls='icon-ok' fieldName='"+col[i]+"'>"+jq.datagrid("getColumnOption",col[i]).title+"</div>";
93 }
94 }
95 menuHtml+="</div>";
96 jq.after(menuHtml);
97 $("#"+options.uuid).menu({
98 onClick:function(item){
99 var fieldName=$(item.target).attr("fieldName");
100 if(item.iconCls=="icon-ok"){
101 if($("#"+options.uuid+" .icon-ok").length==1){
102 $.messager.alert("警告","需至少保留一列","warning");
103 return;
104 }
105 jq.datagrid("hideColumn",fieldName);
106 $("#"+options.uuid).menu("setIcon",{target:item.target,iconCls:"icon-empty"});
107 addMenuCookie(options.uuid,fieldName);
108 }else{
109 jq.datagrid("showColumn",fieldName).datagrid("fitColumns");
110 $("#"+options.uuid).menu("setIcon",{target:item.target,iconCls:"icon-ok"});
111 delMenuCookie(options.uuid,fieldName);
112
113 }
114 }
115 });
116 if($("#"+options.uuid).height()>options.height){
117 $("#"+options.uuid).css("height",options.height);
118 if($.browser.msie&&$.browser.version==6){$("#"+options.uuid).css("overflow-y","auto");
119 }else{$("#"+options.uuid).css("overflow","auto");}
120 }
121 jq.datagrid("options")._onHeaderContextMenu=jq.datagrid("options").onHeaderContextMenu;
122 jq.datagrid("options").onHeaderContextMenu=function(e){e.preventDefault();$("#"+options.uuid).menu("show",{left:e.pageX,top:e.pageY});}
123 jq[0].customColumn=true;
124
125 };
126 $.extend($.fn.datagrid.methods,{
127 /**
128 * 让datagrid的列拥有本地化隐藏显示功能(本地保存设置):
129 * 对象参数说明:
130 * {
131 * 参数名 类型 描述 例 默认值
132 * col array 让哪些列拥有本地化隐藏显示功能 $("#t1").datagrid("customColumn",{col:["col1","col2"]}) 所有列
133 * height number 当超过此高度时锁定高度 $("#t1").datagrid("customColumn",{height:100}) 300
134 * }
135 * 调用方式:
136 * 一:不传入任何参数(此时所有的列都拥有本地化功能)
137 * $("#t1").datagrid("customColumn");
138 * $("#t1,#t2").datagrid("customColumn");
139 * 二:传入一个对象(替换第一个jquery的默认值)
140 * $("#t1").datagrid("customColumn",{col:[col1,col2],height:300});
141 * $("#t1,#t2").datagrid("customColumn",{col:[col1,col2],height:300});//t1的默认被覆盖,t2还是默认
142 * 三:传入一个字符串(替换第一个jquery的属性)
143 * $("#t1").datagrid("customColumn","col1,col2"]);
144 * $("#t1,#t2").datagrid("customColumn","col1,col2"]);//t1的列被定制,t2还是默认
145 * 四:传入一个数字(替换第一个jquery的属性)
146 * $("#t1").datagrid("customColumn",300);
147 * $("#t1,#t2").datagrid("customColumn",300);//t1的高度被覆盖,t2还是默认
148 * 五:传入一个对象数组,对象需包含一个数组属性col(没有对应的则默认所有列)
149 * $("#t1").datagrid("customColumn",[{col:["col1","col2"]}]);//只有t1的col1,col2列拥有本地化隐藏显示功能
150 * $("#t1,#t2").datagrid("customColumn",[{col:["col1","col2"]}]);//t1的col1,col2列拥有本地化隐藏显示功能,t2的所有列都拥有本地化隐藏显示功能
151 * $("#t1,#t2").datagrid("customColumn",[{col:["col1","col2"]},{col:[col3,col4]}]);//t1的col1,col2列拥有本地化隐藏显示功能,t2的col3,col4列拥有本地化隐藏显示功能
152 */
153 customColumn:function(jq,param){
154 return jq.each(function(i){
155 if(this.customColumn){
156 return true;
157 }
158 var $grid=$(this),
159 defCol=$grid.datagrid("getColumnFields").concat($grid.datagrid("getColumnFields",true)),
160 options={col:defCol,height:300};
161 if($.isArray(param)&&$.isPlainObject(param[i])){
162 $.extend(options,param[i]);
163 }
164 if(i==0){
165 if(typeof param=="string"){
166 $.extend(options,{col:param.split(",")});
167 }
168 if($.isNumeric(param)){
169 $.extend(options,{height:param});
170 }
171 if($.isPlainObject(param)){
172 $.extend(options,param);
173 }
174 }
175 options.col=filterCol(defCol,options.col);
176 for(var name in this){
177 /^jQuery/.test(name)&&(options.uuid=this[name]);
178 }
179 createMenu($grid,options,getHideCol(options.uuid));
180 });
181 },
182 unCustomColumn:function(jq){
183 return jq.each(function(){
184 var uuid,
185 $grid=$(this),
186 hideCols=getCookie("hideCol");
187 for(var name in this){
188 /^jQuery/.test(name)&&(uuid=this[name]);
189 }
190 if($("#"+uuid).length==1){
191 delete this.customColumn;
192 $("#"+uuid).remove();
193 $grid.datagrid("options").onHeaderContextMenu=jq.datagrid("options")._onHeaderContextMenu||function(){};
194 if(hideCols){
195 hideCols=hideCols.replace(new RegExp(uuid+"_[^\,]+\,?$"),"");
196 setCookie("hideCol",hideCols);
197 }
198 }
199 });
200 }
201 });
202 })($);