/**
 * @author Michał Trzebiński (mt@veneo.pl)
 * @author Robert Boguszewski (robert.boguszewski@veneo.pl)
 */
var SliderClass = Class.create();
SliderClass.prototype = {
  initialize: function(objectName,moveIndex,ieHide) {
    this.obj = $(objectName);
    this.moveIndex = moveIndex || 0;
    this.ieHide = ieHide || false;
    this.initSliders();
  },

   initSliders: function() {
     if (!this.obj) {
       return;
     }

        this.currentIndex = 0;
        this.busy = false;

        if (this.obj.getElementsByClassName('moveleft').length == 0) {
          return false;
        }
        this.obj.getElementsByClassName('moveleft')[0].onclick    = function() { return false; }
        this.obj.getElementsByClassName('moveright')[0].onclick    = function() { return false; }
    Event.observe(this.obj.getElementsByClassName('moveleft').first(),'click', function (event) {
      Event.element(event).blur(); this.moveSlider(Event.element(event), 'L');
    }.bind(this));
    Event.observe(this.obj.getElementsByClassName('moveright').first(),'click', function (event) {
      Event.element(event).blur(); this.moveSlider(Event.element(event), 'R');
    }.bind(this));
      this.slider = this.obj;
    var sliderObj = this.slider.down('div.slidingcontainer');
        var elements    = sliderObj.getElementsByClassName('element');
      this.updateDesc(elements[this.currentIndex],'desc1');
      this.updateDesc(elements[this.currentIndex+1],'desc2');

    var moveAmount = 0;
	   var containerWidth = $(sliderObj.up()).getWidth();
	   if (elements[0]) {
       	var leftElementsLength = elements[0].getWidth() + parseInt(elements[0].getStyle('margin-right').replace(/px/, ''));
       } else {
        var leftElementsLength = 0;
       }


    if (this.moveIndex > (elements.length -1)) {
      this.moveIndex = elements.length -1;
      this.currentIndex = this.moveIndex;
    } else {
	    var size = containerWidth / leftElementsLength;
	    this.currentIndex = this.moveIndex - Math.ceil(size/2);
    }
    for(i=4;i<=this.moveIndex;i++) {
       moveAmount += elements[i].getWidth() + parseInt(elements[i].getStyle('margin-right').replace(/px/, ''));
      }

	if (moveAmount > 0) {
    	new Effect.MoveBy( sliderObj, 0, -moveAmount, { afterFinish: function() { this.releaseSlider(this.obj.id); }.bind(this) } );
    } else {
        sliderObj.hide();
        new Effect.MoveBy( sliderObj, 0, -1, {
        	afterFinish: function() {
		        this.sliderObj.show();
        		new Effect.MoveBy( sliderObj, 0, 1, {
        			afterFinish: function() {
	       			 this.sliderObj.show();
			         this.hideArrows();
        			 this.releaseSlider(this.obj.id);
        			}.bind(this) } );
        	 }.bind(this)
        	 } );
    }

    this.currentIndex =  this.currentIndex < 0 ? 0 : this.currentIndex;

        this.sliderID    = this.obj.id;
        this.sliderObj    = this.slider.down('div.slidingcontainer');
        this.elements    = sliderObj.getElementsByClassName('element');
        this.selectElement();
        this.hideArrows();


    },

    selectElement: function () {
      $A(this.elements).each ( function (item,i) {
      item = $(item);
      if (item.href == document.location) {
        item.addClassName('selected');
      } else {
        item.removeClassName('selected');
      }
      }.bind(this));
    },

    moveSlider: function(invoker, direction) {
        var sliderID    = this.sliderID;
        var sliderObj    = this.sliderObj;
        var elements    = this.elements;
        if (!this.currentIndex || this.currentIndex < 0) {
          this.currentIndex = 0;
        }

    if (!this.busy) {
          switch( direction ) {
              case 'L':
                  if(this.currentIndex > 0) {
                      var moveAmount = elements[this.currentIndex - 1].getWidth() + parseInt(elements[this.currentIndex - 1].getStyle('margin-right').replace(/px/, ''));
                      if (parseInt(sliderObj.style.left.replace(/px/, '')) + moveAmount <= 0) {
                        new Effect.MoveBy( sliderObj, 0, moveAmount, { afterFinish: function() { this.releaseSlider(sliderID); }.bind(this) } );
                        this.currentIndex--;
                        this.busy = true;
                        this.updateDesc(elements[this.currentIndex],'desc1');
                        this.updateDesc(elements[this.currentIndex+1],'desc2');
                      }
                  }
                  break;
              case 'R':
                  if( !this.checkSliderEnd(sliderObj, elements, this.currentIndex) && elements[this.currentIndex]) {
                      var moveAmount = elements[this.currentIndex].getWidth() + parseInt(elements[this.currentIndex].getStyle('margin-right').replace(/px/, ''));
                      new Effect.MoveBy( sliderObj, 0, -moveAmount, { afterFinish: function() { this.releaseSlider(sliderID); }.bind(this) } );
                      this.currentIndex++;
                      this.busy = true;
                      this.updateDesc(elements[this.currentIndex],'desc1');
                      this.updateDesc(elements[this.currentIndex+1],'desc2');
                  }
                  break;
          }
          this.hideArrows();
        }
    },

    updateDesc: function (element,container_class) {
      if (element && this.slider.down('a.'+container_class)) {
        this.slider.down('a.'+container_class).update(element.down('span.text').innerHTML);
        this.slider.down('a.'+container_class).href = element.down('span.link').innerHTML;
      }
    },

    correctSlider: function(sliderID) {
        var sliderObj = $(sliderID).getElementsByClassName('slidingcontainer')[0];
        var offset = parseInt(sliderObj.getStyle('left').replace(/px/, ''));
        if(offset >= 0) return;
        offset = -offset + 1;
        var elements = $(sliderID).getElementsByClassName('element');
        elementOffset = 0;
        for(i = 0; i < this.currentIndex; i++) {
            elementOffset += elements[i].getWidth() + parseInt(elements[i].getStyle('margin-right').replace(/px/, ''));
        }
        var diff = elementOffset - offset;
        if(diff != 0) {
            new Effect.MoveBy( sliderObj, 0, -diff, { afterFinish: function() { TVInterface.releaseSlider(sliderID); } } );
            this.busy = true;
        }
    },

    releaseSlider: function(sliderID) {
        this.busy = false;
    },

    checkSliderEnd: function(sliderObj, elements, currentIndex) {
        var containerWidth = $(sliderObj.up()).getWidth();
        var leftElementsLength = 0;
        for(i = currentIndex; i < elements.length; i++) {
          if (elements[i]) {
              leftElementsLength += elements[i].getWidth() + parseInt(elements[i].getStyle('margin-right').replace(/px/, ''));
            }

            if(leftElementsLength > containerWidth) return false;
        }
        return true;
    },
    hideArrows: function () {
    	var hide = true;
      if (this.currentIndex == 0 ) {
        $(this.obj.getElementsByClassName('moveleft')[0]).addClassName('hidden');
      } else {
        $(this.obj.getElementsByClassName('moveleft')[0]).removeClassName('hidden');
        hide = false;
      }
      if( this.checkSliderEnd(this.sliderObj, this.elements, this.currentIndex) && this.elements[this.currentIndex]) {
        $(this.obj.getElementsByClassName('moveright')[0]).addClassName('hidden');
      } else {
        $(this.obj.getElementsByClassName('moveright')[0]).removeClassName('hidden');
        hide = false;
      }
      if (this.ieHide) {
		var IE6 = false /*@cc_on || @_jscript_version < 5.7 @*/;
		if (hide && IE6) {
			var elements    = this.sliderObj.getElementsByClassName('element');
			if (elements.length < 3) {
				Element.setStyle(this.sliderObj, {position:'fixed'});
			}
		}
	  }

    }

}