/**
 * Lorsque l'interface 'Node' n'existe pas (ex : MSIE),
 * définit les constantes qui n'existent pas pour les types de noeud.
 */
if (!window.Node) {
    var Node = {
        ELEMENT_NODE: 1,
        ATTRIBUTE_NODE: 2,
        TEXT_NODE: 3,
        COMMENT_NODE: 8,
        DOCUMENT_NODE: 9,
        DOCUMENT_FRAGMENT_NODE: 11
    }
}

/**
  * fonction d'abstraction pour enregistrer un gestionnaire d'évènement
  * comprend le DOM standard, la syntaxe prorietaire MSIE, l'ancien modele HTML
  * @var Object source objet sur lequel ajouter le gestionnaire d'évènement
  * @var String type type d'évènement
  * @var EventListener callback fonction qui traitera l'évènement
  * @return boolean
 */
function addEvent(source, type, callback) {
    if (source.addEventListener){ // code standard DOM
        source.addEventListener(type, callback, false);
        return true;
    } else if (source.attachEvent){ // code propriétaire MSIE
        var r = source.attachEvent('on' + type, callback);
        return r;
    } else { // code navigateur sans support DOM-event
        //eval('source.on' + type + '= callback');
        return false;
    }
}

/**
  * fonction d'abstraction pour supprimer un gestionnaire d'évènement
  * comprend le DOM standard, la syntaxe prorietaire MSIE, l'ancien modele HTML
  * @var Object source objet sur lequel supprimer le gestionnaire d'évènement
  * @var String type type d'évènement
  * @var EventListener callback fonction qui traitera l'évènement
  * @return boolean
 */
function removeEvent(source, type, callback) {
    if (source.removeEventListener){ // code standard DOM
        source.removeEventListener(type, callback, false);
        return true;
    } else if (source.detachEvent){ // code propriétaire MSIE
        var r = source.detachEvent('on' + type, callback);
        return r;
    } else { // code navigateur sans support DOM-event
        //eval('source.on' + type + '= callback');
        return false;
    }
}

/**
 * Abstraction pour récuperer un objet standard de l'évènement en cours
 * Comprend le modèle DOM standard et le modèle propriétaire de MSIE
 * @var Event e paramètre reçu lors de l'appel du gestionnaire d'évènement
 * @return Event objet d'évènement standard
 */
function getStandardEvent(e) {
    if (e == null && window.event) {
        // cas particulier de MSIE pour recuperer l'evenement en cours
        e = window.event;
    }
    if (e.target == null && e.srcElement) {
        // cas particulier de MSIE pour recuperer la balise DOM cible
        e.target = e.srcElement;
    }
    if (! e.preventDefault) {
        // cas particulier de MSIE pour empecher l'action par defaut du navigateur
        e.preventDefault = function () { this.returnValue = false ; };
    }
    if (! e.stopPropagation) {
        // cas particulier de MSIE pour empecher la propagation de l'evenement
        e.stopPropagation = function () { this.cancelBubble = true ; };
    }
    return e;
}

/**
 * retrouve le parent de l'element ayant declenche l'evenement
 * @var Event e évènement DOM standard
 * @var String wantedOwner type d'élément recherché (ex: 'div')
 * @return Node
 */
function findEventOwner(e, wantedOwner) {
    var aNode = e.target;
    while(aNode && aNode.nodeType != Node.DOCUMENT_NODE) {
        if(aNode.nodeName.toLowerCase() == wantedOwner || aNode.nodeName.toLowerCase() == 'html:'+wantedOwner) {
            return aNode;
        }
        aNode = aNode.parentNode;
    }
    return null;
}

