You are viewing a plain text version of this content. The canonical link for it is here.
Posted to graffito-commits@incubator.apache.org by cl...@apache.org on 2006/10/09 21:28:32 UTC

svn commit: r454522 [10/10] - in /incubator/graffito/trunk: applications/browser/src/java/org/apache/portals/graffito/servlets/ applications/browser/src/java/org/apache/portals/graffito/servlets/browser/ applications/browser/src/webapp/META-INF/ applic...

Added: incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kupustart_form.js
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kupustart_form.js?view=auto&rev=454522
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kupustart_form.js (added)
+++ incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kupustart_form.js Mon Oct  9 14:28:27 2006
@@ -0,0 +1,56 @@
+/*****************************************************************************
+ *
+ * Copyright (c) 2003-2005 Kupu Contributors. All rights reserved.
+ *
+ * This software is distributed under the terms of the Kupu
+ * License. See LICENSE.txt for license text. For a list of Kupu
+ * Contributors see CREDITS.txt.
+ *
+ *****************************************************************************/
+
+// $Id$
+
+function startKupu() {
+    // initialize the editor, initKupu groks 1 arg, a reference to the iframe
+    var frame = getFromSelector('kupu-editor'); 
+    var kupu = initKupu(frame);
+    
+    // first let's load the message catalog
+    // if there's no global 'i18n_message_catalog' variable available, don't
+    // try to load any translations
+    if (!window.i18n_message_catalog) {
+        continueStartKupu(kupu);
+        return kupu;
+    };
+    // loading will be done asynchronously (to keep Mozilla from freezing)
+    // so we'll continue in a follow-up function (continueStartKupu() below)
+    var handler = function(request) {
+        if (this.readyState == 4) {
+            var status = this.status;
+            if (status != '200') {
+                alert(_('Error loading translation (status ${status} ' +
+                        '), falling back to english'), {'status': status});
+                continueStartKupu(kupu);
+                return;
+            };
+            var dom = this.responseXML;
+            window.i18n_message_catalog.initialize(dom);
+            continueStartKupu(kupu);
+        };
+    };
+    var request = new XMLHttpRequest();
+    request.onreadystatechange = (new ContextFixer(handler, request)).execute;
+    request.open('GET', 'kupu.pox', true);
+    request.send('');
+
+    // we need to return a reference to the editor here for certain 'external'
+    // stuff, developers should note that it's not yet initialized though, we
+    // need to wait for i18n data before we can do that
+    return kupu;
+};
+
+function continueStartKupu(kupu) {
+    kupu.initialize();
+
+    return kupu;
+};

Added: incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kupustart_multi.js
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kupustart_multi.js?view=auto&rev=454522
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kupustart_multi.js (added)
+++ incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kupustart_multi.js Mon Oct  9 14:28:27 2006
@@ -0,0 +1,55 @@
+/*****************************************************************************
+ *
+ * Copyright (c) 2003-2005 Kupu Contributors. All rights reserved.
+ *
+ * This software is distributed under the terms of the Kupu
+ * License. See LICENSE.txt for license text. For a list of Kupu
+ * Contributors see CREDITS.txt.
+ *
+ *****************************************************************************/
+
+// $Id$
+
+function startKupu() {
+    // initialize the editor, this version groks an array of iframeids
+    var iframeids = new Array('kupu_1', 'kupu_2', 'kupu_3');
+    var kupu = initKupu(iframeids); 
+
+    // if there's no global 'i18n_message_catalog' variable available, don't
+    // try to load any translations
+    if (!window.i18n_message_catalog) {
+        continueStartKupu(kupu);
+        return kupu;
+    };
+    // loading will be done asynchronously (to keep Mozilla from freezing)
+    // so we'll continue in a follow-up function (continueStartKupu() below)
+    var handler = function(request) {
+        if (this.readyState == 4) {
+            var status = this.status;
+            if (status != '200') {
+                alert(_('Error loading translation (status ${status} ' +
+                        '), falling back to english'), {'status': status});
+                continueStartKupu(kupu);
+                return;
+            };
+            var dom = this.responseXML;
+            window.i18n_message_catalog.initialize(dom);
+            continueStartKupu(kupu);
+        };
+    };
+    var request = new XMLHttpRequest();
+    request.onreadystatechange = (new ContextFixer(handler, request)).execute;
+    request.open('GET', 'kupu.pox', true);
+    request.send('');
+
+    // we need to return a reference to the editor here for certain 'external'
+    // stuff, developers should note that it's not yet initialized though, we
+    // need to wait for i18n data before we can do that
+    return kupu;
+};
+
+function continueStartKupu(kupu) {
+    kupu.initialize();
+
+    return kupu;
+};

