

// add domready event to disable fields if class is unpublished or in the past
// add globals as well
window.addEvent('domready',function() {

	parent.document.cart = $('adminForm');
	//parent.document.getElementById('sbox-btn-close').setAttribute('onclick','cart.submit();');
	parent.document.getElementById('sbox-btn-close').setAttribute('onclick',' validateForm(cart,"update");');

	//document.getElementById('complete_button').setAttribute('onclick','submitform("registration.update");');
	//document.getElementById('complete_button').setAttribute('onclick','parent.document.cart.submit();');

	// set tabs on initial event display
	// TODO: is there a better way to do this before rendering?
	
/*
	var tab = null;
	var tab_index = 0;
	if (tab = $('tab')) {
		if (tab.value == 'registration') {
			tab_index = 2;
		}  
		if (tab.value == 'pricing') {
			tab_index = 3;
		}  
		$('event').className = "closed";
		$(tab.value).className = "open";
		document.getElement('div[class=current]').getElements('dd')[tab_index].style.display = 'block';
		document.getElement('div[class=current]').getElements('dd')[0].style.display = 'none';
	}


	*/
	if (document.formvalidator) {
		document.formvalidator.setHandler('phone', function(value) {
			return /^[(]?[\d]{3}[)\- ]{0,2}[\d]{3}[\- ]?[\d]{4}$/.test(value);
		});
	}

	/* can't use Joomla validation for fields whose validation is dependant on other fields 
	document.formvalidator.setHandler('guests', function(value) {
		
		var seats_available = $('seats_available_' + selected_record_id).innerHTML;
		return (parseInt(seats_available) < value) ? false : true;
	});
	*/

	// can't validate price the same because formvalidator requires tab out -
	// need to change values on change price
	/*
	document.formvalidator.setHandler('price', function(value) {
		alert(value);
	});
	*/

	// domready workarounds for missing plugins
	// seats available column on event overview
	// 1/7/10 adding num registered column
	// TODO: display num registered on cart, too?

	var event_list_table = document.getElement('table[class^=adminlist]');
	if (event_list_table) {
		var headers = event_list_table.getElement('tbody').getElement('tr').getElements('th');
		var seats_available_th = document.createElement('th');
		var registered_th = document.createElement('th');
		seats_available_th.appendChild(document.createTextNode('Seats Available'));
		headers[2].parentNode.insertBefore(seats_available_th,headers[2]); 
		registered_th.appendChild(document.createTextNode('Registered'));
		headers[2].parentNode.insertBefore(registered_th,headers[2]); 
	
		var rows = document.getElements('tr[class^=row]');

	
		rows.each(function(row,index) {
	
			var cols = row.getElements('td');	
			var seats_available_td = document.createElement('td');
			var registered_td = document.createElement('td');
			seats_available_td.setAttribute('class','center');
			registered_td.setAttribute('class','center');
	
			var ev_id = row.getElement('td').getElement('input').value;
	
			// get seats available from JSON global
			var num_seats_available;
			var num_registered;
			if (typeof events[ev_id] != 'undefined') {
				num_seats_available = events[ev_id]['seats_available'];
				num_registered = events[ev_id]['registered'];
			}
	
			if (parseInt(num_seats_available)) {
				seats_available_td.appendChild(document.createTextNode(num_seats_available));
				registered_td.appendChild(document.createTextNode(num_registered));
			} else if (parseInt(num_seats_available) == 0) {
				seats_available_td.appendChild(document.createTextNode('Full'));
				registered_td.appendChild(document.createTextNode(num_registered));
			} else {
				seats_available_td.appendChild(document.createTextNode('N/A'));
				registered_td.appendChild(document.createTextNode('N/A'));
			}
	
			cols[2].parentNode.insertBefore(seats_available_td,cols[2]); 
			cols[2].parentNode.insertBefore(registered_td,cols[2]); 
	
	
		});
	}


	


    waiting_to_be_contacted = $('num_waiting_to_be_contacted').value;
    is_supervisor = $('is_supervisor').value;
    prev_waiting_to_be_contacted = waiting_to_be_contacted;

    if (!$('is_published').value || $('event_start_time').value < new Date().getTime() / 1000) {


        $('registration_controls').getElements('input').each(function(el,index) {
            
            if (el.name != 'refund') {
                el.disabled = true;
            }

	});


 	$('registrations').getElements('input').each(function(el,index) {
            
            if (el.type != 'checkbox') {            
                el.disabled = true;
            }

	});

 	$('registrations').getElements('select').each(function(el,index) {
            
            el.disabled = true;

	});

 	$('waitinglist').getElements('input').each(function(el,index) {
            
                el.disabled = true;

	});

 	$('waitinglist').getElements('select').each(function(el,index) {
            
            el.disabled = true;

	});

    }

});


