// day tabs
var days = new Array();
// selected package
var pkg = "";
var package_code = "";
// package type
var pkgType = "fullpkg"; // default
// selected events
var events = new Array();
// total amount
var amount = 0.00;
// current event for ticket event
var currentEvent = "";
//current rate for ticket event
var currentPrimaryRate = 0.00;
var currentTicketRate = 0.00;
var currentTicketNumber = 0;
var prevRegularTickets = 0;
//current rate for show event
var caseEvent = "";
var casePrimaryRate = 0.00;
var caseTicketRate = 0.00;
var caseTicketNumber = 0;
var prevTickets = 0;

var days = new Array();
var daysSelected = new Array();

// event:tickets pair
var eventTickets = new Array();
var submitted = false;



//Cache image
var image1 = $('<img />').attr('src', '/content/events/_img/buttons/process-order-disabled.png');

$(document).ready(function() {
	
	//force to check the full conference package.
	$("#package input").removeAttr('checked');
	$("#package input[value*='FULLPROG']").attr('checked', 'checked');
	pkg = "FULLPROG";
	var defaultRate = $("#package input[value*='FULLPROG']").attr('rate');
	package_code = $("#package input[value*='FULLPROG']").val();
	amount = defaultRate * 1.00;
	switchDay(days[0], "pkg");
	dayStatus(days[0],pkg);
	
	//Set the days for later JS reference
	var i = 0;	
	$.each($("#event-reg .day-picker a"),function(){
		days[i] = $(this).attr('id').substr(3);
		daysSelected[i] = false;
		i++
	})
		
	// package radio button
	$("#package input").click(function(){
		var cost = $(this).attr('rate');
		cost = (cost * 1.00);
		$(".package-details .cost").html('Cost: ' + formatNumber(cost));
		var newDay = $(this).attr('date');
		var newPkg = "pkg";
		// set package
		if($(this).attr("value").indexOf('DAY') > -1) {
			pkg = newDay;
			pkgType = "daypkg";
			newPkg = "pkg";
			amount = cost;
		}
		if($(this).attr("value").indexOf('FULL') > -1) {
			pkg = "FULLPROG";
			pkgType = "fullpkg";
			newPkg = "pkg";
			amount = cost;
		}
		if($(this).attr("value").indexOf('TICKETS') > -1) {
			pkg = "TICKETS";
			pkgType = "individual";
			newPkg = "ind"; 
			amount = cost;
		}
		package_code = $(this).attr("value");
		switchDay(newDay, newPkg);
		dayStatus(newDay, pkgType);
		unSelectAll();
	});
	
	// day tabs
	$("#event-reg .day-picker a").click(function(){
		var newDay = $(this).attr('id').substr(3, 10);
		var newPkg = getPackageType(newDay);
		switchDay(newDay, newPkg);
		return false;
	});
	
	// previous day and next day button
	$("#event-reg .day-overview a").click(function(){
		if($(this).hasClass('disabled') != true){	
			if($(this).hasClass('previous-day')) {
				var thisDay = $(this).attr('id').substr(9,1);
				var moveToDay = thisDay * 1 - 2;
				var newPkg = getPackageType(days[moveToDay]);
				switchDay(days[moveToDay], newPkg);
			}else if($(this).hasClass('next-day')) {
				var thisDay = $(this).attr('id').substr(9,1);
				var moveToDay = moveToDay =  thisDay * 1;
				var newPkg = getPackageType(days[moveToDay]);
				switchDay(days[moveToDay], newPkg);
			}			
		}
		return false;
	});
	
	$("#event-reg .day-navigation a").click(function(){
		if($(this).hasClass('disabled') != true){
			
			var thisDay = $(this).attr('id').substr(9,1);
			var moveToDay = 0;
			var newPkg = "";
			if($(this).hasClass('previous-day')) {
				moveToDay =  thisDay * 1 - 2;
			}
			if($(this).hasClass('next-day')) {
				moveToDay =  thisDay * 1;
			}
			newPkg = getPackageType(days[moveToDay]);
			switchDay(days[moveToDay], newPkg);
		}
		return false;
	});
	
	// showcase tickets
	$("#event-reg .day-overview .ticket_selection").click(function(){
		
		var prev_tickets = parseInt($("#sum-"+caseEvent).attr('tickets'));
		prevTickets = prev_tickets;
		var rate = $(this).parent().attr('rate') * 1.00;
		caseTicketRate = rate;
		caseEvent = $(this).parent().attr('id').substr(4);
		
		$.facebox({ ajax: '/content/events/registration/showcase_ticket_form.html' });
		return false;
	});
	
	// event selection
	$("#event-reg .day-schedule td.select-item").click(function(){
		if(!$(this).hasClass('required')){
			var eventId = $(this).attr('id').substr(8);
			
			var eventTitle = $(this).find('.event-title').html();
			var rate = $(this).attr('rate');
			var action = $(this).find('a.select-item').html();
			if (action == "Add") {
				selectEvent(this, eventId, eventTitle);
			}
			if (action == "&nbsp;") {
				unSelectEvent(eventId);
			}
			if (action.indexOf("Tickets") > -1) {
				currentEvent = eventId;
				currentPrimaryRate = $(this).attr('rate') * 1.00;
				currentTicketRate = $(this).attr('ticket_rate') * 1.00;
				currentTicketNumber = $("#eventid-" + eventId + " a:last").attr("ticket_number") * 1;
				prevRegularTickets = $("#eventid-" + eventId + " a:last").attr("ticket_number") * 1
				
				$.facebox({ ajax: '/content/events/registration/ticket_form.html' });
				return false;
			}
		}
		return false;
	})
	
	// event details pop up
	$("#event-reg .day-schedule .event-title").click(function(){
		var popupTitle = $(this).html();
		var popupBody = $(this).parent().find('.event-description').html();
		$.facebox("<strong>" + popupTitle + "</strong><p>" + popupBody + "</p>");
		return false;
	});
	
	$("#event-checkout h3 a").click(function(){
		$(this).toggleClass('open');
		openThis = $(this).parent().attr('class');
		$(".slideContainer." + openThis).toggle();
		return false;
		
	});
	
	$("#event-checkout .submit .process-order").click(function(){
		//$(this).attr('src','/content/events/_img/buttons/process-order-disabled.png');
		$(this).hide();
		$("fieldset.submit").append(image1);
		
		if($("#cardnumber").val()){
			var creditcard = $("#cardnumber").val();
			creditcard = creditcard.replace(/ /gi,"");
			$("#cardnumber").val(creditcard);
		}
		//$(this).attr('disabled','disabled');
		if(submitted == false) {
			submitted = true;
			return true;
		} else {
			return false;
		}
	});

	
	$("input#checkout").click(function(){
		checkDays();
		return false;
	});
	
	$("#event-reg #helpPopup").click(function(){
		$.facebox({ ajax: '/content/events/registration/instructions.html' });
		return false;
	})
	
});


