/* 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;
}

Array.prototype.inArray = function(value) {
	var i;
	for (i=(this.length-1); i>=0; i--) { //for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
};

/* 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;
}

/* misc */
function isUndefined(v) {
    var undef;
    return v===undef;
}

/* 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 getElementsByAttribute(oElm, strTagName, strAttributeName, strAttributeValue){
    // Copyright Robert Nyman, http://www.robertnyman.com - Free to use if this text is included
	var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	var oAttributeValue = (typeof strAttributeValue != "undefined")? new RegExp("(^|\\s)" + strAttributeValue + "(\\s|$)") : null;
	var oCurrent;
	var oAttribute;
	for(var i=0; i<arrElements.length; i++) {
		oCurrent = arrElements[i];
		oAttribute = oCurrent.getAttribute(strAttributeName);
		if (typeof oAttribute == "string" && oAttribute.length > 0) {
			if (typeof strAttributeValue == "undefined" || (oAttributeValue && oAttributeValue.test(oAttribute))){
				arrReturnElements.push(oCurrent);
			}
		}
	}
	return arrReturnElements;
}

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) });
}

function hasClass(elem, className) {
    return getElem(elem).className.split(' ').has(className);
}

function $() {
    // quick getElement reference : document.getElementById('a') devient $('a'), $('a','b',obj,obj2,'c','d');
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements[elements.length] = element; // elements.push(element);
	}
	return elements;
}

/*dom events */
function addLoadEvent(func) {
    listen('load', window, func);
}

function insertAfter(parent, node, referenceNode) {
	parent.insertBefore(node, referenceNode.nextSibling);
}

/*
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';
}

function mlisten(event, elem_list, func) {
    map(elem_list, function(elem) { listen(event, elem, func) } );
}
*/
			function listen(eventType, e, eventListener, useCapture)
			{
				eventType = eventType.toLowerCase();
				if (e.attachEvent) {
					e.attachEvent("on"+eventType, eventListener);
				} else if (e.addEventListener) {
					e.addEventListener(eventType, eventListener, false);
				}
			}
			
			function mlisten(event, elem_list, func) {
			    map(elem_list, function(elem) { listen(event, elem, func, false) } );
			}

			function xEvent(evt, defaultAction)
			{
				this.type = "";
				this.target = null;
				var e = evt ? evt : window.event;
				if (!e)
					{return;}
				// stop propagation
				e.cancelBubble = true;
				if (e.stopPropagation)
					e.stopPropagation();
				// désactive l'action par défaut
				if (!defaultAction) {
					e.returnValue  = false;
					if (e.preventDefault)
						e.preventDefault( );
				}
				// type
				if(e.type)
					this.type = e.type;
				// target
				if(e.target)
					this.target = e.target;
				else if(e.srcElement)
					this.target = e.srcElement;
				// keyCode
				if (e.keyCode)
					this.keyCode = e.keyCode;
			}



function toggle(obj) {
	var el = document.getElementById(obj);
	if ( el.style.display != 'none' )
		el.style.display = 'none';
	else
		el.style.display = '';
}

function W3CDOM_Event(currentTarget) {
    this.currentTarget  = currentTarget;
    this.preventDefault = function() { window.event.returnValue = false };
    return this;
}

/* cookies */
function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ";", len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}
	
function setCookie( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+"="+escape( value ) +
		( ( expires ) ? ";expires="+expires_date.toGMTString() : "" ) + //expires.toGMTString()
		( ( path ) ? ";path=" + path : "" ) +
		( ( domain ) ? ";domain=" + domain : "" ) +
		( ( secure ) ? ";secure" : "" );
}
	
function deleteCookie( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + "=" +
			( ( path ) ? ";path=" + path : "") +
			( ( domain ) ? ";domain=" + domain : "" ) +
			";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

/* popup */
var _POPUP_FEATURES = ''; // These defaults should be changed the way it best fits your site

function rawPopup(url, target, features) {
    // pops up a window containing url optionally named target, optionally having features
    if (isUndefined(features)) features = _POPUP_FEATURES;
    if (isUndefined(target)) target = '_blank';
    var theWindow = window.open(url, target, features);
    theWindow.focus();
    return theWindow;
}

function linkPopup(src, features) {
    // to be used in an html event handler as in: <a href="..." onclick="linkPopup(this,...)" ...
    // pops up a window grabbing the url from the event source's href
    return rawPopup(src.getAttribute('href'), src.getAttribute('target') || '_blank', features);
}
/*
function eventPopup(e) {
    // to be passed as an event listener
    // pops up a window grabbing the url from the event source's href
    linkPopup(e.currentTarget);
    e.preventDefault();
}
*/
function eventPopup(ev) {
    var event = new xEvent(ev, false);
    linkPopup(event.target);
}

function eventPopupFeatures(features) {
    // generates an event listener similar to eventPopup, but allowing window features
    return function(e) { linkPopup(e.currentTarget, features); e.preventDefault() }
}

function popUpImage(url) {
	i1 = new Image;
	i1.src = url;
    html = '<html>'
        + '<head>'
        + '<title>image</title>'
        + '</head>'
        + '<body style="margin: 0;padding: 0;text-align: center;">'
		+ '<img src="' + url + '" style="margin: 0;border: none;padding: 0;" name="imageTest" '
		+ 'onLoad="window.resizeTo(document.imageTest.width+14,document.imageTest.height+38)">'
        + '</body>'
        + '</html>';
	if (window.pupimg) popupImage.close();
	var pupimg = window.open('','image','toolbar=0,location=0,directories=0,menuBar=0,scrollbars=0,resizable=1');
	pupimg.document.open();
	pupimg.document.write(html);
	pupimg.document.close();
	pupimg.focus();
}
