 /*
----------------------------------------------------------------------------
 Author:       Marc-Antoine Latour
 Copyright (c) - 2002, Strategia

 Description
 ----------------------------------------------------------------------------
   - Browser API Return element,style attribute, Hide and show element
     based on the browser type. if not possible return null or dont hide or show
 ----------------------------------------------------------------------------
 History
 ----------------------------------------------------------------------------
  Date         User                Description
 ----------------------------------------------------------------------------
  2002/05/19   Marc-Antoine        Creation
  2002/05/31   Marc-Antoine        Ajout de fonction BrowserFamily,realHeight,
  								   realWidth
  2002/07/21   Marc-Antoine		   Amélioration du code
 ----------------------------------------------------------------------------
*/

	function BrowserID() { // Check DOM Browser
		if(parseInt(navigator.appVersion) >= 4)
			return (document.getElementById)? "DOM" : (document.layers)? "NN" : "IE";
		return "";
	}
	function BrowserFamily(){ //Check Family Browser
		return (navigator.appName=="Netscape") ? "NN" : "IE";
 	}

 	function GetElement(objTarget) { // Retourne Element chercher selon le browser sinon Null
		var myObj;
		var Root         = this;
		var BrowType     = Root.BrowserID();
		var BrowFamily   = Root.BrowserFamily();
		var strAllAccess = (BrowType == "IE")? "all." : "";
		
		if(typeof objTarget == "string") {
			if (objTarget.indexOf("/") > -1){
				try { var objWindow = eval(objTarget.split("/")[0]) }
				catch (er) { return null }
				objTarget = objTarget.split("/")[1]
			}else
				var objWindow = self;
            
            if (BrowType == "DOM") {
                myObj = eval(objWindow.document.getElementById(objTarget));
                if (myObj == null) {
                    myObj = objWindow.document.getElementsByName(objTarget);
                    if (myObj != null) {
                        if (myObj.length != null) {
                            if (myObj.length >= 1) {
                                myObj = myObj[0];
                            }
                            else {
                                myObj = null;
                            }
                        }
                    }
                    else {
                        myObj = null;
                    }
                }
            }
            else {
                myObj = eval("objWindow.document." + strAllAccess + objTarget);
            }
		} else {
			myObj = objTarget;
		}
		
		// Sous methode visible et hidden
		if (myObj != null){
			myObj.Show = function Show() { Root.Style(objTarget).display = "block"; }
			myObj.Hide = function Hide() { Root.Style(objTarget).display = "none";  }
			
			myObj.realHeight = getHeight(myObj) - 16;
			myObj.realWidth = getWidth(myObj) + 15;
			myObj.X = getTopLeft(myObj).Left;
			myObj.Y = getTopLeft(myObj).Top;


			    myObj.ShowPopPup = function ShowPopPup(sHtml, iWidth, iHeight) {
                    if (window.createPopup) {
                        var oPopup = window.createPopup();
                        var oPopupBody = oPopup.document.body;
                        oPopupBody.style.backgroundColor = "white";
                        oPopupBody.style.border = "solid #336699 2px";
                        oPopupBody.innerHTML = sHtml;
                        oPopup.show(myObj.X + 50, myObj.Y, iWidth + 40, iHeight + 35, document.body);
                    }
                    else {
                        var oPopup = document.createElement("div");    
                        oPopup.style.backgroundColor = "white";
                        oPopup.style.border = "solid #336699 2px";
                        oPopup.style.top = myObj.Y;
                        oPopup.style.left = myObj.X;
                        oPopup.style.width = iWidth + 40;
                        oPopup.style.height = iHeight + 55;
                        oPopup.style.position = "absolute";
                        oPopup.style.overflow = "auto";
                        oPopup.style.cursor = "pointer";
                        oPopup.innerHTML += sHtml;
                        document.body.appendChild(oPopup);
                        oPopup.focus();
                        oPopup.addEventListener('blur', function() { this.style.display="none"; }, false);
                        oPopup.addEventListener('click', function() { this.style.display="none"; }, false);
                    }
			    }
		}
		return myObj
	}
	
	function GetElements(objTarget) { // Retourne Collection Element chercher selon le browser sinon Null
		return (typeof objTarget == "object") ? objTarget : 
			   (this.BrowserID() == "DOM")? document.getElementsByName(objTarget) : null;
	}
	
	function GetStyleObject(objTarget) { // Retourne attribut style
		return (this.BrowserID() != "NN")? this.Element(objTarget).style : this.Element(objTarget)
	}

	function addListener(objTarget, strEventType, fnListener, withThis) {
	    var callfunctionWithThis = function () {
            if(withThis == null)
                return fnListener.apply(this, arguments);
            else
                return fnListener.apply(withThis, arguments);
        }
        
        if (this.BrowserFamily() == "IE") 
        {
            objTarget.attachEvent(strEventType, callfunctionWithThis)
        }
        else
        {
            switch(strEventType)
            {
                case "onload" :
                    strEventType = "load";
                    break;
                case "onresize" :
                    strEventType = "resize";
                    break;
                case "onscroll" :
                    strEventType = "scroll";
                    break;
                case "onpropertychange" :
                    strEventType = "DOMAttrModified";
                    break;
                case "onmouseover" :
                    strEventType = "mouseover";
                    break;
                case "onmouseout" :
                    strEventType = "mouseout";
                    break;
                case "onmousedown" :
                    strEventType = "mousedown";
                    break;
                case "onmousemove":
                    strEventType = "mousemove";
                    break;
                case "onmouseup":
                    strEventType = "mouseup";
                    break;
                case "oncontextmenu":
                    strEventType = "contextmenu";
                    break;
                case "onclick":
                    strEventType = "click";
                    break;
                    
            }
            objTarget.addEventListener(strEventType, callfunctionWithThis, false) //Event like IE by Bubling
        }
    }

    /*
    Developed by Robert Nyman, http://www.robertnyman.com
    Code/licensing: http://code.google.com/p/getelementsbyclassname/
    */
    var getElementsByClassName = function (className, tag, elm) {
        if (document.getElementsByClassName) {
            getElementsByClassName = function (className, tag, elm) {
                elm = elm || document;
                var elements = elm.getElementsByClassName(className),
				nodeName = (tag) ? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
                for (var i = 0, il = elements.length; i < il; i += 1) {
                    current = elements[i];
                    if (!nodeName || nodeName.test(current.nodeName)) {
                        returnElements.push(current);
                    }
                }
                return returnElements;
            };
        }
        else if (document.evaluate) {
            getElementsByClassName = function (className, tag, elm) {
                tag = tag || "*";
                elm = elm || document;
                var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace) ? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
                for (var j = 0, jl = classes.length; j < jl; j += 1) {
                    classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
                }
                try {
                    elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
                }
                catch (e) {
                    elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
                }
                while ((node = elements.iterateNext())) {
                    returnElements.push(node);
                }
                return returnElements;
            };
        }
        else {
            getElementsByClassName = function (className, tag, elm) {
                tag = tag || "*";
                elm = elm || document;
                var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all) ? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
                for (var k = 0, kl = classes.length; k < kl; k += 1) {
                    classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
                }
                for (var l = 0, ll = elements.length; l < ll; l += 1) {
                    current = elements[l];
                    match = false;
                    for (var m = 0, ml = classesToCheck.length; m < ml; m += 1) {
                        match = classesToCheck[m].test(current.className);
                        if (!match) {
                            break;
                        }
                    }
                    if (match) {
                        returnElements.push(current);
                    }
                }
                return returnElements;
            };
        }
        return getElementsByClassName(className, tag, elm);
    };

    // taken from Standard.js
    function IsIe() { return window.event && document.all; }
    function getMouseX(event) { return this.IsIe() ? window.event.x : event.clientX; }
    function getMouseY(event) { return this.IsIe() ? window.event.y : event.clientY; }
    this.getTopLeft = function (elm) {
        var x, y = 0;

        //set x to elm’s offsetLeft
        x = elm.offsetLeft;

        //set y to elm’s offsetTop
        y = elm.offsetTop;

        //set elm to its offsetParent
        elm = elm.offsetParent;

        //use while loop to check if elm is null
        // if not then add current elm’s offsetLeft to x
        //offsetTop to y and set elm to its offsetParent

        while (elm != null) {

            x = parseInt(x) + parseInt(elm.offsetLeft);
            y = parseInt(y) + parseInt(elm.offsetTop);
            elm = elm.offsetParent;
        }

        //here is interesting thing
        //it return Object with two properties
        //Top and Left

        return { Top: y, Left: x };
    }
    this.getHeight = function (element) {
        return element.clientHeight;
    }
    this.getWidth = function (element) {
        return element.clientWidth;
    }
    
    function eventY(e){
        return getMouseY(e);
    }
     
    function eventX(e){
        return getMouseX(e);
    }

    function swapNodes(item1, item2) {
        var itemtmp = item1.cloneNode(1);
        var parent = item1.parentNode;
        item2 = parent.replaceChild(itemtmp, item2);
        parent.replaceChild(item2, item1);
        parent.replaceChild(item1, itemtmp);
        itemtmp = null;
    }

function BrowserAPI() {
	this.BrowserFamily	= BrowserFamily;
	this.BrowserID 		= BrowserID;
	this.Element   		= GetElement;
	this.Elements  		= GetElements;
	this.Style     		= GetStyleObject;
    this.addListener    = addListener;
    this.eventY    = eventY;
    this.eventX = eventX;
    this.getElementsByClassName = getElementsByClassName;
    this.swapNodes = swapNodes;
}

// initialization de l'objet API.
var Browser = new BrowserAPI();


