/*****

Element Fader
Version 2.0
Last revision: 2008-04-28
Niklas Ljungkvist, Oceanus
fader@oceanus.se

Please leave this notice intact. 
*****/

function cOCFader() {
    var tDate = new Date();
    
    this.pFadeIn = false; 
    this.pFadeOutArr = new Array();                                                             
    this.pState = 0; 
    this.pSlideShowRunning = false;
    this.pSlideShowinterval = 2.5;  
    this.pSlideShowArr = new Array(); 
    this.pFadeSlideShowTimeId = false;
    this.pFadeSlideShowTimeIdDelay = false;  
    this.pFadeStoreSlide = false;
    // Set up for callback from setTimeout function
    this.pGlobalObjName = 'OCFaderObj'+tDate.getTime()+'_'+Math.round(Math.random()*100000);  // Get a unique name in the Global space  
    var fSetGlobalLink = new Function('aFader', this.pGlobalObjName +'= aFader;'); 
    fSetGlobalLink(this); // set global variable to object so timer callback will find it
    this.pLinkFunctionFadeFade = new Function ('tFader = '+this.pGlobalObjName +'; tFader.FadeFade();');
    this.pLinkFunctionStartSlide = new Function ('tFader = '+this.pGlobalObjName +'; tFader.FadeStartSlide();');
}

cOCFader.prototype.FadeAddIn = function(aElement, aStart) {
    var tAllreadyIn = (this.pFadeIn == aElement);
    if (!tAllreadyIn) {
        if (this.pState > 0) {
            this.FadeMoveInToOut();
            this.pState = 0;       
        }
        // Handle IE problems with racing
        if (aElement.xHeight !== undefined) aElement.style.top= Math.round((aElement.xHeight - aElement.offsetHeight) / 2);
        
        for (var tI = 0; tI < this.pFadeOutArr.length; tI++) {
            if (this.pFadeOutArr[tI] == aElement) {
                this.FadeDeleteOut(tI);
                tI--;    
            }
        }
        this.pFadeIn = aElement;
        if (aElement.xOpacity === undefined) aElement.xOpacity = 0;
        if (aStart) {
            this.FadeStart();
        }
    }
}

cOCFader.prototype.FadeAddInName = function(aElementName, aStart) {
    var tElement = document.getElementById(aElementName);
    this.FadeAddIn(tElement, aStart);
}

cOCFader.prototype.FadeSetIn = function(aElement, aDisplay) {
    this.FadeStop();
    this.pFadeIn = aElement;
    if (aDisplay) {
        aElement.xOpacity = 1;
        this.FadeSetOpacity(aElement);
        aElement.style.visibility = "visible"; 
    } else if (aElement.xOpacity === undefined) {
         aElement.xOpacity = 0;  
    }   
}
 
cOCFader.prototype.FadeSetInName = function(aElementName, aDisplay) {
    var tElement = document.getElementById(aElementName); 
    this.FadeSetIn(tElement, aDisplay);

}    
 
cOCFader.prototype.FadeAddOut = function(aElement) {
    this.pFadeOutArr[this.pFadeOutArr.length] = aElement;
    if (aElement.xOpacity === undefined) aElement.xOpacity = 1;
    aElement.style.visibility = "visible"; 
}

cOCFader.prototype.FadeAddOutName = function(aElementName) {
    var tElement = document.getElementById(aElementName);
    this.FadeAddOut(tElement);
}

cOCFader.prototype.FadeMoveInToOut = function() {
    if (this.pFadeIn) this.FadeAddOut(this.pFadeIn);
    this.pFadeIn = false;
}

cOCFader.prototype.FadeDeleteIn  = function(aIndex) {
    this.pFadeIn = false;   
}

cOCFader.prototype.FadeDeleteOut = function(aIndex) {
    this.pFadeOutArr[aIndex].style.visibility = "hidden";
    for (var tI = aIndex + 1; tI < this.pFadeOutArr.length; tI++) {
        this.pFadeOutArr[tI-1] = this.pFadeOutArr[tI];
    }
    this.pFadeOutArr.length--;   
}

cOCFader.prototype.FadeFade = function() {
    //alert(this.pState+'|'+this.pFadeIn+ '|'+this.toString()+ '|'+ arguments.length);
    if (this.pState == 1) {
        var  tElemsLeftToFadeIn = this.FadeFadeOne(this.pFadeIn, true);
        for (var tI = 0; tI < this.pFadeOutArr.length; tI++) {
            var tElemFinished = !this.FadeFadeOne(this.pFadeOutArr[tI], false);
            if (tElemFinished) {
                this.FadeDeleteOut(tI);
                tI--;    
            }    
        }
        if (tElemsLeftToFadeIn || (this.pFadeOutArr.length > 0) ) {
            this.FadeStart();
        } else {
            this.FadeStop();
        }
    }
}

