// univ_elements, indie_elements, ink_first, ink_following, corners, and twosided are all defined in calc_data.js (easier to work with data when separated from the logic)

// This is straight out of the Mootools docs
Element.Properties.disabled = {
	get: function(){
		return this.disabled;
	},
	set: function(value){
		this.disabled = !!value;
		
		if (value) {
			$(this.get('id') + '-rendered').addClass('disabled');
		} else {
			$(this.get('id') + '-rendered').removeClass('disabled');
		}
		
		//this.setAttribute('disabled', !!value);
	}
};

// domready logic ==========================================================

window.addEvent('domready', function(){
	$('el_style').addEvent('change', function(e) {
		if (this.value == '') {
			reset_form(true);
		} else {
			generate_items();
			$('el_item').set('disabled', false);
		}
	});
	
	$('el_item').addEvent('change', function(e) {
		
		reveal_quantity();
		generate_options();
		calculate_price();
	});
	
	$$('.quantity select').addEvent('change', function(e) {
		calculate_price();
	});
	
	$$('#extra_options select').addEvent('change', function(e) {
		calculate_price();
	});
	
	$('add_item').addEvent('click', function(e) {
		e.stop();
		add_to_cart();
	});
	
	$('add-form').set('reveal');
	$('cart').set('reveal').hide();
	
	$('switch').addEvent('click', toggle_form);
	
	$$('#calculator select').addEvents({
		mouseenter: function(e) {
			this.addClass('focused');
		},
		blur: function(e) {
			this.removeClass('focused');
		},
		change: function(e) {
			this.removeClass('focused');
		}
	});
	
	$('extra-pop').addEvent('click', function(e) {
		e.stop();
		window.open(this.get('href'), 'extra_pop', "status,menubar,height=400,width=400");
	});
	
	var simpleselect = new SimpleSelectStyle({select_class:'selectbox', form_id:'calculator'});
	
	reset_form(true);
	
	$('content').getElement('.scrollarea').hide();
	
	if (window.location.hash) {
		var hash = window.location.hash.substring(1);
		var option = $('el_style').getElement('.' + hash);
		if (option) {
			option.selected = true;
		} else {
			$('el_style').getElement('.default').selected = true;
		}
	} else {
		$('el_style').getElement('.default').selected = true;
	}
	$('el_style').fireEvent('change');
	
	var formwin;
	$('email_link').addEvent('click', function(e) {
		e.stop();
		formwin = window.open('', 'emailForm', "status,menubar,height=400,width=400");
		$('email_form').target = 'emailForm';
		$('email_form').submit();
		formwin.focus();
	});
});

// FUNCTIONS ================================================================

function disable_select(select) {
	$(select).getElement('.default').selected = true;
	$(select).set('disabled', true);
}

function reset_select(select) {
	$(select).getElement('.default').selected = true;
	$(select).fireEvent('change');
	$(select).getElements('option').each(function(el) {
		if (!el.hasClass('default')) {
			el.destroy();
		}
	});
}

function reset_options() {
	reset_select('opt_ink');
	reset_select('opt_corners');
	reset_select('opt_twosided');
	
	disable_select('opt_ink');
	disable_select('opt_corners');
	disable_select('opt_twosided');
}

function reset_form(complete) {
	complete = (typeof complete != 'undefined' ? complete : false);
	$('el_item').getElement('.default').selected = true;
	$('el_item').fireEvent('change');
	if (complete) {
		disable_select('el_item');
	}
	$$('.quantity select').each(function(el) {
			if (el.get('id') != 'el_quantity') {
				el.hide().removeClass('current');
				$(el.get('id') + '-rendered').hide();
			} else {
				el.show();
				$(el.get('id') + '-rendered').show();
			}
		});
	$('el_quantity').set('disabled', true);
	reset_options();
	calculate_price();
}

