/*
 * @ PmDiapo V1.0
 * @ Ronan Drouglazet
 * @ http://wwww.my-own-world.com/
 */ 

function pmDiapo(){
	
	// PRIVATE VAR //
	var _this = this ;
	var tempoInter = null;
	
	var objImage = {
		tabImg : [arguments[0], arguments[1], arguments[2], arguments[3] ],
		total : 4,
		incNum : 0,
		nowNum : 0,
		tabUrl : [arguments[4], arguments[5], arguments[6], arguments[7] ]
	}
	
	var buttons = {
		next : null,
		previous : null,
		puce : null
	}
	
	// PUBLIC VAR //
	this.options = new Object();
	this.debugMode = false ;
	this.addHtml = null;
	this.onChange = null;
	
	
	// PUBLIC FUNCTION
	this.init = function(){
		
		var tempLog = new String('pmDiapo init() - ');
		
		if(!_checkParam(this.options,4)){
			_log('pmDiapo init() - Paramètre width, height, container ou autoSlide manquant');
			return ;	
		}else{
			tempLog += 'width: ' + this.options['width'].toString() + ' ';
			tempLog += 'height: ' + this.options['height'].toString() + ' ';
			tempLog += 'container: ' + this.options['container'].toString() + ' ';
			tempLog += 'autoSlide: ' + this.options['autoSlide'].toString() + 'sec ';
			
			this.options.container = document.getElementById(this.options.container) || _class(this.options.container) || false ;
			
			_log(tempLog);
			
		}
			
		_initParent();
		_createDiv();
		_initPlacement();
		_preload();
		
		if(this.options.autoSlide)
			tempoInter = setInterval(_doAutoSlide,this.options.autoSlide*1000);
	}
		
	this.addButton = function(myButton){
		if(!myButton.type)
			_log('pmDiapo addButton - Paramètre indispensable "type". Valeurs attendues: "puce", "previous" or "next"');
		else
			_checkButton(myButton.type,myButton);
	}
	
	
	// PRIVATE FUNCTION
	
	function _createDiv(){
				
		var rdNumber = Math.floor(Math.random() * 10000000000);
		
		var divFixe = document.createElement('div');
			divFixe.id = 'pmDiapoFixe' + rdNumber ;
			
		var divMove = document.createElement('div');
			divMove.id = 'pmDiapoMove' + rdNumber ;
			
		_this.options.divFixe = divFixe ;
		_this.options.divMove = divMove ;
		
		_this.options.container.appendChild(divFixe);
		_this.options.container.appendChild(divMove);
			
	}
	
	function _initPlacement(){
		
		var elFStyle = _this.options.divFixe.style ; 
		var elMStyle = _this.options.divMove.style ;
		 
			elMStyle.position = elFStyle.position = 'absolute' ;
			elMStyle.left = _this.options.width + 'px' ;
			elMStyle.width = elFStyle.width = _this.options.width + 'px' ;
			elMStyle.height = elFStyle.height = _this.options.height + 'px' ;
			
	}
	
	function _initParent(){
		if(!_this.options.container){
			_log('pmDiapo error - Container is not a DOM Element');
			return ;	
		}
		
		var elStyle = _this.options.container.style ;
			elStyle.width = _this.options.width + 'px' ;
			elStyle.height = _this.options.height + 'px' ;
			elStyle.overflow = 'hidden' ;
			elStyle.position = 'relative' ;
			
	}
	
	function _doAutoSlide(){
		
		if(objImage.incNum == objImage.total-1)
			objImage.incNum = 0 ;
		else
			objImage.incNum++
		
		_doMove(objImage.incNum);
	}
	
	function _doMove(num){
		
		if(typeof _this.onChange == 'function')
			_this.onChange(num);
		
		if(_this.options.divFixe.getElementsByTagName('img')[0].src == objImage['img'+num].src){
			_this.options.divFixe.innerHTML = '' ;
			var temp = (num == (objImage.total-1)) ? 0 : (objImage.total-1) ;
			_this.options.divFixe.appendChild(objImage['img'+temp]);
		}
			
		//if(_this.addHtml[num])
			//_this.options.divMove.innerHTML = _this.addHtml[num] ;
		//else
			_this.options.divMove.innerHTML = '' ;
		
		_this.options.divMove.appendChild(objImage['img'+num]);
						
		var goFrom = new Number();
		
		if(num < objImage.nowNum && (num != 0 || objImage.nowNum == 1) || (num == (objImage.total-1) && objImage.nowNum == 0)  )
			goFrom = - _this.options.width ;
		else
			goFrom = _this.options.width ;
			
		if(buttons.puce){
			buttons.puce['dom'+num].onmouseover();
			var temp = objImage.nowNum ;
			objImage.nowNum = num ;
			buttons.puce['dom'+temp].onmouseout();
		}else
			objImage.nowNum = num ;
			
		
		
		var fComplete = function(){
			_this.options.divMove.style.left = _this.options.width + 'px' ;
			//if(_this.addHtml[num])
				//_this.options.divFixe.innerHTML = _this.addHtml[num] ;
			//else
				_this.options.divFixe.innerHTML = '' ;
			_this.options.divFixe.appendChild(objImage['img'+num]);
		}
			
		
		pmTransition(_this.options.divMove.id,'left','px',goFrom,0,1500,80,ease={type:'out'},onComplete={fct:fComplete});
		//$('#'+_this.options.divMove.id).animate({ left: 0 }, 600,'swing',fComplete);
		
	}
	
	function _addImage(num){
		var myImg = document.createElement('img');
			myImg.src = objImage.tabImg[num] ;
			myImg.width = _this.options.width ;
			myImg.height = _this.options.height ;
			
			//SPE PIXI * A RETIRER * //
			myImg.onclick = function(){
				window.open(objImage.tabUrl[num], '_blank');	
			};
			myImg.setAttribute('style','cursor:pointer') ;
			
		objImage['img'+num] = myImg ;
		
	}
	
	function _checkButton(type,obj){
		if(!_checkParam(obj,6)){
			_log('pmDiapo - add '+type+' button *ERROR*') ;
			_log('pmDiapo - Paramètre manquant (width, height, imgOn, imgOff ou container)') ;
			return ;
		}
		else if(!buttons[type])
			_log('pmDiapo - add '+type+' button on "' + obj.container +'"') ;
		else
			_log('pmDiapo - replace '+type+' button on "' + obj.container +'"') ;
		
		var succes = (type == 'puce') ? _addPuce(obj) : _addButton(type,obj) ;
		
		if(!succes){
			_log('pmDiapo - add '+type+' button *ERROR*') ;
			_log('pmDiapo - Paramètre container is not a DOM Element') ;	
		}		
	}
	
	function _addButton(type,obj){
		var el = document.getElementById(obj.container) || _class(obj.container) || false ;
		if(!el) return false ;
		
		buttons[type] = obj ;
		
		var domButtonOff = document.createElement('img');
			domButtonOff.src = obj.imgOff ;
			
		var domButtonOn = document.createElement('img');
			domButtonOn.src = obj.imgOn ;
		
		buttons[type].domOff = domButtonOff ;
		buttons[type].domOn = domButtonOn ;
		
		el.onmouseover = function(){
			this.innerHTML = '' ;
			this.appendChild(buttons[type].domOn);
			$(this).stop();
			if(type == 'next') $(this).animate({right:-26},'fast','swing');
			if(type == 'previous') $(this).animate({left:-26},'fast','swing');
		}
		el.onmouseout = function(){
			this.innerHTML = '' ;
			this.appendChild(buttons[type].domOff);
			$(this).stop();
			if(type == 'next') $(this).animate({right:-6},'fast','swing');
			if(type == 'previous') $(this).animate({left:-6},'fast','swing');
		}
		el.onmouseup = function(){
			if(objImage.incNum == 0 && type == 'previous')
				objImage.incNum = objImage.total-1 ;
			else if(objImage.incNum == objImage.total-1 && type == 'next')
				objImage.incNum = 0
			else
				var n = (type == 'previous') ? objImage.incNum-- : objImage.incNum++ ;
			
			if(tempoInter){
				clearInterval(tempoInter);
				tempoInter = setInterval(_doAutoSlide,_this.options.autoSlide*1000);
			}
			
			_doMove(objImage.incNum);	
		}
		
		el.style.width = parseInt(obj.width) + 'px' ;
		el.style.height = parseInt(obj.height) + 'px' ;
		el.style.cursor = 'pointer' ;
		el.appendChild(buttons[type].domOff);
		
		return true ;
		
		
	}
	
	function _addPuce(obj){
		var el = document.getElementById(obj.container) || _class(obj.container) || false ;
		if(!el) return false ;
		
		buttons['puce'] = obj ;
		
		for(var i = 0; i < objImage.total; i++){
			buttons['puce']['dom'+i] = document.createElement('div');
			buttons['puce']['dom'+i].setAttribute('style','width:'+obj.width+'px;height:'+obj.height+'px;display:inline;cursor:pointer');
			buttons['puce']['dom'+i].setAttribute('num',i);
			buttons['puce']['dom'+i].onmouseover = function(){
				if(this.getAttribute('num') == objImage.nowNum) return ;
				this.innerHTML = '' ;
				this.appendChild(buttons['puce']['domOn'+this.getAttribute('num')]);
			}
			buttons['puce']['dom'+i].onmouseout = function(){
				if(this.getAttribute('num') == objImage.nowNum) return ;
				this.innerHTML = '' ;
				this.appendChild(buttons['puce']['domOff'+this.getAttribute('num')]);
			}
			buttons['puce']['dom'+i].onmouseup = function(){
				if(objImage.incNum == this.getAttribute('num'))
					return ;
				
				objImage.incNum = this.getAttribute('num') ;
				
				if(tempoInter){
					clearInterval(tempoInter);
					tempoInter = setInterval(_doAutoSlide,_this.options.autoSlide*1000);
				}
				
				_doMove(objImage.incNum);	
			}
			
				
			buttons['puce']['domOff'+i] = document.createElement('img');
			buttons['puce']['domOff'+i].src = obj.imgOff ;
			
			buttons['puce']['domOn'+i] = document.createElement('img');
			buttons['puce']['domOn'+i].src = obj.imgOn ;
			
			buttons['puce']['domOff'+i].width = buttons['puce']['domOn'+i].width = obj.width ;
			buttons['puce']['domOff'+i].height = buttons['puce']['domOn'+i].height = obj.height ;
			
			el.appendChild(buttons['puce']['dom'+i]);
			
			var str = (i == 0) ? 'domOn' : 'domOff' ;
			buttons['puce']['dom'+i].appendChild(buttons['puce'][str+i]);
		}
		
		return true ;
	}
	
	function _preload(){
		for(var i = 0 ; i < objImage.total ; i++)	
			_addImage(i);
		
		//if(_this.addHtml[0])
			//_this.options.divFixe.innerHTML = _this.addHtml[0] ;
			
		_this.options.divFixe.appendChild(objImage['img0']);
	}
	
	function _log(e){
		try{
			if(_this.debugMode && console)
				console.log(e);
		}catch(e){
			
		}
	}
	
	function _class(cName){
		var i = 0;
		var div = document.getElementsByTagName("div");
		while (element = div[i++]) {
			if (element.className == cName) 
				return element ;
		}
	}
	
	function _checkParam(obj,att){
		var tempNb = 0 ;
		
		for(var i in obj)
			tempNb++ ;
		
		if(tempNb == att)
			return true ;
		else
			return false ;
	}
	
}

