Joshua Slive wrote:
On 11/13/06, cristi <cristi@xxxxxxxxxxxxxxxxx> wrote:* My requests were performed with wget and in all the cases without any header included through the --headers command line option.Fine, but do you expect all of us to pull out the manual for wget and analyze exactly what it is sending? If you want help from the list, you should provide as many details as you can.
Not all of you... of course.
* I have installed mod_dumpio. Using these logs I can see the traffic between all the parties involved (client/cache/origin server). If you want I can send you the output of mod_dumpio for all the cases I have already mentioned.We don't need all the cases. We just need the case where a freshly cached file is not being served from the cache.> The first thing you should try is changing LogLevel to debug and then > looking in the error log. > Since I have already analyzed the log of mod_dumpio do you think that has any sense of doing what you have suggested above ?Yes. The error log contains information about the cache's analysis of the problem, not the headers.
However... attached to this messaage you can find the error log (containing also *all* the headers between all the parties involved). I send you only the information you asked for, that is the case here a freshly cached file is not being served from the cache. the file javascript.txt contains the log of the first request. the file javascript-cached.txt contains the log of the second request. Cristi
Joshua.
[Fri Nov 10 10:35:51 2006] [debug] proxy_util.c(1625): proxy: grabbed scoreboard slot 1 in child 27819 for worker proxy:reverse [Fri Nov 10 10:35:51 2006] [debug] proxy_util.c(1644): proxy: worker proxy:reverse already initialized [Fri Nov 10 10:35:51 2006] [debug] proxy_util.c(1724): proxy: initialized single connection worker 1 in child 27819 for (*) [Fri Nov 10 10:35:51 2006] [debug] proxy_util.c(1625): proxy: grabbed scoreboard slot 0 in child 27819 for worker http://localhost:9080/VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/ [Fri Nov 10 10:35:51 2006] [debug] proxy_util.c(1724): proxy: initialized single connection worker 0 in child 27817 for (localhost) [Fri Nov 10 10:35:51 2006] [notice] Apache/2.2.3 (Unix) configured -- resuming normal operations [Fri Nov 10 10:35:51 2006] [info] Server built: Nov 7 2006 16:44:46 [Fri Nov 10 10:35:51 2006] [debug] prefork.c(991): AcceptMutex: sysvsem (default: sysvsem) [Fri Nov 10 10:35:51 2006] [debug] proxy_util.c(1644): proxy: worker http://localhost:9080/VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/ already initialized [Fri Nov 10 10:35:51 2006] [debug] proxy_util.c(1724): proxy: initialized single connection worker 0 in child 27819 for (localhost) [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 72 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): GET /portal_javascripts/Plone%20Tableless/ploneScripts4205.js HTTP/1.0\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 23 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): User-Agent: Wget/1.10\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 13 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): Accept: */*\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 22 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): Host: localhost:9999\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 24 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): Connection: Keep-Alive\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 2 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): \r\n [Fri Nov 10 11:06:01 2006] [debug] mod_cache.c(129): Adding CACHE_SAVE filter for /portal_javascripts/Plone%20Tableless/ploneScripts4205.js [Fri Nov 10 11:06:01 2006] [debug] mod_cache.c(136): Adding CACHE_REMOVE_URL filter for /portal_javascripts/Plone%20Tableless/ploneScripts4205.js [Fri Nov 10 11:06:01 2006] [debug] mod_proxy_http.c(54): proxy: HTTP: canonicalising URL //localhost:9080/VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/portal_javascripts/Plone Tableless/ploneScripts4205.js [Fri Nov 10 11:06:01 2006] [debug] proxy_util.c(1378): [client 127.0.0.1] proxy: http: found worker http://localhost:9080/VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/ for http://localhost:9080/VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/portal_javascripts/Plone%20Tableless/ploneScripts4205.js [Fri Nov 10 11:06:01 2006] [debug] mod_proxy.c(756): Running scheme http handler (attempt 0) [Fri Nov 10 11:06:01 2006] [debug] mod_proxy_http.c(1662): proxy: HTTP: serving URL http://localhost:9080/VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/portal_javascripts/Plone%20Tableless/ploneScripts4205.js [Fri Nov 10 11:06:01 2006] [debug] proxy_util.c(1798): proxy: HTTP: has acquired connection for (localhost) [Fri Nov 10 11:06:01 2006] [debug] proxy_util.c(1858): proxy: connecting http://localhost:9080/VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/portal_javascripts/Plone%20Tableless/ploneScripts4205.js to localhost:9080 [Fri Nov 10 11:06:01 2006] [debug] proxy_util.c(1951): proxy: connected /VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/portal_javascripts/Plone%20Tableless/ploneScripts4205.js to localhost:9080 [Fri Nov 10 11:06:01 2006] [debug] proxy_util.c(2045): proxy: HTTP: fam 2 socket created to connect to localhost [Fri Nov 10 11:06:01 2006] [debug] proxy_util.c(2141): proxy: HTTP: connection complete to 127.0.0.1:9080 (localhost) [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 131 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): GET /VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/portal_javascripts/Plone%20Tableless/ploneScripts4205.js HTTP/1.1\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 22 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): Host: localhost:9080\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 23 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): User-Agent: Wget/1.10\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 13 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): Accept: */*\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 18 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): Max-Forwards: 10\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 28 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): X-Forwarded-For: 127.0.0.1\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 34 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): X-Forwarded-Host: localhost:9999\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 37 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): X-Forwarded-Server: griffo.sissa.it\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 24 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): Connection: Keep-Alive\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-IMMORTAL): 2 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-IMMORTAL): \r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (metadata-FLUSH): 0 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 17 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): HTTP/1.1 200 OK\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 81 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): Server: Zope/(Zope 2.8.6-final, python 2.4.2, linux2) ZServer/1.1 Plone/Unknown\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): D [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): D [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 36 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ate: Fri, 10 Nov 2006 10:06:01 GMT\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): C [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): C [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 22 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ontent-Length: 92131\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): A [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): A [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 21 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ccept-Ranges: bytes\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): E [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): E [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 39 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): xpires: Fri, 17 Nov 2006 10:06:01 GMT\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): L [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): L [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 45 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ast-Modified: Fri, 10 Nov 2006 10:06:01 GMT\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): C [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): C [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 30 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ache-Control: max-age=604800\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): C [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): C [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 53 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ontent-Type: application/x-javascript;charset=utf-8\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): \r [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): \r [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): \n [Fri Nov 10 11:06:01 2006] [debug] mod_proxy_http.c(1448): proxy: start body send [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 7647 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): /* Merged Plone Javascript file\n * This file is dynamically assembled from separate parts.\n * Some of these parts have 3rd party licenses or copyright information attached\n * Such information is valid for that section,\n * not for the entire composite file\n * originating files are separated by ----- filename.js -----\n */\n\n/* ----- register_function.js ----- */\n/* Essential javascripts, used a lot. \n * These should be placed inline\n * We have to be certain they are loaded before anything that uses them \n */\n\n// check for ie5 mac\nvar bugRiddenCrashPronePieceOfJunk = (\n navigator.userAgent.indexOf('MSIE 5') != -1\n &&\n navigator.userAgent.indexOf('Mac') != -1\n)\n\n// check for W3CDOM compatibility\nvar W3CDOM = (!bugRiddenCrashPronePieceOfJunk &&\n document.getElementsByTagName &&\n document.createElement);\n\n// cross browser function for registering event handlers\nfunction registerEventListener(elem, event, func) {\n if (elem.addEventListener) {\n elem.addEventListener(event, func, false);\n return true;\n } else if (elem.attachEvent) {\n var result = elem.attachEvent("on"+event, func);\n return result;\n }\n // maybe we could implement something with an array\n return false;\n}\n\n// cross browser function for unregistering event handlers\nfunction unRegisterEventListener(elem, event, func) {\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, false);\n return true;\n } else if (elem.detachEvent) {\n var result = elem.detachEvent("on"+event, func);\n return result;\n }\n // maybe we could implement something with an array\n return false;\n}\n\nfunction registerPloneFunction(func) {\n // registers a function to fire onload.\n registerEventListener(window, "load", func);\n}\n\nfunction unRegisterPloneFunction(func) {\n // unregisters a function so it does not fire onload.\n unRegisterEventListener(window, "load", func);\n}\n\nfunction getContentArea() {\n // returns our content area element\n if (W3CDOM) {\n var node = document.getElementById('region-content');\n if (!node) {\n node = document.getElementById('content');\n }\n return node;\n }\n} \n\n\n/* ----- cssQuery.js ----- */\n/*\n\tcssQuery, version 2.0 (2005/05/23)\n\tCopyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)\n\tLicense: http://creativecommons.org/licenses/LGPL/2.1/\n*/\neval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('7 z=5(){7 1M="2.0 (3e)";7 Z=M;7 C=/\\\\s*,\\\\s*/;7 z=5(s,D){3d{7 m=[];7 u=1C.3c.2j&&!D;7 b=(D)?(D.3b==26)?D:[D]:[1l];7 1N=1f(s).1o(C),i;h(i=0;i<1N.x;i++){s=1I(1N[i]);8(Z&&s.V(0,3).2i("")==" *#"){s=s.V(2);D=2e([],b,s[1])}1J D=b;7 j=0,t,f,a,c="";H(j<s.x){t=s[j++];f=s[j++];c+=t+f;a="";8(s[j]=="("){H(s[j++]!=")")a+=s[j];a=a.V(0,-1);c+="("+a+")"}D=(u&&12[c])?12[c]:2c(D,t,f,a);8(u)12[c]=D}m=m.3a(D)}1E z.2k;6 m}39(e){z.2k=e;6[]}};z.2a=5(){6"5 z() {\\\\n [1M "+1M+"]\\\\n}"};7 12={};z.2j=P;z.38=5(s){8(s){s=1I(s).2i("");1E 12[s]}1J 12={}};7 1y={};7 1g=P;z.1c=5(n,s){8(1g)1a("s="+17(s));1y[n]=X s()};z.37=5(c){6 c?1a(c):y};7 F={};7 l={};7 Y=[];F[" "]=5(r,f,t,n){7 e,i,j;h(i=0;i<f.x;i++){7 s=13(f[i],t,n);h(j=0;(e=s[j]);j++){8(R(e)&&19(e,n))r.B(e)}}};F["#"]=5(r,f,i){7 e,j;h(j=0;(e=f[j]);j++)8(e.Q==i)r.B(e)};F["."]=5(r,f,c){c=X 1x("(^|\\\\\\\\s)"+c+"(\\\\\\\\s|$)");7 e,i;h(i=0;(e=f[i]);i++)8(c.q(e.23))r.B(e)};F[":"]=5(r,f,p,a){7 t=l[p],e,i;8(t)h(i=0;(e=f[i]);i++)8(t(e,a))r.B(e)};l["36"]=5(e){7 d=T(e);8(d.1L)h(7 i=0;i<d.1L.x;i++){8(d.1L[i]==e)6 M}};l["35"]=5(e){};7 R=5(e){6(e&&e.1i==1&&e.1k!="!")?e:2d};7 1d=5(e){H(e&&(e=e.34)&&!R(e))2h;6 e};7 J=5(e){H(e&&(e=e.33)&&!R(e))2h;6 e};7 1v=5(e){6 R(e.2g)||J(e.2g)};7 1X=5(e){6 R(e.2f)||1d(e.2f)};7 1r=5(e){7 c=[];e=1v(e);H(e){c.B(e);e=J(e)}6 c};7 1m=5(e){6 T(e).32=="31 30"};7 T=5(e){6 e.2Z||e.1l};7 13=5(e,t){6(t=="*"&&e.1K)?e.1K:e.13(t)};7 1e=5(e,t,n){8(t=="*")6 R(e);8(!19(e,n))6 P;8(!1m(e))t=t.2Y();6 e.1k==t};7 19=5(e,n){6!n||(n=="*")||(e.2X==n)};7 1j=5(e){6 e.1P};5 2e(r,f,Q){7 m,i,j;h(i=0;i<f.x;i++){8(m=f[i].1K.2W(Q)){8(m.x==2d)r.B(m);1J h(j=0;j<m.x;j++)r.B(m[j])}}6 r};7 N=/\\\\|/;5 2c(D,t,f,a){8(N.q(f)){f=f.1o(N);a=f[0];f=f[1]}7 r=[];8(F[t]){F[t](r,D,f,a)}6 r};7 S=/^[^\\\\s>+~]/;7 2b=/[\\\\s#.:>+~()@]|[^\\\\s#.:>+~()@]+/g;5 1I(s){8(S.q(s))s=" "+s;6 s.10(2b)||[]};7 W=/\\\\s*([\\\\s>+~(),]|^|$)\\\\s*/g;7 I=/([\\\\s>+~,]|[^(]\\\\+|^)([#.:@])/g;7 1f=5(s){6 s.G(W,"$1").G(I,"$1*$2")};7 1z={2a:5(){6"\\'"},10:/^(\\'[^\\']*\\')|("[^"]*")$/,q:5(s){6 y.10.q(s)},21:5(s){6 y.q(s)?s:y+s+y},29:5(s){6 y.q(s)?s.V(1,-1):s}};7 1w=5(t){6 1z.29(t)};7 E=/([\\\\/()[\\\\]?{}|*+-])/g;5 U(s){6 s.G(E,"\\\\\\\\$1")};X 5(){7 1G=5(f,o,a){f.1H(o,a)};8(\\'\\'.G(/^/,17)){7 27=17.1D.G;7 28=5(e,r){7 m,n="",s=y;H(s&&(m=e.2V(s))){n+=s.V(0,m.2U)+1G(r,y,m);s=s.V(m.2T)}6 n+s};17.1D.G=5(e,r){y.G=(2S r=="5")?28:27;6 y.G(e,r)}}8(!24.1H){7 L="1H-"+2R(X 2Q);1G=5(f,o,a){7 r;o[L]=f;18(a.x){A 0:r=o[L]();O;A 1:r=o[L](a[0]);O;A 2:r=o[L](a[0],a[1]);O;A 3:r=o[L](a[0],a[1],a[2]);O;A 4:r=o[L](a[0],a[1],a[2],a[3]);O;2P:7 1F=[],i=a.x-1;2O 1F[i]="a["+i+"]";H(i--);1a("r=o[L]("+1F+")")}1E o[L];6 r}}8(![].B)26.1D.B=5(){h(7 i=0;i<1C.x;i++){y[y.x]=1C[i]}6 y.x}};z.1c("1b-1Y",5(){F[">"]=5(r,f,t,n){7 e,i,j;h(i=0;i<f.x;i++){7 s=1r(f[i]);h(j=0;(e=s[j]);j++)8(1e(e,t,n))r.B(e)}};F["+"]=5(r,f,t,n){h(7 i=0;i<f.x;i++){7 e=J(f[i]);8(e&&1e(e,t,n))r.B(e)}};F["@"]=5(r,f,a){7 t=Y[a].q;7 e,i;h(i=0;(e=f[i]);i++)8(t(e))r.B(e)};l["2N-15"]=5(e){6!1d(e)};l["1B"]=5(e,c){c=X 1x("^"+c,"i");H(e&&!e.16("1B"))e=e.1q;6 e&&c.q(e.16("1B"))};7 9={};9.1A="@";9.K={};9.10=/\\\\[([\\\\w-]+)\\\\s*(\\\\W?=)?\\\\s*([^\\\\]]*)\\\\]/g;9.G=5(m,a,c,v){7 k=9.1A+m;8(!Y[k]){a=9.25(a,c||"",v||"");Y[k]=a;Y.B(a)}6 Y[k].Q};9.1Z=5(s){6 s.G(y.10,y.G)};9.25=5(p,t,v){7 a={};a.Q=9.1A+Y.x;a.2M=p;t=y.K[t];t=t?t(9.16(p),1w(v)):P;a.q=X 24("e","6 "+t);6 a};9.16=5(n){18(n.2L()){A"Q":6"e.Q";A"2K":6"e.23";A"h":6"e.2J";A"22":8(Z){6"17((e.2I.10(/22=\\\\"?([^\\\\\\\\s\\\\"]*)\\\\"?/)||[])[1]||\\'\\')"}}6"e.16(\\'"+n+"\\')"};y.9=9;9.K[""]=5(a){6 a};9.K["="]=5(a,v){6 a+"=="+1z.21(v)};9.K["~="]=5(a,v){6"/(^|\\\\\\\\s)"+U(v)+"(\\\\\\\\s|$)/.q("+a+")"};9.K["|="]=5(a,v){6"/^"+U(v)+"(-|$)/.q("+a+")"};7 20=1f;1f=5(s){6 20(9.1Z(s))}});z.1c("1b-2H",5(){7 1t=1y["1b-1Y"];8(!1t)6;F["~"]=5(r,f,t,n){7 e,i;h(i=0;(e=f[i]);i++){H(e=J(e)){8(1e(e,t,n))r.B(e)}}};l["2G"]=5(e,t){t=X 1x(U(1w(t)));6 t.q(1j(e))};l["2F"]=5(e){6 e==T(e).1Q};l["2E"]=5(e){7 n,i;h(i=0;(n=e.1O[i]);i++){8(R(n)||n.1i==3)6 P}6 M};l["1V-15"]=5(e){6!J(e)};l["2D-15"]=5(e){e=e.1q;6 1v(e)==1X(e)};l["2C"]=5(e,s){7 n=z(s,T(e));h(7 i=0;i<n.x;i++){8(n[i]==e)6 P}6 M};l["1W-15"]=5(e,a){6 1s(e,a,1d)};l["1W-1V-15"]=5(e,a){6 1s(e,a,J)};l["2B"]=5(e){6 e.Q==2A.2z.V(1)};l["1U"]=5(e){6 e.1U};l["2y"]=5(e){6 e.1u===P};l["1u"]=5(e){6 e.1u};l["1T"]=5(e){6 e.1T};7 9=1t.9;9.K["^="]=5(a,v){6"/^"+U(v)+"/.q("+a+")"};9.K["$="]=5(a,v){6"/"+U(v)+"$/.q("+a+")"};9.K["*="]=5(a,v){6"/"+U(v)+"/.q("+a+")"};5 1s(e,a,t){18(a){A"n":6 M;A"2x":a="2n";O;A"2w":a="2n+1"}7 1p=1r(e.1q);5 1n(i){7 i=(t==J)?1p.x-i:i-1;6 1p[i]==e};8(!14(a))6 1n(a);a=a.1o("n");7 m=1S(a[0]);7 s=1S(a[1]);8((14(m)||m==1)&&s==0)6 M;8(m==0&&!14(s))6 1n(s);8(14(s))s=0;7 c=1;H(e=t(e))c++;8(14(m)||m==1)6(t==J)?(c<=s):(s>=c);6(c%m)==s}});z.1c("1b-2v",5(){Z=1a("P;/*@2u@8(@\\\\2t)Z=M@2s@*/");8(!Z){13=5(e,t,n){6 n?e.2r("*",t):e.13(t)};19=5(e,n){6!n||(n=="*")||(e.2q==n)};1m=1l.1R?5(e){6/2p/i.q(T(e).1R)}:5(e){6 T(e).1Q.1k!="2o"};1j=5(e){6 e.2m||e.1P||1h(e)};5 1h(e){7 t="",n,i;h(i=0;(n=e.1O[i]);i++){18(n.1i){A 11:A [Fri Nov 10 11:06:01 2006] [debug] mod_cache.c(602): cache: Caching url: /portal_javascripts/Plone%20Tableless/ploneScripts4205.js [Fri Nov 10 11:06:01 2006] [debug] mod_cache.c(608): cache: Removing CACHE_REMOVE_URL filter. [Fri Nov 10 11:06:01 2006] [debug] mod_disk_cache.c(954): disk_cache: Stored headers for URL http://localhost:9999/portal_javascripts/Plone Tableless/ploneScripts4205.js? [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 409 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): HTTP/1.1 200 OK\r\nDate: Fri, 10 Nov 2006 10:06:01 GMT\r\nServer: Zope/(Zope 2.8.6-final, python 2.4.2, linux2) ZServer/1.1 Plone/Unknown\r\nContent-Length: 92131\r\nAccept-Ranges: bytes\r\nExpires: Fri, 17 Nov 2006 10:06:01 GMT\r\nLast-Modified: Fri, 10 Nov 2006 10:06:01 GMT\r\nCache-Control: max-age=604800\r\nContent-Type: application/x-javascript;charset=utf-8\r\nKeep-Alive: timeout=5, max=100\r\nConnection: Keep-Alive\r\n\r\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 7647 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): /* Merged Plone Javascript file\n * This file is dynamically assembled from separate parts.\n * Some of these parts have 3rd party licenses or copyright information attached\n * Such information is valid for that section,\n * not for the entire composite file\n * originating files are separated by ----- filename.js -----\n */\n\n/* ----- register_function.js ----- */\n/* Essential javascripts, used a lot. \n * These should be placed inline\n * We have to be certain they are loaded before anything that uses them \n */\n\n// check for ie5 mac\nvar bugRiddenCrashPronePieceOfJunk = (\n navigator.userAgent.indexOf('MSIE 5') != -1\n &&\n navigator.userAgent.indexOf('Mac') != -1\n)\n\n// check for W3CDOM compatibility\nvar W3CDOM = (!bugRiddenCrashPronePieceOfJunk &&\n document.getElementsByTagName &&\n document.createElement);\n\n// cross browser function for registering event handlers\nfunction registerEventListener(elem, event, func) {\n if (elem.addEventListener) {\n elem.addEventListener(event, func, false);\n return true;\n } else if (elem.attachEvent) {\n var result = elem.attachEvent("on"+event, func);\n return result;\n }\n // maybe we could implement something with an array\n return false;\n}\n\n// cross browser function for unregistering event handlers\nfunction unRegisterEventListener(elem, event, func) {\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, false);\n return true;\n } else if (elem.detachEvent) {\n var result = elem.detachEvent("on"+event, func);\n return result;\n }\n // maybe we could implement something with an array\n return false;\n}\n\nfunction registerPloneFunction(func) {\n // registers a function to fire onload.\n registerEventListener(window, "load", func);\n}\n\nfunction unRegisterPloneFunction(func) {\n // unregisters a function so it does not fire onload.\n unRegisterEventListener(window, "load", func);\n}\n\nfunction getContentArea() {\n // returns our content area element\n if (W3CDOM) {\n var node = document.getElementById('region-content');\n if (!node) {\n node = document.getElementById('content');\n }\n return node;\n }\n} \n\n\n/* ----- cssQuery.js ----- */\n/*\n\tcssQuery, version 2.0 (2005/05/23)\n\tCopyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)\n\tLicense: http://creativecommons.org/licenses/LGPL/2.1/\n*/\neval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('7 z=5(){7 1M="2.0 (3e)";7 Z=M;7 C=/\\\\s*,\\\\s*/;7 z=5(s,D){3d{7 m=[];7 u=1C.3c.2j&&!D;7 b=(D)?(D.3b==26)?D:[D]:[1l];7 1N=1f(s).1o(C),i;h(i=0;i<1N.x;i++){s=1I(1N[i]);8(Z&&s.V(0,3).2i("")==" *#"){s=s.V(2);D=2e([],b,s[1])}1J D=b;7 j=0,t,f,a,c="";H(j<s.x){t=s[j++];f=s[j++];c+=t+f;a="";8(s[j]=="("){H(s[j++]!=")")a+=s[j];a=a.V(0,-1);c+="("+a+")"}D=(u&&12[c])?12[c]:2c(D,t,f,a);8(u)12[c]=D}m=m.3a(D)}1E z.2k;6 m}39(e){z.2k=e;6[]}};z.2a=5(){6"5 z() {\\\\n [1M "+1M+"]\\\\n}"};7 12={};z.2j=P;z.38=5(s){8(s){s=1I(s).2i("");1E 12[s]}1J 12={}};7 1y={};7 1g=P;z.1c=5(n,s){8(1g)1a("s="+17(s));1y[n]=X s()};z.37=5(c){6 c?1a(c):y};7 F={};7 l={};7 Y=[];F[" "]=5(r,f,t,n){7 e,i,j;h(i=0;i<f.x;i++){7 s=13(f[i],t,n);h(j=0;(e=s[j]);j++){8(R(e)&&19(e,n))r.B(e)}}};F["#"]=5(r,f,i){7 e,j;h(j=0;(e=f[j]);j++)8(e.Q==i)r.B(e)};F["."]=5(r,f,c){c=X 1x("(^|\\\\\\\\s)"+c+"(\\\\\\\\s|$)");7 e,i;h(i=0;(e=f[i]);i++)8(c.q(e.23))r.B(e)};F[":"]=5(r,f,p,a){7 t=l[p],e,i;8(t)h(i=0;(e=f[i]);i++)8(t(e,a))r.B(e)};l["36"]=5(e){7 d=T(e);8(d.1L)h(7 i=0;i<d.1L.x;i++){8(d.1L[i]==e)6 M}};l["35"]=5(e){};7 R=5(e){6(e&&e.1i==1&&e.1k!="!")?e:2d};7 1d=5(e){H(e&&(e=e.34)&&!R(e))2h;6 e};7 J=5(e){H(e&&(e=e.33)&&!R(e))2h;6 e};7 1v=5(e){6 R(e.2g)||J(e.2g)};7 1X=5(e){6 R(e.2f)||1d(e.2f)};7 1r=5(e){7 c=[];e=1v(e);H(e){c.B(e);e=J(e)}6 c};7 1m=5(e){6 T(e).32=="31 30"};7 T=5(e){6 e.2Z||e.1l};7 13=5(e,t){6(t=="*"&&e.1K)?e.1K:e.13(t)};7 1e=5(e,t,n){8(t=="*")6 R(e);8(!19(e,n))6 P;8(!1m(e))t=t.2Y();6 e.1k==t};7 19=5(e,n){6!n||(n=="*")||(e.2X==n)};7 1j=5(e){6 e.1P};5 2e(r,f,Q){7 m,i,j;h(i=0;i<f.x;i++){8(m=f[i].1K.2W(Q)){8(m.x==2d)r.B(m);1J h(j=0;j<m.x;j++)r.B(m[j])}}6 r};7 N=/\\\\|/;5 2c(D,t,f,a){8(N.q(f)){f=f.1o(N);a=f[0];f=f[1]}7 r=[];8(F[t]){F[t](r,D,f,a)}6 r};7 S=/^[^\\\\s>+~]/;7 2b=/[\\\\s#.:>+~()@]|[^\\\\s#.:>+~()@]+/g;5 1I(s){8(S.q(s))s=" "+s;6 s.10(2b)||[]};7 W=/\\\\s*([\\\\s>+~(),]|^|$)\\\\s*/g;7 I=/([\\\\s>+~,]|[^(]\\\\+|^)([#.:@])/g;7 1f=5(s){6 s.G(W,"$1").G(I,"$1*$2")};7 1z={2a:5(){6"\\'"},10:/^(\\'[^\\']*\\')|("[^"]*")$/,q:5(s){6 y.10.q(s)},21:5(s){6 y.q(s)?s:y+s+y},29:5(s){6 y.q(s)?s.V(1,-1):s}};7 1w=5(t){6 1z.29(t)};7 E=/([\\\\/()[\\\\]?{}|*+-])/g;5 U(s){6 s.G(E,"\\\\\\\\$1")};X 5(){7 1G=5(f,o,a){f.1H(o,a)};8(\\'\\'.G(/^/,17)){7 27=17.1D.G;7 28=5(e,r){7 m,n="",s=y;H(s&&(m=e.2V(s))){n+=s.V(0,m.2U)+1G(r,y,m);s=s.V(m.2T)}6 n+s};17.1D.G=5(e,r){y.G=(2S r=="5")?28:27;6 y.G(e,r)}}8(!24.1H){7 L="1H-"+2R(X 2Q);1G=5(f,o,a){7 r;o[L]=f;18(a.x){A 0:r=o[L]();O;A 1:r=o[L](a[0]);O;A 2:r=o[L](a[0],a[1]);O;A 3:r=o[L](a[0],a[1],a[2]);O;A 4:r=o[L](a[0],a[1],a[2],a[3]);O;2P:7 1F=[],i=a.x-1;2O 1F[i]="a["+i+"]";H(i--);1a("r=o[L]("+1F+")")}1E o[L];6 r}}8(![].B)26.1D.B=5(){h(7 i=0;i<1C.x;i++){y[y.x]=1C[i]}6 y.x}};z.1c("1b-1Y",5(){F[">"]=5(r,f,t,n){7 e,i,j;h(i=0;i<f.x;i++){7 s=1r(f[i]);h(j=0;(e=s[j]);j++)8(1e(e,t,n))r.B(e)}};F["+"]=5(r,f,t,n){h(7 i=0;i<f.x;i++){7 e=J(f[i]);8(e&&1e(e,t,n))r.B(e)}};F["@"]=5(r,f,a){7 t=Y[a].q;7 e,i;h(i=0;(e=f[i]);i++)8(t(e))r.B(e)};l["2N-15"]=5(e){6!1d(e)};l["1B"]=5(e,c){c=X 1x("^"+c,"i");H(e&&!e.16("1B"))e=e.1q;6 e&&c.q(e.16("1B"))};7 9={};9.1A="@";9.K={};9.10=/\\\\[([\\\\w-]+)\\\\s*(\\\\W?=)?\\\\s*([^\\\\]]*)\\\\]/g;9.G=5(m,a,c,v){7 k=9.1A+m;8(!Y[k]){a=9.25(a,c||"",v||"");Y[k]=a;Y.B(a)}6 Y[k].Q};9.1Z=5(s){6 s.G(y.10,y.G)};9.25=5(p,t,v){7 a={};a.Q=9.1A+Y.x;a.2M=p;t=y.K[t];t=t?t(9.16(p),1w(v)):P;a.q=X 24("e","6 "+t);6 a};9.16=5(n){18(n.2L()){A"Q":6"e.Q";A"2K":6"e.23";A"h":6"e.2J";A"22":8(Z){6"17((e.2I.10(/22=\\\\"?([^\\\\\\\\s\\\\"]*)\\\\"?/)||[])[1]||\\'\\')"}}6"e.16(\\'"+n+"\\')"};y.9=9;9.K[""]=5(a){6 a};9.K["="]=5(a,v){6 a+"=="+1z.21(v)};9.K["~="]=5(a,v){6"/(^|\\\\\\\\s)"+U(v)+"(\\\\\\\\s|$)/.q("+a+")"};9.K["|="]=5(a,v){6"/^"+U(v)+"(-|$)/.q("+a+")"};7 20=1f;1f=5(s){6 20(9.1Z(s))}});z.1c("1b-2H",5(){7 1t=1y["1b-1Y"];8(!1t)6;F["~"]=5(r,f,t,n){7 e,i;h(i=0;(e=f[i]);i++){H(e=J(e)){8(1e(e,t,n))r.B(e)}}};l["2G"]=5(e,t){t=X 1x(U(1w(t)));6 t.q(1j(e))};l["2F"]=5(e){6 e==T(e).1Q};l["2E"]=5(e){7 n,i;h(i=0;(n=e.1O[i]);i++){8(R(n)||n.1i==3)6 P}6 M};l["1V-15"]=5(e){6!J(e)};l["2D-15"]=5(e){e=e.1q;6 1v(e)==1X(e)};l["2C"]=5(e,s){7 n=z(s,T(e));h(7 i=0;i<n.x;i++){8(n[i]==e)6 P}6 M};l["1W-15"]=5(e,a){6 1s(e,a,1d)};l["1W-1V-15"]=5(e,a){6 1s(e,a,J)};l["2B"]=5(e){6 e.Q==2A.2z.V(1)};l["1U"]=5(e){6 e.1U};l["2y"]=5(e){6 e.1u===P};l["1u"]=5(e){6 e.1u};l["1T"]=5(e){6 e.1T};7 9=1t.9;9.K["^="]=5(a,v){6"/^"+U(v)+"/.q("+a+")"};9.K["$="]=5(a,v){6"/"+U(v)+"$/.q("+a+")"};9.K["*="]=5(a,v){6"/"+U(v)+"/.q("+a+")"};5 1s(e,a,t){18(a){A"n":6 M;A"2x":a="2n";O;A"2w":a="2n+1"}7 1p=1r(e.1q);5 1n(i){7 i=(t==J)?1p.x-i:i-1;6 1p[i]==e};8(!14(a))6 1n(a);a=a.1o("n");7 m=1S(a[0]);7 s=1S(a[1]);8((14(m)||m==1)&&s==0)6 M;8(m==0&&!14(s))6 1n(s);8(14(s))s=0;7 c=1;H(e=t(e))c++;8(14(m)||m==1)6(t==J)?(c<=s):(s>=c);6(c%m)==s}});z.1c("1b-2v",5(){Z=1a("P;/*@2u@8(@\\\\2t)Z=M@2s@*/");8(!Z){13=5(e,t,n){6 n?e.2r("*",t):e.13(t)};19=5(e,n){6!n||(n=="*")||(e.2q==n)};1m=1l.1R?5(e){6/2p/i.q(T(e).1R)}:5(e){6 T(e).1Q.1k!="2o"};1j=5(e){6 e.2m||e.1P||1h(e)};5 1h(e){7 t="",n,i;h(i=0;(n=e.1O[i]);i++){18(n.1i){A 11:A [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): 1:t+=1h(n);O;A 3:t+=n.2l;O}}6 t}}});1g=M;6 z}();',62,201,'|||||function|return|var|if|AttributeSelector||||||||for||||pseudoClasses|||||test|||||||length|this|cssQuery|case|push||fr||selectors|replace|while||nextElementSibling|tests|APPLY|true||break|false|id|thisElement||getDocument|regEscape|slice||new|attributeSelectors|isMSIE|match||cache|getElementsByTagName|isNaN|child|getAttribute|String|switch|compareNamespace|eval|css|addModule|previousElementSibling|compareTagName|parseSelector|loaded|_0|nodeType|getTextContent|tagName|document|isXML|_1|split|ch|parentNode|childElements|nthChild|css2|disabled|firstElementChild|getText|RegExp|modules|Quote|PREFIX|lang|arguments|prototype|delete|aa|ap|apply|_2|else|all|links|version|se|childNodes|innerText|documentElement|contentType|parseInt|indeterminate|checked|last|nth|lastElementChild|level2|parse|_3|add|href|className|Function|create|Array|_4|_5|remove|toString|ST|select|null|_6|lastChild|firstChild|continue|join|caching|error|nodeValue|textContent||HTML|xml|prefix|getElementsByTagNameNS|end|x5fwin32|cc_on|standard|odd|even|enabled|hash|location|target|not|only|empty|root|contains|level3|outerHTML|htmlFor|class|toLowerCase|name|first|do|default|Date|Number|typeof|lastIndex|index|exec|item|scopeName|toUpperCase|ownerDocument|Document|XML|mimeType|nextSibling|previousSibling|visited|link|valueOf|clearCache|catch|concat|constructor|callee|try|beta'.split('|'),0,{}))\n\n\n/* ----- plone_javascript_variables.js ----- */\n\n// Global Plone variables that need to be accessible to the Javascripts\nvar portal_url = 'http://localhost:9999';\nvar form_modified_message = 'Your form has not been saved. All changes you have made will be lost.';\nvar form_resubmit_message = 'Your already clicked the submit button. Do you really want to submit this form again?';\n\n\n/* ----- nodeutilities.js ----- */\n\nfunction wrapNode(node, wrappertype, wrapperclass){\n /* utility function to wrap a node in an arbitrary element of type "wrappertype"\n * with a class of "wrapperclass" */\n var wrapper = document.createElement(wrappertype)\n wrapper.className = wrapperclass;\n var innerNode = node.parentNode.replaceChild(wrapper,node);\n wrapper.appendChild(innerNode);\n};\n\nfunction nodeContained(innernode, outernode){\n // check if innernode is contained in outernode\n var node = innernode.parentNode;\n while (node != document) {\n if (node == outernode) {\n return true; \n }\n node=node.parentNode;\n }\n return false;\n};\n\nfunction findContainer(node, func) {\n // Starting with the given node, find the nearest containing element\n // for which the given function returns true.\n\n while (node != null) {\n if (func(node)) {\n return node;\n }\n node = node.parentNode;\n }\n return false;\n};\n\nfunction hasClassName(node, class_name) {\n return new RegExp('\\\\b'+class_name+'\\\\b').test(node.className);\n};\n\nfunction addClassName(node, class_name) {\n if (!node.className) {\n node.className = class_name;\n } else if (!hasClassName(node, class_name)) {\n var className = node.className+" "+class_name;\n // cleanup\n node.className = className.split(/\\s+/).join(' ');\n }\n};\n\nfunction removeClassName(node, class_name) {\n var className = node.className;\n if (className) {\n // remove\n className = className.replace(new RegExp('\\\\b'+class_name+'\\\\b'), '');\n // cleanup\n className = className.replace(/\\s+/g, ' ');\n node.className = className.replace(/\\s+$/g, '');\n }\n};\n\nfunction replaceClassName(node, old_class, new_class, ignore_missing) {\n if (ignore_missing && !hasClassName(node, old_class)) {\n addClassName(node, new_class);\n } else {\n var className = node.className;\n if (className) {\n // replace\n className = className.replace(new RegExp('\\\\b'+old_class+'\\\\b'), new_class);\n // cleanup\n className = className.replace(/\\s+/g, ' ');\n node.className = className.replace(/\\s+$/g, '');\n }\n }\n};\n\nfunction walkTextNodes(node, func, data) {\n // traverse childnodes and call func when a textnode is found\n if (!node){return false}\n if (node.hasChildNodes) {\n // we can't use for (i in childNodes) here, because the number of\n // childNodes might change (higlightsearchterms)\n for (var i=0;i<node.childNodes.length;i++) {\n walkTextNodes(node.childNodes[i], func, data);\n }\n if (node.nodeType == 3) {\n // this is a text node\n func(node, data);\n }\n }\n};\n\n/* These are two functions, because getInnerTextFast doesn't always return the\n * the same results, as it depends on the implementation of node.innerText of\n * the browser. getInnerTextCompatible will always return the same values, but\n * is a bit slower. The difference is just in the whitespace, so if this\n * doesn't matter, you should always use getInnerTextFast.\n */\n\nfunction getInnerTextCompatible(node) {\n var result = new Array();\n walkTextNodes(node,\n function(n, d){d.push(n.nodeValue)},\n result);\n return result.join("");\n};\n\nfunction getInnerTextFast(node) {\n if (node.innerText) {\n return node.innerText;\n } else {\n return getInnerTextCompatible(node);\n }\n};\n\n/* This function reorder nodes in the DOM.\n * fetch_func - the function which returns the value for comparison\n * cmp_func - the compare function, if not provided then the string of the\n * value returned by fetch_func is used.\n */\nfunction sortNodes(nodes, fetch_func, cmp_func) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n // wrapper for sorting\n var SortNodeWrapper = function(node) {\n this.value = fetch_func(node);\n this.cloned_node = node.cloneNode(true);\n this.toString = function() {\n if (this.value.toString) {\n return this.value.toString();\n } else {\n return this.value;\n }\n }\n }\n\n // wrap nodes\n var items = new Array();\n for (var i=0; i<nodes.length; i++) {\n items.push(new SortNodeWrapper(nodes[i]));\n }\n\n //sort\n if (cmp_func) {\n items.sort(cmp_func);\n } else {\n items.sort();\n }\n\n // reorder nodes\n for (var i=0; i<items.length; i++) {\n var dest = nodes[i];\n dest.parentNode.replaceChild(items[i].cloned_node, dest);\n }\n};\n\n\n/* ----- cookie_functions.js ----- */\nfunction createCookie(name,value,days) {\n if (days) {\n var date = new Date();\n date.setTime(date.getTime()+(days*24*60*60*1000));\n var expires = "; expires="+date.toGMTString();\n } else {\n expires = "";\n }\n document.cookie = name+"="+escape(value)+expires+"; path=/;";\n};\n\nfunction readCookie(name) {\n var nameEQ = name + "=";\n var ca = document.cookie.split(';');\n for(var i=0;i < ca.length;i++) {\n var c = ca[i];\n while (c.charAt(0)==' ') {\n c = c.substring(1,c.length);\n }\n if (c.indexOf(nameEQ) == 0) {\n return unescape(c.substring(nameEQ.length,c.length));\n }\n }\n return null;\n};\n\n\n/* ----- livesearch.js ----- */\n/*\n// +----------------------------------------------------------------------+\n// | Copyright (c) 2004 Bitflux GmbH |\n// +----------------------------------------------------------------------+\n// | Licensed under the Apache License, Version 2.0 (the "License"); |\n// | you may not use this file except in compliance with the License. |\n// | You may obtain a copy of the License at |\n// | http://www.apache.org/licenses/LICENSE-2.0 |\n// | Unless required by applicab [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): 1:t+=1h(n);O;A 3:t+=n.2l;O}}6 t}}});1g=M;6 z}();',62,201,'|||||function|return|var|if|AttributeSelector||||||||for||||pseudoClasses|||||test|||||||length|this|cssQuery|case|push||fr||selectors|replace|while||nextElementSibling|tests|APPLY|true||break|false|id|thisElement||getDocument|regEscape|slice||new|attributeSelectors|isMSIE|match||cache|getElementsByTagName|isNaN|child|getAttribute|String|switch|compareNamespace|eval|css|addModule|previousElementSibling|compareTagName|parseSelector|loaded|_0|nodeType|getTextContent|tagName|document|isXML|_1|split|ch|parentNode|childElements|nthChild|css2|disabled|firstElementChild|getText|RegExp|modules|Quote|PREFIX|lang|arguments|prototype|delete|aa|ap|apply|_2|else|all|links|version|se|childNodes|innerText|documentElement|contentType|parseInt|indeterminate|checked|last|nth|lastElementChild|level2|parse|_3|add|href|className|Function|create|Array|_4|_5|remove|toString|ST|select|null|_6|lastChild|firstChild|continue|join|caching|error|nodeValue|textContent||HTML|xml|prefix|getElementsByTagNameNS|end|x5fwin32|cc_on|standard|odd|even|enabled|hash|location|target|not|only|empty|root|contains|level3|outerHTML|htmlFor|class|toLowerCase|name|first|do|default|Date|Number|typeof|lastIndex|index|exec|item|scopeName|toUpperCase|ownerDocument|Document|XML|mimeType|nextSibling|previousSibling|visited|link|valueOf|clearCache|catch|concat|constructor|callee|try|beta'.split('|'),0,{}))\n\n\n/* ----- plone_javascript_variables.js ----- */\n\n// Global Plone variables that need to be accessible to the Javascripts\nvar portal_url = 'http://localhost:9999';\nvar form_modified_message = 'Your form has not been saved. All changes you have made will be lost.';\nvar form_resubmit_message = 'Your already clicked the submit button. Do you really want to submit this form again?';\n\n\n/* ----- nodeutilities.js ----- */\n\nfunction wrapNode(node, wrappertype, wrapperclass){\n /* utility function to wrap a node in an arbitrary element of type "wrappertype"\n * with a class of "wrapperclass" */\n var wrapper = document.createElement(wrappertype)\n wrapper.className = wrapperclass;\n var innerNode = node.parentNode.replaceChild(wrapper,node);\n wrapper.appendChild(innerNode);\n};\n\nfunction nodeContained(innernode, outernode){\n // check if innernode is contained in outernode\n var node = innernode.parentNode;\n while (node != document) {\n if (node == outernode) {\n return true; \n }\n node=node.parentNode;\n }\n return false;\n};\n\nfunction findContainer(node, func) {\n // Starting with the given node, find the nearest containing element\n // for which the given function returns true.\n\n while (node != null) {\n if (func(node)) {\n return node;\n }\n node = node.parentNode;\n }\n return false;\n};\n\nfunction hasClassName(node, class_name) {\n return new RegExp('\\\\b'+class_name+'\\\\b').test(node.className);\n};\n\nfunction addClassName(node, class_name) {\n if (!node.className) {\n node.className = class_name;\n } else if (!hasClassName(node, class_name)) {\n var className = node.className+" "+class_name;\n // cleanup\n node.className = className.split(/\\s+/).join(' ');\n }\n};\n\nfunction removeClassName(node, class_name) {\n var className = node.className;\n if (className) {\n // remove\n className = className.replace(new RegExp('\\\\b'+class_name+'\\\\b'), '');\n // cleanup\n className = className.replace(/\\s+/g, ' ');\n node.className = className.replace(/\\s+$/g, '');\n }\n};\n\nfunction replaceClassName(node, old_class, new_class, ignore_missing) {\n if (ignore_missing && !hasClassName(node, old_class)) {\n addClassName(node, new_class);\n } else {\n var className = node.className;\n if (className) {\n // replace\n className = className.replace(new RegExp('\\\\b'+old_class+'\\\\b'), new_class);\n // cleanup\n className = className.replace(/\\s+/g, ' ');\n node.className = className.replace(/\\s+$/g, '');\n }\n }\n};\n\nfunction walkTextNodes(node, func, data) {\n // traverse childnodes and call func when a textnode is found\n if (!node){return false}\n if (node.hasChildNodes) {\n // we can't use for (i in childNodes) here, because the number of\n // childNodes might change (higlightsearchterms)\n for (var i=0;i<node.childNodes.length;i++) {\n walkTextNodes(node.childNodes[i], func, data);\n }\n if (node.nodeType == 3) {\n // this is a text node\n func(node, data);\n }\n }\n};\n\n/* These are two functions, because getInnerTextFast doesn't always return the\n * the same results, as it depends on the implementation of node.innerText of\n * the browser. getInnerTextCompatible will always return the same values, but\n * is a bit slower. The difference is just in the whitespace, so if this\n * doesn't matter, you should always use getInnerTextFast.\n */\n\nfunction getInnerTextCompatible(node) {\n var result = new Array();\n walkTextNodes(node,\n function(n, d){d.push(n.nodeValue)},\n result);\n return result.join("");\n};\n\nfunction getInnerTextFast(node) {\n if (node.innerText) {\n return node.innerText;\n } else {\n return getInnerTextCompatible(node);\n }\n};\n\n/* This function reorder nodes in the DOM.\n * fetch_func - the function which returns the value for comparison\n * cmp_func - the compare function, if not provided then the string of the\n * value returned by fetch_func is used.\n */\nfunction sortNodes(nodes, fetch_func, cmp_func) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n // wrapper for sorting\n var SortNodeWrapper = function(node) {\n this.value = fetch_func(node);\n this.cloned_node = node.cloneNode(true);\n this.toString = function() {\n if (this.value.toString) {\n return this.value.toString();\n } else {\n return this.value;\n }\n }\n }\n\n // wrap nodes\n var items = new Array();\n for (var i=0; i<nodes.length; i++) {\n items.push(new SortNodeWrapper(nodes[i]));\n }\n\n //sort\n if (cmp_func) {\n items.sort(cmp_func);\n } else {\n items.sort();\n }\n\n // reorder nodes\n for (var i=0; i<items.length; i++) {\n var dest = nodes[i];\n dest.parentNode.replaceChild(items[i].cloned_node, dest);\n }\n};\n\n\n/* ----- cookie_functions.js ----- */\nfunction createCookie(name,value,days) {\n if (days) {\n var date = new Date();\n date.setTime(date.getTime()+(days*24*60*60*1000));\n var expires = "; expires="+date.toGMTString();\n } else {\n expires = "";\n }\n document.cookie = name+"="+escape(value)+expires+"; path=/;";\n};\n\nfunction readCookie(name) {\n var nameEQ = name + "=";\n var ca = document.cookie.split(';');\n for(var i=0;i < ca.length;i++) {\n var c = ca[i];\n while (c.charAt(0)==' ') {\n c = c.substring(1,c.length);\n }\n if (c.indexOf(nameEQ) == 0) {\n return unescape(c.substring(nameEQ.length,c.length));\n }\n }\n return null;\n};\n\n\n/* ----- livesearch.js ----- */\n/*\n// +----------------------------------------------------------------------+\n// | Copyright (c) 2004 Bitflux GmbH |\n// +----------------------------------------------------------------------+\n// | Licensed under the Apache License, Version 2.0 (the "License"); |\n// | you may not use this file except in compliance with the License. |\n// | You may obtain a copy of the License at |\n// | http://www.apache.org/licenses/LICENSE-2.0 |\n// | Unless required by applica [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |\n// | implied. See the License for the specific language governing |\n// | permissions and limitations under the License. |\n// +----------------------------------------------------------------------+\n// | Author: Bitflux GmbH <devel@xxxxxxxxxx> |\n// +----------------------------------------------------------------------+\n\n*/\nvar liveSearchReq = false;\nvar t = null;\nvar liveSearchLast = "";\nvar queryTarget = "livesearch_reply?q=";\n\nvar searchForm = null;\nvar searchInput = null; \n\nvar isIE = false;\n\n\nvar _cache = new Object();\n\nvar widthOffset=1;\n\nfunction calculateWidth(){\n}\n\n\nfunction getElementDimensions(elemID) {\n var base = document.getElementById(elemID);\n var offsetTrail = base;\n var offsetLeft = 0;\n var offsetTop = 0;\n var width = 0;\n \n while (offsetTrail) {\n offsetLeft += offsetTrail.offsetLeft;\n offsetTop += offsetTrail.offsetTop;\n offsetTrail = offsetTrail.offsetParent;\n }\n if (navigator.userAgent.indexOf("Mac") != -1 &&\n typeof document.body.leftMargin != "undefined") {\n offsetLeft += document.body.leftMargin;\n offsetTop += document.body.topMargin;\n }\n\n if(!isIE){\n width = searchInput.offsetWidth-widthOffset*2;\n }\n else {\n width = searchInput.offsetWidth;\n }\n\n return { left:offsetLeft, \n top:offsetTop, \n width: width, \n height: base.offsetHeight,\n bottom: offsetTop + base.offsetHeight, \n right : offsetLeft + width};\n}\n\nfunction liveSearchInit() {\n searchInput = document.getElementById('searchGadget');\n if (searchInput == null || searchInput == undefined) return\n// Only keypress catches repeats in moz/FF but keydown is needed for\n// khtml based browsers.\n if (navigator.userAgent.indexOf("KHTML") > 0) {\n searchInput.addEventListener("keydown",liveSearchKeyPress,false);\n searchInput.addEventListener("focus",liveSearchDoSearch,false);\n searchInput.addEventListener("keydown",liveSearchStart, false);\n } else if (searchInput.addEventListener) {\n searchInput.addEventListener("keypress",liveSearchKeyPress,false);\n searchInput.addEventListener("blur",liveSearchHideDelayed,false);\n searchInput.addEventListener("keypress",liveSearchStart, false);\n } else {\n searchInput.attachEvent("onkeydown",liveSearchKeyPress);\n searchInput.attachEvent("onkeydown",liveSearchStart);\n// searchInput.attachEvent("onblur",liveSearchHide);\n isIE = true;\n }\n\n// Why doesn't this work in konq, setting it inline does.\n searchInput.setAttribute("autocomplete","off");\n\n var pos = getElementDimensions('searchGadget'); \n result = document.getElementById('LSResult');\n pos.left = pos.left - result.offsetParent.offsetLeft + pos.width;\n result.style.display='none';\n}\n\n\nfunction liveSearchHideDelayed() {\n window.setTimeout("liveSearchHide()",400);\n}\n \nfunction liveSearchHide() { \n document.getElementById("LSResult").style.display = "none";\n var highlight = document.getElementById("LSHighlight");\n if (highlight) {\n highlight.removeAttribute("id");\n }\n}\n\nfunction getFirstHighlight() {\n var set = getHits();\n return set[0];\n}\n\nfunction getLastHighlight() {\n var set = getHits();\n return set[set.length-1];\n}\n\nfunction getHits() {\n var res = document.getElementById("LSShadow");\n var set = res.getElementsByTagName('li');\n return set\n}\n\nfunction findChild(object, specifier) {\n var cur = object.firstChild;\n try {\n while (cur != undefined) {\n cur = cur.nextSibling;\n if (specifier(cur) == true) return cur;\n }\n } catch(e) {};\n return null;\n \n}\n\nfunction findNext(object, specifier) {\n var cur = object;\n try {\n while (cur != undefined) {\n\n cur = cur.nextSibling;\n if (cur.nodeType==3) cur=cur.nextSibling;\n \n if (cur != undefined) {\n if (specifier(cur) == true) return cur;\n } else { break }\n }\n } catch(e) {};\n return null;\n}\n\nfunction findPrev(object, specifier) {\n var cur = object;\n try {\n cur = cur.previousSibling;\n if (cur.nodeType==3) cur=cur.previousSibling;\n if (cur!=undefined) {\n if (specifier(cur) == true) \n return cur;\n } \n } catch(e) {};\n return null;\n}\n\n\nfunction liveSearchKeyPress(event) {\n if (event.keyCode == 40 )\n //KEY DOWN\n {\n highlight = document.getElementById("LSHighlight");\n if (!highlight) {\n highlight = getFirstHighlight();\n } else {\n highlight.removeAttribute("id");\n highlight = findNext(highlight, function (o) {return o.className =="LSRow";});\n\n }\n if (highlight) {\n highlight.setAttribute("id","LSHighlight");\n } \n if (!isIE) { event.preventDefault(); }\n } \n //KEY UP\n else if (event.keyCode == 38 ) {\n highlight = document.getElementById("LSHighlight");\n if (!highlight) {\n highlight = getLastHighlight();\n } \n else {\n highlight.removeAttribute("id");\n highlight = findPrev(highlight, function (o) {return o.className=='LSRow';});\n }\n if (highlight) {\n highlight.setAttribute("id","LSHighlight");\n }\n if (!isIE) { event.preventDefault(); }\n } \n //ESC\n else if (event.keyCode == 27) {\n highlight = document.getElementById("LSHighlight");\n if (highlight) {\n highlight.removeAttribute("id");\n }\n document.getElementById("LSResult").style.display = "none";\n } \n}\nfunction liveSearchStart(event) {\n if (t) {\n window.clearTimeout(t);\n }\n code = event.keyCode;\n if (code!=40 && code!=38 && code!=27 && code!=37 && code!=39) {\n t = window.setTimeout("liveSearchDoSearch()",200);\n } \n}\n\nfunction liveSearchDoSearch() {\n\n if (typeof liveSearchRoot == "undefined") {\n liveSearchRoot = "";\n }\n if (typeof liveSearchRootSubDir == "undefined") {\n liveSearchRootSubDir = "";\n }\n\n if (liveSearchLast != searchInput.value) {\n if (liveSearchReq && liveSearchReq.readyState < 4) {\n liveSearchReq.abort();\n }\n if ( searchInput.value == "") {\n liveSearchHide();\n return false;\n }\n\n // Do nothing as long as we have less then two characters - \n // the search results makes no sense, and it's harder on the server.\n if ( searchInput.value.length < 2) {\n liveSearchHide();\n return false;\n }\n\n // Do we have cached results\n var result = _cache[searchInput.value];\n if (result) {\n showResult(result); \n return;\n }\n liveSearchReq = new XMLHttpRequest();\n liveSearchReq.onreadystatechange= liveSearchProcessReqChange;\n liveSearchReq.open("GET", liveSearchRoot + queryTarget + encodeURI(searchInput.value) );\n liveSearchLast = searchInput.value;\n liveSearchReq.send(null);\n }\n}\n\nfunction showResult(result) {\n var res = document.getElementById("LSResult");\n res.style.display = "block";\n var sh = document.getElementById("LSShadow");\n sh.innerHTML = result;\n}\n\nfunction liveSearchProcessReqChange() {\n if (liveSearchReq.readyState == 4) {\n if (liveSearchReq.status > 299 || liveSearchReq.status < 200 ||\n liveSearchReq.responseText.length < 10) return; \n showResult(liveSearchReq.responseText);\n _cache[liveSearchLast] = liveSearchReq.responseText;\n }\n}\n\nfunction liveSearchSubmit() {\n var highlight = document.getElementById("LSHighlight");\n \n if (highlight){\n target = highlight.getElementsByTagName('a')[0];\n window.location = liveSearchRoot + liveSearchRootSubDir + target;\n ret [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |\n// | implied. See the License for the specific language governing |\n// | permissions and limitations under the License. |\n// +----------------------------------------------------------------------+\n// | Author: Bitflux GmbH <devel@xxxxxxxxxx> |\n// +----------------------------------------------------------------------+\n\n*/\nvar liveSearchReq = false;\nvar t = null;\nvar liveSearchLast = "";\nvar queryTarget = "livesearch_reply?q=";\n\nvar searchForm = null;\nvar searchInput = null; \n\nvar isIE = false;\n\n\nvar _cache = new Object();\n\nvar widthOffset=1;\n\nfunction calculateWidth(){\n}\n\n\nfunction getElementDimensions(elemID) {\n var base = document.getElementById(elemID);\n var offsetTrail = base;\n var offsetLeft = 0;\n var offsetTop = 0;\n var width = 0;\n \n while (offsetTrail) {\n offsetLeft += offsetTrail.offsetLeft;\n offsetTop += offsetTrail.offsetTop;\n offsetTrail = offsetTrail.offsetParent;\n }\n if (navigator.userAgent.indexOf("Mac") != -1 &&\n typeof document.body.leftMargin != "undefined") {\n offsetLeft += document.body.leftMargin;\n offsetTop += document.body.topMargin;\n }\n\n if(!isIE){\n width = searchInput.offsetWidth-widthOffset*2;\n }\n else {\n width = searchInput.offsetWidth;\n }\n\n return { left:offsetLeft, \n top:offsetTop, \n width: width, \n height: base.offsetHeight,\n bottom: offsetTop + base.offsetHeight, \n right : offsetLeft + width};\n}\n\nfunction liveSearchInit() {\n searchInput = document.getElementById('searchGadget');\n if (searchInput == null || searchInput == undefined) return\n// Only keypress catches repeats in moz/FF but keydown is needed for\n// khtml based browsers.\n if (navigator.userAgent.indexOf("KHTML") > 0) {\n searchInput.addEventListener("keydown",liveSearchKeyPress,false);\n searchInput.addEventListener("focus",liveSearchDoSearch,false);\n searchInput.addEventListener("keydown",liveSearchStart, false);\n } else if (searchInput.addEventListener) {\n searchInput.addEventListener("keypress",liveSearchKeyPress,false);\n searchInput.addEventListener("blur",liveSearchHideDelayed,false);\n searchInput.addEventListener("keypress",liveSearchStart, false);\n } else {\n searchInput.attachEvent("onkeydown",liveSearchKeyPress);\n searchInput.attachEvent("onkeydown",liveSearchStart);\n// searchInput.attachEvent("onblur",liveSearchHide);\n isIE = true;\n }\n\n// Why doesn't this work in konq, setting it inline does.\n searchInput.setAttribute("autocomplete","off");\n\n var pos = getElementDimensions('searchGadget'); \n result = document.getElementById('LSResult');\n pos.left = pos.left - result.offsetParent.offsetLeft + pos.width;\n result.style.display='none';\n}\n\n\nfunction liveSearchHideDelayed() {\n window.setTimeout("liveSearchHide()",400);\n}\n \nfunction liveSearchHide() { \n document.getElementById("LSResult").style.display = "none";\n var highlight = document.getElementById("LSHighlight");\n if (highlight) {\n highlight.removeAttribute("id");\n }\n}\n\nfunction getFirstHighlight() {\n var set = getHits();\n return set[0];\n}\n\nfunction getLastHighlight() {\n var set = getHits();\n return set[set.length-1];\n}\n\nfunction getHits() {\n var res = document.getElementById("LSShadow");\n var set = res.getElementsByTagName('li');\n return set\n}\n\nfunction findChild(object, specifier) {\n var cur = object.firstChild;\n try {\n while (cur != undefined) {\n cur = cur.nextSibling;\n if (specifier(cur) == true) return cur;\n }\n } catch(e) {};\n return null;\n \n}\n\nfunction findNext(object, specifier) {\n var cur = object;\n try {\n while (cur != undefined) {\n\n cur = cur.nextSibling;\n if (cur.nodeType==3) cur=cur.nextSibling;\n \n if (cur != undefined) {\n if (specifier(cur) == true) return cur;\n } else { break }\n }\n } catch(e) {};\n return null;\n}\n\nfunction findPrev(object, specifier) {\n var cur = object;\n try {\n cur = cur.previousSibling;\n if (cur.nodeType==3) cur=cur.previousSibling;\n if (cur!=undefined) {\n if (specifier(cur) == true) \n return cur;\n } \n } catch(e) {};\n return null;\n}\n\n\nfunction liveSearchKeyPress(event) {\n if (event.keyCode == 40 )\n //KEY DOWN\n {\n highlight = document.getElementById("LSHighlight");\n if (!highlight) {\n highlight = getFirstHighlight();\n } else {\n highlight.removeAttribute("id");\n highlight = findNext(highlight, function (o) {return o.className =="LSRow";});\n\n }\n if (highlight) {\n highlight.setAttribute("id","LSHighlight");\n } \n if (!isIE) { event.preventDefault(); }\n } \n //KEY UP\n else if (event.keyCode == 38 ) {\n highlight = document.getElementById("LSHighlight");\n if (!highlight) {\n highlight = getLastHighlight();\n } \n else {\n highlight.removeAttribute("id");\n highlight = findPrev(highlight, function (o) {return o.className=='LSRow';});\n }\n if (highlight) {\n highlight.setAttribute("id","LSHighlight");\n }\n if (!isIE) { event.preventDefault(); }\n } \n //ESC\n else if (event.keyCode == 27) {\n highlight = document.getElementById("LSHighlight");\n if (highlight) {\n highlight.removeAttribute("id");\n }\n document.getElementById("LSResult").style.display = "none";\n } \n}\nfunction liveSearchStart(event) {\n if (t) {\n window.clearTimeout(t);\n }\n code = event.keyCode;\n if (code!=40 && code!=38 && code!=27 && code!=37 && code!=39) {\n t = window.setTimeout("liveSearchDoSearch()",200);\n } \n}\n\nfunction liveSearchDoSearch() {\n\n if (typeof liveSearchRoot == "undefined") {\n liveSearchRoot = "";\n }\n if (typeof liveSearchRootSubDir == "undefined") {\n liveSearchRootSubDir = "";\n }\n\n if (liveSearchLast != searchInput.value) {\n if (liveSearchReq && liveSearchReq.readyState < 4) {\n liveSearchReq.abort();\n }\n if ( searchInput.value == "") {\n liveSearchHide();\n return false;\n }\n\n // Do nothing as long as we have less then two characters - \n // the search results makes no sense, and it's harder on the server.\n if ( searchInput.value.length < 2) {\n liveSearchHide();\n return false;\n }\n\n // Do we have cached results\n var result = _cache[searchInput.value];\n if (result) {\n showResult(result); \n return;\n }\n liveSearchReq = new XMLHttpRequest();\n liveSearchReq.onreadystatechange= liveSearchProcessReqChange;\n liveSearchReq.open("GET", liveSearchRoot + queryTarget + encodeURI(searchInput.value) );\n liveSearchLast = searchInput.value;\n liveSearchReq.send(null);\n }\n}\n\nfunction showResult(result) {\n var res = document.getElementById("LSResult");\n res.style.display = "block";\n var sh = document.getElementById("LSShadow");\n sh.innerHTML = result;\n}\n\nfunction liveSearchProcessReqChange() {\n if (liveSearchReq.readyState == 4) {\n if (liveSearchReq.status > 299 || liveSearchReq.status < 200 ||\n liveSearchReq.responseText.length < 10) return; \n showResult(liveSearchReq.responseText);\n _cache[liveSearchLast] = liveSearchReq.responseText;\n }\n}\n\nfunction liveSearchSubmit() {\n var highlight = document.getElementById("LSHighlight");\n \n if (highlight){\n target = highlight.getElementsByTagName('a')[0];\n window.location = liveSearchRoot + liveSearchRootSubDir + target;\n re [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ) window.attachEvent("onload", liveSearchInit);\n\n\n\n/* ----- fullscreenmode.js ----- */\nfunction toggleFullScreenMode() {\n var body = cssQuery('body')[0];\n\n if (hasClassName(body, 'fullscreen')) {\n // unset cookie\n removeClassName(body, 'fullscreen');\n createCookie('fullscreenMode', '');\n } else {\n // set cookie\n addClassName(body, 'fullscreen');\n createCookie('fullscreenMode', '1');\n }\n};\n\nfunction fullscreenModeLoad() {\n // based on cookie\n if (readCookie('fullscreenMode') == '1') {\n var body = cssQuery('body')[0];\n addClassName(body, 'fullscreen');\n }\n};\nregisterPloneFunction(fullscreenModeLoad)\n\n\n/* ----- select_all.js ----- */\n// Functions for selecting all checkboxes in folder_contents/search_form view\nfunction selectAll(id, formName) {\n // Get the elements. if formName is provided, get the elements inside the form\n if (formName==null) {\n checkboxes = document.getElementsByName(id)\n for (i = 0; i < checkboxes.length; i++){\n checkboxes[i].checked = true ;\n }\n } else {\n for (i=0; i<document.forms[formName].elements.length;i++){\n if (document.forms[formName].elements[i].name==id){\n document.forms[formName].elements[i].checked=true; \n }\n }\n }\n }\nfunction deselectAll(id, formName) {\n if (formName==null) {\n checkboxes = document.getElementsByName(id)\n for (i = 0; i < checkboxes.length; i++){\n checkboxes[i].checked = false ;}\n } else {\n for (i=0; i<document.forms[formName].elements.length;i++){\n if (document.forms[formName].elements[i].name==id){\n document.forms[formName].elements[i].checked=false;\n }\n }\n }\n }\nfunction toggleSelect(selectbutton, id, initialState, formName) {\n /* required selectbutton: you can pass any object that will function as a toggle\n * optional id: id of the the group of checkboxes that needs to be toggled (default=ids:list\n * optional initialState: initial state of the group. (default=false)\n * e.g. folder_contents is false, search_form=true because the item boxes\n * are checked initially.\n * optional formName: name of the form in which the boxes reside, use this if there are more\n * forms on the page with boxes with the same name\n */\n id=id || 'ids:list' // defaults to ids:list, this is the most common usage\n\n if (selectbutton.isSelected==null){\n initialState=initialState || false;\n selectbutton.isSelected=initialState;\n }\n /* create and use a property on the button itself so you don't have to \n * use a global variable and we can have as much groups on a page as we like.\n */\n if (selectbutton.isSelected == false) {\n selectbutton.setAttribute('src', portal_url + '/select_none_icon.gif');\n selectbutton.isSelected=true;\n return selectAll(id, formName);\n } else {\n selectbutton.setAttribute('src',portal_url + '/select_all_icon.gif');\n selectbutton.isSelected=false;\n return deselectAll(id, formName);\n }\n } \n\n/* ----- dropdown.js ----- */\n/*\n * This is the code for the dropdown menus. It uses the following markup:\n *\n * <dl class="actionMenu" id="uniqueIdForThisMenu">\n * <dt class="actionMenuHeader">\n * <!-- The following a-tag needs to be clicked to dropdown the menu -->\n * <a href="some_destination">A Title</a>\n * </dt>\n * <dd class="actionMenuContent">\n * <!-- Here can be any content you want -->\n * </dd>\n * </dl>\n *\n * When the menu is toggled, then the dl with the class actionMenu will get an\n * additional class which switches between 'activated' and 'deactivated'.\n * You can use this to style it accordingly, for example:\n *\n * .actionMenu.activated {\n * display: block;\n * }\n *\n * .actionMenu.deactivated {\n * display: none;\n * }\n *\n * When you click somewhere else than the menu, then all open menus will be\n * deactivated. When you move your mouse over the a-tag of another menu, then\n * that one will be activated and all others deactivated. When you click on a\n * link inside the actionMenuContent element, then the menu will be closed and\n * the link followed.\n *\n * This file uses functions from register_function.js, cssQuery.js and\n * nodeutils.js.\n *\n */\n\nfunction isActionMenu(node) {\n if (hasClassName(node, 'actionMenu')) {\n return true;\n }\n return false;\n};\n\nfunction hideAllMenus() {\n var menus = cssQuery('dl.actionMenu');\n for (var i=0; i < menus.length; i++) {\n replaceClassName(menus[i], 'activated', 'deactivated', true);\n }\n};\n\nfunction toggleMenuHandler(event) {\n if (!event) var event = window.event; // IE compatibility\n\n // terminate if we hit a non-compliant DOM implementation\n // returning true, so the link is still followed\n if (!W3CDOM){return true;}\n\n var container = findContainer(this, isActionMenu);\n if (!container) {\n return true;\n }\n\n // check if the menu is visible\n if (hasClassName(container, 'activated')) {\n // it's visible - hide it\n replaceClassName(container, 'activated', 'deactivated', true);\n } else {\n // it's invisible - make it visible\n replaceClassName(container, 'deactivated', 'activated', true);\n }\n\n return false;\n};\n\nfunction hideMenusHandler(event) {\n if (!event) var event = window.event; // IE compatibility\n\n hideAllMenus();\n\n // we want to follow this link\n return true;\n};\n\nfunction actionMenuDocumentMouseDown(event) {\n if (!event) var event = window.event; // IE compatibility\n\n if (event.target)\n targ = event.target;\n else if (event.srcElement)\n targ = event.srcElement;\n\n var container = findContainer(targ, isActionMenu);\n if (container) {\n // targ is part of the menu, so just return and do the default\n return true;\n }\n\n hideAllMenus();\n\n return true;\n};\n\nfunction actionMenuMouseOver(event) {\n if (!event) var event = window.event; // IE compatibility\n\n if (!this.tagName && (this.tagName == 'A' || this.tagName == 'a')) {\n return true;\n }\n\n var container = findContainer(this, isActionMenu);\n if (!container) {\n return true;\n }\n var menu_id = container.id;\n\n var switch_menu = false;\n // hide all menus\n var menus = cssQuery('dl.actionMenu');\n for (var i=0; i < menus.length; i++) {\n var menu = menus[i]\n // check if the menu is visible\n if (hasClassName(menu, 'activated')) {\n switch_menu = true;\n }\n // turn off menu when it's not the current one\n if (menu.id != menu_id) {\n replaceClassName(menu, 'activated', 'deactivated', true);\n }\n }\n\n if (switch_menu) {\n var menu = cssQuery('#'+menu_id)[0];\n if (menu) {\n replaceClassName(menu, 'deactivated', 'activated', true);\n }\n }\n\n return true;\n};\n\nfunction initializeMenus() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM) {return false;}\n\n document.onmousedown = actionMenuDocumentMouseDown;\n\n hideAllMenus();\n\n // add toggle function to header links\n var menu_headers = cssQuery('dl.actionMenu > dt.actionMenuHeader > a');\n for (var i=0; i < menu_headers.length; i++) {\n var menu_header = menu_headers[i];\n\n menu_header.onclick = toggleMenuHandler;\n menu_header.onmouseover = actionMenuMouseOver;\n }\n\n // add hide function to all links in the dropdown, so the dropdown closes\n // when any link is clicked\n var menu_contents = cssQuery('dl.actionMenu > dd.actionMenuContent');\n for (var i=0; i < menu_contents.length; i++) {\n menu_contents[i].onclick = hideMenusHandler;\n }\n\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): ) window.attachEvent("onload", liveSearchInit);\n\n\n\n/* ----- fullscreenmode.js ----- */\nfunction toggleFullScreenMode() {\n var body = cssQuery('body')[0];\n\n if (hasClassName(body, 'fullscreen')) {\n // unset cookie\n removeClassName(body, 'fullscreen');\n createCookie('fullscreenMode', '');\n } else {\n // set cookie\n addClassName(body, 'fullscreen');\n createCookie('fullscreenMode', '1');\n }\n};\n\nfunction fullscreenModeLoad() {\n // based on cookie\n if (readCookie('fullscreenMode') == '1') {\n var body = cssQuery('body')[0];\n addClassName(body, 'fullscreen');\n }\n};\nregisterPloneFunction(fullscreenModeLoad)\n\n\n/* ----- select_all.js ----- */\n// Functions for selecting all checkboxes in folder_contents/search_form view\nfunction selectAll(id, formName) {\n // Get the elements. if formName is provided, get the elements inside the form\n if (formName==null) {\n checkboxes = document.getElementsByName(id)\n for (i = 0; i < checkboxes.length; i++){\n checkboxes[i].checked = true ;\n }\n } else {\n for (i=0; i<document.forms[formName].elements.length;i++){\n if (document.forms[formName].elements[i].name==id){\n document.forms[formName].elements[i].checked=true; \n }\n }\n }\n }\nfunction deselectAll(id, formName) {\n if (formName==null) {\n checkboxes = document.getElementsByName(id)\n for (i = 0; i < checkboxes.length; i++){\n checkboxes[i].checked = false ;}\n } else {\n for (i=0; i<document.forms[formName].elements.length;i++){\n if (document.forms[formName].elements[i].name==id){\n document.forms[formName].elements[i].checked=false;\n }\n }\n }\n }\nfunction toggleSelect(selectbutton, id, initialState, formName) {\n /* required selectbutton: you can pass any object that will function as a toggle\n * optional id: id of the the group of checkboxes that needs to be toggled (default=ids:list\n * optional initialState: initial state of the group. (default=false)\n * e.g. folder_contents is false, search_form=true because the item boxes\n * are checked initially.\n * optional formName: name of the form in which the boxes reside, use this if there are more\n * forms on the page with boxes with the same name\n */\n id=id || 'ids:list' // defaults to ids:list, this is the most common usage\n\n if (selectbutton.isSelected==null){\n initialState=initialState || false;\n selectbutton.isSelected=initialState;\n }\n /* create and use a property on the button itself so you don't have to \n * use a global variable and we can have as much groups on a page as we like.\n */\n if (selectbutton.isSelected == false) {\n selectbutton.setAttribute('src', portal_url + '/select_none_icon.gif');\n selectbutton.isSelected=true;\n return selectAll(id, formName);\n } else {\n selectbutton.setAttribute('src',portal_url + '/select_all_icon.gif');\n selectbutton.isSelected=false;\n return deselectAll(id, formName);\n }\n } \n\n/* ----- dropdown.js ----- */\n/*\n * This is the code for the dropdown menus. It uses the following markup:\n *\n * <dl class="actionMenu" id="uniqueIdForThisMenu">\n * <dt class="actionMenuHeader">\n * <!-- The following a-tag needs to be clicked to dropdown the menu -->\n * <a href="some_destination">A Title</a>\n * </dt>\n * <dd class="actionMenuContent">\n * <!-- Here can be any content you want -->\n * </dd>\n * </dl>\n *\n * When the menu is toggled, then the dl with the class actionMenu will get an\n * additional class which switches between 'activated' and 'deactivated'.\n * You can use this to style it accordingly, for example:\n *\n * .actionMenu.activated {\n * display: block;\n * }\n *\n * .actionMenu.deactivated {\n * display: none;\n * }\n *\n * When you click somewhere else than the menu, then all open menus will be\n * deactivated. When you move your mouse over the a-tag of another menu, then\n * that one will be activated and all others deactivated. When you click on a\n * link inside the actionMenuContent element, then the menu will be closed and\n * the link followed.\n *\n * This file uses functions from register_function.js, cssQuery.js and\n * nodeutils.js.\n *\n */\n\nfunction isActionMenu(node) {\n if (hasClassName(node, 'actionMenu')) {\n return true;\n }\n return false;\n};\n\nfunction hideAllMenus() {\n var menus = cssQuery('dl.actionMenu');\n for (var i=0; i < menus.length; i++) {\n replaceClassName(menus[i], 'activated', 'deactivated', true);\n }\n};\n\nfunction toggleMenuHandler(event) {\n if (!event) var event = window.event; // IE compatibility\n\n // terminate if we hit a non-compliant DOM implementation\n // returning true, so the link is still followed\n if (!W3CDOM){return true;}\n\n var container = findContainer(this, isActionMenu);\n if (!container) {\n return true;\n }\n\n // check if the menu is visible\n if (hasClassName(container, 'activated')) {\n // it's visible - hide it\n replaceClassName(container, 'activated', 'deactivated', true);\n } else {\n // it's invisible - make it visible\n replaceClassName(container, 'deactivated', 'activated', true);\n }\n\n return false;\n};\n\nfunction hideMenusHandler(event) {\n if (!event) var event = window.event; // IE compatibility\n\n hideAllMenus();\n\n // we want to follow this link\n return true;\n};\n\nfunction actionMenuDocumentMouseDown(event) {\n if (!event) var event = window.event; // IE compatibility\n\n if (event.target)\n targ = event.target;\n else if (event.srcElement)\n targ = event.srcElement;\n\n var container = findContainer(targ, isActionMenu);\n if (container) {\n // targ is part of the menu, so just return and do the default\n return true;\n }\n\n hideAllMenus();\n\n return true;\n};\n\nfunction actionMenuMouseOver(event) {\n if (!event) var event = window.event; // IE compatibility\n\n if (!this.tagName && (this.tagName == 'A' || this.tagName == 'a')) {\n return true;\n }\n\n var container = findContainer(this, isActionMenu);\n if (!container) {\n return true;\n }\n var menu_id = container.id;\n\n var switch_menu = false;\n // hide all menus\n var menus = cssQuery('dl.actionMenu');\n for (var i=0; i < menus.length; i++) {\n var menu = menus[i]\n // check if the menu is visible\n if (hasClassName(menu, 'activated')) {\n switch_menu = true;\n }\n // turn off menu when it's not the current one\n if (menu.id != menu_id) {\n replaceClassName(menu, 'activated', 'deactivated', true);\n }\n }\n\n if (switch_menu) {\n var menu = cssQuery('#'+menu_id)[0];\n if (menu) {\n replaceClassName(menu, 'deactivated', 'activated', true);\n }\n }\n\n return true;\n};\n\nfunction initializeMenus() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM) {return false;}\n\n document.onmousedown = actionMenuDocumentMouseDown;\n\n hideAllMenus();\n\n // add toggle function to header links\n var menu_headers = cssQuery('dl.actionMenu > dt.actionMenuHeader > a');\n for (var i=0; i < menu_headers.length; i++) {\n var menu_header = menu_headers[i];\n\n menu_header.onclick = toggleMenuHandler;\n menu_header.onmouseover = actionMenuMouseOver;\n }\n\n // add hide function to all links in the dropdown, so the dropdown closes\n // when any link is clicked\n var menu_contents = cssQuery('dl.actionMenu > dd.actionMenuContent');\n for (var i=0; i < menu_contents.length; i++) {\n menu_contents[i].onclick = hideMenusHandler;\n }\n\ [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ast);\n};\n\nregisterPloneFunction(initializeMenus);\n\n\n/* ----- mark_special_links.js ----- */\n/* Scan all links in the document and set classes on them if\n * they point outside the site, or are special protocols\n * To disable this effect for links on a one-by-one-basis,\n * give them a class of 'link-plain'\n */\n\nfunction scanforlinks() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM) { return false; }\n\n contentarea = getContentArea();\n if (!contentarea) { return false; }\n\n links = contentarea.getElementsByTagName('a');\n for (i=0; i < links.length; i++) {\n if ( (links[i].getAttribute('href'))\n && (links[i].className.indexOf('link-plain')==-1) ) {\n var linkval = links[i].getAttribute('href');\n\n // check if the link href is a relative link, or an absolute link to\n // the current host.\n if (linkval.toLowerCase().indexOf(window.location.protocol\n + '//'\n + window.location.host)==0) {\n // absolute link internal to our host - do nothing\n } else if (linkval.indexOf('http:') != 0) {\n // not a http-link. Possibly an internal relative link, but also\n // possibly a mailto or other protocol add tests for relevant\n // protocols as you like.\n protocols = ['mailto', 'ftp', 'news', 'irc', 'h323', 'sip',\n 'callto', 'https', 'feed', 'webcal'];\n // h323, sip and callto are internet telephony VoIP protocols\n for (p=0; p < protocols.length; p++) {\n if (linkval.indexOf(protocols[p]+':') == 0) {\n // if the link matches one of the listed protocols, add\n // className = link-protocol\n wrapNode(links[i], 'span', 'link-'+protocols[p]);\n break;\n }\n }\n } else {\n // we are in here if the link points to somewhere else than our\n // site.\n if ( links[i].getElementsByTagName('img').length == 0 ) {\n // we do not want to mess with those links that already have\n // images in them\n wrapNode(links[i], 'span', 'link-external');\n // uncomment the next line if you want external links to be\n // opened in a new window.\n // links[i].setAttribute('target', '_blank');\n }\n }\n }\n }\n};\n\nregisterPloneFunction(scanforlinks);\n\n\n/* ----- collapsiblesections.js ----- */\n/*\n * This is the code for the collapsibles. It uses the following markup:\n *\n * <dl class="collapsible">\n * <dt class="collapsibleHeader">\n * A Title\n * </dt>\n * <dd class="collapsibleContent">\n * <!-- Here can be any content you want -->\n * </dd>\n * </dl>\n *\n * When the collapsible is toggled, then the dl will get an additional class\n * which switches between 'collapsedBlockCollapsible' and\n * 'expandedBlockCollapsible'. You can use this to style it accordingly, for\n * example:\n *\n * .expandedBlockCollapsible .collapsibleContent {\n * display: block;\n * }\n *\n * .collapsedBlockCollapsible .collapsibleContent {\n * display: none;\n * }\n *\n * If you add the 'collapsedOnLoad' class to the dl, then it will get\n * collapsed on page load, this is done, so the content is accessible even when\n * javascript is disabled.\n *\n * If you add the 'inline' class to the dl, then it will toggle between\n * 'collapsedInlineCollapsible' and 'expandedInlineCollapsible' instead of\n * 'collapsedBlockCollapsible' and 'expandedBlockCollapsible'.\n *\n * This file uses functions from register_function.js, cssQuery.js and\n * nodeutils.js.\n *\n */\n\nfunction isCollapsible(node) {\n if (hasClassName(node, 'collapsible')) {\n return true;\n }\n return false;\n};\n\nfunction toggleCollapsible(event) {\n if (!event) var event = window.event; // IE compatibility\n\n if (!this.tagName && (this.tagName == 'DT' || this.tagName == 'dt')) {\n return true;\n }\n\n var container = findContainer(this, isCollapsible);\n if (!container) {\n return true;\n }\n\n if (hasClassName(container, 'collapsedBlockCollapsible')) {\n replaceClassName(container, 'collapsedBlockCollapsible', 'expandedBlockCollapsible');\n } else if (hasClassName(container, 'expandedBlockCollapsible')) {\n replaceClassName(container, 'expandedBlockCollapsible', 'collapsedBlockCollapsible');\n } else if (hasClassName(container, 'collapsedInlineCollapsible')) {\n replaceClassName(container, 'collapsedInlineCollapsible', 'expandedInlineCollapsible');\n } else if (hasClassName(container, 'expandedInlineCollapsible')) {\n replaceClassName(container, 'expandedInlineCollapsible', 'collapsedInlineCollapsible');\n }\n};\n\nfunction activateCollapsibles() {\n if (!W3CDOM) {return false;}\n\n var collapsibles = cssQuery('dl.collapsible');\n for (var i=0; i < collapsibles.length; i++) {\n var collapsible = collapsibles[i];\n\n var collapsible_header = cssQuery('dt.collapsibleHeader', collapsible)[0];\n collapsible_header.onclick = toggleCollapsible;\n\n if (hasClassName(collapsible, 'inline')) {\n // the collapsible should be inline\n if (hasClassName(collapsible, 'collapsedOnLoad')) {\n replaceClassName(collapsible, 'collapsedOnLoad', 'collapsedInlineCollapsible');\n } else {\n addClassName(collapsible, 'expandedInlineCollapsible');\n }\n } else {\n // the collapsible is a block\n if (hasClassName(collapsible, 'collapsedOnLoad')) {\n replaceClassName(collapsible, 'collapsedOnLoad', 'collapsedBlockCollapsible');\n } else {\n addClassName(collapsible, 'expandedBlockCollapsible');\n }\n }\n }\n};\n\nregisterPloneFunction(activateCollapsibles);\n\n\n/* ----- highlightsearchterms.js ----- */\nfunction highlightTermInNode(node, word) {\n var contents = node.nodeValue;\n var index = contents.toLowerCase().indexOf(word.toLowerCase());\n if (index < 0){return false};\n\n var parent = node.parentNode;\n if (parent.className != "highlightedSearchTerm") {\n // make 3 shiny new nodes\n var hiword = document.createElement("span");\n hiword.className = "highlightedSearchTerm";\n hiword.appendChild(document.createTextNode(contents.substr(index, word.length)));\n parent.insertBefore(document.createTextNode(contents.substr(0, index)), node);\n parent.insertBefore(hiword, node);\n parent.insertBefore(document.createTextNode(contents.substr(index+word.length)), node);\n parent.removeChild(node);\n }\n}\n\nfunction highlightSearchTerms(terms, startnode) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n if (!terms){return false};\n if (!startnode){return false};\n\n for (var term_index=0; term_index < terms.length; term_index++) {\n // don't highlight reserved catalog search terms\n var term = terms[term_index];\n var term_lower = term.toLowerCase();\n if (term_lower != 'not'\n && term_lower != 'and'\n && term_lower != 'or') {\n walkTextNodes(startnode, highlightTermInNode, term);\n }\n }\n}\n\nfunction getSearchTermsFromURI(uri) {\n var query;\n if (typeof decodeURI != 'undefined') {\n query = decodeURI(uri);\n } else if (typeof unescape != 'undefined') {\n // _robert_ ie 5 does not have decodeURI \n query = unescape(uri);\n } else {\n // we just try to be lucky, for single words this will still work\n }\n var result = [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): ast);\n};\n\nregisterPloneFunction(initializeMenus);\n\n\n/* ----- mark_special_links.js ----- */\n/* Scan all links in the document and set classes on them if\n * they point outside the site, or are special protocols\n * To disable this effect for links on a one-by-one-basis,\n * give them a class of 'link-plain'\n */\n\nfunction scanforlinks() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM) { return false; }\n\n contentarea = getContentArea();\n if (!contentarea) { return false; }\n\n links = contentarea.getElementsByTagName('a');\n for (i=0; i < links.length; i++) {\n if ( (links[i].getAttribute('href'))\n && (links[i].className.indexOf('link-plain')==-1) ) {\n var linkval = links[i].getAttribute('href');\n\n // check if the link href is a relative link, or an absolute link to\n // the current host.\n if (linkval.toLowerCase().indexOf(window.location.protocol\n + '//'\n + window.location.host)==0) {\n // absolute link internal to our host - do nothing\n } else if (linkval.indexOf('http:') != 0) {\n // not a http-link. Possibly an internal relative link, but also\n // possibly a mailto or other protocol add tests for relevant\n // protocols as you like.\n protocols = ['mailto', 'ftp', 'news', 'irc', 'h323', 'sip',\n 'callto', 'https', 'feed', 'webcal'];\n // h323, sip and callto are internet telephony VoIP protocols\n for (p=0; p < protocols.length; p++) {\n if (linkval.indexOf(protocols[p]+':') == 0) {\n // if the link matches one of the listed protocols, add\n // className = link-protocol\n wrapNode(links[i], 'span', 'link-'+protocols[p]);\n break;\n }\n }\n } else {\n // we are in here if the link points to somewhere else than our\n // site.\n if ( links[i].getElementsByTagName('img').length == 0 ) {\n // we do not want to mess with those links that already have\n // images in them\n wrapNode(links[i], 'span', 'link-external');\n // uncomment the next line if you want external links to be\n // opened in a new window.\n // links[i].setAttribute('target', '_blank');\n }\n }\n }\n }\n};\n\nregisterPloneFunction(scanforlinks);\n\n\n/* ----- collapsiblesections.js ----- */\n/*\n * This is the code for the collapsibles. It uses the following markup:\n *\n * <dl class="collapsible">\n * <dt class="collapsibleHeader">\n * A Title\n * </dt>\n * <dd class="collapsibleContent">\n * <!-- Here can be any content you want -->\n * </dd>\n * </dl>\n *\n * When the collapsible is toggled, then the dl will get an additional class\n * which switches between 'collapsedBlockCollapsible' and\n * 'expandedBlockCollapsible'. You can use this to style it accordingly, for\n * example:\n *\n * .expandedBlockCollapsible .collapsibleContent {\n * display: block;\n * }\n *\n * .collapsedBlockCollapsible .collapsibleContent {\n * display: none;\n * }\n *\n * If you add the 'collapsedOnLoad' class to the dl, then it will get\n * collapsed on page load, this is done, so the content is accessible even when\n * javascript is disabled.\n *\n * If you add the 'inline' class to the dl, then it will toggle between\n * 'collapsedInlineCollapsible' and 'expandedInlineCollapsible' instead of\n * 'collapsedBlockCollapsible' and 'expandedBlockCollapsible'.\n *\n * This file uses functions from register_function.js, cssQuery.js and\n * nodeutils.js.\n *\n */\n\nfunction isCollapsible(node) {\n if (hasClassName(node, 'collapsible')) {\n return true;\n }\n return false;\n};\n\nfunction toggleCollapsible(event) {\n if (!event) var event = window.event; // IE compatibility\n\n if (!this.tagName && (this.tagName == 'DT' || this.tagName == 'dt')) {\n return true;\n }\n\n var container = findContainer(this, isCollapsible);\n if (!container) {\n return true;\n }\n\n if (hasClassName(container, 'collapsedBlockCollapsible')) {\n replaceClassName(container, 'collapsedBlockCollapsible', 'expandedBlockCollapsible');\n } else if (hasClassName(container, 'expandedBlockCollapsible')) {\n replaceClassName(container, 'expandedBlockCollapsible', 'collapsedBlockCollapsible');\n } else if (hasClassName(container, 'collapsedInlineCollapsible')) {\n replaceClassName(container, 'collapsedInlineCollapsible', 'expandedInlineCollapsible');\n } else if (hasClassName(container, 'expandedInlineCollapsible')) {\n replaceClassName(container, 'expandedInlineCollapsible', 'collapsedInlineCollapsible');\n }\n};\n\nfunction activateCollapsibles() {\n if (!W3CDOM) {return false;}\n\n var collapsibles = cssQuery('dl.collapsible');\n for (var i=0; i < collapsibles.length; i++) {\n var collapsible = collapsibles[i];\n\n var collapsible_header = cssQuery('dt.collapsibleHeader', collapsible)[0];\n collapsible_header.onclick = toggleCollapsible;\n\n if (hasClassName(collapsible, 'inline')) {\n // the collapsible should be inline\n if (hasClassName(collapsible, 'collapsedOnLoad')) {\n replaceClassName(collapsible, 'collapsedOnLoad', 'collapsedInlineCollapsible');\n } else {\n addClassName(collapsible, 'expandedInlineCollapsible');\n }\n } else {\n // the collapsible is a block\n if (hasClassName(collapsible, 'collapsedOnLoad')) {\n replaceClassName(collapsible, 'collapsedOnLoad', 'collapsedBlockCollapsible');\n } else {\n addClassName(collapsible, 'expandedBlockCollapsible');\n }\n }\n }\n};\n\nregisterPloneFunction(activateCollapsibles);\n\n\n/* ----- highlightsearchterms.js ----- */\nfunction highlightTermInNode(node, word) {\n var contents = node.nodeValue;\n var index = contents.toLowerCase().indexOf(word.toLowerCase());\n if (index < 0){return false};\n\n var parent = node.parentNode;\n if (parent.className != "highlightedSearchTerm") {\n // make 3 shiny new nodes\n var hiword = document.createElement("span");\n hiword.className = "highlightedSearchTerm";\n hiword.appendChild(document.createTextNode(contents.substr(index, word.length)));\n parent.insertBefore(document.createTextNode(contents.substr(0, index)), node);\n parent.insertBefore(hiword, node);\n parent.insertBefore(document.createTextNode(contents.substr(index+word.length)), node);\n parent.removeChild(node);\n }\n}\n\nfunction highlightSearchTerms(terms, startnode) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n if (!terms){return false};\n if (!startnode){return false};\n\n for (var term_index=0; term_index < terms.length; term_index++) {\n // don't highlight reserved catalog search terms\n var term = terms[term_index];\n var term_lower = term.toLowerCase();\n if (term_lower != 'not'\n && term_lower != 'and'\n && term_lower != 'or') {\n walkTextNodes(startnode, highlightTermInNode, term);\n }\n }\n}\n\nfunction getSearchTermsFromURI(uri) {\n var query;\n if (typeof decodeURI != 'undefined') {\n query = decodeURI(uri);\n } else if (typeof unescape != 'undefined') {\n // _robert_ ie 5 does not have decodeURI \n query = unescape(uri);\n } else {\n // we just try to be lucky, for single words this will still work\n }\n var result [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): = referrerSearch && referrerSearch.length > 0) {\n result = referrerSearch;\n }\n }\n var qfinder = new RegExp("searchterm=([^&]*)", "gi");\n var qq = qfinder.exec(query);\n if (qq && qq[1]) {\n var terms = qq[1].replace(/\\+/g,' ').split(/\\s+/);\n for (var i=0; i < terms.length; i++) {\n if (terms[i] != '') {\n result.push(terms[i]);\n }\n }\n return result;\n }\n return result.length == 0 ? false : result;\n}\n\nfunction highlightSearchTermsFromURI() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n // search-term-highlighter function -- Geir B\xc3\xa6kholt\n var terms = getSearchTermsFromURI(window.location.search);\n // make sure we start the right place so we don't higlight menuitems or breadcrumb\n var contentarea = getContentArea();\n highlightSearchTerms(terms, contentarea);\n}\n\nregisterPloneFunction(highlightSearchTermsFromURI);\n\n\n/* ----- se-highlight.js ----- */\n/* List of search engine matchers and the referrer search\n * code where carefully borrowed from the\n * "Search Engine Keyword Highlight" by Scott Yang,\n * see http://fucoder.com/code/se-hilite/ for further\n * details.\n */\nvar searchEngines = [\n ['^http://(www)?\\\\.?google.*', 'q='], // Google\n ['^http://search\\\\.yahoo.*', 'p='], // Yahoo\n ['^http://search\\\\.msn.*', 'q='], // MSN\n ['^http://search\\\\.aol.*', 'userQuery='], // AOL\n ['^http://(www\\\\.)?altavista.*', 'q='], // AltaVista\n ['^http://(www\\\\.)?feedster.*', 'q='], // Feedster\n ['^http://search\\\\.lycos.*', 'query='], // Lycos\n ['^http://(www\\\\.)?alltheweb.*', 'q='] // AllTheWeb\n]\n\nfunction decodeReferrer(ref) {\n // checks if we are beeing searched by a search engine\n if (null == ref && document.referrer) {\n ref = document.referrer;\n }\n if (!ref) return null;\n\n var match = new RegExp('');\n var seQuery = '';\n for (var i = 0; i < searchEngines.length; i ++) {\n match.compile(searchEngines[i][0], 'i');\n if (ref.match(match)) {\n match.compile('^.*'+searchEngines[i][1]+'([^&]+)&?.*$');\n seQuery = ref.replace(match, '$1');\n if (seQuery) {\n seQuery = decodeURIComponent(seQuery);\n seQuery = seQuery.replace(/\\'|"/, '');\n return seQuery.split(/[\\s,\\+\\.]+/);\n }\n\n }\n }\n return null;\n}\n\n\n/* ----- first_input_focus.js ----- */\n// Focus on error \nfunction setFocus(){\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var xre = new RegExp(/\\berror\\b/);\n // Search only forms to avoid spending time on regular text\n for (var f = 0; (formnode = document.getElementsByTagName('form').item(f)); f++){\n // Search for errors first, focus on first error if found\n for (var i = 0; (node = formnode.getElementsByTagName('div').item(i)); i++) {\n if (xre.exec(node.className)){\n for (var j = 0; (inputnode = node.getElementsByTagName('input').item(j)); j++) {\n try {\n if (inputnode.focus) { // check availability first\n inputnode.focus();\n return;\n }\n } catch(e) {\n // try next one, this can happen with a hidden or\n // invisible input field\n }\n }\n }\n }\n }\n}\nregisterPloneFunction(setFocus)\n\n\n/* ----- folder_contents_filter.js ----- */\n// Actions used in the folder_contents view\nfunction submitFolderAction(folderAction) {\n document.folderContentsForm.action = document.folderContentsForm.action+'/'+folderAction;\n document.folderContentsForm.submit();\n}\n\nfunction submitFilterAction() {\n document.folderContentsForm.action = document.folderContentsForm.action+'/folder_contents';\n filter_selection=document.getElementById('filter_selection');\n for (var i =0; i < filter_selection.length; i++){\n if (filter_selection.options[i].selected) {\n if (filter_selection.options[i].value=='#') {\n document.folderContentsForm.filter_state.value='clear_view_filter';\n }\n else {\n document.folderContentsForm.filter_state.value='set_view_filter';\n }\n }\n }\n document.folderContentsForm.submit();\n}\n\n\n\n/* ----- folder_contents_hideAddItems.js ----- */\n// function to hide the traditional add items pull down menu.\n\nfunction hideTraditionalAddItemPullDown() {\n // Get the old style Add Item pulldown. We already have\n // such a menu. This is only for system that don't have javascript\n // so we can savely remove it.\n pullDown = document.getElementById('traditional-add-item-pulldown');\n if (pullDown) { \n pullDown.style.display='none';\n }\n}\n\nregisterPloneFunction(hideTraditionalAddItemPullDown)\n\n/* ----- styleswitcher.js ----- */\n// StyleSwitcher functions written by Paul Sowden\nfunction setActiveStyleSheet(title, reset) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var i, a, main;\n for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {\n if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {\n a.disabled = true;\n if (a.getAttribute("title") == title) {\n a.disabled = false;\n }\n }\n }\n if (reset == 1) {\n createCookie("wstyle", title, 365);\n }\n};\n\nfunction setStyle() {\n var style = readCookie("wstyle");\n if (style != null) {\n setActiveStyleSheet(style, 0);\n }\n};\nregisterPloneFunction(setStyle);\n\n\n\n\n/* ----- table_sorter.js ----- */\n\n/********* Table sorter script *************/\n// Table sorter script, thanks to Geir B\xc3\xa6kholt for this.\n// DOM table sorter originally made by Paul Sowden \n\nfunction compare(a,b)\n{\n au = new String(a);\n bu = new String(b);\n\n if (au.charAt(4) != '-' && au.charAt(7) != '-')\n {\n var an = parseFloat(au)\n var bn = parseFloat(bu)\n }\n if (isNaN(an) || isNaN(bn))\n {as = au.toLowerCase()\n bs = bu.toLowerCase()\n if (as > bs)\n {return 1;}\n else\n {return -1;}\n }\n else {\n return an - bn;\n }\n}\nfunction getConcatenedTextContent(node) {\n var _result = "";\n if (node == null) {\n return _result;\n }\n var childrens = node.childNodes;\n var i = 0;\n while (i < childrens.length) {\n var child = childrens.item(i);\n switch (child.nodeType) {\n case 1: // ELEMENT_NODE\n case 5: // ENTITY_REFERENCE_NODE\n _result += getConcatenedTextContent(child);\n break;\n case 3: // TEXT_NODE\n case 2: // ATTRIBUTE_NODE\n case 4: // CDATA_SECTION_NODE\n _result += child.nodeValue;\n break;\n case 6: // ENTITY_NODE\n case 7: // PROCESSING_INSTRUCTION_NODE\n case 8: // COMMENT_NODE\n case 9: // DOCUMENT_NODE\n case 10: // DOCUMENT_TYPE_NODE\n case 11: // DOCUMENT_FRAGMENT_NODE\n case 12: // NOTATION_NODE\n // skip\n break;\n }\n i ++;\n }\n return _result;\n}\n\nfunction sort(e) {\n var el = window.event ? window.event.srcElement : e.currentTarget;\n\n // a pretty ugly sort function, but it works nonetheless\n var a = new Array();\n // check if the image or the th is clicked. Proceed to parent id it is the image\n // NOTE THAT nodeName IS UPPERCASE\n if [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): = referrerSearch && referrerSearch.length > 0) {\n result = referrerSearch;\n }\n }\n var qfinder = new RegExp("searchterm=([^&]*)", "gi");\n var qq = qfinder.exec(query);\n if (qq && qq[1]) {\n var terms = qq[1].replace(/\\+/g,' ').split(/\\s+/);\n for (var i=0; i < terms.length; i++) {\n if (terms[i] != '') {\n result.push(terms[i]);\n }\n }\n return result;\n }\n return result.length == 0 ? false : result;\n}\n\nfunction highlightSearchTermsFromURI() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n // search-term-highlighter function -- Geir B\xc3\xa6kholt\n var terms = getSearchTermsFromURI(window.location.search);\n // make sure we start the right place so we don't higlight menuitems or breadcrumb\n var contentarea = getContentArea();\n highlightSearchTerms(terms, contentarea);\n}\n\nregisterPloneFunction(highlightSearchTermsFromURI);\n\n\n/* ----- se-highlight.js ----- */\n/* List of search engine matchers and the referrer search\n * code where carefully borrowed from the\n * "Search Engine Keyword Highlight" by Scott Yang,\n * see http://fucoder.com/code/se-hilite/ for further\n * details.\n */\nvar searchEngines = [\n ['^http://(www)?\\\\.?google.*', 'q='], // Google\n ['^http://search\\\\.yahoo.*', 'p='], // Yahoo\n ['^http://search\\\\.msn.*', 'q='], // MSN\n ['^http://search\\\\.aol.*', 'userQuery='], // AOL\n ['^http://(www\\\\.)?altavista.*', 'q='], // AltaVista\n ['^http://(www\\\\.)?feedster.*', 'q='], // Feedster\n ['^http://search\\\\.lycos.*', 'query='], // Lycos\n ['^http://(www\\\\.)?alltheweb.*', 'q='] // AllTheWeb\n]\n\nfunction decodeReferrer(ref) {\n // checks if we are beeing searched by a search engine\n if (null == ref && document.referrer) {\n ref = document.referrer;\n }\n if (!ref) return null;\n\n var match = new RegExp('');\n var seQuery = '';\n for (var i = 0; i < searchEngines.length; i ++) {\n match.compile(searchEngines[i][0], 'i');\n if (ref.match(match)) {\n match.compile('^.*'+searchEngines[i][1]+'([^&]+)&?.*$');\n seQuery = ref.replace(match, '$1');\n if (seQuery) {\n seQuery = decodeURIComponent(seQuery);\n seQuery = seQuery.replace(/\\'|"/, '');\n return seQuery.split(/[\\s,\\+\\.]+/);\n }\n\n }\n }\n return null;\n}\n\n\n/* ----- first_input_focus.js ----- */\n// Focus on error \nfunction setFocus(){\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var xre = new RegExp(/\\berror\\b/);\n // Search only forms to avoid spending time on regular text\n for (var f = 0; (formnode = document.getElementsByTagName('form').item(f)); f++){\n // Search for errors first, focus on first error if found\n for (var i = 0; (node = formnode.getElementsByTagName('div').item(i)); i++) {\n if (xre.exec(node.className)){\n for (var j = 0; (inputnode = node.getElementsByTagName('input').item(j)); j++) {\n try {\n if (inputnode.focus) { // check availability first\n inputnode.focus();\n return;\n }\n } catch(e) {\n // try next one, this can happen with a hidden or\n // invisible input field\n }\n }\n }\n }\n }\n}\nregisterPloneFunction(setFocus)\n\n\n/* ----- folder_contents_filter.js ----- */\n// Actions used in the folder_contents view\nfunction submitFolderAction(folderAction) {\n document.folderContentsForm.action = document.folderContentsForm.action+'/'+folderAction;\n document.folderContentsForm.submit();\n}\n\nfunction submitFilterAction() {\n document.folderContentsForm.action = document.folderContentsForm.action+'/folder_contents';\n filter_selection=document.getElementById('filter_selection');\n for (var i =0; i < filter_selection.length; i++){\n if (filter_selection.options[i].selected) {\n if (filter_selection.options[i].value=='#') {\n document.folderContentsForm.filter_state.value='clear_view_filter';\n }\n else {\n document.folderContentsForm.filter_state.value='set_view_filter';\n }\n }\n }\n document.folderContentsForm.submit();\n}\n\n\n\n/* ----- folder_contents_hideAddItems.js ----- */\n// function to hide the traditional add items pull down menu.\n\nfunction hideTraditionalAddItemPullDown() {\n // Get the old style Add Item pulldown. We already have\n // such a menu. This is only for system that don't have javascript\n // so we can savely remove it.\n pullDown = document.getElementById('traditional-add-item-pulldown');\n if (pullDown) { \n pullDown.style.display='none';\n }\n}\n\nregisterPloneFunction(hideTraditionalAddItemPullDown)\n\n/* ----- styleswitcher.js ----- */\n// StyleSwitcher functions written by Paul Sowden\nfunction setActiveStyleSheet(title, reset) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var i, a, main;\n for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {\n if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {\n a.disabled = true;\n if (a.getAttribute("title") == title) {\n a.disabled = false;\n }\n }\n }\n if (reset == 1) {\n createCookie("wstyle", title, 365);\n }\n};\n\nfunction setStyle() {\n var style = readCookie("wstyle");\n if (style != null) {\n setActiveStyleSheet(style, 0);\n }\n};\nregisterPloneFunction(setStyle);\n\n\n\n\n/* ----- table_sorter.js ----- */\n\n/********* Table sorter script *************/\n// Table sorter script, thanks to Geir B\xc3\xa6kholt for this.\n// DOM table sorter originally made by Paul Sowden \n\nfunction compare(a,b)\n{\n au = new String(a);\n bu = new String(b);\n\n if (au.charAt(4) != '-' && au.charAt(7) != '-')\n {\n var an = parseFloat(au)\n var bn = parseFloat(bu)\n }\n if (isNaN(an) || isNaN(bn))\n {as = au.toLowerCase()\n bs = bu.toLowerCase()\n if (as > bs)\n {return 1;}\n else\n {return -1;}\n }\n else {\n return an - bn;\n }\n}\nfunction getConcatenedTextContent(node) {\n var _result = "";\n if (node == null) {\n return _result;\n }\n var childrens = node.childNodes;\n var i = 0;\n while (i < childrens.length) {\n var child = childrens.item(i);\n switch (child.nodeType) {\n case 1: // ELEMENT_NODE\n case 5: // ENTITY_REFERENCE_NODE\n _result += getConcatenedTextContent(child);\n break;\n case 3: // TEXT_NODE\n case 2: // ATTRIBUTE_NODE\n case 4: // CDATA_SECTION_NODE\n _result += child.nodeValue;\n break;\n case 6: // ENTITY_NODE\n case 7: // PROCESSING_INSTRUCTION_NODE\n case 8: // COMMENT_NODE\n case 9: // DOCUMENT_NODE\n case 10: // DOCUMENT_TYPE_NODE\n case 11: // DOCUMENT_FRAGMENT_NODE\n case 12: // NOTATION_NODE\n // skip\n break;\n }\n i ++;\n }\n return _result;\n}\n\nfunction sort(e) {\n var el = window.event ? window.event.srcElement : e.currentTarget;\n\n // a pretty ugly sort function, but it works nonetheless\n var a = new Array();\n // check if the image or the th is clicked. Proceed to parent id it is the image\n // NOTE THAT nodeName IS UPPERCASE\n if [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): e = el.childNodes.item(1).nodeValue;\n var dad = el.parentNode;\n var node;\n \n // kill all arrows\n for (var im = 0; (node = dad.getElementsByTagName("th").item(im)); im++) {\n // NOTE THAT nodeName IS IN UPPERCASE\n if (node.lastChild.nodeName == 'IMG')\n {\n lastindex = node.getElementsByTagName('img').length - 1;\n node.getElementsByTagName('img').item(lastindex).setAttribute('src',portal_url + '/arrowBlank.gif');\n }\n }\n \n for (var i = 0; (node = dad.getElementsByTagName("th").item(i)); i++) {\n var xre = new RegExp(/\\bnosort\\b/);\n // Make sure we are not messing with nosortable columns, then check second node.\n if (!xre.exec(node.className) && node.childNodes.item(1).nodeValue == name) \n {\n //window.alert(node.childNodes.item(1).nodeValue;\n lastindex = node.getElementsByTagName('img').length -1;\n node.getElementsByTagName('img').item(lastindex).setAttribute('src',portal_url + '/arrowUp.gif');\n break;\n }\n }\n\n var tbody = dad.parentNode.parentNode.getElementsByTagName("tbody").item(0);\n for (var j = 0; (node = tbody.getElementsByTagName("tr").item(j)); j++) {\n\n // crude way to sort by surname and name after first choice\n a[j] = new Array();\n a[j][0] = getConcatenedTextContent(node.getElementsByTagName("td").item(i));\n a[j][1] = getConcatenedTextContent(node.getElementsByTagName("td").item(1));\n a[j][2] = getConcatenedTextContent(node.getElementsByTagName("td").item(0)); \n a[j][3] = node;\n }\n\n if (a.length > 1) {\n \n a.sort(compare);\n\n // not a perfect way to check, but hell, it suits me fine\n if (a[0][0] == getConcatenedTextContent(tbody.getElementsByTagName("tr").item(0).getElementsByTagName("td").item(i))\n && a[1][0] == getConcatenedTextContent(tbody.getElementsByTagName("tr").item(1).getElementsByTagName("td").item(i))) \n {\n a.reverse();\n lastindex = el.getElementsByTagName('img').length - 1;\n el.getElementsByTagName('img').item(lastindex).setAttribute('src', portal_url + '/arrowDown.gif');\n }\n\n }\n \n for (var j = 0; j < a.length; j++) {\n tbody.appendChild(a[j][3]);\n }\n}\n \nfunction initalizeTableSort(e) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var tbls = document.getElementsByTagName('table');\n for (var t = 0; t < tbls.length; t++)\n {\n // elements of class="listing" can be sorted\n var re = new RegExp(/\\blisting\\b/)\n // elements of class="nosort" should not be sorted\n var xre = new RegExp(/\\bnosort\\b/)\n if (re.exec(tbls[t].className) && !xre.exec(tbls[t].className))\n {\n try {\n var thead = tbls[t].getElementsByTagName("thead").item(0);\n var node;\n // set up blank spaceholder gifs\n blankarrow = document.createElement('img');\n blankarrow.setAttribute('src', portal_url + '/arrowBlank.gif');\n blankarrow.setAttribute('height',6);\n blankarrow.setAttribute('width',9);\n // the first sortable column should get an arrow initially.\n initialsort = false;\n for (var i = 0; (node = thead.getElementsByTagName("th").item(i)); i++) {\n // check that the columns does not have class="nosort"\n if (!xre.exec(node.className)) {\n node.insertBefore(blankarrow.cloneNode(1), node.firstChild);\n node.style.cursor = 'pointer';\n if (!initialsort) {\n initialsort = true;\n uparrow = document.createElement('img');\n uparrow.setAttribute('src', portal_url + '/arrowUp.gif');\n uparrow.setAttribute('height',6);\n uparrow.setAttribute('width',9);\n node.appendChild(uparrow);\n } else {\n node.appendChild(blankarrow.cloneNode(1));\n }\n \n if (node.addEventListener) node.addEventListener("click",sort,false);\n else if (node.attachEvent) node.attachEvent("onclick",sort);\n }\n }\n } catch(er) {}\n }\n }\n} \n// **** End table sort script ***\nregisterPloneFunction(initalizeTableSort) \n\n\n\n/* ----- calendar_formfield.js ----- */\n// jscalendar glue -- Leonard Norrg\xc3\xa5rd <vinsci@*>\n// This function gets called when the user clicks on some date.\nfunction onJsCalendarDateUpdate(cal) {\n var year = cal.params.input_id_year;\n var month = cal.params.input_id_month;\n var day = cal.params.input_id_day;\n // var hour = cal.params.input_id_hour;\n // var minute = cal.params.input_id_minute;\n\n // cal.params.inputField.value = cal.date.print('%Y/%m/%d %H:%M'); // doesn't work in Opera, don't use time now\n //cal.params.inputField.value = cal.date.print('%Y/%m/%d'); // doesn't work in Opera\n var daystr = '' + cal.date.getDate();\n if (daystr.length == 1)\n \tdaystr = '0' + daystr;\n var monthstr = '' + (cal.date.getMonth()+1);\n if (monthstr.length == 1)\n\tmonthstr = '0' + monthstr;\n cal.params.inputField.value = '' + cal.date.getFullYear() + '/' + monthstr + '/' + daystr\n\n year.value = cal.params.inputField.value.substring(0,4);\n month.value = cal.params.inputField.value.substring(5,7);\n day.value = cal.params.inputField.value.substring(8,10);\n // hour.value = cal.params.inputField.value.substring(11,13);\n // minute.value= cal.params.inputField.value.substring(14,16);\n}\n\n\nfunction showJsCalendar(input_id_anchor, input_id, input_id_year, input_id_month, input_id_day, input_id_hour, input_id_minute, yearStart, yearEnd) {\n // do what jscalendar-x.y.z/calendar-setup.js:Calendar.setup would do\n var input_id_anchor = document.getElementById(input_id_anchor);\n var input_id = document.getElementById(input_id);\n var input_id_year = document.getElementById(input_id_year);\n var input_id_month = document.getElementById(input_id_month);\n var input_id_day = document.getElementById(input_id_day);\n // var input_id_hour = document.getElementById(input_id_hour);\n // var input_id_minute = document.getElementById(input_id_minute);\n var format = 'y/mm/dd';\n\n var dateEl = input_id;\n var mustCreate = false;\n var cal = window.calendar;\n\n var params = {\n 'range' : [yearStart, yearEnd],\n inputField : input_id,\n input_id_year : input_id_year,\n input_id_month: input_id_month,\n input_id_day : input_id_day\n // input_id_hour : input_id_hour,\n // input_id_minute: input_id_minute\n };\n\n function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };\n\n param_default("inputField", null);\n param_default("displayArea", null);\n param_default("button", null);\n param_default("eventName", "click");\n param_default("ifFormat", "%Y/%m/%d");\n param_default("daFormat", "%Y/%m/%d");\n param_default("singleClick", true);\n param_default("disableFunc", null);\n param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined\n param_default("dateText", null);\n param_default("firstDay", 1);\n param_default("align", "Bl");\n param_default("range", [1900, 2999]);\n param_default("weekNumbers", true);\n param_default("flat", null);\n param_default("flatCallback", null);\n param_default("onSelect", null);\n param_default( [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): e = el.childNodes.item(1).nodeValue;\n var dad = el.parentNode;\n var node;\n \n // kill all arrows\n for (var im = 0; (node = dad.getElementsByTagName("th").item(im)); im++) {\n // NOTE THAT nodeName IS IN UPPERCASE\n if (node.lastChild.nodeName == 'IMG')\n {\n lastindex = node.getElementsByTagName('img').length - 1;\n node.getElementsByTagName('img').item(lastindex).setAttribute('src',portal_url + '/arrowBlank.gif');\n }\n }\n \n for (var i = 0; (node = dad.getElementsByTagName("th").item(i)); i++) {\n var xre = new RegExp(/\\bnosort\\b/);\n // Make sure we are not messing with nosortable columns, then check second node.\n if (!xre.exec(node.className) && node.childNodes.item(1).nodeValue == name) \n {\n //window.alert(node.childNodes.item(1).nodeValue;\n lastindex = node.getElementsByTagName('img').length -1;\n node.getElementsByTagName('img').item(lastindex).setAttribute('src',portal_url + '/arrowUp.gif');\n break;\n }\n }\n\n var tbody = dad.parentNode.parentNode.getElementsByTagName("tbody").item(0);\n for (var j = 0; (node = tbody.getElementsByTagName("tr").item(j)); j++) {\n\n // crude way to sort by surname and name after first choice\n a[j] = new Array();\n a[j][0] = getConcatenedTextContent(node.getElementsByTagName("td").item(i));\n a[j][1] = getConcatenedTextContent(node.getElementsByTagName("td").item(1));\n a[j][2] = getConcatenedTextContent(node.getElementsByTagName("td").item(0)); \n a[j][3] = node;\n }\n\n if (a.length > 1) {\n \n a.sort(compare);\n\n // not a perfect way to check, but hell, it suits me fine\n if (a[0][0] == getConcatenedTextContent(tbody.getElementsByTagName("tr").item(0).getElementsByTagName("td").item(i))\n && a[1][0] == getConcatenedTextContent(tbody.getElementsByTagName("tr").item(1).getElementsByTagName("td").item(i))) \n {\n a.reverse();\n lastindex = el.getElementsByTagName('img').length - 1;\n el.getElementsByTagName('img').item(lastindex).setAttribute('src', portal_url + '/arrowDown.gif');\n }\n\n }\n \n for (var j = 0; j < a.length; j++) {\n tbody.appendChild(a[j][3]);\n }\n}\n \nfunction initalizeTableSort(e) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var tbls = document.getElementsByTagName('table');\n for (var t = 0; t < tbls.length; t++)\n {\n // elements of class="listing" can be sorted\n var re = new RegExp(/\\blisting\\b/)\n // elements of class="nosort" should not be sorted\n var xre = new RegExp(/\\bnosort\\b/)\n if (re.exec(tbls[t].className) && !xre.exec(tbls[t].className))\n {\n try {\n var thead = tbls[t].getElementsByTagName("thead").item(0);\n var node;\n // set up blank spaceholder gifs\n blankarrow = document.createElement('img');\n blankarrow.setAttribute('src', portal_url + '/arrowBlank.gif');\n blankarrow.setAttribute('height',6);\n blankarrow.setAttribute('width',9);\n // the first sortable column should get an arrow initially.\n initialsort = false;\n for (var i = 0; (node = thead.getElementsByTagName("th").item(i)); i++) {\n // check that the columns does not have class="nosort"\n if (!xre.exec(node.className)) {\n node.insertBefore(blankarrow.cloneNode(1), node.firstChild);\n node.style.cursor = 'pointer';\n if (!initialsort) {\n initialsort = true;\n uparrow = document.createElement('img');\n uparrow.setAttribute('src', portal_url + '/arrowUp.gif');\n uparrow.setAttribute('height',6);\n uparrow.setAttribute('width',9);\n node.appendChild(uparrow);\n } else {\n node.appendChild(blankarrow.cloneNode(1));\n }\n \n if (node.addEventListener) node.addEventListener("click",sort,false);\n else if (node.attachEvent) node.attachEvent("onclick",sort);\n }\n }\n } catch(er) {}\n }\n }\n} \n// **** End table sort script ***\nregisterPloneFunction(initalizeTableSort) \n\n\n\n/* ----- calendar_formfield.js ----- */\n// jscalendar glue -- Leonard Norrg\xc3\xa5rd <vinsci@*>\n// This function gets called when the user clicks on some date.\nfunction onJsCalendarDateUpdate(cal) {\n var year = cal.params.input_id_year;\n var month = cal.params.input_id_month;\n var day = cal.params.input_id_day;\n // var hour = cal.params.input_id_hour;\n // var minute = cal.params.input_id_minute;\n\n // cal.params.inputField.value = cal.date.print('%Y/%m/%d %H:%M'); // doesn't work in Opera, don't use time now\n //cal.params.inputField.value = cal.date.print('%Y/%m/%d'); // doesn't work in Opera\n var daystr = '' + cal.date.getDate();\n if (daystr.length == 1)\n \tdaystr = '0' + daystr;\n var monthstr = '' + (cal.date.getMonth()+1);\n if (monthstr.length == 1)\n\tmonthstr = '0' + monthstr;\n cal.params.inputField.value = '' + cal.date.getFullYear() + '/' + monthstr + '/' + daystr\n\n year.value = cal.params.inputField.value.substring(0,4);\n month.value = cal.params.inputField.value.substring(5,7);\n day.value = cal.params.inputField.value.substring(8,10);\n // hour.value = cal.params.inputField.value.substring(11,13);\n // minute.value= cal.params.inputField.value.substring(14,16);\n}\n\n\nfunction showJsCalendar(input_id_anchor, input_id, input_id_year, input_id_month, input_id_day, input_id_hour, input_id_minute, yearStart, yearEnd) {\n // do what jscalendar-x.y.z/calendar-setup.js:Calendar.setup would do\n var input_id_anchor = document.getElementById(input_id_anchor);\n var input_id = document.getElementById(input_id);\n var input_id_year = document.getElementById(input_id_year);\n var input_id_month = document.getElementById(input_id_month);\n var input_id_day = document.getElementById(input_id_day);\n // var input_id_hour = document.getElementById(input_id_hour);\n // var input_id_minute = document.getElementById(input_id_minute);\n var format = 'y/mm/dd';\n\n var dateEl = input_id;\n var mustCreate = false;\n var cal = window.calendar;\n\n var params = {\n 'range' : [yearStart, yearEnd],\n inputField : input_id,\n input_id_year : input_id_year,\n input_id_month: input_id_month,\n input_id_day : input_id_day\n // input_id_hour : input_id_hour,\n // input_id_minute: input_id_minute\n };\n\n function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };\n\n param_default("inputField", null);\n param_default("displayArea", null);\n param_default("button", null);\n param_default("eventName", "click");\n param_default("ifFormat", "%Y/%m/%d");\n param_default("daFormat", "%Y/%m/%d");\n param_default("singleClick", true);\n param_default("disableFunc", null);\n param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined\n param_default("dateText", null);\n param_default("firstDay", 1);\n param_default("align", "Bl");\n param_default("range", [1900, 2999]);\n param_default("weekNumbers", true);\n param_default("flat", null);\n param_default("flatCallback", null);\n param_default("onSelect", null);\n param_default [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): null);\n param_default("showsTime", false);\n param_default("timeFormat", "24");\n param_default("electric", true);\n param_default("step", 2);\n param_default("position", null);\n param_default("cache", false);\n param_default("showOthers", false);\n param_default("multiple", null);\n\n if (!(cal && params.cache)) {\n\twindow.calendar = cal = new Calendar(params.firstDay,\n\t null,\n\t onJsCalendarDateUpdate,\n\t function(cal) { cal.hide(); });\n\tcal.time24 = true;\n\tcal.weekNumbers = true;\n\tmustCreate = true;\n } else {\n cal.hide();\n }\n cal.showsOtherMonths = false;\n cal.yearStep = 2;\n cal.setRange(yearStart,yearEnd);\n cal.params = params;\n cal.setDateStatusHandler(null);\n cal.getDateText = null;\n cal.setDateFormat(format);\n if (mustCreate)\n\tcal.create();\n cal.refresh();\n if (!params.position)\n cal.showAtElement(input_id_anchor, null);\n else\n cal.showAt(params.position[0], params.position[1]);\n return false;\n}\n\n\n// This function updates a hidden date field with the current values of the widgets\nfunction update_date_field(field, year, month, day, hour, minute, ampm)\n{\n var field = document.getElementById(field)\n var date = document.getElementById(date)\n var year = document.getElementById(year)\n var month = document.getElementById(month)\n var day = document.getElementById(day)\n var hour = document.getElementById(hour)\n var minute = document.getElementById(minute)\n var ampm = document.getElementById(ampm)\n\n if (0 < year.value)\n {\n // Return ISO date string\n // Note: This relies heavily on what date_components_support.py puts into the form.\n field.value = year.value + "-" + month.value + "-" + day.value + " " + hour.value + ":" + minute.value\n // Handle optional AM/PM\n if (ampm && ampm.value)\n field.value = field.value + " " + ampm.value\n } \n else \n {\n // Return empty string\n field.value = ''\n // Reset widgets\n month.options[0].selected = 1\n day.options[0].selected = 1\n hour.options[0].selected = 1\n minute.options[0].selected = 1\n if (ampm && ampm.options)\n ampm.options[0].selected = 1\n }\n}\n\n\n\n\n/* ----- calendarpopup.js ----- */\n\n// The calendar popup show/hide:\n\n function showDay(date) {\n document.getElementById('day' + date).style.visibility = 'visible';\n return true;\n } \n function hideDay(date) {\n document.getElementById('day' + date).style.visibility = 'hidden';\n return true;\n }\n\n\n \n\n\n\n\n/* ----- ie5fixes.js ----- */\n/* Mike Malloch's fixes for Internet Explorer 5 - \n * We dont care too much about IE5,\n * But these stop if from spitting errormessages at the user \n */\nfunction hackPush(el){\n this[this.length] = el;\n}\n\nfunction hackPop(){\n var N = this.length - 1, el = this[N];\n this.length = N\n return el;\n}\n\nfunction hackShift(){\n var one = this[0], N = this.length;\n for (var i = 1; i < N; i++){\n this[i-1] = this[i];\n }\n this.length = N-1\n return one;\n}\n\nvar testPushPop = new Array();\nif (testPushPop.push){\n}else{\n Array.prototype.push = hackPush\n Array.prototype.pop = hackPop\n Array.prototype.shift = hackShift;\n}\n\n/* ----- formUnload.js ----- */\n/* BeforeUnload form processing */\nif (!window.beforeunload) (function() {\n var BeforeUnloadHandler = function() {\n var self = this;\n\n this.message = window.form_modified_message ||\n "Your form has not been saved. All changes you have made will be lost.";\n\n this.forms = [];\n this.chkId = [];\n this.chkType = new this.CheckType();\n this.handlers = [this.isAnyFormChanged];\n this.submitting = false;\n\n this.execute = function(event) {\n if (self.submitting) return;\n if (!event) event = window.event;\n\n for (var i = 0; i < self.handlers.length; i++) {\n var fn = self.handlers[i];\n var message = message || fn.apply(self);\n }\n if (message===true) message = self.message;\n if (message===false) message = undefined;\n if (event && message) { event.returnValue = message; }\n return message;\n }\n this.execute.tool = this;\n }\n var Class = BeforeUnloadHandler.prototype;\n\n // form checking code\n Class.isAnyFormChanged = function() {\n for (var i=0; i < this.forms.length; i++) {\n var form = this.forms[i];\n if (this.isElementChanged(form)) {\n return true;\n }\n }\n return false;\n }\n Class.addHandler = function(fn) {\n this.handlers.push(fn);\n }\n Class.onsubmit = function() {\n var tool = window.onbeforeunload && window.onbeforeunload.tool;\n tool.submitting = true;\n }\n Class.addForm = function(form) {\n for (var i = 0; i < this.forms.length; i++) {\n if (this.forms[i]==form) return;\n }\n this.forms.push(form);\n form.onsubmit = this.onsubmit;\n var elements = form.getElementsByTagName('input');\n for (var j = 0; j < elements.length; j++) {\n var ele = elements[j];\n if (ele.type=='hidden') {\n ele.setAttribute('originalValue', ele.defaultValue);\n }\n }\n }\n Class.addForms = function() {\n for (var i = 0; i < arguments.length; i++) {\n var element = arguments[i];\n if (!element) continue;\n if (element.tagName=='FORM') {\n this.addForm(element);\n }\n else {\n var forms = element.getElementsByTagName('form');\n for (var j = 0; j < forms.length; j++) {\n this.addForm(forms[j]);\n }\n }\n }\n }\n Class.removeForms = function() {\n for (var i = 0; i < arguments.length; i++) {\n var element = arguments[i];\n if (!element) continue;\n if (element.tagName=='FORM') {\n for (var j = 0; j < arguments.length; j++) {\n if (this.forms[j] == element) {\n this.forms.splice(j--, 1);\n element.onsubmit=null;\n }\n }\n } else {\n var forms = element.getElementsByTagName('form');\n for (var j = 0; j < forms.length; j++) {\n this.removeForms(forms[j]);\n }\n }\n }\n }\n\n Class.CheckType = function() {};\n var c = Class.CheckType.prototype;\n c.checkbox = c.radio = function(ele) {\n return ele.checked != ele.defaultChecked;\n }\n c.password = c.textarea = c.text = function(ele) {\n return ele.value != ele.defaultValue;\n }\n // hidden: cannot tell on Mozilla without special treatment\n c.hidden = function(ele) {\n var orig = ele.getAttribute("originalValue");\n return orig && (ele.value != orig);\n }\n\n c['select-one'] = function(ele) {\n for (var i=0 ; i < ele.length; i++) {\n var opt = ele.options[i];\n if ( opt.selected != opt.defaultSelected) {\n if (i===0 && opt.selected) continue; /* maybe no default */\n return true;\n }\n }\n return false;\n }\n\n c['select-multiple'] = function(ele) {\n for (var i=0 ; i < ele.length; i++) {\n var opt = ele.options[i];\n if ( opt.selected != opt.defaultSelected) {\n return true;\n }\n }\n return false;\n }\n\n Class.chk_form = function(form) {\n var elements = form.elements;\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): null);\n param_default("showsTime", false);\n param_default("timeFormat", "24");\n param_default("electric", true);\n param_default("step", 2);\n param_default("position", null);\n param_default("cache", false);\n param_default("showOthers", false);\n param_default("multiple", null);\n\n if (!(cal && params.cache)) {\n\twindow.calendar = cal = new Calendar(params.firstDay,\n\t null,\n\t onJsCalendarDateUpdate,\n\t function(cal) { cal.hide(); });\n\tcal.time24 = true;\n\tcal.weekNumbers = true;\n\tmustCreate = true;\n } else {\n cal.hide();\n }\n cal.showsOtherMonths = false;\n cal.yearStep = 2;\n cal.setRange(yearStart,yearEnd);\n cal.params = params;\n cal.setDateStatusHandler(null);\n cal.getDateText = null;\n cal.setDateFormat(format);\n if (mustCreate)\n\tcal.create();\n cal.refresh();\n if (!params.position)\n cal.showAtElement(input_id_anchor, null);\n else\n cal.showAt(params.position[0], params.position[1]);\n return false;\n}\n\n\n// This function updates a hidden date field with the current values of the widgets\nfunction update_date_field(field, year, month, day, hour, minute, ampm)\n{\n var field = document.getElementById(field)\n var date = document.getElementById(date)\n var year = document.getElementById(year)\n var month = document.getElementById(month)\n var day = document.getElementById(day)\n var hour = document.getElementById(hour)\n var minute = document.getElementById(minute)\n var ampm = document.getElementById(ampm)\n\n if (0 < year.value)\n {\n // Return ISO date string\n // Note: This relies heavily on what date_components_support.py puts into the form.\n field.value = year.value + "-" + month.value + "-" + day.value + " " + hour.value + ":" + minute.value\n // Handle optional AM/PM\n if (ampm && ampm.value)\n field.value = field.value + " " + ampm.value\n } \n else \n {\n // Return empty string\n field.value = ''\n // Reset widgets\n month.options[0].selected = 1\n day.options[0].selected = 1\n hour.options[0].selected = 1\n minute.options[0].selected = 1\n if (ampm && ampm.options)\n ampm.options[0].selected = 1\n }\n}\n\n\n\n\n/* ----- calendarpopup.js ----- */\n\n// The calendar popup show/hide:\n\n function showDay(date) {\n document.getElementById('day' + date).style.visibility = 'visible';\n return true;\n } \n function hideDay(date) {\n document.getElementById('day' + date).style.visibility = 'hidden';\n return true;\n }\n\n\n \n\n\n\n\n/* ----- ie5fixes.js ----- */\n/* Mike Malloch's fixes for Internet Explorer 5 - \n * We dont care too much about IE5,\n * But these stop if from spitting errormessages at the user \n */\nfunction hackPush(el){\n this[this.length] = el;\n}\n\nfunction hackPop(){\n var N = this.length - 1, el = this[N];\n this.length = N\n return el;\n}\n\nfunction hackShift(){\n var one = this[0], N = this.length;\n for (var i = 1; i < N; i++){\n this[i-1] = this[i];\n }\n this.length = N-1\n return one;\n}\n\nvar testPushPop = new Array();\nif (testPushPop.push){\n}else{\n Array.prototype.push = hackPush\n Array.prototype.pop = hackPop\n Array.prototype.shift = hackShift;\n}\n\n/* ----- formUnload.js ----- */\n/* BeforeUnload form processing */\nif (!window.beforeunload) (function() {\n var BeforeUnloadHandler = function() {\n var self = this;\n\n this.message = window.form_modified_message ||\n "Your form has not been saved. All changes you have made will be lost.";\n\n this.forms = [];\n this.chkId = [];\n this.chkType = new this.CheckType();\n this.handlers = [this.isAnyFormChanged];\n this.submitting = false;\n\n this.execute = function(event) {\n if (self.submitting) return;\n if (!event) event = window.event;\n\n for (var i = 0; i < self.handlers.length; i++) {\n var fn = self.handlers[i];\n var message = message || fn.apply(self);\n }\n if (message===true) message = self.message;\n if (message===false) message = undefined;\n if (event && message) { event.returnValue = message; }\n return message;\n }\n this.execute.tool = this;\n }\n var Class = BeforeUnloadHandler.prototype;\n\n // form checking code\n Class.isAnyFormChanged = function() {\n for (var i=0; i < this.forms.length; i++) {\n var form = this.forms[i];\n if (this.isElementChanged(form)) {\n return true;\n }\n }\n return false;\n }\n Class.addHandler = function(fn) {\n this.handlers.push(fn);\n }\n Class.onsubmit = function() {\n var tool = window.onbeforeunload && window.onbeforeunload.tool;\n tool.submitting = true;\n }\n Class.addForm = function(form) {\n for (var i = 0; i < this.forms.length; i++) {\n if (this.forms[i]==form) return;\n }\n this.forms.push(form);\n form.onsubmit = this.onsubmit;\n var elements = form.getElementsByTagName('input');\n for (var j = 0; j < elements.length; j++) {\n var ele = elements[j];\n if (ele.type=='hidden') {\n ele.setAttribute('originalValue', ele.defaultValue);\n }\n }\n }\n Class.addForms = function() {\n for (var i = 0; i < arguments.length; i++) {\n var element = arguments[i];\n if (!element) continue;\n if (element.tagName=='FORM') {\n this.addForm(element);\n }\n else {\n var forms = element.getElementsByTagName('form');\n for (var j = 0; j < forms.length; j++) {\n this.addForm(forms[j]);\n }\n }\n }\n }\n Class.removeForms = function() {\n for (var i = 0; i < arguments.length; i++) {\n var element = arguments[i];\n if (!element) continue;\n if (element.tagName=='FORM') {\n for (var j = 0; j < arguments.length; j++) {\n if (this.forms[j] == element) {\n this.forms.splice(j--, 1);\n element.onsubmit=null;\n }\n }\n } else {\n var forms = element.getElementsByTagName('form');\n for (var j = 0; j < forms.length; j++) {\n this.removeForms(forms[j]);\n }\n }\n }\n }\n\n Class.CheckType = function() {};\n var c = Class.CheckType.prototype;\n c.checkbox = c.radio = function(ele) {\n return ele.checked != ele.defaultChecked;\n }\n c.password = c.textarea = c.text = function(ele) {\n return ele.value != ele.defaultValue;\n }\n // hidden: cannot tell on Mozilla without special treatment\n c.hidden = function(ele) {\n var orig = ele.getAttribute("originalValue");\n return orig && (ele.value != orig);\n }\n\n c['select-one'] = function(ele) {\n for (var i=0 ; i < ele.length; i++) {\n var opt = ele.options[i];\n if ( opt.selected != opt.defaultSelected) {\n if (i===0 && opt.selected) continue; /* maybe no default */\n return true;\n }\n }\n return false;\n }\n\n c['select-multiple'] = function(ele) {\n for (var i=0 ; i < ele.length; i++) {\n var opt = ele.options[i];\n if ( opt.selected != opt.defaultSelected) {\n return true;\n }\n }\n return false;\n }\n\n Class.chk_form = function(form) {\n var elements = form.elements;\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): }\n }\n return false;\n }\n\n Class.isElementChanged = function(ele) {\n var method = ele.id && this.chkId[ele.id];\n if (!method && ele.type && ele.name)\n method = this.chkType[ele.type];\n if (!method && ele.tagName)\n method = this['chk_'+ele.tagName.toLowerCase()];\n\n return method? method.apply(this, [ele]) : false;\n };\n\n window.onbeforeunload = new BeforeUnloadHandler().execute;\n \n registerPloneFunction(function() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var tool = window.onbeforeunload && window.onbeforeunload.tool;\n var content = getContentArea();\n if (tool && content) {\n var forms = cssQuery('form.enableUnloadProtection');\n for (var i=0; i < forms.length; i++) {\n tool.addForm(forms[i]);\n }\n }\n });\n})();\n\n/* ----- sarissa.js ----- */\n/*****************************************************************************\n *\n * Sarissa XML library version 0.9.6\n * Copyright (c) 2003 Manos Batsis, \n * mailto: mbatsis at users full stop sourceforge full stop net\n * This software is distributed under the Kupu License. See\n * LICENSE.txt for license text. See the Sarissa homepage at\n * http://sarissa.sourceforge.net for more information.\n *\n *****************************************************************************\n\n * ====================================================================\n * About\n * ====================================================================\n * Sarissa cross browser XML library \n * @version 0.9.6\n * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net\n *\n * Sarissa is an ECMAScript library acting as a cross-browser wrapper for native XML APIs.\n * The library supports Gecko based browsers like Mozilla and Firefox,\n * Internet Explorer (5.5+ with MSXML3.0+) and, last but not least, KHTML based browsers like\n * Konqueror and Safari.\n *\n */\n/**\n * <p>Sarissa is a utility class. Provides static methods for DOMDocument and \n * XMLHTTP objects, DOM Node serializatrion to XML strings and other goodies.</p>\n * @constructor\n */\nfunction Sarissa(){};\n/** @private */\nSarissa.PARSED_OK = "Document contains no parsing errors";\n/**\n * Tells you whether transformNode and transformNodeToObject are available. This functionality\n * is contained in sarissa_ieemu_xslt.js and is deprecated. If you want to control XSLT transformations\n * use the XSLTProcessor\n * @deprecated\n * @type boolean\n */\nSarissa.IS_ENABLED_TRANSFORM_NODE = false;\n/**\n * tells you whether XMLHttpRequest (or equivalent) is available\n * @type boolean\n */\nSarissa.IS_ENABLED_XMLHTTP = false;\n/**\n * tells you whether selectNodes/selectSingleNode is available\n * @type boolean\n */\nSarissa.IS_ENABLED_SELECT_NODES = false;\nvar _sarissa_iNsCounter = 0;\nvar _SARISSA_IEPREFIX4XSLPARAM = "";\nvar _SARISSA_HAS_DOM_IMPLEMENTATION = document.implementation && true;\nvar _SARISSA_HAS_DOM_CREATE_DOCUMENT = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.createDocument;\nvar _SARISSA_HAS_DOM_FEATURE = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.hasFeature;\nvar _SARISSA_IS_MOZ = _SARISSA_HAS_DOM_CREATE_DOCUMENT && _SARISSA_HAS_DOM_FEATURE;\nvar _SARISSA_IS_SAFARI = navigator.userAgent.toLowerCase().indexOf("applewebkit") != -1;\nvar _SARISSA_IS_IE = document.all && window.ActiveXObject && navigator.userAgent.toLowerCase().indexOf("msie") > -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1;\n\nif(!window.Node || !window.Node.ELEMENT_NODE){\n var Node = {ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5, ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12};\n};\n\n// IE initialization\nif(_SARISSA_IS_IE){\n // for XSLT parameter names, prefix needed by IE\n _SARISSA_IEPREFIX4XSLPARAM = "xsl:";\n // used to store the most recent ProgID available out of the above\n var _SARISSA_DOM_PROGID = "";\n var _SARISSA_XMLHTTP_PROGID = "";\n /**\n * Called when the Sarissa_xx.js file is parsed, to pick most recent\n * ProgIDs for IE, then gets destroyed.\n * @param idList an array of MSXML PROGIDs from which the most recent will be picked for a given object\n * @param enabledList an array of arrays where each array has two items; the index of the PROGID for which a certain feature is enabled\n */\n pickRecentProgID = function (idList, enabledList){\n // found progID flag\n var bFound = false;\n for(var i=0; i < idList.length && !bFound; i++){\n try{\n var oDoc = new ActiveXObject(idList[i]);\n o2Store = idList[i];\n bFound = true;\n for(var j=0;j<enabledList.length;j++)\n if(i <= enabledList[j][1])\n Sarissa["IS_ENABLED_"+enabledList[j][0]] = true;\n }catch (objException){\n // trap; try next progID\n };\n };\n if (!bFound)\n throw "Could not retreive a valid progID of Class: " + idList[idList.length-1]+". (original exception: "+e+")";\n idList = null;\n return o2Store;\n };\n // pick best available MSXML progIDs\n _SARISSA_DOM_PROGID = pickRecentProgID(["Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"], [["SELECT_NODES", 2],["TRANSFORM_NODE", 2]]);\n _SARISSA_XMLHTTP_PROGID = pickRecentProgID(["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"], [["XMLHTTP", 4]]);\n _SARISSA_THREADEDDOM_PROGID = pickRecentProgID(["Msxml2.FreeThreadedDOMDocument.5.0", "MSXML2.FreeThreadedDOMDocument.4.0", "MSXML2.FreeThreadedDOMDocument.3.0"]);\n _SARISSA_XSLTEMPLATE_PROGID = pickRecentProgID(["Msxml2.XSLTemplate.5.0", "Msxml2.XSLTemplate.4.0", "MSXML2.XSLTemplate.3.0"], [["XSLTPROC", 2]]);\n // we dont need this anymore\n pickRecentProgID = null;\n //============================================\n // Factory methods (IE)\n //============================================\n // see non-IE version\n Sarissa.getDomDocument = function(sUri, sName){\n var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);\n // if a root tag name was provided, we need to load it in the DOM\n // object\n if (sName){\n // if needed, create an artifical namespace prefix the way Moz\n // does\n if (sUri){\n oDoc.loadXML("<a" + _sarissa_iNsCounter + ":" + sName + " xmlns:a" + _sarissa_iNsCounter + "=\\"" + sUri + "\\" />");\n // don't use the same prefix again\n ++_sarissa_iNsCounter;\n }\n else\n oDoc.loadXML("<" + sName + "/>");\n };\n return oDoc;\n };\n // see non-IE version \n Sarissa.getParseErrorText = function (oDoc) {\n var parseErrorText = Sarissa.PARSED_OK;\n if(oDoc.parseError != 0){\n parseErrorText = "XML Parsing Error: " + oDoc.parseError.reason + \n "\\nLocation: " + oDoc.parseError.url + \n "\\nLine Number " + oDoc.parseError.line + ", Column " + \n oDoc.parseError.linepos + \n ":\\n" + oDoc.parseError.srcText +\n "\\n";\n for(var i = 0; i < oDoc.parseError.linepos;i++){\n parseErrorText += "-";\n };\n parseErrorText += "^\\n";\n };\n return parseErrorText;\n };\n // see non-IE version\n Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {\n oDoc.setProperty("SelectionLanguage", "XPath");\n oDoc.setProperty("SelectionNamespaces", sNsSet);\n }; [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): }\n }\n return false;\n }\n\n Class.isElementChanged = function(ele) {\n var method = ele.id && this.chkId[ele.id];\n if (!method && ele.type && ele.name)\n method = this.chkType[ele.type];\n if (!method && ele.tagName)\n method = this['chk_'+ele.tagName.toLowerCase()];\n\n return method? method.apply(this, [ele]) : false;\n };\n\n window.onbeforeunload = new BeforeUnloadHandler().execute;\n \n registerPloneFunction(function() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var tool = window.onbeforeunload && window.onbeforeunload.tool;\n var content = getContentArea();\n if (tool && content) {\n var forms = cssQuery('form.enableUnloadProtection');\n for (var i=0; i < forms.length; i++) {\n tool.addForm(forms[i]);\n }\n }\n });\n})();\n\n/* ----- sarissa.js ----- */\n/*****************************************************************************\n *\n * Sarissa XML library version 0.9.6\n * Copyright (c) 2003 Manos Batsis, \n * mailto: mbatsis at users full stop sourceforge full stop net\n * This software is distributed under the Kupu License. See\n * LICENSE.txt for license text. See the Sarissa homepage at\n * http://sarissa.sourceforge.net for more information.\n *\n *****************************************************************************\n\n * ====================================================================\n * About\n * ====================================================================\n * Sarissa cross browser XML library \n * @version 0.9.6\n * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net\n *\n * Sarissa is an ECMAScript library acting as a cross-browser wrapper for native XML APIs.\n * The library supports Gecko based browsers like Mozilla and Firefox,\n * Internet Explorer (5.5+ with MSXML3.0+) and, last but not least, KHTML based browsers like\n * Konqueror and Safari.\n *\n */\n/**\n * <p>Sarissa is a utility class. Provides static methods for DOMDocument and \n * XMLHTTP objects, DOM Node serializatrion to XML strings and other goodies.</p>\n * @constructor\n */\nfunction Sarissa(){};\n/** @private */\nSarissa.PARSED_OK = "Document contains no parsing errors";\n/**\n * Tells you whether transformNode and transformNodeToObject are available. This functionality\n * is contained in sarissa_ieemu_xslt.js and is deprecated. If you want to control XSLT transformations\n * use the XSLTProcessor\n * @deprecated\n * @type boolean\n */\nSarissa.IS_ENABLED_TRANSFORM_NODE = false;\n/**\n * tells you whether XMLHttpRequest (or equivalent) is available\n * @type boolean\n */\nSarissa.IS_ENABLED_XMLHTTP = false;\n/**\n * tells you whether selectNodes/selectSingleNode is available\n * @type boolean\n */\nSarissa.IS_ENABLED_SELECT_NODES = false;\nvar _sarissa_iNsCounter = 0;\nvar _SARISSA_IEPREFIX4XSLPARAM = "";\nvar _SARISSA_HAS_DOM_IMPLEMENTATION = document.implementation && true;\nvar _SARISSA_HAS_DOM_CREATE_DOCUMENT = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.createDocument;\nvar _SARISSA_HAS_DOM_FEATURE = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.hasFeature;\nvar _SARISSA_IS_MOZ = _SARISSA_HAS_DOM_CREATE_DOCUMENT && _SARISSA_HAS_DOM_FEATURE;\nvar _SARISSA_IS_SAFARI = navigator.userAgent.toLowerCase().indexOf("applewebkit") != -1;\nvar _SARISSA_IS_IE = document.all && window.ActiveXObject && navigator.userAgent.toLowerCase().indexOf("msie") > -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1;\n\nif(!window.Node || !window.Node.ELEMENT_NODE){\n var Node = {ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5, ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12};\n};\n\n// IE initialization\nif(_SARISSA_IS_IE){\n // for XSLT parameter names, prefix needed by IE\n _SARISSA_IEPREFIX4XSLPARAM = "xsl:";\n // used to store the most recent ProgID available out of the above\n var _SARISSA_DOM_PROGID = "";\n var _SARISSA_XMLHTTP_PROGID = "";\n /**\n * Called when the Sarissa_xx.js file is parsed, to pick most recent\n * ProgIDs for IE, then gets destroyed.\n * @param idList an array of MSXML PROGIDs from which the most recent will be picked for a given object\n * @param enabledList an array of arrays where each array has two items; the index of the PROGID for which a certain feature is enabled\n */\n pickRecentProgID = function (idList, enabledList){\n // found progID flag\n var bFound = false;\n for(var i=0; i < idList.length && !bFound; i++){\n try{\n var oDoc = new ActiveXObject(idList[i]);\n o2Store = idList[i];\n bFound = true;\n for(var j=0;j<enabledList.length;j++)\n if(i <= enabledList[j][1])\n Sarissa["IS_ENABLED_"+enabledList[j][0]] = true;\n }catch (objException){\n // trap; try next progID\n };\n };\n if (!bFound)\n throw "Could not retreive a valid progID of Class: " + idList[idList.length-1]+". (original exception: "+e+")";\n idList = null;\n return o2Store;\n };\n // pick best available MSXML progIDs\n _SARISSA_DOM_PROGID = pickRecentProgID(["Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"], [["SELECT_NODES", 2],["TRANSFORM_NODE", 2]]);\n _SARISSA_XMLHTTP_PROGID = pickRecentProgID(["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"], [["XMLHTTP", 4]]);\n _SARISSA_THREADEDDOM_PROGID = pickRecentProgID(["Msxml2.FreeThreadedDOMDocument.5.0", "MSXML2.FreeThreadedDOMDocument.4.0", "MSXML2.FreeThreadedDOMDocument.3.0"]);\n _SARISSA_XSLTEMPLATE_PROGID = pickRecentProgID(["Msxml2.XSLTemplate.5.0", "Msxml2.XSLTemplate.4.0", "MSXML2.XSLTemplate.3.0"], [["XSLTPROC", 2]]);\n // we dont need this anymore\n pickRecentProgID = null;\n //============================================\n // Factory methods (IE)\n //============================================\n // see non-IE version\n Sarissa.getDomDocument = function(sUri, sName){\n var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);\n // if a root tag name was provided, we need to load it in the DOM\n // object\n if (sName){\n // if needed, create an artifical namespace prefix the way Moz\n // does\n if (sUri){\n oDoc.loadXML("<a" + _sarissa_iNsCounter + ":" + sName + " xmlns:a" + _sarissa_iNsCounter + "=\\"" + sUri + "\\" />");\n // don't use the same prefix again\n ++_sarissa_iNsCounter;\n }\n else\n oDoc.loadXML("<" + sName + "/>");\n };\n return oDoc;\n };\n // see non-IE version \n Sarissa.getParseErrorText = function (oDoc) {\n var parseErrorText = Sarissa.PARSED_OK;\n if(oDoc.parseError != 0){\n parseErrorText = "XML Parsing Error: " + oDoc.parseError.reason + \n "\\nLocation: " + oDoc.parseError.url + \n "\\nLine Number " + oDoc.parseError.line + ", Column " + \n oDoc.parseError.linepos + \n ":\\n" + oDoc.parseError.srcText +\n "\\n";\n for(var i = 0; i < oDoc.parseError.linepos;i++){\n parseErrorText += "-";\n };\n parseErrorText += "^\\n";\n };\n return parseErrorText;\n };\n // see non-IE version\n Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {\n oDoc.setProperty("SelectionLanguage", "XPath");\n oDoc.setProperty("SelectionNamespaces", sNsSet);\n } [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): euses the same XSLT stylesheet for multiple transforms\n * @constructor\n */\n XSLTProcessor = function(){\n this.template = new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);\n this.processor = null;\n };\n /**\n * Impoprts the given XSLT DOM and compiles it to a reusable transform\n * @argument xslDoc The XSLT DOMDocument to import\n */\n XSLTProcessor.prototype.importStylesheet = function(xslDoc){\n // convert stylesheet to free threaded\n var converted = new ActiveXObject(_SARISSA_THREADEDDOM_PROGID); \n converted.loadXML(xslDoc.xml);\n this.template.stylesheet = converted;\n this.processor = this.template.createProcessor();\n // (re)set default param values\n this.paramsSet = new Array();\n };\n /**\n * Transform the given XML DOM\n * @argument sourceDoc The XML DOMDocument to transform\n * @return The transformation result as a DOM Document\n */\n XSLTProcessor.prototype.transformToDocument = function(sourceDoc){\n this.processor.input = sourceDoc;\n var outDoc = new ActiveXObject(_SARISSA_DOM_PROGID);\n this.processor.output = outDoc; \n this.processor.transform();\n return outDoc;\n };\n /**\n * Not sure if this works in IE. Maybe this will allow non-well-formed\n * transformation results (i.e. with no single root element)\n * @argument sourceDoc The XML DOMDocument to transform\n * @return The transformation result as a DOM Fragment\n */\n XSLTProcessor.prototype.transformToFragment = function(sourceDoc, ownerDocument){\n return this.transformToDocument(sourceDoc);\n };\n /**\n * Set global XSLT parameter of the imported stylesheet\n * @argument nsURI The parameter namespace URI\n * @argument name The parameter base name\n * @argument value The new parameter value\n */\n XSLTProcessor.prototype.setParameter = function(nsURI, name, value){\n /* nsURI is optional but cannot be null */\n if(nsURI){\n this.processor.addParameter(name, value, nsURI);\n }else{\n this.processor.addParameter(name, value);\n };\n /* update updated params for getParameter */\n if(!this.paramsSet[""+nsURI]){\n this.paramsSet[""+nsURI] = new Array();\n };\n this.paramsSet[""+nsURI][name] = value;\n };\n /**\n * Gets a parameter if previously set by setParameter. Returns null\n * otherwise\n * @argument name The parameter base name\n * @argument value The new parameter value\n * @return The parameter value if reviously set by setParameter, null otherwise\n */\n XSLTProcessor.prototype.getParameter = function(nsURI, name){\n if(this.paramsSet[""+nsURI] && this.paramsSet[""+nsURI][name])\n return this.paramsSet[""+nsURI][name];\n else\n return null;\n };\n}\nelse{ /* end IE initialization, try to deal with real browsers now ;-) */\n if(_SARISSA_HAS_DOM_CREATE_DOCUMENT){\n if(window.XMLDocument){\n /**\n * <p>Emulate IE's onreadystatechange attribute</p>\n */\n XMLDocument.prototype.onreadystatechange = null;\n /**\n * <p>Emulates IE's readyState property, which always gives an integer from 0 to 4:</p>\n * <ul><li>1 == LOADING,</li>\n * <li>2 == LOADED,</li>\n * <li>3 == INTERACTIVE,</li>\n * <li>4 == COMPLETED</li></ul>\n */\n XMLDocument.prototype.readyState = 0;\n /**\n * <p>Emulate IE's parseError attribute</p>\n */\n XMLDocument.prototype.parseError = 0;\n\n // NOTE: setting async to false will only work with documents\n // called over HTTP (meaning a server), not the local file system,\n // unless you are using Moz 1.4+.\n // BTW the try>catch block is for 1.4; I haven't found a way to check if\n // the property is implemented without\n // causing an error and I dont want to use user agent stuff for that...\n var _SARISSA_SYNC_NON_IMPLEMENTED = false;\n try{\n /**\n * <p>Emulates IE's async property for Moz versions prior to 1.4.\n * It controls whether loading of remote XML files works\n * synchronously or asynchronously.</p>\n */\n XMLDocument.prototype.async = true;\n _SARISSA_SYNC_NON_IMPLEMENTED = true;\n }catch(e){/* trap */};\n /**\n * <p>Keeps a handle to the original load() method. Internal use and only\n * if Mozilla version is lower than 1.4</p>\n * @private\n */\n XMLDocument.prototype._sarissa_load = XMLDocument.prototype.load;\n\n /**\n * <p>Overrides the original load method to provide synchronous loading for\n * Mozilla versions prior to 1.4, using an XMLHttpRequest object (if\n * async is set to false)</p>\n * @returns the DOM Object as it was before the load() call (may be empty)\n */\n XMLDocument.prototype.load = function(sURI) {\n var oDoc = document.implementation.createDocument("", "", null);\n Sarissa.copyChildNodes(this, oDoc);\n this.parseError = 0;\n Sarissa.__setReadyState__(this, 1);\n try {\n if(this.async == false && _SARISSA_SYNC_NON_IMPLEMENTED) {\n var tmp = new XMLHttpRequest();\n tmp.open("GET", sURI, false);\n tmp.send(null);\n Sarissa.__setReadyState__(this, 2);\n Sarissa.copyChildNodes(tmp.responseXML, this);\n Sarissa.__setReadyState__(this, 3);\n }\n else {\n this._sarissa_load(sURI);\n };\n }\n catch (objException) {\n this.parseError = -1;\n }\n finally {\n if(this.async == false){\n Sarissa.__handleLoad__(this);\n };\n };\n return oDoc;\n };\n };//if(window.XMLDocument)\n\n /**\n * <p>Ensures the document was loaded correctly, otherwise sets the\n * parseError to -1 to indicate something went wrong. Internal use</p>\n * @private\n */\n Sarissa.__handleLoad__ = function(oDoc){\n if (!oDoc.documentElement || oDoc.documentElement.tagName == "parsererror")\n oDoc.parseError = -1;\n Sarissa.__setReadyState__(oDoc, 4);\n };\n \n /**\n * <p>Attached by an event handler to the load event. Internal use.</p>\n * @private\n */\n _sarissa_XMLDocument_onload = function(){\n Sarissa.__handleLoad__(this);\n };\n \n /**\n * <p>Sets the readyState property of the given DOM Document object.\n * Internal use.</p>\n * @private\n * @argument oDoc the DOM Document object to fire the\n * readystatechange event\n * @argument iReadyState the number to change the readystate property to\n */\n Sarissa.__setReadyState__ = function(oDoc, iReadyState){\n oDoc.readyState = iReadyState;\n if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange == "function")\n oDoc.onreadystatechange();\n };\n /**\n * <p>Factory method to obtain a new DOM Document object</p>\n * @argument sUri the namespace of the root node (if any)\n * @argument sUri the local name of the root node (if any)\n * @returns a new DOM Document\n */\n Sarissa.getDomDocume [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): euses the same XSLT stylesheet for multiple transforms\n * @constructor\n */\n XSLTProcessor = function(){\n this.template = new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);\n this.processor = null;\n };\n /**\n * Impoprts the given XSLT DOM and compiles it to a reusable transform\n * @argument xslDoc The XSLT DOMDocument to import\n */\n XSLTProcessor.prototype.importStylesheet = function(xslDoc){\n // convert stylesheet to free threaded\n var converted = new ActiveXObject(_SARISSA_THREADEDDOM_PROGID); \n converted.loadXML(xslDoc.xml);\n this.template.stylesheet = converted;\n this.processor = this.template.createProcessor();\n // (re)set default param values\n this.paramsSet = new Array();\n };\n /**\n * Transform the given XML DOM\n * @argument sourceDoc The XML DOMDocument to transform\n * @return The transformation result as a DOM Document\n */\n XSLTProcessor.prototype.transformToDocument = function(sourceDoc){\n this.processor.input = sourceDoc;\n var outDoc = new ActiveXObject(_SARISSA_DOM_PROGID);\n this.processor.output = outDoc; \n this.processor.transform();\n return outDoc;\n };\n /**\n * Not sure if this works in IE. Maybe this will allow non-well-formed\n * transformation results (i.e. with no single root element)\n * @argument sourceDoc The XML DOMDocument to transform\n * @return The transformation result as a DOM Fragment\n */\n XSLTProcessor.prototype.transformToFragment = function(sourceDoc, ownerDocument){\n return this.transformToDocument(sourceDoc);\n };\n /**\n * Set global XSLT parameter of the imported stylesheet\n * @argument nsURI The parameter namespace URI\n * @argument name The parameter base name\n * @argument value The new parameter value\n */\n XSLTProcessor.prototype.setParameter = function(nsURI, name, value){\n /* nsURI is optional but cannot be null */\n if(nsURI){\n this.processor.addParameter(name, value, nsURI);\n }else{\n this.processor.addParameter(name, value);\n };\n /* update updated params for getParameter */\n if(!this.paramsSet[""+nsURI]){\n this.paramsSet[""+nsURI] = new Array();\n };\n this.paramsSet[""+nsURI][name] = value;\n };\n /**\n * Gets a parameter if previously set by setParameter. Returns null\n * otherwise\n * @argument name The parameter base name\n * @argument value The new parameter value\n * @return The parameter value if reviously set by setParameter, null otherwise\n */\n XSLTProcessor.prototype.getParameter = function(nsURI, name){\n if(this.paramsSet[""+nsURI] && this.paramsSet[""+nsURI][name])\n return this.paramsSet[""+nsURI][name];\n else\n return null;\n };\n}\nelse{ /* end IE initialization, try to deal with real browsers now ;-) */\n if(_SARISSA_HAS_DOM_CREATE_DOCUMENT){\n if(window.XMLDocument){\n /**\n * <p>Emulate IE's onreadystatechange attribute</p>\n */\n XMLDocument.prototype.onreadystatechange = null;\n /**\n * <p>Emulates IE's readyState property, which always gives an integer from 0 to 4:</p>\n * <ul><li>1 == LOADING,</li>\n * <li>2 == LOADED,</li>\n * <li>3 == INTERACTIVE,</li>\n * <li>4 == COMPLETED</li></ul>\n */\n XMLDocument.prototype.readyState = 0;\n /**\n * <p>Emulate IE's parseError attribute</p>\n */\n XMLDocument.prototype.parseError = 0;\n\n // NOTE: setting async to false will only work with documents\n // called over HTTP (meaning a server), not the local file system,\n // unless you are using Moz 1.4+.\n // BTW the try>catch block is for 1.4; I haven't found a way to check if\n // the property is implemented without\n // causing an error and I dont want to use user agent stuff for that...\n var _SARISSA_SYNC_NON_IMPLEMENTED = false;\n try{\n /**\n * <p>Emulates IE's async property for Moz versions prior to 1.4.\n * It controls whether loading of remote XML files works\n * synchronously or asynchronously.</p>\n */\n XMLDocument.prototype.async = true;\n _SARISSA_SYNC_NON_IMPLEMENTED = true;\n }catch(e){/* trap */};\n /**\n * <p>Keeps a handle to the original load() method. Internal use and only\n * if Mozilla version is lower than 1.4</p>\n * @private\n */\n XMLDocument.prototype._sarissa_load = XMLDocument.prototype.load;\n\n /**\n * <p>Overrides the original load method to provide synchronous loading for\n * Mozilla versions prior to 1.4, using an XMLHttpRequest object (if\n * async is set to false)</p>\n * @returns the DOM Object as it was before the load() call (may be empty)\n */\n XMLDocument.prototype.load = function(sURI) {\n var oDoc = document.implementation.createDocument("", "", null);\n Sarissa.copyChildNodes(this, oDoc);\n this.parseError = 0;\n Sarissa.__setReadyState__(this, 1);\n try {\n if(this.async == false && _SARISSA_SYNC_NON_IMPLEMENTED) {\n var tmp = new XMLHttpRequest();\n tmp.open("GET", sURI, false);\n tmp.send(null);\n Sarissa.__setReadyState__(this, 2);\n Sarissa.copyChildNodes(tmp.responseXML, this);\n Sarissa.__setReadyState__(this, 3);\n }\n else {\n this._sarissa_load(sURI);\n };\n }\n catch (objException) {\n this.parseError = -1;\n }\n finally {\n if(this.async == false){\n Sarissa.__handleLoad__(this);\n };\n };\n return oDoc;\n };\n };//if(window.XMLDocument)\n\n /**\n * <p>Ensures the document was loaded correctly, otherwise sets the\n * parseError to -1 to indicate something went wrong. Internal use</p>\n * @private\n */\n Sarissa.__handleLoad__ = function(oDoc){\n if (!oDoc.documentElement || oDoc.documentElement.tagName == "parsererror")\n oDoc.parseError = -1;\n Sarissa.__setReadyState__(oDoc, 4);\n };\n \n /**\n * <p>Attached by an event handler to the load event. Internal use.</p>\n * @private\n */\n _sarissa_XMLDocument_onload = function(){\n Sarissa.__handleLoad__(this);\n };\n \n /**\n * <p>Sets the readyState property of the given DOM Document object.\n * Internal use.</p>\n * @private\n * @argument oDoc the DOM Document object to fire the\n * readystatechange event\n * @argument iReadyState the number to change the readystate property to\n */\n Sarissa.__setReadyState__ = function(oDoc, iReadyState){\n oDoc.readyState = iReadyState;\n if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange == "function")\n oDoc.onreadystatechange();\n };\n /**\n * <p>Factory method to obtain a new DOM Document object</p>\n * @argument sUri the namespace of the root node (if any)\n * @argument sUri the local name of the root node (if any)\n * @returns a new DOM Document\n */\n Sarissa.getDomDocum [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): sUri?sUri:"", sName?sName:"", null);\n oDoc.addEventListener("load", _sarissa_XMLDocument_onload, false);\n return oDoc;\n }; \n };//if(_SARISSA_HAS_DOM_CREATE_DOCUMENT)\n};\n//==========================================\n// Common stuff\n//==========================================\nif(!window.DOMParser){\n /** \n * DOMParser is a utility class, used to construct DOMDocuments from XML strings\n * @constructor\n */\n DOMParser = function() {\n };\n /** \n * Construct a new DOM Document from the given XMLstring\n * @param sXml the given XML string\n * @param contentType the content type of the document the given string represents (one of text/xml, application/xml, application/xhtml+xml). \n * @return a new DOM Document from the given XML string\n */\n DOMParser.prototype.parseFromString = function(sXml, contentType){\n var doc = Sarissa.getDomDocument();\n doc.loadXML(sXml);\n return doc;\n };\n \n};\n\nif(window.XMLHttpRequest){\n Sarissa.IS_ENABLED_XMLHTTP = true;\n}\nelse if(_SARISSA_IS_IE){\n /**\n * Emulate XMLHttpRequest\n * @constructor\n */\n XMLHttpRequest = function() {\n return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);\n };\n Sarissa.IS_ENABLED_XMLHTTP = true;\n};\n\nif(!window.document.importNode && _SARISSA_IS_IE){\n try{\n /**\n * Implements importNode for the current window document in IE using innerHTML.\n * Testing showed that DOM was multiple times slower than innerHTML for this,\n * sorry folks. If you encounter trouble (who knows what IE does behind innerHTML)\n * please gimme a call.\n * @param oNode the Node to import\n * @param bChildren whether to include the children of oNode\n * @returns the imported node for further use\n */\n window.document.importNode = function(oNode, bChildren){\n var importNode = document.createElement("div");\n if(bChildren)\n importNode.innerHTML = Sarissa.serialize(oNode);\n else\n importNode.innerHTML = Sarissa.serialize(oNode.cloneNode(false));\n return importNode.firstChild;\n };\n }catch(e){};\n};\nif(!Sarissa.getParseErrorText){\n /**\n * <p>Returns a human readable description of the parsing error. Usefull\n * for debugging. Tip: append the returned error string in a <pre>\n * element if you want to render it.</p>\n * <p>Many thanks to Christian Stocker for the initial patch.</p>\n * @argument oDoc The target DOM document\n * @returns The parsing error description of the target Document in\n * human readable form (preformated text)\n */\n Sarissa.getParseErrorText = function (oDoc){\n var parseErrorText = Sarissa.PARSED_OK;\n if(oDoc.parseError != 0){\n /*moz*/\n if(oDoc.documentElement.tagName == "parsererror"){\n parseErrorText = oDoc.documentElement.firstChild.data;\n parseErrorText += "\\n" + oDoc.documentElement.firstChild.nextSibling.firstChild.data;\n }/*konq*/\n else if(oDoc.documentElement.tagName == "html"){\n parseErrorText = Sarissa.getText(oDoc.documentElement.getElementsByTagName("h1")[0], false) + "\\n";\n parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("body")[0], false) + "\\n";\n parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("pre")[0], false);\n };\n };\n return parseErrorText;\n };\n};\nSarissa.getText = function(oNode, deep){\n var s = "";\n var nodes = oNode.childNodes;\n for(var i=0; i < nodes.length; i++){\n var node = nodes[i];\n var nodeType = node.nodeType;\n if(nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE){\n s += node.data;\n }\n else if(deep == true\n && (nodeType == Node.ELEMENT_NODE\n || nodeType == Node.DOCUMENT_NODE\n || nodeType == Node.DOCUMENT_FRAGMENT_NODE)){\n s += Sarissa.getText(node, true);\n };\n };\n return s;\n};\nif(window.XMLSerializer){\n /**\n * <p>Factory method to obtain the serialization of a DOM Node</p>\n * @returns the serialized Node as an XML string\n */\n Sarissa.serialize = function(oDoc){\n return (new XMLSerializer()).serializeToString(oDoc);\n };\n}else{\n if((Sarissa.getDomDocument("","foo", null)).xml){\n // see non-IE version\n Sarissa.serialize = function(oDoc) {\n // TODO: check for HTML document and return innerHTML instead\n return oDoc.xml;\n };\n /**\n * Utility class to serialize DOM Node objects to XML strings\n * @constructor\n */\n XMLSerializer = function(){};\n /**\n * Serialize the given DOM Node to an XML string\n * @param oNode the DOM Node to serialize\n */\n XMLSerializer.prototype.serializeToString = function(oNode) {\n return oNode.xml;\n };\n };\n};\n\n/**\n * strips tags from a markup string\n */\nSarissa.stripTags = function (s) {\n return s.replace(/<[^>]+>/g,"");\n};\n/**\n * <p>Deletes all child nodes of the given node</p>\n * @argument oNode the Node to empty\n */\nSarissa.clearChildNodes = function(oNode) {\n while(oNode.hasChildNodes()){\n oNode.removeChild(oNode.firstChild);\n };\n};\n/**\n * <p> Copies the childNodes of nodeFrom to nodeTo</p>\n * <p> <b>Note:</b> The second object's original content is deleted before \n * the copy operation, unless you supply a true third parameter</p>\n * @argument nodeFrom the Node to copy the childNodes from\n * @argument nodeTo the Node to copy the childNodes to\n * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false\n */\nSarissa.copyChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {\n if(!bPreserveExisting){\n Sarissa.clearChildNodes(nodeTo);\n };\n var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;\n var nodes = nodeFrom.childNodes;\n if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));\n };\n }\n else{\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(nodes[i].cloneNode(true));\n };\n };\n};\n\n/**\n * <p> Moves the childNodes of nodeFrom to nodeTo</p>\n * <p> <b>Note:</b> The second object's original content is deleted before \n * the move operation, unless you supply a true third parameter</p>\n * @argument nodeFrom the Node to copy the childNodes from\n * @argument nodeTo the Node to copy the childNodes to\n * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false\n */\nSarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {\n if(!bPreserveExisting){\n Sarissa.clearChildNodes(nodeTo);\n };\n \n var nodes = nodeFrom.childNodes;\n // if within the same doc, just move, else copy and delete\n if(nodeFrom.ownerDocument == nodeTo.ownerDocument){\n nodeTo.appendChild(nodes[i]);\n }else{\n var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;\n if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));\n };\n }\n else{\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(nodes[i].cloneNode(true));\n };\n };\n Sarissa.clearChildNodes(nodeFrom);\n };\n \n};\n\n/** \n * <p>Serialize any object to an XML string. All properties are serialized using the property [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): sUri?sUri:"", sName?sName:"", null);\n oDoc.addEventListener("load", _sarissa_XMLDocument_onload, false);\n return oDoc;\n }; \n };//if(_SARISSA_HAS_DOM_CREATE_DOCUMENT)\n};\n//==========================================\n// Common stuff\n//==========================================\nif(!window.DOMParser){\n /** \n * DOMParser is a utility class, used to construct DOMDocuments from XML strings\n * @constructor\n */\n DOMParser = function() {\n };\n /** \n * Construct a new DOM Document from the given XMLstring\n * @param sXml the given XML string\n * @param contentType the content type of the document the given string represents (one of text/xml, application/xml, application/xhtml+xml). \n * @return a new DOM Document from the given XML string\n */\n DOMParser.prototype.parseFromString = function(sXml, contentType){\n var doc = Sarissa.getDomDocument();\n doc.loadXML(sXml);\n return doc;\n };\n \n};\n\nif(window.XMLHttpRequest){\n Sarissa.IS_ENABLED_XMLHTTP = true;\n}\nelse if(_SARISSA_IS_IE){\n /**\n * Emulate XMLHttpRequest\n * @constructor\n */\n XMLHttpRequest = function() {\n return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);\n };\n Sarissa.IS_ENABLED_XMLHTTP = true;\n};\n\nif(!window.document.importNode && _SARISSA_IS_IE){\n try{\n /**\n * Implements importNode for the current window document in IE using innerHTML.\n * Testing showed that DOM was multiple times slower than innerHTML for this,\n * sorry folks. If you encounter trouble (who knows what IE does behind innerHTML)\n * please gimme a call.\n * @param oNode the Node to import\n * @param bChildren whether to include the children of oNode\n * @returns the imported node for further use\n */\n window.document.importNode = function(oNode, bChildren){\n var importNode = document.createElement("div");\n if(bChildren)\n importNode.innerHTML = Sarissa.serialize(oNode);\n else\n importNode.innerHTML = Sarissa.serialize(oNode.cloneNode(false));\n return importNode.firstChild;\n };\n }catch(e){};\n};\nif(!Sarissa.getParseErrorText){\n /**\n * <p>Returns a human readable description of the parsing error. Usefull\n * for debugging. Tip: append the returned error string in a <pre>\n * element if you want to render it.</p>\n * <p>Many thanks to Christian Stocker for the initial patch.</p>\n * @argument oDoc The target DOM document\n * @returns The parsing error description of the target Document in\n * human readable form (preformated text)\n */\n Sarissa.getParseErrorText = function (oDoc){\n var parseErrorText = Sarissa.PARSED_OK;\n if(oDoc.parseError != 0){\n /*moz*/\n if(oDoc.documentElement.tagName == "parsererror"){\n parseErrorText = oDoc.documentElement.firstChild.data;\n parseErrorText += "\\n" + oDoc.documentElement.firstChild.nextSibling.firstChild.data;\n }/*konq*/\n else if(oDoc.documentElement.tagName == "html"){\n parseErrorText = Sarissa.getText(oDoc.documentElement.getElementsByTagName("h1")[0], false) + "\\n";\n parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("body")[0], false) + "\\n";\n parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("pre")[0], false);\n };\n };\n return parseErrorText;\n };\n};\nSarissa.getText = function(oNode, deep){\n var s = "";\n var nodes = oNode.childNodes;\n for(var i=0; i < nodes.length; i++){\n var node = nodes[i];\n var nodeType = node.nodeType;\n if(nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE){\n s += node.data;\n }\n else if(deep == true\n && (nodeType == Node.ELEMENT_NODE\n || nodeType == Node.DOCUMENT_NODE\n || nodeType == Node.DOCUMENT_FRAGMENT_NODE)){\n s += Sarissa.getText(node, true);\n };\n };\n return s;\n};\nif(window.XMLSerializer){\n /**\n * <p>Factory method to obtain the serialization of a DOM Node</p>\n * @returns the serialized Node as an XML string\n */\n Sarissa.serialize = function(oDoc){\n return (new XMLSerializer()).serializeToString(oDoc);\n };\n}else{\n if((Sarissa.getDomDocument("","foo", null)).xml){\n // see non-IE version\n Sarissa.serialize = function(oDoc) {\n // TODO: check for HTML document and return innerHTML instead\n return oDoc.xml;\n };\n /**\n * Utility class to serialize DOM Node objects to XML strings\n * @constructor\n */\n XMLSerializer = function(){};\n /**\n * Serialize the given DOM Node to an XML string\n * @param oNode the DOM Node to serialize\n */\n XMLSerializer.prototype.serializeToString = function(oNode) {\n return oNode.xml;\n };\n };\n};\n\n/**\n * strips tags from a markup string\n */\nSarissa.stripTags = function (s) {\n return s.replace(/<[^>]+>/g,"");\n};\n/**\n * <p>Deletes all child nodes of the given node</p>\n * @argument oNode the Node to empty\n */\nSarissa.clearChildNodes = function(oNode) {\n while(oNode.hasChildNodes()){\n oNode.removeChild(oNode.firstChild);\n };\n};\n/**\n * <p> Copies the childNodes of nodeFrom to nodeTo</p>\n * <p> <b>Note:</b> The second object's original content is deleted before \n * the copy operation, unless you supply a true third parameter</p>\n * @argument nodeFrom the Node to copy the childNodes from\n * @argument nodeTo the Node to copy the childNodes to\n * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false\n */\nSarissa.copyChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {\n if(!bPreserveExisting){\n Sarissa.clearChildNodes(nodeTo);\n };\n var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;\n var nodes = nodeFrom.childNodes;\n if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));\n };\n }\n else{\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(nodes[i].cloneNode(true));\n };\n };\n};\n\n/**\n * <p> Moves the childNodes of nodeFrom to nodeTo</p>\n * <p> <b>Note:</b> The second object's original content is deleted before \n * the move operation, unless you supply a true third parameter</p>\n * @argument nodeFrom the Node to copy the childNodes from\n * @argument nodeTo the Node to copy the childNodes to\n * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false\n */\nSarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {\n if(!bPreserveExisting){\n Sarissa.clearChildNodes(nodeTo);\n };\n \n var nodes = nodeFrom.childNodes;\n // if within the same doc, just move, else copy and delete\n if(nodeFrom.ownerDocument == nodeTo.ownerDocument){\n nodeTo.appendChild(nodes[i]);\n }else{\n var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;\n if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));\n };\n }\n else{\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(nodes[i].cloneNode(true));\n };\n };\n Sarissa.clearChildNodes(nodeFrom);\n };\n \n};\n\n/** \n * <p>Serialize any object to an XML string. All properties are serialized using the propert [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 4484 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 4484 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ex/key as the value of the <code>key</code> attribute.</p>\n * @argument anyObject the object to serialize\n * @argument objectName a name for that object\n * @return the XML serializationj of the given object as a string\n */\nSarissa.xmlize = function(anyObject, objectName, indentSpace){\n indentSpace = indentSpace?indentSpace:'';\n var s = indentSpace + '<' + objectName + '>';\n var isLeaf = false;\n if(!(anyObject instanceof Object) || anyObject instanceof Number || anyObject instanceof String \n || anyObject instanceof Boolean || anyObject instanceof Date){\n s += Sarissa.escape(""+anyObject);\n isLeaf = true;\n }else{\n s += "\\n";\n var itemKey = '';\n var isArrayItem = anyObject instanceof Array;\n for(var name in anyObject){\n s += Sarissa.xmlize(anyObject[name], (isArrayItem?"array-item key=\\""+name+"\\"":name), indentSpace + " ");\n };\n s += indentSpace;\n };\n return s += (objectName.indexOf(' ')!=-1?"</array-item>\\n":"</" + objectName + ">\\n");\n};\n\n/** \n * Escape the given string chacters that correspond to the five predefined XML entities\n * @param sXml the string to escape\n */\nSarissa.escape = function(sXml){\n return sXml.replace(/&/g, "&")\n .replace(/</g, "<")\n .replace(/>/g, ">")\n .replace(/"/g, """)\n .replace(/'/g, "'");\n};\n\n/** \n * Unescape the given string. This turns the occurences of the predefined XML \n * entities to become the characters they represent correspond to the five predefined XML entities\n * @param sXml the string to unescape\n */\nSarissa.unescape = function(sXml){\n return sXml.replace(/'/g,"'")\n .replace(/"/g,"\\"")\n .replace(/>/g,">")\n .replace(/</g,"<")\n .replace(/&/g,"&");\n};\n// EOF\n\n\n/* ----- login.js ----- */\n// Functions used by login pages\r\n\r\nfunction cookiesEnabled() {\r\n // Test whether cookies are enabled by attempting to set a cookie and then change its value\r\n // set test cookie\r\n var c = "areYourCookiesEnabled=0";\r\n document.cookie = c;\r\n var dc = document.cookie;\r\n // cookie not set? fail\r\n if (dc.indexOf(c) == -1) return 0;\r\n // change test cookie\r\n c = "areYourCookiesEnabled=1";\r\n document.cookie = c;\r\n dc = document.cookie;\r\n // cookie not changed? fail\r\n if (dc.indexOf(c) == -1) return 0;\r\n // delete cookie\r\n document.cookie = "areYourCookiesEnabled=; expires=Thu, 01-Jan-70 00:00:01 GMT";\r\n return 1;\r\n}\r\n\r\nfunction setLoginVars(user_name_id, alt_user_name_id, password_id, empty_password_id, js_enabled_id, cookies_enabled_id) {\r\n // Indicate that javascript is enabled, set cookie status, copy username and password length info to \r\n // alternative variables since these vars are removed from the request by zope's authentication mechanism.\r\n if (js_enabled_id) {\r\n el = document.getElementById(js_enabled_id);\r\n if (el) { el.value = 1; }\r\n }\r\n if (cookies_enabled_id) {\r\n el = document.getElementById(cookies_enabled_id);\r\n // Do a fresh cookies enabled test every time we press the login button\r\n // so that we are up to date in case the user enables cookies after seeing\r\n // the cookies message.\r\n if (el) { el.value = cookiesEnabled(); } \r\n }\r\n if (user_name_id && alt_user_name_id) {\r\n user_name = document.getElementById(user_name_id)\r\n alt_user_name = document.getElementById(alt_user_name_id)\r\n if (user_name && alt_user_name) {\r\n alt_user_name.value = user_name.value;\r\n } \r\n }\r\n if (password_id && empty_password_id) {\r\n password = document.getElementById(password_id)\r\n empty_password = document.getElementById(empty_password_id)\r\n if (password && empty_password) {\r\n if (password.value.length==0) {\r\n empty_password.value = '1';\r\n } else {\r\n empty_password.value = '0';\r\n }\r\n }\r\n }\r\n return 1;\r\n}\r\n\r\nfunction showCookieMessage(msg_id) {\r\n // Show the element with the given id if cookies are not enabled\r\n msg = document.getElementById(msg_id)\r\n if (msg) {\r\n if (cookiesEnabled()) {\r\n msg.style.display = 'none';\r\n } else {\r\n msg.style.display = 'block';\r\n }\r\n }\r\n}\r\n\r\nfunction showEnableCookiesMessage() {\r\n // Show the element with the id 'enable_cookies_message' if cookies are not enabled\r\n showCookieMessage('enable_cookies_message')\r\n}\r\n// Call showEnableCookiesMessage after the page loads\r\nregisterPloneFunction(showEnableCookiesMessage);\r\n\n [Fri Nov 10 11:06:01 2006] [debug] mod_disk_cache.c(1043): disk_cache: Body for URL http://localhost:9999/portal_javascripts/Plone Tableless/ploneScripts4205.js? cached. [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 4484 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): ex/key as the value of the <code>key</code> attribute.</p>\n * @argument anyObject the object to serialize\n * @argument objectName a name for that object\n * @return the XML serializationj of the given object as a string\n */\nSarissa.xmlize = function(anyObject, objectName, indentSpace){\n indentSpace = indentSpace?indentSpace:'';\n var s = indentSpace + '<' + objectName + '>';\n var isLeaf = false;\n if(!(anyObject instanceof Object) || anyObject instanceof Number || anyObject instanceof String \n || anyObject instanceof Boolean || anyObject instanceof Date){\n s += Sarissa.escape(""+anyObject);\n isLeaf = true;\n }else{\n s += "\\n";\n var itemKey = '';\n var isArrayItem = anyObject instanceof Array;\n for(var name in anyObject){\n s += Sarissa.xmlize(anyObject[name], (isArrayItem?"array-item key=\\""+name+"\\"":name), indentSpace + " ");\n };\n s += indentSpace;\n };\n return s += (objectName.indexOf(' ')!=-1?"</array-item>\\n":"</" + objectName + ">\\n");\n};\n\n/** \n * Escape the given string chacters that correspond to the five predefined XML entities\n * @param sXml the string to escape\n */\nSarissa.escape = function(sXml){\n return sXml.replace(/&/g, "&")\n .replace(/</g, "<")\n .replace(/>/g, ">")\n .replace(/"/g, """)\n .replace(/'/g, "'");\n};\n\n/** \n * Unescape the given string. This turns the occurences of the predefined XML \n * entities to become the characters they represent correspond to the five predefined XML entities\n * @param sXml the string to unescape\n */\nSarissa.unescape = function(sXml){\n return sXml.replace(/'/g,"'")\n .replace(/"/g,"\\"")\n .replace(/>/g,">")\n .replace(/</g,"<")\n .replace(/&/g,"&");\n};\n// EOF\n\n\n/* ----- login.js ----- */\n// Functions used by login pages\r\n\r\nfunction cookiesEnabled() {\r\n // Test whether cookies are enabled by attempting to set a cookie and then change its value\r\n // set test cookie\r\n var c = "areYourCookiesEnabled=0";\r\n document.cookie = c;\r\n var dc = document.cookie;\r\n // cookie not set? fail\r\n if (dc.indexOf(c) == -1) return 0;\r\n // change test cookie\r\n c = "areYourCookiesEnabled=1";\r\n document.cookie = c;\r\n dc = document.cookie;\r\n // cookie not changed? fail\r\n if (dc.indexOf(c) == -1) return 0;\r\n // delete cookie\r\n document.cookie = "areYourCookiesEnabled=; expires=Thu, 01-Jan-70 00:00:01 GMT";\r\n return 1;\r\n}\r\n\r\nfunction setLoginVars(user_name_id, alt_user_name_id, password_id, empty_password_id, js_enabled_id, cookies_enabled_id) {\r\n // Indicate that javascript is enabled, set cookie status, copy username and password length info to \r\n // alternative variables since these vars are removed from the request by zope's authentication mechanism.\r\n if (js_enabled_id) {\r\n el = document.getElementById(js_enabled_id);\r\n if (el) { el.value = 1; }\r\n }\r\n if (cookies_enabled_id) {\r\n el = document.getElementById(cookies_enabled_id);\r\n // Do a fresh cookies enabled test every time we press the login button\r\n // so that we are up to date in case the user enables cookies after seeing\r\n // the cookies message.\r\n if (el) { el.value = cookiesEnabled(); } \r\n }\r\n if (user_name_id && alt_user_name_id) {\r\n user_name = document.getElementById(user_name_id)\r\n alt_user_name = document.getElementById(alt_user_name_id)\r\n if (user_name && alt_user_name) {\r\n alt_user_name.value = user_name.value;\r\n } \r\n }\r\n if (password_id && empty_password_id) {\r\n password = document.getElementById(password_id)\r\n empty_password = document.getElementById(empty_password_id)\r\n if (password && empty_password) {\r\n if (password.value.length==0) {\r\n empty_password.value = '1';\r\n } else {\r\n empty_password.value = '0';\r\n }\r\n }\r\n }\r\n return 1;\r\n}\r\n\r\nfunction showCookieMessage(msg_id) {\r\n // Show the element with the given id if cookies are not enabled\r\n msg = document.getElementById(msg_id)\r\n if (msg) {\r\n if (cookiesEnabled()) {\r\n msg.style.display = 'none';\r\n } else {\r\n msg.style.display = 'block';\r\n }\r\n }\r\n}\r\n\r\nfunction showEnableCookiesMessage() {\r\n // Show the element with the id 'enable_cookies_message' if cookies are not enabled\r\n showCookieMessage('enable_cookies_message')\r\n}\r\n// Call showEnableCookiesMessage after the page loads\r\nregisterPloneFunction(showEnableCookiesMessage);\r\n\n [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (metadata-EOS): 0 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_proxy_http.c(1537): proxy: end body send [Fri Nov 10 11:06:01 2006] [debug] proxy_util.c(1816): proxy: HTTP: has released connection for (localhost) [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [eatcrlf-nonblocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(117): mod_dumpio: dumpio_in - 11 [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-IMMORTAL): 0 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(117): mod_dumpio: dumpio_in - 70014 [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (metadata-FLUSH): 0 bytes [Fri Nov 10 11:06:01 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (metadata-EOC): 0 bytes
[Fri Nov 10 11:10:15 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (metadata-EOS): 0 bytes [Fri Nov 10 11:10:15 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [eatcrlf-nonblocking] 0 readbytes [Fri Nov 10 11:10:15 2006] [debug] mod_dumpio.c(117): mod_dumpio: dumpio_in - 11 [Fri Nov 10 11:10:15 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:15 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-IMMORTAL): 0 bytes [Fri Nov 10 11:10:15 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:15 2006] [debug] mod_dumpio.c(117): mod_dumpio: dumpio_in - 70014 [Fri Nov 10 11:10:15 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:15 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (metadata-FLUSH): 0 bytes [Fri Nov 10 11:10:15 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (metadata-EOC): 0 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 72 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): GET /portal_javascripts/Plone%20Tableless/ploneScripts4205.js HTTP/1.0\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 23 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): User-Agent: Wget/1.10\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 13 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): Accept: */*\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 22 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): Host: localhost:9999\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 24 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): Connection: Keep-Alive\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 2 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): \r\n [Fri Nov 10 11:10:41 2006] [debug] mod_cache.c(129): Adding CACHE_SAVE filter for /portal_javascripts/Plone%20Tableless/ploneScripts4205.js [Fri Nov 10 11:10:41 2006] [debug] mod_cache.c(136): Adding CACHE_REMOVE_URL filter for /portal_javascripts/Plone%20Tableless/ploneScripts4205.js [Fri Nov 10 11:10:41 2006] [debug] mod_proxy_http.c(54): proxy: HTTP: canonicalising URL //localhost:9080/VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/portal_javascripts/Plone Tableless/ploneScripts4205.js [Fri Nov 10 11:10:41 2006] [debug] proxy_util.c(1378): [client 127.0.0.1] proxy: http: found worker http://localhost:9080/VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/ for http://localhost:9080/VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/portal_javascripts/Plone%20Tableless/ploneScripts4205.js [Fri Nov 10 11:10:41 2006] [debug] mod_proxy.c(756): Running scheme http handler (attempt 0) [Fri Nov 10 11:10:41 2006] [debug] mod_proxy_http.c(1662): proxy: HTTP: serving URL http://localhost:9080/VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/portal_javascripts/Plone%20Tableless/ploneScripts4205.js [Fri Nov 10 11:10:41 2006] [debug] proxy_util.c(1798): proxy: HTTP: has acquired connection for (localhost) [Fri Nov 10 11:10:41 2006] [debug] proxy_util.c(1858): proxy: connecting http://localhost:9080/VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/portal_javascripts/Plone%20Tableless/ploneScripts4205.js to localhost:9080 [Fri Nov 10 11:10:41 2006] [debug] proxy_util.c(1951): proxy: connected /VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/portal_javascripts/Plone%20Tableless/ploneScripts4205.js to localhost:9080 [Fri Nov 10 11:10:41 2006] [debug] proxy_util.c(2045): proxy: HTTP: fam 2 socket created to connect to localhost [Fri Nov 10 11:10:41 2006] [debug] proxy_util.c(2141): proxy: HTTP: connection complete to 127.0.0.1:9080 (localhost) [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 131 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): GET /VirtualHostBase/http/localhost:9999/ulisse/VirtualHostRoot/portal_javascripts/Plone%20Tableless/ploneScripts4205.js HTTP/1.1\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 22 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): Host: localhost:9080\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 23 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): User-Agent: Wget/1.10\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 13 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): Accept: */*\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 18 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): Max-Forwards: 10\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 28 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): X-Forwarded-For: 127.0.0.1\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 34 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): X-Forwarded-Host: localhost:9999\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 37 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): X-Forwarded-Server: griffo.sissa.it\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-POOL): 24 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-POOL): Connection: Keep-Alive\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-IMMORTAL): 2 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-IMMORTAL): \r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (metadata-FLUSH): 0 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 17 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): HTTP/1.1 200 OK\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 81 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): Server: Zope/(Zope 2.8.6-final, python 2.4.2, linux2) ZServer/1.1 Plone/Unknown\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): D [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): D [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 36 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ate: Fri, 10 Nov 2006 10:10:41 GMT\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): C [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): C [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 22 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ontent-Length: 92131\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): A [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): A [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 21 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ccept-Ranges: bytes\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): E [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): E [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 39 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): xpires: Fri, 17 Nov 2006 10:10:41 GMT\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): L [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): L [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 45 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ast-Modified: Fri, 10 Nov 2006 10:10:41 GMT\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): C [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): C [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 30 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ache-Control: max-age=604800\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): C [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): C [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 53 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ontent-Type: application/x-javascript;charset=utf-8\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [speculative-blocking] 1 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): \r [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): \r [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 1 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): \n [Fri Nov 10 11:10:41 2006] [debug] mod_proxy_http.c(1448): proxy: start body send [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): /* Merged Plone Javascript file\n * This file is dynamically assembled from separate parts.\n * Some of these parts have 3rd party licenses or copyright information attached\n * Such information is valid for that section,\n * not for the entire composite file\n * originating files are separated by ----- filename.js -----\n */\n\n/* ----- register_function.js ----- */\n/* Essential javascripts, used a lot. \n * These should be placed inline\n * We have to be certain they are loaded before anything that uses them \n */\n\n// check for ie5 mac\nvar bugRiddenCrashPronePieceOfJunk = (\n navigator.userAgent.indexOf('MSIE 5') != -1\n &&\n navigator.userAgent.indexOf('Mac') != -1\n)\n\n// check for W3CDOM compatibility\nvar W3CDOM = (!bugRiddenCrashPronePieceOfJunk &&\n document.getElementsByTagName &&\n document.createElement);\n\n// cross browser function for registering event handlers\nfunction registerEventListener(elem, event, func) {\n if (elem.addEventListener) {\n elem.addEventListener(event, func, false);\n return true;\n } else if (elem.attachEvent) {\n var result = elem.attachEvent("on"+event, func);\n return result;\n }\n // maybe we could implement something with an array\n return false;\n}\n\n// cross browser function for unregistering event handlers\nfunction unRegisterEventListener(elem, event, func) {\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, false);\n return true;\n } else if (elem.detachEvent) {\n var result = elem.detachEvent("on"+event, func);\n return result;\n }\n // maybe we could implement something with an array\n return false;\n}\n\nfunction registerPloneFunction(func) {\n // registers a function to fire onload.\n registerEventListener(window, "load", func);\n}\n\nfunction unRegisterPloneFunction(func) {\n // unregisters a function so it does not fire onload.\n unRegisterEventListener(window, "load", func);\n}\n\nfunction getContentArea() {\n // returns our content area element\n if (W3CDOM) {\n var node = document.getElementById('region-content');\n if (!node) {\n node = document.getElementById('content');\n }\n return node;\n }\n} \n\n\n/* ----- cssQuery.js ----- */\n/*\n\tcssQuery, version 2.0 (2005/05/23)\n\tCopyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)\n\tLicense: http://creativecommons.org/licenses/LGPL/2.1/\n*/\neval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('7 z=5(){7 1M="2.0 (3e)";7 Z=M;7 C=/\\\\s*,\\\\s*/;7 z=5(s,D){3d{7 m=[];7 u=1C.3c.2j&&!D;7 b=(D)?(D.3b==26)?D:[D]:[1l];7 1N=1f(s).1o(C),i;h(i=0;i<1N.x;i++){s=1I(1N[i]);8(Z&&s.V(0,3).2i("")==" *#"){s=s.V(2);D=2e([],b,s[1])}1J D=b;7 j=0,t,f,a,c="";H(j<s.x){t=s[j++];f=s[j++];c+=t+f;a="";8(s[j]=="("){H(s[j++]!=")")a+=s[j];a=a.V(0,-1);c+="("+a+")"}D=(u&&12[c])?12[c]:2c(D,t,f,a);8(u)12[c]=D}m=m.3a(D)}1E z.2k;6 m}39(e){z.2k=e;6[]}};z.2a=5(){6"5 z() {\\\\n [1M "+1M+"]\\\\n}"};7 12={};z.2j=P;z.38=5(s){8(s){s=1I(s).2i("");1E 12[s]}1J 12={}};7 1y={};7 1g=P;z.1c=5(n,s){8(1g)1a("s="+17(s));1y[n]=X s()};z.37=5(c){6 c?1a(c):y};7 F={};7 l={};7 Y=[];F[" "]=5(r,f,t,n){7 e,i,j;h(i=0;i<f.x;i++){7 s=13(f[i],t,n);h(j=0;(e=s[j]);j++){8(R(e)&&19(e,n))r.B(e)}}};F["#"]=5(r,f,i){7 e,j;h(j=0;(e=f[j]);j++)8(e.Q==i)r.B(e)};F["."]=5(r,f,c){c=X 1x("(^|\\\\\\\\s)"+c+"(\\\\\\\\s|$)");7 e,i;h(i=0;(e=f[i]);i++)8(c.q(e.23))r.B(e)};F[":"]=5(r,f,p,a){7 t=l[p],e,i;8(t)h(i=0;(e=f[i]);i++)8(t(e,a))r.B(e)};l["36"]=5(e){7 d=T(e);8(d.1L)h(7 i=0;i<d.1L.x;i++){8(d.1L[i]==e)6 M}};l["35"]=5(e){};7 R=5(e){6(e&&e.1i==1&&e.1k!="!")?e:2d};7 1d=5(e){H(e&&(e=e.34)&&!R(e))2h;6 e};7 J=5(e){H(e&&(e=e.33)&&!R(e))2h;6 e};7 1v=5(e){6 R(e.2g)||J(e.2g)};7 1X=5(e){6 R(e.2f)||1d(e.2f)};7 1r=5(e){7 c=[];e=1v(e);H(e){c.B(e);e=J(e)}6 c};7 1m=5(e){6 T(e).32=="31 30"};7 T=5(e){6 e.2Z||e.1l};7 13=5(e,t){6(t=="*"&&e.1K)?e.1K:e.13(t)};7 1e=5(e,t,n){8(t=="*")6 R(e);8(!19(e,n))6 P;8(!1m(e))t=t.2Y();6 e.1k==t};7 19=5(e,n){6!n||(n=="*")||(e.2X==n)};7 1j=5(e){6 e.1P};5 2e(r,f,Q){7 m,i,j;h(i=0;i<f.x;i++){8(m=f[i].1K.2W(Q)){8(m.x==2d)r.B(m);1J h(j=0;j<m.x;j++)r.B(m[j])}}6 r};7 N=/\\\\|/;5 2c(D,t,f,a){8(N.q(f)){f=f.1o(N);a=f[0];f=f[1]}7 r=[];8(F[t]){F[t](r,D,f,a)}6 r};7 S=/^[^\\\\s>+~]/;7 2b=/[\\\\s#.:>+~()@]|[^\\\\s#.:>+~()@]+/g;5 1I(s){8(S.q(s))s=" "+s;6 s.10(2b)||[]};7 W=/\\\\s*([\\\\s>+~(),]|^|$)\\\\s*/g;7 I=/([\\\\s>+~,]|[^(]\\\\+|^)([#.:@])/g;7 1f=5(s){6 s.G(W,"$1").G(I,"$1*$2")};7 1z={2a:5(){6"\\'"},10:/^(\\'[^\\']*\\')|("[^"]*")$/,q:5(s){6 y.10.q(s)},21:5(s){6 y.q(s)?s:y+s+y},29:5(s){6 y.q(s)?s.V(1,-1):s}};7 1w=5(t){6 1z.29(t)};7 E=/([\\\\/()[\\\\]?{}|*+-])/g;5 U(s){6 s.G(E,"\\\\\\\\$1")};X 5(){7 1G=5(f,o,a){f.1H(o,a)};8(\\'\\'.G(/^/,17)){7 27=17.1D.G;7 28=5(e,r){7 m,n="",s=y;H(s&&(m=e.2V(s))){n+=s.V(0,m.2U)+1G(r,y,m);s=s.V(m.2T)}6 n+s};17.1D.G=5(e,r){y.G=(2S r=="5")?28:27;6 y.G(e,r)}}8(!24.1H){7 L="1H-"+2R(X 2Q);1G=5(f,o,a){7 r;o[L]=f;18(a.x){A 0:r=o[L]();O;A 1:r=o[L](a[0]);O;A 2:r=o[L](a[0],a[1]);O;A 3:r=o[L](a[0],a[1],a[2]);O;A 4:r=o[L](a[0],a[1],a[2],a[3]);O;2P:7 1F=[],i=a.x-1;2O 1F[i]="a["+i+"]";H(i--);1a("r=o[L]("+1F+")")}1E o[L];6 r}}8(![].B)26.1D.B=5(){h(7 i=0;i<1C.x;i++){y[y.x]=1C[i]}6 y.x}};z.1c("1b-1Y",5(){F[">"]=5(r,f,t,n){7 e,i,j;h(i=0;i<f.x;i++){7 s=1r(f[i]);h(j=0;(e=s[j]);j++)8(1e(e,t,n))r.B(e)}};F["+"]=5(r,f,t,n){h(7 i=0;i<f.x;i++){7 e=J(f[i]);8(e&&1e(e,t,n))r.B(e)}};F["@"]=5(r,f,a){7 t=Y[a].q;7 e,i;h(i=0;(e=f[i]);i++)8(t(e))r.B(e)};l["2N-15"]=5(e){6!1d(e)};l["1B"]=5(e,c){c=X 1x("^"+c,"i");H(e&&!e.16("1B"))e=e.1q;6 e&&c.q(e.16("1B"))};7 9={};9.1A="@";9.K={};9.10=/\\\\[([\\\\w-]+)\\\\s*(\\\\W?=)?\\\\s*([^\\\\]]*)\\\\]/g;9.G=5(m,a,c,v){7 k=9.1A+m;8(!Y[k]){a=9.25(a,c||"",v||"");Y[k]=a;Y.B(a)}6 Y[k].Q};9.1Z=5(s){6 s.G(y.10,y.G)};9.25=5(p,t,v){7 a={};a.Q=9.1A+Y.x;a.2M=p;t=y.K[t];t=t?t(9.16(p),1w(v)):P;a.q=X 24("e","6 "+t);6 a};9.16=5(n){18(n.2L()){A"Q":6"e.Q";A"2K":6"e.23";A"h":6"e.2J";A"22":8(Z){6"17((e.2I.10(/22=\\\\"?([^\\\\\\\\s\\\\"]*)\\\\"?/)||[])[1]||\\'\\')"}}6"e.16(\\'"+n+"\\')"};y.9=9;9.K[""]=5(a){6 a};9.K["="]=5(a,v){6 a+"=="+1z.21(v)};9.K["~="]=5(a,v){6"/(^|\\\\\\\\s)"+U(v)+"(\\\\\\\\s|$)/.q("+a+")"};9.K["|="]=5(a,v){6"/^"+U(v)+"(-|$)/.q("+a+")"};7 20=1f;1f=5(s){6 20(9.1Z(s))}});z.1c("1b-2H",5(){7 1t=1y["1b-1Y"];8(!1t)6;F["~"]=5(r,f,t,n){7 e,i;h(i=0;(e=f[i]);i++){H(e=J(e)){8(1e(e,t,n))r.B(e)}}};l["2G"]=5(e,t){t=X 1x(U(1w(t)));6 t.q(1j(e))};l["2F"]=5(e){6 e==T(e).1Q};l["2E"]=5(e){7 n,i;h(i=0;(n=e.1O[i]);i++){8(R(n)||n.1i==3)6 P}6 M};l["1V-15"]=5(e){6!J(e)};l["2D-15"]=5(e){e=e.1q;6 1v(e)==1X(e)};l["2C"]=5(e,s){7 n=z(s,T(e));h(7 i=0;i<n.x;i++){8(n[i]==e)6 P}6 M};l["1W-15"]=5(e,a){6 1s(e,a,1d)};l["1W-1V-15"]=5(e,a){6 1s(e,a,J)};l["2B"]=5(e){6 e.Q==2A.2z.V(1)};l["1U"]=5(e){6 e.1U};l["2y"]=5(e){6 e.1u===P};l["1u"]=5(e){6 e.1u};l["1T"]=5(e){6 e.1T};7 9=1t.9;9.K["^="]=5(a,v){6"/^"+U(v)+"/.q("+a+")"};9.K["$="]=5(a,v){6"/"+U(v)+"$/.q("+a+")"};9.K["*="]=5(a,v){6"/"+U(v)+"/.q("+a+")"};5 1s(e,a,t){18(a){A"n":6 M;A"2x":a="2n";O;A"2w":a="2n+1"}7 1p=1r(e.1q);5 1n(i){7 i=(t==J)?1p.x-i:i-1;6 1p[i]==e};8(!14(a))6 1n(a);a=a.1o("n");7 m=1S(a[0]);7 s=1S(a[1]);8((14(m)||m==1)&&s==0)6 M;8(m==0&&!14(s))6 1n(s);8(14(s))s=0;7 c=1;H(e=t(e))c++;8(14(m)||m==1)6(t==J)?(c<=s):(s>=c);6(c%m)==s}});z.1c("1b-2v",5(){Z=1a("P;/*@2u@8(@\\\\2t)Z=M@2s@*/");8(!Z){13=5(e,t,n){6 n?e.2r("*",t):e.13(t)};19=5(e,n){6!n||(n=="*")||(e.2q==n)};1m=1l.1R?5(e){6/2p/i.q(T(e).1R)}:5(e){6 T(e).1Q.1k!="2o"};1j=5(e){6 e.2m||e.1P||1h(e)};5 1h(e){7 t="",n,i;h(i=0;(n=e.1O[i]);i++){18(n.1i){A 11:A 1:t+=1h(n);O;A 3:t+=n.2l;O}}6 t}}});1g=M;6 z}();',62,201,'|||||function|return|var|if|AttributeSelector||||||||for||||pseudoClasses|||||test|||||||length|this|cssQuery|case|push||fr||selectors|replace|while||nextElementSibling|tests|APPLY|true||break|false|id|thisElement||getDoc [Fri Nov 10 11:10:41 2006] [debug] mod_cache.c(602): cache: Caching url: /portal_javascripts/Plone%20Tableless/ploneScripts4205.js [Fri Nov 10 11:10:41 2006] [debug] mod_cache.c(608): cache: Removing CACHE_REMOVE_URL filter. [Fri Nov 10 11:10:41 2006] [debug] mod_disk_cache.c(954): disk_cache: Stored headers for URL http://localhost:9999/portal_javascripts/Plone Tableless/ploneScripts4205.js? [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 409 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): HTTP/1.1 200 OK\r\nDate: Fri, 10 Nov 2006 10:10:41 GMT\r\nServer: Zope/(Zope 2.8.6-final, python 2.4.2, linux2) ZServer/1.1 Plone/Unknown\r\nContent-Length: 92131\r\nAccept-Ranges: bytes\r\nExpires: Fri, 17 Nov 2006 10:10:41 GMT\r\nLast-Modified: Fri, 10 Nov 2006 10:10:41 GMT\r\nCache-Control: max-age=604800\r\nContent-Type: application/x-javascript;charset=utf-8\r\nKeep-Alive: timeout=5, max=100\r\nConnection: Keep-Alive\r\n\r\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): /* Merged Plone Javascript file\n * This file is dynamically assembled from separate parts.\n * Some of these parts have 3rd party licenses or copyright information attached\n * Such information is valid for that section,\n * not for the entire composite file\n * originating files are separated by ----- filename.js -----\n */\n\n/* ----- register_function.js ----- */\n/* Essential javascripts, used a lot. \n * These should be placed inline\n * We have to be certain they are loaded before anything that uses them \n */\n\n// check for ie5 mac\nvar bugRiddenCrashPronePieceOfJunk = (\n navigator.userAgent.indexOf('MSIE 5') != -1\n &&\n navigator.userAgent.indexOf('Mac') != -1\n)\n\n// check for W3CDOM compatibility\nvar W3CDOM = (!bugRiddenCrashPronePieceOfJunk &&\n document.getElementsByTagName &&\n document.createElement);\n\n// cross browser function for registering event handlers\nfunction registerEventListener(elem, event, func) {\n if (elem.addEventListener) {\n elem.addEventListener(event, func, false);\n return true;\n } else if (elem.attachEvent) {\n var result = elem.attachEvent("on"+event, func);\n return result;\n }\n // maybe we could implement something with an array\n return false;\n}\n\n// cross browser function for unregistering event handlers\nfunction unRegisterEventListener(elem, event, func) {\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, false);\n return true;\n } else if (elem.detachEvent) {\n var result = elem.detachEvent("on"+event, func);\n return result;\n }\n // maybe we could implement something with an array\n return false;\n}\n\nfunction registerPloneFunction(func) {\n // registers a function to fire onload.\n registerEventListener(window, "load", func);\n}\n\nfunction unRegisterPloneFunction(func) {\n // unregisters a function so it does not fire onload.\n unRegisterEventListener(window, "load", func);\n}\n\nfunction getContentArea() {\n // returns our content area element\n if (W3CDOM) {\n var node = document.getElementById('region-content');\n if (!node) {\n node = document.getElementById('content');\n }\n return node;\n }\n} \n\n\n/* ----- cssQuery.js ----- */\n/*\n\tcssQuery, version 2.0 (2005/05/23)\n\tCopyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)\n\tLicense: http://creativecommons.org/licenses/LGPL/2.1/\n*/\neval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('7 z=5(){7 1M="2.0 (3e)";7 Z=M;7 C=/\\\\s*,\\\\s*/;7 z=5(s,D){3d{7 m=[];7 u=1C.3c.2j&&!D;7 b=(D)?(D.3b==26)?D:[D]:[1l];7 1N=1f(s).1o(C),i;h(i=0;i<1N.x;i++){s=1I(1N[i]);8(Z&&s.V(0,3).2i("")==" *#"){s=s.V(2);D=2e([],b,s[1])}1J D=b;7 j=0,t,f,a,c="";H(j<s.x){t=s[j++];f=s[j++];c+=t+f;a="";8(s[j]=="("){H(s[j++]!=")")a+=s[j];a=a.V(0,-1);c+="("+a+")"}D=(u&&12[c])?12[c]:2c(D,t,f,a);8(u)12[c]=D}m=m.3a(D)}1E z.2k;6 m}39(e){z.2k=e;6[]}};z.2a=5(){6"5 z() {\\\\n [1M "+1M+"]\\\\n}"};7 12={};z.2j=P;z.38=5(s){8(s){s=1I(s).2i("");1E 12[s]}1J 12={}};7 1y={};7 1g=P;z.1c=5(n,s){8(1g)1a("s="+17(s));1y[n]=X s()};z.37=5(c){6 c?1a(c):y};7 F={};7 l={};7 Y=[];F[" "]=5(r,f,t,n){7 e,i,j;h(i=0;i<f.x;i++){7 s=13(f[i],t,n);h(j=0;(e=s[j]);j++){8(R(e)&&19(e,n))r.B(e)}}};F["#"]=5(r,f,i){7 e,j;h(j=0;(e=f[j]);j++)8(e.Q==i)r.B(e)};F["."]=5(r,f,c){c=X 1x("(^|\\\\\\\\s)"+c+"(\\\\\\\\s|$)");7 e,i;h(i=0;(e=f[i]);i++)8(c.q(e.23))r.B(e)};F[":"]=5(r,f,p,a){7 t=l[p],e,i;8(t)h(i=0;(e=f[i]);i++)8(t(e,a))r.B(e)};l["36"]=5(e){7 d=T(e);8(d.1L)h(7 i=0;i<d.1L.x;i++){8(d.1L[i]==e)6 M}};l["35"]=5(e){};7 R=5(e){6(e&&e.1i==1&&e.1k!="!")?e:2d};7 1d=5(e){H(e&&(e=e.34)&&!R(e))2h;6 e};7 J=5(e){H(e&&(e=e.33)&&!R(e))2h;6 e};7 1v=5(e){6 R(e.2g)||J(e.2g)};7 1X=5(e){6 R(e.2f)||1d(e.2f)};7 1r=5(e){7 c=[];e=1v(e);H(e){c.B(e);e=J(e)}6 c};7 1m=5(e){6 T(e).32=="31 30"};7 T=5(e){6 e.2Z||e.1l};7 13=5(e,t){6(t=="*"&&e.1K)?e.1K:e.13(t)};7 1e=5(e,t,n){8(t=="*")6 R(e);8(!19(e,n))6 P;8(!1m(e))t=t.2Y();6 e.1k==t};7 19=5(e,n){6!n||(n=="*")||(e.2X==n)};7 1j=5(e){6 e.1P};5 2e(r,f,Q){7 m,i,j;h(i=0;i<f.x;i++){8(m=f[i].1K.2W(Q)){8(m.x==2d)r.B(m);1J h(j=0;j<m.x;j++)r.B(m[j])}}6 r};7 N=/\\\\|/;5 2c(D,t,f,a){8(N.q(f)){f=f.1o(N);a=f[0];f=f[1]}7 r=[];8(F[t]){F[t](r,D,f,a)}6 r};7 S=/^[^\\\\s>+~]/;7 2b=/[\\\\s#.:>+~()@]|[^\\\\s#.:>+~()@]+/g;5 1I(s){8(S.q(s))s=" "+s;6 s.10(2b)||[]};7 W=/\\\\s*([\\\\s>+~(),]|^|$)\\\\s*/g;7 I=/([\\\\s>+~,]|[^(]\\\\+|^)([#.:@])/g;7 1f=5(s){6 s.G(W,"$1").G(I,"$1*$2")};7 1z={2a:5(){6"\\'"},10:/^(\\'[^\\']*\\')|("[^"]*")$/,q:5(s){6 y.10.q(s)},21:5(s){6 y.q(s)?s:y+s+y},29:5(s){6 y.q(s)?s.V(1,-1):s}};7 1w=5(t){6 1z.29(t)};7 E=/([\\\\/()[\\\\]?{}|*+-])/g;5 U(s){6 s.G(E,"\\\\\\\\$1")};X 5(){7 1G=5(f,o,a){f.1H(o,a)};8(\\'\\'.G(/^/,17)){7 27=17.1D.G;7 28=5(e,r){7 m,n="",s=y;H(s&&(m=e.2V(s))){n+=s.V(0,m.2U)+1G(r,y,m);s=s.V(m.2T)}6 n+s};17.1D.G=5(e,r){y.G=(2S r=="5")?28:27;6 y.G(e,r)}}8(!24.1H){7 L="1H-"+2R(X 2Q);1G=5(f,o,a){7 r;o[L]=f;18(a.x){A 0:r=o[L]();O;A 1:r=o[L](a[0]);O;A 2:r=o[L](a[0],a[1]);O;A 3:r=o[L](a[0],a[1],a[2]);O;A 4:r=o[L](a[0],a[1],a[2],a[3]);O;2P:7 1F=[],i=a.x-1;2O 1F[i]="a["+i+"]";H(i--);1a("r=o[L]("+1F+")")}1E o[L];6 r}}8(![].B)26.1D.B=5(){h(7 i=0;i<1C.x;i++){y[y.x]=1C[i]}6 y.x}};z.1c("1b-1Y",5(){F[">"]=5(r,f,t,n){7 e,i,j;h(i=0;i<f.x;i++){7 s=1r(f[i]);h(j=0;(e=s[j]);j++)8(1e(e,t,n))r.B(e)}};F["+"]=5(r,f,t,n){h(7 i=0;i<f.x;i++){7 e=J(f[i]);8(e&&1e(e,t,n))r.B(e)}};F["@"]=5(r,f,a){7 t=Y[a].q;7 e,i;h(i=0;(e=f[i]);i++)8(t(e))r.B(e)};l["2N-15"]=5(e){6!1d(e)};l["1B"]=5(e,c){c=X 1x("^"+c,"i");H(e&&!e.16("1B"))e=e.1q;6 e&&c.q(e.16("1B"))};7 9={};9.1A="@";9.K={};9.10=/\\\\[([\\\\w-]+)\\\\s*(\\\\W?=)?\\\\s*([^\\\\]]*)\\\\]/g;9.G=5(m,a,c,v){7 k=9.1A+m;8(!Y[k]){a=9.25(a,c||"",v||"");Y[k]=a;Y.B(a)}6 Y[k].Q};9.1Z=5(s){6 s.G(y.10,y.G)};9.25=5(p,t,v){7 a={};a.Q=9.1A+Y.x;a.2M=p;t=y.K[t];t=t?t(9.16(p),1w(v)):P;a.q=X 24("e","6 "+t);6 a};9.16=5(n){18(n.2L()){A"Q":6"e.Q";A"2K":6"e.23";A"h":6"e.2J";A"22":8(Z){6"17((e.2I.10(/22=\\\\"?([^\\\\\\\\s\\\\"]*)\\\\"?/)||[])[1]||\\'\\')"}}6"e.16(\\'"+n+"\\')"};y.9=9;9.K[""]=5(a){6 a};9.K["="]=5(a,v){6 a+"=="+1z.21(v)};9.K["~="]=5(a,v){6"/(^|\\\\\\\\s)"+U(v)+"(\\\\\\\\s|$)/.q("+a+")"};9.K["|="]=5(a,v){6"/^"+U(v)+"(-|$)/.q("+a+")"};7 20=1f;1f=5(s){6 20(9.1Z(s))}});z.1c("1b-2H",5(){7 1t=1y["1b-1Y"];8(!1t)6;F["~"]=5(r,f,t,n){7 e,i;h(i=0;(e=f[i]);i++){H(e=J(e)){8(1e(e,t,n))r.B(e)}}};l["2G"]=5(e,t){t=X 1x(U(1w(t)));6 t.q(1j(e))};l["2F"]=5(e){6 e==T(e).1Q};l["2E"]=5(e){7 n,i;h(i=0;(n=e.1O[i]);i++){8(R(n)||n.1i==3)6 P}6 M};l["1V-15"]=5(e){6!J(e)};l["2D-15"]=5(e){e=e.1q;6 1v(e)==1X(e)};l["2C"]=5(e,s){7 n=z(s,T(e));h(7 i=0;i<n.x;i++){8(n[i]==e)6 P}6 M};l["1W-15"]=5(e,a){6 1s(e,a,1d)};l["1W-1V-15"]=5(e,a){6 1s(e,a,J)};l["2B"]=5(e){6 e.Q==2A.2z.V(1)};l["1U"]=5(e){6 e.1U};l["2y"]=5(e){6 e.1u===P};l["1u"]=5(e){6 e.1u};l["1T"]=5(e){6 e.1T};7 9=1t.9;9.K["^="]=5(a,v){6"/^"+U(v)+"/.q("+a+")"};9.K["$="]=5(a,v){6"/"+U(v)+"$/.q("+a+")"};9.K["*="]=5(a,v){6"/"+U(v)+"/.q("+a+")"};5 1s(e,a,t){18(a){A"n":6 M;A"2x":a="2n";O;A"2w":a="2n+1"}7 1p=1r(e.1q);5 1n(i){7 i=(t==J)?1p.x-i:i-1;6 1p[i]==e};8(!14(a))6 1n(a);a=a.1o("n");7 m=1S(a[0]);7 s=1S(a[1]);8((14(m)||m==1)&&s==0)6 M;8(m==0&&!14(s))6 1n(s);8(14(s))s=0;7 c=1;H(e=t(e))c++;8(14(m)||m==1)6(t==J)?(c<=s):(s>=c);6(c%m)==s}});z.1c("1b-2v",5(){Z=1a("P;/*@2u@8(@\\\\2t)Z=M@2s@*/");8(!Z){13=5(e,t,n){6 n?e.2r("*",t):e.13(t)};19=5(e,n){6!n||(n=="*")||(e.2q==n)};1m=1l.1R?5(e){6/2p/i.q(T(e).1R)}:5(e){6 T(e).1Q.1k!="2o"};1j=5(e){6 e.2m||e.1P||1h(e)};5 1h(e){7 t="",n,i;h(i=0;(n=e.1O[i]);i++){18(n.1i){A 11:A 1:t+=1h(n);O;A 3:t+=n.2l;O}}6 t}}});1g=M;6 z}();',62,201,'|||||function|return|var|if|AttributeSelector||||||||for||||pseudoClasses|||||test|||||||length|this|cssQuery|case|push||fr||selectors|replace|while||nextElementSibling|tests|APPLY|true||break|false|id|thisElement||getDo [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ntsByTagName|isNaN|child|getAttribute|String|switch|compareNamespace|eval|css|addModule|previousElementSibling|compareTagName|parseSelector|loaded|_0|nodeType|getTextContent|tagName|document|isXML|_1|split|ch|parentNode|childElements|nthChild|css2|disabled|firstElementChild|getText|RegExp|modules|Quote|PREFIX|lang|arguments|prototype|delete|aa|ap|apply|_2|else|all|links|version|se|childNodes|innerText|documentElement|contentType|parseInt|indeterminate|checked|last|nth|lastElementChild|level2|parse|_3|add|href|className|Function|create|Array|_4|_5|remove|toString|ST|select|null|_6|lastChild|firstChild|continue|join|caching|error|nodeValue|textContent||HTML|xml|prefix|getElementsByTagNameNS|end|x5fwin32|cc_on|standard|odd|even|enabled|hash|location|target|not|only|empty|root|contains|level3|outerHTML|htmlFor|class|toLowerCase|name|first|do|default|Date|Number|typeof|lastIndex|index|exec|item|scopeName|toUpperCase|ownerDocument|Document|XML|mimeType|nextSibling|previousSibling|visited|link|valueOf|clearCache|catch|concat|constructor|callee|try|beta'.split('|'),0,{}))\n\n\n/* ----- plone_javascript_variables.js ----- */\n\n// Global Plone variables that need to be accessible to the Javascripts\nvar portal_url = 'http://localhost:9999';\nvar form_modified_message = 'Your form has not been saved. All changes you have made will be lost.';\nvar form_resubmit_message = 'Your already clicked the submit button. Do you really want to submit this form again?';\n\n\n/* ----- nodeutilities.js ----- */\n\nfunction wrapNode(node, wrappertype, wrapperclass){\n /* utility function to wrap a node in an arbitrary element of type "wrappertype"\n * with a class of "wrapperclass" */\n var wrapper = document.createElement(wrappertype)\n wrapper.className = wrapperclass;\n var innerNode = node.parentNode.replaceChild(wrapper,node);\n wrapper.appendChild(innerNode);\n};\n\nfunction nodeContained(innernode, outernode){\n // check if innernode is contained in outernode\n var node = innernode.parentNode;\n while (node != document) {\n if (node == outernode) {\n return true; \n }\n node=node.parentNode;\n }\n return false;\n};\n\nfunction findContainer(node, func) {\n // Starting with the given node, find the nearest containing element\n // for which the given function returns true.\n\n while (node != null) {\n if (func(node)) {\n return node;\n }\n node = node.parentNode;\n }\n return false;\n};\n\nfunction hasClassName(node, class_name) {\n return new RegExp('\\\\b'+class_name+'\\\\b').test(node.className);\n};\n\nfunction addClassName(node, class_name) {\n if (!node.className) {\n node.className = class_name;\n } else if (!hasClassName(node, class_name)) {\n var className = node.className+" "+class_name;\n // cleanup\n node.className = className.split(/\\s+/).join(' ');\n }\n};\n\nfunction removeClassName(node, class_name) {\n var className = node.className;\n if (className) {\n // remove\n className = className.replace(new RegExp('\\\\b'+class_name+'\\\\b'), '');\n // cleanup\n className = className.replace(/\\s+/g, ' ');\n node.className = className.replace(/\\s+$/g, '');\n }\n};\n\nfunction replaceClassName(node, old_class, new_class, ignore_missing) {\n if (ignore_missing && !hasClassName(node, old_class)) {\n addClassName(node, new_class);\n } else {\n var className = node.className;\n if (className) {\n // replace\n className = className.replace(new RegExp('\\\\b'+old_class+'\\\\b'), new_class);\n // cleanup\n className = className.replace(/\\s+/g, ' ');\n node.className = className.replace(/\\s+$/g, '');\n }\n }\n};\n\nfunction walkTextNodes(node, func, data) {\n // traverse childnodes and call func when a textnode is found\n if (!node){return false}\n if (node.hasChildNodes) {\n // we can't use for (i in childNodes) here, because the number of\n // childNodes might change (higlightsearchterms)\n for (var i=0;i<node.childNodes.length;i++) {\n walkTextNodes(node.childNodes[i], func, data);\n }\n if (node.nodeType == 3) {\n // this is a text node\n func(node, data);\n }\n }\n};\n\n/* These are two functions, because getInnerTextFast doesn't always return the\n * the same results, as it depends on the implementation of node.innerText of\n * the browser. getInnerTextCompatible will always return the same values, but\n * is a bit slower. The difference is just in the whitespace, so if this\n * doesn't matter, you should always use getInnerTextFast.\n */\n\nfunction getInnerTextCompatible(node) {\n var result = new Array();\n walkTextNodes(node,\n function(n, d){d.push(n.nodeValue)},\n result);\n return result.join("");\n};\n\nfunction getInnerTextFast(node) {\n if (node.innerText) {\n return node.innerText;\n } else {\n return getInnerTextCompatible(node);\n }\n};\n\n/* This function reorder nodes in the DOM.\n * fetch_func - the function which returns the value for comparison\n * cmp_func - the compare function, if not provided then the string of the\n * value returned by fetch_func is used.\n */\nfunction sortNodes(nodes, fetch_func, cmp_func) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n // wrapper for sorting\n var SortNodeWrapper = function(node) {\n this.value = fetch_func(node);\n this.cloned_node = node.cloneNode(true);\n this.toString = function() {\n if (this.value.toString) {\n return this.value.toString();\n } else {\n return this.value;\n }\n }\n }\n\n // wrap nodes\n var items = new Array();\n for (var i=0; i<nodes.length; i++) {\n items.push(new SortNodeWrapper(nodes[i]));\n }\n\n //sort\n if (cmp_func) {\n items.sort(cmp_func);\n } else {\n items.sort();\n }\n\n // reorder nodes\n for (var i=0; i<items.length; i++) {\n var dest = nodes[i];\n dest.parentNode.replaceChild(items[i].cloned_node, dest);\n }\n};\n\n\n/* ----- cookie_functions.js ----- */\nfunction createCookie(name,value,days) {\n if (days) {\n var date = new Date();\n date.setTime(date.getTime()+(days*24*60*60*1000));\n var expires = "; expires="+date.toGMTString();\n } else {\n expires = "";\n }\n document.cookie = name+"="+escape(value)+expires+"; path=/;";\n};\n\nfunction readCookie(name) {\n var nameEQ = name + "=";\n var ca = document.cookie.split(';');\n for(var i=0;i < ca.length;i++) {\n var c = ca[i];\n while (c.charAt(0)==' ') {\n c = c.substring(1,c.length);\n }\n if (c.indexOf(nameEQ) == 0) {\n return unescape(c.substring(nameEQ.length,c.length));\n }\n }\n return null;\n};\n\n\n/* ----- livesearch.js ----- */\n/*\n// +----------------------------------------------------------------------+\n// | Copyright (c) 2004 Bitflux GmbH |\n// +----------------------------------------------------------------------+\n// | Licensed under the Apache License, Version 2.0 (the "License"); |\n// | you may not use this file except in compliance with the License. |\n// | You may obtain a copy of the License at |\n// | http://www.apache.org/licenses/LICENSE-2.0 |\n// | Unless required by applicable law or agreed to in writing, software |\n// | distributed under the License is distributed on an "AS IS" BASIS, |\n// | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |\n// | implied. See the License for the specific language governing |\n// | permissions and limitations under the License. |\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): ntsByTagName|isNaN|child|getAttribute|String|switch|compareNamespace|eval|css|addModule|previousElementSibling|compareTagName|parseSelector|loaded|_0|nodeType|getTextContent|tagName|document|isXML|_1|split|ch|parentNode|childElements|nthChild|css2|disabled|firstElementChild|getText|RegExp|modules|Quote|PREFIX|lang|arguments|prototype|delete|aa|ap|apply|_2|else|all|links|version|se|childNodes|innerText|documentElement|contentType|parseInt|indeterminate|checked|last|nth|lastElementChild|level2|parse|_3|add|href|className|Function|create|Array|_4|_5|remove|toString|ST|select|null|_6|lastChild|firstChild|continue|join|caching|error|nodeValue|textContent||HTML|xml|prefix|getElementsByTagNameNS|end|x5fwin32|cc_on|standard|odd|even|enabled|hash|location|target|not|only|empty|root|contains|level3|outerHTML|htmlFor|class|toLowerCase|name|first|do|default|Date|Number|typeof|lastIndex|index|exec|item|scopeName|toUpperCase|ownerDocument|Document|XML|mimeType|nextSibling|previousSibling|visited|link|valueOf|clearCache|catch|concat|constructor|callee|try|beta'.split('|'),0,{}))\n\n\n/* ----- plone_javascript_variables.js ----- */\n\n// Global Plone variables that need to be accessible to the Javascripts\nvar portal_url = 'http://localhost:9999';\nvar form_modified_message = 'Your form has not been saved. All changes you have made will be lost.';\nvar form_resubmit_message = 'Your already clicked the submit button. Do you really want to submit this form again?';\n\n\n/* ----- nodeutilities.js ----- */\n\nfunction wrapNode(node, wrappertype, wrapperclass){\n /* utility function to wrap a node in an arbitrary element of type "wrappertype"\n * with a class of "wrapperclass" */\n var wrapper = document.createElement(wrappertype)\n wrapper.className = wrapperclass;\n var innerNode = node.parentNode.replaceChild(wrapper,node);\n wrapper.appendChild(innerNode);\n};\n\nfunction nodeContained(innernode, outernode){\n // check if innernode is contained in outernode\n var node = innernode.parentNode;\n while (node != document) {\n if (node == outernode) {\n return true; \n }\n node=node.parentNode;\n }\n return false;\n};\n\nfunction findContainer(node, func) {\n // Starting with the given node, find the nearest containing element\n // for which the given function returns true.\n\n while (node != null) {\n if (func(node)) {\n return node;\n }\n node = node.parentNode;\n }\n return false;\n};\n\nfunction hasClassName(node, class_name) {\n return new RegExp('\\\\b'+class_name+'\\\\b').test(node.className);\n};\n\nfunction addClassName(node, class_name) {\n if (!node.className) {\n node.className = class_name;\n } else if (!hasClassName(node, class_name)) {\n var className = node.className+" "+class_name;\n // cleanup\n node.className = className.split(/\\s+/).join(' ');\n }\n};\n\nfunction removeClassName(node, class_name) {\n var className = node.className;\n if (className) {\n // remove\n className = className.replace(new RegExp('\\\\b'+class_name+'\\\\b'), '');\n // cleanup\n className = className.replace(/\\s+/g, ' ');\n node.className = className.replace(/\\s+$/g, '');\n }\n};\n\nfunction replaceClassName(node, old_class, new_class, ignore_missing) {\n if (ignore_missing && !hasClassName(node, old_class)) {\n addClassName(node, new_class);\n } else {\n var className = node.className;\n if (className) {\n // replace\n className = className.replace(new RegExp('\\\\b'+old_class+'\\\\b'), new_class);\n // cleanup\n className = className.replace(/\\s+/g, ' ');\n node.className = className.replace(/\\s+$/g, '');\n }\n }\n};\n\nfunction walkTextNodes(node, func, data) {\n // traverse childnodes and call func when a textnode is found\n if (!node){return false}\n if (node.hasChildNodes) {\n // we can't use for (i in childNodes) here, because the number of\n // childNodes might change (higlightsearchterms)\n for (var i=0;i<node.childNodes.length;i++) {\n walkTextNodes(node.childNodes[i], func, data);\n }\n if (node.nodeType == 3) {\n // this is a text node\n func(node, data);\n }\n }\n};\n\n/* These are two functions, because getInnerTextFast doesn't always return the\n * the same results, as it depends on the implementation of node.innerText of\n * the browser. getInnerTextCompatible will always return the same values, but\n * is a bit slower. The difference is just in the whitespace, so if this\n * doesn't matter, you should always use getInnerTextFast.\n */\n\nfunction getInnerTextCompatible(node) {\n var result = new Array();\n walkTextNodes(node,\n function(n, d){d.push(n.nodeValue)},\n result);\n return result.join("");\n};\n\nfunction getInnerTextFast(node) {\n if (node.innerText) {\n return node.innerText;\n } else {\n return getInnerTextCompatible(node);\n }\n};\n\n/* This function reorder nodes in the DOM.\n * fetch_func - the function which returns the value for comparison\n * cmp_func - the compare function, if not provided then the string of the\n * value returned by fetch_func is used.\n */\nfunction sortNodes(nodes, fetch_func, cmp_func) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n // wrapper for sorting\n var SortNodeWrapper = function(node) {\n this.value = fetch_func(node);\n this.cloned_node = node.cloneNode(true);\n this.toString = function() {\n if (this.value.toString) {\n return this.value.toString();\n } else {\n return this.value;\n }\n }\n }\n\n // wrap nodes\n var items = new Array();\n for (var i=0; i<nodes.length; i++) {\n items.push(new SortNodeWrapper(nodes[i]));\n }\n\n //sort\n if (cmp_func) {\n items.sort(cmp_func);\n } else {\n items.sort();\n }\n\n // reorder nodes\n for (var i=0; i<items.length; i++) {\n var dest = nodes[i];\n dest.parentNode.replaceChild(items[i].cloned_node, dest);\n }\n};\n\n\n/* ----- cookie_functions.js ----- */\nfunction createCookie(name,value,days) {\n if (days) {\n var date = new Date();\n date.setTime(date.getTime()+(days*24*60*60*1000));\n var expires = "; expires="+date.toGMTString();\n } else {\n expires = "";\n }\n document.cookie = name+"="+escape(value)+expires+"; path=/;";\n};\n\nfunction readCookie(name) {\n var nameEQ = name + "=";\n var ca = document.cookie.split(';');\n for(var i=0;i < ca.length;i++) {\n var c = ca[i];\n while (c.charAt(0)==' ') {\n c = c.substring(1,c.length);\n }\n if (c.indexOf(nameEQ) == 0) {\n return unescape(c.substring(nameEQ.length,c.length));\n }\n }\n return null;\n};\n\n\n/* ----- livesearch.js ----- */\n/*\n// +----------------------------------------------------------------------+\n// | Copyright (c) 2004 Bitflux GmbH |\n// +----------------------------------------------------------------------+\n// | Licensed under the Apache License, Version 2.0 (the "License"); |\n// | you may not use this file except in compliance with the License. |\n// | You may obtain a copy of the License at |\n// | http://www.apache.org/licenses/LICENSE-2.0 |\n// | Unless required by applicable law or agreed to in writing, software |\n// | distributed under the License is distributed on an "AS IS" BASIS, |\n// | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |\n// | implied. See the License for the specific language governing |\n// | permissions and limitations under the License. |\ [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): |\n// +----------------------------------------------------------------------+\n\n*/\nvar liveSearchReq = false;\nvar t = null;\nvar liveSearchLast = "";\nvar queryTarget = "livesearch_reply?q=";\n\nvar searchForm = null;\nvar searchInput = null; \n\nvar isIE = false;\n\n\nvar _cache = new Object();\n\nvar widthOffset=1;\n\nfunction calculateWidth(){\n}\n\n\nfunction getElementDimensions(elemID) {\n var base = document.getElementById(elemID);\n var offsetTrail = base;\n var offsetLeft = 0;\n var offsetTop = 0;\n var width = 0;\n \n while (offsetTrail) {\n offsetLeft += offsetTrail.offsetLeft;\n offsetTop += offsetTrail.offsetTop;\n offsetTrail = offsetTrail.offsetParent;\n }\n if (navigator.userAgent.indexOf("Mac") != -1 &&\n typeof document.body.leftMargin != "undefined") {\n offsetLeft += document.body.leftMargin;\n offsetTop += document.body.topMargin;\n }\n\n if(!isIE){\n width = searchInput.offsetWidth-widthOffset*2;\n }\n else {\n width = searchInput.offsetWidth;\n }\n\n return { left:offsetLeft, \n top:offsetTop, \n width: width, \n height: base.offsetHeight,\n bottom: offsetTop + base.offsetHeight, \n right : offsetLeft + width};\n}\n\nfunction liveSearchInit() {\n searchInput = document.getElementById('searchGadget');\n if (searchInput == null || searchInput == undefined) return\n// Only keypress catches repeats in moz/FF but keydown is needed for\n// khtml based browsers.\n if (navigator.userAgent.indexOf("KHTML") > 0) {\n searchInput.addEventListener("keydown",liveSearchKeyPress,false);\n searchInput.addEventListener("focus",liveSearchDoSearch,false);\n searchInput.addEventListener("keydown",liveSearchStart, false);\n } else if (searchInput.addEventListener) {\n searchInput.addEventListener("keypress",liveSearchKeyPress,false);\n searchInput.addEventListener("blur",liveSearchHideDelayed,false);\n searchInput.addEventListener("keypress",liveSearchStart, false);\n } else {\n searchInput.attachEvent("onkeydown",liveSearchKeyPress);\n searchInput.attachEvent("onkeydown",liveSearchStart);\n// searchInput.attachEvent("onblur",liveSearchHide);\n isIE = true;\n }\n\n// Why doesn't this work in konq, setting it inline does.\n searchInput.setAttribute("autocomplete","off");\n\n var pos = getElementDimensions('searchGadget'); \n result = document.getElementById('LSResult');\n pos.left = pos.left - result.offsetParent.offsetLeft + pos.width;\n result.style.display='none';\n}\n\n\nfunction liveSearchHideDelayed() {\n window.setTimeout("liveSearchHide()",400);\n}\n \nfunction liveSearchHide() { \n document.getElementById("LSResult").style.display = "none";\n var highlight = document.getElementById("LSHighlight");\n if (highlight) {\n highlight.removeAttribute("id");\n }\n}\n\nfunction getFirstHighlight() {\n var set = getHits();\n return set[0];\n}\n\nfunction getLastHighlight() {\n var set = getHits();\n return set[set.length-1];\n}\n\nfunction getHits() {\n var res = document.getElementById("LSShadow");\n var set = res.getElementsByTagName('li');\n return set\n}\n\nfunction findChild(object, specifier) {\n var cur = object.firstChild;\n try {\n while (cur != undefined) {\n cur = cur.nextSibling;\n if (specifier(cur) == true) return cur;\n }\n } catch(e) {};\n return null;\n \n}\n\nfunction findNext(object, specifier) {\n var cur = object;\n try {\n while (cur != undefined) {\n\n cur = cur.nextSibling;\n if (cur.nodeType==3) cur=cur.nextSibling;\n \n if (cur != undefined) {\n if (specifier(cur) == true) return cur;\n } else { break }\n }\n } catch(e) {};\n return null;\n}\n\nfunction findPrev(object, specifier) {\n var cur = object;\n try {\n cur = cur.previousSibling;\n if (cur.nodeType==3) cur=cur.previousSibling;\n if (cur!=undefined) {\n if (specifier(cur) == true) \n return cur;\n } \n } catch(e) {};\n return null;\n}\n\n\nfunction liveSearchKeyPress(event) {\n if (event.keyCode == 40 )\n //KEY DOWN\n {\n highlight = document.getElementById("LSHighlight");\n if (!highlight) {\n highlight = getFirstHighlight();\n } else {\n highlight.removeAttribute("id");\n highlight = findNext(highlight, function (o) {return o.className =="LSRow";});\n\n }\n if (highlight) {\n highlight.setAttribute("id","LSHighlight");\n } \n if (!isIE) { event.preventDefault(); }\n } \n //KEY UP\n else if (event.keyCode == 38 ) {\n highlight = document.getElementById("LSHighlight");\n if (!highlight) {\n highlight = getLastHighlight();\n } \n else {\n highlight.removeAttribute("id");\n highlight = findPrev(highlight, function (o) {return o.className=='LSRow';});\n }\n if (highlight) {\n highlight.setAttribute("id","LSHighlight");\n }\n if (!isIE) { event.preventDefault(); }\n } \n //ESC\n else if (event.keyCode == 27) {\n highlight = document.getElementById("LSHighlight");\n if (highlight) {\n highlight.removeAttribute("id");\n }\n document.getElementById("LSResult").style.display = "none";\n } \n}\nfunction liveSearchStart(event) {\n if (t) {\n window.clearTimeout(t);\n }\n code = event.keyCode;\n if (code!=40 && code!=38 && code!=27 && code!=37 && code!=39) {\n t = window.setTimeout("liveSearchDoSearch()",200);\n } \n}\n\nfunction liveSearchDoSearch() {\n\n if (typeof liveSearchRoot == "undefined") {\n liveSearchRoot = "";\n }\n if (typeof liveSearchRootSubDir == "undefined") {\n liveSearchRootSubDir = "";\n }\n\n if (liveSearchLast != searchInput.value) {\n if (liveSearchReq && liveSearchReq.readyState < 4) {\n liveSearchReq.abort();\n }\n if ( searchInput.value == "") {\n liveSearchHide();\n return false;\n }\n\n // Do nothing as long as we have less then two characters - \n // the search results makes no sense, and it's harder on the server.\n if ( searchInput.value.length < 2) {\n liveSearchHide();\n return false;\n }\n\n // Do we have cached results\n var result = _cache[searchInput.value];\n if (result) {\n showResult(result); \n return;\n }\n liveSearchReq = new XMLHttpRequest();\n liveSearchReq.onreadystatechange= liveSearchProcessReqChange;\n liveSearchReq.open("GET", liveSearchRoot + queryTarget + encodeURI(searchInput.value) );\n liveSearchLast = searchInput.value;\n liveSearchReq.send(null);\n }\n}\n\nfunction showResult(result) {\n var res = document.getElementById("LSResult");\n res.style.display = "block";\n var sh = document.getElementById("LSShadow");\n sh.innerHTML = result;\n}\n\nfunction liveSearchProcessReqChange() {\n if (liveSearchReq.readyState == 4) {\n if (liveSearchReq.status > 299 || liveSearchReq.status < 200 ||\n liveSearchReq.responseText.length < 10) return; \n showResult(liveSearchReq.responseText);\n _cache[liveSearchLast] = liveSearchReq.responseText;\n }\n}\n\nfunction liveSearchSubmit() {\n var highlight = document.getElementById("LSHighlight");\n \n if (highlight){\n target = highlight.getElementsByTagName('a')[0];\n window.location = liveSearchRoot + liveSearchRootSubDir + target;\n return false;\n } \n else {\n return true;\n }\n}\n\n\n\nif (window.addEventListener) window.addEventListener("load",liveSearchInit,false);\nelse if (window.attachEvent) window.attachEvent("onload", liveSearchInit);\n\n\n\n/* ----- fullscreenmode.js ----- */\nfunction toggleFullScreenMode() {\n var body = cssQuery('body')[0];\n\n if (ha [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): |\n// +----------------------------------------------------------------------+\n\n*/\nvar liveSearchReq = false;\nvar t = null;\nvar liveSearchLast = "";\nvar queryTarget = "livesearch_reply?q=";\n\nvar searchForm = null;\nvar searchInput = null; \n\nvar isIE = false;\n\n\nvar _cache = new Object();\n\nvar widthOffset=1;\n\nfunction calculateWidth(){\n}\n\n\nfunction getElementDimensions(elemID) {\n var base = document.getElementById(elemID);\n var offsetTrail = base;\n var offsetLeft = 0;\n var offsetTop = 0;\n var width = 0;\n \n while (offsetTrail) {\n offsetLeft += offsetTrail.offsetLeft;\n offsetTop += offsetTrail.offsetTop;\n offsetTrail = offsetTrail.offsetParent;\n }\n if (navigator.userAgent.indexOf("Mac") != -1 &&\n typeof document.body.leftMargin != "undefined") {\n offsetLeft += document.body.leftMargin;\n offsetTop += document.body.topMargin;\n }\n\n if(!isIE){\n width = searchInput.offsetWidth-widthOffset*2;\n }\n else {\n width = searchInput.offsetWidth;\n }\n\n return { left:offsetLeft, \n top:offsetTop, \n width: width, \n height: base.offsetHeight,\n bottom: offsetTop + base.offsetHeight, \n right : offsetLeft + width};\n}\n\nfunction liveSearchInit() {\n searchInput = document.getElementById('searchGadget');\n if (searchInput == null || searchInput == undefined) return\n// Only keypress catches repeats in moz/FF but keydown is needed for\n// khtml based browsers.\n if (navigator.userAgent.indexOf("KHTML") > 0) {\n searchInput.addEventListener("keydown",liveSearchKeyPress,false);\n searchInput.addEventListener("focus",liveSearchDoSearch,false);\n searchInput.addEventListener("keydown",liveSearchStart, false);\n } else if (searchInput.addEventListener) {\n searchInput.addEventListener("keypress",liveSearchKeyPress,false);\n searchInput.addEventListener("blur",liveSearchHideDelayed,false);\n searchInput.addEventListener("keypress",liveSearchStart, false);\n } else {\n searchInput.attachEvent("onkeydown",liveSearchKeyPress);\n searchInput.attachEvent("onkeydown",liveSearchStart);\n// searchInput.attachEvent("onblur",liveSearchHide);\n isIE = true;\n }\n\n// Why doesn't this work in konq, setting it inline does.\n searchInput.setAttribute("autocomplete","off");\n\n var pos = getElementDimensions('searchGadget'); \n result = document.getElementById('LSResult');\n pos.left = pos.left - result.offsetParent.offsetLeft + pos.width;\n result.style.display='none';\n}\n\n\nfunction liveSearchHideDelayed() {\n window.setTimeout("liveSearchHide()",400);\n}\n \nfunction liveSearchHide() { \n document.getElementById("LSResult").style.display = "none";\n var highlight = document.getElementById("LSHighlight");\n if (highlight) {\n highlight.removeAttribute("id");\n }\n}\n\nfunction getFirstHighlight() {\n var set = getHits();\n return set[0];\n}\n\nfunction getLastHighlight() {\n var set = getHits();\n return set[set.length-1];\n}\n\nfunction getHits() {\n var res = document.getElementById("LSShadow");\n var set = res.getElementsByTagName('li');\n return set\n}\n\nfunction findChild(object, specifier) {\n var cur = object.firstChild;\n try {\n while (cur != undefined) {\n cur = cur.nextSibling;\n if (specifier(cur) == true) return cur;\n }\n } catch(e) {};\n return null;\n \n}\n\nfunction findNext(object, specifier) {\n var cur = object;\n try {\n while (cur != undefined) {\n\n cur = cur.nextSibling;\n if (cur.nodeType==3) cur=cur.nextSibling;\n \n if (cur != undefined) {\n if (specifier(cur) == true) return cur;\n } else { break }\n }\n } catch(e) {};\n return null;\n}\n\nfunction findPrev(object, specifier) {\n var cur = object;\n try {\n cur = cur.previousSibling;\n if (cur.nodeType==3) cur=cur.previousSibling;\n if (cur!=undefined) {\n if (specifier(cur) == true) \n return cur;\n } \n } catch(e) {};\n return null;\n}\n\n\nfunction liveSearchKeyPress(event) {\n if (event.keyCode == 40 )\n //KEY DOWN\n {\n highlight = document.getElementById("LSHighlight");\n if (!highlight) {\n highlight = getFirstHighlight();\n } else {\n highlight.removeAttribute("id");\n highlight = findNext(highlight, function (o) {return o.className =="LSRow";});\n\n }\n if (highlight) {\n highlight.setAttribute("id","LSHighlight");\n } \n if (!isIE) { event.preventDefault(); }\n } \n //KEY UP\n else if (event.keyCode == 38 ) {\n highlight = document.getElementById("LSHighlight");\n if (!highlight) {\n highlight = getLastHighlight();\n } \n else {\n highlight.removeAttribute("id");\n highlight = findPrev(highlight, function (o) {return o.className=='LSRow';});\n }\n if (highlight) {\n highlight.setAttribute("id","LSHighlight");\n }\n if (!isIE) { event.preventDefault(); }\n } \n //ESC\n else if (event.keyCode == 27) {\n highlight = document.getElementById("LSHighlight");\n if (highlight) {\n highlight.removeAttribute("id");\n }\n document.getElementById("LSResult").style.display = "none";\n } \n}\nfunction liveSearchStart(event) {\n if (t) {\n window.clearTimeout(t);\n }\n code = event.keyCode;\n if (code!=40 && code!=38 && code!=27 && code!=37 && code!=39) {\n t = window.setTimeout("liveSearchDoSearch()",200);\n } \n}\n\nfunction liveSearchDoSearch() {\n\n if (typeof liveSearchRoot == "undefined") {\n liveSearchRoot = "";\n }\n if (typeof liveSearchRootSubDir == "undefined") {\n liveSearchRootSubDir = "";\n }\n\n if (liveSearchLast != searchInput.value) {\n if (liveSearchReq && liveSearchReq.readyState < 4) {\n liveSearchReq.abort();\n }\n if ( searchInput.value == "") {\n liveSearchHide();\n return false;\n }\n\n // Do nothing as long as we have less then two characters - \n // the search results makes no sense, and it's harder on the server.\n if ( searchInput.value.length < 2) {\n liveSearchHide();\n return false;\n }\n\n // Do we have cached results\n var result = _cache[searchInput.value];\n if (result) {\n showResult(result); \n return;\n }\n liveSearchReq = new XMLHttpRequest();\n liveSearchReq.onreadystatechange= liveSearchProcessReqChange;\n liveSearchReq.open("GET", liveSearchRoot + queryTarget + encodeURI(searchInput.value) );\n liveSearchLast = searchInput.value;\n liveSearchReq.send(null);\n }\n}\n\nfunction showResult(result) {\n var res = document.getElementById("LSResult");\n res.style.display = "block";\n var sh = document.getElementById("LSShadow");\n sh.innerHTML = result;\n}\n\nfunction liveSearchProcessReqChange() {\n if (liveSearchReq.readyState == 4) {\n if (liveSearchReq.status > 299 || liveSearchReq.status < 200 ||\n liveSearchReq.responseText.length < 10) return; \n showResult(liveSearchReq.responseText);\n _cache[liveSearchLast] = liveSearchReq.responseText;\n }\n}\n\nfunction liveSearchSubmit() {\n var highlight = document.getElementById("LSHighlight");\n \n if (highlight){\n target = highlight.getElementsByTagName('a')[0];\n window.location = liveSearchRoot + liveSearchRootSubDir + target;\n return false;\n } \n else {\n return true;\n }\n}\n\n\n\nif (window.addEventListener) window.addEventListener("load",liveSearchInit,false);\nelse if (window.attachEvent) window.attachEvent("onload", liveSearchInit);\n\n\n\n/* ----- fullscreenmode.js ----- */\nfunction toggleFullScreenMode() {\n var body = cssQuery('body')[0];\n\n if (h [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): addClassName(body, 'fullscreen');\n createCookie('fullscreenMode', '1');\n }\n};\n\nfunction fullscreenModeLoad() {\n // based on cookie\n if (readCookie('fullscreenMode') == '1') {\n var body = cssQuery('body')[0];\n addClassName(body, 'fullscreen');\n }\n};\nregisterPloneFunction(fullscreenModeLoad)\n\n\n/* ----- select_all.js ----- */\n// Functions for selecting all checkboxes in folder_contents/search_form view\nfunction selectAll(id, formName) {\n // Get the elements. if formName is provided, get the elements inside the form\n if (formName==null) {\n checkboxes = document.getElementsByName(id)\n for (i = 0; i < checkboxes.length; i++){\n checkboxes[i].checked = true ;\n }\n } else {\n for (i=0; i<document.forms[formName].elements.length;i++){\n if (document.forms[formName].elements[i].name==id){\n document.forms[formName].elements[i].checked=true; \n }\n }\n }\n }\nfunction deselectAll(id, formName) {\n if (formName==null) {\n checkboxes = document.getElementsByName(id)\n for (i = 0; i < checkboxes.length; i++){\n checkboxes[i].checked = false ;}\n } else {\n for (i=0; i<document.forms[formName].elements.length;i++){\n if (document.forms[formName].elements[i].name==id){\n document.forms[formName].elements[i].checked=false;\n }\n }\n }\n }\nfunction toggleSelect(selectbutton, id, initialState, formName) {\n /* required selectbutton: you can pass any object that will function as a toggle\n * optional id: id of the the group of checkboxes that needs to be toggled (default=ids:list\n * optional initialState: initial state of the group. (default=false)\n * e.g. folder_contents is false, search_form=true because the item boxes\n * are checked initially.\n * optional formName: name of the form in which the boxes reside, use this if there are more\n * forms on the page with boxes with the same name\n */\n id=id || 'ids:list' // defaults to ids:list, this is the most common usage\n\n if (selectbutton.isSelected==null){\n initialState=initialState || false;\n selectbutton.isSelected=initialState;\n }\n /* create and use a property on the button itself so you don't have to \n * use a global variable and we can have as much groups on a page as we like.\n */\n if (selectbutton.isSelected == false) {\n selectbutton.setAttribute('src', portal_url + '/select_none_icon.gif');\n selectbutton.isSelected=true;\n return selectAll(id, formName);\n } else {\n selectbutton.setAttribute('src',portal_url + '/select_all_icon.gif');\n selectbutton.isSelected=false;\n return deselectAll(id, formName);\n }\n } \n\n/* ----- dropdown.js ----- */\n/*\n * This is the code for the dropdown menus. It uses the following markup:\n *\n * <dl class="actionMenu" id="uniqueIdForThisMenu">\n * <dt class="actionMenuHeader">\n * <!-- The following a-tag needs to be clicked to dropdown the menu -->\n * <a href="some_destination">A Title</a>\n * </dt>\n * <dd class="actionMenuContent">\n * <!-- Here can be any content you want -->\n * </dd>\n * </dl>\n *\n * When the menu is toggled, then the dl with the class actionMenu will get an\n * additional class which switches between 'activated' and 'deactivated'.\n * You can use this to style it accordingly, for example:\n *\n * .actionMenu.activated {\n * display: block;\n * }\n *\n * .actionMenu.deactivated {\n * display: none;\n * }\n *\n * When you click somewhere else than the menu, then all open menus will be\n * deactivated. When you move your mouse over the a-tag of another menu, then\n * that one will be activated and all others deactivated. When you click on a\n * link inside the actionMenuContent element, then the menu will be closed and\n * the link followed.\n *\n * This file uses functions from register_function.js, cssQuery.js and\n * nodeutils.js.\n *\n */\n\nfunction isActionMenu(node) {\n if (hasClassName(node, 'actionMenu')) {\n return true;\n }\n return false;\n};\n\nfunction hideAllMenus() {\n var menus = cssQuery('dl.actionMenu');\n for (var i=0; i < menus.length; i++) {\n replaceClassName(menus[i], 'activated', 'deactivated', true);\n }\n};\n\nfunction toggleMenuHandler(event) {\n if (!event) var event = window.event; // IE compatibility\n\n // terminate if we hit a non-compliant DOM implementation\n // returning true, so the link is still followed\n if (!W3CDOM){return true;}\n\n var container = findContainer(this, isActionMenu);\n if (!container) {\n return true;\n }\n\n // check if the menu is visible\n if (hasClassName(container, 'activated')) {\n // it's visible - hide it\n replaceClassName(container, 'activated', 'deactivated', true);\n } else {\n // it's invisible - make it visible\n replaceClassName(container, 'deactivated', 'activated', true);\n }\n\n return false;\n};\n\nfunction hideMenusHandler(event) {\n if (!event) var event = window.event; // IE compatibility\n\n hideAllMenus();\n\n // we want to follow this link\n return true;\n};\n\nfunction actionMenuDocumentMouseDown(event) {\n if (!event) var event = window.event; // IE compatibility\n\n if (event.target)\n targ = event.target;\n else if (event.srcElement)\n targ = event.srcElement;\n\n var container = findContainer(targ, isActionMenu);\n if (container) {\n // targ is part of the menu, so just return and do the default\n return true;\n }\n\n hideAllMenus();\n\n return true;\n};\n\nfunction actionMenuMouseOver(event) {\n if (!event) var event = window.event; // IE compatibility\n\n if (!this.tagName && (this.tagName == 'A' || this.tagName == 'a')) {\n return true;\n }\n\n var container = findContainer(this, isActionMenu);\n if (!container) {\n return true;\n }\n var menu_id = container.id;\n\n var switch_menu = false;\n // hide all menus\n var menus = cssQuery('dl.actionMenu');\n for (var i=0; i < menus.length; i++) {\n var menu = menus[i]\n // check if the menu is visible\n if (hasClassName(menu, 'activated')) {\n switch_menu = true;\n }\n // turn off menu when it's not the current one\n if (menu.id != menu_id) {\n replaceClassName(menu, 'activated', 'deactivated', true);\n }\n }\n\n if (switch_menu) {\n var menu = cssQuery('#'+menu_id)[0];\n if (menu) {\n replaceClassName(menu, 'deactivated', 'activated', true);\n }\n }\n\n return true;\n};\n\nfunction initializeMenus() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM) {return false;}\n\n document.onmousedown = actionMenuDocumentMouseDown;\n\n hideAllMenus();\n\n // add toggle function to header links\n var menu_headers = cssQuery('dl.actionMenu > dt.actionMenuHeader > a');\n for (var i=0; i < menu_headers.length; i++) {\n var menu_header = menu_headers[i];\n\n menu_header.onclick = toggleMenuHandler;\n menu_header.onmouseover = actionMenuMouseOver;\n }\n\n // add hide function to all links in the dropdown, so the dropdown closes\n // when any link is clicked\n var menu_contents = cssQuery('dl.actionMenu > dd.actionMenuContent');\n for (var i=0; i < menu_contents.length; i++) {\n menu_contents[i].onclick = hideMenusHandler;\n }\n\n // uncomment to enable sorting of elements\n //var nodes = cssQuery('#objectMenu > dd.actionMenuContent li');\n //sortNodes(nodes, getInnerTextFast);\n};\n\nregisterPloneFunction(initializeMenus);\n\n\n/* ----- mark_special_links.js ----- */\n/* Scan all links in the document and set classes on them if\n * they point outside the site, or are special proto [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): addClassName(body, 'fullscreen');\n createCookie('fullscreenMode', '1');\n }\n};\n\nfunction fullscreenModeLoad() {\n // based on cookie\n if (readCookie('fullscreenMode') == '1') {\n var body = cssQuery('body')[0];\n addClassName(body, 'fullscreen');\n }\n};\nregisterPloneFunction(fullscreenModeLoad)\n\n\n/* ----- select_all.js ----- */\n// Functions for selecting all checkboxes in folder_contents/search_form view\nfunction selectAll(id, formName) {\n // Get the elements. if formName is provided, get the elements inside the form\n if (formName==null) {\n checkboxes = document.getElementsByName(id)\n for (i = 0; i < checkboxes.length; i++){\n checkboxes[i].checked = true ;\n }\n } else {\n for (i=0; i<document.forms[formName].elements.length;i++){\n if (document.forms[formName].elements[i].name==id){\n document.forms[formName].elements[i].checked=true; \n }\n }\n }\n }\nfunction deselectAll(id, formName) {\n if (formName==null) {\n checkboxes = document.getElementsByName(id)\n for (i = 0; i < checkboxes.length; i++){\n checkboxes[i].checked = false ;}\n } else {\n for (i=0; i<document.forms[formName].elements.length;i++){\n if (document.forms[formName].elements[i].name==id){\n document.forms[formName].elements[i].checked=false;\n }\n }\n }\n }\nfunction toggleSelect(selectbutton, id, initialState, formName) {\n /* required selectbutton: you can pass any object that will function as a toggle\n * optional id: id of the the group of checkboxes that needs to be toggled (default=ids:list\n * optional initialState: initial state of the group. (default=false)\n * e.g. folder_contents is false, search_form=true because the item boxes\n * are checked initially.\n * optional formName: name of the form in which the boxes reside, use this if there are more\n * forms on the page with boxes with the same name\n */\n id=id || 'ids:list' // defaults to ids:list, this is the most common usage\n\n if (selectbutton.isSelected==null){\n initialState=initialState || false;\n selectbutton.isSelected=initialState;\n }\n /* create and use a property on the button itself so you don't have to \n * use a global variable and we can have as much groups on a page as we like.\n */\n if (selectbutton.isSelected == false) {\n selectbutton.setAttribute('src', portal_url + '/select_none_icon.gif');\n selectbutton.isSelected=true;\n return selectAll(id, formName);\n } else {\n selectbutton.setAttribute('src',portal_url + '/select_all_icon.gif');\n selectbutton.isSelected=false;\n return deselectAll(id, formName);\n }\n } \n\n/* ----- dropdown.js ----- */\n/*\n * This is the code for the dropdown menus. It uses the following markup:\n *\n * <dl class="actionMenu" id="uniqueIdForThisMenu">\n * <dt class="actionMenuHeader">\n * <!-- The following a-tag needs to be clicked to dropdown the menu -->\n * <a href="some_destination">A Title</a>\n * </dt>\n * <dd class="actionMenuContent">\n * <!-- Here can be any content you want -->\n * </dd>\n * </dl>\n *\n * When the menu is toggled, then the dl with the class actionMenu will get an\n * additional class which switches between 'activated' and 'deactivated'.\n * You can use this to style it accordingly, for example:\n *\n * .actionMenu.activated {\n * display: block;\n * }\n *\n * .actionMenu.deactivated {\n * display: none;\n * }\n *\n * When you click somewhere else than the menu, then all open menus will be\n * deactivated. When you move your mouse over the a-tag of another menu, then\n * that one will be activated and all others deactivated. When you click on a\n * link inside the actionMenuContent element, then the menu will be closed and\n * the link followed.\n *\n * This file uses functions from register_function.js, cssQuery.js and\n * nodeutils.js.\n *\n */\n\nfunction isActionMenu(node) {\n if (hasClassName(node, 'actionMenu')) {\n return true;\n }\n return false;\n};\n\nfunction hideAllMenus() {\n var menus = cssQuery('dl.actionMenu');\n for (var i=0; i < menus.length; i++) {\n replaceClassName(menus[i], 'activated', 'deactivated', true);\n }\n};\n\nfunction toggleMenuHandler(event) {\n if (!event) var event = window.event; // IE compatibility\n\n // terminate if we hit a non-compliant DOM implementation\n // returning true, so the link is still followed\n if (!W3CDOM){return true;}\n\n var container = findContainer(this, isActionMenu);\n if (!container) {\n return true;\n }\n\n // check if the menu is visible\n if (hasClassName(container, 'activated')) {\n // it's visible - hide it\n replaceClassName(container, 'activated', 'deactivated', true);\n } else {\n // it's invisible - make it visible\n replaceClassName(container, 'deactivated', 'activated', true);\n }\n\n return false;\n};\n\nfunction hideMenusHandler(event) {\n if (!event) var event = window.event; // IE compatibility\n\n hideAllMenus();\n\n // we want to follow this link\n return true;\n};\n\nfunction actionMenuDocumentMouseDown(event) {\n if (!event) var event = window.event; // IE compatibility\n\n if (event.target)\n targ = event.target;\n else if (event.srcElement)\n targ = event.srcElement;\n\n var container = findContainer(targ, isActionMenu);\n if (container) {\n // targ is part of the menu, so just return and do the default\n return true;\n }\n\n hideAllMenus();\n\n return true;\n};\n\nfunction actionMenuMouseOver(event) {\n if (!event) var event = window.event; // IE compatibility\n\n if (!this.tagName && (this.tagName == 'A' || this.tagName == 'a')) {\n return true;\n }\n\n var container = findContainer(this, isActionMenu);\n if (!container) {\n return true;\n }\n var menu_id = container.id;\n\n var switch_menu = false;\n // hide all menus\n var menus = cssQuery('dl.actionMenu');\n for (var i=0; i < menus.length; i++) {\n var menu = menus[i]\n // check if the menu is visible\n if (hasClassName(menu, 'activated')) {\n switch_menu = true;\n }\n // turn off menu when it's not the current one\n if (menu.id != menu_id) {\n replaceClassName(menu, 'activated', 'deactivated', true);\n }\n }\n\n if (switch_menu) {\n var menu = cssQuery('#'+menu_id)[0];\n if (menu) {\n replaceClassName(menu, 'deactivated', 'activated', true);\n }\n }\n\n return true;\n};\n\nfunction initializeMenus() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM) {return false;}\n\n document.onmousedown = actionMenuDocumentMouseDown;\n\n hideAllMenus();\n\n // add toggle function to header links\n var menu_headers = cssQuery('dl.actionMenu > dt.actionMenuHeader > a');\n for (var i=0; i < menu_headers.length; i++) {\n var menu_header = menu_headers[i];\n\n menu_header.onclick = toggleMenuHandler;\n menu_header.onmouseover = actionMenuMouseOver;\n }\n\n // add hide function to all links in the dropdown, so the dropdown closes\n // when any link is clicked\n var menu_contents = cssQuery('dl.actionMenu > dd.actionMenuContent');\n for (var i=0; i < menu_contents.length; i++) {\n menu_contents[i].onclick = hideMenusHandler;\n }\n\n // uncomment to enable sorting of elements\n //var nodes = cssQuery('#objectMenu > dd.actionMenuContent li');\n //sortNodes(nodes, getInnerTextFast);\n};\n\nregisterPloneFunction(initializeMenus);\n\n\n/* ----- mark_special_links.js ----- */\n/* Scan all links in the document and set classes on them if\n * they point outside the site, or are special prot [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): if we hit a non-compliant DOM implementation\n if (!W3CDOM) { return false; }\n\n contentarea = getContentArea();\n if (!contentarea) { return false; }\n\n links = contentarea.getElementsByTagName('a');\n for (i=0; i < links.length; i++) {\n if ( (links[i].getAttribute('href'))\n && (links[i].className.indexOf('link-plain')==-1) ) {\n var linkval = links[i].getAttribute('href');\n\n // check if the link href is a relative link, or an absolute link to\n // the current host.\n if (linkval.toLowerCase().indexOf(window.location.protocol\n + '//'\n + window.location.host)==0) {\n // absolute link internal to our host - do nothing\n } else if (linkval.indexOf('http:') != 0) {\n // not a http-link. Possibly an internal relative link, but also\n // possibly a mailto or other protocol add tests for relevant\n // protocols as you like.\n protocols = ['mailto', 'ftp', 'news', 'irc', 'h323', 'sip',\n 'callto', 'https', 'feed', 'webcal'];\n // h323, sip and callto are internet telephony VoIP protocols\n for (p=0; p < protocols.length; p++) {\n if (linkval.indexOf(protocols[p]+':') == 0) {\n // if the link matches one of the listed protocols, add\n // className = link-protocol\n wrapNode(links[i], 'span', 'link-'+protocols[p]);\n break;\n }\n }\n } else {\n // we are in here if the link points to somewhere else than our\n // site.\n if ( links[i].getElementsByTagName('img').length == 0 ) {\n // we do not want to mess with those links that already have\n // images in them\n wrapNode(links[i], 'span', 'link-external');\n // uncomment the next line if you want external links to be\n // opened in a new window.\n // links[i].setAttribute('target', '_blank');\n }\n }\n }\n }\n};\n\nregisterPloneFunction(scanforlinks);\n\n\n/* ----- collapsiblesections.js ----- */\n/*\n * This is the code for the collapsibles. It uses the following markup:\n *\n * <dl class="collapsible">\n * <dt class="collapsibleHeader">\n * A Title\n * </dt>\n * <dd class="collapsibleContent">\n * <!-- Here can be any content you want -->\n * </dd>\n * </dl>\n *\n * When the collapsible is toggled, then the dl will get an additional class\n * which switches between 'collapsedBlockCollapsible' and\n * 'expandedBlockCollapsible'. You can use this to style it accordingly, for\n * example:\n *\n * .expandedBlockCollapsible .collapsibleContent {\n * display: block;\n * }\n *\n * .collapsedBlockCollapsible .collapsibleContent {\n * display: none;\n * }\n *\n * If you add the 'collapsedOnLoad' class to the dl, then it will get\n * collapsed on page load, this is done, so the content is accessible even when\n * javascript is disabled.\n *\n * If you add the 'inline' class to the dl, then it will toggle between\n * 'collapsedInlineCollapsible' and 'expandedInlineCollapsible' instead of\n * 'collapsedBlockCollapsible' and 'expandedBlockCollapsible'.\n *\n * This file uses functions from register_function.js, cssQuery.js and\n * nodeutils.js.\n *\n */\n\nfunction isCollapsible(node) {\n if (hasClassName(node, 'collapsible')) {\n return true;\n }\n return false;\n};\n\nfunction toggleCollapsible(event) {\n if (!event) var event = window.event; // IE compatibility\n\n if (!this.tagName && (this.tagName == 'DT' || this.tagName == 'dt')) {\n return true;\n }\n\n var container = findContainer(this, isCollapsible);\n if (!container) {\n return true;\n }\n\n if (hasClassName(container, 'collapsedBlockCollapsible')) {\n replaceClassName(container, 'collapsedBlockCollapsible', 'expandedBlockCollapsible');\n } else if (hasClassName(container, 'expandedBlockCollapsible')) {\n replaceClassName(container, 'expandedBlockCollapsible', 'collapsedBlockCollapsible');\n } else if (hasClassName(container, 'collapsedInlineCollapsible')) {\n replaceClassName(container, 'collapsedInlineCollapsible', 'expandedInlineCollapsible');\n } else if (hasClassName(container, 'expandedInlineCollapsible')) {\n replaceClassName(container, 'expandedInlineCollapsible', 'collapsedInlineCollapsible');\n }\n};\n\nfunction activateCollapsibles() {\n if (!W3CDOM) {return false;}\n\n var collapsibles = cssQuery('dl.collapsible');\n for (var i=0; i < collapsibles.length; i++) {\n var collapsible = collapsibles[i];\n\n var collapsible_header = cssQuery('dt.collapsibleHeader', collapsible)[0];\n collapsible_header.onclick = toggleCollapsible;\n\n if (hasClassName(collapsible, 'inline')) {\n // the collapsible should be inline\n if (hasClassName(collapsible, 'collapsedOnLoad')) {\n replaceClassName(collapsible, 'collapsedOnLoad', 'collapsedInlineCollapsible');\n } else {\n addClassName(collapsible, 'expandedInlineCollapsible');\n }\n } else {\n // the collapsible is a block\n if (hasClassName(collapsible, 'collapsedOnLoad')) {\n replaceClassName(collapsible, 'collapsedOnLoad', 'collapsedBlockCollapsible');\n } else {\n addClassName(collapsible, 'expandedBlockCollapsible');\n }\n }\n }\n};\n\nregisterPloneFunction(activateCollapsibles);\n\n\n/* ----- highlightsearchterms.js ----- */\nfunction highlightTermInNode(node, word) {\n var contents = node.nodeValue;\n var index = contents.toLowerCase().indexOf(word.toLowerCase());\n if (index < 0){return false};\n\n var parent = node.parentNode;\n if (parent.className != "highlightedSearchTerm") {\n // make 3 shiny new nodes\n var hiword = document.createElement("span");\n hiword.className = "highlightedSearchTerm";\n hiword.appendChild(document.createTextNode(contents.substr(index, word.length)));\n parent.insertBefore(document.createTextNode(contents.substr(0, index)), node);\n parent.insertBefore(hiword, node);\n parent.insertBefore(document.createTextNode(contents.substr(index+word.length)), node);\n parent.removeChild(node);\n }\n}\n\nfunction highlightSearchTerms(terms, startnode) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n if (!terms){return false};\n if (!startnode){return false};\n\n for (var term_index=0; term_index < terms.length; term_index++) {\n // don't highlight reserved catalog search terms\n var term = terms[term_index];\n var term_lower = term.toLowerCase();\n if (term_lower != 'not'\n && term_lower != 'and'\n && term_lower != 'or') {\n walkTextNodes(startnode, highlightTermInNode, term);\n }\n }\n}\n\nfunction getSearchTermsFromURI(uri) {\n var query;\n if (typeof decodeURI != 'undefined') {\n query = decodeURI(uri);\n } else if (typeof unescape != 'undefined') {\n // _robert_ ie 5 does not have decodeURI \n query = unescape(uri);\n } else {\n // we just try to be lucky, for single words this will still work\n }\n var result = new Array();\n if (window.decodeReferrer) {\n var referrerSearch = decodeReferrer();\n if (null != referrerSearch && referrerSearch.length > 0) {\n result = referrerSearch;\n }\n }\n var qfinder = new RegExp("searchterm=([^&]*)", "gi");\n var qq = qfinder.exec(query);\n if (qq && qq[1]) {\n var terms = qq[1].re [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): if we hit a non-compliant DOM implementation\n if (!W3CDOM) { return false; }\n\n contentarea = getContentArea();\n if (!contentarea) { return false; }\n\n links = contentarea.getElementsByTagName('a');\n for (i=0; i < links.length; i++) {\n if ( (links[i].getAttribute('href'))\n && (links[i].className.indexOf('link-plain')==-1) ) {\n var linkval = links[i].getAttribute('href');\n\n // check if the link href is a relative link, or an absolute link to\n // the current host.\n if (linkval.toLowerCase().indexOf(window.location.protocol\n + '//'\n + window.location.host)==0) {\n // absolute link internal to our host - do nothing\n } else if (linkval.indexOf('http:') != 0) {\n // not a http-link. Possibly an internal relative link, but also\n // possibly a mailto or other protocol add tests for relevant\n // protocols as you like.\n protocols = ['mailto', 'ftp', 'news', 'irc', 'h323', 'sip',\n 'callto', 'https', 'feed', 'webcal'];\n // h323, sip and callto are internet telephony VoIP protocols\n for (p=0; p < protocols.length; p++) {\n if (linkval.indexOf(protocols[p]+':') == 0) {\n // if the link matches one of the listed protocols, add\n // className = link-protocol\n wrapNode(links[i], 'span', 'link-'+protocols[p]);\n break;\n }\n }\n } else {\n // we are in here if the link points to somewhere else than our\n // site.\n if ( links[i].getElementsByTagName('img').length == 0 ) {\n // we do not want to mess with those links that already have\n // images in them\n wrapNode(links[i], 'span', 'link-external');\n // uncomment the next line if you want external links to be\n // opened in a new window.\n // links[i].setAttribute('target', '_blank');\n }\n }\n }\n }\n};\n\nregisterPloneFunction(scanforlinks);\n\n\n/* ----- collapsiblesections.js ----- */\n/*\n * This is the code for the collapsibles. It uses the following markup:\n *\n * <dl class="collapsible">\n * <dt class="collapsibleHeader">\n * A Title\n * </dt>\n * <dd class="collapsibleContent">\n * <!-- Here can be any content you want -->\n * </dd>\n * </dl>\n *\n * When the collapsible is toggled, then the dl will get an additional class\n * which switches between 'collapsedBlockCollapsible' and\n * 'expandedBlockCollapsible'. You can use this to style it accordingly, for\n * example:\n *\n * .expandedBlockCollapsible .collapsibleContent {\n * display: block;\n * }\n *\n * .collapsedBlockCollapsible .collapsibleContent {\n * display: none;\n * }\n *\n * If you add the 'collapsedOnLoad' class to the dl, then it will get\n * collapsed on page load, this is done, so the content is accessible even when\n * javascript is disabled.\n *\n * If you add the 'inline' class to the dl, then it will toggle between\n * 'collapsedInlineCollapsible' and 'expandedInlineCollapsible' instead of\n * 'collapsedBlockCollapsible' and 'expandedBlockCollapsible'.\n *\n * This file uses functions from register_function.js, cssQuery.js and\n * nodeutils.js.\n *\n */\n\nfunction isCollapsible(node) {\n if (hasClassName(node, 'collapsible')) {\n return true;\n }\n return false;\n};\n\nfunction toggleCollapsible(event) {\n if (!event) var event = window.event; // IE compatibility\n\n if (!this.tagName && (this.tagName == 'DT' || this.tagName == 'dt')) {\n return true;\n }\n\n var container = findContainer(this, isCollapsible);\n if (!container) {\n return true;\n }\n\n if (hasClassName(container, 'collapsedBlockCollapsible')) {\n replaceClassName(container, 'collapsedBlockCollapsible', 'expandedBlockCollapsible');\n } else if (hasClassName(container, 'expandedBlockCollapsible')) {\n replaceClassName(container, 'expandedBlockCollapsible', 'collapsedBlockCollapsible');\n } else if (hasClassName(container, 'collapsedInlineCollapsible')) {\n replaceClassName(container, 'collapsedInlineCollapsible', 'expandedInlineCollapsible');\n } else if (hasClassName(container, 'expandedInlineCollapsible')) {\n replaceClassName(container, 'expandedInlineCollapsible', 'collapsedInlineCollapsible');\n }\n};\n\nfunction activateCollapsibles() {\n if (!W3CDOM) {return false;}\n\n var collapsibles = cssQuery('dl.collapsible');\n for (var i=0; i < collapsibles.length; i++) {\n var collapsible = collapsibles[i];\n\n var collapsible_header = cssQuery('dt.collapsibleHeader', collapsible)[0];\n collapsible_header.onclick = toggleCollapsible;\n\n if (hasClassName(collapsible, 'inline')) {\n // the collapsible should be inline\n if (hasClassName(collapsible, 'collapsedOnLoad')) {\n replaceClassName(collapsible, 'collapsedOnLoad', 'collapsedInlineCollapsible');\n } else {\n addClassName(collapsible, 'expandedInlineCollapsible');\n }\n } else {\n // the collapsible is a block\n if (hasClassName(collapsible, 'collapsedOnLoad')) {\n replaceClassName(collapsible, 'collapsedOnLoad', 'collapsedBlockCollapsible');\n } else {\n addClassName(collapsible, 'expandedBlockCollapsible');\n }\n }\n }\n};\n\nregisterPloneFunction(activateCollapsibles);\n\n\n/* ----- highlightsearchterms.js ----- */\nfunction highlightTermInNode(node, word) {\n var contents = node.nodeValue;\n var index = contents.toLowerCase().indexOf(word.toLowerCase());\n if (index < 0){return false};\n\n var parent = node.parentNode;\n if (parent.className != "highlightedSearchTerm") {\n // make 3 shiny new nodes\n var hiword = document.createElement("span");\n hiword.className = "highlightedSearchTerm";\n hiword.appendChild(document.createTextNode(contents.substr(index, word.length)));\n parent.insertBefore(document.createTextNode(contents.substr(0, index)), node);\n parent.insertBefore(hiword, node);\n parent.insertBefore(document.createTextNode(contents.substr(index+word.length)), node);\n parent.removeChild(node);\n }\n}\n\nfunction highlightSearchTerms(terms, startnode) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n if (!terms){return false};\n if (!startnode){return false};\n\n for (var term_index=0; term_index < terms.length; term_index++) {\n // don't highlight reserved catalog search terms\n var term = terms[term_index];\n var term_lower = term.toLowerCase();\n if (term_lower != 'not'\n && term_lower != 'and'\n && term_lower != 'or') {\n walkTextNodes(startnode, highlightTermInNode, term);\n }\n }\n}\n\nfunction getSearchTermsFromURI(uri) {\n var query;\n if (typeof decodeURI != 'undefined') {\n query = decodeURI(uri);\n } else if (typeof unescape != 'undefined') {\n // _robert_ ie 5 does not have decodeURI \n query = unescape(uri);\n } else {\n // we just try to be lucky, for single words this will still work\n }\n var result = new Array();\n if (window.decodeReferrer) {\n var referrerSearch = decodeReferrer();\n if (null != referrerSearch && referrerSearch.length > 0) {\n result = referrerSearch;\n }\n }\n var qfinder = new RegExp("searchterm=([^&]*)", "gi");\n var qq = qfinder.exec(query);\n if (qq && qq[1]) {\n var terms = qq[1].r [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ) {\n result.push(terms[i]);\n }\n }\n return result;\n }\n return result.length == 0 ? false : result;\n}\n\nfunction highlightSearchTermsFromURI() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n // search-term-highlighter function -- Geir B\xc3\xa6kholt\n var terms = getSearchTermsFromURI(window.location.search);\n // make sure we start the right place so we don't higlight menuitems or breadcrumb\n var contentarea = getContentArea();\n highlightSearchTerms(terms, contentarea);\n}\n\nregisterPloneFunction(highlightSearchTermsFromURI);\n\n\n/* ----- se-highlight.js ----- */\n/* List of search engine matchers and the referrer search\n * code where carefully borrowed from the\n * "Search Engine Keyword Highlight" by Scott Yang,\n * see http://fucoder.com/code/se-hilite/ for further\n * details.\n */\nvar searchEngines = [\n ['^http://(www)?\\\\.?google.*', 'q='], // Google\n ['^http://search\\\\.yahoo.*', 'p='], // Yahoo\n ['^http://search\\\\.msn.*', 'q='], // MSN\n ['^http://search\\\\.aol.*', 'userQuery='], // AOL\n ['^http://(www\\\\.)?altavista.*', 'q='], // AltaVista\n ['^http://(www\\\\.)?feedster.*', 'q='], // Feedster\n ['^http://search\\\\.lycos.*', 'query='], // Lycos\n ['^http://(www\\\\.)?alltheweb.*', 'q='] // AllTheWeb\n]\n\nfunction decodeReferrer(ref) {\n // checks if we are beeing searched by a search engine\n if (null == ref && document.referrer) {\n ref = document.referrer;\n }\n if (!ref) return null;\n\n var match = new RegExp('');\n var seQuery = '';\n for (var i = 0; i < searchEngines.length; i ++) {\n match.compile(searchEngines[i][0], 'i');\n if (ref.match(match)) {\n match.compile('^.*'+searchEngines[i][1]+'([^&]+)&?.*$');\n seQuery = ref.replace(match, '$1');\n if (seQuery) {\n seQuery = decodeURIComponent(seQuery);\n seQuery = seQuery.replace(/\\'|"/, '');\n return seQuery.split(/[\\s,\\+\\.]+/);\n }\n\n }\n }\n return null;\n}\n\n\n/* ----- first_input_focus.js ----- */\n// Focus on error \nfunction setFocus(){\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var xre = new RegExp(/\\berror\\b/);\n // Search only forms to avoid spending time on regular text\n for (var f = 0; (formnode = document.getElementsByTagName('form').item(f)); f++){\n // Search for errors first, focus on first error if found\n for (var i = 0; (node = formnode.getElementsByTagName('div').item(i)); i++) {\n if (xre.exec(node.className)){\n for (var j = 0; (inputnode = node.getElementsByTagName('input').item(j)); j++) {\n try {\n if (inputnode.focus) { // check availability first\n inputnode.focus();\n return;\n }\n } catch(e) {\n // try next one, this can happen with a hidden or\n // invisible input field\n }\n }\n }\n }\n }\n}\nregisterPloneFunction(setFocus)\n\n\n/* ----- folder_contents_filter.js ----- */\n// Actions used in the folder_contents view\nfunction submitFolderAction(folderAction) {\n document.folderContentsForm.action = document.folderContentsForm.action+'/'+folderAction;\n document.folderContentsForm.submit();\n}\n\nfunction submitFilterAction() {\n document.folderContentsForm.action = document.folderContentsForm.action+'/folder_contents';\n filter_selection=document.getElementById('filter_selection');\n for (var i =0; i < filter_selection.length; i++){\n if (filter_selection.options[i].selected) {\n if (filter_selection.options[i].value=='#') {\n document.folderContentsForm.filter_state.value='clear_view_filter';\n }\n else {\n document.folderContentsForm.filter_state.value='set_view_filter';\n }\n }\n }\n document.folderContentsForm.submit();\n}\n\n\n\n/* ----- folder_contents_hideAddItems.js ----- */\n// function to hide the traditional add items pull down menu.\n\nfunction hideTraditionalAddItemPullDown() {\n // Get the old style Add Item pulldown. We already have\n // such a menu. This is only for system that don't have javascript\n // so we can savely remove it.\n pullDown = document.getElementById('traditional-add-item-pulldown');\n if (pullDown) { \n pullDown.style.display='none';\n }\n}\n\nregisterPloneFunction(hideTraditionalAddItemPullDown)\n\n/* ----- styleswitcher.js ----- */\n// StyleSwitcher functions written by Paul Sowden\nfunction setActiveStyleSheet(title, reset) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var i, a, main;\n for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {\n if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {\n a.disabled = true;\n if (a.getAttribute("title") == title) {\n a.disabled = false;\n }\n }\n }\n if (reset == 1) {\n createCookie("wstyle", title, 365);\n }\n};\n\nfunction setStyle() {\n var style = readCookie("wstyle");\n if (style != null) {\n setActiveStyleSheet(style, 0);\n }\n};\nregisterPloneFunction(setStyle);\n\n\n\n\n/* ----- table_sorter.js ----- */\n\n/********* Table sorter script *************/\n// Table sorter script, thanks to Geir B\xc3\xa6kholt for this.\n// DOM table sorter originally made by Paul Sowden \n\nfunction compare(a,b)\n{\n au = new String(a);\n bu = new String(b);\n\n if (au.charAt(4) != '-' && au.charAt(7) != '-')\n {\n var an = parseFloat(au)\n var bn = parseFloat(bu)\n }\n if (isNaN(an) || isNaN(bn))\n {as = au.toLowerCase()\n bs = bu.toLowerCase()\n if (as > bs)\n {return 1;}\n else\n {return -1;}\n }\n else {\n return an - bn;\n }\n}\nfunction getConcatenedTextContent(node) {\n var _result = "";\n if (node == null) {\n return _result;\n }\n var childrens = node.childNodes;\n var i = 0;\n while (i < childrens.length) {\n var child = childrens.item(i);\n switch (child.nodeType) {\n case 1: // ELEMENT_NODE\n case 5: // ENTITY_REFERENCE_NODE\n _result += getConcatenedTextContent(child);\n break;\n case 3: // TEXT_NODE\n case 2: // ATTRIBUTE_NODE\n case 4: // CDATA_SECTION_NODE\n _result += child.nodeValue;\n break;\n case 6: // ENTITY_NODE\n case 7: // PROCESSING_INSTRUCTION_NODE\n case 8: // COMMENT_NODE\n case 9: // DOCUMENT_NODE\n case 10: // DOCUMENT_TYPE_NODE\n case 11: // DOCUMENT_FRAGMENT_NODE\n case 12: // NOTATION_NODE\n // skip\n break;\n }\n i ++;\n }\n return _result;\n}\n\nfunction sort(e) {\n var el = window.event ? window.event.srcElement : e.currentTarget;\n\n // a pretty ugly sort function, but it works nonetheless\n var a = new Array();\n // check if the image or the th is clicked. Proceed to parent id it is the image\n // NOTE THAT nodeName IS UPPERCASE\n if (el.nodeName == 'IMG') el = el.parentNode;\n //var name = el.firstChild.nodeValue;\n // This is not very robust, it assumes there is an image as first node then text\n var name = el.childNodes.item(1).nodeValue;\n var dad = el.parentNode;\n var node;\n \n // kill all arrows\n for (var im = 0; (node = dad.getElementsByTagName("th").item(im [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): ) {\n result.push(terms[i]);\n }\n }\n return result;\n }\n return result.length == 0 ? false : result;\n}\n\nfunction highlightSearchTermsFromURI() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n // search-term-highlighter function -- Geir B\xc3\xa6kholt\n var terms = getSearchTermsFromURI(window.location.search);\n // make sure we start the right place so we don't higlight menuitems or breadcrumb\n var contentarea = getContentArea();\n highlightSearchTerms(terms, contentarea);\n}\n\nregisterPloneFunction(highlightSearchTermsFromURI);\n\n\n/* ----- se-highlight.js ----- */\n/* List of search engine matchers and the referrer search\n * code where carefully borrowed from the\n * "Search Engine Keyword Highlight" by Scott Yang,\n * see http://fucoder.com/code/se-hilite/ for further\n * details.\n */\nvar searchEngines = [\n ['^http://(www)?\\\\.?google.*', 'q='], // Google\n ['^http://search\\\\.yahoo.*', 'p='], // Yahoo\n ['^http://search\\\\.msn.*', 'q='], // MSN\n ['^http://search\\\\.aol.*', 'userQuery='], // AOL\n ['^http://(www\\\\.)?altavista.*', 'q='], // AltaVista\n ['^http://(www\\\\.)?feedster.*', 'q='], // Feedster\n ['^http://search\\\\.lycos.*', 'query='], // Lycos\n ['^http://(www\\\\.)?alltheweb.*', 'q='] // AllTheWeb\n]\n\nfunction decodeReferrer(ref) {\n // checks if we are beeing searched by a search engine\n if (null == ref && document.referrer) {\n ref = document.referrer;\n }\n if (!ref) return null;\n\n var match = new RegExp('');\n var seQuery = '';\n for (var i = 0; i < searchEngines.length; i ++) {\n match.compile(searchEngines[i][0], 'i');\n if (ref.match(match)) {\n match.compile('^.*'+searchEngines[i][1]+'([^&]+)&?.*$');\n seQuery = ref.replace(match, '$1');\n if (seQuery) {\n seQuery = decodeURIComponent(seQuery);\n seQuery = seQuery.replace(/\\'|"/, '');\n return seQuery.split(/[\\s,\\+\\.]+/);\n }\n\n }\n }\n return null;\n}\n\n\n/* ----- first_input_focus.js ----- */\n// Focus on error \nfunction setFocus(){\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var xre = new RegExp(/\\berror\\b/);\n // Search only forms to avoid spending time on regular text\n for (var f = 0; (formnode = document.getElementsByTagName('form').item(f)); f++){\n // Search for errors first, focus on first error if found\n for (var i = 0; (node = formnode.getElementsByTagName('div').item(i)); i++) {\n if (xre.exec(node.className)){\n for (var j = 0; (inputnode = node.getElementsByTagName('input').item(j)); j++) {\n try {\n if (inputnode.focus) { // check availability first\n inputnode.focus();\n return;\n }\n } catch(e) {\n // try next one, this can happen with a hidden or\n // invisible input field\n }\n }\n }\n }\n }\n}\nregisterPloneFunction(setFocus)\n\n\n/* ----- folder_contents_filter.js ----- */\n// Actions used in the folder_contents view\nfunction submitFolderAction(folderAction) {\n document.folderContentsForm.action = document.folderContentsForm.action+'/'+folderAction;\n document.folderContentsForm.submit();\n}\n\nfunction submitFilterAction() {\n document.folderContentsForm.action = document.folderContentsForm.action+'/folder_contents';\n filter_selection=document.getElementById('filter_selection');\n for (var i =0; i < filter_selection.length; i++){\n if (filter_selection.options[i].selected) {\n if (filter_selection.options[i].value=='#') {\n document.folderContentsForm.filter_state.value='clear_view_filter';\n }\n else {\n document.folderContentsForm.filter_state.value='set_view_filter';\n }\n }\n }\n document.folderContentsForm.submit();\n}\n\n\n\n/* ----- folder_contents_hideAddItems.js ----- */\n// function to hide the traditional add items pull down menu.\n\nfunction hideTraditionalAddItemPullDown() {\n // Get the old style Add Item pulldown. We already have\n // such a menu. This is only for system that don't have javascript\n // so we can savely remove it.\n pullDown = document.getElementById('traditional-add-item-pulldown');\n if (pullDown) { \n pullDown.style.display='none';\n }\n}\n\nregisterPloneFunction(hideTraditionalAddItemPullDown)\n\n/* ----- styleswitcher.js ----- */\n// StyleSwitcher functions written by Paul Sowden\nfunction setActiveStyleSheet(title, reset) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var i, a, main;\n for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {\n if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {\n a.disabled = true;\n if (a.getAttribute("title") == title) {\n a.disabled = false;\n }\n }\n }\n if (reset == 1) {\n createCookie("wstyle", title, 365);\n }\n};\n\nfunction setStyle() {\n var style = readCookie("wstyle");\n if (style != null) {\n setActiveStyleSheet(style, 0);\n }\n};\nregisterPloneFunction(setStyle);\n\n\n\n\n/* ----- table_sorter.js ----- */\n\n/********* Table sorter script *************/\n// Table sorter script, thanks to Geir B\xc3\xa6kholt for this.\n// DOM table sorter originally made by Paul Sowden \n\nfunction compare(a,b)\n{\n au = new String(a);\n bu = new String(b);\n\n if (au.charAt(4) != '-' && au.charAt(7) != '-')\n {\n var an = parseFloat(au)\n var bn = parseFloat(bu)\n }\n if (isNaN(an) || isNaN(bn))\n {as = au.toLowerCase()\n bs = bu.toLowerCase()\n if (as > bs)\n {return 1;}\n else\n {return -1;}\n }\n else {\n return an - bn;\n }\n}\nfunction getConcatenedTextContent(node) {\n var _result = "";\n if (node == null) {\n return _result;\n }\n var childrens = node.childNodes;\n var i = 0;\n while (i < childrens.length) {\n var child = childrens.item(i);\n switch (child.nodeType) {\n case 1: // ELEMENT_NODE\n case 5: // ENTITY_REFERENCE_NODE\n _result += getConcatenedTextContent(child);\n break;\n case 3: // TEXT_NODE\n case 2: // ATTRIBUTE_NODE\n case 4: // CDATA_SECTION_NODE\n _result += child.nodeValue;\n break;\n case 6: // ENTITY_NODE\n case 7: // PROCESSING_INSTRUCTION_NODE\n case 8: // COMMENT_NODE\n case 9: // DOCUMENT_NODE\n case 10: // DOCUMENT_TYPE_NODE\n case 11: // DOCUMENT_FRAGMENT_NODE\n case 12: // NOTATION_NODE\n // skip\n break;\n }\n i ++;\n }\n return _result;\n}\n\nfunction sort(e) {\n var el = window.event ? window.event.srcElement : e.currentTarget;\n\n // a pretty ugly sort function, but it works nonetheless\n var a = new Array();\n // check if the image or the th is clicked. Proceed to parent id it is the image\n // NOTE THAT nodeName IS UPPERCASE\n if (el.nodeName == 'IMG') el = el.parentNode;\n //var name = el.firstChild.nodeValue;\n // This is not very robust, it assumes there is an image as first node then text\n var name = el.childNodes.item(1).nodeValue;\n var dad = el.parentNode;\n var node;\n \n // kill all arrows\n for (var im = 0; (node = dad.getElementsByTagName("th").item(i [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): - 1;\n node.getElementsByTagName('img').item(lastindex).setAttribute('src',portal_url + '/arrowBlank.gif');\n }\n }\n \n for (var i = 0; (node = dad.getElementsByTagName("th").item(i)); i++) {\n var xre = new RegExp(/\\bnosort\\b/);\n // Make sure we are not messing with nosortable columns, then check second node.\n if (!xre.exec(node.className) && node.childNodes.item(1).nodeValue == name) \n {\n //window.alert(node.childNodes.item(1).nodeValue;\n lastindex = node.getElementsByTagName('img').length -1;\n node.getElementsByTagName('img').item(lastindex).setAttribute('src',portal_url + '/arrowUp.gif');\n break;\n }\n }\n\n var tbody = dad.parentNode.parentNode.getElementsByTagName("tbody").item(0);\n for (var j = 0; (node = tbody.getElementsByTagName("tr").item(j)); j++) {\n\n // crude way to sort by surname and name after first choice\n a[j] = new Array();\n a[j][0] = getConcatenedTextContent(node.getElementsByTagName("td").item(i));\n a[j][1] = getConcatenedTextContent(node.getElementsByTagName("td").item(1));\n a[j][2] = getConcatenedTextContent(node.getElementsByTagName("td").item(0)); \n a[j][3] = node;\n }\n\n if (a.length > 1) {\n \n a.sort(compare);\n\n // not a perfect way to check, but hell, it suits me fine\n if (a[0][0] == getConcatenedTextContent(tbody.getElementsByTagName("tr").item(0).getElementsByTagName("td").item(i))\n && a[1][0] == getConcatenedTextContent(tbody.getElementsByTagName("tr").item(1).getElementsByTagName("td").item(i))) \n {\n a.reverse();\n lastindex = el.getElementsByTagName('img').length - 1;\n el.getElementsByTagName('img').item(lastindex).setAttribute('src', portal_url + '/arrowDown.gif');\n }\n\n }\n \n for (var j = 0; j < a.length; j++) {\n tbody.appendChild(a[j][3]);\n }\n}\n \nfunction initalizeTableSort(e) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var tbls = document.getElementsByTagName('table');\n for (var t = 0; t < tbls.length; t++)\n {\n // elements of class="listing" can be sorted\n var re = new RegExp(/\\blisting\\b/)\n // elements of class="nosort" should not be sorted\n var xre = new RegExp(/\\bnosort\\b/)\n if (re.exec(tbls[t].className) && !xre.exec(tbls[t].className))\n {\n try {\n var thead = tbls[t].getElementsByTagName("thead").item(0);\n var node;\n // set up blank spaceholder gifs\n blankarrow = document.createElement('img');\n blankarrow.setAttribute('src', portal_url + '/arrowBlank.gif');\n blankarrow.setAttribute('height',6);\n blankarrow.setAttribute('width',9);\n // the first sortable column should get an arrow initially.\n initialsort = false;\n for (var i = 0; (node = thead.getElementsByTagName("th").item(i)); i++) {\n // check that the columns does not have class="nosort"\n if (!xre.exec(node.className)) {\n node.insertBefore(blankarrow.cloneNode(1), node.firstChild);\n node.style.cursor = 'pointer';\n if (!initialsort) {\n initialsort = true;\n uparrow = document.createElement('img');\n uparrow.setAttribute('src', portal_url + '/arrowUp.gif');\n uparrow.setAttribute('height',6);\n uparrow.setAttribute('width',9);\n node.appendChild(uparrow);\n } else {\n node.appendChild(blankarrow.cloneNode(1));\n }\n \n if (node.addEventListener) node.addEventListener("click",sort,false);\n else if (node.attachEvent) node.attachEvent("onclick",sort);\n }\n }\n } catch(er) {}\n }\n }\n} \n// **** End table sort script ***\nregisterPloneFunction(initalizeTableSort) \n\n\n\n/* ----- calendar_formfield.js ----- */\n// jscalendar glue -- Leonard Norrg\xc3\xa5rd <vinsci@*>\n// This function gets called when the user clicks on some date.\nfunction onJsCalendarDateUpdate(cal) {\n var year = cal.params.input_id_year;\n var month = cal.params.input_id_month;\n var day = cal.params.input_id_day;\n // var hour = cal.params.input_id_hour;\n // var minute = cal.params.input_id_minute;\n\n // cal.params.inputField.value = cal.date.print('%Y/%m/%d %H:%M'); // doesn't work in Opera, don't use time now\n //cal.params.inputField.value = cal.date.print('%Y/%m/%d'); // doesn't work in Opera\n var daystr = '' + cal.date.getDate();\n if (daystr.length == 1)\n \tdaystr = '0' + daystr;\n var monthstr = '' + (cal.date.getMonth()+1);\n if (monthstr.length == 1)\n\tmonthstr = '0' + monthstr;\n cal.params.inputField.value = '' + cal.date.getFullYear() + '/' + monthstr + '/' + daystr\n\n year.value = cal.params.inputField.value.substring(0,4);\n month.value = cal.params.inputField.value.substring(5,7);\n day.value = cal.params.inputField.value.substring(8,10);\n // hour.value = cal.params.inputField.value.substring(11,13);\n // minute.value= cal.params.inputField.value.substring(14,16);\n}\n\n\nfunction showJsCalendar(input_id_anchor, input_id, input_id_year, input_id_month, input_id_day, input_id_hour, input_id_minute, yearStart, yearEnd) {\n // do what jscalendar-x.y.z/calendar-setup.js:Calendar.setup would do\n var input_id_anchor = document.getElementById(input_id_anchor);\n var input_id = document.getElementById(input_id);\n var input_id_year = document.getElementById(input_id_year);\n var input_id_month = document.getElementById(input_id_month);\n var input_id_day = document.getElementById(input_id_day);\n // var input_id_hour = document.getElementById(input_id_hour);\n // var input_id_minute = document.getElementById(input_id_minute);\n var format = 'y/mm/dd';\n\n var dateEl = input_id;\n var mustCreate = false;\n var cal = window.calendar;\n\n var params = {\n 'range' : [yearStart, yearEnd],\n inputField : input_id,\n input_id_year : input_id_year,\n input_id_month: input_id_month,\n input_id_day : input_id_day\n // input_id_hour : input_id_hour,\n // input_id_minute: input_id_minute\n };\n\n function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };\n\n param_default("inputField", null);\n param_default("displayArea", null);\n param_default("button", null);\n param_default("eventName", "click");\n param_default("ifFormat", "%Y/%m/%d");\n param_default("daFormat", "%Y/%m/%d");\n param_default("singleClick", true);\n param_default("disableFunc", null);\n param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined\n param_default("dateText", null);\n param_default("firstDay", 1);\n param_default("align", "Bl");\n param_default("range", [1900, 2999]);\n param_default("weekNumbers", true);\n param_default("flat", null);\n param_default("flatCallback", null);\n param_default("onSelect", null);\n param_default("onClose", null);\n param_default("onUpdate", null);\n param_default("date", null);\n param_default("showsTime", false);\n param_default("timeFormat", "24");\n param_default("electric", true);\n param_default("step", 2);\n param_default("position", null);\n param_default("cache", [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): - 1;\n node.getElementsByTagName('img').item(lastindex).setAttribute('src',portal_url + '/arrowBlank.gif');\n }\n }\n \n for (var i = 0; (node = dad.getElementsByTagName("th").item(i)); i++) {\n var xre = new RegExp(/\\bnosort\\b/);\n // Make sure we are not messing with nosortable columns, then check second node.\n if (!xre.exec(node.className) && node.childNodes.item(1).nodeValue == name) \n {\n //window.alert(node.childNodes.item(1).nodeValue;\n lastindex = node.getElementsByTagName('img').length -1;\n node.getElementsByTagName('img').item(lastindex).setAttribute('src',portal_url + '/arrowUp.gif');\n break;\n }\n }\n\n var tbody = dad.parentNode.parentNode.getElementsByTagName("tbody").item(0);\n for (var j = 0; (node = tbody.getElementsByTagName("tr").item(j)); j++) {\n\n // crude way to sort by surname and name after first choice\n a[j] = new Array();\n a[j][0] = getConcatenedTextContent(node.getElementsByTagName("td").item(i));\n a[j][1] = getConcatenedTextContent(node.getElementsByTagName("td").item(1));\n a[j][2] = getConcatenedTextContent(node.getElementsByTagName("td").item(0)); \n a[j][3] = node;\n }\n\n if (a.length > 1) {\n \n a.sort(compare);\n\n // not a perfect way to check, but hell, it suits me fine\n if (a[0][0] == getConcatenedTextContent(tbody.getElementsByTagName("tr").item(0).getElementsByTagName("td").item(i))\n && a[1][0] == getConcatenedTextContent(tbody.getElementsByTagName("tr").item(1).getElementsByTagName("td").item(i))) \n {\n a.reverse();\n lastindex = el.getElementsByTagName('img').length - 1;\n el.getElementsByTagName('img').item(lastindex).setAttribute('src', portal_url + '/arrowDown.gif');\n }\n\n }\n \n for (var j = 0; j < a.length; j++) {\n tbody.appendChild(a[j][3]);\n }\n}\n \nfunction initalizeTableSort(e) {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var tbls = document.getElementsByTagName('table');\n for (var t = 0; t < tbls.length; t++)\n {\n // elements of class="listing" can be sorted\n var re = new RegExp(/\\blisting\\b/)\n // elements of class="nosort" should not be sorted\n var xre = new RegExp(/\\bnosort\\b/)\n if (re.exec(tbls[t].className) && !xre.exec(tbls[t].className))\n {\n try {\n var thead = tbls[t].getElementsByTagName("thead").item(0);\n var node;\n // set up blank spaceholder gifs\n blankarrow = document.createElement('img');\n blankarrow.setAttribute('src', portal_url + '/arrowBlank.gif');\n blankarrow.setAttribute('height',6);\n blankarrow.setAttribute('width',9);\n // the first sortable column should get an arrow initially.\n initialsort = false;\n for (var i = 0; (node = thead.getElementsByTagName("th").item(i)); i++) {\n // check that the columns does not have class="nosort"\n if (!xre.exec(node.className)) {\n node.insertBefore(blankarrow.cloneNode(1), node.firstChild);\n node.style.cursor = 'pointer';\n if (!initialsort) {\n initialsort = true;\n uparrow = document.createElement('img');\n uparrow.setAttribute('src', portal_url + '/arrowUp.gif');\n uparrow.setAttribute('height',6);\n uparrow.setAttribute('width',9);\n node.appendChild(uparrow);\n } else {\n node.appendChild(blankarrow.cloneNode(1));\n }\n \n if (node.addEventListener) node.addEventListener("click",sort,false);\n else if (node.attachEvent) node.attachEvent("onclick",sort);\n }\n }\n } catch(er) {}\n }\n }\n} \n// **** End table sort script ***\nregisterPloneFunction(initalizeTableSort) \n\n\n\n/* ----- calendar_formfield.js ----- */\n// jscalendar glue -- Leonard Norrg\xc3\xa5rd <vinsci@*>\n// This function gets called when the user clicks on some date.\nfunction onJsCalendarDateUpdate(cal) {\n var year = cal.params.input_id_year;\n var month = cal.params.input_id_month;\n var day = cal.params.input_id_day;\n // var hour = cal.params.input_id_hour;\n // var minute = cal.params.input_id_minute;\n\n // cal.params.inputField.value = cal.date.print('%Y/%m/%d %H:%M'); // doesn't work in Opera, don't use time now\n //cal.params.inputField.value = cal.date.print('%Y/%m/%d'); // doesn't work in Opera\n var daystr = '' + cal.date.getDate();\n if (daystr.length == 1)\n \tdaystr = '0' + daystr;\n var monthstr = '' + (cal.date.getMonth()+1);\n if (monthstr.length == 1)\n\tmonthstr = '0' + monthstr;\n cal.params.inputField.value = '' + cal.date.getFullYear() + '/' + monthstr + '/' + daystr\n\n year.value = cal.params.inputField.value.substring(0,4);\n month.value = cal.params.inputField.value.substring(5,7);\n day.value = cal.params.inputField.value.substring(8,10);\n // hour.value = cal.params.inputField.value.substring(11,13);\n // minute.value= cal.params.inputField.value.substring(14,16);\n}\n\n\nfunction showJsCalendar(input_id_anchor, input_id, input_id_year, input_id_month, input_id_day, input_id_hour, input_id_minute, yearStart, yearEnd) {\n // do what jscalendar-x.y.z/calendar-setup.js:Calendar.setup would do\n var input_id_anchor = document.getElementById(input_id_anchor);\n var input_id = document.getElementById(input_id);\n var input_id_year = document.getElementById(input_id_year);\n var input_id_month = document.getElementById(input_id_month);\n var input_id_day = document.getElementById(input_id_day);\n // var input_id_hour = document.getElementById(input_id_hour);\n // var input_id_minute = document.getElementById(input_id_minute);\n var format = 'y/mm/dd';\n\n var dateEl = input_id;\n var mustCreate = false;\n var cal = window.calendar;\n\n var params = {\n 'range' : [yearStart, yearEnd],\n inputField : input_id,\n input_id_year : input_id_year,\n input_id_month: input_id_month,\n input_id_day : input_id_day\n // input_id_hour : input_id_hour,\n // input_id_minute: input_id_minute\n };\n\n function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };\n\n param_default("inputField", null);\n param_default("displayArea", null);\n param_default("button", null);\n param_default("eventName", "click");\n param_default("ifFormat", "%Y/%m/%d");\n param_default("daFormat", "%Y/%m/%d");\n param_default("singleClick", true);\n param_default("disableFunc", null);\n param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined\n param_default("dateText", null);\n param_default("firstDay", 1);\n param_default("align", "Bl");\n param_default("range", [1900, 2999]);\n param_default("weekNumbers", true);\n param_default("flat", null);\n param_default("flatCallback", null);\n param_default("onSelect", null);\n param_default("onClose", null);\n param_default("onUpdate", null);\n param_default("date", null);\n param_default("showsTime", false);\n param_default("timeFormat", "24");\n param_default("electric", true);\n param_default("step", 2);\n param_default("position", null);\n param_default("cache", [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): null);\n\n if (!(cal && params.cache)) {\n\twindow.calendar = cal = new Calendar(params.firstDay,\n\t null,\n\t onJsCalendarDateUpdate,\n\t function(cal) { cal.hide(); });\n\tcal.time24 = true;\n\tcal.weekNumbers = true;\n\tmustCreate = true;\n } else {\n cal.hide();\n }\n cal.showsOtherMonths = false;\n cal.yearStep = 2;\n cal.setRange(yearStart,yearEnd);\n cal.params = params;\n cal.setDateStatusHandler(null);\n cal.getDateText = null;\n cal.setDateFormat(format);\n if (mustCreate)\n\tcal.create();\n cal.refresh();\n if (!params.position)\n cal.showAtElement(input_id_anchor, null);\n else\n cal.showAt(params.position[0], params.position[1]);\n return false;\n}\n\n\n// This function updates a hidden date field with the current values of the widgets\nfunction update_date_field(field, year, month, day, hour, minute, ampm)\n{\n var field = document.getElementById(field)\n var date = document.getElementById(date)\n var year = document.getElementById(year)\n var month = document.getElementById(month)\n var day = document.getElementById(day)\n var hour = document.getElementById(hour)\n var minute = document.getElementById(minute)\n var ampm = document.getElementById(ampm)\n\n if (0 < year.value)\n {\n // Return ISO date string\n // Note: This relies heavily on what date_components_support.py puts into the form.\n field.value = year.value + "-" + month.value + "-" + day.value + " " + hour.value + ":" + minute.value\n // Handle optional AM/PM\n if (ampm && ampm.value)\n field.value = field.value + " " + ampm.value\n } \n else \n {\n // Return empty string\n field.value = ''\n // Reset widgets\n month.options[0].selected = 1\n day.options[0].selected = 1\n hour.options[0].selected = 1\n minute.options[0].selected = 1\n if (ampm && ampm.options)\n ampm.options[0].selected = 1\n }\n}\n\n\n\n\n/* ----- calendarpopup.js ----- */\n\n// The calendar popup show/hide:\n\n function showDay(date) {\n document.getElementById('day' + date).style.visibility = 'visible';\n return true;\n } \n function hideDay(date) {\n document.getElementById('day' + date).style.visibility = 'hidden';\n return true;\n }\n\n\n \n\n\n\n\n/* ----- ie5fixes.js ----- */\n/* Mike Malloch's fixes for Internet Explorer 5 - \n * We dont care too much about IE5,\n * But these stop if from spitting errormessages at the user \n */\nfunction hackPush(el){\n this[this.length] = el;\n}\n\nfunction hackPop(){\n var N = this.length - 1, el = this[N];\n this.length = N\n return el;\n}\n\nfunction hackShift(){\n var one = this[0], N = this.length;\n for (var i = 1; i < N; i++){\n this[i-1] = this[i];\n }\n this.length = N-1\n return one;\n}\n\nvar testPushPop = new Array();\nif (testPushPop.push){\n}else{\n Array.prototype.push = hackPush\n Array.prototype.pop = hackPop\n Array.prototype.shift = hackShift;\n}\n\n/* ----- formUnload.js ----- */\n/* BeforeUnload form processing */\nif (!window.beforeunload) (function() {\n var BeforeUnloadHandler = function() {\n var self = this;\n\n this.message = window.form_modified_message ||\n "Your form has not been saved. All changes you have made will be lost.";\n\n this.forms = [];\n this.chkId = [];\n this.chkType = new this.CheckType();\n this.handlers = [this.isAnyFormChanged];\n this.submitting = false;\n\n this.execute = function(event) {\n if (self.submitting) return;\n if (!event) event = window.event;\n\n for (var i = 0; i < self.handlers.length; i++) {\n var fn = self.handlers[i];\n var message = message || fn.apply(self);\n }\n if (message===true) message = self.message;\n if (message===false) message = undefined;\n if (event && message) { event.returnValue = message; }\n return message;\n }\n this.execute.tool = this;\n }\n var Class = BeforeUnloadHandler.prototype;\n\n // form checking code\n Class.isAnyFormChanged = function() {\n for (var i=0; i < this.forms.length; i++) {\n var form = this.forms[i];\n if (this.isElementChanged(form)) {\n return true;\n }\n }\n return false;\n }\n Class.addHandler = function(fn) {\n this.handlers.push(fn);\n }\n Class.onsubmit = function() {\n var tool = window.onbeforeunload && window.onbeforeunload.tool;\n tool.submitting = true;\n }\n Class.addForm = function(form) {\n for (var i = 0; i < this.forms.length; i++) {\n if (this.forms[i]==form) return;\n }\n this.forms.push(form);\n form.onsubmit = this.onsubmit;\n var elements = form.getElementsByTagName('input');\n for (var j = 0; j < elements.length; j++) {\n var ele = elements[j];\n if (ele.type=='hidden') {\n ele.setAttribute('originalValue', ele.defaultValue);\n }\n }\n }\n Class.addForms = function() {\n for (var i = 0; i < arguments.length; i++) {\n var element = arguments[i];\n if (!element) continue;\n if (element.tagName=='FORM') {\n this.addForm(element);\n }\n else {\n var forms = element.getElementsByTagName('form');\n for (var j = 0; j < forms.length; j++) {\n this.addForm(forms[j]);\n }\n }\n }\n }\n Class.removeForms = function() {\n for (var i = 0; i < arguments.length; i++) {\n var element = arguments[i];\n if (!element) continue;\n if (element.tagName=='FORM') {\n for (var j = 0; j < arguments.length; j++) {\n if (this.forms[j] == element) {\n this.forms.splice(j--, 1);\n element.onsubmit=null;\n }\n }\n } else {\n var forms = element.getElementsByTagName('form');\n for (var j = 0; j < forms.length; j++) {\n this.removeForms(forms[j]);\n }\n }\n }\n }\n\n Class.CheckType = function() {};\n var c = Class.CheckType.prototype;\n c.checkbox = c.radio = function(ele) {\n return ele.checked != ele.defaultChecked;\n }\n c.password = c.textarea = c.text = function(ele) {\n return ele.value != ele.defaultValue;\n }\n // hidden: cannot tell on Mozilla without special treatment\n c.hidden = function(ele) {\n var orig = ele.getAttribute("originalValue");\n return orig && (ele.value != orig);\n }\n\n c['select-one'] = function(ele) {\n for (var i=0 ; i < ele.length; i++) {\n var opt = ele.options[i];\n if ( opt.selected != opt.defaultSelected) {\n if (i===0 && opt.selected) continue; /* maybe no default */\n return true;\n }\n }\n return false;\n }\n\n c['select-multiple'] = function(ele) {\n for (var i=0 ; i < ele.length; i++) {\n var opt = ele.options[i];\n if ( opt.selected != opt.defaultSelected) {\n return true;\n }\n }\n return false;\n }\n\n Class.chk_form = function(form) {\n var elements = form.elements;\n for (var i=0; i < elements.length; i++ ) {\n var element = elements[i];\n if (this.isElementChanged(element)) {\n return true;\n }\n }\n return false;\n }\n\n Class.isElementChanged = function(ele) {\n var method = ele.id && this.chkId[ele.id];\n if (!method && ele.type && [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): null);\n\n if (!(cal && params.cache)) {\n\twindow.calendar = cal = new Calendar(params.firstDay,\n\t null,\n\t onJsCalendarDateUpdate,\n\t function(cal) { cal.hide(); });\n\tcal.time24 = true;\n\tcal.weekNumbers = true;\n\tmustCreate = true;\n } else {\n cal.hide();\n }\n cal.showsOtherMonths = false;\n cal.yearStep = 2;\n cal.setRange(yearStart,yearEnd);\n cal.params = params;\n cal.setDateStatusHandler(null);\n cal.getDateText = null;\n cal.setDateFormat(format);\n if (mustCreate)\n\tcal.create();\n cal.refresh();\n if (!params.position)\n cal.showAtElement(input_id_anchor, null);\n else\n cal.showAt(params.position[0], params.position[1]);\n return false;\n}\n\n\n// This function updates a hidden date field with the current values of the widgets\nfunction update_date_field(field, year, month, day, hour, minute, ampm)\n{\n var field = document.getElementById(field)\n var date = document.getElementById(date)\n var year = document.getElementById(year)\n var month = document.getElementById(month)\n var day = document.getElementById(day)\n var hour = document.getElementById(hour)\n var minute = document.getElementById(minute)\n var ampm = document.getElementById(ampm)\n\n if (0 < year.value)\n {\n // Return ISO date string\n // Note: This relies heavily on what date_components_support.py puts into the form.\n field.value = year.value + "-" + month.value + "-" + day.value + " " + hour.value + ":" + minute.value\n // Handle optional AM/PM\n if (ampm && ampm.value)\n field.value = field.value + " " + ampm.value\n } \n else \n {\n // Return empty string\n field.value = ''\n // Reset widgets\n month.options[0].selected = 1\n day.options[0].selected = 1\n hour.options[0].selected = 1\n minute.options[0].selected = 1\n if (ampm && ampm.options)\n ampm.options[0].selected = 1\n }\n}\n\n\n\n\n/* ----- calendarpopup.js ----- */\n\n// The calendar popup show/hide:\n\n function showDay(date) {\n document.getElementById('day' + date).style.visibility = 'visible';\n return true;\n } \n function hideDay(date) {\n document.getElementById('day' + date).style.visibility = 'hidden';\n return true;\n }\n\n\n \n\n\n\n\n/* ----- ie5fixes.js ----- */\n/* Mike Malloch's fixes for Internet Explorer 5 - \n * We dont care too much about IE5,\n * But these stop if from spitting errormessages at the user \n */\nfunction hackPush(el){\n this[this.length] = el;\n}\n\nfunction hackPop(){\n var N = this.length - 1, el = this[N];\n this.length = N\n return el;\n}\n\nfunction hackShift(){\n var one = this[0], N = this.length;\n for (var i = 1; i < N; i++){\n this[i-1] = this[i];\n }\n this.length = N-1\n return one;\n}\n\nvar testPushPop = new Array();\nif (testPushPop.push){\n}else{\n Array.prototype.push = hackPush\n Array.prototype.pop = hackPop\n Array.prototype.shift = hackShift;\n}\n\n/* ----- formUnload.js ----- */\n/* BeforeUnload form processing */\nif (!window.beforeunload) (function() {\n var BeforeUnloadHandler = function() {\n var self = this;\n\n this.message = window.form_modified_message ||\n "Your form has not been saved. All changes you have made will be lost.";\n\n this.forms = [];\n this.chkId = [];\n this.chkType = new this.CheckType();\n this.handlers = [this.isAnyFormChanged];\n this.submitting = false;\n\n this.execute = function(event) {\n if (self.submitting) return;\n if (!event) event = window.event;\n\n for (var i = 0; i < self.handlers.length; i++) {\n var fn = self.handlers[i];\n var message = message || fn.apply(self);\n }\n if (message===true) message = self.message;\n if (message===false) message = undefined;\n if (event && message) { event.returnValue = message; }\n return message;\n }\n this.execute.tool = this;\n }\n var Class = BeforeUnloadHandler.prototype;\n\n // form checking code\n Class.isAnyFormChanged = function() {\n for (var i=0; i < this.forms.length; i++) {\n var form = this.forms[i];\n if (this.isElementChanged(form)) {\n return true;\n }\n }\n return false;\n }\n Class.addHandler = function(fn) {\n this.handlers.push(fn);\n }\n Class.onsubmit = function() {\n var tool = window.onbeforeunload && window.onbeforeunload.tool;\n tool.submitting = true;\n }\n Class.addForm = function(form) {\n for (var i = 0; i < this.forms.length; i++) {\n if (this.forms[i]==form) return;\n }\n this.forms.push(form);\n form.onsubmit = this.onsubmit;\n var elements = form.getElementsByTagName('input');\n for (var j = 0; j < elements.length; j++) {\n var ele = elements[j];\n if (ele.type=='hidden') {\n ele.setAttribute('originalValue', ele.defaultValue);\n }\n }\n }\n Class.addForms = function() {\n for (var i = 0; i < arguments.length; i++) {\n var element = arguments[i];\n if (!element) continue;\n if (element.tagName=='FORM') {\n this.addForm(element);\n }\n else {\n var forms = element.getElementsByTagName('form');\n for (var j = 0; j < forms.length; j++) {\n this.addForm(forms[j]);\n }\n }\n }\n }\n Class.removeForms = function() {\n for (var i = 0; i < arguments.length; i++) {\n var element = arguments[i];\n if (!element) continue;\n if (element.tagName=='FORM') {\n for (var j = 0; j < arguments.length; j++) {\n if (this.forms[j] == element) {\n this.forms.splice(j--, 1);\n element.onsubmit=null;\n }\n }\n } else {\n var forms = element.getElementsByTagName('form');\n for (var j = 0; j < forms.length; j++) {\n this.removeForms(forms[j]);\n }\n }\n }\n }\n\n Class.CheckType = function() {};\n var c = Class.CheckType.prototype;\n c.checkbox = c.radio = function(ele) {\n return ele.checked != ele.defaultChecked;\n }\n c.password = c.textarea = c.text = function(ele) {\n return ele.value != ele.defaultValue;\n }\n // hidden: cannot tell on Mozilla without special treatment\n c.hidden = function(ele) {\n var orig = ele.getAttribute("originalValue");\n return orig && (ele.value != orig);\n }\n\n c['select-one'] = function(ele) {\n for (var i=0 ; i < ele.length; i++) {\n var opt = ele.options[i];\n if ( opt.selected != opt.defaultSelected) {\n if (i===0 && opt.selected) continue; /* maybe no default */\n return true;\n }\n }\n return false;\n }\n\n c['select-multiple'] = function(ele) {\n for (var i=0 ; i < ele.length; i++) {\n var opt = ele.options[i];\n if ( opt.selected != opt.defaultSelected) {\n return true;\n }\n }\n return false;\n }\n\n Class.chk_form = function(form) {\n var elements = form.elements;\n for (var i=0; i < elements.length; i++ ) {\n var element = elements[i];\n if (this.isElementChanged(element)) {\n return true;\n }\n }\n return false;\n }\n\n Class.isElementChanged = function(ele) {\n var method = ele.id && this.chkId[ele.id];\n if (!method && ele.type & [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): od? method.apply(this, [ele]) : false;\n };\n\n window.onbeforeunload = new BeforeUnloadHandler().execute;\n \n registerPloneFunction(function() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var tool = window.onbeforeunload && window.onbeforeunload.tool;\n var content = getContentArea();\n if (tool && content) {\n var forms = cssQuery('form.enableUnloadProtection');\n for (var i=0; i < forms.length; i++) {\n tool.addForm(forms[i]);\n }\n }\n });\n})();\n\n/* ----- sarissa.js ----- */\n/*****************************************************************************\n *\n * Sarissa XML library version 0.9.6\n * Copyright (c) 2003 Manos Batsis, \n * mailto: mbatsis at users full stop sourceforge full stop net\n * This software is distributed under the Kupu License. See\n * LICENSE.txt for license text. See the Sarissa homepage at\n * http://sarissa.sourceforge.net for more information.\n *\n *****************************************************************************\n\n * ====================================================================\n * About\n * ====================================================================\n * Sarissa cross browser XML library \n * @version 0.9.6\n * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net\n *\n * Sarissa is an ECMAScript library acting as a cross-browser wrapper for native XML APIs.\n * The library supports Gecko based browsers like Mozilla and Firefox,\n * Internet Explorer (5.5+ with MSXML3.0+) and, last but not least, KHTML based browsers like\n * Konqueror and Safari.\n *\n */\n/**\n * <p>Sarissa is a utility class. Provides static methods for DOMDocument and \n * XMLHTTP objects, DOM Node serializatrion to XML strings and other goodies.</p>\n * @constructor\n */\nfunction Sarissa(){};\n/** @private */\nSarissa.PARSED_OK = "Document contains no parsing errors";\n/**\n * Tells you whether transformNode and transformNodeToObject are available. This functionality\n * is contained in sarissa_ieemu_xslt.js and is deprecated. If you want to control XSLT transformations\n * use the XSLTProcessor\n * @deprecated\n * @type boolean\n */\nSarissa.IS_ENABLED_TRANSFORM_NODE = false;\n/**\n * tells you whether XMLHttpRequest (or equivalent) is available\n * @type boolean\n */\nSarissa.IS_ENABLED_XMLHTTP = false;\n/**\n * tells you whether selectNodes/selectSingleNode is available\n * @type boolean\n */\nSarissa.IS_ENABLED_SELECT_NODES = false;\nvar _sarissa_iNsCounter = 0;\nvar _SARISSA_IEPREFIX4XSLPARAM = "";\nvar _SARISSA_HAS_DOM_IMPLEMENTATION = document.implementation && true;\nvar _SARISSA_HAS_DOM_CREATE_DOCUMENT = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.createDocument;\nvar _SARISSA_HAS_DOM_FEATURE = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.hasFeature;\nvar _SARISSA_IS_MOZ = _SARISSA_HAS_DOM_CREATE_DOCUMENT && _SARISSA_HAS_DOM_FEATURE;\nvar _SARISSA_IS_SAFARI = navigator.userAgent.toLowerCase().indexOf("applewebkit") != -1;\nvar _SARISSA_IS_IE = document.all && window.ActiveXObject && navigator.userAgent.toLowerCase().indexOf("msie") > -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1;\n\nif(!window.Node || !window.Node.ELEMENT_NODE){\n var Node = {ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5, ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12};\n};\n\n// IE initialization\nif(_SARISSA_IS_IE){\n // for XSLT parameter names, prefix needed by IE\n _SARISSA_IEPREFIX4XSLPARAM = "xsl:";\n // used to store the most recent ProgID available out of the above\n var _SARISSA_DOM_PROGID = "";\n var _SARISSA_XMLHTTP_PROGID = "";\n /**\n * Called when the Sarissa_xx.js file is parsed, to pick most recent\n * ProgIDs for IE, then gets destroyed.\n * @param idList an array of MSXML PROGIDs from which the most recent will be picked for a given object\n * @param enabledList an array of arrays where each array has two items; the index of the PROGID for which a certain feature is enabled\n */\n pickRecentProgID = function (idList, enabledList){\n // found progID flag\n var bFound = false;\n for(var i=0; i < idList.length && !bFound; i++){\n try{\n var oDoc = new ActiveXObject(idList[i]);\n o2Store = idList[i];\n bFound = true;\n for(var j=0;j<enabledList.length;j++)\n if(i <= enabledList[j][1])\n Sarissa["IS_ENABLED_"+enabledList[j][0]] = true;\n }catch (objException){\n // trap; try next progID\n };\n };\n if (!bFound)\n throw "Could not retreive a valid progID of Class: " + idList[idList.length-1]+". (original exception: "+e+")";\n idList = null;\n return o2Store;\n };\n // pick best available MSXML progIDs\n _SARISSA_DOM_PROGID = pickRecentProgID(["Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"], [["SELECT_NODES", 2],["TRANSFORM_NODE", 2]]);\n _SARISSA_XMLHTTP_PROGID = pickRecentProgID(["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"], [["XMLHTTP", 4]]);\n _SARISSA_THREADEDDOM_PROGID = pickRecentProgID(["Msxml2.FreeThreadedDOMDocument.5.0", "MSXML2.FreeThreadedDOMDocument.4.0", "MSXML2.FreeThreadedDOMDocument.3.0"]);\n _SARISSA_XSLTEMPLATE_PROGID = pickRecentProgID(["Msxml2.XSLTemplate.5.0", "Msxml2.XSLTemplate.4.0", "MSXML2.XSLTemplate.3.0"], [["XSLTPROC", 2]]);\n // we dont need this anymore\n pickRecentProgID = null;\n //============================================\n // Factory methods (IE)\n //============================================\n // see non-IE version\n Sarissa.getDomDocument = function(sUri, sName){\n var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);\n // if a root tag name was provided, we need to load it in the DOM\n // object\n if (sName){\n // if needed, create an artifical namespace prefix the way Moz\n // does\n if (sUri){\n oDoc.loadXML("<a" + _sarissa_iNsCounter + ":" + sName + " xmlns:a" + _sarissa_iNsCounter + "=\\"" + sUri + "\\" />");\n // don't use the same prefix again\n ++_sarissa_iNsCounter;\n }\n else\n oDoc.loadXML("<" + sName + "/>");\n };\n return oDoc;\n };\n // see non-IE version \n Sarissa.getParseErrorText = function (oDoc) {\n var parseErrorText = Sarissa.PARSED_OK;\n if(oDoc.parseError != 0){\n parseErrorText = "XML Parsing Error: " + oDoc.parseError.reason + \n "\\nLocation: " + oDoc.parseError.url + \n "\\nLine Number " + oDoc.parseError.line + ", Column " + \n oDoc.parseError.linepos + \n ":\\n" + oDoc.parseError.srcText +\n "\\n";\n for(var i = 0; i < oDoc.parseError.linepos;i++){\n parseErrorText += "-";\n };\n parseErrorText += "^\\n";\n };\n return parseErrorText;\n };\n // see non-IE version\n Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {\n oDoc.setProperty("SelectionLanguage", "XPath");\n oDoc.setProperty("SelectionNamespaces", sNsSet);\n }; \n /**\n * Basic implementation of Mozilla's XSLTProcessor for IE. \n * Reuses the same XSLT stylesheet for multiple transforms\n * @constructor\n */\n XSLTProcessor = function(){\n this.template = new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);\n this.processor = null;\n };\n /**\n * Impoprts the given XSLT DOM an [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): od? method.apply(this, [ele]) : false;\n };\n\n window.onbeforeunload = new BeforeUnloadHandler().execute;\n \n registerPloneFunction(function() {\n // terminate if we hit a non-compliant DOM implementation\n if (!W3CDOM){return false};\n\n var tool = window.onbeforeunload && window.onbeforeunload.tool;\n var content = getContentArea();\n if (tool && content) {\n var forms = cssQuery('form.enableUnloadProtection');\n for (var i=0; i < forms.length; i++) {\n tool.addForm(forms[i]);\n }\n }\n });\n})();\n\n/* ----- sarissa.js ----- */\n/*****************************************************************************\n *\n * Sarissa XML library version 0.9.6\n * Copyright (c) 2003 Manos Batsis, \n * mailto: mbatsis at users full stop sourceforge full stop net\n * This software is distributed under the Kupu License. See\n * LICENSE.txt for license text. See the Sarissa homepage at\n * http://sarissa.sourceforge.net for more information.\n *\n *****************************************************************************\n\n * ====================================================================\n * About\n * ====================================================================\n * Sarissa cross browser XML library \n * @version 0.9.6\n * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net\n *\n * Sarissa is an ECMAScript library acting as a cross-browser wrapper for native XML APIs.\n * The library supports Gecko based browsers like Mozilla and Firefox,\n * Internet Explorer (5.5+ with MSXML3.0+) and, last but not least, KHTML based browsers like\n * Konqueror and Safari.\n *\n */\n/**\n * <p>Sarissa is a utility class. Provides static methods for DOMDocument and \n * XMLHTTP objects, DOM Node serializatrion to XML strings and other goodies.</p>\n * @constructor\n */\nfunction Sarissa(){};\n/** @private */\nSarissa.PARSED_OK = "Document contains no parsing errors";\n/**\n * Tells you whether transformNode and transformNodeToObject are available. This functionality\n * is contained in sarissa_ieemu_xslt.js and is deprecated. If you want to control XSLT transformations\n * use the XSLTProcessor\n * @deprecated\n * @type boolean\n */\nSarissa.IS_ENABLED_TRANSFORM_NODE = false;\n/**\n * tells you whether XMLHttpRequest (or equivalent) is available\n * @type boolean\n */\nSarissa.IS_ENABLED_XMLHTTP = false;\n/**\n * tells you whether selectNodes/selectSingleNode is available\n * @type boolean\n */\nSarissa.IS_ENABLED_SELECT_NODES = false;\nvar _sarissa_iNsCounter = 0;\nvar _SARISSA_IEPREFIX4XSLPARAM = "";\nvar _SARISSA_HAS_DOM_IMPLEMENTATION = document.implementation && true;\nvar _SARISSA_HAS_DOM_CREATE_DOCUMENT = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.createDocument;\nvar _SARISSA_HAS_DOM_FEATURE = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.hasFeature;\nvar _SARISSA_IS_MOZ = _SARISSA_HAS_DOM_CREATE_DOCUMENT && _SARISSA_HAS_DOM_FEATURE;\nvar _SARISSA_IS_SAFARI = navigator.userAgent.toLowerCase().indexOf("applewebkit") != -1;\nvar _SARISSA_IS_IE = document.all && window.ActiveXObject && navigator.userAgent.toLowerCase().indexOf("msie") > -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1;\n\nif(!window.Node || !window.Node.ELEMENT_NODE){\n var Node = {ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5, ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12};\n};\n\n// IE initialization\nif(_SARISSA_IS_IE){\n // for XSLT parameter names, prefix needed by IE\n _SARISSA_IEPREFIX4XSLPARAM = "xsl:";\n // used to store the most recent ProgID available out of the above\n var _SARISSA_DOM_PROGID = "";\n var _SARISSA_XMLHTTP_PROGID = "";\n /**\n * Called when the Sarissa_xx.js file is parsed, to pick most recent\n * ProgIDs for IE, then gets destroyed.\n * @param idList an array of MSXML PROGIDs from which the most recent will be picked for a given object\n * @param enabledList an array of arrays where each array has two items; the index of the PROGID for which a certain feature is enabled\n */\n pickRecentProgID = function (idList, enabledList){\n // found progID flag\n var bFound = false;\n for(var i=0; i < idList.length && !bFound; i++){\n try{\n var oDoc = new ActiveXObject(idList[i]);\n o2Store = idList[i];\n bFound = true;\n for(var j=0;j<enabledList.length;j++)\n if(i <= enabledList[j][1])\n Sarissa["IS_ENABLED_"+enabledList[j][0]] = true;\n }catch (objException){\n // trap; try next progID\n };\n };\n if (!bFound)\n throw "Could not retreive a valid progID of Class: " + idList[idList.length-1]+". (original exception: "+e+")";\n idList = null;\n return o2Store;\n };\n // pick best available MSXML progIDs\n _SARISSA_DOM_PROGID = pickRecentProgID(["Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"], [["SELECT_NODES", 2],["TRANSFORM_NODE", 2]]);\n _SARISSA_XMLHTTP_PROGID = pickRecentProgID(["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"], [["XMLHTTP", 4]]);\n _SARISSA_THREADEDDOM_PROGID = pickRecentProgID(["Msxml2.FreeThreadedDOMDocument.5.0", "MSXML2.FreeThreadedDOMDocument.4.0", "MSXML2.FreeThreadedDOMDocument.3.0"]);\n _SARISSA_XSLTEMPLATE_PROGID = pickRecentProgID(["Msxml2.XSLTemplate.5.0", "Msxml2.XSLTemplate.4.0", "MSXML2.XSLTemplate.3.0"], [["XSLTPROC", 2]]);\n // we dont need this anymore\n pickRecentProgID = null;\n //============================================\n // Factory methods (IE)\n //============================================\n // see non-IE version\n Sarissa.getDomDocument = function(sUri, sName){\n var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);\n // if a root tag name was provided, we need to load it in the DOM\n // object\n if (sName){\n // if needed, create an artifical namespace prefix the way Moz\n // does\n if (sUri){\n oDoc.loadXML("<a" + _sarissa_iNsCounter + ":" + sName + " xmlns:a" + _sarissa_iNsCounter + "=\\"" + sUri + "\\" />");\n // don't use the same prefix again\n ++_sarissa_iNsCounter;\n }\n else\n oDoc.loadXML("<" + sName + "/>");\n };\n return oDoc;\n };\n // see non-IE version \n Sarissa.getParseErrorText = function (oDoc) {\n var parseErrorText = Sarissa.PARSED_OK;\n if(oDoc.parseError != 0){\n parseErrorText = "XML Parsing Error: " + oDoc.parseError.reason + \n "\\nLocation: " + oDoc.parseError.url + \n "\\nLine Number " + oDoc.parseError.line + ", Column " + \n oDoc.parseError.linepos + \n ":\\n" + oDoc.parseError.srcText +\n "\\n";\n for(var i = 0; i < oDoc.parseError.linepos;i++){\n parseErrorText += "-";\n };\n parseErrorText += "^\\n";\n };\n return parseErrorText;\n };\n // see non-IE version\n Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {\n oDoc.setProperty("SelectionLanguage", "XPath");\n oDoc.setProperty("SelectionNamespaces", sNsSet);\n }; \n /**\n * Basic implementation of Mozilla's XSLTProcessor for IE. \n * Reuses the same XSLT stylesheet for multiple transforms\n * @constructor\n */\n XSLTProcessor = function(){\n this.template = new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);\n this.processor = null;\n };\n /**\n * Impoprts the given XSLT DOM a [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): to import\n */\n XSLTProcessor.prototype.importStylesheet = function(xslDoc){\n // convert stylesheet to free threaded\n var converted = new ActiveXObject(_SARISSA_THREADEDDOM_PROGID); \n converted.loadXML(xslDoc.xml);\n this.template.stylesheet = converted;\n this.processor = this.template.createProcessor();\n // (re)set default param values\n this.paramsSet = new Array();\n };\n /**\n * Transform the given XML DOM\n * @argument sourceDoc The XML DOMDocument to transform\n * @return The transformation result as a DOM Document\n */\n XSLTProcessor.prototype.transformToDocument = function(sourceDoc){\n this.processor.input = sourceDoc;\n var outDoc = new ActiveXObject(_SARISSA_DOM_PROGID);\n this.processor.output = outDoc; \n this.processor.transform();\n return outDoc;\n };\n /**\n * Not sure if this works in IE. Maybe this will allow non-well-formed\n * transformation results (i.e. with no single root element)\n * @argument sourceDoc The XML DOMDocument to transform\n * @return The transformation result as a DOM Fragment\n */\n XSLTProcessor.prototype.transformToFragment = function(sourceDoc, ownerDocument){\n return this.transformToDocument(sourceDoc);\n };\n /**\n * Set global XSLT parameter of the imported stylesheet\n * @argument nsURI The parameter namespace URI\n * @argument name The parameter base name\n * @argument value The new parameter value\n */\n XSLTProcessor.prototype.setParameter = function(nsURI, name, value){\n /* nsURI is optional but cannot be null */\n if(nsURI){\n this.processor.addParameter(name, value, nsURI);\n }else{\n this.processor.addParameter(name, value);\n };\n /* update updated params for getParameter */\n if(!this.paramsSet[""+nsURI]){\n this.paramsSet[""+nsURI] = new Array();\n };\n this.paramsSet[""+nsURI][name] = value;\n };\n /**\n * Gets a parameter if previously set by setParameter. Returns null\n * otherwise\n * @argument name The parameter base name\n * @argument value The new parameter value\n * @return The parameter value if reviously set by setParameter, null otherwise\n */\n XSLTProcessor.prototype.getParameter = function(nsURI, name){\n if(this.paramsSet[""+nsURI] && this.paramsSet[""+nsURI][name])\n return this.paramsSet[""+nsURI][name];\n else\n return null;\n };\n}\nelse{ /* end IE initialization, try to deal with real browsers now ;-) */\n if(_SARISSA_HAS_DOM_CREATE_DOCUMENT){\n if(window.XMLDocument){\n /**\n * <p>Emulate IE's onreadystatechange attribute</p>\n */\n XMLDocument.prototype.onreadystatechange = null;\n /**\n * <p>Emulates IE's readyState property, which always gives an integer from 0 to 4:</p>\n * <ul><li>1 == LOADING,</li>\n * <li>2 == LOADED,</li>\n * <li>3 == INTERACTIVE,</li>\n * <li>4 == COMPLETED</li></ul>\n */\n XMLDocument.prototype.readyState = 0;\n /**\n * <p>Emulate IE's parseError attribute</p>\n */\n XMLDocument.prototype.parseError = 0;\n\n // NOTE: setting async to false will only work with documents\n // called over HTTP (meaning a server), not the local file system,\n // unless you are using Moz 1.4+.\n // BTW the try>catch block is for 1.4; I haven't found a way to check if\n // the property is implemented without\n // causing an error and I dont want to use user agent stuff for that...\n var _SARISSA_SYNC_NON_IMPLEMENTED = false;\n try{\n /**\n * <p>Emulates IE's async property for Moz versions prior to 1.4.\n * It controls whether loading of remote XML files works\n * synchronously or asynchronously.</p>\n */\n XMLDocument.prototype.async = true;\n _SARISSA_SYNC_NON_IMPLEMENTED = true;\n }catch(e){/* trap */};\n /**\n * <p>Keeps a handle to the original load() method. Internal use and only\n * if Mozilla version is lower than 1.4</p>\n * @private\n */\n XMLDocument.prototype._sarissa_load = XMLDocument.prototype.load;\n\n /**\n * <p>Overrides the original load method to provide synchronous loading for\n * Mozilla versions prior to 1.4, using an XMLHttpRequest object (if\n * async is set to false)</p>\n * @returns the DOM Object as it was before the load() call (may be empty)\n */\n XMLDocument.prototype.load = function(sURI) {\n var oDoc = document.implementation.createDocument("", "", null);\n Sarissa.copyChildNodes(this, oDoc);\n this.parseError = 0;\n Sarissa.__setReadyState__(this, 1);\n try {\n if(this.async == false && _SARISSA_SYNC_NON_IMPLEMENTED) {\n var tmp = new XMLHttpRequest();\n tmp.open("GET", sURI, false);\n tmp.send(null);\n Sarissa.__setReadyState__(this, 2);\n Sarissa.copyChildNodes(tmp.responseXML, this);\n Sarissa.__setReadyState__(this, 3);\n }\n else {\n this._sarissa_load(sURI);\n };\n }\n catch (objException) {\n this.parseError = -1;\n }\n finally {\n if(this.async == false){\n Sarissa.__handleLoad__(this);\n };\n };\n return oDoc;\n };\n };//if(window.XMLDocument)\n\n /**\n * <p>Ensures the document was loaded correctly, otherwise sets the\n * parseError to -1 to indicate something went wrong. Internal use</p>\n * @private\n */\n Sarissa.__handleLoad__ = function(oDoc){\n if (!oDoc.documentElement || oDoc.documentElement.tagName == "parsererror")\n oDoc.parseError = -1;\n Sarissa.__setReadyState__(oDoc, 4);\n };\n \n /**\n * <p>Attached by an event handler to the load event. Internal use.</p>\n * @private\n */\n _sarissa_XMLDocument_onload = function(){\n Sarissa.__handleLoad__(this);\n };\n \n /**\n * <p>Sets the readyState property of the given DOM Document object.\n * Internal use.</p>\n * @private\n * @argument oDoc the DOM Document object to fire the\n * readystatechange event\n * @argument iReadyState the number to change the readystate property to\n */\n Sarissa.__setReadyState__ = function(oDoc, iReadyState){\n oDoc.readyState = iReadyState;\n if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange == "function")\n oDoc.onreadystatechange();\n };\n /**\n * <p>Factory method to obtain a new DOM Document object</p>\n * @argument sUri the namespace of the root node (if any)\n * @argument sUri the local name of the root node (if any)\n * @returns a new DOM Document\n */\n Sarissa.getDomDocument = function(sUri, sName){\n var oDoc = document.implementation.createDocument(sUri?sUri:"", sName?sName:"", null);\n oDoc.addEventListener("load", _sarissa_XMLDocument_onload, false);\n return oDoc;\n }; \n };//if(_SARISSA_HAS_DOM_CREATE_DOCUMENT)\n};\n//==========================================\n// Common s [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): to import\n */\n XSLTProcessor.prototype.importStylesheet = function(xslDoc){\n // convert stylesheet to free threaded\n var converted = new ActiveXObject(_SARISSA_THREADEDDOM_PROGID); \n converted.loadXML(xslDoc.xml);\n this.template.stylesheet = converted;\n this.processor = this.template.createProcessor();\n // (re)set default param values\n this.paramsSet = new Array();\n };\n /**\n * Transform the given XML DOM\n * @argument sourceDoc The XML DOMDocument to transform\n * @return The transformation result as a DOM Document\n */\n XSLTProcessor.prototype.transformToDocument = function(sourceDoc){\n this.processor.input = sourceDoc;\n var outDoc = new ActiveXObject(_SARISSA_DOM_PROGID);\n this.processor.output = outDoc; \n this.processor.transform();\n return outDoc;\n };\n /**\n * Not sure if this works in IE. Maybe this will allow non-well-formed\n * transformation results (i.e. with no single root element)\n * @argument sourceDoc The XML DOMDocument to transform\n * @return The transformation result as a DOM Fragment\n */\n XSLTProcessor.prototype.transformToFragment = function(sourceDoc, ownerDocument){\n return this.transformToDocument(sourceDoc);\n };\n /**\n * Set global XSLT parameter of the imported stylesheet\n * @argument nsURI The parameter namespace URI\n * @argument name The parameter base name\n * @argument value The new parameter value\n */\n XSLTProcessor.prototype.setParameter = function(nsURI, name, value){\n /* nsURI is optional but cannot be null */\n if(nsURI){\n this.processor.addParameter(name, value, nsURI);\n }else{\n this.processor.addParameter(name, value);\n };\n /* update updated params for getParameter */\n if(!this.paramsSet[""+nsURI]){\n this.paramsSet[""+nsURI] = new Array();\n };\n this.paramsSet[""+nsURI][name] = value;\n };\n /**\n * Gets a parameter if previously set by setParameter. Returns null\n * otherwise\n * @argument name The parameter base name\n * @argument value The new parameter value\n * @return The parameter value if reviously set by setParameter, null otherwise\n */\n XSLTProcessor.prototype.getParameter = function(nsURI, name){\n if(this.paramsSet[""+nsURI] && this.paramsSet[""+nsURI][name])\n return this.paramsSet[""+nsURI][name];\n else\n return null;\n };\n}\nelse{ /* end IE initialization, try to deal with real browsers now ;-) */\n if(_SARISSA_HAS_DOM_CREATE_DOCUMENT){\n if(window.XMLDocument){\n /**\n * <p>Emulate IE's onreadystatechange attribute</p>\n */\n XMLDocument.prototype.onreadystatechange = null;\n /**\n * <p>Emulates IE's readyState property, which always gives an integer from 0 to 4:</p>\n * <ul><li>1 == LOADING,</li>\n * <li>2 == LOADED,</li>\n * <li>3 == INTERACTIVE,</li>\n * <li>4 == COMPLETED</li></ul>\n */\n XMLDocument.prototype.readyState = 0;\n /**\n * <p>Emulate IE's parseError attribute</p>\n */\n XMLDocument.prototype.parseError = 0;\n\n // NOTE: setting async to false will only work with documents\n // called over HTTP (meaning a server), not the local file system,\n // unless you are using Moz 1.4+.\n // BTW the try>catch block is for 1.4; I haven't found a way to check if\n // the property is implemented without\n // causing an error and I dont want to use user agent stuff for that...\n var _SARISSA_SYNC_NON_IMPLEMENTED = false;\n try{\n /**\n * <p>Emulates IE's async property for Moz versions prior to 1.4.\n * It controls whether loading of remote XML files works\n * synchronously or asynchronously.</p>\n */\n XMLDocument.prototype.async = true;\n _SARISSA_SYNC_NON_IMPLEMENTED = true;\n }catch(e){/* trap */};\n /**\n * <p>Keeps a handle to the original load() method. Internal use and only\n * if Mozilla version is lower than 1.4</p>\n * @private\n */\n XMLDocument.prototype._sarissa_load = XMLDocument.prototype.load;\n\n /**\n * <p>Overrides the original load method to provide synchronous loading for\n * Mozilla versions prior to 1.4, using an XMLHttpRequest object (if\n * async is set to false)</p>\n * @returns the DOM Object as it was before the load() call (may be empty)\n */\n XMLDocument.prototype.load = function(sURI) {\n var oDoc = document.implementation.createDocument("", "", null);\n Sarissa.copyChildNodes(this, oDoc);\n this.parseError = 0;\n Sarissa.__setReadyState__(this, 1);\n try {\n if(this.async == false && _SARISSA_SYNC_NON_IMPLEMENTED) {\n var tmp = new XMLHttpRequest();\n tmp.open("GET", sURI, false);\n tmp.send(null);\n Sarissa.__setReadyState__(this, 2);\n Sarissa.copyChildNodes(tmp.responseXML, this);\n Sarissa.__setReadyState__(this, 3);\n }\n else {\n this._sarissa_load(sURI);\n };\n }\n catch (objException) {\n this.parseError = -1;\n }\n finally {\n if(this.async == false){\n Sarissa.__handleLoad__(this);\n };\n };\n return oDoc;\n };\n };//if(window.XMLDocument)\n\n /**\n * <p>Ensures the document was loaded correctly, otherwise sets the\n * parseError to -1 to indicate something went wrong. Internal use</p>\n * @private\n */\n Sarissa.__handleLoad__ = function(oDoc){\n if (!oDoc.documentElement || oDoc.documentElement.tagName == "parsererror")\n oDoc.parseError = -1;\n Sarissa.__setReadyState__(oDoc, 4);\n };\n \n /**\n * <p>Attached by an event handler to the load event. Internal use.</p>\n * @private\n */\n _sarissa_XMLDocument_onload = function(){\n Sarissa.__handleLoad__(this);\n };\n \n /**\n * <p>Sets the readyState property of the given DOM Document object.\n * Internal use.</p>\n * @private\n * @argument oDoc the DOM Document object to fire the\n * readystatechange event\n * @argument iReadyState the number to change the readystate property to\n */\n Sarissa.__setReadyState__ = function(oDoc, iReadyState){\n oDoc.readyState = iReadyState;\n if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange == "function")\n oDoc.onreadystatechange();\n };\n /**\n * <p>Factory method to obtain a new DOM Document object</p>\n * @argument sUri the namespace of the root node (if any)\n * @argument sUri the local name of the root node (if any)\n * @returns a new DOM Document\n */\n Sarissa.getDomDocument = function(sUri, sName){\n var oDoc = document.implementation.createDocument(sUri?sUri:"", sName?sName:"", null);\n oDoc.addEventListener("load", _sarissa_XMLDocument_onload, false);\n return oDoc;\n }; \n };//if(_SARISSA_HAS_DOM_CREATE_DOCUMENT)\n};\n//==========================================\n// Common [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 8192 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): OMParser is a utility class, used to construct DOMDocuments from XML strings\n * @constructor\n */\n DOMParser = function() {\n };\n /** \n * Construct a new DOM Document from the given XMLstring\n * @param sXml the given XML string\n * @param contentType the content type of the document the given string represents (one of text/xml, application/xml, application/xhtml+xml). \n * @return a new DOM Document from the given XML string\n */\n DOMParser.prototype.parseFromString = function(sXml, contentType){\n var doc = Sarissa.getDomDocument();\n doc.loadXML(sXml);\n return doc;\n };\n \n};\n\nif(window.XMLHttpRequest){\n Sarissa.IS_ENABLED_XMLHTTP = true;\n}\nelse if(_SARISSA_IS_IE){\n /**\n * Emulate XMLHttpRequest\n * @constructor\n */\n XMLHttpRequest = function() {\n return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);\n };\n Sarissa.IS_ENABLED_XMLHTTP = true;\n};\n\nif(!window.document.importNode && _SARISSA_IS_IE){\n try{\n /**\n * Implements importNode for the current window document in IE using innerHTML.\n * Testing showed that DOM was multiple times slower than innerHTML for this,\n * sorry folks. If you encounter trouble (who knows what IE does behind innerHTML)\n * please gimme a call.\n * @param oNode the Node to import\n * @param bChildren whether to include the children of oNode\n * @returns the imported node for further use\n */\n window.document.importNode = function(oNode, bChildren){\n var importNode = document.createElement("div");\n if(bChildren)\n importNode.innerHTML = Sarissa.serialize(oNode);\n else\n importNode.innerHTML = Sarissa.serialize(oNode.cloneNode(false));\n return importNode.firstChild;\n };\n }catch(e){};\n};\nif(!Sarissa.getParseErrorText){\n /**\n * <p>Returns a human readable description of the parsing error. Usefull\n * for debugging. Tip: append the returned error string in a <pre>\n * element if you want to render it.</p>\n * <p>Many thanks to Christian Stocker for the initial patch.</p>\n * @argument oDoc The target DOM document\n * @returns The parsing error description of the target Document in\n * human readable form (preformated text)\n */\n Sarissa.getParseErrorText = function (oDoc){\n var parseErrorText = Sarissa.PARSED_OK;\n if(oDoc.parseError != 0){\n /*moz*/\n if(oDoc.documentElement.tagName == "parsererror"){\n parseErrorText = oDoc.documentElement.firstChild.data;\n parseErrorText += "\\n" + oDoc.documentElement.firstChild.nextSibling.firstChild.data;\n }/*konq*/\n else if(oDoc.documentElement.tagName == "html"){\n parseErrorText = Sarissa.getText(oDoc.documentElement.getElementsByTagName("h1")[0], false) + "\\n";\n parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("body")[0], false) + "\\n";\n parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("pre")[0], false);\n };\n };\n return parseErrorText;\n };\n};\nSarissa.getText = function(oNode, deep){\n var s = "";\n var nodes = oNode.childNodes;\n for(var i=0; i < nodes.length; i++){\n var node = nodes[i];\n var nodeType = node.nodeType;\n if(nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE){\n s += node.data;\n }\n else if(deep == true\n && (nodeType == Node.ELEMENT_NODE\n || nodeType == Node.DOCUMENT_NODE\n || nodeType == Node.DOCUMENT_FRAGMENT_NODE)){\n s += Sarissa.getText(node, true);\n };\n };\n return s;\n};\nif(window.XMLSerializer){\n /**\n * <p>Factory method to obtain the serialization of a DOM Node</p>\n * @returns the serialized Node as an XML string\n */\n Sarissa.serialize = function(oDoc){\n return (new XMLSerializer()).serializeToString(oDoc);\n };\n}else{\n if((Sarissa.getDomDocument("","foo", null)).xml){\n // see non-IE version\n Sarissa.serialize = function(oDoc) {\n // TODO: check for HTML document and return innerHTML instead\n return oDoc.xml;\n };\n /**\n * Utility class to serialize DOM Node objects to XML strings\n * @constructor\n */\n XMLSerializer = function(){};\n /**\n * Serialize the given DOM Node to an XML string\n * @param oNode the DOM Node to serialize\n */\n XMLSerializer.prototype.serializeToString = function(oNode) {\n return oNode.xml;\n };\n };\n};\n\n/**\n * strips tags from a markup string\n */\nSarissa.stripTags = function (s) {\n return s.replace(/<[^>]+>/g,"");\n};\n/**\n * <p>Deletes all child nodes of the given node</p>\n * @argument oNode the Node to empty\n */\nSarissa.clearChildNodes = function(oNode) {\n while(oNode.hasChildNodes()){\n oNode.removeChild(oNode.firstChild);\n };\n};\n/**\n * <p> Copies the childNodes of nodeFrom to nodeTo</p>\n * <p> <b>Note:</b> The second object's original content is deleted before \n * the copy operation, unless you supply a true third parameter</p>\n * @argument nodeFrom the Node to copy the childNodes from\n * @argument nodeTo the Node to copy the childNodes to\n * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false\n */\nSarissa.copyChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {\n if(!bPreserveExisting){\n Sarissa.clearChildNodes(nodeTo);\n };\n var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;\n var nodes = nodeFrom.childNodes;\n if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));\n };\n }\n else{\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(nodes[i].cloneNode(true));\n };\n };\n};\n\n/**\n * <p> Moves the childNodes of nodeFrom to nodeTo</p>\n * <p> <b>Note:</b> The second object's original content is deleted before \n * the move operation, unless you supply a true third parameter</p>\n * @argument nodeFrom the Node to copy the childNodes from\n * @argument nodeTo the Node to copy the childNodes to\n * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false\n */\nSarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {\n if(!bPreserveExisting){\n Sarissa.clearChildNodes(nodeTo);\n };\n \n var nodes = nodeFrom.childNodes;\n // if within the same doc, just move, else copy and delete\n if(nodeFrom.ownerDocument == nodeTo.ownerDocument){\n nodeTo.appendChild(nodes[i]);\n }else{\n var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;\n if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));\n };\n }\n else{\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(nodes[i].cloneNode(true));\n };\n };\n Sarissa.clearChildNodes(nodeFrom);\n };\n \n};\n\n/** \n * <p>Serialize any object to an XML string. All properties are serialized using the property name\n * as the XML element name. Array elements are rendered as <code>array-item</code> elements, \n * using their index/key as the value of the <code>key</code> attribute.</p>\n * @argument anyObject the object to serialize\n * @argument objectName a name for that object\n * @return the XML serializationj of the given object as a string\n */\nSarissa.xmlize = [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 8000 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): OMParser is a utility class, used to construct DOMDocuments from XML strings\n * @constructor\n */\n DOMParser = function() {\n };\n /** \n * Construct a new DOM Document from the given XMLstring\n * @param sXml the given XML string\n * @param contentType the content type of the document the given string represents (one of text/xml, application/xml, application/xhtml+xml). \n * @return a new DOM Document from the given XML string\n */\n DOMParser.prototype.parseFromString = function(sXml, contentType){\n var doc = Sarissa.getDomDocument();\n doc.loadXML(sXml);\n return doc;\n };\n \n};\n\nif(window.XMLHttpRequest){\n Sarissa.IS_ENABLED_XMLHTTP = true;\n}\nelse if(_SARISSA_IS_IE){\n /**\n * Emulate XMLHttpRequest\n * @constructor\n */\n XMLHttpRequest = function() {\n return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);\n };\n Sarissa.IS_ENABLED_XMLHTTP = true;\n};\n\nif(!window.document.importNode && _SARISSA_IS_IE){\n try{\n /**\n * Implements importNode for the current window document in IE using innerHTML.\n * Testing showed that DOM was multiple times slower than innerHTML for this,\n * sorry folks. If you encounter trouble (who knows what IE does behind innerHTML)\n * please gimme a call.\n * @param oNode the Node to import\n * @param bChildren whether to include the children of oNode\n * @returns the imported node for further use\n */\n window.document.importNode = function(oNode, bChildren){\n var importNode = document.createElement("div");\n if(bChildren)\n importNode.innerHTML = Sarissa.serialize(oNode);\n else\n importNode.innerHTML = Sarissa.serialize(oNode.cloneNode(false));\n return importNode.firstChild;\n };\n }catch(e){};\n};\nif(!Sarissa.getParseErrorText){\n /**\n * <p>Returns a human readable description of the parsing error. Usefull\n * for debugging. Tip: append the returned error string in a <pre>\n * element if you want to render it.</p>\n * <p>Many thanks to Christian Stocker for the initial patch.</p>\n * @argument oDoc The target DOM document\n * @returns The parsing error description of the target Document in\n * human readable form (preformated text)\n */\n Sarissa.getParseErrorText = function (oDoc){\n var parseErrorText = Sarissa.PARSED_OK;\n if(oDoc.parseError != 0){\n /*moz*/\n if(oDoc.documentElement.tagName == "parsererror"){\n parseErrorText = oDoc.documentElement.firstChild.data;\n parseErrorText += "\\n" + oDoc.documentElement.firstChild.nextSibling.firstChild.data;\n }/*konq*/\n else if(oDoc.documentElement.tagName == "html"){\n parseErrorText = Sarissa.getText(oDoc.documentElement.getElementsByTagName("h1")[0], false) + "\\n";\n parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("body")[0], false) + "\\n";\n parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("pre")[0], false);\n };\n };\n return parseErrorText;\n };\n};\nSarissa.getText = function(oNode, deep){\n var s = "";\n var nodes = oNode.childNodes;\n for(var i=0; i < nodes.length; i++){\n var node = nodes[i];\n var nodeType = node.nodeType;\n if(nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE){\n s += node.data;\n }\n else if(deep == true\n && (nodeType == Node.ELEMENT_NODE\n || nodeType == Node.DOCUMENT_NODE\n || nodeType == Node.DOCUMENT_FRAGMENT_NODE)){\n s += Sarissa.getText(node, true);\n };\n };\n return s;\n};\nif(window.XMLSerializer){\n /**\n * <p>Factory method to obtain the serialization of a DOM Node</p>\n * @returns the serialized Node as an XML string\n */\n Sarissa.serialize = function(oDoc){\n return (new XMLSerializer()).serializeToString(oDoc);\n };\n}else{\n if((Sarissa.getDomDocument("","foo", null)).xml){\n // see non-IE version\n Sarissa.serialize = function(oDoc) {\n // TODO: check for HTML document and return innerHTML instead\n return oDoc.xml;\n };\n /**\n * Utility class to serialize DOM Node objects to XML strings\n * @constructor\n */\n XMLSerializer = function(){};\n /**\n * Serialize the given DOM Node to an XML string\n * @param oNode the DOM Node to serialize\n */\n XMLSerializer.prototype.serializeToString = function(oNode) {\n return oNode.xml;\n };\n };\n};\n\n/**\n * strips tags from a markup string\n */\nSarissa.stripTags = function (s) {\n return s.replace(/<[^>]+>/g,"");\n};\n/**\n * <p>Deletes all child nodes of the given node</p>\n * @argument oNode the Node to empty\n */\nSarissa.clearChildNodes = function(oNode) {\n while(oNode.hasChildNodes()){\n oNode.removeChild(oNode.firstChild);\n };\n};\n/**\n * <p> Copies the childNodes of nodeFrom to nodeTo</p>\n * <p> <b>Note:</b> The second object's original content is deleted before \n * the copy operation, unless you supply a true third parameter</p>\n * @argument nodeFrom the Node to copy the childNodes from\n * @argument nodeTo the Node to copy the childNodes to\n * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false\n */\nSarissa.copyChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {\n if(!bPreserveExisting){\n Sarissa.clearChildNodes(nodeTo);\n };\n var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;\n var nodes = nodeFrom.childNodes;\n if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));\n };\n }\n else{\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(nodes[i].cloneNode(true));\n };\n };\n};\n\n/**\n * <p> Moves the childNodes of nodeFrom to nodeTo</p>\n * <p> <b>Note:</b> The second object's original content is deleted before \n * the move operation, unless you supply a true third parameter</p>\n * @argument nodeFrom the Node to copy the childNodes from\n * @argument nodeTo the Node to copy the childNodes to\n * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false\n */\nSarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {\n if(!bPreserveExisting){\n Sarissa.clearChildNodes(nodeTo);\n };\n \n var nodes = nodeFrom.childNodes;\n // if within the same doc, just move, else copy and delete\n if(nodeFrom.ownerDocument == nodeTo.ownerDocument){\n nodeTo.appendChild(nodes[i]);\n }else{\n var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;\n if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));\n };\n }\n else{\n for(var i=0;i < nodes.length;i++) {\n nodeTo.appendChild(nodes[i].cloneNode(true));\n };\n };\n Sarissa.clearChildNodes(nodeFrom);\n };\n \n};\n\n/** \n * <p>Serialize any object to an XML string. All properties are serialized using the property name\n * as the XML element name. Array elements are rendered as <code>array-item</code> elements, \n * using their index/key as the value of the <code>key</code> attribute.</p>\n * @argument anyObject the object to serialize\n * @argument objectName a name for that object\n * @return the XML serializationj of the given object as a string\n */\nSarissa.xmlize [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [readbytes-nonblocking] 4131 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-HEAP): 4131 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_in (data-HEAP): ce + '<' + objectName + '>';\n var isLeaf = false;\n if(!(anyObject instanceof Object) || anyObject instanceof Number || anyObject instanceof String \n || anyObject instanceof Boolean || anyObject instanceof Date){\n s += Sarissa.escape(""+anyObject);\n isLeaf = true;\n }else{\n s += "\\n";\n var itemKey = '';\n var isArrayItem = anyObject instanceof Array;\n for(var name in anyObject){\n s += Sarissa.xmlize(anyObject[name], (isArrayItem?"array-item key=\\""+name+"\\"":name), indentSpace + " ");\n };\n s += indentSpace;\n };\n return s += (objectName.indexOf(' ')!=-1?"</array-item>\\n":"</" + objectName + ">\\n");\n};\n\n/** \n * Escape the given string chacters that correspond to the five predefined XML entities\n * @param sXml the string to escape\n */\nSarissa.escape = function(sXml){\n return sXml.replace(/&/g, "&")\n .replace(/</g, "<")\n .replace(/>/g, ">")\n .replace(/"/g, """)\n .replace(/'/g, "'");\n};\n\n/** \n * Unescape the given string. This turns the occurences of the predefined XML \n * entities to become the characters they represent correspond to the five predefined XML entities\n * @param sXml the string to unescape\n */\nSarissa.unescape = function(sXml){\n return sXml.replace(/'/g,"'")\n .replace(/"/g,"\\"")\n .replace(/>/g,">")\n .replace(/</g,"<")\n .replace(/&/g,"&");\n};\n// EOF\n\n\n/* ----- login.js ----- */\n// Functions used by login pages\r\n\r\nfunction cookiesEnabled() {\r\n // Test whether cookies are enabled by attempting to set a cookie and then change its value\r\n // set test cookie\r\n var c = "areYourCookiesEnabled=0";\r\n document.cookie = c;\r\n var dc = document.cookie;\r\n // cookie not set? fail\r\n if (dc.indexOf(c) == -1) return 0;\r\n // change test cookie\r\n c = "areYourCookiesEnabled=1";\r\n document.cookie = c;\r\n dc = document.cookie;\r\n // cookie not changed? fail\r\n if (dc.indexOf(c) == -1) return 0;\r\n // delete cookie\r\n document.cookie = "areYourCookiesEnabled=; expires=Thu, 01-Jan-70 00:00:01 GMT";\r\n return 1;\r\n}\r\n\r\nfunction setLoginVars(user_name_id, alt_user_name_id, password_id, empty_password_id, js_enabled_id, cookies_enabled_id) {\r\n // Indicate that javascript is enabled, set cookie status, copy username and password length info to \r\n // alternative variables since these vars are removed from the request by zope's authentication mechanism.\r\n if (js_enabled_id) {\r\n el = document.getElementById(js_enabled_id);\r\n if (el) { el.value = 1; }\r\n }\r\n if (cookies_enabled_id) {\r\n el = document.getElementById(cookies_enabled_id);\r\n // Do a fresh cookies enabled test every time we press the login button\r\n // so that we are up to date in case the user enables cookies after seeing\r\n // the cookies message.\r\n if (el) { el.value = cookiesEnabled(); } \r\n }\r\n if (user_name_id && alt_user_name_id) {\r\n user_name = document.getElementById(user_name_id)\r\n alt_user_name = document.getElementById(alt_user_name_id)\r\n if (user_name && alt_user_name) {\r\n alt_user_name.value = user_name.value;\r\n } \r\n }\r\n if (password_id && empty_password_id) {\r\n password = document.getElementById(password_id)\r\n empty_password = document.getElementById(empty_password_id)\r\n if (password && empty_password) {\r\n if (password.value.length==0) {\r\n empty_password.value = '1';\r\n } else {\r\n empty_password.value = '0';\r\n }\r\n }\r\n }\r\n return 1;\r\n}\r\n\r\nfunction showCookieMessage(msg_id) {\r\n // Show the element with the given id if cookies are not enabled\r\n msg = document.getElementById(msg_id)\r\n if (msg) {\r\n if (cookiesEnabled()) {\r\n msg.style.display = 'none';\r\n } else {\r\n msg.style.display = 'block';\r\n }\r\n }\r\n}\r\n\r\nfunction showEnableCookiesMessage() {\r\n // Show the element with the id 'enable_cookies_message' if cookies are not enabled\r\n showCookieMessage('enable_cookies_message')\r\n}\r\n// Call showEnableCookiesMessage after the page loads\r\nregisterPloneFunction(showEnableCookiesMessage);\r\n\n [Fri Nov 10 11:10:41 2006] [debug] mod_disk_cache.c(1043): disk_cache: Body for URL http://localhost:9999/portal_javascripts/Plone Tableless/ploneScripts4205.js? cached. [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (data-HEAP): 4131 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(67): mod_dumpio: dumpio_out (data-HEAP): ce + '<' + objectName + '>';\n var isLeaf = false;\n if(!(anyObject instanceof Object) || anyObject instanceof Number || anyObject instanceof String \n || anyObject instanceof Boolean || anyObject instanceof Date){\n s += Sarissa.escape(""+anyObject);\n isLeaf = true;\n }else{\n s += "\\n";\n var itemKey = '';\n var isArrayItem = anyObject instanceof Array;\n for(var name in anyObject){\n s += Sarissa.xmlize(anyObject[name], (isArrayItem?"array-item key=\\""+name+"\\"":name), indentSpace + " ");\n };\n s += indentSpace;\n };\n return s += (objectName.indexOf(' ')!=-1?"</array-item>\\n":"</" + objectName + ">\\n");\n};\n\n/** \n * Escape the given string chacters that correspond to the five predefined XML entities\n * @param sXml the string to escape\n */\nSarissa.escape = function(sXml){\n return sXml.replace(/&/g, "&")\n .replace(/</g, "<")\n .replace(/>/g, ">")\n .replace(/"/g, """)\n .replace(/'/g, "'");\n};\n\n/** \n * Unescape the given string. This turns the occurences of the predefined XML \n * entities to become the characters they represent correspond to the five predefined XML entities\n * @param sXml the string to unescape\n */\nSarissa.unescape = function(sXml){\n return sXml.replace(/'/g,"'")\n .replace(/"/g,"\\"")\n .replace(/>/g,">")\n .replace(/</g,"<")\n .replace(/&/g,"&");\n};\n// EOF\n\n\n/* ----- login.js ----- */\n// Functions used by login pages\r\n\r\nfunction cookiesEnabled() {\r\n // Test whether cookies are enabled by attempting to set a cookie and then change its value\r\n // set test cookie\r\n var c = "areYourCookiesEnabled=0";\r\n document.cookie = c;\r\n var dc = document.cookie;\r\n // cookie not set? fail\r\n if (dc.indexOf(c) == -1) return 0;\r\n // change test cookie\r\n c = "areYourCookiesEnabled=1";\r\n document.cookie = c;\r\n dc = document.cookie;\r\n // cookie not changed? fail\r\n if (dc.indexOf(c) == -1) return 0;\r\n // delete cookie\r\n document.cookie = "areYourCookiesEnabled=; expires=Thu, 01-Jan-70 00:00:01 GMT";\r\n return 1;\r\n}\r\n\r\nfunction setLoginVars(user_name_id, alt_user_name_id, password_id, empty_password_id, js_enabled_id, cookies_enabled_id) {\r\n // Indicate that javascript is enabled, set cookie status, copy username and password length info to \r\n // alternative variables since these vars are removed from the request by zope's authentication mechanism.\r\n if (js_enabled_id) {\r\n el = document.getElementById(js_enabled_id);\r\n if (el) { el.value = 1; }\r\n }\r\n if (cookies_enabled_id) {\r\n el = document.getElementById(cookies_enabled_id);\r\n // Do a fresh cookies enabled test every time we press the login button\r\n // so that we are up to date in case the user enables cookies after seeing\r\n // the cookies message.\r\n if (el) { el.value = cookiesEnabled(); } \r\n }\r\n if (user_name_id && alt_user_name_id) {\r\n user_name = document.getElementById(user_name_id)\r\n alt_user_name = document.getElementById(alt_user_name_id)\r\n if (user_name && alt_user_name) {\r\n alt_user_name.value = user_name.value;\r\n } \r\n }\r\n if (password_id && empty_password_id) {\r\n password = document.getElementById(password_id)\r\n empty_password = document.getElementById(empty_password_id)\r\n if (password && empty_password) {\r\n if (password.value.length==0) {\r\n empty_password.value = '1';\r\n } else {\r\n empty_password.value = '0';\r\n }\r\n }\r\n }\r\n return 1;\r\n}\r\n\r\nfunction showCookieMessage(msg_id) {\r\n // Show the element with the given id if cookies are not enabled\r\n msg = document.getElementById(msg_id)\r\n if (msg) {\r\n if (cookiesEnabled()) {\r\n msg.style.display = 'none';\r\n } else {\r\n msg.style.display = 'block';\r\n }\r\n }\r\n}\r\n\r\nfunction showEnableCookiesMessage() {\r\n // Show the element with the id 'enable_cookies_message' if cookies are not enabled\r\n showCookieMessage('enable_cookies_message')\r\n}\r\n// Call showEnableCookiesMessage after the page loads\r\nregisterPloneFunction(showEnableCookiesMessage);\r\n\n [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (metadata-EOS): 0 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_proxy_http.c(1537): proxy: end body send [Fri Nov 10 11:10:41 2006] [debug] proxy_util.c(1816): proxy: HTTP: has released connection for (localhost) [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [eatcrlf-nonblocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(117): mod_dumpio: dumpio_in - 11 [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_in (data-IMMORTAL): 0 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(103): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(117): mod_dumpio: dumpio_in - 70014 [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(129): mod_dumpio: dumpio_out [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (metadata-FLUSH): 0 bytes [Fri Nov 10 11:10:41 2006] [debug] mod_dumpio.c(51): mod_dumpio: dumpio_out (metadata-EOC): 0 bytes
--------------------------------------------------------------------- The official User-To-User support forum of the Apache HTTP Server Project. See <URL:http://httpd.apache.org/userslist.html> for more info. To unsubscribe, e-mail: users-unsubscribe@xxxxxxxxxxxxxxxx " from the digest: users-digest-unsubscribe@xxxxxxxxxxxxxxxx For additional commands, e-mail: users-help@xxxxxxxxxxxxxxxx