define([ 'jquery', 'app/init', 'app/util', 'app/render', 'bootbox', 'morris', 'datatables', 'xEditable', 'app/map/map', 'app/counter' ], function($, Config, Util, Render, bootbox, Morris) { 'use strict'; var config = { dynamicElementWrapperId: 'pf-dialog-wrapper', // parent Element for dynamic content (dialoges,..) mapTabBarId: 'pf-map-tabs', mapTabIdPrefix: 'pf-map-tab-', mapTabClass: 'pf-map-tab', mapTabContentClass: 'pf-map-tab-content', mapTabContentSystemInfoClass: 'pf-map-tab-content-system', mapWrapperClass: 'pf-map-wrapper', // scrollable mapClass: 'pf-map', // class for each map // dialogs newMapDialogId: 'pf-map-new-dialog', // id for system dialog signatureReaderDialogId: 'pf-signature-reader-dialog', // id for signature reader dialog // TabContentStructure mapTabContentRow: 'pf-map-content-row', // main row for Tab content (grid) mapTabContentCell: 'pf-map-content-col', // column mapTabContentCellFirst: 'pf-map-content-col-first', // first column mapTabContentCellSecond: 'pf-map-content-col-second', // second column // module info moduleClass: 'pf-module', // class for each module // system info module systemInfoModuleClass: 'pf-system-info-module', // module wrapper systemInfoRoutesClass: 'pf-system-info-routes', // wrapper for trade hub routes systemInfoGraphsClass: 'pf-system-info-graphs', // wrapper for graphs systemInfoGraphKillsClass: 'pf-system-info-graph-kills', // class for system kill graph systemInfoTableClass: 'pf-system-info-table', // class for system info table systemInfoTableEffectRowClass: 'pf-system-info-effect-row', // class for system info table effect row systemInfoRoutesTableClass: 'pf-system-route-table', // class for route tables systemInfoRoutesTableRowPrefix: 'pf-system-info-routes-row-', // prefix class for a row in the route table systemSecurityClassPrefix: 'pf-system-security-', // prefix class for system security level (color) systemInfoProgressScannedClass: 'pf-system-progress-scanned', // progress bar scanned signatures // sig table module sigTableModuleClass: 'pf-sig-table-module', // module wrapper sigTableToolsClass: 'pf-sig-table-tools', // table toolbar sigTableToolsActionClass: 'pf-sig-table-tools-action', // table toolbar action sigTableClass: 'pf-sig-table', // Table class for all Signature Tables sigTableMainClass: 'pf-sig-table-main', // Table class for main sig table sigTableEditText: 'pf-sig-table-edit-text', // class for editable fields (text) sigTableEditSigNameInput: 'pf-sig-table-edit-name-input', // class for editable fields (input) sigTableEditSigTypeSelect: 'pf-sig-table-edit-type-select', // class for editable fields (select) sigTableEditSigNameSelect: 'pf-sig-table-edit-name-select', // class for editable fields (select) sigTableCounterClass: 'pf-sig-table-counter', // class for signature table counter // map scopes mapScopes: [ {scope: 'wormhole', label: 'W-Space'} ], mapIcons: [ {class: 'fa-desktop', label: 'desktop'}, {class: 'fa-bookmark', label: 'bookmark'}, {class: 'fa-cube', label: 'cube'}, {class: 'fa-warning', label: 'warning'}, {class: 'fa-plane', label: 'plane'}, {class: 'fa-rocket', label: 'rocket'} ] }; var cache = { systemRoutes: {}, // jump information between solar systems systemKillsGraphData: {} // data for system kills info graph }; /** * shows the add new map dialog */ var showNewMapDialog = function(){ // confirm dialog var moduleConfig = { name: 'modules/map_dialog', position: $('#' + config.dynamicElementWrapperId), link: 'after', functions: { after: function(){ $( "#" + config.newMapDialogId).dialog({ modal: true, resizable: false, buttons: { 'Cancel': function(){ $(this).dialog('close'); }, 'Add map': function(){ // get form Values var form = $('#' + config.newMapDialogId).find('form'); var newMapData = {}; $.each(form.serializeArray(), function(i, field) { newMapData[field.name] = field.value; }); saveMapData(newMapData); $(this).dialog('close'); } } }); } } }; var moduleData = { id: config.newMapDialogId, title: 'Add new map', scope: config.mapScopes, type: Util.getMapTypes(), icon: config.mapIcons }; Render.showModule(moduleConfig, moduleData); }; var saveMapData = function(mapData){ // TODO: save map console.log(mapData); }; /** * get all maps for a maps module * @param mapModule * @returns {*} */ $.fn.getMaps = function(){ var maps = $(this).find('.' + config.mapClass); return maps; }; /** * get the current active map for * @returns {*} */ $.fn.getActiveMap = function(){ var map = $(this).find('.active.' + config.mapTabContentClass + ' .' + config.mapClass); return map; }; /** * get all TabElements in this map module * @returns {*} */ var getTabElements = function(){ return $('#' + config.mapTabBarId).find('a[data-toggle="tab"]'); }; /** * get all Tabs for a maps module * @param mapModule * @returns {*} */ var getTabContentElements = function(mapContentModule){ var tabs = $(mapContentModule).find('.' + config.mapTabContentClass ); return tabs; }; /** * set Tab Observer, events are triggered within map.js * @param mapContentModule */ $.fn.setTabContentObserver = function(){ return this.each(function(){ // update Tab Content with system data information $(this).on('pf:updateSystemData', function(e, mapData){ // collect all relevant data for SystemInfoElement var systemInfoData = { systemId: parseInt( $( mapData.system).data('id') ), mapId: parseInt( $( mapData.system).attr('data-mapid') ) }; drawSystemInfoElement($( e.target ), systemInfoData); }); // highlight a mapTab $(this).on('pf:highlightTab', function(e, data){ // update Tab Content with system data information highlightTab(e.target, data); }); }); }; /** * highlight a Tab in this module e.g. when user has an active pilot in this map * @param contentElement * @param data */ var highlightTab = function(contentElement, data){ var tabElements = getTabElements(); contentElement = $(contentElement); // look for related tab element $.each(tabElements, function(i, tabElement){ tabElement = $(tabElement); if(tabElement.attr('data-map-index') === contentElement.attr('data-map-index')){ tabElement.tooltip({placement: 'top', trigger: 'manual'}); tabElement.attr('title', ''); tabElement.tooltip('hide'); // check if this tab needs to be highlighted if(data.system){ // destroy empty tooltip end create new tabElement.tooltip('destroy'); tabElement.attr('title', $(data.system).data('name')); tabElement.tooltip('show'); // scroll to system contentElement.find('.' + config.mapWrapperClass).scrollTo( '#' + data.system.id ); } return false; } }); }; /** * open "signature reader" dialog for signature table */ $.fn.showSignatureReaderDialog = function(systemData){ var moduleElement = $(this); var data = { id: config.signatureReaderDialogId }; requirejs(['text!templates/modules/signature_reader_dialog.html', 'lib/mustache'], function(template, Mustache) { var content = Mustache.render(template, data); var signatureReaderDialog = bootbox.dialog({ title: 'Signature reader', message: content, buttons: { close: { label: 'cancel', className: 'btn-default', callback: function(){ $(signatureReaderDialog).modal('hide'); } }, success: { label: 'update signatures', className: 'btn-primary', callback: function () { // get form Values var form = $('#' + config.signatureReaderDialogId).find('form'); var formData = $(form).getFormValues(); moduleElement.updateSignatureTableByClipboard(systemData, formData.clipboard); } } } }); }); }; /** * updates * @param systemData * @param clipboard data stream */ $.fn.updateSignatureTableByClipboard = function(systemData, clipboard){ var moduleElement = $(this); // parse input stream var signatureData = parseSignatureString(systemData, clipboard); // TODO save data and get date with ID updatedBy names etc. // updates table with new signature information moduleElement.updateSignatureTable(signatureData); }; /** * parses a copy&paste string from ingame scanning window and parses it * @param systemData * @param clipbaord * @returns {Array} */ var parseSignatureString = function(systemData, clipbaord){ var signatureData = []; var signatureRows = clipbaord.split('\r\n'); var signatureGroupOptions = Util.getSignatureGroupInfo('name'); for(var i = 0; i < signatureRows.length; i++){ var rowData = signatureRows[i].split('\t'); if(rowData.length === 6){ // check if sig Type = anomaly or combat site if( rowData[1] === 'Cosmic Anomaly' || rowData[1] === 'Cosmic Signature' ){ var sigGroup = rowData[2].trim().toLowerCase(); var sigGroupId = 0; // get groupId by groupName for (var prop in signatureGroupOptions) { if(signatureGroupOptions.hasOwnProperty(prop)){ if(signatureGroupOptions[prop] === sigGroup){ sigGroupId = parseInt( prop ); break; } } } var typeId = Util.getSignatureTypeIdByName( systemData, sigGroupId, rowData[3].trim() ); // map array values to signature Object var signatureObj = { name: rowData[0].substr(0, 3).trim().toLowerCase(), groupId: sigGroupId, typeId: typeId }; signatureData.push(signatureObj); } } } return signatureData; }; /** * draw signature table toolbar (add signature button, scan progress bar * @param systemData * @param emptySignatureData */ $.fn.drawSignatureTableToolbar = function(systemData, emptySignatureData){ var moduleElement = $(this); // add toolbar buttons for table ------------------------------------- var tableToolbar = $('
', { class: config.sigTableToolsClass }).append( $('