var vlaCalendar = new Class({
	'slideDuration'	: 500,
	'fadeDuration'	: 500,
	'transition'	: Fx.Transitions.Quart.easeOut,
	'startMonday'	: false,
	'leadingZero'	: true,
	'twoDigitYear'	: false,
	'filePath'		: 'inc/',
	'style'			: '',
	initialize: function(_container, _arguments) {
		if(_arguments) $extend(this, _arguments);
		this.loading = false;
		this.container = _container = $(_container);
		var _class = this;
		this.u('base', '', function() { 
			_class.mainLoader = _container.getElement('div[class=loaderA]');
			_class.tempLoader = _container.getElement('div[class=loaderB]');
			_class.label 	  = _container.getElement('span[class=label]');
			_class.arrowLeft  = _container.getElement('div[class=arrowLeft]');
			_class.arrowRight = _container.getElement('div[class=arrowRight]');				
			_class.initializeCalendarFunctions();
		}, _container);
	},
	initializeCalendarFunctions: function() {
		this.resetArrows();
		var vars = JSON.decode(this.mainLoader.getElement('table').getProperty('summary'));
		var _class = this; 
		this.label.removeClass('noHover').set('html', vars.label).onclick = vars.parent ? function() { _class.u(vars.parent, 'ts=' + vars.ts + '&parent=' + vars.current, function() { _class.fade(); }); } : null;
		if(vars.hide_left_arrow) this.hideLeftArrow();
		else if(vars.hide_right_arrow) this.hideRightArrow();		
		this.arrowLeft.onclick = function() { _class.u(vars.current, 'ts=' + vars.pr_ts, function() { _class.slideLeft(); }); }
		this.arrowRight.onclick = function() { _class.u(vars.current, 'ts=' + vars.nx_ts, function() { _class.slideRight(); }); }
		var clickables = this.mainLoader.getElements('td');
		switch(vars.current) {case 'month': if(this.picker) {clickables.each(function(_clickable) { _clickable.onclick = function() { _class.pick(JSON.decode(_clickable.getProperty('date'))); }});} break;case 'year': clickables.each(function(_clickable) { _clickable.onclick = function() { _class.u('month', 'ts=' + _clickable.getProperty('ts'), function() { _class.fade(); }); }}); break;case 'decade': this.label.addClass('noHover'); clickables.each(function(_clickable) { _clickable.onclick = function() { _class.u('year', 'ts=' + _clickable.getProperty('ts') + '&m_ts=' + _clickable.getProperty('m_ts'), function() { _class.fade(); }); }}); break;}
	},
	u: function(_url, _pars, _onComplete, _id) {if(!this.loading) {var _class = this;this.loading = true;var element = $(_id ? _id : this.tempLoader);_pars += '&picker=' + (this.picker ? 1 : 0) + '&startMonday=' + (this.startMonday ? 1 : 0) + '&leadingZero=' + (this.leadingZero ? 1 : 0)  + '&twoDigitYear=' + (this.twoDigitYear ? 1 : 0) + '&style=' +  this.style;new Request({ method: 'post', url: this.filePath + _url + '.php',onComplete: function(data) {element.set('html',data);_onComplete();_class.loading = false;},evalScripts: true }).send(_pars);}},slideLeft: function() {var _class = this;this.loading = true;this.tempLoader.effect('margin-left', {duration: this.slideDuration, transition: this.transition}).start(-164, 0);this.mainLoader.effect('margin-left', {duration: this.slideDuration, transition: this.transition}).start(0, 164).addEvent('onComplete', function() { _class.loading = false; } );this.switchLoaders();},
	slideRight: function() {var _class = this;this.loading = true;this.mainLoader.effect('margin-left', {duration: this.slideDuration, transition: this.transition}).start(0, -164); this.tempLoader.effect('margin-left', {duration: this.slideDuration, transition: this.transition}).start(164, 0).addEvent('onComplete', function(){_class.loading = false;});this.switchLoaders();},
	fade: function() {var _class = this;this.loading = true;this.tempLoader.setStyles({'opacity': 0, 'margin-left': 0});this.mainLoader.effect('opacity', {duration: this.fadeDuration, transition: this.transition}).start(1, 0);this.tempLoader.effect('opacity', {duration: this.fadeDuration, transition: this.transition}).start(0, 1).addEvent('onComplete',function() {_class.tempLoader.setStyles({'opacity': 1, 'margin-left': -999}); _class.loading = false;});this.switchLoaders();},
	switchLoaders: function() {this.mainLoader = this.mainLoader.className == 'loaderA' ? this.container.getElement('div[class=loaderB]') : this.container.getElement('div[class=loaderA]');this.tempLoader = this.tempLoader.className == 'loaderA' ? this.container.getElement('div[class=loaderB]') : this.container.getElement('div[class=loaderA]');this.initializeCalendarFunctions();},
	resetArrows: function() {this.arrowLeft.setStyle('visibility', 'visible');this.arrowRight.setStyle('visibility', 'visible');},
	hideLeftArrow: function() {this.arrowLeft.setStyle('visibility', 'hidden');},
	hideRightArrow: function() {this.arrowRight.setStyle('visibility', 'hidden');} 
});
var vlaDatePicker = vlaCalendar.extend({
	'separateInput': false,
	'separator': '/',
	'format': 'd/m/y',
	'openWith': null,
	'alignX': 'right',
	'alignY': 'inputTop',
	'offset': { 'x': 0, 'y': 0 },
	'style': '',
	'ieTransitionColor' : '#ffffff',
	initialize: function(_element, _arguments) {if(_arguments) $extend(this, _arguments);this.element = $(_element);if(this.separateInput) {this.element.day   = this.element.getElement('input[name=' + this.separateInput.day + ']');this.element.month = this.element.getElement('input[name=' + this.separateInput.month + ']');this.element.year  = this.element.getElement('input[name=' + this.separateInput.year + ']');}this.picker = new Element('div', { 'class': 'vlaCalendarPicker' + (this.style != '' ? ' ' + this.style : '') }).inject($E('body'),'top');this.pickerContent = new Element('div', { 'class': 'pickerBackground' }).inject(this.picker,'top');this.position();this.parent(this.pickerContent);var _class = this; (this.openWith ? $(this.openWith) : this.element).addEvent('focus',  function() { _class.show(); }).addEvent('click',  function() { _class.openWith ? _class.toggle() : _class.show(); }).addEvent('change', function() { _class.hide(); }); document.addEvent('click', function(e) { if(_class.outsideHide && _class.outsideClick(e, _class.picker)) _class.hide(); });this.visible = false;this.outsideHide = false;},
	position: function() {var top, left; switch(this.alignX) { case 'left': left = this.element.getLeft(); break; case 'center': var pickerMiddle = (parseInt(this.pickerContent.getStyle('width')) / 2);if(pickerMiddle == 0) pickerMiddle = 83;left = this.element.getLeft() + (this.element.getSize().x / 2) - pickerMiddle - ((parseInt(this.pickerContent.getStyle('padding-left')) + parseInt(this.pickerContent.getStyle('padding-right'))) / 2);break; case 'right': default: left = this.element.getLeft() + this.element.getSize().x; break;} switch(this.alignY) { case 'bottom': top = this.element.getTop() + this.element.getSize().y; break; case 'top': top = this.element.getTop() - parseInt(this.pickerContent.getStyle('height')) - (parseInt(this.pickerContent.getStyle('padding-top')) + parseInt(this.pickerContent.getStyle('padding-bottom'))); break; case 'inputTop': default: top = this.element.getTop(); } if(this.isNumber(this.offset.x)) left += this.offset.x; if(this.isNumber(this.offset.y)) top += this.offset.y; this.picker.setStyles({ 'top': top, 'left': left });},
	show: function() {this.position();if(!this.visible) {this.visible = true;var _class = this;this.picker.setStyles({ 'opacity': 0, 'display': 'inline' });if(Browser.Engine.trident5) this.picker.setStyle('background-color', this.ieTransitionColor); this.picker.effect('opacity', {duration: this.fadeDuration, transition: this.transition}).start(0, 1).addEvent('onComplete', function() { if(Browser.Engine.trident5) _class.picker.setStyle('background-color', 'transparent'); _class.outsideHide = true; });}},
	hide: function() {if(this.visible) {this.visible = false;var _class = this;if(Browser.Engine.trident5) this.picker.setStyle('background-color', this.ieTransitionColor);this.picker.effect('opacity', { duration: this.fadeDuration, transition: this.transition }).start(1, 0).addEvent('onComplete', function() { _class.picker.setStyle('display', 'none'); _class.outsideHide = false;});}},
	toggle: function() {if(this.visible) this.hide();else this.show();},
	pick: function(_date) { if(this.separateInput) {if(this.element.day) this.element.day.value	= _date.day;if(this.element.month) this.element.month.value = _date.month;if(this.element.year) this.element.year.value = _date.year;this.hide();} else { switch(this.format) {case "m/d/y": this.element.value = _date.month + this.separator + _date.day + this.separator + _date.year; break; case "y/m/d": this.element.value = _date.year + this.separator + _date.month + this.separator + _date.day; break; case "y/d/m": this.element.value = _date.year + this.separator +  _date.day + this.separator + _date.month; break; case "d/m/y": default: this.element.value = _date.day + this.separator + _date.month + this.separator + _date.year;} this.hide();}},
	isNumber: function(number) {return (number >= 0) || (number < 0) ? true : false;},
	outsideClick: function(event, element) {var mousePos = this.getMousePos(event);var elementData = element.getCoordinates();return (mousePos.x > elementData.left && mousePos.x < (elementData.left + elementData.width)) && (mousePos.y > elementData.top  && mousePos.y < (elementData.top + elementData.height)) ? false : true;},
	getMousePos: function(event) {if(document.all) {return { 'x': window.event.clientX + window.getScrollLeft(),'y': window.event.clientY + window.getScrollTop() };} else {return { 'x': event.page['x'],'y': event.page['y'] };}}
});