// switch days
function switchDay(newDay, newPkg){
	$("#event-reg .day-picker a").removeClass('selected');
	$("#event-reg .day-picker a#tp-" + newDay).addClass('selected');
	$("#event-reg .day-picker a#tp-" + newDay).removeClass('unviewed');
	
	$("#event-reg .day-overview").hide();
	
	$("#event-reg .day-overview#ov-" + newDay + "-" + newPkg).show();
	
	$("#event-reg .day-schedule").hide();
	$("#event-reg .day-schedule#sc-" + newDay + "-" + newPkg).show();
	
}

function dayStatus(newDay,pkgType){
	$("#event-reg .day-picker a").removeClass('active');
	if((pkgType == "FULLPROG") || (pkgType == "fullpkg")){
		$.each( $("#event-reg .day-picker a"),function(){
			$(this).addClass('active');
			$(this).addClass('unviewed');
		})
		$("#event-reg .day-picker a#tp-" + newDay).removeClass('unviewed');
	}else if (pkgType == "individual"){
		$("#event-reg .day-picker a").removeClass('active');
		$("#event-reg .day-picker a").removeClass('unviewed');
	}else{
		$("#event-reg .day-picker a").removeClass('unviewed');
		$("#event-reg .day-picker a#tp-" + newDay).addClass('active');
	}
}

function getPackageType(newDay) {
	var newPkg = "pkg";
	if (pkgType == "daypkg" && pkg != newDay) {
		newPkg = "ind";
	}
	if (pkgType == "individual") {
		newPkg = "ind";
	}
	return newPkg;
}

