define(function (require) { var $ = require("jquery"), _ = require("lodash"), monster = require("monster"); var app = { name: "switchboard", css: ["app"], i18n: { "en-US": { customCss: false }, }, // Defines API requests not included in the SDK requests: {}, // Define the events available for other apps subscribe: {}, // Method used by the Monster-UI Framework, shouldn't be touched unless you're doing some advanced kind of stuff! load: function (callback) { var self = this; self.initApp(function () { callback && callback(self); }); }, // Method used by the Monster-UI Framework, shouldn't be touched unless you're doing some advanced kind of stuff! initApp: function (callback) { var self = this; // Used to init the auth token and account id of this app monster.pub("auth.initApp", { app: self, callback: callback, }); }, ////////////////////////////////////////////////////////// // Entry Point of the app ////////////////////////////////////////////////////////// render: function (container) { var self = this, $container = _.isEmpty(container) ? $("#monster_content") : container, $layout = $( self.getTemplate({ name: "layout", }) ); self.bindEvents({ template: $layout, }); $container.empty().append($layout); //draw the main part of the page in views/layout.html }, bindEvents: function (args) { var self = this, $template = args.template; //load the parked calls on document ready, and repeat every 30 seconds $(document).ready(function (e) { loadParkingLot(); setInterval(loadParkingLot, 30000); }); //Refresh parked calls button binding event: $template.find("#refresh").on("click", function (e) { loadParkingLot(); }); //Help Button/Dialog $template.find("#help-button").on("click", function (e) { var helptemplate = $(app.getTemplate({ name: 'dialog-help' })); monster.ui.dialog(helptemplate, { title: app.i18n.active().parkinglot.help.title, width: '600px', onClose: function() { //doStuff(); } }); }); //function to load the parked calls onto the page and set dependent bindings function loadParkingLot() { self.getParkedCalls(function (listOfParkedCalls) { var $results = $( self.getTemplate({ name: "results", data: { parkedCalls: listOfParkedCalls.slots, }, }) ); $template.find(".results").empty().append($results); ///Pickup a parked call binding $template.find(".pickup").on("click", function (e) { //var parkNum = parkedUri.substr(0, parkedUri.indexOf('@')); //strip off the @domain.tld suffix var parkedUri = $(this) .closest(".parked-call") .attr("id"); //get the id, which is the parked call URI var parkNum = parkedUri.split("@")[0]; //strip off the @domain.tld if it exists (but doesn't fail if not) var parkSlot = parkNum.substring(2); //strip off the first 2 chars in case it's *4 instead of *3. self.pickupCall("*3" + parkSlot); //console.log(parkNum); }); /////////////////////////////// ///Call the parker (the device who parked the call): $template.find(".call-parker").on("click", function (e) { var ringbackId = $(this).attr("id"); //get the id, which is the parker device ID self.callTheParker(ringbackId); }); /////////////////////////////// $template.find(".parked-call").on("mouseover", function (e) { //load more details about parker when hover var clickedItem = $(this); if ($(clickedItem).find('.call-parker').html() == '') { //check if the parker info is empty self.callApi({ // Get info on the parker device: resource: "device.get", data: { accountId: self.accountId, deviceId: $(this).find('.call-parker').attr('id') }, success: function (deviceData) { self.callApi({ // Get info on the user the parker device belongs to: resource: "user.get", data: { accountId: self.accountId, userId: deviceData.data.owner_id }, success: function (userData) { var parker_name = userData.data.caller_id.internal.name; var parker_number = userData.data.caller_id.internal.number; $(clickedItem).find('.call-parker').html(parker_name+' '+parker_number); $(clickedItem).find('.call-parker_hidden').css('display', 'inline'); }, error: function (parsedError) { monster.ui.alert("FAILED to get user info for parking slot #" + slot.parking_slot + ": " + parsedError); }, }); //end get info on user }, error: function (parsedError) { monster.ui.alert("FAILED to get device info: " + slot.ringback_id + ": " + parsedError); }, }); //end get info on parker device } //if clickedItem parker info is empty }); //end parked-call mouseover binding }); //end self.getParkedCalls } //end function loadParkingLot(); }, //bindEvents getParkedCalls: function (callback) { var self = this; self.callApi({ resource: "parkedCalls.list", data: { accountId: self.accountId, }, success: function (data) { $.each(data.data.slots, function (index, slot) { slot.parking_slot = index; }); //end $.each //console.log(JSON.stringify(data.data)); callback(data.data); }, error: function (parsedError) { //console.log(parsedError); if (data.data.error == "401") { //if we get a 401 when refreshing parked calls, log out so user can re-auth. monster.util.logoutAndReload(); } monster.ui.alert("ERROR: Failed to get parked calls list: " + parsedError); callback([]); //Populate results with nothing }, }); //end get parked calls list }, //end getParkedCalls pickupCall: function (dialNumber) { var self = this; self.callApi({ resource: "user.quickcall", data: { accountId: self.accountId, userId: monster.apps.auth.currentUser.id, //userId: 'd89c34618dc8fa28fc5deead6cc64a4d', number: dialNumber, }, success: function (data) { console.log( "Success creating quickcall! : " + JSON.stringify(data) ); //monster.ui.alert("Success creating quickcall! : "+data); //callback(data.data); }, error: function (parsedError) { monster.ui.alert( "FAILED to create call:" + number + " for " + userID + ": " + parsedError ); //callback([]); }, }); }, callTheParker: function (parkerDeviceId) { var self = this; self.callApi({ resource: "user.get", //get my extension to use for quickcall data: { accountId: self.accountId, userId: monster.apps.auth.currentUser.id, }, success: function (data) { console.log( "Success getting user: " + data.data.caller_id.internal.number ); self.callApi({ resource: "device.quickcall", data: { accountId: self.accountId, deviceId: parkerDeviceId, number: data.data.caller_id.internal.number, }, success: function (data) { console.log( "Called: " + parkerDeviceId + " from " + data.data.caller_id.internal.number ); }, error: function (parsedError) { monster.ui.alert( "FAILED to create call to " + data.data.caller_id.internal.number + " for original parker device: " + parkerDeviceId + ": " + parsedError ); }, }); }, error: function (parsedError) { monster.ui.alert( "FAILED to get your extension - userId: " + userID + ": " + parsedError ); }, }); }, //callTheParker //////////////////////////////////////////////////////// }; return app; });