cOCFader.prototype.FadeFadeOne = function(aElem, tIn) {
    var tOpacity = aElem.xOpacity;
    tOpacity += (tIn)?0.05:-0.05;
    tOpacity = (tOpacity > 1)?1:tOpacity;
    tOpacity = (tOpacity < 0)?0:tOpacity;
    aElem.xOpacity = tOpacity;
    this.FadeSetOpacity(aElem);
    aElem.style.visibility = "visible";
    
    return ((tOpacity > 0) && (tOpacity < 1)); 
}

cOCFader.prototype.FadeSetOpacity = function(aElement) {
        if(false && aElement.xOpacity>.99) {
            aElement.xOpacity = .99;
            return;
        }
        aElement.style.opacity = aElement.xOpacity;
        aElement.style.MozOpacity = aElement.xOpacity;
        aElement.style.filter = "alpha(opacity=" + (aElement.xOpacity*100) + ")";
}

cOCFader.prototype.FadeStart = function() {
    //alert('Fade Start '+this.toString());
    this.pState = 1;
    if (this.pFadeSlideShowTimeId) {
        clearTimeout(this.pFadeSlideShowTimeId);
        this.pFadeSlideShowTimeId = false;
    }
//    if (!setTimeout(this.pLinkFunctionFadeFade,20)) alert('No timeout');
    if (!setTimeout(this.pGlobalObjName +'.FadeFade();',20)) alert('No timeout');
}

cOCFader.prototype.FadeStop = function() {
    this.pState = 2;
    if (this.pSlideShowRunning) {
        this.pFadeSlideShowTimeId = setTimeout(this.pGlobalObjName +'.FadeStartSlide();',this.pSlideShowinterval*1000);
    }
}

cOCFader.prototype.FadeStartSlide = function(aInterval) {
    if (aInterval !== undefined) {
        this.pSlideShowinterval = aInterval;
    }
    if (this.pSlideShowArr.length) {
        this.pSlideShowRunning = true;
        var tCurrInx = -1;
        for (var tI = 0; tI < this.pSlideShowArr.length; tI++) {
            if (this.pSlideShowArr[tI] == this.pFadeIn) tCurrInx = tI;    
        }
        if (tCurrInx >= this.pSlideShowArr.length-1) tCurrInx = -1;
        tCurrInx++;
        this.FadeAddIn(this.pSlideShowArr[tCurrInx],true);
    } else {
        this.pSlideShowRunning = false;
    }
}

cOCFader.prototype.FadeStartSlideDelayed = function(aDelay, aInterval) {
    tInterval = (aInterval === undefined)?this.pSlideShowinterval: aInterval;
//    this.pSlideShowRunning = true; 
    this.pFadeSlideShowTimeIdDelay = setTimeout(this.pGlobalObjName +'.FadeStartSlide('+tInterval+');',aDelay*1000);    
}

cOCFader.prototype.FadeStopSlide = function() {
    if (this.pSlideShowRunning) {
        clearTimeout(this.pFadeSlideShowTimeId);
        this.pFadeSlideShowTimeId = false;
        this.pSlideShowRunning = false;
        this.pFadeStoreSlide = this.pFadeIn; 
    }
}

cOCFader.prototype.FadeResumeSlide = function() {
    if (this.pFadeStoreSlide) FadeAddIn(this.pFadeStoreSlide, false);
    this.pFadeStoreSlide = false;
    this.FadeStartSlide();
}

cOCFader.prototype.FadeAddSlideShow = function(aElement) {
    this.pSlideShowArr[this.pSlideShowArr.length] = aElement;
}


cOCFader.prototype.FadeAddSlideShowName = function(aElementName) {
    var tElement = document.getElementById(aElementName);
    this.FadeAddSlideShow(tElement);
}

cOCFader.prototype.FadeSlideGetCurrent = function() {
    return this.pFadeIn;
}

cOCFader.prototype.FadeSlideGetCurrentName = function() {
    var tCurrent = this.FadeSlideGetCurrent();
    if (tCurrent) {
        return tCurrent.getAttribute('id');
    } else {
        return false;
    }
}

cOCFader.prototype.IsSlideShowRunning = function() {
    return this.pSlideShowRunning;
}

cOCFader.prototype.FadeSlideSort = function(aSortFunction) {
    this.pSlideShowArr.sort(aSortFunction);    
}



