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(
$('