var slidersInitialized = false;
var isKegulating = false;
var slidingElements;

function initKegulator() {
	var dq = $("drink_quantity");
	$("drink_quantity").onchange = function() { setNumberDrinkers(); };
	$("drink_quantity").onkeypress = function(event) { 
		if(checkEnterKey(event))slidingElements=activateSliders(); 
	};
	$("complete_step_one").onclick = function() { slidingElements=activateSliders(); return false; };
	$("optimize").onclick = function() { slidingElements.optimize(); return false; };
}
function checkEnterKey(evt)
{
	if(evt) charCode = evt.keyCode;
	else charCode = event.keyCode;
	
	if ( charCode == 13) { 
		return true
	} else {
		return false
	}
}




function validateDrinkQuantity() {
	var rValue = true;
	var numberDrinkers = $("drink_quantity").getValue();
	if (isNaN(numberDrinkers) || numberDrinkers < 1) {
		Effect.Shake('drink_quantity', 4);
		rValue = false;
	}
	return rValue;
}

function activateSliders() {
	var drinkers = parseInt($("drink_quantity").getValue());
	if (!validateDrinkQuantity()){
		return (slidersInitialized) ? slidingElements : false;
	} else {
		Element.removeClassName('slide_wrapper', 'disabled');
		Element.removeClassName('optimizer', 'disabled');
		if (slidersInitialized) {
			slidingElements.rebuildSliders(drinkers);
			return slidingElements;
		} else {
			slidersInitialized = true;
			return new Sliders(drinkers);
		}
	}
}

function setNumberDrinkers() {
	if(slidersInitialized)slidingElements=activateSliders();
}


function Sliders(drinkers) {
	
	this.drinkers = drinkers;
	var drinkerDistribution, tipsy, buzzed, drunk, hammered, random, sliderElements;
	init();

	function init() {
		Element.show('drinkers_loading');
		drinkerDistribution = getDistribution();
		buildSliders();
		Element.hide('drinkers_loading');
	}
	
	function getDistribution(distribution) {
		if (!distribution) distribution = [0, 0, 0, 0, 1]; 
		if (drinkers == 1) distribution = [0, 0, 0, 1, 0]; 
		var drinkersRemaining = drinkers;
		var drinkerDistribution = new Array(5);
		for (i = 0; i < 5; i++) {
			var numberDrinkers = Math.round(drinkers * distribution[i]);
			if (numberDrinkers > drinkersRemaining || i == 4) { numberDrinkers = drinkersRemaining; }
			drinkerDistribution[i] = numberDrinkers;
			drinkersRemaining -= numberDrinkers;
		}
		return drinkerDistribution;
	}
	
	
	function buildSliders() {
		tipsy = createSlider('tipsy', drinkerDistribution[0]);
		buzzed = createSlider('buzzed', drinkerDistribution[1]);
		drunk = createSlider('drunk', drinkerDistribution[2]);
		hammered = createSlider('hammered', drinkerDistribution[3]);
		random = createSlider('random', drinkerDistribution[4]);
		sliderElements = [tipsy, buzzed, drunk, hammered, random];
		random.options.onSlide = function(value, slider) {}
		random.options.onChange = function(value, slider) { setSliderCount(slider); }
		random.setDisabled();
		updateSliders();
	}
	
	function createSlider(name, count) {
		var slider = new Control.Slider(name + '_handle', name + '_slider');
		slider.name = name;
		slider.count = count;
		slider.options.onSlide = function(value, slider) {
			fixSliderValue(slider);
			moveRandomSlider();
			setSliderCount(slider);
		};
		slider.options.onChange = function(value, slider) {
			fixSliderValue(slider);
			snapSliderPosition(slider);
			moveRandomSlider();
			setSliderCount(slider);
		};
		return slider;
	}

	
	function fixSliderValue(slider) {
		var other_total, i, other_slider, total;
		other_total = 0; for (i = 0; i < 4; i++) {
			other_slider = sliderElements[i];
			if (other_slider.name != slider.name) { other_total += other_slider.count; }
		}
		total = (slider.value * drinkers) + other_total;
		if (total > drinkers) {
			slider.setValue((drinkers - other_total) / drinkers);
		}
		slider.count = Math.round(slider.value * drinkers);
	}
	
	function snapSliderPosition(slider) {
		var count;
		count = slider.value * drinkers;
		if (count != Math.round(count)) {
			slider.setValue(Math.round(count) / drinkers);
		}
		slider.count = (slider.value * drinkers);
	}

	function moveRandomSlider() {
		var value_total, count_total, i, slider;
		value_total = 0; count_total = 0;
		for (i = 0; i < 4; i++) {
			slider = sliderElements[i];
			value_total += slider.value;
			count_total += slider.count;
		}
		random.count = drinkers - count_total;
		random.setValue(1 - value_total);
	}
	
	function setSliderCount(slider) {
		var percent;
		percent = Math.round(slider.count / drinkers * 100);
		$(slider.name + '_count').innerHTML = slider.count + ' <span class="gray">' + percent + '%</span>';
	}
	
	function updateSliders() {
		var i, slider;
		for (i = 0; i < 5; i++) {
			slider = sliderElements[i];
			slider.count = 0;
			slider.value = 0;
		}
		for (i = 0; i < 5; i++) {
			slider = sliderElements[i];
			slider.count = drinkerDistribution[i];
			slider.setValue(drinkerDistribution[i] / drinkers);
		}
	}
	
	this.rebuildSliders = function(new_drinkers) {
		drinkers = new_drinkers;
		this.drinkers = drinkers;
		Element.show('drinkers_loading');
		if (drinkers == 1) { lonely(); }
		drinkerDistribution = getDistribution([tipsy.value, buzzed.value, drunk.value, hammered.value, random.value]);
		updateSliders();
		Element.hide('drinkers_loading');
	}
	
	this.getSliderValue = function(name) {
		switch(name) {
			case 'tipsy': return tipsy.count; break;
			case 'buzzed': return buzzed.count; break;
			case 'drunk': return drunk.count; break;
			case 'hammered': return hammered.count; break;
			case 'random': return random.count; break;
		}
	}
	
	this.optimize = function() {
		if (!slidersInitialized || isKegulating) { return; }
		isKegulating = true;
		Element.show('processing');
		if ($('results')) { Element.remove('results'); }
		new Ajax.Updater(
			'optimizer',
			'beer-calculator/optimizer.php?ndrinkers=' + 
				slidingElements.drinkers + '&ntipsy=' +
				slidingElements.getSliderValue('tipsy') + '&nbuzzed=' +
				slidingElements.getSliderValue('buzzed') + '&ndrunk=' +
				slidingElements.getSliderValue('drunk') + '&nhammered=' +
				slidingElements.getSliderValue('hammered'),
			{
				asynchronous: true,
				evalScripts: true,
				insertion: Insertion.After,
				onSuccess: function() {
					Element.hide('processing');
					isKegulating = false;
					setTimeout('$("optimizer").scrollTo();', '10');
				}
			}
		);
	}
}




