// JavaScript Document

// Set document root.
var g_root = "/hr/trainingapp/";

// For elements that are only to be shown if JavaScript is enabled (use class="YesScript")
document.getElementsByTagName('html')[0].className='jsOn';

// Page loaded
Ext.onReady(
	function() {
		doResize();
	}
);

// Window Resized
Ext.EventManager.onWindowResize(doResize);

// Resize browser table to fit window
function doResize() {
	var oDiv1 = Ext.get("browser_right");
	var docBody = Ext.get(document.body);
	var cart = Ext.get("myitems_win");
	var cart_body = Ext.get("myitems_win_body");
	var pageWidth = docBody.getWidth();
	var pageHeight = docBody.getHeight();
	try {
		oDiv1.setWidth (pageWidth  - oDiv1.getLeft() - 20);
		oDiv1.setHeight(pageHeight - oDiv1.getTop()  - 20);
		var cartHeight = pageHeight - cart.getTop() - 14;
		var newHeight = cartHeight > 80 ? cartHeight : 80;
		cart.setHeight(newHeight);
		cart_body.setHeight(newHeight - 45);
	} catch (e) {}
}


function ieTables() {
	if (Browser.Version() < 7) {
		els = document.getElementsByTagName('tr');
		for (i=0; i<els.length; i++) {
			els[i].attachEvent("onmouseover", function(e) {
				el = e.srcElement;
				b = 1;
				while (b <= 10 && el.tagName != "TR") {
					el = el.parentNode;
					b += 1;
					if (el.tagName == "TR")	el.className = "hover";
				}
			});
			els[i].attachEvent("onmouseout", function(e) {
				el = e.srcElement;
				b = 1;
				while (b <= 10 && el.tagName != "TR") {
					el = el.parentNode;
					b += 1;
					if (el.tagName == "TR" && el.className == "hover") el.className = "";
				}
			});
		}
	} 
}


// Shows another tab on the public workshops screen
// Called when user clicks on a course type tab item
var b_locked = false;
var b_last_type_id = 0;
function change_browser_tab(id, auto_show_workshop_id) {
	if (b_locked) return false;
	
	if (b_last_type_id == id)
		return;
	else
		b_last_type_id = id;
	
	b_locked = true;
	var sPicker = "type_picker_" + id;
	var divs = Ext.get("browser_left").query("div");
	for (var i=0; i<divs.length; i++) {
		if (divs[i].className == "type_picker_on")
			divs[i].className = "type_picker";
		else if (divs[i].id == sPicker)
			divs[i].className = "type_picker_on";
	}

	var sTab = 'tbl_data_' + id;
	var tables = Ext.get("browser_right").query("table");
	for (var i=0; i<tables.length; i++) {
		if (tables[i].id != sTab) {
			tables[i].className = "tbl_data_hide";
			tables[i].style.display = "none";
		}
	}
	
	// Show tab
	var newTab = Ext.get(sTab);
	if (newTab) {
		newTab.removeClass("tbl_data_hide");
		newTab.addClass("tbl_data_show");
		newTab.fadeIn({duration: .5, callback: function() {
			b_locked = false;
			if (auto_show_workshop_id != null && auto_show_workshop_id >= 0)
				show_info(auto_show_workshop_id);
		} });
	} else {
		b_locked = false;
	}
}

