var row_tmpl = new Template(
					'<div class="job_row #{addl_class}">'+
					'  <div class="job_row_grp1">'+
					'    <div class="grp1_ttl"><strong>Job #</strong></div>'+
					'    <div class="grp1_data">#{job_number}</div>'+
					'    <div style="clear:both;"></div>'+
					'    <div class="grp1_ttl"><strong>Employer</strong></div>'+
					'    <div class="grp1_data">#{employer}</div>'+
					'    <div style="clear:both;"></div>'+
					'    <div class="grp1_ttl"><strong>Location</strong></div>'+
					'    <div class="grp1_data">#{location}</div>'+
					'    <div style="clear:both;"></div>'+
					'    <div class="grp1_ttl"><strong>Start Date</strong></div>'+
					'    <div class="grp1_data">#{start_date} #{start_time}</div>'+
					'    <div style="clear:both;"></div>'+
					'    #{input}'+
					'  </div>'+
					'  <div class="job_row_grp2"><div class="grp2_ttl"><strong>Details</strong></div><div class="grp2_data">#{details}</div></div>'+
					'  <div class="clear_float"></div>'+
					'</div>'
				);

var select_tmpl = new Template('<div class="grp1_apply"><label><input class="selection" type="checkbox" value="#{idx}"> Apply for job</label></div>');
var confirm_tmpl = new Template('<input type="hidden" name="rank[#{id}]" value="#{idx}">');

var dispatch_tmpl = new Template(
		'<div class="job_row #{addl_class}">'+
		' <div class="job_row_grp1">'+
		'  <div class="grp1_ttl"><strong>Job #</strong></div>'+
		'  <div class="grp1_data">#{job_number}</div>'+
		'  <div style="clear:both;"></div>'+
		'  <div class="grp1_ttl"><strong>Employer</strong></div>'+
		'  <div class="grp1_data">#{employer}</div>'+
		'  <div style="clear:both;"></div>'+
		'  <div class="grp1_ttl"><strong>Start Date</strong></div>'+
		'  <div class="grp1_data">#{start_date}</div>'+
		'  <div style="clear:both;"></div>'+
		'  <div class="grp1_ttl"><strong># Days</strong></div>'+
		'  <div class="grp1_data">#{days_worked_by_hire}</div>'+
		'  <div style="clear:both;"></div>'+
		' </div>'+
		' <div class="job_row_grp2"><div class="grp2_ttl"><strong>Details</strong></div><div class="grp2_data">#{details}</div></div>'+
		' <div class="clear_float"></div>'+
		'</div>'
		);

function open_for_business() {}

function loadDispatchLog(list, logged_in) {
	if (!logged_in) { alert('not logged in');return; }

	if (list.size()>0) {
		$('dispatch_log_listings').update('');
		list.each(function(s, idx){
			var ul=new Element('ul');
			s.addl_class = (idx%2!=0) ? 'job_row_color' : '';
			$('dispatch_log_listings').insert(dispatch_tmpl.evaluate(s));
		});

	} else {
		$('dispatch_log_listings').update('Dispatch log unavailable');
	}
}

function loadList(div, jobs, logged_in, open_hours, out_of_work) {
	logged_in=(logged_in)?true:false;
	open_hours=(open_hours)?true:false;
	out_of_work=(out_of_work)?true:false;
	if (jobs.size()>0) {
		$(div).update('');
		jobs.each(function(s, idx){
			var ul=new Element('ul');
			s.training.each(function(t){
				if (t=="") return;
				ul.insert(new Element('li').update(t));
			});
			s.addl_class = (idx%2!=0) ? 'job_row_color' : '';
			s.reqs_list=ul.innerHTML;
			s.idx=idx;
			if (logged_in && open_hours && out_of_work) {
				s.input = (div=='job_listings') ? select_tmpl.evaluate(s) : confirm_tmpl.evaluate(s);
			}
			$(div).insert(row_tmpl.evaluate(s));
		});

	} else {
		$(div).update('No jobs currently available');
	}
}

