var eZMultiupload;
var emuUploader;
var emuUploadCounter = 0;
var emuFileIdHash;
var emuDataArr;
var emuProgressBarWidth = 300;
var emuProgressBarWidthRate;
var emuOnUploadProgressWidth;
var emuUploadErrorCounter = 0;

function eZMultiupload( multiUploadCondition )
{
    eZMultiupload = multiUploadCondition;
    YAHOO.widget.Uploader.SWFURL = eZMultiupload.swfURL;
    emuUploader = new YAHOO.widget.Uploader( "multiupload" );
    emuUploader.addListener('fileSelect',onFileSelect);
    emuUploader.addListener('uploadError',onUploadError);
    emuUploader.addListener('uploadComplete',onUploadComplete);
    emuUploader.addListener('uploadProgress',onUploadProgress);
    emuUploader.addListener('uploadStart',onUploadStart);
    emuUploader.addListener('uploadCompleteData',onUploadCompleteData);
}

function browse() {
    emuUploader.clearFileList();
    emuUploader.browse(true, [{description:"Files", extensions: multiUploadCondition.fileType}]);
}

function createDataTable(entries) {
    rowCounter = 0;
    emuFileIdHash = [];
    emuDataArr = [];
    for(var i in entries) {
        var entry = entries[i];
        dataObj = {};

        for (var j in entry) {
            dataObj[j] = entry[j];
        }
        emuDataArr.push(dataObj);
        emuFileIdHash[dataObj["id"]] = rowCounter;
        rowCounter++;
    }
    emuProgressBarWidthRate = Math.round( emuProgressBarWidth  / emuDataArr.length );
    upload();
}

function upload() {
    var idToUpload = emuDataArr[emuUploadCounter]["id"];
    emuUploader.upload(idToUpload, multiUploadCondition.uploadURL, 'POST', multiUploadCondition.uploadVars );
    document.getElementById('uploadButton').disabled = true;
}

function onUploadProgress(event) {
    progress = Math.round(100*(event["bytesLoaded"]/event["bytesTotal"]));
    emuOnUploadProgressWidth = Math.round( emuProgressBarWidthRate * (progress*0.01) );
    addProgressBarWidth = parseInt( emuOnUploadProgressWidth ) + parseInt( ( YAHOO.util.Dom.getStyle( 'multiuploadProgressBar' , 'width' ) ).split('px')[0] );
    if( addProgressBarWidth < emuProgressBarWidthRate * ( emuUploadCounter + 1 ) )
    {
        widthAnimate( 'multiuploadProgressBar', addProgressBarWidth );
    }
}

function onFileSelect(event)
{
    YAHOO.util.Dom.setStyle( 'multiuploadProgress' , 'display', 'block' );
    if( YAHOO.util.Dom.getStyle( 'multiuploadProgress' , 'opacity' ) == 0 )
    {
        fadeAnimate( 'multiuploadProgress' , 0, 1 );
    }
    YAHOO.util.Dom.setStyle( 'multiuploadProgressBar' , 'width', 0 );
    
    fileList = event.fileList;
    document.getElementById('multiuploadProgressFileName').innerHTML = '&nbsp';
    document.getElementById('multiuploadProgressMessage').innerHTML = '&nbsp';
    document.getElementById('multiuploadProgressFile').innerHTML = '&nbsp';
    createDataTable(fileList);
}

function onUploadStart(event)
{
    rowNum = emuFileIdHash[event["id"]];
    document.getElementById('multiuploadProgressFile').innerHTML = ( emuUploadCounter + 1 ) + '/' + emuDataArr.length;
    document.getElementById('multiuploadProgressFileName').innerHTML = emuDataArr[rowNum]["name"];
}

function onUploadComplete(event)
{
    rowNum = emuFileIdHash[event["id"]];
    document.getElementById('multiuploadProgressMessage').innerHTML = multiUploadCondition.message_thumbnail_created;
    widthAnimate( 'multiuploadProgressBar', emuProgressBarWidthRate * ( emuUploadCounter + 1 ) );
    
    if (emuUploadCounter < emuDataArr.length - 1) {
        emuUploadCounter++;
        upload();
    }
    else {
        emuUploadCounter = 0;
        document.getElementById('uploadButton').disabled = false;
        document.getElementById('multiuploadProgressMessage').innerHTML = multiUploadCondition.message_all_file_recived;
        widthAnimate( 'multiuploadProgressBar', emuProgressBarWidth );
        thumbnailBlocks = YAHOO.util.Dom.getElementsByClassName('thumbnail-block');
        YAHOO.util.Dom.setStyle( thumbnailBlocks , 'opacity', 1 );
    }
}

function onUploadCompleteData(event) 
{
    completedata = event.data;
    getThumbnail( multiUploadCondition.tumbnailURL, completedata );
}

function onUploadError (event) {
    alert( event.status );
}

function getThumbnail( url, id )
{
    var getThumbnailCallback = { success: function( response ){addThumbnail( response, id )}, failure: function(){ alert('Connect Failure') } };
    postdata = encodeURI('id=' + id);
    YAHOO.util.Connect.asyncRequest('POST', url, getThumbnailCallback, postdata);
}

function addThumbnail( response, id )
{
    regexp = new RegExp('^[0-9]$');
    if ( !id.match( regexp )) {
        id = '_error' + emuUploadErrorCounter;
        emuUploadErrorCounter++;
    }
    var html = response.responseText;
    var thumbnail = '<div id="thumbnail' + id + '" class="thumbnail-block" style="opacity:0;" >' + html + '</div>';
    var thumbnails = YAHOO.util.Dom.get( 'thumbnails' );
    thumbnails.innerHTML = thumbnails.innerHTML + thumbnail;
    fadeAnimate( 'thumbnail'+ id , 0, 1 );
}

function fadeAnimate( elementID, from, to )
{
    var fadeIN = new YAHOO.util.Anim( elementID , { 'opacity' : { 'from':from,'to':to } }, 0.2 );
    fadeIN.animate();
}

function widthAnimate( elementID, to )
{
    var width = new YAHOO.util.Anim( elementID , { 'width' : { 'to':to } } , 0.5 );
    width.animate();
}
