$( function () {

    // Remove all empty params from query string on submission
    function simplifySubmit() {
        var qs = $(this).serialize();
        qs = qs.replace(/(^|&)[^&=]+=(?=&|$)/g, '').replace(/^&/, '');
        var newUrl = this.action;
        if (qs) {
            newUrl += (newUrl.match(/\?/) ? '&' : '?') + qs;
        }
        location.href = newUrl;
        return false;
    }

    function toggleAdvanced() {
        var label = $(this).text();
        if (label === 'Advanced') {
            $(this).text('Normal');
            $('.advanced').show();
            $('#advanced').val('1');
        }
        else {
            $(this).text('Advanced');
            $('.advanced').hide();
            $('#advanced').val('');
        }
        return false;
    }

    function opHandler() {
        var fieldId = this.id.replace(/^o-/, 's-');
        var field = $('#' + fieldId);
        var op = $(this).val();
        if (op.match(/^!?e(mpty)?$/)) {
            field.css('visibility', 'hidden');
            field.attr('disabled', 'disabled');
        }
        else {
            field.removeAttr('disabled');
            field.css('visibility', 'visible');
        }
        if (op.match(/^bet(ween)?$/)) {
            $('#' + fieldId + '-between').css('visibility', 'visible')
                .find(':input').removeAttr('disabled');
        }
        else {
            $('#' + fieldId + '-between').css('visibility', 'hidden')
                .find(':input').attr('disabled', 'disabled');
        }
    }

    // Get URL parameters from query string or from hash part of URL (after '#')
    function getUrlParameters() {
        var map = {};
        window.location.href.replace(
            /[?&#]+([^=?&#]+)=([^?&#]*)/gi,
            function (m, key, value) {
                map[key] = decodeURIComponent(value);
            }
        );
        // console.log('getUrlParameters', map);
        return map;
    }

$( function () { // on ready

    $('html').ajaxError(function () { console.error('ajaxError', arguments); });

    function prepareForm(form, fieldInfo, finishForm) {
        console.log('prepareForm', fieldInfo);
        var rules = {};
        form.find('[name|=f]').each(function () {
            var formField = $(this),
                name = formField.attr('name'),
                r = {},
                f = fieldInfo ? fieldInfo[name] : formField.data();
            if (f && !$.isEmptyObject(f)) {
                console.log('field', name, f);
                r = {}; // rules for this form field
                if (formField.hasClass('required') || f.is_required) {
                    r.required = true;
                }
                switch (f.style || 'text') {
                case 'email':
                    r.email = true;
                    break;
                case 'date':
                    r.dateUS = {min: '1900-01-01', max: '2099-12-31'};
                    if (f.min) r.dateUS.min = f.min;
                    if (f.max) r.dateUS.max = f.max;
                    formField.datepicker({showOn: 'button'});
                    break;
                case 'number':
                    if (f.decimals) {
                        r.decimal = {decimals: f.decimals};
                        if (f.min) r.decimal.min = f.min;
                        if (f.max) r.decimal.max = f.max;
                    }
                    else {
                        r.integer = {};
                        if (f.min) r.integer.min = f.min;
                        if (f.max) r.integer.max = f.max;
                    }
                    break;
                case 'code':
                    r.code = true;
                    break;
                default:
                }
                if (!$.isEmptyObject(r)) {
                    rules['f-' + name] = r;
                }
            }
        });
        console.log('rules', rules);
        form.validate({
            rules: rules,
            onkeyup: false, // too annoying
            ignoreTitle: true
        });
        $('.expand', form).autoResize();
        if (finishForm) {
            finishForm(form);
        }
    }

    $('.searchform').submit(simplifySubmit);
    if ($('#advanced').val()) {
        $('#advanced_button').text('Advanced');
    }
    $('#advanced_button').click(toggleAdvanced).click();
    $('.op select').change(opHandler).change();

    var params = getUrlParameters();

    // Function to run at end of prepareForm (a bit klugy)
    var finishForm = $('#edit_box').data('finishForm');

    function showModalBox() {
        $('#edit_box').empty()
            .load(this.href, adjustDialog)
            .dialog('option', 'title', this.title)
            .dialog('open');
        return false;
    }

    function adjustDialog() {
        var $this = $(this),
            maxHeight = $(window).height() - 100,
            maxWidth = $(window).width() - 50,
            fieldsUrl, $form;
        if ($this.height() > maxHeight) {
            $this.height(maxHeight);
        }
        if ($this.width() > maxWidth) {
            $this.width(maxWidth);
        }
        $form = $('.edit_form', this);
        if ($form.length) {
            if ($form.hasClass('with_metadata')) {
                prepareForm($form, null, finishForm);
            }
            else {
                fieldsUrl = $form.attr('action') + '?a=json_fields';
                if (params.t) {
                    fieldsUrl += '&t=' + params.t;
                }
                if (params.c) {
                    fieldsUrl += '&c=' + params.c;
                }
                $.getJSON(
                    fieldsUrl,
                    function (data, textStatus) {
                        // still need to add error handling
                        prepareForm($form, data, finishForm);
                    }
                );
            }
        }
    }

    if (!$('#edit_box').length) {
        $('body').append('<div id="edit_box"></div>');
    }
    $('#edit_box').dialog({
        autoOpen: false,
        bgiframe: true, // handle IE6 bug (need to load other JS?)
        height: 'auto',
        width: 'auto',
        modal: true,
        position: 'top',
        width: 700
    });
    $('.modal').click(showModalBox);
    prepareForm($('.edit_form'), null, finishForm);

    function hoverOn() { $(this).addClass('hover'); }
    function hoverOff() { $(this).removeClass('hover'); }
    $('table.listing > tbody > tr:odd').addClass('alt'); // stripe table
    $('table.listing > tbody > tr').hover(hoverOn, hoverOff);

} );

} );

