// http://v2studio.com/k/code/lib/
// Librarie developee by Caio Chassot
// Modifiee par Pierre Lemieux, plemieux@caractera.com

// ARRAY EXTENSIONS

if (!Array.prototype.push) Array.prototype.push = function() {
    for (var i=0; i<arguments.length; i++) this[this.length] = arguments[i];
    return this.length;
}
Array.prototype.find = function(value, start) {
    start = start || 0;
    for (var i=start; i<this.length; i++)
        if (this[i]==value)
            return i;
    return -1;
}
Array.prototype.has = function(value) {
    return this.find(value)!==-1;
}

// FUNCTIONAL

function map(list, func) {
    var result = [];
    func = func || function(v) {return v};
    for (var i=0; i < list.length; i++) result.push(func(list[i], i, list));
    return result;
}
function filter(list, func) {
    var result = [];
    func = func || function(v) {return v};
    map(list, function(v) { if (func(v)) result.push(v) } );
    return result;
}

// DOM

function getElem(elem) {
    if (document.getElementById) {
        if (typeof elem == "string") {
            elem = document.getElementById(elem);
            if (elem===null) throw 'cannot get element: element does not exist';
        } else if (typeof elem != "object") {
            throw 'cannot get element: invalid datatype';
        }
    } else throw 'cannot get element: unsupported DOM';
    return elem;
}
function hasClass(elem, className) {
    return getElem(elem).className.split(' ').has(className);
}
function getElementsByClass(className, tagName, parentNode) {
    parentNode = !isUndefined(parentNode)? getElem(parentNode) : document;
    if (isUndefined(tagName)) tagName = '*';
    return filter(parentNode.getElementsByTagName(tagName),
        function(elem) { return hasClass(elem, className) });
}

// DOM EVENTS

function listen(event, elem, func) {
    elem = getElem(elem);
    if (elem.addEventListener){ // W3C DOM
        elem.addEventListener(event,func,false);
	}else if (elem.attachEvent){ // IE DOM
        elem.attachEvent('on'+event, function(){ func(new W3CDOM_Event(elem)) } );
        // for IE we use a wrapper function that passes in a simplified faux Event object.
    //else throw 'cannot add event listener';
	//else elem['on'+event] = function(){ func(new W3CDOM_Event(elem)) };
	}else{
		var oldfunc = elem['on'+event];
		if (typeof elem['on'+event] != 'function'){
			elem['on'+event] = function(){ func(new W3CDOM_Event(elem)) };
		}else{
			elem['on'+event] = function(){
				oldfunc();
				func(new W3CDOM_Event(elem));
			}
		}
	}
}
function mlisten(event, elem_list, func) {
    map(elem_list, function(elem) { listen(event, elem, func) } );
}
function W3CDOM_Event(currentTarget) {
    this.currentTarget = currentTarget;
	this.target = window.event.srcElement;
    this.preventDefault = function() { window.event.returnValue = false }
	return this;
}

// MISC CLEANING-AFTER-MICROSOFT STUFF

function isUndefined(v) {
    var undef;
    return v===undef;
}

// OUVRE/FERME LE SOUS-MENU (MENU GAUCHE)
function open_menu(e) {
	var m = e.currentTarget;
	var t = (e.target) ? e.target : e.srcElement;
	if (t) {
		if (t.nodeType == 3) t = t.parentNode;	// defeat Safari bug
		if (m != t) return;
	}
	m = m.firstChild;
	while (m.nodeName != 'UL') m = m.nextSibling;
	m.style.display = (m.style.display != 'block') ? 'block' : 'none';
	if (m.parentNode.className.indexOf('smenu') > -1) {
		m.parentNode.className = (m.style.display == 'block') ? 'smenu select' : 'smenu';
	}
}


//demarrage des librairies sur onLoad

listen('load', window, function() {
	mlisten('click', getElementsByClass('smenu','li'), open_menu );
});

