var CtVenueSlider = Class.create({

	slider: null,
	blockScroller: null,

	sliderItemCollection: new Hash(),
	sliderBlockCollection: new Hash(),

	maxOffset: 0,
	visibleHeight: 0,


	initialize: function(sliderContainer, btnUp, btnDown) {
		this.slider = $(sliderContainer);

		Event.observe(window, 'load', this.load.bindAsEventListener(this, btnUp, btnDown));
	},


	load: function(e, btnUp, btnDown) {
		var blockScrollerContainer = $('blockScrollerVenue');
		var sliderBlockCollection = blockScrollerContainer.select('.ctVenueSlider-letter');

		var letter;
		var lastBlockHeight;
		for (var i = 0; i < sliderBlockCollection.length; i++) {
			letter = sliderBlockCollection[i].readAttribute('rel');
			sliderBlockCollection[i].writeAttribute('rel', null);

			this.sliderBlockCollection.set(letter, sliderBlockCollection[i]);
			if (i + 1 == sliderBlockCollection.length) {
				lastBlockHeight = sliderBlockCollection[i].getHeight();
			}
		}

		this.visibleHeight = blockScrollerContainer.getHeight();
		if (this.visibleHeight > lastBlockHeight) {
			var elastic = new Element('div');
			elastic.setStyle({height: (this.visibleHeight - lastBlockHeight) + 'px'});
			blockScrollerContainer.appendChild(elastic);
		}

		ctBlockScrollerConfig.blockScrollerVenue = {
			scrollerJump: {
				vertical: '50px'
			},
			navigationEffectAppear: {
				to: 1,
				delay: 0,
				duration: 0
			},
			navigationEffectFade: {
				to: 1,
				delay: 0,
				duration: 0
			},
			vertical: {
				manualScroll: false,
				isPersistent: false,
				resizeScroller: true,
				element: null,
				back: btnUp,
				forward: btnDown
			}
		};

		blockScroller = new CtBlockScroller();
		this.blockScroller = blockScroller.blockScrollerVenue;
		Event.observe(blockScrollerContainer, 'CtBlockScroller:scrollFinish', this.scrollContentHandler.bindAsEventListener(this));


		var sliderItemCollection = this.slider.select('.ctVenueSlider-chapter');

		for (i = 0; i < sliderItemCollection.length; i++) {
			letter = sliderItemCollection[i].readAttribute('rel');
			sliderItemCollection[i].writeAttribute('rel', null);

			this.sliderItemCollection.set(letter, sliderItemCollection[i]);
			Event.observe(this.sliderItemCollection.get(letter), 'click', this.sliderItemClickHandler.bindAsEventListener(this, letter));
		}

		this.maxOffset = $$('.ctBlockScroller-wrapper')[0].getHeight();

		letter = location.hash.substr(1);
		if (this.sliderItemCollection.get(letter) != undefined) {
			this.slideToLetter(letter);
		}
	},


	sliderItemClickHandler: function(e, letter) {
		this.slideToLetter(letter);
	},


	slideToLetter: function(letter) {
		this.selectSliderLetter(letter);
		var letterOffset = this.sliderBlockCollection.get(letter).positionedOffset();

		this.blockScroller.element.fire('CtBlockScroller:scrollTo', {
			position: {
				top: letterOffset.top / this.maxOffset
			},
			correction: {
				top: 0
			}
		});
	},


	scrollContentHandler: function(e) {
		this.sliderBlockCollection.each(function(pairs) {
			var offset = Math.round(e.memo.position.top * (this.maxOffset - this.visibleHeight));
			var letterOffset = pairs.value.positionedOffset().top;
			if (offset >= letterOffset && letterOffset + pairs.value.getHeight() > offset) {
				this.selectSliderLetter(pairs.key);
				throw $break;
			}
		}.bind(this));
	},


	selectSliderLetter: function(letter) {
		this.sliderItemCollection.each(function(pairs) {
			if (pairs.key == letter) {
				pairs.value.removeClassName('chapter-' + pairs.key);
				pairs.value.addClassName('chapter-' + pairs.key + '-active');
			} else {
				pairs.value.removeClassName('chapter-' + pairs.key + '-active');
				pairs.value.addClassName('chapter-' + pairs.key);
			}
		});
	}

});

CtPage.registerScript("CtVenueSlider");
