

function getObj(name) {
    if (document.getElementById) {
        return document.getElementById(name);
    } else if (document.all) {
        return document.all[name];
    } else if (document.layers) {
        if (document.layers[name]) {
            return document.layers[name];
        }
    }
}



//-- exception handler code -->
var FaultHandler = Class.create();
FaultHandler.attributes = [ "error", "errno", "handlers"];
FaultHandler.prototype = {

   initialize: function() {
      this.handlers = [];
      this.handlers[0] = this.noop;
   },

   ajaxUpdate: function(ajaxResponse) {
      var fault = ajaxResponse.childNodes[0];
      var errno = fault.getAttribute('errno');
      var error = fault.getAttribute('error');
      if(this.handlers[errno]) {
          this.handlers[errno](errno, error, fault);
      } else {
          // default handler is for errno 0
          this.handlers[0](errno, error, fault);
      }
   },

   alert: function(errno, error, fault) {
      window.alert('Error: ' + error + ' [' + errno + ']');
   },

   noop: function(errno, error, fault) {
      // do nothing
   },

   display: function(errno, error, fault) {
      var nodeID = 'status';
      node = document.getElementById(nodeID);
      if(node) {
          node.innerHTML = error + ' [' + errno + ']';
      } else {
        // noop
      }
   },
   
   registerHandler: function(errno, handler) {
       this.handlers[ errno ] = handler;
   }

};
var faultHandler = new FaultHandler();
ajaxEngine.registerAjaxObject('RicoFault', faultHandler);

/**
 * examples
 *

 * 
 * register a custom function
 *
faultHandler.registerHandler(3, 
  function(errno, error, fault) {
      window.alert('Error: '+error+' ['+errno + ']')
  }
);

 * 
 * register a built-in function
 *
faultHandler.registerHandler(0, faultHandler.display);

 *
 */




/* Special object parsers for working with RicoObjectResponse subclasses */

var AutomaticResponseHandler = Class.create();
AutomaticResponseHandler.attributes = [ "handlers", "listeners" ];
AutomaticResponseHandler.prototype = {

    initialize: function() {
        this.handlers = Array;
        this
    },

    register: function(className, handler) {
        this.handlers[ className ] = handler;
        ajaxEngine.registerAjaxObject(className, this);
    },

    ajaxUpdate: function(ajaxResponse) {
        var handler = ajaxResponse.getAttribute("handler");
        var className = ajaxResponse.getAttribute("id");
        this.handlers[ className ](ajaxResponse);
    }
}

var automaticResponseHandler = new AutomaticResponseHandler();

var ricoHTMLResponseHandler = function(responseElement) {
        var html = responseElement.textContent != undefined ?
             responseElement.textContent : responseElement.childNodes[0].nodeValue?
             responseElement.childNodes[0].nodeValue : responseElement.childNodes[0].data;
             //responseElement.xml;
        var handler = responseElement.getAttribute('handler');
        $(handler).innerHTML = html;
}
// For PHP5
automaticResponseHandler.register('RicoHTMLResponse', ricoHTMLResponseHandler);
// For PHP4
automaticResponseHandler.register('ricohtmlresponse', ricoHTMLResponseHandler);


var SimpleUpdateHandler = Class.create();
SimpleUpdateHandler.attributes = ["contentID", "divID", "service", "threadID", "serviceName"];
SimpleUpdateHandler.prototype = { 
    initialize: function(contentID, divID, service, serviceName, activate) {
        this.contentID = contentID;
        this.divID = divID;
        this.service = service; 
        this.serviceName = serviceName;
        this.activate = activate;  
    },  
    initAjax: function() {
        ajaxEngine.registerRequest( this.serviceName ,  this.service );
    }
}


