/*global $, $$, $F, Ajax, Event, Login, SWFUpload, file_types, goal, needs_login, pageTracker, token_url */

var uploader;
var starting_identifier;
var needs_login = true;

function explainFileTypes() {
    var element = $('filetypes');
    if (element) {
        element.toggle();
    }
}

function enableSubmit() {
    $('submit_button').src = "/images/buttons/go_embed_it.png";
}

function disableSubmit() {
    $('submit_button').src = "/images/buttons/go_embed_it_off.png";
}

function progress(file, completeBytes, totalBytes) {
    var width = $('progress-outer').getWidth();
    $('progress-outer').show();
    $('progress-inner').style.width = Math.ceil(100 * completeBytes / totalBytes) + '%';
}

function error(file, code, status) {
    uploader.setButtonDisabled(false);
    $('progress-outer').hide();
    var message;
    switch (parseInt(status, 10)) {
    case 403:
        message = "Upload forbidden.";
        break;
    case 415:
        message = "That file type is unsupported.";
        break;
    case 500:
        message = "Unexpected server error.";
        break;
    default:
        message = "Unknown error.";
        break;
    }
    $('status').update(message);
    $('status').show();
}

function success(file, response) {
    $('identifier').value = response;
    uploader.addPostParam('identifier', response);
    $('progress-inner').style.width = '100%';
    if (file) {
        $('success-list').insert({bottom: '<li>' + file.name + '</li>'});
    }
    $('success-list').show();
    $('progress-outer').hide();
    $$('.option').invoke('hide');
}

function queueSuccess(queueCount) {
    uploader.setButtonDisabled(false);
    //enableSubmit();
    submitEmbed();
}

function ready(selectedCount, queuedCount) {
    if (queuedCount > 0) {
        uploader.setButtonDisabled(true);
        $('progress-outer').show();
        $('status').hide();
  //      $('filetypes').hide();
        uploader.startUpload();
    }
}

function switchType() {
    $('file').toggle();
    $('url').toggle();
    if ($('url').visible()) {
        $('embed_url').focus();
    }
}

// Be generous in matching protocols at the beginning. We will massage it when they click submit...
function validateURL(url) {
    return url.match(/^(?:https?:\/\/){0,2}(?:[\w\-]+\.)+[a-z]{2,6}.*/i);
}

function validateURLField() {
    if (validateURL($F(this))) {
        enableSubmit();
    } else {
        disableSubmit();
    }
}

function submitEmbed() {
    if ($F('identifier').length > 1) {
        if (needs_login) {
            Login.token_url = token_url + '?identifier=' + $F('identifier');
            Login.on_cancel = restoreFlash;
            $('animation').style.visibility = 'hidden';
            $('choose-button').style.visibility = 'hidden';
            Login.show();
        } else {
            document.location.href = token_url + '?identifier=' + $F('identifier');
        }
    } else if ($('url').visible()) {
        if (validateURL($F('embed_url'))) {
            // If the URL does not begin with a protocol, then prefix it with http://
            // Also, replace any double protocol like http://http:// with the second one
            if (!$F('embed_url').match(/[a-z]{3,5}:\/\/.*/i)) {
                $('embed_url').value = 'http://' + $F('embed_url');
            }

            $('embed_url').value = $F('embed_url').replace(/^([a-z]{3,5}:\/\/)+/i, "$1");

            var url = '/create/setURL';
            var request = new Ajax.Request(url, {
                method: 'post',
                parameters: {
                    embed_url: $F('embed_url')
                },
                onSuccess: function (response) {
                    $('identifier').value = response.responseText;
                    submitEmbed();
                }
            });
        } else {
            alert('Please enter a URL before continuing.');
        }
    } else {
        alert('Please select a file to upload before continuing.');
    }
}

function restoreFlash() {
  $('animation').style.visibility = 'visible';
  $('choose-button').style.visibility = 'visible';
}

SWFUpload.onload = function () {
    if ($('choose-placeholder')) {
        uploader = new SWFUpload({
            button_placeholder_id: 'choose-placeholder',
            button_width: 232,
            button_height: 50,
            button_cursor: SWFUpload.CURSOR.HAND,
            button_image_url: '/images/buttons/selectfiles_sprite.png',
            upload_url: '/create/upload',
            flash_url: '/javascripts/swfupload/swfupload.swf',
            file_size_limit: '20480',
            file_types: file_types,
            file_types_description: "Supported embedit.in files",
            file_upload_limit: 10,
            upload_progress_handler: progress,
            upload_error_handler: error,
            upload_success_handler: success,
            queue_complete_handler: queueSuccess,
            file_dialog_complete_handler: ready
        });
    }

    // Track keyup instead of keypress so that the effect registers before we pull the field value
    // Blur is also required since autocomplete uses only mouseclicks
    $('embed_url').observe('keyup', validateURLField);
    $('embed_url').observe('blur', validateURLField);

    if (typeof starting_identifier !== 'undefined') {
        success(null, starting_identifier);
    }
    
    var request = new Ajax.Request('/sessions/exists', {
        method: 'get',
        onSuccess: function (transport) {
            needs_login = !transport.responseText.evalJSON(true);
        }
    });
};