function showContainer(post_login) {
	if (json.member_id){
		$('job_login_container','login_link','dispatch_log',
				'job_listings','job_confirm','apply_div','return_div',
				'application_thankyou').invoke('hide');
		$('job_listing_container','user_details').invoke('show');

		if (json.status_message=='Application(s) submitted') {
			$('apply_div','logout_span').invoke('hide');
			$('application_thankyou').show();

		} else if (json.confirmation) {
			$('job_confirm').show();
			$('apply_div').show();
			$('return_div').show();

		} else if (json.request == 'view_jobs' || json.request == 'apply') {
			$('page_name').update('Dispatch Jobs: '+json.dispatch_list+' ('+json.jobs.size()+' jobs)');
			$('full_name').update(json.full_name);
			$('days_worked').update(json.days_worked);
			$('last_login').update(json.last_login);

			var selections = $('job_listings').show().select('.selection');
			if (selections.size()>0) {
				$('apply_div').show();
				selections[0].focus();
			}

		} else {
			$('page_name').update('Dispatch Log');
			$('full_name').update(json.full_name);
			$('days_worked').update(json.days_worked);
			$('last_login').update(json.last_login);
			$('dispatch_log').show();
		}

		if ($('side_menu')) $('side_menu').hide();

	} else {
		toggle_login_form(post_login);
	}
	$('status_message').update(json.status_message).className = json.status;
}

function toggle_login_form(logging_in) {
	logging_in=(logging_in)?true:false;
	$('page_name').update('Dispatch Jobs ('+json.jobs.size()+' jobs)');
	$('user_details','apply_div').invoke('hide');
	if ($('side_menu')) $('side_menu').hide();

	if (logging_in) {
		$('job_listing_container').hide();
		$('job_login_container').show();
		$('username').focus();
	} else {
		$('job_listing_container','job_listings','login_link').invoke('show');
		$('job_login_container').hide();
	}
}

function post_form(request, msg) {
	$('status_message').update(msg+'...').className = '';
	body.setStyle({cursor: 'wait'});

	$('req').value = request;
	$('app_form').request({
		onSuccess:function(transport){
			body.setStyle({cursor: 'default'});
			json = transport.responseText.evalJSON();
			var logged_in=(json.member_id)?true:false;
			if (!logged_in || request=='view_jobs' || request=='apply'){
				json.confirmation=false;
				loadList('job_listings', json.jobs, logged_in, json.open_hours, json.out_of_work);
				loadList('applied_listings', json.jobs.findAll(function(s){return s.selected;}), logged_in, json.open_hours, json.out_of_work);
			}else{
				loadDispatchLog(json.dispatches, logged_in);
			}
			showContainer((request=='login' || request=='logout') ? true : false);

		}
	});
}

var json = {};
var body = null;
Event.observe(document,'dom:loaded',function(){
	var offline = false;
	new Ajax.Request(app_page, {
		asynchronous: false,
		method:'get',
		parameters: {req:'check_access'},
		onSuccess: function(transport){
			json = transport.responseText.evalJSON();
			if (json.status=='fail') {
				offline = true;
				$('status_message').update(json.status_message).className = 'fail';
				$('closed_container').show();
			}
		},
		onFailure: function(){
			offline = true;
			alert('An error was encountered. Please try again by refreshing this page.');
		}
	});
	if (offline) return;


	body = $$('body')[0];
	if ($('app_form')) $('app_form').observe('submit',function(e){e.stop();}).action = app_page;
	if ($('login')) $('login').observe('click',function(e){e.stop();if ($('job_login_container').visible()) post_form('login', 'Logging in');});
	if ($('logout')) $('logout').observe('click',function(e){e.stop();post_form('logout', 'Logging out');});
	if ($('login_link')) $('login_link').select('a')[0].observe('click',function(e){e.stop();toggle_login_form(true);});
	if ($('listings_href')) $('listings_href').observe('click',function(e){e.stop();post_form('view_jobs', 'Retrieving jobs');});
	if ($('log_href')) $('log_href').observe('click',function(e){e.stop();post_form('', 'Retrieving dispatch log');});
	if ($('cancel_login')) $('cancel_login').observe('click',function(e){e.stop();$('status_message').update('').className = '';toggle_login_form(false);});
	if ($('return')) $('return').observe('click',function(e){
		e.stop();
		json.confirmation=false;
		showContainer();
	});
	if ($('apply')) $('apply').observe('click',function(e){
		e.stop();
		if (json.confirmation) {
			post_form('apply','Sending application(s)');
		} else {
			var selected_jobs = $$('input[type=checkbox]').select(function(el){return el.checked;});
			if (selected_jobs.size() < 1) {
				$('status_message').update('No jobs selected').className = 'fail';
			} else {
				var confirm_jobs = new Array();
				selected_jobs.each(function(s){
					confirm_jobs[confirm_jobs.size()] = json.jobs[s.getAttribute('value')];
				});
				loadList('job_confirm_listings', confirm_jobs, (json.member_id)?true:false, json.open_hours, json.out_of_work);
				json.confirmation=true;
				showContainer();
			}
		}
		body.scrollTo();
	});

	post_form('view_jobs', 'Loading');
});
