// Javascript for the schedule

var dragging = 0;
var prevLayer = null;
var prevTime = "";
var numLayers = 0;
var currentDragArray = [];
var allDragArray = [];
var usersName = "";
var time = "";
var curInst = "";
var view24Hour = 0;
var disableMode = 0;
var reserving = 0;
var manOpAjax = null;
var manOpAjaxProc = false;

// Generate week - click from month view or prev/next week
function displayWeek( month , year , week , inst ) {
	document.getElementById("weekContainer").innerHTML = '<img src="images/ajaxLoading.gif" border="0" />';
	
	// Get the current weeks reservations to fill array
	var ajax = new Ajax.Request('/ajax/schedGetWeekRes.php',
		{
			method: 'get',
			parameters: {
				m: month,
				y: year,
				w: week,
				i: inst
			},
			onSuccess: function(transport) {
				var response = transport.responseText;
				
				if( response == '1' ) {
					alert("Schedule is not working right now.");
					return;
				}
				else if( response == '2' ) {
					alert("You must log in to see the schedule.");
					return;
				}
				else {
					var temp = new Array();
					temp = response.split(" | ");
					// First is the user's name ex Mike P.
					usersName = temp[0];
					temp.splice(0,1);
					allDragArray = temp;
					// Last element is bogus
					allDragArray.splice(allDragArray.length-1,1);
				}
				
			},
			onFailure: function() {
				alert("Something went wrong...");
				return;
			}
		}
	);
	
	// Generate the week
	var ajax = new Ajax.Request('/ajax/schedGenWeek.php',
		{
			method: 'get',
			parameters: {
				m: month,
				y: year,
				w: week,
				i: inst
			},
			onSuccess: function(transport) {
				var response = transport.responseText;
				
				if( response == '1' ) {
					alert("Schedule is not working right now.");
				}
				else if( response == '2' ) {
					alert("You must log in to see the schedule.");
				}
				else {
					var week = document.getElementById("weekContainer");
					week.innerHTML = response;
					
					if( view24Hour ) {
						view24Hour = 0;
						toggle24Hour( document.getElementById('24hourbutton') );
					}
					showDiv( 'weekContainer' );
					hideDiv( 'monthContainer' );
				}
				
			},
			onFailure: function() {
				alert("Something went wrong...");
			}
		}
	);
	
}

// Show the month div container
function displayMonth() {
	showDiv( 'monthContainer' );
	hideDiv( 'weekContainer' );
}

// Generate month and fill div container
function genMonth( month , year , inst ) {
	var monthCont = document.getElementById("monthContainer");
	monthCont.innerHTML = '<img src="images/ajaxLoading.gif" border="0" />';
	var ajax = new Ajax.Request('/ajax/schedGenMonth.php',
		{
			method: 'get',
			parameters: {
				m: month,
				y: year,
				i: inst
			},
			onSuccess: function(transport) {
				var response = transport.responseText;
				
				if( response == '1' ) {
					alert("Schedule is not working right now.");
				}
				else if( response == '2' ) {
					alert("You must log in to see the schedule.");
				}
				else {
					curInst = inst;
					monthCont.innerHTML = response;
				}
				
			},
			onFailure: function() {
				alert("Something went wrong...");
			}
		}
	);
}

