
Namespace.register('aegoncz.funds');

/* FundPeriodManager Class
------------------------------------------------------------*/
aegoncz.funds.FundPeriodManager = new Class({
	
	Implements:Events,
	
	label:null,
	now:null,
	
	dropdown:null,
	period:{
		from:null,
		to:null
	},
	
	datepicker:{
		container:null,
		from:null,
		to:null
	},
	
	radios:null,
	
	initialize:function(domContainer) {
		
		// initialize dropdown
		this.dropdown = new mirabeau.controls.Dropdown(domContainer);
		this.dropdown.addValidParent('.datepicker');
		
		// set now date to today
		this.now = new Date();
		
		// bind behaviour to submit button
		var btn = domContainer.getElement('a.btn');
			btn.addEvent('click',this.onClose.bind(this));
		
		// set label dom
		this.label = domContainer.getElement('span.selected');
		
		// set datepicker controls
		if (mirabeau.utils.Test.isClassAvailable('DatePicker')) {
			
			this.datepicker.container = domContainer.getElement('.date-range-item');
			this.datepicker.container.addClass('screenreader');
			
			var fields = domContainer.getElements('input.date');
			
			this.datepicker.from = new DatePicker(fields[0],{
					days:Locale.get('Date','days'),
					months:Locale.get('Date','months')
			});
			this.datepicker.from.addEvent('select',this.updateValues.bind(this));
			
			this.datepicker.to = new DatePicker(fields[1],{
					days:Locale.get('Date','days'),
					months:Locale.get('Date','months')
			});
			this.datepicker.to.addEvent('select',this.updateValues.bind(this));
		}
		
		// listen to radio buttons
		this.radios = domContainer.getElements('input[type=radio]');
		this.radios.addEvent('click',this.updateValues.bind(this));
		
		// call updated method, this sets initial period
		this.updateValues();
	}
});

aegoncz.funds.FundPeriodManager.implement({
	
	updateValues:function() {
		
		// get selected months from radios
		var label = '';
		var months = 0;
		for (var i=this.radios.length;i--;){
			if (this.radios[i].get('checked')) {
				months = parseInt(this.radios[i].get('value'),10);
				label = this.radios[i].getNext('label').get('text');
				break;
			}
		}
		if (months>=0) {
			
			// disable datepicker fields
			this.datepicker.container.addClass('screenreader');
			
			// if months is set, to is always today
			this.period.to = this.now.clone();
			
			if (months===0) {
				
				// set from to 1970
				this.period.from = new Date(0);
				
				// update label
				this.label.set('text',label);
			}
			else {
				
				// set from date to x months back from now
				this.period.from = this.now.clone().decrement('month',months);
				
				// update label
				this.label.set('text',this.getFormattedPeriod() + ' (' + label + ')');
			}
		}
		else {
			
			// show datepickers
			this.datepicker.container.removeClass('screenreader');
			
			// user input
			var from = this.datepicker.from.getDate();
			var to = this.datepicker.to.getDate();
			
			// if to is bigger than current date set to current date
			if (to.getTime() > this.now.getTime()) {
				this.datepicker.to.setDate(this.now.clone());
			}
			
			// if from is bigger than to reset to 'to'
			if (from.getTime() > to.getTime()) {
				this.datepicker.from.setDate(to);
			}
			
			this.period.from = this.datepicker.from.getDate();
			this.period.to = this.datepicker.to.getDate();
			
			// update label
			this.label.set('text',this.getFormattedPeriod() + ' (' + label + ')');
		}
		
		// clear time
		this.period.from.clearTime();
		this.period.to.clearTime();
		this.period.to.increment('day',1);
		
		this.onUpdated();
	},
	
	getFormattedPeriod:function() {
		return this.period.from.format('date') + ' - ' + this.period.to.format('date');
	},
	
	onUpdated:function() {
		
		// dispatch updated event
		this.fireEvent(mirabeau.events.Event.UPDATED);
	},
	
	onClose:function(e) {
		
		if (e) {
			e.stop();
		}
		
		this.dropdown.toggle();
	},
	
	getPeriod:function() {
		return {
			from:this.period.from.clone(),
			to:this.period.to.clone()
		};
	},
	
	setPeriod:function(fromTimestamp,toTimestamp) {
		
		// set period
		this.period.from = new Date(fromTimestamp);
		this.period.to = new Date(toTimestamp);
		
		// reset checked state
		this.radios.removeProperty('checked');
		
		// mark 'user defined' ratio
		var label = '';
		for (var i=this.radios.length;i--;){
			if (this.radios[i].get('value') === '-1') {
				this.radios[i].setProperty('checked','checked');
				label = this.radios[i].getNext('label').get('text');
				break;
			}
		}
		
		// set datepicker value
		this.datepicker.from.setDate(this.period.from);
		this.datepicker.to.setDate(this.period.to);
		
		// show datepickers
		this.datepicker.container.removeClass('screenreader');
		
		// update label
		this.label.set('text',this.getFormattedPeriod() + ' (' + label + ')');
		
		// fire updated event
		this.onUpdated();
	}
});


