docs: function ($div, isInit, isForce, isOwn) {
              var data = $div.data('data');
              if (!data) return;
  
              var value = (data.tempValue !== undefined) ? data.tempValue : data.value;
  
              if (!isForce && data.oldValue !== undefined && data.oldValue == value && !data.ack) return;
  
              if (data.wType === 'number') {
                  value = parseFloat((value || 0).toString().replace(',', '.'));
              }
              data.oldValue = value;
  
              if (data.temperature) {
                  data.state = 'normal';
              } else if (value == data.min) {
                  data.state = 'normal';
              } else if (value == data.max) {
                  data.state = 'active';
              } else if (data.max &&
                  (value === null    ||
                   value === ''      ||
                   value === undefined ||
                   value === 'false' ||
                   value === false))  {
                  data.state = 'normal';
              } else {
                  if (data.wType === 'number') {
                      if (data.max) {
                          if (value > data.min) {
                              data.state = 'active';
                          } else {
                              data.state = 'normal';
                          }
                      } else if (value) {
                          data.state = 'active';
                      } else {
                          data.state = 'normal';
                      }
                  } else {
                      if (data.max) {
                          if (value == data.max) {
                              data.state = 'active';
                          } else {
                              data.state = 'normal';
                          }
                      } else if (value) {
                          data.state = 'active';
                      } else {
                          data.state = 'normal';
                      }
                  }
              }
  
              if (vis.editMode && data.testActive) {
                  data.state = (data.state === 'normal') ? 'active' : 'normal';
              }
  
              if (value !== null && value !== undefined) {
                  $div.find('.vis-hq-nodata').remove();
              }
  
              switch (data.state) {
                  case 'normal':
                      $('#' + data.wid + ' .vis-hq-main')
                          .removeClass(data.styleActive)
                          .addClass(data.styleNormal);
  
                      if (data.iconName || data.iconOn) {
                          var $img  = $div.find('.vis-hq-icon-img');
  
                          if ($img.attr('src') !== (data.iconName || '')) {
                              $img.attr('src', (data.iconName || ''));
                              vis.binds.hqwidgets.button.centerImage($div, data, $img);
                          }
                      }
                      if (data.captionOn) {
                          $div.find('.vis-hq-text-caption').html(data.caption || '');
                      }
                      break;
                  case 'active':
                      $('#' + data.wid + ' .vis-hq-main')
                          .removeClass(data.styleNormal)
                          .addClass(data.styleActive);
  
                      if (data.iconName || data.iconOn) {
                          var $img  = $div.find('.vis-hq-icon-img');
  
                          if ($img.attr('src') !== (data.iconOn || data.iconName)) {
                              $img.attr('src', (data.iconOn || data.iconName));
                              vis.binds.hqwidgets.button.centerImage($div, data, $img);
                          }
                      }
                      if (data.captionOn) {
                          $div.find('.vis-hq-text-caption').html(data.captionOn);
                      }
                      break;
              }
              if (data.digits !== null && value !== null && value !== undefined) {
                  if (typeof value !== 'number') value = parseFloat(value) || 0;
                  value = value.toFixed(data.digits);
              }
              if (data.is_comma && value) value = value.toString().replace('.', ',');
  
              vis.binds.hqwidgets.button.showRightInfo($div, value);
  
              if ((!data.ack && !data['oid-working']) || (data['oid-working'] && data.working)) {
                  $div.find('.vis-hq-working').show();
              } else {
                  $div.find('.vis-hq-working').hide();
              }
  
              if (data['oid-battery']) $div.batteryIndicator('show', data.battery || false);
  
              if (data['oid-signal']) {
                  $div.find('.vis-hq-signal').html(data.signal);
              }
  
              if (data['oid-humidity']) {
                  var $h = $div.find('.vis-hq-humidity');
                  if (!$h.length) {
                      vis.binds.hqwidgets.button.showCenterInfo($div, false, true);
                  } else {
                      $h.html(Math.round(data.humidity || 0));
                  }
              }
  
              if (data['oid-actual']) {
                  var $a = $div.find('.vis-hq-actual');
                  if (!$a.length) {
                      vis.binds.hqwidgets.button.showCenterInfo($div, false, true);
                  } else {
                      if (typeof data.actual !== 'number') data.actual = parseFloat(data.actual) || 0;
                      $a.html((data.digits !== null) ? (data.actual || 0).toFixed(data.digits) : (data.actual || 0));
                  }
              }
  
              if (data['oid-drive']) {
                  $div.find('.vis-hq-drive').html(data.drive || 0);
              }
  
              // Show change effect
              if (data.changeEffect && ((!isInit && !isOwn) || (vis.editMode && data.testActive))) {
                  var $main = $div.find('.vis-hq-main');
                  $main.animateDiv(data.changeEffect, {color: data.waveColor});
              }
          }