dojo.require("dojo.parser");
dojo.require("dijit.form.Button");
dojo.require("dijit.form.Textarea");
dojo.require("dojox.form.FileUploader");
dojo.require("dojox.validate.regexp");
dojo.require("dijit.form.ValidationTextBox");

var progress_interval = null;
var streamID = null;
var files_to_upload = 0;
var count = 0;

var uploadStatusRetryLimit = 30;
var uploadStatusRetryCount = 0;
var uploadState = "";

var totalBytes = 0;
var totalMegabytes = 0;

var oldFilelist = [];
var uploader;

function emailRegexpGenerator(constraints){
    var email = dojox.validate.regexp.emailAddress();
    // this regexp matches either single email or
    // list of emails separated by comma+any number of whitespace characters
    return "("+email+")|(("+email+",\\s{0,}){1,}"+email+")";
}

function prepare_progressbar_content(){
    dojo.style('layer-2', 'width', '0%');
    dojo.style('rate', 'display', 'inherit');
    dojo.style('link', 'display', 'inherit');
    dojo.style('link', 'opacity', 0);

    dojo.style('err', 'display', 'none');
    dojo.style('err', 'opacity', 0);

    dojo.byId("fileToUpload").innerHTML = "Ready to upload files";
}
function prepare_error_msg_content(){
    dojo.style('err', 'display', 'inherit');
    dojo.style('err', 'opacity', 0);
}
function show_message(message_string){
    dojo.byId('link').innerHTML = message_string;
    dojo.fadeIn({node: dojo.byId('link'), duration: 1000}).play();
}
function show_error(message_string){
    dojo.byId('err').innerHTML = message_string;
    dojo.fadeIn({node: dojo.byId('err'), duration: 1000}).play();
}

function validate_form_fields(){
    if(!dijit.byId('recipient-email').isValid()){
        show_error('Error: recipient email invalid');
        return false;
    }
    var terms = dojo.byId('terms')
    if(terms && terms.checked == false){
        show_error('Error: you must agree on terms of use');
        return false;
    }
    if(files_to_upload == 0){
        show_error('Error: you must select files to upload');
        return false;
    }
}
dojo.addOnLoad(function() {

    dojo.byId("fileToUpload").innerHTML = "Ready to upload files";

    uploader = new dojox.form.FileUploader({
            uploadUrl:"/upload.yaws",
            uploadOnChange:false,
            selectMultipleFiles:true,
            deferredUploading:true,
            isDebug:false,
            flashFieldName: "Filedata",
            hoverClass:"dijitButtonHover",
            activeClass:"dijitButtonActive",
            disabledClass:"dijitButtonDisabled",
            swfPath: "http://www.streamfile.com/scripts/swf_uploader/uploader3.swf",
    }, "multifileBrowse");

    dojo.connect(dojo.byId('stream-now'), 'onclick', function(){
        prepare_error_msg_content();
        if(validate_form_fields() == false){ return false; }

        dojo.xhrGet({
                url: "/generate_stream.yaws",
                handleAs: "text",
                sync: true,
                load: function(response, ioArgs) {
                    streamID = dojo.trim(response);
                    dojo.byId('stream').value = streamID;
                }
        });

        var name = dojo.byId('from-name').value;
        var message = dojo.byId('from-message').value;
        var email = dojo.byId('from-email').value;
        var password = dojo.byId('pass').value
        if(dojo.byId('terms')){
            var terms = (dojo.byId('terms').checked == true)?"on":"off";
        }else{
            var terms = "on";
        }

        uploader.upload({
                stream_id: dojo.byId('stream').value,
                email: dojo.byId('recipient-email').value,
                from_name: (name=='Your name')?'':name,
                from_message: (message=='Additional message')?'':message,
                from_email: (email=='Your email (for confirmation emails)')?'':email,
                notifications: dojo.byId('notify').value,
                pass: (password=='Password')?"":password,
                accept_terms: terms,
        });

        progress_interval=null;
        clearInterval(progress_interval);
        prepare_progressbar_content();
        dojo.byId('progressbar-text').innerHTML = 'Starting upload...';
        check_upload_status();
    });
    dojo.connect(uploader, "onChange", function(data){
        files_to_upload = 0;
        totalBytes = 0;
        uploadState = "";

        prepare_progressbar_content();

        for(var i in oldFilelist){
            uploader.removeFile(oldFilelist[i].name, false);
        }
        oldFilelist = uploader.fileList;

        dojo.style('layer-2', 'width', "0%")
        dojo.byId('progressbar-text').innerHTML = "0.0%";
        dojo.fadeOut({node: dojo.byId('rate'), duration: 1000}).play();
        clearInterval(progress_interval);

        dojo.forEach(data, function(d){
            totalBytes += d.size;
            files_to_upload += 1;
        });
        totalMegabytes = ((totalBytes/1024)/1024).toFixed(2);
        streamSize = parseFloat(dojo.byId("stream-size").innerHTML);
        if(totalMegabytes > streamSize){
            dojo.byId("fileToUpload").innerHTML = "Size of selected files exceeds available stream size! Browse again." +" Total files size: " + totalMegabytes + " MB";
            dojo.style('layer-1', 'width', "0%");
        }else{
            var files = " files, ";
            if(files_to_upload == 1){
                files = " file, ";
            }
            dojo.byId("fileToUpload").innerHTML = "Ready to upload " + files_to_upload + files + "total size: " + totalMegabytes + " MB";
            width = (parseFloat(totalMegabytes / streamSize) * 100).toFixed(1)+'%';
            dojo.style('layer-1', 'width', width);
        }
    });
    dojo.connect(uploader, "onProgress", function(data){
        var loadedBytes = 0;
        dojo.forEach(data, function(d){
            loadedBytes += d.bytesLoaded;
        });
        var files = " files, ";
        if(files_to_upload == 1){
            files = " file, ";
        }
        dojo.byId("fileToUpload").innerHTML = "Uploading " + files_to_upload + files + "total size: " + totalMegabytes + " MB";
        var width = parseFloat((loadedBytes / totalBytes)*100).toFixed(1)+'%';
        dojo.style('layer-2', 'width', width)
        dojo.byId('progressbar-text').innerHTML = width;

        if(loadedBytes == totalBytes){
            uploadState = "done";
        }
    });
    dojo.connect(uploader, "onComplete", function(data){
        files_to_upload = 0;
    });
});

