1/* 2 * Copyright 2005 JS Foundation https://js.foundation/ 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18 19 20 21(function() { 22 23 24 25if (typeof dwr == 'undefined') dwr = {}; 26if (!dwr.engine) dwr.engine = {}; 27 28 29 30 31 32dwr.engine.setErrorHandler = function(handler) { 33dwr.engine._errorHandler = handler; 34}; 35 36 37 38 39 40dwr.engine.setWarningHandler = function(handler) { 41dwr.engine._warningHandler = handler; 42}; 43 44 45 46 47 48 49 50 51 52dwr.engine.setTextHtmlHandler = function(handler) { 53dwr.engine._textHtmlHandler = handler; 54}; 55 56dwr.engine.setPollStatusHandler = function(handler) { 57dwr.engine._pollStatusHandler = handler; 58}; 59 60 61 62 63 64dwr.engine.setTimeout = function(timeout) { 65dwr.engine._timeout = timeout; 66}; 67 68 69 70 71dwr.engine.setPollTimeout = function(timeout) { 72dwr.engine._pollTimeout = timeout; 73}; 74 75 76 77 78 79dwr.engine.setPreHook = function(handler) { 80dwr.engine._preHook = handler; 81}; 82 83 84 85 86 87dwr.engine.setPostHook = function(handler) { 88dwr.engine._postHook = handler; 89}; 90 91 92 93 94 95dwr.engine.setOverridePath = function(path) { 96dwr.engine._overridePath = path; 97}; 98 99 100 101 102 103dwr.engine.setOverrideContextPath = function(path) { 104dwr.engine._overrideContextPath = path; 105}; 106 107 108 109 110 111dwr.engine.setCookieAttributes = function(attributeString) { 112dwr.engine._cookieAttributes = attributeString; 113}; 114 115 116 117 118 119dwr.engine.setHeaders = function(headers) { 120dwr.engine._headers = headers; 121}; 122 123 124 125 126 127dwr.engine.setAttributes = function(attributes) { 128dwr.engine._attributes = attributes; 129}; 130 131 132 133 134 135dwr.engine.setOrdered = function(ordered) { 136dwr.engine._ordered = ordered; 137}; 138 139 140 141 142 143 144 145dwr.engine.setAsync = function(async) { 146dwr.engine._async = async; 147}; 148 149 150 151 152 153dwr.engine.setActiveReverseAjax = function(activeReverseAjax) { 154if (activeReverseAjax) { 155 156if (dwr.engine._activeReverseAjax) return; 157 158if (!dwr.engine._retryIntervals || dwr.engine._retryIntervals.length === 0) { dwr.engine._retryIntervals = dwr.engine._defaultRetryIntervals; } 159dwr.engine._activeReverseAjax = true; 160if (dwr.engine._initializing) return; 161dwr.engine._poll(); 162} 163else { 164 165if (dwr.engine._activeReverseAjax && dwr.engine._pollBatch) { 166dwr.engine.transport.abort(dwr.engine._pollBatch); 167} 168dwr.engine._activeReverseAjax = false; 169} 170 171 172 173}; 174 175 176 177 178 179dwr.engine.setNotifyServerOnPageUnload = function(notify, asyncUnload) { 180dwr.engine._asyncUnload = (asyncUnload !== undefined) ? asyncUnload : false; 181dwr.engine._isNotifyServerOnPageUnload = notify; 182}; 183 184 185 186 187 188dwr.engine.setNotifyServerOnPageLoad = function(notify) { 189dwr.engine._isNotifyServerOnPageLoad = notify; 190if (notify && !dwr.engine._initializing && !dwr.engine._isNotifyServerOnPageLoadSent) { 191eval("dwr.engine._execute(dwr.engine._pathToDwrServlet, '__System', 'pageLoaded', [ function() { dwr.engine._ordered = false; }]);"); 192dwr.engine._isNotifyServerOnPageLoadSent = true; 193} 194}; 195 196 197 198 199 200dwr.engine.setMaxRetries = function(maxRetries) { 201dwr.engine._maxRetries = maxRetries; 202}; 203 204 205 206 207 208dwr.engine.setRetryIntervals = function(intervalsArray) { 209dwr.engine._retryIntervals = intervalsArray; 210}; 211 212 213 214 215 216 217dwr.engine.defaultErrorHandler = function(message, ex) { 218dwr.engine._debug("Error: " + ex.name + ", " + ex.message, true); 219if (!message) message = "A server error has occurred."; 220 221if (message.indexOf("0x80040111") != -1) return; 222if ("false" == "true") alert(message); 223}; 224 225 226 227 228 229 230dwr.engine.defaultWarningHandler = function(message, ex) { 231dwr.engine._debug(message); 232}; 233 234 235 236 237 238 239dwr.engine.defaultPollStatusHandler = function(newStatus, ex) { 240dwr.engine.util.logHandlerEx(function() { 241if (newStatus === false && dwr.engine._errorHandler) dwr.engine._errorHandler(ex.message, ex); 242}); 243}; 244 245 246 247 248dwr.engine.beginBatch = function() { 249if (dwr.engine._batch) { 250dwr.engine._handleError(null, { name:"dwr.engine.batchBegun", message:"Batch already begun" }); 251return; 252} 253dwr.engine._batch = dwr.engine.batch.create(); 254}; 255 256 257 258 259 260dwr.engine.endBatch = function(options) { 261var batch = dwr.engine._batch; 262if (batch == null) { 263dwr.engine._handleError(null, { name:"dwr.engine.batchNotBegun", message:"No batch in progress" }); 264return; 265} 266dwr.engine._batch = null; 267if (batch.map.callCount === 0) { 268return; 269} 270 271 272if (options) { 273dwr.engine.batch.merge(batch, options); 274} 275 276 277 278if (batch.async && (dwr.engine._ordered || dwr.engine._internalOrdered) && dwr.engine._batchesLength !== 0) { 279dwr.engine._batchQueue[dwr.engine._batchQueue.length] = batch; 280} 281else { 282return dwr.engine.transport.send(batch); 283} 284}; 285 286 287 288 289 290 291dwr.engine.openInDownload = function(data) { 292var div = document.createElement("div"); 293document.body.appendChild(div); 294div.innerHTML = "<iframe width='0' height='0' scrolling='no' frameborder='0' src='" + data + "'></iframe>"; 295}; 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311dwr.version = { 312 313 314 315major:parseInt("3", 10), 316 317 318 319 320minor:parseInt("0", 10), 321 322 323 324 325revision:parseInt("3", 10), 326 327 328 329 330build:parseInt("-1", 10), 331 332 333 334 335 336title:"bb-3", 337 338 339 340 341label:"3.0.3-bb-3" 342}; 343 344 345 346 347 348 349dwr.engine._initializing = true; 350 351 352dwr.engine._allowGetButMakeForgeryEasier = "false"; 353 354 355dwr.engine._scriptTagProtection = "throw 'allowScriptTagRemoting is false.';"; 356 357 358dwr.engine._pathToDwrServlet = "/webapps/blackboard/dwr"; 359 360 361dwr.engine._overridePath = ""; 362if (typeof pathToDwrServlet != "undefined") { 363dwr.engine._overridePath = pathToDwrServlet; 364} 365 366dwr.engine._effectivePath = function() { 367return dwr.engine._overridePath || dwr.engine._pathToDwrServlet; 368}; 369 370 371dwr.engine._contextPath = "/webapps/blackboard"; 372 373 374dwr.engine._overrideContextPath = ""; 375 376dwr.engine._effectiveContextPath = function() { 377return dwr.engine._overrideContextPath || dwr.engine._contextPath; 378}; 379 380 381dwr.engine._cookieAttributes = ""; 382 383 384dwr.engine._useStreamingPoll = "true"; 385 386dwr.engine._pollOnline = true; 387 388 389dwr.engine._ModePlainCall = "/call/plaincall/"; 390dwr.engine._ModePlainPoll = "/call/plainpoll/";
391dwr.engine._ModeHtmlCall = "/call/htmlcall/"; 392dwr.engine._ModeHtmlPoll = "/call/htmlpoll/"; 393 394 395dwr.engine._async = Boolean("true"); 396 397 398dwr.engine._pageId = null; 399 400 401dwr.engine._dwrSessionId = null; 402 403 404dwr.engine._scriptSessionId = ""; 405 406 407dwr.engine._preHook = null; 408 409 410dwr.engine._postHook = null; 411 412 413dwr.engine._batches = {}; 414 415 416dwr.engine._batchesLength = 0; 417 418 419dwr.engine._batchQueue = []; 420 421 422dwr.engine._ordered = false; 423 424 425dwr.engine._internalOrdered = false; 426 427 428dwr.engine._batch = null; 429 430 431dwr.engine._timeout = 0; 432 433 434dwr.engine._activeReverseAjax = false; 435 436 437dwr.engine._nextReverseAjaxIndex = 0; 438 439 440dwr.engine._reverseAjaxQueue = {}; 441 442 443dwr.engine._pollBatch = null; 444 445 446dwr.engine._pollTimeout = 0; 447 448 449dwr.engine._pollCometInterval = 200; 450 451 452dwr.engine._retries = 1; 453dwr.engine._maxRetries = -1; 454 455 456dwr.engine._retryIntervals = []; 457 458 459 460 461 462dwr.engine._defaultRetryIntervals = [ 1, 3, 3 ]; 463 464dwr.engine._textHtmlHandler = null; 465 466 467dwr.engine._headers = null; 468 469 470if (typeof attributes != "undefined") { 471dwr.engine._attributes = attributes; 472} 473else { 474dwr.engine._attributes = null; 475} 476 477 478dwr.engine._nextBatchId = 0; 479 480 481dwr.engine._instanceId = -1; 482 483 484dwr.engine._propnames = [ "async", "timeout", "errorHandler", "warningHandler", "textHtmlHandler" ]; 485 486 487dwr.engine._partialResponseNo = 0; 488dwr.engine._partialResponseYes = 1; 489 490 491dwr.engine._isNotifyServerOnPageUnload = false; 492 493 494dwr.engine._isNotifyServerOnPageLoad = false; 495dwr.engine._isNotifyServerOnPageLoadSent = false; 496 497 498dwr.engine._asyncUnload = false; 499 500 501 502 503 504dwr.engine._mappedClasses = {}; 505 506 507dwr.engine._errorHandler = dwr.engine.defaultErrorHandler; 508 509 510dwr.engine._warningHandler = dwr.engine.defaultWarningHandler; 511 512dwr.engine._pollStatusHandler = dwr.engine.defaultPollStatusHandler; 513 514 515dwr.engine._postSeperator = "\n"; 516dwr.engine._defaultInterceptor = function(data) { return data; }; 517dwr.engine._urlRewriteHandler = dwr.engine._defaultInterceptor; 518dwr.engine._contentRewriteHandler = dwr.engine._defaultInterceptor; 519dwr.engine._replyRewriteHandler = dwr.engine._defaultInterceptor; 520 521 522dwr.engine._excludeObjectAttributes = { 523"$dwrClassName": true, 524"$dwrByRef": true, 525"$_dwrConversionRef": true 526}; 527 528dwr.engine._ieConditions = {}; 529 530 531dwr.engine._beforeUnloading = false; 532 533 534dwr.engine._queuedBatchException = null; 535 536 537 538dwr.engine._beforeUnloader = function() { 539dwr.engine._beforeUnloading = true; 540 541 542 543setTimeout(function() { 544 545 546 547setTimeout(function() { 548dwr.engine._beforeUnloading = false; 549}, 1000); 550}, 1); 551}; 552 553 554dwr.engine._unloading = false; 555 556 557dwr.engine._unloader = function() { 558dwr.engine._unloading = true; 559 560 561dwr.engine._batchQueue.length = 0; 562 563 564var batch; 565for (var batchId in dwr.engine._batches) { 566batch = dwr.engine._batches[batchId]; 567if (batch.transport && batch.transport.abort) { 568batch.transport.abort(batch); 569} 570} 571 572 573if (dwr.engine._isNotifyServerOnPageUnload) { 574dwr.engine._debug("calling unloader for: " + dwr.engine._scriptSessionId); 575batch = { 576map:{ 577callCount:1, 578'c0-scriptName':'__System', 579'c0-methodName':'pageUnloaded', 580'c0-id':0 581}, 582paramCount:0, isPoll:false, async:dwr.engine._asyncUnload, 583headers:{}, preHooks:[], postHooks:[], 584timeout:dwr.engine._timeout, 585errorHandler:null, globalErrorHandler:dwr.engine._errorHandler, warningHandler:null, textHtmlHandler:null, globalTextHtmlHandler:null, 586handlers:[{ exceptionHandler:null, callback:null }] 587}; 588dwr.engine.transport.send(batch); 589dwr.engine._isNotifyServerOnPageUnload = false; 590} 591}; 592 593function ignoreIfUnloading(batch, f) { 594 595if (dwr.engine._unloading) return; 596 597if (dwr.engine._beforeUnloading && (batch == null || batch.async)) { 598setTimeout(function() { 599ignoreIfUnloading(batch, f); 600}, 100); 601} 602 603else { 604return f(); 605} 606} 607 608dwr.engine._initializer = { 609 610 611 612preInit: function() { 613 614dwr.engine._pageId = dwr.engine.util.tokenify(new Date().getTime()) + "-" + dwr.engine.util.tokenify(Math.random() * 1E16); 615 616 617dwr.engine.transport.updateDwrSessionFromCookie(); 618 619 620dwr.engine.util.addEventListener(window, 'beforeunload', dwr.engine._beforeUnloader); 621dwr.engine.util.addEventListener(window, 'unload', dwr.engine._unloader); 622 623 624var g = dwr.engine._global; 625if (!g.dwr) g.dwr = {}; 626if (!g.dwr._) g.dwr._ = []; 627dwr.engine._instanceId = g.dwr._.length; 628g.dwr._[dwr.engine._instanceId] = dwr; 629}, 630 631loadDwrConfig: function() { 632if (typeof dwrConfig != "undefined") { 633for(p in dwrConfig) { 634var methodName = "set" + p.charAt(0).toUpperCase() + p.substring(1); 635var setter = dwr.engine[methodName]; 636if (setter) setter(dwrConfig[p]); 637} 638} 639}, 640 641init: function() { 642dwr.engine._initializer.preInit(); 643dwr.engine._initializer.loadDwrConfig(); 644dwr.engine._initializing = false;
645 646if (dwr.engine._isNotifyServerOnPageLoad) { 647eval("dwr.engine._execute(dwr.engine._pathToDwrServlet, '__System', 'pageLoaded', [ function() { dwr.engine._ordered = false; }]);"); 648dwr.engine._isNotifyServerOnPageLoadSent = true; 649} 650if (dwr.engine._activeReverseAjax) { 651dwr.engine._poll(); 652} 653} 654}; 655 656 657 658 659 660 661 662 663 664 665 666dwr.engine._execute = function(overridePath, scriptName, methodName, args) { 667var path = overridePath || dwr.engine._effectivePath(); 668dwr.engine._singleShot = false; 669if (dwr.engine._batch == null) { 670dwr.engine.beginBatch(); 671dwr.engine._singleShot = true; 672} 673 674var batch = dwr.engine._batch; 675 676 677if (batch.path == null) { 678batch.path = path; 679} 680else { 681if (batch.path != path) { 682dwr.engine._handleError(batch, { name:"dwr.engine.multipleServlets", message:"Can't batch requests to multiple DWR Servlets." }); 683return; 684} 685} 686 687dwr.engine.batch.addCall(batch, scriptName, methodName, args); 688 689if (dwr.engine._isHeartbeatBatch(batch)) { 690 691batch.timeout = 750; 692} 693 694 695batch.map.callCount++; 696if (dwr.engine._singleShot) { 697return dwr.engine.endBatch(); 698} 699}; 700 701 702 703 704 705dwr.engine._poll = function() { 706if (!dwr.engine._activeReverseAjax) { 707return; 708} 709dwr.engine._pollBatch = dwr.engine.batch.createPoll(); 710dwr.engine.transport.send(dwr.engine._pollBatch); 711}; 712 713 714dwr.engine._executeScript = function(script) { 715if (script == null) { 716return null; 717} 718if (script === "") { 719dwr.engine._debug("Warning: blank script", true); 720return null; 721} 722 723(new Function("dwr", script))(dwr); 724}; 725 726 727dwr.engine._callPostHooks = function(batch) { 728if (batch.postHooks) { 729for (var i = 0; i < batch.postHooks.length; i++) { 730batch.postHooks[i](); 731} 732batch.postHooks = null; 733} 734}; 735 736 737 738 739 740 741 742dwr.engine._isHeartbeatBatch = function(batch) { 743return (batch.map && batch.map['c0-methodName'] === 'checkHeartbeat' && batch.map['c0-scriptName'] === '__System'); 744}; 745 746 747 748 749 750 751 752dwr.engine._handleError = function(batch, ex) { 753if (batch && dwr.engine._isHeartbeatBatch(batch)) { 754return; 755} 756var errorHandlers = []; 757var anyCallWithoutErrorHandler = false; 758if (batch && batch.isPoll) { 759dwr.engine._handlePollRetry(batch, ex); 760} else { 761 762if (batch) { 763for (var i = 0; i < batch.map.callCount; i++) { 764var handlers = batch.handlers[i]; 765if (!handlers.completed) { 766if (typeof handlers.errorHandler == "function") 767errorHandlers.push(handlers.errorHandler); 768else 769anyCallWithoutErrorHandler = true; 770handlers.completed = true; 771} 772} 773} 774 775ignoreIfUnloading(batch, function() { 776if (batch) { 777var textHtmlHandler = batch.textHtmlHandler || batch.globalTextHtmlHandler; 778if (ex.name === "dwr.engine.textHtmlReply" && textHtmlHandler) { 779dwr.engine.util.logHandlerEx(function() { 780textHtmlHandler(ex); 781}); 782return; 783} 784} 785dwr.engine._prepareException(ex); 786var errorHandler; 787while(errorHandlers.length > 0) { 788errorHandler = errorHandlers.shift(); 789dwr.engine.util.logHandlerEx(function() { 790errorHandler(ex.message, ex); 791}); 792} 793if (batch) { 794dwr.engine.util.logHandlerEx(function() { 795if (typeof batch.errorHandler == "function") batch.errorHandler(ex.message, ex); 796else if (anyCallWithoutErrorHandler) { 797if (typeof batch.globalErrorHandler == "function") batch.globalErrorHandler(ex.message, ex); 798} 799}); 800dwr.engine.batch.remove(batch); 801} 802}); 803} 804}; 805 806 807 808 809 810 811 812dwr.engine._handlePollRetry = function(batch, ex) { 813var retryInterval = dwr.engine._getRetryInterval(); 814 815if (dwr.engine._retries === dwr.engine._retryIntervals.length - 1) { 816dwr.engine._debug("poll retry - going offline: " + retryInterval/1000 + " seconds"); 817dwr.engine._handlePollStatusChange(false, ex, batch); 818 819var heartbeatInterval = setInterval(function() { 820if (dwr.engine._maxRetries === -1 || dwr.engine._retries < dwr.engine._maxRetries) { 821dwr.engine._execute(null, '__System', 'checkHeartbeat', [ function() { 822 823clearInterval(heartbeatInterval); 824dwr.engine._poll(); 825}]); 826dwr.engine._retries++; 827dwr.engine._debug("DWR Offline - poll retry - interval: " + retryInterval/1000 + " seconds"); 828} else { 829 830clearInterval(heartbeatInterval); 831dwr.engine._debug("max retries reached, stop polling for server status."); 832dwr.engine._handlePollStatusChange(false, ex, batch); 833} 834}, retryInterval); 835} else { 836dwr.engine._retries++; 837dwr.engine.batch.remove(batch); 838dwr.engine._debug("DWR Online - poll retry - interval: " + retryInterval/1000 + " seconds"); 839setTimeout(dwr.engine._poll, retryInterval); 840} 841}; 842 843dwr.engine._getRetryInterval = function() { 844var retryInterval; 845if (dwr.engine._retries < dwr.engine._retryIntervals.length) { 846retryInterval = dwr.engine._retryIntervals[dwr.engine._retries] * 1000; 847} else { 848 849retryInterval = dwr.engine._retryIntervals[dwr.engine._retryIntervals.length - 1] * 1000; 850} 851return retryInterval; 852}; 853 854 855 856 857 858 859dwr.engine._handlePollStatusChange = function(newStatus, ex, batch) { 860if (batch.isPoll || dwr.engine._isHeartbeatBatch(batch)) { 861var changed = dwr.engine._pollOnline !== newStatus; 862var maxRetriesReached = dwr.engine._maxRetries === dwr.engine._retries; 863dwr.engine._pollOnline = newStatus; 864if ((changed || maxRetriesReached) && typeof dwr.engine._pollStatusHandler === "function") 865dwr.engine.util.logHandlerEx(function() { 866dwr.engine._pollStatusHandler(newStatus, ex, maxRetriesReached); 867}); 868if (newStatus) { 869dwr.engine._retries = 1; 870} 871} 872}; 873 874 875 876 877 878 879 880dwr.engine._handleWarning = function(batch, ex) { 881if (batch && dwr.engine._isHeartbeatBatch(batch)) { 882return; 883} 884ignoreIfUnloading(batch, function() { 885 886dwr.engine._prepareException(ex); 887dwr.engine.util.logHandlerEx(function() { 888if (batch && typeof batch.warningHandler == "function") batch.warningHandler(ex.message, ex); 889else if (dwr.engine._warningHandler) dwr.engine._warningHandler(ex.message, ex); 890}); 891if (batch) dwr.engine.batch.remove(batch); 892}); 893}; 894 895 896 897 898 899 900dwr.engine._prepareException = function(ex) { 901if (typeof ex == "string") ex = { name:"unknown", message:ex }; 902if (ex.message == null) ex.message = ""; 903if (ex.name == null) ex.name = "unknown"; 904}; 905 906 907 908 909 910dwr.engine._delegate = (function() { 911function F(){} 912return (function(obj){ 913F.prototype = obj; 914return new F(); 915}); 916})(); 917 918 919 920 921 922dwr.engine._createFromMap = function(map) { 923var obj = new this(); 924for(prop in map) if (map.hasOwnProperty(prop)) obj[prop] = map[prop]; 925return obj; 926}; 927 928 929 930 931dwr.engine._global = (function(){return this;}).call(null); 932 933 934 935 936 937 938 939dwr.engine._getObject = function(prop) { 940var parts = prop.split("."); 941var value = undefined; 942var scope = dwr.engine._global; 943while(parts.length > 0) { 944var currprop = parts.shift(); 945if (!scope) return undefined; 946value = scope[currprop]; 947if (value && value.tagName && document.getElementById(currprop) == value) return undefined; 948scope = value; 949} 950return value; 951}; 952 953 954 955 956 957 958dwr.engine._setObject = function(prop, obj) { 959var parts = prop.split("."); 960var level; 961var scope = dwr.engine._global; 962while(parts.length > 0) { 963var currprop = parts.shift(); 964if (parts.length === 0) { 965scope[currprop] = obj; 966} 967else { 968level = scope[currprop]; 969if (level == null || level.tagName && document.getElementById(currprop) == level) { 970scope[currprop] = level = {}; 971} 972scope = level; 973} 974} 975}; 976 977 978 979 980 981 982 983dwr.engine._debug = function(message, stacktrace) { 984var written = false;
985try { 986if (window.console) { 987if (stacktrace && window.console.trace) window.console.trace(); 988if (window.console.log) window.console.log(message); 989written = true; 990} 991else if (window.opera && window.opera.postError) { 992window.opera.postError(message); 993written = true; 994} 995} 996catch (ex) { } 997 998if (!written) { 999var debug = document.getElementById("dwr-debug"); 1000if (debug) { 1001var contents = message + "<br/>" + debug.innerHTML; 1002if (contents.length > 2048) contents = contents.substring(0, 2048); 1003debug.innerHTML = contents; 1004} 1005} 1006}; 1007 1008 1009 1010 1011dwr.engine.remote = { 1012 1013 1014 1015 1016 1017 1018 1019handleCallback:function(batchId, callId, reply) { 1020var batch = dwr.engine._batches[batchId]; 1021if (!batch) return; 1022 1023 1024batch.reply = reply; 1025 1026 1027 1028try { 1029var handlers = batch.handlers[callId]; 1030if (!handlers) { 1031dwr.engine._debug("Warning: Missing handlers. callId=" + callId, true); 1032} 1033else { 1034batch.handlers[callId].completed = true; 1035if (typeof handlers.callback == "function") { 1036dwr.engine.util.logHandlerEx(function() { 1037if(handlers.callbackArg !== undefined) 1038handlers.callback.call(handlers.callbackScope, reply, handlers.callbackArg); 1039else 1040handlers.callback.call(handlers.callbackScope, reply); 1041}); 1042} 1043} 1044} 1045catch (ex) { 1046dwr.engine._handleError(batch, ex); 1047} 1048}, 1049 1050 1051 1052 1053 1054 1055handleFunctionCall:function(id, args) { 1056var func = dwr.engine.serialize.remoteFunctions[id]; 1057func.apply(window, args); 1058}, 1059 1060 1061 1062 1063 1064 1065handleObjectCall:function(id, methodName, args) { 1066var obj = dwr.engine.serialize.remoteFunctions[id]; 1067obj[methodName].apply(obj, args); 1068}, 1069 1070 1071 1072 1073 1074 1075handleSetCall:function(id, propertyName, data) { 1076var obj = dwr.engine.serialize.remoteFunctions[id]; 1077obj[propertyName] = data; 1078}, 1079 1080 1081 1082 1083 1084handleFunctionClose:function(id) { 1085delete dwr.engine.serialize.remoteFunctions[id]; 1086}, 1087 1088 1089 1090 1091 1092 1093 1094 1095handleException:function(batchId, callId, ex) { 1096var batch = dwr.engine._batches[batchId]; 1097if (!batch) return; 1098 1099var handlers = batch.handlers[callId]; 1100batch.handlers[callId].completed = true; 1101if (handlers == null) { 1102dwr.engine._debug("Warning: null handlers in remoteHandleException", true); 1103return; 1104} 1105 1106if (ex.message === undefined) { 1107ex.message = ""; 1108} 1109 1110dwr.engine.util.logHandlerEx(function() { 1111if (typeof handlers.exceptionHandler == "function") { 1112if (handlers.exceptionArg !== undefined) 1113handlers.exceptionHandler.call(handlers.exceptionScope, ex.message, ex, handlers.exceptionArg); 1114else 1115handlers.exceptionHandler.call(handlers.exceptionScope, ex.message, ex); 1116} 1117else if (typeof handlers.errorHandler == "function") { 1118handlers.errorHandler(ex.message, ex); 1119} 1120else if (typeof batch.errorHandler == "function") { 1121batch.errorHandler(ex.message, ex); 1122} 1123else if (typeof batch.globalErrorHandler == "function") { 1124batch.globalErrorHandler(ex.message, ex); 1125} 1126}); 1127}, 1128 1129 1130 1131 1132handleReverseAjax:function(reverseAjaxIndex, reverseAjaxFunc) { 1133if (reverseAjaxIndex < dwr.engine._nextReverseAjaxIndex) return; 1134dwr.engine._reverseAjaxQueue[reverseAjaxIndex] = reverseAjaxFunc; 1135while(true) { 1136var nextFunc = dwr.engine._reverseAjaxQueue[dwr.engine._nextReverseAjaxIndex]; 1137if (!nextFunc) return; 1138dwr.engine.util.logHandlerEx(function() { 1139nextFunc(); 1140}); 1141delete dwr.engine._reverseAjaxQueue[dwr.engine._nextReverseAjaxIndex]; 1142dwr.engine._nextReverseAjaxIndex++; 1143} 1144}, 1145 1146 1147 1148 1149 1150 1151 1152handleBatchException:function(ex, batchId) { 1153var batch = dwr.engine._batches[batchId]; 1154if (ex.message === undefined) ex.message = ""; 1155if (batch) { 1156dwr.engine._handleError(batch, ex); 1157} else { 1158dwr.engine._queuedBatchException = ex; 1159} 1160}, 1161 1162 1163 1164 1165 1166 1167 1168pollCometDisabled:function(ex, batchId){ 1169dwr.engine.setActiveReverseAjax(false); 1170var batch = dwr.engine._batches[batchId]; 1171if (ex.message === undefined) { 1172ex.message = ""; 1173} 1174dwr.engine._handleError(batch, ex); 1175}, 1176 1177 1178 1179 1180 1181 1182 1183newObject:function(dwrClassName, memberMap){ 1184var classfunc = dwr.engine._mappedClasses[dwrClassName]; 1185if (classfunc && classfunc.createFromMap) { 1186return classfunc.createFromMap(memberMap); 1187} 1188else { 1189memberMap.$dwrClassName = dwrClassName; 1190return memberMap; 1191} 1192} 1193}; 1194 1195 1196 1197 1198dwr.engine.serialize = { 1199 1200 1201 1202domDocument:[ 1203"Msxml2.DOMDocument.6.0", 1204"Msxml2.DOMDocument.5.0", 1205"Msxml2.DOMDocument.4.0", 1206"Msxml2.DOMDocument.3.0", 1207"MSXML2.DOMDocument", 1208"MSXML.DOMDocument", 1209"Microsoft.XMLDOM" 1210], 1211 1212 1213 1214 1215remoteFunctions:{}, 1216 1217 1218 1219 1220funcId:0, 1221 1222 1223 1224 1225 1226toDomElement:function(xml) { 1227return dwr.engine.serialize.toDomDocument(xml).documentElement; 1228}, 1229 1230 1231 1232 1233 1234toDomDocument:function(xml) { 1235var dom; 1236if (window.DOMParser) { 1237var parser = new DOMParser(); 1238dom = parser.parseFromString(xml, "text/xml"); 1239if (!dom.documentElement || dom.documentElement.tagName == "parsererror") { 1240var message = dom.documentElement.firstChild.data; 1241message += "\n" + dom.documentElement.firstChild.nextSibling.firstChild.data; 1242throw message; 1243} 1244return dom; 1245} 1246else if (window.ActiveXObject) {
1247dom = dwr.engine.util.newActiveXObject(dwr.engine.serialize.domDocument); 1248dom.loadXML(xml); 1249return dom; 1250} 1251else { 1252var div = document.createElement("div"); 1253div.innerHTML = xml; 1254return div; 1255} 1256}, 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267convert:function(batch, directrefmap, otherrefmap, data, name, depth) { 1268if (data == null) { 1269batch.map[name] = "null:null"; 1270return; 1271} 1272 1273switch (typeof data) { 1274case "boolean": 1275batch.map[name] = "boolean:" + data; 1276break; 1277case "number": 1278batch.map[name] = "number:" + data; 1279break; 1280case "string": 1281batch.map[name] = "string:" + encodeURIComponent(data); 1282break; 1283case "object": 1284var ref = dwr.engine.serialize.lookup(directrefmap, otherrefmap, data, name); 1285var objstr = Object.prototype.toString.call(data); 1286if (data.$dwrByRef) batch.map[name] = dwr.engine.serialize.convertByReference(batch, directrefmap, otherrefmap, data, name, depth + 1); 1287else if (ref != null) batch.map[name] = ref; 1288else if (objstr == "[object String]") batch.map[name] = "string:" + encodeURIComponent(data); 1289else if (objstr == "[object Boolean]") batch.map[name] = "boolean:" + data; 1290else if (objstr == "[object Number]") batch.map[name] = "number:" + data; 1291else if (objstr == "[object Date]") batch.map[name] = "date:" + data.getTime(); 1292else if (objstr == "[object Array]") batch.map[name] = dwr.engine.serialize.convertArray(batch, directrefmap, otherrefmap, data, name, depth + 1); 1293else if (data && data.tagName && data.tagName.toLowerCase() == "input" && data.type && data.type.toLowerCase() == "file") { 1294batch.fileUpload = true; 1295batch.map[name] = data; 1296} 1297else { 1298 1299 1300if (data.nodeName && data.nodeType) { 1301batch.map[name] = dwr.engine.serialize.convertDom(data); 1302} 1303else { 1304batch.map[name] = dwr.engine.serialize.convertObject(batch, directrefmap, otherrefmap, data, name, depth + 1); 1305} 1306} 1307break; 1308case "function": 1309 1310if (depth === 0) { 1311batch.map[name] = dwr.engine.serialize.convertByReference(batch, directrefmap, otherrefmap, data, name, depth + 1); 1312} 1313break; 1314default: 1315dwr.engine._handleWarning(null, { name:"dwr.engine.unexpectedType", message:"Unexpected type: " + typeof data + ", attempting default converter." }); 1316batch.map[name] = "default:" + data; 1317break; 1318} 1319}, 1320 1321 1322 1323 1324 1325 1326convertByReference:function(batch, directrefmap, otherrefmap, data, name, depth) { 1327var funcId = "f" + dwr.engine.serialize.funcId; 1328dwr.engine.serialize.remoteFunctions[funcId] = data; 1329dwr.engine.serialize.funcId++; 1330return "byref:" + funcId; 1331}, 1332 1333 1334 1335 1336 1337 1338convertArray:function(batch, directrefmap, otherrefmap, data, name, depth) { 1339var childName, i; 1340if (dwr.engine.util.ieCondition("if lte IE 7")) { 1341 1342var buf = ["array:["]; 1343for (i = 0; i < data.length; i++) { 1344if (i !== 0) buf.push(","); 1345batch.paramCount++; 1346childName = "c" + dwr.engine._batch.map.callCount + "-e" + batch.paramCount; 1347dwr.engine.serialize.convert(batch, directrefmap, otherrefmap, data[i], childName, depth + 1); 1348buf.push("reference:"); 1349buf.push(childName); 1350} 1351buf.push("]"); 1352reply = buf.join(""); 1353} 1354else { 1355 1356var reply = "array:["; 1357for (i = 0; i < data.length; i++) { 1358if (i !== 0) reply += ","; 1359batch.paramCount++; 1360childName = "c" + dwr.engine._batch.map.callCount + "-e" + batch.paramCount; 1361dwr.engine.serialize.convert(batch, directrefmap, otherrefmap, data[i], childName, depth + 1); 1362reply += "reference:"; 1363reply += childName; 1364} 1365reply += "]"; 1366} 1367 1368return reply; 1369}, 1370 1371 1372 1373 1374 1375 1376convertObject:function(batch, directrefmap, otherrefmap, data, name, depth) { 1377 1378var reply = "Object_" + dwr.engine.serialize.getObjectClassName(data).replace(/:/g, "?") + ":{"; 1379var elementset = (data.constructor && data.constructor.$dwrClassMembers ? data.constructor.$dwrClassMembers : data); 1380var element; 1381for (element in elementset) { 1382if (typeof data[element] != "function" && !dwr.engine._excludeObjectAttributes[element]) { 1383batch.paramCount++; 1384var childName = "c" + dwr.engine._batch.map.callCount + "-e" + batch.paramCount; 1385dwr.engine.serialize.convert(batch, directrefmap, otherrefmap, data[element], childName, depth + 1); 1386reply += encodeURIComponent(element) + ":reference:" + childName + ", "; 1387} 1388} 1389 1390if (reply.substring(reply.length - 2) == ", ") { 1391reply = reply.substring(0, reply.length - 2); 1392} 1393reply += "}"; 1394 1395return reply; 1396}, 1397 1398 1399 1400 1401 1402 1403convertDom:function(data) { 1404return "xml:" + encodeURIComponent(dwr.engine.serialize.serializeDom(data)); 1405}, 1406serializeDom:function(data) { 1407var output; 1408if (window.XMLSerializer) output = new XMLSerializer().serializeToString(data); 1409else if (data.xml) output = data.xml; 1410else throw new Error("The browser doesn't support XML serialization of: " + data); 1411return output; 1412}, 1413 1414 1415 1416 1417 1418 1419lookup:function(directrefmap, otherrefmap, data, name) { 1420 1421var ref; 1422if ("$_dwrConversionRef" in data) { 1423ref = data.$_dwrConversionRef; 1424if (ref && directrefmap[ref] != data) ref = null; 1425} 1426if (ref == null) { 1427for(r in otherrefmap) { 1428if (otherrefmap[r] == data) { 1429ref = r; 1430break; 1431} 1432} 1433} 1434if (ref != null) return "reference:" + ref; 1435 1436try { 1437data.$_dwrConversionRef = name; 1438directrefmap[name] = data; 1439} 1440catch(err) { 1441otherrefmap[name] = data; 1442} 1443return null; 1444}, 1445 1446 1447 1448 1449 1450cleanup:function(directrefmap) { 1451for(var refName in directrefmap) { 1452var data = directrefmap[refName]; 1453try { 1454delete data.$_dwrConversionRef; 1455} 1456catch(err) { 1457data.$_dwrConversionRef = undefined; 1458} 1459} 1460}, 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470getObjectClassName:function(obj) { 1471 1472if (obj.$dwrClassName) 1473return obj.$dwrClassName; 1474else if (obj.constructor && obj.constructor.$dwrClassName) 1475return obj.constructor.$dwrClassName; 1476else 1477return "Object"; 1478} 1479}; 1480 1481 1482 1483 1484dwr.engine.transport = { 1485 1486 1487 1488 1489 1490send:function(batch) { 1491if (batch.path == null) { 1492batch.path = dwr.engine._effectivePath(); 1493} 1494dwr.engine.transport.updateDwrSessionFromCookie(); 1495if (!dwr.engine._dwrSessionId) { 1496dwr.engine._internalOrdered = true; 1497var retval; 1498var idbatch = { 1499map:{ 1500callCount:1, 1501'c0-scriptName':'__System', 1502'c0-methodName':'generateId', 1503'c0-id':0 1504}, 1505paramCount:0, isPoll:false, async:batch.async, 1506headers:{}, preHooks:[], 1507postHooks:[function() { 1508dwr.engine._internalOrdered = false;
1509}], 1510timeout:dwr.engine._timeout, 1511errorHandler:batch.errorHandler, globalErrorHandler:batch.globalErrorHandler, warningHandler:batch.warningHandler, textHtmlHandler:batch.textHtmlHandler, globalTextHtmlHandler:batch.globalTextHtmlHandler, 1512path:batch.path, 1513handlers:[{ 1514exceptionHandler:null, 1515callback:function(id) { 1516dwr.engine.transport.updateDwrSessionFromCookie(); 1517if (!dwr.engine._dwrSessionId) { 1518dwr.engine.transport.setDwrSession(id); 1519} 1520retval = dwr.engine.transport.send2(batch); 1521} 1522}] 1523}; 1524dwr.engine.transport.send2(idbatch); 1525return retval; 1526} 1527else { 1528return dwr.engine.transport.send2(batch); 1529} 1530}, 1531 1532 1533 1534 1535 1536 1537send2:function(batch) { 1538dwr.engine.batch.prepareToSend(batch); 1539 1540 1541var isCrossDomain = false; 1542if (batch.path.indexOf("http://") === 0 || batch.path.indexOf("https://") === 0) { 1543var dwrShortPath = batch.path.split("/", 3).join("/"); 1544var hrefShortPath = window.location.href.split("/", 3).join("/"); 1545isCrossDomain = (dwrShortPath != hrefShortPath); 1546} 1547 1548if (batch.fileUpload) { 1549if (isCrossDomain) { 1550throw new Error("Cross domain file uploads are not possible with this release of DWR"); 1551} 1552batch.transport = dwr.engine.transport.iframe; 1553} 1554else if (isCrossDomain) { 1555batch.transport = dwr.engine.transport.scriptTag; 1556} 1557else if (batch.isPoll && dwr.engine._useStreamingPoll == "true" && dwr.engine.util.ieCondition("if (IE 8)|(IE 9)")) { 1558batch.transport = dwr.engine.transport.iframe; 1559} 1560else { 1561batch.transport = dwr.engine.transport.xhr; 1562} 1563 1564return batch.transport.send(batch); 1565}, 1566 1567 1568 1569 1570complete:function(batch) { 1571dwr.engine.batch.validate(batch); 1572dwr.engine.transport.remove(batch); 1573}, 1574 1575 1576 1577 1578 1579 1580abort:function(batch) { 1581var transport = batch.transport; 1582if (transport.abort) { 1583transport.abort(batch); 1584} 1585dwr.engine.transport.remove(batch); 1586}, 1587 1588 1589 1590 1591 1592remove:function(batch) { 1593if (batch.transport) { 1594dwr.engine._callPostHooks(batch); 1595batch.transport.remove(batch); 1596batch.transport = null; 1597} 1598dwr.engine.batch.remove(batch); 1599}, 1600 1601setDwrSession:function(dwrsess) { 1602dwr.engine._dwrSessionId = dwrsess; 1603var attrs = ""; 1604if (!dwr.engine._cookieAttributes.match(/^path=/i)) { 1605attrs = "; path=" + (dwr.engine._effectiveContextPath() || "/"); 1606} 1607if (dwr.engine._cookieAttributes) { 1608attrs += "; " + dwr.engine._cookieAttributes; 1609} 1610document.cookie = "DWRSESSIONID=" + dwrsess + attrs; 1611dwr.engine._scriptSessionId = dwrsess + "/" + dwr.engine._pageId; 1612}, 1613 1614updateDwrSessionFromCookie:function() { 1615if (!dwr.engine._dwrSessionId) { 1616var match = document.cookie.match(/(?:^|; )DWRSESSIONID=([^;]+)/); 1617if (match) { 1618dwr.engine.transport.setDwrSession(match[1]); 1619} 1620} 1621}, 1622 1623 1624 1625 1626xhr:{ 1627 1628 1629 1630httpMethod:"POST", 1631 1632 1633 1634 1635 1636 1637XMLHTTP:["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"], 1638 1639 1640 1641 1642 1643send:function(batch) { 1644if (batch.isPoll) { 1645batch.map.partialResponse = dwr.engine._partialResponseYes; 1646} 1647 1648 1649if (batch.isPoll && dwr.engine._useStreamingPoll == "false") { 1650batch.map.partialResponse = dwr.engine._partialResponseNo; 1651} 1652if (batch.isPoll && dwr.engine.util.ieCondition("if lte IE 9")) { 1653batch.map.partialResponse = dwr.engine._partialResponseNo; 1654} 1655 1656if (window.XMLHttpRequest) { 1657batch.req = new XMLHttpRequest(); 1658} 1659else if (window.ActiveXObject) { 1660batch.req = dwr.engine.util.newActiveXObject(dwr.engine.transport.xhr.XMLHTTP); 1661} 1662 1663 1664if (batch.async === true) { 1665batch.req.onreadystatechange = function() { 1666if (typeof dwr != 'undefined') { 1667dwr.engine.transport.xhr.stateChange(batch); 1668} 1669}; 1670} 1671 1672var httpMethod = dwr.engine.transport.xhr.httpMethod; 1673 1674batch.mode = batch.isPoll ? dwr.engine._ModePlainPoll : dwr.engine._ModePlainCall; 1675var request = dwr.engine.batch.constructRequest(batch, httpMethod); 1676 1677try { 1678batch.req.open(httpMethod, request.url, batch.async); 1679try { 1680for (var prop in batch.headers) { 1681var value = batch.headers[prop]; 1682if (typeof value == "string") { 1683batch.req.setRequestHeader(prop, value); 1684} 1685} 1686if (!batch.headers["Content-Type"]) { 1687batch.req.setRequestHeader("Content-Type", "text/plain"); 1688} 1689} 1690catch (ex) { 1691dwr.engine._handleWarning(batch, ex); 1692} 1693 1694batch.req.send(request.body); 1695if (batch.async === false) { 1696dwr.engine.transport.xhr.stateChange(batch); 1697} 1698} 1699catch (ex2) { 1700dwr.engine._handleError(batch, ex2); 1701} 1702 1703if (batch.isPoll && batch.map.partialResponse == dwr.engine._partialResponseYes) { 1704dwr.engine.transport.xhr.checkCometPoll(); 1705} 1706 1707 1708return batch.reply; 1709}, 1710 1711 1712 1713 1714 1715 1716stateChange:function(batch) { 1717var toEval; 1718 1719if (batch.aborted) return;
1720if (batch.completed) { 1721if (batch.transport) dwr.engine._debug("Error: _stateChange() with batch.completed"); 1722return; 1723} 1724 1725 1726var req = batch.req; 1727var status = 0; 1728try { 1729if (req.readyState >= 2) { 1730status = req.status; 1731} 1732} 1733catch(ignore) {} 1734 1735 1736 1737if (status === 0 && req.readyState < 4) { 1738return; 1739} 1740 1741 1742 1743 1744 1745if (status === 200) { 1746dwr.engine._handlePollStatusChange(true, null, batch); 1747} 1748 1749 1750if (req.readyState != 4) { 1751return; 1752} 1753 1754if (dwr.engine._unloading) { 1755dwr.engine._debug("Ignoring reply from server as page is unloading."); 1756return; 1757} 1758 1759try { 1760var reply = req.responseText; 1761reply = dwr.engine._replyRewriteHandler(reply); 1762var contentType = req.getResponseHeader("Content-Type"); 1763if (status >= 200 && status < 300) { 1764if (contentType.indexOf("text/plain") < 0 && contentType.indexOf("text/javascript") < 0) { 1765if (contentType.indexOf("text/html") == 0) { 1766dwr.engine._handleError(batch, { name:"dwr.engine.textHtmlReply", message:"HTML reply from the server.", responseText:reply||"" }); 1767} else { 1768dwr.engine._handleError(batch, { name:"dwr.engine.invalidMimeType", message:"Invalid content type: '" + contentType + "'" }); 1769} 1770} else if (reply == null || reply === "") { 1771dwr.engine._handleError(batch, { name:"dwr.engine.missingData", message:"No data received from server" }); 1772} else { 1773if (batch.isPoll && batch.map.partialResponse == dwr.engine._partialResponseYes) { 1774dwr.engine.transport.xhr.processCometResponse(reply, batch); 1775} else { 1776if (reply.search("//#DWR") === -1) { 1777dwr.engine._handleError(batch, { name:"dwr.engine.invalidReply", message:"Invalid reply from server" }); 1778} else { 1779toEval = reply; 1780} 1781} 1782} 1783} else if (status >= 400) { 1784var statusText = "statusText could not be read."; 1785try { 1786statusText = req.statusText; 1787} catch (ex) { 1788 1789} 1790dwr.engine._handleError(batch, { name:"dwr.engine.http." + status, message:statusText }); 1791} 1792 1793if (toEval != null) toEval = toEval.replace(dwr.engine._scriptTagProtection, ""); 1794dwr.engine._executeScript(toEval); 1795dwr.engine.transport.complete(batch); 1796 1797} catch (ex2) { 1798dwr.engine._handleError(batch, ex2); 1799} 1800}, 1801 1802 1803 1804 1805 1806checkCometPoll:function() { 1807var req = dwr.engine._pollBatch && dwr.engine._pollBatch.req; 1808if (req) { 1809var text = req.responseText; 1810if (text != null) { 1811dwr.engine.transport.xhr.processCometResponse(text, dwr.engine._pollBatch); 1812} 1813} 1814 1815if (dwr.engine._pollBatch) { 1816setTimeout(dwr.engine.transport.xhr.checkCometPoll, dwr.engine._pollCometInterval); 1817} 1818}, 1819 1820 1821 1822 1823 1824 1825 1826 1827processCometResponse:function(response, batch) { 1828if (batch.charsProcessed == response.length) return; 1829if (response.length === 0) { 1830batch.charsProcessed = 0; 1831return; 1832} 1833 1834var firstStartTag = response.indexOf("//#DWR-START#", batch.charsProcessed); 1835if (firstStartTag == -1) { 1836 1837return; 1838} 1839 1840 1841 1842 1843var lastEndTag = response.lastIndexOf("//#DWR-END#"); 1844if (lastEndTag == -1) { 1845 1846return; 1847} 1848 1849 1850if (response.charCodeAt(lastEndTag + 11) == 13 && response.charCodeAt(lastEndTag + 12) == 10) { 1851batch.charsProcessed = lastEndTag + 13; 1852} 1853else { 1854batch.charsProcessed = lastEndTag + 11; 1855} 1856 1857var exec = response.substring(firstStartTag + 13, lastEndTag); 1858 1859try { 1860dwr.engine._executeScript(exec); 1861} 1862catch (ex) { 1863 1864 1865if (dwr != null) { 1866dwr.engine._handleError(batch, ex); 1867} 1868} 1869}, 1870 1871 1872 1873 1874abort:function(batch) { 1875if (batch.req) { 1876batch.aborted = true; 1877batch.req.abort(); 1878} 1879}, 1880 1881 1882 1883 1884 1885remove:function(batch) { 1886 1887if (batch.req) { 1888delete batch.req; 1889} 1890} 1891}, 1892 1893 1894 1895 1896iframe:{ 1897 1898 1899 1900httpMethod:"POST", 1901 1902 1903 1904 1905 1906send:function(batch) { 1907if (document.body == null) { 1908setTimeout(function(){dwr.engine.transport.iframe.send(batch);}, 100); 1909return; 1910} 1911batch.httpMethod = dwr.engine.transport.iframe.httpMethod; 1912if (batch.fileUpload) { 1913batch.httpMethod = "POST"; 1914batch.encType = "multipart/form-data"; 1915} 1916batch.loadingStarted = false; 1917if (window.location.hostname != document.domain) batch.map.documentDomain = document.domain; 1918var idname = dwr.engine.transport.iframe.getId(batch); 1919batch.div1 = document.createElement("div"); 1920batch.div1.innerHTML = "<iframe frameborder='0' style='width:0px;height:0px;border:0;display:none;' id='" + idname + "' name='" + idname + "'></iframe>"; 1921batch.iframe = batch.div1.firstChild; 1922batch.document = document; 1923batch.iframe.batch = batch; 1924batch.fileInputs = []; 1925dwr.engine.util.addEventListener(batch.iframe, "load", function(ev) { 1926 1927if (!batch.loadingStarted) return; 1928 1929while(batch.fileInputs.length > 0) { 1930var entry = batch.fileInputs.pop(); 1931entry.original.setAttribute("id", entry.clone.getAttribute("id")); 1932entry.original.setAttribute("name", entry.clone.getAttribute("name")); 1933entry.original.style.display = entry.clone.style.display; 1934entry.clone.parentNode.replaceChild(entry.original, entry.clone); 1935} 1936
1937if (batch.completed) return; 1938 1939if (dwr.engine._queuedBatchException) { 1940dwr.engine._handleError(batch, dwr.engine._queuedBatchException); 1941dwr.engine._queuedBatchException = null; 1942return; 1943} 1944 1945try { 1946var contentDoc = batch.iframe.contentDocument || batch.iframe.contentWindow.document; 1947} catch(ex) { 1948var contentEx = ex; 1949} 1950if (typeof dwr != "undefined") { 1951var htmlResponse = contentDoc && contentDoc.documentElement ? contentDoc.documentElement.outerHTML : "(Could not extract HTML response: " + contentEx.message + ")"; 1952dwr.engine._handleError(batch, {name:"dwr.engine.textHtmlReply", message:"HTML reply from the server.", responseText:htmlResponse}); 1953} 1954}); 1955 1956// http://stackoverflow.com/questions/18414964/load-event-for-iframe-does-not-fire-in-ie 1957document.body.appendChild(batch.div1); 1958dwr.engine.transport.iframe.beginLoader(batch, idname); 1959}, 1960 1961 1962 1963 1964 1965 1966getId:function(batch) { 1967return batch.isPoll ? "dwr-if-poll-" + dwr.engine._instanceId + "-" + batch.map.batchId : "dwr-if-" + dwr.engine._instanceId + "-" + batch.map.batchId; 1968}, 1969 1970 1971 1972 1973 1974beginLoader:function(batch, idname) { 1975if (batch.isPoll) { 1976batch.map.partialResponse = dwr.engine._partialResponseYes; 1977} 1978batch.mode = batch.isPoll ? dwr.engine._ModeHtmlPoll : dwr.engine._ModeHtmlCall; 1979var request = dwr.engine.batch.constructRequest(batch, batch.httpMethod); 1980if (batch.httpMethod === "GET") { 1981batch.iframe.setAttribute("src", request.url); 1982} 1983else { 1984 1985// See http://soakedandsoaped.com/articles/read/firefox-3-native-ajax-file-upload 1986 1987batch.div2 = document.createElement("div"); 1988document.body.appendChild(batch.div2); 1989batch.div2.innerHTML = "<form" + (batch.encType ? " encType='" + batch.encType + "' encoding='" + batch.encType + "'" : "") + "></form>"; 1990batch.form = batch.div2.firstChild; 1991batch.form.setAttribute("action", request.url); 1992batch.form.setAttribute("target", idname); 1993batch.form.setAttribute("style", "display:none"); 1994batch.form.setAttribute("method", batch.httpMethod); 1995for (var prop in batch.map) { 1996var value = batch.map[prop]; 1997if (typeof value != "function") { 1998if (value && value.tagName && value.tagName.toLowerCase() == "input" && value.type && value.type.toLowerCase() == "file") { 1999 2000 2001 2002if (value.parentNode) { 2003var clone = value.cloneNode(true); 2004value.parentNode.replaceChild(clone, value); 2005batch.fileInputs.push({original:value, clone:clone}); 2006} 2007value.removeAttribute("id"); 2008value.setAttribute("name", prop); 2009value.style.display = "none"; 2010batch.form.appendChild(value); 2011} else { 2012var formInput = batch.document.createElement("input"); 2013formInput.setAttribute("type", "hidden"); 2014formInput.setAttribute("name", prop); 2015formInput.setAttribute("value", value); 2016batch.form.appendChild(formInput); 2017} 2018} 2019} 2020batch.loadingStarted = true; 2021batch.form.submit(); 2022} 2023}, 2024 2025 2026 2027 2028remote:{ 2029 2030 2031 2032 2033 2034 2035beginIFrameResponse:function(iframe, batchId) { 2036}, 2037 2038 2039 2040 2041 2042 2043endChunk:function(iframeWindow) { 2044setTimeout(function() { 2045 2046var scriptTags = iframeWindow.document.body.getElementsByTagName("script"); 2047if (scriptTags.length > 0) { 2048var s = scriptTags[0]; 2049s.parentNode.removeChild(s); 2050} 2051}, 0); 2052}, 2053 2054 2055 2056 2057 2058 2059endIFrameResponse:function(batchId) { 2060var batch = dwr.engine._batches[batchId]; 2061if (batch) dwr.engine.transport.complete(batch); 2062} 2063}, 2064 2065remove:function(batch) { 2066 2067 2068setTimeout(function(){ 2069if (batch.iframe && batch.iframe.parentNode) { 2070batch.iframe.parentNode.removeChild(batch.iframe); 2071batch.iframe = null; 2072} 2073if (batch.div1 && batch.div1.parentNode) { 2074batch.div1.parentNode.removeChild(batch.div1); 2075batch.div1 = null; 2076} 2077if (batch.form && batch.form.parentNode) { 2078batch.form.parentNode.removeChild(batch.form); 2079batch.form = null; 2080} 2081if (batch.div2 && batch.div2.parentNode) { 2082batch.div2.parentNode.removeChild(batch.div2); 2083batch.div2 = null; 2084} 2085}, 100); 2086} 2087}, 2088 2089 2090 2091 2092scriptTag:{ 2093 2094 2095 2096 2097send:function(batch) { 2098if (batch.isPoll) { 2099batch.map.partialResponse = dwr.engine._partialResponseNo; 2100} 2101batch.mode = batch.isPoll ? dwr.engine._ModePlainPoll : dwr.engine._ModePlainCall; 2102var request = dwr.engine.batch.constructRequest(batch, "GET"); 2103 2104batch.script = document.createElement("script"); 2105batch.script.id = "dwr-st-" + batch.map.batchId; 2106batch.script.src = request.url; 2107batch.script.type = "text/javascript"; 2108batch.script.async = true; 2109dwr.engine.util.addEventListener(batch.script, "load", function(ev) { 2110if (typeof dwr != "undefined") dwr.engine.transport.scriptTag.complete(batch); 2111}); 2112dwr.engine.util.addEventListener(batch.script, "error", function(ev) { 2113if (typeof dwr != "undefined") dwr.engine.transport.scriptTag.complete(batch); 2114}); 2115dwr.engine.util.addEventListener(batch.script, "readystatechange", function(ev) { 2116if (typeof dwr != "undefined") {
2117if (batch.completed) return; 2118if (batch.script.readyState == "complete" || batch.script.readyState == "loaded") { 2119dwr.engine.transport.scriptTag.complete(batch); 2120} 2121} 2122}); 2123document.getElementsByTagName("head")[0].appendChild(batch.script); 2124}, 2125 2126 2127 2128 2129complete:function(batch) { 2130dwr.engine.transport.complete(batch); 2131}, 2132 2133 2134 2135 2136remove:function(batch) { 2137 2138if (!batch.script) return; 2139 2140 2141batch.script.parentNode.removeChild(batch.script); 2142batch.script = null; 2143} 2144} 2145}; 2146 2147 2148 2149 2150 2151dwr.engine.batch = { 2152 2153 2154 2155 2156create:function() { 2157var batch = { 2158async:dwr.engine._async, 2159charsProcessed:0, 2160handlers:[], 2161isPoll:false, 2162map:{ callCount:0 }, 2163paramCount:0, 2164preHooks:[], 2165postHooks:[], 2166timeout:dwr.engine._timeout, 2167errorHandler:null, 2168globalErrorHandler:dwr.engine._errorHandler, 2169warningHandler:dwr.engine._warningHandler, 2170textHtmlHandler:null, 2171globalTextHtmlHandler:dwr.engine._textHtmlHandler 2172}; 2173if (!dwr.engine._activeReverseAjax) batch.map.nextReverseAjaxIndex = dwr.engine._nextReverseAjaxIndex; 2174 2175if (dwr.engine._preHook) { 2176batch.preHooks.push(dwr.engine._preHook); 2177} 2178if (dwr.engine._postHook) { 2179batch.postHooks.push(dwr.engine._postHook); 2180} 2181 2182dwr.engine.batch.populateHeadersAndAttributes(batch); 2183return batch; 2184}, 2185 2186 2187 2188 2189 2190 2191createPoll:function() { 2192var batch = { 2193async:true, 2194charsProcessed:0, 2195handlers:[{ 2196callback:function(pause) { 2197dwr.engine._pollBatch = null; 2198setTimeout(dwr.engine._poll, pause); 2199} 2200}], 2201isPoll:true, 2202map:{ callCount:1, nextReverseAjaxIndex:dwr.engine._nextReverseAjaxIndex}, 2203paramCount:0, 2204preHooks:[], 2205postHooks:[], 2206timeout:dwr.engine._pollTimeout 2207}; 2208dwr.engine.batch.populateHeadersAndAttributes(batch); 2209return batch; 2210}, 2211 2212 2213 2214 2215 2216 2217populateHeadersAndAttributes:function(batch) { 2218var propname, data; 2219batch.headers = {}; 2220if (dwr.engine._headers) { 2221for (propname in dwr.engine._headers) { 2222data = dwr.engine._headers[propname]; 2223if (typeof data != "function") batch.headers[propname] = data; 2224} 2225} 2226batch.attributes = {}; 2227if (dwr.engine._attributes) { 2228for (propname in dwr.engine._attributes) { 2229data = dwr.engine._attributes[propname]; 2230if (typeof data != "function") batch.attributes[propname] = data; 2231} 2232} 2233}, 2234 2235 2236 2237 2238 2239addCall:function(batch, scriptName, methodName, args) { 2240 2241 2242var callData, stopAt; 2243var lastArg = args[args.length - 1]; 2244if (lastArg == null || typeof lastArg == "function") { 2245callData = { callback:lastArg }; 2246stopAt = args.length - 1; 2247} 2248else if (dwr.engine.util.isCallOptionArgument(lastArg)) { 2249callData = lastArg; 2250stopAt = args.length - 1; 2251} 2252else { 2253callData = {}; 2254stopAt = args.length; 2255} 2256 2257 2258if (dwr.engine._singleShot) dwr.engine.batch.merge(batch, callData); 2259batch.handlers[batch.map.callCount] = { 2260callback:callData.callbackHandler || callData.callback, 2261callbackArg:callData.callbackArg || callData.arg, 2262callbackScope:callData.callbackScope || callData.scope || window, 2263exceptionHandler:callData.exceptionHandler, 2264exceptionArg:callData.exceptionArg || callData.arg, 2265exceptionScope:callData.exceptionScope || callData.scope || window, 2266errorHandler:callData.errorHandler 2267}; 2268 2269 2270var prefix = "c" + batch.map.callCount + "-"; 2271batch.map[prefix + "scriptName"] = scriptName; 2272batch.map[prefix + "methodName"] = methodName; 2273batch.map[prefix + "id"] = batch.map.callCount; 2274var directrefmap = {}, otherrefmap = {}; 2275for (var i = 0; i < stopAt; i++) { 2276dwr.engine.serialize.convert(batch, directrefmap, otherrefmap, args[i], prefix + "param" + i, 0); 2277} 2278dwr.engine.serialize.cleanup(directrefmap); 2279}, 2280 2281 2282 2283 2284 2285 2286 2287merge:function(batch, overrides) { 2288var propname, data; 2289for (var i = 0; i < dwr.engine._propnames.length; i++) { 2290propname = dwr.engine._propnames[i]; 2291if (dwr.engine._singleShot && propname == "errorHandler") continue; 2292if (overrides[propname] != null) batch[propname] = overrides[propname]; 2293} 2294if (overrides.preHook != null) batch.preHooks.unshift(overrides.preHook); 2295if (overrides.postHook != null) batch.postHooks.push(overrides.postHook); 2296if (overrides.headers) { 2297for (propname in overrides.headers) { 2298data = overrides.headers[propname]; 2299if (typeof data != "function") batch.headers[propname] = data; 2300} 2301} 2302var attrs = null; 2303if (overrides.attributes) attrs = overrides.attributes; 2304if (attrs) { 2305for (propname in attrs) { 2306data = attrs[propname]; 2307if (typeof data != "function") batch.attributes[propname] = data; 2308} 2309} 2310}, 2311 2312 2313 2314 2315 2316 2317prepareToSend:function(batch) { 2318batch.map.batchId = dwr.engine._nextBatchId; 2319dwr.engine._nextBatchId++; 2320dwr.engine._batches[batch.map.batchId] = batch; 2321dwr.engine._batchesLength++;
2322batch.completed = false; 2323batch.map.instanceId = dwr.engine._instanceId; 2324 2325 2326batch.map.page = encodeURIComponent(window.location.pathname + window.location.search); 2327batch.map.scriptSessionId = dwr.engine._scriptSessionId; 2328 2329for (var i = 0; i < batch.preHooks.length; i++) { 2330batch.preHooks[i](); 2331} 2332batch.preHooks = null; 2333 2334if (batch.timeout && batch.timeout !== 0) { 2335batch.timeoutId = setTimeout(function() { 2336dwr.engine.transport.abort(batch); 2337dwr.engine._handleError(batch, { name:"dwr.engine.timeout", message:"Timeout" }); 2338}, batch.timeout); 2339} 2340}, 2341 2342 2343 2344 2345 2346 2347 2348constructRequest:function(batch, httpMethod) { 2349 2350var urlBuffer = []; 2351urlBuffer.push(batch.path); 2352urlBuffer.push(batch.mode); 2353if (batch.isPoll) { 2354urlBuffer.push("ReverseAjax.dwr"); 2355} 2356else if (batch.map.callCount == 1) { 2357urlBuffer.push(batch.map["c0-scriptName"]); 2358urlBuffer.push("."); 2359urlBuffer.push(batch.map["c0-methodName"]); 2360urlBuffer.push(".dwr"); 2361} 2362else { 2363urlBuffer.push("Multiple."); 2364urlBuffer.push(batch.map.callCount); 2365urlBuffer.push(".dwr"); 2366} 2367 2368var sessionMatchExpr = new RegExp( 2369"^" + 2370"[^;\\?#]+" + 2371"(;[^\\?#]+)"); 2372var sessionMatch = location.href.match(sessionMatchExpr); 2373if (sessionMatch != null) { 2374urlBuffer.push(sessionMatch[1]); 2375} 2376 2377 2378if (batch.attributes) { 2379for (var attrname in batch.attributes) { 2380var data = batch.attributes[attrname]; 2381if (typeof data != "function") batch.map["a-" + attrname] = "" + data; 2382} 2383} 2384 2385var request = {}; 2386var prop; 2387if (httpMethod == "GET") { 2388 2389 2390batch.map.callCount = "" + batch.map.callCount; 2391urlBuffer.push("?"); 2392for (prop in batch.map) { 2393if (typeof batch.map[prop] != "function") { 2394urlBuffer.push(encodeURIComponent(prop)); 2395urlBuffer.push("="); 2396urlBuffer.push(encodeURIComponent(batch.map[prop])); 2397urlBuffer.push("&"); 2398} 2399} 2400urlBuffer.pop(); 2401request.body = null; 2402} 2403else { 2404 2405request.body = ""; 2406if (dwr.engine.util.ieCondition("if lte IE 7")) { 2407 2408var buf = []; 2409for (prop in batch.map) { 2410if (typeof batch.map[prop] != "function") { 2411buf.push(prop + "=" + batch.map[prop] + dwr.engine._postSeperator); 2412} 2413} 2414request.body = buf.join(""); 2415} 2416else { 2417 2418for (prop in batch.map) { 2419if (typeof batch.map[prop] != "function") { 2420request.body += prop + "=" + batch.map[prop] + dwr.engine._postSeperator; 2421} 2422} 2423} 2424request.body = dwr.engine._contentRewriteHandler(request.body); 2425} 2426request.url = dwr.engine._urlRewriteHandler(urlBuffer.join("")); 2427return request; 2428}, 2429 2430 2431 2432 2433 2434 2435 2436validate:function(batch) { 2437if (!batch.completed) { 2438var repliesReceived = 0; 2439for (var i = 0; i < batch.map.callCount; i++) { 2440if (batch.handlers[i].completed === true) { 2441repliesReceived++; 2442} 2443} 2444if (repliesReceived == 0 && dwr.engine._queuedBatchException) { 2445dwr.engine._handleError(batch, dwr.engine._queuedBatchException); 2446dwr.engine._queuedBatchException = null; 2447} else if (repliesReceived < batch.map.callCount) { 2448dwr.engine._handleError(batch, { name:"dwr.engine.incompleteReply", message:"Incomplete reply from server" }); 2449} 2450} 2451}, 2452 2453 2454 2455 2456 2457 2458remove:function(batch) { 2459if (!batch) { 2460dwr.engine._debug("Warning: null batch in dwr.engine.batch.remove()", true); 2461return; 2462} 2463 2464if (batch.completed) { 2465return; 2466} 2467batch.completed = true; 2468 2469 2470dwr.engine.transport.remove(batch); 2471 2472 2473if (batch.timeoutId != null) { 2474clearTimeout(batch.timeoutId); 2475delete batch.timeoutId; 2476} 2477 2478 2479if (batch.map && (batch.map.batchId != null)) { 2480delete dwr.engine._batches[batch.map.batchId]; 2481dwr.engine._batchesLength--; 2482} 2483if (batch == dwr.engine._batch) dwr.engine._batch = null; 2484if (batch == dwr.engine._pollBatch) dwr.engine._pollBatch = null; 2485 2486 2487 2488 2489if (dwr.engine._batchQueue.length !== 0) { 2490var sendbatch = dwr.engine._batchQueue.shift(); 2491dwr.engine.transport.send(sendbatch); 2492} 2493} 2494}; 2495 2496 2497 2498 2499 2500dwr.engine.util = { 2501 2502 2503 2504 2505newActiveXObject:function(axarray) { 2506var returnValue; 2507for (var i = 0; i < axarray.length; i++) { 2508try { 2509returnValue = new ActiveXObject(axarray[i]); 2510break; 2511} 2512catch (ex) { } 2513} 2514return returnValue; 2515}, 2516 2517ieCondition:function(cond) { 2518if (!(cond in dwr.engine._ieConditions)) { 2519var div = document.createElement("div"); 2520div.innerHTML = "<!--[" + cond + "]><p><![endif]-->"; 2521dwr.engine._ieConditions[cond] = !!(div.getElementsByTagName("p").length); 2522} 2523return dwr.engine._ieConditions[cond]; 2524}, 2525 2526 2527 2528 2529tokenify: function(number) { 2530var tokenbuf = []; 2531var charmap = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*$"; 2532var remainder = number; 2533while (remainder > 0) 2534{ 2535tokenbuf.push(charmap.charAt(remainder & 0x3F)); 2536remainder = Math.floor(remainder / 64); 2537} 2538return tokenbuf.join(""); 2539}, 2540 2541addEventListener: function(elem, name, func) { 2542if (elem.addEventListener) 2543elem.addEventListener(name, func, false); 2544else 2545elem.attachEvent("on" + name, func); 2546}, 2547 2548isCallOptionArgument: function(lastArg) { 2549return (typeof lastArg === "object" && (typeof lastArg.callback === "function" || 2550typeof lastArg.exceptionHandler === "function" || typeof lastArg.callbackHandler === "function" || 2551typeof lastArg.errorHandler === "function" || typeof lastArg.warningHandler === "function" || lastArg.hasOwnProperty("async"))); 2552}, 2553 2554logHandlerEx: function(func) { 2555try { 2556func(); 2557} catch(ex) { 2558dwr.engine._debug("Exception occured in user-specified handler:"); 2559dwr.engine._debug(ex); 2560} 2561} 2562}; 2563 2564 2565dwr.engine._initializer.init(); 2566 2567 2568 2569 2570dwr.hub = { 2571 2572 2573 2574 2575 2576publish:function(topicName, data) { 2577dwr.engine._execute(null, '__System', 'publish', topicName, data, {}); 2578}, 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588subscribe:function(topicName, callback, scope, subscriberData) { 2589var subscription = "" + dwr.hub._subscriptionId; 2590dwr.hub._subscriptionId++; 2591dwr.hub._subscriptions[subscription] = { 2592callback:callback, 2593scope:scope, 2594subscriberData:subscriberData 2595}; 2596dwr.engine._execute(null, '__System', 'subscribe', topicName, subscription, {}); 2597return subscription; 2598}, 2599 2600 2601 2602 2603 2604 2605 2606_remotePublish:function(subscriptionId, publishData) { 2607var subscriptionData = dwr.hub._subscriptions[subscriptionId]; 2608if (!subscriptionData) return; 2609subscriptionData.callback.call(subscriptionData.scope, publishData, subscriptionData.subscriberData); 2610}, 2611 2612 2613 2614 2615_subscriptionId:0, 2616 2617 2618 2619 2620_subscriptions:{} 2621}; 2622 2623 2624 2625 2626 2627dwr.data = { 2628 2629 2630 2631 2632 2633StoreChangeListener:{ 2634 2635 2636 2637 2638 2639itemRemoved:function(source, itemId) { }, 2640 2641 2642 2643 2644 2645 2646itemAdded:function(source, item) { }, 2647 2648 2649 2650 2651 2652 2653 2654 2655itemChanged:function(source, item, changedAttributes) { } 2656}, 2657 2658 2659 2660 2661 2662 2663 2664 2665Cache:function(storeId, listener) { 2666this.storeId = storeId; 2667this.listener = listener; 2668} 2669}; 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682dwr.data.Cache.prototype.viewRegion = function(region, callbackObj) { 2683if (!region) region = { }; 2684if (!region.start) region.start = 0; 2685if (!region.count) region.count = -1; 2686if (!region.sort) region.sort = []; 2687else { 2688for (var index = 0; index < region.sort.length; index++) { 2689if (typeof region.sort[index].descending == "undefined") { 2690region.sort[index].descending = false;
2691} 2692} 2693} 2694if (!region.query) region.query = {}; 2695 2696return dwr.engine._execute(null, '__Data', 'viewRegion', [ this.storeId, region, this.listener, callbackObj ]); 2697}; 2698 2699 2700 2701 2702 2703 2704dwr.data.Cache.prototype.viewItem = function(itemId, callbackObj) { 2705return dwr.engine._execute(null, '__Data', 'viewItem', [ this.storeId, itemId, this.listener, callbackObj ]); 2706}; 2707 2708 2709 2710 2711 2712dwr.data.Cache.prototype.unsubscribe = function(callbackObj) { 2713if (this.listener) { 2714return dwr.engine._execute(null, '__Data', 'unsubscribe', [ this.storeId, this.listener, callbackObj ]); 2715} 2716}; 2717 2718 2719 2720 2721 2722 2723dwr.data.Cache.prototype.update = function(items, callbackObj) { 2724return dwr.engine._execute(null, '__Data', 'update', [ this.storeId, items, callbackObj ]); 2725}; 2726 2727})(); 2728
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.