// This starts the drag - mdyt = month day year time ex: 6:11:2008:20
function dragOver( whichLayer , mdyt , reservable ) {
	if( reservable ) {
		if( !dragging && !inArray(mdyt,allDragArray) ) {
			dragging = 1;
			var innerHTML = "<div ";
			
			if( disableMode )
				innerHTML += "class=\"cal_disabled_user_tb\"";
			else
				innerHTML += "class=\"cal_reserved_user_tb\"";
				
			innerHTML += "></div><div ";
			
			if( disableMode )
				innerHTML += "class=\"cal_disabled_user\"";
			else
				innerHTML += "class=\"cal_reserved_user\"";
			
			innerHTML += " style=\"cursor:pointer;font-size:80%;\">";
			
			// The text displayed
			if( disableMode ) {
				innerHTML += "DISABLED";
			} else {
				innerHTML += time+": "+usersName;
			}
			
			innerHTML = innerHTML + "</div><div ";
			
			if( disableMode )
				innerHTML += "class=\"cal_disabled_user_tb\"";
			else
				innerHTML += "class=\"cal_reserved_user_tb\"";
				
			innerHTML += "></div>";
			
			
			whichLayer.innerHTML = innerHTML;
			numLayers = 1;
			currentDragArray[currentDragArray.length] = mdyt;
			allDragArray[allDragArray.length] = mdyt;
			prevLayer = whichLayer;
			prevTime = time;
		}
		else if( dragging && prevLayer != whichLayer && !inArray(mdyt,allDragArray)) {
			var innerHTML = "";
			if( numLayers < 2 ) {
				if( disableMode )
					innerHTML = "<div class=\"cal_disabled_user_tb\"></div>";
				else
					innerHTML = "<div class=\"cal_reserved_user_tb\"></div>";
			}
			
			innerHTML += "<div ";
			
			if( disableMode )
				innerHTML += "class=\"cal_disabled_user\"";
			else
				innerHTML += "class=\"cal_reserved_user\"";
			
			innerHTML += "style=\"cursor:pointer;font-size:80%;\">";
			
			// The text displayed
			if( disableMode ) {
				innerHTML += "DISABLED";
			} else {
				innerHTML += prevTime+": "+usersName;
			}
			
			innerHTML += "</div>";
			
			prevLayer.innerHTML = innerHTML;
			
			////////////////////////
			
			innerHTML = "<div ";
			
			if( disableMode )
				innerHTML += "class=\"cal_disabled_user\"";
			else
				innerHTML += "class=\"cal_reserved_user\"";
			
			innerHTML += "style=\"cursor:pointer;font-size:80%;\">";
			
			// The text displayed
			if( disableMode ) {
				innerHTML += "DISABLED";
			} else {
				innerHTML += time+": "+usersName;
			}
			
			innerHTML += "</div>";
			
			innerHTML += "<div ";
			
			if( disableMode )
				innerHTML += "class=\"cal_disabled_user_tb\"";
			else
				innerHTML += "class=\"cal_reserved_user_tb\"";
				
			innerHTML += "></div>";
			
			whichLayer.innerHTML = innerHTML;
			
			currentDragArray[currentDragArray.length] = mdyt;
			allDragArray[allDragArray.length] = mdyt;
			prevLayer = whichLayer;
			prevTime = time;
			numLayers++;
		}
	}
	time = "";
}

// This prevents the manager from clicking a time slot when not in disable mode
function manDragOver( whichLayer , mdyt ) {
	if( disableMode ) {
		dragOver( whichLayer , mdyt , 1 )
	}
}

// This continues the drag
function dragMouseOver( whichLayer , mdyt , reservable ) {
	if( reservable ) {
		if( dragging == 1 ) {
			time = whichLayer.innerHTML;
			dragOver( whichLayer , mdyt , reservable );
		}
		else {
			if( !inArray(mdyt,allDragArray) ) {
				time = whichLayer.innerHTML;
				whichLayer.innerHTML='reserve';
				whichLayer.style.cursor='pointer';
			}
		}
	}
}