function validateRefundable(action) {

	var reg_input;
	var reg_status;
	var valid = true;

	$$('.cancellation').each(function(row,index) {

		reg_input = row.getElement('td').getElement('input');

		if (reg_input.checked) {

			reg_status = row.getElement('td.status').innerHTML;

			if (reg_status != 'refund pending') {
				valid = false;
			}
		}



	});

	// allow supervisor override
	if (is_supervisor) {
		valid = true;
	}

	// invalid if waiting list records checked
	$$('.waitinglist').each(function(row,index) {

		reg_input = row.getElement('td').getElement('input');

		if (reg_input.checked) {

			valid = false;
		}

	});

	// invalid if registration records checked and not cancel action (and not staff)
	var is_staff = false;
	if (action != 'cancel') {
		$$('tr.registration').each(function(row,index) {
	
			reg_input = row.getElement('td').getElement('input');

			if (reg_input.checked) {

				reg_status = row.getElement('td.status').innerHTML;

				// staff registrations can be refunded
				is_staff = row.getElement('td[name^=staff]') ? true : false;

				if (reg_status != 'refund pending' && !is_staff) {
					valid = false;
				}
	
			}
	
		});
	}

	// set post var is_staff so server doesn't set status = cancelled
	$('is_staff').value = is_staff ? 1 : 0;
        // HACK: set is_staff if class cancelled, as well! (so refunded 
        // registrees are not moved to cancelled)
	//$('is_staff').value =  $('is_published').value ? 1 : 0;

	return valid;
}


function validateForm(form,task) {

	// TODO: complete custom validator instead of mixing with Joomla's?
	
	var registration_valid = true;
	/*
	form.getElements('[class*=not-valid]').each(function(e,index) {
			registration_valid = false;
	});
	*/

	form.getElements('[class^=record]').each(function(record,index) {
		registration_valid = validateRegistration(record);
	});

	//alert(registration_valid);

	var customer_valid = document.formvalidator.isValid(form)


	// submit updates even if customer info is invalid
	// case: user should be able to add events to list and validate
	// guests/prices but not be required to enter customer info until checkout
	if (task == 'update' && registration_valid) {
		form.submit();
		return true;
	} 
	
	if (task == 'checkout' && customer_valid && registration_valid) {
		submitform('registration.checkout');
		//update cart caption
		parent.document.getElementById('cart_add').innerHTML = parent.document.getElementById('cart_add').innerHTML.replace(/\d+ events in cart/,'Add to cart'); 
		return true;
	}
	
	if (task == 'checkout' && (!customer_valid || !registration_valid) ) {
		alert('Please enter valid information in the indicated fields.');
	}

	return false;

}

function setRefund(refund_status) {

	// TODO: refactor - overcomplicated/ confusing

	if (!validateRefundable(refund_status)) {
		alert('One or more records are not refundable.');
		return false;
	} 

	// don't show refund messages if only free records selected
	var reg_input;
	var reg_payment;
        var are_free = true;
	$$('tr.registration').each(function(row,index) {

		reg_input = row.getElement('td').getElement('input');

		if (reg_input.checked) {

			reg_payment = row.getElement('td.payment').getElement('select').value;

			if (reg_payment != 'Free') {
				are_free = false;
			}
		}



	});


	// TODO: refactor! complicated!
	
	if (refund_status == 'cancel' && !are_free) {
		if (!validateCancellationCutoff()) {
			//return false;
			$('refund').value = 0;
		}
	}

	$each($$('.registration'),function(record_checkbox,index) {

		if (record_checkbox.checked) {

			var name = record_checkbox.name.replace('reg_id','refunded');				
			var refunded_input = document.getElementsByName(name).item(0);
			refunded_input.value = 1;
		}
	});

}

function validateCancellationCutoff() {

	// warn no refund if < 48 hrs (unless status = refund pending)
	
	var cur_time = new Date().getTime() / 1000;
	var fourtyeighthours_seconds = 48 * 60 * 60;
	var event_refund_cutoff_time = $('event_start_time').value - fourtyeighthours_seconds;


	if (cur_time > event_refund_cutoff_time) {
		$('lessthan48hrs').value = 1;
		alert('It is less than 48 hours before the event.  A refund cannot be issued.');
		return 'no refund < 48hrs';
	} else {
		$('lessthan48hrs').value = 0;
		if (!confirm("Click 'OK' if the customer has been refunded, or 'Cancel' to issue the refund later.")) {
			return false;
		}
			
	}

	return true;

}