Added: incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kupustyles.css
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kupustyles.css?view=auto&rev=454522
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kupustyles.css (added)
+++ incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kupustyles.css Mon Oct  9 14:28:27 2006
@@ -0,0 +1,279 @@
+/*****************************************************************************
+ *
+ * Kupu common styles
+ *
+ * Copyright (c) 2003-2005 Kupu Contributors. See CREDITS.txt
+ *
+ * Instead of customizing this file, it is recommended to add your own
+ * CSS file.  Feel free to use whole or parts of this for your own
+ * designs, but give credit where credit is due.
+ *
+ *****************************************************************************/
+
+/* $Id: kupustyles.css 16467 2005-08-25 11:08:10Z guido $ */
+
+.kupu-fulleditor, .kupu-toolboxes {
+  font-family: Verdana, "Lucida Grande", Helvetica, Arial, sans-serif;
+  background-color: white;
+}
+
+div.kupu-fulleditor .kupu-fulleditor-zoomed {
+  height: 100%;
+  padding: 0px;
+}
+
+div.kupu-fulleditor .kupu-editorframe {
+   margin: 0px;
+   margin-right: 20em;
+   border: none;
+}
+
+div.kupu-fulleditor-zoomed {
+   z-index: 100;
+   margin: 0; border: none;
+   position: fixed;
+   top: 0; left: 0;
+   background-color: white;
+}
+
+* html div.kupu-fulleditor-zoomed {
+   position: absolute; /* IE */
+}
+
+div.kupu-fulleditor-zoomed .kupu-editor-iframe {
+  border: none;
+  margin: 0;
+}
+
+div.kupu-smalleditor .kupu-editorframe {
+  margin-right: 0.2em;
+}
+
+h1.kupu-toolbox-heading, h1.kupu-toolbox-heading-closed {
+  cursor: default;
+  background-image: url("kupuimages/closed.png");
+  background-repeat: no-repeat;
+  background-position: left;
+}
+
+h1.kupu-toolbox-heading-opened {
+  cursor: default;
+  background-image: url("kupuimages/opened.png");
+  background-repeat: no-repeat;
+  background-position: left;
+}
+
+div.kupu-sourcemode span.kupu-tb-buttongroup,
+body.kupu-fulleditor-zoomed select { display: none; }
+body.kupu-fulleditor-zoomed div.kupu-fulleditor-zoomed select { display: inline; }
+div.kupu-sourcemode select { display: none !IMPORTANT; }
+div.kupu-sourcemode span#kupu-logo,
+div.kupu-sourcemode span#kupu-zoom,
+div.kupu-sourcemode span#kupu-source { display: inline; }
+
+div.kupu-smalleditor {
+  font-family: Verdana, "Lucida Grande", Helvetica, Arial, sans-serif;
+  border: solid 3px ButtonHighlight;
+  margin: 0.2em;
+  height: 100%;
+}
+
+.kupu-tb {
+  padding: 3px;
+  margin-bottom: 0.4em;
+  background-color: ButtonFace;
+  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+}
+
+.kupu-tb-buttons button {
+  color: ButtonText;
+  border: 1px solid ButtonFace;
+  margin-top: 0;
+  margin-left: 0;
+  height: 26px;
+  width: 26px;
+  background-repeat: no-repeat;
+}
+
+.kupu-tb-buttons button:hover {
+  cursor: default;
+  border: 1px solid;
+  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+}
+
+.kupu-tb-buttons button:active {
+  border: 1px solid;
+  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+}
+
+.kupu-tb-buttongroup {
+  margin-left: 2px;
+  margin-right: 2px;
+}
+
+
+.kupu-bold {background-image: url("kupuimages/bold.png");}
+.kupu-bold-pressed {background-image: url("kupuimages/bold.png"); background-color: white;}
+.kupu-forecolor {background-image: url("kupuimages/text-color.png");}
+.kupu-hilitecolor {background-image: url("kupuimages/background-color.png");}
+
+.kupu-inthyperlink {background-image: url("kupuimages/inthyperlink.png");}
+.kupu-inthyperlink-pressed {background-image: url("kupuimages/inthyperlink.png"); background-color: white}
+.kupu-exthyperlink {background-image: url("kupuimages/exthyperlink.png");}
+.kupu-exthyperlink-pressed {background-image: url("kupuimages/exthyperlink.png"); background-color: white}
+
+.kupu-image {background-image: url("kupuimages/image.png");}
+.kupu-indent {background-image: url("kupuimages/indent.png");}
+.kupu-inserthorizontalrule {background-image: url("kupuimages/hr.png");}
+.kupu-insertorderedlist {background-image: url("kupuimages/ordered-list.png");}
+.kupu-insertunorderedlist {background-image: url("kupuimages/unordered-list.png");}
+.kupu-insertdefinitionlist {background-image: url("kupuimages/definitionlist.png");}
+.kupu-italic {background-image: url("kupuimages/italic.png");}
+.kupu-italic-pressed {background-image: url("kupuimages/italic.png"); background-color: white}
+.kupu-justifycenter {background-image: url("kupuimages/justify-center.png");}
+.kupu-justifyleft {background-image: url("kupuimages/justify-left.png");}
+.kupu-justifyright {background-image: url("kupuimages/justify-right.png");}
+button.kupu-logo {background-image: url("kupuimages/kupu_icon.gif");}
+.kupu-outdent {background-image: url("kupuimages/outdent.png");}
+.kupu-redo {background-image: url("kupuimages/redo.png");}
+.kupu-save {background-image: url("kupuimages/save.png");}
+.kupu-save-and-exit {background-image: url("kupuimages/exit.gif");}
+.kupu-space {background-image: url("kupuimages/space.gif");}
+.kupu-source {background-image: url("kupuimages/view-source.png");}
+.kupu-spellchecker {background-image: url("kupuimages/text-check.png");}
+.kupu-subscript {background-image: url("kupuimages/subscript.png");}
+.kupu-subscript-pressed {background-image: url("kupuimages/subscript.png"); background-color: white}
+.kupu-superscript {background-image: url("kupuimages/superscript.png");}
+.kupu-superscript-pressed {background-image: url("kupuimages/superscript.png"); background-color: white}
+.kupu-table {background-image: url("kupuimages/table.png");}
+.kupu-underline {background-image: url("kupuimages/underline.png");}
+.kupu-underline-pressed {background-image: url("kupuimages/underline.png"); background-color: white}
+.kupu-undo {background-image: url("kupuimages/undo.png");}
+.kupu-removelink {background-image: url("kupuimages/remove.png");}
+.kupu-removeimage {background-image: url("kupuimages/remove.png");}
+.kupu-zoom {background-image: url("kupuimages/zoom-in.gif");}
+.kupu-zoom-pressed {background-image: url("kupuimages/zoom-out.gif");}
+
+.kupu-tb-buttons button.invisible { 
+  display: none;
+  /*visibility: hidden;*/
+}
+
+.kupu-tb-buttons button.visible { 
+  display: inline;
+}
+
+div.kupu-editorframe {
+  margin-left: 0.3em;
+  margin-bottom: 0.3em;
+  border: solid 2px ButtonFace;
+}
+
+iframe.kupu-editor-iframe {
+  height: 450px;
+  width: 99%;
+}
+
+textarea.kupu-editor-textarea {
+  height: 450px;
+  width: 99%;
+  display: none;
+}
+
+div.kupu-toolboxes {
+  float: right;	
+  border: solid 2px ButtonFace;
+  width: 19.4em;
+  margin-right: 0.3em;
+  margin-bottom: 0.3em;
+  font-size: 0.8em;
+}
+
+div.kupu-fulleditor-zoomed div.kupu-toolboxes {
+  display: none;
+}
+
+div.kupu-toolbox, div.kupu-toolbox-active {
+  margin-bottom: 1em;
+}
+
+div.kupu-toolbox h1, div.kupu-toolbox-active h1 {
+  text-align: center;
+  width: 100%;
+  background-color: ButtonFace;
+  margin-top: 0;
+  font-size: 1.1em;
+}
+
+div.kupu-toolbox-label, span.kupu-toolbox-searchterm, 
+input.wide, select.wide, textarea.wide, button.kupu-toolbox-action, 
+div.kupu-toolbox-results {
+  margin-left: 0.2em;
+  margin-right: 0.2em;
+}
+
+.wide {
+  width: 95%;
+}
+
+div.kupu-toolbox-label {
+  margin-bottom: 0.4em;
+}
+
+.kupu-toolbox-buttons {
+  text-align: center;
+}
+
+.kupu-toolbox-buttons button {
+  width: 45%;
+}
+
+div.kupu-toolbox-results {
+  border: solid 2px ButtonFace;
+  margin-top: 0.8em;
+  text-decoration: underline;
+  padding: 0.2em;
+  display: none;
+}
+
+div.kupu-toolbox table.kupu-toolbox-addtable input, 
+div.kupu-toolbox-active table.kupu-toolbox-edittable input {
+  width: 20px;
+}
+
+div.kupu-toolbox-active {
+  background-color: ButtonFace;
+}
+
+.kupu-toolbox-editlink, .kupu-toolbox-edittable,
+.kupu-ulstyles, .kupu-olstyles {
+  display: none;
+}
+
+
+div#kupu-colorchooser {
+  position: absolute;
+  visibility: hidden;
+  border: solid black 1px;
+  background-color: white;
+  padding: 0.2em;
+  font-size: small;
+}
+
+.kupu-toolboxes input, .kupu-toolboxes select, .kupu-toolboxes textarea {
+  font-size: x-small;
+  font-family: Verdana, "Lucida Grande", Helvetica, Arial, sans-serif;
+}
+
+div#kupu-fgcolorchooser div:hover {
+  /* border: outset 1px; */
+}
+
+div.kupu-drawer {
+   overflow: auto;
+}
+
+button.disabled {
+   opacity:0.5;
+   filter:alpha(opacity=50);
+}

