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

/**
 *  ExtFormHelper
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} EventMgr EventMgr library
 *  @param {object} App Application
 *  @return {object} api API functions
 */
/*global App:true*/
App.ExtFormHelper = function(window, $, EventMgr, App) {
  'use strict';
  var self = '';
  // отправка формы по клику по кнопке
  var clickedButton = false;

  //convert rules for if/else in default format
  function convertIfRules(value, template) {
    var attrName = String(template).replace('__VALUE__', window.hash(value));
//    self.removeAttribute('data-init-func');
    self.setAttribute(attrName, 'yes');
  }
  //convert data-handler
  function convertDataHandler(value) {
//    self.removeAttribute('data-init-func');
    self.setAttribute('data-handler-val', window.hash(String(value)));
  }
  //run init function from attribute
  function initFunc() {
    var elems = $('*[data-init-func]'),
        l = elems.length,
        funcArr;
    while (l--) {
      self = elems[l];
      funcArr = String(self.getAttribute('data-init-func')).split('||');
      var funcLen = funcArr.length;
      for (var i = 0; i < funcLen; i++) {
        var func = funcArr[i].replace(/\s/g, '');
        try {
          /*jslint evil: true */
          eval('App.ExtFormHelper.' + func);
        } catch (e) {
          console.log('undefined function:', func);
        }
      }
      //remove attribute
      self.removeAttribute('data-init-func');
    }

    EventMgr.trigger('appendForm', { tabId: 'tab0' });

    setTimeout(function() {
      setRequiredField();
    }, 0);
  }

  function checkRequired() {
    var ok = true;
    $('#frm-tab0').find('input[required], textarea[required]').each(function() {
      var empty = (this.value === ''),
          hide = this.offsetWidth === 0;
      if (empty && !hide) {
        ok = false;
        return false;
      }
    });
    return ok;
  }

  function checkConfirm() {
    var field = $('#frm-tab0 input[data-confirm="yes"]'),
        confirmed = true;
    if (field.length > 0) {
      field.each(function() {
        var confirmField = this.getAttribute('data-check-field'),
            value1 = this.value,
            confirmFieldElem = App.Dom.byId(confirmField + '-tab0'),
            confirmFieldElemFake = App.Dom.byId(confirmField + '-' +
                'tab0-fake'),
            value2;
        if (confirmFieldElem !== null) {
          value2 = confirmFieldElem.value;
        }
        if (value1 !== value2 && (confirmFieldElem.offsetWidth !== 0 ||
            confirmFieldElemFake.offsetWidth !== 0)) {
          this.focus();
          confirmed = false;
        }
      });
    }
    return confirmed;
  }

  /**
   * Обработчик отправки формы по кнопке
   * @param { object } e объект события
   * @return { boolean } флаг отправки формы
   * @this button
   */
  function submitFormAction(e) {
    var name = this.getAttribute('name'),
        func = this.getAttribute('data-func'),
        isRequiredOk = checkRequired(),
        isPasswdConfirmed = checkConfirm();

    if (func) {
      e.preventDefault();
      window.location = pageInfo.host + pageInfo.binary + '?func=' + func;
    } else if (isRequiredOk && isPasswdConfirmed) {
      $('#i-clicked-button-input').val(name);
      this.value = this.getAttribute('data-disabled');
      this.className += ' b-button_st_disabled';
      clickedButton = true;
      $('#frm-tab0').submit();
      return false;
    } else if (!isPasswdConfirmed) {
      return false;
    }
  }

  /**
   * Обработчик отправки формы по ENTER
   */
  function formSubmitHandler() {
    var name = $('#i-default-button').attr('data-name');
    if (name && !clickedButton) {
      $('#i-clicked-button-input').val(name);
    }
  }

  /**
   *  Убирать у скрытых полей атрибут required, у видимых добавлять
   */
  function setRequiredField() {
    $('#frm-tab0').find('input[data-required], textarea[data-required]').each(function() {
      var hide = this.offsetWidth === 0;
      if (hide) {
        this.removeAttribute('required');
      } else if (!this.hasAttribute('required')) {
        this.setAttribute('required', 'required');
      }
    });
  }

  /**
   * Обработчик изменений полей, которые управляют скрытием других полей
   */
  function changeControlFieldHandler() {
    setTimeout(function() {
      setRequiredField();
    }, 0);
  }

  function init() {
    EventMgr.bind('pageLoad', initFunc);
    EventMgr.obind('.i-button-extform', 'click', submitFormAction);
    EventMgr.obind('#frm-tab0', 'submit', formSubmitHandler);
    EventMgr.obind('.control-field input[type="hidden"], .control-field .b-input, .control-field .b-input_type_file, .control-field .b-textarea', 'change', changeControlFieldHandler);
  }

  var api = {
    init: init,
    convertIfRules: convertIfRules,
    convertDataHandler: convertDataHandler
  };

  return api;

} (window, $, EventMgr, App);