// Constructor
_global.XMLSA=function ( watchXML ){
this.$xml = this.$root = this.$parent = new Object();
ASSetPropFlags(this,null,1,1);
if (watchXML != undefined) {this._parse.apply (this,arguments)};
}
// load
XMLSA.prototype.load= function(){
var loader = this._makeLoader(this);
arguments[0] = this._makeURL(arguments[0]);
loader.load.apply(loader,arguments);
}
// send
XMLSA.prototype.send= function(){
arguments[0] = this._makeURL(arguments[0]);
if(arguments.length==2) {
this.$root.send.apply(this.$root, arguments);
} else {
this.$root.sendAndLoad.apply(this.$root, arguments[0], new XML());
}
}
// toString
XMLSA.prototype.toString= function(){
return this.$xml.toString();
}
// sendAndLoad
XMLSA.prototype.sendAndLoad= function(host, target, method){
var loader = this._makeLoader(target);
this.$root.sendAndLoad(this._makeURL(host),loader,method);
}
// search
XMLSA.prototype.search = function(criteria, recursive){
XMLNode.prototype.$criteria = criteria;
arguments.shift();
var result = this._search.apply(this,arguments);
delete (XMLNode.prototype.$criteria);
return result;
}
//return a reference to XML
XMLSA.prototype.getXML= function(){
return this.$xml;
}
// return the value of the firstChild if its a textElement
XMLSA.prototype.getValue= function(){
return (this.$xml.firstChild.nodeType == 3 ? this.$xml.firstChild.nodeValue : undefined);
}
// set a textNode
XMLSA.prototype.setValue= function( text ){
// check if the node has a textElement?
if (this.$xml.firstChild.nodeType == undefined) {
// seems like we have to create one...
this.$xml.appendChild(new XML().createTextNode(text));
return true;
// else check if firstChild is a textElement and set it...
}else if (this.$xml.firstChild.nodeType == 3) {
this.$xml.firstChild.nodeValue = text;
return true; // retrun success on setValue
// seams like it ain't possible
} else {
return false; // retrun failed on setValue
}
}
//return the nodeName
XMLSA.prototype.getNodeName= function(){
return this.$xml.nodeName;
}
// append a child
XMLSA.prototype.appendChild= function(element){
if (element instanceof XML) {
element = element.firstChild;
}
this.$xml.appendChild (element);//XML
this._reParse ();//XMLSA
}
// return a XML object with cloneNode
XMLSA.prototype.cloneNode= function(rekursiv){
return this.$xml.cloneNode (rekursiv);//XML
}
// this one I added as it's sometimes simpler just want
// to add a new member...
XMLSA.prototype.appendElement= function(name,value,attribs){
var temp = new XML();
this.$xml.appendChild(temp.createElement(name));
if (value != null) {
this.$xml.lastChild.appendChild (temp.createTextNode(value));
}
if (typeof(attribs) == "object" ) {
// there is a bug in Flash MX so we got to do this...
// a direct assignment would add __proto__ and constructor
// to the attributes...
for (var key in attribs ) {
this.$xml.lastChild.attributes[key] = attribs[key];
}
}
this._reParse ();//XMLSA
}
// remove child by index
XMLSA.prototype.removeChildByIndex= function(name,idx){
this[name][idx].$xml.removeNode();
this[name].splice(idx,1);
}
// remove child by index
XMLSA.prototype.removeNode= function(){
this.$xml.removeNode();
this.$parent._reParse();
}
// insert before
XMLSA.prototype.insertBefore= function(node){
this.$parent.$xml.insertBefore (node,this.$xml);
this.$parent._reParse();
}
/*************************************************/
// Private
/*************************************************/
// Parser
// called by the constructor and by reParse
XMLSA.prototype._parse= function(node, parent){
this.$parent = parent;
// make shure we work with XMLNode
if (node instanceof XML) {
this.$version = "XMLSA 1.4";
this.$root = node;
node = node.firstChild;
} else {
this.$root = this.$parent.$root;
}
// store a reference to $xml
this.$xml=node;
this.attributes = node.attributes;
if (node.nodeType == 1 and node.firstChild.nodeType <> 3) {
for (var childCounter=0; childCounter< node.childNodes.length; childCounter++) {
var tempName = node.childNodes[ childCounter ].nodeName;
if (this[ tempName ]==undefined) {
this[ tempName ] = new Array();
this[ tempName ].__resolve = XMLSA.prototype.mixed__resolve;
ASSetPropFlags(this[ tempName ],null,1,1);
}
this[ tempName ].push ( new XMLSA(node.childNodes[ childCounter ], this) );
}
}
}
// reParse
// free a brach and reparse it
XMLSA.prototype._reParse= function(){
this._cleanup();
// parse it again...
this._parse (this.$xml,this.$parent);
}
XMLSA.prototype._cleanup= function(){
// delete all
for (var found in this){
delete (this[found]);
}
}
// make path
XMLSA.prototype._makeURL= function( host ){
if (this._online()) {
var nocache = (random(100000)+100000);
if (_global.sessionID!=undefined) {
return host+"?sid="+_global.sessionID+"&nocache="+nocache;
} else {
return host+"?nocache="+nocache;
}
} else {
return host;
}
}
XMLSA.prototype._online = function() {
// are we online?
return (_root._url.subStr(0,7) == "http://");
}
// used by send, load and sendAndLoad
XMLSA.prototype._makeLoader= function(target){
var loader = new XML();
loader.ignoreWhite = true;
loader.link = target;
loader.onLoad = function(ok) {
if (ok) {
ASSetPropFlags(this.link,["onLoad"],1,1);
this.link._cleanup();
ASSetPropFlags(this.link,["onLoad"],0,1);
this.link._parse(this);
this.link.onLoad(true);
// Experimental Session Support
//---------------------------------------------------
// use the attribute 'session' in the root tag to
// submit a sessionID if you transmit the word
// 'timeout' or 'end' the session gets deleted
var header = this.link.attributes;
if (header.session != undefined) {
switch (header.session) {
case "timeout":
case "end":
if (_global.session!=undefined) {
delete(_global.session);
_global.onSessionEnd(header);
}
break;
default:
_global.session = new Object();
_global.session.id=header.session;
_global.onSessionStart(header);
break;
}
}
} else {
this.link.onLoad(false);
}
}
return loader;
}
XMLSA.prototype._search = function(recursive){
var result = new Array();
for (var found in this) {
for (var node in this[found]) {
if (this[found][node].$xml != undefined) {
if (this[found][node].$xml.$criteria()) {
result.push(this[found][node]);
}
if (recursive) {
result = result.concat(this[found][node]._search.apply(this[found][node], arguments));
}
}
}
}
return result;
}
// new since 1.4 allows notations without a nodenumber because
// it defaults them to 0 in that case! (redirection)
XMLSA.prototype.mixed__resolve = function(found){
return this[0][found];
}
/*************************************************/
// Debugger
/*************************************************/
// you can delete this function or use it!
// it provides a nice way to trace XMLSA-Structure
XMLSA.prototype.dump = function ( obj, sName, nLevels) {
var out="";
// init
if (typeof(obj)!="object") {
obj = this;
sName = this.getNodeName();
}
var idx, sPre = '';
if (nLevels == null) {
nLevels = 0;
}
for (idx=1; idx<=nLevels; idx++) {
sPre += '\t';
}
// open branch
out += sPre + sName + '{\n';
nLevels++;
// turn them the right way
var childs = new Array();
for (idx in obj) { childs.push(idx) }
childs.reverse();
// loop through them
for (idx=0;idx';
nLevels++;
// turn them the right way
var childs = new Array();
for (idx in obj) { childs.push(idx) }
childs.reverse();
// loop through them
for (idx=0;idx';
}
}
// close branch
out += sPre + '}
';
return out;
}
// hidde all functions to for..in loops
ASSetPropFlags(XMLSA.prototype,null,1,1);