Event.observe(window, 'load', function() {
	// do everything here

	var selects = document.getElementsByTagName("select");
	for (var i = 0; i < selects.length; i++) {
		var theSelect = selects[i];
		
		// focus handlers
		theSelect.onfocus = function() {
			showTooltip($(this));
		}
		
		// blur handlers
		theSelect.onblur = function() {
			hideTooltip($(this));
			validateField($(this));
		}
		
	}
	
	var inputs = document.getElementsByTagName("input");
	for (var i = 0; i < inputs.length; i++) {
		var theInput = inputs[i];
		if (theInput.type == "text") {


			// focus handers
			theInput.onfocus = function() {
				showTooltip($(this));
			}

			// blur handlers
			theInput.onblur = function() {
				hideTooltip($(this));
				validateField($(this));
				
				if ($(this).hasClassName("email")) {
					validateEmail($(this));
				}
				
			}

		}
	}


	var textareas = document.getElementsByTagName("textarea");
	for (var i = 0; i < textareas.length; i++) {
		var theTextarea = textareas[i];


		// focus handlers
		theTextarea.onfocus = function() {
			
		}
		
		// blur handlers
		theTextarea.onblur = function() {
			validateField($(this));
		}
	}

	// submit handlers
	document.groupform.onsubmit = function() {
		return validateForm('group_show', true);
	}
	
	document.seasonform.onsubmit = function() {
		var formsOkay = true;
		var r, s = false;
		if (validateForm('request_season', false)) {
			r = true;
			document.seasonform.wheelChairs.value = calculateWheelchairs("season_form");
		}
		if (validateForm('season_form', false)) {
			s = true;
		}
		
		if ((s != true) || (r != true)) {
			formsOkay = false;
		}
		if (formsOkay == false) {
			displayGlobalError($("request_tickets"));
		} else {
			hideGlobalError();
		}
		return formsOkay;
		
	}
	document.themeform.onsubmit = function() {
		document.themeform.wheelChairs.value = calculateWheelchairs("theme_form");
		return validateForm('theme_form', true);
	}


	// click handlers for cancel buttons
	setCancelButtons();
	
	// click handlers for date & ticket selects
	if ($("week")) {
		$("week").onchange = function() {
			chooseShowType();
			document.seasonform.weekEvent.value = $(this).value;
		}
	}
	
	if ($("day_1")) {
		$("day_1").onchange = function() {
			document.seasonform.prefferedWeekOne.value = $(this).value;
			updateSecondChoice("day_1", "day_2");
		}
	}

	if ($("day_2")) {
		$("day_2").onchange = function() {
			document.seasonform.prefferedWeekTwo.value = $(this).value;
		}
	}

	if ($("no_tix")) {
		$("no_tix").onchange = function() {
			document.seasonform.totalTickets.value = $(this).value;
			document.themeform.totalTickets.value = $(this).value;
			removeExtraGuests(this.selectedIndex, "season");
		}
	}
	
	if ($("theme_tix")) {
		$("theme_tix").onchange = function() {
			document.seasonform.totalTickets.value = $(this).value;
			document.themeform.totalTickets.value = $(this).value;
			removeExtraGuests(this.selectedIndex, "theme");
		}
	}
	
	// click handler for date show button
	if ($("submit_season")) {
		$("submit_season").onclick = function() {
			return chooseDatesShow();
		}
	}
	
	// click handlers for theme shows
	var links = document.getElementById("request_theme").getElementsByTagName("a");
	for (var i = 0; i < links.length; i++) {
		var theLink = links[i];
		if ($(theLink).hasClassName("select_theme")) {
			$(theLink).onclick = function() {
				var theShow = $(this).href.substring($(this).href.indexOf("#")+1);
				document.themeform.weekEvent.value = theShow;
				return chooseThemeShow(theShow);
			}
		}
	}
	
	// click handler for group form
	if ($("group_request")) {
		$("group_request").onclick = function() {
			return chooseGroups();
		}
	}
	
	// handlers for "other" options
	var cbs = document.getElementById("group_type_wrapper").getElementsByTagName("input");
	for (var i = 0; i < cbs.length; i++) {
		var cb = cbs[i];
		cb.onclick = function() {
			if ($("group_type_other").checked == true) {
				$("other_group").style.display = "block";
				$("other_group").addClassName("required");
				$("other_group").focus();
				$("other_group").onblur = function() {
					validateField($(this));
				}

			} else {
				$("other_group").style.display = "none";
				$("other_group").removeClassName("required");
				hideError($("other_group"));
			}
		}
	}
	
	// textarea countdowns
	var textareas = document.getElementsByTagName("textarea");
	for (var i = 0; i < textareas.length; i++) {
		if (textareas[i].getAttribute("maxlength")) {
			var ta = textareas[i];
			ta.onkeyup = function() {
				return false;
			}
			ta.onkeyup = function() {
				return textareaMax(this, this.getAttribute("maxlength"), this.getAttribute("id")+"_count");
			}
		}
	}
	
	if (confirmation == 'true') {
		document.getElementById('ticket_request').style.display='none';
	}
	
	
});