// select an event
function selectEvent(e, eventId, title) {
	checkConflicts(eventId);
	events.push(eventId);
	calcRate(eventId, 1, 1);
	addSummary(eventId, title);
	applyClass(eventId, 1); // 1 - on; 0 - off
	activeDays();
}

// unselect an event
function unSelectEvent(eventId) {
	var toRemove = events.indexOf(eventId);
	events.remove(toRemove);
	calcRate(eventId, 1, 0);
	removeSummary(eventId);
	applyClass(eventId, 0); // 1 - on; 0 - off
}

// unselect a ticket event
function unSelectTicket(eventId) {
	var number = $("#eventid-" + eventId + " a:last").attr("ticket_number") * 1;
	var toRemove = eventTickets.indexOf(number + "+" + eventId);
	events.remove(toRemove);
	calcRate(eventId, number, 0);
	removeSummary(eventId);
	$("#eventid-" + eventId).removeClass('selected');
	$("#eventid-" + eventId + " a:last").attr("ticket_numer", 0);
	$("#eventid-" + eventId + " a:last").html("Tickets (0)");
}

function checkConflicts(eventId) {
	e = "#eventid-" + eventId + " a:last";
	var c = $(e).attr('conflicts');
	if (c != "") {
		var i = 0;
		var len = events.length;
		for (i=0; i < len; i++) {
			if (c.indexOf(events[i]) > -1) {
				unSelectEvent(events[i]);
				i--;len--;
			}
		}
		
		// check ticket events
		var j = 0;
		var tlen = eventTickets.length;
		for (j=0; j < tlen; j++) {
			var thisEvent = eventTickets[j].substr(2);
			if (c.indexOf(thisEvent) > -1) {
				unSelectTicket(thisEvent);
				j--;tlen--;
			}
		}
	}
}

function unSelectAll() {
	var i = 0;
	var len = events.length;
	for (i=0; i < len; i++) {
		unSelectEvent(events[i]);
		i--;
		len--;
	}
}

function addSummary(eventId, title) {
	var e = "#eventid-" + eventId + " a:last";
	var eventTime = sortTime($(e).attr('time'));
	
	output = '<li id="sum-' + eventId + '" title="'+ eventTime +'"><span class="time">' + $(e).attr('time') + ' : </span> ' + title + '</li>';
	
	var maxTime = "AM00:00";
	var firstTime = "";
	var secondTime = "";
	var thisDay = $(e).attr('day');
	$("ul#day-selected-"+ thisDay+ "-" + getPackageType(thisDay) + " li").filter(function (index){
		firstTime = $(this).attr('title');
		if ((eventTime > firstTime) && (firstTime > maxTime)) {
			maxTime = firstTime;
		}
		return eventTime > firstTime;
	}).filter(function (index) {
		secondTime = $(this).attr('title');
		return secondTime == maxTime;
	}).after(output);
}

function removeSummary(eventId) {
	$("#sum-" + eventId).remove();
}

function applyClass(eventId, on) {
	$("#eventid-" + eventId + " a:last").toggleClass('remove');
	if(on) {
		$("#eventid-" + eventId).addClass('selected');
		$("#eventid-" + eventId + " a:last").html('&nbsp;');
	} else {
		$("#eventid-" + eventId).removeClass('selected');
		$("#eventid-" + eventId + " a:last").html('Add');
	}
}

function updateTickets(amount){
	updateEventTickets(amount);
	currentTicketNumber = amount;
	
	if (prevRegularTickets > 0) {
		calcRate(currentEvent, prevRegularTickets, 0);
	}
	
	if (amount > 0) {
		$("#eventid-" + currentEvent).addClass('selected');
		calcRate(currentEvent, currentTicketNumber, 1);
	} else {
		$("#eventid-" + currentEvent).removeClass('selected');
	}
	$("#eventid-" + currentEvent + " a:last").attr("ticket_number", amount);
	$("#eventid-" + currentEvent + " a:last").html("Tickets (" + amount +")");
	activeDays();
}

