Wellness.BMI = new Class({
	initialize: function(element, options) {
		this.bmiForm = $(element);

		if(!this.bmiForm) { return false; }
	},

	calculate: function() {
		if(this.validate()) {
			this.bmiForm.get('send', {
				onComplete: this.onComplete.bind(this)
			});
			
			this.bmiForm.send();
		}
		else {
			this.showError($('stickywin-error').get('html'));
		}
	},

	explain: function() {
			new StickyWinModal({
  				content: $('explainbmi').get('html')
			});
	},
	
	validate: function() {
		var validGender = this.bmiForm.getElements('input[type="radio"]').some(function(gender) { return gender.get('checked'); });
		var validHeightWeight = this.bmiForm.getElements('input[type="text"]').every(function(textField) { return textField.get('value').test('^[0-9]{2,3}$'); });
		
		return (validGender && validHeightWeight);
	},
	
	showError: function(contents) {
		new StickyWinModal({
  			content: contents
		});
	},
	
	showResult: function(contents) {
		new StickyWinModal({
  			content: contents
		});
	},
	
	onComplete: function(resp) {
		var bmi = JSON.decode(resp);
		$('bmi-result').set('text', bmi.category);
		$('bmi-text').set('text', bmi.verdict);
		$('bmi-value').set('text', bmi.cbmi);
		$('bmi-slider-mark').set('text', bmi.cbmi);

		if (bmi.cbmi <= 18.5) {
		    width = 82;
		    offset = 0;
		    lower = 0;
		    upper = 18.5;
		} else if (bmi.cbmi <= 25) {
		    width = 143;
		    offset = 82;
		    lower = 18.5;
		    upper = 25
		}  else if (bmi.cbmi <= 30) {
		    width = 145;
		    offset = 225;
		    upper = 30;
		    lower = 25;
		} else {
		    width = 82;
		    offset = 370;
		    upper = 40;
		    lower = 30;
		}

		pos = (offset + width * (bmi.cbmi - lower) / (upper - lower)) < 450 ? (offset + width * (bmi.cbmi - lower) / (upper - lower)) : 450;
    	this.showResult($('stickywin').get('html'));
		$$('.slider-mark').set('tween', {duration: 'long'});
		$$('.slider-mark').tween('left', 0, pos);
	}
});
