// Librairie générique pour accéder au DOM et attacher des événements 
// de façon uniforme dans tous les fureteurs

// Librarie originale developee by Caio Chassot
// http://v2studio.com/k/code/lib/
// Modifiee par Pierre Lemieux, pierre@forgenumerique.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.preventDefault = function() { window.event.returnValue = false }
    return this;
}

// MISC CLEANING-AFTER-MICROSOFT STUFF

function isUndefined(v) {
    var undef;
    return v===undef;
}


// change le display à NONE pour tous les éléments d'un même class
function hideAll(obj_class, obj_tag) {
	objlist = getElementsByClass(obj_class, obj_tag);
 	ln = objlist.length;
 	for (i=0; i<ln; i++) {
 		objlist[i].style.display = 'none';
 	}
}

// réinitialise le class pour tous les éléments d'un même class
// et enlève le class SELECT le cas échéant
function resetAll(obj_class, obj_tag) {
	objlist = getElementsByClass(obj_class, obj_tag);
 	ln = objlist.length;
		for (i=0; i<ln; i++) {
 		objlist[i].className = obj_class;
 	}
}

function showTarget(curr, wrapper_class, link_class) {
	hideAll(wrapper_class,'DIV');
	resetAll(link_class,'LI');
	pos = curr.indexOf('#');
	curr = curr.substr(pos+1);
	document.getElementById(curr).style.display = 'block';
	document.getElementById(curr+'_link').className = link_class+' select';
	
	// write current target to cookie so we can use it to retrieve state when using the Back button
	if (document.cookie) {
		if (wrapper_class == 'archive_items') document.cookie = "archiveTarget=" + curr + "; path=/;";
		if (wrapper_class == 'filmdata_content') document.cookie = "filmdataTarget=" + curr + "; path=/;";
	}
}