// This stops the drag
function stopDrag() {
	if( currentDragArray.length > 0 ) {
		// Reserve
		reserving = 1;
		for( i = 0 ; i < currentDragArray.length ; i++ ) {
			
			var mdyt = currentDragArray[i];
			var array = mdyt.split(":");
			var month = array[0];
			var day = array[1];
			var year = array[2];
			var hour = array[3];
			var type = 'none';
			if( disableMode ) type = 'Disabled';
			
			var ajax = new Ajax.Request('/ajax/schedReserve.php',
				{
					method: 'get',
					parameters: {
						m: month,
						y: year,
						d: day,
						h: hour,
						i: curInst,
						t: type
					},
					onSuccess: function(transport) {
						var response = transport.responseText;
						
						if( response == '1' ) {
							alert("Schedule is not working right now.");
						}
						else if( response == '2' ) {
							alert("You must log in to see the schedule.");
						}
						else if( response == '3' ) {
							alert("You do not have access to this instrument.");
						}
						else if( response == '4' ) {
							alert("This hour has been reserved since you loaded this page.");
						}
						else if( response == '0' ) {
							// Reserved
							reserving = 0;
						}
						
					},
					onFailure: function() {
						alert("Something went wrong...");
					}
				}
			);
		}		
	}
	dragging = 0;
	numLayers = 0;
	time = "";
	currentDragArray = [];
}

// This replaces the time when it's not reserved
function mouseOut( whichLayer , mdyt , reservable ) {
	if( reservable && time != "" ) {
		if( dragging == 0 && !inArray(mdyt,allDragArray) ) whichLayer.innerHTML = time;
	}
}

// Cancel reservation
function cancelRes( whichLayer , mdyt ) {
	if( reserving ) return;
	if( inArray(mdyt,allDragArray) ) {
		
		var array = mdyt.split(":");
		var month = array[0];
		var day = array[1];
		var year = array[2];
		var hour = array[3];
		
		// Check if this user can cancel this reservation
		var ajax = new Ajax.Request('/ajax/schedCanCancelRes.php',
			{
				method: 'get',
				parameters: {
					m: month,
					y: year,
					d: day,
					h: hour,
					i: curInst
				},
				onSuccess: function(transport) {
					var response = transport.responseText;
					
					if( response == '1' ) {
						alert("Schedule is not working right now.");
					}
					else if( response == '2' ) {
						alert("You must log in to see the schedule.");
					}
					else if( response == '3' ) {
						// You can not cancel a reservation in the past
					}
					else if( response == '4' ) {
						// You can not cancel other person's reservation
					}
					else if( response == '5' ) {
						alert("You cannot cancel this close to the reserved time(5 days). Please contact NCF to cancel.");
					}
					else if( response == '0' ) {
						var con = confirm("Are you sure you want to cancel this reservation?");
						if(!con) return;
						
						var ajax2 = new Ajax.Request('/ajax/schedCancelRes.php',
							{
								method: 'get',
								parameters: {
									m: month,
									y: year,
									d: day,
									h: hour,
									i: curInst
								},
								onSuccess: function(transport) {
									var response = transport.responseText;
									
									if( response == '1' ) {
										alert("Schedule is not working right now.");
									}
									else if( response == '2' ) {
										alert("You must log in to see the schedule.");
									}
									else if( response == '0' ) {
										// Cancelled
										rem = arrayElement(mdyt,allDragArray);
										allDragArray.splice(rem,1);
										whichLayer.innerHTML = formatHourString(hour);
									}
									
								},
								onFailure: function() {
									alert("Something went wrong...");
								}
							}
						);
					}
					
				},
				onFailure: function() {
					alert("Something went wrong...");
				}
			}
		);
	}
}

// Format the hour to display am/pm
function formatHourString(hour) {
	if( hour < 12 ) {
		if( hour == 0 ) return '12am';
		else return hour + 'am';
	}
	else {
		if( hour == 12 ) return '12pm';
		else return hour-12 + 'pm';
	}
}

