jiapeng 8 years ago
parent
commit
e5a31753d5
15 changed files with 649 additions and 530 deletions
  1. 1 1
      css/common.css
  2. 142 56
      html/demo.html
  3. 5 5
      html/model/sys/org/index.html
  4. 86 63
      js/codehtml.js
  5. 379 2
      js/common.js
  6. 2 2
      js/datagrid.js
  7. 5 4
      js/dict.js
  8. 1 1
      js/form.js
  9. 5 5
      js/model/sys/org/index.js
  10. 4 4
      js/pageDataGrid.js
  11. 3 3
      js/pager.js
  12. 12 9
      js/spa.js
  13. 2 2
      js/text.js
  14. 2 2
      js/textarea.js
  15. 0 371
      js/util.js

+ 1 - 1
css/common.css

@ -2209,7 +2209,7 @@ a cite {
2209 2209
    content: '\e652';
2210 2210
}
2211 2211
2212
.form-item > a.dd-hand > span:empty ~ i.icon-close:before, {
2212
.form-item > a.dd-hand > span:empty ~ i.icon-close:before  {
2213 2213
    content: '';
2214 2214
}
2215 2215
.form-item.showOnly > a.dd-hand i.icon-close:before {

+ 142 - 56
html/demo.html

@ -2,73 +2,159 @@
2 2
<html>
3 3

4 4
	<head>
5
		<meta charset="UTF-8">
5
		<meta charset="utf-8" />
6
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
6 7
		<title></title>
7
		<link rel="stylesheet" href="../css/common.css" />
8
		<script type="text/javascript" src="../js/jquery-1.12.4.js"></script>
8
		<link href="../css/common.css" rel="stylesheet" type="text/css" />
9
		<style>
10
			.page-head {
11
				width: 100%;
12
				padding: 0 20px;
13
				color: #999;
14
				height: 60px;
15
				background-color: #444;
16
				min-width: 1040px;
17
				/*overflow: hidden;*/
18
			}
19
			
20
			.page-logo {
21
				display: block;
22
				width: 150px;
23
				height: 60px;
24
				background: url("data:image/png;base64,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") left center no-repeat;
25
			}
26
			
27
			.page-home {
28
				padding: 10px 15px;
29
			}
30
			
31
			.page-home i {
32
				font-size: 40px;
33
			}
34
			
35
			.page-head-right .logout, .page-head-right .help, .page-head-right .user-msg {
36
				height: 30px;
37
				margin: 15px;
38
				cursor: pointer;
39
			}
40
			
41
			.page-head-right div i {
42
				font-size: 30px;
43
			}
44
			
45
			.user-info {
46
				height: 40px;
47
				margin: 10px;
48
				font-size: 15px;
49
				color: #fff;
50
				text-align: center;
51
			}
52
			
53
			.user-info .user-head {
54
				height: 40px;
55
				width: 40px;
56
				border-radius: 50%;
57
			}
58
			
59
			.user-info .user-name {
60
				margin-left: 10px;
61
			}
62
			
63
			.user-info i {
64
				margin-top: 15px;
65
			}
66
			
67
			.page-menu {
68
				position: absolute;
69
				top: 60px;
70
				left: 0;
71
				width: 240px;
72
				bottom: 0;
73
				font-size: 20px;
74
				background-color: #fafafa;
75
				border: 1px solid #c7c7c7;
76
				overflow-x: visible;
77
			}
78
			
79
			.spa-main {
80
				position: absolute;
81
				top: 60px;
82
				left: 240px;
83
				right: 0px;
84
				bottom: 0;
85
				padding: 10px;
86
			}
87
			
88
			#g_info {
89
				top: 60px;
90
			}
91
		</style>
9 92
	</head>
10 93

11
	<body>
12
		<div class="container">
13
			<div class="row">
14
				<div class="col-6 form-item text readOnly" name="t1" placeholder="dfsafsdfsdfda" defVal="dfsasfds">
15

16
				</div>
17
				<div class="col-6 form-item text int readOnly" name="t2" defVal="12345">
18

94
	<body class="spa-page" resource="../ajax/sys/resource/user" menu="../ajax/user/config/menu" style="padding: 0;">
95
		<div class="page-head">
96
			<div class="page-head-left pull-left">
97
				<a class="page-logo pull-left"></a>
98
				<div class="page-home pull-left">
99
					<i class="icon-home"></i>
19 100
				</div>
20 101
			</div>
21
			<div class="row">
22
				<div class="col-6 form-item select readOnly"  dictCode="bool" name="t3" placeholder="123456789">
23

102
			<div class="page-head-right pull-right">
103
				<div class="logout pull-right">
104
					<i class="icon-signout opt-logout"></i>
24 105
				</div>
25
				<div class="col-6 form-item mselect tree " dictCode="tree"   placeholder="123456789" name="t4">
26

27
				</div>
28
			</div>
29
			<div class="row">
30
				<div class="col-6 form-item date readOnly" defVal="current" name="t5" placeholder="dfsafsdfsdfda">
31

106
				<div class="help pull-right">
107
					<i class="icon-question-sign"></i>
32 108
				</div>
33
				<div class="col-6 form-item textarea readOnly"  name="t6" placeholder="dfsafsdfsdfda">
34

109
				<div class="user-msg pull-right">
110
					<i class="icon-envelope"></i>
35 111
				</div>
112
				<a class="user-info pull-right"> <img class="user-head" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG4AAABuCAIAAABJObGsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzQ0NkMxNDMyMTgxMTFFNTk0NTM4MzgwOUQ4QTlBMjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzQ0NkMxNDQyMTgxMTFFNTk0NTM4MzgwOUQ4QTlBMjAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NDQ2QzE0MTIxODExMUU1OTQ1MzgzODA5RDhBOUEyMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NDQ2QzE0MjIxODExMUU1OTQ1MzgzODA5RDhBOUEyMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkQ1VQMAAA9GSURBVHja7J0Hc9tG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" />
113
					<span class="user-name">linux linux</span> <i class="icon-caret-down"></i>
114
				</a>
115
			</div>
116
		</div>
117
		<div class="page-menu">
118
			<div class="spa-menu menu"></div>
119
		</div>
120
		<div class="spa-main"></div>
121
		<div class="page-foot"></div>
122
		<div id='g_info'>
123
			<div id='g_err'></div>
124
			<div id='g_warn'></div>
125
			<div id='g_msg'></div>
126
		</div>
127
		<div id='g_loading' style="display: none;">
128
			<div>
129
				<i class='icon icon-spin icon-spinner-snake'></i>
36 130
			</div>
37

38 131
		</div>
39
		<button type="button" class="opt-btn btn">btn</button>
40
		<script type="text/javascript" src="../js/common.js"></script>
41
		<script type="text/javascript" src="../js/util.js"></script>
42
		<script type="text/javascript" src="../js/dict.js"></script>
43
		<script type="text/javascript" src="../js/dropdown.js"></script>
44
		<script type="text/javascript" src="../js/form.js"></script>
45
		<script type="text/javascript" src="../js/text.js"></script>
46
		<script type="text/javascript" src="../js/select.js"></script>
47
		<script type="text/javascript" src="../js/date.js" ></script>
48
		<script type="text/javascript" src="../js/textarea.js" ></script>
49
		<script>
50
			$.use(["form", "dict"], function($f, $dict) {
51
				$dict.set("tree", [{ code: "0", caption: "否", enabled: true },
52
					{ code: "1", caption: "11否", enabled: true },
53
					{ code: "2", caption: "22否", enabled: true }, 
54
					{ code: "3", caption: "33否", enabled: true }, 
55
					{ code: "4", caption: "44否", enabled: true }, 
56
					{ code: "5", caption: "55否", enabled: true ,children:[{ code: "6", caption: "否", enabled: true }, 
57
					{ code: "7", caption: "否", enabled: true }, 
58
					{ code: "8", caption: "否", enabled: true }, 
59
					{ code: "9", caption: "否", enabled: true }, 
60
					{ code: "10", caption: "否", enabled: true }, ]}, 
61
					
62
					{ code: "11", caption: "666否", enabled: true },
63
				])
64

65
				var form = $f.build($(".container"));
66
				$(".opt-btn").on("click", function() {
67
					console.log(form.val());
68
				});
69 132

70
			})
71
		</script>
72 133
	</body>
134
	<script type="text/javascript" src="../js/jquery-1.12.4.js"></script>
135
	<script type="text/javascript" src="../js/common.js"></script>
136
	<script type="text/javascript" src="../js/form.js"></script>
137
	<script type="text/javascript" src="../js/dict.js"></script>
138
	<script type="text/javascript" src="../js/text.js"></script>
139
	<script type="text/javascript" src="../js/textarea.js"></script>
140
	<script type="text/javascript" src="../js/dropdown.js"></script>
141
	<script type="text/javascript" src="../js/select.js"></script>
142
	<script type="text/javascript" src="../js/date.js"></script>
143
	<script type="text/javascript" src="../js/pager.js"></script>
144
	<script type="text/javascript" src="../js/codehtml.js"></script>
145
	<script type="text/javascript" src="../js/datagrid.js"></script>
146
	<script type="text/javascript" src="../js/pageDataGrid.js"></script>
147
	<script type="text/javascript" src="../js/spa.js"></script>-->
148

149
	<script>
150
		$(function() {
151
			$.spa.build();
152
			$(".opt-logout").on("click", function() {
153
				$.util.get("../ajax/sys/user/logout", null, function() {
154
					window.location.href = "login.html";
155
				}, {});
156
			});
157
		});
158
	</script>
73 159

74 160
</html>

+ 5 - 5
html/model/sys/org/index.html

@ -62,17 +62,17 @@
62 62
					<th>类型</th>
63 63
				</tr>
64 64
			</thead>
65
			<tbody class="code-tpl code-tag-hold" code-func="data-list">
66
				<tr>
65
			<tbody>
66
				<tr ch-dir="list">
67 67
					<td class="opt-check" ><i class="icon icon-st-check" orgId="{{id}}"></i></td>
68
					<td>{{any-[]}}</td>
68
					<td>{{-_index}}</td>
69 69
					<td>{{pi}}</td>
70 70
					<td>{{name}}</td>
71 71
					<td>{{createTime-showDay}}</td>
72
					<td class="ando-dict-display" dict="bool" code="{{type}}"></td>
72
					<td class="hanand-dict" dict="bool" code="{{type}}"></td>
73 73
				</tr>
74 74
			</tbody>
75
			<tbody class="code-tpl code-tag-hold" code-func="data-emptylist">
75
			<tbody ch-dir="array.empty">
76 76
				<tr>
77 77
					<td class="empty-desc" colspan="6">表格暂无数据</td>
78 78
				</tr>

+ 86 - 63
js/codehtml.js

@ -1,4 +1,4 @@
1
$.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
1
$.define(["jQuery", "doc", "body", "util"], "code", function($, doc, $body, util) {
2 2
	/**
3 3
	 * env={ ce:current Element; cd:current Data; ci:current index in
4 4
	 * ListElement array[ci=index] or object[ci=key] es:Element stack; Array
@ -7,6 +7,10 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
7 7
	 * Aarray(function(env){}.call(elementObj={},env) }
8 8
	 */
9 9
	var ch_val_buider = {
10
			/*{{111-222-333-444}}=={k:111,h:222,p:[333,444]}   */
11
			/*{{111}}=={k:111,h:s}   */
12
			/*{{111-222}}=={k:111,h:222,p:undefined}   */
13
10 14
			"c": function( /* env */ ) {
11 15
				return this.k;
12 16
			},
@ -16,7 +20,9 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
16 20
				if(v) return v;
17 21
				return "";
18 22
			},
19
			"date": function(env) {}
23
			"_index": function(env) {
24
				return env.ci+1;
25
			}
20 26
		},
21 27
		simpleAttrHandler = function(env) {
22 28
			env.ce.setAttribute(this.n, this.v);
@ -57,10 +63,11 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
57 63
				shell, /* {{shell}} */
58 64
				tmp, /* last shell */
59 65
				f /* prev is not shell */ ,
60
				bi = nv.indexOf("{{"); /* begin shell bi = s.indexOf("{{",si) */
66
				bi = s.indexOf("{{"); /* begin shell bi = s.indexOf("{{",si) */
61 67
			if(bi >= 0) {
62
				ei = nv.indexOf("}}", bi);
63
				while(si < len) {
68
				ei = s.indexOf("}}", bi);
69
				if(ei>0){
70
				while(true) {
64 71
					if(bi > si) {
65 72
						r.push({ k: s.substring(si, bi), h: "c" });
66 73
						f = true;
@ -79,13 +86,13 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
79 86
					if(bi < 0) { strSplit_s(r, s.substring(si), f); return r; }
80 87
					ei = s.indexOf("}}", bi);
81 88
					if(ei < 0) { strSplit_s(r, s.substring(si), f); return r; }
82
				}
89
				}}
83 90
			}
84 91
			return s;
85 92
		},
86 93
		strCompile = function(s) {
87 94
			var r = strSplit(s);
88
			if(typeof s != "string") {
95
			if(typeof r != "string") {
89 96
				return r.length > 1 ? r : r[0];
90 97
				/*
91 98
				 * [{k:"",h:"",p:[]},...] :
@ -98,7 +105,7 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
98 105
			env.ce.setAttribute(this.n, this.v);
99 106
		},
100 107
		singleAttrHand = function(env) {
101
			env.ce.setAttribute(this.n, env.sh[this.h].call(this.v, env));
108
			env.ce.setAttribute(this.n, env.sh[this.v.h].call(this.v, env));
102 109
		},
103 110
		arrayAttrHand = function(env) {
104 111
			var item, ret = [],
@ -124,28 +131,12 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
124 131
			}
125 132
			return ret;
126 133
		},
127
		simpleTextHand = function(env) {
128
			env.ce.appendChild(doc.createTextNode(this.v));
129
		},
130
		singleTextHand = function(env) {
131
			env.ce.appendChild(doc.createTextNode(env.sh[this.h].call(this.v, env)));
132
		},
133
		arrayTextHand = function(env) {
134
			var item, ret = [],
135
				vs = this.v,
136
				len = vs.length;
137
			for(var i = 0; i < len; ++i) {
138
				item = vs[i];
139
				ret.push(env.sh[item.h].call(item, env));
140
			}
141
			env.ce.appendChild(doc.createTextNode(ret.join("")));
142
		},
143 134
		/* ret.h(env); textNode compiler */
144 135
		textCompile = function(s /* s = textNode.nodeValue */ ) {
145 136
			var len = s.length,
146 137
				ret = { v: s, h: "_t" };
147 138
			if(len > 4) {
148
				s = textCompile(s);
139
				s = strCompile(s);
149 140
				if(typeof s != "string") {
150 141
					ret.v = s;
151 142
					// is Array
@ -158,7 +149,7 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
158 149
			/* simpleTextHand= */
159 150
			"_t": function(env) { env.ce.appendChild(doc.createTextNode(this.v)); },
160 151
			/* singleTextHand= */
161
			"_st": function(env) { env.ce.appendChild(doc.createTextNode(env.sh[this.h].call(this.v, env))); },
152
			"_st": function(env) { env.ce.appendChild(doc.createTextNode(env.sh[this.v.h].call(this.v, env))); },
162 153
			/* arrayTextHand= */
163 154
			"_at": function(env) {
164 155
				var item, ret = [],
@ -183,7 +174,7 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
183 174
				}
184 175
				for(var i = 0; i < es.length; ++i) {
185 176
					item = es[i];
186
					env.dir(item.h).call(item, env);
177
					env.dir[item.h].call(item, env);
187 178
				}
188 179
				env.ce = env.es.pop();
189 180
			},
@ -206,13 +197,21 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
206 197
					env.cd = env.ds.pop();
207 198
				} else if(data && data.length) {
208 199
					env.is.push(env.ci);
200
					env.ds.push(data);
209 201
					for(var i = 0; i < data.length; ++i) {
210 202
						env.ci = i;
203
						env.cd = data[i];
211 204
						hand.call(this, env);
212 205
					}
206
					env.cd=env.ds.pop();
213 207
					env.ci = env.is.pop();
214 208
				}
215 209
			},
210
			"array.empty":function(env){
211
				if((!env.cd) || (!env.cd.length)){
212
					env.dir["_"].call(this,env);
213
				}
214
			},
216 215
			"each": function(env) {
217 216
				var hand = env.dir["_"],
218 217
					as = this.as,
@ -231,10 +230,13 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
231 230
					env.cd = env.ds.pop();
232 231
				} else if(data) {
233 232
					env.is.push(env.ci);
233
					env.ds.push(data);
234 234
					for(var key in data) {
235 235
						env.ci = k;
236
						env.cd = data[key];
236 237
						hand.call(this, env);
237 238
					}
239
					env.cd = env.ds.pop();
238 240
					env.ci = env.is.pop();
239 241
				}
240 242
			},
@ -288,46 +290,67 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
288 290
				}
289 291
			}
290 292
		},
291
		childCompile = function(chs, ret) {
292
			var lisT = false;
293
			for(var i = 0; i < chs.length; ++i) {
294
				var ch = chs[i];
295
				if(ch.nodeType == 1) {
296
					if(lisT) {
297
						ret.push(textCompile(s));
293
		childCompile = function(chs) {
294
			var ret = [],stack = [],ev, as, es, attrs, ch, ele;
295
			hObj = { r: ret, i: 0, c: chs, t: false, s: "", l: chs.length };
296
			while(hObj) {
297
				while(hObj.i < hObj.l) {
298
					ele = hObj.c[hObj.i++];
299
					if(ele.nodeType == 1) {
300
						if(hObj.t) {
301
							hObj.r.push(textCompile(hObj.s));
302
						}
303
						hObj.t = false;
304
						attrs = ele.attributes;
305
						ch = (ele.getAttribute("ch-dir") || "_").split("-");
306
						ev = { n: ele.nodeName, h: ch.shift(), p: ch };
307
						as = ev.as = [];
308
						es = ev.es = [];
309
						hObj.r.push(ev);
310
						for(var i = 0; i < attrs.length; ++i) {
311
							as.push(attrCompile(attrs[i]));
312
						}
313
						as = ele.childNodes.length;
314
						if(as) {
315
							stack.push(hObj);
316
							hObj = { r: es, i: 0, c: ele.childNodes, t: false, s: "", l: as };
317
							stack.push(hObj);
318
							break;
319
						}
320
						
321
					} else if(ele.nodeType == 3) {
322
						hObj.s = hObj.t ? (hObj.s + ele.nodeValue) : ele.nodeValue;
323
						if(hObj.i>=hObj.l){
324
							hObj.r.push(textCompile(hObj.s));							
325
						}else{
326
							hObj.t = true;
327
						}
298 328
					}
299
					ret.push(eleCompile(ch));
300
					lisT = false;
301
				} else if(ch.nodeType == 3) {
302
					s = listT ? (s + ch.nodeValue) : ch.nodeValue;
303
					listT = true;
304 329
				}
330
				hObj = stack.pop();
305 331
			}
306
			if(listT) {
307
				ret.push(textCompile(s));
308
			}
309
		},
310
		/* ret.h(env) Element compiler */
311
		eleCompile = function(ele) {
312
			var attrs = ele.attributes,
313
				cdir = ele.getAttribute("ch-dir") || "_",
314
				ret = { n: ele.node },
315
				as = ret.as = [],
316
				es = ret.es = [],
317
				lisT, s, ch;
318
			ch = cdir.split("-");
319
			ret.h = ch.shift();
320
			if(ch.length) ret.p = ch;
321
			for(var i = 0; i < attrs.length; ++i) {
322
				as.push(attrCompile(attrs[i]));
323
			}
324
			childCompile(ele.children, ret.es);
325
			return tet;
332
			return ret;
326 333
		},
334
		//		/* ret.h(env) Element compiler */
335
		//		eleCompile = function(ele) {
336
		//			var attrs = ele.attributes,
337
		//				cdir = ele.getAttribute("ch-dir") || "_",
338
		//				ret = { n: ele.nodeName },
339
		//				as = ret.as = [],
340
		//				es = ret.es = [],
341
		//				lisT, s, ch;
342
		//			ch = cdir.split("-");
343
		//			ret.h = ch.shift();
344
		//			if(ch.length) ret.p = ch;
345
		//			for(var i = 0; i < attrs.length; ++i) {
346
		//				as.push(attrCompile(attrs[i]));
347
		//			}
348
		//			childCompile(ele.childNodes, ret.es);
349
		//			return ret;
350
		//		},
327 351
		parseElement = function(ele) {
328 352
			var env = { sh: {}, dir: {} },
329
				chs = [];
330
			childCompile(ele.children, chs);
353
				chs = childCompile(ele.childNodes);
331 354
			$.extend(env.sh, ch_val_buider);
332 355
			$.extend(env.dir, ch_dir_container);
333 356
			return {
@ -356,7 +379,7 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
356 379
				}
357 380
			};
358 381
		},
359
		parseCode(ele) = function(ele) {
382
		parseCode = function(ele) {
360 383
			var hand = parseElement(ele),
361 384
				$ele = $(ele),
362 385
				bh = util.nochange,
@ -404,7 +427,7 @@ $.define(["jQuery", "doc", "body"], "code", function($, doc, $body) {
404 427
		};
405 428
	return {
406 429
		"parse": parseElement,
407
		"element": parseCode,
430
		"parseCode": parseCode,
408 431
		"template": parseHtmlTemplate
409 432
	};
410 433
});

+ 379 - 2
js/common.js

@ -21,8 +21,9 @@ if(typeof jQuery === 'undefined') {
21 21
		try {
22 22
			var md = factory.apply(win, dm);
23 23
			mds[id] = md;
24
			return md;
24 25
		} catch(err) {
25
			throw new Error("build model[" + id + "] error");
26
			throw new Error("build model[" + id + "] error:"+err);
26 27
		}
27 28
	};
28 29
	$.use = function(deps, handle) {
@ -35,6 +36,382 @@ if(typeof jQuery === 'undefined') {
35 36
				throw new Error("no found model [" + deps[i] + "]");
36 37
			}
37 38
		}
38
		handle.apply(win, dm);
39
		return handle.apply(win, dm);
39 40
	};
41

42
	$.define(["jQuery", "body", "win", "doc"], "util", function($,body, win, doc) {
43
		var rclass = /[\t\r\n\f]/g,
44
			noop = function() {},
45
			infoDiv = $("#g_info"),
46
			errDiv = $("#g_err"),
47
			warnDiv = $("#g_warn"),
48
			msgDiv = $("#g_msg"),
49
			err_msg = {},
50
			layer_curr = {
51
				index: 5000000,
52
				remove: noop,
53
				css: noop
54
			},
55
			layer_remove = function() {
56
				this.shade.remove();
57
				this.ctn.empty();
58
				this.ctn.remove();
59
				this.prev.css("display", "block");
60
				layer_curr = this.prev;
61
			},
62
			hideMsg = function(e) {
63
				$(this).parent().hide();
64
			},
65
			bindHide = function($p) {
66
				$p.find(".click-hide-parent").on("click", hideMsg);
67
			},
68
			fillContent = function($c /* child node [String|Function|jQObj] */ , $p) {
69
				if($c) {
70
					if(typeof $c === "string") {
71
						$p.html($c);
72
					} else if(typeof $c == "function") {
73
						$c.call($p);
74
					} else if($c.jquery) {
75
						$p.append($c);
76
					}
77
				}
78
			},
79
			modal = function(ctn) {
80
				var inx = layer_curr.index + 2,
81
					ly = {
82
						index: inx,
83
						remove: layer_remove,
84
						prev: layer_curr
85
					};
86
				ly.shade = $(
87
					"<div class='layer-shade layer-" + inx + "' style='z-index:" +
88
					inx + ";'></div>").appendTo(body);
89
				++inx;
90
				ly.ctn = $(
91
					"<div class='layer-ctn layer-" + inx + "' style='z-index:" +
92
					inx + ";'></div>").appendTo(body);
93
				ly.prev = layer_curr;
94
				layer_curr = ly;
95
				fillContent(ctn, ly.ctn);
96
				return ly;
97
			},
98
			rmModal = function() {
99
				layer_curr.remove();
100
			},
101

102
			// function error message
103
			errMsg = function($c, $t) {
104
				var $e = $(
105
						"<div class='err-ctn'><i class='icon click-hide-parent'></i></div>")
106
					.appendTo(errDiv);
107
				$("<span></span>").appendTo($e).html($c);
108
				bindHide($e);
109
				setTimeout(function() {
110
					$e.remove()
111
				}, $t ? $t : 10000);
112
			},
113
			// function warn message
114
			warnMsg = function($c, $t) {
115
				var $w = $(
116
						"<div class='warn-ctn'><i class='icon click-hide-parent'></i></div>")
117
					.appendTo(warnDiv);
118
				$("<span></span>").appendTo($w).html($c);
119
				bindHide($w);
120
				setTimeout(function() {
121
					$w.remove()
122
				}, $t ? $t : 3000);
123
			},
124
			msg = function($c, $t) {
125
				var $m = $(
126
						"<div class='warn-ctn'><i class='icon click-hide-parent'></i></div>")
127
					.appendTo(warnDiv);
128
				$("<span></span>").appendTo($w).html($c);
129
				bindHide($m);
130
				setTimeout(function() {
131
					$w.remove()
132
				}, $t ? $t : 3000);
133
			},
134
			loadref = 0,
135
			loadingDiv = $("#g_loading"),
136
			loading = function() {
137
				++loadref;
138
				if(loadref === 1) {
139
					loadingDiv.show()
140
				}
141
			},
142
			unLoading = function() {
143
				--loadref;
144
				if(loadref === 0) {
145
					loadingDiv.hide()
146
				}
147
			},
148
			alertMsg = function(title, content, hand) {
149
				if(content) {
150
					if($.isFunction(content)) {
151
						hand = content;
152
						content = title;
153
						title = "提示";
154
					}
155
				} else {
156
					content = title;
157
					title = "提示";
158
				}
159
				hand = hand || noop;
160
				var ly = modal('<div class="modal-dialog"><div class="modal-content"><div class="modal-header"><h4 class="modal-title"></h4></div><div class="modal-body"><p></p></div><div class="modal-footer"><button type="button" class="btn">关闭</button></div></div></div>');
161
				ly.ctn.find(".modal-title").text(title);
162
				$c = ly.ctn.find("p").text(content);
163
				ly.ctn.find("button").on("click", function() {
164
					rmModal();
165
					hand();
166
				});
167
			},
168
			bm_addBtn = function($p, $cp, $h) {
169
				var $b = $('<button type="button" class="btn"></button>').appendTo($p);
170
				$b.text($cp).on("click", function() {
171
					rmModal();
172
					$h();
173
				});
174
			},
175
			boxMsg = function(obj) {
176
				var ly = modal('<div class="modal-dialog"><div class="modal-content"><div class="modal-header"><h4 class="modal-title"></h4></div><div class="modal-body"><p></p></div><div class="modal-footer"></div></div></div>');
177
				ly.ctn.find(".modal-title").text(obj.title || "确认");
178
				ly.ctn.find("p").text(obj.content);
179
				var m_footer = ly.ctn.find(".modal-footer");
180
				for(var i = 0; i < obj.btns.length; ++i) {
181
					bm_addBtn(m_footer, obj.btns[i].caption || "no name", obj.btns[i].hand ||
182
						noop);
183
				}
184
			},
185
			serInArray = function(val, key, ret) {
186
				var t = $.type(val);
187
				if("boolean" === t) {
188
					ret.push(key + "=" + (val ? "1" : "0"));
189
				} else if("string" === t) {
190
					if(val) {
191
						ret.push(key + "=" + encodeURIComponent(val));
192
					}
193
				} else if("number" === t) {
194
					ret.push(key + "=" + val);
195
				} else {
196
					ret.push(key + "=" + encodeURIComponent(JSON.stringify(val)));
197
				}
198
			},
199
			serialize = function(obj) {
200
				var ret = [];
201
				if(obj) {
202
					for(key in obj) {
203
						var val = obj[key];
204
						var t = $.type(val);
205
						if("boolean" === t) {
206
							ret.push(key + "=" + (val ? "1" : "0"));
207
						} else if("string" === t) {
208
							if(val) {
209
								ret.push(key + "=" + encodeURIComponent(val));
210
							}
211
						} else if("number" === t) {
212
							ret.push(key + "=" + val);
213
						} else if("array" === t) {
214
							val.forEach(function(item) {
215
								serInArray(item, key, ret);
216
							});
217
						} else if("object" === t) {
218
							ret.push(key + "=" + encodeURIComponent(JSON.stringify(val)));
219
						}
220
					}
221
				}
222
				return ret.join("&");
223
			},
224
			g_def_err_hand = function(ep) {
225
				errMsg("http access error:\r\n" + JSON.stirngify(ep));
226
			},
227
			g_err = {
228
				"defErrHand": function(ep) {
229

230
				},
231
				"0": "未定义的错误",
232
				"1": function() {
233
					window.location.href = "login.html#" + encodeURIComponent(window.location.href);
234
				},
235
			},
236
			/**
237
			 * ep={code:"",msg:"",detailMsg:"",url:""} pa=function(code,msg,detailMsg)
238
			 * pa=boolean
239
			 */
240
			ajaxErrHand = function(errparam, errHand) {
241
				if(errHand) {
242
					var pt = $.type(errHand);
243
					if(pt == "booean") {
244
						g_def_err_hand(errparam);
245
					} else if(pt == "function") {
246
						errHand(errparam);
247
					} else {
248
						var ph = errHand[errparam.code] || g_err[errparam.code] || errHand["defErrHand"] ||
249
							g_err["defErrHand"];
250
						if(typeof ph === "string") {
251
							errMsg(ph);
252
						} else {
253
							ph(errparam);
254
						}
255
					}
256
				} else {
257
					var ph = g_err[errparam.code] || g_err["defErrHand"];
258
					if(typeof ph === "string") {
259
						errMsg(ph);
260
					} else {
261
						ph(errparam);
262
					}
263
				}
264
			},
265
			ajaxAccess = function(method, pUrl, pData, sh, eh, config) {
266
				config = config || {};
267
				if(false !== config.mask) {
268
					loading();
269
				}
270
				config.traditional = true;
271
				config.type = method;
272
				config.url = pUrl, config.data = pData;
273
				config.contentType = method === "put" ? "application/json" : "application/x-www-form-urlencoded";
274
				config.success = function(rd) {
275
					if(rd.success) {
276
						sh(rd.data);
277
					} else {
278
						rd.code = "" + rd.code;
279
						rd.url = pUrl;
280
						ajaxErrHand(rd, eh);
281
					}
282
				};
283
				config.error = function(jqXHR, textStatus, errorThrown) {
284
					ajaxErrHand({
285
						code: "err_" + (textStatus || ""),
286
						msg: textStatus,
287
						detailMsg: textStatus,
288
						xhr: jqXHR,
289
						eObj: errorThrown,
290
						url: pUrl
291
					}, eh);
292
				};
293
				$.ajax(config).always(false !== config.mask ? unLoading : noop);
294
			},
295
			buildElement = function(pe, obj) {
296
				if($.isArray(obj)) {
297
					obj.forEach(function(item) {
298
						buildElement(pe, item);
299
					});
300
				} else {
301
					var e;
302
					if(typeof obj === 'string') {
303
						e = doc.createTextNode(obj);
304
						pe.appendChild(e);
305
					} else {
306
						e = doc.createElement(obj.tn);
307
						pe.appendChild(e);
308
						if(obj.attrs && obj.attrs.length) {
309
							obj.attrs.forEach(function(attr) {
310
								e.setAttribute(attr.an, attr.av);
311
							});
312
						}
313
						if(obj.chs && obj.chs.length) {
314
							obj.chs.forEach(function(ch) {
315
								buildElement(e, ch);
316
							});
317
						}
318
					}
319
				}
320
			},
321

322
		ret= {
323
			classCheck: function(ele, clses) {
324
				var ret = {},
325
					cs = " " + (ele.getAttribute("class") || "") + " ",
326
					cls;
327
				for(var i = 0; i < clses.length; ++i) {
328
					var cls = clses[i];
329
					ret[cls] = cs.indexOf(" " + cls + " ") > -1;
330
				}
331
				return ret;
332
			},
333
			showModal: modal,
334
			closeModal: rmModal,
335
			showLoading: loading,
336
			hideLoading: unLoading,
337
			listModalIndex: function() {
338
				return layer_curr.index + 1;
339
			},
340
			error: errMsg,
341
			warn: warnMsg,
342
			msg: msg,
343
			alert: alertMsg,
344
			boxMsg: boxMsg,
345
			confirm: function(msg, yes, no) {
346
				bm({
347
					content: msg,
348
					btns: [{
349
						caption: "取消",
350
						hand: no || noop
351
					}, {
352
						caption: "确认",
353
						hand: yes
354
					}]
355
				});
356
			},
357
			get: function(url, data, sh, eh, config) {
358
				ajaxAccess("GET", url, data, sh, eh, config);
359
			},
360
			post: function(url, data, sh, eh, config) {
361
				ajaxAccess("POST", url, data, sh, eh, config);
362
			},
363
			put: function(url, data, sh, eh, config) {
364
				ajaxAccess("PUT", url, data ? JSON.stringify(data) : null, sh, eh,
365
					config);
366
			},
367
			del: function(url, sh, eh, pObj) {
368
				ajaxAccess("DELETE", url, null, sh, eh, pOjb);
369
			},
370
			noop: noop,
371
			nochange: function(d) { return d },
372
			returnTrue: function() {
373
				return true;
374
			},
375
			returnFalse: function() {
376
				return false;
377
			},
378
			addRules: function(target, rule) {
379
				var te = $.type(rule);
380
				if("function" === te) {
381
					target.push(rule);
382
				} else if("array" === te) {
383
					target.concat(rule);
384
				}
385
			},
386
			validate: function(rules, obj) {
387
				for(var i = 0; i < rules.length; ++i) {
388
					var ret = rules[i](obj);
389
					if(ret) {
390
						if(obj.invalid) {
391
							obj.invalid(ret);
392
						}
393
						return false;
394
					}
395
				}
396
				if(obj.valid) {
397
					obj.valid();
398
				}
399
				return true;
400
			},
401
			valid: function($e) {
402
				$e.removeClass("invald");
403
			},
404
			invalid: function($e) {
405
				$e.addClass("invald");
406
			},
407
			appendChild: function(e, obj) {
408
				var docf = doc.createDocumentFragment();
409
				buildElement(docf, obj);
410
				e.appendChild(docf);
411
			},
412
			serialize: serialize
413
		};
414
		$.util=ret;
415
		return ret;
416
	});
40 417
})(jQuery, window, document);

+ 2 - 2
js/datagrid.js

@ -23,8 +23,8 @@ $.define(["jQuery", "util", "form", "code"], "dataGrid", function($, util, form,
23 23
					$.extend(config, options);
24 24
				}
25 25
				return {
26
					code: config.c;
27
					form: config f;
26
					code:config.c,
27
					form:config.f,
28 28
					load: function() {
29 29
						config.f.doGet(config.uri, function(data) {
30 30
							config.c.val(data);

+ 5 - 4
js/dict.js

@ -84,9 +84,9 @@ $.define(["jQuery", "util"], "dict", function($, util) {
84 84
			},
85 85
			doTransfer: function() {
86 86
				$(".hand-dict").each(function() {
87
					var $this = $this;
88
					var dict = $this.attr("dict") || $this.attr("dictCode"),
89
						code = $this.attr("code") || $this.attr("itemCode");
87
					var $e = $(this);
88
					var dict = $e.attr("dict") || $e.attr("dictCode"),
89
						code = $e.attr("code") || $e.attr("itemCode");
90 90
					if(dict && code) {
91 91
						apply(dict, function(items) {
92 92
							var cp = getCap(items, code);
@ -97,9 +97,10 @@ $.define(["jQuery", "util"], "dict", function($, util) {
97 97
							}
98 98
						});
99 99
					}
100
					$this.removeClass("hand-dict");
100
					$e.removeClass("hand-dict");
101 101
				});
102 102
			}
103 103
		};
104
		$.dict=ret;
104 105
	return ret;
105 106
});

+ 1 - 1
js/form.js

@ -134,7 +134,7 @@ $.define(["jQuery", "util"], "form", function($, util) {
134 134
					},
135 135
					doPut: function(url, sh, eh, config) {
136 136
						if(this.validate()) {
137
							util.put(url, serialize(this.val()), sh, eh, config);
137
							util.put(url, this.val(), sh, eh, config);
138 138
						}
139 139
					}
140 140
				};

+ 5 - 5
js/model/sys/org/index.js

@ -3,16 +3,16 @@ spa_define(function(spa) {
3 3

4 4
	return {
5 5
		main: function() {
6
			var root = spa.mainEle.children(".sys_org_index");
6
			var root = spa.mainEle().children(".sys_org_index");
7 7
			var pdg = root.pdg();
8
			pdg.codeRef.shell("showDay", function(data, key) {
9
				if(data && data[key]) {
10
					var day = data[key];
8
			pdg.code.shell("showDay", function(env) {
9
				if(env.cd && env.cd[this.k]) {
10
					var day = env.cd[this.k];
11 11
					return day.substring(0, 4) + "年" + day.substring(4, 6) + "月" + day.substring(6, 8) + "日";
12 12
				}
13 13
				return "";
14 14
			});
15
			pdg.codeRef.addValueListener($.util.dictDisplay);
15
			pdg.code.listen($.dict.doTransfer);
16 16
			root.find(".opt-query").on("click", function() {
17 17
				//				console.log("dt load")
18 18
				pdg.load();

+ 4 - 4
js/pageDataGrid.js

@ -5,7 +5,7 @@ $.define(["jQuery", "util", "form", "code", "pager"], "pageDataGrid", function($
5 5
		derr = {},
6 6
		dajaxCfg = {},
7 7
		configPageIndex = function(fn, data) {
8
			if(fn && data  && data.data && data.length) {
8
			if(fn && data  && data.data && data.data.length) {
9 9
				var b = (data.pageNo - 1) * data.pageSize;
10 10
				data.data.forEach(function(obj) {
11 11
					++b;
@ -30,8 +30,8 @@ $.define(["jQuery", "util", "form", "code", "pager"], "pageDataGrid", function($
30 30
					$.extend(config, options);
31 31
				};
32 32
				var ret = {
33
					code: config.c;
34
					form: config f;
33
					code: config.c,
34
					form: config.f,
35 35
					load: function() {
36 36
						if(config.f.validate()) {
37 37
							config.cache = config.f.val();
@ -58,7 +58,7 @@ $.define(["jQuery", "util", "form", "code", "pager"], "pageDataGrid", function($
58 58
					}
59 59
				};
60 60
				config.p.onGo(function(no) {
61
					config.pageNo = no;
61
					config.cache[config.pnn] = no;
62 62
					ret.reload();
63 63
				});
64 64
				return ret;

+ 3 - 3
js/pager.js

@ -12,8 +12,8 @@ $.define(["jQuery", "util"], "pager", function($, util) {
12 12
			ret = [],
13 13
			clses, dpn, rpn;
14 14

15
		ret.push(li(no > 1 ? "active" ? "disabled", "«", no - 1));
16
		ret.push(li(no === 1 ? "curr" ? "active", "1", 1));
15
		ret.push(li(no > 1 ? "active":"disabled", "«", no - 1));
16
		ret.push(li(no === 1 ? "curr" :"active", "1", 1));
17 17

18 18
		if(no > 4) {
19 19
			ret.push(sli);
@ -35,7 +35,7 @@ $.define(["jQuery", "util"], "pager", function($, util) {
35 35
		if(pages != no) {
36 36
			ret.push(li("active", pages, pages));
37 37
		}
38
		ret.push(li(no != pages ? "active" ? "disabled", "»", no + 1));
38
		ret.push(li(no != pages ? "active" :"disabled", "»", no + 1));
39 39
		return ret;
40 40

41 41
	}

+ 12 - 9
js/spa.js

@ -43,7 +43,7 @@ $.define(["jQuery", "util", "doc", "win", "body"], "spa", function($, util, doc,
43 43
			}, cfg.error, cfg.ajaxCfg);
44 44
		},
45 45
		build_menu = function(menu) {
46
			if(menuEle && emnuEle.length && menu && menu.length) {
46
			if(menuEle && menuEle.length && menu && menu.length) {
47 47
				var ul = { tn: "ul", attrs: [{ an: "class", av: "nav nav-root" }], chs: [] };
48 48
				build_menu_item(ul.chs, menu);
49 49
				menuEle.empty();
@ -80,7 +80,7 @@ $.define(["jQuery", "util", "doc", "win", "body"], "spa", function($, util, doc,
80 80
				chses.push(lia);
81 81
				var ic = "icon-" + (item.icon || (item.res ? "book" : "branch"));
82 82
				lia.chs.push({ tn: "i", attrs: [{ an: "class", av: ic }] });
83
				lia.push(item.caption);
83
				lia.chs.push(item.caption);
84 84
				var lac = "";
85 85
				if(item.res) {
86 86
					lia.attrs.push({ an: "res", av: item.res });
@ -225,7 +225,7 @@ $.define(["jQuery", "util", "doc", "win", "body"], "spa", function($, util, doc,
225 225
					util.showLoading();
226 226
				}
227 227
				try {
228
					scriptCache[model.script] = model.factory = factoryBuilder();
228
					scriptCache[model.script] = model.factory = factoryBuilder(spa);
229 229
					model.state = 31;
230 230
					if(cfg.mask) {
231 231
						util.hideLoading();
@ -383,8 +383,8 @@ $.define(["jQuery", "util", "doc", "win", "body"], "spa", function($, util, doc,
383 383
		},
384 384
		build = function(config) {
385 385
			$.extend(cfg, config);
386
			resUri = cfg.resUri || body.attr("resUri");
387
			menuUri = cfg.resUri || body.attr("menuUri");
386
			resUri = cfg.resUri || body.attr("resource");
387
			menuUri = cfg.menuUri || body.attr("menu");
388 388
			mainEle = cfg.mainEle || $(".spa-main");
389 389
			menuEle = cfg.menuEle || $(".spa-menu");
390 390
			resCache = cfg.resCache || resCache;
@ -392,15 +392,18 @@ $.define(["jQuery", "util", "doc", "win", "body"], "spa", function($, util, doc,
392 392
			htmlCache["#"] = "#";
393 393
			if(cfg.loadEnabled) load_res();
394 394
		},
395
		ret = {
395
	    spa = {
396 396
			build: build,
397 397
			closeModal: closeModal,
398 398
			getLastModalModel: getLastModalModel,
399 399
			getLastModalCtn: getLastModalCtn,
400 400
			getLastModalIndex: getLastModalIndex,
401 401
			showMain: showMain,
402
			showModal: showModal
402
			showModal: showModal,
403
			mainEle:function(){
404
				return mainEle;
405
			}
403 406
		};
404
		$.spa=ret;
405
	return ret;
407
		$.spa=spa;
408
	return spa;
406 409
});

+ 2 - 2
js/text.js

@ -35,7 +35,7 @@ $.use(["jQuery", "form", "util"], function($, form, util) {
35 35
				name: n,
36 36
				get: function() {
37 37
					if(!cls[showOnly]) {
38
						var vd = ve.val();
38
						var vd = cls[trim]?ve.val().trim():ve.val();
39 39
						if(vd) {
40 40
							if(cls[tInt]) {
41 41
								vd = parseInt(vd);
@ -58,7 +58,7 @@ $.use(["jQuery", "form", "util"], function($, form, util) {
58 58
				},
59 59
				validate: function() {
60 60
					if(cls[required]) {
61
						if(!ve.val()) {
61
						if(!ve.val().trim()) {
62 62
							return "不可为空或空字符串";
63 63
						}
64 64
					}

+ 2 - 2
js/textarea.js

@ -32,8 +32,8 @@ $.use(["jQuery", "form", "util"], function($, form, util) {
32 32
				name: n,
33 33
				get: function() {
34 34
					if(!cls[showOnly]) {
35
						var vd = ve.val();
36
						return vd?(cls[trim]?vd.trim():vd):undefined;
35
						var vd = cls[trim]?ve.val().trim():ve.val();
36
						return vd?vd:undefined;
37 37
					}
38 38
				},
39 39
				set: function(data) {

+ 0 - 371
js/util.js

@ -1,371 +0,0 @@
1
$.define(["jQuery", "body", "win","doc"], "util", function($, $body, win,doc) {
2
	var rclass = /[\t\r\n\f]/g,
3
		noop = function() {},
4
		infoDiv = $("#g_info"),
5
		errDiv = $("#g_err"),
6
		warnDiv = $("#g_warn"),
7
		msgDiv = $("#g_msg"),
8
		err_msg = {},
9
		layer_curr = {
10
			index: 5000000,
11
			remove: noop,
12
			css: noop
13
		},
14
		layer_remove = function() {
15
			this.shade.remove();
16
			this.ctn.empty();
17
			this.ctn.remove();
18
			this.prev.css("display", "block");
19
			layer_curr = this.prev;
20
		},
21
		hideMsg = function(e) {
22
			$(this).parent().hide();
23
		},
24
		bindHide = function($p) {
25
			$p.find(".click-hide-parent").on("click", hideMsg);
26
		},
27
		fillContent = function($c /* child node [String|Function|jQObj] */ , $p) {
28
			if($c) {
29
				if(typeof $c === "string") {
30
					$p.html(p);
31
				} else if(typeof p == "function") {
32
					$c.call($p);
33
				} else if($c.jquery) {
34
					$p.append($c);
35
				}
36
			}
37
		},
38
		modal = function(ctn) {
39
			var inx = layer_curr.index + 2,
40
				ly = {
41
					index: inx,
42
					remove: layer_remove,
43
					prev: layer_curr
44
				};
45
			ly.shade = $(
46
				"<div class='layer-shade layer-" + inx + "' style='z-index:" +
47
				inx + ";'></div>").appendTo(body);
48
			++inx;
49
			ly.ctn = $(
50
				"<div class='layer-ctn layer-" + inx + "' style='z-index:" +
51
				inx + ";'></div>").appendTo(body);
52
			ly.prev = layer_curr;
53
			layer_curr = ly;
54
			fillContent(ctn, ly.ctn);
55
			return ly;
56
		},
57
		rmModal = function() {
58
			layer_curr.remove();
59
		},
60
61
		// function error message
62
		errMsg = function($c, $t) {
63
			var $e = $(
64
					"<div class='err-ctn'><i class='icon click-hide-parent'></i></div>")
65
				.appendTo(errDiv);
66
			$("<span></span>").appendTo($e).html($c);
67
			bindHide($e);
68
			setTimeout(function() {
69
				$e.remove()
70
			}, $t ? $t : 10000);
71
		},
72
		// function warn message
73
		warnMsg = function($c, $t) {
74
			var $w = $(
75
					"<div class='warn-ctn'><i class='icon click-hide-parent'></i></div>")
76
				.appendTo(warnDiv);
77
			$("<span></span>").appendTo($w).html($c);
78
			bindHide($w);
79
			setTimeout(function() {
80
				$w.remove()
81
			}, $t ? $t : 3000);
82
		},
83
		msg = function($c, $t) {
84
			var $m = $(
85
					"<div class='warn-ctn'><i class='icon click-hide-parent'></i></div>")
86
				.appendTo(warnDiv);
87
			$("<span></span>").appendTo($w).html($c);
88
			bindHide($m);
89
			setTimeout(function() {
90
				$w.remove()
91
			}, $t ? $t : 3000);
92
		},
93
		loadref = 0,
94
		loadingDiv = $("#g_loading"),
95
		loading = function() {
96
			++loadref;
97
			if(loadref === 1) {
98
				loadingDiv.show()
99
			}
100
		},
101
		unLoading = function() {
102
			--loadref;
103
			if(loadref === 0) {
104
				loadingDiv.hide()
105
			}
106
		},
107
		alertMsg = function(title, content, hand) {
108
			if(content) {
109
				if($.isFunction(content)) {
110
					hand = content;
111
					content = title;
112
					title = "提示";
113
				}
114
			} else {
115
				content = title;
116
				title = "提示";
117
			}
118
			hand = hand || noop;
119
			var ly = modal('<div class="modal-dialog"><div class="modal-content"><div class="modal-header"><h4 class="modal-title"></h4></div><div class="modal-body"><p></p></div><div class="modal-footer"><button type="button" class="btn">关闭</button></div></div></div>');
120
			ly.ctn.find(".modal-title").text(title);
121
			$c = ly.ctn.find("p").text(content);
122
			ly.ctn.find("button").on("click", function() {
123
				rmModal();
124
				hand();
125
			});
126
		},
127
		bm_addBtn = function($p, $cp, $h) {
128
			var $b = $('<button type="button" class="btn"></button>').appendTo($p);
129
			b.text($cp).on("click", function() {
130
				rmModal(), $h()
131
			});
132
		},
133
		bm = function(obj) {
134
			var ly = modal('<div class="modal-dialog"><div class="modal-content"><div class="modal-header"><h4 class="modal-title"></h4></div><div class="modal-body"><p></p></div><div class="modal-footer"></div></div></div>');
135
			ly.ctn.find(".modal-title").text(obj.title || "确认");
136
			ly.ctn.find("p").text(obj.content);
137
			var m_footer = ly.ctn.find(".modal-footer"),
138
				btnH = function(btn) {
139
					var $btn = $('<button type="button" class="btn"></button>')
140
						.appendTo(m_footer);
141
					var caption = btn.caption || "未命名的",
142
						handler = btn.hand || noop;
143
					$btn.text(caption);
144
					$btn.on("click", function() {
145
						util.closeModalLayer();
146
						handler();
147
					});
148
				};
149
			for(var i = 0; i < obj.btns.length; ++i) {
150
				bm_addBtn(m_footer, btns[i].caption || "no name", btns[i].hand ||
151
					noop);
152
			}
153
		},
154
		serInArray=function(val,key,ret){
155
			var t = $.type(val);
156
			if("boolean"===t){
157
				ret.push(key+"="+(val?"1":"0"));
158
			}else if("string"=== t){
159
				if(val){
160
					ret.push(key+"="+encodeURIComponent(val));
161
				}
162
			}else if("number"=== t){
163
				ret.push(key+"="+val);
164
			}else{
165
				ret.push(key+"="+encodeURIComponent(JSON.stringify(val)));
166
			}
167
		},
168
		serialize=function(obj){
169
			var ret =[];
170
			if(obj){
171
			for(key in obj){
172
				var val = obj[key];
173
				var t = $.type(val);
174
				if("boolean"===t){
175
					ret.push(key+"="+(val?"1":"0"));
176
				}else if("string"=== t){
177
					if(val){
178
						ret.push(key+"="+encodeURIComponent(val));
179
					}
180
				}else if("number"=== t){
181
					ret.push(key+"="+val);
182
				}else if("array"===t){
183
					val.forEach(function(item){
184
						serInArray(item,key,ret);
185
					});
186
				}else if("object"=== t){
187
					ret.push(key+"="+encodeURIComponent(JSON.stringify(val)));
188
				}
189
			}}
190
			return ret.join("&");
191
		},
192
		g_def_err_hand = function(ep) {
193
			errMsg("http access error:\r\n" + JSON.stirngify(ep));
194
		},
195
		g_err = {
196
			"defErrHand": function(ep) {
197
198
			},
199
			"0": "未定义的错误",
200
		},
201
		/**
202
		 * ep={code:"",msg:"",detailMsg:"",url:""} pa=function(code,msg,detailMsg)
203
		 * pa=boolean
204
		 */
205
		ajaxErrHand = function(errparam, errHand) {
206
			if(errHand) {
207
				var pt = $.type(errHand);
208
				if(pt == "booean") {
209
					g_def_err_hand(errparam);
210
				} else if(pt == "function") {
211
					errHand(errparam);
212
				} else {
213
					var ph = errHand[errparam.code] || g_err[errparam.code] || errHand["defErrHand"] ||
214
						g_err["defErrHand"];
215
					if(typeof ph === "string") {
216
						errMsg(ph);
217
					} else {
218
						ph(errparam);
219
					}
220
				}
221
			}
222
		},
223
		ajaxAccess = function(method, pUrl, pData, sh, eh, config) {
224
			config = config || {};
225
			if(false !== config.mask){
226
				loading();
227
			}
228
			config.traditional = true;
229
			config.type = method;
230
			config.url = pUrl, config.data = pData;
231
			config.contentType = method === "put" ? "application/json" : "application/x-www-form-urlencoded";
232
			config.success = function(rd) {
233
				if(rd.success) {
234
					sh(rd.data);
235
				} else {
236
					rd.code = "" + rd.code;
237
					rd.url = pUrl;
238
					ajaxErrHand(rd, eh);
239
				}
240
			};
241
			config.error = function(jqXHR, textStatus, errorThrown) {
242
				ajaxErrHand({
243
					code: "err_"+(textStatus || ""),
244
					msg: textStatus,
245
					detailMsg: textStatus,
246
					xhr: jqXHR,
247
					eObj: errorThrown,
248
					url: pUrl
249
				}, eh);
250
			};
251
			$.ajax(config).always(false !== config.mask ? unLoading : noop);
252
		},
253
		buildElement = function(pe, obj) {
254
			if($.isArray(obj)) {
255
				obj.forEach(function(item) {
256
					buildElement(pe, item);
257
				});
258
			}else{
259
			var e;
260
			if(typeof obj === 'string') {
261
				e = doc.createTextNode(obj);
262
				pe.appendChild(e);
263
			} else {
264
				e = doc.createElement(obj.tn);
265
				pe.appendChild(e);
266
				if(obj.attrs && obj.attrs.length) {
267
					obj.attrs.forEach(function(attr) {
268
						e.setAttribute(attr.an, attr.av);
269
					});
270
				}
271
				if(obj.chs && obj.chs.length) {
272
					obj.chs.forEach(function(ch) {
273
						buildElement(e, ch);
274
					});
275
				}
276
			}}
277
		};
278
279
	return {
280
		classCheck: function(ele, clses) {
281
			var ret = {},
282
				cs = " " + (ele.getAttribute("class") || "") + " ",
283
				cls;
284
			for(var i = 0; i < clses.length; ++i) {
285
				var cls = clses[i];
286
				ret[cls] = cs.indexOf(" " + cls + " ") > -1;
287
			}
288
			return ret;
289
		},
290
		showModal: modal,
291
		closeModal: rmModal,
292
		showLoading: loading,
293
		hideLoading: unLoading,
294
		listModalIndex: function() {
295
			return lay_curr.index + 1;
296
		},
297
		error: errMsg,
298
		warn: warnMsg,
299
		msg: msg,
300
		alert: alertMsg,
301
		boxMsg: boxMsg,
302
		confirm: function(msg, yes, no) {
303
			bm({
304
				content: msg,
305
				btns: [{
306
					caption: "取消",
307
					hand: no || noop
308
				}, {
309
					caption: "确认",
310
					hand: yes
311
				}]
312
			});
313
		},
314
		get: function(url, data, sh, eh, config) {
315
			ajaxAccess("GET", url, data, sh, eh, config);
316
		},
317
		post: function(url, data, sh, eh, config) {
318
			ajaxAccess("POST", url, data, sh, eh, config);
319
		},
320
		put: function(url, data, sh, eh, config) {
321
			ajaxAccess("PUT", url, data ? JSON.stringify(data) : null, sh, eh,
322
				config);
323
		},
324
		del: function(url, sh, eh, pObj) {
325
			ajaxAccess("DELETE", url, null, sh, eh, pOjb);
326
		},
327
		noop: noop,
328
		nochange:function(d){return d},
329
		returnTrue: function() {
330
			return true;
331
		},
332
		returnFalse: function() {
333
			return false;
334
		},
335
		addRules: function(target, rule) {
336
			var te = $.type(rule);
337
			if("function" === te) {
338
				target.push(rule);
339
			} else if("array" === te) {
340
				target.concat(rule);
341
			}
342
		},
343
		validate: function(rules, obj) {
344
			for(var i = 0; i < rules.length; ++i) {
345
				var ret = rules[i](obj);
346
				if(ret) {
347
					if(obj.invalid) {
348
						obj.invalid(ret);
349
					}
350
					return false;
351
				}
352
			}
353
			if(obj.valid) {
354
				obj.valid();
355
			}
356
			return true;
357
		},
358
		valid: function($e) {
359
			$e.removeClass("invald");
360
		},
361
		invalid: function($e) {
362
			$e.addClass("invald");
363
		},
364
		appendChild: function(e, obj) {
365
			var docf = doc.createDocumentFragment();
366
			buildElement(docf, obj);
367
			e.appendChild(docf);
368
		},
369
		serialize:serialize
370
	};
371
});