function generate_items() {
	var items = $('el_item');
	reset_select(items);
	var ids = $('el_style').value;
	ids = ids.split(',');
	ids.each(function(id) {
		items.grab(new Element('option', { value: id, text: indie_elements[id].name }));
	});
	for (key in univ_elements) {
		items.grab(new Element('option', { value: 'u' + key, text: univ_elements[key].name }));
	}
}

function get_data() {
	var data = indie_elements;
	var id = $('el_item').value;
	if (id.charAt(0) == 'u') {
		data = univ_elements;
	}
	return data;
}

function get_item_id() {
	var id = $('el_item').value;
	if (id.charAt(0) == 'u') {
		id = id.substr(1);
	}
	return id;
}

function reveal_quantity() {
	var data = get_data();
	var id = get_item_id();
	var custom_select = false;
	if (data[id]) {
		if (data[id].flat) {
			$('el_quantity').set('disabled', true);
		} else if (data[id].select_id) {
			$('el_quantity').hide();
			$($('el_quantity').get('id') + '-rendered').hide();
			$(data[id].select_id).show().addClass('current');
			$(data[id].select_id + '-rendered').show();
			custom_select = true;
		} else {
			$('el_quantity').set('disabled', false);
		}
		if (!custom_select) {
			active = $('el_quantity').getNext('.current');
			if (active) {
				active.removeClass('current');
				active.hide();
				$(active.get('id') + '-rendered').hide();
				$('el_quantity').show();
				$($('el_quantity').get('id') + '-rendered').show();
			}
		}
	} else {
		$('el_quantity').set('disabled', true);
	}
}

function generate_options() {
	var data = get_data();
	var id = get_item_id();
	var price, plural, i;
	reset_options();
	if (data[id]) {
		if (data[id].ink) {
			for (i = 1; i <= data[id].ink; i++) {
				price = ink_first + (ink_following * (i-1));
				if (i == 1) {
					plural = '';
				} else {
					plural = 'S';
				}
				$('opt_ink').grab(new Element('option', { value: price, text: '2ND INK COLOR ON ' + i + ' ELEMENT' + plural}));
			}
			$('opt_ink').set('disabled', false);
		}
		if (data[id].corners) {
			for (i = 1; i <= data[id].corners; i++) {
				price = corners * i;
				if (i == 1) {
					plural = '';
				} else {
					plural = 'S';
				}
				$('opt_corners').grab(new Element('option', { value: price, text: 'ROUNDED CORNERS ON ' + i + ' ELEMENT' + plural}));
			}
			$('opt_corners').set('disabled', false);
		}
		if (data[id].twosided) {
			for (i = 1; i <= data[id].twosided; i++) {
				price = twosided * i;
				if (i == 1) {
					plural = '';
				} else {
					plural = 'S';
				}
				$('opt_twosided').grab(new Element('option', { value: price, text: '2-SIDED PRINTING ON ' + i + ' ELEMENT' + plural}));
			}
			$('opt_twosided').set('disabled', false);
		}
	}
}

function calculate_price() {
	var data = get_data();
	var id = get_item_id();
	var price = 0;
	var select = $('el_quantity').getNext('.current');
	if (!select) {
		select = $('el_quantity');
	}
	var target = parseInt(select.value);
	if (id) {
		if (data[id].price) {
			price = data[id].price;
			
			if (target > 75) {
				var quant = 100;
				while (quant <= target && quant <= 200) {
					switch (quant) {
						case 100:
							price += (price * .11);
							break;
						case 125:
							price += (price * .09);
							break;
						case 150:
							price += (price * .08);
							break;
						case 175:
							price += (price * .07);
							break;
						case 200:
							price += (price * .06);
							break;
					}
					quant += 25;
				}
				if (quant == 225 && quant <= target) {
					price += (data[id].price25 * ((target - 200)/25));
				}
			}
		} else if (data[id].flat) {
			price = data[id].flat;
		} else if (data[id].price25) {
			price = data[id].price25 * (target/25);
		} else if (data[id].peritem) {
			price = data[id].peritem * (target);
		}
		
		// Calculate the value of the options
		if ($('opt_ink').value) {
			price += parseInt($('opt_ink').value);
		}
		if ($('opt_corners').value) {
			price += parseInt($('opt_corners').value);
		}
		if ($('opt_twosided').value) {
			price += parseInt($('opt_twosided').value);
		}
	}	
	price = Math.round(price);
	$('item_total').set('text', price);
	var total = 0;
	$$('#cart .total').each(function(el) {
		total += parseInt(el.get('text'));
	});

	total += price;
	$('quote_total').set('text', total);
	$('email_total').set('value', total);
	if (total == 0) {
		$('email_link').hide();
	} else {
		$('email_link').show();
	}
}