function toggle24Hour( button ) {
	if( view24Hour == 0 ) {
		for( i = 0 ; i < 7 ; i++ ) {
			var day = "";
			switch(i) {
				case 0: day = 'sun'; break;
				case 1: day = 'mon'; break;
				case 2: day = 'tue'; break;
				case 3: day = 'wed'; break;
				case 4: day = 'thu'; break;
				case 5: day = 'fri'; break;
				case 6: day = 'sat'; break;
			}
			
			showDiv( day + "top" );
			showDiv( day + "bottom" );
		}
		
		showDiv( "leftbordertop" );
		showDiv( "leftborderbottom" );
		
		button.className='cal_24hour_view_active';
		view24Hour = 1;
	}
	else {
		for( i = 0 ; i < 7 ; i++ ) {
			var day = "";
			switch(i) {
				case 0: day = 'sun'; break;
				case 1: day = 'mon'; break;
				case 2: day = 'tue'; break;
				case 3: day = 'wed'; break;
				case 4: day = 'thu'; break;
				case 5: day = 'fri'; break;
				case 6: day = 'sat'; break;
			}
			hideDiv( day + "top" );
			hideDiv( day + "bottom" );
		}
		
		hideDiv( "leftbordertop" );
		hideDiv( "leftborderbottom" );
		
		button.className='cal_24hour_view';	
		view24Hour = 0;
	}	
}

function toggleDisableMode( button ) {
	if( disableMode == 0 ) {		
		button.className='cal_24hour_view_active';
		disableMode = 1;
	}
	else {
		button.className='cal_24hour_view';	
		disableMode = 0;
	}
}
	
// true if value is in array, false otherwise
function inArray( value , array ) {
	for( i = 0 ; i < array.length ; i++ ) {
		if( value == array[i] ) return true;
	}
	return false;
}

// Returns the element number of value in array
function arrayElement( value , array ) {
	for( i = 0 ; i < array.length ; i++ ) {
		if( value == array[i] ) return i;
	}
	return -1;
}

var optionsLocked = false;
// Popup the manager options box for making/changing reservations
function popupManOptions( parentLayer , childLayer , mdyt ) {
	
	// If disablemode is on, don't show popup div
	if( disableMode ) {
		dragMouseOver( document.getElementById(parentLayer) , mdyt , 1 );
	}
	else {
		if( optionsLocked ) return;
		if( manOpAjaxProc ) manOpAjax.abort();
		
		chi = document.getElementById( childLayer );
		par = document.getElementById( parentLayer );
		
		offLeft = offTop = 0;
		
		do {
			offLeft += par.offsetLeft;
			offTop  += par.offsetTop;
		} while (par = par.offsetParent);
		
		// Size of reservation container
		offLeft += 45;
		offTop += 14;
		
		/*if( getBrowser() == "Explorer" ) {
			fix = document.getElementById('schedLayer');
			do {
				offLeft -= fix.offsetLeft;
				offTop  -= fix.offsetTop;
			} while(fix = fix.offsetParent);
		}*/
	
		chi.style.left = offLeft + "px";
		chi.style.top  = offTop + "px";
		
		chi.innerHTML = '<img src="images/ajaxLoading.gif" border="0" />';
		
		showDiv( childLayer );
		
		var array = mdyt.split(":");
		var month = array[0];
		var day = array[1];
		var year = array[2];
		var hour = array[3];
		
		manOpAjaxProc = true;
		manOpAjax = new Ajax.Request('/ajax/schedManOptions.php',
			{
				method: 'get',
				parameters: {
					m: month,
					y: year,
					d: day,
					h: hour,
					i: curInst,
					l: parentLayer
				},
				onSuccess: function(transport) {
					var response = transport.responseText;
					
					if( response == '1' ) {
						alert("Schedule is not working right now.");
					}
					else {
						chi.innerHTML = response;
					}
					
					manOpAjaxProc = false;
					
				},
				onComplete: function() {
					if (Ajax.activeRequestCount < 0) {
						Ajax.activeRequestCount = 0;
					}	
				},
				onFailure: function() {
					alert("Something went wrong...");
				}
			}
		);
	}
}

// Lock the manager's box so they must press X to close
function lockManOptions() {
	optionsLocked = true;
}