function calculateWheelchairs(f) {
	var inputs = $(f).getElementsByTagName("input");
	var w = 0;
	for (var i = 0; i < inputs.length; i++) {
		if (inputs[i].name == "requireswheelchair") {
			if (inputs[i].checked) {
				w++;
			}
		}
	}
	return w;
}


function showTooltip(el) {
	// go get el's tooltip out of the DOM
	var theTooltip = $(el).up(0).nextSiblings()[0];
	if (($(theTooltip)) && ($(theTooltip).hasClassName("reg_message"))) {
		// alert(theTooltip);
		theTooltip.style.display = "block";
	}
}

function hideTooltip(el) {
	// go get el's tooltip out of the DOM
	var theTooltip = $(el).up(0).nextSiblings()[0];
	if (($(theTooltip)) && ($(theTooltip).hasClassName("reg_message"))) {
		// alert(theTooltip);
		theTooltip.style.display = "none";
	}
}

function showError(el, type) {

	// insert new error
	if ($(el).nodeName == "TEXTAREA") {
		// textareas need a static, block-level error to push the box down.

		// remove existing error msg first, just in case it's already there
		if ($(el).previous('span.errorString')) { $(el).previous('span.errorString').remove(); }

		var theError = new Error({msgType: type, css: "display: block; position: static; margin: 5px 0;"})
		var e = new Insertion.Before($(el), theError.output);
	} else {
		// all other fields use the absolute positioned version.

		// remove existing error msg first, just in case it's already there
		if ($(el).next('span.errorString')) { $(el).next('span.errorString').remove(); }

		var theError = new Error({msgType: type});
		var e = new Insertion.After($(el), theError.output);
	}
	$(el).addClassName("error");
	
}

function hideError(el) {
	//  go get el's error out of the DOM
	if ($(el).nodeName == "TEXTAREA") {
		if ($(el).previous('span.errorString')) {
			$(el).previous('span.errorString').remove();
		}
	} else {
		if ($(el).next('span.errorString')) {
			$(el).next('span.errorString').remove();
		}
	}
	if ($(el).hasClassName("error")) $(el).removeClassName("error");
	
}


function validateField(el) {
	if ($(el).hasClassName("required")) {
		if ($(el).value == "") {
			showError($(el), "required");
			return false;
		} else {
			hideError($(el));
		}
	}
	
	return true;
}

function validateEmail(el) {
	if ($(el).value == "") {
		showError($(el), "required");
		return false;
	} else {
		var e = $(el).value;
		if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,6})+$/.test(e) == false) {
			showError($(el), "validEmail");
			return false;
		}
		
		if ($(el).hasClassName("emailmatch")) {
			var original = $(el).up(1).previous('div').down(1);
			if ($(el).value != $(original).value) {
				showError($(el), "emailMismatch");
				return false;
			}
		}
		
	}
	
	return true;
	
}