Added: incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kuputoolcollapser.js
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kuputoolcollapser.js?view=auto&rev=454522
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kuputoolcollapser.js (added)
+++ incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/kuputoolcollapser.js Mon Oct  9 14:28:27 2006
@@ -0,0 +1,133 @@
+// turn this into a nice module-like namespace to avoid messing up the global
+// (window) namespace
+this.kuputoolcollapser = new function() {
+    var ToolCollapser = function(toolboxesparentid) {
+        this.parent = document.getElementById(toolboxesparentid);
+    };
+
+    // make the collapser available in the namespace
+    this.Collapser = ToolCollapser;
+
+    ToolCollapser.prototype.initialize = function() {
+        var initial_state = {};
+        if (navigator.cookieEnabled) {
+            var cookie = document.cookie;
+            var reg = /initial_state=([^;]+);?/;
+            var match = cookie.match(reg);
+            if (match) {
+                eval(unescape(match[0]));
+            };
+        };
+        for (var i=0; i < this.parent.childNodes.length; i++) {
+            var child = this.parent.childNodes[i];
+            if (child.className == 'kupu-toolbox') {
+                var heading = child.getElementsByTagName('h1')[0];
+                if (!heading) {
+                    throw('heading not found by collapser for toolbox ' +
+                            child.id);
+                };
+                heading.setAttribute('title', _('click to unfold'));
+                // find the toolbox's body
+                var body = this.getToolBody(child);
+                // now set a handler that makes the body display and hide
+                // on click, and register it to the heading
+                // WAAAAAHHHH!!! since there's some weird shit happening when
+                // I just use closures to refer to the body (somehow only the
+                // *last* value body is set to in this loop is used?!?) I
+                // used a reference to the body as 'this' in the handler
+                var handler = function(heading) {
+                    if (this.style.display == 'none') {
+                        // assume we have a block-level element here...
+                        this.style.display = 'block';
+                        heading.className = 'kupu-toolbox-heading-opened';
+                        heading.setAttribute('title', _('click to fold'));
+                    } else {
+                        this.style.display = 'none';
+                        heading.className = 'kupu-toolbox-heading-closed';
+                        heading.setAttribute('title', _('click to unfold'));
+                    };
+                };
+                var wrap_openhandler = function(body, heading) {
+                    return function() {
+                        body.style.display = 'block';
+                        heading.className = 'kupu-toolbox-heading-opened';
+                    };
+                };
+                addEventHandler(heading, 'click', handler, body, heading);
+                if (initial_state[child.id] === undefined || 
+                        initial_state[child.id] == '0') {
+                    body.style.display = 'none';
+                } else {
+                    heading.className = 'kupu-toolbox-heading-opened';
+                    heading.setAttribute('title', _('click to fold'));
+                };
+                // add a reference to the openhandler on the toolbox div
+                // so any toolbox code can use that to open the toolbox if
+                // it so desires
+                child.open_handler = wrap_openhandler(body, heading);
+            };
+        };
+
+        addEventHandler(window, 'beforeunload', this.saveState, this);
+    };
+
+    ToolCollapser.prototype.getToolBody = function(tool) {
+        var heading = tool.getElementsByTagName('h1')[0];
+        var currchild = heading.nextSibling;
+        while (currchild.nodeType != 1) {
+            currchild = currchild.nextSibling;
+            if (!currchild) {
+                throw('body not found by collapser for toolbox ' +
+                        child.id);
+            };
+        };
+        return currchild;
+    };
+
+    ToolCollapser.prototype.saveState = function() {
+        /* save collapse state of the toolboxes in a cookie */
+        if (!navigator.cookieEnabled) {
+            return;
+        };
+        var current_state = {};
+        for (var i=0; i < this.parent.childNodes.length; i++) {
+            var child = this.parent.childNodes[i];
+            if (child.nodeType != 1) {
+                continue;
+            };
+            var body = this.getToolBody(child);
+            current_state[child.id] = body.style.display == 'none' ? '0' : '1';
+        };
+        
+        var exp = new Date();
+        // 100 years before state is lost... should be enough ;)
+        exp.setTime(exp.getTime() + (100 * 365 * 24 * 60 * 60 * 1000));
+        var cookie = 'initial_state=' + 
+                            escape(this.serializeMapping(current_state)) + 
+                            ';' +
+                            'expires=' + exp.toGMTString() + ';' +
+                            'path=/';
+        document.cookie = cookie;
+    };
+
+    ToolCollapser.prototype.serializeMapping = function(mapping) {
+        /* serializes the config dict into a string that can be evalled
+            
+            works only for dicts with string values
+        */
+        if (typeof(mapping) == 'string') {
+            return "'" + mapping + "'";
+        };
+        var ret = '{';
+        var first = true;
+        for (var key in mapping) {
+            if (!first) {
+                ret += ', ';
+            };
+            ret += "'" + key + "': " + 
+                this.serializeMapping(mapping[key]);
+            first = false;
+        };
+        return ret + '}';
+    };
+}();