// Displays detailed information on a workshop
var b_s_last_tr = "";
var g_last_ws_id = 0;
function show_info(id) {
	if (b_locked) return false;
	
	var sTr = "tbl_data_info_" + id;

	var bNeedClose = false;
	if (b_s_last_tr != "") {
		var trLast = Ext.get(b_s_last_tr);
		var trLastPrev = Ext.get(trLast.prev());
		var trLastImg = trLastPrev.query("img")[0];
		trLastImg.src = g_root + "images/hrtwms/plus.gif";
		trLast.setStyle("display", "none");
		trLastPrev.removeClass("opened_row");
		bNeedClose = (sTr == b_s_last_tr);
	}
	b_s_last_tr = sTr;
	
	var trItem = Ext.get(sTr);
	var trPrev = Ext.get(trItem.prev());
	var trImg = trPrev.query("img")[0];
	if (! bNeedClose) {
		trPrev.addClass("opened_row");
		trImg.src = g_root + "images/hrtwms/minus.gif";
		trItem.setStyle("display", "");
	} else {
		trImg.src = g_root + "images/hrtwms/plus.gif";
		trPrev.removeClass("opened_row");
		b_s_last_tr = "";
	}

	// Show page
	if (! bNeedClose) {
		
		// Set global var for current workshop id
		g_last_ws_id = id;
		
		sDiv = "tbl_data_info_div_" + id;
		b_locked = true;
		ColdFusion.navigate(g_root + "public/info?key=" + id,
			sDiv,
			function(text) {

				// Add listeners for "Register" and "Remove" buttons
				var win = Ext.get(sDiv);
				var aButtons = win.query("input.reg_button");
				for (var i=0; i<aButtons.length; i++) {
					var btn_item = Ext.get(aButtons[i]);
					btn_item.removeAllListeners();
					
					// Remove buttons
					if (btn_item.hasClass("reg_button_dereg")) {
						btn_item.addListener('click', function() {
							var upDiv = this.up("div");
							wa_id = upDiv.child("input.workshopattendee_id", true).value;
							sTitle = upDiv.child("input.course_title", true).value;
							dereg_class(wa_id, sTitle, this, false);
						}, btn_item);
						
					// Stop Waiting list buttons
					} else if (btn_item.hasClass("reg_button_dereg_w")) {
						btn_item.addListener('click', function() {
							var upDiv = this.up("div");
							wa_id = upDiv.child("input.workshopwaitinglist_id", true).value;
							sTitle = upDiv.child("input.course_title", true).value;
							dereg_class(wa_id, sTitle, this, true);
						}, btn_item);
						
					// Register buttons
					} else {
						btn_item.addListener('click', function() {
							var upDiv = this.up("div");
							wd_id = upDiv.child("input.workshopdate_id", true).value;
							reg_class(this, wd_id);
						}, btn_item);
					}
				}

				// Fade in div
				trItem.fadeIn({duration: .9});
				b_locked = false;
			},
			function (e) { 
				alert('Error:' + e)
				b_locked = false;
			});
	}
}

// Shows the correct tab and details for a specified course type and course
function nav_browser(coursetype_id, workshop_id) {
	change_browser_tab(coursetype_id, workshop_id);
}


// Check to see if an array of type Object contains a certain string value
Object.prototype.inObject = function(value, notCaseSensitive) {
	var i;
	for (i=0; i < this.length; i++) {
		if (notCaseSensitive)
			if (this[i].toLowerCase() == value.toLowerCase()) return true;
		else
			if (this[i] == value) return true;
		
	}
	return false;	
};

// Check to see if an array of type Object contains a given key
Object.prototype.hasKey = function(value) {
	for (key in this) {
		if (key == value) return true;
	}
	return false;
}

// Check for successful JSON result and perform error handling
Object.prototype.resultSuccess = function(fnName, loginKey, clickedObj) {
	
	// Make sure we have received a valid "RESPONSE" value
	if (this.hasKey("RESPONSE")) {
		
		if (this["RESPONSE"]["SUCCESS"]) {
			
			// Everything was successful, so return true
			return true;
			
		} else {
			 // Need login
			 if (this["RESPONSE"]["ERROR"] == "NotLoggedIn") {
				 
				 // Show login window, when needed
				 showLogin(loginKey, clickedObj);
				 
			 // Other errors
			 } else {
				 switch (fnName) {
					 
					 // Error handlers for removing registration
					 case "dereg_class":
						 alert("Could not remove workshop registration: " + this["RESPONSE"]["ERROR"]);
						 break;
					
					 // Error handlers for registering a class
				     case "reg_class":
					 	 if (this["RESPONSE"]["ERROR"] == "ClassFull") {
							 waitingWindow(this["RESPONSE"], clickedObj);
						 } else {
							 alert("Could not schedule workshop: " + this["RESPONSE"]["ERROR"]);
						 }
					 	 break;
						 
				     // Error handlers for logging in and confirming details
				     case "showLogin":
					     break;
						 
				     // Error handlers for waiting list window
					 case "waitingWindow":
					 	alert("Could not register for waiting list: " + this["RESPONSE"]["ERROR"]);
					 	break;
				 }
			 }
		}
		
	// We did not even receive a "RESPONSE" value in the response
	} else {
		alert("Error retrieving JSON data.");
	}
			
	return false;
}

