Newer
Older
ubFramework / Portal / docroot / assets / js / admin / voip / devices.js
@Christopher W. Olsen Christopher W. Olsen on 10 Dec 2017 21 KB Cleaning Up Making It A Sub Module
/**
 * Copyright (c) 2015, Christopher W. Olsen <cwolsen@uBixTechnologies.com>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    This product includes software developed by uBix Technologies.
 * 4. Neither the name of uBix Technologies nor the
 *    names of its contributors may be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY uBix Technologies ''AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL uBix Technologies BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $Id: devices.js 271 2015-12-16 23:33:55Z reddawg $
 *
 */

var ODT;
var ODT_api;

$(function() {
  ODT = $('#myTable').dataTable({
    "order" : [ [ 0, 'desc' ] ],
  });

  ODT_api = ODT.api();

  /* Initialize TABS */
  var add_device, add_device_form, add_device_TC = 0;
  var edit_device, edit_device_form, edit_device_TC = 0;
  var view_log;

  var ad_tabs = $("#add_device_tabs").tabs();
  var ed_tabs = $("#edit_device_tabs").tabs();

  var tabTemplate = '<input type="hidden" name="data[keys][#{label}][uas]" value="1" id="uas#{label}"><table><tr><td>Use Account Settings:</td><td><input type="radio" name="ext#{label}-uas" value="1" checked>Yes <input type="radio" name="ext#{label}-uas" value="0">No</td></tr><tr><td>Extension:</td><td><select id="ext#{label}" name="data[keys][#{label}][extension]"><option value="">Not Assigned</option></select></td></tr><tr><td>Label:</td><td><input id="label#{label}" name="data[keys][#{label}][label]" value=""></td></tr><tr><td>Line Keys:</td><td><select id="lk#{label}" name="data[keys][#{label}][line_keys]"></select></td></tr><tr><td>Primary Server:</td><td><select id="ps#{label}" name="data[keys][#{label}][server_primary]"><option value=""></option></select></td></tr><tr><td>Primary Server Port:</td><td><select id="psp#{label}" name="data[keys][#{label}][server_port_primary]"><option value=""></option></select></td></tr><tr><td>Primary Server Transport:</td><td><select id="pst#{label}" name="data[keys][#{label}][transport_primary]"><option value=""></option></select></td></tr><tr><td>Backup Server:</td><td><select id="bs#{label}" name="data[keys][#{label}][server_backup]"><option value=""></option></select></td></tr><tr><td>Backup Server Port:</td><td><select id="bsp#{label}" name="data[keys][#{label}][server_port_backup]"><option value=""></option></select></td></tr><tr><td>Backup Server Transport:</td><td><select id="bst#{label}" name="data[keys][#{label}][transport_backup]"><option value=""></option></select></td></tr></table>';

  $("#account_number").combobox({
    select:function() {
      ODT.fnClearTable();
      ODT.fnSettings().iDraw = 0;
      // Populate Devices
      _AJAX(
        "/admin/voip/devices_json.php?data[ddt]=deviceList&data[account_number]=" + $("#account_number").val(),
        null,
        function( data ) {
          ODT.fnAddData(data);
        },
        function( data ) {
          alert('There was a problem loading device list data');
        }
      );
    }
  });

  function addDevice() {
    var valid = true;

    _AJAX(
      "/admin/voip/devices_json.php?data[req]=add_device", 
      $('#add_device_form').serialize(),
      function( data ) {
        if (data.code == 0) {
          add_device.dialog("close");
          var cP = ODT_api.page();
          ODT.fnClearTable();
          ODT.fnSettings().iDraw = 0;
          _AJAX(
            "/admin/voip/devices_json.php?data[ddt]=deviceList&data[account_number]=" + $('#account_number').val(),
            null,
            function( data ) {
              ODT.fnAddData(data);
              ODT.fnPageChange(cP);
            },
            function( data ) {
              alert('There was a problem loading device list data');
            }
          );
        }
      },
      function( data ) {
        alert('There was a problem loading device list data');
      }
    );

    return valid;
  }

  /* Add Device Functions */
  add_device = $("#dialog-add-device").dialog({
    autoOpen : false,
    height : 750,
    width : 750,
    modal : true,
    buttons : {
      "Add Device" : addDevice,
      Cancel : function() {
        add_device.dialog("close");
      }
    },
    close : function() {
      add_device_form[0].reset();
      // MrOlsen allFields.removeClass( "ui-state-error" );
      for (i = 1; i <= add_device_TC; i++) {
        $('#ad_tabs-' + i).remove();
        $('#ad_tabs_li-' + i).remove();
      }
      ad_tabs.tabs("refresh");
      add_device_TC = 0;
      $("#add_device_lk").text('0');
    }
  });

  add_device_form = $("#add_device_form").on("submit", function( event ) {
    event.preventDefault();
    addUser();
  });

  $("#add-device").button().on(
    "click",
    function() {
      add_device.dialog("open");
      _AJAX(
        "/admin/voip/devices_json.php?data[ddt]=accounts",
        null,
        function( data ) {
          $("#ad_actList option").remove();
          $.each(data, function( index, item ) {
            $("#ad_actList").append($("<option></option>").text(item.Desc).val(item.ID));
          });
        }
      );

      /* Update Device Types */
      _AJAX(
        "/admin/voip/devices_json.php?data[ddt]=deviceTypes",
        null,
        function( data ) {
          $("#ad_deviceType option").remove();
          $.each(data, function( index, item ) {
            $("#ad_deviceType").append($("<option></option>").text(item.Desc).val(item.ID));
          });
        }
      );
    }
  );

  $('input[type=radio][name=account_locked]').on(
    "change",
    function() {
      $("#account_locked").val($('input:radio[name=account_locked]:checked').val());
      updatePeers(add_device_TC, $("#account_locked").val(), $('#ad_actList').val());
    }
  );

  $("#ad_actList").on(
    "change",
    function() {
      updatePeers(add_device_TC, $("#ad_account_locked").val(), $('#ad_actList').val());
      if ($("#ad_account_locked").val() == 1) {
        _AJAX(
          "/admin/voip/devices_json.php?data[req]=accountInfo&data[account_number]=" + $('#ad_actList').val(),
          null,
          function( data ) {
            $("#ad_dp").val(data.dialplan);
            $("#ad_dpt").val(data.dialplan_timeout);
          }
        );
      }
    }
  );

  $("#ad_deviceType").on(
    "change",
    function() {
      lK = Number($(this).val().split(':')[1]);
      $("#add_device_lk").text(lK);

      for (i = add_device_TC; i > lK; i--) {
        $('#ad_tabs-' + i).remove();
        $('#ad_tabs_li-' + i).remove();
        ad_tabs.tabs("refresh");
        add_device_TC = i;
        $("#lk" + i + " option").remove();
        for (x = 1; x <= lK; x++) {
          $("#lk" + i).append($("<option></option>").text(x).val(x));
        }
      }

      for (i = add_device_TC + 1; i <= lK; i++) {
        var id = "ad_tabs-" + i;
        var li = "<li id='ad_tabs_li-" + i + "'><a href='#" + id + "'>Line " + i + "</a></li>";
        var tabContentHtml = tabTemplate.replace(/#\{label\}/g, i);

        ad_tabs.find(".ui-tabs-nav").append(li);
        ad_tabs.append("<div id='" + id + "'>" + tabContentHtml + "</div>");

        $("#ext" + i).on(
          "change",
          function( e ) {
            var EXT = $(this).val().split(':');
            var LID = e.target.id.match(/\d+/g);
            $("#label" + LID).val(String(EXT[0].match(/^[A-Za-z]+/g)).toUpperCase() + ' ' + EXT[0].match(/\d+/g));
            updateLine(LID, EXT[0], $('input:radio[name=' + e.target.id + '-uas]:checked').val(), EXT[1]);
          }
        );

        $('input[type=radio][name=ext' + i + '-uas]').on(
          "change",
          function( e ) {
            var LID = this.name.match(/\d+/g);
            var EXT = $("#ext" + LID).val().split(':');
            $("#uas" + LID).val(this.value);
            updateLine(LID, EXT[0], this.value, EXT[1]);
          }
        );

        $("#lk" + i + " option").remove();
        for (x = 1; x <= lK; x++) {
          $("#lk" + i).append($("<option></option>").text(x).val(x));
        }
      }

      ad_tabs.tabs("refresh");
      ad_tabs.tabs('option', 'active', 0);
      add_device_TC = lK;
      updatePeers(add_device_TC, $("#ad_account_locked").val(), $('#ad_actList').val());
    }
  );

  /* View Log Functions */
  view_log = $("#dialog-view-log").dialog({
    autoOpen : false,
    height : 750,
    width : 750,
    modal : true,
    buttons : {
      Cancel : function() {
        view_log.dialog("close");
      }
    },
    close : function() {

    }
  });

  /* Edit Device Functions */
  edit_device = $("#dialog-edit-device").dialog({
    autoOpen : false,
    height : 750,
    width : 750,
    modal : true,
    buttons : {
      "Save" : editDevice,
      "Save and Close" : editDeviceClose,
      /*
      Cancel : function() {
        edit_device.dialog("close");
      }
      */
    },
    close : function() {
      edit_device_form[0].reset();
      // MrOlsen allFields.removeClass( "ui-state-error" );
      for (i = 1; i <= edit_device_TC; i++) {
        $('#ed_tabs-' + i).remove();
        $('#ed_tabs_li-' + i).remove();
      }
      ed_tabs.tabs("refresh");
      edit_device_TC = 0;
      $("#edit_device_lk").text('0');
    }
  });

  $('input[type=radio][name=ed_account_locked]').on(
    "change",
    function() {
      var aL = $('input:radio[name=ed_account_locked]:checked').val();
      $("#ed_account_locked").val(aL);
      updatePeers(edit_device_TC, aL, $('#ed_actList').val());

      if (aL == 1) {
        _AJAX(
          "/admin/voip/devices_json.php?data[ddt]=device&data[mac]=" + $("#ed_mac_addr").val(),
          null,
          function( data ) {
            $("#ed_dp").val(data.dialplan);
            $("#ed_dpt").val(data.dialplan_timeout);
          }
        );
      }
    }
  );

  $("#ed_actList").on(
    "change",
    function() {
      updatePeers(edit_device_TC, $("#ed_account_locked").val(), $('#ed_actList').val());
      if ($("#ed_account_locked").val() == 1) {
        _AJAX(
          "/admin/voip/devices_json.php?data[ddt]=device&data[mac]=" + $("#ed_mac_addr").val(),
          null,
          function( data ) {
            $("#ed_dp").val(data.dialplan);
            $("#ed_dpt").val(data.dialplan_timeout);
          }
        );
      }
    }
  );

  edit_device_form = $("#edit_device_form").on("submit", function( event ) {
    event.preventDefault();
    editDevice();
  });

  function editDevice() {
    var valid = true;
    _AJAX(
      "/admin/voip/devices_json.php?data[ddt]=edit_device",
      $('#edit_device_form').serialize(),
      function( data ) {
        alert(data.msg);
        if (data.code == 0) {
          //edit_device.dialog("close");
          var cP = ODT_api.page();
          ODT.fnClearTable();
          ODT.fnSettings().iDraw = 0;
          _AJAX(
            "/admin/voip/devices_json.php?data[ddt]=deviceList&data[account_number]=" + $('#account_number').val(),
            null,
            function( data ) {
              ODT.fnAddData(data);
              ODT.fnPageChange(cP);
            },
            function( data ) {
              alert('There was a problem loading device list data');
              return false;
            }
          );
        }
      },
      function( data ) {
        alert('There was a problem loading device list data');
        return false;
      }
    );

    return valid;
  }
  
  function editDeviceClose() {
    if (editDevice() == true)
      edit_device.dialog("close");
  }

  // $(".edit_device").on("click", function() {
  ODT.delegate(".view_log", "click", function() {
    var dT = this.id.split('-');
    view_log.dialog("open");
    _AJAX(
      "/admin/voip/devices_json.php?data[ddt]=view_log&data[mac]=" + dT[0] + "&data[log]=" + dT[1],
      null,
      function( data ) {
        $('#vlh').text(capitalizeFirstLetter(dT[1]) + " Log");
        $('#ld').text(data);
      }
    );
  });

  ODT.delegate(".edit_device", "click", function() {
    edit_device.dialog("open");
    _AJAX(
      "/admin/voip/devices_json.php?data[ddt]=device&data[mac]=" + this.id,
      null,
      function( data ) {
        $("input[name=ed_account_locked][value=" + data.account_locked + "]").attr('checked', 'checked');
        $("#ed_lineKeys").text(data.lines);
        $("#ed_mac").text(data.mac);
        $("#ed_mac_addr").val(data.mac);
        $("#ed_dp").val(data.dialplan);
        $("#ed_dpt").val(data.dialplan_timeout);

        /* Update Device Types */
        // $("#ed_deviceType").val(data.vdtid + ":" +
        // data.lines).attr('selected', true);
        _AJAX(
          "/admin/voip/devices_json.php?data[ddt]=deviceTypes",
          null,
          function( actData ) {
            $("#ed_deviceType option").remove();
            $.each(actData, function( index, item ) {
              if (item.ID == data.vdtid + ":" + data.lines)
                $("#ed_deviceType").append($("<option selected></option>").text(item.Desc).val(item.ID));
              else
                $("#ed_deviceType").append($("<option></option>").text(item.Desc).val(item.ID));
            });
          }
        );

        /* Update Account */
        _AJAX(
          "/admin/voip/devices_json.php?data[ddt]=accounts",
          null,
          function( actData ) {
            $("#ed_actList option").remove();
            $.each(actData, function( index, item ) {
              if (item.ID == data.account_number)
                $("#ed_actList").append($("<option selected></option>").text(item.Desc).val(item.ID));
              else
                $("#ed_actList").append($("<option></option>").text(item.Desc).val(item.ID));
            });
          }
        );

        /* Update Device Lines */
        $.each(data.extensions, function( index, item ) {
          var id = "ed_tabs-" + index;
          var li = "<li id='ed_tabs_li-" + index + "'><a href='#" + id + "'>Line " + index + "</a></li>";
          var tabContentHtml = tabTemplate.replace(/#\{label\}/g, index);

          ed_tabs.find(".ui-tabs-nav").append(li);
          ed_tabs.append("<div id='" + id + "'>" + tabContentHtml + "</div>");

          /* Setup UAS */
          $("input[name=ext" + index + "-uas][value=" + item.uas + "]").attr('checked', 'checked');

          $('input[type=radio][name=ext' + index + '-uas]').on(
            "change",
            function( e ) {
              var LID = this.name.match(/\d+/g);
              var EXT = $("#ext" + LID).val().split(':');
              $("#uas" + LID).val(this.value);
              updateLine(LID, EXT[0], this.value, EXT[1]);
            }
          );

          _AJAX(
            "/admin/voip/devices_json.php?data[ddt]=peers&data[aL]=" + $('input:radio[name=ed_account_locked]:checked').val() + "&data[account_number]=" + data.account_number,
            null,
            function( peer_data ) {
              $("#ext" + index + " option").remove();
              $.each(peer_data, function( pIndex, pItem ) {
                if (item.extension == pItem.Desc)
                  $("#ext" + index).append($("<option selected></option>").text(pItem.Desc).val(pItem.ID));
                else
                  $("#ext" + index).append($("<option></option>").text(pItem.Desc).val(pItem.ID));
              });
            }
          );

          $("#label" + index).val((item.label == null ? item.extension.match(/\d+/g) : item.label));

          /* Populate Line Keys */
          $("#lk" + index + " option").remove();
          for (x = 1; x <= data.lines; x++) {
            if (x == item.line_keys)
              $("#lk" + index).append($("<option selected></option>").text(x).val(x));
            else
              $("#lk" + index).append($("<option></option>").text(x).val(x));
          }
          updateLine(index, item.extension, (!item.uas ? 1 : item.uas), (item.extension.match(/^[A-Za-z]+/g) == null ? "avl" : item.extension.match(/^[A-Za-z]+/g)));
        });

        ed_tabs.tabs("refresh");
        ed_tabs.tabs('option', 'active', 0);

        edit_device_TC = data.lines;
      }
    );
  });
});

function updatePeers( TC, AL, account_number ) {
  _AJAX(
    "/admin/voip/devices_json.php?data[ddt]=peers&data[aL]=" + AL + "&data[account_number]=" + account_number,
    null,
    function( data ) {
      for (i = 1; i <= TC; i++) {
        var cur = $("#ext" + i + " option:selected").val();
        $("#ext" + i + " option").remove();
        $.each(data, function( index, item ) {
          if (cur == item.ID)
            $("#ext" + i).append($("<option selected></option>").text(item.Desc).val(item.ID));
          else
            $("#ext" + i).append($("<option></option>").text(item.Desc).val(item.ID));
        });
      }
    }
  );
} /* END: updatePeers() */

/*
 * This function will update the info for a particular line based on the
 * selected peer and locking settings
 */
function updateLine( LID, ext, uas, voipCode ) {
  // alert('LID: ' + LID + ', EXT: ' + ext + ', UAS: ' + uas + ', voipCode: ' +
  // voipCode);
  _AJAX(
    "/admin/voip/devices_json.php?data[ddt]=peerInfo&data[peer]=" + ext + "&data[uas]=" + uas + "&data[voip_code]=" + voipCode,
    null,
    function( data ) {
      var tC = '';

      tC = $("#ps" + LID + " option:selected").val();
      $("#ps" + LID + " option").remove();
      
      $.each(data[0].server_primary, function( index, item ) {
        if (tC == item.ID)
          $("#ps" + LID).append($("<option selected></option>").text(item.Desc).val(item.ID));
        else
          $("#ps" + LID).append($("<option></option>").text(item.Desc).val(item.ID));
      });

      tC = $("#pst" + LID + " option:selected").val();
      $("#pst" + LID + " option").remove();

      $.each(data[0].transport_primary, function( index, item ) {
        if (tC == item.ID)
          $("#pst" + LID).append($("<option selected></option>").text(item.Desc).val(item.ID));
        else
          $("#pst" + LID).append($("<option></option>").text(item.Desc).val(item.ID));
      });

      tC = $("#psp" + LID + " option:selected").val();
      $("#psp" + LID + " option").remove();
      $.each(data[0].server_port_primary, function( index, item ) {
        if (tC == item.ID)
          $("#psp" + LID).append($("<option selected></option>").text(item.Desc).val(item.ID));
        else
          $("#psp" + LID).append($("<option></option>").text(item.Desc).val(item.ID));
      });

      tC = $("#bs" + LID + " option:selected").val();
      $("#bs" + LID + " option").remove();
      $.each(data[0].server_backup, function( index, item ) {
        if (tC == item.ID)
          $("#bs" + LID).append($("<option selected></option>").text(item.Desc).val(item.ID));
        else
          $("#bs" + LID).append($("<option></option>").text(item.Desc).val(item.ID));
      });

      tC = $("#bst" + LID + " option:selected").val();
      $("#bst" + LID + " option").remove();
      $.each(data[0].transport_backup, function( index, item ) {
        if (tC == item.ID)
          $("#bst" + LID).append($("<option selected></option>").text(item.Desc).val(item.ID));
        else
          $("#bst" + LID).append($("<option></option>").text(item.Desc).val(item.ID));
      });

      tC = $("#bsp" + LID + " option:selected").val();
      $("#bsp" + LID + " option").remove();
      $.each(data[0].server_port_backup, function( index, item ) {
        if (tC == item.ID)
          $("#bsp" + LID).append($("<option selected></option>").text(item.Desc).val(item.ID));
        else
          $("#bsp" + LID).append($("<option></option>").text(item.Desc).val(item.ID));
      });
    }
  );
}

function capitalizeFirstLetter( string ) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}

function _start() {

  // Populate Accounts
  _AJAX(
    "/admin/voip/devices_json.php?data[ddt]=accounts",
    null,
    function( data ) {
      $("#account_number option").remove();
      $.each(data, function( index, item ) {
        $("#account_number").append($("<option></option>").text(item.Desc).val(item.ID));
      });
    }
  );

  // Populate Devices
  _AJAX(
    "/admin/voip/devices_json.php?data[ddt]=deviceList",
    null,
    function( data ) {
      ODT.fnAddData(data);
    },
    function( data ) {
      alert('There was a problem loading device list data');
    }
  );
}