(function() {
	window.$break = '!@#$';

	window.$ = function(id) {
		if (typeof id == 'string') {
			id = document.getElementById(id);

			if (id) {
				id.observe = function(event, callback) {
					if (this.addEventListener) {
						this.addEventListener(event, callback, false);
					} else {
						this.attachEvent('on' + event, callback);
					}

					return this;
				};
			}

			return id;
		}

		if (typeof id == 'array' || id.length) {
			id.each = function(callback) {
				for (var x = 0; x < this.length; ++x) {
					try {
						callback(this[x], x);
					} catch (ex) {
						if (ex == $break) {
							break;
						}
						throw ex;
					}
				}
				return this;
			};

			id.filter = function(callback) {
				var result = [];
				for (var x = 0; x < this.length; ++x) {
					if (callback(this[x], x)) {
						result.push(this[x]);
					}
				}
				return $(result);
			};

			id.map = function(callback) {
				var result = [];
				for (var x = 0; x < this.length; ++x) {
					result.push(callback(this[x], x));
				}
				return $(result);
			};

			id.every = function(callback) {
				for (var x = 0; x < this.length; ++x) {
					if (!callback(this[x], x)) {
						return false;
					}
				}

				return true;
			};

			return id;
		}

		if (id.addEventListener || id.attachEvent) {
			id.observe = function(event, callback) {
				if (this.addEventListener) {
					this.addEventListener(event, callback, false);
				} else {
					this.attachEvent('on' + event, callback);
				}

				return this;
			};
		}

		return id;
	}

	window.$$ = function(klass) {
		var results = document.getElementsByTagName('*'),
			result = [],
			xx = results.length,
			x = 0,
			r = new RegExp('\\b' + klass + '\\b');

		for (; x < xx; ++x) {
			if (results[x].className && results[x].className.match(r)) {
				result.push(results[x]);
			}
		}

		return $(result);
	}

	$(window).observe('load', function() {
		var form = $('registration');

		$(form.elements).each(function(element) {
			$(element).observe('click', function() {
				update_total();
			});
		});

		var update_total = function() {
			var price = 0;

			//price += $('reg_type_1').checked ? 80 : ($('reg_type_2').checked ? 100 : 0);
			price += $('reg_type_1').checked ? 80 : 0;

			$([1, 2, 3, 4]).each(function(key) {
				//if (key < 4 && !$('reg_type_1').checked && !$('reg_type_2').checked) {
				if (key < 4 && !$('reg_type_1').checked) {
					return;
				}

				$($('activities_' + key).getElementsByTagName('input')).filter(function(input) {
					return input.type == 'checkbox'
				}).each(function(input) {
					if (input.checked) {
						var x = parseInt($(input.parentNode.parentNode.getElementsByTagName('span')).filter(function(span) {
							return span.className == 'price';
						})[0].innerHTML) || 0;
						if (key == 4 && $('reg_is_member').checked) {
							x *= 2;
						}
						price += x;
					}
				});
			});

			if ($('reg_pursuivant_fname').value.replace(/^\s+|\s+$/, '').length && $('reg_pursuivant_lname').value.replace(/^\s+|\s+$/, '').length) {
				price += 40;
			}

			price += $('reg_dinner').checked ? 30 : 0;

			$('reg_total').value = price.toFixed(2).replace(',', '.');
		};

		var set_checkboxes_disabled = function(state) {
			$([1, 2, 3]).each(function(key) {
				$($('activities_' + key).getElementsByTagName('input')).filter(function(input) {
					return input.type == 'checkbox' && input.className.indexOf('disabled') == -1;
				}).each(function(input) {
					input.disabled = state;
				});
			});
		};

		// before and after checkboxes - enable or disable event checkboxes on click
		$('reg_type_1').observe('click', function() {
			if ($('reg_type_1').checked) {
				//$('reg_type_2').checked = false;
				set_checkboxes_disabled(false);
			} 
			/*else if (!$('reg_type_2').checked) {
				set_checkboxes_disabled(true);
			}*/
		});
		/*$('reg_type_2').observe('click', function() {
			if ($('reg_type_2').checked) {
				$('reg_type_1').checked = false;
				set_checkboxes_disabled(false);
			} else if (!$('reg_type_1').checked) {
				set_checkboxes_disabled(true);
			}
		});*/

		// the parsuivant
		$(['reg_pursuivant_fname', 'reg_pursuivant_lname']).each(function(id) {
			$(id).observe('keyup', function() {
				update_total();
			});
		});

		// the 4 event days multuiple checkboxes
		$([1, 2, 3]).each(function(key) {
			$($('activities_' + key).getElementsByTagName('input')).filter(function(input) {
				return input.type == 'checkbox'
			}).each(function(input) {
				$(input).observe('click', (function(cb, ctx) { var result = function() { cb.call(ctx); }; return result; })(function() {
					if (this.checked) {
						var current = this;
						$(this.parentNode.parentNode.parentNode.getElementsByTagName('input')).filter(function(element) {
							return element.type == 'checkbox' && element != current && !element.disabled;
						}).each(function(element) {
							element.checked = false;
						});
					}
					update_total();
				}, input));
			});
		});

		$('reg_dinner').observe('click', function() {
			update_total();
		});

		$('reg_is_member').observe('click', function() {
			$(form.getElementsByTagName('span')).filter(function(span) {
				return span.className == 'currency';
			}).each(function(span) {
				if ($('reg_is_member').checked) {
					span.innerHTML = 'BGN';
				} else {
					span.innerHTML = 'EUR';
				}
			});
		});

		form.onsubmit = window.blah = function() {
			var elements = $$('required'),
				element = elements.shift();

			for (; element; element = elements.shift()) {
				if (!element.value || !element.value.replace(/^\s+$/ , '').length) {
					alert(_lang == 'bg'
							? 'Не сте попълнили всички задължителни полета'
							: 'You haven\'t filled all required fields');

					element.focus();
					return false;
				}
			}

			var dates = [
				'02.06.2010',
				'03.06.2010',
				'04.06.2010'
			];
			for (var x = 1; x < 4; ++x) {
				break;	// drop this validations at all - somebody may want only dinner for 110-130E :>
				//if (key < 4 && !$('reg_type_1').checked && !$('reg_type_2').checked) {
				if (key < 4 && !$('reg_type_1').checked) {
					continue;
				}

				var fieldset = $('activities_' + x),
					elements = $(fieldset.getElementsByTagName('input')).filter(function(element) { return element.type == 'checkbox'; }),
					error = elements.every(function(element) { return !element.checked; });

				if (error) {
					alert(_lang == 'bg'
							? 'Не сте посочили практически курс за дата ' + dates[x - 1]
							: 'You haven\'t selected practical course for date ' + dates[x - 1]);

					elements[0].focus();
					return false;
				}
			}

			// todo :: email and phone validations

			return true;
		};
	});
})();
