/* Date slider element, Ajaxorized.com,  2008 */
var sliderReference;

/* Extend the data element a bit */
Date.prototype.getDiffDays = function(p_oDate) {
	p_iOneDay = 1000*60*60*24;
	return Math.ceil((p_oDate.getTime()-this.getTime())/(p_iOneDay));
}

/* The dateslider */
DateSlider = Class.create({
	initialize : function(p_sBarId, p_sStartDate, p_sEndDate, p_iStartYear, p_iEndYear, is_fixed) {
		/* Start */
		this.barStartDate = Date.parse(p_iStartYear+'-01-01');

		this.iStartYear = p_iStartYear;
		this.iEndYear = p_iEndYear;
		
		/* Panel dates */
		this.oStartDate = Date.parse(p_sStartDate);
		this.oEndDate = Date.parse(p_sEndDate);		

		/* The fields (set later) */
		this.oStartField = null;
		this.oEndField = null;
		
		/* The labels (set later, optional) */
		this.oStartLabel = null;
		this.oEndLabel = null;
		
		this.l_iLeftPos = null;
		this.l_iRightPos = null;
		
		this.timer = null;
	
		sliderReference = this;
		
		this.sliderBarMargin = 0;

		l_oStartDate = Date.parse(p_sStartDate);
		l_oEndDate = Date.parse(p_sEndDate);
		
		this.iLeftOffsetLH = this.barStartDate.getDiffDays(l_oStartDate);
		this.iLeftOffsetRH = this.barStartDate.getDiffDays(l_oEndDate);			
		
		this.dayDivWidth = 1;
		this.createSliderBar(p_sBarId, is_fixed);
		if (is_fixed) {
			
		} else {
 		  this.createHandles(p_sBarId, p_sStartDate, p_sEndDate);
		  this.createShiftPanel(p_sBarId, p_sStartDate, p_sEndDate);
		}
	},
	createSliderBar : function(p_sBarId, is_fixed) {
		/* Create the yearlabels */
		var sliderDayDivWidth = this.dayDivWidth;

		l_iYear = this.iStartYear.toString();
		while(l_iYear <= this.iEndYear) {		
			l_oData = Date.parse('01-01-'+l_iYear);
			if(l_oData.isLeapYear()) iDays = 366; else iDays = 365;  
			
			divWidth = sliderDayDivWidth*iDays;
			l_oYearLabelDiv = Builder.node('div', {className : 'yearLabel'});
			if ((l_iYear % 2) == 0) {
			  Element.addClassName(l_oYearLabelDiv, 'even');
			} else {
			  Element.addClassName(l_oYearLabelDiv, 'odd');
			}
			$(l_oYearLabelDiv).update(l_iYear + ( ie ? "" : " (<a href='" + window.location.pathname +"?from=" + l_iYear + "-01-01&to="+ l_iYear + "-12-31'>view all</a>)"));
			
			l_oDiv = $(Builder.node('div', {className : 'slideYear', style : 'width:'+(divWidth-1)+'px'}));
			l_oDiv.appendChild(l_oYearLabelDiv);
			
			
			iTotalDays = 0;
			(12).times(function(e) {
				monthDivWidth = l_oData.getDaysInMonth();
				l_oMonthDiv = Builder.node('div', {className : 'slideMonth',style : 'width:'+(monthDivWidth)+'px; left:'+iTotalDays+'px'});
				if(e==0) { 
					$(l_oMonthDiv).update(l_oData.toString("MMM"));
					$(l_oMonthDiv).addClassName('firstMonth');
				} else {
					$(l_oMonthDiv).update(l_oData.toString("MMM"));
				}
				l_oDiv.appendChild(l_oMonthDiv);
				iTotalDays += monthDivWidth;
				l_oData.addMonths(1);
			});
			$(p_sBarId).appendChild(l_oDiv);
			l_iYear++;
		}
		
		/* Set the the right position and length */
		
		l_oFinishDate = Date.parse((this.iEndYear+1)+'-01-01');
		iBarWidth =this.barStartDate.getDiffDays(l_oFinishDate);
		
		containerWidth = $('slider-container').offsetWidth;
		// l_iCorrection = $('slider-container').offsetWidth/2;
		//l_shiftLeft = 0-(this.barStartDate.getDiffDays(Date.today()))+l_iCorrection;
		l_shiftLeft = containerWidth - iBarWidth;
 		$('sliderbar').setStyle({left : l_shiftLeft+'px', width : iBarWidth+'px'});

		if (is_fixed) {
			// hmm shall we do something here?
			l_iCorrection = $('slider-container').offsetWidth/2;
			l_shiftLeft = 0-((this.barStartDate.getDiffDays(this.oStartDate) + this.barStartDate.getDiffDays(this.oEndDate)) / 2)+l_iCorrection;
			$('sliderbar').setStyle({ left: l_shiftLeft + 'px' });
		} else {
		new Draggable($(p_sBarId), {constraint:'horizontal', starteffect : '', endeffect:'', zindex:'0', snap : function (x,y) {
			// alert("x = " + x);
			// x = $('shiftpanel').offsetLeft;
			if (x < 0 && ((x > 0 - (iBarWidth - containerWidth)) || ($('sliderbar').offsetLeft < 0 - (iBarWidth - containerWidth)))) {
			}
			
			var bannerOffset = Math.ceil((($('sliderbar').offsetLeft / ( iBarWidth - containerWidth)) * containerWidth) / 3); 
			$('themes_banner').setStyle({ backgroundPosition: bannerOffset + 'px'});
			
			return[
			        x < 0 ? 
						(x > 0 - (iBarWidth - containerWidth) ? 
							x : ($('sliderbar').offsetLeft < 0 - (iBarWidth - containerWidth) ? 
								x : 0 - (iBarWidth - containerWidth)) ) : 0,
			        y];
			 }
		});
		}
	},
	createHandles : function(p_sBarId, p_sStartDate, p_sEndDate) {
		/* Calculate positions */
		l_oLeftHandle = $(Builder.node('span', {id : 'lefthandle', style:'left:'+this.iLeftOffsetLH+'px'})).update('&nbsp;');
		l_oRightHandle = $(Builder.node('span', {id : 'righthandle', style:'left:'+this.iLeftOffsetRH+'px'})).update('&nbsp;');
		
		$(p_sBarId).appendChild(l_oLeftHandle);
		$(p_sBarId).appendChild(l_oRightHandle);

		new Draggable(l_oLeftHandle,  {constraint:'horizontal', snap : function(x,y) {
				if ((x > 0) && (x < (0 - $('sliderbar').offsetLeft)) ) {
					$('sliderbar').setStyle({left: (0 - x ) + 'px'});
				} else { 
				  if ((x + l_oLeftHandle.offsetWidth < sliderBarWidth) && (x + l_oLeftHandle.offsetWidth > (containerWidth - $('sliderbar').offsetLeft))) {
					$('sliderbar').setStyle({left: ((x - containerWidth + l_oLeftHandle.offsetWidth) * -1) + 'px'});
				  }
				}
				var bannerOffset = Math.ceil((($('sliderbar').offsetLeft / ( iBarWidth - containerWidth)) * containerWidth) / 3); 
				$('themes_banner').setStyle({ backgroundPosition: bannerOffset + 'px'});
				// x = $('shiftpanel').offsetLeft;
				
			   return[ x < (0 - $('sliderbar').offsetLeft) ? 0 - $('sliderbar').offsetLeft : 
					   ( x > containerWidth - l_oLeftHandle.offsetWidth - $('sliderbar').offsetLeft ? containerWidth - l_oLeftHandle.offsetWidth - $('sliderbar').offsetLeft : 
					 	( x > sliderBarWidth ? sliderBarWidth - l_oLeftHandle.offsetWidth : x )),
			       y ];
			},
			onDrag :  sliderReference._leftDrag, onEnd : sliderReference._leftDrag });
														
		new Draggable(l_oRightHandle,  {constraint:'horizontal', 	snap : function(x,y) {
					if ((x > 0) && (x < (0 - $('sliderbar').offsetLeft)) ) {
						$('sliderbar').setStyle({left: (0 - x ) + 'px'});
					} else { 
					  if ((x + l_oRightHandle.offsetWidth < sliderBarWidth) && (x + l_oRightHandle.offsetWidth > (containerWidth - $('sliderbar').offsetLeft))) {

						$('sliderbar').setStyle({left: ((x - containerWidth + l_oRightHandle.offsetWidth) * -1) + 'px'});
					  }
					}
					var bannerOffset = Math.ceil((($('sliderbar').offsetLeft / ( iBarWidth - containerWidth)) * containerWidth) / 3); 
					$('themes_banner').setStyle({ backgroundPosition: bannerOffset + 'px'});

				   return[ x < (0 - $('sliderbar').offsetLeft) ? 0 - $('sliderbar').offsetLeft : 
						   ( x > containerWidth - l_oRightHandle.offsetWidth - $('sliderbar').offsetLeft ? containerWidth - l_oRightHandle.offsetWidth - $('sliderbar').offsetLeft : 
						 	( x > sliderBarWidth ? sliderBarWidth - l_oRightHandle.offsetWidth : x )),
				       y ];
				}, onDrag : sliderReference._rightDrag, onEnd : sliderReference._rightDrag });	
	},
	createShiftPanel : function(p_sBarId, p_sStartDate, p_sEndDate) {
		/* Calculate width */
		l_iBarWidth = (this.iLeftOffsetRH-this.iLeftOffsetLH)+(2*this.sliderBarMargin);

		l_oShiftPanel = $(Builder.node('div', {id : 'shiftpanel', style:'left:'+(this.iLeftOffsetLH + 7)+'px; width:'+l_iBarWidth+'px'}));
		$(p_sBarId).appendChild(l_oShiftPanel);		
		containerWidth = $('slider-container').offsetWidth;
		sliderBarWidth = $('sliderbar').offsetWidth;
		
		if (this.iLeftOffsetLH + 7 < ($('sliderbar').offsetLeft * -1)) {
			l_iCorrection = $('slider-container').offsetWidth/2;
			l_shiftLeft = 0-((this.barStartDate.getDiffDays(this.oStartDate) + this.barStartDate.getDiffDays(this.oEndDate)) / 2)+l_iCorrection;
			$('sliderbar').setStyle({ left: l_shiftLeft + 'px' }); 
		}
		
		new Draggable(l_oShiftPanel, {constraint:'horizontal', starteffect : '', endeffect:'', zindex:'0', snap : function(x,y) {
				sliderbarOffset = $('sliderbar').offsetLeft;
				panelWidth = $('shiftpanel').offsetWidth;
				panelOffset = $('shiftpanel').offsetLeft;
				
				if ((x > 0) && (x < (0 - sliderbarOffset)) && (panelOffset >= (0 - sliderbarOffset))) {
					$('sliderbar').setStyle({left: (0 - x ) + 'px'});
				} else { 
				  if ((x + panelWidth < sliderBarWidth) && (x + panelWidth > (containerWidth - sliderbarOffset)) && (panelOffset + panelWidth <= (containerWidth - sliderbarOffset))) {
					$('sliderbar').setStyle({left: ((x - containerWidth + panelWidth) * -1) + 'px'});
				  }
				}
				// x = $('shiftpanel').offsetLeft;
				var bannerOffset = Math.ceil((($('sliderbar').offsetLeft / ( iBarWidth - containerWidth)) * containerWidth) / 3); 
				$('themes_banner').setStyle({ backgroundPosition: bannerOffset + 'px'});
				
				
			   return[ (x < (0 - sliderbarOffset)) && (panelOffset >= (0 - sliderbarOffset)) ? 0 - sliderbarOffset : 
					   ( (x > containerWidth - panelWidth - sliderbarOffset)  && (panelOffset + panelWidth <= (containerWidth - sliderbarOffset)) ? containerWidth - panelWidth - sliderbarOffset : 
					 	( x > sliderBarWidth ? sliderBarWidth - panelWidth : x )),
			       y ];
			},
			onDrag : function() { 
					/* Set the handlers while dragging the shiftpanel */
					$('lefthandle').hide();
					$('righthandle').hide();						
					sliderReference._setDates();
					}
				});
	},
	_setDates : function() {
		
		if (this.timer) {
			clearTimeout(this.timer);
		}
		
		/* Get the position of the handles */
		//l_iLeftPos = $('lefthandle').getStyle('left').match(/^(\d+)/)[1];
		//l_iRightPos = $('righthandle').getStyle('left').match(/^(\d+)/)[1];
		l_iLeftPos = $('shiftpanel').offsetLeft - 7;
		l_iRightPos = $('shiftpanel').offsetLeft + $('shiftpanel').offsetWidth -7;
		
		l_oDate = this.barStartDate.clone().addDays(l_iLeftPos);
		l_oDate2 = this.barStartDate.clone().addDays(l_iRightPos);
	
		if(this.oStartField && this.oEndField) {
			this.oStartField.setValue(l_oDate.toString('yyyy-M-d'));		
			this.oEndField.setValue(l_oDate2.toString('yyyy-M-d'));		
		}
		
		if (this.oStartLabel && this.oEndLabel) {
			this.oStartLabel.innerHTML= l_oDate.toString('d MMM yyyy');
			this.oEndLabel.innerHTML= l_oDate2.toString('d MMM yyyy');
		}
		
		this.timer = setTimeout(
			"$('lefthandle').setStyle({left: ($('shiftpanel').offsetLeft-7)+'px'}).show(); $('righthandle').setStyle({left: ($('shiftpanel').offsetLeft + $('shiftpanel').offsetWidth-7)+'px'}).show(); $('date_form').onsubmit()"
			, 500);
		
	},
	_rightDrag : function () {
		l_panelLength = $('righthandle').offsetLeft - $('lefthandle').offsetLeft - 5;
		
		$('shiftpanel').setStyle({width : (l_panelLength+2*sliderReference.sliderBarMargin)+'px'});																	
		sliderReference._setDates();	
	},
	_leftDrag : function() {
		l_panelLength = $('righthandle').offsetLeft - $('lefthandle').offsetLeft - 4;
		$('shiftpanel').setStyle({left: ($('lefthandle').offsetLeft+4)+'px', width : l_panelLength+'px'});															
		sliderReference._setDates();		
	},
	morphTo : function (p_oDateStart, p_oDateEnd) {
		l_offsetLeftLH = this.barStartDate.getDiffDays(l_oStartDate);
		l_offsetLeftRH = this.barStartDate.getDiffDays(p_oDateEnd);
		l_panelLength = l_offsetLeftRH - l_offsetLeftLH;
		$('lefthandle').morph('left:'+l_offsetLeftLH+'px');
		$('righthandle').morph('left:'+l_offsetLeftRH+'px');
		$('shiftpanel').morph('width : '+(l_panelLength+2*sliderReference.sliderBarMargin)+'px; left : '+(l_offsetLeftLH+7)+'px');
		setTimeout("sliderReference._setDates()", 1000);			
	},
	attachFields : function (p_oStartField, p_oEndField, p_oStartLabel, p_oEndLabel) {
		this.oStartField = p_oStartField;
		this.oEndField = p_oEndField;
		this.oStartLabel = p_oStartLabel;
		this.oEndLabel = p_oEndLabel;
		
		p_oStartField.setValue(this.oStartDate.toString('yyyy-M-d'));
		p_oEndField.setValue(this.oEndDate.toString('yyyy-M-d'));
		
		p_oStartField.observe('blur', function(e) {
			/* Morph to the new date */
			l_oStartDate = Date.parse(p_oStartField.getValue());
			l_oEndDate = Date.parse(p_oEndField.getValue());
			sliderReference.morphTo(l_oStartDate, l_oEndDate);
		});	
		
		p_oEndField.observe('blur', function(e) {
			/* Morph to the new date */
			l_oStartDate = Date.parse(p_oStartField.getValue());
			l_oEndDate = Date.parse(p_oEndField.getValue());
			sliderReference.morphTo(l_oStartDate, l_oEndDate);
		});							
		
	}
});