base.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849
  1. /**
  2. * jQuery ligerUI 1.1.9
  3. *
  4. * http://ligerui.com
  5. *
  6. * Author daomi 2012 [ gd_star@163.com ]
  7. *
  8. */
  9. (function ($)
  10. {
  11. //ligerui 继承方法
  12. Function.prototype.ligerExtend = function (parent, overrides)
  13. {
  14. if (typeof parent != 'function') return this;
  15. //保存对父类的引用
  16. this.base = parent.prototype;
  17. this.base.constructor = parent;
  18. //继承
  19. var f = function () { };
  20. f.prototype = parent.prototype;
  21. this.prototype = new f();
  22. this.prototype.constructor = this;
  23. //附加属性方法
  24. if (overrides) $.extend(this.prototype, overrides);
  25. };
  26. //延时加载
  27. Function.prototype.ligerDefer = function (o, defer, args)
  28. {
  29. var fn = this;
  30. return setTimeout(function () { fn.apply(o, args || []); }, defer);
  31. };
  32. // 核心对象
  33. window.liger = $.ligerui = {
  34. version: 'V1.1.9',
  35. managerCount: 0,
  36. //组件管理器池
  37. managers: {},
  38. managerIdPrev: 'ligerui',
  39. //错误提示
  40. error: {
  41. managerIsExist: '管理器id已经存在'
  42. },
  43. getId: function (prev)
  44. {
  45. prev = prev || this.managerIdPrev;
  46. var id = prev + (1000 + this.managerCount);
  47. this.managerCount++;
  48. return id;
  49. },
  50. add: function (manager)
  51. {
  52. if (arguments.length == 2)
  53. {
  54. var m = arguments[1];
  55. m.id = m.id || m.options.id || arguments[0].id;
  56. this.addManager(m);
  57. return;
  58. }
  59. if (!manager.id) manager.id = this.getId(manager.__idPrev());
  60. if (this.managers[manager.id])
  61. throw new Error(this.error.managerIsExist);
  62. this.managers[manager.id] = manager;
  63. },
  64. remove: function (arg)
  65. {
  66. if (typeof arg == "string" || typeof arg == "number")
  67. {
  68. delete $.ligerui.managers[arg];
  69. }
  70. else if (typeof arg == "object" && arg instanceof $.ligerui.core.Component)
  71. {
  72. delete $.ligerui.managers[arg.id];
  73. }
  74. },
  75. //获取ligerui对象
  76. //1,传入ligerui ID
  77. //2,传入Dom Object Array(jQuery)
  78. get: function (arg, idAttrName)
  79. {
  80. idAttrName = idAttrName || "ligeruiid";
  81. if (typeof arg == "string" || typeof arg == "number")
  82. {
  83. return $.ligerui.managers[arg];
  84. }
  85. else if (typeof arg == "object" && arg.length)
  86. {
  87. if (!arg[0][idAttrName] && !$(arg[0]).attr(idAttrName)) return null;
  88. return $.ligerui.managers[arg[0][idAttrName] || $(arg[0]).attr(idAttrName)];
  89. }
  90. return null;
  91. },
  92. //根据类型查找某一个对象
  93. find: function (type)
  94. {
  95. var arr = [];
  96. for (var id in this.managers)
  97. {
  98. var manager = this.managers[id];
  99. if (type instanceof Function)
  100. {
  101. if (manager instanceof type)
  102. {
  103. arr.push(manager);
  104. }
  105. }
  106. else if (type instanceof Array)
  107. {
  108. if ($.inArray(manager.__getType(), type) != -1)
  109. {
  110. arr.push(manager);
  111. }
  112. }
  113. else
  114. {
  115. if (manager.__getType() == type)
  116. {
  117. arr.push(manager);
  118. }
  119. }
  120. }
  121. return arr;
  122. },
  123. //$.fn.liger{Plugin} 和 $.fn.ligerGet{Plugin}Manager
  124. //会调用这个方法,并传入作用域(this)
  125. //@parm [plugin] 插件名
  126. //@parm [args] 参数(数组)
  127. //@parm [ext] 扩展参数,定义命名空间或者id属性名
  128. run: function (plugin, args, ext)
  129. {
  130. if (!plugin) return;
  131. ext = $.extend({
  132. defaultsNamespace: 'ligerDefaults',
  133. methodsNamespace: 'ligerMethods',
  134. controlNamespace: 'controls',
  135. idAttrName: 'ligeruiid',
  136. isStatic: false,
  137. hasElement: true, //是否拥有element主体(比如drag、resizable等辅助性插件就不拥有)
  138. propertyToElemnt: null //链接到element的属性名
  139. }, ext || {});
  140. plugin = plugin.replace(/^ligerGet/, '');
  141. plugin = plugin.replace(/^liger/, '');
  142. if (this == null || this == window || ext.isStatic)
  143. {
  144. if (!$.ligerui.plugins[plugin])
  145. {
  146. $.ligerui.plugins[plugin] = {
  147. fn: $['liger' + plugin],
  148. isStatic: true
  149. };
  150. }
  151. return new $.ligerui[ext.controlNamespace][plugin]($.extend({}, $[ext.defaultsNamespace][plugin] || {}, $[ext.defaultsNamespace][plugin + 'String'] || {}, args.length > 0 ? args[0] : {}));
  152. }
  153. if (!$.ligerui.plugins[plugin])
  154. {
  155. $.ligerui.plugins[plugin] = {
  156. fn: $.fn['liger' + plugin],
  157. isStatic: false
  158. };
  159. }
  160. if (/Manager$/.test(plugin)) return $.ligerui.get(this, ext.idAttrName);
  161. this.each(function ()
  162. {
  163. if (this[ext.idAttrName] || $(this).attr(ext.idAttrName))
  164. {
  165. var manager = $.ligerui.get(this[ext.idAttrName] || $(this).attr(ext.idAttrName));
  166. if (manager && args.length > 0) manager.set(args[0]);
  167. //已经执行过
  168. return;
  169. }
  170. if (args.length >= 1 && typeof args[0] == 'string') return;
  171. //只要第一个参数不是string类型,都执行组件的实例化工作
  172. var options = args.length > 0 ? args[0] : null;
  173. var p = $.extend({}, $[ext.defaultsNamespace][plugin] || {}
  174. , $[ext.defaultsNamespace][plugin + 'String'] || {}, options || {});
  175. if (ext.propertyToElemnt) p[ext.propertyToElemnt] = this;
  176. if (ext.hasElement)
  177. {
  178. new $.ligerui[ext.controlNamespace][plugin](this, p);
  179. }
  180. else
  181. {
  182. new $.ligerui[ext.controlNamespace][plugin](p);
  183. }
  184. });
  185. if (this.length == 0) return null;
  186. if (args.length == 0) return $.ligerui.get(this, ext.idAttrName);
  187. if (typeof args[0] == 'object') return $.ligerui.get(this, ext.idAttrName);
  188. if (typeof args[0] == 'string')
  189. {
  190. var manager = $.ligerui.get(this, ext.idAttrName);
  191. if (manager == null) return;
  192. if (args[0] == "option")
  193. {
  194. if (args.length == 2)
  195. return manager.get(args[1]); //manager get
  196. else if (args.length >= 3)
  197. return manager.set(args[1], args[2]); //manager set
  198. }
  199. else
  200. {
  201. var method = args[0];
  202. if (!manager[method]) return; //不存在这个方法
  203. var parms = Array.apply(null, args);
  204. parms.shift();
  205. return manager[method].apply(manager, parms); //manager method
  206. }
  207. }
  208. return null;
  209. },
  210. //扩展
  211. //1,默认参数
  212. //2,本地化扩展
  213. defaults: {},
  214. //3,方法接口扩展
  215. methods: {},
  216. //命名空间
  217. //核心控件,封装了一些常用方法
  218. core: {},
  219. //命名空间
  220. //组件的集合
  221. controls: {},
  222. //plugin 插件的集合
  223. plugins: {}
  224. };
  225. //扩展对象
  226. $.ligerDefaults = {};
  227. //扩展对象
  228. $.ligerMethos = {};
  229. //关联起来
  230. $.ligerui.defaults = $.ligerDefaults;
  231. $.ligerui.methods = $.ligerMethos;
  232. //获取ligerui对象
  233. //@parm [plugin] 插件名,可为空
  234. $.fn.liger = function (plugin)
  235. {
  236. if (plugin)
  237. {
  238. return $.ligerui.run.call(this, plugin, arguments);
  239. }
  240. else
  241. {
  242. return $.ligerui.get(this);
  243. }
  244. };
  245. //组件基类
  246. //1,完成定义参数处理方法和参数属性初始化的工作
  247. //2,完成定义事件处理方法和事件属性初始化的工作
  248. $.ligerui.core.Component = function (options)
  249. {
  250. //事件容器
  251. this.events = this.events || {};
  252. //配置参数
  253. this.options = options || {};
  254. //子组件集合索引
  255. this.children = {};
  256. };
  257. $.extend($.ligerui.core.Component.prototype, {
  258. __getType: function ()
  259. {
  260. return '$.ligerui.core.Component';
  261. },
  262. __idPrev: function ()
  263. {
  264. return 'ligerui';
  265. },
  266. //设置属性
  267. // arg 属性名 value 属性值
  268. // arg 属性/值 value 是否只设置事件
  269. set: function (arg, value)
  270. {
  271. if (!arg) return;
  272. if (typeof arg == 'object')
  273. {
  274. var tmp;
  275. if (this.options != arg)
  276. {
  277. $.extend(this.options, arg);
  278. tmp = arg;
  279. }
  280. else
  281. {
  282. tmp = $.extend({}, arg);
  283. }
  284. if (value == undefined || value == true)
  285. {
  286. for (var p in tmp)
  287. {
  288. if (p.indexOf('on') == 0)
  289. this.set(p, tmp[p]);
  290. }
  291. }
  292. if (value == undefined || value == false)
  293. {
  294. for (var p in tmp)
  295. {
  296. if (p.indexOf('on') != 0)
  297. this.set(p, tmp[p]);
  298. }
  299. }
  300. return;
  301. }
  302. var name = arg;
  303. //事件参数
  304. if (name.indexOf('on') == 0)
  305. {
  306. if (typeof value == 'function')
  307. this.bind(name.substr(2), value);
  308. return;
  309. }
  310. this.trigger('propertychange', arg, value);
  311. if (!this.options) this.options = {};
  312. this.options[name] = value;
  313. var pn = '_set' + name.substr(0, 1).toUpperCase() + name.substr(1);
  314. if (this[pn])
  315. {
  316. this[pn].call(this, value);
  317. }
  318. this.trigger('propertychanged', arg, value);
  319. },
  320. //获取属性
  321. get: function (name)
  322. {
  323. var pn = '_get' + name.substr(0, 1).toUpperCase() + name.substr(1);
  324. if (this[pn])
  325. {
  326. return this[pn].call(this, name);
  327. }
  328. return this.options[name];
  329. },
  330. hasBind: function (arg)
  331. {
  332. var name = arg.toLowerCase();
  333. var event = this.events[name];
  334. if (event && event.length) return true;
  335. return false;
  336. },
  337. //触发事件
  338. //data (可选) Array(可选)传递给事件处理函数的附加参数
  339. trigger: function (arg, data)
  340. {
  341. var name = arg.toLowerCase();
  342. var event = this.events[name];
  343. if (!event) return;
  344. data = data || [];
  345. if ((data instanceof Array) == false)
  346. {
  347. data = [data];
  348. }
  349. for (var i = 0; i < event.length; i++)
  350. {
  351. var ev = event[i];
  352. if (ev.handler.apply(ev.context, data) == false)
  353. return false;
  354. }
  355. },
  356. //绑定事件
  357. bind: function (arg, handler, context)
  358. {
  359. if (typeof arg == 'object')
  360. {
  361. for (var p in arg)
  362. {
  363. this.bind(p, arg[p]);
  364. }
  365. return;
  366. }
  367. if (typeof handler != 'function') return false;
  368. var name = arg.toLowerCase();
  369. var event = this.events[name] || [];
  370. context = context || this;
  371. event.push({ handler: handler, context: context });
  372. this.events[name] = event;
  373. },
  374. //取消绑定
  375. unbind: function (arg, handler)
  376. {
  377. if (!arg)
  378. {
  379. this.events = {};
  380. return;
  381. }
  382. var name = arg.toLowerCase();
  383. var event = this.events[name];
  384. if (!event || !event.length) return;
  385. if (!handler)
  386. {
  387. delete this.events[name];
  388. }
  389. else
  390. {
  391. for (var i = 0, l = event.length; i < l; i++)
  392. {
  393. if (event[i].handler == handler)
  394. {
  395. event.splice(i, 1);
  396. break;
  397. }
  398. }
  399. }
  400. },
  401. destroy: function ()
  402. {
  403. $.ligerui.remove(this);
  404. }
  405. });
  406. //界面组件基类,
  407. //1,完成界面初始化:设置组件id并存入组件管理器池,初始化参数
  408. //2,渲染的工作,细节交给子类实现
  409. //@parm [element] 组件对应的dom element对象
  410. //@parm [options] 组件的参数
  411. $.ligerui.core.UIComponent = function (element, options)
  412. {
  413. $.ligerui.core.UIComponent.base.constructor.call(this, options);
  414. var extendMethods = this._extendMethods();
  415. if (extendMethods) $.extend(this, extendMethods);
  416. this.element = element;
  417. this._init();
  418. this._preRender();
  419. this.trigger('render');
  420. this._render();
  421. this.trigger('rendered');
  422. this._rendered();
  423. };
  424. $.ligerui.core.UIComponent.ligerExtend($.ligerui.core.Component, {
  425. __getType: function ()
  426. {
  427. return '$.ligerui.core.UIComponent';
  428. },
  429. //扩展方法
  430. _extendMethods: function ()
  431. {
  432. },
  433. _init: function ()
  434. {
  435. this.type = this.__getType();
  436. if (!this.element)
  437. {
  438. this.id = this.options.id || $.ligerui.getId(this.__idPrev());
  439. }
  440. else
  441. {
  442. this.id = this.options.id || this.element.id || $.ligerui.getId(this.__idPrev());
  443. }
  444. //存入管理器池
  445. $.ligerui.add(this);
  446. if (!this.element) return;
  447. //读取attr方法,并加载到参数,比如['url']
  448. var attributes = this.attr();
  449. if (attributes && attributes instanceof Array)
  450. {
  451. for (var i = 0; i < attributes.length; i++)
  452. {
  453. var name = attributes[i];
  454. this.options[name] = $(this.element).attr(name);
  455. }
  456. }
  457. //读取ligerui这个属性,并加载到参数,比如 ligerui = "width:120,heigth:100"
  458. var p = this.options;
  459. if ($(this.element).attr("ligerui"))
  460. {
  461. try
  462. {
  463. var attroptions = $(this.element).attr("ligerui");
  464. if (attroptions.indexOf('{') != 0) attroptions = "{" + attroptions + "}";
  465. eval("attroptions = " + attroptions + ";");
  466. if (attroptions) $.extend(p, attroptions);
  467. }
  468. catch (e) { }
  469. }
  470. },
  471. //预渲染,可以用于继承扩展
  472. _preRender: function ()
  473. {
  474. },
  475. _render: function ()
  476. {
  477. },
  478. _rendered: function ()
  479. {
  480. if (this.element)
  481. {
  482. $(this.element).attr("ligeruiid", this.id);
  483. }
  484. },
  485. //返回要转换成ligerui参数的属性,比如['url']
  486. attr: function ()
  487. {
  488. return [];
  489. },
  490. destroy: function ()
  491. {
  492. if (this.element) $(this.element).remove();
  493. this.options = null;
  494. $.ligerui.remove(this);
  495. }
  496. });
  497. //表单控件基类
  498. $.ligerui.controls.Input = function (element, options)
  499. {
  500. $.ligerui.controls.Input.base.constructor.call(this, element, options);
  501. };
  502. $.ligerui.controls.Input.ligerExtend($.ligerui.core.UIComponent, {
  503. __getType: function ()
  504. {
  505. return '$.ligerui.controls.Input';
  506. },
  507. attr: function ()
  508. {
  509. return ['nullText'];
  510. },
  511. setValue: function (value)
  512. {
  513. return this.set('value', value);
  514. },
  515. getValue: function ()
  516. {
  517. return this.get('value');
  518. },
  519. setEnabled: function ()
  520. {
  521. return this.set('disabled', false);
  522. },
  523. setDisabled: function ()
  524. {
  525. return this.set('disabled', true);
  526. },
  527. updateStyle: function ()
  528. {
  529. }
  530. });
  531. //全局窗口对象
  532. $.ligerui.win = {
  533. //顶端显示
  534. top: false,
  535. //遮罩
  536. mask: function (win)
  537. {
  538. function setHeight()
  539. {
  540. if (!$.ligerui.win.windowMask) return;
  541. var h = $(window).height() + $(window).scrollTop();
  542. $.ligerui.win.windowMask.height(h);
  543. }
  544. if (!this.windowMask)
  545. {
  546. this.windowMask = $("<div class='l-window-mask' style='display: block;'></div>").appendTo('body');
  547. $(window).bind('resize.ligeruiwin', setHeight);
  548. $(window).bind('scroll', setHeight);
  549. }
  550. this.windowMask.show();
  551. setHeight();
  552. this.masking = true;
  553. },
  554. //取消遮罩
  555. unmask: function (win)
  556. {
  557. var jwins = $("body > .l-dialog:visible,body > .l-window:visible");
  558. for (var i = 0, l = jwins.length; i < l; i++)
  559. {
  560. var winid = jwins.eq(i).attr("ligeruiid");
  561. if (win && win.id == winid) continue;
  562. //获取ligerui对象
  563. var winmanager = $.ligerui.get(winid);
  564. if (!winmanager) continue;
  565. //是否模态窗口
  566. var modal = winmanager.get('modal');
  567. //如果存在其他模态窗口,那么不会取消遮罩
  568. if (modal) return;
  569. }
  570. if (this.windowMask)
  571. this.windowMask.hide();
  572. this.masking = false;
  573. },
  574. //显示任务栏
  575. createTaskbar: function ()
  576. {
  577. if (!this.taskbar)
  578. {
  579. this.taskbar = $('<div class="l-taskbar"><div class="l-taskbar-tasks"></div><div class="l-clear"></div></div>').appendTo('body');
  580. if (this.top) this.taskbar.addClass("l-taskbar-top");
  581. this.taskbar.tasks = $(".l-taskbar-tasks:first", this.taskbar);
  582. this.tasks = {};
  583. }
  584. this.taskbar.show();
  585. this.taskbar.animate({ bottom: 0 });
  586. return this.taskbar;
  587. },
  588. //关闭任务栏
  589. removeTaskbar: function ()
  590. {
  591. var self = this;
  592. self.taskbar.animate({ bottom: -32 }, function ()
  593. {
  594. self.taskbar.remove();
  595. self.taskbar = null;
  596. });
  597. },
  598. activeTask: function (win)
  599. {
  600. for (var winid in this.tasks)
  601. {
  602. var t = this.tasks[winid];
  603. if (winid == win.id)
  604. {
  605. t.addClass("l-taskbar-task-active");
  606. }
  607. else
  608. {
  609. t.removeClass("l-taskbar-task-active");
  610. }
  611. }
  612. },
  613. //获取任务
  614. getTask: function (win)
  615. {
  616. var self = this;
  617. if (!self.taskbar) return;
  618. if (self.tasks[win.id]) return self.tasks[win.id];
  619. return null;
  620. },
  621. //增加任务
  622. addTask: function (win)
  623. {
  624. var self = this;
  625. if (!self.taskbar) self.createTaskbar();
  626. if (self.tasks[win.id]) return self.tasks[win.id];
  627. var title = win.get('title');
  628. var task = self.tasks[win.id] = $('<div class="l-taskbar-task"><div class="l-taskbar-task-icon"></div><div class="l-taskbar-task-content">' + title + '</div></div>');
  629. self.taskbar.tasks.append(task);
  630. self.activeTask(win);
  631. task.bind('click', function ()
  632. {
  633. self.activeTask(win);
  634. if (win.actived)
  635. win.min();
  636. else
  637. win.active();
  638. }).hover(function ()
  639. {
  640. $(this).addClass("l-taskbar-task-over");
  641. }, function ()
  642. {
  643. $(this).removeClass("l-taskbar-task-over");
  644. });
  645. return task;
  646. },
  647. hasTask: function ()
  648. {
  649. for (var p in this.tasks)
  650. {
  651. if (this.tasks[p])
  652. return true;
  653. }
  654. return false;
  655. },
  656. //移除任务
  657. removeTask: function (win)
  658. {
  659. var self = this;
  660. if (!self.taskbar) return;
  661. if (self.tasks[win.id])
  662. {
  663. self.tasks[win.id].unbind();
  664. self.tasks[win.id].remove();
  665. delete self.tasks[win.id];
  666. }
  667. if (!self.hasTask())
  668. {
  669. self.removeTaskbar();
  670. }
  671. },
  672. //前端显示
  673. setFront: function (win)
  674. {
  675. var wins = $.ligerui.find($.ligerui.core.Win);
  676. for (var i in wins)
  677. {
  678. var w = wins[i];
  679. if (w == win)
  680. {
  681. $(w.element).css("z-index", "9200");
  682. this.activeTask(w);
  683. }
  684. else
  685. {
  686. $(w.element).css("z-index", "9100");
  687. }
  688. }
  689. }
  690. };
  691. //窗口基类 window、dialog
  692. $.ligerui.core.Win = function (element, options)
  693. {
  694. $.ligerui.core.Win.base.constructor.call(this, element, options);
  695. };
  696. $.ligerui.core.Win.ligerExtend($.ligerui.core.UIComponent, {
  697. __getType: function ()
  698. {
  699. return '$.ligerui.controls.Win';
  700. },
  701. mask: function ()
  702. {
  703. if (this.options.modal)
  704. $.ligerui.win.mask(this);
  705. },
  706. unmask: function ()
  707. {
  708. if (this.options.modal)
  709. $.ligerui.win.unmask(this);
  710. },
  711. min: function ()
  712. {
  713. },
  714. max: function ()
  715. {
  716. },
  717. active: function ()
  718. {
  719. }
  720. });
  721. $.ligerui.draggable = {
  722. dragging: false
  723. };
  724. $.ligerui.resizable = {
  725. reszing: false
  726. };
  727. $.ligerui.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function (o)
  728. {
  729. var f = function (n)
  730. {
  731. return n < 10 ? '0' + n : n;
  732. },
  733. escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
  734. quote = function (value)
  735. {
  736. escapable.lastIndex = 0;
  737. return escapable.test(value) ?
  738. '"' + value.replace(escapable, function (a)
  739. {
  740. var c = meta[a];
  741. return typeof c === 'string' ? c :
  742. '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
  743. }) + '"' :
  744. '"' + value + '"';
  745. };
  746. if (o === null) return 'null';
  747. var type = typeof o;
  748. if (type === 'undefined') return undefined;
  749. if (type === 'string') return quote(o);
  750. if (type === 'number' || type === 'boolean') return '' + o;
  751. if (type === 'object')
  752. {
  753. if (typeof o.toJSON === 'function')
  754. {
  755. return $.ligerui.toJSON(o.toJSON());
  756. }
  757. if (o.constructor === Date)
  758. {
  759. return isFinite(this.valueOf()) ?
  760. this.getUTCFullYear() + '-' +
  761. f(this.getUTCMonth() + 1) + '-' +
  762. f(this.getUTCDate()) + 'T' +
  763. f(this.getUTCHours()) + ':' +
  764. f(this.getUTCMinutes()) + ':' +
  765. f(this.getUTCSeconds()) + 'Z' : null;
  766. }
  767. var pairs = [];
  768. if (o.constructor === Array)
  769. {
  770. for (var i = 0, l = o.length; i < l; i++)
  771. {
  772. pairs.push($.ligerui.toJSON(o[i]) || 'null');
  773. }
  774. return '[' + pairs.join(',') + ']';
  775. }
  776. var name, val;
  777. for (var k in o)
  778. {
  779. type = typeof k;
  780. if (type === 'number')
  781. {
  782. name = '"' + k + '"';
  783. } else if (type === 'string')
  784. {
  785. name = quote(k);
  786. } else
  787. {
  788. continue;
  789. }
  790. type = typeof o[k];
  791. if (type === 'function' || type === 'undefined')
  792. {
  793. continue;
  794. }
  795. val = $.ligerui.toJSON(o[k]);
  796. pairs.push(name + ':' + val);
  797. }
  798. return '{' + pairs.join(',') + '}';
  799. }
  800. };
  801. })(jQuery);