// TODO: this is probably not the Joomla way to implement an AJAX call to a component controller

function updateTotal(e) {
	var reg_id = e.id.split(/_/)[1];
	var guests = $('guests_'+reg_id).value;
	if ($('price_'+reg_id).tagName == 'SELECT') {
		var price = $('price_'+reg_id).value.split(/,/)[1];
		var total = guests * price;
		$('total_'+reg_id).innerHTML = '$' + total.toFixed(2);
	} else {
		var price = $('price_'+reg_id).innerHTML.match(/\$(\d?\d\.\d\d)/)[1];
		var total = guests * price;
		$('total_'+reg_id).innerHTML = '$' + total.toFixed(2);
	}

	if (price == 0) {
		$('payment_0').options[0].text = 'Free';
		$('payment_0').disabled = 'disabled';
	} else {
		$('payment_0').options[0].text = 'Cash';
		$('payment_0').disabled = '';
	}

}

function delayedSelect() {
	cur_el.select();
}

function validateNewRecord(e) {

	if (validateNamePhoneEmailInitials() && validateNumGuests(e)) {
		return true;
	} else {
		return false;
	}

}

///////////////////////// config/ pricing js ////////////////////////////

function setAmountDisabled() {

	$('amount').disabled = ($('base_price').value && $('base_price').value != 'Self') ? true : false;
}

