/*
 *************************************************************************************
 * slideshow.js
 *************************************************************************************
 */

var Loader = function() {
  /*
  setList(list)
  getList()
  setIndex(index)
  getIndex()
  getCurrent()
  start()
  pause()
  resume()
  stop()
  isLoading()

  @complete
  */

  var _this;
  var _list;
  var _index;
  var _offset;
  var _loadindex;
  var _loadoffset;
  var _forward;
  var _loading;
  var _timer;

    {
    _this = this;
    _index = 0;
    _offset = 0;
    _loadindex = _index;
    _loadoffset = _offset;
    _forward = true;
    _loading = false;
  }

  _this.setList = function(list) {
    _this.stop();
    _list = list;
  };

  _this.getList = function() {
    return _list;
  };

  _this.setIndex = function(index) {
    _index = index;
    _offset = 0;
    if(_list && _index > _list.length/2) _forward = false;
    else _forward = true;
  };

  _this.getIndex = function() {
    return _loadindex;
  };

  _this.start = function() {
    if(_list) {
      if(_loading) _this.stop();
      _loading = true;
      process();
    }
  };

  _this.pause = function() {
    if(_timer) {
      clearTimeout(_timer);
      _timer = null;
    }
    if(_list) {
      var item = _list[_index];
      if(item.obj) item.obj.unbind("error load", loadHandler);
    }
    _loading = false;
  };

  _this.resume = _this.start;

  _this.stop = function() {
    if(_loading) {
      _this.pause();
      _this.setIndex(0);
    }
  };

  _this.isLoading = function() {
    return _loading;
  };

  function process() {
    _loadindex = _index;
    _loadoffset = _offset;
    var item = _list[_loadindex];
    if(item.obj) {
      next();
    }
    else {
      item["~obj"] = jQuery("<img />").one("error load", loadHandler);
      item["~obj"].attr("src", item.url);
    }
  }

  function loadHandler(event) {
    var item = _list[_loadindex];
    if(event.type.match(/load/i)) item.obj = item["~obj"];
    delete item["~obj"];
    jQuery(_this).triggerHandler("complete", [_loadindex]);
    _timer = setTimeout(next, 50);
  }

  function next() {
    _timer = null;
    if(_index == _loadindex && _offset == _loadoffset) {
      _offset++;
      if(_offset < _list.length) {
        if(_forward) {
          if(_offset >= _list.length-_index) {
            _index--;
          }
          else {
            _index += _offset;
            _forward = !_forward;
          }
        }
        else {
          if(_offset > _index) {
            _index++;
          }
          else {
            _index -= _offset;
            _forward = !_forward;
          }
        }
        process();
      }
      else {
        _this.stop();
      }
    }
    else {
      process();
    }
  }
};

/*-----------------------------------------------------------------*
 | Slideshow                                                       |
 *-----------------------------------------------------------------*/

var Slideshow = function(id) {
  /*
  setIndex(value)
  getIndex()
  previous()
  next()
  */

  var _this;
  var _settings;
  var _width;
  var _height;
  var _box;
  var _imagebox;
  var _loading;
  var _loader;
  var _index;
  var _paused;
  var _timer;

    {
    _this = this;
    _settings = SlideshowSettings[id];
    _box = jQuery("#"+id).empty();
    if(!_box.css("position").match(/absolute/i)) _box.css("position", "relative");
    _box.css("overflow", "hidden").bind("click", clickHandler);
    _width = _box.width();
    _height = _box.height();
    _imagebox = jQuery("<div></div>").css({position: "absolute", width: "100%", height: "100%"}).appendTo(_box);
    _overlaybox = _imagebox.clone().appendTo(_box);
    _loading = jQuery("<img></img>").attr("src", _settings.loading).css({position: "absolute", left: "50%", top: "50%"}).load(loadingLoadHandler).appendTo(_overlaybox);
    _navigation = jQuery("<div></div>").addClass("navigation").appendTo(_box);
    for(var i = 0; i < _settings.list.length; i++) {
      jQuery("<a></a>").attr({href: "#", id: "item-"+i}).addClass("navigationitem").bind("click", i, navClickHandler).appendTo(_navigation);
    }
    _loader = new Loader();
    jQuery(_loader).bind("complete", loadCompleteHandler);
    _loader.setList(_settings.list);
    _index = 0;
    _paused = false;

    _this.setIndex = function(value) {
      clearTimeout(_timer);
      var list = _loader.getList();
      if(list && value >= 0 && value < list.length) {
        _overlaybox.empty();
        _navigation.children("#item-"+_index).removeClass("selected");
        _index = value;
        _navigation.children("#item-"+_index).addClass("selected");
        var item = list[_index];
        if(item.obj) {
          _loading.css("display", "none");
          if(item.buttonobj) _overlaybox.append(item.buttonobj);
          if(item.textobj) _overlaybox.append(item.textobj);
          item.obj.css("opacity", "0").appendTo(_imagebox).animate({opacity: "1"}, _settings.fadetime, fadeCompleteHandler);
        }
        else {
          _loading.css("display", "block");
          _loader.setIndex(_index);
        }
      }
    };

    _this.getIndex = function() {
      return _index;
    };

    _this.previous = function(event) {
      var index = _index-1;
      if(index < 0) index = _loader.getList().length;
      _this.setIndex(index);
    };

    _this.next = function(event) {
      var index = _index+1;
      if(index >= _loader.getList().length) index = 0;
      _this.setIndex(index);
    };

    _loader.start();
  }

  function loadingLoadHandler(event) {
    _loading.css({marginLeft: (-_loading.width()/2)+"px", marginTop: (-_loading.height()/2)+"px"});
  }

  function loadCompleteHandler(event, index) {
    var item = _loader.getList()[index];
    if(item.obj) {
      item.obj.css({position: "absolute", MsInterpolationMode: "bicubic", width: "100%", height: "100%"});
      if(item.buttons) {
        item.buttonobj = jQuery("<div></div>").addClass("buttoncontainer");
        var buttondata;
        var buttonclass;
        var button;
        for(var i = 0; i < item.buttons.length; i++) {
          if(i == 0) {
            if(item.buttons.length == 1) buttonclass = "single";
            else buttonclass = "left";
          }
          else if(i == item.buttons.length-1) {
            buttonclass = "right";
          }
          else {
            buttonclass = "middle";
          }
          buttondata = item.buttons[i];
          var button = jQuery("<a></a>").attr({href: buttondata.url, target: buttondata.target, id: "button-"+i}).addClass("button "+buttonclass).appendTo(item.buttonobj);
          var caption = jQuery("<div></div>").css({cursor: "pointer", opacity: "0"}).html(buttondata.text).appendTo(_overlaybox);
          caption.css({position: "relative", top: "50%", marginTop: (-caption.height()/2)+"px", width: "100%", opacity: ""}).appendTo(button);
        }
      }
      if(item.text) {
        item.textobj = jQuery("<div></div>").addClass("textcontainer").html(item.text);
      }
      if(index == _index) _this.setIndex(_index);
    }
  }

  function fadeCompleteHandler() {
    jQuery(this).css("opacity", "").prevAll().remove();
    if(!_paused) timerCompleteHandler();
  }

  function clickHandler(event) {
    clearTimeout(_timer);
    _paused = true;
    _timer = setTimeout(timerCompleteHandler, _settings.pausetime);
  }

  function timerCompleteHandler() {
    clearTimeout(_timer);
    _paused = false;
    _timer = setTimeout(_this.next, _settings.autoplaytime);
  }

  function navClickHandler(event) {
    if(event.data != _index) _this.setIndex(event.data);
    return false;
  }
};