function check_upload_status() {
    if (progress_interval == null) {
        dojo.byId('progressbar-text').innerHTML = 'Starting upload...';
        progress_interval = setInterval(check_upload_status, 2000);
        return;
    } else if (count == 30) {
        clearInterval(progress_interval);
        progress_interval = setInterval(check_upload_status, 5000);
    } else if (count == 60) {
        clearInterval(progress_interval);
        progress_interval = setInterval(check_upload_status, 15000);
    }
    count = count + 1;

    try {
        /* JSON-RPC calls look like:
         To-server: {"id":"httpReq", "method":"get_status", "params":["2KkIZPrvFSCL51J1LQIXiqoyxAfgN"]}
         Response: {"result":"{state:'starting'}","id":"httpReq"}

         Where the thing in "params" is the stream ID
         */

        dojo.rawXhrPost({
                url:"/upload_status.yaws",
                headers: {"Content-Type": "application/json"},
                handleAs:'json',
                postData: '{"id":"httpReq", "method":"get_status", "params":["'+streamID+'"]}',
                handle:function(data, status) {
                    var upload = dojo.fromJson(data.result);
                    var active = ((upload.state == 'done') || (upload.state == 'uploading') || (upload.state == 'received'));
                    var err = (upload.state == 'error');

                    if(active){
                        if (upload.rate){
                            var rate = '0 KB/s';
                            if(upload.rate != 'Please wait, connecting...'){
                                rate = upload.rate.split(",")[0];
                            }
                            dojo.byId('rate').innerHTML = '(upload rate: '+rate+')';
                        }
                    }
                    if(err && uploadStatusRetryCount == 3){
                        prepare_error_msg_content();
                        show_error(upload.error_msg);
                    }else if(err){
                        dojo.byId('rate').innerHTML = '(uploading...)';
                    }

                    if(uploadState == "done" && upload.state != "error"){
                        upload.state = "done";
                    }
                    switch (upload.state) {
                    case 'starting':
                        break;
                    case 'uploading':
                        break;
                    case 'error':
                        if(uploadStatusRetryLimit == uploadStatusRetryCount){
                            dojo.fadeOut({node: dojo.byId('rate'), duration: 1000}).play();
                            clearInterval(progress_interval);
                        }else{
                            uploadStatusRetryCount += 1;
                        }
                        break;
                    case 'done':
                        link = upload.link.replace(/http/g, PROTOCOL);
			show_message('This link was sent to '+upload.emails+' and exists for '+ upload.expire  +' hours.<br/> ' + '<a href="' + link+ '">' + link + '</a>');
                        dojo.style('layer-2', 'width', "100%")
                        dojo.byId('progressbar-text').innerHTML = "100%";
                        clearInterval(progress_interval);
                        files_to_upload = 0;
                        break;
                    case 'nofile':
                        show_message('This file has expired or was never uploaded.');
                        clearInterval(progress_interval);
                        break;
                    case 'received':
                        show_message('This file was successfully streamed and delivered.');
                        clearInterval(progress_interval);
                        break;
                    }
                }
        });
    }
    catch (e) {
        show_message(e);
    }
    return false;
}