function _reloadifnotupdated() {
    if(!jsUpdateHandler.loaded) {
        if(window.location.reload) {
            window.location.reload( false );
        } else {
            // noop - not supported on this platform
        }
    } else {
        // hoorah, already loaded
    }
}
var JSUpdateHandler = Class.create();
JSUpdateHandler.attributes = ["handlers"];
JSUpdateHandler.prototype = {
    initialize: function() {
        this.handlers = [];
    },
    initAjax: function() {
    },
    register: function(handler) {
        this.handlers[ handler.serviceName ] = handler;
    },
    ajaxResponse: function(data) {
        jsUpdateHandler.loaded = true;
        var xmlDoc = RicoUtil.createXmlDocument(); 
        xmlDoc.async="false";
        xmlDoc.loadXML(data);
      var response = xmlDoc.getElementsByTagName("ajax-response");
      if (response == null || response.length != 1)
         return;
        ajaxEngine._processAjaxResponse(response[0].childNodes);
    },
    sendRequest: function(name) {
        if(!this.handlers[name]) {
            return;
        }

        var url = this.handlers[name].service+"?"
            +ajaxEngine._createQueryString(arguments, 1);
        this.loadLibrary(url);
    },

    loadLibrary: function(url) {
        /* Mozilla / IE, the W3C way */
        jsUpdateHandler.loaded = false;
        setTimeout(_reloadifnotupdated, 6*1000);
        var s = document.createElement("script");
        s.type = "text/javascript";
        s.src = url;
        document.getElementsByTagName("head")[0].appendChild(s);
    }
}

jsUpdateHandler = new JSUpdateHandler();

var JSUpdateDriver = Class.create();
JSUpdateDriver.attributes = ["contentID", "divID", "service", "threadID", "serviceName"];
JSUpdateDriver.prototype = {

    initialize: function(contentID, divID, service, serviceName, activate) {
        this.contentID = contentID;
        this.divID = divID;
        this.service = service;
        this.serviceName = serviceName;
        this.activate = activate;
        jsUpdateHandler.register(this);
    },

    initAjax: function() {
    },

    update: function(data) {
        var el = $(this.contentID);
        el.innerHTML = data;
    }

}

var LocationHandler = Class.create();
LocationHandler.attributes = ['location'];
LocationHandler.prototype = {

    initialize: function(){
        this.location = this.parseLocation();
    },

    parseLocation: function() {
        var data = {};
        var junk = window.location.href.split('#');
        if(!junk.length) {
            junk = Array(junk);
        }
        data.search = junk[1];
        var items = junk[0].split('?');
        if(!items.length) {
            items = Array(items);
        }
        data.baseURL = items[0];
        data.params = {};
        if(items.length < 2) {
            return data;
        }
        var params = items[1].split('&');
        var param = null;
        for(i=0;i<params.length;++i) {
            param = params[i].split('=');
            if(!param.length) {
                data.params[ param ] = null;
            } else {
                data.params[ param[0] ] = unescape(param[1]);
            }
        }
        return data;
    },

    /**
     * create a url
     * @param string hostname
     * @param string path
     * @param string get info (any number)
     */
    createURL: function() {
        // no parametes - use the current value
        if(0 == arguments.length) {
            var loc = this.parseLocation();
            return loc.baseUrl;
        }
        // host only
        if(1 == arguments.length) {
            return arguments[0];
        }
        // host
        var url = arguments[0] + '?'+ arguments[1];
        if(2 == arguments.length) {
            return url;
        }
        for(i=2;i<arguments.length;++i) {
            url = url + '&' + arguments[i];
        }
        return url;
    },  

    redirectToURL: function(url) {
        window.location = url;
    },

    getURL: function() {
        var url = this.location.baseURL;
        var params = [];       
        for(key in this.location.params) {
            var val = this.location.params[key];
            if(typeof(val) != 'function') {
                params.push( key + '=' + escape(val) );
            }
        }
        if(params.length) {
            url += '?' + params.join('&');
        }
        if(this.location.search) {
            url += '#' + this.location.search;
        }
        return url;
    },

    redirectToLocation: function() {
        this.redirectToURL( this.getURL() );
    },

    passthru: {
        data: [],
        encode: function(key) {
                return key;
            },
        decode: function(key) {
                return key;
            },
        encoded: function(hashParams) {
            var c = this.data.length;
            var ret = [];
            for(var i=0;i<c;++i) {
                var anArg = this.data[i];
                var ePos  = anArg.indexOf('=');
                var argName  = this.encode(anArg.substring( 0, ePos ));
                var argValue = anArg.substring( ePos + 1 );
                if(hashParams) {
                    ret.push({name:argName,value:argValue});
                } else {
                    ret.push(argName+'='+argValue);
                }
            }
            return ret;
        },
        clear: function(hashParams) {
            if(!hashParams) {
                return this.data;
            }
            var c = this.data.length;
            var ret = [];
            for(var i=0;i<c;++i) {
                var anArg = this.data[i];
                var ePos  = anArg.indexOf('=');
                var argName  = anArg.substring( 0, ePos );
                var argValue = anArg.substring( ePos + 1 );
                ret.push({name:argName,value:argValue});
            }
            return ret;
        }
    }



}

