/**
* 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' ] ],
"columns" : [
{ "visible": false },
null,
null,
null,
null,
null,
null,
null
]
});
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>';
/* 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(
"/user/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(
"/user/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(
"/user/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(
"/user/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(
"/user/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();
});
// $(".edit_device").on("click", function() {
ODT.delegate(".view_log", "click", function() {
var dT = this.id.split('-');
view_log.dialog("open");
_AJAX(
"/user/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(
"/user/voip/devices_json.php",
"data[req]=device&data[mac]=" + this.id,
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 */
_AJAX(
"/user/voip/devices_json.php",
"data[req]=deviceTypes",
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 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(
"/user/voip/devices_json.php",
"data[req]=peers",
function( peer_data ) {
$("#ext" + index + " option").remove();
$.each(peer_data, function( pIndex, pItem ) {
if (item.extension == pItem.ID)
$("#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));
});
ed_tabs.tabs("refresh");
ed_tabs.tabs('option', 'active', 0);
edit_device_TC = data.lines;
}
);
});
});
function updatePeers( TC, AL, account_number ) {
_AJAX(
"/user/voip/devices_json.php",
"data[req]=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) {
_AJAX(
"/user/voip/devices_json.php",
"data[req]=peerInfo&data[peer]=" + ext + "&data[uas]=" + uas,
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 addDevice() {
var valid = true;
_AJAX(
"/user/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(
"/user/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;
}
function editDevice() {
var valid = true;
_AJAX(
"/user/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(
"/user/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");
}
function _start() {
// Populate Devices
_AJAX(
"/user/voip/devices_json.php?data[req]=deviceList",
null,
function( data ) {
ODT.fnAddData(data);
},
function( data ) {
alert('There was a problem loading device list data');
}
);
}