RadioCon.SongRequest = function() {

    var $wrap = $(), $formW = $(), $form = $();
    var fbox, cal;

    var REQUIRED_FIELDS = ['person','date','song'];

    function setup() {
        fbox = new FBox({
            data : {},
            constraints : {
                minWidth : 400,
                minHeight : 340
            },
            animation : true,
            showOverlay : true,
            overlayOpacity : .3,
            overlayClickClose : true,
            useLoaderAnimation : true,
            loaderParams : {
                animationLength : 60,
                animationStep : 5
            }
        });
        $formW = $wrap.find('.song-form').remove();
        $form = $formW.find('form').submit(submitForm);
        _setupDateField();
        $wrap.find('.link').click(showForm);
    }

    function _setupDateField() {
        var $input = $form.find('input[name=date]');
        if ($input.length) {
            var date = new Date();
            date.setTime(date.getTime() + 86400000);
            cal = Calendar.setup({
                dateFormat : '%d.%m.%Y',
                animation : false,
                onSelect : dateSelectHandler,
                onBlur : hideCalendar
            });
            cal.__input = $input.get(0);
            $input.attr('readonly', 'readonly').val(Calendar.printDate(date, '%d.%m.%Y'));
            $(document.createElement('ins'))
                .addClass('d-hellip')
                .html('...')
                .insertAfter($input)
                .add($input)
                    .mousedown(function() {
                        showCalendar(this);
                        return false;
                    });
        }
    }

    function showForm() {
        fbox.show();
        fbox.contentD.append($formW);
    }

    function submitForm() {
        var z = $form.serializeArray();
        $form.find('div').removeClass('error');
        var flag = true;
        var params = {
            '_do' : 'song_request'
        }
        for (var i = 0; i < z.length; i++) {
            var name = z[i].name;
            params[name] = z[i].value.toString().trim();
            if ((REQUIRED_FIELDS.indexOf(name) >= 0) && (params[name] == '')) {
                $form.find('.f-' + name).addClass('error');
                flag = false;
            }
        }

        if (flag) {
            fbox._loaderShow();
            $.post(RadioCon.AJAX_URI, params, _responseHandler, 'json');
        }

        return false;
    }

    function _responseHandler(data) {
        fbox._loaderHide();
        $form.remove();
        $form = null;
        $formW.append($(document.createElement('div')).addClass('message').html(data.text));
    }


    function showCalendar(element) {
        var input = (element.tagName.toLowerCase() === 'input')
            ? element
            : $(element).prev('input').get(0);

        var val = input.value;
        cal.selection.reset(Calendar.dateToInt(Calendar.parseDate(val, false)));
        cal.popup(input);

    }

    function hideCalendar() {
        cal.hide();
    }

    function dateSelectHandler(cal, selection) {
        cal.__input.value = selection.print('%d.%m.%Y');
        hideCalendar();
    }

    return {
        init : function(wrap) {
            $wrap = $(wrap);
            setup();
        }
    }
}();