// Unlock the manager's box when they press X
function unlockManOptions() {
	optionsLocked = false;	
}

// Change reservation
function changeRes( whichLayer , resUserElem , resTypeElem , mdyt ) {
	user = document.getElementById(resUserElem).value;
	resT = document.getElementById(resTypeElem);
	typei = resT.selectedIndex;
	type = resT.options[typei].text;
	trainer = 0;
	if( type == "Regular" ) type = 'none';
	else if( type == "Training" ) {
		trainer = document.getElementById('resTrainer').value;	
	}
	
	var array = mdyt.split(":");
	var month = array[0];
	var day = array[1];
	var year = array[2];
	var hour = array[3];
	
	// Check if this user can cancel this reservation
	var ajax = new Ajax.Request('/ajax/schedChangeRes.php',
		{
			method: 'get',
			parameters: {
				m: month,
				y: year,
				d: day,
				h: hour,
				i: curInst,
				u: user,
				t: type,
				tr: trainer
			},
			onSuccess: function(transport) {
				var response = transport.responseText;
				
				if( response == '1' ) {
					respDiv = document.getElementById('changeResResp');
					respDiv.style.color = "red";
					respDiv.innerHTML = "Schedule is not working right now.";
					showDiv('changeResResp');
				}
				else if( response == '2' ) {
					respDiv = document.getElementById('changeResResp');
					respDiv.style.color = "red";
					respDiv.innerHTML = "You did not supply a valid user ID.";
					showDiv('changeResResp');
				}
				else {
					// Reponse div
					respDiv = document.getElementById('changeResResp');
					respDiv.style.color = "green";
					respDiv.innerHTML = "Reservation changed.";
					showDiv('changeResResp');
					
					// Reservation div
					out = formatHourString(hour)+": "+response;
					if( type == "none" ) {
						divClass = "cal_reserved_user";
					}
					else if( type == "Training" ) {
						divClass = "cal_training_user";
					}
					else if( type == "Assisted" ) {
						divClass = "cal_assisted_user";
					}
					else {
						out = "DISABLED";
						divClass = "cal_disabled_user";
					}
					
					resDiv = document.getElementById(whichLayer);
					resDiv.innerHTML = "<div class=\""+divClass+"_tb\"></div><div class=\""+divClass+"\" style=\"cursor:pointer;font-size:80%;\">"+out+"</div><div class=\""+divClass+"_tb\"></div>";
				}
				
			},
			onFailure: function() {
				alert("Something went wrong...");
			}
		}
	);
}

