Keine Beschreibung

base.js 64KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207
  1. if(typeof jQuery === 'undefined') {
  2. throw new Error('this JavaScript requires jQuery')
  3. } +
  4. function($) {
  5. /*common css define
  6. * QF = query flag
  7. * CC = css class
  8. */
  9. var
  10. CC_BRANCH_ITEM = "branch-item",
  11. QF_BRANCH_ITEM = ".branch-item > a",
  12. CC_TREE = "tree",
  13. QF_SELECT = ".select",
  14. CC_SELECT = "select",
  15. QF_HIDDEN = ".hidden",
  16. CC_HIDDEN = "hidden",
  17. QF_TEXT = ".text",
  18. CC_TEXT = "text",
  19. CC_FORM_ITEM = "form-item",
  20. QF_FORM_ITEM = ".form-item",
  21. CC_TRIM = "trim",
  22. CC_STRING = "string",
  23. CC_INT = "int",
  24. CC_BOOL = "bool",
  25. CC_FLOAT = "float",
  26. CC_SELECT_ITEM = "select-item",
  27. QF_SELECT_ITEM = ".select-item",
  28. CC_SELECT_CAPTION = "select-caption",
  29. QF_SELECT_CAPTION = ".select-caption",
  30. CC_READONLY = "readOnly",
  31. CC_SHOWONLY = "showOnly",
  32. QF_DROP_DOWN_CONTAINER = ".dd-ctn",
  33. CC_DROP_DOWN_CONTAINER = "dd-ctn",
  34. CC_DROP_DOWN_BACKGROUP = "dd-bg",
  35. QF_DROP_DOWN_BACKGROUP = ".dd-bg",
  36. CC_DROP_DOWN_HAND = "dd-hand",
  37. QF_DROP_DOWN_HAND = ".dd-hand",
  38. CC_DROP_DOWN_PANEL = "dd-drop",
  39. QF_DROP_DOWN_PANEL = ".dd-drop",
  40. CC_DROP_CLEAN = "dd-clean",
  41. QF_DROP_CLEAN = ".dd-clean",
  42. QF_OPEN = ".open",
  43. CC_OPEN = "open",
  44. CC_DISABLED = "disabled",
  45. QF_DISABLED = ".disabled :disabled";
  46. /*
  47. * AK = attribate key
  48. * DK = data key
  49. * EN = element name
  50. * TN = type name
  51. * CK = const data key
  52. *
  53. */
  54. var AK_DEF_VAL = "defVal",
  55. AK_PLACEHOLDER = "placeholder",
  56. AK_ID = "id",
  57. AK_NAME = "name",
  58. AK_DICT_CODE = "dictCode",
  59. AK_CODE = "code",
  60. AK_READONLY = "readonly",
  61. AK_REQUIRED = "required",
  62. EN_HEAD, EN_BASE = "base",
  63. EN_SCRIPT = "script",
  64. EN_INPUT = "input",
  65. TN_STRING = CC_STRING,
  66. TN_NUMBER = "number",
  67. TN_ARRAY = "array",
  68. TN_OBJ = "object",
  69. TN_FNC = "function",
  70. TN_BOOL = "boolean",
  71. CK_TRUE = true,
  72. CK_FALSE = false,
  73. CK_UNDEF = undefined,
  74. CK_YYYYMMDD = "YYYYMMDD",
  75. CK_YYYY = "YYYY",
  76. CK_MM = "MM",
  77. CK_YYYYMM = "YYYYMM",
  78. DK_FORM_VALUE = "form_value";
  79. /**
  80. * TK = template key
  81. */
  82. var TK_TEXT_INPUT = "<input type='text' />",
  83. TK_SPAN = "<span></span>",
  84. TK_UL = "<ul></ul>",
  85. TK_LI = "<li></li>",
  86. TK_ICON = "<i class='icon'></i>",
  87. TK_DD_DROP = "<div class='dd-drop'></div>",
  88. TK_DD_HAND = "<a class='dd-hand' href='javascript:;'><i class='icon'></i></a>",
  89. TK_HIDDEN_INPUT = "<input type='hidden' />",
  90. doc = document,
  91. head = doc.head || doc.getElementsByTagName(EN_HEAD)[0] || doc.documentElement,
  92. baseElement = head.getElementsByTagName(EN_BASE)[0],
  93. noop = function() {},
  94. body = $("body"),
  95. returnFalse = function() {
  96. return CK_FALSE
  97. },
  98. returnTrue = function() {
  99. return CK_TRUE
  100. },
  101. _infoDiv = $("#g_info"),
  102. _errDiv = $("#g_err"),
  103. _warnDiv = $("#g_warn"),
  104. _msgDiv = $("#g_msg"),
  105. _loadingDiv = $("#g_loading"),
  106. _g_css_ref = 1,
  107. _g_script_ref = 1,
  108. _g_err_msg = {
  109. "1": function() {
  110. window.location.href = "login.html";
  111. }
  112. },
  113. _g_layer_curr = { index: 5000000, remove: noop, css: noop },
  114. layer_remove = function() {
  115. this.shade.remove();
  116. this.ctn.empty();
  117. this.ctn.remove();
  118. this.prev.css("display", "block");
  119. _g_layer_curr = this.prev;
  120. },
  121. _g_loadRef = 0;
  122. var util = {
  123. createModalLayer: function(p) {
  124. var inx = _g_layer_curr.index + 2;
  125. var ly = { index: inx, remove: layer_remove, prev: _g_layer_curr };
  126. ly.shade = $("<div class='layer-shade layer-" + inx + "' style='z-index:" + inx + ";'></div>").appendTo(body);
  127. ++inx;
  128. ly.ctn = $("<div class='layer-ctn layer-" + inx + "' style='z-index:" + inx + ";'></div>").appendTo(body);
  129. ly.prev = _g_layer_curr;
  130. _g_layer_curr = ly;
  131. if(p) {
  132. if(typeof p === "string") {
  133. ly.ctn.html(p);
  134. } else if(typeof p == "function") {
  135. p.call(ly.ctn);
  136. } else if(p.jquery) {
  137. ly.ctn.append(p);
  138. }
  139. }
  140. return ly;
  141. },
  142. closeModalLayer: function() {
  143. _g_layer_curr.remove();
  144. },
  145. // parent is body z-index = 9999999
  146. // *弹出错误信息,会自动消失
  147. //cnt String or jquery obj
  148. //msg container is div
  149. //$(msg container).text(String) or $(msg container).append(jquery obj);
  150. error: function(cnt, timeInternal) {
  151. var $errCtn = $("<div class='err-ctn'><i class='icon click-hide-parent'></i></div>").appendTo(_errDiv);
  152. $(TK_SPAN).appendTo($errCtn).html(cnt);
  153. setTimeout(function() {
  154. $errCtn.remove()
  155. }, timeInternal ? timeInternal : 10000);
  156. },
  157. //弹出警告信息,会自动消失 ref Util.error
  158. warn: function(cnt, timeInternal) {
  159. var $warnCtn = $("<div class='warn-ctn'><i class='icon click-hide-parent'></i></div>").appendTo(_warnDiv);
  160. $(TK_SPAN).appendTo($warnCtn).html(cnt);
  161. setTimeout(function() {
  162. $warnCtn.remove()
  163. }, timeInternal ? timeInternal : 3000);
  164. },
  165. //弹出提示信息,会自动消失 ref Util.error
  166. msg: function(cnt, timeInternal) {
  167. var $msgCtn = $("<div class='msg-ctn'><i class='icon click-hide-parent'></i></div>").appendTo(_msgDiv);
  168. $(TK_SPAN).appendTo($msgCtn).html(cnt);
  169. setTimeout(function() {
  170. $msgCtn.remove()
  171. }, timeInternal ? timeInternal : 2000);
  172. },
  173. //弹出加载信息遮罩 parent is body z-index = 9999998;
  174. showLoading: function() {
  175. ++_g_loadRef;
  176. if(_g_loadRef === 1) {
  177. _loadingDiv.show()
  178. }
  179. },
  180. //隐藏加载信息遮罩 parent is body z-index = 9999998;
  181. hideLoading: function() {
  182. --_g_loadRef;
  183. if(_g_loadRef === 0) {
  184. _loadingDiv.hide()
  185. }
  186. },
  187. /*
  188. * 弹出提示信息,不会自动消失 parent is body z - index 5000000 - 9999997
  189. */
  190. alertMsg: function(title, content,hand) {
  191. if(content){
  192. if($.isFunction(content)){
  193. hand = content;
  194. content = title;
  195. title = "提示";
  196. }
  197. }else{
  198. content = title;
  199. title = "提示";
  200. }
  201. hand=hand || noop;
  202. var ly = util.createModalLayer('<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>');
  203. ly.ctn.find(".modal-title").text(title);
  204. $content = ly.ctn.find("p").text(content);
  205. ly.ctn.find("button").on("click", function() {
  206. util.closeModalLayer();
  207. hand();
  208. });
  209. },
  210. /*
  211. *弹出确认信息,不会自动消失 parent is body z - index 1000000 - 4999999
  212. * btns is Array
  213. * btns like [{catpion:"button caption",handler:function(){}},...]
  214. */
  215. boxMsg: function(obj) {
  216. var ly = util.createModalLayer('<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>');
  217. ly.ctn.find(".modal-title").text(obj.title || "确认");
  218. ly.ctn.find("p").text(obj.content);
  219. var m_footer = ly.ctn.find(".modal-footer"),
  220. btnH = function(btn) {
  221. var $btn = $('<button type="button" class="btn"></button>').appendTo(m_footer);
  222. var caption = btn.caption || "未命名的",
  223. handler = btn.hand || noop;
  224. $btn.text(caption);
  225. $btn.on("click", function() {
  226. util.closeModalLayer();
  227. handler();
  228. });
  229. };
  230. for(var i = 0; i < obj.btns.length; ++i) {
  231. btnH(obj.btns[i]);
  232. }
  233. },
  234. /*
  235. *弹出确认信息,不会自动消失 parent is body z - index 1000000 - 4999999
  236. * == Util.boxMsg(cnt,[{caption:"确定",handler:yesHandler},{caption:"取消",handler:noHandler}]);
  237. */
  238. confirmMsg: function(cnt, yesHandler, noHandler) {},
  239. loadScript: function(url) {
  240. var node = doc.createElement(EN_SCRIPT);
  241. node.async = CK_TRUE;
  242. node.src = url;
  243. node.charset = "UTF-8";
  244. var supportOnload = "onload" in node;
  245. util.showLoading();
  246. if(supportOnload) {
  247. //todo:dddd
  248. node.onload = function() {
  249. node.onerror = null;
  250. node.onload = null;
  251. util.hideLoading();
  252. };
  253. //todo:dddd
  254. node.onerror = function() {
  255. util.error("load script error:" + url);
  256. node.onload = null;
  257. node.onerror = null;
  258. util.hideLoading();
  259. };
  260. } else {
  261. //todo:dddd
  262. node.onreadystatechange = function() {
  263. if(/loaded|complete/.test(node.readyState)) {
  264. node.onreadystatechange = null;
  265. util.msg("load script over:" + url);
  266. util.hideLoading();
  267. }
  268. };
  269. }
  270. baseElement ?
  271. head.insertBefore(node, baseElement) :
  272. head.appendChild(node);
  273. },
  274. loadCSS: function(href) {
  275. var link = doc.createElement('link');
  276. link.rel = 'stylesheet';
  277. link.href = href;
  278. link.media = 'all';
  279. var id = "g_css_" + _g_css_ref;
  280. ++_g_css_ref;
  281. link.id = id;
  282. head.appendChild(link);
  283. return id;
  284. },
  285. removeCSS: function(id) {
  286. var node = doc.getElementById(id);
  287. if(node) {
  288. head.removeChild(node);
  289. }
  290. },
  291. regErrorHandler: function(key, handler) {
  292. _g_err_msg[key] = handler;
  293. },
  294. ajax: function(method, pUrl, pData, sh, eh) {
  295. util.showLoading();
  296. $.ajax({
  297. type: method,
  298. url: pUrl,
  299. //cache: false,
  300. traditional:true,
  301. data: pData,
  302. contentType: method == "put" ? "application/json" : "application/x-www-form-urlencoded",
  303. }).done(function(rd) {
  304. if(rd.success) {
  305. sh(rd.data);
  306. } else {
  307. if(eh) {
  308. var eht = $.type(eh);
  309. if(eht == TN_FNC) {
  310. eh(rd.code, rd.msg, rd.detailMsg);
  311. } else if(eht == TN_BOOL) {
  312. if(eht) {
  313. util.error("load resource error:" + pUrl + "\n" + (rd.detailMsg ? rd.detailMsg : ""));
  314. }
  315. } else {
  316. var msg = eh["" + rd.code] || _g_err_msg["" + rd.code];
  317. if(msg) {
  318. if($.type(msg) == TN_FNC) {
  319. msg(rd.code, rd.msg, rd.detailMsg);
  320. } else {
  321. util.error(msg ? msg : "未定义的错误");
  322. }
  323. }
  324. }
  325. }
  326. }
  327. }).fail(function(jqXHR, textStatus, errorThrown) {
  328. util.msg("load resouce[" + pUrl + "] error:" + textStatus);
  329. }).always(util.hideLoading);
  330. },
  331. get: function(url, data, sh, eh) {
  332. util.ajax("get", url, data, sh, eh);
  333. },
  334. post: function(url, data, sh, eh) {
  335. util.ajax("post", url, data, sh, eh);
  336. },
  337. put: function(url, data, sh, eh) {
  338. if(data && ("string"!=$.type(data))){
  339. data =JSON.stringify(data);
  340. }
  341. util.ajax("put", url, data, sh, eh);
  342. },
  343. del: function(url, sh, eh) {
  344. util.ajax("post", url, null, sh, eh);
  345. },
  346. };
  347. //begin dropdown
  348. //QF == query flag
  349. //CC == css class
  350. var dd_clearMenus = function(e) {
  351. if(e && e.which === 3) return
  352. $(QF_DROP_DOWN_BACKGROUP).remove()
  353. $(QF_DROP_DOWN_CONTAINER).each(function() {
  354. var $this = $(this)
  355. var relatedTarget = {
  356. relatedTarget: this
  357. }
  358. if(!$this.hasClass(CC_OPEN)) return
  359. $this.trigger(evt = $.Event('hide.jr.dropdown', relatedTarget))
  360. if(evt.isDefaultPrevented()) return
  361. $this.removeClass(CC_OPEN).trigger('hidden.jr.dropdown', relatedTarget)
  362. if(!$this.hasClass(CC_DROP_CLEAN)) return
  363. $this.find(QF_DROP_DOWN_PANEL).remove();
  364. });
  365. },
  366. dd_toggle = function(e) {
  367. var $this = $(this);
  368. var $ddc = $this.parents(QF_DROP_DOWN_CONTAINER);
  369. if(!$ddc.length) return;
  370. if($ddc.is(QF_DISABLED)) return;
  371. var isActive = $ddc.hasClass(CC_OPEN);
  372. dd_clearMenus();
  373. if($ddc.hasClass(CC_FORM_ITEM) && ($ddc.hasClass(CC_READONLY) || $ddc.hasClass(CC_SHOWONLY))) return;
  374. if(!isActive) {
  375. var relatedTarget = {
  376. relatedTarget: this
  377. }
  378. $ddc.trigger(e = $.Event('show.jr.dropdown', relatedTarget))
  379. if(e.isDefaultPrevented()) return
  380. $ddc.toggleClass(CC_OPEN).trigger('shown.jr.dropdown', relatedTarget)
  381. }
  382. return CK_FALSE
  383. },
  384. //end dropdown
  385. //begin dict
  386. dict_dictCache = {},
  387. dict_dictHandleCache = {},
  388. dict_dictGuid = 1,
  389. dict_handerArray = "handlers",
  390. dict_baseUri = "/ajax/sys/dict/item/",
  391. dict_load = function(dictCode) {
  392. util.showLoading();
  393. $.ajax({ url: dict_baseUri + dictCode, type: "get", dataType: "json" }).done(function(data) {
  394. util.hideLoading();
  395. if(data.success) {
  396. data = data.data;
  397. dict_dictCache[dictCode] = data;
  398. var handlers = dict_dictHandleCache[dictCode];
  399. if(handlers && handlers.length) {
  400. for(var i = 0; i < handlers.length; ++i) {
  401. handlers[i](data);
  402. }
  403. delete dict_dictHandleCache[dictCode];
  404. }
  405. } else {
  406. var m = "load dict[" + dictCode + "] error";
  407. util.error(m);
  408. }
  409. }).fail(function() {
  410. util.hideLoading();
  411. var m = "load dict[" + dictCode + "] error";
  412. util.error(m);
  413. });
  414. },
  415. dict_apply = function(dictCode, handler) {
  416. var dict = dict_dictCache[dictCode];
  417. if(!dict) {
  418. var hs = dict_dictHandleCache[dictCode];
  419. if(!hs) {
  420. dict_dictHandleCache[dictCode] = hs = [];
  421. dict_load(dictCode);
  422. }
  423. hs.push(handler);
  424. } else {
  425. handler(dict);
  426. }
  427. },
  428. dict_refresh = function(dictCode, handler) {
  429. if(handler) {
  430. var hs = dict_dictHandleCache[dictCode];
  431. if(!hs) {
  432. dict_dictHandlerCache[dictCode] = hs = [];
  433. }
  434. hs.push(handler);
  435. }
  436. var dict = dict_dictCache[dictCode];
  437. if(dict) {
  438. delete dict_dictCache[dictCode];
  439. util.loadScript(dict_baseUri + dictCode + ".js");
  440. }
  441. },
  442. /*
  443. * content:[{code:"12345",caption:"",shortCode:"",enabled:true,children:[{code:"",catpion:"",enabled:true,children:[]]}},....]
  444. *
  445. */
  446. dict_define = function(dictCode, content, dynamic) {
  447. if(!dynamic) {
  448. dict_dictCache[dictCode] = dict_dictCache[dictCode] || content;
  449. }
  450. var handlers = dict_dictHandleCache[dictCode];
  451. if(handlers && handlers.length) {
  452. for(var i = 0; i < handlers.length; ++i) {
  453. handlers[i](content);
  454. }
  455. delete dict_dictHandleCache[dictCode];
  456. }
  457. },
  458. dict_get = function(dict, code) {
  459. if(code) {
  460. for(var i = 0; i < dict.length; ++i) {
  461. var item = dict[i];
  462. if(code === item.code) {
  463. return item.caption;
  464. } else if(item.children && item.children.length) {
  465. var ret = dict_get(item.children, code);
  466. if(ret) return ret;
  467. }
  468. }
  469. }
  470. return CK_FALSE;
  471. },
  472. dict_display = function() {
  473. $(".do-dict-display").each(function() {
  474. var $this = $(this),
  475. dictCode = $this.attr("dict");
  476. if(dictCode) {
  477. dict_apply(dictCode, function(dict) {
  478. var dh = dict_get(dict, $this.attr("code"));
  479. $this.html(dh ? dh : "");
  480. $this.removeClass("do-dict-display");
  481. });
  482. }
  483. });
  484. },
  485. //end dict
  486. Jhidden = function(ele) {
  487. if($.type(ele) == CC_STRING) {
  488. this.name = ele;
  489. } else {
  490. this.name = ele.attr(AK_NAME) || ele.attr(AK_ID);
  491. if(!this.name) {
  492. throw "Attribute[name] is invalid";
  493. }
  494. ele.data(DK_FORM_VALUE, this);
  495. }
  496. },
  497. Jtext = function(ele) {
  498. this.name = ele.attr(AK_NAME) || ele.attr(AK_ID);
  499. if(!this.name) {
  500. throw "Attribute[name] is invalid";
  501. }
  502. this.trimed = ele.hasClass(CC_TRIM);
  503. this.readOnly = ele.hasClass(CC_READONLY);
  504. this.showOnly = ele.hasClass(CC_SHOWONLY);
  505. this.ele = ele;
  506. this.dv = ele.attr(AK_DEF_VAL) || "";
  507. this.dt = 0;
  508. if(ele.hasClass(CC_INT)) {
  509. this.dt = 1;
  510. } else if(ele.hasClass(CC_FLOAT)) {
  511. this.dt = 2;
  512. }
  513. ele.data(DK_FORM_VALUE, this);
  514. },
  515. Jtextarea = function(ele) {
  516. this.name = ele.attr(AK_NAME) || ele.attr(AK_ID);
  517. if(!this.name) {
  518. throw "Attribute[name] is invalid";
  519. }
  520. this.trimed = ele.hasClass(CC_TRIM);
  521. this.readOnly = ele.hasClass(CC_READONLY);
  522. this.showOnly = ele.hasClass(CC_SHOWONLY);
  523. this.ele = ele;
  524. this.dv = ele.attr(AK_DEF_VAL) || "";
  525. ele.data(DK_FORM_VALUE, this);
  526. },
  527. Jselect = function(ele) {
  528. this.name = ele.attr(AK_NAME) || ele.attr(AK_ID);
  529. if(!this.name) {
  530. throw "Attribute[name] is invalid";
  531. }
  532. this.readOnly = ele.hasClass(CC_READONLY);
  533. this.showOnly = ele.hasClass(CC_SHOWONLY);
  534. this.dictCode = ele.attr(AK_DICT_CODE);
  535. this.showInvalidItem = ele.attr("show-invalid-item");
  536. this.ele = ele;
  537. this.dv = ele.attr(AK_DEF_VAL) || "";
  538. this.isBool = ele.hasClass(CC_BOOL);
  539. this.isTree = ele.hasClass(CC_TREE);
  540. ele.data(DK_FORM_VALUE, this);
  541. },
  542. select_display = function(select, code, caption) {
  543. select.codeEle.val(code ? code : "");
  544. select.captionEle.text(code ? caption : "");
  545. },
  546. select_change = function(select, code) {
  547. if(select.codeEle.val() !== code) {
  548. select.codeEle.val(code);
  549. dict_apply(select.dictCode, function(dc) {
  550. var cap = code ? dict_get(dc, code) : "";
  551. select_display(select, cap ? code : null, cap);
  552. });
  553. }
  554. },
  555. Jmselect = function(ele) {
  556. this.name = ele.attr(AK_NAME) || ele.attr(AK_ID);
  557. if(!this.name) {
  558. throw "Attribute[name] is invalid";
  559. }
  560. this.readOnly = ele.hasClass(CC_READONLY);
  561. this.showOnly = ele.hasClass(CC_SHOWONLY);
  562. this.dictCode = ele.attr(AK_DICT_CODE);
  563. this.showInvalidItem = ele.attr("show-invalid-item");
  564. this.ele = ele;
  565. this.dv = [];
  566. var defV = ele.attr(AK_DEF_VAL);
  567. if(defV && defV != "[]") {
  568. this.dv = JSON.parse(defV);
  569. }
  570. this.isTree = ele.hasClass(CC_TREE);
  571. ele.data(DK_FORM_VALUE, this);
  572. },
  573. mselect_remove = function(e) {
  574. $(this).parent().remove();
  575. },
  576. mselect_add = function(mselect, code, init_add) {
  577. var found = false;
  578. if(!init_add) {
  579. mselect.captionEle.find(QF_SELECT_CAPTION).each(function() {
  580. if($(this).find(EN_INPUT).val() == code) {
  581. found = true;
  582. return false;
  583. }
  584. });
  585. }
  586. if(!found) {
  587. var $li = $("<li><div>x</div></li>");
  588. $li.addClass(CC_SELECT_CAPTION).append($(TK_HIDDEN_INPUT).val(code)).appendTo(mselect.captionEle);
  589. if((!mselect.readOnly) && (!mselect.showOnly)) {
  590. $li.children('div').on("click.jr_mselect_remove_api", mselect_remove);
  591. }
  592. dict_apply(mselect.dictCode, function(dict) {
  593. var cp = dict_get(dict, code);
  594. if(cp) {
  595. $li.append($(TK_SPAN).html(cp));
  596. } else {
  597. $li.append($("<span style='color:red;'></span>").html("error"));
  598. }
  599. });
  600. return true;
  601. }
  602. },
  603. mselect_change = function(mselect, value) {
  604. mselect.captionEle.empty();
  605. if(value && value.length) {
  606. for(var i = 0; i < value.length; ++i) {
  607. var cv = value[i];
  608. if(cv) {
  609. mselect_add(mselect, cv, true);
  610. }
  611. }
  612. }
  613. },
  614. select_buildListDrop = function(dict) {
  615. var $ul = $(TK_UL);
  616. for(var i = 0; i < dict.length; ++i) {
  617. var item = dict[i];
  618. if(item.enabled || this.showInvalidItem) {
  619. var $li = $("<li class='select-item'></li>");
  620. $li.attr(AK_CODE, item.code);
  621. $li.text(item.caption);
  622. $li.appendTo($ul);
  623. }
  624. }
  625. $ul.find(QF_SELECT_ITEM).on("click.jr_select_api", select_selectItem);
  626. return $ul;
  627. },
  628. select_buildTreeDrop = function(dict) {
  629. var $ul = $(TK_UL);
  630. for(var i = 0; i < dict.length; ++i) {
  631. var item = dict[i];
  632. if(item.enabled || this.showInvalidItem) {
  633. var $li = $(TK_LI);
  634. if(item.children && item.children.length) {
  635. var $ti = $("<a href='javascript:void(0)'><i class='icon'></a>");
  636. $ti.attr(AK_CODE, item.code).append($(TK_SPAN).text(item.caption));
  637. $li.addClass(CC_BRANCH_ITEM).append($ti).append(select_buildTreeDrop.call(this, item.children));
  638. } else {
  639. $li.addClass(CC_SELECT_ITEM).attr(AK_CODE, item.code).text(item.caption);
  640. }
  641. $li.appendTo($ul);
  642. }
  643. }
  644. $ul.find(QF_SELECT_ITEM).on("click.jr_select_api", select_selectItem);
  645. $ul.find(QF_BRANCH_ITEM).on("click.jr_select_api", select_branchItem);
  646. return $ul;
  647. },
  648. select_selectItem = function(e) {
  649. var $this = $(this);
  650. var select = $this.parents(QF_FORM_ITEM);
  651. if(select && select.length) {
  652. select = $(select).data(DK_FORM_VALUE);
  653. if(select && select.selectItem) {
  654. select.selectItem($this, e);
  655. }
  656. }
  657. },
  658. select_branchItem = function(evt) {
  659. $(this).toggleClass(CC_OPEN);
  660. evt.stopPropagation();
  661. },
  662. date_year = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
  663. date_leapYear = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
  664. date_isleap = function(y) {
  665. return(y % 4 === 0 && y % 100 !== 0) || y % 400 === 0;
  666. },
  667. date_validDate = function(v) {
  668. if(v.length != 8) return false;
  669. for(var i = 0; i < 8; ++i) {
  670. var c = v.charAt(i);
  671. if(c > '9' || c < '0') return false;
  672. }
  673. var m = parseInt(v.substring(4, 6)) - 1;
  674. if(m < 0 || m > 11) return false;
  675. var d = parseInt(v.substring(6, 8));
  676. var ym = date_isleap(parseInt(v.substring(0, 4))) ? date_leapYear : date_year;
  677. if(d < 1 || d > ym[m]) return false;
  678. return true;
  679. },
  680. date_fmt = function(v) {
  681. return(v > 9 ? "" : "0") + v;
  682. },
  683. date_MS_IN_DAY = 24 * 60 * 60 * 1000,
  684. date_incDay = function(d) {
  685. return new Date(d.getTime() + date_MS_IN_DAY);
  686. },
  687. date_decDay = function(d) {
  688. return new Date(d.getTime() - date_MS_IN_DAY);
  689. },
  690. date_dayFmt = function(d) {
  691. return "" + d.getFullYear() + date_fmt(d.getMonth() + 1) + date_fmt(d.getDate());
  692. },
  693. date_now = function() {
  694. var d = new Date();
  695. return "" + d.getFullYear() + date_fmt(d.getMonth() + 1) + date_fmt(d.getDate()) + date_fmt(d.getHours()) + date_fmt(d.getMinutes()) + date_fmt(d.getSeconds());
  696. },
  697. date_change = function(date, val) {
  698. if(val) {
  699. if(val == "current") {
  700. val = date_now().substr(0, 8);
  701. }
  702. var dt = val.substring(0, 4) + "-" + val.substring(4, 6) + "-" + val.substring(6, 8);
  703. date.captionEle.text(dt);
  704. date.valEle.val(val);
  705. } else {
  706. date.valEle.val("");
  707. date.captionEle.text(date.nullVal ? date.nullVal : "");
  708. }
  709. },
  710. Jdate = function(ele) {
  711. this.name = ele.attr(AK_NAME) || ele.attr(AK_ID);
  712. if(!this.name) {
  713. throw "Attribute[name] is invalid";
  714. }
  715. this.readOnly = ele.hasClass(CC_READONLY);
  716. this.showOnly = ele.hasClass(CC_SHOWONLY);
  717. this.ele = ele;
  718. this.dv = ele.attr(AK_DEF_VAL);
  719. this.nullVal = ele.attr("nullVal");
  720. ele.data(DK_FORM_VALUE, this);
  721. },
  722. datetime_change = function(date, val) {
  723. if(val) {
  724. if(val == "current") {
  725. val = date_now();
  726. }
  727. var dt = val.sustring(0, 4) + "-" + val.substring(4, 6) + "-" + val.substring(6, 8) + " " + val.substring(8, 10) + ":" + val.substring(10, 12) + ":" + val.substring(12);
  728. date.captionEle.text(dt);
  729. date.valEle.val(val);
  730. } else {
  731. date.valEle.val("");
  732. date.captionEle.text(date.nullVal ? date.nullVal : "");
  733. }
  734. },
  735. Jdatetime = function(ele) {
  736. this.name = ele.attr(AK_NAME) || ele.attr(AK_ID);
  737. if(!this.name) {
  738. throw "Attribute[name] is invalid";
  739. }
  740. this.readOnly = ele.hasClass(CC_READONLY);
  741. this.showOnly = ele.hasClass(CC_SHOWONLY);
  742. this.ele = ele;
  743. this.dv = ele.attr(AK_DEF_VAL);
  744. this.nullVal = ele.attr("nullVal");
  745. ele.data(DK_FORM_VALUE, this);
  746. },
  747. FORM_ITEM_CREATER = [Jhidden, Jtext, Jselect, Jmselect, Jdate, Jdatetime, Jtextarea],
  748. serialize = function(obj, name, val, r) {
  749. var ret = r || "";
  750. var tn = $.type(val);
  751. if(tn == TN_BOOL) {
  752. ret = ret + name + "=" + (val ? "1" : "0") + "&";
  753. } else if(tn == TN_NUMBER) {
  754. ret = ret + name + "=" + val + "&";
  755. } else if(tn == TN_STRING) {
  756. if(val)
  757. ret = ret + name + "=" + encodeURIComponent(val) + "&";
  758. } else if(tn == TN_FNC) {
  759. ret = serialize(obj, name, val.call(obj), ret)
  760. } else if(tn == TN_ARRAY) {
  761. for(var i = 0; i < val.length; ++i) {
  762. ret = serialize(obj, name, val[i], ret);
  763. }
  764. } else if(tn == TN_OBJ) {
  765. ret = ret + name + "=" + encodeURIComponent(JSON.stringify(val)) + "&";
  766. }
  767. return ret;
  768. },
  769. g_form_uploader_file_ref = 1,
  770. upload_remove = function(form) {
  771. form.addClass("hide");
  772. setTimeout(function() { form.remove(); }, 1000);
  773. },
  774. upload_create = function(uploader) {
  775. var form, $form, finput, $file;
  776. form = doc.createElement("form");
  777. form.setAttribute("enctype", "multipart/form-data");
  778. form.setAttribute("class", "upload-form");
  779. form.setAttribute("testRef", "" + (new Date()).getTime());
  780. finput = doc.createElement("input");
  781. finput.setAttribute("type", "file");
  782. finput.setAttribute("name", "filename");
  783. if(uploader.accept) finput.setAttribute("accept", uploader.accept);
  784. form.appendChild(finput);
  785. $form = $(form);
  786. $file = $(finput);
  787. $file.on("change", function() {
  788. console.log("entry file change")
  789. var files = finput.files,
  790. file, fsize, xhr, formData, eobj, state;
  791. console.log("files.len=" + files.length);
  792. if(files.length) {
  793. file = files[0];
  794. fsize = file.size;
  795. if(uploader.maxSize && uploader.maxSize < fsize) {
  796. util.error("上传文件太大[size > " + fsize + "]");
  797. return;
  798. }
  799. $file.off("change");
  800. upload_remove($form);
  801. upload_create(uploader);
  802. var over = function() {
  803. xhr.onerror = null;
  804. xhr.onload = null;
  805. xhr.ontimeout = null;
  806. xhr.onabort = null;
  807. if(xhr.upload) xhr.upload.onprogress = null;
  808. },
  809. af = function() {
  810. if(!state) {
  811. xhr.abort();
  812. raiseError("abort");
  813. }
  814. },
  815. eContext = { name: file.name, size: file.size, type: file.type, abort: af },
  816. raiseError = function(er, data) {
  817. if(!state) {
  818. over();
  819. state = er;
  820. if(uploader.fail) uploader.fail.call(eContext, er, data);
  821. }
  822. },
  823. formData = new FormData(form);
  824. xhr = new XMLHttpRequest();
  825. xhr.onerror = function() {
  826. raiseError("error");
  827. };
  828. xhr.onabort = function() {
  829. raiseError("abort");
  830. };
  831. xhr.ontimeout = function() {
  832. raiseError("timeout");
  833. };
  834. xhr.onload = function() {
  835. if(!state) {
  836. if(xhr.status == 200) {
  837. var ro, rs = xhr.responseText;
  838. if(rs) {
  839. try {
  840. ro = JSON.parse(rs);
  841. } catch(err) {
  842. raiseError("parse", err);
  843. }
  844. if(ro.success) {
  845. over();
  846. state = "done";
  847. if(uploader.done) uploader.done.call(eContext, ro.data);
  848. } else {
  849. raiseError("logic", ro);
  850. }
  851. } else {
  852. raiseError("emptyResponseText");
  853. }
  854. } else {
  855. raiseError("invalidHttpStatus", xhr.statusText);
  856. }
  857. }
  858. };
  859. if(uploader.start) uploader.start.call(eContext);
  860. xhr.open("POST", uploader.uri);
  861. if(xhr.upload) xhr.upload.onprogress = function(event) {
  862. if(event.lengthComputable && uploader.notity) {
  863. uploader.notity.call(eContext, event.total, event.loaded);
  864. }
  865. };
  866. if(uploader.timeout) {
  867. try {
  868. xhr.timeout = uploader.timeout;
  869. } catch(er) {
  870. setTimeout(function() {
  871. raiseError("timeout");
  872. }, uploader.timeout);
  873. }
  874. }
  875. xhr.send(formData);
  876. }
  877. });
  878. $form.appendTo(uploader.ele);
  879. },
  880. upload_def_fail_hanler = function(etype, ep) {
  881. util.error("upload error[" + type + "]:" + (ep ? JSON.stringify(ep) : ""));
  882. },
  883. Jupload = function(pele) {
  884. this.ele = pele;
  885. console.log(pele)
  886. this.maxSize = parseInt(pele.attr("fileMaxSize") || "1048576");
  887. this.accept = pele.attr("accept");
  888. this.uri = pele.attr("uri");
  889. this.fail = upload_def_fail_hanler;
  890. pele.data(DK_FORM_VALUE, this);
  891. },
  892. Jform = function(ele) {
  893. this.items = {};
  894. var that = this;
  895. ele.find(QF_FORM_ITEM).each(function() {
  896. var $this = $(this);
  897. for(var i = 0; i < FORM_ITEM_CREATER.length; ++i) {
  898. var item = FORM_ITEM_CREATER[i].build($this);
  899. if(item) {
  900. that.items[item.name] = item;
  901. break;
  902. }
  903. }
  904. });
  905. },
  906. UploadPlugin = function(options) {
  907. if(this.length) {
  908. var ele = $(this[0]);
  909. var ret = ele.data(DK_FORM_VALUE);
  910. if(!ret) {
  911. ret = new Jupload(ele);
  912. if(options) {
  913. $.extend(ret, options);
  914. }
  915. upload_create(ret);
  916. }
  917. return ret;
  918. }
  919. },
  920. FormPlugin = function(val) {
  921. if(this.length) {
  922. var form = $(this[0]);
  923. var ret = form.data(DK_FORM_VALUE);
  924. if(!ret) {
  925. ret = new Jform(form);
  926. for(var key in ret.items) {
  927. ret.items[key].render();
  928. }
  929. if(val) {
  930. ret.init(val);
  931. }
  932. form.data(DK_FORM_VALUE, ret);
  933. }
  934. return ret;
  935. }
  936. },
  937. _version = "1.1";
  938. util.dictDisplay = dict_display;
  939. Jhidden.build = function(ele) {
  940. return ele.hasClass(CC_HIDDEN) ? new Jhidden(ele) : CK_FALSE;
  941. };
  942. Jtext.build = function(ele) {
  943. return ele.hasClass(CC_TEXT) ? new Jtext(ele) : CK_FALSE;
  944. };
  945. Jtextarea.build = function(ele) {
  946. return ele.hasClass("textarea") ? new Jtextarea(ele) : CK_FALSE;
  947. }
  948. Jselect.build = function(ele) {
  949. return ele.hasClass(CC_SELECT) ? new Jselect(ele) : CK_FALSE;
  950. };
  951. Jmselect.build = function(ele) {
  952. return ele.hasClass("mselect") ? new Jmselect(ele) : CK_FALSE;
  953. };
  954. Jdate.build = function(ele) {
  955. return ele.hasClass("date") ? new Jdate(ele) : CK_FALSE;
  956. };
  957. Jdatetime.build = function(ele) {
  958. return ele.hasClass("datetime") ? new Jdatetime(ele) : CK_FALSE;
  959. };
  960. $.extend(Jhidden.prototype, {
  961. val: function(val) {
  962. if(val) {
  963. this.value = val;
  964. } else {
  965. return this.value;
  966. }
  967. },
  968. reset: function() {
  969. return this.value = this.dv;
  970. },
  971. render: noop,
  972. validate: function() {
  973. return CK_TRUE
  974. },
  975. setDefaultValue: function(value) {
  976. this.dv = value;
  977. },
  978. });
  979. $.extend(Jtext.prototype, {
  980. render: function() {
  981. this.ele.empty();
  982. if(this.showOnly) {
  983. this.ele.html("");
  984. } else {
  985. this.valEle = $(TK_TEXT_INPUT);
  986. if(this.ele.hasClass("password")) {
  987. this.valEle.attr("type", "password");
  988. }
  989. var tmp = this.ele.attr(AK_PLACEHOLDER);
  990. if(tmp) this.valEle.attr(AK_PLACEHOLDER, tmp);
  991. if(this.readOnly) this.valEle.prop(AK_READONLY, AK_READONLY);
  992. this.valEle.appendTo(this.ele);
  993. }
  994. this.val(this.dv);
  995. },
  996. val: function(val) {
  997. if(arguments.length) {
  998. var ct = (val === null ? "" : ("" + val));
  999. this.showOnly ? this.ele.text(ct) : this.valEle.val(ct);
  1000. } else if(!this.isShowOnly) {
  1001. var v = this.valEle.val();
  1002. v = this.trimed ? $.trim(v) : v;
  1003. return this.dt == 0 ? v : (v ? (this.dt == 1 ? parseInt(v) : parseFloat(v)) : 0);
  1004. }
  1005. },
  1006. reset: function() {
  1007. if(arguments.length) {
  1008. this.dv = arguments[0];
  1009. } else {
  1010. this.val(this.dv);
  1011. }
  1012. },
  1013. validate: function() {
  1014. // var vtext = this.valEle.val();
  1015. // if(this.trimed && vtext) vtext = $.trim(vtext);
  1016. // if(this.ele.attr(AK_REQUIRED)) {
  1017. // if(!vtext) return "required";
  1018. // }
  1019. return true;
  1020. }
  1021. });
  1022. $.extend(Jtextarea.prototype, {
  1023. render: function() {
  1024. this.ele.empty();
  1025. if(this.showOnly) {
  1026. this.ele.html("");
  1027. } else {
  1028. this.valEle = $("<textarea></textarea>");
  1029. this.valEle.attr("rows", this.ele.attr("rows") || "3");
  1030. this.valEle.attr("cols", this.ele.attr("cols") || "20");
  1031. var tmp = this.ele.attr(AK_PLACEHOLDER);
  1032. if(tmp) this.valEle.attr(AK_PLACEHOLDER, tmp);
  1033. if(this.readOnly) this.valEle.prop(AK_READONLY, AK_READONLY);
  1034. this.valEle.appendTo(this.ele);
  1035. }
  1036. this.val(this.dv);
  1037. },
  1038. val: function(val) {
  1039. if(arguments.length) {
  1040. var ct = (val === null ? "" : ("" + val));
  1041. this.showOnly ? this.ele.text(ct) : this.valEle.val(ct);
  1042. } else if(!this.isShowOnly) {
  1043. var v = this.valEle.val();
  1044. return this.trimed ? $.trim(v) : v;
  1045. }
  1046. },
  1047. reset: function() {
  1048. if(arguments.length) {
  1049. this.dv = arguments[0];
  1050. } else {
  1051. this.val(this.dv);
  1052. }
  1053. },
  1054. validate: function() {
  1055. // var vtext = this.valEle.val();
  1056. // if(this.trimed && vtext) vtext = $.trim(vtext);
  1057. // if(this.ele.attr(AK_REQUIRED)) {
  1058. // if(!vtext) return "required";
  1059. // }
  1060. return true;
  1061. }
  1062. });
  1063. $.extend(Jselect.prototype, {
  1064. render: function() {
  1065. var that = this;
  1066. this.ele.empty();
  1067. if(!this.ele.hasClass(CC_DROP_DOWN_CONTAINER)) this.ele.addClass(CC_DROP_DOWN_CONTAINER);
  1068. this.codeEle = $(TK_HIDDEN_INPUT).appendTo(this.ele);
  1069. this.captionEle = $(TK_SPAN).appendTo($(TK_DD_HAND).appendTo(this.ele));
  1070. var closeIcon = $("<i class='close'></i>");
  1071. this.captionEle.parent().append(closeIcon);
  1072. //this.ele.append(this.codeEle).append(this.captionEle);
  1073. select_change(this, this.dv);
  1074. if((!this.readOnly) && (!this.showOnly)) {
  1075. this.selectItemEle = $(TK_DD_DROP).append($("<div class='select-loading'></div>"));
  1076. this.selectItemEle.appendTo(this.ele);
  1077. dict_apply(this.dictCode, function(dd) {
  1078. that.selectItemEle.empty();
  1079. if(that.dropItem) {
  1080. that.dropItem.call(that, dd);
  1081. } else {
  1082. that.selectItemEle.append((that.isTree ? select_buildTreeDrop : select_buildListDrop).call(that, dd));
  1083. }
  1084. });
  1085. }
  1086. closeIcon.on("click", function() {
  1087. that.codeEle.val("");
  1088. that.captionEle.text("");
  1089. });
  1090. },
  1091. val: function(val) {
  1092. if(arguments.length) {
  1093. select_change(this, this.isBool ? (true===val ? "1" :(false===val? "0":"")) : (val ? val : ""));
  1094. } else if(!this.isShowOnly) {
  1095. var v = this.codeEle.val();
  1096. return this.isBool ? (v ? (v==='1') : CK_UNDEF) : (v ? v : CK_UNDEF);
  1097. }
  1098. },
  1099. reset: function() {
  1100. if(arguments.length) {
  1101. var val = arguments[0];
  1102. this.dv = this.isBool ? (val ? "1" : "0") : (val ? val : "")
  1103. } else select_change(this, this.dv);
  1104. },
  1105. validate: function() {
  1106. return true;
  1107. // var vtext = this.codeEle.val();
  1108. // if(this.ele.attr(AK_REQUIRED)) {
  1109. // if(!vtext) return "required";
  1110. // }
  1111. },
  1112. selectItem: function($item, evt) {
  1113. var val = $item.attr(AK_CODE);
  1114. select_change(this, val ? val : "");
  1115. }
  1116. });
  1117. $.extend(Jmselect.prototype, {
  1118. render: function() {
  1119. this.ele.empty();
  1120. if(!this.ele.hasClass(CC_DROP_DOWN_CONTAINER)) this.ele.addClass(CC_DROP_DOWN_CONTAINER);
  1121. this.captionEle = $(TK_UL).appendTo($(TK_DD_HAND).appendTo(this.ele));
  1122. mselect_change(this, this.dv);
  1123. if((!this.readOnly) && (!this.showOnly)) {
  1124. this.selectItemEle = $(TK_DD_DROP).append($("<div class='select-loading'></div>"));
  1125. this.selectItemEle.appendTo(this.ele);
  1126. dict_apply(this.dictCode, (function(that) {
  1127. return function(dd) {
  1128. that.selectItemEle.empty();
  1129. if(that.dropItem) {
  1130. that.dropItem.call(that, dd);
  1131. } else {
  1132. that.selectItemEle.append((that.isTree ? select_buildTreeDrop : select_buildListDrop).call(that, dd));
  1133. }
  1134. }
  1135. })(this));
  1136. }
  1137. },
  1138. val: function(val) {
  1139. if(arguments.length) {
  1140. mselect_change(this, val);
  1141. return this;
  1142. } else if(!this.isShowOnly) {
  1143. var ret = [];
  1144. this.captionEle.find(EN_INPUT).each(function() {
  1145. ret.push($(this).val);
  1146. })
  1147. return ret;
  1148. }
  1149. },
  1150. reset: function() {
  1151. if(arguments.length) {
  1152. var val = arguments[0];
  1153. this.dv = val ? val : [];
  1154. } else mselect_change(this, this.dv);
  1155. },
  1156. validate: returnTrue,
  1157. selectItem: function($item, evt) {
  1158. if(!mselect_add(this, $item.attr(AK_CODE)))
  1159. evt.stopPropagation();
  1160. }
  1161. });
  1162. $.extend(Jdate.prototype, {
  1163. render: function() {
  1164. this.ele.empty();
  1165. if(!this.ele.hasClass(CC_DROP_DOWN_CONTAINER)) this.ele.addClass(CC_DROP_DOWN_CONTAINER);
  1166. if(!this.ele.hasClass(CC_DROP_CLEAN)) this.ele.addClass(CC_DROP_CLEAN);
  1167. this.valEle = $(TK_HIDDEN_INPUT);
  1168. this.captionEle = $(TK_SPAN);
  1169. var closeIcon = $("<i class='close'></i>");
  1170. $(TK_DD_HAND).append(this.valEle).append(this.captionEle).append(closeIcon).appendTo(this.ele);
  1171. date_change(this, this.dv);
  1172. var that = this;
  1173. closeIcon.on("click",function(){
  1174. that.valEle.val("");
  1175. that.captionEle.text("");
  1176. });
  1177. },
  1178. val: function(val) {
  1179. if(arguments.length) {
  1180. date_change(this, val);
  1181. return this;
  1182. } else if(!this.isShowOnly) {
  1183. var ret = this.valEle.val();
  1184. return ret ? ret : CK_UNDEF;
  1185. }
  1186. },
  1187. reset: function() {
  1188. if(arguments.length) {
  1189. this.dv = arguments[0];
  1190. } else date_change(this, this.dv);
  1191. },
  1192. validate: returnTrue,
  1193. show: function($ctn) {
  1194. if(this.readOnly || this.showOnly) return;
  1195. var val = this.valEle.val();
  1196. var n = date_now();
  1197. val = val ? (date_validDate(val) ? val : n) : n;
  1198. var $div = $("<div class='dd-drop date'></div>").appendTo(this.ele);
  1199. this.showDay($div, parseInt(val.substring(0, 4)), parseInt(val.substring(4, 6)) - 1);
  1200. },
  1201. showDay: function(div, y, m) {
  1202. div.empty();
  1203. var table = $("<table></table>").appendTo(div).addClass("day");
  1204. table.attr("year", "" + y);
  1205. table.attr("month", "" + (m + 1));
  1206. var head = $("<thead></thead>").appendTo(table);
  1207. var body = $("<tbody></tbody>").appendTo(table);
  1208. var foot = $("<tfoot></tfoot>").appendTo(table);
  1209. var caption = $("<tr><th class='prev-year'><i class='icon-arrow-left'></i></th><th class='prev-month'><i class='icon-chevron-left'></i></th><th colspan='3' class='switch'></th><th class='next-month'><i class='icon-chevron-right'></i></th><th class='next-year'><i class='icon-arrow-right'></i></th></tr><tr><th class='dow'>日</th><th class='dow'>一</th><th class='dow'>二</th><th class='dow'>三</th><th class='dow'>四</th><th class='dow'>五</th><th class='dow'>六</th></tr>").appendTo(head).find(".switch");
  1210. caption.html(date_fmt(m + 1) + "月 " + y + "年");
  1211. var dd = new Date();
  1212. dd.setFullYear(y);
  1213. dd.setMonth(m);
  1214. dd.setDate(1);
  1215. var dayInWeek = dd.getDay();
  1216. var days = ["<tr>"];
  1217. for(var i = 0; i < dayInWeek; ++i) {
  1218. var cd = date_dayFmt(new Date(dd.getTime() - ((dayInWeek - i) * date_MS_IN_DAY)));
  1219. days.push("<td class='no-current-month' day='" + cd + "'>" + cd.substring(6, 8) + "</td>");
  1220. }
  1221. var ld = date_isleap(y) ? date_leapYear[m] : date_year[m];
  1222. for(var i = 0; i < ld; ++i) {
  1223. var cd = date_dayFmt(dd);
  1224. days.push("<td class='day-item' day='" + cd + "'>" + cd.substring(6, 8) + "</td>");
  1225. if(dd.getDay() == 6) days.push("</tr><tr>");
  1226. dd = date_incDay(dd);
  1227. }
  1228. dayInWeek = dd.getDay();
  1229. if(dayInWeek) {
  1230. for(var i = dayInWeek; i < 7; ++i) {
  1231. var cd = date_dayFmt(dd);
  1232. days.push("<td class='no-current-month' day='" + cd + "'>" + cd.substring(6, 8) + "</td>");
  1233. dd = date_incDay(dd);
  1234. }
  1235. } else {
  1236. days.pop();
  1237. }
  1238. days.push("</tr>");
  1239. body.html(days.join(""));
  1240. }
  1241. });
  1242. $.extend(Jform.prototype, {
  1243. init: function(options) {
  1244. if($.type(options) == TN_FNC) {
  1245. options.call(this);
  1246. } else {
  1247. for(var key in options) {
  1248. var io = this.items[key] || (this.items[key] = new Jhidden(key));
  1249. io.val(options[key]);
  1250. }
  1251. }
  1252. },
  1253. item: function(name) {
  1254. return this.items[name];
  1255. },
  1256. validate: function() {
  1257. for(var key in this.items) {
  1258. if(!this.items[key].validate()) return CK_FALSE;
  1259. }
  1260. return CK_TRUE;
  1261. },
  1262. reset: function(data) {
  1263. if(data) {
  1264. for(var key in data) {
  1265. (this.items[key] || (this.items[key] = new Jhidden(key))).reset(data[key]);
  1266. }
  1267. } else {
  1268. for(var key in this.items) {
  1269. this.items[key].reset();
  1270. }
  1271. }
  1272. return this;
  1273. },
  1274. val: function(data) {
  1275. if(!data) {
  1276. if(!this.validate()) return CK_FALSE;
  1277. var ret = {};
  1278. for(var key in this.items) {
  1279. var val = this.items[key].val();
  1280. if(val !== CK_UNDEF) {
  1281. ret[key] = val;
  1282. }
  1283. }
  1284. return ret;
  1285. }
  1286. for(var key in data) {
  1287. (this.items[key] || (this.items[key] = new Jhidden(key))).val(data[key]);
  1288. }
  1289. return this;
  1290. },
  1291. queryString: function() {
  1292. if(!this.validate()) return CK_FALSE;
  1293. var qs = "";
  1294. for(var key in this.items) {
  1295. var obj = this.items[key];
  1296. var val = obj.val();
  1297. qs = serialize(obj, key, val, qs);
  1298. }
  1299. if(qs.length > 1) {
  1300. qs.substr(0, qs.length - 1);
  1301. }
  1302. return qs;
  1303. },
  1304. get: function(url, data, check, eh) {
  1305. if(CK_FALSE === data) return;
  1306. var self = this;
  1307. util.get(url, data, function(rd) {
  1308. if(check(rd)) {
  1309. self.reset();
  1310. self.val(rd);
  1311. }
  1312. }, eh);
  1313. },
  1314. post: function(url, data, check, eh) {
  1315. if(CK_FALSE === data) return;
  1316. var self = this;
  1317. util.post(url, data, function(rd) {
  1318. if(check(rd)) {
  1319. self.reset();
  1320. self.val(rd);
  1321. }
  1322. }, eh);
  1323. },
  1324. doGet: function(url, sh, eh) {
  1325. var data = this.val();
  1326. if(data !== CK_FALSE) {
  1327. util.get(url, data, sh, eh);
  1328. }
  1329. },
  1330. doPost: function(url, sh, eh) {
  1331. var data = this.val();
  1332. if(data !== CK_FALSE) {
  1333. util.post(url, data, sh, eh);
  1334. }
  1335. },
  1336. doPut: function(url, sh, eh) {
  1337. var data = this.val();
  1338. if(data !== CK_FALSE) {
  1339. util.put(url, data, sh, eh);
  1340. }
  1341. },
  1342. doDel: function(url, sh, eh) {
  1343. var data = this.val();
  1344. if(data !== CK_FALSE) {
  1345. util.del(url, data, sh, eh);
  1346. }
  1347. },
  1348. });
  1349. $.fn.form = FormPlugin;
  1350. $.fn.form.Constructor = Jform;
  1351. $.fn.upload = UploadPlugin;
  1352. $.fn.upload.Constructor = Jupload;
  1353. $.util = util;
  1354. (function() {
  1355. var DK_CODE_TEMPLATE_FUNC = "code_templat_func",
  1356. reg_strikethrough_all = /-/g,
  1357. g_codeRef = 1,
  1358. qf = function(pnd) {
  1359. var cr = pnd.children;
  1360. for(var i = 0; i < cr.length; ++i) {
  1361. var nd = cr[i];
  1362. if(nd.nodeType == 1) {
  1363. var $nd = $(nd);
  1364. if($nd.hasClass("code-tpl")) {
  1365. $nd.removeClass("code-tpl");
  1366. return nd;
  1367. }
  1368. $nd = qf(nd);
  1369. if($nd) return $nd;
  1370. }
  1371. };
  1372. return null;
  1373. },
  1374. parseCodeTemplate = function(ele, handlers) {
  1375. var hds = handlers;
  1376. var childCode = null;
  1377. while((childCode = qf(ele[0]))) {
  1378. var $child = $(childCode);
  1379. var key = $child.attr("code-func");
  1380. if(key) {
  1381. var cf = "_" + g_codeRef;
  1382. ++g_codeRef;
  1383. hds[cf] = parseCodeTemplate($(childCode), hds);
  1384. var ccode = "{{" + key + "-" + cf + "}}";
  1385. if($child.hasClass("code-tag-hlod")) {
  1386. $child.html(ccode);
  1387. } else {
  1388. // console.log(childCode)
  1389. // console.log(childCode.parentNode);
  1390. //doc.createTextNode("{{"+key+"-"+cf+"}}");
  1391. //this.parentNode.replaceChild(this,doc.createTextNode("{{"+key+"-"+cf+"}}"));
  1392. childCode.parentNode.insertBefore(document.createTextNode("{{" + key + "-" + cf + "}}"), childCode);
  1393. //replaceChild(this,document.createTextNode("{{"+key+"-"+cf+"}}"));
  1394. $child.remove();
  1395. }
  1396. }
  1397. }
  1398. var src = $.trim(ele.html());
  1399. // console.log(src);
  1400. var ret = [],
  1401. index = 0,
  1402. len = src.length,
  1403. b, e, ni;
  1404. while(index < len) {
  1405. b = src.indexOf('{{', index);
  1406. if(b != -1) {
  1407. ni = b + 2;
  1408. var e = src.indexOf('}}', ni);
  1409. if(e == -1) break;
  1410. if(b > index) {
  1411. ret.push({
  1412. f: "_copy",
  1413. k: null,
  1414. sv: [src.substring(index, b)]
  1415. });
  1416. }
  1417. if(e > ni) {
  1418. var sh = src.substring(ni, e);
  1419. var shlist = sh.split('-');
  1420. var h = {
  1421. pv: []
  1422. };
  1423. h.k = shlist[0];
  1424. if(shlist.length == 1) {
  1425. h.f = "toString";
  1426. } else {
  1427. h.f = shlist[1];
  1428. for(var i = 2; i < shlist.length; ++i) {
  1429. h.pv.push(shlist[i]);
  1430. }
  1431. }
  1432. h.sv = sh;
  1433. ret.push(h);
  1434. }
  1435. index = e + 2;
  1436. } else {
  1437. break;
  1438. }
  1439. }
  1440. if(index < len) {
  1441. ret.push({
  1442. f: "_copy",
  1443. k: null,
  1444. sv: [src.substring(index, len)]
  1445. });
  1446. }
  1447. //data
  1448. return function(data, k, _index, pv, sv, hds) {
  1449. var r = [];
  1450. for(var i = 0; i < ret.length; ++i) {
  1451. var h = ret[i];
  1452. r.push((hds[h.f] || hds["_def"])(data, h.k, _index, h.pv, h.sv, hds));
  1453. //.apply({"data":data,"key":h.k,"index":_index,"hds":hds}, h.pv));
  1454. }
  1455. return r.join("");
  1456. }
  1457. },
  1458. hc_base_fnc = {
  1459. "_def": function(data, key, _index, pv, sv, hds) {
  1460. return "<!--" + sv.replace(reg_strikethrough_all, ' - ') + "-->";
  1461. },
  1462. "toString": function(data, key, _index, pv, sv, hds) {
  1463. var v = data[key];
  1464. return v ? v.toString() : (v === 0 ? "0" : (v === false ? "false" : ""));
  1465. },
  1466. "_copy": function(data, key, _index, pv, sv, hds) {
  1467. return sv
  1468. },
  1469. "list": function(data, key, _index, pv, sv, hds) {
  1470. var v = data[key] || [],
  1471. fn = pv[0],
  1472. r = [];
  1473. if(v && v.length) {
  1474. for(var i = 0; i < v.length; ++i) {
  1475. var h = hds[fn] || hds["_def"];
  1476. r.push(h(v[i], null, i, null, null, hds));
  1477. }
  1478. }
  1479. return r.join("");
  1480. },
  1481. "emptylist": function(data, key, _index, pv, sv, hds) {
  1482. var v = data[key] || [];
  1483. if(!v.length) {
  1484. return(hds[pv[0]] || hds["_def"])(data, null, null, null, null, hds);
  1485. }
  1486. },
  1487. "[]": function(data, key, _index, pv, sv, hds) { return _index + 1 },
  1488. "json": function(data, key, _index, pv, sv, hds) {
  1489. return data ? (data[key] ? JSON.stringify(data[key]) : "") : "";
  1490. },
  1491. "bool": function(data, key) {
  1492. return data ? (data[key] ? "是" : (data[key] === false ? "否" : "")) : "";
  1493. },
  1494. },
  1495. HtmlCode = function(ele) {
  1496. this.ele = ele;
  1497. this.fnc = {};
  1498. this.listener = [];
  1499. $.extend(this.fnc, hc_base_fnc);
  1500. ele.data(DK_CODE_TEMPLATE_FUNC, this);
  1501. };
  1502. $.extend(HtmlCode.prototype, {
  1503. val: function(data) {
  1504. if(!this.hand) {
  1505. this.hand = parseCodeTemplate(this.ele, this.fnc);
  1506. }
  1507. this.ele.html(this.hand(data, null, -1, null, null, this.fnc));
  1508. for(var i = 0; i < this.listener.length; ++i) {
  1509. if(CK_FALSE === this.listener[i].call(this, data)) return;
  1510. }
  1511. },
  1512. empty: function() {
  1513. this.ele.empty();
  1514. },
  1515. shell: function(name, func) {
  1516. if(name) {
  1517. if(func) {
  1518. this.fnc[name] = func;
  1519. } else {
  1520. return this.fnc[name];
  1521. }
  1522. } else {
  1523. return this.fnc;
  1524. }
  1525. },
  1526. addValueListener: function(h) {
  1527. this.listener.push(h)
  1528. },
  1529. });
  1530. var CodePlugin = function() {
  1531. if(this.length) {
  1532. var code = $(this[0]);
  1533. var ret = code.data(DK_CODE_TEMPLATE_FUNC);
  1534. if(!ret) {
  1535. ret = new HtmlCode(code);
  1536. }
  1537. return ret;
  1538. }
  1539. };
  1540. $.fn.code = CodePlugin;
  1541. $.fn.code.Constructor = HtmlCode;
  1542. })();
  1543. (function() {
  1544. var DK_DATA_TABLE = "dk_data_table",
  1545. DataTable = function(ele) {
  1546. this.ele = ele;
  1547. this.codeRef = ele.find(".dt-tpl").code();
  1548. this.formRef = ele.find(".dt-form").form();
  1549. this.uri = ele.attr("loadUri");
  1550. this.eh = true;
  1551. this.ele.data(DK_DATA_TABLE, this);
  1552. };
  1553. $.extend(DataTable.prototype, {
  1554. load: function() {
  1555. var qd = this.formRef.val();
  1556. if(qd === CK_FALSE) return;
  1557. if(this.ch) {
  1558. this.ch === true ? this.codeRef.empty() : this.ch();
  1559. }
  1560. var self = this;
  1561. util.get(self.uri, qd, function(data) {
  1562. self.codeRef.val({ "data": data, "length": data ? data.length : 0 });
  1563. }, self.eh);
  1564. },
  1565. error: function(eh) {
  1566. this.eh = eh;
  1567. },
  1568. beforLoad: function(ch) { this.ch = ch }
  1569. });
  1570. var DataTablePlugin = function() {
  1571. if(this.length) {
  1572. var dt = $(this[0]);
  1573. var ret = dt.data(DK_DATA_TABLE);
  1574. if(!ret) {
  1575. ret = new DataTable(dt);
  1576. }
  1577. return ret;
  1578. }
  1579. }
  1580. $.fn.dg = DataTablePlugin;
  1581. $.fn.dg.Constructor = DataTable;
  1582. var DK_PAGE_DATA_TABLE = "dk_page_data_table",
  1583. pdt_pager_builder = function(data) {
  1584. if(data.total) {
  1585. var pages = Math.ceil(data.total / data.pageSize),
  1586. no = data.pageNo,
  1587. i = no - 2,
  1588. hc = [];
  1589. hc.push("<li class='");
  1590. if(no > 1) {
  1591. hc.push("active' no='" + (no - 1) + "'");
  1592. } else {
  1593. hc.push("disabled'");
  1594. }
  1595. hc.push("><a href='javascript:;'>«</a></li>");
  1596. hc.push("<li class='" + (no == 1 ? "curr'" : "active' no='1'") + "><a href='javascript:;'>1</a></li>");
  1597. if(no > 4) hc.push("<li><a href='javascript:;'>...</a></li>");
  1598. for(i = Math.max(2, no - 2); i < no; ++i) {
  1599. hc.push("<li class='active' no='" + i + "'><a href='javascript:;'>" + i + "</a></li>");
  1600. }
  1601. if(no != 1) {
  1602. hc.push("<li class='curr'><a href='javascript:;'>" + no + "</a></li>");
  1603. }
  1604. i = no + 1;
  1605. var min = Math.min(pages, no + 3);
  1606. for(; i < min; ++i) {
  1607. hc.push("<li class='active' no='" + i + "'><a href='javascript:;'>" + i + "</a></li>");
  1608. }
  1609. if(pages - no > 3) hc.push("<li><a href='javascript:;'>...</a></li>");
  1610. if(pages != no) hc.push("<li class='active' no='" + pages + "'><a href='javascript:;'>" + pages + "</a></li>");
  1611. hc.push("<li class='");
  1612. if(no != pages) {
  1613. hc.push("active' no='" + (no + 1) + "'");
  1614. } else {
  1615. hc.push("disabled'");
  1616. }
  1617. hc.push("><a href='javascript:;'>»</a></li>");
  1618. this.pagerEle.html(hc.join(""));
  1619. var self = this;
  1620. this.pagerEle.children("li.active").on("click", function() {
  1621. self.goPage(parseInt($(this).attr("no")));
  1622. });
  1623. } else {
  1624. this.pagerEle.empty();
  1625. }
  1626. },
  1627. pdt_build_pageIndex = function(data, key, pageSize, pageNo) {
  1628. var bi = pageSize * (pageNo - 1) + 1;
  1629. for(var i = 0; i < data.length; ++i) {
  1630. data[i][key] = bi++;
  1631. }
  1632. },
  1633. PageDataTable = function(ele) {
  1634. this.ele = ele;
  1635. this.codeRef = ele.find(".dt-tpl").code();
  1636. this.formRef = ele.find(".dt-form").form();
  1637. this.pagerEle = ele.find(".dt-pager");
  1638. this.uri = ele.attr("loadUri");
  1639. this.pagerPrefix = ele.attr("pagerPrefix") ? "_" : "";
  1640. this.pageSize = parseInt(ele.attr("pageSize") || "1");
  1641. this.pageNo = parseInt(ele.attr("pageNo") || "10");
  1642. this.ph = pdt_pager_builder;
  1643. this.ele.data(DK_PAGE_DATA_TABLE, this);
  1644. this.eh = true;
  1645. this.pageIndex = ele.attr("pageIndex");
  1646. };
  1647. $.extend(PageDataTable.prototype, {
  1648. error: function(eh) { this.eh = eh },
  1649. beforLoad: function(ch) { this.ch = ch },
  1650. load: function() {
  1651. var qd = this.formRef.val();
  1652. if(qd === CK_FALSE) return;
  1653. this.cache = qd || {};
  1654. this.cache[this.pagerPrefix + "pageNo"] = this.pageNo;
  1655. this.cache[this.pagerPrefix + "pageSize"] = this.pageSize;
  1656. this.reload();
  1657. },
  1658. reload: function() {
  1659. if(this.ch) {
  1660. this.ch === true ? (this.codeRef.empty() || this.pagerEle.empty()) : this.ch();
  1661. }
  1662. var self = this;
  1663. util.get(self.uri, this.cache, function(data) {
  1664. self.total = data.total;
  1665. data.length = data.data.length;
  1666. if(self.pageIndex) {
  1667. pdt_build_pageIndex(data.data, self.pageIndex, data.pageSize, data.pageNo);
  1668. }
  1669. self.codeRef.val(data);
  1670. self.ph(data);
  1671. }, self.eh);
  1672. },
  1673. goPage: function(pageNo, pageSize) {
  1674. this.cache[this.pagerPrefix + "pageNo"] = pageNo;
  1675. this.cache[this.pagerPrefix + "pageSize"] = (pageSize || this.cache[this.pagerPrefix + "pageSize"]);
  1676. this.reload();
  1677. },
  1678. buildPager: function(ph) { this.ph = ph }
  1679. });
  1680. var PageDataTablePlugin = function() {
  1681. if(this.length) {
  1682. var dt = $(this[0]);
  1683. var ret = dt.data(DK_PAGE_DATA_TABLE);
  1684. if(!ret) {
  1685. ret = new PageDataTable(dt);
  1686. }
  1687. return ret;
  1688. }
  1689. }
  1690. $.fn.pdg = PageDataTablePlugin;
  1691. $.fn.pdg.Constructor = PageDataTable;
  1692. })();
  1693. (function() {
  1694. var spa_modal_index = 0,
  1695. spa_load_res = function() {
  1696. var self = this;
  1697. if(this.resUri) {
  1698. util.get(self.resUri, null, function(data) {
  1699. /**
  1700. * res =[{id:"",uri:"",css:"",script:""},{id:"",uri:"",css:"",script:""},...........]
  1701. */
  1702. self.res = {};
  1703. for(var i = 0; i < data.length; ++i) {
  1704. var item = data[i];
  1705. self.res[item.id] = item;
  1706. }
  1707. if(self.menuUri) {
  1708. spa_load_menu.call(self);
  1709. } else {
  1710. self.showMain();
  1711. }
  1712. }, {})
  1713. }
  1714. },
  1715. spa_load_menu = function() {
  1716. var self = this;
  1717. util.get(this.menuUri, null, function(menu) {
  1718. self.menu = menu;
  1719. spa_build_menu.call(self);
  1720. self.showMain();
  1721. }, function(errCode, errMsg, errDetailMsg) {
  1722. util.error("load spa menu data error");
  1723. });
  1724. },
  1725. spa_build_menu = function() {
  1726. if(this.menuEle && this.menu) {
  1727. var pEle = $("<ul class='nav nav-root'></ul>");
  1728. spa_build_menu_item(this, pEle, this.menu);
  1729. pEle.appendTo(this.menuEle);
  1730. var self = this;
  1731. this.menuEle.find(".nav-hand").on("click", function(e) {
  1732. var $this = $(this);
  1733. pEle.find(".nav-hand.active").removeClass("active");
  1734. $this.addClass("active");
  1735. if($this.hasClass("spa-modal")) {
  1736. self.showModal($this.attr("res"));
  1737. } else {
  1738. location.hash = "#" + $this.attr("res");
  1739. self.showMain();
  1740. }
  1741. });
  1742. this.menuEle.find(".nav-branch-hand").on("click", function(e) {
  1743. var prt = $(this).parent();
  1744. if(prt.hasClass("open")) {
  1745. prt.removeClass("open");
  1746. } else {
  1747. prt.parent().children(".open").removeClass("open");
  1748. prt.addClass("open");
  1749. }
  1750. });
  1751. }
  1752. },
  1753. spa_build_menu_item = function(that, pEle, items) {
  1754. var item, res, caption, iconClass;
  1755. for(var i = 0; i < items.length; ++i) {
  1756. item = items[i];
  1757. var $li = $("<li></li>");
  1758. var $a = $("<a href='javascript:;'></a>").appendTo($li);
  1759. caption = item.caption;
  1760. iconClass = item.icon || (item.res ? "book" : "branch");
  1761. $a.html("<i class='icon-" + iconClass + "'></i>" + caption);
  1762. if(item.res) {
  1763. $a.attr("res", item.res).addClass("nav-hand");
  1764. if(item.modal) {
  1765. $a.addClass("spa-modal");
  1766. }
  1767. } else {
  1768. $a.append($("<i class='icon fold'></i>")).addClass("nav-branch-hand");
  1769. $li.addClass("nav-parent");
  1770. var $ul = $("<ul class='nav'></ul>").appendTo($li);
  1771. spa_build_menu_item(that, $ul, item.children);
  1772. }
  1773. $li.appendTo(pEle);
  1774. }
  1775. },
  1776. spa_loadModelCss = function(model) {
  1777. if(model.css) {
  1778. var found = false;
  1779. $("link").each(function() {
  1780. if(model.css == this.getAttribute("href")) {
  1781. var ref = parseInt(this.getAttribute("spa-css-ref") || "1");
  1782. this.setAttribute("spa-css-ref", "" + (ref + 1));
  1783. found = true;
  1784. return false;
  1785. }
  1786. });
  1787. if(!found) {
  1788. var link = doc.createElement('link');
  1789. link.rel = 'stylesheet';
  1790. link.href = model.css;
  1791. link.media = 'all';
  1792. link.setAttribute("spa-css-ref", "1");
  1793. head.appendChild(link);
  1794. }
  1795. }
  1796. },
  1797. spa_showMainInternal = function(model) {
  1798. spa_cleanMain.call(this);
  1799. this.main = model;
  1800. if(model.css) spa_loadModelCss.call(this, model);
  1801. if(model.html) this.mainEle.html(model.html);
  1802. this.mainEle.attr("spa-model-id", model.id);
  1803. if(model.factory && model.factory.main) {
  1804. model.factory.main.call(this);
  1805. }
  1806. },
  1807. spa_showModalInternal = function(model, data) {
  1808. if(model.css) spa_loadModelCss.call(this, model);
  1809. var ly = util.createModalLayer(model.html);
  1810. ++spa_modal_index;
  1811. // console.log(ly.ctn)
  1812. ly.ctn.addClass("spa-modal").addClass("spa-modal-index-" + spa_modal_index).attr("spa-model-id", model.id);
  1813. if(model.factory && model.factory.modal) {
  1814. model.factory.modal.call(this, data);
  1815. }
  1816. },
  1817. spa_cacheModel = function(model) {
  1818. var m = this.cache[model.id] = {};
  1819. m.html = model.html;
  1820. m.factory = model.factory;
  1821. m.css = model.css;
  1822. m.id = model.id;
  1823. m.data = model.data;
  1824. delete this.res[model.id];
  1825. return m;
  1826. },
  1827. spa_afterLoadByMain = function(model, data) {
  1828. spa_showMainInternal.call(this, spa_cacheModel.call(this, model));
  1829. },
  1830. spa_afterLoadByModal = function(model, data) {
  1831. spa_showModalInternal.call(this, spa_cacheModel.call(this, model), data);
  1832. },
  1833. spa_loadModel = function(model, handler, data) {
  1834. var self = this;
  1835. if(model.html) {
  1836. model.state = 11;
  1837. if(model.script) {
  1838. spa_loadModelScript.call(self, model, handler, data);
  1839. } else {
  1840. handler.call(self, model, data);
  1841. }
  1842. } else if(model.uri) {
  1843. util.showLoading();
  1844. model.state = 10;
  1845. $.ajax({ url: model.uri, dataType: "html", type: "GET" }).done(function(hc) {
  1846. model.state = 11;
  1847. model.html = hc;
  1848. util.hideLoading();
  1849. if(model.script) {
  1850. spa_loadModelScript.call(self, model, handler, data);
  1851. } else {
  1852. handler.call(self, model, data);
  1853. }
  1854. }).fail(function() {
  1855. model.state = 12;
  1856. util.hideLoading();
  1857. util.error("load resource[" + model.id + "] html error");
  1858. });
  1859. }
  1860. },
  1861. spa_removeModelCss = function(model) {
  1862. if(model.css) {
  1863. $("link").each(function() {
  1864. if(model.css == this.getAttribute("href")) {
  1865. var ref = parseInt(this.getAttribute("spa-css-ref") || "1");
  1866. if(ref == 1) {
  1867. this.parentNode.removeChild(this);
  1868. } else {
  1869. this.setAttribute("spa-css-ref", "" + (ref - 1));
  1870. }
  1871. }
  1872. });
  1873. }
  1874. },
  1875. spa_loadModelScript = function(model, handler, data) {
  1876. var self = this;
  1877. model.factory = this.scriptCache[model.script];
  1878. if(model.factory) {
  1879. model.state = 31;
  1880. handler.call(this, model, data);
  1881. return;
  1882. }
  1883. var node = doc.createElement(EN_SCRIPT);
  1884. node.async = CK_TRUE;
  1885. node.src = model.script;
  1886. node.charset = "UTF-8";
  1887. var supportOnload = "onload" in node;
  1888. util.showLoading();
  1889. window.spa_define = function(factoryBuilder) {
  1890. model.state = 30;
  1891. util.showLoading();
  1892. try {
  1893. self.scriptCache[model.script] = model.factory = factoryBuilder.call(null, self);
  1894. model.state = 31;
  1895. util.hideLoading();
  1896. } catch(error) {
  1897. model.state = 32;
  1898. util.hideLoading();
  1899. util.error("init model[" + model.id + "] error");
  1900. }
  1901. handler.call(self, model, data);
  1902. }
  1903. if(supportOnload) {
  1904. node.onload = function() {
  1905. if(model.state < 21) model.state = 21;
  1906. node.onerror = null;
  1907. node.onload = null;
  1908. head.removeChild(node);
  1909. util.hideLoading();
  1910. };
  1911. node.onerror = function() {
  1912. if(model.state < 22) {
  1913. model.state = 22;
  1914. util.error("load script error:" + model.script);
  1915. node.onload = null;
  1916. node.onerror = null;
  1917. }
  1918. head.removeChild(node);
  1919. util.hideLoading();
  1920. };
  1921. } else {
  1922. node.onreadystatechange = function() {
  1923. if(/loaded|complete/.test(node.readyState)) {
  1924. node.onreadystatechange = null;
  1925. if(model.state < 21) {
  1926. model.state = 21;
  1927. var to = model.timeout || 1000;
  1928. setTimeout(function() {
  1929. if(model.state == 21) {
  1930. model.state = 22;
  1931. util.error("load script error:" + model.script);
  1932. head.removeChild(node);
  1933. util.hideLoading();
  1934. }
  1935. }, model.timeout || 1000);
  1936. } else {
  1937. head.removeChild(node);
  1938. util.hideLoading();
  1939. }
  1940. }
  1941. };
  1942. }
  1943. model.state = 20;
  1944. baseElement ?
  1945. head.insertBefore(node, baseElement) :
  1946. head.appendChild(node);
  1947. },
  1948. spa_cleanMain = function() {
  1949. if(this.main) {
  1950. spa_removeModelCss.call(this, this.main);
  1951. if(this.main.factory && this.main.factory.mainDestory) this.main.factory.mainDestory.call(this);
  1952. this.mainEle.empty();
  1953. }
  1954. },
  1955. SPA = function(ele) {
  1956. this.ele = ele;
  1957. ele.data(DK_FORM_VALUE, this);
  1958. this.menuEle = ele.find(".spa-menu");
  1959. this.mainEle = ele.find(".spa-main");
  1960. this.menuUri = ele.attr("menu");
  1961. this.resUri = ele.attr("resource");
  1962. this.cache = {};
  1963. this.scriptCache = {};
  1964. };
  1965. $.extend(SPA.prototype, {
  1966. init: function() {
  1967. spa_load_res.call(this);
  1968. },
  1969. getModel: function(id) {
  1970. return this.cache ? this.cache[id] : this.res[id];
  1971. },
  1972. showModal: function(id, data) {
  1973. if(this.cache[id]) {
  1974. spa_showModalInternal.call(this, this.cache[id], data);
  1975. } else {
  1976. var model = this.res[id];
  1977. if(model) {
  1978. spa_loadModel.call(this, model, spa_afterLoadByModal, data);
  1979. } else {
  1980. util.error("invalid resource id[" + id + "]");
  1981. }
  1982. }
  1983. },
  1984. showMain: function() {
  1985. var id = location.hash;
  1986. if(id && id.length > 1) {
  1987. id = id.substring(1);
  1988. } else return;
  1989. if(this.main && id == this.main.id) return;
  1990. if(this.cache[id]) {
  1991. spa_showMainInternal.call(this, this.cache[id]);
  1992. } else {
  1993. var model = this.res[id];
  1994. if(model) {
  1995. spa_loadModel.call(this, model, spa_afterLoadByMain);
  1996. } else {
  1997. util.error("invalid resource id[" + id + "]");
  1998. }
  1999. }
  2000. },
  2001. getLastModalIndex: function() {
  2002. return spa_modal_index;
  2003. },
  2004. getLastModalCtn: function() {
  2005. return $(".spa-modal-index-" + spa_modal_index);
  2006. },
  2007. getLastModalModel: function() {
  2008. var ctn = $(".spa-modal-index-" + spa_modal_index);
  2009. var id = modalCtn.attr("spa-model-id");
  2010. return getModel(id);
  2011. },
  2012. closeModal: function() {
  2013. var ctn = $(".spa-modal-index-" + spa_modal_index);
  2014. var id = ctn.attr("spa-model-id");
  2015. var inx = _g_layer_curr.index + 1;
  2016. if(ctn.hasClass("layer-" + inx)) {
  2017. var model = this.cache ? this.cache[id] : this.res[id];
  2018. if(model) {
  2019. if(model.factory.modalDestory) model.factory.modalDestory.call(this);
  2020. if(model.css) spa_removeModelCss.call(this, model);
  2021. --spa_modal_index;
  2022. util.closeModalLayer();
  2023. }
  2024. } else {
  2025. util.error("can't close modal:has top layer ");
  2026. }
  2027. }
  2028. });
  2029. $.buildSpa = function() {
  2030. var sbody = $("body");
  2031. if(sbody.length == 1 && sbody.hasClass("spa-page")) {
  2032. $.spa = new SPA(sbody);
  2033. $.spa.init();
  2034. }
  2035. };
  2036. })();
  2037. $(doc).on("click.jr_dropdown_api", dd_clearMenus);
  2038. $(doc).on("click.jr_dropdown_api", QF_DROP_DOWN_HAND, dd_toggle);
  2039. $(doc).on("show.jr.dropdown", ".dd-ctn.date,.dd-ctn.datetime,.dd-ctn.time", function() {
  2040. var $dateCtn = $(this);
  2041. var date = $dateCtn.data(DK_FORM_VALUE);
  2042. if(date && date.show) {
  2043. date.show();
  2044. }
  2045. });
  2046. $(doc).on("click", ".dd-ctn.date .day .day-item ,.dd-ctn.date .day .no-current-month", function() {
  2047. var $this = $(this);
  2048. var $dateCtn = $this.parents(".dd-ctn.date");
  2049. var date = $dateCtn.data(DK_FORM_VALUE);
  2050. if(date && date.val && $this.attr("day")) {
  2051. date.val($this.attr("day"));
  2052. }
  2053. });
  2054. $(doc).on("click", ".day .prev-year", function(e) {
  2055. var $this = $(this);
  2056. var table = $this.parents("table");
  2057. if(table) {
  2058. var year = table.attr("year");
  2059. if(year) {
  2060. var month = table.attr("month");
  2061. if(month) {
  2062. month = parseInt(month) - 1;
  2063. year = parseInt(year) - 1;
  2064. var dddrop = table.parents(".dd-drop.date");
  2065. if(dddrop) {
  2066. $ddc = dddrop.parents(".dd-ctn");
  2067. if($ddc) {
  2068. var date = $ddc.data(DK_FORM_VALUE);
  2069. if(date && date.showDay) {
  2070. date.showDay(dddrop, year, month);
  2071. e.stopPropagation();
  2072. }
  2073. }
  2074. }
  2075. }
  2076. }
  2077. }
  2078. });
  2079. $(doc).on("click", ".day .prev-month", function(e) {
  2080. var $this = $(this);
  2081. var table = $this.parents("table");
  2082. if(table) {
  2083. var year = table.attr("year");
  2084. if(year) {
  2085. var month = table.attr("month");
  2086. if(month) {
  2087. month = parseInt(month) - 1;
  2088. year = parseInt(year);
  2089. if(month > 0) {
  2090. month--;
  2091. } else {
  2092. year--;
  2093. month = 11;
  2094. }
  2095. var dddrop = table.parents(".dd-drop.date");
  2096. if(dddrop) {
  2097. $ddc = dddrop.parents(".dd-ctn");
  2098. if($ddc) {
  2099. var date = $ddc.data(DK_FORM_VALUE);
  2100. if(date && date.showDay) {
  2101. date.showDay(dddrop, year, month);
  2102. e.stopPropagation();
  2103. }
  2104. }
  2105. }
  2106. }
  2107. }
  2108. }
  2109. });
  2110. $(doc).on("click", ".day .next-year", function(e) {
  2111. var $this = $(this);
  2112. var table = $this.parents("table");
  2113. if(table) {
  2114. var year = table.attr("year");
  2115. if(year) {
  2116. var month = table.attr("month");
  2117. if(month) {
  2118. month = parseInt(month) - 1;
  2119. year = parseInt(year) + 1;
  2120. var dddrop = table.parents(".dd-drop.date");
  2121. if(dddrop) {
  2122. $ddc = dddrop.parents(".dd-ctn");
  2123. if($ddc) {
  2124. var date = $ddc.data(DK_FORM_VALUE);
  2125. if(date && date.showDay) {
  2126. date.showDay(dddrop, year, month);
  2127. e.stopPropagation();
  2128. }
  2129. }
  2130. }
  2131. }
  2132. }
  2133. }
  2134. });
  2135. $(doc).on("click", ".day .next-month", function(e) {
  2136. var $this = $(this);
  2137. var table = $this.parents("table");
  2138. if(table) {
  2139. var year = table.attr("year");
  2140. if(year) {
  2141. var month = table.attr("month");
  2142. if(month) {
  2143. month = parseInt(month) - 1;
  2144. year = parseInt(year);
  2145. if(month == 11) {
  2146. year++;
  2147. month = 0;
  2148. } else {
  2149. month++;
  2150. }
  2151. var dddrop = table.parents(".dd-drop.date");
  2152. if(dddrop) {
  2153. $ddc = dddrop.parents(".dd-ctn");
  2154. if($ddc) {
  2155. var date = $ddc.data(DK_FORM_VALUE);
  2156. if(date && date.showDay) {
  2157. date.showDay(dddrop, year, month);
  2158. e.stopPropagation();
  2159. }
  2160. }
  2161. }
  2162. }
  2163. }
  2164. }
  2165. });
  2166. $(doc).on("click", ".click-hide-parent", function() {
  2167. $(this).parent().hide();
  2168. });
  2169. }(jQuery);