/*
	@ BenoÃ®t Rouches
	@ benoitrouches@gmail.com
*/

function fwk() {

	var timeout = new Array();
	
	//
	// Compare 2 objets JSON, en retourne un nouveau avec les valeurs de settings si elles sont dÃ©finies Ã  la place des valeurs de defaults  
	//
	this.params = function(defaults, settings) {
		for (var i in defaults) {
			settings[i] = ( typeof(settings[i]) == 'undefined' ) ? defaults[i] : settings[i]; 
		}	
		return settings;
	};
	//
	// Retourne un objet HTML ou une collection d'objets HTML
	//	arg : #id / .class / tag / #id > .class / #id > tag
	this.$ = function(str) {
		if( typeof str == 'object' )
		return this.$event(str);
		else {
			if(str.indexOf('>') != -1) { 
				var array = str.split(' > ');
				var container = this.trim(array[0]);
				var tag     =   this.trim(array[1]);
				var elmt = new Array; 
				elmt = tag.split('.');
				if(elmt.length == 2) {
					tag = elmt[0];
					var cls = elmt[1];
				}

				if(typeof(cls) == 'undefined') {
					if( this.$id(container) )
					return this.$id(container).getElementsByTagName(tag);
					else
					return false;
				}
				else
					return this.$class(cls, this.$id(container), tag);
			}
			else {
				if(str.charAt(0) == '.')
				return this.$class(str);
				else if(str.charAt(0) == '#')
				return this.$id(str);
				else
				return document.getElementsByTagName(str);
			}
		}
	}
	//
	// Retourne un objet HTML Ã  partir de son id
	//
	this.$id = function(id) {
		if( document.getElementById(this.deletePrefix(id)) )
			return document.getElementById(this.deletePrefix(id));	
		else
			return false;
	};
	//
	// Retourne l'objet HTML sur lequel Ã  eu lieu un Ã©vÃ¨nement 
	//
	this.$event = function(e) {
		// syntaxe DOM / syntaxe MSIE
		var e = e || window.event;
		var el = e.target || e.srcElement;
		return el;	
	};
	//
	// Retourne les objets HTML Ã  partir d'une classe 
	//
	this.$class = function(className, elmt, tag)
	{
		var className = this.deletePrefix(className);
		var testClass = new RegExp("\s?" + className + "\s?");
		var tag = tag || "*";
		var elmt = elmt || document;
		var elements = (tag == "*" && elmt.all)? elmt.all : elmt.getElementsByTagName(tag);
		var returnElements = [];
		var current;
		var length = elements.length;
		for(var i=0; i<length; i++) {
			current = elements[i];
			if(testClass.test(current.className)) {
			returnElements.push(current);
			}
		}
		return returnElements;
	}
	//
	// Retourne l'objet HTML du tag spÃ©cifiÃ© Ã  partir de l'objet HTML enfant passÃ© en argument
	//
	this.findElement = function(elmt, tag) {
		elmt = elmt.parentNode;
		if(elmt.tagName != tag)
		return this.findElement(elmt, tag);
		else
		return elmt;
	};
	//
	// Retourne l'objet HTML de l'id spÃ©cifiÃ© Ã  partir de l'objet HTML enfant passÃ© en argument
	//	
	this.findElementbyId = function(elmt, _id) {	
		_id = this.deletePrefix(_id);
		elmt = elmt.parentNode;
		if(elmt.tagName != undefined) {
			if(elmt.id != _id)
			return this.findElementbyId(elmt, _id);
			else
			return elmt;
		}
		else
		return elmt;
	}	
	//
	// Gestionnaire d'Ã©vÃ©nements
	//
	this.addListener = function(element, baseName, handler) {
		if(element.addEventListener)
		element.addEventListener(baseName, handler, false);
		else if(element.attachEvent) // MSIE 
		element.attachEvent('on' + baseName, handler);
	};
	//
	// Teste si une classe existe
	// @Will_Rickards / http://snippets.dzone.com/
	this.hasClassName = function(objElement, strClass) {
		if( objElement.className ) {
			var strClass = this.deletePrefix(strClass);
			var arrList = objElement.className.split(' ');
			var strClassUpper = strClass.toUpperCase();
		    for ( var i = 0; i < arrList.length; i++ ) {
				if ( arrList[i].toUpperCase() == strClassUpper )
	            return true;
			}
         }
		return false;
	};
	//
	// Ajoute une classe
	// @Will_Rickards / http://snippets.dzone.com/
	this.addClass = function(objElement, strClass) {	
		var strClass = this.deletePrefix(strClass);
		if (objElement.className) {
			var arrList = objElement.className.split(' ');
      		if ( !this.hasClassName(objElement, strClass) ) {         	
           		var strClassUpper = strClass.toUpperCase();

         		for ( var i = 0; i < arrList.length; i++ ) {
            		if ( arrList[i].toUpperCase() == strClassUpper ) {
              			arrList.splice(i, 1);
						i--;
					}
	            }
			arrList[arrList.length] = strClass;
      		// add the new class to beginning of list
      		//arrList.splice(0, 0, strClass);
      		// assign modified class name attribute
      		objElement.className = arrList.join(' ');
			}
      	}
		// if there was no class
		else {		
            objElement.className = strClass;
		}
	};
	//
	// EnlÃ¨ve une classe
	// @Will_Rickards / http://snippets.dzone.com/		
	this.removeClass = function(objElement, strClass) {
		if ( objElement.className )
		{
			var strClass = this.deletePrefix(strClass);
			var arrList = objElement.className.split(' ');
			var strClassUpper = strClass.toUpperCase();

			for ( var i = 0; i < arrList.length; i++ )
			{
         		if ( arrList[i].toUpperCase() == strClassUpper )
            	{
           			arrList.splice(i, 1);
					i--;           
	            }
         	}      		
      		objElement.className = arrList.join(' ');
         }
	};	
	//
	// Stoppe la propagation
	//
	this.stopEvent = function(e) {	   		
		if(e.stopPropagation) { // DOM
        	e.stopPropagation();
        	e.preventDefault();
    	}
		else { // MSIE 
        	e.cancelBubble = true;
        	e.returnValue = false;
    	}
	};
	//
	// Ouverture d'une connexion
	//
	this.createRequestObject = function()
	{
    	if(window.XMLHttpRequest)
		return new XMLHttpRequest();
    
		else if(window.ActiveXObject)
        return new ActiveXObject("Microsoft.XMLHTTP");
    }
	//
	// Effet fadeIn
	//
	this.fadeIn = function(settings) {
		var settings = (typeof settings != 'object') ? {} : settings;
		settings = this.params({
		objectHtml   : '',
		duration     : 'fast',
		uniqId       : ''
     	},settings);

		if (typeof(settings.objectHtml) == 'object')
		{
			settings.objectHtml.style.display = 'block';
			settings.objectHtml.style.visibility = 'hidden';			
			var timer = 0;
			var duration = ( settings.duration == 'fast' ) ? 4 : 15; 
			var browser = this.getUserAgent();
			browser = browser[0]+browser[1];
			
			for(var i = 0; i <= 100; i++) {
				 if( timeout[settings.uniqId+i] ) clearTimeout(timeout[settings.uniqId+i]);
			}	
		
			for(var i = 0; i <= 100; i++) {
				timeout[settings.uniqId+i] = setTimeout( function(i) { return function(){ display(i); } }(i),(timer * duration));
				timer++;
			}

			function display(opacity) {
				settings.objectHtml.style.visibility = 'visible';
				settings.objectHtml.style.opacity = opacity/100; // CSS3
				settings.objectHtml.style.MozOpacity = opacity/100;
				settings.objectHtml.style.KhtmlOpacity = opacity/100;		
				if(browser == 'msie6' || 'msie7')
				settings.objectHtml.style.zoom = 1; // HACK MSIE  v < 8
				settings.objectHtml.style.filter = "alpha(opacity=" + opacity + ")"; // MSIE 	
			}
		}
	};
	//
	// Retourne le nom du navigateur et sa version 
	//
	this.getUserAgent = function() {
		var browser;
		var version;
		var array = new Array();
		var ua = navigator.userAgent.toLowerCase();
		if( ua.indexOf('konqueror') != -1)
		browser = 'konqueror';
		else if( ua.indexOf('chrome') != -1)
		browser = 'chrome';
		else if( ua.indexOf('opera') != -1)
		browser = 'opera';
		else if( ua.indexOf('safari') != -1)
		browser = 'safari';
		else if( ua.indexOf('firefox') != -1)
		browser = 'firefox';
		else if( ua.indexOf('msie') != -1)
		browser = 'msie';
		
		if( browser != undefined)
		version = ua.charAt( ua.indexOf(browser) + 1 + browser.length);
		
		if ( version != undefined )
		array.push(browser,version);
		else
		array.push('undefined','undefined');
		
		return array;
	};	
	//
	// Supprime le # ou le . d'un id ou d'une classe
	//
	this.deletePrefix = function(str) {
		return str.replace(new RegExp('^#|\\.'), '');
	};
	//
	// Equivalent de la fonction php trim 
	//
	this.trim = function(str) {
		return str.replace( new RegExp('^\\s+'), '' ).replace( new RegExp('\\s+$'), '' );
	};
	
	this.getClassName = function(obj) { 
		if (typeof obj != "object" || obj === null) return false; 
		return /(\w+)\(/.exec(obj.constructor.toString())[1]; 
	};
	//
	// Retourne les variables d'une url
	//
	this.getUrlVar = function(url) {
		var params = url.search.substring(1).split('&');
		var v = new Array;
		for (var i = 0; i < params.length; i++) {
			var a = params[i].split('=');
			v[a[0]] = a[1];
		}
		return v;
	};
	//
	// Afficher un Ã©lÃ©ment
	//
	this.show = function(elmt) {
		if(this.$id(elmt))
		this.$(elmt).style.display = 'block';
	};
	//
	// Cacher un Ã©lÃ©ment
	//
	this.hide = function(elmt) {
		if(this.$id(elmt))
		this.$(elmt).style.display = 'none';
	};
}
