﻿// Calslider (page utility obj for calslider; improve by de-coupling from page, using options hash instead)
var CalSlider = Class.create({
		initialize: function(startDate, options){
			this.startDate = startDate || new Date();
			// init sidescroller as property
			this.ss = new SideScroller('calslider_frame', {
				initialIndex: 0,
				durationPerSlide: 0.15, 
				restAlignment: 'center'});
			var slideCount = this.ss.slides.length;

			// set ranges
			var rngDisplay = $R(0, slideCount-1);
			var rngSelectableValues = $R(2, slideCount-3); // limit user values can drag to

			// set the starting day index (within our desired range).
			var dayNumber = this.startDate.getDate();
			var startingDayIndex = dayNumber -1;
			if(!(rngSelectableValues.include(startingDayIndex))){
				startingDayIndex = (startingDayIndex < rngSelectableValues.start) ? rngSelectableValues.start : rngSelectableValues.end;
			}
			this.ss.jumpTo(startingDayIndex); // set the sidescroller's starting position

			// setup slider numbers
			var calslider_numbers = $('calslider_numbers');
			for(var i =1; i <= slideCount; i++){
				var elLi = new Element('li').update(i);
				var attSlideIndex = i;
				if(!(rngSelectableValues.include(i))){
					attSlideIndex = (attSlideIndex < rngSelectableValues.start) ? rngSelectableValues.start : rngSelectableValues.end + 1;
				}
				// add an attribute within selectable range
				elLi.writeAttribute('_slideIndex', attSlideIndex);
				
				// attach a click event
				elLi.addClassName('eventlink');
				elLi.observe('click', this._numberClick.bindAsEventListener(this));				
				
				calslider_numbers.appendChild(elLi);
			}
			//console.log(rngSelectableValues);

			// init slider as property
			this.slider = new Control.Slider('calslider_handle','calslider_track',{
				range: rngDisplay,
				values: rngSelectableValues, // limit user values can drag to
				sliderValue: this.ss.currentSlideIndex,
				onChange: this._sliderChange.bindAsEventListener(this)
			});

			this.slider.setValue(this.ss.currentSlideIndex);// move the handle to the correct index		
		},
		
		_numberClick: function(e){
			var number = parseInt(Event.element(e).readAttribute('_slideIndex'));
			this.slider.setValue(number-1);// convert to zero-based and move handle.
		},
		
		_sliderChange: function(v){
			//console.log(this);
			if(this.ss.isMoving){this.ss.stopMoving();} // ADD user protection
			this.ss.moveTo(v);
			this.highlightSelectedNumbers(v);
		},
		
		// for highlighting "selected" numbers within glass slider range
		highlightSelectedNumbers: function(iValue){
			var calslider_numbers = $('calslider_numbers');
			var rngSelects = $R(iValue-2, iValue+2).findAll(function(n){return n >=0});
			calslider_numbers.childElements().invoke('removeClassName', 'selected');
			rngSelects.each(function(v){
				calslider_numbers.childNodes[v].addClassName('selected');
			})
		}
});