/*jslint browser: true */
/*global $, escape, enableEl, showModal, closeModal, characterLimit, removeError, SWFUpload, swfobject */
var swfu, queuedFileId, messages;
function validateForm()
{
    var hasFormErrors, isVideoSelectForm, bRecorded, bUploaded, hasRecordedVideo;
    hasFormErrors = $('#personalize_ecard').find('#greeting, #ecard_message, #signature').parent('li.error').length !== 0;
    isVideoSelectForm = $('input[name="video_type"]').length !== 0;
    bRecorded = $('input[name="video_type"]:checked').val() === '1';
    bUploaded = $('input[name="video_type"]:checked').val() === '2';
    hasRecordedVideo = $('#recorded_video').val() !== '';

    if (!hasFormErrors && (!isVideoSelectForm || (bUploaded || (bRecorded && hasRecordedVideo))))
    {
        $('#mainContent > p.error').remove();
        enableEl($('#personalize_ecard #button_submit'), true);
    }
}
function clearFormMessages()
{
}
// Add a message to the recorder modal popup
function addMessage(text)
{
    $('#recorderMessages').show().find('h2, p').remove().end().append(text);
}
// Clear the messages in the recorder modal popup
function clearMessage()
{
    $('#recorderMessages').hide().find('h2, p').remove();
}
function removeFileFromQueue()
{
    if (queuedFileId !== null)
    {
        swfu.cancelUpload(queuedFileId);
        queuedFileId = null;
    }
}
// a file to upload has been selected
function uploadFileQueued(file) {
    try {
        removeFileFromQueue();
        queuedFileId = file.id;
        $('#video_type div.message').find('h2').text(messages.videoType.uploaded.heading).end().find('p').text(messages.videoType.uploaded.text.replace('{0}', file.name));
        $('#video_type_2').attr('checked', true);
        removeError($('#video_type_li, #upload_a_video_label'));
        validateForm();
    } catch (e) {
    }
}
// error event when a file is queued
function fileQueueError(file, errorCode, message) {
    try {
        switch (errorCode) {
        case SWFUpload.errorCode_QUEUE_LIMIT_EXCEEDED:
            alert('too many files');
            break;
        case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
            alert('zero byte');
            break;
        case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
            alert('Your file (' + file.name + ') was larger than the maximum size allowed.\n\nPlease upload a file less than 50MB.');
            break;
        default:
        case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
        case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
            alert('Error\n\nFile: ' + file + '\nError Code: ' + errorCode + '\nMessage: ' + message);
            break;
        }

      //addImage("images/" + imageName);

    } catch (ex) {
        this.debug(ex);
    }
}
// file uploading to server
function uploadProgress(file, bytesLoaded) {
    try {
        var filename, percent;
        if ($('#submitMessage #progressBar').length === 0)
        {
            filename = file.name.length > 25 ? file.name.substring(0, 40) + '...' : file.name;
            $('#submitMessage > *').hide().parent().append('<div id="progressBar"><p>Uploading ... ' + filename + '</p><div class="bar"><div class="progress"></div></div><p class="percent"></p><p class="status"></p></div>');
        }
        percent = Math.ceil((bytesLoaded / file.size) * 100);
        $('#submitMessage #progressBar').find('.percent').text(percent + '%').end().find('.progress').css('width', percent + '%').end().find('.status').text((bytesLoaded / 1048576).toFixed(1) + ' MB of ' + (file.size / 1048576).toFixed(1) + ' MB');
        if (percent === 100) {
            // progress.setStatus("Creating thumbnail...");
            // progress.toggleCancel(false, this);
        } else {
            // progress.setStatus("Uploading...");
            // progress.toggleCancel(true, this);
        }
    } catch (ex) {
        this.debug(ex);
    }
}
// file uploaded to server
function fileUploadSuccess(file, serverData) {
    //alert("uploadSuccess\nserverData: " + serverData);
    try {
       //file.id = "singlefile"; // This makes it so FileProgress only makes a single UI element, instead of one for each file
        //var progress = new FileProgress(file, this.customSettings.progress_target);
        //progress.setComplete();
        //progress.setStatus("Complete.");
        //progress.toggleCancel(false);

        if (serverData === 'OK') { // success
            $('#video_type_2').attr('checked', true);
            this.customSettings.upload_successful = true;
        } else { // fail
            $('#video_type_2').removeAttr('checked');
            this.customSettings.upload_successful = false;
            // TODO: set filename?
            //document.getElementById("hidFileID").value = serverData;
            // TODO: set message
        }
    } catch (e) {
    }
}
// file uploaded to server all done
function fileUploadComplete(file) {
    try {
        if (this.customSettings.upload_successful) {
            $('#file_uploaded').val('true');
            $('#personalize_ecard').submit();
            // document.getElementById("btnBrowse").disabled = "true";
            // uploadDone();
        } else {
            // file.id = "singlefile"; // This makes it so FileProgress only makes a single UI element, instead of one for each file
            // var progress = new FileProgress(file, this.customSettings.progress_target);
            // progress.setError();
            // progress.setStatus("File rejected");
            // progress.toggleCancel(false);
            // $('#txtFileName').val('');
            // validateForm();

            alert("There was a problem with the upload.\nThe server did not accept it.");
        }
    } catch (e) {
    }
}
// VECTK Recorder: video recorded event
function recorder_ui_recorded(f)
{
    $('#recorded_video').val(f);
    enableEl($('#saveRecorder'), true);
    $('#resetRecorder').parent('span').show();
}
// VECTK Recorder: error handler
function recorder_ui_error_handler(oe, fe)
{
    var errorMessage, bSendAlert, errorAlertUrl;
    errorMessage = '';
    bSendAlert = false;

    switch (oe)
    {
    case 'Camera.Not_Found':
        errorMessage = '<h2>Camera Not Found!</h2><p>Click on the Settings button to select your webcam</p>';
        break;
    case 'Microphone.Not_Found':
        errorMessage = '<h2>Microphone Not Found!</h2><p>Click on the Settings button to select your webcam</p>';
        break;
    case 'Server.Connection_Failed':
        errorMessage = '<p>An error has occurred while connecting to the server. Please try again.</p>';
        bSendAlert = true;
        // ToDo: reset
        break;
    case 'Loader.Download_Failed':
        errorMessage = '<p>An error has occurred and we are working to fix the problem. Please try again.</p>';
        bSendAlert = true;
        break;
    default:
        errorMessage = '<h2>' + oe + '</h2><p>' + fe + '</p>';
        break;
    }
    addMessage(errorMessage);
    if (bSendAlert)
    {
        errorAlertUrl = $('#error_url').val() + '?oe=' + oe + '&fe=' + escape(fe);
        $.getJSON(errorAlertUrl, function (data) {
            // do nothing
        });
    }
}
// VECTK Recorder: Timeout event
function recorder_ui_idle_timeout()
{
    // kill flash
    // shut window down or reload player
    addMessage('<h2>Idle Timeout!</h2><p>Your connection has been idle for 5 minutes</p>');
    $('#closeMessage').addClass('closeWindow');
}
// VECTK Recorder: Record Again
function recorder_ui_reset()
{
    clearMessage();
    enableEl($('#saveRecorder'), false);
    $('#resetRecorder').parent('span').hide();
    document.getElementById('recorder').recorder_ui_reset();
    $('#recorder').focus();
}

