/* tick_time ... fadein & fadeout duration */
var duration = 3000;
/* */
var tick_wait = 25;
/* max_num ... elements numbers of advertisements */
var __max_num   = 0;
/* __opacity ... bad hack */
var __opacity = 0;
/* opacity increment/decrement value */
var __delta = 0.050;
/* N times increment / decrement */
var __tick_time  = Math.floor( 1 / __delta );
/* duration = (tick_time * tick_span ) + offset */
var __offset  = duration - ( __tick_time * tick_wait) ;

/* inner function called @ fadein */
var _fadein = function(elem){
    __opacity += __delta;
    
    if ( __opacity > 1){
        __opacity = 1;
    }
    
    elem.style.opacity = __opacity;
    
    // debug
    // dump(__opacity , "#debug1");
};

/* inner function called @ fadeout */
var _fadeout = function(elem){
    __opacity -= __delta;

    if (__opacity < 0){
        __opacity = 0;
    }

    elem.style.opacity = __opacity;

    // debug
    //dump(__opacity , "#debug1");
};

/* inner function called @ fadein */
var _display_block = function(elem){
    elem.style.display = 'block';
}

/* inner function called @ fadeout */
var  _display_none = function(elem){
    elem.style.display = 'none';
}

/* fadein & fadeout -- chain function call */
/* fadein(id) .. duration .. fadeout(id).. duration .. fadein(id+1) .. duration .. fadeout(id+1) */ 
function fadein(class_name,id){

    // max_num is global value
    if ( id >= __max_num ){
        id = 0;
    }

    // debug
    //dump("ID " + id , "#debug2");

    var element = $(class_name)[id];
    element.style.opacity = 0.00;
    element.style.display = 'block';
    
    // set timers
    for(var i = 0 ; i < __tick_time ; i++){
        var ms = i * tick_wait ;
        _fadein.later(ms)(element);
        
    }
    
    _display_block.later(1)(element);

    /* next function call */
    var next = function(){
        fadeout(class_name,id);
    };
    
    next.later(duration)();
}

function fadeout(class_name,id){
    var element = $(class_name)[id];

    // set timers
    for(var i= 0 ; i < __tick_time ; i++){
        var ms = ( i * tick_wait )  + __offset; // 2000 is offset
        _fadeout.later(ms)(element);
    }
    
    _display_none.later(duration)(element);
    
    /* next function call */
    var next = function(){
        fadein(class_name, id + 1);
    };
    next.later(duration)();
  
    return;
}

function fader_init(class_name , __duration){

    // overwrite global bars
    if (! isNaN(__duration) ){
        duration = __duration;
        __tick_time  = Math.floor( 1 / __delta );
        __offset  = duration - ( __tick_time * tick_wait) ;
    }

    // set global vars
    __max_num = $(class_name).length
    
    // select first elements randomly
    var start_id = Math.floor( Math.random() * __max_num );
    fadein(class_name , start_id);
}


/* for debug */
function dump(msg,id){
    var div_dump = $(id)[0];
    div_dump.innerHTML = msg;
}

/* for debug */
function debug(){
     init(".advertise");

     //debug
     //dump("tick_time : " + __tick_time  , "#debug3");
     //dump("offset : " + offset  , "#debug4");

     //debug
     var max_num = $('.advertise').length
     var prev_num = current_num;
     var current_num = Math.floor( Math.random() * max_num );
     //dump(current_num);

     //debug
     //dump( $('.advertise')[3].innerText , "#debug5");
}


/* code taken from                              */
/* http://la.ma.la/blog/diary_200507302354.htm  */

Object.extend = function(destination, source) {
    for (property in source) {
        if(source.hasOwnProperty(property)){
            destination[property] = source[property];
        }
    }
    return destination;
}
Object.prototype.extend = function(object) {
    return Object.extend.apply(this, [this, object]);
}

Function.prototype.extend({
                              later : function(ms){
                                  var self = this;
                                  var func = function(){
                                      var arg = func.arguments;
                                      var apply_to = this;
                                      var later_func = function(){
                                          self.apply(apply_to,arg)
                                      };
                                      setTimeout(later_func,ms);
                                  };
                                  return func;
                              }
                          });