function updateShowcaseTickets(number){
	
	if(!isNaN(prevTickets)) {
		var total = prevTickets * caseTicketRate;
		if (total > 0) {
			amount -= total;
			$(".package-details .cost").html('Cost: ' + formatNumber(amount));
		}
	}
	
	caseTicketNumber = number;
	
	$("li span:last#s-" + caseEvent).html("(" + number +")");
	
	var total = number * caseTicketRate * 1.00;

	if (total > 0) {
		amount += total;
		$(".package-details .cost").html('Cost: ' + formatNumber(amount));
	}
	
	$("#sum-"+caseEvent).attr('tickets', number);
	
	if (number > 0) {
		$("#sum-"+caseEvent).addClass("showcase");
	} else {
		$("#sum-"+caseEvent).removeClass("showcase");
	}
	
}

// manage the global event+tickets array
function updateEventTickets(amount) {
	
	var i = 0;
	var len = eventTickets.length;
	var e = "#eventid-" + currentEvent + " a:last";
	
	for (i=0; i < len; i++) {
		var exists = currentEvent.indexOf(eventTickets[i].substr(2));
		if (exists > -1) {
			eventTickets.remove(exists);
			removeSummary(currentEvent);
			i--;len--;
		}
	}
	
	if (amount > 0) {
		var eventTitle = $(e).parent().parent().find('.event-title').html();
		checkConflicts(currentEvent);
		addSummary(currentEvent, eventTitle);
		eventTickets.push(amount + "+" + currentEvent);
	}
}

function checkTicketNumber(number) {
	if (currentTicketNumber == number) {
		return "selected";
	} else {
		return "";
	}
}

function checkShowcaseTicketNumber(number) {
	if (caseTicketNumber == number) {
		return "selected";
	} else {
		return "";
	}
}

function checkPrimaryTicket() {
	if (currentPrimaryRate > 0) {
		return formatNumber(currentPrimaryRate);
	} else {
		return "Included";
	}
}


function calcRate(eventId, tickets, add) {
	var e = "#eventid-" + eventId + " a:last";
	var rate = $(e).attr('rate');
	var ticket_rate = $(e).attr('ticket_rate');
	var day = $(e).attr('day');
	var total = 0.00;
	
	rate = rate * 1.00;
	ticket_rate = ticket_rate * 1.00;
	
	total = rate + ticket_rate * (tickets - 1); 
	
	if (tickets >= 1) {
		if (add) {
			amount += total;
		} else {
			if (amount >= total) {
				amount -= total;
			}
		}
		$(".package-details .cost").html('Cost: ' + formatNumber(amount))
	} else {
		if (pkg != "FULLPROG") {
			if (pkg == "TICKETS" || day != pkg) {
				if (add) {
					amount += total;
				} else {
					if (amount >= total) {
						amount -= total;
					}
				}
				$(".package-details .cost").html('Cost: ' + formatNumber(amount))
			}
		}
	}
}

// prepare form data and pass them to next screen
function buildData() {
	// concat required events
	if(pkg == "FULLPROG") {
		$("li.required").each(function(){
			events.push($(this).attr('id').substr(4));
		});
	} else if (pkg != "TICKETS") {
		$("li." + pkg).each(function(){
			events.push($(this).attr('id').substr(4));
		});
	}
	
	$("li.showcase").each(function(){
		var show_ticket_event = $(this).attr('tickets') + '+' + $(this).attr('id').substr(4);
		events.push(show_ticket_event);
	});
	
	// concat event tickets
	events = events.concat(eventTickets);
	
	var i = 0;
	var len = events.length;
	for (i=0; i < len; i++) {
		events[i] = events[i].replace(/--/gi, "/");
	}
	$("#toSubmit input#input-package").val(package_code);
	$("#toSubmit input#input-events").val(events);
}

// utility functions

