text: // - business function -
  function query_user() {
      var query = $.trim($("#query").val());
      var mine = document.getElementById('mine').checked ? 1 : 0;
      window.location.href = '/portal/hostgroup?q=' + query + '&mine=' + mine;
  }
  
  function create_hostgroup() {
      var name = $.trim($("#grp_name").val());
      $.post('/portal/group/create', {'grp_name': name}, function (json) {
          handle_quietly(json, function () {
              window.location.reload();
          });
      }, "json");
  }
  
  function delete_hostgroup(group_id) {
      my_confirm('确定要删除？？？', ['确定', '取消'], function () {
          $.getJSON('/portal/group/delete/' + group_id, {}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              });
          });
      }, function () {
          return false;
      });
  }
  
  function edit_hostgroup(group_id, grp_name) {
      layer.prompt({title: 'input new name:', val: grp_name, length: 255}, function (val, index, elem) {
          $.post('/portal/group/update/' + group_id, {'new_name': val}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              });
          }, "json");
      })
  }
  
  function rename_hostgroup() {
      var old_str = $.trim($('#old_str').val());
      var new_str = $.trim($('#new_str').val());
      $.post('/portal/group/rename', {'old_str': old_str, 'new_str': new_str}, function (json) {
          handle_quietly(json, function () {
              window.location.href = '/?q=' + new_str;
          });
      }, "json");
  }
  
  function bind_plugin(group_id) {
      var plugin_idr = $.trim($("#plugin_dir").val());
      $.post('/portal/plugin/bind', {'group_id': group_id, 'plugin_dir': plugin_idr}, function (json) {
          handle_quietly(json, function () {
              location.reload();
          });
      }, "json");
  }
  
  function unbind_plugin(plugin_id) {
      my_confirm('确定要解除绑定？', ['确定', '取消'], function () {
          $.getJSON('/portal/plugin/delete/' + plugin_id, {}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              });
          });
      }, function () {
          return false;
      });
  }
  
  function query_host() {
      var xbox = $("#xbox").val();
      var group_id = $("#group_id").val();
      var query = $.trim($("#query").val());
      var limit = $("#limit").val();
      var maintaining = document.getElementById('maintaining').checked ? 1 : 0;
      window.location.href = '/portal/group/' + group_id + '/hosts?q=' + query + '&maintaining=' + maintaining + '&limit=' + limit + '&xbox=' + xbox;
  }
  
  function select_all() {
      var v = document.getElementById('chk').checked;
      $.each($("#hosts input[type=checkbox]"), function (i, n) {
          n.checked = v;
      });
  }
  
  function remove_hosts() {
      var ids = [];
      jQuery.each($("#hosts input[type=checkbox]"), function (i, n) {
          if (n.checked) {
              ids.push($(n).attr("hid"));
          }
      });
      if (ids.length == 0) {
          err_message_quietly('no hosts selected');
          return;
      }
  
      var group_id = $("#group_id").val();
      $.post("/portal/host/remove", {'host_ids': ids.join(","), 'grp_id': group_id}, function (json) {
          handle_quietly(json, function () {
              location.reload();
          });
      }, "json");
  }
  
  function maintain() {
      var ids = [];
      jQuery.each($("#hosts input[type=checkbox]"), function (i, n) {
          if (n.checked) {
              ids.push($(n).attr("hid"));
          }
      });
      if (ids.length == 0) {
          err_message_quietly('no hosts selected');
          return;
      }
  
      var begin = $.trim($("#begin").val());
      var end = $.trim($("#end").val());
  
      if (begin.length == 0 || end.length == 0) {
          err_message_quietly('begin time and end time are necessary');
          return false;
      }
  
      var b = moment(begin, "YYYY-MM-DD HH:mm").unix();
      var e = moment(end, "YYYY-MM-DD HH:mm").unix();
  
      $.post('/portal/host/maintain', {'begin': b, 'end': e, 'host_ids': ids.join(',')}, function (json) {
          handle_quietly(json, function () {
              location.reload();
          });
      }, "json");
  }
  
  function no_maintain() {
      var ids = [];
      jQuery.each($("#hosts input[type=checkbox]"), function (i, n) {
          if (n.checked) {
              ids.push($(n).attr("hid"));
          }
      });
      if (ids.length == 0) {
          err_message_quietly('no hosts selected');
          return;
      }
  
      $.post('/portal/host/reset', {'host_ids': ids.join(',')}, function (json) {
          handle_quietly(json, function () {
              location.reload();
          });
      }, "json");
  }
  
  function batch_add_host() {
      var hosts = $.trim($("#hosts").val());
      if (hosts.length == 0) {
          err_message_quietly('请填写机器列表，一行一个');
          return false;
      }
  
      $.post('/portal/host/add', {'group_id': $("#group_id").val(), 'hosts': hosts}, function (json) {
          if (json.msg.length > 0) {
              err_message_quietly(json.msg);
          } else {
              $("#message").html(json.data);
          }
      }, "json");
  }
  
  function host_unbind_group(host_id, group_id) {
      $.getJSON('/portal/host/unbind', {'host_id': host_id, 'group_id': group_id}, function (json) {
          handle_quietly(json, function () {
              location.reload();
          });
      })
  }
  
  function query_expression() {
      var query = $.trim($("#query").val());
      var mine = document.getElementById('mine').checked ? 1 : 0;
      window.location.href = '/portal/expression?q=' + query + '&mine=' + mine;
  }
  
  function delete_expression(id) {
      my_confirm('确定要删除？？？', ['确定', '取消'], function () {
          $.getJSON('/portal/expression/delete/' + id, {}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              });
          })
      }, function () {
          return false;
      });
  }
  
  function update_expression() {
      var callback_url = $.trim($("#callback_url").val());
      var need_callback = callback_url.length > 0 ? 1 : 0;
      $.post(
          '/portal/expression/update',
          {
              'expression': $.trim($("#expression").val()),
              'func': $.trim($("#func").val()),
              'op': $("#op").val(),
              'right_value': $.trim($("#right_value").val()),
              'uic': $.trim($("#uic").val()),
              'max_step': $.trim($("#max_step").val()),
              'priority': $.trim($("#priority").val()),
              'note': $.trim($("#note").val()),
              'url': callback_url,
              'callback': need_callback,
              'before_callback_sms': document.getElementById("before_callback_sms").checked ? 1 : 0,
              'before_callback_mail': document.getElementById("before_callback_mail").checked ? 1 : 0,
              'after_callback_sms': document.getElementById("after_callback_sms").checked ? 1 : 0,
              'after_callback_mail': document.getElementById("after_callback_mail").checked ? 1 : 0,
              'expression_id': $("#expression_id").val()
          },
          function (json) {
              handle_quietly(json);
          }, "json");
  }
  
  function pause_expression(id) {
      var pause = '1';
      if ($('#i-' + id).attr('class').indexOf('play') > 0) {
          // current: pause
          pause = '0'
      }
      $.getJSON("/portal/expression/pause", {'id': id, 'pause': pause}, function (json) {
          if (json.msg.length > 0) {
              err_message_quietly(json.msg);
          } else {
              if (pause == '1') {
                  $('#i-' + id).attr('class', 'glyphicon glyphicon-play orange')
              } else {
                  $('#i-' + id).attr('class', 'glyphicon glyphicon-pause orange')
              }
          }
      });
  }
  
  function make_select2_for_uic_group(selector) {
      $(selector).select2({
          placeholder: "input uic team name",
          allowClear: true,
          multiple: true,
          quietMillis: 100,
          minimumInputLength: 2,
          id: function (obj) {
              return obj.name;
          },
          ajax: {
              url: "/api/uic/group",
              dataType: 'json',
              data: function (term, page) {
                  return {
                      query: term,
                      limit: 20
                  };
              },
              results: function (json, page) {
                  return {results: json.data};
              }
          },
  
          initSelection: function (element, callback) {
              var data = [];
              $($(element).val().split(",")).each(function () {
                  data.push({id: this, name: this});
              });
              callback(data);
          },
  
          formatResult: function (obj) {
              return obj.name
          },
          formatSelection: function (obj) {
              return obj.name
          }
      });
  }
  
  function query_template() {
      var query = $.trim($("#query").val());
      var mine = document.getElementById('mine').checked ? 1 : 0;
      window.location.href = '/portal/template?q=' + query + '&mine=' + mine;
  }
  
  function delete_template(id) {
      my_confirm('确定要删除？？？', ['确定', '取消'], function () {
          $.getJSON('/portal/template/delete/' + id, {}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              });
          })
      }, function () {
          return false;
      });
  }
  
  function create_template() {
      var tpl_name = $.trim($("#tpl_name").val());
      $.post('/portal/template/create', {'name': tpl_name}, function (json) {
          if (json.msg.length > 0) {
              err_message_quietly(json.msg);
          } else {
              location.href = '/portal/template/update/' + json.id;
          }
      }, "json");
  }
  
  function make_select2_for_template(selector) {
      $(selector).select2({
          placeholder: "input template name",
          allowClear: true,
          quietMillis: 100,
          minimumInputLength: 2,
          id: function (obj) {
              return obj.id;
          },
          ajax: {
              url: "/api/template/query",
              dataType: 'json',
              data: function (term, page) {
                  return {
                      query: term,
                      limit: 10
                  };
              },
              results: function (json, page) {
                  return {results: json.data};
              }
          },
  
          initSelection: function (element, callback) {
              var tpl_id = $(element).val();
              $.getJSON("/api/template/" + tpl_id, function (json) {
                  callback(json.data);
              });
          },
  
          formatResult: function (obj) {
              return obj.name
          },
          formatSelection: function (obj) {
              return obj.name
          }
      });
  }
  
  function make_select2_for_metric(selector) {
      $(selector).select2({
          placeholder: "input metric",
          allowClear: true,
          quietMillis: 100,
          minimumInputLength: 2,
          id: function (obj) {
              return obj.name;
          },
          ajax: {
              url: "/api/metric/query",
              dataType: 'json',
              data: function (term, page) {
                  return {
                      query: term,
                      limit: 10
                  };
              },
              results: function (json, page) {
                  return {results: json.data};
              }
          },
  
          initSelection: function (element, callback) {
              var val = $(element).val();
              callback({id: val, name: val});
          },
  
          formatResult: function (obj) {
              return obj.name
          },
          formatSelection: function (obj) {
              return obj.name
          }
      });
  }
  
  function update_template() {
      var tpl_id = $('#tpl_id').val();
      var name = $.trim($("#name").val());
      var parent_id = $("#parent_id").val();
      $.post('/portal/template/rename/' + tpl_id, {'name': name, 'parent_id': parent_id}, function (json) {
          handle_quietly(json);
      }, "json");
  }
  
  function save_action_for_tpl(tpl_id) {
      var callback_url = $.trim($("#callback_url").val());
      var need_callback = callback_url.length > 0 ? 1 : 0;
      $.post(
              '/portal/template/action/update/' + tpl_id,
          {
              'uic': $.trim($("#uic").val()),
              'url': callback_url,
              'callback': need_callback,
              'before_callback_sms': document.getElementById("before_callback_sms").checked ? 1 : 0,
              'before_callback_mail': document.getElementById("before_callback_mail").checked ? 1 : 0,
              'after_callback_sms': document.getElementById("after_callback_sms").checked ? 1 : 0,
              'after_callback_mail': document.getElementById("after_callback_mail").checked ? 1 : 0
          },
          function (json) {
              handle_quietly(json);
          }, "json");
  }
  
  function goto_strategy_add_div() {
      $("#add_div").show('fast');
      $("#current_sid").val('');
      location.href = "#add";
  }
  
  function save_strategy() {
      var sid = $("#current_sid").val();
      $.post('/portal/strategy/update', {
          'sid': sid,
          'metric': $.trim($("#metric").val()),
          'tags': $.trim($("#tags").val()),
          'max_step': $.trim($("#max_step").val()),
          'priority': $.trim($("#priority").val()),
          'note': $.trim($("#note").val()),
          'func': $.trim($("#func").val()),
          'op': $.trim($("#op").val()),
          'right_value': $.trim($("#right_value").val()),
          'run_begin': $.trim($("#run_begin").val()),
          'run_end': $.trim($("#run_end").val()),
          'tpl_id': $.trim($("#tpl_id").val())
      }, function (json) {
          handle_quietly(json, function () {
              location.reload();
          });
      }, "json")
  }
  
  function clone_strategy(sid) {
      $("#current_sid").val('');
      fill_fields(sid);
  }
  
  function modify_strategy(sid) {
      $("#current_sid").val(sid);
      fill_fields(sid);
  }
  
  function fill_fields(sid) {
      $("#add_div").show('fast');
      location.href = "#add";
      $.getJSON('/portal/strategy/' + sid, {}, function (json) {
          $("#metric").val(json.data.metric);
          $("#tags").val(json.data.tags);
          $("#max_step").val(json.data.max_step);
          $("#priority").val(json.data.priority);
          $("#note").val(json.data.note);
          $("#func").val(json.data.func);
          $("#op").val(json.data.op);
          $("#right_value").val(json.data.right_value);
          $("#run_begin").val(json.data.run_begin);
          $("#run_end").val(json.data.run_end);
          make_select2_for_metric("#metric");
      });
  }
  
  function delete_strategy(id) {
      my_confirm('确定要删除？？？', ['确定', '取消'], function () {
          $.getJSON('/portal/strategy/delete/' + id, {}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              });
          })
      }, function () {
          return false;
      });
  }
  
  function tpl_unbind_group(tpl_id, grp_id) {
      my_confirm('确定要解除绑定关系？', ['确定', '取消'], function () {
          $.getJSON('/portal/template/unbind/group', {'tpl_id': tpl_id, 'grp_id': grp_id}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              });
          })
      }, function () {
          return false;
      });
  }
  
  function fork_template(tpl_id) {
      $.getJSON('/portal/template/fork/' + tpl_id, {}, function (json) {
          if (json.msg.length > 0) {
              err_message_quietly(json.msg);
          } else {
              location.href = '/portal/template/update/' + json.id;
          }
      });
  }
  
  function bind_template(grp_id) {
      var tpl_id = $.trim($("#tpl_id").val());
      $.getJSON('/portal/group/bind/template', {'grp_id': grp_id, 'tpl_id': tpl_id}, function (json) {
          handle_quietly(json, function () {
              location.reload();
          })
      });
  }
  
  function node_unbind_tpl(grp_name, tpl_id) {
      my_confirm('确定要解除绑定关系？', ['确定', '取消'], function () {
          $.getJSON('/portal/template/unbind/node', {'tpl_id': tpl_id, 'grp_name': grp_name}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              });
          })
      }, function () {
          return false;
      });
  }
  
  function node_bind_tpl() {
      var node = $.trim($("#node").val());
      var tpl_id = $("#tpl_id").val();
      $.post('/portal/template/bind/node', {'node': node, 'tpl_id': tpl_id}, function (json) {
          handle_quietly(json, function () {
              location.reload();
          });
      }, "json");
  }
  
  function create_cluster_monitor_metric(grp_id) {
      $.post('/portal/group/' + grp_id + '/cluster/creator', {
          'numerator': $("#numerator").val(),
          'denominator': $("#denominator").val(),
          'endpoint': $("#endpoint").val(),
          'metric': $("#metric").val(),
          'tags': $("#tags").val(),
          'step': $("#step").val()
      }, function (json) {
          handle_quietly(json, function () {
              location.href = "/portal/group/" + grp_id + "/cluster";
          });
      }, "json")
  }
  
  function update_cluster_monitor_metric(cluster_id, grp_id) {
      $.post('/portal/cluster/edit/' + cluster_id, {
          'numerator': $("#numerator").val(),
          'denominator': $("#denominator").val(),
          'endpoint': $("#endpoint").val(),
          'metric': $("#metric").val(),
          'tags': $("#tags").val(),
          'step': $("#step").val(),
          'grp_id': grp_id
      }, function (json) {
          handle_quietly(json);
      }, "json");
  }
  
  function delete_cluster_monitor_item(cluster_id) {
      my_confirm('确定要删除？？？', ['确定', '取消'], function () {
          $.post('/portal/cluster/delete/' + cluster_id, {}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              })
          }, "json");
      }, function () {
          return false;
      });
  }
  
  // - alarm-dash business function -
  function alarm_case_all_select() {
      var boxes = $("input[type=checkbox]");
      for (var i = 0; i < boxes.length; i++) {
          boxes[i].checked="checked";
      }
  }
  function alarm_case_event_all_select() {
      var boxes = $("input[type=checkbox]");
      for (var i = 0; i < boxes.length; i++) {
          boxes[i].checked="checked";
      }
  }
  
  function alarm_case_reverse_select() {
      var boxes = $("input[type=checkbox]");
      for (var i = 0; i < boxes.length; i++) {
          if (boxes[i].checked) {
              boxes[i].checked=""
          } else {
              boxes[i].checked="checked";
          }
      }
  }
  function alarm_case_event_reverse_select() {
      var boxes = $("input[type=checkbox]");
      for (var i = 0; i < boxes.length; i++) {
          if (boxes[i].checked) {
              boxes[i].checked=""
          } else {
              boxes[i].checked="checked";
          }
      }
  }
  
  function alarm_case_batch_rm() {
      var boxes = $("input[type=checkbox]");
      var ids = []
      for (var i = 0; i < boxes.length; i++) {
          if (boxes[i].checked) {
              ids.push($(boxes[i]).attr("alarm"))
          }
      }
  
      my_confirm('确定要删除？？？', ['确定', '取消'], function () {
          $.post('/portal/alarm-dash/case/delete', {"ids": ids.join(',')}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              });
          }, "json");
      }, function () {
          return false;
      });
  }
  
  function alarm_case_rm(id) {
      my_confirm('确定要删除？？？', ['确定', '取消'], function () {
          $.post('/portal/alarm-dash/case/delete', {"ids": id}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              });
          }, "json");
      }, function () {
          return false;
      });
  }
  
  function alarm_case_event_rm(id) {
      my_confirm('确定要删除？？？', ['确定', '取消'], function () {
          $.post('/portal/alarm-dash/case/event/delete', {"ids": id}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              });
          }, "json");
      }, function () {
          return false;
      });
  }
  function alarm_case_event_batch_rm() {
      var boxes = $("input[type=checkbox]");
      var ids = []
      for (var i = 0; i < boxes.length; i++) {
          if (boxes[i].checked) {
              ids.push($(boxes[i]).attr("alarm"))
          }
      }
  
      my_confirm('确定要删除？？？', ['确定', '取消'], function () {
          $.post('/portal/alarm-dash/case/event/delete', {"ids": ids.join(',')}, function (json) {
              handle_quietly(json, function () {
                  location.reload();
              });
          }, "json");
      }, function () {
          return false;
      });
  }
  