// JavaScript Document

jQuery(function go($){
	var shift = false;
	
	$.fn.addslashes = function addslashes(str) {
		str=str.replace(/\\/g,'\\\\');
		str=str.replace(/\'/g,'\\\'');
		str=str.replace(/\"/g,'\\"');
		str=str.replace(/\0/g,'\\0');
		return str;
	};

	$.fn.stripslashes = function stripslashes(str) {
		str=str.replace(/\\'/g,'\'');
		str=str.replace(/\\"/g,'"');
		str=str.replace(/\\0/g,'\0');
		str=str.replace(/\\\\/g,'\\');
		return str;
	};

	$.fn.email_form = function email_form(aid) {
		var emailForm = ''; 
		emailForm += '<form action="/admin/assignments/email.php" name="email_form" id="email_form" method="post">';
		emailForm += '<label class="column span-2">To: </label>';
		emailForm += '<span class="column span-8 last"><input type="checkbox" name="interpreters" /> Interpreters <input type="checkbox" name="contact" /> Assignment requester</span></span><span class="clear"></span>';
		emailForm += '<label class="column span-2">Subject: </label> ';
		emailForm += '<span class="column span-8 last"><input name="subject" rows="30" class="text" style="width: 300px;" /></span></span><span class="clear"></span>';
		emailForm += '<label class="column span-2">Message:</label>';
		emailForm += '<span class="column span-8 last"><textarea name="body" rows="30" cols="3" style="width: 300px;"></textarea></span><span class="clear"></span>';
		emailForm += '<input type="hidden" name="aid" value="' + aid + '">';
		emailForm += '</form>';
		emailActions = '<button onclick="javascript: $(\'#email_form\').submit()">Send Message</button> <button onclick="javascript: $.fn.disablePopup()">Cancel</button>';
		$('#popup-contents').hide();
		$('#popup-contents').html(emailForm);
		
		$('#popup-actions').html(emailActions);
		$.fn.showPopupForm();
		$('#popup-contents').slideDown();
		$('#email_form').ajaxForm(function(data){
			$.fn.disablePopup();
			$('#email-history').prepend(data);
		});
	};
	
	/*
	 * Generic e-mail function
	 */
	$.fn.email = function email(aid,recipients,type) {
		$.post('/admin/include/email.php',{
			aid : aid,
			recipients : recipients,
			type : type
		},function(data) {
			$('#email-history').prepend(data);
		});
	};
	
	$.fn.view_email = function view_email(eid) {
		windowContents = '<iframe src="/admin/assignments/view_email.php?message_id=' + eid + '" frameborder="0">Unable to display message body.</iframe>';
		$('#popup-contents').html(windowContents);
		windowActions = '<button onclick="javascript: $.fn.disablePopup()">Close</button>';
		$('#popup-actions').html(windowActions);
		$.fn.showPopupForm(function(){},650);
	};
	
	/*
	 * Assignment action buttons
	 * 
	 * @param action Array of actions
	 */
	$.fn.assignment_load_actions = function assignment_load_actions(action,aid) {
		if ( aid === undefined ) {
			aid = '';
		}
		action_links = '';
		for ( i in action ) {
			action_links += '<span class="action" id="' + action[i].toLowerCase() + '" onclick="javascript:$.fn.assignment_' + action[i].toLowerCase() + '(\'' + aid + '\');"><img src="/admin/img/icons/' + action[i].toLowerCase() + '.png" class="icon" /> ' + action[i] + '</span> ';
		}
		$('#assignment-details').prepend('<div id="actions">' + action_links + '</div>');
	};
	
	$.fn.adjust_travel_log = function adjust_travel_log(aid, uid) {
		$.post('/admin/assignments/travel_log.php', {
			aid : aid,
			uid : uid
		}, function (data) {
			var popup_actions = '<button onclick="$.fn.submit_travel_log(0);">Submit travel log</button> <button onclick="$.fn.disablePopup();">Cancel</button>';
			
			$('#popup-contents').html(data);
			$('#popup-actions').html(popup_actions);
		});
		$.fn.showPopupForm();
		return false;
	};
	
	/**
	 * Assignment Completion
	 * 
	 * @param aid id of the assignment
	 * @param uid id of the user
	 */
	$.fn.assignment_mark_complete = function assignment_mark_complete(aid, uid, travel_log) {
		if ( parseInt(travel_log) ) {
			$.post('/admin/assignments/travel_log.php', {
				aid : aid,
				uid : uid
			}, function(data) {
				var popup_actions = '<button onclick="$.fn.submit_travel_log(1);">Submit travel log</button> <button onclick="$.fn.disablePopup();">Cancel</button>';
				
				$('#popup-contents').html(data);
				$('#popup-actions').html(popup_actions);
			});
			$.fn.showPopupForm();
		} else {
			$.fn.assignment_submit_complete(aid);
		}
		return false;
	};
	
	$.fn.submit_travel_log = function submit_travel_log(invoice) {
		post_vars = new Object({ action : 'submit_travel_log' });
		
		$('#travel_log input').each(function(){
			post_vars[$(this).attr('name')] = $(this).val();
		});
		
		$('#travel_log select option:selected').each(function(){
			post_vars[$(this).parent('select').attr('name')] = $(this).val();
		});
		
		$.post('/admin/assignments/assignment_actions.php', post_vars, function(data){
			
			if ( invoice ) {
				$.fn.assignment_submit_complete($('#travel_log input[name="aid"]').val());
			}
			
			$.fn.disablePopup();
		});
	};
	
	$.fn.assignment_submit_complete = function assignment_submit_complete(aid) {
		$.post('/admin/assignments/assignment_actions.php', {
			action : 'submit_complete',
			aid : aid
		}, function(data) {
			if( data.complete ) {
				$('#' + data.aid).fadeOut('1000', function(){
					$(this).remove();
					$.fn.show_message('Assignment marked complete.');
					
					if( $('#assignments-' + data.month) ) {
						$.post('/admin/assignments/single_row.php', {
							aid : data.aid
						}, function(single_row) {
							if ( $('#' + data.month + '-empty') ) {
								$('#' + data.month + '-empty').fadeOut(1000);
							}
							$('#assignments-' + data.month + ' tr:first').after(single_row);
						});
					}
				});
			}
		}, 'json');
	};

	$.fn.remove_invoice = function remove_invoice(aid, uid) {
		$.post('/admin/assignments/remove_invoice.php', {
			aid : aid,
			uid : uid
		}, function(data) {
			if( data.complete ) {
				$('#' + aid).fadeOut(1000, function(){
					$(this).remove();
					$.fn.show_message('Assignment marked incomplete.');
					
					$.post('/admin/assignments/single_row.php', {
						aid : aid
					}, function(single_row) {
						function mysqlTimeStampToDate(timestamp) {
								    //function parses mysql datetime string and returns javascript Date object
							//input has to be in this format: 2007-06-05 15:26:02
							var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
							var parts=timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
							return new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
						}
						
						assignmentdate = mysqlTimeStampToDate(data.datetime_start);
						rightnow = new Date();

						if ( rightnow.getTime() > assignmentdate.getTime()) { 
							relativeDate = 'past';
						} else {
							relativeDate = 'upcoming';
						}

						if ( $('#' + relativeDate + '-empty') ) {
							$('#' + relativeDate + '-empty').hide();
						}
						$('#assignments-' + relativeDate + ' tr:last').after(single_row);

					});
				});
			}
		}, 'json');
	};

	$.fn.admin_remove_invoice = function admin_remove_invoice(aid, uid) {
		$.post('/admin/assignments/assignment_actions.php', {
			action : 'remove_invoice',
			aid : aid,
			uid : uid
		}, function(data) {
			$.fn.assignment_view_list();
		});
	};

	$.fn.assignment_view_list = function assignment_view_list() {
		$.post('/admin/assignments/assignment_actions.php', {
			action : 'd'
		}, function(data) {
			$('#stage').html(data);
		});
	};
	
	/**
	 * Assignment Save function.
	 * 
	 * @return
	 */
	$.fn.assignment_save = function assignment_save() {
		var errors = false;
		$('.required').each(function(){
			if ( $(this).val() == '' ) {
				$(this).addClass('error');
				errors = true;
			} else {
				$(this).removeClass('error');
			}
		});
		
		if ( errors ) {
			$('#messages').html('Please fill in all required fields.').attr('class','notice').slideDown('medium');
		} else {
			$('#messages').slideUp();
			savevars = {
				date_start : $('#input_date').val().substr(6,4) + '-' + $('#input_date').val().substr(0,2) + '-' + $('#input_date').val().substr(3,2),
				time_start : $('#input_time_start').val().replace(/(\d+)?([:\d]*)?\s*/,'$1$2:00 ').replace(/([\d+:]{2})?:00/,'$1'),
				time_end : $('#input_time_end').val().replace(/(\d+)?([:\d]*)?\s*/,'$1$2:00 ').replace(/([\d+:]{2})?:00/,'$1'),
				hr_type : eval('new Object(' + $('#input_hr_type').attr('rel') + ')').id,
				company_id : eval('new Object(' + $('#input_company_id').attr('rel') + ')').id,
				contact_id : ( $('#input_contact_id').attr('rel') ) ? eval('new Object(' + $('#input_contact_id').attr('rel') + ')').id : '',
				contact_name : $('#input_contact_id').val(),
				contact_email : ( $('#input_contact_email').val() ) ? $('#input_contact_email').val() : '',
				contact_phone : ( $('#input_contact_phone').val() ) ? $('#input_contact_phone').val() : '',
				client_id : ( $('#input_client_id').attr('rel') ) ? eval('new Object(' + $('#input_client_id').attr('rel') + ')').id : '',
				client_name : $('#input_client_id').val(),
				request_time : $('#input_request_time').val(),
				description : $('#textarea_description').val(),
				address_id : eval('new Object(' + $('#input_address_id').attr('rel') + ')').id,
				travel_log : ( $('#checkbox_travel_log:checked').val() ) ? 1 : 0,
				emergency : ( $('#checkbox_emergency:checked').val() ) ? 1 : 0,
				wn24 : ( $('#checkbox_wn24:checked').val() ) ? 1 : 0,
				recurring_dates : $('#hidden_recurring_dates').attr('rel').substr(1)
			};
			errorcheck();
		}
	};
	
	$.fn.assignment_delete = function assignment_delete(aid) {
		if ( $('#recur').attr('id') ) {
			popup_contents = '<ul><li>Really delete this assignment?<br /><em><input type="radio" value="0" name="delete_recur" checked="checked"> This assignment only <input type="radio" value="1" name="delete_recur"> All future or new recurrences</em></li></ul>';
		} else {
			popup_contents = '<ul><li>Really delete this assignment?</li></ul>';
		}
		$('#popup-contents').html(popup_contents);
		$('#popup-actions').html('<button type="button" onclick="javascript:$.fn.delete_confirm();">Yes</button> <button type="button" onclick="javascript:$.fn.disablePopup();">No</button>');
		$.fn.showPopupForm();
		
		$.fn.delete_confirm = function () {
			deletevars = {
				action: 'delete',
				aid : aid
			};
			
			if ( $('input[name="delete_recur"]:checked').val() == 1 ) {
				deletevars.recur = true;
			}
			
			$.post('/admin/assignments/assignment_actions.php',deletevars,function(data){
				window.location.href= '/admin/assignments.php?ui=admin&a=d';
			});
		};
	};

	/*
	 * View single assignment
	 */
	$.fn.assignment_view_single = function assignment_view_single(aid,ui) {
		$.post('/admin/assignments/assignment_actions.php', {
			action : 'view_single',
			aid : aid,
			ui : ui
		}, function ajax_return(data) {
			$('#assignment-details').html('<ul id="assignment-details-list">').removeClass('edit');
			$('.assignment-flags').show();
			
			for ( key in data.fields ) {
				if ( data.fields[key].access_restrict != ui && data.fields[key].value !== undefined ) {
					label = '<label class="column span-3">' + data.fields[key].name + ':</label>';
					rel = ( data.fields[key].rel === undefined ) ? '' : data.fields[key].rel;
					// Build inputs & textareas
					field = data.fields[key].value.replace(/\n/g,'<br />');
					
					section_begin = ( data.fields[key].section_begin !== undefined ) ? 'class="section-begin"' : ''; 
					form_item = '<li id="' + key + '" ' + section_begin + '>' + label + '<span class="column span-6 last">' + field + '</span><span class="clear"></span></li>';
					$('#assignment-details #assignment-details-list').append(form_item);
				}
			}
			if ( data.recur == true ) {
				$('#date span[class!="clear"]').append(' <img src="/admin/img/icons/recur.png" title="This is a recurring assignment" class="icon" id="recur" />');
			}
			
			// Load action buttons for admin or interpreter UI
			if ( ui == 'admin' ) {
				$.fn.assignment_load_actions(Array('Edit','Delete'),aid);
				for ( key in data.flags ) {
					if ( data.flags[key] == true ) {
						$('#' + key).addClass('on');
					}
				}
			} else {
//				$.fn.assignment_load_actions(Array('Print'),aid);
			}

			$('.assignment-flags li.toggle').hover(function(){
				$(this).css('color','#000');
			}, function(){
				$(this).css('color','#333');
			}).mousedown(function flags_toggle(){
				
				$.fn.cancel_confirm = function cancel_confirm(flag) {
					var post_vars = new Object({aid : aid, action : flag.attr('id')});
					post_vars.recur = ( $('input[name="cancel_recur"]:checked').val() !== undefined ) ? $('input[name="cancel_recur"]:checked').val() : 0 ;
					
					switch(flag.attr('id')) {
						case 'cancel': case 'cancel_shortnotice':
							var interpreters_list = new Array();
							$('.interpreter').each(function(){
								interpreters_list.push(eval('new Object(' + $(this).attr('rel') + ')').id);
							});
							post_vars.interpreters_list = interpreters_list.join('&');
							if ( flag.hasClass('on') === false ) {
								post_vars.cancellation_details = $.fn.addslashes($('textarea[name="cancellation_details"]').val());
								$.post('/admin/assignments/flags.php',post_vars, function(data){
									if ( $('input[name="notify"]:checked').val() == 1 ) {
										$.fn.email(aid,interpreters_list.join('&'),'canceled');
									}
								}, 'json');
							} else {
								post_vars.cancellation_details = '';
								$.post('/admin/assignments/flags.php',post_vars, function(data){
									if ( $('input[name="notify"]:checked').val() == 1 ) {
										$.fn.email(aid,interpreters_list.join('&'),'canceled');
									}
								}, 'json');
							}
							break;
						case 'complete':
							uid = eval('new Object(' + flag.attr('rel') + ')').uid;
							if ( flag.hasClass('on') !== true ) {
								$.fn.assignment_mark_complete(aid,uid);
							} else {
								$.fn.remove_invoice(aid,uid);
							}
							$.post('/admin/assignments/flags.php',post_vars, function(){}, 'json');
							break;
						default :
							$.post('/admin/assignments/flags.php',post_vars, function(){}, 'json');
					}
					( flag.hasClass('on') ) ? flag.removeClass('on') : flag.addClass('on');
				};
				
				// Cancel confirm (includes recurrence check)
				if ( $(this).attr('id') == 'cancel' || $(this).attr('id') == 'cancel_shortnotice' ) {
					recurring = ( $('#recur').attr('id') ) ? '1' : '0';
					if ( $(this).hasClass('on') ) {
						if ( $('#recur').attr('id') ) {
							popup_contents = '<ul><li>Really reinstate this assignment?<br /><em><input type="radio" value="0" name="cancel_recur" checked="checked"> This assignment only <input type="radio" value="1" name="cancel_recur"> All future or new recurrences</em></li></ul>';
						} else {
							popup_contents = '<ul><li>Really reinstate this assignment?</li></ul>';
						}
						$('#popup-contents').html(popup_contents);
						$('#popup-actions').html('<button type="button" onclick="javascript:$.fn.cancel_confirm( $(\'#' + $(this).attr('id') + '\') );$.fn.disablePopup();">Yes</button> <button type="button" onclick="javascript:$.fn.disablePopup();">No</button>');
						$.fn.showPopupForm();
					} else {
						$.post('/admin/assignments/assignment_cancel.php',{ aid : aid, cancel_text : $(this).text(), cancel_type : $(this).attr('id'), recurring : recurring }, function(data){
							$('#popup-contents').html(data);
							$('#popup-actions').html('<button type="button" onclick="javascript:$.fn.cancel_confirm( $(\'#' + $('input[name="cancel_type"]').val() + '\'));$.fn.disablePopup();">Submit</button> <button type="button" onclick="javascript:$.fn.disablePopup();">Cancel</button>');
							$.fn.showPopupForm();
						});
					}
				} else {
					$.fn.cancel_confirm($(this));
				}
				
			});
		}, 'json');
	};
	
	/*
	 * Add assignment
	 */
	$.fn.assignment_add = function assignment_add() {
		$.post('/admin/assignments/assignment_actions.php', {
			action : 'add'
		}, function(data) {
			$.fn.build_assignment_form(data);
			$.fn.assignment_load_actions(Array('Save','Cancel'));
			$('#assignment-details').append($('#actions'));
			
			$.fn.assignment_cancel = function() {
				window.location.href = '/admin/assignments.php?ui=admin&a=d';
			};
			$('.assignment-flags').hide();

			errorcheck = function() {
				var interpreter_ids = '';
				$('[id*="input_interpreter_ids"][rel!=""]').each(function() {
					interpreter_ids += '&' + eval('new Object(' + $(this).attr('rel') + ')').id;
				});
				
				savevars.interpreter_ids = interpreter_ids.substring(1);
				savevars.action = 'save';
				if ( $('#hidden_recurring_dates').attr('rel') == '' ) {
					popup_html = '<ul><li>E-mail interpreter(s)?</li></ul>';
					popup_actions = '<button onclick="javascript:$.fn.email_interpreter(1)">Yes</button> <button onclick="javascript:$.fn.email_interpreter(0)">No</button>';
					$('#popup-contents').html(popup_html);
					$('#popup-actions').html(popup_actions);
					$.fn.showPopupForm();
					
					$.fn.email_interpreter = function email_interpreter(i) {
						savevars.send_email = i;
						$.post('/admin/assignments/assignment_actions.php',savevars,function(data){
							$('#popup-contents').html(data);
						});
						$.fn.disablePopup();
					};
				} else {
					popup_html = '<ul><li>Schedule interpreter(s) for all assignments in this series?</li></ul>';
					popup_actions = '<button onclick="javascript:$.fn.recur_interpreter(1)">Yes</button> <button onclick="javascript:$.fn.recur_interpreter(0)">No</button>';
					$('#popup-contents').html(popup_html);
					$('#popup-actions').html(popup_actions);
					$.fn.showPopupForm();
					
					$.fn.recur_interpreter = function (i) {
						savevars.recur_interpreter = i;
						$.post('/admin/assignments/assignment_actions.php',savevars,function(data){
							$('#popup-contents').html(data);
						});
						$.fn.disablePopup();
					};
				}
			};
			$('.assignment-flags li.off').fadeTo(0,.5).hover(function() {
				$(this).fadeTo(0,1);
			}, function() {
				$(this).fadeTo(0,.5);
			});
		}, 'json');
		
		
	};

	/*
	 * Edit assignment
	 */
	$.fn.assignment_edit = function assignment_edit(aid) {
		$.post('/admin/assignments/assignment_actions.php', {
			action : 'edit',
			aid: aid
		}, function(data) {
			$.fn.build_assignment_form(data);
			$.fn.assignment_load_actions(Array('Save','Cancel'),aid);
			$('#assignment-details').append($('#actions'));
			
			$.fn.assignment_cancel = function(aid) {
				$.fn.assignment_view_single(aid,'admin');
			};
			
			errorcheck = function() {
				var interpreter_ids = '';
				$('#interpreter_ids_select [rel*="status"]').each(function() {
					var relObject = eval('new Object(' + $(this).attr('rel') + ')');
					interpreter_ids += '&' + relObject.id + '?' + relObject.status;
				});
				
				savevars.aid = aid;
				savevars.action = 'update';
				if ( $('#hidden_recurring_dates').attr('rel') == '' ) {
					popup_html = '<ul><li>E-mail these updates to the interpreter(s)?</li></ul>';
					popup_actions = '<button type="button" onclick="javascript:errorcheck_submit(1)">Yes</button> <button type="button" onclick="javascript:errorcheck_submit(0)">No</button>';
					$('#popup-contents').html(popup_html);
					$('#popup-actions').html(popup_actions);
					$.fn.showPopupForm();
					
					// TODO Please clean this up later. Please.
					errorcheck_submit = function (email) {
						savevars.interpreter_ids = interpreter_ids.substring(1);
						savevars.send_email = email;
						$.post('/admin/assignments/assignment_actions.php',savevars,function(data){
							$('#popup-contents').html(data);
						});
						$.fn.disablePopup();
					};
				} else {
					var popup_html = '';
					
					// Check if any of the assignment's settings have changed
					var assignment_changes = false;
					for ( key in defaultVals.settings ) {
						var relObject = eval('new Object(' + $('#' + key).attr('rel') + ')');
						if ( defaultVals.settings[key].id != relObject.id || defaultVals.settings[key].value != $.fn.addslashes($('#' + key).val()) || defaultVals.settings[key].status != relObject.status ) {
							assignment_changes = true;
						}
					}
					if ( assignment_changes == true ) {
						popup_html += '<li>Change assignment settings for:<br /><em><input type="radio" value="0" name="settings-recur" checked="checked"> This assignment <input type="radio" value="1" name="settings-recur"> All future or new recurrences</em></li>';
					}
					
					interpreter_ids = '';
					$('#interpreter_ids_select [rel*="status"]').each(function() {
						var relObject = eval('new Object(' + $(this).attr('rel') + ')');
						if ( relObject.status == 1 ) {
							update_action = 'Assign ' + relObject.title + ' to'; 
						} else {
							update_action = 'Remove ' + relObject.title + ' from'; 
						}
						popup_html += '<li>' + update_action + ':<br /><em><input type="radio" value="0" name="rad-' + relObject.id + '" checked="checked"> This assignment <input type="radio" value="1" name="rad-' + relObject.id + '"> All future or new recurrences</em></li>';
					});
					popup_html += '<li><input type="checkbox" checked="checked" name="send-email" value="1" /> E-mail updates to interpreters</li>';
					popup_html = '<ul>' + popup_html + '</ul>';
					popup_actions = '<button type="button" onclick="javascript:errorcheck_submit()">Save Changes</button> <button type="button" onclick="javascript:$.fn.disablePopup()">Cancel</button>';
					$('#popup-contents').html(popup_html);
					$('#popup-actions').html(popup_actions);
					$.fn.showPopupForm();
					
					errorcheck_submit = function () {
						$('input[name*="rad-"]:checked').each(function() {
							input_id = $(this).attr('name').replace('rad-','');
							var relObject = eval('new Object(' + $('#interpreter_ids_select [rel*="id:\'' + input_id + '\'"]').attr('rel') + ')');
							interpreter_ids += '&' + input_id + '?' + relObject.status + '?' + $(this).val();
						});
						if ( $('input[name="settings-recur"]:checked').val() == '1' ) {
							savevars.recur_settings = '1';
						} else {
							savevars.recur_settings = '0';
						}
						if ( $('input[name="send-email"]:checked').val() == '1' ) {
							savevars.send_email = 1;
						} else {
							savevars.send_email = 0;
						}
						savevars.interpreter_ids = interpreter_ids.substring(1);
						$.post('/admin/assignments/assignment_actions.php',savevars,function(data){
							$('#popup-contents').html(data);
						});
						$.fn.disablePopup();
					};
				}
			};
		}, 'json');
	};
	
	/*
	 * Bind select list to focus and keyup actions
	 */
	$.fn.bind_selectlist = function bind_selectlist(key) {
		var baseKey = key.replace(/_[0-9]+/,'').replace('input_','').replace('textarea_','');
		$('#' + key).focus(function() {
			$.fn.build_selectlist(key);
			$('#' + baseKey + '_select').css('z-index','10');
		}).keydown(function(e) {
			if ( e.keyCode == 16 ) {
				shift = true;
			}
		}).keyup(function(e) {
			$.fn.keybind(e,key);
		}).blur(function() {
			$('#' + baseKey + '_select .selectbox').hide(0);
			$('#' + baseKey + '_select').css('z-index','1');
		});
	};

	/*
	 * Assignment form
	 */
	$.fn.build_assignment_form = function build_assignment_form(data) {
		// Pop-up contact form
		$.fn.add_contact = function add_contact() {
			$.post('/admin/assignments/assignment_actions.php',{
				action : 'add_contact',
				company_id : $('#company-select input').attr('mid')
			}, function (data) {
				$('#popup-contents').html(data);
				$.fn.showPopupForm();
			});
		};

		// Pop-up address form
		$.fn.add_address = function add_address() {
			$.post('/admin/assignments/assignment_actions.php',{
				action : 'add_address',
				company_id : eval('new Object(' + $('#company-select input').attr('rel') + ')').id
			}, function (data) {
				$('#popup-contents').html(data);
				$.fn.showPopupForm();
			});
		};
		
		// Add the form
		$('#assignment-details').html('<form id="assignment-form" method="post" action="/admin/assignments/assignment_actions.php"></form>').addClass('edit');
		$('#assignment-details form').append('<ul id="assignment-form-list">');
		
		defaultVals = new Object({interpreters:{},settings:{}});
		for ( key in data.fields ) {
			// Get all visible form fields
			switch ( data.fields[key].type ) {
				case 'hidden' :
					var value = ( data.fields[key].value !== undefined ) ? data.fields[key].value : '';
					field = '<input type="' + data.fields[key].type + '" value="' + value + '" id="hidden_' + key + '" name="' + key + '" rel="' + value + '" />';
					$('#assignment-form').append(field);
					break;
					
				case 'checkbox' :
					var checked = ( parseInt(data.fields[key].checked) ) ? 'checked' : '';
					field = '<input type="' + data.fields[key].type + '" value="1" id="checkbox_' + key + '" name="' + key + '" ' + checked + ' />' + data.fields[key].description;
					section_begin = (data.fields[key].section_begin !== undefined) ? 'class="section-begin"' : '';
					form_item = '<li id="' + key + '" ' + section_begin +'><span class="column span-6 prepend-3 last">' + field + '</span><span class="clear"></span></li>';
					$('#assignment-form #assignment-form-list').append(form_item);
					break;
					
				default :
					var field = '';
					var interpreter_count = 0;
					// Special case interpreters add additional fields :
					if ( key == 'interpreter_ids' && data.fields[key].interpreters !== undefined ) {
						for ( r in data.fields[key].interpreters ) {
							field += '<span class="interpreter" id="interpreter_' + interpreter_count + '" rel="{id:\'' + data.fields[key].interpreters[r].id + '\',status:1,title:\'' + data.fields[key].interpreters[r].name + '\'}">' + data.fields[key].interpreters[r].name + ' <img src="/admin/img/icons/delete-small.png" class="icon interpreter-delete" onmousedown="javascript: $.fn.interpreter_delete(\'' + data.fields[key].interpreters[r].id + '\')" title="Remove ' + data.fields[key].interpreters[r].name + ' from this assignment" /></span>';
							defaultVals.interpreters['interpreter_' + interpreter_count] = new Object({id:data.fields[key].interpreters[r].id,status:1});
							interpreter_count++;
						}
					}
					
					var label = '<label class="column span-3">' + data.fields[key].name + ':</label>';
					var rel = ( data.fields[key].rel === undefined ) ? '' : data.fields[key].rel;
					var fieldFillId = ( eval('new Object(' + rel + ')').id !== undefined ) ? eval('new Object(' + rel + ')').id : undefined;
					// Build inputs & textareas
					if (data.fields[key].type != 'textarea') {
						var input_id = ( key == 'interpreter_ids' ) ? 'input_' + key + '_' + interpreter_count : 'input_' + key;
						var required = ( ( key == 'interpreter_ids' && interpreter_count != 0 ) || key == 'contact_email' || key == 'contact_phone' ) ? '' : 'required';
						field += '<input type="' + data.fields[key].type + '" size="' + data.fields[key].size + '" value="' + data.fields[key].value + '" id="' + input_id + '" name="' + key + '" rel="' + rel + '" class="' + required + '" />';
						if ( key == 'interpreter_ids' ) {
							defaultVals.interpreters[input_id] = new Object({ id : fieldFillId, value : data.fields[key].value });
						} else {
							defaultVals.settings[input_id] = new Object({ id : fieldFillId, value : data.fields[key].value });
						}
					} else {
						var input_id = 'textarea_' + key;
						field += '<textarea cols="' + data.fields[key].size + '" rows="1" value="" id="' + input_id + '" name="' + key + '" class="required">' + data.fields[key].value + '</textarea>';
						defaultVals.settings[input_id] = new Object({ value : $.fn.addslashes(data.fields[key].value) });
					}
					// Build select lists
					if (data.fields[key].select_list !== undefined) {
						var fill_lists = '';
						for ( list in data.fields[key].select_list ) {
							fill_lists += '<div id="' + key + '_' + list + '">' + data.fields[key].select_list[list].title + '<ul class="fill"></ul></div>';
						}
						field = '<div id="' + key + '_select" class="selectwrap">' + field + '<span class="selectbox">' + fill_lists + '</span></div>';
					} else {
						field = '<div>' + field + '</div>';
					}
					section_begin = (data.fields[key].section_begin !== undefined) ? 'class="section-begin"' : '';
					form_item = '<li id="' + key + '" ' + section_begin +'>' + label + '<span class="column span-6 last">' + field + '</span><span class="clear"></span></li>';
					$('#assignment-form #assignment-form-list').append(form_item);
					
					// Bind select list functions
					$.fn.bind_selectlist($('#' + input_id).attr('id'));
			} // end switch
		}
		
		// Move the time end field
		$('#time_start input').after($('#time_end input')).after(' to ');
		$('#time_start label').text('Time:');
		$('#time_end').remove();
		
		/**
		 * Builds AJAX auto-select lists
		 * 
		 * @param key The ID of the input element
		 * @return
		 */
		$.fn.build_selectlist = function build_selectlist(key) {
			var baseKey = key.replace(/_[0-9]+/,'').replace('input_','').replace('textarea_','');
			$.post('/admin/assignments/ajax_select.php', {
				select_list : baseKey,
				qry : $('#' + key).val(),
				company_id : eval('new Object(' + $('#input_company_id').attr('rel') + ')').id,
				year : $('#input_date').val().substr(6,4),
				month : $('#input_date').val().substr(0,2),
				day : $('#input_date').val().substr(3,2)
			}, function(select_data) {
				var noresults = true;
				// Grab each list to fill (excluding the select_action)
				for ( list_key in select_data ) {
					if ( list_key != 'select_action' ) {
						list_fill = '';
						for ( listitem in select_data[list_key] ) {
							if ( select_data[list_key][listitem].more_info !== undefined ) {
								more_info = ' <em>' + select_data[list_key][listitem].more_info.replace(/<br \/>/g,' / ') + '</em>';
							} else {
								more_info = '';
							}
							// Set the select action to blank, then add one in if it exists
							select_action = '';
							if ( select_data.select_action !== undefined ) {
								select_action = ',func:\'' + select_data.select_action + '\''; 
							}
							list_fill += '<li rel="{id:\'' + select_data[list_key][listitem].id + '\',title:\'' + $.fn.addslashes(select_data[list_key][listitem].title) + '\'' + select_action + '}">' + select_data[list_key][listitem].title + more_info + '</li>';
						}
						// For empty lists or lists that only return the same value as the input, hide the containing div
						if ( list_fill == '' || select_data[list_key][listitem].title == $('#' + key).val() ) {
							$('#' + list_key).hide();
						} else {
							$('#' + list_key).show();
							$('#' + list_key + ' .fill').html(list_fill);
							noresults = false;
						}
					}
				}
				if ( noresults ) {
					$('#' + baseKey + '_select .selectbox').hide(0);
				} else {
					if ( $('#' + key + ':focus').attr('id') ) {
						$('#' + baseKey + '_select .selectbox').show(0);
					}
				}
				
				// Determine the selectbox's placement from the top of the span
				var i = key.replace(baseKey,'').replace(/\w+_/,'').replace('_','0');
				if ( baseKey == 'interpreter_ids' ) {
					$('[rel*="status:0"]').each(function(){
						i--;
					});
				}
				
				if ($('.autofocus').text()) {
					$('.autofocus').removeClass('autofocus');
				}
				$('#' + baseKey + '_select .selectbox').find('div:visible:first').find('ul').find('li:first').addClass('autofocus');
				$('#' + baseKey + '_select .selectbox').css('top', (i * 22) + 20);
				$.fn.mousebind(key);
			}, 'json');
		};
		
		// Various bindings
		$('#textarea_description').elastic();
		$('#input_date').datepicker();

		/*
		 * Hide default value
		 */
		$('.hidedefault').each(function() {
			input_blank[$(this).attr('name')] = $(this).val();
		}).focus(function() {
			if ( $(this).val() == input_blank[$(this).attr('name')] ) {
				$(this).val('');
			}
		}).blur(function() {
			if ($(this).val() == '' ) {
				$(this).val(input_blank[$(this).attr('name')]).removeClass('filled');
			} else {
				$(this).addClass('filled');
			}
		});
		
		/*
		 * Commit an option from a select-list
		 */
		$.fn.select_option = function select_option(n) {
			var baseKey = n.replace(/_[\d]+/g,'').replace(/input_/,'').replace(/textarea_/,'');
			if ( $('#' + baseKey + '_select .autofocus').attr('rel') ) {
				vars = eval('new Object(' + $('.autofocus').attr('rel') + ')');
				$('#' + n).val(vars.title).attr('rel','{id:\'' + vars.id + '\',status:1,title:\'' + $.fn.addslashes(vars.title) + '\'}');
				if ( vars.func !== undefined ) {
					eval(vars.func);
				}
			}
		};
		
		/*
		 * Navigate to next input
		 */
		$.fn.input_next = function input_next(n) {
			$('#' + n).blur();
			if ( $('#' + n).next('input').attr('name') ) {
				$('#' + n).next('input').focus();
			} else if ( $('#' + n).parent('div').parent('span').parent('li').next('li').find('span').find('div').find('input:first').attr('name') ) {
				$('#' + n).parent('div').parent('span').parent('li').next('li').find('span').find('div').find('input:first').focus();
			} else if ( $('#' + n).parent('div').parent('span').parent('li').next('li').find('span').find('div').find('textarea:first').attr('name') ) {
				$('#' + n).parent('div').parent('span').parent('li').next('li').find('span').find('div').find('textarea:first').focus();
			}
			// TODO Add textarea support ^
		};
		
		/*
		 * Navigate to previous input
		 */
		$.fn.input_prev = function input_prev(n) {
			$('#' + n).blur();
			if ( $('#' + n).prev('input').attr('name') ) {
				$('#' + n).prev('input').focus();
			} else if ( $('#' + n).parent('div').parent('span').parent('li').prev('li').find('span').find('div').find('input:last').attr('name') ) {
				$('#' + n).parent('div').parent('span').parent('li').prev('li').find('span').find('div').find('input:last').focus();
			} else if ( $('#' + n).parent('div').parent('span').parent('li').prev('li').find('span').find('div').find('textarea:last').attr('name') ) {
				$('#' + n).parent('div').parent('span').parent('li').prev('li').find('span').find('div').find('textarea:last').focus();
			}

		};
		
		/*
		 *  Mousebind function
		 *  
		 *  @param n input ID
		 */
		$.fn.mousebind = function mousebind(n) {
			var baseKey = n.replace(/_[0-9]+/,'').replace(/[a-z]+_/,'');
			$('#' + baseKey + '_select .selectbox ul li').hover(function() {
				$('.autofocus').removeClass('autofocus');
				$(this).addClass('autofocus');
			}).mousedown(function() {
				$.fn.input_next(n);
				$.fn.select_option(n);
			});
		};
		
		$('input, textarea').keydown(function(e) {
			if (e.keyCode == 9) {
				e.preventDefault();
			}
		});
		
		/**
		 * Binds the keydown event for an input field 
		 * 
		 * @param e The key pressed
		 * @param n The base name of the element
		 * @return mixed
		 */
		$.fn.keybind = function keybind(e,n) {
			switch (e.keyCode) {
				// Down Arrow
				case 40 :
					if ( $('.selectbox div ul li.autofocus').next('li').text() != '' ) {
						$('.selectbox div ul li.autofocus').removeClass('autofocus').next('li').addClass('autofocus');
					} else if ( $('.selectbox ul li.autofocus').parent('ul').parent('div').next('div').find('ul').find('li:first').text() != '' ) {
						$('.selectbox ul li.autofocus').removeClass('autofocus').parent('ul').parent('div').next('div').find('ul').find('li:first').addClass('autofocus');
					}
					break;
				// Up Arrow
				case 38 :
					if ( $('.selectbox ul li.autofocus').prev('li').text() != '' ) {
						$('.selectbox ul li.autofocus').removeClass('autofocus').prev('li').addClass('autofocus');
					} else if ( $('.selectbox ul li.autofocus').parent('ul').parent('div').prev('div').find('ul').find('li:last').text() != '' ) {
						$('.selectbox ul li.autofocus').removeClass('autofocus').parent('ul').parent('div').prev('div').find('ul').find('li:last').addClass('autofocus');
					}
					break;
				// Enter key
				case 13:
					if ( shift == false ) {
						if ( e.keyCode == 9 || n != 'textarea_description' ) {
							$.fn.input_next(n);
							$.fn.select_option(n);
						}
					}
					if ( e.keyCode == 9 && shift == true ) {
						$.fn.input_prev(n);
					}
					break;
				//Tab key
				case 9 :
					if ( shift == false ) {
						$.fn.input_next(n);
						$.fn.select_option(n);
					}
					if ( e.keyCode == 9 && shift == true ) {
						$.fn.input_prev(n);
					}
					break;
				// left, right, shift keys
				case 37 : case 39 : case 16 :
					break;
				// Esc key
				case 27 :
					$('#' + n).blur();
					break;
				default :
					$.fn.build_selectlist(n);
			}
			shift = false;
		};
		
		$('input').blur(function(){
			if ( $(this).val() == '' ) {
				$(this).attr('rel','');
			}
		});
		
		// Add contact e-mail if contact is new
		// DEPRECATED
		/*
		$('#input_contact_id').blur(function(){
			$.fn.add_contact_email = function() {
				if ($('#input_contact_id').attr('rel') == '' && !$('#contact_email').html()) {
					var field = '<input type="text" size="30" value="" id="input_contact_email" name="contact_email" />';
					var label = '<label class="column span-3">Requester E-mail:</label>';
					var form_item = '<li id="contact_email">' + label + '<span class="column span-6 last">' + field + '</span><span class="clear"></span></li>';
					$('#contact_id').after(form_item);
					$('#input_client_id').blur();
					$('.autofocus').removeClass('autofocus');
					$('#input_contact_email').focus();
				} else if ($('#input_contact_id').attr('rel') != '' && $('#contact_email').html()) {
					$('#contact_email').remove();
				}
			};
			timeout = setTimeout('$.fn.add_contact_email()',5);
		});
		*/
		
		/*
		 * Interpreter Delete function
		 * 
		 * @param id The "mid" attribute 
		 */
		$.fn.interpreter_delete = function interpreter_delete(id) {
			$('.interpreter[rel*="id:\'' + id + '\'"]').hide(0).each(function(){
				relObject = eval('new Object(' + $(this).attr('rel') + ')');
				$(this).attr('rel','{id:\'' + relObject.id + '\',status:"kill",title:\'' + relObject.title + '\'}');
			});
		};
		
		$.fn.contact_select = function contact_select() {
			var relObj = $('#contact_id_select .autofocus em').html().split(' / ');
			$('#input_contact_email').val(relObj[0]);
			$('#input_contact_phone').val(relObj[1]);
			$('#input_client_id').focus();
		};
		
		$.fn.add_interpreter = function add_interpreter() {
			// Only add a new input if the last one is full
			if ( $('#interpreter_ids_select input:last').attr('rel') != '' ) {
				if ( eval('new Object(' + $('#interpreter_0').attr('rel') + ')').id == 'n1' || eval('new Object(' + $('#interpreter_0').attr('rel') + ')').id == 'n2' ) {
					interpreters_count = 0;
					$('#interpreter_ids_select [rel*="status"]').each(function(){
						input_rel = eval('new Object(' + $(this).attr('rel') + ')');
						if ( input_rel.id.substring(0,1) != 'n' ) {
							interpreters_count++;
						}
					});
					
					needed_rel = eval('new Object(' + $('#interpreter_0').attr('rel') + ')');
					
					switch( needed_rel.id ) {
						case 'n1' :
							if ( interpreters_count > 0 ) {
								$('#interpreter_0').hide().attr('rel','{id:\'' + needed_rel.id + '\',status:"kill",title:\'Interpreter needed\'}');
							}
							break;
						case 'n2' :
							if ( interpreters_count > 1 ) {
								$('#interpreter_0').hide().attr('rel','{id:\'' + needed_rel.id + '\',status:"kill",title:\'Team TBA\'}');
							}
							break;
					}
				}
				
				input_id = parseInt($('#interpreter_ids_select input:last').attr('id').replace('input_interpreter_ids','0').replace('_','')) + 1;
				$('#interpreter_ids_select input:last').after('<input type="text" size="30" id="input_interpreter_ids_' + input_id + '" value="" rel="" />');
				defaultVals.interpreters['input_interpreter_ids_' + input_id] = new Object({ id : '', value : '' });
				$.fn.bind_selectlist('input_interpreter_ids_' + input_id);
			}
		};
		
		$.fn.show_address = function show_address() {
			rel = eval('new Object(' + $('.autofocus').attr('rel') + ')');
			if ( rel.id  == '0' ) {
				$.fn.add_address();
			}
			if ( !$('#address_fill').attr('id') ) {
				$('#input_address_id').after('<div id="address_fill"></div>');
			}
			$('#address_fill').html($('.autofocus em').html().replace(/\s\/\s/g,'<br />'));
		};
		
		
		// Recurrence
		$('#input_date').after(' <img src="/admin/img/icons/recur.png" title="Set recurrence" class="icon" id="recur" />');
		$('#recur').hover(function() {
			$(this).after('<span class="helptext">Set recurrence</span>');
		}, function() {
			$(this).next('.helptext').remove();
		}).click(function(){
			setRecurring();
		});
	};
	
	/*
	 * Invoice AJAX actions
	 */
	
	$.fn.invoice_list = function invoice_list(y, m) {
		$('#stage').html('<div class="ajax-loading"><img src="/admin/img/icons/ajax-loader.gif" /></div>');
		$.post('/admin/admin/interpreter invoices/invoice_actions.php', {
			action : 'list',
			year : y,
			month : m
		}, function(data) {
			$('#stage').html(data);
		});
	};
	
	$.fn.invoice_view_single = function invoice_view_single( aid, uid ) {
		$('#stage').html('<div class="ajax-loading"><img src="/admin/img/icons/ajax-loader.gif" /></div>');
		$.post('/admin/assignments/assignment_actions.php', {
			action : 'view_single',
			aid : aid,
			uid : uid
		}, function(data) {
			$('#stage').html(data);
		});
	};

	/*
	 * Popup
	 */

	$.fn.showPopupForm = function showPopupForm(callback,w,h) {
		if ( w == undefined ) {
			w ='400px';
		}
		if ( h == undefined ) {
			h = 'auto';
		}
		$('#popup-box').width(w).height(h);
		loadPopup();
		eval(callback);
	};

	var currentPopup = '';

	function loadPopup() {
		// loads popup only if it is disabled
		if (!currentPopup) {
			$("#popup-background").css( {
				"opacity" : "0.7"
			});
			$("#popup-background").show(0);
			$('#popup').show(0);
			currentPopup = 1;
		}
	}

	// disabling popup with jQuery magic!
	$.fn.disablePopup = function disablePopup() {
		// disables popup only if it is enabled
		if (currentPopup != '') {
			$("#popup-background").fadeOut("slow");
			$('#popup').fadeOut("medium");
			// FIX: Needs to clear the popup window!
			currentPopup = '';
		}
	};

	// Cancel Button
	$('#form-cancel').click(function() {
		$.fn.disablePopup();
	});
	/* Click out
	$("#popup-background").click(function() {
		$.fn.disablePopup();
	});
	// Escape Key
	$(document).keypress(function(e) {
		if (e.keyCode == 27 & currentPopup != '') {
			$.fn.disablePopup();
		}
	});
	*/
	
	$.fn.search = function search() {
		postvars = new Object({action:'search'});
		postvars['date_from'] = ($('#date_from').val()) ? $('#date_from').val().substr(6,4) + '-' + $('#date_from').val().substr(0,2) + '-' + $('#date_from').val().substr(3,2) : '';
		postvars['date_to'] = ($('#date_to').val()) ? $('#date_to').val().substr(6,4) + '-' + $('#date_to').val().substr(0,2) + '-' + $('#date_to').val().substr(3,2) : '';
		postvars['string'] = $('#searchstring').val();
		$('#stage').html('searching...');
		$.post('/admin/assignments/assignment_actions.php',postvars,function(data){
			$('#stage').html(data);
		});
	};
	
	$.fn.show_message = function show_message(message, type) {
		if ( type !== undefined ) {
			$('#messages').addClass(type);
		}
		$('#messages').html(message).slideDown(1000,function(){
			setTimeout('$("#messages").slideUp(1000)',5000);
		});
	};
	
	$.fn.login_updated = function login_updated(data) {
		$.fn.show_message(data);
		$('input.password').val('');
	};
	
	
	$.fn.invoice_delete_confirm = function invoice_delete_confirm(aid,uid) {
		popup_html = '<ul><li>Are you sure you want to remove this assignment from the invoice?</li></ul>';
		popup_actions = '<button onclick="javascript:$.fn.invoice_delete()">Yes</button> <button onclick="javascript:$.fn.disablePopup()">No</button>';
		$('#popup-contents').html(popup_html);
		$('#popup-actions').html(popup_actions);
		$.fn.showPopupForm();
		
		$.fn.invoice_delete = function invoice_delete() {
			$.post('/admin/include/invoices/delete.php',{ aid: aid, uid: uid },function(){
				$('#' + aid).fadeOut(1000,function(){
					// Set up the variables
					row_rate = $('#' + aid + ' .row_rate').text().toLowerCase();
					row_hours = parseInt($('#' + aid + ' .row_hours').text());
					row_expenses = parseInt($('#' + aid + ' .row_expenses').text());
					row_total = parseInt($('#' + aid + ' .row_total').text());
					
					// Assign the totals some vars
					rate_hours = $('#' + row_rate + ' .hours').text() - row_hours;
						$('#' + row_rate + ' .hours').text(parseInt(rate_hours).toFixed(2)).addClass('highlight');
					rate_total = $('#' + row_rate + ' .row_total').text() - row_total + row_expenses;
						$('#' + row_rate + ' .row_total').text(parseInt(rate_total).toFixed(2)).addClass('highlight');
					invoice_subtotal = $('#invoice_subtotal').text() - row_total + row_expenses;
						$('#invoice_subtotal').text(parseInt(invoice_subtotal).toFixed(2)).addClass('highlight');
					invoice_expenses = $('#invoice_expenses').text() - row_expenses;
						$('#invoice_expenses').text(parseInt(invoice_expenses).toFixed(2)).addClass('highlight');
					invoice_total = $('#invoice_total').text() - row_total;
						$('#invoice_total').text(parseInt(invoice_total).toFixed(2)).addClass('highlight');
					
					setTimeout(function(){
						$('.highlight').removeClass('highlight');
					}, 2500);
					
					$(this).remove();
				});
				$.fn.disablePopup();
			});
		};
	};

});