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