function waitingWindow(response, btnList) {
	
	// Get "Join Waiting List" button and set up event handler
	var btn = Ext.get("btn_waiting");
	btn.removeAllListeners();
	btn.addListener(
		'click',
		function() {
			// Get workshopdate_id of item to add to waiting list
			var params = new Object();
			params.key = response["WORKSHOPDATE_ID"];
			
			// Attempt to add to waiting list
			try {
				http("POST", g_root + "public/waitinglistadd",
					 
					 // Callback
					 function(result) {
						 
						 // Check for success of http(...) call
						 if (result.resultSuccess("waitingWindow", 0, null)) {
							 
							 // Hide the "Register" button after sliding it
							 var button_reg = Ext.get(btnList);
							 button_reg.setStyle("position", "");
							 button_reg.addClass("reg_button_dereg_w");
							 button_reg.dom.value = "Stop Waiting";
							 button_reg.removeAllListeners();
							 button_reg.addListener("click", function() {
								dereg_class(result["RESPONSE"]["ID"], result["RESPONSE"]["COURSE_TITLE"], button_reg.dom, true);
							 });

							 // Show user's info
							 ColdFusion.navigate(
								g_root + "public/cart",
								"myitems",
								// Success showing info
								function() {
									 doResize();
									 Ext.get("myitems_win").fadeIn();
								},
								// Failure showing info
								function(code, msg) {
									alert("Error " + code + " showing user info: " + msg);
								}
							  );
							 
							 // Close window
							 ColdFusion.Window.hide("win_waiting");
						 }
						 
					 },
					 
					 // params for http(...) call
					 params
				 );
			} catch (e) {
				alert('JavaScript Error: ' + e.message);
			}
		}
	);
	
	// Show waiting list window
	ColdFusion.Window.show("win_waiting");
}

// Un-registers a class
function dereg_class(workshopdate_id, class_name, btn, bWaiting) {
	if (!bWaiting && ! confirm('Are you sure you wish to remove your registration for "' + class_name + '?"'))
		return false;

	if (bWaiting && ! confirm('Remove "' + class_name + '" from your waiting list?'))
		return false;

	// Unregister
	var params = new Object();
	params.key = workshopdate_id;
	params.request_format = "json";
	var url = (bWaiting) ? g_root + "public/waitinglistremove" : g_root + "public/deregister";
	try {
		http("POST", url,
			 
			 // Callback
			 function(result) {
				 
				 // Successful response
				 if (result.resultSuccess("dereg_class", 0)) {
						 
					 // Change button
					 if (btn != null) {
						 var button_reg = Ext.get(btn);
						 button_reg.removeClass("reg_button_dereg");
						 button_reg.removeClass("reg_button_dereg_w");
						 button_reg.dom.value = (bWaiting) ? "Waiting List" : "Register";
						 button_reg.removeAllListeners();
						 button_reg.addListener("click", function() {
						 var upDiv = this.up("div");
							wd_id = upDiv.child("input.workshopdate_id", true).value;
							reg_class(this, wd_id);
						 }, button_reg);
					 } else {
						 // If button was not specified, find it if we have the matching info window open
						 if (g_last_ws_id == result["RESPONSE"]["WORKSHOP_ID"]) {
							 var theDiv = Ext.get("div_dates_" + result["RESPONSE"]["WORKSHOPDATE_ID"]);
							 if (theDiv != null) {
								 var bReg = (bWaiting) ? theDiv.child("input.reg_button_dereg_w") : theDiv.child("input.reg_button_dereg");
								 if (bReg != null) {
									 bReg.removeClass("reg_button_dereg");
									 bReg.removeClass("reg_button_dereg_w");
									 bReg.dom.value = (bWaiting) ? "Waiting List" : "Register";
									 bReg.removeAllListeners();
									 bReg.addListener("click", function() {
										var upDiv = this.up("div");
										wd_id = upDiv.child("input.workshopdate_id", true).value;
										reg_class(this, wd_id);
									 }, button_reg);
								 }
							 }
						 }
					 }
					 
					 // Refresh the "My Info" section
					 ColdFusion.navigate(
						g_root + "public/cart",
						"myitems",
						// Success showing info
						function() {
							 doResize();
							 Ext.get("myitems_win").fadeIn();
						},
						// Failure showing info
						function(code, msg) {
							alert("Error " + code + " showing user info: " + msg);
						}
					  );
					 
				 }
					 
			 },
			 
			 // params
			 params
	    );
	} catch (e) {
		alert('JavaScript Error: ' + e.message);
	}
}

