String.prototype.equals = function(strChar, ignoreCase)
{
    
    if (!strChar) {return false;}
    strChar += '';
    if (!ignoreCase)
        return (this == strChar);
    else
        return (this.toUpperCase() == strChar.toUpperCase());
}


// ****************************************
// Cookies
//
//  - setValue(String, String)
//  - setValue(String, String, Integer)
//  - setValue(String, String, Integer, String)
//  - setValue(String, String, Integer, String, String)
//  - setValue(String, String, Integer, String, String, String)
//  - getValue(String)
//
// ****************************************

    var Cookies = {

        // setValue(name, value, seconds, path, domain, secure)
        setValue: function(name, value) {
            var argv = arguments;
            var argc = arguments.length;
            
            if( argc > 2 )
            {
                var cdate   = new Date();
                var expires = new Date(cdate.getTime() + (argv[2]*1000));
            }
            else
            {
                var expires = null;
            }
            
            var path    = (argc > 3) ? argv[3] : null;
            var domain  = (argc > 4) ? argv[4] : null;
            var secure  = (argc > 5) ? argv[5] : false;
            
            document.cookie = name + "=" + escape(value)
                + ((expires == null) ? "" : ("; expires=" + expires))
                + ((path == null) ? "" : ("; path=" + path))
                + ((domain == null) ? "" : ("; domain=" + domain))
                + ((secure == true) ? "; secure" : "");
        },
        
        // getValue(name)
        getValue: function(name) {
            if( document.cookie )
            {
                var arg = name + '=';
                var i   = 0;
                
                while( i < document.cookie.length )
                {
                    var j = i + arg.length;
                    if( document.cookie.substring(i, j) == arg )
                    {
                        var endstr = document.cookie.indexOf(';', j);
                        if( endstr == -1 )
                        {
                            endstr = document.cookie.length;
                        }
                        
                        return unescape(document.cookie.substring(j, endstr));
                    }
                    
                    i = document.cookie.indexOf(' ', i) + 1;
                    if( i == 0 ) break;
                }
            }
            
            return null;
        }
    }

    var QueryString = 
    {
        getValue: function(name)
        {
            var params = window.location.search.substring(1).split('&');
            
            for ( QueryString_i = 0 ; QueryString_i < params.length ; QueryString_i++ )
            {
                if ( params[QueryString_i].split('=')[0].toUpperCase() == name.toUpperCase() )
                    return params[QueryString_i].split('=')[1];
            }
            return null
        }
    }    

Ajax = function() {

        var xhr_object = null;
        
        // On declare un pointeur en memoire stockant l'instance de l'objet
        var me = this;
            
        this.contentFinished = function(e) {}
        
        this.onContentFinished = function()
            { 
                if ( xhr_object.readyState == 4 )
                {
                    // On fait reference au pointeur memoire
                    me.contentFinished(xhr_object);
                }
            }
        

        // getContentStart(url [, method = 'GET' [, params = null ] ])
        this.getContentStart = function(fileName)
        {
        
            xhr_object = null;
            
            var argv = arguments;
            var argc = arguments.length;

            var method = (argc > 1) ? argv[1] : 'GET';
            var params = (argc > 2) ? argv[2] : null;
            var useAsync = true;


            if(window.XMLHttpRequest) // Firefox
               xhr_object = new XMLHttpRequest();
            else if(window.ActiveXObject) // Internet Explorer
               xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
            else // XMLHttpRequest non supporté par le navigateur
               throw("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");

            // TODO : revoir les params 
            if ( params != null )
            {
                fileName += '?';
                for ( s in params )
                    fileName += s[0] + '=' + s[1] + '&';

                fileName = fileName.remove(fileName.length - 1, 1);
            }
            
            xhr_object.open(method, fileName, useAsync);
            
            // On fait reference au pointeur memoire
            xhr_object.onreadystatechange = me.onContentFinished;

            if ( method == "POST" ) 
    	        xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
	 
	        xhr_object.send(params); 
        }
        
    }
 
 
XSLT = function() 
{

    var me = this;
    
    // event declenché quand la transfo est fini, passe un object xmlDocument en paramètre
    this.finished = function(e){}

    this.transform = function(XML, XSL)
    {
   
        // Gecko 
        if ( window.XSLTProcessor ) 
        {
            var obj_Ajax_XSL = new Ajax();
            obj_Ajax_XSL.getContentStart(XSL);
            
            obj_Ajax_XSL.contentFinished = function(XSL_File)
                {
                    var xslStylesheet, myDOM, xmlDoc;
                    var xsltProcessor = new XSLTProcessor();

                    xslStylesheet = XSL_File.responseXML;
                    xsltProcessor.importStylesheet(xslStylesheet);

                    var obj_Ajax_XML = new Ajax();
                    obj_Ajax_XML.getContentStart(XML);
                    obj_Ajax_XML.contentFinished = function(XML_File)
                        {
                            xmlDoc = XML_File.responseXML;
                            var fragment = xsltProcessor.transformToFragment(xmlDoc, document);
                            var tmpElement = document.createElement('p'); 
                            tmpElement.appendChild(fragment)
                            me.finished(tmpElement.innerHTML);
                        }
                }
        }

        // Internet Explorer
        else if ( window.ActiveXObject )
        {

            var xsltTree = new ActiveXObject("Msxml2.DOMDocument");
            xsltTree.async = true;
            xsltTree.load(XSL);

            xsltTree.onreadystatechange = function()
                {
                    if ( xsltTree.readyState == 4)
                    {
                        var srcTree = new ActiveXObject("Msxml2.DOMDocument");
                        srcTree.async = true;
                        srcTree.load(XML); 
                        srcTree.onreadystatechange = function()
                            {
                                if ( srcTree.readyState == 4)
                                    me.finished(srcTree.transformNode(xsltTree));                                            
                            }
                    }     
                }
        }
        else
            throw('Votre navigateur ne supporte pas les transformations xslt coté client.');
  
    }
      
}

function debug(o)
 {
    var s = null;
    for ( p in o )
        s += p + ' - ' + this[p] + '\r\n';
    alert(s);
}