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"></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"></div>'+
        '</div>'
        );

function setStatusMessage(msg, class_name) {
    msg = msg||'';
    class_name = class_name||'';
    if (msg.blank()) class_name = '';
    $('status_message').update(msg).className = class_name;
    var t = setTimeout("setStatusMessage()", 5000);
}

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){
        $$('.login_required').invoke('show');
        ['job_login_container','login_link','dispatch_log',
                'job_listings','job_confirm','apply_div','return_div',
                'application_thankyou'].each(function(s){
            if ($(s)) $(s).hide();
        });
        ['job_listing_container','logout_link','user_details','member_address'].each(function(s){
            if ($(s)) $(s).show();
        });

        if (json.status_message=='Application(s) submitted') {
            ['apply_div','logout_span'].each(function(s){
                if ($(s)) $(s).hide();
            });
            if ($('application_thankyou')) $('application_thankyou').show();

        } else if (json.confirmation) {
            ['job_confirm','apply_div','return_div'].each(function(s){
                if ($(s)) $(s).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')) {
              $('apply_div').show();
              selections[0].focus();
            }

        } else {
            if (dispatch) $('page_name').update('Dispatch Log');
            ['full_name','days_worked','last_login'].each(function(s){
                if ($(s)) $(s).update(json[s]);
            });
            if ($('dispatch_log')) $('dispatch_log').show();
        }

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

    } else {
        $$('.login_required').invoke('hide');
        toggle_login_form(post_login);
    }
    setStatusMessage(json.status_message, json.status);
}

function toggle_login_form(logging_in) {
    logging_in=(logging_in)?true:false;
//    if ($('page_name')) $('page_name').update('Dispatch Jobs ('+json.jobs.size()+' jobs)');
    ['logout_link','user_details','member_address','apply_div','side_menu'].each(function(s){
        if ($(s)) $(s).hide();
    });

    if (logging_in) {
        ['template','job_listing_container'].each(function(s){
          if ($(s)) $(s).hide();
        });
        if ($('job_login_container')) {
          $('job_login_container').show();
          $('username').focus();
        }
    } else {
        if ($('job_login_container')) $('job_login_container').hide();
        ['template','job_listing_container','job_listings','login_link'].each(function(s){
          if ($(s)) $(s).show();
        });
    }
}

function post_form(request, msg) {
    if (!$('req')) return;

    setStatusMessage(msg+'...');
    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;
                if (dispatch) loadList('job_listings', json.jobs, logged_in, json.open_hours, json.out_of_work);
                if (dispatch) loadList('applied_listings', json.jobs.findAll(function(s){return s.selected;}), logged_in, json.open_hours, json.out_of_work);
            }else{
                if (request=='login' && logged_in) {
                  window.location.href='/Members';
                } else if (dispatch) {
                  loadDispatchLog(json.dispatches, logged_in);
                }
            }
            showContainer((request=='login' || request=='logout') ? true : false);
        }
    });
}

function toggle_fields(e) {
    if (e) e.stop();
    if (!$('member_address')) return;
    $('member_address').select('.login_field').each(function(el){
        if (el.identify() == 'mem_addr_days') return;
        var inp = el.down('input');
        if (inp === undefined) {
            el.update(new Element('input',{name:el.previous('.login_label').innerHTML.sub(':', ''), value:el.innerHTML}).store('prev_val', el.innerHTML));
        } else {
            el.update(inp.retrieve('prev_val'));
        }
    });
    $('member_address').select('.buttons').invoke('toggle');
}

var json = {};
var body = null;
document.observe('dom:loaded',function(){
    var offline = false;
    new Ajax.Request(app_page, {
        asynchronous: false,
        method:'get',
        parameters: {req:'check_access',cache_buster:Math.floor(Math.random()*10001)},
        onSuccess: function(transport){
            json = transport.responseText.evalJSON();
            if (json.status=='fail') {
                offline = true;
                setStatusMessage(json.status_message, '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();setStatusMessage();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) {
                setStatusMessage('No jobs selected','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();
    });

    if (dispatch) {
        post_form('view_jobs', 'Loading');
    } else {
        showContainer(require_login);
    }

    $('edit_member','btn_cancel').invoke('observe','click',toggle_fields);
    if ($('btn_details_update')) $('btn_details_update').observe('click',function(e){
        e.stop();
        new Ajax.Request('/cgi-bin/cgiemail/member_details_update.txt',{method:'post',
            parameters:$('app_form').serialize(true),
            onSuccess:function(transport){
                if (transport.responseText.include('<TITLE>Success</TITLE>')) {
                    setStatusMessage('Your information has been submitted','okay');
                } else {
                    setStatusMessage('There was a problem submitting your information. Please try again later.','fail');
                }
            }
        });
        toggle_fields();
    });
    if ($('member_address')) {
        if (json.guest) {
            $('member_address').update('You now have guest access to the member area. Look for additional site options under the MEMBERS menu.');
        } else {
            $('mem_addr_name').update(json.full_name);
            $('mem_addr_address').update(json.address);
            $('mem_addr_city').update(json.city);
            $('mem_addr_province').update(json.province);
            $('mem_addr_postal_code').update(json.postal_code);
            $('mem_addr_phone').update(json.phone);
            $('mem_addr_cell_phone').update(json.cell_phone);
            $('mem_addr_alt_phone').update(json.alt_phone);
            $('mem_addr_email').update(json.email);
            $('mem_addr_days').update(json.days_worked);

            $('view_member_details').observe('click',function(e){e.stop();$('details_container').show();});

            var msg_tmpl = new Template('<div class="message"><h4>#{name}</h4>#{content}</div>');
            if (member_messages[json.unit_number] && member_messages[json.unit_number].length > 0) {
                member_messages[json.unit_number].each(function(s){
                   $('member_address').select('.messages')[0].insert(msg_tmpl.evaluate(s));
                });
            } else {
                $('member_address').select('.messages')[0].insert('<div>No messages to display.</div>');
            }
        }
    }
});