// Registers for a class
function reg_class(btn, course_id) {
		
	var params = new Object();
	params.key = course_id;
	params.request_format = "json";
	try {
		http("GET", g_root + "public/register",
			 
			 // Callback
			 function (result) {

				 // Successful response
				 if (result.resultSuccess("reg_class", course_id, btn)) {

					 // If successful, slide the "Register" button over to the "My Info" div to show what we are adding the course
					 var cart_body = Ext.get("myitems_win");
					 var button_reg = Ext.get(btn);
					 button_reg.setStyle("position", "absolute");
					 button_reg.shift(
					 {
						 x: cart_body.getLeft() + 20, y: cart_body.getTop() + 5,
						 duration: .2,
						 callback: function() {
							 
							 // Hide the "Register" button after sliding it
							 button_reg.setStyle("position", "");
							 button_reg.addClass("reg_button_dereg");
							 button_reg.dom.value = "Deregister";
							 button_reg.removeAllListeners();
							 button_reg.addListener("click", function() {
								dereg_class(result["RESPONSE"]["ID"], result["RESPONSE"]["COURSE_TITLE"], button_reg.dom, false);
							 });
							 
							 // Refresh the "My Info" section
							 ColdFusion.navigate(
								g_root + "public/cart",
								"myitems",
								// Success showing info
								function() {
									 doResize();
									 Ext.get("myitems_win").fadeIn();
								},
								// Failure showing info
								function(code, msg) {
									alert("Error " + code + " showing user info: " + msg);
								}
							  );
						 
						 }
					 });
				 }
			 },
			 
			 // Pass in parameters
			 params
		);
	} catch (e) {
		alert('AJAX Error: ' + e.message);
	}
}