// Manager make reservation
function makeRes( whichLayer , resUserElem , resTypeElem , mdyt ) {
	user = document.getElementById(resUserElem).value;
	resT = document.getElementById(resTypeElem);
	typei = resT.selectedIndex;
	type = resT.options[typei].text;
	trainer = 0;
	if( type == "Regular" ) type = 'none';
	else if( type == "Training" ) {
		trainer = document.getElementById('resTrainer').value;	
	}
	
	var array = mdyt.split(":");
	var month = array[0];
	var day = array[1];
	var year = array[2];
	var hour = array[3];
	
	// Check if this user can cancel this reservation
	var ajax = new Ajax.Request('/ajax/schedReserve.php',
		{
			method: 'get',
			parameters: {
				m: month,
				y: year,
				d: day,
				h: hour,
				i: curInst,
				u: user,
				t: type,
				tr: trainer
			},
			onSuccess: function(transport) {
				var response = transport.responseText;
				
				if( response == '1' ) {
					respDiv = document.getElementById('makeResResp');
					respDiv.style.color = "red";
					respDiv.innerHTML = "Schedule is not working right now.";
					showDiv('makeResResp');
				}
				else if( response == '2' ) {
					respDiv = document.getElementById('makeResResp');
					respDiv.style.color = "red";
					respDiv.innerHTML = "You did not supply a valid user ID.";
					showDiv('makeResResp');
				}
				else if( response == '4' ) {
					respDiv = document.getElementById('makeResResp');
					respDiv.style.color = "red";
					respDiv.innerHTML = "This time slot has been reserved since the last time you reloaded the week.";
					showDiv('makeResResp');
				}
				else {
					// Add to list of reservations
					allDragArray[allDragArray.length] = mdyt;
					
					// Reponse div
					respDiv = document.getElementById('makeResResp');
					respDiv.style.color = "green";
					respDiv.innerHTML = "Reservation made.";
					showDiv('makeResResp');
					
					// Reservation div
					out = formatHourString(hour)+": "+response;
					if( type == "none" ) {
						divClass = "cal_reserved_user";
					}
					else if( type == "Training" ) {
						divClass = "cal_training_user";
					}
					else if( type == "Assisted" ) {
						divClass = "cal_assisted_user";
					}
					else {
						out = "DISABLED";
						divClass = "cal_disabled_user";
					}
					
					resDiv = document.getElementById(whichLayer);
					resDiv.innerHTML = "<div class=\""+divClass+"_tb\"></div><div class=\""+divClass+"\" style=\"cursor:pointer;font-size:80%;\">"+out+"</div><div class=\""+divClass+"_tb\"></div>";
				}
				
			},
			onFailure: function() {
				alert("Something went wrong...");
			}
		}
	);
}

function schedSearchUsers(input) {
	//var input = document.getElementById('schedEmailSearch').value;
	
	var emailRegex = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
	if(!input.match(emailRegex))
		return false;

	var ajax = new Ajax.Request('/ajax/adminSearchUsers.php',
		{
			method: 'get',
			parameters: {
				email: input
			},
			onSuccess: function(transport) {
				var response = transport.responseText || "no response";
				
				if(response != '0') {
					var resp = eval('(' + response + ')');
				
					//var respDiv = document.getElementById('schedSearchUsersRes');
					
					//respDiv.innerHTML = "Name: " + resp.first + " " + resp.last + "<br />ID: " + resp.ID;
					
					var idField = document.getElementById('resUser');
					
					idField.value = resp.ID;
					
					$('resUserCheck').style.display = "inline";
					
					//showDiv('schedSearchUsersRes');
				}
				else {
					//hideDiv('schedSearchUsersRes');
				}
			},
			onFailure: function() {
				alert("Something went wrong...");
			}
		}
	);
	
}

function schedSearchTrainers(input) {
	//var input = document.getElementById('schedTrainerEmailSearch').value;
	
	var emailRegex = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
	if(!input.match(emailRegex))
		return false;
	
	var ajax = new Ajax.Request('/ajax/adminSearchUsers.php',
		{
			method: 'get',
			parameters: {
				email: input
			},
			onSuccess: function(transport) {
				var response = transport.responseText || "no response";
				
				if(response != '0') {
					var resp = eval('(' + response + ')');
				
					//var respDiv = document.getElementById('schedSearchTrainersRes');
					
					//respDiv.innerHTML = "Name: " + resp.first + " " + resp.last + "<br />ID: " + resp.ID;
					
					var idField = document.getElementById('resTrainer');
					
					idField.value = resp.ID;
					
					$('resTrainerCheck').style.display = "inline";
					
					//showDiv('schedSearchTrainersRes');
				}
				else {
					//hideDiv('schedSearchTrainersRes');
				}
			},
			onFailure: function() {
				alert("Something went wrong...");
			}
		}
	);
	
}

/**
 * Ajax.Request.abort
 * extend the prototype.js Ajax.Request object so that it supports an abort method
 */
Ajax.Request.prototype.abort = function() {
    // prevent and state change callbacks from being issued
    this.transport.onreadystatechange = Prototype.emptyFunction;
    // abort the XHR
    this.transport.abort();
    // update the request counter
    Ajax.activeRequestCount--;
};