 /***************************************************************************
 *                            mimeEffect.js
 *                            -------------------
 *   version              : 0.4.6
 *   copyright            : GPL v2
 *   email                : info@mrmime.net
 *   author               : Emiliano Matarazzo
 *
 ***************************************************************************
 *                                 Comments
 *                            -------------------
 *  Javascript Graphics Effects Library
 *
 ***************************************************************************/


	/* GENERIC FUNCTIONS ***************************************************/

	function mimeCleanChildren (obj) {
		var l = obj.childNodes.length;
		var realChildren = new Array();
		for (var i=0;i<l;i++){
			var child = obj.childNodes[i];
			if (child.nodeType == 3){
			   obj.removeChild(child);
			   l--;
		    }
		}
		return;
	}
	
	
	function getCurrentStyle (obj) {
	    if (obj.currentStyle != null)
	        return obj.currentStyle;
	    if (window.getComputedStyle != null)
	        return window.getComputedStyle(obj, null);
	    return null;
	}
	
	
	function mimeSetOpacityId (id,opacity) {
		var obj = document.getElementById(id);
		mimeSetOpacity(obj,opacity);
	}
	
	
	function mimeSetOpacity (obj,opacity) {
	    obj.style.opacity = (opacity / 100);
	    obj.MozOpacity = (opacity / 100);
	    obj.KhtmlOpacity = (opacity / 100);
	    obj.style.filter = "alpha(opacity=" + opacity + ")";
	    if (opacity == 100) obj.style.zIndex = 10;
	    if (opacity == 0) obj.style.zIndex = 0;
	}
	
	
	function mimeGetOpacity (id) {
		var obj = document.getElementById(id);
		if (IE) return obj.style.filter;
		return obj.style.opacity;
	}
		
				
	/* FADE TRANSICTIONS ***************************************************/
		
	function mimeMakeTransactions (id,transactiontime,keeptime) {			
		var timestep = transactiontime / 100;	
		mimeInizializeFade(id);		
		mimeDoTransaction (id,0,98,timestep,keeptime);									
	}
	
	
	function mimeDoTransaction (id,i,opa,tstep,keeptime) {
		var obj = document.getElementById(id);
		mimeCleanChildren (obj);
		var children = obj.childNodes;	
		var childNumber = obj.childNodes.length;
		var next = (i+1)%childNumber;			
		mimeSetOpacity(obj.childNodes[i],opa);
		mimeSetOpacity(obj.childNodes[next],(100-opa));			
		if (opa <= 0) {
			i = next;
			opa = 90;
			setTimeout("mimeDoTransaction('"+id+"',"+i+","+(opa-1)+","+tstep+","+keeptime+")",keeptime);
		}						
		else
			setTimeout("mimeDoTransaction('"+id+"',"+i+","+(opa-1)+","+tstep+","+keeptime+")",tstep);
	}
	
	
	function mimeInizializeFade (id) {
		var obj = document.getElementById(id);		
		mimeCleanChildren (obj);
		var lim = obj.childNodes.length;			
		for (var i=0; i<lim; i++){				
			if (i==0) {
				mimeSetOpacity(obj.childNodes[i],100);
			}					
			else {
				mimeSetOpacity(obj.childNodes[i],0);
			}				
			obj.childNodes[i].style.position 	= 'absolute';
			obj.childNodes[i].style.top 		= '0px';
			obj.childNodes[i].style.left 		= '0px';
		}			
	}
		
		
	/* FADE function mime **************************************************/			
														
	function mimeFade (id,from,to,millisec) {
		var obj = document.getElementById(id);
		mimeSetOpacity(obj,from);
		var timestep = millisec / 50;		
		var valuestep = Math.abs(from-to) / 50;	
		mimeDoFade(id,from,to,valuestep,timestep);
	}
	
	
	function mimeDoFade (id,opa,to,valuestep,timestep) {
		var step = (opa>to) ? (valuestep*-1) : valuestep;						
		var obj = document.getElementById(id);						
		mimeSetOpacity(obj,opa);
		if ( (step < 0) && (opa <= to) ) return;
		if ( (step > 0) && (opa >= to) ) return;			
		setTimeout("mimeDoFade('"+id+"',"+(opa+step)+","+to+","+valuestep+","+timestep+")",timestep);			
	}
		
		
	/* GESTIONE RESIZE VERTICALE *******************************************/
		
	function mimeChangeVerticalSize (id,start,finish,millisec) {						   
		var timestep = millisec / ((finish-start)/0.5);
		var obj = document.getElementById(id);
		obj.style.height = start + "px";
		if (start > finish)
			mimeDoVerticalResize (id,finish,start,0,millisec,timestep,-1);
		else
			mimeDoVerticalResize (id,start,finish,0,millisec,timestep,1);
	}
	
	
	function mimeDoVerticalResize (id,start,finish,curTime,totalTime,timeStep,multiplier) {
		var step = getPos(curTime,totalTime,start,finish);								
		var obj = document.getElementById(id);
		obj.style.height = (parseInt(obj.style.height) + (step*multiplier)) + "px";						
		if (parseInt(obj.style.height) > finish) return;			
		setTimeout("mimeDoVerticalResize('"+id+"',"+start+","+finish+","+(curTime+timeStep)+","+totalTime+","+timeStep+","+multiplier+")",timeStep);			
	}
	
	
	function mimeGetPos (time,totTime,p1,p2) {
	    var value = p1 + (Math.pow(((1.0 / totTime) * time),2) * (p2 - p1));
    	return value;
	}
    	

	/* SETTING GLOBAL SCROLL VARIABLE **************************************/
    	
	var scrollingDiv = new Array();
	
	function mimeChangeScrollStatus (id,stat) {	    	
    	scrollingDiv[id] = stat;
	}
    	
    	
	/* MANAGE ALL SCROLLS **************************************************/
    	    	
	function mimeMakeScroll (id,verse,speed,keepTime,stoppable) {
    	var obj = document.getElementById(id);	    	    	
    	scrollingDiv[id] = 1;
    	// Reading Width and Height property depending on how I have set it (from css file or inline style)
    	obj.style.overflow = "hidden";
    	var objStyle = getCurrentStyle(obj);
    	var cHeight = parseInt(objStyle.height);
    	var cWidth  = parseInt(objStyle.width);
    	/*
    	var cHeight = (obj.clientHeight > 0) ? obj.clientHeight : parseInt(obj.style.height);
    	var cWidth  = (obj.clientWidth > 0) ? obj.clientWidth : parseInt(obj.style.width);
    	*/
    	if (mimeInizializeScroll(id,cHeight,cWidth,verse,stoppable) < 0) return;
    	switch (verse) {
	    	case 'top'   : setTimeout("mimeDoScroll('"+id+"',0,'"+verse+"',"+speed+","+cHeight+","+keepTime+")",keepTime); break;
	    	case 'bottom': setTimeout("mimeDoScroll('"+id+"',0,'"+verse+"',"+speed+","+cHeight+","+keepTime+")",keepTime); break;
	    	case 'right' : setTimeout("mimeDoScroll('"+id+"',0,'"+verse+"',"+speed+","+cWidth+","+keepTime+")",keepTime);  break;
	    	case 'left'  : setTimeout("mimeDoScroll('"+id+"',0,'"+verse+"',"+speed+","+cWidth+","+keepTime+")",keepTime);  break;    		
    	}
	}
	
	
	// Inizialize children of container DIV
	function mimeInizializeScroll (id,cHeight,cWidth,verse,stoppable) {
    	var obj = document.getElementById(id);	
    	mimeCleanChildren(obj);    	
		var lim = obj.childNodes.length;
		if (lim == 1) return -1;
		for (var i=0; i<lim; i++) {				
			obj.childNodes[i].style.position = 'absolute';			
			if (stoppable){
				obj.childNodes[i].style.cursor = 'pointer';
				obj.childNodes[i].setAttribute ('onmouseover',"mimeChangeScrollStatus('"+id+"',0)");
				obj.childNodes[i].setAttribute ('onmouseout' ,"mimeChangeScrollStatus('"+id+"',1)");
			}
			//Setting offset and position of master DIV children
			switch (verse) {
				case 'top'   : obj.childNodes[i].style.top    = ((Math.min(1,i))*cHeight)+'px'; break;
	    		case 'bottom': obj.childNodes[i].style.bottom = ((Math.min(1,i))*cHeight)+'px'; break;
	    		case 'right' : obj.childNodes[i].style.right  = ((Math.min(1,i))*cWidth)+'px';  break;
	    		case 'left'  : obj.childNodes[i].style.left   = ((Math.min(1,i))*cWidth)+'px';  break;
			}								
		}	    		
	}
	
	
	// Setting the properties to make 
	function mimeDoScroll (id,i,verse,transtime,pixel,keepTime) {	    
    	// If mouse over DIV, I'll go in a cicle callingmyself widthout changes every 2sec
    	if (scrollingDiv[id] == 0){
	    	setTimeout("mimeDoScroll('"+id+"',"+i+",'"+verse+"',"+transtime+","+pixel+","+keepTime+")",2000);
		}
		else {				    								
			var obj = document.getElementById(id);
			var children = obj.childNodes;	
			var childNumber = obj.childNodes.length;
			var next = (i+1)%childNumber;
			//Calcolo il tempo di clock della transizione
			var clock = Math.round(transtime / pixel);
			var realClock = 30 / clock;
			var step = Math.ceil(Math.min(5, Math.max(1,realClock)));
			clock = clock * step;

			// Depending on witch align im doing, I will change the style value			
			switch (verse){
				case 'top'   : obj.childNodes[i].style.top       = (parseInt(obj.childNodes[i].style.top)    - step) +'px';
							   obj.childNodes[next].style.top    = (parseInt(obj.childNodes[next].style.top) - step) +'px';
							   currentValue = parseInt(obj.childNodes[next].style.top);
							   break;
	    		case 'bottom': obj.childNodes[i].style.bottom    = (parseInt(obj.childNodes[i].style.bottom)    - step) +'px';
							   obj.childNodes[next].style.bottom = (parseInt(obj.childNodes[next].style.bottom) - step) +'px';
							   currentValue = parseInt(obj.childNodes[next].style.bottom);
							   break;
	    		case 'right' : obj.childNodes[i].style.right     = (parseInt(obj.childNodes[i].style.right)     - step) +'px';
							   obj.childNodes[next].style.right  = (parseInt(obj.childNodes[next].style.right)  - step) +'px';
							   currentValue = parseInt(obj.childNodes[next].style.right);
	    					   break;
	    		case 'left'  : obj.childNodes[i].style.left      = (parseInt(obj.childNodes[i].style.left)      - step) +'px';
							   obj.childNodes[next].style.left   = (parseInt(obj.childNodes[next].style.left)   - step) +'px';
							   currentValue = parseInt(obj.childNodes[next].style.left);
	    					   break;
			}
			// If currentValue is 0, a single transiction has been just completed. I have to reset the value
			// to inizialize value																				
			if (currentValue <= 0) {
				switch (verse){
					case 'top'   : obj.childNodes[i].style.top = pixel + 'px'; break;
		    		case 'bottom': obj.childNodes[i].style.bottom = pixel + 'px'; break;
		    		case 'right' : obj.childNodes[i].style.right = pixel + 'px'; break;
		    		case 'left'  : obj.childNodes[i].style.left = pixel + 'px'; break;
				}					
				i = next;				
				setTimeout("mimeDoScroll('"+id+"',"+i+",'"+verse+"',"+transtime+","+pixel+","+keepTime+")",keepTime);
			}						
			else
				setTimeout("mimeDoScroll('"+id+"',"+i+",'"+verse+"',"+transtime+","+pixel+","+keepTime+")",clock);
		}
	}