common.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:16k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.event.common");
  9. dojo.require("dojo.lang.array");
  10. dojo.require("dojo.lang.extras");
  11. dojo.require("dojo.lang.func");
  12. dojo.event = new function () {
  13. this._canTimeout = dojo.lang.isFunction(dj_global["setTimeout"]) || dojo.lang.isAlien(dj_global["setTimeout"]);
  14. function interpolateArgs(args, searchForNames) {
  15. var dl = dojo.lang;
  16. var ao = {srcObj:dj_global, srcFunc:null, adviceObj:dj_global, adviceFunc:null, aroundObj:null, aroundFunc:null, adviceType:(args.length > 2) ? args[0] : "after", precedence:"last", once:false, delay:null, rate:0, adviceMsg:false, maxCalls:-1};
  17. switch (args.length) {
  18.   case 0:
  19. return;
  20.   case 1:
  21. return;
  22.   case 2:
  23. ao.srcFunc = args[0];
  24. ao.adviceFunc = args[1];
  25. break;
  26.   case 3:
  27. if ((dl.isObject(args[0])) && (dl.isString(args[1])) && (dl.isString(args[2]))) {
  28. ao.adviceType = "after";
  29. ao.srcObj = args[0];
  30. ao.srcFunc = args[1];
  31. ao.adviceFunc = args[2];
  32. } else {
  33. if ((dl.isString(args[1])) && (dl.isString(args[2]))) {
  34. ao.srcFunc = args[1];
  35. ao.adviceFunc = args[2];
  36. } else {
  37. if ((dl.isObject(args[0])) && (dl.isString(args[1])) && (dl.isFunction(args[2]))) {
  38. ao.adviceType = "after";
  39. ao.srcObj = args[0];
  40. ao.srcFunc = args[1];
  41. var tmpName = dl.nameAnonFunc(args[2], ao.adviceObj, searchForNames);
  42. ao.adviceFunc = tmpName;
  43. } else {
  44. if ((dl.isFunction(args[0])) && (dl.isObject(args[1])) && (dl.isString(args[2]))) {
  45. ao.adviceType = "after";
  46. ao.srcObj = dj_global;
  47. var tmpName = dl.nameAnonFunc(args[0], ao.srcObj, searchForNames);
  48. ao.srcFunc = tmpName;
  49. ao.adviceObj = args[1];
  50. ao.adviceFunc = args[2];
  51. }
  52. }
  53. }
  54. }
  55. break;
  56.   case 4:
  57. if ((dl.isObject(args[0])) && (dl.isObject(args[2]))) {
  58. ao.adviceType = "after";
  59. ao.srcObj = args[0];
  60. ao.srcFunc = args[1];
  61. ao.adviceObj = args[2];
  62. ao.adviceFunc = args[3];
  63. } else {
  64. if ((dl.isString(args[0])) && (dl.isString(args[1])) && (dl.isObject(args[2]))) {
  65. ao.adviceType = args[0];
  66. ao.srcObj = dj_global;
  67. ao.srcFunc = args[1];
  68. ao.adviceObj = args[2];
  69. ao.adviceFunc = args[3];
  70. } else {
  71. if ((dl.isString(args[0])) && (dl.isFunction(args[1])) && (dl.isObject(args[2]))) {
  72. ao.adviceType = args[0];
  73. ao.srcObj = dj_global;
  74. var tmpName = dl.nameAnonFunc(args[1], dj_global, searchForNames);
  75. ao.srcFunc = tmpName;
  76. ao.adviceObj = args[2];
  77. ao.adviceFunc = args[3];
  78. } else {
  79. if ((dl.isString(args[0])) && (dl.isObject(args[1])) && (dl.isString(args[2])) && (dl.isFunction(args[3]))) {
  80. ao.srcObj = args[1];
  81. ao.srcFunc = args[2];
  82. var tmpName = dl.nameAnonFunc(args[3], dj_global, searchForNames);
  83. ao.adviceObj = dj_global;
  84. ao.adviceFunc = tmpName;
  85. } else {
  86. if (dl.isObject(args[1])) {
  87. ao.srcObj = args[1];
  88. ao.srcFunc = args[2];
  89. ao.adviceObj = dj_global;
  90. ao.adviceFunc = args[3];
  91. } else {
  92. if (dl.isObject(args[2])) {
  93. ao.srcObj = dj_global;
  94. ao.srcFunc = args[1];
  95. ao.adviceObj = args[2];
  96. ao.adviceFunc = args[3];
  97. } else {
  98. ao.srcObj = ao.adviceObj = ao.aroundObj = dj_global;
  99. ao.srcFunc = args[1];
  100. ao.adviceFunc = args[2];
  101. ao.aroundFunc = args[3];
  102. }
  103. }
  104. }
  105. }
  106. }
  107. }
  108. break;
  109.   case 6:
  110. ao.srcObj = args[1];
  111. ao.srcFunc = args[2];
  112. ao.adviceObj = args[3];
  113. ao.adviceFunc = args[4];
  114. ao.aroundFunc = args[5];
  115. ao.aroundObj = dj_global;
  116. break;
  117.   default:
  118. ao.srcObj = args[1];
  119. ao.srcFunc = args[2];
  120. ao.adviceObj = args[3];
  121. ao.adviceFunc = args[4];
  122. ao.aroundObj = args[5];
  123. ao.aroundFunc = args[6];
  124. ao.once = args[7];
  125. ao.delay = args[8];
  126. ao.rate = args[9];
  127. ao.adviceMsg = args[10];
  128. ao.maxCalls = (!isNaN(parseInt(args[11]))) ? args[11] : -1;
  129. break;
  130. }
  131. if (dl.isFunction(ao.aroundFunc)) {
  132. var tmpName = dl.nameAnonFunc(ao.aroundFunc, ao.aroundObj, searchForNames);
  133. ao.aroundFunc = tmpName;
  134. }
  135. if (dl.isFunction(ao.srcFunc)) {
  136. ao.srcFunc = dl.getNameInObj(ao.srcObj, ao.srcFunc);
  137. }
  138. if (dl.isFunction(ao.adviceFunc)) {
  139. ao.adviceFunc = dl.getNameInObj(ao.adviceObj, ao.adviceFunc);
  140. }
  141. if ((ao.aroundObj) && (dl.isFunction(ao.aroundFunc))) {
  142. ao.aroundFunc = dl.getNameInObj(ao.aroundObj, ao.aroundFunc);
  143. }
  144. if (!ao.srcObj) {
  145. dojo.raise("bad srcObj for srcFunc: " + ao.srcFunc);
  146. }
  147. if (!ao.adviceObj) {
  148. dojo.raise("bad adviceObj for adviceFunc: " + ao.adviceFunc);
  149. }
  150. if (!ao.adviceFunc) {
  151. dojo.debug("bad adviceFunc for srcFunc: " + ao.srcFunc);
  152. dojo.debugShallow(ao);
  153. }
  154. return ao;
  155. }
  156. this.connect = function () {
  157. if (arguments.length == 1) {
  158. var ao = arguments[0];
  159. } else {
  160. var ao = interpolateArgs(arguments, true);
  161. }
  162. if (dojo.lang.isString(ao.srcFunc) && (ao.srcFunc.toLowerCase() == "onkey")) {
  163. if (dojo.render.html.ie) {
  164. ao.srcFunc = "onkeydown";
  165. this.connect(ao);
  166. }
  167. ao.srcFunc = "onkeypress";
  168. }
  169. if (dojo.lang.isArray(ao.srcObj) && ao.srcObj != "") {
  170. var tmpAO = {};
  171. for (var x in ao) {
  172. tmpAO[x] = ao[x];
  173. }
  174. var mjps = [];
  175. dojo.lang.forEach(ao.srcObj, function (src) {
  176. if ((dojo.render.html.capable) && (dojo.lang.isString(src))) {
  177. src = dojo.byId(src);
  178. }
  179. tmpAO.srcObj = src;
  180. mjps.push(dojo.event.connect.call(dojo.event, tmpAO));
  181. });
  182. return mjps;
  183. }
  184. var mjp = dojo.event.MethodJoinPoint.getForMethod(ao.srcObj, ao.srcFunc);
  185. if (ao.adviceFunc) {
  186. var mjp2 = dojo.event.MethodJoinPoint.getForMethod(ao.adviceObj, ao.adviceFunc);
  187. }
  188. mjp.kwAddAdvice(ao);
  189. return mjp;
  190. };
  191. this.log = function (a1, a2) {
  192. var kwArgs;
  193. if ((arguments.length == 1) && (typeof a1 == "object")) {
  194. kwArgs = a1;
  195. } else {
  196. kwArgs = {srcObj:a1, srcFunc:a2};
  197. }
  198. kwArgs.adviceFunc = function () {
  199. var argsStr = [];
  200. for (var x = 0; x < arguments.length; x++) {
  201. argsStr.push(arguments[x]);
  202. }
  203. dojo.debug("(" + kwArgs.srcObj + ")." + kwArgs.srcFunc, ":", argsStr.join(", "));
  204. };
  205. this.kwConnect(kwArgs);
  206. };
  207. this.connectBefore = function () {
  208. var args = ["before"];
  209. for (var i = 0; i < arguments.length; i++) {
  210. args.push(arguments[i]);
  211. }
  212. return this.connect.apply(this, args);
  213. };
  214. this.connectAround = function () {
  215. var args = ["around"];
  216. for (var i = 0; i < arguments.length; i++) {
  217. args.push(arguments[i]);
  218. }
  219. return this.connect.apply(this, args);
  220. };
  221. this.connectOnce = function () {
  222. var ao = interpolateArgs(arguments, true);
  223. ao.once = true;
  224. return this.connect(ao);
  225. };
  226. this.connectRunOnce = function () {
  227. var ao = interpolateArgs(arguments, true);
  228. ao.maxCalls = 1;
  229. return this.connect(ao);
  230. };
  231. this._kwConnectImpl = function (kwArgs, disconnect) {
  232. var fn = (disconnect) ? "disconnect" : "connect";
  233. if (typeof kwArgs["srcFunc"] == "function") {
  234. kwArgs.srcObj = kwArgs["srcObj"] || dj_global;
  235. var tmpName = dojo.lang.nameAnonFunc(kwArgs.srcFunc, kwArgs.srcObj, true);
  236. kwArgs.srcFunc = tmpName;
  237. }
  238. if (typeof kwArgs["adviceFunc"] == "function") {
  239. kwArgs.adviceObj = kwArgs["adviceObj"] || dj_global;
  240. var tmpName = dojo.lang.nameAnonFunc(kwArgs.adviceFunc, kwArgs.adviceObj, true);
  241. kwArgs.adviceFunc = tmpName;
  242. }
  243. kwArgs.srcObj = kwArgs["srcObj"] || dj_global;
  244. kwArgs.adviceObj = kwArgs["adviceObj"] || kwArgs["targetObj"] || dj_global;
  245. kwArgs.adviceFunc = kwArgs["adviceFunc"] || kwArgs["targetFunc"];
  246. return dojo.event[fn](kwArgs);
  247. };
  248. this.kwConnect = function (kwArgs) {
  249. return this._kwConnectImpl(kwArgs, false);
  250. };
  251. this.disconnect = function () {
  252. if (arguments.length == 1) {
  253. var ao = arguments[0];
  254. } else {
  255. var ao = interpolateArgs(arguments, true);
  256. }
  257. if (!ao.adviceFunc) {
  258. return;
  259. }
  260. if (dojo.lang.isString(ao.srcFunc) && (ao.srcFunc.toLowerCase() == "onkey")) {
  261. if (dojo.render.html.ie) {
  262. ao.srcFunc = "onkeydown";
  263. this.disconnect(ao);
  264. }
  265. ao.srcFunc = "onkeypress";
  266. }
  267. if (!ao.srcObj[ao.srcFunc]) {
  268. return null;
  269. }
  270. var mjp = dojo.event.MethodJoinPoint.getForMethod(ao.srcObj, ao.srcFunc, true);
  271. mjp.removeAdvice(ao.adviceObj, ao.adviceFunc, ao.adviceType, ao.once);
  272. return mjp;
  273. };
  274. this.kwDisconnect = function (kwArgs) {
  275. return this._kwConnectImpl(kwArgs, true);
  276. };
  277. };
  278. dojo.event.MethodInvocation = function (join_point, obj, args) {
  279. this.jp_ = join_point;
  280. this.object = obj;
  281. this.args = [];
  282. for (var x = 0; x < args.length; x++) {
  283. this.args[x] = args[x];
  284. }
  285. this.around_index = -1;
  286. };
  287. dojo.event.MethodInvocation.prototype.proceed = function () {
  288. this.around_index++;
  289. if (this.around_index >= this.jp_.around.length) {
  290. return this.jp_.object[this.jp_.methodname].apply(this.jp_.object, this.args);
  291. } else {
  292. var ti = this.jp_.around[this.around_index];
  293. var mobj = ti[0] || dj_global;
  294. var meth = ti[1];
  295. return mobj[meth].call(mobj, this);
  296. }
  297. };
  298. dojo.event.MethodJoinPoint = function (obj, funcName) {
  299. this.object = obj || dj_global;
  300. this.methodname = funcName;
  301. this.methodfunc = this.object[funcName];
  302. this.squelch = false;
  303. };
  304. dojo.event.MethodJoinPoint.getForMethod = function (obj, funcName) {
  305. if (!obj) {
  306. obj = dj_global;
  307. }
  308. var ofn = obj[funcName];
  309. if (!ofn) {
  310. ofn = obj[funcName] = function () {
  311. };
  312. if (!obj[funcName]) {
  313. dojo.raise("Cannot set do-nothing method on that object " + funcName);
  314. }
  315. } else {
  316. if ((typeof ofn != "function") && (!dojo.lang.isFunction(ofn)) && (!dojo.lang.isAlien(ofn))) {
  317. return null;
  318. }
  319. }
  320. var jpname = funcName + "$joinpoint";
  321. var jpfuncname = funcName + "$joinpoint$method";
  322. var joinpoint = obj[jpname];
  323. if (!joinpoint) {
  324. var isNode = false;
  325. if (dojo.event["browser"]) {
  326. if ((obj["attachEvent"]) || (obj["nodeType"]) || (obj["addEventListener"])) {
  327. isNode = true;
  328. dojo.event.browser.addClobberNodeAttrs(obj, [jpname, jpfuncname, funcName]);
  329. }
  330. }
  331. var origArity = ofn.length;
  332. obj[jpfuncname] = ofn;
  333. joinpoint = obj[jpname] = new dojo.event.MethodJoinPoint(obj, jpfuncname);
  334. if (!isNode) {
  335. obj[funcName] = function () {
  336. return joinpoint.run.apply(joinpoint, arguments);
  337. };
  338. } else {
  339. obj[funcName] = function () {
  340. var args = [];
  341. if (!arguments.length) {
  342. var evt = null;
  343. try {
  344. if (obj.ownerDocument) {
  345. evt = obj.ownerDocument.parentWindow.event;
  346. } else {
  347. if (obj.documentElement) {
  348. evt = obj.documentElement.ownerDocument.parentWindow.event;
  349. } else {
  350. if (obj.event) {
  351. evt = obj.event;
  352. } else {
  353. evt = window.event;
  354. }
  355. }
  356. }
  357. }
  358. catch (e) {
  359. evt = window.event;
  360. }
  361. if (evt) {
  362. args.push(dojo.event.browser.fixEvent(evt, this));
  363. }
  364. } else {
  365. for (var x = 0; x < arguments.length; x++) {
  366. if ((x == 0) && (dojo.event.browser.isEvent(arguments[x]))) {
  367. args.push(dojo.event.browser.fixEvent(arguments[x], this));
  368. } else {
  369. args.push(arguments[x]);
  370. }
  371. }
  372. }
  373. return joinpoint.run.apply(joinpoint, args);
  374. };
  375. }
  376. obj[funcName].__preJoinArity = origArity;
  377. }
  378. return joinpoint;
  379. };
  380. dojo.lang.extend(dojo.event.MethodJoinPoint, {squelch:false, unintercept:function () {
  381. this.object[this.methodname] = this.methodfunc;
  382. this.before = [];
  383. this.after = [];
  384. this.around = [];
  385. }, disconnect:dojo.lang.forward("unintercept"), run:function () {
  386. var obj = this.object || dj_global;
  387. var args = arguments;
  388. var aargs = [];
  389. for (var x = 0; x < args.length; x++) {
  390. aargs[x] = args[x];
  391. }
  392. var unrollAdvice = function (marr) {
  393. if (!marr) {
  394. dojo.debug("Null argument to unrollAdvice()");
  395. return;
  396. }
  397. var callObj = marr[0] || dj_global;
  398. var callFunc = marr[1];
  399. if (!callObj[callFunc]) {
  400. dojo.raise("function "" + callFunc + "" does not exist on "" + callObj + """);
  401. }
  402. var aroundObj = marr[2] || dj_global;
  403. var aroundFunc = marr[3];
  404. var msg = marr[6];
  405. var maxCount = marr[7];
  406. if (maxCount > -1) {
  407. if (maxCount == 0) {
  408. return;
  409. }
  410. marr[7]--;
  411. }
  412. var undef;
  413. var to = {args:[], jp_:this, object:obj, proceed:function () {
  414. return callObj[callFunc].apply(callObj, to.args);
  415. }};
  416. to.args = aargs;
  417. var delay = parseInt(marr[4]);
  418. var hasDelay = ((!isNaN(delay)) && (marr[4] !== null) && (typeof marr[4] != "undefined"));
  419. if (marr[5]) {
  420. var rate = parseInt(marr[5]);
  421. var cur = new Date();
  422. var timerSet = false;
  423. if ((marr["last"]) && ((cur - marr.last) <= rate)) {
  424. if (dojo.event._canTimeout) {
  425. if (marr["delayTimer"]) {
  426. clearTimeout(marr.delayTimer);
  427. }
  428. var tod = parseInt(rate * 2);
  429. var mcpy = dojo.lang.shallowCopy(marr);
  430. marr.delayTimer = setTimeout(function () {
  431. mcpy[5] = 0;
  432. unrollAdvice(mcpy);
  433. }, tod);
  434. }
  435. return;
  436. } else {
  437. marr.last = cur;
  438. }
  439. }
  440. if (aroundFunc) {
  441. aroundObj[aroundFunc].call(aroundObj, to);
  442. } else {
  443. if ((hasDelay) && ((dojo.render.html) || (dojo.render.svg))) {
  444. dj_global["setTimeout"](function () {
  445. if (msg) {
  446. callObj[callFunc].call(callObj, to);
  447. } else {
  448. callObj[callFunc].apply(callObj, args);
  449. }
  450. }, delay);
  451. } else {
  452. if (msg) {
  453. callObj[callFunc].call(callObj, to);
  454. } else {
  455. callObj[callFunc].apply(callObj, args);
  456. }
  457. }
  458. }
  459. };
  460. var unRollSquelch = function () {
  461. if (this.squelch) {
  462. try {
  463. return unrollAdvice.apply(this, arguments);
  464. }
  465. catch (e) {
  466. dojo.debug(e);
  467. }
  468. } else {
  469. return unrollAdvice.apply(this, arguments);
  470. }
  471. };
  472. if ((this["before"]) && (this.before.length > 0)) {
  473. dojo.lang.forEach(this.before.concat(new Array()), unRollSquelch);
  474. }
  475. var result;
  476. try {
  477. if ((this["around"]) && (this.around.length > 0)) {
  478. var mi = new dojo.event.MethodInvocation(this, obj, args);
  479. result = mi.proceed();
  480. } else {
  481. if (this.methodfunc) {
  482. result = this.object[this.methodname].apply(this.object, args);
  483. }
  484. }
  485. }
  486. catch (e) {
  487. if (!this.squelch) {
  488. dojo.debug(e, "when calling", this.methodname, "on", this.object, "with arguments", args);
  489. dojo.raise(e);
  490. }
  491. }
  492. if ((this["after"]) && (this.after.length > 0)) {
  493. dojo.lang.forEach(this.after.concat(new Array()), unRollSquelch);
  494. }
  495. return (this.methodfunc) ? result : null;
  496. }, getArr:function (kind) {
  497. var type = "after";
  498. if ((typeof kind == "string") && (kind.indexOf("before") != -1)) {
  499. type = "before";
  500. } else {
  501. if (kind == "around") {
  502. type = "around";
  503. }
  504. }
  505. if (!this[type]) {
  506. this[type] = [];
  507. }
  508. return this[type];
  509. }, kwAddAdvice:function (args) {
  510. this.addAdvice(args["adviceObj"], args["adviceFunc"], args["aroundObj"], args["aroundFunc"], args["adviceType"], args["precedence"], args["once"], args["delay"], args["rate"], args["adviceMsg"], args["maxCalls"]);
  511. }, addAdvice:function (thisAdviceObj, thisAdvice, thisAroundObj, thisAround, adviceType, precedence, once, delay, rate, asMessage, maxCalls) {
  512. var arr = this.getArr(adviceType);
  513. if (!arr) {
  514. dojo.raise("bad this: " + this);
  515. }
  516. var ao = [thisAdviceObj, thisAdvice, thisAroundObj, thisAround, delay, rate, asMessage, maxCalls];
  517. if (once) {
  518. if (this.hasAdvice(thisAdviceObj, thisAdvice, adviceType, arr) >= 0) {
  519. return;
  520. }
  521. }
  522. if (precedence == "first") {
  523. arr.unshift(ao);
  524. } else {
  525. arr.push(ao);
  526. }
  527. }, hasAdvice:function (thisAdviceObj, thisAdvice, adviceType, arr) {
  528. if (!arr) {
  529. arr = this.getArr(adviceType);
  530. }
  531. var ind = -1;
  532. for (var x = 0; x < arr.length; x++) {
  533. var aao = (typeof thisAdvice == "object") ? (new String(thisAdvice)).toString() : thisAdvice;
  534. var a1o = (typeof arr[x][1] == "object") ? (new String(arr[x][1])).toString() : arr[x][1];
  535. if ((arr[x][0] == thisAdviceObj) && (a1o == aao)) {
  536. ind = x;
  537. }
  538. }
  539. return ind;
  540. }, removeAdvice:function (thisAdviceObj, thisAdvice, adviceType, once) {
  541. var arr = this.getArr(adviceType);
  542. var ind = this.hasAdvice(thisAdviceObj, thisAdvice, adviceType, arr);
  543. if (ind == -1) {
  544. return false;
  545. }
  546. while (ind != -1) {
  547. arr.splice(ind, 1);
  548. if (once) {
  549. break;
  550. }
  551. ind = this.hasAdvice(thisAdviceObj, thisAdvice, adviceType, arr);
  552. }
  553. return true;
  554. }});