function showLogin(course_id, btn) {
	
	// Show login window (clear form, first)
	document.forms["frm_login"].reset();
	ColdFusion.Window.show("win_login");
	Ext.get("txt_login_user").focus();
	
	// When "Login" button is clicked...
	var loginButton = Ext.get("btn_login");
	loginButton.removeAllListeners();
	loginButton.addListener(
		'click',
		function() {

			var params = new Object();
			var frm = document.forms["frm_login"];
			params.USER = frm.user.value;
			params.PASS = frm.pass.value;
			params.REQUEST_FORMAT = "json";
			
			// Attempt to login user
			try {
				http("POST", g_root + "login/attendee",
					 
					 // Callback
					 function (result) {
						 if (result.hasKey("RESPONSE")) {
							 if (result["RESPONSE"]["SUCCESS"] == true) {

								 // Hide login window, on success
								 ColdFusion.Window.hide("win_login");
								 
								 // Show user details
								 var name1 = result["RESPONSE"]["DETAILS"]["FIRSTNAME"];
								 var name2 = result["RESPONSE"]["DETAILS"]["LASTNAME"];
								 var email = result["RESPONSE"]["DETAILS"]["EMAIL"];
								 var phone = result["RESPONSE"]["DETAILS"]["PHONE"];
								 var department_id = result["RESPONSE"]["DETAILS"]["DEPARTMENT_ID"];
								 var extension = result["RESPONSE"]["DETAILS"]["EXTENSION"];
								 
								 // Confirm user details
								 var frmConfirm = document.forms["frm_confirm"];
								 frmConfirm.reset();
								 frmConfirm["attendee[firstname]"].value = name1;
								 frmConfirm["attendee[lastname]"].value = name2;
								 frmConfirm["attendee[email]"].value = email;
								 frmConfirm["attendee[phone]"].value = phone;
								 frmConfirm["attendee[extension]"].value = extension;
								 frmConfirm["attendee[department_id]"].value = department_id;
								 ColdFusion.Window.show("win_confirm_login");
								 Ext.get("txt_attendee_firstname").focus();

								 // When "Cancel" button is clicked
								 Ext.get("btn_confirm_cancel").removeAllListeners();
								 Ext.get("btn_confirm_cancel").addListener(
									'click',
									function() {
										http("POST", g_root + "login/logout?request_format=json",
											 function (result) {
												 if (result.hasKey("RESPONSE")) {
													 if (result["RESPONSE"]["SUCCESS"]) {
														 // Close window
														 ColdFusion.Window.hide("win_confirm_login");
													 } else {
														 alert(result["RESPONSE"]["ERROR"]);
													 }
												 } else {
													 alert('Error retriving JSON data');
												 }
											 }
									    );
									}
								 );

								 // When "Confirm" button is clicked.
								 Ext.get("btn_confirm").removeAllListeners();
								 Ext.get("btn_confirm").addListener(
									'click',
									function() {
										
										 // Post confirmation
										 http("POST", g_root + "login/confirmattendee",
											  
											  // Callback
											  function (result) {
												 // Verify success
												 if (result.hasKey("RESPONSE")) {
													 if (result["RESPONSE"]["SUCCESS"]) {
														 // Close window
														 ColdFusion.Window.hide("win_confirm_login");
														 
														 // Show user's info
														 ColdFusion.navigate(
															g_root + "public/cart",
															"myitems",
															// Success showing info
															function() {
																 doResize();
																 // If needed, go ahead and add the course to registered list
																 if (course_id > 0)
																	 reg_class(btn, course_id);
																 else
																	 Ext.get("myitems_win").fadeIn();
															},
															// Failure showing info
															function(code, msg) {
																alert("Error " + code + " showing user info: " + msg);
															}
														  );
														 
													 } else {
														 // Show error in div
														 document.getElementById("login_confirm_error").innerHTML = result["RESPONSE"]["ERROR"];
													 }
												 } else {
													 alert('Error retriving JSON data');
												 }
												  
											  },
											  
											  // Submit form
											  document.forms["frm_confirm"]
										 );
										
									}
								);

							 } else {
								 alert("Invalid Login.  Please try again.");
							 }
						 } else {
							 alert('Error retriving JSON data');
						 }
					 },
					 
					 // params
					 params
				);
			} catch (e) {
				alert('AJAX Error: ' + e.messsage);
			}
			
		},
		loginButton
	);
}


function doLogout() {
	
	var params = new Object();
	params.request_format = "json";

	// Attempt to log out user
	try {
		http("POST", g_root + "login/logout",
			 // Callback
			 function (result) {
				 if (result.hasKey("RESPONSE")) {
					 if (result["RESPONSE"]["SUCCESS"] == true) {

						 // Show user's info
						 document.location.reload(true);
						 
					 } else {
						 alert("Unable to log out.");
					 }
				 } else {
					 alert('Error retriving JSON data');
				 }
			 },
			 
			 // params
			 params
		);
	} catch (e) {
		alert('AJAX Error: ' + e.messsage);
	}
}
