/** * 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'); } ); }