var locationHandler = new LocationHandler();


var CookieJar = Class.create();
CookieJar.attributes = ["jar"];
CookieJar.prototype = {

    initialize: function() {
        this.jar = [];
        var cookie = document.cookie;
        var crumbs = cookie.split(';');
        var crumb = null;
        for(i=0;i<crumbs.length;++i) {
            crumb = crumbs[i].split('=');
            var name = crumb[0].replace(/^\s*/,'');
            this.jar[name] = unescape(crumb[1]);
        }
    },

    get: function(name) {
        return this.jar[name];
    },
    
    set: function(name, value) {
        this.jar[name] = value;
        var cookie = name + '=' + escape(value);
        if(arguments.length > 2) {
            cookie = cookie + ';';
            for(i=2;i<arguments.length;++i) {
               cookie = cookie + arguments[i] + ';';  
            }
        }
        document.cookie = cookie;
    },

    unset: function(name) {
        document.cookie = name + "=" + escape(this.jar[name]) + "; expires=Fri, 31 Dec 1999 23:59:59 GMT;";
    }

}

var cookieJar = new CookieJar;


/**
 * updates the rico ajax engine to use our JS transport mechanism
 */
function setJSResponseMode() {
    ajaxEngine.sendRequest =
        function(requestName) {
            var requestURL = this.requestURLS[requestName];
            if ( requestURL == null ) {
                return;
            }

            var queryString = "";
            var args = [];
            for(i=0;i<arguments.length;++i) {
                args.push(arguments[i]);
            }
            args.push('js=1');
            requestURL = requestURL + '?' + this._createQueryString(args, 1);
            jsUpdateHandler.loadLibrary(requestURL);
//            new Ajax.Request(requestURL, this._requestOptions(queryString));
        }
}

if (!document.attachEvent && document.addEventListener) {
    document.attachEvent = function(e, l) {
        return document.addEventListener(e.substr(2), l);
    };
}



var JsFromXml = Class.create();
JsFromXml.prototype = {
    initialize: function(xml) {
        if(xml) {
            this.data = this.parse(xml);
        }
    },
    data: false,
    ajaxUpdate: function(xml) {
        var payload = xml.firstChild;
        this.data = this.parse(payload);
    },
    parse: function(xml) {
        if(!xml) {
            return false;
        }
        var type = xml.nodeName;
        var val = false;
        if(type == 'true') {
            val = true;
        } else if(type == 'false') {
            val = false;
        } else if(type == 'array') {
            val = [];

            var c = xml.childNodes.length;
            for(var i=0;i<c;++i) {
                var node = xml.childNodes[i];
                val[i] = this.parse(node);
            }
        } else if(type == 'hash') {
            var c = xml.childNodes.length;
            val = {};
            for(var i=0;i<c;++i) {
                var node = xml.childNodes[i];
                var mykey = node.getAttribute("key");
                val[ mykey ] = this.parse(node);
            }
        } else if(type == 'value') {
            val = this.parse(xml.firstChild);
        } else if(type == '#text') {
            val = xml.textContent || xml.text;
        } else if(type == 'resource') {
            val = false;
        } else if(type == 'object') {
            val = {};
        } else {
            // noop
        }
        return val;
    }
}