Added: incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/sarissa.js
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/sarissa.js?view=auto&rev=454522
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/sarissa.js (added)
+++ incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/sarissa.js Mon Oct  9 14:28:27 2006
@@ -0,0 +1,608 @@
+/*****************************************************************************
+ *
+ * Sarissa XML library version 0.9.6
+ * Copyright (c) 2003 Manos Batsis, 
+ * mailto: mbatsis at users full stop sourceforge full stop net
+ * This software is distributed under the Kupu License. See
+ * LICENSE.txt for license text. See the Sarissa homepage at
+ * http://sarissa.sourceforge.net for more information.
+ *
+ *****************************************************************************
+
+ * ====================================================================
+ * About
+ * ====================================================================
+ * Sarissa cross browser XML library 
+ * @version 0.9.6
+ * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net
+ *
+ * Sarissa is an ECMAScript library acting as a cross-browser wrapper for native XML APIs.
+ * The library supports Gecko based browsers like Mozilla and Firefox,
+ * Internet Explorer (5.5+ with MSXML3.0+) and, last but not least, KHTML based browsers like
+ * Konqueror and Safari.
+ *
+ */
+/**
+ * <p>Sarissa is a utility class. Provides static methods for DOMDocument and 
+ * XMLHTTP objects, DOM Node serializatrion to XML strings and other goodies.</p>
+ * @constructor
+ */
+function Sarissa(){};
+/** @private */
+Sarissa.PARSED_OK = "Document contains no parsing errors";
+/**
+ * Tells you whether transformNode and transformNodeToObject are available. This functionality
+ * is contained in sarissa_ieemu_xslt.js and is deprecated. If you want to control XSLT transformations
+ * use the XSLTProcessor
+ * @deprecated
+ * @type boolean
+ */
+Sarissa.IS_ENABLED_TRANSFORM_NODE = false;
+/**
+ * tells you whether XMLHttpRequest (or equivalent) is available
+ * @type boolean
+ */
+Sarissa.IS_ENABLED_XMLHTTP = false;
+/**
+ * tells you whether selectNodes/selectSingleNode is available
+ * @type boolean
+ */
+Sarissa.IS_ENABLED_SELECT_NODES = false;
+var _sarissa_iNsCounter = 0;
+var _SARISSA_IEPREFIX4XSLPARAM = "";
+var _SARISSA_HAS_DOM_IMPLEMENTATION = document.implementation && true;
+var _SARISSA_HAS_DOM_CREATE_DOCUMENT = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.createDocument;
+var _SARISSA_HAS_DOM_FEATURE = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.hasFeature;
+var _SARISSA_IS_MOZ = _SARISSA_HAS_DOM_CREATE_DOCUMENT && _SARISSA_HAS_DOM_FEATURE;
+var _SARISSA_IS_SAFARI = navigator.userAgent.toLowerCase().indexOf("applewebkit") != -1;
+var _SARISSA_IS_IE = document.all && window.ActiveXObject && navigator.userAgent.toLowerCase().indexOf("msie") > -1  && navigator.userAgent.toLowerCase().indexOf("opera") == -1;
+
+if(!window.Node || !window.Node.ELEMENT_NODE){
+    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};
+};
+
+// IE initialization
+if(_SARISSA_IS_IE){
+    // for XSLT parameter names, prefix needed by IE
+    _SARISSA_IEPREFIX4XSLPARAM = "xsl:";
+    // used to store the most recent ProgID available out of the above
+    var _SARISSA_DOM_PROGID = "";
+    var _SARISSA_XMLHTTP_PROGID = "";
+    /**
+     * Called when the Sarissa_xx.js file is parsed, to pick most recent
+     * ProgIDs for IE, then gets destroyed.
+     * @param idList an array of MSXML PROGIDs from which the most recent will be picked for a given object
+     * @param enabledList an array of arrays where each array has two items; the index of the PROGID for which a certain feature is enabled
+     */
+    pickRecentProgID = function (idList, enabledList){
+        // found progID flag
+        var bFound = false;
+        for(var i=0; i < idList.length && !bFound; i++){
+            try{
+                var oDoc = new ActiveXObject(idList[i]);
+                o2Store = idList[i];
+                bFound = true;
+                for(var j=0;j<enabledList.length;j++)
+                    if(i <= enabledList[j][1])
+                        Sarissa["IS_ENABLED_"+enabledList[j][0]] = true;
+            }catch (objException){
+                // trap; try next progID
+            };
+        };
+        if (!bFound)
+            throw "Could not retreive a valid progID of Class: " + idList[idList.length-1]+". (original exception: "+e+")";
+        idList = null;
+        return o2Store;
+    };
+    // pick best available MSXML progIDs
+    _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]]);
+    _SARISSA_XMLHTTP_PROGID = pickRecentProgID(["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"], [["XMLHTTP", 4]]);
+    _SARISSA_THREADEDDOM_PROGID = pickRecentProgID(["Msxml2.FreeThreadedDOMDocument.5.0", "MSXML2.FreeThreadedDOMDocument.4.0", "MSXML2.FreeThreadedDOMDocument.3.0"]);
+    _SARISSA_XSLTEMPLATE_PROGID = pickRecentProgID(["Msxml2.XSLTemplate.5.0", "Msxml2.XSLTemplate.4.0", "MSXML2.XSLTemplate.3.0"], [["XSLTPROC", 2]]);
+    // we dont need this anymore
+    pickRecentProgID = null;
+    //============================================
+    // Factory methods (IE)
+    //============================================
+    // see non-IE version
+    Sarissa.getDomDocument = function(sUri, sName){
+        var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
+        // if a root tag name was provided, we need to load it in the DOM
+        // object
+        if (sName){
+            // if needed, create an artifical namespace prefix the way Moz
+            // does
+            if (sUri){
+                oDoc.loadXML("<a" + _sarissa_iNsCounter + ":" + sName + " xmlns:a" + _sarissa_iNsCounter + "=\"" + sUri + "\" />");
+                // don't use the same prefix again
+                ++_sarissa_iNsCounter;
+            }
+            else
+                oDoc.loadXML("<" + sName + "/>");
+        };
+        return oDoc;
+    };
+    // see non-IE version   
+    Sarissa.getParseErrorText = function (oDoc) {
+        var parseErrorText = Sarissa.PARSED_OK;
+        if(oDoc.parseError != 0){
+            parseErrorText = "XML Parsing Error: " + oDoc.parseError.reason + 
+                "\nLocation: " + oDoc.parseError.url + 
+                "\nLine Number " + oDoc.parseError.line + ", Column " + 
+                oDoc.parseError.linepos + 
+                ":\n" + oDoc.parseError.srcText +
+                "\n";
+            for(var i = 0;  i < oDoc.parseError.linepos;i++){
+                parseErrorText += "-";
+            };
+            parseErrorText +=  "^\n";
+        };
+        return parseErrorText;
+    };
+    // see non-IE version
+    Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {
+        oDoc.setProperty("SelectionLanguage", "XPath");
+        oDoc.setProperty("SelectionNamespaces", sNsSet);
+    };   
+    /**
+     * Basic implementation of Mozilla's XSLTProcessor for IE. 
+     * Reuses the same XSLT stylesheet for multiple transforms
+     * @constructor
+     */
+    XSLTProcessor = function(){
+        this.template = new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);
+        this.processor = null;
+    };
+    /**
+     * Impoprts the given XSLT DOM and compiles it to a reusable transform
+     * @argument xslDoc The XSLT DOMDocument to import
+     */
+    XSLTProcessor.prototype.importStylesheet = function(xslDoc){
+        // convert stylesheet to free threaded
+        var converted = new ActiveXObject(_SARISSA_THREADEDDOM_PROGID); 
+        converted.loadXML(xslDoc.xml);
+        this.template.stylesheet = converted;
+        this.processor = this.template.createProcessor();
+        // (re)set default param values
+        this.paramsSet = new Array();
+    };
+    /**
+     * Transform the given XML DOM
+     * @argument sourceDoc The XML DOMDocument to transform
+     * @return The transformation result as a DOM Document
+     */
+    XSLTProcessor.prototype.transformToDocument = function(sourceDoc){
+        this.processor.input = sourceDoc;
+        var outDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
+        this.processor.output = outDoc; 
+        this.processor.transform();
+        return outDoc;
+    };
+    /**
+     * Not sure if this works in IE. Maybe this will allow non-well-formed
+     * transformation results (i.e. with no single root element)
+     * @argument sourceDoc The XML DOMDocument to transform
+     * @return The transformation result as a DOM Fragment
+     */
+    XSLTProcessor.prototype.transformToFragment = function(sourceDoc, ownerDocument){
+        return this.transformToDocument(sourceDoc);
+    };
+    /**
+     * Set global XSLT parameter of the imported stylesheet
+     * @argument nsURI The parameter namespace URI
+     * @argument name The parameter base name
+     * @argument value The new parameter value
+     */
+    XSLTProcessor.prototype.setParameter = function(nsURI, name, value){
+        /* nsURI is optional but cannot be null */
+        if(nsURI){
+            this.processor.addParameter(name, value, nsURI);
+        }else{
+            this.processor.addParameter(name, value);
+        };
+        /* update updated params for getParameter */
+        if(!this.paramsSet[""+nsURI]){
+            this.paramsSet[""+nsURI] = new Array();
+        };
+        this.paramsSet[""+nsURI][name] = value;
+    };
+    /**
+     * Gets a parameter if previously set by setParameter. Returns null
+     * otherwise
+     * @argument name The parameter base name
+     * @argument value The new parameter value
+     * @return The parameter value if reviously set by setParameter, null otherwise
+     */
+    XSLTProcessor.prototype.getParameter = function(nsURI, name){
+        if(this.paramsSet[""+nsURI] && this.paramsSet[""+nsURI][name])
+            return this.paramsSet[""+nsURI][name];
+        else
+            return null;
+    };
+}
+else{ /* end IE initialization, try to deal with real browsers now ;-) */
+   if(_SARISSA_HAS_DOM_CREATE_DOCUMENT){
+        if(window.XMLDocument){
+            /**
+            * <p>Emulate IE's onreadystatechange attribute</p>
+            */
+            XMLDocument.prototype.onreadystatechange = null;
+            /**
+            * <p>Emulates IE's readyState property, which always gives an integer from 0 to 4:</p>
+            * <ul><li>1 == LOADING,</li>
+            * <li>2 == LOADED,</li>
+            * <li>3 == INTERACTIVE,</li>
+            * <li>4 == COMPLETED</li></ul>
+            */
+            XMLDocument.prototype.readyState = 0;
+            /**
+            * <p>Emulate IE's parseError attribute</p>
+            */
+            XMLDocument.prototype.parseError = 0;
+
+            // NOTE: setting async to false will only work with documents
+            // called over HTTP (meaning a server), not the local file system,
+            // unless you are using Moz 1.4+.
+            // BTW the try>catch block is for 1.4; I haven't found a way to check if
+            // the property is implemented without
+            // causing an error and I dont want to use user agent stuff for that...
+            var _SARISSA_SYNC_NON_IMPLEMENTED = false;
+            try{
+                /**
+                * <p>Emulates IE's async property for Moz versions prior to 1.4.
+                * It controls whether loading of remote XML files works
+                * synchronously or asynchronously.</p>
+                */
+                XMLDocument.prototype.async = true;
+                _SARISSA_SYNC_NON_IMPLEMENTED = true;
+            }catch(e){/* trap */};
+            /**
+            * <p>Keeps a handle to the original load() method. Internal use and only
+            * if Mozilla version is lower than 1.4</p>
+            * @private
+            */
+            XMLDocument.prototype._sarissa_load = XMLDocument.prototype.load;
+
+            /**
+            * <p>Overrides the original load method to provide synchronous loading for
+            * Mozilla versions prior to 1.4, using an XMLHttpRequest object (if
+            * async is set to false)</p>
+            * @returns the DOM Object as it was before the load() call (may be  empty)
+            */
+            XMLDocument.prototype.load = function(sURI) {
+                var oDoc = document.implementation.createDocument("", "", null);
+                Sarissa.copyChildNodes(this, oDoc);
+                this.parseError = 0;
+                Sarissa.__setReadyState__(this, 1);
+                try {
+                    if(this.async == false && _SARISSA_SYNC_NON_IMPLEMENTED) {
+                        var tmp = new XMLHttpRequest();
+                        tmp.open("GET", sURI, false);
+                        tmp.send(null);
+                        Sarissa.__setReadyState__(this, 2);
+                        Sarissa.copyChildNodes(tmp.responseXML, this);
+                        Sarissa.__setReadyState__(this, 3);
+                    }
+                    else {
+                        this._sarissa_load(sURI);
+                    };
+                }
+                catch (objException) {
+                    this.parseError = -1;
+                }
+                finally {
+                    if(this.async == false){
+                        Sarissa.__handleLoad__(this);
+                    };
+                };
+                return oDoc;
+            };
+        };//if(window.XMLDocument)
+
+        /**
+         * <p>Ensures the document was loaded correctly, otherwise sets the
+         * parseError to -1 to indicate something went wrong. Internal use</p>
+         * @private
+         */
+        Sarissa.__handleLoad__ = function(oDoc){
+            if (!oDoc.documentElement || oDoc.documentElement.tagName == "parsererror")
+                oDoc.parseError = -1;
+            Sarissa.__setReadyState__(oDoc, 4);
+        };
+        
+        /**
+        * <p>Attached by an event handler to the load event. Internal use.</p>
+        * @private
+        */
+        _sarissa_XMLDocument_onload = function(){
+            Sarissa.__handleLoad__(this);
+        };
+        
+        /**
+         * <p>Sets the readyState property of the given DOM Document object.
+         * Internal use.</p>
+         * @private
+         * @argument oDoc the DOM Document object to fire the
+         *          readystatechange event
+         * @argument iReadyState the number to change the readystate property to
+         */
+        Sarissa.__setReadyState__ = function(oDoc, iReadyState){
+            oDoc.readyState = iReadyState;
+            if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange == "function")
+                oDoc.onreadystatechange();
+        };
+        /**
+        * <p>Factory method to obtain a new DOM Document object</p>
+        * @argument sUri the namespace of the root node (if any)
+        * @argument sUri the local name of the root node (if any)
+        * @returns a new DOM Document
+        */
+        Sarissa.getDomDocument = function(sUri, sName){
+            var oDoc = document.implementation.createDocument(sUri?sUri:"", sName?sName:"", null);
+            oDoc.addEventListener("load", _sarissa_XMLDocument_onload, false);
+            return oDoc;
+        };        
+    };//if(_SARISSA_HAS_DOM_CREATE_DOCUMENT)
+};
+//==========================================
+// Common stuff
+//==========================================
+if(!window.DOMParser){
+    /** 
+    * DOMParser is a utility class, used to construct DOMDocuments from XML strings
+    * @constructor
+    */
+    DOMParser = function() {
+    };
+    /** 
+    * Construct a new DOM Document from the given XMLstring
+    * @param sXml the given XML string
+    * @param contentType the content type of the document the given string represents (one of text/xml, application/xml, application/xhtml+xml). 
+    * @return a new DOM Document from the given XML string
+    */
+    DOMParser.prototype.parseFromString = function(sXml, contentType){
+        var doc = Sarissa.getDomDocument();
+        doc.loadXML(sXml);
+        return doc;
+    };
+    
+};
+
+if(window.XMLHttpRequest){
+    Sarissa.IS_ENABLED_XMLHTTP = true;
+}
+else if(_SARISSA_IS_IE){
+    /**
+     * Emulate XMLHttpRequest
+     * @constructor
+     */
+    XMLHttpRequest = function() {
+        return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);
+    };
+    Sarissa.IS_ENABLED_XMLHTTP = true;
+};
+
+if(!window.document.importNode && _SARISSA_IS_IE){
+    try{
+        /**
+        * Implements importNode for the current window document in IE using innerHTML.
+        * Testing showed that DOM was multiple times slower than innerHTML for this,
+        * sorry folks. If you encounter trouble (who knows what IE does behind innerHTML)
+        * please gimme a call.
+        * @param oNode the Node to import
+        * @param bChildren whether to include the children of oNode
+        * @returns the imported node for further use
+        */
+        window.document.importNode = function(oNode, bChildren){
+            var importNode = document.createElement("div");
+            if(bChildren)
+                importNode.innerHTML = Sarissa.serialize(oNode);
+            else
+                importNode.innerHTML = Sarissa.serialize(oNode.cloneNode(false));
+            return importNode.firstChild;
+        };
+        }catch(e){};
+};
+if(!Sarissa.getParseErrorText){
+    /**
+     * <p>Returns a human readable description of the parsing error. Usefull
+     * for debugging. Tip: append the returned error string in a &lt;pre&gt;
+     * element if you want to render it.</p>
+     * <p>Many thanks to Christian Stocker for the initial patch.</p>
+     * @argument oDoc The target DOM document
+     * @returns The parsing error description of the target Document in
+     *          human readable form (preformated text)
+     */
+    Sarissa.getParseErrorText = function (oDoc){
+        var parseErrorText = Sarissa.PARSED_OK;
+        if(oDoc.parseError != 0){
+            /*moz*/
+            if(oDoc.documentElement.tagName == "parsererror"){
+                parseErrorText = oDoc.documentElement.firstChild.data;
+                parseErrorText += "\n" +  oDoc.documentElement.firstChild.nextSibling.firstChild.data;
+            }/*konq*/
+            else if(oDoc.documentElement.tagName == "html"){
+                parseErrorText = Sarissa.getText(oDoc.documentElement.getElementsByTagName("h1")[0], false) + "\n";
+                parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("body")[0], false) + "\n";
+                parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("pre")[0], false);
+            };
+        };
+        return parseErrorText;
+    };
+};
+Sarissa.getText = function(oNode, deep){
+    var s = "";
+    var nodes = oNode.childNodes;
+    for(var i=0; i < nodes.length; i++){
+        var node = nodes[i];
+        var nodeType = node.nodeType;
+        if(nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE){
+            s += node.data;
+        }
+        else if(deep == true
+                    && (nodeType == Node.ELEMENT_NODE
+                        || nodeType == Node.DOCUMENT_NODE
+                        || nodeType == Node.DOCUMENT_FRAGMENT_NODE)){
+            s += Sarissa.getText(node, true);
+        };
+    };
+    return s;
+};
+if(window.XMLSerializer){
+    /**
+     * <p>Factory method to obtain the serialization of a DOM Node</p>
+     * @returns the serialized Node as an XML string
+     */
+    Sarissa.serialize = function(oDoc){
+        return (new XMLSerializer()).serializeToString(oDoc);
+    };
+}else{
+    if((Sarissa.getDomDocument("","foo", null)).xml){
+        // see non-IE version
+        Sarissa.serialize = function(oDoc) {
+            // TODO: check for HTML document and return innerHTML instead
+            return oDoc.xml;
+        };
+        /**
+         * Utility class to serialize DOM Node objects to XML strings
+         * @constructor
+         */
+        XMLSerializer = function(){};
+        /**
+         * Serialize the given DOM Node to an XML string
+         * @param oNode the DOM Node to serialize
+         */
+        XMLSerializer.prototype.serializeToString = function(oNode) {
+            return oNode.xml;
+        };
+    };
+};
+
+/**
+ * strips tags from a markup string
+ */
+Sarissa.stripTags = function (s) {
+    return s.replace(/<[^>]+>/g,"");
+};
+/**
+ * <p>Deletes all child nodes of the given node</p>
+ * @argument oNode the Node to empty
+ */
+Sarissa.clearChildNodes = function(oNode) {
+    while(oNode.hasChildNodes()){
+        oNode.removeChild(oNode.firstChild);
+    };
+};
+/**
+ * <p> Copies the childNodes of nodeFrom to nodeTo</p>
+ * <p> <b>Note:</b> The second object's original content is deleted before 
+ * the copy operation, unless you supply a true third parameter</p>
+ * @argument nodeFrom the Node to copy the childNodes from
+ * @argument nodeTo the Node to copy the childNodes to
+ * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false
+ */
+Sarissa.copyChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {
+    if(!bPreserveExisting){
+        Sarissa.clearChildNodes(nodeTo);
+    };
+    var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;
+    var nodes = nodeFrom.childNodes;
+    if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {
+        for(var i=0;i < nodes.length;i++) {
+            nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));
+        };
+    }
+    else{
+        for(var i=0;i < nodes.length;i++) {
+            nodeTo.appendChild(nodes[i].cloneNode(true));
+        };
+    };
+};
+
+/**
+ * <p> Moves the childNodes of nodeFrom to nodeTo</p>
+ * <p> <b>Note:</b> The second object's original content is deleted before 
+ * the move operation, unless you supply a true third parameter</p>
+ * @argument nodeFrom the Node to copy the childNodes from
+ * @argument nodeTo the Node to copy the childNodes to
+ * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false
+ */
+Sarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {
+    if(!bPreserveExisting){
+        Sarissa.clearChildNodes(nodeTo);
+    };
+    
+    var nodes = nodeFrom.childNodes;
+    // if within the same doc, just move, else copy and delete
+    if(nodeFrom.ownerDocument == nodeTo.ownerDocument){
+        nodeTo.appendChild(nodes[i]);
+    }else{
+        var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;
+         if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {
+            for(var i=0;i < nodes.length;i++) {
+                nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));
+            };
+        }
+        else{
+            for(var i=0;i < nodes.length;i++) {
+                nodeTo.appendChild(nodes[i].cloneNode(true));
+            };
+        };
+        Sarissa.clearChildNodes(nodeFrom);
+    };
+    
+};
+
+/** 
+ * <p>Serialize any object to an XML string. All properties are serialized using the property name
+ * as the XML element name. Array elements are rendered as <code>array-item</code> elements, 
+ * using their index/key as the value of the <code>key</code> attribute.</p>
+ * @argument anyObject the object to serialize
+ * @argument objectName a name for that object
+ * @return the XML serializationj of the given object as a string
+ */
+Sarissa.xmlize = function(anyObject, objectName, indentSpace){
+    indentSpace = indentSpace?indentSpace:'';
+    var s = indentSpace  + '<' + objectName + '>';
+    var isLeaf = false;
+    if(!(anyObject instanceof Object) || anyObject instanceof Number || anyObject instanceof String 
+        || anyObject instanceof Boolean || anyObject instanceof Date){
+        s += Sarissa.escape(""+anyObject);
+        isLeaf = true;
+    }else{
+        s += "\n";
+        var itemKey = '';
+        var isArrayItem = anyObject instanceof Array;
+        for(var name in anyObject){
+            s += Sarissa.xmlize(anyObject[name], (isArrayItem?"array-item key=\""+name+"\"":name), indentSpace + "   ");
+        };
+        s += indentSpace;
+    };
+    return s += (objectName.indexOf(' ')!=-1?"</array-item>\n":"</" + objectName + ">\n");
+};
+
+/** 
+ * Escape the given string chacters that correspond to the five predefined XML entities
+ * @param sXml the string to escape
+ */
+Sarissa.escape = function(sXml){
+    return sXml.replace(/&/g, "&amp;")
+        .replace(/</g, "&lt;")
+        .replace(/>/g, "&gt;")
+        .replace(/"/g, "&quot;")
+        .replace(/'/g, "&apos;");
+};
+
+/** 
+ * Unescape the given string. This turns the occurences of the predefined XML 
+ * entities to become the characters they represent correspond to the five predefined XML entities
+ * @param sXml the string to unescape
+ */
+Sarissa.unescape = function(sXml){
+    return sXml.replace(/&apos;/g,"'")
+        .replace(/&quot;/g,"\"")
+        .replace(/&gt;/g,">")
+        .replace(/&lt;/g,"<")
+        .replace(/&amp;/g,"&");
+};
+//   EOF

Added: incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/sarissa_ieemu_xpath.js
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/sarissa_ieemu_xpath.js?view=auto&rev=454522
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/sarissa_ieemu_xpath.js (added)
+++ incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/sarissa_ieemu_xpath.js Mon Oct  9 14:28:27 2006
@@ -0,0 +1,183 @@
+/*****************************************************************************
+ *
+ * Sarissa XML library version 0.9.6
+ * Copyright (c) 2003 Manos Batsis, 
+ * mailto: mbatsis at users full stop sourceforge full stop net
+ * This software is distributed under the Kupu License. See
+ * LICENSE.txt for license text. See the Sarissa homepage at
+ * http://sarissa.sourceforge.net for more information.
+ *
+ *****************************************************************************
+
+ * ====================================================================
+ * About
+ * ====================================================================
+ * Sarissa cross browser XML library - IE XPath Emulation 
+ * @version 0.9.6
+ * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net
+ *
+ * This script emulates Internet Explorer's selectNodes and selectSingleNode
+ * for Mozilla. Associating namespace prefixes with URIs for your XPath queries
+ * is easy with IE's setProperty. 
+ * USers may also map a namespace prefix to a default (unprefixed) namespace in the
+ * source document with Sarissa.setXpathNamespaces
+ *
+ */
+if(_SARISSA_HAS_DOM_FEATURE && document.implementation.hasFeature("XPath", "3.0")){
+    /**
+    * <p>SarissaNodeList behaves as a NodeList but is only used as a result to <code>selectNodes</code>,
+    * so it also has some properties IEs proprietery object features.</p>
+    * @private
+    * @constructor
+    * @argument i the (initial) list size
+    */
+    function SarissaNodeList(i){
+        this.length = i;
+    };
+    /** <p>Set an Array as the prototype object</p> */
+    SarissaNodeList.prototype = new Array(0);
+    /** <p>Inherit the Array constructor </p> */
+    SarissaNodeList.prototype.constructor = Array;
+    /**
+    * <p>Returns the node at the specified index or null if the given index
+    * is greater than the list size or less than zero </p>
+    * <p><b>Note</b> that in ECMAScript you can also use the square-bracket
+    * array notation instead of calling <code>item</code>
+    * @argument i the index of the member to return
+    * @returns the member corresponding to the given index
+    */
+    SarissaNodeList.prototype.item = function(i) {
+        return (i < 0 || i >= this.length)?null:this[i];
+    };
+    /**
+    * <p>Emulate IE's expr property
+    * (Here the SarissaNodeList object is given as the result of selectNodes).</p>
+    * @returns the XPath expression passed to selectNodes that resulted in
+    *          this SarissaNodeList
+    */
+    SarissaNodeList.prototype.expr = "";
+    /** dummy, used to accept IE's stuff without throwing errors */
+    XMLDocument.prototype.setProperty  = function(x,y){};
+    /**
+    * <p>Programmatically control namespace URI/prefix mappings for XPath
+    * queries.</p>
+    * <p>This method comes especially handy when used to apply XPath queries
+    * on XML documents with a default namespace, as there is no other way
+    * of mapping that to a prefix.</p>
+    * <p>Using no namespace prefix in DOM Level 3 XPath queries, implies you
+    * are looking for elements in the null namespace. If you need to look
+    * for nodes in the default namespace, you need to map a prefix to it
+    * first like:</p>
+    * <pre>Sarissa.setXpathNamespaces(oDoc, &quot;xmlns:myprefix=&amp;aposhttp://mynsURI&amp;apos&quot;);</pre>
+    * <p><b>Note 1 </b>: Use this method only if the source document features
+    * a default namespace (without a prefix), otherwise just use IE's setProperty
+    * (moz will rezolve non-default namespaces by itself). You will need to map that
+    * namespace to a prefix for queries to work.</p>
+    * <p><b>Note 2 </b>: This method calls IE's setProperty method to set the
+    * appropriate namespace-prefix mappings, so you dont have to do that.</p>
+    * @param oDoc The target XMLDocument to set the namespace mappings for.
+    * @param sNsSet A whilespace-seperated list of namespace declarations as
+    *            those would appear in an XML document. E.g.:
+    *            <code>&quot;xmlns:xhtml=&apos;http://www.w3.org/1999/xhtml&apos;
+    * xmlns:&apos;http://www.w3.org/1999/XSL/Transform&apos;&quot;</code>
+    * @throws An error if the format of the given namespace declarations is bad.
+    */
+    Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {
+        //oDoc._sarissa_setXpathNamespaces(sNsSet);
+        oDoc._sarissa_useCustomResolver = true;
+        var namespaces = sNsSet.indexOf(" ")>-1?sNsSet.split(" "):new Array(sNsSet);
+        oDoc._sarissa_xpathNamespaces = new Array(namespaces.length);
+        for(var i=0;i < namespaces.length;i++){
+            var ns = namespaces[i];
+            var colonPos = ns.indexOf(":");
+            var assignPos = ns.indexOf("=");
+            if(colonPos == 5 && assignPos > colonPos+2){
+                var prefix = ns.substring(colonPos+1, assignPos);
+                var uri = ns.substring(assignPos+2, ns.length-1);
+                oDoc._sarissa_xpathNamespaces[prefix] = uri;
+            }else{
+                throw "Bad format on namespace declaration(s) given";
+            };
+        };
+    };
+    /**
+    * @private Flag to control whether a custom namespace resolver should
+    *          be used, set to true by Sarissa.setXpathNamespaces
+    */
+    XMLDocument.prototype._sarissa_useCustomResolver = false;
+    /** @private */
+    XMLDocument.prototype._sarissa_xpathNamespaces = new Array();
+    /**
+    * <p>Extends the XMLDocument to emulate IE's selectNodes.</p>
+    * @argument sExpr the XPath expression to use
+    * @argument contextNode this is for internal use only by the same
+    *           method when called on Elements
+    * @returns the result of the XPath search as a SarissaNodeList
+    * @throws An error if no namespace URI is found for the given prefix.
+    */
+    XMLDocument.prototype.selectNodes = function(sExpr, contextNode){
+        var nsDoc = this;
+        var nsresolver = this._sarissa_useCustomResolver
+        ? function(prefix){
+            var s = nsDoc._sarissa_xpathNamespaces[prefix];
+            if(s)return s;
+            else throw "No namespace URI found for prefix: '" + prefix+"'";
+            }
+        : this.createNSResolver(this.documentElement);
+            var oResult = this.evaluate(sExpr,
+                    (contextNode?contextNode:this),
+                    nsresolver,
+                    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+        var nodeList = new SarissaNodeList(oResult.snapshotLength);
+        nodeList.expr = sExpr;
+        for(var i=0;i<nodeList.length;i++)
+            nodeList[i] = oResult.snapshotItem(i);
+        return nodeList;
+    };
+    /**
+    * <p>Extends the Element to emulate IE's selectNodes</p>
+    * @argument sExpr the XPath expression to use
+    * @returns the result of the XPath search as an (Sarissa)NodeList
+    * @throws An
+    *             error if invoked on an HTML Element as this is only be
+    *             available to XML Elements.
+    */
+    Element.prototype.selectNodes = function(sExpr){
+        var doc = this.ownerDocument;
+        if(doc.selectNodes)
+            return doc.selectNodes(sExpr, this);
+        else
+            throw "Method selectNodes is only supported by XML Elements";
+    };
+    /**
+    * <p>Extends the XMLDocument to emulate IE's selectSingleNodes.</p>
+    * @argument sExpr the XPath expression to use
+    * @argument contextNode this is for internal use only by the same
+    *           method when called on Elements
+    * @returns the result of the XPath search as an (Sarissa)NodeList
+    */
+    XMLDocument.prototype.selectSingleNode = function(sExpr, contextNode){
+        var ctx = contextNode?contextNode:null;
+        sExpr = "("+sExpr+")[1]";
+        var nodeList = this.selectNodes(sExpr, ctx);
+        if(nodeList.length > 0)
+            return nodeList.item(0);
+        else
+            return null;
+    };
+    /**
+    * <p>Extends the Element to emulate IE's selectNodes.</p>
+    * @argument sExpr the XPath expression to use
+    * @returns the result of the XPath search as an (Sarissa)NodeList
+    * @throws An error if invoked on an HTML Element as this is only be
+    *             available to XML Elements.
+    */
+    Element.prototype.selectSingleNode = function(sExpr){
+        var doc = this.ownerDocument;
+        if(doc.selectSingleNode)
+            return doc.selectSingleNode(sExpr, this);
+        else
+            throw "Method selectNodes is only supported by XML Elements";
+    };
+    Sarissa.IS_ENABLED_SELECT_NODES = true;
+};

Added: incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/spellcheck.cgi
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/spellcheck.cgi?view=auto&rev=454522
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/spellcheck.cgi (added)
+++ incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/spellcheck.cgi Mon Oct  9 14:28:27 2006
@@ -0,0 +1,26 @@
+#!/usr/bin/python
+
+"""SpellChecker for Kupu, CGI wrapper"""
+
+import os, sys
+os.chdir(os.path.abspath(os.path.dirname(__file__)))
+sys.path.append(os.path.abspath('../python'))
+
+from spellcheck import SpellChecker, format_result
+
+if __name__ == '__main__':
+    import cgi, cgitb
+    #cgitb.enable()
+    #result = repr(sys.stdin.read())
+    data = cgi.FieldStorage()
+    data = data['text'].value
+    c = SpellChecker()
+    result = c.check(data)
+    if result == None:
+        result = ''
+    else:
+        result = format_result(result)
+    print 'Content-Type: text/xml,charset=UTF-8'
+    print 'Content-Length: %s' % len(result)
+    print
+    print result

Propchange: incubator/graffito/trunk/applications/browser/src/webapp/kupu-1.3.5/spellcheck.cgi
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/graffito/trunk/jetspeed2-deploy/src/java/org/apache/portals/jetspeed/valve/GraffitoCleanUpContextValve.java
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/jetspeed2-deploy/src/java/org/apache/portals/jetspeed/valve/GraffitoCleanUpContextValve.java?view=auto&rev=454522
==============================================================================
--- incubator/graffito/trunk/jetspeed2-deploy/src/java/org/apache/portals/jetspeed/valve/GraffitoCleanUpContextValve.java (added)
+++ incubator/graffito/trunk/jetspeed2-deploy/src/java/org/apache/portals/jetspeed/valve/GraffitoCleanUpContextValve.java Mon Oct  9 14:28:27 2006
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2000-2004 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.portals.jetspeed.valve;
+
+import java.security.Principal;
+
+import javax.security.auth.Subject;
+
+import org.apache.jetspeed.pipeline.PipelineException;
+import org.apache.jetspeed.pipeline.valve.ValveContext;
+import org.apache.jetspeed.request.RequestContext;
+import org.apache.jetspeed.security.impl.AbstractSecurityValve;
+import org.apache.portals.graffito.context.CmsRequestContext;
+import org.apache.portals.graffito.context.CmsRequestContextManager;
+import org.apache.portals.graffito.context.impl.CmsRequestContextImpl;
+
+/**
+ * Jetspeed 2 valve used to initialise the Graffito request context with the current Subject
+ * 
+ * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
+ * @version $Id: Exp $
+ */
+public class GraffitoCleanUpContextValve extends AbstractSecurityValve
+{
+	
+
+    private CmsRequestContextManager cmsRequestContextManager;
+    
+    /**
+     * Constructor
+     * 
+     * @param cmsRequestContextManager
+     */
+    public GraffitoCleanUpContextValve(CmsRequestContextManager cmsRequestContextManager)
+    {       
+       this.cmsRequestContextManager = cmsRequestContextManager;    
+    }
+    
+    /**
+     * Initialize the valve before using in a pipeline.
+     */
+    public void initialize() throws PipelineException
+    {
+
+    }
+    
+    /**
+     * 
+     * @see org.apache.jetspeed.pipeline.valve.Valve#invoke(org.apache.jetspeed.request.RequestContext, org.apache.jetspeed.pipeline.valve.ValveContext)
+     */    
+    public void invoke(RequestContext request, ValveContext context) throws PipelineException
+    {    	
+        cmsRequestContextManager.cleanupCmsRequestContent();
+        context.invokeNext(request);
+
+    }
+    protected Subject getSubject(RequestContext request)
+    {
+        try 
+        {
+            return getSubjectFromSession(request);
+        }
+        catch(Exception e)
+        {
+            return null;
+        }
+    }
+    protected Principal getUserPrincipal(RequestContext context)
+    {
+        return getUserPrincipal(context);
+    }
+    
+}