$(function () {
    // load JSON messages
    messages = eval("(" + $('#hidden_messages').val() + ")");

    if ($('#video_type > div.message').length === 0)
    {
        $('#video_type').append('<div class="message"><h2>' + messages.videoType.noVideo.heading + '</h2><p>' + messages.videoType.noVideo.text + '</p></div>');
    }
    // radio for video type TODO: does this fire?
    $('input[name="video_type"]').change(function () {
        $('input[name="video-type"]').find('~ ol > li input').each(function () {
            enableEl($(this), false);
        });
        $(this).find('~ ol > li input').each(function () {
            enableEl($(this), true);
        });
    });
    $('#recorderPopup').hide();
    $('#saveRecorder').click(function () {
        if ($('#recorded_video').val() !== '')
        {
            $('#video_type_1').attr('checked', true);
            removeFileFromQueue(); // remove any files queued for upload
            $('#video_type_li').removeClass('error').find('> label.error').remove();
            validateForm();
        }
        closeModal($('#recorderPopup'));
        clearMessage();
        $('#video_type div.message').find('h2').text(messages.videoType.recorded.heading).end().find('p').text(messages.videoType.recorded.text);
    });
    $('#showRecorder').click(function () {
        if (!$('#recorderPopup').is(':visible'))
        {
            var flashvars, params, attributes;
            $('#resetRecorder').parent('span').hide();
            showModal($('#recorderPopup'));
            flashvars = { };
            params = {
                wmode: "opaque",
                movie: "always"
            };
            attributes = { };
            swfobject.embedSWF("/flash/recorder.swf", "recorder", "343", "297", "7", "/flash/expressInstall.swf", flashvars, params, attributes);

            enableEl($('#saveRecorder'), false);
            $('#recorder').focus();
        }
    });
    $('#closeRecorder').click(function () {
        closeModal($('#recorderPopup'));
        clearMessage();
    });
    $('#resetRecorder').click(recorder_ui_reset);

    $('#recorderMessages #closeMessage').click(function () {
        clearMessage();
        $('#recorderMessages').hide();
        if ($(this).hasClass('closeWindow'))
        {
            $(this).removeClass('closeWindow');
            closeModal($('#recorderPopup'));
        }
    });

    $('fieldset#video_type li.radio:first-child').after('<li class="or">or</li');

    $('#upload_a_video').wrap('<div class="bigButton"></div>')
        .before('<input id="showFileBrowse" type="button" value="' + $('label[for="upload_a_video"]').text().replace(':', '') + '"/>')
        .parent('div').parent('li').find('label').attr('id', 'upload_a_video_label');
    if ($('#upload_a_video').length === 1)
    {
        var settings = {
            // Backend settings
            flash_url : "/flash/swfupload.swf",
            upload_url: "/uploader",   // Relative to the SWF file
            post_params: {'UPLOADFILENAME' : $('#uploaded_video').val()},
            //file_post_name: "Filedata",

            // Flash file settings
            file_size_limit : "51200", //50 MB
            file_types : "*.avi;*.mpg;*.mov;*.flv;*.mp4;*.wmv",
            file_types_description : "Video Files",
            file_upload_limit : 0,
            file_queue_limit : 2,

            // The event handler functions are defined in handlers.js
            // swfupload_loaded_handler : swfUploadLoaded,

            file_queued_handler : uploadFileQueued,
            file_queue_error_handler : fileQueueError,
            //file_dialog_complete_handler : fileDialogComplete,

            //upload_start_handler : uploadStart,
            upload_progress_handler : uploadProgress,
            // upload_error_handler : uploadError,
            upload_success_handler : fileUploadSuccess,
            upload_complete_handler : fileUploadComplete,
            //swfupload_pre_load_handler : swfUploadPreLoad,
            //swfupload_load_failed_handler : swfUploadLoadFailed,
            //queue_complete_handler : queueComplete, // Queue plugin event

            // button
            button_placeholder_id : "upload_a_video",
            button_width: $('#upload_a_video').parent('div').width(),
            button_height: $('#upload_a_video').parent('div').height(),
            button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
            button_cursor: SWFUpload.CURSOR.HAND,

            custom_settings : {
                // progressTarget : "fsUploadProgress",
                //cancelButtonId : "btnCancel",
                upload_successful : false
            },
            debug: false

            // SWFObject settings
            //minimum_flash_version : "9.0.28"
        };
        swfu = new SWFUpload(settings);
        queuedFileId = null;
    }

    $('#showRecorder').wrap('<div class="bigButton"></div>');

    $('.bigButton').hover(
        function () {
            if (!$(this).hasClass("hover"))
            {
                $(this).addClass("hover");
            }
        },
        function () {
            $(this).removeClass("hover");
        }
    );

    // form add hidden field and intercept form submit
    $('#personalize_ecard').prepend('<input type="hidden" id="file_uploaded" value="false" />').submit(function () {
        if ($('input[name="video_type"]:checked').val() === '2' && ($('#file_uploaded').val() === 'false'))
        { // upload video
            swfu.startUpload();
            return false;
        }
    });
    characterLimit($('#personalize_ecard #greeting'), 40);
    characterLimit($('#personalize_ecard #ecard_message'), 175);
    characterLimit($('#personalize_ecard #signature'), 25);
    // disable submit, but not for Edit page
    if ($('input[name="video_type"]').length !== 0)
    {
        enableEl($('#personalize_ecard #button_submit'), false);
        $('#personalize_ecard').find('#greeting, #ecard_message, #signature').bind('change keyup click', function () {
            validateForm();
            return true;
        });
    }
});