///////////////////////// cart js ///////////////////////////////////////

			window.onload = function() {

				if ($('cpanel')) {
					// post-rendering work-arounds for missing plugins
	
					//cpanel registration config button
	    				var icon_div = document.createElement("div");
					icon_div.setAttribute("class","icon");
					var icon_a = document.createElement("a");
					icon_a.setAttribute("href","index.php?option=com_jevents&task=registration.config");
					var icon_img = document.createElement("img");
					icon_img.setAttribute("src","/plugins/jevents/images/checkbox.png");
					var icon_span = document.createElement("span");
					var icon_text = document.createTextNode("Registration");
	
					icon_div.appendChild(icon_a);
					icon_a.appendChild(icon_img);
					icon_span.appendChild(icon_text);
					icon_a.appendChild(icon_span);
					
					$("cpanel").appendChild(icon_div);
				}

			}

			function addToCart(a) {

				var checkbox;

				// get checked event titles and ids

				var rows = $$(".adminlist").getElements("tr");

				// TODO: is this the right way to access mootools element arrays?
				// (access array object as first index then loop?)
				// TODO: why cant I get the right length with array.length?
				// should I used sessions or cookies to store the cart?	
				var ev_ids = new Array();
				rows[0].each(function(row,index) {

					if (row.getElement("td")) {

						checkbox = row.getElement("td").getElement("input");

						if (checkbox && checkbox.checked) {
							
							ev_ids.push(checkbox.value);
						}
					}
				});
				
	
				// clean un-published and passed events and alert user
				var ev_ids = cleanEvents(ev_ids);

				var ev_ids_get_str = ev_ids.length ? '&ev_id[]=' + ev_ids.join('&ev_id[]=') : ''; 

				/* don't store event data in cookie - not best practice and 
				 * annoying to parse/update - use cookie session id + ajax db updates
				// append event id string to cookie (if exists)
				var prev_ev_ids = "";
				var match;
				if (match = document.cookie.match(/ev_ids=([^;]+);/)) { 
					prev_ev_ids = match[1];
				}

				var str_ev_ids = '';

				// clean existing ev_ids
				for (var i=0; i<ev_ids.length; ++i) {
					if (prev_ev_ids.test(ev_ids[i])) {
						ev_ids.splice(i);
					}
				}

				// append cookie if any ev_ids (after cleaning) and not already added
				if (ev_ids.length) {

					if (prev_ev_ids) {
						str_ev_ids += prev_ev_ids + "-" + ev_ids.join('-');
					} else {
						str_ev_ids += ev_ids.join('-');
					}
				

					document.cookie = "ev_ids=" + str_ev_ids;

					// get number of unique events
					ev_ids = str_ev_ids.split("-");
	
					var unique_ev_ids = new Array();
					ev_ids.each( function(item,index) {
	
						if (!unique_ev_ids.contains(item)) {
							unique_ev_ids.push(item);
						}
					});
	
	
					// increment cart event count
					document.cookie = "num_events=" + unique_ev_ids.length; 
	
					// update caption
					var caption = "" + unique_ev_ids.length + " events in cart";
					a.innerHTML = a.innerHTML.replace(/[^"]Add to cart/,caption);
					a.innerHTML = a.innerHTML.replace(/\d+ events in cart/,caption);
				}
				*/

				//submitform('registration.update');
				//TODO: use AJAX instead (submit causes wait/ messes up iframe display on quick view)
			//		'components/com_jevents/controllers/registration.php?format=raw&function=addToCart'

				//if (ev_ids.length > 0) {
				function show(result) {
						// update caption
						var caption = "" + result + " events in cart";
						a.innerHTML = a.innerHTML.replace(/[^"]Add to cart/,caption);
						a.innerHTML = a.innerHTML.replace(/\d+ events in cart/,caption);
						//alert('get here' + result);
				}

				if (ev_ids.length) {
					var add_to_cart_request = new Ajax(
						'index.php?option=com_jevents&task=registration.addToCart&format=raw'
						+ ev_ids_get_str,
						{method: 'get',
						onComplete: show}
					).request();
	
				}
			}

			function emptyCart() {
			
				// update caption
				$("cart_add").innerHTML = $("cart_add").innerHTML.replace(/\d+ events in cart/,"Add to cart");

				var empty_cart_request = new Ajax(
					'index.php?option=com_jevents&task=registration.emptyCart&format=raw',
					{method: 'get',
					onComplete: show}
				).request();

				function show(result) {
					//alert('get here' + result);
				}
	
				//submitform('registration.emptyCart');
			}

			function cleanEvents(ev_ids) {

				var msg = 'The following events have been cancelled or occur in the past, \n';
				    msg +='so they will not been added to the cart:\n\n'; 
				var events_not_added = '';	

				var cur_time = new Date().getTime() / 1000;

				// check events again JSON array for date start and published status

				var ev_id;
				var ev_ids_cleaned = new Array();
				for (var i=0; i<ev_ids.length; ++i) {
					
					ev_id = ev_ids[i];


					if (!parseInt(events[ev_id]['published']) || events[ev_id]['dtstart'] < cur_time) {
						events_not_added += ' - ' + events[ev_id]['summary'] + '\n';
					} else {
						ev_ids_cleaned.push(ev_ids[i]);
					}
				}

				if (events_not_added) {
					msg += events_not_added;
					alert(msg); 
				}

				return ev_ids_cleaned; 

			}

//////////////////////// end cart ////////////////////////////////////////

////////// 12/4/09 refactoring /////////////////////////////////////////////////////




function removeCartItem() {

	var id = selected_record_id.toString();
	var row = $('record_'+id);


	//TODO: refactor - too liberal - might mess up other cookies
	row.getParent().removeChild(row);

	// remove not-valid class if previously invalid (so form will submit)
	/*
	$('guests_' + selected_record_id.toString()).className = $('guests_' + selected_record_id.toString()).className.replace(/not-valid/,'');
	$('price_' + selected_record_id.toString()).className = $('price_' + selected_record_id.toString()).className.replace(/not-valid/,'');
	*/
/*
	var ev_id_regex = new RegExp('[-]' + selected_record_id);
	document.cookie = document.cookie.replace(ev_id_regex,'');
	var ev_id_regex = new RegExp(selected_record_id + '[-]?');
	document.cookie = document.cookie.replace(ev_id_regex,'');
	var num_events = '';
	var match;
	if (match = document.cookie.match(/num_events=(\d+)/)) { 
		num_events = parseInt(match[1]);
	}
	--num_events;
	document.cookie = 'num_events=' + num_events;
	// update caption
	//$("cart_add").innerHTML = $("cart_add").innerHTML.replace(/\d+ events in cart/,num_events + ' events in cart');
	*/

	var num_events = $$('.record').length;

	parent.document.getElementById('cart_add').innerHTML = parent.document.getElementById('cart_add').innerHTML.replace(/\d+ events in cart/,num_events + ' events in cart'); 

	disabled = num_events ? 0 : 1;
}


// TODO: use mouseover selected record id instead of field ids?
function validateRegistration(e) {

	var ev_id = e.id.split("_")[1];
	var valid = true;

	// validate price limit and number of guests
	// TODO: separate
	valid = validatePriceLimit(e);
	if (valid) {
		updateItemTotal(e);
	} 

	// invalid if no price selected
	valid = $('price_'+ev_id).value ? valid : false; 

	return valid;
}

function updateItemTotal(e) {

	// TODO: make less redundant - these values are already set during validate
	var cart = parent.document.cart;
	var ev_id = e.id.split("_")[1];
	var price = cart.getElement('select[id=price_' + ev_id + ']');
	var price_id = price.value; 
	var num_guests = parseInt(cart.getElement('input[id=guests_' + ev_id + ']').value);

	var price_amount = price.getElement('option[value=' + price_id + ']').getAttribute('amount');
	var total = num_guests * price_amount; 

	var subtotal = cart.getElement('td[id=total_' + ev_id + ']');
	var prev_subtotal = parseFloat(subtotal.innerHTML.replace(/\$/,''));

	// don't update waiting list subtotals
	
	if (subtotal.innerHTML != 'N/A') {
		// update item total
		subtotal.innerHTML = '$' + total.toFixed(2); 
	
		// update cart total
		var cart_total = cart.getElement('div[id=cart_total]');
		var prev_total = parseFloat(cart_total.innerHTML.replace(/\$/,''));
		cart_total.innerHTML = '$' + (prev_total - prev_subtotal + total).toFixed(2); 
	}

}

function validatePriceLimit(e) {

	// validating from iframe close vs validating from iframe complete button
	// have different dom contexts
	var cart = parent.document.cart;
	var valid = true;
	var ev_id = e.id.split("_")[1];

	// iframes suck
	var price = cart.getElement('select[id=price_' + ev_id + ']');
	var guests = cart.getElement('input[id=guests_' + ev_id + ']');
	var seats_available = cart.getElement('td[id=seats_available_' + ev_id + ']').innerHTML;

	var price_id = price.value;
	var num_guests = guests.value;

	// require price selection if record level validation (i.e. checkout)
	if (e.id.split('_')[0] == 'record' && (!price_id || !guests)) {
		valid = false;
	}


	// checks limit agains JSON array global
	//var parent_price_limit = price_id ? parseInt(prices[price_id]["parent_price_limit"]) : null;
	// have to send JSON to parent document in order to access after iframe close
	// using custom option attributes instead
	// TODO: don't send JSON array
	
	var parent_price_limit = price_id ? parseInt(price.getElement('option[value=' + price_id + ']').getAttribute('parent_price_limit')) : null;
	if (parent_price_limit) {

		//var num_avail =  parent_price_limit - prices[price_id]["num_registered"];	
		var num_avail =  parent_price_limit - parseInt(price.getElement('option[value=' + price_id + ']').getAttribute('num_registered'));	
		//alert('num guests: ' + num_guests + ' num_avail ' + num_avail + ' ev id is: ' + ev_id + 'price id is: ' + price_id);
	
		if (num_guests > num_avail) {
			alert("Number of guests exceeds the limit for this price option.");
			valid = false;	
		}
	}

	if (num_guests > parseInt(seats_available)) {
		alert("Number of guests exceeds available seats.");
		valid = false;	
	}

	var price_class = price.getAttribute('class')
	var guests_class = guests.getAttribute('class')

	// always valid if waiting list record
	/*
	var seats_available_span = price.getParent().getParent().getElement('span[class=seats_available]');
	if (seats_available_span) {
		valid = (seats_available_span.innerHTML == 'waiting list') ? true : valid;
	}
	*/

	if (!valid) {
		price.setAttribute('class',price_class + ' not-valid ');	
		guests.setAttribute('class',guests_class + ' not-valid ');	
	} else {
		price_class = price_class.replace(/not-valid/,'');
		guests_class = guests_class.replace(/not-valid/,'');
		price.setAttribute('class',price_class);	
		guests.setAttribute('class',guests_class);	
	}
	
		

	return valid;

}

/////// end refactoring ////////////////////////////////////




// TODO: collapse validation methods into one - or use mootools builtin validation
function validate(e) {

	var e_name = e.name.replace(/\[.+$/,'');
	cur_el = e;

	switch (e_name) {
	case 'last_name':
		return validateLastName();
	case 'first_name':
		return validateFirstName();
	case 'phone':
		return validatePhone();
	case 'email':
		return validateEmail();
	}
}

function validateRequired(msg) {

	if (!cur_el.value) {
		alert(msg);

		// JS bug - wont select without delay
		setTimeout(delayedSelect,0);
		
		return false;
	} else {
		return true;
	}

}

function displayErrors(errors) {

	if (errors) {
		alert(errors);

		// JS bug - wont select without delay
		setTimeout(delayedSelect,0);

		return false;
	} else {
		updateRegistration(cur_el);
		return true;
	}
}


function validateLastName() {

	if (!validateRequired('Please enter a last name.')) {
		return false;
	} else {
		updateRegistration(cur_el);
		return true;
	}

}

function validateFirstName() {

	if (!validateRequired('Please enter a first name.')) {
		return false;
	} else {
		updateRegistration(cur_el);
		return true;
	}

}

function validatePhone() {
	
	var errors = '';
	if (!validateRequired('Please enter a phone number.')) {
		return false;
	} else if (cur_el.value) {
		errors += /^[(]?[\d]{3}[)\- ]{0,2}[\d]{3}[\- ]?[\d]{4}$/.test(cur_el.value) ? '' : 'Please enter a valid 10 digit phone number.  For example 916-123-4567. \n';
	}
	
	return displayErrors(errors);
}

function validateEmail() {

	var errors = '';
	if (cur_el.value) {
		errors +=  /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(cur_el.value) ? '' : 'Please enter a valid email address.  For example fred@domain.com'
	}

	return displayErrors(errors);

}



function validateNamePhoneEmailInitials(list) {

	if (!validatePriceOptionLimit(list)) {
		return false;
	}

	var last_name = $('last_name').value;
	var first_name = $('first_name').value;
	var phone = $('phone').value;
	var email = $('email').value;
	var initials = $('initials').value;

	var errors = '';

	// required fields
	errors += last_name == '' ? ' - last name required \n' : '';
	errors += first_name == '' ? ' - first name required \n' : '';
	errors += phone == '' ? ' - phone number required \n' : '';
	errors += initials == '' ? ' - please enter your initials \n' : '';

	// validate phone and email formats
	if (phone) {
		errors += /^[(]?[\d]{3}[)\- ]{0,2}[\d]{3}[\- ]?[\d]{4}$/.test(phone) ? '' : ' - please enter a valid 10 digit phone number.  For example 916-123-4567. \n';
	}
	if (email) {
		errors +=  /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(email) ? '' : ' - please enter a valid email address.  For example fred@domain.com'
	}


	if (errors) {
		var msg = 'Please correct the following: \n\n' + errors;
		alert(msg);
		return false;
	} else {
		return true;
	}

}


function validatePriceOptionLimit(e) {

	// TODO: clean up, make more readable
	var list = 'registered';

	// handle add to waiting list
	if (typeof e == 'undefined') {
		e = $('guests_0'); 
	}

	if (e == 'waiting') {
		list = 'waiting';
		e = $('guests_0'); 
	}

	// handle waiting list promotion validation
	// TODO: deal with case = multiple waiting list promotions
	if (e == 'waiting_list_promotion') {
		e = $(document.body).getElements('input.checkbox')[0]; 
		list = 'both';
	}


	// add new record guests to total (or 0 for existing records)
	var total = (e.id == 'guests_0') ? parseInt($('guests_0').value) : 0;


	// get current record price option name and limit
	var record = e.getParent().getParent();
	var price = record.getElement('td[class^=price]');
	var parent_id = parseInt(price.className.split('_')[1]);
	var price_limit = parseInt(price.className.split('_')[2]);
	var price_name;


	// case = new record (select box)
	// find current selection/ class
	
	if (price.getElement('select')) {

		price = price.getElement('select');

		var select_options = price.options;
		var i = select_options.selectedIndex;
		parent_id = parseInt(select_options[i].className.split('_')[1]);
		price_limit = parseInt(select_options[i].className.split('_')[2]);
		price_name = select_options[i].getAttribute('title');

		//alert('parent id:' + parent_id + ' price limit: ' + price_limit +  'class: ' + price.className);
		// return if no limit for selected option
		/*
		if (isNaN(price_limit)) { 
			return true;
		}
		*/
		if (price_limit == 0) { 
			return true;
		}


	} else {
		price_name = price.getAttribute('name').replace(/\[.+/,'');
	}

		
	// get record status and records from registered or waiting list (to find current limit total)
	var record_status = record.getElement('.status').innerHTML;
	var records;


	//console.log('record status ' +  record_status + ' list: ' + list);

	if (record_status == 'registered') {
		records = $$('tr.registration');
	// new record to waiting list or registered
	} else if (!record_status && list == 'waiting') { 	
		total = parseInt($('guests_0').value);
		records = $$('tr.waitinglist');
	} else if (!record_status && list == 'registered') { 	
		total = parseInt($('guests_0').value);
		records = $$('tr.registration');
	} else if (list == 'both') {
		records = $$('tr.waitinglist,tr.registration');
	} else {
		records = $$('tr.waitinglist');
	}

	
	// calculate current total for limited price option


	
	records.each(function(row,index) {

		var row_price = row.getElement('td[class^=price]');
		var row_price_name = row_price.getAttribute('name').replace(/\[.+/,'');
		var row_parent_id = parseInt(row_price.className.split('_')[1]);


		if (parent_id == row_parent_id) {
			total += parseInt(row.getElement('.guests').getElement('input').value);
		}

		//console.log('new record parent id: ' + parent_id + ' row parent id: ' + row_parent_id + ' total: ' + total);
	
	});


	//console.log(' total: ' + total + 'price limit: ' + price_limit);
	//return false;

	if (price_limit && total > price_limit) {


		alert('Please reduce the number of guests or choose a different price option.  The class limit for this price option is: ' + price_limit);

		cur_el = e;
		// JS bug - wont select without delay
		setTimeout(delayedSelect,0);

		return false;
	} else {
		return true;
	}
		
}


function validateNumGuests(e) {


	var seats_available = parseInt($('num_available').innerHTML);
	var valid = true;


	if (!validatePriceOptionLimit(e)) {
		return false;
	}

	// handle waiting list promotion validation
	if (e == 'waiting_list_promotion') {
		var records = $(document.body).getElements('input.checkbox'); 
		// add total guests marked for promotion
		var total_guests = 0;
		for (var i=0; i<records.length;++i) {
			if (records[i].checked == true) {
				var reg_id = records[i].name.match(/\[(\d+)\]/)[1];
		       		total_guests += parseInt($('guests_'+reg_id).value);	
			}
		} 

		if (seats_available < total_guests) {
			alert('Number of guests exceeds event capacity.');
			valid = false;
		}

	} else {
	// handle everything else

		//console.log('get here');

		var capacity = parseInt($('capacity').innerHTML);
		var guests = parseInt(e.value);

		// set cur_num_guests to 1 if field has not been focused
		/*
		if (typeof cur_num_guests == 'undefined') {
			cur_num_guests = 1;
		}
		*/
	
		if (guests < 1 || isNaN(guests)) {
			alert('Please enter a valid number.  There must be at least one guest per registration.');
			e.value = cur_num_guests;
			valid = false;
		}
	
		// only validate registrations (not waiting list) against capacity
		if (typeof e.waitinglist == 'undefined') {	
			// account for record entry guest count
			var new_record_seats = (e.id == 'guests_0') ? cur_num_guests : 0;
			if ( (seats_available - new_record_seats) < (guests - cur_num_guests)) {
				alert('Number of guests exceeds event capacity.');
				e.value = cur_num_guests;
				//alert('value is: ' + e.value + 'curr guests is: '  + cur_num_guests);
				valid = false;
			}
		}

		// only allow whole numbers
		if (!/^\d+$/.test(e.value)) {
			alert('Please enter whole numbers only.');
			e.value = cur_num_guests;
			valid = false;
		}

	
		cur_el = e;
		// JS bug - wont select without delay
		//setTimeout(delayedSelect,0);
	}

	return valid;

}

function onFocusGuests(e) {
	// wow - dom select method calls element onfocus event in windows FF (but not Linux)!
	// so i don't want to re-set the number of guests after i have made the change
	// i want to roll back if validation fails..
	//if (typeof cur_num_guests == 'undefined' || typeof cur_num_guests != 'number') {
		cur_num_guests = parseInt(e.value);
	//}
        e.select();
        
}	

function updateSeats(num_seats) {

	var prev_num_registered = parseInt($('num_registered').innerHTML);
	var cur_num_registered = prev_num_registered - cur_num_guests;
	var capacity = parseInt($('capacity').innerHTML);
	cur_num_registered += parseInt(num_seats);
	$('num_registered').innerHTML = cur_num_registered;
	var available = capacity - cur_num_registered;
	$('num_available').innerHTML = available;

	// update num_available for post in order to determine whether or not to notify
	$('num_available_post').value = available; 

	// display no space available and disable add button if max reached
	// disable add button if waiting list records with status != 'attempted to contact'
	// highlight waiting list rows status='to contact' if seats available

	if (cur_num_registered == capacity) {
		$('registration_alert').style.display = 'inline';
		$('add_registration').disabled = true;
	} else if (cur_num_registered < capacity && !waiting_to_be_contacted) {
		$('registration_alert').style.display = 'none';
		$('add_registration').disabled = false;
	} else {
		$('registration_alert').style.display = 'none';
		$('add_registration').disabled = true;
	}


}

function setTender(option) {

	var prev_description = option.text;

	var description = prompt('Describe payment:');

	if (!description) {
		option.text = prev_description;
		option.value = prev_description;
		//return prev_description;
	} else {
		option.text = description;
		option.value = description;
		//return description;
	}

	// update existing records
	if (!/_0/.test(option.getParent().name)) {
		updateRegistration(option.getParent());
	}

}

function updateGuests(e) {

	if  (!validateNumGuests(e)) {
		return;
	}

	updateTotal(e);

	// don't update seats for waiting list guests
	// - not entirely true: update number waiting
	if (typeof e.waitinglist == 'undefined') {
		updateSeats(e.value);

		// update waiting list row color if space available/ 
		// not available (asynch guest number change)

		var seats_available = parseInt($('num_available').innerHTML);
		var waitinglist = $(document.body).getElements('tr.waitinglist'); 

		if (!seats_available) {
			$('add_waitinglist').style.display = 'inline';
		}

		if (waitinglist.length) {

			var row_color = seats_available ? 'red' : 'white';

			var people_to_contact = 0;
			for (var i=0; i < waitinglist.length; ++i) {
				var contact_status = $(waitinglist[i]).getElements('td.status'); 			
				if (contact_status[0].innerHTML == 'contact') {
					waitinglist[i].style.backgroundColor = row_color;
					if (row_color == 'red') {
						++people_to_contact;
					}
				}
			}

			if (people_to_contact) {
				$('add_registration').disabled = 'false';
				$('mark_contacted').style.display = 'inline';
				$('move_to_registered').style.display = 'inline';
				prev_waiting_to_be_contacted = waiting_to_be_contacted;
				waiting_to_be_contacted = people_to_contact;
			} else {
				$('add_registration').disabled = 'true';
				$('mark_contacted').style.display = 'none';
				$('move_to_registered').style.display = 'none';
				prev_waiting_to_be_contacted = waiting_to_be_contacted;
				waiting_to_be_contacted = people_to_contact;
			}


		}

	} else {
		// TODO: too complicated
		var new_num_guests = parseInt(e.value);
		var prev_num_waiting = parseInt($('num_waiting').innerHTML);
		var new_num_waiting = prev_num_waiting - cur_num_guests + new_num_guests;

		$('num_waiting').innerHTML = new_num_waiting;
	}

	updateRegistration(e);

}

function deleteRecord() {

	//var is_confirmed = confirm('Are you sure you want to permantently delete the record(s)?');
	//alert('is confirmed: ' + is_confirmed);
	if (confirm('Are you sure you want to permantently delete the record(s)?')) {
		var delete_initials = prompt('Please enter your initials:');
		if (!delete_initials) {
			alert('You must enter your initials in order to delete a record.');
			return false;
		}

		$('delete_initials').value = delete_initials;
		
		return true;
	}

	return false;
}

function updateRegistration(e) {


	var update_registration_request = new Ajax(
		'components/com_jevents/controllers/ajax.php?function=updateRegistration'
		+ '&field=' + e.name + '&value=' + e.value,
		{method: 'get',
		onComplete: show}
	).request();

	function show(result) {
		//alert('get here' + result);
	}

	notifyWaitingListCoordinator();

	if (e.value < cur_num_guests) {
		var num_cancellations = cur_num_guests - e.value;
		var reg_id = e.name.match(/\[(\d+)\]/)[1];

		// TODO: redundant - collapse with setRefund/validation 

		// only cancel enrolled registrations
		var is_enrolled = (e.getParent().getParent().className == 'registration') ? 1 : 0;

		if (is_enrolled) {	


			var refund_status = validateCancellationCutoff(); 
			//console.log('refund status is: ' + refund_status);
			var is_refunded;
			var reg_status = 'cancelled';
			if (refund_status == 'no refund < 48hrs') {
				is_refunded = 0;
				reg_status = refund_status;	
			} else if (refund_status) {
				is_refunded = 1;
			} else {
				is_refunded = 0;
			}

			addCancellations(reg_id,num_cancellations,reg_status,is_refunded);

		}

	}

}


// TODO: broken on Linux FF - case = < 48 hrs
function addCancellations(reg_id,num_cancellations,reg_status,is_refunded) {

	var add_cancellations_request = new Ajax(
		'components/com_jevents/controllers/ajax.php?function=addCancellations'
		+ '&reg_id=' + reg_id + '&num_cancellations=' + num_cancellations + '&reg_status=' + reg_status + '&is_refunded=' + is_refunded,
		{method: 'get',
		onComplete: show}
	).request();

	function show(result) {
		//alert('get here: ' + result);
	}

	$('ajax_cancellation').value = 1;
	document.forms['adminForm'].submit();
	
}

function notifyWaitingListCoordinator() {


	//console.log('prev: ' + prev_waiting_to_be_contacted + 'cur:' + waiting_to_be_contacted);

	if (prev_waiting_to_be_contacted == 0 && waiting_to_be_contacted > 0) {

		var notify_waitinglist_coordinator_request = new Ajax(
			'components/com_jevents/controllers/ajax.php?function=notifyWaitingListCoordinator'
			+ '&event_name=' + $('event_name').value,
			{method: 'get'}
		).request();

	}
}