// Universal tracking number for unique IDs
var items = 0;

function add_to_cart() {
	items++;
	var data = get_data();
	var id = get_item_id();
	var select = $('el_quantity').getNext('.current');
	if (!select) {
		select = $('el_quantity');
	}
	if (data[id]) {
		$('cart-list').grab(new Element('li', {
			id: 'item-' + items,
			html: '<a class="delete" href="#">remove</a>' +
				  '<span class="quantity">' + (data[id].flat ? '1' : select.value) + '</span>' +
				  '<span class="style">' + $('el_style').options[$('el_style').selectedIndex].text + '</span>' +
				  '<span class="name">' + data[id].name + '</span>' +
				  '<span class="options">' +
				      ($('opt_ink').get('value') ? '<span class="option">' + $('opt_ink').options[$('opt_ink').selectedIndex].text + '</span>' : '') +
				      ($('opt_corners').get('value') ? '<span class="option">' + $('opt_corners').options[$('opt_corners').selectedIndex].text + '</span>' : '') +
				      ($('opt_twosided').get('value') ? '<span class="option">' + $('opt_twosided').options[$('opt_twosided').selectedIndex].text + '</span>' : '') +
				  '</span>' +
				  '<span class="price">$<span class="total">' + $('item_total').get('text') + '</span></span>'
		}));
		$('email_form').grab(new Element('input', {
			name: 'items[]',
			id: 'item-' + items + '-input',
			type: 'hidden',
			value: '{' +
				'"quantity": "' + (data[id].flat ? '1' : select.value) + '",' +
				'"style": "' + $('el_style').options[$('el_style').selectedIndex].text + '",' +
				'"name": "' + data[id].name + '",' +
				'"opt_ink": "' + ($('opt_ink').get('value') ? $('opt_ink').options[$('opt_ink').selectedIndex].text : '') + '",' +
				'"opt_corners": "' + ($('opt_corners').get('value') ? $('opt_corners').options[$('opt_corners').selectedIndex].text : '') + '",' +
				'"opt_twosided": "' + ($('opt_twosided').get('value') ? $('opt_twosided').options[$('opt_twosided').selectedIndex].text : '') + '",' +
				'"price": "' + $('item_total').get('text') + '"' +
			'}'
		}));
		$$('#cart-list li:last-child .delete').addEvent('click', function(e) {
			e.stop();
			var parent = $(this).getParent('li');
			$(parent.get('id') + '-input').destroy();
			parent.destroy();
			calculate_price();
			$('cart').getElement('.scroll').scroller.update();
		});
		reset_form();
	}
}

function toggle_form(e) {
	e.stop();
	if ($('add-form').isDisplayed()) {
		$('add-form').dissolve();
		$('cart').reveal();
		$('content').getElement('.scrollarea').show();
		$('cart').getElement('.scroll').scroller.update();
		$('switch').getElement('span').set('text', 'Hide');
	} else {
		$('add-form').reveal();
		$('cart').dissolve();
		$('content').getElement('.scrollarea').hide();
		$('switch').getElement('span').set('text', 'Show');
	}
}
