if(typeof jQuery === 'undefined') {
	throw new Error('this JavaScript requires jQuery')
} +

!(function($, win, doc) {
	var mds = {};
	mds["jQuery"] = $;
	mds["win"] = win;
	mds["doc"] = doc;
	mds["body"] = $("body");
	$.define = function(deps, id, factory) {
		var dm = [];
		for(var i = 0; i < deps.length; ++i) {
			var dep = mds[deps[i]];
			if(dep) {
				dm.push(dep);
			} else {
				throw new Error("no found model [" + deps[i] + "]");
			}
		}
		try {
			var md = factory.apply(win, dm);
			mds[id] = md;
			return md;
		} catch(err) {
			throw new Error("build model[" + id + "] error:"+err);
		}
	};
	$.use = function(deps, handle) {
		var dm = [];
		for(var i = 0; i < deps.length; ++i) {
			var dep = mds[deps[i]];
			if(dep) {
				dm.push(dep);
			} else {
				throw new Error("no found model [" + deps[i] + "]");
			}
		}
		return handle.apply(win, dm);
	};

	$.define(["jQuery", "body", "win", "doc"], "util", function($,body, win, doc) {
		var rclass = /[\t\r\n\f]/g,
			noop = function() {},
			valCache ={},
			infoDiv = $("#g_info"),
			errDiv = $("#g_err"),
			warnDiv = $("#g_warn"),
			msgDiv = $("#g_msg"),
			err_msg = {},
			layer_css=function(){
				this.shade.css("display", "block");
			},
			layer_curr = {
				index: 5000000,
				remove: noop,
				css: noop
			},
			layer_remove = function() {
				this.shade.remove();
				this.ctn.empty();
				this.ctn.remove();
				this.prev.css("display", "block");
				layer_curr = this.prev;
			},
			hideMsg = function(e) {
				$(this).parent().hide();
			},
			bindHide = function($p) {
				$p.find(".click-hide-parent").on("click", hideMsg);
			},
			fillContent = function($c /* child node [String|Function｜jQObj] */ , $p) {
				if($c) {
					if(typeof $c === "string") {
						$p.html($c);
					} else if(typeof $c == "function") {
						$c.call($p);
					} else if($c.jquery) {
						$p.append($c);
					}
				}
			},
			modal = function(ctn) {
				var inx = layer_curr.index + 2,
					ly = {
						index: inx,
						remove: layer_remove,
						prev: layer_curr,
						css:layer_css
					};
				ly.shade = $(
					"<div class='layer-shade layer-" + inx + "' style='z-index:" +
					inx + ";'></div>").appendTo(body);
				++inx;
				ly.ctn = $(
					"<div class='layer-ctn layer-" + inx + "' style='z-index:" +
					inx + ";'></div>").appendTo(body);
				ly.prev = layer_curr;
				layer_curr = ly;
				fillContent(ctn, ly.ctn);
				return ly;
			},
			rmModal = function() {
				layer_curr.remove();
			},

			// function error message
			errMsg = function($c, $t) {
				var $e = $(
						"<div class='err-ctn'><i class='icon click-hide-parent'></i></div>")
					.appendTo(errDiv);
				$("<span></span>").appendTo($e).html($c);
				bindHide($e);
				setTimeout(function() {
					$e.remove()
				}, $t ? $t : 10000);
			},
			// function warn message
			warnMsg = function($c, $t) {
				var $w = $(
						"<div class='warn-ctn'><i class='icon click-hide-parent'></i></div>")
					.appendTo(warnDiv);
				$("<span></span>").appendTo($w).html($c);
				bindHide($w);
				setTimeout(function() {
					$w.remove()
				}, $t ? $t : 3000);
			},
			msg = function($c, $t) {
				var $m = $(
						"<div class='warn-ctn'><i class='icon click-hide-parent'></i></div>")
					.appendTo(warnDiv);
				$("<span></span>").appendTo($w).html($c);
				bindHide($m);
				setTimeout(function() {
					$w.remove()
				}, $t ? $t : 3000);
			},
			loadref = 0,
			loadingDiv = $("#g_loading"),
			loading = function() {
				++loadref;
				if(loadref === 1) {
					loadingDiv.show()
				}
			},
			unLoading = function() {
				--loadref;
				if(loadref === 0) {
					loadingDiv.hide()
				}
			},
			alertMsg = function(title, content, hand) {
				if(content) {
					if($.isFunction(content)) {
						hand = content;
						content = title;
						title = "提示";
					}
				} else {
					content = title;
					title = "提示";
				}
				hand = hand || noop;
				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>');
				ly.ctn.find(".modal-title").text(title);
				$c = ly.ctn.find("p").text(content);
				ly.ctn.find("button").on("click", function() {
					rmModal();
					hand();
				});
			},
			bm_addBtn = function($p, $cp, $h) {
				var $b = $('<button type="button" class="btn"></button>').appendTo($p);
				$b.text($cp).on("click", function() {
					rmModal();
					$h();
				});
			},
			boxMsg = function(obj) {
				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>');
				ly.ctn.find(".modal-title").text(obj.title || "确认");
				ly.ctn.find("p").text(obj.content);
				var m_footer = ly.ctn.find(".modal-footer");
				for(var i = 0; i < obj.btns.length; ++i) {
					bm_addBtn(m_footer, obj.btns[i].caption || "no name", obj.btns[i].hand ||
						noop);
				}
			},
			serInArray = function(val, key, ret) {
				var t = $.type(val);
				if("boolean" === t) {
					ret.push(key + "=" + (val ? "1" : "0"));
				} else if("string" === t) {
					if(val) {
						ret.push(key + "=" + encodeURIComponent(val));
					}
				} else if("number" === t) {
					ret.push(key + "=" + val);
				} else {
					ret.push(key + "=" + encodeURIComponent(JSON.stringify(val)));
				}
			},
			serialize = function(obj) {
				var ret = [];
				if(obj) {
					for(key in obj) {
						var val = obj[key];
						var t = $.type(val);
						if("boolean" === t) {
							ret.push(key + "=" + (val ? "1" : "0"));
						} else if("string" === t) {
							if(val) {
								ret.push(key + "=" + encodeURIComponent(val));
							}
						} else if("number" === t) {
							ret.push(key + "=" + val);
						} else if("array" === t) {
							val.forEach(function(item) {
								serInArray(item, key, ret);
							});
						} else if("object" === t) {
							ret.push(key + "=" + encodeURIComponent(JSON.stringify(val)));
						}
					}
				}
				return ret.join("&");
			},
			g_def_err_hand = function(ep) {
				errMsg("http access error:\r\n" + JSON.stirngify(ep));
			},
			g_err = {
				"defErrHand": function(ep) {
					errMsg(JSON.stringify(ep));
				},
				"0": "未定义的错误",
				"1": function() {
					window.location.href = "login.html#" + encodeURIComponent(window.location.href);
				},
			},
			/**
			 * ep={code:"",msg:"",detailMsg:"",url:""} pa=function(code,msg,detailMsg)
			 * pa=boolean
			 */
			defErrHand = function(errparam, errHand) {
				if(errHand) {
					var pt = $.type(errHand);
					if(pt == "booean") {
						g_def_err_hand(errparam);
					} else if(pt == "function") {
						errHand(errparam);
					} else {
						var ph = errHand[errparam.code] || g_err[errparam.code] || errHand["defErrHand"] ||
							g_err["defErrHand"];
						if(typeof ph === "string") {
							errMsg(ph);
						} else {
							ph(errparam);
						}
					}
				} else {
					var ph = g_err[errparam.code] || g_err["defErrHand"];
					if(typeof ph === "string") {
						errMsg(ph);
					} else {
						ph(errparam);
					}
				}
			},
			ajaxAccess = function(method, pUrl, pData, sh, eh, config) {
				config = config || {};
				if(false !== config.mask) {
					loading();
				}
				config.traditional = true;
				config.type = method;
				config.url = pUrl, config.data = pData;
				config.contentType = method === "put" ? "application/json" : "application/x-www-form-urlencoded";
				config.success = function(rd) {
					if(rd.success) {
						sh(rd.data);
					} else {
						rd.code = "" + rd.code;
						rd.url = pUrl;
						defErrHand(rd, eh);
					}
				};
				config.error = function(jqXHR, textStatus, errorThrown) {
					defErrHand({
						code: "err_" + (textStatus || ""),
						msg: textStatus,
						detailMsg: textStatus,
						xhr: jqXHR,
						eObj: errorThrown,
						url: pUrl
					}, eh);
				};
				$.ajax(config).always(false !== config.mask ? unLoading : noop);
			},
			buildElement = function(pe, obj) {
				if($.isArray(obj)) {
					obj.forEach(function(item) {
						buildElement(pe, item);
					});
				} else {
					var e;
					if(typeof obj === 'string') {
						e = doc.createTextNode(obj);
						pe.appendChild(e);
					} else {
						e = doc.createElement(obj.tn);
						pe.appendChild(e);
						if(obj.attrs && obj.attrs.length) {
							obj.attrs.forEach(function(attr) {
								e.setAttribute(attr.an, attr.av);
							});
						}
						if(obj.chs && obj.chs.length) {
							obj.chs.forEach(function(ch) {
								buildElement(e, ch);
							});
						}
					}
				}
			},

		ret= {
			classCheck: function(ele, clses) {
				var ret = {},
					cs = " " + (ele.getAttribute("class") || "") + " ",
					cls;
				for(var i = 0; i < clses.length; ++i) {
					var cls = clses[i];
					ret[cls] = cs.indexOf(" " + cls + " ") > -1;
				}
				return ret;
			},
			showModal: modal,
			closeModal: rmModal,
			showLoading: loading,
			hideLoading: unLoading,
			listModalIndex: function() {
				return layer_curr.index + 1;
			},
			error: errMsg,
			warn: warnMsg,
			msg: msg,
			alert: alertMsg,
			boxMsg: boxMsg,
			confirm: function(msg, yes, no) {
				bm({
					content: msg,
					btns: [{
						caption: "取消",
						hand: no || noop
					}, {
						caption: "确认",
						hand: yes
					}]
				});
			},
			get: function(url, data, sh, eh, config) {
				ajaxAccess("GET", url, data, sh, eh, config);
			},
			post: function(url, data, sh, eh, config) {
				ajaxAccess("POST", url, data, sh, eh, config);
			},
			put: function(url, data, sh, eh, config) {
				ajaxAccess("PUT", url, data ? JSON.stringify(data) : null, sh, eh,
					config);
			},
			del: function(url, sh, eh, pObj) {
				ajaxAccess("DELETE", url, null, sh, eh,pObj);
			},
			noop: noop,
			nochange: function(d) { return d },
			returnTrue: function() {
				return true;
			},
			returnFalse: function() {
				return false;
			},
			addRules: function(target, rule) {
				var te = $.type(rule);
				if("function" === te) {
					target.push(rule);
				} else if("array" === te) {
					rule.forEach(function(item){target.push(item)});
				}
			},
			validate: function(rules, obj) {
				for(var i = 0; i < rules.length; ++i) {
					var ret = rules[i](obj);
					if(ret) {
						if(obj.invalid) {
							obj.invalid(ret);
						}
						return false;
					}
				}
				if(obj.valid) {
					obj.valid();
				}
				return true;
			},
			valid: function($e) {
				$e.removeClass("invalid");
			},
			invalid: function($e) {
				$e.addClass("invalid");
			},
			appendChild: function(e, obj) {
				var docf = doc.createDocumentFragment();
				buildElement(docf, obj);
				e.appendChild(docf);
			},
			serialize: serialize,
			data:function(k,v){
				if(arguments.length>1){
					valCache[k]=v;
				}else if(k){
					return valCache[k];
				}
			},
			raise:function(err){defErrHand(err)}
		};
		$.util=ret;
		return ret;
	});
})(jQuery, window, document);

Date.prototype.format = function (fmt) {
    var o = {
        "M+": this.getMonth() + 1, //月份
        "d+": this.getDate(), //日
        "h+": this.getHours(), //小时
        "m+": this.getMinutes(), //分
        "s+": this.getSeconds(), //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
};