Author: alexsmirnov
Date: 2007-09-06 14:08:39 -0400 (Thu, 06 Sep 2007)
New Revision: 316
Added:
branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/epilog.js
branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/prolog.js
Modified:
branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/JSFAJAX.js
branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/log4ajax.js
branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/sarissa.js
branches/version_1_0_7/src/framework/JavaScript/build.xml
branches/version_1_0_7/src/framework/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableXMLFilter.java
Log:
import JavaScript from a 3.1.0 branch
Modified: branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/JSFAJAX.js
===================================================================
--- branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/JSFAJAX.js 2007-08-16 16:27:56
UTC (rev 315)
+++ branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/JSFAJAX.js 2007-09-06 18:08:39
UTC (rev 316)
@@ -7,14 +7,13 @@
// AJAX-JSF AJAX-like library, for communicate with view Tree on server side.
// Modified by Alexander J. Smirnov to use as JSF AJAX-like components.
-if (!window.A4J) { window.A4J= {};}
A4J.AJAX = {};
/**
* XMLHttp transport class - incapsulate most of client-specifiv functions for call
server requests.
*/
- A4J.AJAX.XMLHttpRequest = function(query){
+A4J.AJAX.XMLHttpRequest = function(query){
this._query = query;
};
@@ -27,8 +26,9 @@
_errorMessage : "XML Response object not set",
_contentType : null,
_onerror : function(req,status,message) {
- // Status not 200 - error !!!! TODO - I18N ???
- window.alert(message);
+ // Status not 200 - error !
+ // window.alert(message);
+ A4J.AJAX.replacePage(req);
},
onfinish : null,
options : {},
@@ -54,7 +54,17 @@
if(_this._timeoutID){
window.clearTimeout(_this._timeoutID);
}
- if(_this._request.status == 200){
+ var requestStatus;
+ var requestStatusText;
+ try{
+ requestStatus = _this._request.status;
+ requestStatusText = _this._request.statusText;
+ } catch(e){
+ LOG.error("request don't have status code - network problem");
+ requestStatus = 501;
+ requestStatusText = "Network error";
+ }
+ if(requestStatus == 200){
try {
LOG.debug("Response with content-type: "+
_this.getResponseHeader('Content-Type'));
LOG.debug("Full response content: ", _this.getResponseText());
@@ -72,10 +82,10 @@
_this.onready(_this);
}
} else {
- _this._errorMessage = "Reqest error, status :
"+_this._request.status +" " + _this._request.statusText + "\n
Message: " + _this.getResponseHeader("Ajax-Error-Message");
+ _this._errorMessage = "Reqest error, status : "+requestStatus
+" " + requestStatusText ;
LOG.error(_this._errorMessage);
if(typeof(_this._onerror) == "function"){
- _this._onerror(_this,_this._request.status,_this._errorMessage);
+ _this._onerror(_this,requestStatus,_this._errorMessage);
}
}
if(_this.onfinish){
@@ -131,7 +141,7 @@
this._aborted=true;
if(this._request){
try{
- this._request.abort();
+// this._request.abort();
if(this._timeoutID){
window.clearTimeout(this._timeoutID);
}
@@ -224,6 +234,7 @@
getElementById : function(id){
// first attempt - .getElementById.
var oDoc = this._request.responseXML;
+ if(oDoc){
if(typeof(oDoc.getElementById) != 'undefined') {
LOG.debug("call getElementById for id= "+id);
return oDoc.getElementById(id);
@@ -239,6 +250,9 @@
return oDoc.nodeFromID(id);
}
LOG.error("No functions for getElementById found ");
+ } else {
+ LOG.debug("No parsed XML document in response");
+ }
return null;
},
@@ -288,14 +302,20 @@
if( ! newnode ) { LOG.error("New node for ID "+id+" is not present in
response");return;}
var oldnode = window.document.getElementById(id);
if ( oldnode ) {
- var anchor = oldnode.parentNode ;
- // need to check for firstChild due to opera 8 bug with hasChildNodes
- Sarissa.clearChildNodes(oldnode);
- if(oldnode.outerHTML){
+ var anchor = oldnode.parentNode;
+ if(!window.opera && oldnode.outerHTML && !oldnode.tagName.match(
/(tbody|thead|tfoot|tr|th|td)/i ) ){
LOG.debug("Replace content of node by outerHTML()");
- oldnode.outerHTML = new XMLSerializer().serializeToString(newnode);
+ try {
+ oldnode.innerHTML = "";
+ } catch(e){
+ LOG.error("Error to clear node content by innerHTML");
+ Sarissa.clearChildNodes(oldnode);
+ }
+ oldnode.outerHTML = new XMLSerializer().serializeToString(newnode);
} else {
var importednode ;
+ // need to check for firstChild due to opera 8 bug with hasChildNodes
+ Sarissa.clearChildNodes(oldnode);
importednode = window.document.importNode(newnode, true);
LOG.debug("Replace content of node by replaceChild()");
anchor.replaceChild(importednode,oldnode);
@@ -329,7 +349,7 @@
var exist = false;
LOG.debug("<"+tag+"> in response with
src="+src);
for(var j = 0 ; j < oldscripts.length; j++){
- if(src == oldscripts[j].getAttribute(href)){
+ if(this._noSessionHref(src) ==
this._noSessionHref(oldscripts[j].getAttribute(href))){
LOG.debug("Such element exist in document");
exist = true;
break;
@@ -350,6 +370,21 @@
},
+ _noSessionHref : function(href){
+ var cref = href;
+ if(href){
+ var sessionid = href.lastIndexOf(";jsessionid=");
+ if(sessionid>0){
+ cref = href.substring(0,sessionid);
+ var params = href.lastIndexOf("?");
+ if(params>sessionid){
+ cref=cref+href.substring(params);
+ }
+ }
+ }
+ return cref;
+ },
+
_copyAttribute : function(src,dst,attr){
var value = src.getAttribute(attr);
if(value){
@@ -381,13 +416,23 @@
*/
A4J.AJAX.Poll = function( containerId, form, options ) {
A4J.AJAX.StopPoll(options.pollId);
- options.onerror = function(){
+ if(!options.onerror){
+ options.onerror = function(req,status,message){
+ if(typeof(A4J.AJAX.onError)== "function"){
+ A4J.AJAX.onError(req,status,message);
+ }
// For error, re-submit request.
- A4J.AJAX.Poll(containerId,form,options);
- };
+ A4J.AJAX.Poll(containerId,form,options);
+ };
+ }
A4J.AJAX._pollers[options.pollId] = window.setTimeout(function(){
A4J.AJAX._pollers[options.pollId]=undefined;
- A4J.AJAX.SubmitRequest(containerId,form,null,options);
+ if((typeof(options.onsubmit) == 'function') && (!options.onsubmit())){
+ // Onsubmit disable current poll, start next interval.
+ A4J.AJAX.Poll(containerId,form,options);
+ } else {
+ A4J.AJAX.SubmitRequest(containerId,form,null,options);
+ }
},options.pollinterval);
};
@@ -398,18 +443,66 @@
}
};
+/*
+ *
+ *
+ */
+A4J.AJAX.Push = function( containerId, form, options ) {
+ A4J.AJAX.StopPush(options.pushId);
+ options.onerror = function(){
+ // For error, re-submit request.
+ A4J.AJAX.Push(containerId,form,options);
+ };
+ A4J.AJAX._pollers[options.pushId] = window.setTimeout(function(){
+ var request = new XMLHttpRequest();
+ request.onreadystatechange = function(){
+ if (request.readyState == 4 ) {
+ try {
+ if(request.status == 200){
+// A4J.AJAX._pollers[options.pushId]=undefined;
+ A4J.AJAX.SubmitRequest(containerId,form||options.dummyForm,null,options);
+ }
+ } catch(e){
+ // Network error.
+ }
+ // Re-send request.
+ A4J.AJAX.Push( containerId, form, options );
+ request=null;
+// A4J.AJAX._pollers[options.pushId] = window.setTimeout(function(){
+// A4J.AJAX.SendPush( request,options );
+// },options.pushinterval);
+ }
+ }
+ A4J.AJAX.SendPush( request,options );
+ },options.pushinterval);
+};
+A4J.AJAX.SendPush = function( request,options ) {
+ var url = options.pushUrl || options.actionUrl;
+ request.open('HEAD', url , true);
+ request.setRequestHeader( "Ajax-Push-Key", options.pushId);
+ if(options.timeout){
+ request.setRequestHeader( "Timeout", options.timeout);
+ }
+ request.send();
+}
+
+A4J.AJAX.StopPush = function( Id ) {
+ if(A4J.AJAX._pollers[Id]){
+ window.clearTimeout(A4J.AJAX._pollers[Id]);
+ A4J.AJAX._pollers[Id] = undefined;
+ }
+};
+
+
+
A4J.AJAX.CloneObject = function( obj, noFunctions ) {
var cloned = {};
for( var n in obj ){
- try {
- if(noFunctions && typeof(obj[n]) == 'function'){
- continue;
- }
- cloned[n]=obj[n];
- } catch(e) {
- LOG.warn(e.message || e);
+ if(noFunctions && typeof(evt[prop]) == 'function'){
+ continue;
}
+ cloned[n]=obj[n];
}
return cloned;
}
@@ -422,6 +515,7 @@
LOG.debug("Form submitted by button "+A4J._formInput.id);
opt.control = A4J._formInput;
A4J._formInput = null;
+ opt.submitByForm=true;
}
A4J.AJAX.Submit(containerId,form,null,opt);
}
@@ -508,7 +602,7 @@
};
};
// TODO - test for null of form object
- if(form && form.onsubmit) {
+ if(!options.submitByForm && form && form.onsubmit) {
LOG.debug("Form have onsubmit function, call it" );
if( form.onsubmit() == false ){
return false;
@@ -566,54 +660,39 @@
A4J.AJAX.processResponse = function(req) {
var options = req.options;
var ajaxResponse = req.getResponseHeader('Ajax-Response');
- if( ajaxResponse != "true"){
+ // If view is expired, check user-defined handler.
+ var expiredMsg = req.getResponseHeader('Ajax-Expired');
+ if(expiredMsg && typeof(A4J.AJAX.onExpired) == 'function' ){
+ var loc = A4J.AJAX.onExpired(window.location,expiredMsg);
+ if(loc){
+ window.location = loc;
+ return;
+ }
+ }
+ if( ajaxResponse != "true"){
// NO Ajax header - new page.
LOG.warn("No ajax response header ");
var loc = req.getResponseHeader("Location");
try{
if(ajaxResponse == 'redirect' && loc){
- var expiredMsg = req.getResponseHeader('Ajax-Expired');
- if(expiredMsg){
- loc = A4J.AJAX.onExpired(loc,expiredMsg);
- if(!loc){
- return;
- }
- }
window.location = loc;
} else if(ajaxResponse == "reload"){
window.location.reload(true);
} else {
- var isIE = _SARISSA_IS_IE;
- window.setTimeout(function() {
- var isDocOpen=false;
- try {
- window.document.open(req.getContentType(),true);
- isDocOpen=true;
- window.document.write(req.getResponseText());
- window.document.close();
- if(isIE){
- // For Ie , scripts on page not activated.
- window.location.reload(false);
- }
- } catch(e) {
- if(isDocOpen){
- window.document.close();
- }
- // Firefox/Mozilla in XHTML case don't support document.write()
-// window.location =
"data:"+req.getContentType()+";charset=utf-8," +
encodeURIComponent(req.getResponseText())
- // Use dom manipulation instead.
- var oDomDoc = (new DOMParser()).parseFromString(req.getResponseText(),
"application/xhtml+xml");
- var node = window.document.importNode(oDomDoc.documentElement, true);
- window.document.replaceChild(node,window.document.documentElement);
- // TODO - scripts reloading ?
- }
- },30);
+ A4J.AJAX.replacePage(req);
}
} catch(e){
LOG.error("Error redirect to new location ");
}
} else {
if(req.getParserStatus() == Sarissa.PARSED_OK){
+
+ // perform beforeupdate if exists
+ if(options.beforeupdate){
+ LOG.debug( "Call request beforeupdate function before replacing
elemements" );
+ options.beforeupdate(req, req.domEvt, req.getJSON('_ajax:data'));
+ }
+
var idsFromResponse = req.getResponseHeader("Ajax-Update-Ids");
// 3 strategy for replace :
// if setted affected parameters - replace its
@@ -646,16 +725,21 @@
LOG.warn("No information in response about elements to replace");
}
// Replace client-side hidden inputs for JSF View state.
- var idsSpan = req.getElementById("ajax-update-ids");
+ var idsSpan = req.getElementById("ajax-view-state");
LOG.debug("Hidden JSF state fields: "+idsSpan);
if(idsSpan != null){
- var inputs = window.document.getElementsByTagName("input");
+ // For a portal case, replace content in the current window only.
+ var namespace = options.parameters['org.ajax4jsf.portlet.NAMESPACE'];
+ LOG.debug("Namespace for hidden view-state input fields is
"+namespace);
+ var anchor =
namespace?window.document.getElementById(namespace):window.document;
+ var inputs = anchor.getElementsByTagName("input");
var newinputs = req.getElementsByTagName("input",idsSpan);
A4J.AJAX.replaceViewState(inputs,newinputs);
// For any cases, new state can be in uppercase element
newinputs = req.getElementsByTagName("INPUT",idsSpan);
A4J.AJAX.replaceViewState(inputs,newinputs);
}
+
// Process listeners.
for(var li = 0; li < A4J.AJAX._listeners.length; li++){
var listener = A4J.AJAX._listeners[li];
@@ -665,7 +749,31 @@
listener.onafterajax(req,req.domEvt,data);
}
}
-
+ // Set focus, if nessesary.
+ var focusId = req.getJSON("_A4J.AJAX.focus");
+ if(focusId){
+ LOG.debug("focus must be set to control "+focusId);
+ var focusElement=false;
+ if(req.form){
+ // Attempt to get form control for name. By Richfaces naming convensions,
+ // complex component must set clientId as DOM id for a root element ,
+ // and as input element name.
+ focusElement = req.form.elements[focusId];
+ }
+ if(!focusElement){
+ // If not found as control element, search in DOM.
+ LOG.debug("No control element "+focusId+" in submitted
form");
+ focusElement = document.getElementById(focusId);
+ }
+ if(focusElement){
+ LOG.debug("Set focus to control ");
+ focusElement.focus();
+ } else {
+ LOG.warn("Element for set focus not found");
+ }
+ } else {
+ LOG.debug("No focus information in response");
+ }
} else {
// No response XML
LOG.error( "Error parsing XML" );
@@ -674,15 +782,71 @@
}
};
-A4J.AJAX.onExpired = function(loc,expiredMsg){
- if(window.confirm(expiredMsg)){
- return loc;
- } else {
- return undefined;
- }
-};
+A4J.AJAX.replacePage = function(req){
+ LOG.debug("replace all page content with response");
+ var isIE = _SARISSA_IS_IE;
+ // maksimkaszynski
+ //Prevent "Permission denied in IE7"
+ //Reset calling principal
+ var oldDocOpen = window.document.open;
+ if (isIE) {
+ LOG.debug("setup custom document.open method");
+ window.document.open = function() {
+ oldDocOpen.apply(this, arguments);
+ }
+ }
+ // /maksimkaszynski
+ window.setTimeout(function() {
+ var isDocOpen=false;
+ try {
+ window.document.open(req.getContentType(),true);
+ LOG.debug("window.document has opened for writing");
+ isDocOpen=true;
+ window.document.write(req.getResponseText());
+ LOG.debug("window.document has been writed");
+ window.document.close();
+ LOG.debug("window.document has been closed for writing");
+ if(isIE){
+ // For Ie , scripts on page not activated.
+ window.location.reload(false);
+ }
+ } catch(e) {
+ LOG.debug("exception during write page content "+e.Message);
+ if(isDocOpen){
+ window.document.close();
+ }
+ // Firefox/Mozilla in XHTML case don't support document.write()
+ // Use dom manipulation instead.
+ var oDomDoc = (new DOMParser()).parseFromString(req.getResponseText(),
"text/xml");
+ if(Sarissa.getParseErrorText(oDomDoc) == Sarissa.PARSED_OK){
+ LOG.debug("response has parsed as DOM documnet.");
+ if (typeof Event != "undefined") {
+ Event.unloadElementsCache();
+ }
+
+ Sarissa.clearChildNodes(window.document.documentElement);
+ var docNodes = oDomDoc.documentElement.childNodes;
+ for(var i = 0;i<docNodes.length;i++){
+ if(docNodes[i].nodeType == 1){
+ LOG.debug("append new node in document");
+ var node = window.document.importNode(docNodes[i], true);
+ window.document.documentElement.appendChild(node);
+ }
+ }
+ } else {
+ LOG.error("Error parsing
response",Sarissa.getParseErrorText(oDomDoc));
+ }
+ // TODO - scripts reloading ?
+ } finally {
+ window.document.open = oldDocOpen;
+ }
+ LOG.debug("page content has been replaced");
+ },30);
+}
+
+
A4J.AJAX.replaceViewState = function(inputs,newinputs){
LOG.debug("Replace value for inputs: "+inputs.length + " by
new values: "+ newinputs.length);
if( (newinputs.length > 0) && (inputs.length > 0) ){
@@ -703,18 +867,45 @@
/**
*
*/
-A4J.AJAX.finishRequest = function(req){
- var options = req.options;
- // mark status object ( if any ) for complete request ;
- A4J.AJAX.status(req.containerId,options.status,false);
+A4J.AJAX.finishRequest = function(request){
+ var options = request.options;
+ // Remove unload prototype events for a removed elements.
+ if ((typeof Event != "undefined") && (typeof
Event.unloadElementsCache == "function")) {
+ Event.unloadElementsCache();
+ }
+
// we can set listener for complete request - for example,
// it can shedule next request for update page.
- if(options.oncomplete){
+ var oncomplete = request.getElementById('org.ajax4jsf.oncomplete');
+ if(oncomplete) {
LOG.debug( "Call request oncomplete function after processing updates"
);
window.setTimeout(function(){
- options.oncomplete(req,req.domEvt,req.getJSON('_ajax:data'));},
- 50);
+ var event = request.domEvt;
+ var data = request.getJSON('_ajax:data');
+ try {
+ var newscript = Sarissa.getText(oncomplete,true);
+ if (window.execScript) {
+ window.execScript( newscript );
+ } else {
+ window.eval(newscript);
+ }
+ } catch(e){
+ LOG.error('Error evaluate oncomplete function '+e.Message);
+ }
+// mark status object ( if any ) for complete request ;
+ A4J.AJAX.status(request.containerId,options.status,false);},
+ 10);
+ } else if(options.oncomplete){
+ LOG.debug( "Call component oncomplete function after processing updates"
);
+ window.setTimeout(function(){
+
options.oncomplete(request,request.domEvt,request.getJSON('_ajax:data'));
+ // mark status object ( if any ) for complete request ;
+ A4J.AJAX.status(request.containerId,options.status,false);},
+ 10);
+ } else {
+ // mark status object ( if any ) for complete request ;
+ A4J.AJAX.status(request.containerId,options.status,false);
}
// If we have events in queue - send next request.
if(options.eventsQueue){
@@ -728,6 +919,20 @@
}
}
};
+
+A4J.AJAX.getCursorPos = function(inp){
+
+ if(inp.selectionEnd != null)
+ return inp.selectionEnd;
+
+ // IE specific code
+ var range = document.selection.createRange();
+ var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
+ if (!isCollapsed)
+ range.collapse(false);
+ var b = range.getBookmark();
+ return b.charCodeAt(2) - 2;
+ }
// Locate enclosing form for object.
A4J.AJAX.locateForm = function(obj){
@@ -739,6 +944,18 @@
return parent;
};
+
+A4J.AJAX.getElementById = function(id,options){
+ var namespace = options['org.ajax4jsf.portlet.NAMESPACE'];
+ var anchor = namespace?window.document.getElementById(namespace):window.document;
+ var element;
+ if(anchor){
+ element = anchor.getElementById(id);
+ } else {
+ LOG.error("No root element for portlet namespace "+namespace+" on
page");
+ }
+ return element;
+}
// hash for requests count for all ID's
A4J.AJAX._requestsCounts = {};
@@ -752,15 +969,25 @@
targetID = targetID || regionID +":status";
A4J.AJAX._requestsCounts[targetID]=(A4J.AJAX._requestsCounts[targetID]||0)+(start?1:-1);
if(A4J.AJAX._requestsCounts[targetID]>0){
- elem = document.getElementById(targetID+".start");
- if(elem){elem.style.display="";}
elem = document.getElementById(targetID+".stop");
if(elem){elem.style.display="none";}
+ elem = document.getElementById(targetID+".start");
+ if(elem){
+ elem.style.display="";
+ if(typeof(elem.onstart) == 'function'){
+ elem.onstart();
+ }
+ }
}else{
elem = document.getElementById(targetID+".start");
if(elem){elem.style.display="none";}
elem = document.getElementById(targetID+".stop");
- if(elem){elem.style.display="";}
+ if(elem){
+ elem.style.display="";
+ if(typeof(elem.onstop) == 'function'){
+ elem.onstop();
+ }
+ }
}
} catch(e){
LOG.error("Exception on status change: ");
@@ -991,12 +1218,15 @@
_value_query : function(control){
- this.appendParameter(control.name, control.value);
+ LOG.debug("Append "+control.type+" control "+control.name+"
with value ["+control.value+"] and value attribute
["+control.getAttribute('value')+"]");
+ if(null != control.value){
+ this.appendParameter(control.name, control.value);
+ }
},
_check_query : function(control){
if( control.checked ) {
- this.appendParameter(control.name, control.value?control.value:"on");
+ this.appendParameter(control.name, control.value?control.value:"on");
}
},
@@ -1049,6 +1279,3 @@
} catch(e){ /* Mozilla in XHTML mode not have innerHTML */ };
},50);
}
-//})();
-
-
Added: branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/epilog.js
===================================================================
--- branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/epilog.js
(rev 0)
+++ branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/epilog.js 2007-09-06 18:08:39
UTC (rev 316)
@@ -0,0 +1,4 @@
+/*
+* final trail for ajax jsf library
+*/
+// }
\ No newline at end of file
Modified: branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/log4ajax.js
===================================================================
--- branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/log4ajax.js 2007-08-16
16:27:56 UTC (rev 315)
+++ branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/log4ajax.js 2007-09-06
18:08:39 UTC (rev 316)
@@ -30,7 +30,7 @@
LOG.LEVEL = LOG.OFF;
-LOG.window = null;
+LOG._window = null;
LOG.transmitToServer = true;
LOG.consoleDivId = "logConsole";
LOG.styles = {
@@ -73,29 +73,33 @@
}
LOG.registerPopup = function(hotkey,name,width,height,level){
- if(!LOG._onKeyUp){
- LOG._onKeyUp = document.onkeyup;
+ if(!LOG._onkeydown){
+ LOG._onkeydown = document.onkeydown;
}
var key = hotkey.toUpperCase();
- document.onkeyup = function(e){
+ document.onkeydown = function(e){
if (window.event){ e = window.event;};
- if (String.fromCharCode(e.keyCode) == key & e.shiftKey & e.ctrlKey){
- LOG.LEVEL = level;
+ if (String.fromCharCode(e.keyCode) == key & e.shiftKey & e.ctrlKey){
+ if(level){
+ LOG.LEVEL = level;
+ } else {
+ LOG.LEVEL = LOG.ALL;
+ }
LOG.openWindow(name,'width='+width+',height='+height+',toolbar=no,scrollbars=yes,location=no,statusbar=no,menubar=no,resizable=yes,left
= '+((screen.width - width) / 2)+',top ='+((screen.height - height) / 2));
} else {
- if(LOG._onKeyUp) LOG._onKeyUp(e);
+ if(LOG._onkeydown) LOG._onkeydown(e);
};
}
}
LOG.openWindow = function(name,features){
- if(LOG.window){
- LOG.window.focus();
+ if(LOG._window){
+ LOG._window.focus();
} else {
- LOG.window = window.open("",name,features);
+ LOG._window = window.open("",name,features);
var _LOG = LOG;
- LOG.window.onunload = function(){
- _LOG.window = null;
+ LOG._window.onunload = function(){
+ _LOG._window = null;
_LOG.LEVEL = _LOG.OFF;
_LOG=undefined;
}
@@ -139,9 +143,9 @@
{
var consoleDiv ;
var doc;
- if(LOG.window && LOG.window.document){
- doc = LOG.window.document;
- consoleDiv = LOG.window.document.body;
+ if(LOG._window && LOG._window.document){
+ doc = LOG._window.document;
+ consoleDiv = LOG._window.document.body;
} else {
doc = window.document;
consoleDiv = window.document.getElementById(LOG.consoleDivId);
Added: branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/prolog.js
===================================================================
--- branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/prolog.js
(rev 0)
+++ branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/prolog.js 2007-09-06 18:08:39
UTC (rev 316)
@@ -0,0 +1,6 @@
+/*
+ * Prolog for created Ajax4Jsf library
+ */
+if (!window.A4J) { window.A4J= {};}
+
+//if(window.A4J.AJAX && window.A4J.AJAX.XMLHttpRequest) return;
Modified: branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/sarissa.js
===================================================================
--- branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/sarissa.js 2007-08-16 16:27:56
UTC (rev 315)
+++ branches/version_1_0_7/src/framework/JavaScript/ajaxjsf/sarissa.js 2007-09-06 18:08:39
UTC (rev 316)
@@ -1,653 +1,664 @@
-/**
- * ====================================================================
- * About
- * ====================================================================
- * 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+), Konqueror, Safari and a little of Opera
- * @version 0.9.7.6
- * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net
- * ====================================================================
- * Licence
- * ====================================================================
- * Sarissa is free software distributed under the GNU GPL version 2 (see <a
href="gpl.txt">gpl.txt</a>) or higher,
- * GNU LGPL version 2.1 (see <a href="lgpl.txt">lgpl.txt</a>) or
higher and Apache Software License 2.0 or higher
- * (see <a href="asl.txt">asl.txt</a>). This means you can choose
one of the three and use that if you like. If
- * you make modifications under the ASL, i would appreciate it if you submitted those.
- * In case your copy of Sarissa does not include the license texts, you may find
- * them online in various formats at <a
href="http://www.gnu.org">http://www.gnu.org</a> and
- * <a href="http://www.apache.org">http://www.apache.org</a>.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
- * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
- * WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE
- * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-/**
- * <p>Sarissa is a utility class. Provides "static" methods for
DOMDocument,
- * DOM Node serialization to XML strings and other utility goodies.</p>
- * @constructor
- */
-function Sarissa(){};
-Sarissa.PARSED_OK = "Document contains no parsing errors";
-Sarissa.PARSED_EMPTY = "Document is empty";
-Sarissa.PARSED_UNKNOWN_ERROR = "Not well-formed or other error";
-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 && navigator.vendor &&
(navigator.userAgent.toLowerCase().indexOf("applewebkit") != -1 ||
navigator.vendor.indexOf("Apple") != -1));
-var _SARISSA_IS_IE = document.all && window.ActiveXObject &&
navigator.userAgent.toLowerCase().indexOf("msie") > -1 &&
navigator.userAgent.toLowerCase().indexOf("opera") == -1;
-if(!window.Node || !Node.ELEMENT_NODE){
- 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};
-};
-
-if(typeof XMLDocument == "undefined" && typeof Document
!="undefined"){ XMLDocument = Document; }
-
-// 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 = "";
- var _SARISSA_DOM_XMLWRITER = "";
- /**
- * Called when the Sarissa_xx.js file is parsed, to pick most recent
- * ProgIDs for IE, then gets destroyed.
- * @private
- * @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
- */
- Sarissa.pickRecentProgID = function (idList){
- // 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;
- }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 = null;
- _SARISSA_THREADEDDOM_PROGID = null;
- _SARISSA_XSLTEMPLATE_PROGID = null;
- _SARISSA_XMLHTTP_PROGID = null;
- if(!window.XMLHttpRequest){
- /**
- * Emulate XMLHttpRequest
- * @constructor
- */
- XMLHttpRequest = function() {
- if(!_SARISSA_XMLHTTP_PROGID){
- _SARISSA_XMLHTTP_PROGID =
Sarissa.pickRecentProgID(["Msxml2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]);
- };
- return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);
- };
- };
- // we dont need this anymore
- //============================================
- // Factory methods (IE)
- //============================================
- // see non-IE version
- Sarissa.getDomDocument = function(sUri, sName){
- if(!_SARISSA_DOM_PROGID){
- _SARISSA_DOM_PROGID =
Sarissa.pickRecentProgID(["Msxml2.DOMDocument.6.0",
"Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument",
"MSXML.DOMDocument", "Microsoft.XMLDOM"]);
- };
- 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){
- // create an artifical namespace prefix
- // or reuse existing prefix if applicable
- var prefix = "";
- if(sUri){
- if(sName.indexOf(":") > 1){
- prefix = sName.substring(0, sName.indexOf(":"));
- sName = sName.substring(sName.indexOf(":")+1);
- }else{
- prefix = "a" + (_sarissa_iNsCounter++);
- };
- };
- // use namespaces if a namespace URI exists
- if(sUri){
- oDoc.loadXML('<' + prefix+':'+sName + "
xmlns:" + prefix + "=\"" + sUri + "\"" + "
/>");
- } else {
- oDoc.loadXML('<' + sName + " />");
- };
- };
- return oDoc;
- };
- // see non-IE version
- Sarissa.getParseErrorText = function (oDoc) {
- var parseErrorText = Sarissa.PARSED_OK;
- if(oDoc.parseError.errorCode != 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";
- }
- else if(oDoc.documentElement == null){
- parseErrorText = Sarissa.PARSED_EMPTY;
- };
- 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(){
- if(!_SARISSA_XSLTEMPLATE_PROGID){
- _SARISSA_XSLTEMPLATE_PROGID =
Sarissa.pickRecentProgID(["Msxml2.XSLTemplate.6.0",
"MSXML2.XSLTemplate.3.0"]);
- };
- this.template = new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);
- this.processor = null;
- };
- /**
- * Imports the given XSLT DOM and compiles it to a reusable transform
- * <b>Note:</b> If the stylesheet was loaded from a URL and contains
xsl:import or xsl:include elements,it will be reloaded to resolve those
- * @argument xslDoc The XSLT DOMDocument to import
- */
- XSLTProcessor.prototype.importStylesheet = function(xslDoc){
- if(!_SARISSA_THREADEDDOM_PROGID){
- _SARISSA_THREADEDDOM_PROGID =
Sarissa.pickRecentProgID(["MSXML2.FreeThreadedDOMDocument.6.0",
"MSXML2.FreeThreadedDOMDocument.3.0"]);
- };
- xslDoc.setProperty("SelectionLanguage", "XPath");
- xslDoc.setProperty("SelectionNamespaces",
"xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");
- // convert stylesheet to free threaded
- var converted = new ActiveXObject(_SARISSA_THREADEDDOM_PROGID);
- // make included/imported stylesheets work if exist and xsl was originally loaded
from url
- if(xslDoc.url && xslDoc.selectSingleNode("//xsl:*[local-name() =
'import' or local-name() = 'include']") != null){
- converted.async = false;
- if (_SARISSA_THREADEDDOM_PROGID ==
"MSXML2.FreeThreadedDOMDocument.6.0") {
- converted.setProperty("AllowDocumentFunction", true);
- converted.resolveExternals = true;
- }
- converted.load(xslDoc.url);
- } else {
- converted.loadXML(xslDoc.xml);
- };
- converted.setProperty("SelectionNamespaces",
"xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");
- var output = converted.selectSingleNode("//xsl:output");
- this.outputMethod = output ? output.getAttribute("method") :
"html";
- this.template.stylesheet = converted;
- this.processor = this.template.createProcessor();
- // for getParameter and clearParameters
- this.paramsSet = new Array();
- };
-
- /**
- * Transform the given XML DOM and return the transformation result as a new DOM
document
- * @argument sourceDoc The XML DOMDocument to transform
- * @return The transformation result as a DOM Document
- */
- XSLTProcessor.prototype.transformToDocument = function(sourceDoc){
- // fix for bug 1549749
- if(_SARISSA_THREADEDDOM_PROGID){
- this.processor.input=sourceDoc;
- var outDoc=new ActiveXObject(_SARISSA_DOM_PROGID);
- this.processor.output=outDoc;
- this.processor.transform();
- return outDoc;
- }
- else{
- if(!_SARISSA_DOM_XMLWRITER){
- _SARISSA_DOM_XMLWRITER =
Sarissa.pickRecentProgID(["Msxml2.MXXMLWriter.6.0",
"Msxml2.MXXMLWriter.3.0", "MSXML2.MXXMLWriter",
"MSXML.MXXMLWriter", "Microsoft.XMLDOM"]);
- };
- this.processor.input = sourceDoc;
- var outDoc = new ActiveXObject(_SARISSA_DOM_XMLWRITER);
- this.processor.output = outDoc;
- this.processor.transform();
- var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
- oDoc.loadXML(outDoc.output+"");
- return oDoc;
- };
- };
-
- /**
- * Transform the given XML DOM and return the transformation result as a new DOM
fragment.
- * <b>Note</b>: The xsl:output method must match the nature of the owner
document (XML/HTML).
- * @argument sourceDoc The XML DOMDocument to transform
- * @argument ownerDoc The owner of the result fragment
- * @return The transformation result as a DOM Document
- */
- XSLTProcessor.prototype.transformToFragment = function (sourceDoc, ownerDoc) {
- this.processor.input = sourceDoc;
- this.processor.transform();
- var s = this.processor.output;
- var f = ownerDoc.createDocumentFragment();
- if (this.outputMethod == 'text') {
- f.appendChild(ownerDoc.createTextNode(s));
- } else if (ownerDoc.body && ownerDoc.body.innerHTML) {
- var container = ownerDoc.createElement('div');
- container.innerHTML = s;
- while (container.hasChildNodes()) {
- f.appendChild(container.firstChild);
- }
- }
- else {
- var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
- if (s.substring(0, 5) == '<?xml') {
- s = s.substring(s.indexOf('?>') + 2);
- }
- var xml = ''.concat('<my>', s, '</my>');
- oDoc.loadXML(xml);
- var container = oDoc.documentElement;
- while (container.hasChildNodes()) {
- f.appendChild(container.firstChild);
- }
- }
- return f;
- };
-
- /**
- * 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){
- nsURI = nsURI || "";
- if(this.paramsSet[nsURI] && this.paramsSet[nsURI][name]){
- return this.paramsSet[nsURI][name];
- }else{
- return null;
- };
- };
- /**
- * Clear parameters (set them to default values as defined in the stylesheet itself)
- */
- XSLTProcessor.prototype.clearParameters = function(){
- for(var nsURI in this.paramsSet){
- for(var name in this.paramsSet[nsURI]){
- if(nsURI){
- this.processor.addParameter(name, null, nsURI);
- }else{
- this.processor.addParameter(name, null);
- };
- };
- };
- this.paramsSet = new Array();
- };
-}else{ /* end IE initialization, try to deal with real browsers now ;-) */
- if(_SARISSA_HAS_DOM_CREATE_DOCUMENT){
- /**
- * <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){
- 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;
- oDoc.readystate = iReadyState;
- if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange
== "function")
- oDoc.onreadystatechange();
- };
- Sarissa.getDomDocument = function(sUri, sName){
- var oDoc = document.implementation.createDocument(sUri?sUri:null,
sName?sName:null, null);
- if(!oDoc.onreadystatechange){
-
- /**
- * <p>Emulate IE's onreadystatechange attribute</p>
- */
- oDoc.onreadystatechange = null;
- };
- if(!oDoc.readyState){
- /**
- * <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>
- */
- oDoc.readyState = 0;
- };
- oDoc.addEventListener("load", _sarissa_XMLDocument_onload, false);
- return oDoc;
- };
- if(window.XMLDocument){
- // do nothing
- }// TODO: check if the new document has content before trying to copynodes, check
for error handling in DOM 3 LS
- else if(_SARISSA_HAS_DOM_FEATURE && window.Document &&
!Document.prototype.load && document.implementation.hasFeature('LS',
'3.0')){
- //Opera 9 may get the XPath branch which gives creates XMLDocument, therefore
it doesn't reach here which is good
- /**
- * <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:null,
sName?sName:null, null);
- return oDoc;
- };
- }
- else {
- Sarissa.getDomDocument = function(sUri, sName){
- var oDoc = document.implementation.createDocument(sUri?sUri:null,
sName?sName:null, null);
- // looks like safari does not create the root element for some unknown
reason
- if(oDoc && (sUri || sName) && !oDoc.documentElement){
- oDoc.appendChild(oDoc.createElementNS(sUri, sName));
- };
- return oDoc;
- };
- };
- };//if(_SARISSA_HAS_DOM_CREATE_DOCUMENT)
-};
-//==========================================
-// Common stuff
-//==========================================
-if(!window.DOMParser){
- if(_SARISSA_IS_SAFARI){
- /*
- * 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 xmlhttp = new XMLHttpRequest();
- xmlhttp.open("GET", "data:text/xml;charset=utf-8," +
encodeURIComponent(sXml), false);
- xmlhttp.send(null);
- return xmlhttp.responseXML;
- };
- }else if(Sarissa.getDomDocument && Sarissa.getDomDocument() &&
Sarissa.getDomDocument(null, "bar").xml){
- DOMParser = function() { };
- DOMParser.prototype.parseFromString = function(sXml, contentType){
- var doc = Sarissa.getDomDocument();
- doc.loadXML(sXml);
- return doc;
- };
- };
-};
-
-if((typeof(document.importNode) == "undefined") && _SARISSA_IS_IE){
- try{
- /**
- * Implementation of importNode for the context window document in IE
- * @param oNode the Node to import
- * @param bChildren whether to include the children of oNode
- * @returns the imported node for further use
- */
- document.importNode = function(oNode, bChildren){
- var tmp;
- if(oNode.nodeName == "tbody" || oNode.nodeName == "tr"){
- tmp = document.createElement("table");
- }
- else if(oNode.nodeName == "td"){
- tmp = document.createElement("tr");
- }
- else if(oNode.nodeName == "option"){
- tmp = document.createElement("select");
- }
- else{
- tmp = document.createElement("div");
- };
- if(bChildren){
- tmp.innerHTML = oNode.xml ? oNode.xml : oNode.outerHTML;
- }else{
- tmp.innerHTML = oNode.xml ? oNode.cloneNode(false).xml :
oNode.cloneNode(false).outerHTML;
- };
- return tmp.getElementsByTagName("*")[0];
- };
- }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 <pre>
- * 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.documentElement){
- parseErrorText = Sarissa.PARSED_EMPTY;
- } else if(oDoc.documentElement.tagName == "parsererror"){
- parseErrorText = oDoc.documentElement.firstChild.data;
- parseErrorText += "\n" +
oDoc.documentElement.firstChild.nextSibling.firstChild.data;
- } else if(oDoc.getElementsByTagName("parsererror").length > 0){
- var parsererror = oDoc.getElementsByTagName("parsererror")[0];
- parseErrorText = Sarissa.getText(parsererror, true)+"\n";
- } else if(oDoc.parseError && oDoc.parseError.errorCode != 0){
- parseErrorText = Sarissa.PARSED_UNKNOWN_ERROR;
- };
- 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
- && Sarissa.getDomDocument
- && Sarissa.getDomDocument("","foo", null).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) {
- // need to check for firstChild due to opera 8 bug with hasChildNodes
- while(oNode.firstChild) {
- 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((!nodeFrom) || (!nodeTo)){
- throw "Both source and destination nodes must be provided";
- };
- if(!bPreserveExisting){
- Sarissa.clearChildNodes(nodeTo);
- };
- var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo :
nodeTo.ownerDocument;
- var nodes = nodeFrom.childNodes;
- if(typeof(ownerDoc.importNode) != "undefined") {
- 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
- */
-Sarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {
- if((!nodeFrom) || (!nodeTo)){
- throw "Both source and destination nodes must be provided";
- };
- 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){
- while(nodeFrom.firstChild){
- nodeTo.appendChild(nodeFrom.firstChild);
- };
- } else {
- var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo :
nodeTo.ownerDocument;
- if(typeof(ownerDoc.importNode) != "undefined") {
- 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, "&")
- .replace(/</g, "<")
- .replace(/>/g, ">")
- .replace(/"/g, """)
- .replace(/'/g, "'");
-};
-
-/**
- * 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(/'/g,"'")
- .replace(/"/g,"\"")
- .replace(/>/g,">")
- .replace(/</g,"<")
- .replace(/&/g,"&");
-};
-// EOF
+/**
+ * ====================================================================
+ * About
+ * ====================================================================
+ * 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+), Konqueror, Safari and a little of Opera
+ * @version ${project.version}
+ * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net
+ * ====================================================================
+ * Licence
+ * ====================================================================
+ * Sarissa is free software distributed under the GNU GPL version 2 (see <a
href="gpl.txt">gpl.txt</a>) or higher,
+ * GNU LGPL version 2.1 (see <a href="lgpl.txt">lgpl.txt</a>) or
higher and Apache Software License 2.0 or higher
+ * (see <a href="asl.txt">asl.txt</a>). This means you can choose
one of the three and use that if you like. If
+ * you make modifications under the ASL, i would appreciate it if you submitted those.
+ * In case your copy of Sarissa does not include the license texts, you may find
+ * them online in various formats at <a
href="http://www.gnu.org">http://www.gnu.org</a> and
+ * <a href="http://www.apache.org">http://www.apache.org</a>.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+ * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE
+ * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/**
+ * <p>Sarissa is a utility class. Provides "static" methods for
DOMDocument,
+ * DOM Node serialization to XML strings and other utility goodies.</p>
+ * @constructor
+ */
+function Sarissa(){};
+Sarissa.VERSION = "${project.version}";
+Sarissa.PARSED_OK = "Document contains no parsing errors";
+Sarissa.PARSED_EMPTY = "Document is empty";
+Sarissa.PARSED_UNKNOWN_ERROR = "Not well-formed or other error";
+Sarissa.IS_ENABLED_TRANSFORM_NODE = 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 && navigator.vendor &&
(navigator.userAgent.toLowerCase().indexOf("applewebkit") != -1 ||
navigator.vendor.indexOf("Apple") != -1));
+var _SARISSA_IS_IE = document.all && window.ActiveXObject &&
navigator.userAgent.toLowerCase().indexOf("msie") > -1 &&
navigator.userAgent.toLowerCase().indexOf("opera") == -1;
+if(!window.Node || !Node.ELEMENT_NODE){
+ 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};
+};
+
+if(typeof XMLDocument == "undefined" && typeof Document
!="undefined"){ XMLDocument = Document; }
+
+// 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 = "";
+ var _SARISSA_DOM_XMLWRITER = "";
+ /**
+ * Called when the Sarissa_xx.js file is parsed, to pick most recent
+ * ProgIDs for IE, then gets destroyed.
+ * @private
+ * @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
+ */
+ Sarissa.pickRecentProgID = function (idList){
+ // 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;
+ }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 = null;
+ _SARISSA_THREADEDDOM_PROGID = null;
+ _SARISSA_XSLTEMPLATE_PROGID = null;
+ _SARISSA_XMLHTTP_PROGID = null;
+ if(!window.XMLHttpRequest){
+ /**
+ * Emulate XMLHttpRequest
+ * @constructor
+ */
+ XMLHttpRequest = function() {
+ if(!_SARISSA_XMLHTTP_PROGID){
+ _SARISSA_XMLHTTP_PROGID =
Sarissa.pickRecentProgID(["Msxml2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]);
+ };
+ return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);
+ };
+ };
+ // we dont need this anymore
+ //============================================
+ // Factory methods (IE)
+ //============================================
+ // see non-IE version
+ Sarissa.getDomDocument = function(sUri, sName){
+ if(!_SARISSA_DOM_PROGID){
+ _SARISSA_DOM_PROGID =
Sarissa.pickRecentProgID(["Msxml2.DOMDocument.6.0",
"Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument",
"MSXML.DOMDocument", "Microsoft.XMLDOM"]);
+ };
+ 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){
+ // create an artifical namespace prefix
+ // or reuse existing prefix if applicable
+ var prefix = "";
+ if(sUri){
+ if(sName.indexOf(":") > 1){
+ prefix = sName.substring(0, sName.indexOf(":"));
+ sName = sName.substring(sName.indexOf(":")+1);
+ }else{
+ prefix = "a" + (_sarissa_iNsCounter++);
+ };
+ };
+ // use namespaces if a namespace URI exists
+ if(sUri){
+ oDoc.loadXML('<' + prefix+':'+sName + "
xmlns:" + prefix + "=\"" + sUri + "\"" + "
/>");
+ } else {
+ oDoc.loadXML('<' + sName + " />");
+ };
+ };
+ return oDoc;
+ };
+ // see non-IE version
+ Sarissa.getParseErrorText = function (oDoc) {
+ var parseErrorText = Sarissa.PARSED_OK;
+ if(oDoc && oDoc.parseError && oDoc.parseError.errorCode
&& oDoc.parseError.errorCode != 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";
+ }
+ else if(oDoc.documentElement == null){
+ parseErrorText = Sarissa.PARSED_EMPTY;
+ };
+ 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(){
+ if(!_SARISSA_XSLTEMPLATE_PROGID){
+ _SARISSA_XSLTEMPLATE_PROGID =
Sarissa.pickRecentProgID(["Msxml2.XSLTemplate.6.0",
"MSXML2.XSLTemplate.3.0"]);
+ };
+ this.template = new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);
+ this.processor = null;
+ };
+ /**
+ * Imports the given XSLT DOM and compiles it to a reusable transform
+ * <b>Note:</b> If the stylesheet was loaded from a URL and contains
xsl:import or xsl:include elements,it will be reloaded to resolve those
+ * @argument xslDoc The XSLT DOMDocument to import
+ */
+ XSLTProcessor.prototype.importStylesheet = function(xslDoc){
+ if(!_SARISSA_THREADEDDOM_PROGID){
+ _SARISSA_THREADEDDOM_PROGID =
Sarissa.pickRecentProgID(["MSXML2.FreeThreadedDOMDocument.6.0",
"MSXML2.FreeThreadedDOMDocument.3.0"]);
+ };
+ xslDoc.setProperty("SelectionLanguage", "XPath");
+ xslDoc.setProperty("SelectionNamespaces",
"xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");
+ // convert stylesheet to free threaded
+ var converted = new ActiveXObject(_SARISSA_THREADEDDOM_PROGID);
+ // make included/imported stylesheets work if exist and xsl was originally loaded
from url
+ if(xslDoc.url && xslDoc.selectSingleNode("//xsl:*[local-name() =
'import' or local-name() = 'include']") != null){
+ converted.async = false;
+ if (_SARISSA_THREADEDDOM_PROGID ==
"MSXML2.FreeThreadedDOMDocument.6.0") {
+ converted.setProperty("AllowDocumentFunction", true);
+ converted.resolveExternals = true;
+ }
+ converted.load(xslDoc.url);
+ } else {
+ converted.loadXML(xslDoc.xml);
+ };
+ converted.setProperty("SelectionNamespaces",
"xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");
+ var output = converted.selectSingleNode("//xsl:output");
+ this.outputMethod = output ? output.getAttribute("method") :
"html";
+ this.template.stylesheet = converted;
+ this.processor = this.template.createProcessor();
+ // for getParameter and clearParameters
+ this.paramsSet = new Array();
+ };
+
+ /**
+ * Transform the given XML DOM and return the transformation result as a new DOM
document
+ * @argument sourceDoc The XML DOMDocument to transform
+ * @return The transformation result as a DOM Document
+ */
+ XSLTProcessor.prototype.transformToDocument = function(sourceDoc){
+ // fix for bug 1549749
+ if(_SARISSA_THREADEDDOM_PROGID){
+ this.processor.input=sourceDoc;
+ var outDoc=new ActiveXObject(_SARISSA_DOM_PROGID);
+ this.processor.output=outDoc;
+ this.processor.transform();
+ return outDoc;
+ }
+ else{
+ if(!_SARISSA_DOM_XMLWRITER){
+ _SARISSA_DOM_XMLWRITER =
Sarissa.pickRecentProgID(["Msxml2.MXXMLWriter.6.0",
"Msxml2.MXXMLWriter.3.0", "MSXML2.MXXMLWriter",
"MSXML.MXXMLWriter", "Microsoft.XMLDOM"]);
+ };
+ this.processor.input = sourceDoc;
+ var outDoc = new ActiveXObject(_SARISSA_DOM_XMLWRITER);
+ this.processor.output = outDoc;
+ this.processor.transform();
+ var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
+ oDoc.loadXML(outDoc.output+"");
+ return oDoc;
+ };
+ };
+
+ /**
+ * Transform the given XML DOM and return the transformation result as a new DOM
fragment.
+ * <b>Note</b>: The xsl:output method must match the nature of the owner
document (XML/HTML).
+ * @argument sourceDoc The XML DOMDocument to transform
+ * @argument ownerDoc The owner of the result fragment
+ * @return The transformation result as a DOM Document
+ */
+ XSLTProcessor.prototype.transformToFragment = function (sourceDoc, ownerDoc) {
+ this.processor.input = sourceDoc;
+ this.processor.transform();
+ var s = this.processor.output;
+ var f = ownerDoc.createDocumentFragment();
+ if (this.outputMethod == 'text') {
+ f.appendChild(ownerDoc.createTextNode(s));
+ } else if (ownerDoc.body && ownerDoc.body.innerHTML) {
+ var container = ownerDoc.createElement('div');
+ container.innerHTML = s;
+ while (container.hasChildNodes()) {
+ f.appendChild(container.firstChild);
+ }
+ }
+ else {
+ var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
+ if (s.substring(0, 5) == '<?xml') {
+ s = s.substring(s.indexOf('?>') + 2);
+ }
+ var xml = ''.concat('<my>', s, '</my>');
+ oDoc.loadXML(xml);
+ var container = oDoc.documentElement;
+ while (container.hasChildNodes()) {
+ f.appendChild(container.firstChild);
+ }
+ }
+ return f;
+ };
+
+ /**
+ * 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){
+ // make value a zero length string if null to allow clearing
+ value = value ? 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){
+ nsURI = "" + nsURI;
+ if(this.paramsSet[nsURI] && this.paramsSet[nsURI][name]){
+ return this.paramsSet[nsURI][name];
+ }else{
+ return null;
+ };
+ };
+ /**
+ * Clear parameters (set them to default values as defined in the stylesheet itself)
+ */
+ XSLTProcessor.prototype.clearParameters = function(){
+ for(var nsURI in this.paramsSet){
+ for(var name in this.paramsSet[nsURI]){
+ if(nsURI){
+ this.processor.addParameter(name, "", nsURI);
+ }else{
+ this.processor.addParameter(name, "");
+ };
+ };
+ };
+ this.paramsSet = new Array();
+ };
+}else{ /* end IE initialization, try to deal with real browsers now ;-) */
+ if(_SARISSA_HAS_DOM_CREATE_DOCUMENT){
+ /**
+ * <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){
+ 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;
+ oDoc.readystate = iReadyState;
+ if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange
== "function")
+ oDoc.onreadystatechange();
+ };
+ Sarissa.getDomDocument = function(sUri, sName){
+ var oDoc = document.implementation.createDocument(sUri?sUri:null,
sName?sName:null, null);
+ if(!oDoc.onreadystatechange){
+
+ /**
+ * <p>Emulate IE's onreadystatechange attribute</p>
+ */
+ oDoc.onreadystatechange = null;
+ };
+ if(!oDoc.readyState){
+ /**
+ * <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>
+ */
+ oDoc.readyState = 0;
+ };
+ oDoc.addEventListener("load", _sarissa_XMLDocument_onload, false);
+ return oDoc;
+ };
+ if(window.XMLDocument){
+ // do nothing
+ }// TODO: check if the new document has content before trying to copynodes, check
for error handling in DOM 3 LS
+ else if(_SARISSA_HAS_DOM_FEATURE && window.Document &&
!Document.prototype.load && document.implementation.hasFeature('LS',
'3.0')){
+ //Opera 9 may get the XPath branch which gives creates XMLDocument, therefore
it doesn't reach here which is good
+ /**
+ * <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:null,
sName?sName:null, null);
+ return oDoc;
+ };
+ }
+ else {
+ Sarissa.getDomDocument = function(sUri, sName){
+ var oDoc = document.implementation.createDocument(sUri?sUri:null,
sName?sName:null, null);
+ // looks like safari does not create the root element for some unknown
reason
+ if(oDoc && (sUri || sName) && !oDoc.documentElement){
+ oDoc.appendChild(oDoc.createElementNS(sUri, sName));
+ };
+ return oDoc;
+ };
+ };
+ };//if(_SARISSA_HAS_DOM_CREATE_DOCUMENT)
+};
+//==========================================
+// Common stuff
+//==========================================
+if(!window.DOMParser){
+ if(_SARISSA_IS_SAFARI){
+ /*
+ * 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 xmlhttp = new XMLHttpRequest();
+ xmlhttp.open("GET", "data:text/xml;charset=utf-8," +
encodeURIComponent(sXml), false);
+ xmlhttp.send(null);
+ return xmlhttp.responseXML;
+ };
+ }else if(Sarissa.getDomDocument && Sarissa.getDomDocument() &&
Sarissa.getDomDocument(null, "bar").xml){
+ DOMParser = function() { };
+ DOMParser.prototype.parseFromString = function(sXml, contentType){
+ var doc = Sarissa.getDomDocument();
+ doc.loadXML(sXml);
+ return doc;
+ };
+ };
+};
+
+if((typeof(document.importNode) == "undefined") && _SARISSA_IS_IE){
+ try{
+ /**
+ * Implementation of importNode for the context window document in IE.
+ * If <code>oNode</code> is a TextNode,
<code>bChildren</code> is ignored.
+ * @param oNode the Node to import
+ * @param bChildren whether to include the children of oNode
+ * @returns the imported node for further use
+ */
+ document.importNode = function(oNode, bChildren){
+ var tmp;
+ if (oNode.nodeName=='#text') {
+ return document.createTextElement(oNode.data);
+ }
+ else {
+ if(oNode.nodeName == "tbody" || oNode.nodeName ==
"tr"){
+ tmp = document.createElement("table");
+ }
+ else if(oNode.nodeName == "td"){
+ tmp = document.createElement("tr");
+ }
+ else if(oNode.nodeName == "option"){
+ tmp = document.createElement("select");
+ }
+ else{
+ tmp = document.createElement("div");
+ };
+ if(bChildren){
+ tmp.innerHTML = oNode.xml ? oNode.xml : oNode.outerHTML;
+ }else{
+ tmp.innerHTML = oNode.xml ? oNode.cloneNode(false).xml :
oNode.cloneNode(false).outerHTML;
+ };
+ return tmp.getElementsByTagName("*")[0];
+ };
+
+ };
+ }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 <pre>
+ * 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.documentElement){
+ parseErrorText = Sarissa.PARSED_EMPTY;
+ } else if(oDoc.documentElement.tagName == "parsererror"){
+ parseErrorText = oDoc.documentElement.firstChild.data;
+ parseErrorText += "\n" +
oDoc.documentElement.firstChild.nextSibling.firstChild.data;
+ } else if(oDoc.getElementsByTagName("parsererror").length > 0){
+ var parsererror = oDoc.getElementsByTagName("parsererror")[0];
+ parseErrorText = Sarissa.getText(parsererror, true)+"\n";
+ } else if(oDoc.parseError && oDoc.parseError.errorCode != 0){
+ parseErrorText = Sarissa.PARSED_UNKNOWN_ERROR;
+ };
+ 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
+ && Sarissa.getDomDocument
+ && Sarissa.getDomDocument("","foo", null).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) {
+ // need to check for firstChild due to opera 8 bug with hasChildNodes
+ while(oNode.firstChild) {
+ 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((!nodeFrom) || (!nodeTo)){
+ throw "Both source and destination nodes must be provided";
+ };
+ if(!bPreserveExisting){
+ Sarissa.clearChildNodes(nodeTo);
+ };
+ var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo :
nodeTo.ownerDocument;
+ var nodes = nodeFrom.childNodes;
+ if(typeof(ownerDoc.importNode) != "undefined") {
+ 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
+ */
+Sarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {
+ if((!nodeFrom) || (!nodeTo)){
+ throw "Both source and destination nodes must be provided";
+ };
+ 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){
+ while(nodeFrom.firstChild){
+ nodeTo.appendChild(nodeFrom.firstChild);
+ };
+ } else {
+ var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo :
nodeTo.ownerDocument;
+ if(typeof(ownerDoc.importNode) != "undefined") {
+ 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, "&")
+ .replace(/</g, "<")
+ .replace(/>/g, ">")
+ .replace(/"/g, """)
+ .replace(/'/g, "'");
+};
+
+/**
+ * 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(/'/g,"'")
+ .replace(/"/g,"\"")
+ .replace(/>/g,">")
+ .replace(/</g,"<")
+ .replace(/&/g,"&");
+};
+// EOF
Modified: branches/version_1_0_7/src/framework/JavaScript/build.xml
===================================================================
--- branches/version_1_0_7/src/framework/JavaScript/build.xml 2007-08-16 16:27:56 UTC (rev
315)
+++ branches/version_1_0_7/src/framework/JavaScript/build.xml 2007-09-06 18:08:39 UTC (rev
316)
@@ -45,7 +45,7 @@
</filelist>
- <filelist id="ajaxjsf" dir="ajaxjsf"
files="sarissa.js,JSFAJAX.js,log4ajax.js"></filelist>
+ <filelist id="ajaxjsf" dir="ajaxjsf"
files="prolog.js,sarissa.js,JSFAJAX.js,log4ajax.js,epilog.js"></filelist>
<!-- =================================
target: assemble
================================= -->
Modified:
branches/version_1_0_7/src/framework/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableXMLFilter.java
===================================================================
---
branches/version_1_0_7/src/framework/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableXMLFilter.java 2007-08-16
16:27:56 UTC (rev 315)
+++
branches/version_1_0_7/src/framework/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableXMLFilter.java 2007-09-06
18:08:39 UTC (rev 316)
@@ -135,6 +135,9 @@
private class NekoParserConfig extends ParserConfig {
protected HtmlParser createParser(String mime) {
+ if(log.isDebugEnabled()){
+ log.debug("Create NEKO xml parser for a mime "+mime);
+ }
NekkoParser parser;
try {
synchronized (_xhtmlParsersPool) {
@@ -172,7 +175,9 @@
private class TidyParserConfig extends ParserConfig {
protected HtmlParser createParser(String mime) {
- // TODO Auto-generated method stub
+ if(log.isDebugEnabled()){
+ log.debug("Create TIDY xml parser for a mime "+mime);
+ }
TidyParser tidyParser = new TidyParser(getTidyProperties());
tidyParser.setMoveElements(isForcexml());
tidyParser.setMime(mime);
@@ -184,6 +189,9 @@
private class PassParserConfig extends ParserConfig {
protected HtmlParser createParser(String mime) {
+ if(log.isDebugEnabled()){
+ log.debug("Create PASS xml parser for a mime "+mime);
+ }
return new FastHtmlParser();
}