/[webpac2]/trunk/web/iwf/iwfajax.js
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/web/iwf/iwfajax.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 69 - (show annotations)
Sat Nov 19 23:48:19 2005 UTC (18 years, 5 months ago) by dpavlin
File MIME type: text/cpp
File size: 22905 byte(s)
 r8979@llin:  dpavlin | 2005-11-20 00:39:43 +0100
 another fix for checkboxes, added textarea, checkbox and radio buttons to
 tests

1 // =========================================================================
2 /// IWF - Interactive Website Framework. Javascript library for creating
3 /// responsive thin client interfaces.
4 ///
5 /// Copyright (C) 2005 Brock Weaver brockweaver@users.sourceforge.net
6 ///
7 /// This library is free software; you can redistribute it and/or modify
8 /// it under the terms of the GNU Lesser General Public License as published
9 /// by the Free Software Foundation; either version 2.1 of the License, or
10 /// (at your option) any later version.
11 ///
12 /// This library is distributed in the hope that it will be useful, but
13 /// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 /// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 /// License for more details.
16 ///
17 /// You should have received a copy of the GNU Lesser General Public License
18 /// along with this library; if not, write to the Free Software Foundation,
19 /// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 ///
21 /// Brock Weaver
22 /// brockweaver@users.sourceforge.net
23 /// 1605 NW Maple Pl
24 /// Ankeny, IA 50021
25 ///
26 //! http://iwf.sourceforge.net/
27 // --------------------------------------------------------------------------
28 //! NOTE: To minimize file size, strip all fluffy comments (except the LGPL, of course!)
29 //! using the following regex (global flag and multiline on):
30 //! ^\t*//([^/!].*|$)
31 //
32 // This reduces file size by about 30%, give or take.
33 //
34 //! To rip out only logging statements (commented or uncommented):
35 //! ^/{0,2}iwfLog.*
36 // --------------------------------------------------------------------------
37
38
39 // --------------------------------------------------------------------------
40 //
41 //! iwfajax.js
42 //
43 // Thread-safe background xml request via XmlHttpRequest object
44 //
45 //! Dependencies:
46 //! iwfxml.js
47 //! iwfcore.js
48 //! iwfgui.js (optional -- pretty progress bar)
49 //
50 //! Brock Weaver - brockweaver@users.sourceforge.net
51 //! v 0.2 - 2005-11-14
52 //! core bug patch
53 // --------------------------------------------------------------------------
54 //! v 0.1 - 2005-06-05
55 //! Initial release.
56 //
57 //! Known Issues:
58 //! AddToHistory does not work
59 //! Iframe not implemented
60 //
61 // =========================================================================
62
63
64
65
66 // show progress bar if they included iwfgui.js, window.status otherwise.
67 var _iwfShowGuiProgress = iwfExists(window.iwfShow);
68
69
70
71
72
73
74 // -----------------------------------
75 // Begin: Dependency Check
76 // -----------------------------------
77
78 if (!window.iwfGetById || !window.iwfXmlDoc){
79 iwfLog("IWF Dependency Error: iwfajax.js is dependent upon both iwfcore.js and iwfxml.js, so you *must* reference those files first.\n\nExample:\n\n<script type='text/javascript' src='iwfcore.js'></script>\n<script type='text/javascript' src='iwfxml.js'></script>\n<script type='text/javascript' src='iwfajax.js'></script>", true);
80 }
81
82 // -----------------------------------
83 // End: Dependency Check
84 // -----------------------------------
85
86 // -----------------------------------
87 // Begin: AJAX Request and Response
88 // -----------------------------------
89
90 function iwfRequest(urlOrForm, targetElementOnResponse, addToHistory, callback){
91
92 // we use a javascript feature here called "inner functions"
93 // using these means the local variables retain their values after the outer function
94 // has returned. this is useful for thread safety, so
95 // reassigning the onreadystatechange function doesn't stomp over earlier requests.
96
97 function iwfBindCallback(){
98 if (req.readyState == 4) {
99 _iwfOnRequestEnd();
100 if (req.status == 200 || req.status == 0) {
101 //iwfLog('exact response from server:\n\n' + req.responseText);
102 _iwfResponseHandler(req.responseText, localCallback, localTarget);
103 } else {
104 _iwfOnRequestError(req.status, req.statusText, req.responseText);
105 }
106 return;
107 }
108 }
109
110 // determine how to hit the server...
111 var url = null;
112 var method = 'GET';
113 var postdata = null;
114 var isFromForm = true;
115 var contentType = 'application/x-www-form-urlencoded';
116
117 if (iwfIsString(urlOrForm)){
118
119 // if we get here, they either specified the url or the name of the form.
120 // either way, flag so we return nothing.
121 isFromForm = false;
122
123 var frm = iwfGetForm(urlOrForm);
124 if (!frm){
125 // is a url.
126 url = urlOrForm;
127 method = 'GET';
128 postdata = null;
129 } else {
130 // is name of a form.
131 // fill with the form object.
132 urlOrForm = frm;
133 }
134
135 }
136
137 // use a local variable to hold our callback and target until the inner function is called...
138 var localCallback = callback;
139 var localTarget = targetElementOnResponse;
140
141 if (!iwfIsString(urlOrForm)){
142
143 var ctl = null;
144
145
146 // is a form or a control in the form.
147 if (iwfExists(urlOrForm.form)){
148 // is a control in the form. jump up to the form.
149 ctl = urlOrForm;
150 urlOrForm = urlOrForm.form;
151 }
152
153
154 // if they passed a form and no local target, lookup the form.iwfTarget attribute and use it if possible
155 if (!localTarget){
156 localTarget = iwfAttribute(urlOrForm, 'iwfTarget');
157 }
158
159 if (localTarget){
160 var elTgt = iwfGetOrCreateByNameWithinForm(urlOrForm, 'iwfTarget', 'input', 'hidden');
161 if (elTgt){
162 iwfAttribute(elTgt, 'value', localTarget);
163 iwfRemoveAttribute(elTgt, 'disabled');
164 }
165 }
166
167
168 url = urlOrForm.action;
169 method = urlOrForm.method.toUpperCase();
170 switch(method){
171 case "POST":
172 postdata = _iwfGetFormData(urlOrForm, url, ctl);
173
174 // we also need to properly set the content-type header...
175 var frm = iwfGetForm(urlOrForm);
176 if (frm){
177 var enc = iwfAttribute(frm, 'encoding');
178 if (!enc){
179 enc = iwfAttribute(frm, 'enctype');
180 }
181 if (enc){
182 contentType = enc;
183 }
184 }
185
186 break;
187 case "GET":
188 default:
189 url = _iwfGetFormData(urlOrForm, url, ctl);
190 break;
191 }
192 }
193
194 // prevent any browser caching of our url by requesting a unique url everytime...
195 url += ((url.indexOf('?') > -1) ? '&' : '?') + 'iwfRequestId=' + new Date().valueOf();
196
197 //iwfLog("url = " + url);
198 //iwfLog("method = " + method);
199 //iwfLog("postdata = " + postdata);
200 //iwfLog("contenttype = " + contentType);
201
202
203 var req = null;
204 if (!addToHistory){
205 //iwfLog("using XHR to perform request...");
206 // use XHR to perform the request, as this will
207 // prevent the browser from adding it to history.
208 req = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
209
210 // bind our callback
211 req.onreadystatechange = iwfBindCallback;
212
213 // show progress if it's not already visible...
214 _iwfOnRequestStart();
215
216 // hit the server
217 req.open(method, url, true);
218 req.setRequestHeader('Content-Type', contentType);
219 req.send(postdata);
220 } else {
221 // use an IFRAME element to perform the request,
222 // as this will cause the browser to add it to history.
223 // TODO: make this work!!!
224 iwfLog("using IFRAME to perform request...");
225 iwfLog('request and add to history not implemented yet!!!', true);
226 return;
227
228 var el = iwfGetById("iwfHistoryFrame");
229 if (!el){
230 iwfLog("To enable history tracking in IWF, you must add an invisible IFRAME element to your page:\n<IFRAME id='iwfHistoryFrame' style='display:none'></IFRAME>", true);
231 }
232
233 el.src = url;
234
235 // show progress if it's not already visible...
236 _iwfOnRequestStart();
237
238
239 }
240
241 // if this is called from the form.onsubmit event, make sure the form doesn't submit...
242
243 if (isFromForm){
244 return false;
245 } else {
246 // return absolutely nothing so anchor tags don't hork the current page
247 }
248
249 }
250
251 function _iwfGetFormData(form, url, ctl){
252
253 var method = form.method;
254 if (!method) method = "get";
255
256 var output = null;
257
258 if (method == 'get'){
259 output = url + ((url.indexOf('?') > -1) ? '&' : '?');
260 } else {
261 output = '';
262 }
263
264
265 // if there is a target specified in the <form> tag,
266 // copy its contents to a hidden <input type='hidden'> tag.
267
268 //iwfLog("total elements in form named '" + form.name + "': " + form.elements.length);
269 for(var i=0;i<form.elements.length;i++){
270 var el = form.elements[i];
271 var nm = iwfAttribute(el, 'name');
272 var val = null;
273 if (!iwfAttribute(el, 'disabled') && nm){
274 switch (el.tagName.toLowerCase()){
275 case 'input':
276 switch(iwfAttribute(el, 'type')){
277 case 'checkbox':
278 if (iwfAttribute(el, 'checked')){
279 val = 'on';
280 }
281 case 'radio':
282 if (iwfAttribute(el, 'checked')){
283 val = iwfAttribute(el, 'value');
284 }
285 break;
286 case 'button':
287 if (el == ctl){
288 val = iwfAttribute(el, 'value');
289 }
290 break;
291 case 'submit':
292 if (el == ctl){
293 val = iwfAttribute(el, 'value');
294 }
295 break;
296 case 'text':
297 default:
298 val = iwfAttribute(el, 'value');
299 break;
300 case 'file':
301 iwfLog('TODO: implement <input type="file"> in _iwfGetFormData', true);
302 val = iwfAttribute(el, 'value');
303 break;
304 case 'image':
305 iwfLog('TODO: implement <input type="image"> in _iwfGetFormData', true);
306 val = iwfAttribute(el, 'value');
307 break;
308 case 'reset':
309 iwfLog('TODO: implement <input type="reset"> in _iwfGetFormData', true);
310 break;
311 case 'hidden':
312 val = iwfAttribute(el, 'value');
313 break;
314 }
315 break;
316 case 'textarea':
317 val = iwfAttribute(el, 'innerText') || el.value;
318 break;
319 case 'button':
320 if (el == ctl){
321 val = iwfAttribute(el, 'innerText') || el.value;
322 }
323 break;
324 case 'select':
325 for(var j=0;j<el.options.length;j++){
326 if (iwfAttribute(el.options[j], 'selected') == 'true'){
327 if (!val){
328 val = iwfAttribute(el.options[j], 'value');
329 } else {
330 val += '+' + iwfAttribute(el.options[j], 'value');
331 }
332 }
333 }
334 }
335
336 if (val){
337 if (output.length > 0){
338 output += '&';
339 }
340 output += escape(nm) + '=' + escape(val);
341 }
342 }
343 }
344 if (output.length == 0){
345 return null;
346 } else {
347 return output;
348 }
349 }
350
351 function _iwfResponseReceived(doc){
352 iwfLog('iframeloaded');
353 var xmlDoc = new iwfXmlDoc(doc.innerHTML);
354 }
355
356 function _iwfResponseHandler(origText, callback, tgt){
357 var doc = new iwfXmlDoc(origText);
358 if (!doc.response){
359 // not in our default xml format.
360 // just throw out the xml to the callback, if any
361 if (callback){
362 callback(doc);
363 } else {
364 iwfLog("IWF Ajax Error: No callback defined for non-standard response:\n" + origText, true);
365 }
366 } else {
367 if (doc.response.debugging == 'true'){
368 iwfLoggingEnabled = true;
369 iwfLog("IWF Ajax Debugging:\nParsed response:\n\n" + doc.response.outerXml(true), true);
370 iwfShowLog();
371 }
372 for(var i=0; i< doc.response.childNodes.length; i++){
373 var node = doc.response.childNodes[i];
374 if (node.nodeName.indexOf("#") != 0){
375 //iwfLog('node.target=' + node.target + '\ntgt=' + tgt);
376 if (!tgt) {
377 // server target is ignored if a client target exists.
378 tgt = node.target;
379 }
380 if (node.errorCode && iwfToInt(node.errorCode, true) != 0){
381 // an error occurred.
382 _iwfOnRequestError(node.errorCode, node.errorMessage);
383 } else {
384 if (!node.type){
385 node.type = "";
386 }
387 switch(node.type.toLowerCase()){
388 case "html":
389 case "xhtml":
390 var innerHtml = node.innerHtml();
391 //iwfLog('parsed html response:\n\n' + innerHtml);
392 _iwfInsertHtml(innerHtml, tgt);
393 break;
394 case "javascript":
395 case "js":
396 var bomb = true;
397 if (node.childNodes.length == 1){
398 var js = node.childNodes[0];
399 if (js.nodeName == '#cdata' || js.nodeName == '#comment'){
400 bomb = false;
401 var code = js.getText();
402 eval(code);
403 }
404 }
405 if (bomb){
406 iwfLog("IWF Ajax Error: When an <action> is defined of type javascript, it content must be contained by either a Comment (<!-- -->) or CDATA (<![CDATA[ ]]>).\nCDATA is the more appropriate manner, as this is the xml-compliant one.\nHowever, COMMENT is also allowed as this is html-compliant, such as within a <script> element.\n\n<action> xml returned:\n\n" + node.outerXml(), true);
407 }
408 break;
409 case "xml":
410 if (callback){
411 callback(node);
412 }
413 break;
414 case "debug":
415 iwfLog("IWF Debug: <action> type identified as 'debug'.\nXml received for current action:\n\n" + node.outerXml(), true);
416 break;
417 default:
418 iwfLog('IWF Ajax Error: <action> type of "' + node.type + '" is not a valid option.\n\nValid options:\n\'html\' or \'xhtml\' = parse as html and inject into element with the id specified by the target attribute\n\'javascript\' or \'js\' = parse as javascript and execute\n\'xml\' = parse as xml and call the callback specified when iwfRequest() was called\n\'debug\' = parse as xml and log/alert the result\n\n<action> xml returned:\n\n' + node.outerXml(), true);
419 break;
420 }
421 }
422 }
423 }
424 }
425
426 }
427
428 function _iwfInsertHtml(html, parentNodeId){
429 if(!parentNodeId){
430 parentNodeId = 'iwfContent';
431 iwfLog("IWF Ajax Warning: <action> with a type of 'html' does not have its target attribute specified, so using the default of 'iwfContent'.");
432 }
433
434 if(!parentNodeId){
435 iwfLog("IWF Ajax Error: <action> node with a type of 'html' does not have its target attribute specified to a valid element.\nPlease specify the id of the element into which the contents of the <action> node should be placed.\nTo fill the entire page, simply specify 'body'.", true);
436 } else {
437 var el = iwfGetById(parentNodeId);
438 if (!el){
439 if (parentNodeId == 'body'){
440 el = iwfGetByTagName('body');
441 if (!el || el.length == 0){
442 iwfLog("IWF Ajax Error: Could not locate the tag named 'body'", true);
443 return;
444 } else {
445 el = el[0];
446 }
447 } else {
448 iwfLog('IWF Ajax Error: Could not locate element with id of ' + parentNodeId + ' into which the following html should be placed:\n\n' + html, true);
449 return;
450 }
451 }
452
453 //iwfLog(iwfElementToString(el));
454 //iwfLog(html);
455
456 // trying to shove a <form> node inside another <form> node is a bad thing.
457 // make sure we don't do that here.
458 var re = /<form/i;
459 var match = re.exec(html);
460 if (match && document.forms.length > 0){
461 // our html to inject contains a form node.
462 // bubble up the chain until we find a <form> node, or we have no parents
463 var elParent = el;
464 // I have doubts about adding elParent.tagName here
465 // but I don't have better idea. -dpavlin
466 while (elParent && elParent.tagName && elParent.tagName.toLowerCase() != 'form'){
467 elParent = iwfGetParent(elParent);
468 }
469
470 if (elParent && elParent.tagName && elParent.tagName.toLowerCase() == 'form'){
471 iwfLog('IWF Ajax Error: Attempting to inject html which contains a <form> node into a target element which is itself a <form> node, or is already contained by a <form> node.\nThis is bad html, and will not work appropriately on some major browsers.', true);
472 }
473 }
474
475
476 el.innerHTML = html;
477
478
479 // if there is a script element, we have to explicitly add it to the body element,
480 // as IE and firefox just don't like it when you try to add it as part of the innerHTML
481 // property. Go figure.
482
483 var i = 0;
484 // don't stomp on any existing scripts...
485 while (iwfGetById('iwfScript' + i)){
486 i++;
487 }
488
489 var scriptStart = html.indexOf("<script");
490 while(scriptStart > -1){
491 scriptStart = html.indexOf(">", scriptStart) + 1;
492
493 // copy contents of script into a default holder
494 var scriptEnd = html.indexOf("</script>", scriptStart);
495 var scriptHtml = html.substr(scriptStart, scriptEnd - scriptStart);
496
497 var re = /^\s*<!--/;
498 var match = re.exec(scriptHtml);
499 if (!match){
500 iwfLog("IWF Ajax Error: Developer, you *must* put the <!-- and //--> 'safety net' around your script within all <script> tags.\nThe offending <script> tag contains the following code:\n\n" + scriptHtml + "\n\nThis requirement is due to how IWF injects the html so the browser is able to actually parse the script and make its contents available for execution.", true);
501 }
502
503 // this code is the worst hack in this entire framework.
504 // the code in the try portion should work anywhere -- but
505 // IE barfs when you try to set the innerHTML on a script element.
506 // not only that, but IE won't parse script unless a visible element
507 // is contained in the innerHTML when it is set, so we need the <code>IE hack here</code>
508 // and it cannot be removed.
509 // I don't understand why creating a new node and setting its innerHTML causes the browsers
510 // to parse and execute the script, but it does.
511 // Note there is a major leak here, as we do not try to reuse existing iwfScriptXXXX elements
512 // in case they are in use by other targets. To clean these up, simply call iwfCleanScripts
513 // periodically. This is so app-dependent, I didn't want to try to keep track of everything
514 // and possibly miss a case, causing really weird results that only show up occassionally.
515 //
516 // Plus I'm getting lazy. :)
517 //
518 try {
519 //! moz (DOM)
520 var elScript = iwfGetOrCreateById('iwfScript' + i, 'script');
521 elScript.type = 'text/javascript';
522 elScript.defer = 'true';
523 elScript.innerHTML = scriptHtml;
524
525 iwfAppendChild('body', elScript);
526
527 } catch(e){
528 //iwfLog("IE Hack for injecting script tag...", true);
529 //! IE hack
530 // IE needs a visible tag within a non-script element to have scripting apply... Don't ask me why, ask the IE team why.
531 // My guess is the visible element causes the page to at least partially re-render, which in turn kicks off any script parsing
532 // code in IE.
533 var elDiv = iwfGetOrCreateById('iwfScript' + i, '<div style="display:none"></div>', 'body');
534 elDiv.innerHTML = '<code>IE hack here</code><script id="iwfScript' + i + '" defer="true">' + scriptHtml + '</script' + '>';
535 }
536
537 i++;
538
539 scriptStart = html.indexOf("<script", scriptEnd+8);
540 }
541 }
542 }
543
544 function iwfCleanScripts(){
545 var i = 0;
546 while(iwfRemoveNode('iwfScript' + (i++)));
547
548 }
549
550
551
552 var _iwfTotalRequests = 0;
553 var _iwfPendingRequests = 0;
554 var _iwfRequestTicker = null;
555 var _iwfRequestTickCount = 0;
556 var _iwfRequestTickDuration = 100;
557
558
559 // TODO: make the styles applied be configurable variables at the top of this file.
560 function _iwfGetBusyBar(inner){
561 var b = iwfGetById('iwfBusy');
562 if (!b){
563 b = iwfGetOrCreateById('iwfBusy', 'div', 'body');
564 if(b.style){
565 b.style.position = 'absolute';
566 b.style.border = '1px solid black';
567 b.style.backgroundColor = '#efefef';
568 b.style.textAlign = 'center';
569 }
570 iwfWidth(b, 100);
571 iwfHeight(b, 20);
572 iwfZIndex(b, 9999);
573
574 iwfX(b, 0);
575 iwfY(b, 0);
576
577 // iwfX(b, iwfClientWidth() - iwfWidth(b)-5);
578 // iwfY(b, iwfClientHeight() - iwfHeight(b)-5);
579
580 iwfHide(b);
581 }
582
583
584
585 var bb = iwfGetById('iwfBusyBar');
586 if(!bb){
587 bb = iwfGetOrCreateById('iwfBusyBar', 'div', b);
588 bb.style.backgroundColor = 'navy';
589 bb.style.color = 'white';
590 bb.style.textAlign = 'center';
591 iwfWidth(bb, 1);
592 iwfHeight(bb, 20);
593 iwfX(bb, 0);
594 iwfY(bb, 0);
595 }
596
597 if(inner){
598 return bb;
599 } else {
600 return b;
601 }
602
603 }
604
605 function _iwfOnRequestStart(){
606 _iwfPendingRequests++;
607 _iwfTotalRequests++;
608
609 _iwfRequestTickDuration = 100;
610
611 if (!_iwfRequestTicker){
612 _iwfRequestTickCount = 0;
613 if (window.iwfOnRequestStart){
614 _iwfRequestTickDuration = iwfOnRequestStart();
615 } else if (_iwfShowGuiProgress) {
616 // use gui busy implementation
617 var bb = _iwfGetBusyBar(true);
618 iwfWidth(bb, 1);
619 bb.innerHTML = '0%';
620 iwfShow(_iwfGetBusyBar(false));
621 } else {
622 // use default busy implementation...
623 window.status = 'busy.';
624 }
625 if (!_iwfRequestTickDuration){
626 _iwfRequestTickDuration = 100;
627 }
628 _iwfRequestTicker = setInterval(_iwfOnRequestTick, _iwfRequestTickDuration);
629 }
630 }
631
632 function _iwfOnRequestTick(){
633 _iwfRequestTickCount++;
634 if (window.iwfOnRequestTick){
635 iwfOnRequestTick(_iwfRequestTickCount, _iwfRequestTickDuration, _iwfPendingRequests);
636 } else if (!window.iwfOnRequestStart) {
637 if (_iwfShowGuiProgress) {
638 // use gui busy implementation
639 var bar = _iwfGetBusyBar(true);
640 if(bar){
641 var w = iwfWidth(bar) + 1;
642 if (w > 95){
643 w = 95;
644 }
645 iwfWidth(bar, w);
646 bar.innerHTML = "loading " + iwfIntFormat(w) + "%";
647 }
648 } else {
649 // use default busy implementation...
650 window.status = 'busy...............................................'.substr(0, (_iwfRequestTickCount % 45) + 5);
651 }
652 } else {
653 // they didn't define a tick function,
654 // but they did define a start one, so do nothing.
655 }
656 }
657
658 function _iwfOnRequestEnd(){
659 _iwfPendingRequests--;
660 if (_iwfPendingRequests < 1){
661 _iwfPendingRequests = 0;
662 _iwfTotalRequests = 0;
663 clearInterval(_iwfRequestTicker);
664 _iwfRequestTicker = null;
665 if (window.iwfOnRequestEnd){
666 iwfOnRequestEnd();
667 } else if (!window.iwfOnRequestStart) {
668 if (_iwfShowGuiProgress) {
669 // use gui busy implementation
670 var bar = _iwfGetBusyBar(true);
671 if(bar){
672 iwfWidth(bar, 100);
673 bar.innerHTML = "Done";
674 iwfHideGentlyDelay(_iwfGetBusyBar(false), 15, 500);
675 }
676 } else {
677 // use default busy implementation...
678 window.status = 'done.';
679 }
680 } else {
681 // they didn't define an end function,
682 // but they did define a start one, so do nothing.
683 }
684
685 } else {
686 if (window.iwfOnRequestProgress){
687 iwfOnRequestProgress(_iwfPendingRequests, _iwfTotalRequests);
688 } else if (!window.iwfOnRequestStart) {
689 if (_iwfShowGuiProgress) {
690 // use gui busy implementation
691 var pct = (1 - (_iwfPendingRequests/_iwfTotalRequests)) * 100;
692 if (pct > 100){
693 pct = 100;
694 }
695 var bar = _iwfGetBusyBar(true);
696 if(bar){
697 iwfWidth(bar, pct);
698 bar.innerHTML = "loading " + iwfIntFormat(pct) + "%";
699 }
700 } else {
701 // use default busy implementation...
702 window.status = 'Remaining: ' + _iwfPendingRequests;
703 }
704 } else {
705 // they didn't define an end function,
706 // but they did define a start one, so do nothing.
707 }
708 }
709 }
710
711 function _iwfOnRequestError(code, msg, text){
712 iwfLog("Error " + code + ": " + msg + ":\n\n" + text);
713 if (window.iwfOnRequestError){
714 iwfOnRequestError(code, msg, text);
715 } else {
716 alert("Error " + code + ": " + msg + ":\n\n" + text);
717 }
718 }
719
720 // -----------------------------------
721 // End: AJAX Request and Response
722 // -----------------------------------

Properties

Name Value
svn:mime-type text/cpp

  ViewVC Help
Powered by ViewVC 1.1.26