APIs

Show:
/**
 * BlockLocation resides inside a scene or timeline and manages internal playback of scenes and resources
 * @class BlockLocation
 * @extends Block
 * @constructor
 * @param {string} i_placement location where objects resides which can be scene or timeline
 * @param {string} i_campaign_timeline_chanel_player_id required and set as block id when block is inserted onto timeline_channel
 * @return {Object} Block instance
 */
define(['jquery', 'backbone', 'Block', 'bootstrap-table-editable', 'bootstrap-table-sort-rows'], function ($, Backbone, Block, bootstraptableeditable, bootstraptablesortrows) {

        var BlockLocation = Block.extend({

            /**
             Constructor
             @method initialize
             **/
            constructor: function (options) {
                var self = this;
                self.m_blockType = 4105;
                _.extend(options, {blockType: self.m_blockType});
                Block.prototype.constructor.call(this, options);

                self.m_locationTable = $(Elements.LOCATION_TABLE);
                self.m_selectRowIndex = -1;
                self.m_currentIndex = 0;
                self.m_pendingAdditionXML = '';
                self._initSubPanel(Elements.BLOCK_LOCATION_COMMON_PROPERTIES);
                self._listenLocationRowDragged();
                self._listenLocationRowDropped();
                self._listenAddResource();
                self._listenRemoveResource();
                self._listenLocationRowChanged();
                self._listenLiveInputs();
                self._listenMenuControls();
                self._listenAddPoint();
                self._listenRadiusChange();
                self._listenPriorityChange();

                self.m_blockProperty.locationDatatableInit();
                self.m_locationPriorityMeter = self.m_blockProperty.getLocationPriorityMeter();

                if (self.m_placement == BB.CONSTS.PLACEMENT_CHANNEL) {
                    self.m_addBlockLocationView = BB.comBroker.getService(BB.SERVICES.ADD_BLOCK_LOCATION_VIEW);
                } else if (self.m_placement = BB.CONSTS.PLACEMENT_SCENE) {
                    self.m_addBlockLocationView = BB.comBroker.getService(BB.SERVICES.ADD_BLOCK_LOCATION_SCENE_VIEW);
                }

                /* can set global mode if we wish */
                //$.fn.editable.defaults.mode = 'inline';
            },

            /**
             Listen to changes in priority
             @method _listenPriorityChange
             **/
            _listenPriorityChange: function () {
                var self = this;
                self.m_inputPriorityHandler = function (e) {
                    if (!self.m_selected)
                        return;
                    var domPlayerData = self._getBlockPlayerData();
                    var value = e.edata;
                    console.log('get value ' + value);
                    var total = $(domPlayerData).find('GPS').children().length;
                    if (total == 0)
                        return;
                    var item = $(domPlayerData).find('GPS').children().get(self.m_currentIndex);
                    $(item).attr('priority', value);
                    self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
                };
                BB.comBroker.listen(BB.EVENTS.LOCATION_PRIORITY_METER_CHANGED, self.m_inputPriorityHandler);
            },

            /**
             Populate the priority widget
             @method _populatePriority
             @param {Number} i_value
             **/
            _populatePriority: function (i_value) {
                var self = this;
                //$(Elements.YOUTUBE_VOLUME_WRAP_SLIDER).val(i_value);
                self.m_locationPriorityMeter.setMeter(i_value);
            },

            /**
             Listen to adding a new point from google maps, and if we pending for addition, take action
             @method _listenAddPoint
             @param {Number} i_playerData
             @return {Number} Unique clientId.
             **/
            _listenAddPoint: function () {
                var self = this;
                self.m_onNewMapPointHandler = function (e) {
                    if (!self.m_selected)
                        return;
                    var latLng = e.edata;
                    if (!latLng) {
                        self.m_pendingAdditionXML = '';
                        return;
                    }
                    var lat = e.edata.lat;
                    var lng = e.edata.lng;
                    var reLat = new RegExp(":LAT:", "ig");
                    var reLng = new RegExp(":LNG:", "ig");
                    self.m_pendingAdditionXML = self.m_pendingAdditionXML.replace(reLat, lat);
                    self.m_pendingAdditionXML = self.m_pendingAdditionXML.replace(reLng, lng);
                    var domPlayerData = self._getBlockPlayerData();
                    var xSnippetLocation = $(domPlayerData).find('GPS');
                    $(xSnippetLocation).append($(self.m_pendingAdditionXML));
                    self.m_pendingAdditionXML = '';
                    // since we used append, we have to cleanup for IE case bug
                    self._setBlockPlayerData(pepper.xmlToStringIEfix(domPlayerData), BB.CONSTS.NO_NOTIFICATION, true);
                    self._populate();
                    self._jumpToLocation('last');
                };
                BB.comBroker.listen(BB.EVENTS.ADD_LOCATION_POINT, self.m_onNewMapPointHandler);
            },

            /**
             Listen to changes in radius per selected location
             @method _listenRadiusChange
             **/
            _listenRadiusChange: function () {
                var self = this;
                self.m_onRadiusHandler = function (e) {
                    if (!self.m_selected)
                        return;
                    var val = e.edata;
                    var domPlayerData = self._getBlockPlayerData();
                    var total = $(domPlayerData).find('GPS').children().length;
                    if (total == 0)
                        return;
                    var item = $(domPlayerData).find('GPS').children().get(self.m_currentIndex);
                    $(item).attr('radios', val);
                    self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
                    self._googleMap(false, true, false);
                };
                BB.comBroker.listen(BB.EVENTS.LOCATION_RADIUS_CHANGED, self.m_onRadiusHandler);
            },

            /**
             Listen to location controls, add remove, next, add ...
             @method _listenMenuControls
             **/
            _listenMenuControls: function () {
                var self = this;
                self.m_locationControls = function (e) {
                    if (!self.m_selected)
                        return;
                    var buttonType = $(e.target).attr('name') != undefined ? $(e.target).prop('name') : $(e.target).closest('button').attr('name');
                    if (buttonType == 'removeLocation')
                        self._removeLocation();
                    if (buttonType == 'previous')
                        self._jumpToLocation('prev');
                    if (buttonType == 'next')
                        self._jumpToLocation('next');
                    if (buttonType == 'openLocation')
                        self._googleMap(false, false, true);
                };
                $(Elements.LOCATION_CONTROLS + ' button').on('click', self.m_locationControls);
            },

            /**
             Remove current selected location
             @method _removeLocation
             **/
            _removeLocation: function () {
                var self = this;
                var domPlayerData = self._getBlockPlayerData();
                var total = $(domPlayerData).find('GPS').children().length;
                if (total == 0)
                    return;

                bootbox.confirm($(Elements.MSG_BOOTBOX_SURE_DELETE).text(), function (result) {
                    if (result == true) {
                        $(domPlayerData).find('GPS').children().eq(self.m_currentIndex).remove();
                        self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
                        self._googleMap(false, true, false);
                        self._jumpToLocation('first');
                        self._populateTotalMapLocations(domPlayerData);
                    }
                });
            },

            /**
             Listen to changes in row due to drag
             @method _listenVolumeChange
             **/
            _listenLocationRowDragged: function () {
                var self = this;
                self.m_locationRowDraggedHandler = function (e) {
                    if (!self.m_selected)
                        return;
                    self.m_selectRowIndex = e.edata;
                    var domPlayerData = self._getBlockPlayerData();
                };
                BB.comBroker.listen(BB.EVENTS.LOCATION_ROW_DRAG, self.m_locationRowDraggedHandler);
            },

            /**
             Listen to changes in LiveInputs including resource names, long and lat values
             @method _listenLiveInputs
             **/
            _listenLiveInputs: function () {
                var self = this;

                self.m_liveInputChanged = function (e) {
                    if (!self.m_selected)
                        return;
                    var reloadMap = false;
                    var domPlayerData = self._getBlockPlayerData();
                    var total = $(domPlayerData).find('GPS').children().length;
                    if (total == 0)
                        return;
                    var item = $(domPlayerData).find('GPS').children().get(self.m_currentIndex);
                    switch (e.edata.el) {
                        case Elements.LOCATION_RESOURCE_NAME:
                        {
                            $(item).attr('page', e.edata.value);
                            break;
                        }
                        case Elements.LOCATION_RESOURCE_LAT:
                        {
                            $(item).attr('lat', e.edata.value);
                            reloadMap = true;
                            break;
                        }
                        case Elements.LOCATION_RESOURCE_LNG:
                        {
                            $(item).attr('lng', e.edata.value);
                            reloadMap = true;
                            break;
                        }
                        case Elements.LOCATION_RESOURCE_DURATION:
                        {
                            $(item).attr('duration', e.edata.value);
                            break;
                        }
                    }
                    self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
                    if (reloadMap)
                        self._googleMap(false, true, false);
                };
                BB.comBroker.listen(BB.EVENTS.LOCATION_LIVE_INPUT_CHANGED, self.m_liveInputChanged);

            },

            /**
             Listen to when location row was edited
             @method _listenLocationRowChanged
             **/
            _listenLocationRowChanged: function () {
                var self = this;
                self.m_locationRowChangedHandler = function (e) {
                    if (!self.m_selected)
                        return;
                    var domPlayerData = self._getBlockPlayerData();
                    var rowIndex = e.edata.rowIndex;
                    var newName = e.edata.name;
                    var newDuration = parseInt(e.edata.duration);
                    if (_.isNaN(newDuration)) {
                        bootbox.alert($(Elements.MSG_BOOTBOX_ENTRY_IS_INVALID).text());
                        self._populateTableDefault(domPlayerData);
                        return;
                    }
                    var item = $(domPlayerData).find('Fixed').children().get(rowIndex);
                    $(item).attr('page', newName).attr('duration', newDuration);
                    self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
                    self._populateTableDefault(domPlayerData);
                };
                BB.comBroker.listen(BB.EVENTS.LOCATION_ROW_CHANGED, self.m_locationRowChangedHandler);
            },

            /**
             Listen to changes in volume control
             @method _listenVolumeChange
             **/
            _listenLocationRowDropped: function () {
                var self = this;
                self.m_locationRowDroppedHandler = function (e) {
                    if (!self.m_selected)
                        return;
                    var droppedRowIndex = e.edata;
                    var domPlayerData = self._getBlockPlayerData();
                    var target = $(domPlayerData).find('Fixed').children().get(parseInt(droppedRowIndex));
                    var source = $(domPlayerData).find('Fixed').children().get(self.m_selectRowIndex);
                    droppedRowIndex > self.m_selectRowIndex ? $(target).after(source) : $(target).before(source);
                    self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
                    self._populateTableDefault(domPlayerData);
                };
                BB.comBroker.listen(BB.EVENTS.LOCATION_ROW_DROP, self.m_locationRowDroppedHandler);
            },

            /**
             The main functions which renders and loads up the entire property panel with both default resource list
             as well as map location coordinates list
             @method _populate
             @return none
             **/
            _populate: function () {
                var self = this;
                self._setLocationBlockGlobalValidationOwner(self);
                var domPlayerData = self._getBlockPlayerData();
                var xSnippetLocation = $(domPlayerData).find('Fixed');
                var mode = $(xSnippetLocation).attr('mode');
                self._populateTableDefault(domPlayerData);
                self._jumpToLocation('first');
                self._populateTotalMapLocations(domPlayerData);
            },

            /**
             Populate the radius UI element
             @method _populateRadius
             @param {Object} i_value
             **/
            _populateRadius: function (i_value) {
                var self = this;
                $(Elements.LOCATION_RADIUS_WRAP_SLIDER).val(i_value);
            },

            /**
             Populate the total map locations set
             @method _populateTotalMapLocations
             @param {Object} domPlayerData
             **/
            _populateTotalMapLocations: function (domPlayerData) {
                var self = this;
                var total = $(domPlayerData).find('GPS').children().length;
                if (total == 0) {
                    $(Elements.LOCATION_SELECTED).hide();
                    self.m_currentIndex = 0;
                } else {
                    $(Elements.LOCATION_SELECTED).show();
                }
                $(Elements.TOTAL_MAP_LOCATIONS).text(total);
            },

            /**
             Select specific location and populate both the UI as well scroll map to coordinates
             @method _jumpToLocation
             @param {String} i_index
             **/
            _jumpToLocation: function (i_index) {
                var self = this;
                var domPlayerData = self._getBlockPlayerData();
                var total = $(domPlayerData).find('GPS').children().length;
                var item;
                // no locations, done!
                if (total == 0) {
                    self._populateTotalMapLocations(domPlayerData);
                    return;
                }
                // load location
                switch (i_index) {
                    case 'first':
                    {
                        self.m_currentIndex = 0;
                        item = $(domPlayerData).find('GPS').children().first();
                        break;
                    }
                    case 'last':
                    {
                        self.m_currentIndex = total - 1;
                        item = $(domPlayerData).find('GPS').children().last();
                        break;
                    }
                    case 'next':
                    {
                        if (self.m_currentIndex == (total - 1)) {
                            item = $(domPlayerData).find('GPS').children().last();
                        } else {
                            self.m_currentIndex++;
                            item = $(domPlayerData).find('GPS').children().get(self.m_currentIndex);
                        }
                        break;
                    }
                    case 'prev':
                    {
                        if (self.m_currentIndex == 0) {
                            item = $(domPlayerData).find('GPS').children().first();
                        } else {
                            self.m_currentIndex--;
                            item = $(domPlayerData).find('GPS').children().get(self.m_currentIndex);
                        }
                        break;
                    }
                }
                self._populateRadius($(item).attr('radios'));
                self._populatePriority($(item).attr('priority'));
                self.m_blockProperty.setLocationLiveInput(Elements.LOCATION_RESOURCE_NAME, $(item).attr('page'));
                self.m_blockProperty.setLocationLiveInput(Elements.LOCATION_RESOURCE_LAT, $(item).attr('lat'));
                self.m_blockProperty.setLocationLiveInput(Elements.LOCATION_RESOURCE_LNG, $(item).attr('lng'));
                self.m_blockProperty.setLocationLiveInput(Elements.LOCATION_RESOURCE_DURATION, $(item).attr('duration'));
                self.m_addBlockLocationView.panToPoint($(item).attr('lat'), $(item).attr('lng'));
            },

            /**
             Load list into the UI for default content
             @method _populateTableDefault
             @param {Object} i_domPlayerData
             **/
            _populateTableDefault: function (i_domPlayerData) {
                var self = this;
                self.m_locationTable.bootstrapTable('removeAll');
                var data = [], rowIndex = 0;
                $(i_domPlayerData).find('Fixed').children().each(function (k, page) {
                    var resource_hResource, scene_hDataSrc;
                    var type = $(page).attr('type');
                    if (type == 'resource') {
                        resource_hResource = $(page).find('Resource').attr('hResource');
                    } else {
                        scene_hDataSrc = $(page).find('Player').attr('hDataSrc');
                    }
                    log('populating ' + resource_hResource);
                    data.push({
                        rowIndex: rowIndex,
                        checkbox: true,
                        name: $(page).attr('page'),
                        duration: $(page).attr('duration'),
                        type: type,
                        resource_hResource: resource_hResource,
                        scene_hDataSrc: scene_hDataSrc
                    });
                    rowIndex++;
                });
                self.m_locationTable.bootstrapTable('load', data);
            },

            /**
             Listen to add new resource and when clicked, wait for announcement from AddBlockListView that
             a new resource or scene needs to be added to either the default play list (aka Fixed) or
             to the Location based play list (aka GPS)
             @method _listenAddResource
             **/
            _listenAddResource: function () {
                var self = this;
                self.m_addNewLocationListItem = function (e) {

                    BB.comBroker.stopListenWithNamespace(BB.EVENTS.ADD_NEW_BLOCK_LIST, self);
                    if (!self.m_selected)
                        return;

                    self.m_listItemType = $(e.target).attr('name') != undefined ? $(e.target).prop('name') : $(e.target).closest('button').attr('name');

                    // open the Add Block Slider
                    var addBlockView;
                    if (self.m_placement == BB.CONSTS.PLACEMENT_CHANNEL) {
                        addBlockView = BB.comBroker.getService(BB.SERVICES.ADD_BLOCK_VIEW);
                    } else if (self.m_placement = BB.CONSTS.PLACEMENT_SCENE) {
                        addBlockView = BB.comBroker.getService(BB.SERVICES.ADD_SCENE_BLOCK_VIEW);
                    }
                    addBlockView.setPlacement(BB.CONSTS.PLACEMENT_LISTS);
                    addBlockView.selectView();

                    // wait for a new resource to be added and once it has, open the Google maps for location insertion
                    BB.comBroker.listenWithNamespace(BB.EVENTS.ADD_NEW_BLOCK_LIST, self, function (e) {
                        if (!self.m_selected)
                            return;
                        e.stopImmediatePropagation();
                        e.preventDefault();
                        self._addLocationItem(e, self.m_listItemType);

                    });
                };
                $(Elements.CLASS_ADD_RESOURCE_LOCATION).on('click', self.m_addNewLocationListItem);
            },

            /**
             Check if scene is pointing to itself to avoid cyclic reference
             @method _isSceneCyclic
             @param {Number} i_playerData
             @return {Boolean} true if cyclic reference
             **/
            _isSceneCyclic: function(i_edata){
                var self = this;
                if (self.m_placement == BB.CONSTS.PLACEMENT_SCENE) {
                    var sceneEditView = BB.comBroker.getService(BB.SERVICES['SCENE_EDIT_VIEW']);
                    if (!_.isUndefined(sceneEditView)) {
                        var selectedSceneID = sceneEditView.getSelectedSceneID();
                        selectedSceneID = pepper.getSceneIdFromPseudoId(selectedSceneID);
                        if (selectedSceneID == i_edata.sceneID) {
                            return true;
                        }
                    }
                }
                return false;
            },

            /**
             Add to our XML a list item item which can be of one of two types
             addDefault: a default resource to play when not within radius of GPS coords
             addLocation: a particular resource to play within specific GPS coords
             @method _addLocationItem
             @param {Event} e
             @param {String} type addDefault or addLocation
             **/
            _addLocationItem: function (e, type) {
                var self = this;
                var domPlayerData = self._getBlockPlayerData();
                var buff = '';
                var locationBuff;
                var xSnippetLocation;

                // log(e.edata.blockCode, e.edata.resourceID, e.edata.sceneID);
                if (self._isSceneCyclic(e.edata)){
                    bootbox.alert($(Elements.MSG_BOOTBOX_SCENE_REFER_ITSELF).text());
                    return;
                }

                switch (type) {
                    case 'addDefault':
                    {
                        xSnippetLocation = $(domPlayerData).find('Fixed');
                        locationBuff = '>';
                        break;
                    }
                    case 'addLocation':
                    {
                        locationBuff = 'lat=":LAT:" lng=":LNG:" radios="0.10" duration="5" priority="1">';
                        xSnippetLocation = $(domPlayerData).find('GPS');
                        BB.comBroker.fire(BB.EVENTS.BLOCK_SELECTED, this, null, self.m_block_id);
                        setTimeout(function () {
                            self._googleMap(true, true, true);
                            self._populate();
                        }, 500);
                        break;
                    }
                }

                // adding a scene and don't allow cyclic reference of scene
                if (e.edata.blockCode == BB.CONSTS.BLOCKCODE_SCENE) {
                    var sceneRecord = pepper.getScenePlayerRecord(e.edata.sceneID);
                    var sceneName = $(sceneRecord.player_data_value).attr('label');
                    var nativeID = sceneRecord['native_id'];
                    buff = '<Page page="' + sceneName + '" type="scene" duration="5" ' + locationBuff +
                        '       <Player src="' + nativeID + '" hDataSrc="' + e.edata.sceneID + '" />' +
                        '   </page>';
                } else {
                    // Add resources to location
                    var resourceName = pepper.getResourceRecord(e.edata.resourceID).resource_name;
                    log('updating hResource ' + e.edata.resourceID);
                    buff = '<Page page="' + resourceName + '" type="resource" duration="5" ' + locationBuff +
                        '       <Player player="' + e.edata.blockCode + '">' +
                        '           <Data>' +
                        '               <Resource hResource="' + e.edata.resourceID + '" />' +
                        '           </Data>' +
                        '       </Player>' +
                        '   </page>';
                }

                // if default item, just add it. if location item, remember it and only add it once user select
                // a location for it in google the map as we need to wait for the coordinates.
                switch (type) {
                    case 'addDefault':
                    {
                        $(xSnippetLocation).append($(buff));
                        // since we used append, we have to cleanup for IE case bug
                        self._setBlockPlayerData(pepper.xmlToStringIEfix(domPlayerData), BB.CONSTS.NO_NOTIFICATION, true);
                        BB.comBroker.fire(BB.EVENTS.BLOCK_SELECTED, this, null, self.m_block_id);
                        break;
                    }
                    case 'addLocation':
                    {
                        self.m_pendingAdditionXML = buff;
                    }
                }
            },

            /**
             Open google maps and load it with all current locations
             @method _googleMap
             @params {Boolean} i_markerOnClick set to true if we are going to expect user to add a new location or false if we just want to open an existing map and not add any new locations
             @params {Boolean} i_reloadData reload the map with fresh data, used when we delete map items and want to force a refresh
             @params {Boolean} i_loadStackView animate the slider StackView into position
             **/
            _googleMap: function (i_markerOnClick, i_reloadData, i_loadStackView) {
                var self = this;
                var map = {
                    points: []
                };
                var domPlayerData = self._getBlockPlayerData();
                $(domPlayerData).find('GPS').children().each(function (k, v) {
                    var point = {
                        center: {
                            lat: $(v).attr('lat'),
                            lng: $(v).attr('lng')

                        },
                        radius: $(v).attr('radios')
                    };
                    map.points.push(point);

                });
                self.m_addBlockLocationView.setData(map);
                //self.m_addBlockLocationView.setPlacement(BB.CONSTS.PLACEMENT_LISTS);

                if (i_loadStackView) {
                    self.m_addBlockLocationView.selectView(i_markerOnClick);
                }
                if (i_reloadData)
                    self.m_addBlockLocationView.loadJson();
            },

            /**
             Listen to when removing a resource from location list
             The algorithm will uses our bootstrap-table own inject rowIndex value
             and counts up to match with the order of <Pages/> in msdb location, once matched against same value
             we delete the proper ordered location item from msdb and refresh the entire table
             @method _listenRemoveResource
             **/
            _listenRemoveResource: function () {
                var self = this;
                self.m_removeLocationListItem = function () {
                    if (!self.m_selected)
                        return;
                    if (self.m_locationTable.bootstrapTable('getSelections').length == 0) {
                        bootbox.alert($(Elements.MSG_BOOTBOX_NO_ITEM_SELECTED).text());
                        return;
                    }

                    bootbox.confirm($(Elements.MSG_BOOTBOX_SURE_DELETE).text(), function (result) {
                        if (result == true) {
                            var rowIndex = $('input[name=btSelectItem]:checked', Elements.LOCATION_TABLE).closest('tr').attr('data-index');
                            var domPlayerData = self._getBlockPlayerData();
                            $(domPlayerData).find('Fixed').children().eq(rowIndex).remove();
                            self._setBlockPlayerData(domPlayerData, BB.CONSTS.NO_NOTIFICATION);
                            self._populateTableDefault(domPlayerData);
                        }
                    });
                };
                $(Elements.REMOVE_RESOURCE_FOR_LOCATION).on('click', self.m_removeLocationListItem);
            },

            /**
             Populate the common block properties panel, called from base class if exists
             @method _loadBlockSpecificProps
             @return none
             **/
            _loadBlockSpecificProps: function () {
                var self = this;
                self._populate();
                this._viewSubPanel(Elements.BLOCK_LOCATION_COMMON_PROPERTIES);
            },

            /**
             re-take ownership for a caller block instance and register global Validators for bootstrap-table to format data
             This function has to run everytime we populate the UI since it is a shared global function
             and we have to override it so 'this' refers to correct BlockLocation instance
             @method _setLocationBlockGlobalValidationOwner
             **/
            _setLocationBlockGlobalValidationOwner: function (i_this) {
                // add draggable icons
                BB.lib.locationDragIcons = function () {
                    return '<div class="dragIconTable"><i class="fa fa-arrows-v"></i></div>';
                };

                // register a global shared function to validate checkbox state
                BB.lib.locationChecks = function (value, row, index) {
                    return {
                        checked: false,
                        disabled: false
                    }
                };
            },

            /**
             Get all the location pages names for current location block
             this is called against the last block instance that registered the global function of
             setLocationBlockGlobalValidationOwner
             @method _getLocationPageNames
             **/
            _getLocationPageNames: function () {
                var self = this;
                var data = [];
                var domPlayerData = self._getBlockPlayerData();
                $(domPlayerData).find('Fixed').children().each(function (k, page) {
                    data.push($(page).attr('page'));
                });
                return data;
            },

            /**
             Delete this block
             @method deleteBlock
             @params {Boolean} i_memoryOnly if true only remove from existance but not from msdb
             **/
            deleteBlock: function (i_memoryOnly) {
                var self = this;
                $(Elements.CLASS_ADD_RESOURCE_LOCATION).off('click', self.m_addNewLocationListItem);
                $(Elements.REMOVE_RESOURCE_FOR_LOCATION).off('click', self.m_removeLocationListItem);
                $(Elements.LOCATION_CONTROLS + ' button').off('click', self.m_locationControls);
                BB.comBroker.stopListen(BB.EVENTS.ADD_NEW_BLOCK_LIST); // removing for everyone which is ok, since gets added in real time
                BB.comBroker.stopListen(BB.EVENTS.LOCATION_ROW_DROP, self.m_locationRowDroppedHandler);
                BB.comBroker.stopListen(BB.EVENTS.LOCATION_ROW_DRAG, self.m_locationRowDraggedHandler);
                BB.comBroker.stopListen(BB.EVENTS.LOCATION_ROW_CHANGED, self.m_locationRowChangedHandler);
                BB.comBroker.stopListen(BB.EVENTS.LOCATION_LIVE_INPUT_CHANGED, self.m_liveInputChanged);
                BB.comBroker.stopListen(BB.EVENTS.ADD_LOCATION_POINT, self.m_onNewMapPointHandler);
                BB.comBroker.stopListen(BB.EVENTS.LOCATION_RADIUS_CHANGED, self.m_onRadiusHandler);
                BB.comBroker.stopListen(BB.EVENTS.LOCATION_PRIORITY_METER_CHANGED, self.m_inputPriorityHandler);
                self._deleteBlock(i_memoryOnly);
            }
        });
        return BlockLocation;
    }
);