
function FolderUploadWidget(options) {
  options = $.extend(true, {
    upload_form: null,
    i18n: {
      select_files: 'Select files...',
      minutes: 'min',
      seconds: 'sec',
      upload_canceled: 'Your transfer has been cancelled.',
      upload_was_interrupted: 'Upload was interrupted. Try again ?',
      files_are_different: 'These files are different. Please, select the same file.'
    }
  }, options);

  function readablizeBytes(bytes) {
    if (bytes == 0) return '0 bytes'

    var str = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];
    var index = Math.floor(Math.log(bytes) / Math.log(1024));
    bytes = (bytes / Math.pow(1024, Math.floor(index)));
    bytes = (index > 1) ? bytes.toFixed(1) : Math.floor(bytes);

    return bytes + " " + str[index];
  }
  
  function showProgressBar() {
    $('#percent').html('0');
    $('#sizeOk').html('');
    
    $('#upload').hide();
    $('#frameUploadProgressBarWithStopButton').show();
  }

  function hideProgressBar() {
    $('#uploadButton1').removeClass("d");
    $('#uploadButton1').addClass("a");
    options.upload_form[0].reset();
    $('#frameUploadProgressBarWithStopButton').hide();
    $('#upload').show();
    $('#progresswidth').attr('width', "1%");
  }

  var mulsupport = ("multiple" in document.createElement("input"));

  $("#fid0").ready(function() {
    if (mulsupport) {
      $('#fid0').attr("multiple", "multiple");
      $("#selectButton").find("div.gt").text(options.select_files);
    }
  });

  $('#fid0').change(function() {
    $('#uploadButton1').removeClass("d");
    $('#uploadButton1').addClass("a");
    $("#fileselectvalue").empty();
    if (document.getElementById("fid0").files != null) var numb = document.getElementById("fid0").files.length;
    if (mulsupport && numb > 1) {
        $("#fileselectvalue").append($(document.createElement("img")).attr({"src":"/images/icons/16x16/stack.png","id":"ico","class":"absmid","hspace":"3"}));
        var fileTitle = numb + " <t:t>files</t:t>";
    } else {
      var file = $(this).val();
      reWin = /.*\\(.*)/;
      fileTitle = file.replace(reWin, "$1");
      reUnix = /.*\/(.*)/;
      fileTitle = fileTitle.replace(reUnix, "$1");

      var RegExExt = /.*\.(.*)/;
      var ext = fileTitle.replace(RegExExt, "$1");

      var ico = '/icons/16x16/' + ext + '.gif';
      $("#fileselectvalue").append($(document.createElement("img")).attr({"src": ico, "id": "ico", "class": "absmid", "hspace": "2"}));
      $('#ico').error(function() {
        $(this).attr("src", "/icons/16x16/default.png");
      });
    }

    $('#fileselectvalue').append(fileTitle);
  });

  $("#fid0").hover(function() {
   $(".fileselectcontainer").find('div.gv').addClass("hover").stop();
   $(".fileselectcontainer").find('div.gh').addClass("hover").stop();
  }, function() {
    $(".fileselectcontainer").find('div.gv').removeClass("hover").stop();
    $(".fileselectcontainer").find('div.gh').removeClass("hover").stop();
  });

  var uploadModule = UploadModule.build({
    upload_form: options.upload_form,
    uploadHandler: UploadModule.getAnonUploadHandler(),

    onStart: function() {
      uploadStarts = true;
      showProgressBar();
    },

    // Callback is invoked each time we receive updated progress status from sever
    onProgress: function(progress) {
      var percent = Math.floor((progress.loaded / progress.total) * 100);
      var minimumProgressBarWidth = 1;
      $('#progresswidth').attr('width', Math.max(percent, minimumProgressBarWidth) + "%");
      $('#percent').html(percent);
      $('#sizeOk').html(readablizeBytes(progress.loaded));
    },

    onError: function(error) {
      alert(error.errorMessage);
    },

    onComplete: function(data) {
      uploadStarts = false

      hideProgressBar()
      if (data.status == "OK") {
        alert('Upload complete!');
      }else if (data.status == "error") {
        alert(data.errorMessage)
      }
      document.location.reload()
    },

    onCancel:function() {
      alert(options.i18n.upload_canceled)
      
      // Reload page if "non-HTML5 browser"
      if (UploadModule.HandlerUploadXhr.isSupported()) return
      document.location.reload()
    },

    onConfirm: function(message) {
      return confirm(message)
    },

    onCleanup: function() {
      uploadStarts = false
      hideProgressBar()
      options.upload_form[0].reset()
      $("#fileselectvalue").html('')
    }
  })

  this.start = function() {
    $('#uploadButton1').addClass('d')
    $('#uploadButton1').removeClass("a")
    
    uploadModule.start()
  }

  this.stop = function() {
    uploadModule.cancel()
  }

  return this;
}
