var Details = {

	matches : 0,
	lastChangeObj : null,
	archieveIn : null,
	endDate : null,
	isOnload : false,

	init : function(type) {

		this.isOnload = true;
		//alert('init type='+type);
		this.type = type || 'setup'; // setup, new

		var cls = this;

		// personal
		jQuery('select[name$=birthYear]').each(function(index, obj) {
			jQuery(this).bind('change', $delegate(cls, 'onChangeBirthYear', this)).trigger('change');
		});
		jQuery(':radio[name$=gender]').each(function(index, obj) {
			jQuery(this).bind('click', $delegate(cls, 'onChangeGender', this)).trigger('change');
		});
		jQuery('select[name$=country]').each(function(index, obj) {
			jQuery(this).bind('change', $delegate(cls, 'onChangeCountry', this)).trigger('change');
		});

		// dates & calcs
		this.formatYear(jQuery('input[name$=startDate]').bind('change', $delegate(this, 'onUpdateDates', null)));
		this.endDate = jQuery('input[name$=endDate]');
		this.formatYear(this.endDate);
		this.endDate[0].onchange = function() {
			$delegate(cls, 'onUpdateDates', this)();
		};
		/*this.endDate.each(function(index, obj) {
			jQuery(this).bind('change', $delegate(cls, 'onUpdateDates', this));

		});*/
		this.archieveIn = jQuery('input[name$=achieveIn]').each(function(index, obj) {
			jQuery(this).bind('change', $delegate(cls, 'onUpdateDates', this));
		});
		jQuery('select[name$=achieveInUnits]').bind('change', $delegate(this, 'onUpdateDates', null));
		this.onUpdateDates();

		jQuery('#progressCurrentValue').bind('change', $delegate(this, 'onUpdateCalcs'));
		jQuery('#progressTargetValue').bind('change', $delegate(this, 'onUpdateCalcs'));
		this.onUpdateCalcs();

		// match
		var checks = jQuery(':checkbox[name^=goal.on]').each(function(index, obj) {
			var check = jQuery(this);
			check.bind('change', $delegate(cls, 'onChangeMatches', check));
			if (check.attr('checked')) {
				cls.matches++;
			}
		});

		this.updateMatches(null);

		this.isOnload = false;
	},

	// personal
	onChangeBirthYear : function(select) {
		//alert('onChangeBirthYear select='+select);
		jQuery('#rt_birthYear').html(select.options[select.selectedIndex].text);
	},

	onChangeGender : function(radio) {
		//alert('onChangeGender radio='+radio);
		jQuery('#rt_gender').html(radio.parentNode.textContent || radio.parentNode.innerText || radio.value || '');
	},

	onChangeCountry : function(select) {
		//alert('onChangeCountry select='+select);;
		jQuery('#rt_country').html(select.options[select.selectedIndex].text);
	},

	// dates & calcs
	onUpdateDates : function(changeObj) {
		//alert('onUpdateDates changeObj='+changeObj);
		if (changeObj) {
			this.lastChangeObj = changeObj;
		}
		var startDateValue = jQuery('input[name$=startDate]').attr('value');
		var endDateValue = jQuery('input[name$=endDate]').attr('value');
		var achieveIn = Number(jQuery('input[name$=achieveIn]').attr('value')) || 0;
		var achieveValue = '';
		//alert(startDateValue+'|'+endDateValue+'|'+achieveIn);
		if (startDateValue && (endDateValue || achieveIn)) {
			var unitsSelect = jQuery('select[name$=achieveInUnits]')[0];
			jQuery('#prUnitsValue').html(unitsSelect.options[unitsSelect.selectedIndex].text);
			if (endDateValue && (this.lastChangeObj == this.endDate[0] || !achieveIn)) {
				var dateArr = startDateValue.split('/');
				var startDate = new Date(dateArr[2], dateArr[1]-1, dateArr[0]);
				dateArr = endDateValue.split('/');
				var endDate = new Date(dateArr[2], dateArr[1]-1, dateArr[0]);
				if (endDate >= startDate) {
					var diff = endDate-startDate;
					var days = diff/1000/60/60/24;
					switch (unitsSelect.selectedIndex) {
						case 0: // days
							achieveValue = Math.round(days);
							break;
						case 1: // weeks
							achieveValue = this.decimalRound(days/7, 1);
							break;
						case 2: // monts
							achieveValue = this.decimalRound(days/30.415, 1);
							break;
						default:
						 alert('ERROR: unexpected units index: '+unitsSelect.selectedIndex);
					}
				}
				jQuery('input[name$=achieveIn]').attr('value', achieveValue);
			} else if (achieveIn && !this.isOnload) {
				var dateArr = startDateValue.split('/');
				var startDate = new Date(dateArr[2], dateArr[1]-1, dateArr[0]);

				var oneDay = 24*60*60*1000;
				var endDate;
				switch (unitsSelect.selectedIndex) {
					case 0: // days
						endDate = new Date(startDate.getTime() + Math.ceil(achieveIn*oneDay));
						break;
					case 1: // weeks
						endDate = new Date(startDate.getTime() + Math.ceil(achieveIn*7*oneDay));
						break;
					case 2: // months
						if (achieveIn == Math.round(achieveIn)) {
							var years = Math.floor((startDate.getMonth() + achieveIn)/12);
							var month = (startDate.getMonth() + achieveIn)%12;
							endDate = startDate;
							endDate.setMonth(month);
							endDate.setYear(endDate.getFullYear() + years);
						} else {
							endDate = new Date(startDate.getTime() + Math.ceil(achieveIn*30.415*oneDay));
						}
						break;
					default:
						alert('ERROR: unexpected units index: '+unitsSelect.selectedIndex);
				}
				//alert('endDate='+endDate);
				jQuery('input[name$=endDate]').attr('value', this.zeroPad(endDate.getDate(), 2)+'/'+this.zeroPad(endDate.getMonth()+1, 2)+'/'+endDate.getFullYear());
			}
		}
		this.onUpdateCalcs();
	},

	onUpdateCalcs : function() {
		//alert('onUpdateCalcs');
		var current = jQuery('#progressCurrentValue').attr('value') || '';
		var target = jQuery('#progressTargetValue').attr('value') || '';
		var startDateValue = jQuery('input[name$=startDate]').attr('value');
		var endDateValue = jQuery('input[name$=endDate]').attr('value') || '';
		var progressRate = jQuery('input[name=goal.progressRate]').attr('value');
		var achieveValue = 0;
		if (current.length && target.length && startDateValue && (endDateValue || progressRate)) {
			//var unitsSelect = jQuery('select[name$=frequencyUnits]')[0] || jQuery('select[name$=achieveInUnits]')[0];
			var decimalNums = 2;
			var unitsSelect = jQuery('select[name$=achieveInUnits]')[0];
			var dateArr = startDateValue.split('/');
			var startDate = new Date(dateArr[2], dateArr[1]-1, dateArr[0]);
			dateArr = endDateValue.split('/');
			var endDate = new Date(dateArr[2], dateArr[1]-1, dateArr[0]);
			if (endDate >= startDate) {
				var daysDiff = endDate-startDate;
				var days = daysDiff/1000/60/60/24;

				var diff = Math.abs(target-current);
				switch (unitsSelect.selectedIndex) {
					case 0: // days
						achieveValue = this.decimalRound(diff/days, decimalNums);
						break;
					case 1: // weeks
						achieveValue = this.decimalRound(diff/(days/7), decimalNums);
						break;
					case 2: // monts
						achieveValue = this.decimalRound(diff/(days/30.415), decimalNums);
						break;
					default:
						alert('ERROR: unexpected units index: '+unitsSelect.selectedIndex);
				}
				achieveValue = Math.min(achieveValue, diff);





			}
		}
		jQuery('input[name=goal.progressRate]').attr('value', achieveValue);
	},

	// match
	onChangeMatches : function(check) {
		//alert('onChangeMatches check='+check);
		this.matches += check.attr('checked') ? 1 : -1;
		this.updateMatches();
	},

	updateMatches : function() {
		//alert('updateMatches');
		var matches = this.matches;
		var totals = jQuery('span.rt_criteriaCount').html(matches);
		var selects = jQuery('select[name^=goal.preferences]').each(function(index, obj) {
			var sIndex = Math.max(0, Math.min(this.selectedIndex, matches-1));
			this.innerHTML = '';
			var option;
			for (var i = 0; i < matches; i++) {
				option = new Option();
				option.text = i+1;
				option.value = i+1;
				if (i == sIndex) {
					option.selected = 'selected';
				}
				try { // standards compliant; doesn't work in IE
					this.add(option, this.options[this.length]);
				} catch(e) { // IE only
					this.add(option, this.length);
				}
			}
			this.selectedIndex = sIndex;
		});

		// set form's hidden field value
		jQuery('form[name^=setupForm]').get(0).selectedMatchesCount.value = this.matches;
	},

	// utils
	zeroPad : function(str, num) {
		var result = String(str);
		var len = result.length;
		for (var i = 0; i < num-len; i++) {
			result = '0'+result;
		}
		return result;
	},
	decimalRound : function(num, zeros) {
		return Math.round(num*Math.pow(10, zeros))/Math.pow(10, zeros);
	},

	formatYear : function(obj) {
		if (obj.attr('value')) {
			var date = obj.attr('value').split('/');
			if (date[2] && date[2].length == 2) {
				date[2] = '20' + date[2];
				obj.attr('value', date.join('/'));
			}
		}
	}

};