function validateForm(el, showGlobalError) {
	var inputs = $(el).getElementsByTagName("input");
	var textareas = $(el).getElementsByTagName("textarea");
	var selects = $(el).getElementsByTagName("select");
	var theField;
	var emails = Array();
	
	var isOkay = true;
	
	for (var i = 0; i < inputs.length; i++) {
		theField = inputs[i];
		if ($(theField).hasClassName("email")) {
			emails.push(theField);
		}
		if (!validateField(theField)) {
			isOkay = false;
		}
	}

	for (var i = 0; i < emails.length; i++) {
		theField = emails[i];
		if (!validateEmail(theField)) {
			isOkay = false;
		}
	}

	for (var i = 0; i < textareas.length; i++) {
		theField = textareas[i];
		if (!validateField(theField)) {
			isOkay = false;
		}
	}

	for (var i = 0; i < selects.length; i++) {
		theField = selects[i];
		if (!validateField(theField)) {
			isOkay = false;
		}
	}
	
	
	var radios = Array();
	for (var i = 0; i < inputs.length; i++) {
		theField = inputs[i];
		if (($(theField).hasClassName("required") && (theField.type == "radio"))) {
			radios.push(theField);
		}
	}
	
	var checked = false;
	for (var i = 0; i < radios.length; i++) {
		if (radios[i].checked) {
			checked = true;
			break;
		}
	}
	
	if (checked == false) {

		var theError = new Error({msgType: "required", css: "left: 425px;"})
		var e = new Insertion.Top($("group_type_wrapper"), theError.output);

	} else {

		if ($("group_type_wrapper").down('span.errorString')) {
			$("group_type_wrapper").down('span.errorString').remove();
		}

	}
	
	if (isOkay == false) {
		if (showGlobalError) {
			displayGlobalError($(el));
		}
		window.location.href = "#ticket_request";

	} else {
		if (showGlobalError) {
			hideGlobalError();
		}
	}
	
	return isOkay;
}


function displayGlobalError(el) {
	if (!$("errors")) {
		var error = '<div id="errors" class="errorMsg">Oops, you forgot to fill in required info. Please complete the field(s) noted below.</div>';
		var ins = $("tickets_header").next();
		var e = new Insertion.Top($(el), error);
	}
}

function hideGlobalError() {
	if ($("errors")) {
		$("errors").remove();
	}
}


function Error(args) {
	if (typeof(args.classname) == 'undefined') {
		this.classname = 'errorString';
	}
	if (typeof(args.msgType) == 'undefined') {
		this.msgType = 'required';
	}
	if (typeof(args.css) == 'undefined') {
		this.css = '';
	}

	switch(args.msgType) {
		case "required":
			this.message = "Oops, you forgot to fill this in and it's required.";
			break;
		case "validEmail":
			this.message = "Oops, you need to enter a valid email address.";
			break;
		case "emailMismatch":
			this.message = "Oops, the email addresses you entered do not match. Try again.";
			break;
	}

	this.msgStart = '<span class="errorString" style="'+args.css+'">';
	this.msgEnd = '</span>';
	this.output = this.msgStart+this.message+this.msgEnd;
}





function setCancelButtons() {
	var c = document.getElementsByName("Cancel");
	for (var i = 0; i < c.length; i++) {
		c[i].onclick = function() {
			window.location.href = "/get-tickets";
			return false;
		}
	}
}


function chooseShowType() {
	var selShowType = $("week").value;
	if (selShowType.indexOf("Week of") != -1) {
		// user is choosing a week-of show
		// display day selects
		$("day1_row").style.display = "block";
		$("day2_row").style.display = "block";

	} else {
		$("day1_row").style.display = "none";
		$("day2_row").style.display = "none";
	}
	
}


