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.Validators.js

/**
 * Form validators module
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 */
App.Validators = function(window, $, EventMgr, App) {
  'use strict';
  var init = function() {
    EventMgr.on('#main-wrapper', 'input[type="text"].test', 'change', validate);
    EventMgr.on('#main-wrapper', 'input[type="text"].testzoom',
        'change', multiValidate);
    EventMgr.bind('errMsgValid', setErrorMessage);
    EventMgr.bind('okMsgValid', setOkMessage);
  },

      pageInfo = window.pageInfo,

      $activeTab = function() {
        return $('.tab-content_st_active');
      },
      //Callback for changed input value
      validate = function(e, data) {
        var nameValid = this.getAttribute('data-check'),
            paramValid = this.getAttribute('data-check-args'),
            errMsg = this.getAttribute('data-error-msg'),
            fieldName = this.getAttribute('data-fieldname'),
            funcName = this.getAttribute('data-funcname'),
            prefix = $(this).siblings('.b-input__prefix').html(),
            convert = this.getAttribute('data-convert');
        if (this.value === '') {
          EventMgr.trigger('okMsgValid', { self: this, number: 0, value: '' });
          return;
        }
        //trigger checkvalue
        EventMgr.trigger('checkValue', {
          name: nameValid,
          prefix: prefix,
          param: paramValid,
          err: errMsg,
          fieldname: fieldName,
          number: 0,
          funcname: funcName,
          convert: convert,
          self: this,
          value: this.value });
      },
      //function for checking duplicate
      checkDuplicate = function(values) {
        var i, j, n;
        n = values.length;
        // to ensure the fewest possible comparisons
        // outer loop uses each item i at 0 through n
        for (i = 0; i < n; i++) {
          // inner loop only compares items j at i+1 to n
          for (j = i + 1; j < n; j++) {
            if (values[i] === values[j]) { return true; }
          }
        }
        return false;
      },

      multiValidate = function(e, data) {
        if (this.value === '') {
          EventMgr.trigger('okMsgValid', { self: this, number: 0, value: '' });
          return;
        }
        var number = 0,
            value = this.value,
            values = this.value.split(/\s+/),
            len = values.length;
        if (data) {
          number = data.number;
          var nextNumber = number + 1;
          if (len === nextNumber) {
            number = 0;
          } else {
            number = nextNumber;
          }
          value = values[nextNumber - 1];
        } else {
          if (len === 1) {
            number = 0;
          } else {
            if (this.getAttribute('duplicate') !== 'yes') {
              if (checkDuplicate(values)) {
                EventMgr.trigger('errMsgValid', {
                  type: 'duplicate',
                  self: this,
                  err: pageInfo.duplicate,
                  number: 0 });
                return;
              }
            }
            number = 1;
          }
          value = this.value.split(/\s+/)[0];
        }
        var nameValid = this.getAttribute('data-check'),
            paramValid = this.getAttribute('data-check-args'),
            errMsg = this.getAttribute('data-error-msg'),
            fieldName = this.getAttribute('data-fieldname'),
            funcName = this.getAttribute('data-funcname'),
            convert = this.getAttribute('data-convert');
        EventMgr.trigger('checkValue', {
          name: nameValid,
          param: paramValid,
          err: errMsg,
          multi: true,
          fieldname: fieldName,
          funcname: funcName,
          self: this,
          number: number,
          value: value,
          convert: convert });
      },

      replaceValidValue = function(where, what, than) {
        var arr = String(where).split(/\s+|\n/),
            l = arr.length,
            obj = {
              v: '',
              changed: false
            };
        while (l--) {
          if (String(arr[l]) === String(what)) {
            if (String(what) !== String(than)) {
              obj.changed = true;
            }
            arr[l] = than;
            break;
          }
        }
        obj.v = arr.join(' ');
        return obj;
      },

      setOkMessage = function(e, data) {
        var self = data.self,
            number = data.number,
            value = data.value,
            ovalue = data.ovalue,
            vvalue = data.vvalue,
            multi = data.multi,
            notOk = data.notOk,
            tabId,
            secondTdElem,
            sData = data,
            o;
        data = {};
        data.number = number;
        //for multi value
        if ((number - 0) !== 0) {
          o = replaceValidValue(self.value, vvalue, value);
          self.value = o.v;
          if (o.changed) {
            setWarningError(e, sData);
          }
          multiValidate.apply(self, [null, data]);
        } else {
          secondTdElem = $(self).parents('.l-form__col_cont_control');
          if (secondTdElem.attr('colspan') - 0 === 2 &&
              !secondTdElem.hasClass('formwidth')) {
            secondTdElem.attr('colspan', '');
          }
          if ((value === '' && self.getAttribute('required')) || notOk) {
            secondTdElem.parents('.l-form__row')
                .removeClass('row-error')
                .removeClass('row-ok');
          } else {
            secondTdElem.parents('.l-form__row')
                .removeClass('row-error')
                .addClass('row-ok');
          }
          //replace value if this changed
          if (value !== undefined &&
              ovalue !== undefined &&
              vvalue !== undefined) {
            o = {};
            if (multi) {
              o = replaceValidValue(self.value, vvalue, value);
              self.value = o.v;
              if (o.changed) {
                setWarningError(e, sData);
              }
           } else if (value !== '') {
              if (self.value !== value || o.changed) {
                setWarningError(e, sData);
              }
             self.value = value;
            }
          }
        }
        tabId = $(self).closest('.tab-content').attr('data-tabid');
        EventMgr.trigger('syncInputToZoom', { tabId: tabId, self: self });
        EventMgr.trigger('updFormHeight', { tabId: tabId });
      },

      setWarningError = function(e, data) {
        data.warning = true;
        data.err = pageInfo.messages.validChangeVal;
        setErrorMessage.apply(window, [e, data]);
      },

      // Write error
      setErrorMessage = function(e, data) {
        var msg = data.err,
            self = data.self,
            name = self.getAttribute('name'),
            id = self.getAttribute('id'),
            number = data.number,
            arrValues = self.value ? self.value.split(' ') : [],
            tmp = '',
            warning = data.warning,
            i, index, tabId, r, secondTdElem;
        //show error box if created
        if (number - 0 === 0) {
          number = arrValues.length;
        }
        for (i = 0; i < number - 1; i++) {
          tmp += arrValues[i] + ' ';
        }
        index = tmp.length;

       var errHTML = '<div class="b-error-box"><div class="b-error-box__top-triangle"></div>' +
                '<div class="b-error-box__inner">' + msg + '</div></div>';
        $('.b-error-box__wrapper[data-id="' + id + '"]').html(errHTML);
        secondTdElem = $(self).parents('.l-form__col_cont_control');
        if (!secondTdElem.attr('colspan') && !warning) {
          secondTdElem.attr('colspan', '2');
        }
        if (!warning) {
          secondTdElem.parents('.l-form__row')
              .addClass('row-error')
              .removeClass('row-ok');
        } else {
           secondTdElem.parents('.l-form__row')
              .addClass('row-warning');
           setTimeout(function() {
              secondTdElem.parents('.l-form__row')
                .removeClass('row-warning');
           }, 2000);
        }
        tabId = $(self).closest('.tab-content').attr('data-tabid');
        EventMgr.trigger('updFormHeight', { tabId: tabId });
        EventMgr.trigger('updateFixedField', { tabId: tabId });
        if (!warning) {
          //scroll to field
          var $self = $(self),
              offsetTop = $self.closest('.l-form__row')[0] ?
                  $self.closest('.l-form__row')[0].offsetTop : 0,
              $page = $self.closest('.b-form-page'),
              $formSW = $('#form-scroll-' + tabId),
              MAGICNUMBER = 62 + 12 + 2 + 2; //button block height + padding + margin
          if ($page.hasClass('b-form-page_st_collapsed')) {
            $page.find('.i-form-page__title').trigger('click');
          }
          //it can be extform
          if ($formSW.length) {
            var height = parseFloat($formSW[0].style.height),
                scrollTop = $formSW[0].scrollTop;
            if ($page[0]) {
              offsetTop += $page[0].offsetTop;
            }
            //offsetTop -= MAGICNUMBER;
            offsetTop += MAGICNUMBER;
            //scrolltop when not in viewport
            if (offsetTop < scrollTop || height + scrollTop < offsetTop) {
              EventMgr.trigger('scrollTo', {
                id: 'form-scroll-' + tabId,
                offsetTop: offsetTop,
                animate: false,
                raw: false
              });
            }
          }
          //setfocus and cursor
          //check for type=file
          if (String(self.getAttribute('type')).toLowerCase() !== 'file') {
            if (self.offsetWidth !== 0) {
              self.focus();
              window.scrollTo(0, 0);
              if (self.setSelectionRange) {
                  self.setSelectionRange(index, index);
              } else if (self.createTextRange) {
                r = self.createTextRange();
                r.collapse(true);
                r.select(index, index);
              }
            } else if (self.nextSibling) {
              //for passwd I think
              self.nextSibling.focus();
              window.scrollTo(0, 0);
              if (self.setSelectionRange) {
                self.nextSibling.setSelectionRange(index, index);
              } else {
                r = self.nextSibling.createTextRange();
                r.collapse(true);
                r.select(index, index);
              }
            }
          }
        }
     };
  return {
    init: init
  };
}(window, $, EventMgr, App);