function ticketForm() {
	var op = '<select name="tickets" id="tickets" class="ticket-select">';
	
	if(checkPrimaryTicket() != 'Included') {
		op += '<option value="1" ' + checkTicketNumber(1) + '>1 (+' + formatNumber(currentTicketRate) + ')</option>';
		op += '<option value="2" ' + checkTicketNumber(2) + '>2 (+' + formatNumber(currentTicketRate * 2.00) + ')</option>';
		op += '<option value="3" ' + checkTicketNumber(3) + '>3 (+' + formatNumber(currentTicketRate * 3.00) + ')</option>';
		op += '<option value="4" ' + checkTicketNumber(4) + '>4 (+' + formatNumber(currentTicketRate * 4.00) + ')</option>';
		op += '<option value="0">0 (Cancel)</option>';
		op += '</select>';
	} else {
		op += '<option value="1" ' + checkTicketNumber(1) + '>1 (Included)</option>';
		op += '<option value="2" ' + checkTicketNumber(2) + '>2 (+' + formatNumber(currentTicketRate * 1.00) + ')</option>';
		op += '<option value="3" ' + checkTicketNumber(3) + '>3 (+' + formatNumber(currentTicketRate * 2.00) + ')</option>';
		op += '<option value="4" ' + checkTicketNumber(4) + '>4 (+' + formatNumber(currentTicketRate * 3.00) + ')</option>';
		op += '<option value="0">0 (Cancel)</option>';
		op += '</select>';
	}
	
	$("#op").html(op);
}

function showcaseTicketForm() {
	var op = '<select name="tickets" id="tickets" class="ticket-select">';
	
	op += '<option value="1" ' + checkShowcaseTicketNumber(1) + '>1 (+' + formatNumber(caseTicketRate) + ')</option>';
	op += '<option value="2" ' + checkShowcaseTicketNumber(2) + '>2 (+' + formatNumber(caseTicketRate * 2.00) + ')</option>';
	op += '<option value="3" ' + checkShowcaseTicketNumber(3) + '>3 (+' + formatNumber(caseTicketRate * 3.00) + ')</option>';
	op += '<option value="4" ' + checkShowcaseTicketNumber(4) + '>4 (+' + formatNumber(caseTicketRate * 4.00) + ')</option>';
	op += '<option value="0">0 (Cancel)</option>';
	op += '</select>';
	
	$("#op").html(op);
}

function newWindow(theURL,winName,features) {
	window.open(theURL,winName,features);
}

function SortLinkClicked(dataStr){ //v3.0
	document.form1.sortName.value = dataStr;
	document.form1.submit();
}

function sortTime(eventTime) {
	var sorted = eventTime.substr(5, 2) + eventTime.substr(0, 5);
	
	// deal with 12:00PM
	if (sorted.substr(2, 2) == '12') {
		sorted = sorted.replace(/P/gi, "A");
	}
	
	return sorted;
}

// Array.indexOf( value, begin, strict ) - Return index of the first element that matches value
Array.prototype.indexOf = function( v, b, s ) {
 for( var i = +b || 0, l = this.length; i < l; i++ ) {
  if( this[i]===v || s && this[i]==v ) { return i; }
 }
 return -1;
};

// Array.remove
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};

function formatNumber(num) {
	num = num.toString().replace(/\$|\,/g,'');
	if(isNaN(num))
	num = "0";
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	if(cents<10)
	cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
	num = num.substring(0,num.length-(4*i+3))+','+
	num.substring(num.length-(4*i+3));
	return (((sign)?'':'-') + '$' + num + '.' + cents);
}

function activeDays(){
	var currentDay = $(".day-picker a.selected").attr('id').substr(3);
	for(i=0;i<days.length;i++){
		if(days[i] == currentDay){
			daysSelected[i] = true;
		}
	}
}


		

function checkDays(){
	var valid = true;
	
	if(pkg == "FULLPROG"){
		for(i=0;i<days.length;i++){
			if(daysSelected[i] == false){
				valid = false;
			}
		}
		if(valid == false){
			if(days.length == 1){
				alert('You have not made your session selections');
			}else{
				alert('You have not made your session selections for each day of this event');
			}
		}
	}else if(pkg == "TICKETS"){
		if(events == ""){
			alert('You must sign up for at least one session')
			valid = false;
		}
	}else{
		for(i=0;i<days.length;i++){
			if((days[i] == pkg) && (daysSelected[i] == false)){
				alert('You have not made your session selections');
				valid = false;
			}
		}
	}
	
	if(valid == true){
		submitForm();
	}
}

function submitForm(){
	var answer = confirm("You are about to proceed to checkout. Have you verified that all of the sessions you want to attend have been selected?")
	if(answer){
		buildData();
		$("#toSubmit").submit();
	}
}