(function(Prepop, $) {
$(document).ready(function() {

    // cache DOM elements
    var form_cont = $('#application'),
        change_zip_cont = $('#change-zip'),
        zip_status_cont = $('#zip-status'),
        status_cont = $('#status');


    //================================================================================
    //                                 SEARCH SETTINGS
    //================================================================================


    var settings = SchoolForm.defaults;
    settings.abortHandler = function() { // handle when user aborts the request or there was an error
        form_cont.html(
            '<h2>Sorry.</h2>' +
            '<h3>There was an error processing your request. Please reload the page to try again.</h3>'
        ).show();
    };

    settings.errorHandler = function(code) { // handle when error occurs in request
        if (code != settings.INV_ARGS) {
            settings.abortHandler();
        } else { // invalid args
            form_cont.hide();
            change_zip_cont.show();
        }
    };

    // sets the form tracking identifier as part of the form after it's loaded
    function setFormTrackId(form) {
        var field, hit_id = Prepop.get('hit_id');

        if (form && form.length > 0) {
            if ((field = $('input[name=hitTrackingId]', form)) && field.length > 0) {
                if (hit_id && (hit_id+'') != field.val()) {
                    field.val(hit_id);
                    return true;
                }
                return false;
            }

            // add the field
            if (hit_id) {
                $('<input type="hidden" name="hitTrackingId" value="' + hit_id + '" />').appendTo(form);
                return true;
            }
        }
        return false;
    };

    settings.completeHandler = function(response) {
        var campus = response.campus || false;

        form_cont.hide();
        if ($.trim(campus.form_header).length == 0) {
            campus.form_header = 'Request information about degree or diploma programs from this school.';
        }
        $('h3', form_cont).text(campus.form_header);

        // create form
        var pd_id = Prepop.get('program_id');

        $('.content', form_cont).html('<form id="school_form" action="' + response.form.path + '" method="post" class="modal_confirm">' +
            '<p class="sub-required">(Fields marked with <strong>*</strong> are required)</p>' +
            (pd_id ? '<input type="hidden" name="program_id" value="' + pd_id + '" />' : '') +
            '<table>' + response.form.field_content +
               '<tr id="submit_cell"><td colspan="2">' +
                   '<input class="app_submit" type="submit" value="Submit" />' +
 					'<p>We Value Your <a href="/privacy" target="_blank">Privacy</a>.</p>' +
                  '</td></tr>' +
            '</table>' + 
          '</form>');
        $('.required', form_cont).parents('tr').find('th label').addClass('req');

        // attempt to setup form tracking id
        var form = $('#school_form');
        setFormTrackId(form); 
        form.submit(function() { setFormTrackId(form); });

        //if (window.ModalConfirm) {
        //    // apply modal confirm bindings
        //    ModalConfirm.init({
        //        cancel_action: function() { document.location = document.referrer; }
        //        ,cancel_text: 'No Thanks, Take Me Back'
        //        ,confirm_text: 'Submit My Request'
        //        ,message_html: '<img src="/images/cm_collegeoverview.png" alt="College Overview"><p>I understand that I am requesting information from a school and will be contacted by a school representative shortly. I acknowledge that this is not an application for employment.</p>'
        //        ,trigger_event: 'modal_activate'
        //    });
        //}

        // let's modify the look of the program field, to give it more space (thanks IE, I love you too)
        $('input[type=submit]', form).parents('tr').before('<tr id="_prog_row"><td colspan="2" align="center"></td></tr>'); // add a new row in form to hold program dropdown
        var prog_sel = $('#id_programId'), old_row_cont = prog_sel.parents('tr'), new_row_cont = $('#_prog_row');
        prog_sel.remove().appendTo($('td', new_row_cont)); // move program dropdown
        $('td', old_row_cont).append('&nbsp;');
        old_row_cont = new_row_cont = null;

        // setup field-specific content.. this could be better what about other types of values...?
        var map = {};
        $('.field_content').each(function() {
            var values = $.trim((this.className+'').replace(/\bfield_content\b/g, ''));
            var content_el = $(this);

            $.each(values.split(/\s+/), function(i, v) {
                v = v.split('-'); // check for statler specific condition
                var key = v[0];
                if (key in map) return true; // skip duplicates
                map[key] = true;

                // extract unique ids from list
                var id_map = {};
                var s2_ids = $.map((v[1] || '').split(','), function(id) {
                    if (!id || (id in id_map)) return null;
                    id_map[id] = true;
                    return id;
                });
                id_map = null;

                var restrict = s2_ids.length && campus && $.inArray((campus.s2_school_id+''), s2_ids) == -1; // restrict to one of provided s2_ids
                if (!restrict) {
                    var cls = '.fcn_' + key;
                    $(cls + ':radio, ' + cls + ':checkbox, select' + cls).bind('change blur', function(ev) {
                        if ($.inArray($(this).val(), Prepop.getBoolValues('Yes')) != -1) {
                            content_el.show();
                        } else {
                            content_el.hide();
                        }
                    });
                }
            });
        });
        map = null; // cleanup if this grows..

        zip_status_cont.show();
        form_cont.show();

        // attempt to fix IE select width problem
        if (typeof prog_sel.fixSelect == 'function') {
            prog_sel.fixSelect(prog_sel.css('width').replace('px', ''));
        }

        if (typeof setupValidity == 'function') setupValidity(); // setup form validity

        // replace school info with campus info
        if (campus) {
            $('#highlight').html('<h3>' + campus.school_name + ' :: ' + campus.name + '</h3>' + buildCampusInfo(campus));
            $('#campus-info').html(campus.desc);
            
            // inject program-specific content... god this should probably be handled somewhere else
            var progIds = $('option', prog_sel).map(function() { return $(this).val() || null; }).get();
            if (progIds) {
                $.getJSON('/api/get_program_content/', {
                    school_id: campus.s2_school_id,
                    program_ids: progIds.join(',')
                }, function(response) {
                    if (response.error == 0) {
                        Prepop.set('program_content', response.data);
                    }
                });
            }
        }

        // handle change for program dropdown so we can show program specific content
        var prog_content = $('#program-content');
        prog_sel.change(function() {
            var progId = $(this).val();
            var content = Prepop.get('program_content') || {};
            var cont = $('#prog_content');

            if (content[progId] && content[progId].content) {
                prog_content.html(content[progId].content).show();
            } else {
                prog_content.hide().html('');
            }
        }).change();

        // prepopulate form data
        var form_data = Prepop.getTranslated('form');

        if (form_data) {
            var do_prepop = function() {
                for (var key in form_data) {
                    var elem_sel;

                    if (key == 'school_prog_id') { // program dropdown
                        elem_sel = '#id_programId';
                    } else {
                        elem_sel = '.fcn_' + key.toLowerCase();
                    }

                    // prepop this field
                    Prepop.setElements($(elem_sel), form_data[key] || '');
                }
            };
            do_prepop();
            
            // grab some location data if we have postal, to prepop city/state if necessary
            if (form_data['postal'] && (!form_data['city'] || !form_data['state'])) {
                Prepop.fetchLocationData(form_data['postal'], function(data) {
                    if (!form_data['city']) {
                        form_data['city'] = data.city;
                    }

                    if (!form_data['state']) {
                        data.state = (data.state+'').toUpperCase();
                        var state_code = Prepop.getStateCode(data.state);
                        form_data['state'] = [data.state, state_code];
                    }

                    do_prepop(); // now we can prepop
                });
            }
        }
    };
    

    //================================================================================
    //                                   CAMPUS INFO
    //================================================================================


    // builds the html content for the campus that's being loaded
    function buildCampusInfo(campus) {
        var html =
            '<div class="sml_logo">' +
                 '<img src="' + campus.logo + '" alt="sample_sml_logo" />' +
			'</div>' +
			'<div class="address">' +
			'<p>';

        if (campus.address1) {
            html += campus.address1 + '<br />';
        }

        if (campus.address2) {
            html += campus.address2 + '<br />';
        }
        if (campus.city) {
            html += campus.city + ', ' + campus.state + ' ' + campus.zip + '<br />';
        }

        html += '</p></div>';
        return html;
    };

    
    //================================================================================
    //                                  ZIP CHANGE FORM
    //================================================================================


    // change zip handling
    $('a', zip_status_cont).click(function(e) {
        e.preventDefault();
        form_cont.hide();

        // change form prepop values
        $('#postal_change', change_zip_cont).val(Prepop.get('postal') || '');

        $('#cancel-zip').show();
        change_zip_cont.show();
    });

    $('#cancel-zip').click(function(e) {
        e.preventDefault();
        change_zip_cont.hide();
        form_cont.show();
    });
}); // ready()
})(Prepop, jQuery);