function updateSecondChoice(origEl, newEl) {
	var o = document.getElementById(origEl);
	var n = document.getElementById(newEl);
	var theOption = o.selectedIndex;

	for (var i = 1; i < o.options.length; i++) {
		n.options[i] = new Option(o.options[i].text, o.options[i].value);
	}
	
	if ((theOption > 1) && (theOption < n.options.length)) {
		n.options[theOption] = null;
		n.disabled = false;
	} else if (theOption == 1) {
		n.options.selectedIndex = 1;
		n.disabled = true;
	}
	
	// if (theOption == o.options.length-1) {
	// 	n.options.selectedIndex = n.options.length-1;
	// 	n.disabled = true;
	// } else {
	// 	n.disabled = false;
	// }
}

function chooseDatesShow() {
	
	$("request_season").getElementsByTagName("h2")[0].innerHTML = "Your Ticket Request";
	
	document.getElementById("season_form").style.display = "block";
	document.getElementById("request_theme").style.display = "none";
	document.getElementById("submit_season").style.display = "none";
	removeExtraGuests($('no_tix').selectedIndex, "season");
	window.scrollTo(0,0);

	return false;
}

function removeExtraGuests(n, show) {
	
	if (show == "season") { wrapper = "schedule_attendee_info"; }
	if (show == "theme") { wrapper = "theme_attendee_info"; }
	
	var divs = document.getElementById(wrapper).getElementsByTagName("div");
	var guests = Array();
	// get all guest divs
	for (var i = 0; i < divs.length; i++) {
		var theDiv = divs[i];
		if ($(theDiv).hasClassName("guest")) {
			guests.push(divs[i]);
		}
	}
	
	// show all guest divs
	for (var i = 0; i < guests.length; i++) {
		guests[i].style.display = "block";
	}
	// hide whichever guest divs we don't need now
	if (n < guests.length) {
		for (var i = n; i < guests.length; i++) {
			guests[i].style.display = "none";
		}
	}
	
	if (n == 0) {
		document.getElementById(wrapper).getElementsByTagName("legend")[0].innerHTML = "About You";
	} else {
		document.getElementById(wrapper).getElementsByTagName("legend")[0].innerHTML = "About You and Your Guests";
	}
	
}

function chooseThemeShow(theShow) {

	var divs = document.getElementById("request_theme").getElementsByTagName("div");
	for (var i = 0; i < divs.length; i++) {
		
		var theDiv = divs[i];
		if ($(theDiv).hasClassName("themeshow")) {
			theDiv.style.display = "none";
		}
		$(theShow).style.display = "block";
	}
	
	// var spans = $(theShow).getElementsByTagName("div");
	// console.log(theShow+": "+spans.length);
	
	$(theShow).getElementsByClassName("request_this")[0].style.display = "none";
	$(theShow).getElementsByClassName("request_other")[0].style.display = "block";
	
	// for (var i = 0; i < spans.length; i++) {
	// 	if (spans[i].getAttribute("class") == "request_this") { spans[i].style.display = "none"; }
	// 	if (spans[i].getAttribute("class") == "request_other") { spans[i].style.display = "block"; }
	// }
	
	document.getElementById("request_theme").getElementsByTagName("h2")[0].style.display = "none";
	
	document.getElementById("request_season").style.display = "none";
	document.getElementById("theme_form").style.display = "block";
	removeExtraGuests($('theme_tix').selectedIndex, "theme");
	window.scrollTo(0,0);
	return false;
}

function chooseGroups() {
	
	document.getElementById("tickets_header").getElementsByTagName("p")[1].style.display = "none";
	document.getElementById("request_tickets").style.display = "none";
	document.getElementById("group_show").style.display = "block";
	window.scrollTo(0,0);
	return false;
}

function textareaMax(el, max, remain){

	var char_remain = (max - $(el).value.length);
	if (char_remain <= 0) char_remain = 0;
	
	var str_char_remain = char_remain.toString();
	if (str_char_remain > 999) {
		var th = str_char_remain.substr(0, 1)
		var hu = str_char_remain.substr(1);
		str_char_remain = th+","+hu;
	}
	$(remain).update(str_char_remain);

	if ($(el).value.length > max) {
		$(el).value = $(el).value.substring(0, max);
	}

}

