jkuchar/MultipleFileUpload

View on GitHub
public/MFUFallbackController.js

Summary

Maintainability
A
1 hr
Test Coverage
// common ajax setup
$.nette.ext({
    before: function(xhr, settings) {
        // do not process manually triggered xhr using $.ajax()
        // process only form submissions
        if (!settings.nette) {
            return true;
        }
        var n = settings.nette,
            form = n.el.closest('form')[0],
            $submitBtn = null;
        if (n.isSubmit || n.isImage) {
            $submitBtn = n.el;
        }

        if (form && formSubmitted(form, n.e, $submitBtn) === false) {
            return false;
        }
    }
});

// common non-ajax setup
$(document).on('submit', 'form', function(e) {
    formSubmitted(this, e);
});


var MFUFallbackController;
(function(){
    MFUFallbackController = function(rootEl, fallbacks) {

        this.fallbackLinkText = "Is there problem with uploading files? Click here.";

        this.fallbacks = fallbacks;
        this.rootEl = rootEl;

        this.each = function(fn, scope) {
            for(var i=0, l=this.fallbacks.length; i<l; i++) {
                var fallback = this.fallbacks[i];
                fn.call(scope||this,fallback, this.fallbacks);
            }
        }

        this.getLastAlternativeUI = function() {
            return this.fallbacks[this.fallbacks.length-1];
        }

        this.hideUI = function(ui) {
            document.getElementById(ui.id).style.display = "none";
        }

        this.showUI = function(ui) {
            document.getElementById(ui.id).style.display = "block";
        }

        this.swithUI = function(ui) {
            var currentUI = this.activeUI||this.fallbacks[0];
            if(eval(currentUI.destruct,this) == true &&eval(ui.init,this)==true) {
                this.hideUI(currentUI);
                this.activeUI = ui;
                this.showUI(ui);

                this.onUISwitch(currentUI,ui);

            }
        }

        this.isFallbackAvailable = function() {
            var index = this.fallbacks.indexOf(this.activeUI);
            if(index<0) return false;
            var newUI = this.fallbacks[index+1];
            if(typeof newUI == "undefined") return false;
            return newUI;
        }

        this.fallback = function() {
            var ui = this.isFallbackAvailable();
            if(ui===false) return;
            this.swithUI(ui);
        }

        // Fallback link
        var fallbackLink = document.createElement('a');
        fallbackLink.href = "#";
        fallbackLink.onclick = function() {
            rootEl.fallbackCntrl.fallback();
            return false;
        };
        fallbackLink.innerHTML = this.fallbackLinkText;
        this.rootEl.appendChild(fallbackLink);
        this.fallbackLink = fallbackLink;

        this.onUISwitch = function(from,to) {
            if(!this.isFallbackAvailable()) {
                fallbackLink.style.display = "none";
            }
        }


        // Init
        this.activeUI = this.getLastAlternativeUI();
        this.swithUI(this.fallbacks[0]);
        this.rootEl.fallbackCntrl = this;
    }
})();



// Array.indexOf
if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}