Your IP : 18.219.40.177


Current Path : /usr/local/mgr5/skins/orion/src/
Upload File :
Current File : //usr/local/mgr5/skins/orion/src/App.SendFormWithFiles.js

/**
 * Upload files
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.SendFormWithFiles = function(window, $, EventMgr, App) {
  'use strict';
  var init = function() {
        EventMgr.bind('setBrandSettings', sendFormWithFiles);
        EventMgr.on('#main-wrapper', '.i-button-form-send-cancel', 'click',
            abortFormSending);
      },
      abortFormSending = function(e) {
        var id = this.getAttribute('data-id');
        EventMgr.trigger('ajaxRequestAbort', { id: id });
      },

      sendFormWithFiles = function(e, data) {
        if (window.FormData) {
          sendLikeFormData(data);
        } else {
          sendLikeFrame(data);
        }
      },

      sendLikeFormData = function(data) {
        var formData = new FormData(),
            param = data.param,
            tabId = data.tabId,
            options = data.options,
            id = new Date().getTime();
        resetHiddenInput(tabId);
        /* jshint forin:false */
        for (var key in param) {
          formData.append(key, param[key]);
        }
        $('#frm-' + tabId + ' input[type="file"]').each(function() {
          if (this.files) {
            var l = this.files.length, name = this.name;
            if (l > 1) {
              name += '[]';
            }
            while (l--) {
              formData.append(name, this.files[l]);
            }
          }
        });
        //formData.append('sok', 'ok');
        options.formData = formData;
        options.reqType = 'xhr';
        options.id = id;
        //clear class for setvalues
        var $progressbar = $('#' + tabId +
                    '-progressbar'),
            $loader = $progressbar.find('.b-progressbar__loader'),
            $btn = $progressbar.find('.b-progressbar__btn-wr');
        $loader.removeClass('b-progressbar__loader_type_static');
        if ($btn.length) {
          $btn.remove();
        }
        options.progressCb = function(e) {
          if (e.lengthComputable) {
            var per = Math.round((e.loaded * 100) / e.total) ,
                width = per * (0.98);
               // loader = App.u.selectorCache('#' + tabId +
               //     '-progressbar .b-progressbar__loader');
            //add static class & rewrite comment & add cancel btn
            if (!$loader.hasClass('b-progressbar__loader_type_static')) {
              //add class for small bottom padding
              $('#' + tabId + '-progressbar')
                  .addClass('b-progressbar_type_withbtn');
              //remove animated
              $loader.removeClass('b-progressbar__loader_type_animate');
              //add static color
              $loader.addClass('b-progressbar__loader_type_static');
              //add cancel btn
              $('#' + tabId + '-progressbar .b-progressbar__inner')
                  .append('<div class="b-progressbar__btn-wr">' +
                      '<div class="b-button b-button_style_small i-button-form-send-cancel" data-id="' +
                      id + '">' + pageInfo.msgCancel + '</div>' +
                      '</div>');
              //rewite comment
              $('#' + tabId + '-progressbar .b-progressbar__comment')
                  .html(window.pageInfo.formSending);
            }
            //set progress
            $loader.css('width', width + '%');
            if (per > 7) {
              $loader.html(per + '%');
            } else {
              $loader.html('');
            }
          }
        };
        EventMgr.trigger('ajaxRequest', options);
        EventMgr.trigger('tabLoading', { tabId: tabId });
      },

      sendLikeFrame = function(data) {
        var tabId = data.tabId,
            parent = data.parent,
            frameId = 'iframe-' + Math.round(new Date().getTime() / 1000),
            $form, sForm, action;
        //find hidden by if/else input@type=hidden & reset it
        resetHiddenInput(tabId);
        $('body').after('<iframe width="0" height="0" style="display:none;" name="' +
            frameId + '" id="' + frameId + '"></iframe>');
        sForm = document['frm-' + tabId];
        action = sForm.getAttribute('action');
        $('#form-wrapper-' + tabId).wrap(function() { return '<form action="' +
              action + '" id="form-' + frameId +
              '" method="POST" enctype="multipart/form-data" target="' +
              frameId + '"/>'; });
        $form = $('#form-' + frameId);
        if (data.addParams) {
          /* jshint forin: false */
          for (var key in data.addParams) {
            $form.append('<input type="hidden" name="' + key + '" value="' + data.addParams[key] + '"/>');
          }
        }
        //$form.append('<input type="hidden" value="ok" name="sok"/>');
        //$form.append('<input type="hidden" value="ajax" name="sfrom"/>');
       // $form.append('<input type="hidden" value="' + data.pid +
       //     '" name="progressid"/>');
       // $form.append('<input type="hidden" value="' + data.name +
        //    '" name="clicked_button"/>');
        $('#' + frameId).load(function() {
          handleResponse(this, frameId, data, parent);
        });
        $form.submit();
        EventMgr.trigger('showLoader');
      },

      resetHiddenInput = function(tabId) {
        //find hidden by if/else input@type=hidden & reset it
        $('#form-wrapper-' + tabId).find('.l-form__row_hidden_yes input[type="file"]').each(function() {
           var $self = $(this);
           $self.wrap('<form>').closest('form').get(0).reset();
           $self.unwrap();
        });
      },

      handleResponse = function(loadedFrame, frameId, data, parent) {
        var response = {},
            responseStr = loadedFrame.contentWindow.document.body.innerHTML,
            tabId = data.tabId;
        try {
          //replace ' with ""
          responseStr = responseStr.replace(/\\'/g, "'");
          //remove doctype
          responseStr = responseStr.replace(/<![\w\s\"-\/]*>/g, '');
          //remove html tags
          responseStr = responseStr.replace(/(<([^>]+)>)/g, '');
          //check for 503 error
          if (responseStr.match(/^long\/+/)) {
            EventMgr.trigger('ajaxRequest', {
              url: pageInfo.host + responseStr,
              invar: {
                iType: 'replace',
                dataSaved: true,
                tabId: tabId,
                targetTabId: tabId,
                parent: parent
              },
              type: 'post',
              outtype: 'json',
              trfunc: 'ajaxFormResponse',
              queue: 'noqueue',
              failfunc: 'failFormAjaxResponse'
            });
            return;
          } else {
            response = $.parseJSON($.trim(responseStr));
          }
        } catch (e) {
          response = responseStr;
          EventMgr.trigger('hideLoader');
          EventMgr.trigger('pullMsg', { msg: 'JSON Parse Error.' });
        }
        //@TODO run formHandler
        //@TODO remove iframe and wrapper
        if (response) {
          $('#form-wrapper-' + tabId).unwrap();
          $('#' + frameId).remove();
          response.tabId = tabId;
          response.parent = parent;
          var resp = $.extend(response, data.options.invar);
          EventMgr.trigger(data.options.trfunc, resp);
          //EventMgr.trigger('ajaxFormResponse', response);
          EventMgr.trigger('hideLoader');
        }
      };

  return {
    init: init,
    handleResponse: handleResponse
  };
}(window, $, EventMgr, App);