var vanilla =
{
    Version	: '0.1', 
    
    namespace : function(name)
    {
	if ( !name )
	{
	    return window;
	}

	var current = vanilla.window;
	var names = name.split('.');
	for ( var i = 0 ; i < names.length ; i++ )
	{
	    var name = names[i];
	    current[name] = current[name] || {};
	    current = current[name];
	}
	
	return current;
    },

    extend : function(obj, properties, notOverride)
    {
	if ( !obj || !properties )
	{
	    return;
	}
	
	for ( property in properties )
	{
	    if ( !notOverride || !obj[property] )
	    {
		obj[property] = properties[property];
	    }
	}
    },

    // log in a console if defined
    console : function(s)
    {
	if ( window['console'] && console.log )
	{
	    console.log(s);
	}
    },

    debug : function(s)
    {
	if ( !document.body )
	{
	    document.write(s + "<br />");
	}
	else
	{
	    var d = document.getElementById("vanilla-debug");
	    if ( !d )
	    {
		d = document.createElement("DIV");

		d.style.font	= "menu";
		d.style.clear	= "both";
		d.id 		= "vanilla-debug";

		document.body.appendChild(d);
	    }

	    d.innerHTML += (s + "<br>");
	}
    },

    exists : function(name)
    {
	if ( !name )
	{
	    return false;
	}

	var current = window;
	var names = name.split('.');
	for ( var i = 0 ; i < names.length ; i++ )
	{
	    current = current[ names[i] ];
	    if ( !current )
	    {
		    return false;
	    }
	}
	
	return true;
    },

    require : function(e)
    {
	if ( !vanilla.exists(e) )
	{
	    throw ("The package is required : " + e);
	}
    },

    // dans le cas ou la lib vanilla.event n'est pas importée, donc les évènements non gérés, 
    // cette méthode permet d'inscrire une callback sur le onload de la library, donc de la window
    addOnloadListener : function(callback, target)
    {
	if ( !this.onLoadCallbacks )
	{
	    this.onLoadCallbacks = new Array();
	}

	this.onLoadCallbacks.push({callback : callback, target : target || window});
    },

    onload : function()
    {
	if ( !vanilla.onLoadCallbacks )
	{
	    return;
	}

	for ( var i = 0 ; i < vanilla.onLoadCallbacks.length ; i++ )
	{
	    var c =  vanilla.onLoadCallbacks[i];
	    c.callback.call(c.target);
	}
    },

    emptyFunction : function(){}
};

vanilla.window = this;
vanilla.isBoggyIE = (document.all && !window.opera && (navigator.vendor != 'KDE') ? true : false);

if ( vanilla.isBoggyIE )
{
    window.attachEvent("onload", vanilla.onload);
}
else
{
    // TODO utiliser le DOMContentLoaded sur les plateformes l'utilisant
    window.addEventListener("load", vanilla.onload, false);
}

