/**
 *  (c) 2006 Copyright Basis Applied Technology
 *  CONFIDENTIAL INFORMATION
 *  All rights are reserved. Copying or other reproduction of
 *  this program except for archival purposes is prohibited
 *  without the prior written consent of Basis Applied Technology
 *
 *  Basis Applied Technology
 *  Gibsons, BC
 *  604.886.0721
 */
 
/* array extensions -------------------------------------------------------- */

Array.prototype.indexOf = function(v){for(var i=this.length;i>-1;i--)if((typeof this[i]!='undefined') && (this[i] == v))return i; return -1};
Array.prototype.contains = function(v){return this.indexOf(v) > -1};
Array.prototype.deleteValue = function(v){
  for(var i=this.length-1; i>=0; i--)
    if(this[i] == v)this.deleteItem(i);
};
Array.prototype.deleteItem  = function(i){
  if(i<0||i>(this.length-1))return;
  if(i==(this.length-1))
  {this.length--; return;}
  for(var a=(i+1);a<this.length;a++){this[a-1]=this[a];}
  this.length--;
};
/* string extensions -------------------------------------------------------- */
String.prototype.trim = function() {
  var s = this;  
  while ((s.substring(0,1) == ' ') || (s.substring(0,1) == '\n') || (s.substring(0,1) == '\r'))
  { s = s.substring(1,s.length); }
  while ((s.substring(s.length-1,s.length) == ' ') || (s.substring(s.length-1,s.length) == '\n') || (s.substring(s.length-1,s.length) == '\r'))
  { s = s.substring(0,s.length-1); }
  return s;
};
/* platform/browser sniffing  ---------------------------------------------- */
var webbler = {};
webbler._bt    = ["Unknown","IExplore","Netscape","Mozilla","Chimera","Opera","Safari","Konqueror","Firefox"];
var btUnknown   = 0;
var btIExplore  = 1;
var btNetscape  = 2;
var btMozilla   = 3;
var btChimera   = 4;
var btOpera     = 5;
var btSafari    = 6;
var btKonqueror = 7;
var btFirefox   = 8;
webbler._pt    = ["Unknown","Windows","Macintosh","Linux","Unix"];
var ptUnknown   = 0;
var ptWindows   = 1;
var ptMacintosh = 2;
var ptLinux     = 3;
var ptUnix      = 4;
webbler.browsersniff = function() {
    var i,n,hasX;
    var u      = navigator.userAgent.toUpperCase();
    var v      = navigator.vendor;
    webbler.platform = ptUnknown;
    webbler.browser  = btUnknown;
    webbler.major    = 0;
    webbler.minor    = 0;
    // find platform
    var t = navigator.platform.toUpperCase().substr(0,3);
    if(t=="WIN")webbler.platform = ptWindows;  else
    if(t=="MAC")webbler.platform = ptMacintosh;else
    if(t=="LIN")webbler.platform = ptLinux;    else
    if(t=="UNI")webbler.platform = ptUnix;
    // find browser
    if(typeof window.opera != "undefined")webbler.browser = btOpera;else // only opera has window.opera object
    if(u.indexOf("KONQUEROR")>0)webbler.browser = btKonqueror;      else
    if(document.all)            webbler.browser = btIExplore;       else // most likely IE
    if(v == "Firefox")          webbler.browser = btFirefox;        else
    if(u.indexOf("SAFARI"   )>0)webbler.browser = btSafari;         else
    if(typeof document.implementation != 'undefined' && 
       typeof document.implementation.createDocument != 'undefined')webbler.browser = btMozilla; else  
    if(u.indexOf("CHIMERA"  )>0)webbler.browser = btChimera;        else  
    if(u.indexOf("NETSCAPE" )>0)webbler.browser = btNetscape;       else
    if(u.indexOf("GECKO"    )>0)webbler.browser = btMozilla;  
    // find version
    var r = new RegExp("[\(\)\/\;\,\:]", "g");
    var uu = u.replace(r," ").split(" ");
    for(i=uu.length-1;i>=0;i--){
      uu[i] = String(uu[i]);
      n    = parseFloat(uu[i]);
      hasX = new RegExp("[xX]+");
      if(uu[i].search(new RegExp("[xX]+")) > -1)uu.deleteItem(i);
      else if(isNaN(n))uu.deleteItem(i);
      else if(n > 19)uu.deleteItem(i);
      else uu[i] = n; // for sorting
    }
    uu.sort();  
    if(uu.length > 0){
      i = uu.length-1; // use largest number
      if(webbler.browser == btMozilla || webbler.browser == btFirefox)i = 0; // use smallest number
      uu      = String(uu[i]).split(".");
      webbler.major = parseInt(uu[0]);
      if(uu.length>1)
        webbler.minor = uu[1];
    }    
    webbler.isGecko  = (webbler.browser == btMozilla || webbler.browser == btChimera || webbler.browser == btNetscape || webbler.browser == btSafari || webbler.browser == btFirefox);
    webbler.isKHTML  = (webbler.browser == btSafari || webbler.browser == btKonqueror);
    webbler.isIE     = (webbler.browser == btIExplore);
    webbler.isIEMac  = (webbler.platform == ptMacintosh && webbler.isIE);
    webbler.isIE5    = (webbler.isIE    && webbler.major == 5);
    webbler.isIE7    = (webbler.isIE    && webbler.major == 7);
    webbler.isIE5Mac = (webbler.isIEMac && webbler.major == 5);
};
webbler.browsersniff();
delete webbler.browsersniff;
/* mozilla extensions ---------------------------------------------------- */
if(webbler.isGecko||webbler.isIE5Mac) {    
    //   Written by Terry Friesen,  tfriesen@mts.net
    //   http://www.mts.net/~tfriesen/dhtml/               
    function remove_Node(a1){
      var p=this.parentNode;
      if(p&&!a1){
        var df=document.createDocumentFragment();
        for(var a=0;a<this.childNodes.length;a++)
          df.appendChild(this.childNodes[a]);
        p.insertBefore(df,this);
      }
      return p?p.removeChild(this):this;
    };    
    function replace_Node(a1){return this.parentNode.replaceChild(a1,this)};    
    function swap_Node(a1){
      var p = a1.parentNode;
      var s = a1.nextSibling;
      this.parentNode.replaceChild(a1,this);
      p.insertBefore(this,s);
      return this;
    };    
    function apply_Element(a1,a2){
      if(!a1.splitText){
        a1.removeNode();
        if(a2&&a2.toLowerCase()=="inside"){
          for(var a=0;a<this.childNodes.length;a++)
            a1.appendChild(this.childNodes[a]);
          this.appendChild(a1);
        }else{
          var p=this.parentNode;
          p.insertBefore(a1,this);
          a1.appendChild(this);
        }
        return a1;
      }
    };    
    function _contains(a1){
      var r=document.createRange();
      r.selectNode(this);
      return r.compareNode(a1)==3;
    };    
    function insertAdj_Text(a1,a2){
      var t=document.createTextNode(a2||"");
      this.insert__Adj(a1,t);
    };    
    function insertAdj_HTML(a1,a2){
      var r=document.createRange();
      r.selectNode(this);
      var t=r.createContextualFragment(a2);
      this.insert__Adj(a1,t);
    };    
    function insertAdj_El(a1,a2){
      this.insert__Adj(a1,a2);
      return a2;
    };    
    function insert__Adj(a1,a2){
      var p=this.parentNode;
      var s=a1.toLowerCase();
      if(s=="beforebegin")p.insertBefore(a2,this);
      if(s=="afterend"   )p.insertBefore(a2,this.nextSibling);
      if(s=="afterbegin" )this.insertBefore(a2,this.childNodes[0]);
      if(s=="beforeend"  )this.appendChild(a2);
    };
    if(self.Node){
      Node.prototype.removeNode               = remove_Node;
      Node.prototype.replaceNode              = replace_Node;
      Node.prototype.swapNode                 = swap_Node;
      Element.prototype.applyElement          = apply_Element;
      Element.prototype.contains              = _contains;
      Element.prototype.insertAdjacentText    = insertAdj_Text;
      Element.prototype.insertAdjacentHTML    = insertAdj_HTML;
      Element.prototype.insertAdjacentElement = insertAdj_El;
      Element.prototype.insert__Adj           = insert__Adj;
    }    
    // innerText extensions from webFX
    if(webbler.isGecko){
      HTMLElement.prototype.__defineSetter__(
        "innerText",
        function(s){s = String(s); this.innerHTML = s.replace(/\&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}
      );
      HTMLElement.prototype.__defineGetter__(
        "innerText",
        function(){
          var r = this.ownerDocument.createRange();
          r.selectNodeContents(this);
          return r.toString();
        }
      );
    }        
}
/* common utility stuff ---------------------------------------------------- */
webbler.include = function(script) {
    if (!webbler.__scripts) { webbler.__scripts = [];}
    if (webbler.__scripts.indexOf(script)<0) {
        webbler.__scripts.push(script);
        document.writeln('<script type="text\/javascript" src="'+script+'"><\/script>');
        return true;
    } return false;
};
webbler.clamp = function(_x,_min,_max){_x=Number(_x);if(_x<_min)_x=_min;if(_x>_max)_x=_max;return _x;}
webbler.addEvent = function(obj,evt,fn,capture) {
  if(obj.addEventListener)
  {obj.addEventListener(evt,fn,capture);}
  else if(obj.attachEvent)
  {obj.attachEvent("on"+evt,fn);}
  else
  {obj["on"+evt] = fn;}
};
webbler.preventBubble = function(E){
  if(webbler.isIE){
    event.cancelBubble = true;
    event.returnValue  = false;
  }else{
    if(E.stopPropagation)E.stopPropagation();
    else E.preventBubble();
  }
};
webbler.removeEvent = function(obj,evt,fn,capture) {
  if(obj.removeEventListener)
  {obj.removeEventListener(evt,fn,capture);}
  else if(obj.detachEvent)
  {obj.detachEvent("on"+evt,fn);}
  else
  {obj["on"+evt] = null;}
};
webbler.el = function(el) {
    return document.getElementById(el);
};
webbler.isNull     = function(n)  {return n==null || !String(n).length};
webbler.rInt       = function(n,d){return(webbler.isNull(n)||isNaN(n))?((webbler.isNull(d)||isNaN(d))?0:d):parseInt(n)};
webbler.rFloat     = function(n,d){return(webbler.isNull(n)||isNaN(n))?((webbler.isNull(d)||isNaN(d))?0:d):parseFloat(n)};
webbler.isFunction = function(a) { return typeof a == 'function';};
webbler.isObject   = function (a) { return (a && typeof a == 'object') || webbler.isFunction(a); };
webbler.isArray    = function(a) { return webbler.isObject(a) && a.constructor == Array;};
webbler.rVal       = function(s,d){return(webbler.isNull(s)?(webbler.isNull(d)?"":d):s)};                                 // return value if not nil else default
webbler.luid       = function()   {return "L"+new Date().getTime()+Math.floor(1000 * Math.random());};
webbler.IFrameDoc = function(o) {
    if (typeof o == "string") o = webbler.el(o);    
    var d;
    if(webbler.isIE5)d = o.document;
    else d = webbler.isIE?o.contentWindow.document:o.contentDocument;
    return d;
};
webbler.nothing = function(){;}
/* callback object ---------------------------------------------------------------- */
var functor = function(obj, fn, args) {
    this.obj = obj;
    this.fn = fn;        
    this.args = webbler.isArray(args)?args:[];      
};
functor.prototype.fire = function(args) {    
    return this.fn.apply(this.obj, this.args.concat(webbler.isArray(args)?args:[]));
};
/* useful list object ---------------------------------------------------------------- */
function List(){this.clear();};
List.prototype.getLength = function(){return this.keys.length};
List.prototype.clear = function(){this.keys  = [];this.values = [];};
List.prototype.add = function(n,v){var t = this.rPair(n,v);this.keys.push( t[0]);this.values.push(t[1]);};
List.prototype.insert = function(i,n,v){var t = this.rPair(n,v);this.keys.insert( i,t[0]);this.values.insert(i,t[1]);};
List.prototype.deleteItem = function(i){this.keys.deleteItem( i);this.values.deleteItem(i);};
List.prototype.deleteKey = function(n){for (var i=0;i<this.keys.length;i++){if (this.keys[i] == n){this.deleteItem(i);return true;}}return false;};
List.prototype.reverse = function(){this.keys.reverse();this.values.reverse();};
List.prototype.swapItems = function(i,j){var t;t = this.keys[i];this.keys[i]  = this.keys[j];this.keys[j]  = t;t = this.values[i];this.values[i] = this.values[j];this.values[j] = t;};
List.prototype.sortByName = function(){this._sort(0);};
List.prototype.sortByValue = function(){this._sort(1);};
List.prototype._sort = function(k){var b,n1,n2;for(var a=0;a<this.keys.length-1;a++)for(b=a+1;b<this.keys.length;b++){n1 = k?this.values[a]:this.keys[a];n2 = k?this.values[b]:this.keys[b];if(n1>n2)this.swapItems(a,b);}};
List.prototype.findNameByValue = function(s){var i = this.values.indexOf(s);return i==-1?null:this.keys[i];};
List.prototype.findValueByName = function(s){var i = this.keys.indexOf(s);return i==-1?null:this.values[i];};
List.prototype.valueAtIndex = function(i){return this.values[i];};
List.prototype.nameAtIndex = function(i){return this.keys[i];};
List.prototype.rPair = function(n,v){if(typeof v != "undefined")return [n,v];var t = n.split("=");if(t.length!=2)return [n,n];return [t[0],t[1]];};
/* base64 encoding/decoding ---------------------------------------------------------------- */
function Base64Data(str, encoded){this.m_data = (encoded ? str : webbler.base64.encode(str));return this;};
Base64Data.prototype.getencoded = function(){ return this.m_data; };
Base64Data.prototype.getdecoded = function(){ return webbler.base64.decode(this.m_data); };

webbler.base64 = {};
webbler.base64.END_OF_INPUT = -1;
webbler.base64.base64Chars = new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/');
webbler.base64.reverseBase64Chars = new Array();
for (var i=0; i < webbler.base64.base64Chars.length; i++){ webbler.base64.reverseBase64Chars[webbler.base64.base64Chars[i]] = i;}
webbler.base64.setBase64Str = function(str){
    webbler.base64.base64Str = str;
    webbler.base64.base64Count = 0;
};
webbler.base64.readBase64 = function(){    
    if (!webbler.base64.base64Str) return webbler.base64.END_OF_INPUT;
    if (webbler.base64.base64Count >= webbler.base64.base64Str.length) return webbler.base64.END_OF_INPUT;
    var c = webbler.base64.base64Str.charCodeAt(webbler.base64.base64Count) & 0xff;
    webbler.base64.base64Count++;
    return c;
};
webbler.base64.readReverseBase64 = function(){   
    if (!webbler.base64.base64Str) return webbler.base64.END_OF_INPUT;
    while (true){      
        if (webbler.base64.base64Count >= webbler.base64.base64Str.length) return webbler.base64.END_OF_INPUT;
        var nextCharacter = webbler.base64.base64Str.charAt(webbler.base64.base64Count);
        webbler.base64.base64Count++;
        if (webbler.base64.reverseBase64Chars[nextCharacter]){
            return webbler.base64.reverseBase64Chars[nextCharacter];
        }
        if (nextCharacter == 'A') return 0;
    }
    return 0; 
};
webbler.base64.ntos = function(n){
    n=n.toString(16);
    if (n.length == 1) n="0"+n;
    n="%"+n;
    return unescape(n);
};
webbler.base64.encode = function(str){
    webbler.base64.setBase64Str(str);
    var result = '';
    var inBuffer = new Array(3);
    var lineCount = 0;
    var done = false;
    while (!done && (inBuffer[0] = webbler.base64.readBase64()) != webbler.base64.END_OF_INPUT){
        inBuffer[1] = webbler.base64.readBase64();
        inBuffer[2] = webbler.base64.readBase64();
        result += (webbler.base64.base64Chars[ inBuffer[0] >> 2 ]);
        if (inBuffer[1] != webbler.base64.END_OF_INPUT){
            result += (webbler.base64.base64Chars [(( inBuffer[0] << 4 ) & 0x30) | (inBuffer[1] >> 4) ]);
            if (inBuffer[2] != webbler.base64.END_OF_INPUT){
                result += (webbler.base64.base64Chars [((inBuffer[1] << 2) & 0x3c) | (inBuffer[2] >> 6) ]);
                result += (webbler.base64.base64Chars [inBuffer[2] & 0x3F]);
            } else {
                result += (webbler.base64.base64Chars [((inBuffer[1] << 2) & 0x3c)]);
                result += ('=');
                done = true;
            }
        } else {
            result += (webbler.base64.base64Chars [(( inBuffer[0] << 4 ) & 0x30)]);
            result += ('=');
            result += ('=');
            done = true;
        }
        lineCount += 4;
        if (lineCount >= 76){
            result += ('\n');
            lineCount = 0;
        }
    }
    return result;
};
webbler.base64.decode = function(str){
    webbler.base64.setBase64Str(str);
    var result = "";
    var inBuffer = new Array(4);
    var done = false;
    while (!done && (inBuffer[0] = webbler.base64.readReverseBase64()) != webbler.base64.END_OF_INPUT && (inBuffer[1] = webbler.base64.readReverseBase64()) != webbler.base64.END_OF_INPUT){
        inBuffer[2] = webbler.base64.readReverseBase64();
        inBuffer[3] = webbler.base64.readReverseBase64();
        result += webbler.base64.ntos((((inBuffer[0] << 2) & 0xff)| inBuffer[1] >> 4));
        if (inBuffer[2] != webbler.base64.END_OF_INPUT){
            result +=  webbler.base64.ntos((((inBuffer[1] << 4) & 0xff)| inBuffer[2] >> 2));
            if (inBuffer[3] != webbler.base64.END_OF_INPUT){
                result +=  webbler.base64.ntos((((inBuffer[2] << 6)  & 0xff) | inBuffer[3]));
            } else {
                done = true;
            }
        } else {
            done = true;
        }
    }
    return result;
};
/* XMLRPCFault object ---------------------------------------------------------- */
var XMLRPCFault = function(code, string){this.faultCode = code;this.faultString = string;return this;};
XMLRPCFault.prototype = new Object();
XMLRPCFault.prototype.toString = function(){return "Error "+this.faultCode+" :: "+this.faultString;};
/* xmlrpc core services ------------------------------------------------------------------- */
webbler.xmlrpc = {};
webbler.xmlrpc.doDebug = false;
webbler.xmlrpc.timeout = 30000;
webbler.xmlrpc.serviceUrl = 'webservices/';
webbler.xmlrpc.IERequestObject = null;
webbler.xmlrpc.proxies = {};
webbler.xmlrpc.USE_CDATA_STRINGS = true;
webbler.xmlrpc.USER_AGENT = "The Webbler XMLRPC Client 1.0 Javascript (" + navigator.userAgent + ")";
if(webbler.isIE) {
    var idXmlHttpList = ["Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP"];
    for (var i=0; i < idXmlHttpList.length; i++)
    {try { var oDoc = new ActiveXObject(idXmlHttpList[i]); webbler.xmlrpc.IERequestObject = idXmlHttpList[i]; break;} catch (e){;}}
}
webbler.xmlrpc.IEDOMParser = null;
if(webbler.isIE) {
    var idXmlList = ["Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"];
    for (var i=0; i < idXmlList.length; i++)
    {try{ var oDoc = new ActiveXObject(idXmlList[i]); webbler.xmlrpc.IEDOMParser = idXmlList[i]; break;} catch (e){}}
}
webbler.xmlrpc.getXmlHttpRequest = function() {
    var xmlhttp;
    try { xmlhttp = (webbler.isIE ? new ActiveXObject(webbler.xmlrpc.IERequestObject) : new XMLHttpRequest());
    } catch(e) { xmlhttp=null; }

    return xmlhttp;
};
webbler.xmlrpc.getDomParser = function(xml) {
    var dom;
    try {
        if (webbler.isIE) {
            dom = new ActiveXObject(webbler.xmlrpc.IEDOMParser);
            if (arguments.length > 0) 
            { dom.loadXML(xml); }
        } else {
            dom = new DOMParser();
            dom = dom.parseFromString(xml, "text/xml");
        }
    } catch(e) { dom=null; } 
    return dom;
};
webbler.xmlrpc.FaultFromString = function(code, desc) {
    return new XMLRPCFault(code, desc);
};
webbler.xmlrpc.FaultFromException = function(err) {
    code = err.number ? err.number : (err.code ? err.code : -1);
    desc = err.desc ? err.desc : (err.message ? err.message : 'no message');
    return webbler.xmlrpc.FaultFromString(code, desc);
};
webbler.xmlrpc.isFault = function(o, show) {
    if (o instanceof XMLRPCFault) {
        if (show)
        {alert("Error "+o.faultCode+" :: "+o.faultString);}
        return true;
    }
    return false;
};
webbler.xmlrpc.getProxy = function(obj) {
    if (!webbler.xmlrpc.proxies[obj]) {    
        var funcs = webbler.xmlrpc.Call(obj+".WSInterface", 0, false, null);
        if (!webbler.xmlrpc.isFault(funcs), true)
        { webbler.xmlrpc.proxies[obj] = webbler.xmlrpc.makeProxy(obj,key,funcs); }
    }   
    return webbler.xmlrpc.proxies[obj];
};
webbler.xmlrpc.makeProxy = function(obj,funcs) {
    var proxy = new Object({_obj:obj,_async:false,_functor:null});    
    proxy.setAsync = function(b,h){this._async=b;this._functor=(b?h:null);}
    for(var i=0;i<funcs.length;i++)
    {proxy[funcs[i]] = new Function('','var arr=[]; for(var i=0;i<arguments.length;i++){arr.push(arguments[i]);}; var ret = webbler.xmlrpc.Call(this._obj+".'+funcs[i]+'", arr, this._async, this._functor); this._async=false; this._functor=null; return ret;');}
    return proxy;  
};
webbler.xmlrpc.Call = function(method, args, async, functor) {        
    var http = webbler.xmlrpc.getXmlHttpRequest();
    var response = null;
    var packet = null;    
    if (http) {        
        var xml = "<?xml version=\"1.0\"?>";
        xml += "<methodCall>";           
        xml += "<methodName>" + method + "</methodName>";
        if (webbler.isArray(args) && args.length > 0) {
            xml += "<params>";
            for(var i=0;i<args.length;i++)
            { xml += "<param><value>" + webbler.xmlrpc.toXMLRPC(args[i]) + "</value></param>"; }
            xml += "</params>";
        }
        xml += "</methodCall>";
        if (async) {
            var packet = new XMLRPCPacket(functor,http);
            response = packet;
        }
        try { http.overrideMimeType("text/xml");} catch(e) {;}
        try {
            http.open('POST', webbler.xmlrpc.serviceUrl, (async?true:false));
            http.setRequestHeader("User-Agent", webbler.xmlrpc.USER_AGENT);
	        http.setRequestHeader("Content-type", "text/xml");
	        xml = webbler.xmlrpc.getDomParser(xml); // make sure this will parse...            
            if (async)
            { packet.QueueForSend(); }            
            http.send(xml);    
            if (!async)
            { response = webbler.xmlrpc._parseHTTPResponse(http); }    
	    } catch(err) {            
            if (async)
            { packet._receivecomplete(XMLRPCPacket.RESPONSE_CLIENTERR, webbler.xmlrpc.FaultFromException(err) ); }
            else
            { response = webbler.xmlrpc.FaultFromException(err); }
	    }
    }
    else
    { response = webbler.xmlrpc.FaultFromString(0, 'Unable to send request'); }
    return response;
};
webbler.xmlrpc.proxyCall = function(server, method, args, async, functor) {    
    return webbler.xmlrpc.Call('__WebblerInternalWebService__.ProxyRequest', [server, method, args], async, functor);
};
webbler.xmlrpc.supportView = function(page) {    
    var out = webbler.xmlrpc.Call('__WebblerInternalWebService__.SupportView', [page]);
    if (!webbler.xmlrpc.isFault(out, true)) {
        webbler.el('support_page').innerHTML = out;
    }
};
webbler.xmlrpc.remoteUpdate = function(checkonly) {    
    var out = webbler.xmlrpc.Call('__WebblerInternalWebService__.RemoteUpdate', [checkonly]);
    if (!webbler.xmlrpc.isFault(out, true)) {
        webbler.el('update_page').innerHTML = out;
    }
};
webbler.xmlrpc.installContent = function(package) {    
    var out = webbler.xmlrpc.Call('__WebblerInternalWebService__.InstallRemoteContent', [package]);
    if (!webbler.xmlrpc.isFault(out, true)) {
        alert(out);        
    }
};
webbler.xmlrpc._parseHTTPResponse = function(http) {
    var response = null;
    if (http.status == 200) {       
        var oDoc = webbler.xmlrpc.getDomParser(http.responseText);        
        if (!oDoc || !oDoc.childNodes || oDoc.childNodes.length == 0) { 
            response = webbler.xmlrpc.FaultFromString(0, "Malformed Response: " + http.responseText);
        } else {
            var oResponseNode;
            for (var i = 0 ; i < oDoc.childNodes.length ; i++) {
                if (oDoc.childNodes[i].nodeName == 'methodResponse') {
                    var oResponseNode = oDoc.childNodes[i];
                    break;
                }
            }
            if (oResponseNode) {  
                var oNode = oResponseNode.firstChild;
                while (oNode) {
                    if (oNode.nodeName == 'params') {                    
                        try { response = webbler.xmlrpc.valueNodeToObject(oNode.firstChild.firstChild);
                        } catch(e)
                        { response = webbler.xmlrpc.FaultFromString(0, ('Error Parsing a Method Response Value'));}
                        break;
                    }
                    else if (oNode.nodeName == 'fault') {
                        try {
                            response = webbler.xmlrpc.valueNodeToObject(oNode.firstChild);
                            response = new XMLRPCFault(response.faultCode, response.faultString);
                        } catch(e){ response = webbler.xmlrpc.FaultFromString(0, ('Error Parsing a Method Fault')); }
                        break;
                    }
                    oNode = oNode.nextSibling;                    
                }
            } else {
                response = webbler.xmlrpc.FaultFromString(0, "Malformed RPC Response: Missing methodResponse Node.");
            }
        }
    } else {
        response = webbler.xmlrpc.FaultFromString(0, "HTTP Exception("+http.status+"): " + http.statusText + "\n\n" + http.responseText);    
    }            
    return response;
};
webbler.xmlrpc.valueNodeToObject = function( oNode ) {
    var ret;
	switch(oNode.tagName) {        
		case "string":
			ret = (oNode.firstChild) ? String(oNode.firstChild.nodeValue) : "";
            ret = ret.replace(/&lt;/g, "<").replace(/&amp;/g, "&");
			break;
		case "int":
		case "i4":
		case "double":
			ret = (oNode.firstChild) ? Number(oNode.firstChild.nodeValue) : 0;
			break;
		case "dateTime.iso8601":
		    ret = new Date();
		    ret.fromISO8601(oNode.firstChild.nodeValue);			
			break;
		case "array":			
			oNode = oNode.firstChild;
			if(oNode && oNode.tagName == "data") {
			    ret = new Array();				
			    var arr = oNode.childNodes;
				for (var i=0 ; i<arr.length ; i++)
				{ ret.push(webbler.xmlrpc.valueNodeToObject(oNode.childNodes[i])); }
			}
			else
            { throw(new Error("Malformed XMLRPC Array")); }
			break;
		case "struct":
		    oNode = oNode.firstChild;			
		    ret = {};				
			while (oNode) {
			    if(oNode.tagName == "member")
			    {ret[oNode.firstChild.firstChild.nodeValue] = webbler.xmlrpc.valueNodeToObject(oNode.firstChild.nextSibling);}
                oNode = oNode.nextSibling;
            }                              
			break;
		case "boolean":
			ret = oNode.firstChild.nodeValue == "true" ? true : false;
			break;
		case "base64":
		    ret = new Base64Data(oNode.firstChild.nodeValue, true);
		    break;		
		case "value":
			oNode = oNode.firstChild;
			ret = !oNode ? ( (oNode.firstChild) ? String(oNode.firstChild.nodeValue) : "") : webbler.xmlrpc.valueNodeToObject(oNode);
			break;
		default:
			throw(new Error("Unknown Tag in XMLRPC Message: " + oNode.tagName));
	}
    return ret;
};
webbler.xmlrpc.toXMLRPC = function(val) {
    if (typeof val == "function") {	    
	    throw({message:"Cannot Parse Functions!"});
	}
    if (val == null || val == undefined || val.constructor == Boolean ||(val.constructor == Number && !isFinite(val))) {
	    return "<boolean>"+val+"</boolean>";	    
	}
	if (val.constructor == Base64Data) {	    
	    return "<base64>"+val.getencoded()+"</base64>";	
	}	
	if (val.constructor == Number) {
	    if(val == parseInt(val)){return "<int>"+val+"</int>";}
	    else if(val == parseFloat(val)){return "<double>"+val+"</double>";}
	    else{ return webbler.xmlrpc.toXMLRPC(false); }	       
	}
	if (val.constructor == String) {
	    var str =  val.replace(/&/g, "&amp;").replace(/</g, "&lt;");
        if (webbler.xmlrpc.USE_CDATA_STRINGS)
        { return "<string><![CDATA[" + str.replace(/\]\]/g, "] ]") + "]]></string>"; }
        return "<string>"+str+"</string>"; 
	}
	if (val.constructor == Array) {
	    var ret = "<array><data>";
    	for(var i=0;i<val.length;i++)
    	{ ret += "<value>"+webbler.xmlrpc.toXMLRPC(val[i])+"</value>"; }
    	return ret + "</data></array>";
	}
	if (val.constructor == Date) {	    	    
	    return "<dateTime.iso8601>"+val.toISO8601()+"</dateTime.iso8601>";	    
	}
	if (val.constructor == Object || typeof val == "object") {	    
	    var retstr = "<struct>";
		for(prop in val){
			if(typeof val[prop] != "function"){
				retstr += "<member><name>" + prop + "</name><value>" + webbler.xmlrpc.toXMLRPC(val[prop]) + "</value></member>";
			}
		}
    	retstr += "</struct>";
    	return retstr;    	   	
	}	
    return webbler.xmlrpc.toXMLRPC(String(val));	                 	       	    	                 	       	    	           
};
webbler.xmlrpc._leadingZero = function(n){if (n.length==1) n = "0" + n; return n;};
/* date extensions ---------------------------------------------------------------- */
Date.prototype.fromISO8601 = function (string) {
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));
    var offset = 0;
    var date = new Date(d[1], 0, 1);
    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }
    offset -= date.getTimezoneOffset();
    var time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
};
Date.prototype.toISO8601 = function () {    
    var year  = this.getYear();
    if (year < 2000) year+=1900;
    var month = this.getMonth() + 1;
    var day  = this.getDate();
    var hour = this.getHours();
    var hourUTC = this.getUTCHours();
    var diff = hour - hourUTC;
    var hourdifference = Math.abs(diff);
    var minute = this.getMinutes();
    var minuteUTC = this.getUTCMinutes();
    var minutedifference;
    var second = this.getSeconds();
    var timezone;
    if (minute != minuteUTC && minuteUTC < 30 && diff < 0) { hourdifference--; }
    if (minute != minuteUTC && minuteUTC > 30 && diff > 0) { hourdifference--; }
    if (minute != minuteUTC)minutedifference = ":30";
    else minutedifference = ":00";
    if (hourdifference < 10) timezone = ("0" + hourdifference + minutedifference);
    else timezone = "" + hourdifference + minutedifference;
    if (diff < 0) timezone = ("-" + timezone);
    else timezone = ("+" + timezone);
    if (month <= 9) month = "0" + month;
    if (day <= 9) day = "0" + day;
    if (hour <= 9) hour = "0" + hour;
    if (minute <= 9) minute = "0" + minute;
    if (second <= 9) second = "0" + second;
    return (year + "-" + month + "-" + day + "T" + hour + ":" + minute + ":" + second + timezone);

};
/* xmlrpcpacket for asynshronous calls ---------------------------------------------------------------- */
var XMLRPCPacket = function(functor, http) {
    this.luid     = webbler.luid();
    this.http     = http;
    this.timer    = 0;
    this.functor  = functor;
    this.response = null;
    var luid = this.luid;
    this.http.onreadystatechange = function(){XMLRPCPacket._response_hook(luid);};
    return this;
}
XMLRPCPacket.prototype = new Object();
XMLRPCPacket.prototype.Abort = function() {
    this._receivecomplete(XMLRPCPacket.RESPONSE_ABORTED);
};
XMLRPCPacket.prototype.QueueForSend = function() {
    XMLRPCPacket.QueuePacket(this.luid, this);    
    if (webbler.xmlrpc.timeout > 0) {
        var luid = this.luid;
        var fnTimeOut = function()
        { XMLRPCPacket._response_hook2(luid,XMLRPCPacket.RESPONSE_TIMEDOUT); };
        this.timeouttimer = setTimeout(fnTimeOut, webbler.xmlrpc.timeout);
    }
};
XMLRPCPacket.prototype._receivecomplete = function(iResultCode, fault) {
    var response = fault;    
    clearTimeout(this.timer);
    clearTimeout(this.timeouttimer);
    XMLRPCPacket.DequeuePacket(this.luid);    
    switch (iResultCode) {
        case XMLRPCPacket.RESPONSE_ABORTED:            
            if (this.http){ this.http.abort(); }
            break;
        case XMLRPCPacket.RESPONSE_TIMEDOUT:
            response = webbler.xmlrpc.FaultFromString(0, "Operation Timed Out. Packet: " + this.luid);
            break;
        case XMLRPCPacket.RESPONSE_CLIENTERR:
            if (!response) response = webbler.xmlrpc.FaultFromString(0, "Undefined Error. Packet: " + this.luid);
            break;
        case XMLRPCPacket.RESPONSE_COMPLETE:
            response = webbler.xmlrpc._parseHTTPResponse(this.http);
            break;
    }
    this.http = null;  
    if(typeof(this.functor)=="object" && webbler.isFunction(this.functor.fire)) {
        this.functor.fire([response]);        
	}
};
XMLRPCPacket.RESPONSE_NONE      = 0;
XMLRPCPacket.RESPONSE_ABORTED   = 2;
XMLRPCPacket.RESPONSE_TIMEDOUT  = 3;
XMLRPCPacket.RESPONSE_CLIENTERR = 4;
XMLRPCPacket.RESPONSE_SERVERERR = 5;
XMLRPCPacket.RESPONSE_COMPLETE  = 6;
XMLRPCPacket._response_hook = function(luid) {
    var packet = XMLRPCPacket.Queue().findValueByName(luid);
    if (packet && packet.http.readyState == 4) {
        clearTimeout(packet.timer);
        clearTimeout(packet.timeouttimer);            
        var fnT = function() { XMLRPCPacket._response_hook2(luid,XMLRPCPacket.RESPONSE_COMPLETE); };
        packet.timer = setTimeout(fnT, 0);
    }
};
XMLRPCPacket._response_hook2 = function( luid, code ) {
    var packet = XMLRPCPacket.Queue().findValueByName(luid);
    if (packet)
    { packet._receivecomplete(code); }
    else if (webbler.xmlrpc.doDebug)
    { alert("XMLRPCPacket._response_hook() Couldn't find packet. luid: " + luid + ", response code: " + code);}
};
XMLRPCPacket.Purge = function() {
    for (var idx = 0 ; idx < XMLRPCPacket.Queue().getLength() ; idx++)
    { XMLRPCPacket.Queue().valueAtIndex(idx).Abort(); }
};
XMLRPCPacket.QueuePacket = function(luid, oPacket) {
    XMLRPCPacket.Queue().add(luid, oPacket);
};
XMLRPCPacket.DequeuePacket = function(luid) {
    if ((!XMLRPCPacket.Queue().deleteKey(luid)) && (webbler.xmlrpc.doDebug))
    { alert("Couldn't Dequeue Missing XMLRPC Packet: " + luid);}
};
XMLRPCPacket.Queue = function() {
    if (!XMLRPCPacket.s_lstQueue)
    { XMLRPCPacket.s_lstQueue = new List(); }
    return XMLRPCPacket.s_lstQueue;
};