/* * Fading Banner, base script, version 1.1 * * Copyright (C) 2007 Dmitriy Khudorozhkov * * This software is provided "as-is", without any express or implied warranty. * In no event will the author be held liable for any damages arising from the * use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not *    claim that you wrote the original software. If you use this software *    in a product, an acknowledgment in the product documentation would be *    appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not be *    misrepresented as being the original software. * * 3. This notice may not be removed or altered from any source distribution. * *  - Dmitriy Khudorozhkov, kh_dmitry2001@mail.ru */function FadingBanner(parentId, type, width, height, bg, timeout){  this.batches  = [];  this.current  = 0;  this.images   = [];  this.parent   = document.getElementById(parentId);  this.root     = null;  this.timeout  = timeout || 5000;  this.type     = (type == "vertical") ? "vertical" : "horizontal";  while(this.parent.firstChild)    this.parent.removeChild(this.parent.firstChild);  return this._construct(width, height, bg);}FadingBanner.prototype = {  // public methods:  add: function(batch, imageSrc, imageWidth, imageHeight, link)  {    var l = this.batches.length;    for(var i = 0; i < l; i++)      if(this.batches[i] == batch)        break;    if(i == l) this.batches[l] = batch;    if(!this.images[batch]) this.images[batch] = [];    var l2 = this.images[batch].length;    var imag = this.images[batch][l2] = new Object;    imag.src    = imageSrc;    imag.link   = link;    imag.width  = imageWidth;    imag.height = imageHeight;    var top = 0, left = 0, isH = (this.type == "horizontal");    for(i = 0; i < l2; i++)    {      var _img = this.images[batch][i];      if(isH)      {        left += _img.width;      }      else      {        top += _img.height;      }    }    var a = imag.obj = document.createElement("A");    a.href = imag.link;    a.target = "_self";    a.style.display = "none";    var img = document.createElement("IMG");    img.src = imag.src;    img.id  = "fb_img_" + this.parent.id + "_" + String(batch) + "_" + String(l2);    a.appendChild(img);    this.root.appendChild(a);    var is = img.style;    is.position = "absolute";    is.top      = top + "px";    is.left     = left + "px";    is.width    = imag.width;    is.height   = imag.height;    is.border   = "0";    is.opacity  = 0;    is.filter   = "alpha(opacity=0)";    this.batches.sort(function (a, b) { return a - b; });    this.current = this.batches[0];    return l2 + 1;  },  start: function()  {    this.root.style.display = "block";    this._showbatch();  },  // support methods follow:  _construct: function(width, height, bg)  {    var banner = document.createElement("DIV");    var bs = banner.style;    bs.position = "relative";    bs.top      = "0px";    bs.left     = "0px";    bs.width    = width + "px";    bs.height   = height + "px";    bs.display  = "none";    bs.backgroundColor = bg || "#FFF";    this.root = this.parent.appendChild(banner);    return this;  },  _callLater: function(obj, func, param)  {    param = param || null;    return obj ? (function() { obj[func](param); }) : (function() { func(param); });  },  _next: function()  {    var _out = function(_obj)    {      var _go = function(__obj)      {        var cur = __obj.current, l = __obj.images[cur].length;        for(var i = 0; i < l; i++)          __obj.images[cur][i].obj.style.display = "none";        l = __obj.batches.length;        for(i = 0; i < l; i++)          if(__obj.current == __obj.batches[i])            break;        __obj.current = (i == l - 1) ? __obj.batches[0] : __obj.batches[i + 1];        __obj._showbatch();      }      // fade-out current batch:      var cur = _obj.current, l = _obj.images[cur].length;      for(var i = 0; i < l; i++)      {        var img = _obj.images[cur][i];        _obj._fade(img.obj.firstChild.id, 0, 50, 10, (i == (l - 1) ? function() { _go(_obj); } : null));      }    }    setTimeout(this._callLater(null, _out, this), this.timeout);  },  _showbatch: function()  {    var cur = this.current, l = this.images[cur].length;    for(var i = 0; i < l; i++)    {      var img = this.images[cur][i];      img.obj.style.display = "block";      this._fade(img.obj.firstChild.id, 100, 50, 10, (i == (l - 1) ? this._callLater(this, "_next") : null));    }  },  _fade: function(id, destOp, rate, delta, callback)  {    var obj = document.getElementById(id);    if(obj.timer) clearTimeout(obj.timer);    var curOp = obj.filters ? obj.filters.alpha.opacity : (obj.style.opacity * 100.0);    var direction = (curOp <= destOp) ? 1 : -1;    delta  = Math.min(direction * (destOp - curOp), delta);    curOp += direction * delta;    if(obj.filters)      obj.filters.alpha.opacity = curOp;    else      obj.style.opacity = curOp / 100.0;    if(curOp != destOp)      obj.timer = setTimeout(function() { FadingBanner.prototype._fade(id, destOp, rate, delta, callback); }, rate);    else      if(callback) callback();  }};
