top.must_be_known_shippers = true;
top.require_tsa = true;
top.require_shipper_state = true;
top.require_shipper_postal_code = true;
top.require_consignee_state = true;
top.require_consignee_postal_code = true;
top.unpaid_awb_charges = false;
top.awb_number_error = false;
// magic customers turn off much field validation
top.magic_customer = new RegExp("^(jbhrs|a00a00)$","i");

function validate_ams_message_search(){
    var message = '';

    if(!$F('awb_prefix').match(/^[0-9]{3}/)) {
        message += "AWB prefix must be 3 digits.\n";
        $('awb_prefix').addClassName( 'invalid_input' );
    }
    else {
        $('awb_prefix').removeClassName( 'invalid_input' );
    }

    if( emptyField($('flight')) && emptyField($('awb_numbers'))
        && emptyField($('start_date_year')) && emptyField($('end_date_year'))){
        message += "You must enter either a date, a flight or an AWB number.\n";
        $('label_for_from_date').addClassName( 'invalid_input' );
        $('label_for_to_date').addClassName( 'invalid_input' );
        $('flight').addClassName( 'invalid_input' );
        $('awb_numbers').addClassName( 'invalid_input' );
    }
    else{
        $('label_for_from_date').removeClassName( 'invalid_input' );
        $('label_for_to_date').removeClassName( 'invalid_input' );
        $('flight').removeClassName( 'invalid_input' );
        $('awb_numbers').removeClassName( 'invalid_input' );
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}

function validate_ams_response_search(){
    var message = '';

    if(!$F('awb_prefix').match(/^[0-9]{3}/)) {
        message += "AWB prefix must be 3 digits.\n";
        $('awb_prefix').addClassName( 'invalid_input' );
    }
    else {
        $('awb_prefix').removeClassName( 'invalid_input' );
    }

    if( emptyField($('flight')) && emptyField($('awb_numbers')) ){
        message += "You must enter either a flight or an AWB number.\n";
        $('flight').addClassName( 'invalid_input' );
        $('awb_numbers').addClassName( 'invalid_input' );
    }
    else{
        $('flight').removeClassName( 'invalid_input' );
        $('awb_numbers').removeClassName( 'invalid_input' );
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}

function validate_ground_handler_search() {
    var message = '';

    if( emptyField($('search_company_name')) && emptyField($('search_airport')) ){
        message += "You must enter either a company name or an airport code.\n";
        $('label_for_company_name').addClassName( 'invalid_input' );
        $('label_for_aiport_code').addClassName( 'invalid_input' );
    }
    else{
        $('label_for_company_name').removeClassName( 'invalid_input' );
        $('label_for_aiport_code').removeClassName( 'invalid_input' );
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}

function validate_status_search() {
    var message = '';

    if( ! $F('search_location').match( /[0-9]+/ ) ){
        message += "You must select an airport.\n";
        $('search_location').addClassName( 'invalid_input' );
    }
    else{
        $('search_location').removeClassName( 'invalid_input' );
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}

function validate_user_search() {
    var message = '';

    if( emptyField($('search_username')) && emptyField($('search_email'))
        && emptyField($('search_user_type')) && $('search_account_status').value == 'ALL'){
        message += "You must enter a username, an email, a user type, or an account status.\n";
        $('label_for_username').addClassName( 'invalid_input' );
        $('label_for_email').addClassName( 'invalid_input' );
        $('label_for_user_type').addClassName( 'invalid_input' );
        $('label_for_account_status').addClassName( 'invalid_input' );
    }
    else{
        if( $('search_username').value && ! $('search_username').value.match( /^[A-Za-z0-9]{4,16}$/ ) ){
            message += "Username must be between 4 and 16 characters.\n";
            $('label_for_username').addClassName( 'invalid_input');
        } else {
        $('label_for_username').removeClassName( 'invalid_input');
                }
        if( $('search_email').value && ! $('search_email').value.match( /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/ ) ) {
            message += "Email must be a valid email address.\n";
            $('label_for_email').addClassName( 'invalid_input');
        } else {
            $('label_for_email').removeClassName( 'invalid_input');
        }
        $('label_for_user_type').removeClassName( 'invalid_input' );
        $('label_for_account_status').removeClassName( 'invalid_input' );
    }


    if( message ){
        alert( message );
        return false;
    }
    return true;
}

function validate_user_events_search() {
    var message = '';

    if( ! $('search_username').value.match( /^[A-Za-z0-9]{4,16}$/ ) ){
        message += "Username is required and must be between 4 and 16 characters.\n";
        $('label_for_username').addClassName( 'invalid_input');
    } else {
        $('label_for_username').removeClassName( 'invalid_input');
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}

function validate_payment_search(){
    var shouldSubmit =  validate_form();
    var submitButton = $('submit_payment_search');
    if (!shouldSubmit && valid(submitButton)) {
        attachError(submitButton, 'Please review your entries.');
    }
    return shouldSubmit;
}

function set_can_has_payments( bool ){
    if( bool ){
        $( 'can_has_payments').value = 'true';
    }
    else{
        $( 'can_has_payments').value = '';
    }
}


function hightlight_payment_rows(){
    i = 0;
    $( 'awb_financial_matrix' ).select( 'tr' ).each( function( elem ){
            i = i ? 0 : 1;
            if( i ){
                //$( elem ).removeClassName( 'rowhoverhighlight' );
                $( elem ).addClassName( 'highlight' );
            }
            else{
                $( elem ).addClassName( 'rowhoverhighlight' );
               // $( elem ).removeClassName( 'highlight' );
            }
        } );
}

function save_awb_payments(){
    params = $( 'awb_payment_form' ).serialize();
    new Ajax.Request( 'payments',{
        parameters: params,
        onComplete: function( response, bool ){
            if( bool ){
                return true;
            }
            else{
                return false;
            }
        }
    });

}

function get_awb_financials( awb_id ){
    //remove any rows from a previous call
    if ( ! top.valid($('total_amount')) ) {
        return false;
    }
    $( 'total_amount' ).value = "0.00";

    is_tbody = $( 'asi_awb_charges_header' ).next();
    if( is_tbody ){
        $( 'awb_financial_matrix').select( '.template_row').each( function( tbody ){ $( tbody ).remove(); } );
         //remove my id's
        $( 'finicials_row_template' ).select( 'td' ).each( function( cell ) {
           $( cell ).select( '.charge_amount_hidden' ).each( function( hidden ) {
                $( hidden ).writeAttribute( 'id', false );
           });
        });
        $( 'zarro_charges' ).addClassName( 'hide_me' );
    }
    if( ! awb_id ){
        return true;
    }
    $( 'finicial_gathering_in_process' ).innerHTML = '<img src="../images/spinner.gif" />';
    new Ajax.Request( 'acceptance_ajax',{
        parameters: "action=get_awb_financials&awb_id=" +  awb_id,
        onComplete: function( response, data ){
            $( 'finicial_gathering_in_process' ).innerHTML = '';
            if( data.finincials ){
                $A( data.finincials ).each( function( charge ){
                    inject_charge_row( charge );
                });
                $( 'zarro_charges' ).removeClassName( 'hide_me' );
                hightlight_payment_rows();
            }
        }
    });
    return true;
}

//i require an <tbody id=asi_awb_charges_header> for my .after injection
function inject_charge_row( charge ){
    if(charge.balance_due == null) charge.balance_due = '0.00';
    charge.balance_due_float = parseFloat(charge.balance_due.replace( /,/g, '' ));
    if( charge.payment_date || (charge.balance_due_float == 0) ){
         $( 'finicials_row_template' ).select( 'tr' ).each( function( row ) {
            $( row ).addClassName( 'paid' );
        });
    }
    else{
        top.unpaid_awb_charges = true;
        $( 'finicials_row_template' ).select( 'tr' ).each( function( row ) {
            $( row ).addClassName( 'unpaid' );
        });
    }

    $( 'finicials_row_template' ).select( 'td' ).each( function( cell ) {
        if( $( cell ).hasClassName( 'charge_name' ) ){
            $( cell ).innerHTML = charge.charge_name;
        }
        if( $( cell ).hasClassName( 'charge_amount' ) ){
            $( cell ).innerHTML = charge.amount;
        }
        if( $( cell ).hasClassName( 'charge_balance') ){
            if( charge.balance_due_float > 0 ){
                $( cell ).innerHTML = charge.balance_due;
            }
            else{
                if( charge.payment_date ) {
                    $( cell ).innerHTML = charge.payment_date;
                }
                else{
                    $( cell ).innerHTML = '--';
                }
            }
        }
        $( cell ).select( '.pay_these' ).each( function( checkbox ) {
            if( charge.balance_due_float > 0 ){
                $( checkbox ).enable();
                $( checkbox ).value = charge.charge_id;
            }
            else{
                $( checkbox ).disable();
            }
        });

        $( cell ).select( '.payment_paid' ).each( function( span ) {
            if( charge.balance_due_float > 0 ){
                span.hide();
            }
            else{
                span.show();
            }
        });
        $( cell ).select( '.payment_unpaid' ).each( function( span ) {
            if( charge.balance_due_float > 0 ){
                span.show();
            }
            else{
                span.hide();
            }
        });
        $( cell ).select( '.charge_amount_hidden' ).each( function( hidden ) {
            $( hidden ).value = charge.amount;
            $( hidden ).id = charge.charge_id;
        });
    });
    $( 'payment_currency' ).innerHTML = charge.currency_code;
    appendElement( 'asi_awb_charges_header', 'finicials_row_template', 'after' );
    reset_awb_financial_matrix();
}

function reset_awb_payment_form(){
    get_awb_financials( 0 );
    $( 'awb_payment_form' ).reset();
}

function reset_awb_financial_matrix(){
     $( 'finicials_row_template' ).select( 'td' ).each( function( cell ) {
         if( $( cell ).hasClassName( 'charge_name' ) ){
            $( cell ).innerHTML = '';
        }
        if( $( cell ).hasClassName( 'charge_amount' ) ){
            $( cell ).innerHTML = '';
        }
        if( $( cell ).hasClassName( 'charge_balance') ){
            $( cell ).innerHTML = '';
        }
        $( cell ).select( '.pay_these' ).each( function( checkbox ) {
            $( checkbox ).value = '';
        });
        $( cell ).select( '.charge_amount_hidden' ).each( function( hidden ) {
            $( hidden ).writeAttribute( 'value', '' );
            $( hidden ).writeAttribute( 'id', false );
        });
    });
    $( 'finicials_row_template' ).select( 'tr' ).each( function( row ) {
        $( row ).removeClassName( 'paid' );
        $( row ).removeClassName( 'unpaid' );
    });
}

/*
 pass_thru == return message to calling function
 in order to chain form validations together.
*/
function validate_payment_form( pass_thru ){
    message = '';
    $( 'label_for_charges' ).removeClassName( 'invalid_input' );
    $( 'label_for_form_of_payment' ).removeClassName( 'invalid_input' );
    $( 'label_for_check_number' ).removeClassName( 'invalid_input' );
    $( 'label_for_cc_digits' ).removeClassName( 'invalid_input' );

    nothing_to_pay = true;
    $$('.pay_these' ).each( function( checkbox ){
        if( $( checkbox ).checked ){
            nothing_to_pay = false;
        }
    });

    if( nothing_to_pay && ! pass_thru ){
        $( 'label_for_charges' ).addClassName( 'invalid_input' );
        message += "You must select at least one charge to pay to continue.\n";
    }
    else {
        if( $( 'form_of_payment' ).value.match( /^[0]$/ ) ){
            $( 'label_for_form_of_payment' ).addClassName( 'invalid_input' );
            message += "Form of payment if required.\n";
        }
        else{
            $( 'label_for_form_of_payment' ).removeClassName( 'invalid_input' );
        }
        if( $( 'form_of_payment' ).value.match( /^check$/ ) ){
            if( $( 'check_number' ).value.match( /[0-9]/ ) ){
                $( 'label_for_check_number' ).removeClassName( 'invalid_input' );
            }
            else{
                $( 'label_for_check_number' ).addClassName( 'invalid_input' );
                message += "Check number is required when paying via check.\n";
            }
        }
        else if(  $( 'form_of_payment' ).value.match( /^credit_card$/ ) ){
            if( $( 'cc_digits' ).value.match( /[0-9]{4}/ ) ){
                $( 'label_for_cc_digits' ).removeClassName( 'invalid_input' );
            }
            else{
                $( 'label_for_cc_digits' ).addClassName( 'invalid_input' );
                message += "Last 4 digits of credit card number are required when paying via Credit card.\n";
            }
        }
    }

    if( pass_thru ){
        return message;
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}

function toggle_form_of_payment_extras( form_of_payment ){
    $( 'credit_card_extra').addClassName( 'hide_me');
    $( 'check_extra' ).addClassName( 'hide_me' );
    if( form_of_payment.match( /^check$/ ) ){
        $( 'check_extra' ).removeClassName( 'hide_me' );
    }
    else if(  form_of_payment.match( /^credit_card$/ ) ){
       $( 'credit_card_extra').removeClassName( 'hide_me');
    }

}

function calculate_total_amount(){
    amount_to_pay = 0;
    $$('.pay_these' ).each( function( checkbox ){
        if( $( checkbox ).checked ){
            my_id = $( checkbox).value;
            amount_to_pay = amount_to_pay + toNumeric( $( my_id ).value.replace( /,/g, '' ) );
        }
    });
    $( 'total_amount' ).value = sprintf( '%.2f', convert_currency( amount_to_pay, $( 'awb_conversion_rate').value ) );
}


function check_international_status(){
    if( $( 'sales_tax_row' ) || $( 'label_for_surcharges') ){
        if( is_international_location( $( 'origin_id').value ) || is_international_location( $( 'destination_id').value ) ) {
            $( 'sales_tax_row' ).addClassName( 'hide_me');
            $( 'label_for_surcharges').innerHTML = "Tax";
        }
        else{
            $( 'sales_tax_row' ).removeClassName( 'hide_me');
            $( 'label_for_surcharges').innerHTML = "Other Taxes";
        }
    }
}

function get_origin_currency(){
    top.max_declared_value = 5000;
    new Ajax.Request( 'acceptance_ajax',{
         parameters: "action=get_origin_currency&origin=" +  $('origin_id').value,
            onComplete: function( response, currency ){
                if(currency){
                    top.assignToElem($( 'currency' ), currency.code);
                    top.assignToElem($( 'conversion_from_usd' ), currency.rate);

                    if( top.valid($('currency_code_display_legend')) ){
                        $( 'currency_code_display_legend' ).innerHTML =  currency.code;
                    }
                    if( top.valid($('currency_code_display_pricing')) ){
                        $( 'currency_code_display_pricing' ).innerHTML =  currency.code;
                    }

                    top.max_declared_value = convert_currency( 5000, currency.rate );
                    if( top.valid($( 'declared_value_amount' ))) {
                        $( 'declared_value_amount' ).innerHTML = sprintf( '%.2f', top.max_declared_value );
                    }
                    if( top.valid($( 'declared_value_currency' ))) {
                        $( 'declared_value_currency' ).innerHTML = currency.code;
                    }
                    if( top.valid($( 'customs_value_currency' ))) {
                        $( 'customs_value_currency' ).innerHTML = currency.code;
                    }
                    if( top.valid($('extra_charges')) && $('extra_charges').value){
                        top.assignToElem($('charges_due_agent').value, sprintf( '%.2f',Math.round( $('extra_charges').value * currency.rate * 100 ) / 100 ));
                    }
                    if( top.valid($('carrier_charges')) && $('carrier_charges').value){
                        top.assignToElem($('carrier_charges_entry'), sprintf( '%.2f',Math.round( $('carrier_charges').value * currency.rate * 100 ) / 100 ));
                    }
                    if( ! $( 'awb_id').getValue() ){ //if we have an awb loaded, this will already be populated.
                        top.assignToElem($( 'weight_type' ), currency.weight_type);
                    }
                }
            }
    });

}

function convert_currency( amount, rate ){
    return amount * rate;
}

function expandItinerary() {
    $('expandItinerary').hide();
    $('contractItinerary').show();
    $('expandedItinerary').show();
}
function contractItinerary() {
    $('expandItinerary').show();
    $('contractItinerary').hide();
    $('expandedItinerary').hide();
}
function setItineraryOverride(val){
    $('itineraryOverride').value = val;
}

function get_rates( selected, desc ){
    selected = ( selected && selected.match( /^(SCR[0-9]{3,}|HUMANR|GEN|AVI|HRS|MISC|QUIKPAK)$/) ) ? selected : null;
    if( !selected ) {
        //Attempt to preserve current choice through the AJAX rate reload
        selected = $F('goods_desc');
        desc     = $F('description');
//  alert('selected set to current value '+selected);
    }

    if( ( $( 'origin_id').value.match( /[0-9]{1,}/ ) && $( "destination_id" ).value.match( /[0-9]{1,}/ ) ) ){
        new Ajax.Request( 'acceptance_ajax',{
            parameters: "action=get_rates&can_book_hr=" + $( 'can_book_hr' ).value + "&origin=" +  $('origin_id').value + "&destination=" +  $('destination_id').value,
            onComplete: function( response, rates ){
                if( top.isEmpty( rates ) ){
                    alert( "Unable to locate matching commodity codes to price your AWB.\nPlease check that we fly between your origin and destination" );
                    $A( $('goods_desc').options).each( function( option ){ bind( option ).remove(); });
                    new_option = document.createElement( "option" );
                    new_option.text = "--No valid rate found--";
                    new_option.value = 0;
                    new_option.selected = true;
                    $('goods_desc').options.add( new_option );
                    $('label_for_goods_description').addClassName( 'invalid_input');
                    $('goods_desc').addClassName('invalid_input');
                    return;
                }
                $A( $('goods_desc').options).each( function( option ){ bind( option ).remove(); });

                top.rate_subcats = new Hash();

                if( $( 'shipper_account').value.match( /^jbhrs$/i ) || $( 'consignee_account').value.match( /^jbhrs$/i ) ) {
                    new_option = document.createElement( "option" );
                    new_option.text = 'ALL HUMAN REMAINS';
                    new_option.value = 'HUMANR';
                    $('goods_desc').options.add( new_option );
                    if( selected && selected == rates[0] ){
                        new_option.selected = true;
                    }
                    top.rate_subcats.set('HUMANR', new Array('ALL HUMAN REMAINS'));
                    update_goods_desc('ALL HUMAN REMAINS');
                }
                else{
                    var blank_option = document.createElement( "option" );
                    blank_option.text = '--choose--';
                    blank_option.value = '';
                    $('goods_desc').options.add( blank_option );
                    var selected_found = false;

                    $H( rates ).each( function( rate, key ) {
                        var scr_code;
                        new_option = document.createElement( "option" );
                        if ( (results = rate[0].match( /(\w+):(\w+)/ )) ) {
                            scr_code = results[1];
                            new_option.value = results[1];
                            new_option.text = results[2];
                            top.rate_subcats.set(results[1], rate[1]);
                        } else {
                            scr_code = rate[0];
                            new_option.value = rate[0];
                            new_option.text = rate[1];
                            top.rate_subcats.set(rate[0], rate[1]);
                        }
//                      alert('testing new_option text='+new_option.text+' value='+new_option.value);
                        $('goods_desc').options.add( new_option );
                        if( selected && (selected == scr_code) ){
//                          alert('new_option matched selected='+selected);
                            new_option.selected = true;
                            selected_found = true;
                        }
                    });

                    if( selected_found ){
                        update_goods_desc( desc );
                    } else {
                        blank_option.selected = true;
                        $('description').enable();
                    }
                }

                $('goods_desc').enable();
                $('label_for_goods_description').removeClassName( 'invalid_input');
                $('goods_desc').removeClassName('invalid_input');
                check_for_hr();
            }
        });
    }
}
function update_goods_desc( selected_desc ) {
    var scr_code = $('goods_desc').value;
    var subcats = rate_subcats.get(scr_code);
    var option_count = 0;
    $( 'description' ).show();

    $A( $('description').options).each( function( option ){ bind( option ).remove(); });

    if( subcats.length > 1 ){
        var blank_option = document.createElement( "option" );
        blank_option.text = '--choose--';
        blank_option.value = '';
        $('description').options.add( blank_option );
    }

    subcats.each( function( desc ) {
        new_option = document.createElement( "option" );
        new_option.value = desc;
        new_option.text = desc;
        $('description').options.add( new_option );
        option_count++;
        if( selected_desc && selected_desc == desc ){
            //alert('new_option matched selected='+selected_desc);
            new_option.selected = true;

        }


        if( subcats.length > 1 ){
            $( 'one_rate_description' ).innerHTML = '';

        }
        else{
            $( 'one_rate_description' ).innerHTML = desc;
            $( 'description' ).hide();

        }


    });
    
    if( scr_code.match( /QUIKPAK/) ){
        $( 'quikpak_notes' ).innerHTML = "QUIKPAK has a maximum of 60 inches length.";
    }
    else{
        $( 'quikpak_notes' ).innerHTML = "&nbsp;";
    }
    
    $('description').enable();
    $('label_for_goods_description').removeClassName( 'invalid_input');
    $('description').removeClassName('invalid_input');
}

function get_drop_off_hours(){
    my_date = new Date( $('drop_off_date_year').value,  $('drop_off_date_month').value -1, $('drop_off_date_day').value );
    dow = my_date.getDay();

    selected_hour = $('drop_off_time_hour').value;
    selected_minute = $('drop_off_time_minute').value;

    new Ajax.Request( 'book_ajax',{
        parameters: "action=gh_hours&dow=" + dow + "&origin_id=" +  $('origin_id').value,
        onComplete: function( response, gh_data ){

            $A( $('drop_off_time_hour').options).each( function( option ){ bind( option ).remove(); });

            start_hour = gh_data.opens.split( ':', 2 );

            end_hour = gh_data.closes.split( ":", 2 );
            num_hour = gh_data.num_hours.split( ":", 1 );
            
            if( parseInt( num_hour ) < 0 ){
                num_hour = 23 + ( start_hour[0] - Math.abs( num_hour ) );
            }
           
            // put in 0000 today if yesterday's closing time is 2400 & we don't open at 0000 already
            if(gh_data.midnight && (start_hour[0] != "00")) {
                new_option = document.createElement( "option" );
                new_option.text = sprintf( '%02d', 0 );
                new_option.value = sprintf( '%02d', 0 );
                $('drop_off_time_hour').options.add( new_option );
                if( selected_hour == 0 ){
                    new_option.selected = true;
                }
            }

            for ( i = start_hour[0]; i <= num_hour ; i++ ){
                //if ( i > 23 ) break;
                new_option = document.createElement( "option" );
                x = i;
                if( i > 23 ){
                    x = x - 24;
                    if( selected_hour < start_hour[0] ){
                       $( 'drop_off_time_notes' ).innerHTML = "Please note drop off time is after midnight on the day you've selected.";
                    }
                    else{
                        $( 'drop_off_time_notes' ).innerHTML = "";
                    }
                }
                new_option.text = sprintf( '%02d', x );
                new_option.value = sprintf( '%02d', x );
                $('drop_off_time_hour').options.add( new_option );
                if( selected_hour == x ){
                    new_option.selected = true;
                }
            }

            if( selected_hour == start_hour[0] ){
                if( start_hour[1] == '30' ){
                    $A( $('drop_off_time_minute').options).each( function( option ){ bind( option ).remove();});
                    new_option = document.createElement( "option" );
                    new_option.text = sprintf( '%02d', '30' );
                    new_option.value = sprintf( '%02d', '30' );
                    $('drop_off_time_minute').options.add( new_option );
                    if( selected_minute == '30' ){
                        new_option.selected = true;
                    }
                }
            }
            else if( selected_hour == end_hour[0] ){
                if( end_hour[1] == '30' ){
                    $A( $('drop_off_time_minute').options).each( function( option ){ bind( option ).remove();});
                    new_option = document.createElement( "option" );
                    new_option.text = sprintf( '%02d', '00' );
                    new_option.value = sprintf( '%02d', '00' );
                    $('drop_off_time_minute').options.add( new_option );
                    if( selected_minute == '00' ){
                        new_option.selected = true;
                    }
                }
            }
            else{
                $A( $('drop_off_time_minute').options).each( function( option ){ bind( option ).remove();});
                new_option = document.createElement( "option" );
                new_option.text = sprintf( '%02d', '00' );
                new_option.value = sprintf( '%02d', '00' );
                $('drop_off_time_minute').options.add( new_option );
                if( selected_minute == '00' ){
                    new_option.selected = true;
                }

                if( end_hour[0] != 24 ){
                    new_option = document.createElement( "option" );
                    new_option.text = sprintf( '%02d', '30' );
                    new_option.value = sprintf( '%02d', '30' );
                    $('drop_off_time_minute').options.add( new_option );
                    if( selected_minute == '30' ){
                        new_option.selected = true;
                    }
                }
            }
        }
    });
}

function check_for_hr(){
    if( $('goods_desc').value.match( /(HUMANR|HRS)/) ){
        $('hr_form_row').show();
        $('flight_form_row').show();
    }
    else{
        $('hr_form_row').hide();
        if($('action').value == 'save_book')
            $('flight_form_row').hide();
    }
}

function check_for_user_type_customer() {
    if( top.valid($('user_type')) && $('user_type').value ) {
        if ( $('user_type').value == 'CUSTOMER' ){
            $( 'customer_row' ).show();
        }
        else{
            $( 'customer_row' ).hide();
        }
    } else {
        if ( $('user_type').innerHTML == 'CUSTOMER' ) {
            $( 'customer_row' ).show();
        }
        else{
            $( 'customer_row' ).hide();
        }
    }
}

function validate_surcharge_form(){
    message = '';

    if( $( 'origin_id').value.match( /[-]{3}/ ) ){
        message += "You must select an origin.\n";
        $( 'label_for_origin_id').addClassName( 'invalid_input' );
    }
    else{
        $( 'label_for_origin_id').removeClassName( 'invalid_input' );
    }

    if( ! $( 'description').value.match( /[a-zA-Z0-9]/) ){
        message += "Description is required and must be letters and numbers.\n";
        $( 'label_for_description' ).addClassName( 'invalid_input' );
    }
    else{
        $( 'label_for_description' ).removeClassName( 'invalid_input' );
    }

    if( $( 'tax_calc_type').value.match( /[-]{3}/ ) ){
        message += "You must select a tax calculation type.\n";
        $( 'label_for_tax_calc_type' ).addClassName( 'invalid_input' );
    }
    else{
        $( 'label_for_tax_calc_type' ).removeClassName( 'invalid_input' );
    }

    if( ! $( 'tax' ).value.match( /^(?:\d+\.\d+|\d+|\.\d+)$/ ) ){
        message += "You must provide a number with optional decimal for tax.\n";
        $( 'label_for_tax' ).addClassName( 'invalid_input' );
    }
    else{
        $( 'label_for_tax' ).removeClassName( 'invalid_input' );
    }

    if( message ){
        alert( message );
        return false;
    }
    return false;
}

function validate_tracking_form(){
    message = '';

    if(
        ( $('start_date_year').value.match( /[0-9]/ ) &&
          $('start_date_month').value.match( /[0-9]/ ) &&
          $('start_date_day').value.match( /[0-9]/ ) ) ||
        ( !$('start_date_year').value.match( /[0-9]/ ) &&
          !$('start_date_month').value.match( /[0-9]/ ) &&
          !$('start_date_day').value.match( /[0-9]/ ) )
    ) {
        $( 'label_for_start_date').removeClassName( 'invalid_input' );
    }
    else{
        message += "Please select year, month, and day for the start date.\n";
        $( 'label_for_start_date').addClassName( 'invalid_input' );
    }

    if(
        ( $('end_date_year').value.match( /[0-9]/ ) &&
          $('end_date_month').value.match( /[0-9]/ ) &&
          $('end_date_day').value.match( /[0-9]/ ) ) ||
        ( !$('end_date_year').value.match( /[0-9]/ ) &&
          !$('end_date_month').value.match( /[0-9]/ ) &&
          !$('end_date_day').value.match( /[0-9]/ ) )
    ) {
        $( 'label_for_end_date').removeClassName( 'invalid_input' );
    }
    else{
        message += "Please select year, month, and day for the end date.\n";
        $( 'label_for_end_date').addClassName( 'invalid_input' );
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}

Array.prototype.append = function (obj) {
    this[this.length] = obj;
};

top.compareNumbers = compareNumbers = function ( a, b ) {
    if(a > b) {
        return 1;
    }
    if(a < b) {
        return -1;
    }
    return 0;
};

document.observe("ams:master", function(event) {
    toggle_master();
});

top.getRadioValue = getRadioValue = function (formID, radioName) {
    var form = $('print_form');
    var radioValue = null;
    if ( ! valid( form ) ) {
        return null;
    }
    var radios = form.getInputs('radio', radioName);
    if ( ! valid( radios ) || radios.length <= 0 ) {
        return null;
    }
    try {
        radioValue = radios.find(
            function( radio ) { return radio.checked; }
        ).value;
    } catch (e) {
        return null;
    }
    return radioValue;
};

top.emptyField = emptyField = function ( element ) {
    if ( ! valid( element ) ) return true;

    var wRE = new RegExp('^\\s+$');

    var defaultRE = new RegExp('--');

    var value = $F(element);

    if ( ! valid( value ) ) return true;

    return wRE.match(value) || defaultRE.match(value) || !element.present() || value == '';
};

function open_b6_main_menu_item( url ){
    window.open( url, "b6_main_site", 'top=100, left=100, width=890, height=600, toolbar=1, status=1, menubar=1' );
}

function toggle_more_ams(suffix){
    $('more_ams_messages' + suffix).toggle();
    if($('show_more_ams_flights' + suffix).innerHTML.match( /more/ ) ){
        $('show_more_ams_flights' + suffix).innerHTML = '(less)';
    }
    else{
        $('show_more_ams_flights' + suffix).innerHTML = '(more)';
    }
}

valueRepo = function () {
    this.elems = {};
    this.store = function(elems) {
        for (var i = 0; i < elems.length; ++i) {
            var elem = elems[i];
            if (elem && elem.id) {
                this.elems[elem.id] = elem.value;
            }
        }
    };
    this.retrieve = function () {
        for (var id in this.elems) {
            var value = this.elems[id];
            $(''+id).value = value;
        }
        this.clear();
    };
    this.clear = function() {
        this.elems = {};
    };
};

function toggle_master(){
    if (!valid(top.repo)) top.repo = new valueRepo();

    clearErrors();

    var is_master = $F('is_master');
    if ( valid( is_master ) ) {
        $('flight_details').hide();
        $$('.ams-message.master #flight_details .inspect').invoke('writeAttribute', 'ignore', true);
        $$('.ams-message.hawb .inspect').invoke('writeAttribute', 'ignore', false);
        top.repo.retrieve();
        top.repo.store($$('.ams-message.master .weight-calc'));
        top.repo.store($$('.ams-message.master .piece-calc'));
        $$('.ams-message.master .weight-calc').invoke('clear');
        $$('.ams-message.master .piece-calc').invoke('clear');
        calculate_subtotals();
        $('hawbs').show();
    } else {
        $('hawbs').hide();
        top.repo.retrieve();
        top.repo.store($$('.ams-message.hawb .weight-calc'));
        top.repo.store($$('.ams-message.hawb .piece-calc'));
        $$('.ams-message.hawb .piece-calc').invoke('clear');
        $$('.ams-message.hawb .weight-calc').invoke('clear');
        calculate_subtotals();
        $('flight_details').show();
        $$('.ams-message.master #flight_details .inspect').invoke('writeAttribute', 'ignore', false);
        $$('.ams-message.hawb .inspect').invoke('writeAttribute', 'ignore', true);
    }
}

function is_partial(container) {
    calculated_pieces = $(container).select('.calculated_pieces')[0];
    calculated_weight = $(container).select('.calculated_weight')[0];
    total_pieces = $(container).select('.pieces')[0];
    total_weight = $(container).select('.weight')[0];

    if ( valid(calculated_pieces) && valid(calculated_weight)
         && valid(total_pieces) && valid(total_weight) ) {
        return ( toNumeric(total_pieces.value) != toNumeric(calculated_pieces.value) ) ||
               ( toNumeric(total_weight.value) != toNumeric(calculated_weight.value) );
    }
    return false;
}

function set_partial_warning_visibility( show, container ) {
    warning_elem = $(container).select('.partial_warning')[0];
    partial_checkbox = $(container).select('.is_partial')[0];
    if ( !valid( warning_elem ) ) return;
    partial_checkbox.writeAttribute('ignore', !show);
    if (show) {
//        partial_checkbox.checked = false;
        warning_elem.show();
    } else {
        warning_elem.hide();
        partial_checkbox.checked = false;
    }
}

function consider_partial_warning(container) {
    set_partial_warning_visibility(is_partial(container),container);
}

function consider_partial_warning_listener(event) {
    classname = $(Event.element(event)).className;
    if(/(piece|weight)/.test(classname)) {
        container = $(Event.element(event)).up('.ams-message');
        consider_partial_warning(container);
    }
}

function register_partial_warning_listener(container) {
    Event.observe($(container), 'change', consider_partial_warning_listener);
}


function calculate_totals() {
    weights = $$(".weight-subtotal").pluck('value');
    pieces = $$(".piece-subtotal").pluck('value');

    calc_weight_total = $$(".weight-total");
    calc_piece_total = $$(".piece-total");

    weight_total = $('weight');
    piece_total = $('pieces');

    total = 0;

    for (i=0;i < weights.length; ++i) {
        total += toNumeric(weights[i]);
    }
    if (calc_weight_total.length>0) {
        calc_weight_total[0].value = total;
    }
    /*
    if ( ! tainted( weight_total ) ) {
        weight_total.value = total;
    }
    */
    total = 0;
    for (i=0;i < pieces.length; ++i) {
        total += toNumeric(pieces[i]);
    }
    if (calc_piece_total.length>0) {
        calc_piece_total[0].value = total;
    }
    /*
    if ( ! tainted( piece_total )  ) {
        piece_total.value = total;
    }
    */
    $$(".ams-message").each(consider_partial_warning);
}

function calculate_subtotals() {
    var ids = $$('.ams-message').invoke('identify');
    for (var i = 0; i < ids.length; ++i) {
        var id = ids[i];
        if (valid(id)) {
            calculate_subtotal('#' + id);
        }
    }
    calculate_totals();
}

function calculate_subtotal(elemId) {
    weights = $$(elemId + " .weight-calc").pluck('value');
    pieces = $$(elemId + " .piece-calc").pluck('value');
    weight_total = $$(elemId + " .weight-subtotal");
    piece_total = $$(elemId + " .piece-subtotal");
    total = 0;

    for (i=0;i < weights.length; ++i) {
        total += toNumeric(weights[i]);
    }
    if (weight_total.length>0) {
        weight_total[0].value = total;
    }
    total = 0;
    for (i=0;i < pieces.length; ++i) {
        total += toNumeric(pieces[i]);
    }
    if (piece_total.length>0) {
        piece_total[0].value = total;
    }
}

function addXfer(flight, id_suffix, flight_id) {

    var xfer_props = get_xfer_info(flight, id_suffix);

    var ams_transfer_id = 'ams_transfer_id_' + xfer_props.lastIdx + xfer_props.newxfers_suffix;
//    if ( $(ams_transfer_id) && $(ams_transfer_id).value ) {
//        $('xfer_id_' + xfer_props.lastIdx + xfer_props.newxfers_suffix).show();
//        $('ams_transfer_delete_' + xfer_props.lastIdx + xfer_props.newxfers_suffix).value = '';
//    }
//    else {
    if ( xfer_props.lastIdx <= 0 ) {
        target = 'firstxfers'+xfer_props.newxfers_suffix;
    } else {
        target = 'newxfers'+xfer_props.newxfers_suffix;
    }

    var url = 'ams_message';

    var link = $('addxfer'+xfer_props.newxfers_suffix);
    if (valid(link)) link.addClassName('loading');

    new Ajax.Updater(
        {
            success : target
        },
        url,
        {
            parameters: {
                'action':        'insertxfer',
                'flight_idx':    flight,
                'xfer_idx':      xfer_props.lastIdx++,
                'ams_flight_id': flight_id,
                'id_suffix':     id_suffix
            },
            insertion: 'bottom',
            onComplete: function () {
                if (top.valid(link)) link.removeClassName('loading');
                $(target).show();
                $('removexfer'+xfer_props.newxfers_suffix).show();
                if ( isNumeric(xfer_props.lastIdx_mawb) && xfer_props.lastIdx_mawb < xfer_props.lastIdx) {
                    addXfer(flight, '');
                }
                $('flight_header_'+(++flight)+id_suffix).show();
            }
        }
    );
//    }
}

function removeXfer(flight, id_suffix) {

    var xfer_props = get_xfer_info(flight, id_suffix);

//    if ( $('ams_transfer_id_' + xfer_props.lastIdx + xfer_props.newxfers_suffix).value ) {
//        $('ams_transfer_delete_' + --xfer_props.lastIdx + xfer_props.newxfers_suffix).value = '1';
//        $('xfer_id_' + xfer_props.lastIdx + xfer_props.newxfers_suffix).hide();
//    } else {
    $('xfer_id_' + --xfer_props.lastIdx + xfer_props.newxfers_suffix).remove();

    if (xfer_props.lastIdx <= 0) {
        $('xfer_id'    + xfer_props.newxfers_suffix).remove();
        $('removexfer' + xfer_props.newxfers_suffix).hide();
        flight_header = 'flight_header'+ ++flight;
        $(flight_header).hide();
    }
 //    }
}

function get_xfer_info(flight, id_suffix) {
    var newxfers_suffix = '_'+flight+id_suffix;

    var idxElems = $$('.xfer_class' + newxfers_suffix).findAll(
        function(o){return o.visible();});

    var lastIdx = valid(idxElems.last()) ? idxElems.size() : 0;

    var xfer_props = {newxfers_suffix: newxfers_suffix, lastIdx: lastIdx };

    var mawb_props;
    if(id_suffix){
        mawb_props = get_xfer_info(flight, '');
        xfer_props.newxfers_suffix_mawb = mawb_props.newxfers_suffix;
        xfer_props.lastIdx_mawb = mawb_props.lastIdx;
    }

    return(xfer_props);
}

function update_ams_transfer_rules(suffix) {
    if ( $('xfer_type_' + suffix).value == 'Airport' ) {
        $('destination_' + suffix).addClassName('inspect');
        $('code_' + suffix).removeClassName('inspect');
    }
    else if ( $('xfer_type_' + suffix).value == 'Facility' ) {
        $('destination_' + suffix).removeClassName('inspect');
        $('code_' + suffix).addClassName('inspect');
    }
    else if ( $('xfer_type_' + suffix).value == 'In-Bond' ) {
        $('destination_' + suffix).addClassName('inspect');
        $('code_' + suffix).addClassName('inspect');
    }
}


function addHawb() {

    var idxElem = $$('.hawb_ids').last();

    var lastIdx = valid(idxElem) && valid(idxElem.value) ? toNumeric(idxElem.value) : 0;

    var url = 'ams_message';

    var link = $('addhawb');
    if (valid(link)) link.addClassName('loading');

    new Ajax.Updater(
        {
            success : 'newhawbs'
        },
        url,
        {
            parameters: {
                'action': 'inserthawb',
                'hawb_idx': ++lastIdx
            },
            insertion: 'bottom',
            onComplete: function () {
                /*
                var elem = $$('.ams-message').last();
                if (top.valid(elem)) elem.scrollTo();
                */
                var link = $('addhawb');
                if (top.valid(link)) link.removeClassName('loading');
                register_partial_warning_listener('hawb_'+lastIdx);
            }
        }
    );
}

function removeHawb(id) {
    var idx = toNumeric(id);
    if (idx <= 0) return;
    var elem = $('hawb_'+idx);
    if (valid(elem)) {
        $(elem).select(".calculated_pieces")[0].value = '';
        $(elem).select(".calculated_weight")[0].value = '';
        $(elem).select(".piece-subtotal")[0].value = '';
        $(elem).select(".weight-subtotal")[0].value = '';
        calculate_totals();
        Event.stopObserving(elem);
        elem.remove();
    }
}

function lookup_ams_awb_data(post_entry){
    var message = '';
    if(!$F('awb_number').match(/^[0-9]{8}/)) {
        message += "AWB number must be 8 digits.\n";
    }
    if(!$F('awb_prefix').match(/^[0-9]{3}/)) {
        message += "AWB prefix must be 3 digits.\n";
    }

    if(message) {
        $('label_for_awb_number').addClassName('invalid_input');
        alert(message);
        return;
    }

    $('label_for_awb_number').removeClassName( 'invalid_input');
    $('awb_twirlly_thinger').innerHTML = '<img src="../images/spinner.gif" />';
    new Ajax.Request( 'ams_message?action=lookup_awb',{
        parameters: "awb=" + $('awb_prefix').value + $('awb_number').value,
        onComplete: function(response, ams){
            //alert  (ams.already_exists );
            if( ams.already_exists ){
                alert( 'That AWB  already has an AMS message.  You must amend the existing message or face fines from customs when they take your cargo!');
                return;
            }
            else if( ams.origin ){
                if( post_entry ){
                    if ( confirm('Post-entry AMS messages should not be used for normal air waybills. Go to the normal AMS page?' ) ) {
                        url = window.location.href;
                        url= url.replace("post_entry","add");
                        window.location.replace(url);
                    }
                    else {
                        $('label_for_awb_number').addClassName( 'invalid_input');
                        $('awb_twirlly_thinger').innerHTML = "";
                    }
                    return;
                }
                try {
                    $('awb_twirlly_thinger').innerHTML = "";

                    top.assignToElem($( 'origin' ), ams.origin);
                    top.assignToElem($( 'destination' ), ams.destination);
                    top.assignToElem($( 'pieces' ), ams.pieces);
                    top.assignToElem($( 'calculated_pieces' ), ams.calculated_pieces);
                    top.assignToElem($( 'weight' ), ams.weight);
                    top.assignToElem($( 'weight_type' ), ams.weight_type);
                    top.assignToElem($( 'calculated_weight' ), ams.calculated_weight);
                    top.assignToElem($( 'description' ), ams.description);
                    top.assignToElem($( 'scr_code' ), ams.scr_code);

                    top.assignToElem($( 'flight_0' ), ams.flight);
                    top.assignToElem($( 'origin_0' ), ams.origin);
                    top.assignToElem($( 'destination_0' ), ams.destination);
                    top.assignToElem($( 'pieces_0' ), ams.pieces);
                    top.assignToElem($( 'weight_0' ), ams.weight);
                    top.assignToElem($( 'description_0' ), ams.description);

                    top.assignToElem($( 'shipper' ), ams.shipper);
                    top.assignToElem($( 'shipper_address' ), ams.shipper_address);
                    top.assignToElem($( 'shipper_city' ), ams.shipper_city);
                    top.assignToElem($( 'shipper_state' ), ams.shipper_state);
                    top.assignToElem($( 'shipper_postal_code' ), ams.shipper_postal_code);
                    top.assignToElem($( 'shipper_country_code' ), ams.shipper_country_code);
                    update_ams_customer_rules('shipper', '');

                    top.assignToElem($( 'consignee' ), ams.consignee);
                    top.assignToElem($( 'consignee_address' ), ams.consignee_address);
                    top.assignToElem($( 'consignee_city' ), ams.consignee_city);
                    top.assignToElem($( 'consignee_state' ), ams.consignee_state);
                    top.assignToElem($( 'consignee_postal_code' ), ams.consignee_postal_code);
                    top.assignToElem($( 'consignee_country_code' ), ams.consignee_country_code);
                    update_ams_customer_rules('consignee', '');
                } catch (e) {
                  top.e = e;
                }
            }
            else{
                $('awb_twirlly_thinger').innerHTML = "AWB data not found.";
            }
        }
    });
}

function validate_ams_airport(source,target) {
    $(source).value = $(source).value.toUpperCase();
    $(target).value = $(source).value;

    var src_label = 'label_for_'+source;
    var tgt_label = 'label_for_'+target;
    var spinner = $(source+'_twirlly_thinger') || $(target+'_twirlly_thinger');
    if(!$(source).value.match(/^[A-Z]{3}/)) {
        $(src_label).addClassName('invalid_input');
        $(tgt_label).addClassName('invalid_input');
        alert("Airport codes must be three letters.");
        return;
    }

    $(src_label).removeClassName('invalid_input');
    $(tgt_label).removeClassName('invalid_input');
    $(spinner).innerHTML = '<img src="../images/spinner.gif" />';
    new Ajax.Request( 'ams_message?action=lookup_airport',{
        parameters: "airport="+$(source).value,
        onComplete: function(response, airport){
            $(spinner).innerHTML = "";
            if( !airport.id ){
                $(src_label).addClassName('invalid_input');
                $(tgt_label).addClassName('invalid_input');
                alert("Airport code is not valid.");
                return;
            }
        }
    });
}

function copy_ams_shipper_to_consignee(id_suffix) {
    if(id_suffix==undefined || id_suffix==''){id_suffix = "[^0-9]*"; }
    var shipper_regexp = new RegExp("^(shipper"+id_suffix+"|shipper.*?"+id_suffix+"$)");
    var fields = Form.getElements(document.forms["ams_messages_form"]);
    var sources = fields.findAll(function(s){return shipper_regexp.test(s.id);});
    sources.each(function(s){
                     s_id=$(s).id;
                     t= s_id.replace("shipper","consignee");
                     top.assignToElem($(t),$(s).value);
                     //alert(s_id+" -> "+$(t).value);
                 });
}

function validate_annul_form(){
    message = "";
    if( ! $('annul_reason').value ){
        $('label_for_annul_reason').addClassName( 'invalid_input' );
        message += "A reason is required.\n";
    }
    else{
        $('label_for_annul_reason').removeClassName( 'invalid_input' );
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}

function attachError( element, msg ) {
    var msgRE = new RegExp('__MSG__');
    var htmlTxt = '<div class="errormsg">__MSG__</div>';
    element.up().insert( htmlTxt.replace( msgRE, msg ) );
    element.addClassName('invalid_input');
}

function clearErrors() {
    $$('.invalid_input').invoke('removeClassName','invalid_input');
    $$('.errormsg').invoke('remove');
}

function validate_ams_form() {
    calculate_subtotals();
    var shouldSubmit =  validate_form();
    var submitButton = $('ams_submit_msg');
    if (!shouldSubmit && valid(submitButton)) {
        attachError(submitButton, 'Please review your entries.');
    }
    return shouldSubmit;
}

function update_ams_customer_rules(target, id_suffix) {
    if( $(target+'_country_code'+id_suffix).value.match( /(US|CA)/ ) ) {
        $(target+'_state'+id_suffix).addClassName('inspect');
        $(target+'_state'+id_suffix).addClassName('notempty');
        $('label_for_'+target+'_state'+id_suffix).innerHTML = "* State";
        $(target+'_postal_code'+id_suffix).addClassName('inspect');
        $(target+'_postal_code'+id_suffix).addClassName('notempty');
        $('label_for_'+target+'_postal_code'+id_suffix).innerHTML = "* Postal Code";
    } else {
        $(target+'_state'+id_suffix).removeClassName('inspect');
        $(target+'_state'+id_suffix).removeClassName('notempty');
        $('label_for_'+target+'_state'+id_suffix).innerHTML = "State";
        $(target+'_postal_code'+id_suffix).removeClassName('inspect');
        $(target+'_postal_code'+id_suffix).removeClassName('notempty');
        $('label_for_'+target+'_postal_code'+id_suffix).innerHTML = "Postal Code";
    }
}

function validate_ams_form_deprecated(){
    message = '';

    if( $( 'msg_type').value == 'amend' ){
        if( ! $( 'amend_reason').value.match( /[0-9a-zA-Z,]/ ) ){
            message += "Reason is required when amending a message.\n";
            $( 'label_for_amend_reason' ).addClassName( 'invalid_input' );
        }
        else{
            $( 'label_for_amend_reason' ).removeClassName( 'invalid_input' );
        }
    }

    if( ! $('awb_number' ).value.match( /[0-9]{8}/ ) ){
        $( 'label_for_awb_number' ).addClassName( 'invalid_input' );
        message += "AWB number is required.\n";
    }
    else{
        $( 'label_for_awb_number' ).removeClassName( 'invalid_input' );
    }

    if( ! $( 'origin').value.match( /[0-9]{1,}/ ) ){
        message += "AWB origin is required.\n";
        $( 'label_for_origin').addClassName( 'invalid_input' );
    }
    else{
        $( 'label_for_origin').removeClassName( 'invalid_input' );
    }

    if( ! $( 'destination').value.match( /[0-9]{1,}/ ) ){
         message += "AWB destination is required.\n";
        $( 'label_for_destination').addClassName( 'invalid_input' );
    }
    else{
        $( 'label_for_destination').removeClassName( 'invalid_input' );
    }

    for ( i = 0; i < 8 ; i++ ) {

        //this keeps the form looking nice on multi try submit if removing a flight...
        $( 'label_for_flight_' + i ).removeClassName( 'invalid_input' );
        $( 'label_for_pieces_' + i ).removeClassName( 'invalid_input' );
        $( 'label_for_weight_' + i ).removeClassName( 'invalid_input' );
        $( 'label_for_origin_' + i).removeClassName( 'invalid_input' );
        $( 'label_for_destination_' + i).removeClassName( 'invalid_input' );
        $( 'label_for_description_' + i).removeClassName( 'invalid_input' );

        if( i < 1 || $( 'flight_' + i ).value ){
            if( ! $('flight_' + i).value.match( /[0-9]{1,4}/ ) ){
                $( 'label_for_flight_' + i ).addClassName( 'invalid_input' );
                message += "Flight " + (i +1) + " is required.\n";
            }
            else{
                $( 'label_for_flight_' + i ).removeClassName( 'invalid_input' );
            }

            if( ! $( 'pieces_' + i ).value.match( /[0-9]{1,}/ ) ){
                $( 'label_for_pieces_' + i ).addClassName( 'invalid_input' );
                message += "Pieces " + (i +1) + " is required.\n";
            }
            else{
                $( 'label_for_pieces_' + i ).removeClassName( 'invalid_input' );
            }

            if( ! $( 'weight_' + i ).value.match( /[0-9]{1,}/ ) ){
                $( 'label_for_weight_' + i ).addClassName( 'invalid_input' );
                message += "Weight " + (i +1) + " is required.\n";
            }
            else{
                $( 'label_for_weight_' + i ).removeClassName( 'invalid_input' );
            }
            if( ! $( 'description_' + i ).value.match( /[0-9a-zA-Z,]/ ) ){
                $('label_for_description_' + i).addClassName( 'invalid_input' );
                message += "Description " + (i +1) + " is required.\n";
            }
            else{
                $('label_for_description_' + i).removeClassName( 'invalid_input' );
            }

            if( ! $( 'origin_' + i).value.match( /[0-9]{1,}/ ) ){
                message += "AWB origin " + (i +1) + " is required.\n";
                $( 'label_for_origin_' + i).addClassName( 'invalid_input' );
            }
            else{
                $( 'label_for_origin_' + i).removeClassName( 'invalid_input' );
            }

            if( ! $( 'destination_' + i).value.match( /[0-9]{1,}/ ) ){
                message += "AWB destination " + (i +1) + " is required.\n";
                $( 'label_for_destination_' + i).addClassName( 'invalid_input' );
            }
            else{
                $( 'label_for_destination_' + i).removeClassName( 'invalid_input' );
            }
        }
    }

    /*
    if( ! $('flight').value.match( /[0-9]{1,4}/ ) ){
        $( 'label_for_flight' ).addClassName( 'invalid_input' );
        message += "Flight is required.\n";
    }
    else{
        $( 'label_for_flight' ).removeClassName( 'invalid_input' );
    }

    if( ! $( 'pieces' ).value.match( /[0-9]{1,}/ ) ){
        $( 'label_for_pieces' ).addClassName( 'invalid_input' );
        message += "Pieces is required.\n";
    }
    else{
        $( 'label_for_pieces' ).removeClassName( 'invalid_input' );
    }

    if( ! $( 'weight' ).value.match( /[0-9]{1,}/ ) ){
        $( 'label_for_weight' ).addClassName( 'invalid_input' );
        message += "Weight is required.\n";
    }
    else{
        $( 'label_for_weight' ).removeClassName( 'invalid_input' );
    }
    if( ! $( 'description' ).value.match( /[0-9a-zA-Z,]/ ) ){
        $('label_for_description').addClassName( 'invalid_input' );
        message += "Description is required.\n";
    }
    else{
        $('label_for_description').removeClassName( 'invalid_input' );
    }
    */

    if( ! $( 'shipper' ).value.match( /[0-9a-zA-Z,]/ ) ){
        $('label_for_shipper').addClassName( 'invalid_input' );
        message += "Shipper is required.\n";
    }
    else{
        $('label_for_shipper').removeClassName( 'invalid_input' );
    }

    if( ! $( 'shipper_address' ).value.match( /[0-9a-zA-Z,]/ ) ){
        $('label_for_shipper_address').addClassName( 'invalid_input' );
        message += "Shipper address is required.\n";
    }
    else{
        $('label_for_shipper_address').removeClassName( 'invalid_input' );
    }

    if( ! $( 'shipper_city' ).value.match( /[0-9a-zA-Z,]/ ) ){
        $('label_for_shipper_city').addClassName( 'invalid_input' );
        message += "Shipper city is required.\n";
    }
    else{
        $('label_for_shipper_city').removeClassName( 'invalid_input' );
    }

    if( ! $( 'shipper_country_code' ).value.match( /[0-9a-zA-Z,]/ ) ){
        $('label_for_shipper_country_code').addClassName( 'invalid_input' );
        message += "Shipper country is required.\n";
    }
    else{
        $('label_for_shipper_country_code').removeClassName( 'invalid_input' );
    }

    if( ! $( 'consignee' ).value.match( /[0-9a-zA-Z,]/ ) ){
        $('label_for_consignee').addClassName( 'invalid_input' );
        message += "Consignee is required.\n";
    }
    else{
        $('label_for_consignee').removeClassName( 'invalid_input' );
    }

    if( ! $( 'consignee_address' ).value.match( /[0-9a-zA-Z,]/ ) ){
        $('label_for_consignee_address').addClassName( 'invalid_input' );
        message += "Consignee address is required.\n";
    }
    else{
        $('label_for_consignee_address').removeClassName( 'invalid_input' );
    }

    if( ! $( 'consignee_city' ).value.match( /[0-9a-zA-Z,]/ ) ){
        $('label_for_consignee_city').addClassName( 'invalid_input' );
        message += "Consignee city is required.\n";
    }
    else{
        $('label_for_consignee_city').removeClassName( 'invalid_input' );
    }

    if( ! $( 'consignee_country_code' ).value.match( /[0-9a-zA-Z,]/ ) ){
        $('label_for_consignee_country_code').addClassName( 'invalid_input' );
        message += "Consignee country is required.\n";
    }
    else{
        $('label_for_consignee_country_code').removeClassName( 'invalid_input' );
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}

function validate_status_form() {
    var shouldSubmit =  validate_form();
    var submitButton = $('status_change_submit');
    if (!shouldSubmit && valid(submitButton)) {
        attachError(submitButton, 'Please review your entries.');
    }
    return shouldSubmit;
}

function validate_ground_handlers_form() {
    var shouldSubmit =  validate_form();
    var submitButton = $('ground_handler_submit');

    message = '';
    var oper_hr_from = new Date();
    oper_hr_from.setHours(toNumeric($F('oper_hr_from_hour')),toNumeric($F('oper_hr_from_minute')));
    var oper_hr_to = new Date();
    oper_hr_to.setHours(toNumeric($F('oper_hr_to_hour')),toNumeric($F('oper_hr_to_minute')));
    if( $F('oper_hr_to_hour') == '24' && $F('oper_hr_to_minute') == '30' ) {
        message += "Please select a valid time between 00:00 and 24:00.\n";
        $('label_for_oper_hr').addClassName( 'invalid_input' );
        shouldSubmit = false;
    }
    else{
        $('label_for_oper_hr').removeClassName( 'invalid_input' );
    }

    var sat_oper_hr_from = new Date();
    sat_oper_hr_from.setHours(toNumeric($F('sat_oper_hr_from_hour')),toNumeric($F('sat_oper_hr_from_minute')));
    var sat_oper_hr_to = new Date();
    sat_oper_hr_to.setHours(toNumeric($F('sat_oper_hr_to_hour')),toNumeric($F('sat_oper_hr_to_minute')));
    if( $F('oper_hr_to_hour') == '24' && $F('oper_hr_to_minute') == '30' ) {
        message += "Please select a valid time between 00:00 and 24:00.\n";
        $('label_for_oper_hr').addClassName( 'invalid_input' );
        shouldSubmit = false;
    }
    else{
        $('label_for_sat_oper_hr').removeClassName( 'invalid_input' );
    }

    var sun_oper_hr_from = new Date();
    sun_oper_hr_from.setHours(toNumeric($F('sun_oper_hr_from_hour')),toNumeric($F('sun_oper_hr_from_minute')));
    var sun_oper_hr_to = new Date();
    sun_oper_hr_to.setHours(toNumeric($F('sun_oper_hr_to_hour')),toNumeric($F('sun_oper_hr_to_minute')));
    if( $F('oper_hr_to_hour') == '24' && $F('oper_hr_to_minute') == '30' ) {
        message += "Please select a valid time between 00:00 and 24:00.\n";
        $('label_for_oper_hr').addClassName( 'invalid_input' );
        shouldSubmit = false;
    }
    else{
        $('label_for_sun_oper_hr').removeClassName( 'invalid_input' );
    }

    if( message ){
        alert( message );
    }

    if (!shouldSubmit && valid(submitButton)) {
        attachError(submitButton, 'Please review your entries.');
    }
    return shouldSubmit;
}

function validate_reprint_form(){

    message = '';

    if( ! $( 'awb_number' ).value.match( /[0-9]{8}/ ) ){
        message = "Air waybill number is required.\n";
        $( 'label_for_awb_number' ).addClassName( 'invalid_input' );
    }
    else{
        $( 'label_for_awb_number' ).removeClassName( 'invalid_input' );
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}

function validate_whatsnew(){
    message = '';
    if( ! $( 'title').value ){
        message += "Title is required.\n";
        $( 'label_for_title').addClassName( 'invalid_input' );
    }
    else{
        $( 'label_for_title').removeClassName( 'invalid_input' );
    }

    if( ! $( 'message').value ){
        message += "Message is required.\n";
        $( 'label_for_message').addClassName( 'invalid_input' );
    }
    else{
        $( 'label_for_message').removeClassName( 'invalid_input' );
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}


function validate_propsed_flight(){

    if( $('asi_flight').value.match( /[0-9]{1,}/ ) ){
        $('status_change_submit').disabled = true;
    }
    else{
        $('asi_flight').value = '';
        $('status_change_submit').disabled = false;
        return;
    }

    today = new Date();
    year = today.getFullYear();
    month = today.getMonth()+1; //zero indexed count of 12
    day = today.getDate();

    flight_date = year + '-' + month + '-' + day;

    new Ajax.Request( 'status',{

        parameters: "?action=status_validate_flight&number=" +  $('asi_flight').value + "&flight_date=" + flight_date + "&origin=" + $('location').value ,
        onComplete: function(response, flight){
            if( flight[0].flight_id ){
                $('status_change_submit').disabled = false;
                //alert( flight[0].flight_id )
                $('change_status_form').submit();
            }
            else{
                $('status_change_submit').disabled = false;
                if ( confirm( 'Flight not confirmed. Click OK to accept or cancel to reject?' ) ){
                    $( 'change_status_form' ).submit();
                }
            }
        }
    });
}


function checkUncheckAll(theElement) {
    var theForm = theElement.form, i = 0;
    for(i=0; i < theForm.length; i++){
        if(theForm[i].type == 'checkbox' && theForm[i].name != 'checkall'){
            theForm[i].checked = theElement.checked;
        }
    }
}

function new_status_changer(){
    if( $('new_status').value == 'reroute' || $( 'new_status' ).value == 'transfer' ){
        $('option_things_on_status_screen').hide();
        $('awb_search_status_screen').show();
        $('form_action').value = 'reroute';
    }
    else{
        $('option_things_on_status_screen').show();
        $('awb_search_status_screen').hide();
        $('form_action').value = 'search';
    }
}

function auto_complete_flights( location ){
    new Ajax.Autocompleter("asi_flight", "asi_flight_auto_complete", "?action=get_flights" , {parameters:"location="+location, indicator: "spinner_thing"});
}

function auto_complete_customers( type, lookup_by ){
    suffix = ( lookup_by == 'name' ) ? 'desc' : 'account';
    if(!$(type + "_" + suffix).autocomplete){
        $(type + "_" + suffix).autocomplete =
            new Ajax.Autocompleter(
                type + "_" + suffix, type + "_" + suffix + "_auto_complete", "book_ajax" ,
                {paramName: lookup_by,
                 parameters: "action=get_customer",
                 minChars: 2,
                 indicator: $(type + "_" + lookup_by + "_autocomplete_indicator"),
                 onHide: function(element, update){ new Effect.Fade(update,{duration:0.15});
                                                    get_booking_account_data( type, lookup_by );
                                                  }
                }
            );
        $(type + '_' + suffix + '_auto_complete').autocomplete = $(type + '_' + suffix).autocomplete;
   }
}

function css_body_image(){
    if(document.URL.match('dev')){
        document.body.style.backgroundImage = "url('../images/Development-background.png')";
    }
    if(document.URL.match('staging')){
        document.body.style.backgroundImage = "url('../images/Staging-background.png')";
    }
}

function numbersonly(myfield, e, dec)
{
    var key;
    var keychar;

    if (window.event)
        key = window.event.keyCode;
    else if (e)
    key = e.which;
    else
        return true;
    keychar = String.fromCharCode(key);

    // control keys
    if ((key==null) || (key==0) || (key==8) ||
        (key==9) || (key==13) || (key==27) )
        return true;

    // numbers
    else if ((("0123456789").indexOf(keychar) > -1))
    return true;

    // decimal point jump
    else if (dec && (keychar == "."))
    {
        myfield.form.elements[dec].focus();
        return false;
    }
    else
        return false;
}

function decimalsonly(myfield, e)
{
    var key;
    var keychar;

    if (window.event)
        key = window.event.keyCode;
    else if (e)
    key = e.which;
    else
        return true;
    keychar = String.fromCharCode(key);

    // control keys
    if ((key==null) || (key==0) || (key==8) ||
        (key==9) || (key==13) || (key==27) )
        return true;

    // numbers
    else if ((("0123456789.").indexOf(keychar) > -1))
        return true;

    else
        return false;
}

function alphanumericonly(myfield, e, dec)
{
    var key;
    var keychar;

    if (window.event)
        key = window.event.keyCode;
    else if (e)
    key = e.which;
    else
        return true;
    keychar = String.fromCharCode(key);

    // control keys
    if ((key==null) || (key==0) || (key==8) ||
        (key==9) || (key==13) || (key==27) )
        return true;

    // numbers
    else if ((("0123456789").indexOf(keychar) > -1))
    return true;

    // decimal point jump
    else if (dec && (keychar == "."))
    {
        myfield.form.elements[dec].focus();
        return false;
    }
    // lowercase
    else if ((("abcdefghijklmnopqrstuvwxyz").indexOf(keychar) > -1))
    return true;
    // uppercase
    else if ((("ABCDEFGHIJKLMNOPQRSTUVWXYZ").indexOf(keychar) > -1))
    return true;
    else
        return false;
}

function should_get_booking_account_data( type, lookup_by ){
    suffix = ( lookup_by == 'name' ) ? 'desc' : 'account';
    if( !$(type + '_' + suffix + '_auto_complete').visible() ) {
        get_booking_account_data( type, lookup_by );
    }
}

function get_booking_account_data( type, lookup_by ){
    top.awb_dirty();
    account_number = $( type + '_account').value;

    if( top.magic_customer.test(account_number) ){
        toggle_customer_entry_disabled(type, lookup_by, false);
        $( type + '_customer_id').value = 'magic';
        return;
    }

    my_element_id = type + '_twirlly_thinger';

    $( type +'_twirlly_thinger' ).hide();
    $( type + '_twirlly_thinger_name' ).hide();

    if ( lookup_by  == 'name'
         && (! $( type + '_desc').value
             || top.magic_customer.test($( type + '_desc').value)
            )){
        toggle_customer_entry_disabled(type, lookup_by, false);
        return;
    }
    else if ( lookup_by != 'name'
              && (! $( type + '_account').value
                  || top.magic_customer.test($( type + '_account').value)
                 )){
        toggle_customer_entry_disabled(type, lookup_by, false);
        return;
    }

    not_found_message = "No data found for " + $( type + '_account').value ;

    query_string = 'book_ajax?acct=' +  $( type + '_account').value;
    if( lookup_by == 'name' ){
        my_element_id = type + '_twirlly_thinger_name';
        query_string = 'book_ajax?name=' + $( type + '_desc').value;
        not_found_message = "No data found for " + $( type + '_desc').value ;
    }

    $( my_element_id ).innerHTML = "<img src=../images/spinner.gif />";
    $( my_element_id ).show();

    new Ajax.Request( query_string,{
        method: 'get'
        , onComplete: function(response, account){
            if(account){

                $(my_element_id).hide();

                top.assignToElem($( type + '_account'), account.customer_id == null ? account_number : account.customer_id);

                top.assignToElem($( type + '_desc'), account.company_name);
                top.assignToElem($( type + '_address'), account.address_1);
                top.assignToElem($( type + '_customer_id' ), account.id);
                top.assignToElem($( type + '_acct_status' ), account.acct_status);
                top.assignToElem($( type + '_city'), account.city);
                top.assignToElem($( type + '_state'), account.state);
                top.assignToElem($( type + '_postal_code'), account.postal_code);
                top.assignToElem($( type + '_country' ), account.country_code);
                top.assignToElem($( type + '_customer_contact' ), account.customer_contact);
                top.assignToElem($( type + '_phone' ), account.phone);
                toggle_customer_entry_disabled(type, lookup_by, !top.magic_customer.test($( type + '_account').value));

                if( type == 'shipper' ){
                    check_expedited_shipping(account.expedite != 0);
                    $('consignee_account').focus();
                }
                else if( type == 'consignee' ){
                    $('carrier_agent_account').focus();
                }
                else if( type == 'carrier_agent' ){
                    $( 'goods_desc_1' ).focus();
                }

            }
            else{
                $(my_element_id).innerHTML = "Account Unknown.";

                if( lookup_by != 'name'){
                    top.assignToElem($(type + '_desc'), '');
                }
                top.assignToElem($(type + '_address'), '');
                top.assignToElem($(type + '_city'), '');
                top.assignToElem($(type + '_postal_code'), '');
                top.assignToElem($(type + '_state'), '');
                top.assignToElem($(type + '_customer_id' ), 'na');
                top.assignToElem($(type + '_acct_status' ), 'O');
                top.assignToElem($(type + '_customer_contact' ), '');
                top.assignToElem($(type + '_phone' ), '');
                toggle_customer_entry_disabled(type, lookup_by, false);
            }
        }
    });
}

function toggle_customer_entry_disabled(type, lookup_by, disabled) {
    if(disabled) {
        if ( lookup_by  == 'name' ) {
            $( type + '_account').disabled = true;
        } else {
            $( type + '_desc').disabled = true;
        }
        $( type + '_address').disabled = true;
        $( type + '_city').disabled = true;
        $( type + '_state').disabled = true;
        $( type + '_postal_code').disabled = true;
        $( type + '_country').disabled = true;
        $( type + '_customer_contact' ).disabled = true;
    }
    else {
        $( type + '_account').disabled = false;
        $( type + '_desc').disabled = false;
        $( type + '_address').disabled = false;
        $( type + '_city').disabled = false;
        $( type + '_state').disabled = false;
        $( type + '_postal_code').disabled = false;
        $( type + '_country').disabled = false;
        $( type + '_customer_contact' ).disabled = false;
    }
}

function check_expedited_shipping(expedite){
    if(expedite) {
        if( ! $('priority-row').hasClassName('expedite') ) {
            $('priority-row').childElements().each( function ( s ) { s.remove(); } );
            $('priority-expedite-template').childElements().each(
                function ( s ) { appendElement('priority-row', s, 'bottom' ); }
            );
            $('priority-row').addClassName('expedite');
        }
    }
    else if( $('priority-row').hasClassName('expedite') ){
        $('priority-row').childElements().each( function ( s ) { s.remove(); } );
        $('priority-template').childElements().each(
            function ( s ) { appendElement('priority-row', s, 'bottom' ); }
        );
        $('priority-row').removeClassName('expedite');
    }
}

function get_awb_acceptance_data(awb_number){
    var message = '';
    if(!$F('awb_number')) {
        // if there's no AWB number at all, just give up silently
        return false;
    }
    if(!$F('awb_number').match(/^[0-9]{8}/)) {
        message += "AWB number must be 8 digits.\n";
    }
    if(!$F('awb_prefix').match(/^[0-9]{3}/)) {
        message += "AWB prefix must be 3 digits.\n";
    }

    if(message) {
        $('label_for_awb_number').addClassName('invalid_input');
        alert(message);
        return false;
    }

    $('label_for_awb_number').removeClassName( 'invalid_input');
    $('awb_number').disabled = true;
    $('awb_ajax_messages').style.color = 'purple';
    $('awb_ajax_messages').innerHTML = 'Getting data for ' + awb_number + '...';

    new Ajax.Request( 'acceptance_ajax',{
        parameters: "awb=" +  $F('awb_prefix') + $F('awb_number'),
        onComplete: function(response, awb){
            var message = '';
            var acceptable = true;
            if(awb){
                if(awb.remaining_pieces <= 0) {
                    message += "Airwaybill already delivered.\n";
                    acceptable = false;
                }
                if(awb.amount_paid > 0) {
                    message += "Payments have been accepted.\n";
                    acceptable = false;
                }
                if(acceptable){
                    try {
                        top.awb_dirty();
                        top.awb = awb;

                        var is_accepted = false;
                        if ( top.valid(awb.fsu_history) && top.valid(awb.fsu_history.find) ) {
                            var is_accepted = awb.fsu_history.find(
                                function( s ) {
                                    return top.valid(s) && s == 'accepted' ? true : false;
                                }
                            );
                        }

                        var originElem = $('origin_id');

                        top.assignToElem(originElem, awb.origin_id);

                        if ( top.valid( originElem ) && top.valid( is_accepted ) ) {
                            top.disableWithBackup( originElem.identify() );
                        } else if ( top.valid( originElem ) && top.isElementBackedUp( originElem.identify() ) ) {
                            top.enableFromBackup( originElem.identify() );
                        } else if ( top.valid( originElem ) && originElem.disabled ) {
                            originElem.enable();
                        }
                        top.assignToElem( $( 'can_book_hr' ), 1 );
                        top.assignToElem($('awb_id'), awb.awb_id);
                        top.assignToElem($('destination_id'), awb.destination_id);

                        check_shipper_address_rules();
                        check_consignee_address_rules();

                        top.assignToElem($('pieces'), awb.pieces);
                        top.assignToElem($('weight'), awb.weight);
                        top.assignToElem($('weight_type'), awb.weight_type );
                        // These cannot be assigned here because assignment must wait for get_rates's AJAX call.
                        //top.assignToElem($('goods_desc'), awb.scr_code.toUpperCase());
                        //top.assignToElem($('description'), awb.description.toUpperCase());
                        top.assignToElem($('currency'), awb.currency);
                        top.assignToElem($('conversion_from_usd'), awb.conversion_from_usd);
                        top.assignToElem($('declared_value'), Math.round(convert_currency( awb.declared_value, awb.conversion_from_usd )));
                        top.assignToElem($('customs_value'), Math.round(convert_currency( awb.customs_value, awb.conversion_from_usd ) * 100 ) / 100 );

                        top.assignToElem($('shipper_customer_id'), awb.shipper_id);
                        top.assignToElem($('shipper_acct_status'), awb.shipper_acct_status);
                        top.assignToElem($('shipper_account'), awb.shipper_account ? awb.shipper_account.toUpperCase() : '');
                        top.assignToElem($('shipper_desc'), awb.shipper_name);
                        top.assignToElem($('shipper_address'), awb.shipper_address);
                        top.assignToElem($('shipper_city'), awb.shipper_city);
                        top.assignToElem($('shipper_state'), awb.shipper_state);
                        top.assignToElem($('shipper_postal_code'), awb.shipper_postal_code);
                        top.assignToElem($('shipper_country'), awb.shipper_country );
                        top.assignToElem($('shipper_customer_contact'), awb.shipper_customer_contact );
                        top.assignToElem($('shipper_phone'), awb.shipper_phone );

                        top.assignToElem($('consignee_customer_id'), awb.consignee_id);
                        top.assignToElem($('consignee_acct_status'), awb.consignee_acct_status);
                        top.assignToElem($('consignee_account'), awb.consignee_account ? awb.consignee_account.toUpperCase() : '');
                        top.assignToElem($('consignee_desc'), awb.consignee_name);
                        top.assignToElem($('consignee_address'), awb.consignee_address);
                        top.assignToElem($('consignee_city'), awb.consignee_city);
                        top.assignToElem($('consignee_state'), awb.consignee_state);
                        top.assignToElem($('consignee_postal_code'), awb.consignee_postal_code);
                        top.assignToElem($('consignee_country'), awb.consignee_country );
                        top.assignToElem($('consignee_customer_contact'), awb.consignee_customer_contact );
                        top.assignToElem($('consignee_phone'), awb.consignee_phone );

                        top.assignToElem($('carrier_agent_customer_id'), awb.carrier_agent_id);
                        top.assignToElem($('carrier_agent_account'), awb.carrier_agent_account ? awb.carrier_agent_account.toUpperCase() : '');
                        top.assignToElem($('carrier_agent_desc'), awb.carrier_agent_name);
                        top.assignToElem($('carrier_agent_address'), awb.carrier_agent_address);
                        top.assignToElem($('carrier_agent_city'), awb.carrier_agent_city);
                        top.assignToElem($('carrier_agent_state'), awb.carrier_agent_state);
                        top.assignToElem($('carrier_agent_postal_code'), awb.carrier_agent_postal_code);
                        top.assignToElem($('carrier_agent_country'), awb.carrier_agent_country );
                        top.assignToElem($('carrier_agent_customer_contact'), awb.carrier_agent_customer_contact );
                        top.assignToElem($('carrier_agent_phone'), awb.carrier_agent_phone );

                        top.assignToElem($('charges_code'), awb.charges_code);
                        top.assignToElem($('priority'), awb.priority);
                        check_expedited_shipping(awb.shipper_expedite != 0);
                        top.assignToElem($('packing_materials'), awb.packing_materials);
                        top.assignToElem($('extra_charges'), awb.due_agent );
                        top.assignToElem($('carrier_charges'), awb.carrier_charges );

                        top.assignToElem($('drop_off_date_year'), sprintf('%04d', awb.drop_off_year));
                        top.assignToElem($('drop_off_date_month'), sprintf('%02d', awb.drop_off_month));
                        top.assignToElem($('drop_off_date_day'), sprintf('%02d', awb.drop_off_day));
                        top.assignToElem($('drop_off_time_hour'), awb.drop_off_hour);
                        top.assignToElem($('drop_off_time_minute'),  sprintf('%02d', awb.drop_off_minute));

                        if ( top.valid($('awb_number')) ) {
                            $('awb_number').enable();
                        }
                        top.assignToElem($('flight'), awb.flight);
                        if ( top.valid($('flight')) ) {
                            $('flight').enable();
                        }
                        top.assignToElem($( 'notes' ), awb.notes);
                        top.assignToElem($( 'deceased_name' ), awb.deceased_name);
                        if ( top.valid($('awb_ajax_messages')) ) {
                            $('awb_ajax_messages').style.color = 'green';
                        }
                        if ( top.valid($('awb_ajax_messages')) ) {
                            $('awb_ajax_messages').innerHTML = "Airwaybill data loaded.";
                        }
                        get_rates( awb.scr_code.toUpperCase(), awb.description.toUpperCase() );
                        top.get_awb_dims( awb.awb_id );
                        top.get_routes( 'awb', awb.awb_id );
                        get_origin_currency();
                        check_require_tsa();
                        check_international_status();

                    } catch (e) {
                        top.e = e;
                        if ( top.valid( top.debug ) ) {
                            top.debug.log('ERROR: ' + e, 'get_awb_acceptance_data (AJAX)');
                        }
                    }
                }
                else{
                    $('awb_number').disabled =  false;
                    message += "This Airwaybill may not be accepted again.\n";
                    $('awb_ajax_messages').innerHTML = message;
                    $('awb_ajax_messages').style.color = 'red';
                }
            }
            else{
                $('awb_number').disabled =  false;
                $('awb_ajax_messages').innerHTML = "Airwaybill not found.";
            }
        }
    });
    return true;
}

top.get_awb_dims = get_awb_dims = function ( awb_id ){
    new Ajax.Request( 'acceptance_ajax',{
        parameters: "action=awb_dims&awb_id=" +  awb_id,
        onComplete: function(response, dims){
            if (valid(dims)) {
                var total = dims.length;
                if (total > 1) {
                    // dynamically add more dim elements to form
                    var remainder = total - 1;
                    for ( i = 0; i < remainder; i++ ) {
                        top.appendElement('dims','dim-template','bottom');
                    }
                }
                var widths = $$('#accept_form .width');
                var heights = $$('#accept_form .height');
                var lengths = $$('#accept_form .length');
                var dim_ids = $$('#accept_form .dim_ids');
                var number_pieces = $$('#accept_form .number_pieces');

                for ( i = 0; i < widths.length; i++ ) {
                    var elem = widths[i];
                    var val = dims[i].width;
                    if ( top.valid( val )) {
                        elem.value = val;
                    }
                }
                for ( i = 0; i < heights.length; i++ ) {
                    var elem = heights[i];
                    var val = dims[i].height;
                    if ( top.valid( val )) {
                        elem.value = val;
                    }
                }
                for ( i = 0; i < lengths.length; i++ ) {
                    var elem = lengths[i];
                    var val = dims[i].length;
                    if ( top.valid( val )) {
                        elem.value = val;
                    }
                }
                for ( i = 0; i < number_pieces.length; i++ ) {
                    var elem = number_pieces[i];
                    var val = dims[i].pieces;
                    if ( top.valid( val )) {
                        elem.value = val;
                    }
                }
                for ( i = 0; i < dim_ids.length; i++ ) {
                    var elem = dim_ids[i];
                    var val = dims[i].id;
                    if ( top.valid( val )) {
                        elem.value = val;
                    }
                }
                if ( top.valid($('awb_ajax_messages')) ) {
                    $('awb_ajax_messages').style.color = 'green';
                }
                if ( top.valid($('awb_ajax_messages')) ) {
                    $('awb_ajax_messages').innerHTML += "<br\>Airwaybill dimension data loaded.";
                }
            } else {
                $('awb_ajax_messages').innerHTML += "<br\><span style='color:#ffcc00;'>Airwaybill dimensions not found.</span>";
            }
        }
    });
};

top.get_routes = get_routes = function ( type, id ){
    if($('itineraryOverride').value != 0){ 
        if(type == 'awb') {
            $('awb_ajax_messages').innerHTML += "<br\>Routing not loaded due to user override.";
        }        
        return;
    }
    var action = 'get_rate_routes';
    if(type == 'awb') {
        action = 'awb_routes';
    }
    new Ajax.Request( 'acceptance_ajax',{
        parameters: 'action='+action+'&id='+id,
        onComplete: function(response, routes){
            if (valid(routes)) {
                var total = routes.length;
                var dests = $$('#accept_form .route_dest');
                var carriers = $$('#accept_form .route_carrier');

                for ( i = 0; i < routes.length - 1; i++ ) {
                    var elem = dests[i];
                    var val = routes[i].dest;
                    if ( top.valid( val )) {
                        elem.value = val;
                    }
                }
                for ( i = 0; i < routes.length; i++ ) {
                    var elem = carriers[i];
                    var val = routes[i].carrier;
                    if ( top.valid( val )) {
                        elem.value = val;
                    }
                }
                if(type == 'awb' && total > 0) {
                    $('itineraryOverride').value = 1;
                    if ( top.valid($('awb_ajax_messages')) ) {
                        $('awb_ajax_messages').style.color = 'green';
                    }
                    if ( top.valid($('awb_ajax_messages')) ) {
                        $('awb_ajax_messages').innerHTML += "<br\>Airwaybill routing data loaded.";
                    }
                }
            } else {
                if(type == 'awb') {
                    $('awb_ajax_messages').innerHTML += "<br\><span style='color:#ffcc00;'>Airwaybill routes not found.</span>";
                }
            }
        }
    });
};

function validate_itin_location(field) {
    if(field.value) {
        field.value = field.value.toUpperCase();
        new Ajax.Request( 'book_ajax',{
            parameters: "action=validate_location&airport=" + field.value,
            onComplete: function( response, id ){
                if(id){
                    $('label_for_'+field.id).removeClassName('invalid_input');
                }
                else {
                    $('label_for_'+field.id).addClassName('invalid_input');
                    alert('Airport '+field.value+' is not a valid airport code. Please correct it and try again.');
                    field.value = '';
                }
            }
        });
    }
}

function validate_itin_carrier(field) {
    if(field.value) {
        field.value = field.value.toUpperCase();
        new Ajax.Request( 'book_ajax',{
            parameters: "action=validate_carrier&carrier=" + field.value,
            onComplete: function( response, id ){
                if(id){
                    $('label_for_'+field.id).removeClassName('invalid_input');
                }
                else {
                    $('label_for_'+field.id).addClassName('invalid_input');
                    alert('Carrier '+field.value+' is not a valid carrier code. Please correct it and try again.');
                    field.value = '';
                }
            }
        });
    }
}

top.awb_dirty = awb_dirty = function awb_dirty() {
    try {
        var continue_b = $( 'continue_button' );
        var step_2_b = $( 'step_2_button' );
        var step_2_payment_b = $( 'step_2_payment_button' );
        var price_b = $( 'price_button' );
        if ( ! top.valid( continue_b ) || ! top.valid( price_b ) ) return;

        if ( top.valid( step_2_b ) && step_2_b.visible() ) step_2_b.hide();
        if ( top.valid( step_2_payment_b ) && step_2_payment_b.visible() ) step_2_payment_b.hide();

        if ( continue_b.visible() ) continue_b.hide();
        if ( ! price_b.visible() ) price_b.show();
    } catch (e) {
        if ( top.valid( top.debug ) ) {
            top.debug.log('ERROR:' + e, 'top.awb_dirty');
        }
    }
};

function please_price_my_awb(){

    var invalid_message = validate_for_step2();
    if ( top.valid(invalid_message) && invalid_message != '' ) {
        alert( invalid_message );
        return false;
    }

    $('price_button').disable();
    var loadElem = $( 'total_charges_twirlly_thinger' );
    if ( top.valid( loadElem ) ) {
        loadElem.innerHTML = "";
        loadElem.addClassName('loading');
    }

    $( 'action' ).value = 'price_awb';

    new Ajax.Request( 'acceptance_ajax', {
        parameters: $('accept_form').serialize(true),
        onComplete: function( response, pricing ) {
            var loadElem = $( 'total_charges_twirlly_thinger' );
            if ( top.valid( loadElem ) ) { loadElem.removeClassName('loading'); }
            if ( pricing ){

                $( 'currency' ).value = pricing.currency_code;
                $( 'conversion_from_usd' ).value = pricing.conversion_rate;
                $( 'currency_code_display_legend' ).innerHTML =  pricing.currency_code;
                $( 'currency_code_display_pricing' ).innerHTML =  pricing.currency_code;

                $( 'total_charges' ).value = pricing.total_price_usd;
                $( 'total_charges_display' ).innerHTML = sprintf( '%.2f', pricing.total_price_local );
                $( 'rate' ).value = pricing.rate;
                $( 'rate_id' ).value = pricing.rate_code;
                $( 'chargeable_weight' ).value = pricing.chargeable_weight;
                $( 'chargeable_weight_display').innerHTML = sprintf( '%.2f', pricing.chargeable_weight );
                $( 'weight_type_display').innerHTML = pricing.weight_type;
                $( 'extra_charges' ).value = pricing.extra_charges_usd;
                $( 'extra_charges_display' ).innerHTML = sprintf( '%.2f', pricing.extra_charges_local );
                if(top.valid($('carrier_charges')))
                    $( 'carrier_charges' ).value = pricing.carrier_charges_usd;
                if(top.valid($('carrier_charges_display')))
                    $( 'carrier_charges_display' ).innerHTML = sprintf( '%.2f', pricing.carrier_charges_local );

                $( 'sales_tax' ).value = pricing.sales_tax_usd;
                $( 'sales_tax_display' ).innerHTML = sprintf( '%.2f', pricing.sales_tax_local )
                    + " (" + sprintf( '%.4f',  pricing.sales_tax ) + "%" + ")";

                $( 'valuation_charge' ).value = pricing.valuation_charge_usd;
                $( 'valuation_charge_display' ).innerHTML = sprintf( '%.2f', pricing.valuation_charge_local );
                $( 'surcharge' ).value = pricing.surcharges_usd;
                $( 'surcharge_display' ).innerHTML = sprintf( '%.2f', pricing.surcharges_local );
                $( 'base_price' ).value = pricing.price_usd;
                $( 'base_price_display' ).innerHTML = sprintf( '%.2f', pricing.price_local );

                $( 'action' ).value = 'save_accept';
                $( 'price_button' ).hide();

                top.get_routes( 'rate', pricing.rate_code );
                
                if(top.require_tsa) {
                    $( 'continue_button' ).show();
                } else {
                    $( 'step_2_button' ).show();
                    $( 'step_2_payment_button' ).show();
                }
            }
            else{
                var error = "Unable to price awb.";
                if( response.responseJSON.error ) {
                    error += " " + response.responseJSON.error.message;
                }
                $( 'total_charges_twirlly_thinger' ).innerHTML = error;
                $( 'total_charges' ).value = '';
                $( 'total_charges_display' ).innerHTML = 'N/A';
                $( 'rate_id' ).value = '';
                $( 'chargeable_weight' ).value = '';
                $( 'chargeable_weight_display' ).innerHTML = 'N/A';

            }
            $('price_button').enable();
        }
    });
    return true;
}

function accept_awb_step( step ){
    $( "step_1").hide();
    $( "step_2").hide();
    $( "step_3").hide();
    layer_name = "step_" + step;
    $( layer_name).show();
}

function layer_swap( layername ) {
    if( document.getElementById( layername ) ){
        if ( document.getElementById( layername ).style.visibility=='visible' ){
            document.getElementById( layername ).style.visibility='hidden';
            document.getElementById( layername ).style.display='none';
        }
        else{
            document.getElementById( layername ).style.visibility='visible';
            document.getElementById( layername ).style.display='block';
        }
    }
}


function show_hide_extra_dimensions(){
    $('dims').insert($('dim-template').innerHTML, {position: 'after'});
}

function appendElement( destinationID, templateID, position ) {
    var destination = $(destinationID);
    var template = $(templateID);

    if ( valid( destination ) && valid( template ) ) {
        var elem = template.cloneNode(true);
        elem.writeAttribute('id', false);
        elem.identify();
        obj = {};
        obj['' + position] = elem;
        top.newElem = destination.insert(obj);
    }
}

function validate_awb( action ){

    if ( !$('awb_prefix').value || !$('awb_number').value
       || !$F('awb_prefix').match(/^[0-9]{3}/)
       || !$F('awb_number').match(/^[0-9]{8}/)
    ) {
        top.awb_number_error = ( $('awb_prefix').value != $('awb_prefix_default').value );
        $('awb_twirlly_thinger').innerHTML = 'Partial AWB number.';
        return true;
    }
    $('awb_twirlly_thinger').innerHTML = '<img src="../images/spinner.gif" />';
    new Ajax.Request( 'acceptance_ajax', {
        parameters: "action=validate_awb&awb_prefix=" + $('awb_prefix').value + "&awb_number=" +  $('awb_number').value,
        onComplete: function(response, awb){
            if( awb.error ){
                $('awb_twirlly_thinger').innerHTML = awb.error;
                top.awb_number_error = true;
            }
            else if ( awb.awb ) {
                top.awb_number_error = false;
                if ( action == 'book' ) {
                    if( awb.isNew ){
                        //$('awb_twirlly_thinger').innerHTML = '<img src="../images/small_green_check_mark.png" align="top" />';
                        $('awb_twirlly_thinger').innerHTML = 'New valid AWB Number.';
                    }
                    else {
                        $('awb_twirlly_thinger').innerHTML = '<span class="errormsg">AWB Number already in use.</span>';
                        top.awb_number_error = true;
                    }
                }
                else {
                    if( awb.isNew ){
                        //$('awb_twirlly_thinger').innerHTML = '<img src="../images/small_green_check_mark.png" align="top" />';
                        $('awb_twirlly_thinger').innerHTML = 'AWB Number is new.';
                    }
                    else {
                        $('awb_twirlly_thinger').innerHTML = 'AWB Number found.';
                    }
                }
            }
            else{
                top.awb_number_error = false;
                $('awb_twirlly_thinger').innerHTML = '';
            }
        }
    });
    return true;
}

function validate_delivery_form(){
    message = '';
    awb = $('awb_number');
    if(awb.value){
        if( ! awb.value.match(/[0-9]{8}/)){
            message += "AWB must be 8 numbers.\n";
        }
    }
    else{
        message += "AWB must be 8 numbers.\n";
    }

    if(! $('recipient').value){
        message += "Company or agent is required\n";
        $( 'label_for_recipient').addClassName( 'invalid_input' );
    }
    else{
        $( 'label_for_recipient').removeClassName( 'invalid_input' );
    }

    if(! $('consignee').value){
        message += "Consignee is required\n";
        $( 'label_for_consignee').addClassName( 'invalid_input' );
    }
    else{
        $( 'label_for_consignee').removeClassName( 'invalid_input' );
    }

    if(! $('pieces').value || ! $('pieces').value.match(/[0-9]/)){
        message += "# of pieces is required.\n";
    }

    if(! $('weight').value || ! $('weight').value.match(/[0-9]/)){
        message += "Weight is required.\n";
    }

    if(! $('origin_id').value || ! $('origin_id').value.match(/^[0-9]{1,}/)){
        message += "Origin is required\n";
    }

    if(! $('destination_id').value || ! $('destination_id').value.match(/^[0-9]{1,}/)){
        message += "Destination is required\n";
    }

    if( $( 'payments_accepted' ).value > 0 && top.unpaid_awb_charges ){
        message += validate_payment_form( true );
    }

    if(message){
        alert(message);
        return false;
    }

    $('delivery_time').value = $('date_hour').value + ":" + $('date_minute').value;
    if( $( 'payments_accepted' ).value > 0 && top.unpaid_awb_charges ){
        save_awb_payments();
    }
    $( 'delivery_form' ).submit();
    return true;
}

function reset_delivery_form(){
    $('delivery_form').reset();
    Form.enable('delivery_form');
    $('consignee').disabled = false;
    $('awb_ajax_messages').innerHTML = "";
}

function awb_total_pieces(){
    var pieces = $$('#dims .calc.number_pieces').pluck('value');
    var total = 0;
    for (var i=0;i < pieces.length; ++i) {
        total += toNumeric(pieces[i]);
    }
    var piece_total = $('pieces');
    if ( valid( piece_total ) ) {
        piece_total.value=total;
    }
    awb_dirty();
}

/**
 *this is used for Deliver
 */
function get_awb_data(awb_number){
    var message = '';
    if(!$F('awb_number').match(/^[0-9]{8}/)) {
        message += "AWB number must be 8 digits.\n";
    }
    if(!$F('awb_prefix').match(/^[0-9]{3}/)) {
        message += "AWB prefix must be 3 digits.\n";
    }
    if(message) {
        $('label_for_awb_number').addClassName('invalid_input');
        alert(message);
        return;
    }

    $('label_for_awb_number').removeClassName( 'invalid_input' );
    $('awb_number').disabled = true;
    $('awb_ajax_messages').style.color = 'purple';
    $('awb_ajax_messages').innerHTML = 'Getting data for ' + awb_number + '...';

    new Ajax.Request( 'delivery_ajax',{
        parameters: "awb=" +  $F('awb_prefix') + $F('awb_number'),
        onComplete: function(response, awb){
            var message = '';
            var deliverable = true;
            if(awb){
                if(awb.remaining_pieces <= 0) {
                    message += "Airwaybill already delivered.\n";
                    deliverable = false;
                }
                if(deliverable){
                    try {
                        top.awb = awb;

                        var is_accepted = false;
                        if ( top.valid(awb.fsu_history) && top.valid(awb.fsu_history.find) ) {
                            is_accepted = awb.fsu_history.find(
                                function( s ) {
                                    return top.valid(s) && s == 'accepted' ? true : false;
                                }
                            );
                        }


                        $("submit_delivery").disabled = false;
                        get_awb_financials( awb.id );
                        if ( top.valid($('air_way_bill_id')) ) {
                            $('air_way_bill_id').value = awb.id;
                        }
                        if ( top.valid($('submit_delivery')) ) {
                            $('submit_delivery').disabled = false;
                        }
                        top.assignToElem($('awb_id'), awb.id);
                        top.assignToElem($('origin_id'), awb.origin_airport_id);
                        top.assignToElem($('origin_id_hidden'), awb.origin_airport_id);
                        top.assignToElem($('destination_id'), awb.destination_airport_id);
                        top.assignToElem($('consignee'), awb.consignee);
                        top.assignToElem($('pieces'), awb.remaining_pieces);
                        top.assignToElem($('weight'), awb.remaining_weight);
                        $( 'weight_unit' ).innerHTML = awb.weight_type;
                        top.assignToElem($('date_year'), sprintf('%04d', awb.delivery_year));
                        top.assignToElem($('date_month'), sprintf('%02d', awb.delivery_month));
                        top.assignToElem($('date_day'), sprintf('%02d', awb.delivery_day));
                        top.assignToElem($('date_hour'), awb.delivery_hour - 1);
                        top.assignToElem($('date_minute'),  sprintf('%02d', awb.delivery_minute));

                        $('awb_number').disabled =  false;
                        $('awb_ajax_messages').style.color = 'green';

                        var originElem = $('origin_id');
                        var originHiddenElem = $('origin_id_hidden');
                        if ( top.valid( originElem ) && top.valid( is_accepted ) ) {
                            originElem.disable();
                            originHiddenElem.enable();
                        } else if ( top.valid( originElem ) && originElem.disabled ) {
                            originElem.enable();
                            originHiddenElem.disable();
                        }
                        $('awb_ajax_messages').innerHTML = "Airwaybill data loaded.";
                     } catch (e) {
                         top.e = e;
                     }
                 }
                 else{
                     $('awb_number').disabled =  false;
                     message += "This Airwaybill may not be delivered again.\n";
                     $('awb_ajax_messages').innerHTML = message;
                     $('awb_ajax_messages').style.color = 'red';
                 }
            }
            else{
                $('awb_number').disabled =  false;
                $("submit_delivery").disabled = true;
                $('awb_ajax_messages').innerHTML = "Airwaybill not found.";
            }
        }
    });
}

function validate_awb_flight(){

    var loadElem = $('flight_twirlly_thinger');
    if ( top.valid( loadElem ) ) {
        loadElem.innerHTML = "";
        loadElem.addClassName('loading');
        loadElem.removeClassName('notify');
        loadElem.removeClassName('errormsg');
    }

    flight = $( 'flight' ).value;
    flight_date = $( 'flight_date_year' ).value + "-" + $( 'flight_date_month' ).value + "-" + $( 'flight_date_day').value;
    origin = $( 'origin_id').value;
    destination = $( 'destination_id' ).value;

    new Ajax.Request( 'acceptance_ajax',{
        parameters: "action=validate_flight&flight=" +  flight + "&flight_date=" + flight_date + "&origin=" + origin + "&destination=" + destination,
        onComplete: function(response, flight){
            var loadElem = $('flight_twirlly_thinger');
            if( flight.flight == 'na' ){
              /*
                if( confirm( 'Accept non-existent flight number?' ) ){
                    $('step_2_button').disabled = false;
                }
              */
              if ( top.valid( loadElem ) ) {
                  loadElem.innerHTML = 'Flight does not exist.';
                  loadElem.addClassName('errormsg');
              }
            }
            else{
                 if ( top.valid( loadElem ) ) {
                     loadElem.innerHTML = 'Valid flight';
                     loadElem.addClassName('notify');
                 }
            }
            if ( top.valid( loadElem ) ) { loadElem.removeClassName('loading'); }
        }
    });

}


function check_unlock_flight(){
    var flightElem = $('flight');
    var originElem = $( 'origin_id' );
    var destElem = $( 'destination_id' );

    if ( ! top.valid( flightElem ) || ! top.valid( originElem ) || ! top.valid( destElem ) ) return;

    if( $( 'origin_id' ).value.match( /[0-9]{1,}/ ) && $( 'destination_id' ).value.match( /[0-9]{1,}/ ) ){
        $( 'flight' ).disabled = false;
    }
    else{
        $( 'flight' ).disabled = true;
    }
}


function validate_shipper_widgets( invalid_message, require_known_shipper ){
    if( require_known_shipper  && ! top.magic_customer.test($( 'shipper_account' ).value) ){
        if( ! $( 'shipper_customer_id').value.match( /[0-9]/ ) ){
            invalid_message += "Shipper account is unknown.\n";
            $( 'label_for_shipper').addClassName( 'invalid_input');
        }
        else{
            $( 'label_for_shipper').removeClassName( 'invalid_input' );
        }
    }
    if( toNumeric( $( 'can_book_hr' ).value ) < 1 && top.magic_customer.test( $( 'shipper_account' ).value ) ){
        invalid_message += "Shipper is not a known shipper.\n";
        $( 'label_for_shipper').addClassName( 'invalid_input');
        $( 'label_for_shipper_desc').addClassName( 'invalid_input');
        $( 'label_for_shipper_address').addClassName( 'invalid_input');
        $( 'label_for_shipper_city').addClassName( 'invalid_input');
        $( 'label_for_shipper_state').addClassName( 'invalid_input');
        $( 'label_for_shipper_postal_code').addClassName( 'invalid_input');
    }
    //Consignee
    /*
    if( ! $( 'consignee_account').value.match( /[0-9a-zA-Z]/ ) ){
    invalid_message += "Consignee account number is invalid.\n";
    $( 'label_for_consignee').addClassName( 'invalid_input');
    }
*/
    if( ! $( 'shipper_desc').value.match( /[0-9a-zA-Z]/ ) ){
        invalid_message += "Shipper description is invalid.\n";
        $( 'label_for_shipper_desc').addClassName( 'invalid_input');
    }
    else{
        $( 'label_for_shipper_desc').removeClassName( 'invalid_input' );
    }

    if( ! $( 'shipper_address').value.match( /[0-9a-zA-Z]/ ) ){
        invalid_message += "Shipper address is invalid.\n";
        $( 'label_for_shipper_address').addClassName( 'invalid_input');
    }
    else{
        $( 'label_for_shipper_address').removeClassName( 'invalid_input' );
    }

    if( ! $( 'shipper_city').value.match( /[0-9a-zA-Z]/ ) ){
        invalid_message += "Shipper city is invalid.\n";
        $( 'label_for_shipper_city').addClassName( 'invalid_input');
    }
    else{
        $( 'label_for_shipper_city').removeClassName( 'invalid_input' );
    }

    if( top.require_shipper_state && ! $('shipper_state').value.match( /[0-9a-zA-Z]/ ) ){
        invalid_message += "Shipper state is invalid.\n";
        $( 'label_for_shipper_state').addClassName( 'invalid_input');
    }
    else{
        $( 'label_for_shipper_state').removeClassName( 'invalid_input' );
    }

    if( top.require_shipper_postal_code && ! $('shipper_postal_code').value.match( /[0-9a-zA-Z]/ ) ){
        invalid_message += "Shipper postal code is invalid.\n";
        $( 'label_for_shipper_postal_code').addClassName( 'invalid_input');
    }
    else{
        $( 'label_for_shipper_postal_code').removeClassName( 'invalid_input' );
    }

    return invalid_message;
}

function validate_consignee_widgets( invalid_message ){

    if( ! $( 'consignee_desc').value.match( /[0-9a-zA-Z]/ ) ){
        invalid_message += "Consignee description is invalid.\n";
        $( 'label_for_consignee_desc').addClassName( 'invalid_input');
    }
    else{
        $( 'label_for_consignee_desc').removeClassName( 'invalid_input' );
    }

    if( ! $( 'consignee_address').value.match( /[0-9a-zA-Z]/ ) ){
        invalid_message += "Consignee address is invalid.\n";
        $( 'label_for_consignee_address').addClassName( 'invalid_input');
    }
    else{
        $( 'label_for_consignee_address').removeClassName( 'invalid_input' );
    }

    if( ! $( 'consignee_city').value.match( /[0-9a-zA-Z]/ ) ){
        invalid_message += "Consignee city is invalid.\n";
        $( 'label_for_consignee_city').addClassName( 'invalid_input');
    }
    else{
        $( 'label_for_consignee_city').removeClassName( 'invalid_input' );
    }

    if( top.require_consignee_state && ! $('consignee_state').value.match( /[0-9a-zA-Z]/ ) ){
        invalid_message += "Consignee state is invalid.\n";
        $( 'label_for_consignee_state').addClassName( 'invalid_input');
    }
    else{
        $( 'label_for_consignee_state').removeClassName( 'invalid_input' );
    }

    if( top.require_consignee_postal_code && ! $('consignee_postal_code').value.match( /[0-9a-zA-Z]/ ) ){
        invalid_message += "Consignee postal code is invalid.\n";
        $( 'label_for_consignee_postal_code').addClassName( 'invalid_input');
    }
    else{
        $( 'label_for_consignee_postal_code').removeClassName( 'invalid_input' );
    }

    return invalid_message;
}

function validate_origin_destination( invalid_message ){
    if( ! $( 'origin_id').value.match( /[0-9]/ ) ){
        invalid_message += "Origin is required.\n";
        $('label_for_origin').addClassName( 'invalid_input');
    }
    else{
        $('label_for_origin').removeClassName( 'invalid_input' );
    }

    if( ! $( 'destination_id').value.match( /[0-9]/ ) ){
        invalid_message += "Destination is required.\n";
        $('label_for_destination').addClassName( 'invalid_input');
    }
    else{
        $('label_for_destination').removeClassName( 'invalid_input' );
    }
    return invalid_message;
}

// I think that this function is dead code - RAM 2009-11-16
// function validate_location(this){
//     new Ajax.Request( 'book_ajax', {
//         parameters: "action=validate_location&airport=" +  $this.value,
//         onSuccess: function ( response, answer ){
//             if( ! answer ){
//                 top.must_be_known_shippers = true;
//                  $( 'label_for_shipper').innerHTML = '* Account';
//             }
//             else{
//                 top.must_be_known_shippers = false;
//                 $( 'label_for_shipper').innerHTML = 'Account';
//             }
//             if( ! top.magic_customer.test($( 'shipper_account' ).value) ){
//                 get_booking_account_data( 'shipper', 'acct' );
//             }
//         }
//     });
// }


function validate_itinerary( invalid_message ){
    var leg_count = 0;
    for (leg = 1; leg <=4; leg++) {
        if( leg_count && (leg > leg_count)){
            // we've passed the last leg, all further fields must be empty or itin is inconsistent
            if( $('carrier'+leg).value){
                if( $('label_for_carrier'+leg).hasClassName('invalid_input') || $('carrier'+leg).value.match( /[A-Za-z0-9]{2}/ )){
                    if(leg < 4){
                        if( $('dest'+leg).value){
                            if( $('label_for_dest'+leg).hasClassName('invalid_input') || $('dest'+leg).value.match( /[A-Za-z0-9]{3}/ )){
                                $('label_for_dest'+leg_count).addClassName('invalid_input');
                                invalid_message += "Itinerary is inconsistent: Destination for leg "+leg_count+" is missing.\n";
                                break;
                            }
                            else {
                                $('label_for_dest'+leg).addClassName('invalid_input');
                                invalid_message += "Destination for leg "+leg+" is not valid.\n";
                                break;
                            }
                        }
                        else {
                            $('label_for_dest'+leg_count).addClassName('invalid_input');
                            invalid_message += "Itinerary is inconsistent: Destination for leg "+leg_count+" is missing.\n";
                            break;
                        }
                    }
                    else {
                        $('label_for_carrier'+leg).addClassName('invalid_input');
                        invalid_message += "Itinerary is inconsistent: Carrier for leg "+leg+" should not be set.\n";
                        break;
                    }
                }
                else {
                    $('label_for_carrier'+leg).addClassName('invalid_input');
                    invalid_message += "Carrier for leg "+leg+" is not valid.\n";
                    break;
                }
            }
            else {
                if(leg < 4){
                    if( $('dest'+leg).value){
                        if( $('label_for_dest'+leg).hasClassName('invalid_input') || $('dest'+leg).value.match( /[A-Za-z0-9]{3}/ )){
                            $('label_for_dest'+leg_count).addClassName('invalid_input');
                            invalid_message += "Itinerary is inconsistent: Destination for leg "+leg_count+" is missing.\n";
                            $('label_for_carrier'+leg).addClassName('invalid_input');
                            invalid_message += "Itinerary is inconsistent: Carrier for leg "+leg+" is missing.\n";
                            break;
                        }
                        else {
                            $('label_for_dest'+leg).addClassName('invalid_input');
                            invalid_message += "Destination for leg "+leg+" is not valid.\n";
                            break;
                        }
                    }
                    else {
                        $('label_for_dest'+leg).removeClassName('invalid_input');
                        $('label_for_carrier'+leg).removeClassName('invalid_input');
                    }
                }
                else {
                    $('label_for_carrier'+leg).removeClassName('invalid_input');
                }
            }
        }
        else {
            // we're still processing valid legs, make sure that dests match carriers
            if( $('carrier'+leg).value ){
                if( $('label_for_carrier'+leg).hasClassName('invalid_input') || $('carrier'+leg).value.match( /[A-Za-z0-9]{2}/ )){
                    if(leg < 4){
                        if( $('dest'+leg).value){
                            if( $('label_for_dest'+leg).hasClassName('invalid_input') || $('dest'+leg).value.match( /[A-Za-z0-9]{3}/ )){
                                $('label_for_dest'+leg).removeClassName('invalid_input');
                            }
                            else {
                                $('label_for_dest'+leg).addClassName('invalid_input');
                                invalid_message += "Destination for leg "+leg+" is not valid.\n";
                                break;
                            }
                        }
                        else{  // carrier w/out leg indicates last leg
                            leg_count = leg;
                            $('label_for_dest'+leg).removeClassName('invalid_input');
                            $('label_for_carrier'+leg).removeClassName('invalid_input');
                        }
                    }
                    else {
                        leg_count = leg;
                        $('label_for_carrier'+leg).removeClassName('invalid_input');
                    }
                }
                else {
                    $('label_for_carrier'+leg).addClassName('invalid_input');
                    invalid_message += "Carrier for leg "+leg+" is not valid.\n";
                    break;
                }
            }
            else {
                if(leg < 4){
                    if( $('dest'+leg).value){
                        if( $('label_for_dest'+leg).hasClassName('invalid_input') || $('dest'+leg).value.match( /[A-Za-z0-9]{3}/ )){
                            $('label_for_carrier'+leg).addClassName('invalid_input');
                            invalid_message += "If a destination for leg "+leg+" is specified, a valid carrier must also be specified.\n";
                            break;
                        }
                        else {
                            $('label_for_dest'+leg).addClassName('invalid_input');
                            invalid_message += "Destination for leg "+leg+" is not valid.\n";
                            break;
                        }
                    }
                    else {
                        invalid_message += "The carrier for the final leg must be specified.\n";
                        $('label_for_carrier'+leg).addClassName( 'invalid_input');
                        break;
                    }
                }
                else {
                    invalid_message += "The carrier for the final leg must be specified.\n";
                    $('label_for_carrier'+leg).addClassName( 'invalid_input');
                    break;
                }
            }
        }
    }
    return invalid_message;
}


function check_shipper_address_rules(){
    new Ajax.Request( 'book_ajax', {
        parameters: "action=address_rules&location_id=" +  $('origin_id').value,
        onSuccess: function shipper_address_rules_success( response, rules ){
            if( rules ){
                if( rules.state ) {
                    top.require_shipper_state = true;
                    $( 'label_for_shipper_state').innerHTML = '* state';
                }
                else{
                    top.require_shipper_state = false;
                    $( 'label_for_shipper_state').innerHTML = 'state';
                }
                if( rules.postal_code ) {
                    top.require_shipper_postal_code = true;
                    $( 'label_for_shipper_postal_code').innerHTML = '* postal code';
                }
                else{
                    top.require_shipper_postal_code = false;
                    $( 'label_for_shipper_postal_code').innerHTML = 'postal code';
                }
            }
        }
    });
}

function check_consignee_address_rules(){
    new Ajax.Request( 'book_ajax', {
        parameters: "action=address_rules&location_id=" +  $('destination_id').value,
        onSuccess: function consignee_address_rules_success( response, rules ){
            if( rules ){
                if( rules.state ) {
                    top.require_consignee_state = true;
                    $( 'label_for_consignee_state').innerHTML = '* state';
                }
                else{
                    top.require_consignee_state = false;
                    $( 'label_for_consignee_state').innerHTML = 'state';
                }
                if( rules.postal_code ) {
                    top.require_consignee_postal_code = true;
                    $( 'label_for_consignee_postal_code').innerHTML = '* postal code';
                }
                else{
                    top.require_consignee_postal_code = false;
                    $( 'label_for_consignee_postal_code').innerHTML = 'postal code';
                }
            }
        }
    });
}

function check_acceptable_shippers(){
    new Ajax.Request( 'book_ajax', {
        parameters: "action=require_known_shippers&location_id=" +  $('origin_id').value,
        onSuccess: function known_shipper_success( response, answer ){
            if( answer ){
                top.must_be_known_shippers = true;
                 $( 'label_for_shipper').innerHTML = '* Account';
            }
            else{
                top.must_be_known_shippers = false;
                $( 'label_for_shipper').innerHTML = 'Account';
            }
            if( ! top.magic_customer.test($( 'shipper_account' ).value) ){
                get_booking_account_data( 'shipper', 'acct' );
            }
        }
    });
}

function check_require_tsa(){
    new Ajax.Request( 'book_ajax', {
        parameters: "action=require_tsa&origin_id=" + $('origin_id').value + "&destination_id=" +  $('destination_id').value,
        onSuccess: function require_tsa_success( response, answer ){
            if( answer ){
                top.require_tsa = true;
            }
            else{
                top.require_tsa = false;
            }
        }
    });
}

function validate_awb_number( invalid_message, action, error ){
    if ( action == 'book' ) {
        if( error ) {
            invalid_message += "You must either enter a valid AWB number, or leave the AWB number blank to have the system generate a new AWB.\n";
        }
    }
    else{
        if( error ) {
            invalid_message += "You must either enter a valid AWB number, or leave the AWB number blank to have the system generate a new AWB.\n";
        }
    }
    return invalid_message;
}

function validate_accept_step_1( action ){
    //TODO origin and destination validation go here...
    invalid_message = '';
    invalid_message = validate_origin_destination( invalid_message );
    invalid_message = validate_itinerary( invalid_message );
    invalid_message = validate_awb_number( invalid_message, action, top.awb_number_error  );
    invalid_message = validate_shipper_widgets( invalid_message, top.must_be_known_shippers );
    invalid_message = validate_consignee_widgets( invalid_message );
    if( invalid_message ){
        alert( invalid_message );
    }
    else{
	get_rates(); 
        check_international_status();
        check_unlock_flight(); 
        get_drop_off_hours();
        accept_awb_step('2');
        check_require_tsa();
    }

}

function validate_accept_step_2(){

    var invalid_message = validate_for_step2();

    if( top.valid(invalid_message) && invalid_message != '' ){
        alert( invalid_message );
    }
    else{
        if( $('action').value == 'save_accept' && top.require_tsa ){
            if($( 'goods_desc' ).value.match( /(HUMANR|HRS)/ )){
                $( 'how_screened_tr' ).hide();
                $( 'tsa_number_screened' ).value = 0;
                $( 'tsa_number_exempt' ).value = 1;
                $( 'tsa_why_exempt').value = "Human remains";
            }
            accept_awb_step('3');
        }
        else{
            $( 'accept_form' ).submit();
        }

    }
}

function validate_for_step2() {
    invalid_message = '';

    if( $F( 'goods_desc') == 0 ){
        invalid_message += "Description of goods is required.\n";
        $('label_for_goods_description').addClassName('invalid_input');
        $('goods_desc').addClassName('invalid_input');
    } else {
        $('label_for_goods_description').removeClassName('invalid_input');
        $('goods_desc').removeClassName('invalid_input');
    }

    if( $('description').disabled == false ){
        if( ! $('description').value ){
            invalid_message += "Description of goods is required.\n";
            $('label_for_goods_description').addClassName('invalid_input');
            $('description').addClassName('invalid_input');
        } else {
            $('label_for_goods_description').removeClassName('invalid_input');
            $('description').removeClassName('invalid_input');
        }
    } else {
        $('label_for_goods_description').removeClassName('invalid_input');
        $('goods_desc').removeClassName('invalid_input');
    }

    $$('#accept_form .number_pieces').each( function( s ) {
        var val = $F(s);
        if ( ! val.match(/[0-9]/) || toNumeric(val) <= 0 ){
            invalid_message += "Pieces is required and must be a positive number.\n";
            s.addClassName('invalid_input');
        } else {
            s.removeClassName('invalid_input');
        }
    });

    $$('#accept_form .height').each( function( s ) {
        var val = $F(s);
        if ( ! val.match(/[0-9]/) || toNumeric(val) <= 0 ){
            invalid_message += "Height is required and must be a positive number.\n";
            s.addClassName( 'invalid_input');
        } else {
            s.removeClassName('invalid_input');
        }
    });

    $$('#accept_form .width').each( function( s ) {
        var val = $F(s);
        if ( ! val.match(/[0-9]/) || toNumeric(val) <= 0 ){
            invalid_message += "Width is required and must be a positive number.\n";
            s.addClassName( 'invalid_input');
        } else {
            s.removeClassName('invalid_input');
        }
    });

    $$('#accept_form .length').each( function( s ) {
        var val = $F(s);
        if ( ! val.match(/[0-9]/) || toNumeric(val) <= 0 ){
            invalid_message += "Length is required and must be a positive number.\n";
            s.addClassName( 'invalid_input');
        } else {
            s.removeClassName('invalid_input');
        }
    });

    if( ! $('pieces').value.match(/[0-9]/) || toNumeric($('pieces').value) <= 0 ){
        invalid_message += "Pieces is required and must be a positive number.\n";
        $('label_for_pieces').addClassName( 'invalid_input');
    }
    else{
        $('label_for_pieces').removeClassName( 'invalid_input' );
    }

    if( ! $('weight').value.match(/[0-9]/) || toNumeric($('weight').value) <= 0 ){
        invalid_message += "Weight is required and must be a positive number.\n";
        $('label_for_weight').addClassName( 'invalid_input');
    }
    else{
        $('label_for_weight').removeClassName( 'invalid_input' );
    }

    if( $('action').value == 'save_accept'){
        if( ! $( 'flight' ).value.match( /[0-9]{1,4}/) ){
            $( 'label_for_flight' ).addClassName( 'invalid_input' );
            invalid_message += "Flight is required.\n";
        }
        else{
            $( 'label_for_flight' ).removeClassName( 'invalid_input' );
        }
    }

    if( $('action').value == 'save_accept' ){
        if(  $( 'extra_charges' ).value < 0 ){
            $( 'label_for_extra_charges' ).addClassName( 'invalid_input');
            invalid_message += "Charges due Agent cannot be less than $0.00\n";
        }
        else{
            $( 'label_for_extra_charges' ).removeClassName( 'invalid_input' );
        }

        if( top.valid($('carrier_charges'))) {
            if($( 'carrier_charges' ).value < 0 ){
                $( 'label_for_carrier_charges' ).addClassName( 'invalid_input');
                invalid_message += "Additional Charges Due Carrier cannot be less than $0.00\n";
            }
            else{
                $( 'label_for_carrier_charges' ).removeClassName( 'invalid_input' );
            }
        }
    }

    if( ! $( 'charges_code' ).value.match( /[A-Z]{2}/ ) ){
        invalid_message += "Charges code is required.\n";
        $( 'label_for_charges_code' ).addClassName( 'invalid_input');
    }
    else {
        if ( ! top.magic_customer.test($( 'shipper_account' ).value)
            && ! top.magic_customer.test($( 'consignee_account' ).value) ) {
            if ( $( 'charges_code' ).value.match( /C[A-Z]/ )
                 && ( $( 'allow_unk_consignee' ).value == '0'
                      && ! $( 'consignee_customer_id').value.match( /[0-9]{1,}/ )
                    )
               ) {
                invalid_message += "Collect shipments require a valid consignee account. Please choose another form of payment or return to the previous screen and enter a consignee account.\n";
	        $( 'label_for_charges_code' ).addClassName( 'invalid_input');
            }
            else {
                $( 'label_for_charges_code').removeClassName( 'invalid_input' );
            }
        }

        if ( $( 'charges_code' ).value.match( /C[A-Z]/ ) ) {
            if ( $('consignee_acct_status').value == 'X' )
                invalid_message += "Consignee account " + $( 'consignee_account').value + " is closed. Please contact customer service.";
        }
        else {
            if ( $('shipper_acct_status').value == 'X' )
                invalid_message += "Shipper account " + $( 'shipper_account').value + " is closed. Please contact customer service.";
        }
    }

    if( ! $( 'priority' ).value.match( /[A-Z]{3}/ ) ){
        invalid_message += "Rate code is required.\n";
        $( 'label_for_priority').addClassName( 'invalid_input');
    }
    else{
        $( 'label_for_priority').removeClassName( 'invalid_input' );
    }

    if( top.valid($( 'declared_value' )) ) {
        if(  $( 'declared_value' ).value > top.max_declared_value ){
            $( 'label_for_declared_value' ).addClassName( 'invalid_input');
            invalid_message += "Declared value cannot be greater than " + sprintf( '%.2f', top.max_declared_value )
                + ' ' + $( 'declared_value_currency' ).innerHTML + "\n";
        }
        else if(  $( 'declared_value' ).value < 0 ){
            $( 'label_for_declared_value' ).addClassName( 'invalid_input');
            invalid_message += "Declared value cannot be less than $0.00\n";
        }
        else{
            $( 'label_for_declared_value' ).removeClassName( 'invalid_input' );
        }
    }

    if( top.valid($( 'customs_value' )) ) {
        if( $( 'customs_value' ).value && isNaN( parseFloat( $( 'customs_value' ).value ) ) ){
            $( 'label_for_customs_value' ).addClassName( 'invalid_input');
            invalid_message += "Customs value is not a recognized number value.\n";
        }
        else{
            $( 'label_for_customs_value' ).removeClassName( 'invalid_input');
        }
    }

    return invalid_message;
}

function validate_accept_step_3(){

    invalid_message = '';
    piece_count = $( 'pieces' ).value;

    if( is_international_location( $( 'origin_id').value ) || is_international_location( $( 'destination_id').value ) ) {
        must_screen = Math.ceil( piece_count * .3);
    }
    else{
        must_screen = piece_count;
    }

    if(! $( 'goods_desc' ).value.match( /(HUMANR|HRS)/ )){

        if ( $( 'tsa_number_screened' ).value < must_screen || $( 'tsa_number_screened' ).value > must_screen){
            $( 'label_for_number_screened' ).addClassName( 'invalid_input' );
            invalid_message += "You must screen " + must_screen + " of " + piece_count + " total pieces for this AWB.\n";
        }
        else{
            $( 'label_for_number_screened' ).removeClassName( 'invalid_input' );
        }
    }

    if( ! $( 'tsa_who_screened' ).value ){
        $( 'label_for_who_screened' ).addClassName( 'invalid_input' );
        invalid_message += "Who screened is required.\n";
    }
    else{
        $( 'label_for_who_screened' ).removeClassName( 'invalid_input' );
    }

    if( $('tsa_number_exempt').value && $('tsa_number_exempt').value > 0 ){
        if( ! $( 'tsa_why_exempt').value ){
            $( 'label_for_why_exempt' ).addClassName( 'invalid_input' );
            invalid_message += "Why exempt is required.\n";
        }
        else{
            $( 'label_for_why_exempt' ).removeClassName( 'invalid_input' );
        }
    }

    if( invalid_message ){
        alert( invalid_message );
    }
    else{
        $( 'accept_form' ).submit();
    }
}

function is_international_location( location_id ){
    is_int = false;
    new Ajax.Request( 'locations',{
        asynchronous: false,
        parameters: "action=is_international&location=" +  location_id,
        onComplete: function(response, data){
            if( data == 'yes' ){
                is_int = true;
            }
        }
    }
    );
    return is_int;
}

function flash_message(){
    $( 'user_flash_message' ).innerHTML = ' ';
}

function bill_shipper_consignee_check(){
    if( $('bill_consignee').checked ){
        $( 'charges_code' ).value = 'CC';
    }
    else{
        $( 'charges_code' ).value = 'PP';
    }
}

function validate_claim_form(){
    invalid_message ='';

    if( ! $('air_way_bill_number').value.match( /[0-9]{8}/ ) ){
        invalid_message += "AWB number is requried.\n";
        $('label_for_air_way_bill_number').addClassName( 'invalid_input' );
    }
    else{
        $('label_for_air_way_bill_number').removeClassName( 'invalid_input' );
    }

    if( ! $('account_number').value ){
        invalid_message += "Account number is required.\n";
        $('label_for_account_number').addClassName( 'invalid_input');
    }
    else{
        $('label_for_account_number').removeClassName( 'invalid_input');
    }

    if( ! $('claimant_name').value ){
        invalid_message += "Claimaint's name is requried.\n";
        $('label_for_claimant_name').addClassName( 'invalid_input');
    }
    else{
        $('label_for_claimant_name').removeClassName( 'invalid_input');
    }

    if( ! $('claimant_fax').value ){
        invalid_message += "Claimaint's fax is requried.\n";
        $('label_for_claimant_fax').addClassName( 'invalid_input');
    }
    else{
        $('label_for_claimant_fax').removeClassName( 'invalid_input');
    }

    if( ! $('claimant_phone').value ){
        invalid_message += "Claimaint's phone is requried.\n";
        $('label_for_claimant_phone').addClassName( 'invalid_input');
    }
    else{
        $('label_for_claimant_phone').removeClassName( 'invalid_input');
    }

    if( ! $('claimant_email').value.match( /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/ ) ){
        invalid_message += "Claimaint's e-mail is requried and must be valid.\n";
        $('label_for_claimant_email').addClassName( 'invalid_input');
    }
    else{
        $('label_for_claimant_email').removeClassName( 'invalid_input');
    }

    if( ! $('claimant_address').value ){
        invalid_message += "Claimaint's address is requried.\n";
        $('label_for_claimant_address').addClassName( 'invalid_input');
    }
    else{
        $('label_for_claimant_address').removeClassName( 'invalid_input');
    }

    if( ! $('claimant_city').value ){
        invalid_message += "Claimaint's city is requried.\n";
        $('label_for_claimant_city').addClassName( 'invalid_input');
    }
    else{
        $('label_for_claimant_city').removeClassName( 'invalid_input');
    }

    if( ! $('claimant_postal_code').value ){
        invalid_message += "Claimaint's postal code is requried.\n";
        $('label_for_claimant_postal_code').addClassName( 'invalid_input');
    }
    else{
        $('label_for_claimant_postal_code').removeClassName( 'invalid_input');
    }

    if( invalid_message ){
        alert( invalid_message );
        return false;
    }
    return true;
}

function fetch_claim_data(){
    $('twirlly_thinger').innerHTML = "<img src=../images/spinner.gif />";
    new Ajax.Request( 'claims',{
        parameters: "action=claim_data&awb_number=" +  $('air_way_bill_number').value,
        onComplete: function(response, data){
            if( ! data.origin ){
                $('twirlly_thinger').innerHTML = ' Air way bill not found.';
            }
            else{
                $('twirlly_thinger').innerHTML = '';
                $('awb_summary').show();
                $('claim_details').show();

                $('origin').innerHTML = data.origin;
                $('destination').innerHTML = data.destination;
                $('pieces').innerHTML = data.pieces;
                $('weight').innerHTML = data.weight;

                $('account_number').enable();
                $('claimant_name').enable();
                $('claimant_address').enable();
                $('claimant_city').enable();
                $('claimant_postal_code').enable();
                $('claimant_fax').enable();
                $('claimant_phone').enable();
                $('claimant_email').enable();

                $('account_number').value = data.account_number;
                $('claimant_name').value = data.claimant_name;
                $('claimant_address').vaue = data.claimant_address;
                $('claimant_city').value = data.city;
                $('claimant_postal_code').value = data.postal_code;
            }
        }
    });
}

function check_user_country_rules() {
    if( $('country_code').value == 'US' ) {
        $('label_for_state').innerHTML = "* State";
        $('label_for_zip').innerHTML = "* Zip";
    } else {
        $('label_for_state').innerHTML = "State";
        $('label_for_zip').innerHTML = "Zip";
    }
}

function validate_user_form(){
    var message = '';

    if( $('username').value && ! $('username').value.match( /^[A-Za-z0-9]{4,16}$/ ) ){
        message += "Username is required and must be between 4 and 16 characters.\n";
        $('label_for_username').addClassName( 'invalid_input');
    } else {
        $('label_for_username').removeClassName( 'invalid_input');
    }
    if( $('email').value && ( ! $('email').value.match( /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/ ) ) ){
        message += "E-mail must be a valid e-mail address.\n";
        $('label_for_email').addClassName( 'invalid_input' );
    } else {
        $('label_for_email').removeClassName( 'invalid_input');
    }
    if( ! $('address').value.match( /[A-Za-z0-9'-.,]/ ) ) {
        message += "Address is required.\n";
        $('label_for_address').addClassName( 'invalid_input' );
    } else {
        $('label_for_address').removeClassName( 'invalid_input');
    }
    if( ! $('city').value.match( /[A-Za-z0-9'-.,]/ ) ) {
    message += "City is required.\n";
    $('label_for_city').addClassName( 'invalid_input' );
    } else {
        $('label_for_city').removeClassName( 'invalid_input');
    }

    if( $('country_code').value == 'US' ) {
        if( ! $('state').value.match( /[A-Za-z0-9'-.,]/ ) ) {
            message += "State is required.\n";
            $('label_for_state').addClassName( 'invalid_input' );
        } else {
            $('label_for_state').removeClassName( 'invalid_input');
        }
        if( ! $('zip').value.match( /[A-Za-z0-9'-.,]/ ) ) {
            message += "Zip is required.\n";
            $('label_for_zip').addClassName( 'invalid_input' );
        } else {
            $('label_for_zip').removeClassName( 'invalid_input');
        }
    }

    if(($F( 'user_type' ) == 'CUSTOMER') &&
        ! $('customer_account').value.match( /[A-Za-z0-9]{3,}/ ) ) {
            message += "Users of type CUSTOMER must be assigned to a customer account.\n";
        $('label_for_customer').addClassName( 'invalid_input' );
    } else {
        $('label_for_customer').removeClassName( 'invalid_input');
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}

function validate_customer_form(){
    var message = '';

    if( ! $('customer_id').value.match( /[A-Za-z0-9]{6,}/ ) ){
        message += "Account number is required and must be at least 6 characters.\n";
        $('label_for_customer_id').addClassName( 'invalid_input');
    }
    if( ! $('company_name').value.match( /[A-Za-z0-9'-.,]/ ) ) {
        message += "Company name is required.\n";
        $('label_for_company_name').addClassName( 'invalid_input' );
    }
    if( ! $('address_1').value.match( /[A-Za-z0-9'-.,]/ ) ) {
    message += "Address is required.\n";
    $('label_for_address_1').addClassName( 'invalid_input' );
    }
    if( ! $('city').value.match( /[A-Za-z0-9'-.,]/ ) ) {
        message += "City is required.\n";
        $('label_for_city').addClassName( 'invalid_input' );
    }
    if( ! $('state').value.match( /[A-Za-z0-9'-.,]/ ) ) {
    message += "State is required.\n";
    $('label_for_state').addClassName( 'invalid_input' );
    }
    if( ! $('postal_code').value.match( /[A-Za-z0-9'-.,]/ ) ) {
        message += "Postal code is required.\n";
        $('label_for_postal_code').addClassName( 'invalid_input' );
    }

    if( message ){
        alert( message );
        return false;
    }
    return true;
}

function open_file_upload( url ){
    window.open( url + '/file',  "file_uploader","menubar=1,resizable=1,width=350,height=150");
}

function file_uploader(){
    new Ajax.Request( 'file',{
        parameters: "awb=" +  $('awb_number').value,

        onComplete: function(response, file_data){
            if(file_data){
            }
            else{
            }
        }
    });
}

function writeAirwaybillB6(title, content, printer)
{
    if ( validate_form('#print_form','.awb_dom') ) {
        var printer_id = top.valid(printer) ? $F(printer) : 0;

        newWin = window.open("", "newWin","toolbar=0,status=0,menubar=0,fullscreen=no,width=900,height=930,resizable=1,top=0,scrollbars=1");
        doc = newWin.document;
        bdy = "<html><head>";
        bdy += "<title>" + title + "</title>";
        bdy += "<link href=\"../css/awb_B6.css\" rel=\"stylesheet\" type=\"text/css\" />";
        bdy += "</head>";
        bdy += "<body style=\"background-color:#FFFFFF\" onload=\"print()\">" + content + "</body>";
        bdy += "</html>";
        doc.write(bdy);
        doc.close();
    }
}

function print_labels( awb_id, label_count, label_print_type, label_range, printer ){
    var printer_id = top.valid(printer) ? $F(printer) : 0;
    if ( validate_form('#print_label_form','.label') ) {
        var rangeRE = new RegExp('^(\\d+)\\-(\\d+)$');
        var pages = new Array();
        if ( valid(label_print_type) && label_print_type == 'range') {
            var nums = label_range.split(',');
            for (var i = 0; i < nums.length; i++) {
                var num = nums[i];
                if ( rangeRE.match( num ) ) {
                    var range = rangeRE.exec( num );
                    if (range.length == 3) {
                        var min = toNumeric( range[1] );
                        var max = toNumeric( range[2] );
                        if (min < max) {
                            for (var rangenum = min; rangenum <= max; rangenum++) {
                                pages.append(rangenum);
                            }
                        } else {
                            alert('Please check your ranges');
                        }
                    }
                } else if ( isNumeric( num ) ) {
                    pages.append( toNumeric( num ) );
                }
            }
            pages.sort(compareNumbers);
            if ( pages.max() > label_count ) {
                var element = $('label_range');
                if (valid(element)) {
                    msg = 'Range specified exceeds total piece count of ' + label_count;
                    attachError(element, msg);
                }
                return;
            }
        }

        window.location = "../spec_print_label.php?air_waybill_id=" + awb_id + "&printer_id=" + printer_id + "&label_count=" + label_count + ( ( pages.length > 0 ) ? '&range=' + pages.toJSON() : '');
    }
}

function validate_form(formIdent, formGroup) {
    clearErrors();
    var shouldSubmit = true;
    ident = '';
    if (valid(formIdent)) {
        ident = formIdent;
        if (valid(formGroup)) {
            ident += ' ' + formGroup;
        }
    }

    ident += '.inspect';
    var elements = $$(ident);
    if (valid(elements) && elements.length > 0) {
        elements.each( function( element ) {
            var elementValid = true;

            if ( valid( element ) ) {
                if ( ! valid( element.getAttribute( 'ignore' ) ) ) {
                    var value = $F(element);
                    if (elementValid && element.hasClassName('notempty')) {
                        if ( emptyField( element ) ) {
                            elementValid=shouldSubmit=false;
                            msg = 'This required field is empty';
                            attachError(element, msg);
                        }
                    }
                    if (elementValid && element.hasClassName('positivenumber')) {
                        if ( ! isNumeric( value ) ) {
                            elementValid=shouldSubmit=false;
                            msg = 'This required field should be a number';
                            attachError(element, msg);
                        }
                    }
                    if (elementValid && element.hasClassName('printrange')) {
                        var printRangeRE = new RegExp('^[\\d\\-,]*$');
                        if ( ! printRangeRE.match( value ) ) {
                            elementValid=shouldSubmit=false;
                            msg = 'This field should be a valid print range.';
                            attachError(element, msg);
                        }
                    }
                    if (elementValid && element.hasClassName('checked')) {
                        if ( ! element.checked ) {
                            elementValid=shouldSubmit=false;
                            msg = 'Please check this box to continue';
                            attachError(element, msg);
                        }
                    }
                    if (elementValid && element.hasClassName('printertype')) {
                        var printertype = $F(element);
                        if ( valid(printertype) && toNumeric(printertype) <= 0) {
                            elementValid=shouldSubmit=false;
                            msg = 'Please select a printer to continue';
                            attachError(element, msg);
                        }
                    }
                }
            }
        });
    }

    return shouldSubmit;
}

function toggleAccess ( id ) {
    var elem = $(id);
    if (valid(elem)) {
        var shouldEnable = valid( elem.disabled ) && elem.disabled == true;
        if (shouldEnable) {
            elem.enable();
        } else {
            elem.disable();
        }
        elem.writeAttribute('ignore', !shouldEnable);
    }
}

function print_int_awb( awb_id, printer ){
    if ( validate_form('#print_awb_form','.awb_int') ) {
        if( $( 'int_awb_printer' ).value == 5 ){
            writeAirwaybillB6('Air Waybill', document.getElementById('airwaybillhtml').innerHTML, $('dom_awb_printer'));
        } else {
            var awb_form = $('print_awb_form');
            if ( top.valid( awb_form ) ) {
                awb_form.submit();
            }
        }
    }
}
function scroll_2_results(){
    var search_results = $( 'search_results' );
    if (valid(search_results)) {
         xy = $( 'search_results' ).viewportOffset();
         window.scrollTo( xy[0], xy[1] );
    }
}

function isArray(obj) {
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}

function sprintf(fstring)
  { var pad = function(str,ch,len)
      { var ps='';
        for(var i=0; i<Math.abs(len); i++) ps+=ch;
        return len>0?str+ps:ps+str;
      };
    var processFlags = function(flags,width,rs,arg)
      { var pn = function(flags,arg,rs)
          { if(arg>=0)
              { if(flags.indexOf(' ')>=0) rs = ' ' + rs;
                else if(flags.indexOf('+')>=0) rs = '+' + rs;
              }
            else
                rs = '-' + rs;
            return rs;
          };
        var iWidth = parseInt(width,10);
        if(width.charAt(0) == '0')
          { var ec=0;
            if(flags.indexOf(' ')>=0 || flags.indexOf('+')>=0) ec++;
            if(rs.length<(iWidth-ec)) rs = pad(rs,'0',rs.length-(iWidth-ec));
            return pn(flags,arg,rs);
          }
        rs = pn(flags,arg,rs);
        if(rs.length<iWidth)
          { if(flags.indexOf('-')<0) rs = pad(rs,' ',rs.length-iWidth);
            else rs = pad(rs,' ',iWidth - rs.length);
          }
        return rs;
      };
    var converters = new Array();
    converters['c'] = function(flags,width,precision,arg)
      { if(typeof(arg) == 'number') return String.fromCharCode(arg);
        if(typeof(arg) == 'string') return arg.charAt(0);
        return '';
      };
    converters['d'] = function(flags,width,precision,arg)
      { return converters['i'](flags,width,precision,arg);
      };
    converters['u'] = function(flags,width,precision,arg)
      { return converters['i'](flags,width,precision,Math.abs(arg));
      };
    converters['i'] =  function(flags,width,precision,arg)
      { var iPrecision=parseInt(precision);
        var rs = ((Math.abs(arg)).toString().split('.'))[0];
        if(rs.length<iPrecision) rs=pad(rs,' ',iPrecision - rs.length);
        return processFlags(flags,width,rs,arg);
      };
    converters['E'] = function(flags,width,precision,arg)
      { return (converters['e'](flags,width,precision,arg)).toUpperCase();
      };
    converters['e'] =  function(flags,width,precision,arg)
      { iPrecision = parseInt(precision);
        if(isNaN(iPrecision)) iPrecision = 6;
        rs = (Math.abs(arg)).toExponential(iPrecision);
        if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) rs = rs.replace(/^(.*)(e.*)$/,'$1.$2');
        return processFlags(flags,width,rs,arg);
      };
    converters['f'] = function(flags,width,precision,arg)
      { iPrecision = parseInt(precision);
        if(isNaN(iPrecision)) iPrecision = 6;
        rs = (Math.abs(arg)).toFixed(iPrecision);
        if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) rs = rs + '.';
        return processFlags(flags,width,rs,arg);
      };
    converters['G'] = function(flags,width,precision,arg)
      { return (converters['g'](flags,width,precision,arg)).toUpperCase();
      };
    converters['g'] = function(flags,width,precision,arg)
      { iPrecision = parseInt(precision);
        absArg = Math.abs(arg);
        rse = absArg.toExponential();
        rsf = absArg.toFixed(6);
        if(!isNaN(iPrecision))
          { rsep = absArg.toExponential(iPrecision);
            rse = rsep.length < rse.length ? rsep : rse;
            rsfp = absArg.toFixed(iPrecision);
            rsf = rsfp.length < rsf.length ? rsfp : rsf;
          }
        if(rse.indexOf('.')<0 && flags.indexOf('#')>=0) rse = rse.replace(/^(.*)(e.*)$/,'$1.$2');
        if(rsf.indexOf('.')<0 && flags.indexOf('#')>=0) rsf = rsf + '.';
        rs = rse.length<rsf.length ? rse : rsf;
        return processFlags(flags,width,rs,arg);
      };
    converters['o'] = function(flags,width,precision,arg)
      { var iPrecision=parseInt(precision);
        var rs = Math.round(Math.abs(arg)).toString(8);
        if(rs.length<iPrecision) rs=pad(rs,' ',iPrecision - rs.length);
        if(flags.indexOf('#')>=0) rs='0'+rs;
        return processFlags(flags,width,rs,arg);
      };
    converters['X'] = function(flags,width,precision,arg)
      { return (converters['x'](flags,width,precision,arg)).toUpperCase();
      };
    converters['x'] = function(flags,width,precision,arg)
      { var iPrecision=parseInt(precision);
        arg = Math.abs(arg);
        var rs = Math.round(arg).toString(16);
        if(rs.length<iPrecision) rs=pad(rs,' ',iPrecision - rs.length);
        if(flags.indexOf('#')>=0) rs='0x'+rs;
        return processFlags(flags,width,rs,arg);
      };
    converters['s'] = function(flags,width,precision,arg)
      { var iPrecision=parseInt(precision);
        var rs = arg;
        if(rs.length > iPrecision) rs = rs.substring(0,iPrecision);
        return processFlags(flags,width,rs,0);
      };
    farr = fstring.split('%');
    retstr = farr[0];
    fpRE = /^([-+ #]*)(\d*)\.?(\d*)([cdieEfFgGosuxX])(.*)$/;
    for(var i=1; i<farr.length; i++)
      { fps=fpRE.exec(farr[i]);
        if(!fps) continue;
        if(arguments[i]!=null) retstr+=converters[fps[4]](fps[1],fps[2],fps[3],arguments[i]);
        retstr += fps[5];
      }
    return retstr;
}

function display_note( selectorClass, note) {
    var noteClass = 'notify';
    var notes = $$('.' + selectorClass + '.' + noteClass);
    var noteElement = ( notes.length > 0 ) ? notes[0] : null;
    var noteTxt = note || '';
    if ( top.valid( noteElement ) ) {
        noteElement.update(noteTxt);
    }
}

function display_note_from_select( elem, selectorClass, noteAttribute ) {
    var noteAtt = noteAttribute || 'notes';
    var optionElem = elem.getSelectedOption();
    var note = '';
    if ( top.valid( optionElem ) ) {
        note = optionElem.readAttribute( noteAtt ) || '';
    }
    display_note( selectorClass, note );
}

