/*!
* Aloha Editor
* Author & Copyright (c) 2010 Gentics Software GmbH
* aloha-sales@gentics.com
* Licensed unter the terms of http://www.aloha-editor.com/license.html
*/
define( [
'aloha',
'aloha/jquery',
'aloha/plugin',
'aloha/floatingmenu',
'i18n!abbr/nls/i18n',
'i18n!aloha/nls/i18n'
], function ( Aloha, jQuery, Plugin, FloatingMenu, i18n, i18nCore ) {
var GENTICS = window.GENTICS;
/**
* register the plugin with unique name
*/
return Plugin.create( 'abbr', {
/**
* Configure the available languages
*/
languages: [ 'en', 'de' ],
/**
* default button configuration
*/
config: [ 'abbr' ],
/**
* Initialize the plugin and set initialize flag on true
*/
init: function () {
this.createButtons();
this.subscribeEvents();
this.bindInteractions();
},
/**
* Initialize the buttons
*/
createButtons: function () {
var me = this;
// format Abbr Button
// this button behaves like a formatting button like (bold, italics, etc)
this.formatAbbrButton = new Aloha.ui.Button( {
'name' : 'abbr',
'iconClass' : 'aloha-button aloha-button-abbr',
'size' : 'small',
'onclick' : function () { me.formatAbbr(); },
'tooltip' : i18n.t( 'button.abbr.tooltip' ),
'toggle' : true
} );
FloatingMenu.addButton(
'Aloha.continuoustext',
this.formatAbbrButton,
i18nCore.t( 'floatingmenu.tab.format' ),
1
);
// insert Abbr
// always inserts a new abbr
this.insertAbbrButton = new Aloha.ui.Button( {
'name' : 'insertAbbr',
'iconClass' : 'aloha-button aloha-button-abbr',
'size' : 'small',
'onclick' : function () { me.insertAbbr( false ); },
'tooltip' : i18n.t( 'button.addabbr.tooltip' ),
'toggle' : false
} );
FloatingMenu.addButton(
'Aloha.continuoustext',
this.insertAbbrButton,
i18nCore.t( 'floatingmenu.tab.insert' ),
1
);
// add the new scope for abbr
FloatingMenu.createScope( 'abbr', 'Aloha.continuoustext' );
this.abbrField = new Aloha.ui.AttributeField( {
'width': 320,
'name': 'abbrText'
} );
// add the input field for abbr
FloatingMenu.addButton(
'abbr',
this.abbrField,
i18n.t( 'floatingmenu.tab.abbr' ),
1
);
},
/**
* Parse a all editables for abbreviations
* Add the abbr shortcut to all edtiables
*/
bindInteractions: function () {
var me = this;
// on blur check if abbr title is empty. If so remove the a tag
this.abbrField.addListener( 'blur', function ( obj, event ) {
if ( this.getValue() == '' ) {
me.removeAbbr();
}
} );
// add to all editables the abbr shortcut
for ( var i = 0; i < Aloha.editables.length; i++ ) {
// CTRL+G
Aloha.editables[ i ].obj.keydown( function ( e ) {
if ( e.metaKey && e.which == 71 ) {
if ( me.findAbbrMarkup() ) {
FloatingMenu.activateTabOfButton( 'abbrText' );
me.abbrField.focus();
} else {
me.insertAbbr();
}
// prevent from further handling
// on a MAC Safari cursor would jump to location bar. Use ESC then META+L
e.stopPropagation();
e.preventDefault();
return false;
}
} );
}
},
/**
* Subscribe for events
*/
subscribeEvents: function () {
var me = this;
// add the event handler for selection change
Aloha.bind( 'aloha-selection-changed', function ( event, rangeObject ) {
if ( Aloha.activeEditable ) {
// show/hide the button according to the configuration
var config = me.getEditableConfig( Aloha.activeEditable.obj );
if ( jQuery.inArray( 'abbr', config ) != -1 ) {
me.formatAbbrButton.show();
me.insertAbbrButton.show();
} else {
me.formatAbbrButton.hide();
me.insertAbbrButton.hide();
// TODO this should not be necessary here!
// FloatingMenu.doLayout();
// leave if a is not allowed
return;
}
// if ( !Aloha.Selection.mayInsertTag('abbr') ) {
// me.insertAbbrButton.hide();
// }
var foundMarkup = me.findAbbrMarkup( rangeObject );
if ( foundMarkup ) {
// abbr found
me.insertAbbrButton.hide();
me.formatAbbrButton.setPressed( true );
FloatingMenu.setScope( 'abbr' );
me.abbrField.setTargetObject( foundMarkup, 'title' );
} else {
// no abbr found
me.formatAbbrButton.setPressed( false );
me.abbrField.setTargetObject( null );
}
// TODO this should not be necessary here!
// FloatingMenu.doLayout();
}
});
},
/**
* Check whether inside a abbr tag
* @param {GENTICS.Utils.RangeObject} range range where to insert the object (at start or end)
* @return markup
* @hide
*/
findAbbrMarkup: function ( range ) {
if ( typeof range == 'undefined' ) {
var range = Aloha.Selection.getRangeObject();
}
if ( Aloha.activeEditable ) {
return range.findMarkup( function() {
return this.nodeName.toLowerCase() == 'abbr';
}, Aloha.activeEditable.obj );
} else {
return null;
}
},
/**
* Format the current selection or if collapsed the current word as abbr.
* If inside a abbr tag the abbr is removed.
*/
formatAbbr: function () {
var range = Aloha.Selection.getRangeObject();
if ( Aloha.activeEditable ) {
if ( this.findAbbrMarkup( range ) ) {
this.removeAbbr();
} else {
this.insertAbbr();
}
}
},
/**
* Insert a new abbr at the current selection. When the selection is collapsed,
* the abbr will have a default abbr text, otherwise the selected text will be
* the abbr text.
*/
insertAbbr: function ( extendToWord ) {
// current selection or cursor position
var range = Aloha.Selection.getRangeObject();
// do not insert a abbr in a abbr
if ( this.findAbbrMarkup( range ) ) {
return;
}
// activate floating menu tab
FloatingMenu.activateTabOfButton('abbrText');
// if selection is collapsed then extend to the word.
if ( range.isCollapsed() && extendToWord != false ) {
GENTICS.Utils.Dom.extendToWord( range );
}
if ( range.isCollapsed() ) {
// insert a abbr with text here
var abbrText = i18n.t( 'newabbr.defaulttext' );
var newAbbr = jQuery( '' + abbrText + '' );
GENTICS.Utils.Dom.insertIntoDOM( newAbbr, range, jQuery( Aloha.activeEditable.obj ) );
range.startContainer = range.endContainer = newAbbr.contents().get( 0 );
range.startOffset = 0;
range.endOffset = abbrText.length;
} else {
var newAbbr = jQuery( '' );
GENTICS.Utils.Dom.addMarkup( range, newAbbr, false );
}
range.select();
this.abbrField.focus();
// this.abbrChange();
},
/**
* Remove an a tag.
*/
removeAbbr: function () {
var range = Aloha.Selection.getRangeObject();
var foundMarkup = this.findAbbrMarkup();
if ( foundMarkup ) {
// remove the abbr
GENTICS.Utils.Dom.removeFromDOM( foundMarkup, range, true );
// select the (possibly modified) range
range.select();
}
},
/**
* Make the given jQuery object (representing an editable) clean for saving
* Find all abbrs and remove editing objects
* @param obj jQuery object to make clean
* @return void
*/
makeClean: function ( obj ) {
// nothing to do...
},
/**
* toString method
* @return string
*/
toString: function () {
return 'abbr';
}
} );
} );