summaryrefslogtreecommitdiff
path: root/lib/scripts/toolbar.js
diff options
context:
space:
mode:
authorAndreas Gohr <andi@splitbrain.org>2009-05-28 14:15:43 +0200
committerAndreas Gohr <andi@splitbrain.org>2009-05-28 14:15:43 +0200
commit6b6da7f587c020b3439dc14c8250766f895adb93 (patch)
tree0f1d7e467b0cc7fa50ab5521b40b5818d252c260 /lib/scripts/toolbar.js
parentbbca79d883e9dbd29f59556a7e12322da7e9b02a (diff)
downloadrpg-6b6da7f587c020b3439dc14c8250766f895adb93.tar.gz
rpg-6b6da7f587c020b3439dc14c8250766f895adb93.tar.bz2
more javascript refactoring
Ignore-this: 10badc0f97ef80fcd366ae4622c43ff1 darcs-hash:20090528121543-7ad00-df34efabe84c632df9ef0c6fd691c991d2c3ac82.gz
Diffstat (limited to 'lib/scripts/toolbar.js')
-rw-r--r--lib/scripts/toolbar.js206
1 files changed, 72 insertions, 134 deletions
diff --git a/lib/scripts/toolbar.js b/lib/scripts/toolbar.js
index f31e12887..18d2daede 100644
--- a/lib/scripts/toolbar.js
+++ b/lib/scripts/toolbar.js
@@ -1,161 +1,99 @@
/**
- * selection prototype
+ * Create a toolbar
*
- * Object that capsulates the selection in a textarea. Returned by getSelection.
+ * @param string tbid ID of the element where to insert the toolbar
+ * @param string edid ID of the editor textarea
+ * @param array tb Associative array defining the buttons
+ * @author Andreas Gohr <andi@splitbrain.org>
*/
-function selection_class(){
- this.start = 0;
- this.end = 0;
- this.obj = null;
- this.rangeCopy = null;
-
- this.getLength = function(){
- return this.end - this.start;
- };
-
- this.getText = function(){
- if(!this.obj) return '';
- return this.obj.value.substring(this.start,this.end);
- }
-}
+function initToolbar(tbid,edid,tb){
+ var toolbar = $(tbid);
+ if(!toolbar) return;
+
+ //empty the toolbar area:
+ toolbar.innerHTML='';
+
+ var cnt = tb.length;
+ for(var i=0; i<cnt; i++){
+ var actionFunc;
+
+ // create new button
+ var btn = createToolButton(tb[i]['icon'],
+ tb[i]['title'],
+ tb[i]['key']);
+
+
+ // type is a tb function -> assign it as onclick
+ actionFunc = 'tb_'+tb[i]['type'];
+ if( isFunction(window[actionFunc]) ){
+ addEvent(btn,'click', function(func,btn, props, edid){
+ return function(){
+ window[func](btn, props, edid);
+ return false;
+ }
+ }(actionFunc,btn,tb[i],edid) );
+ //above fixes the scope problem as descried at http://www.mennovanslooten.nl/blog/post/62
+ toolbar.appendChild(btn);
+ continue;
+ }
+
+ // type is a init function -> execute it
+ actionFunc = 'addBtnAction'+tb[i]['type'].charAt(0).toUpperCase()+tb[i]['type'].substring(1);
+ if( isFunction(window[actionFunc]) ){
+ if(window[actionFunc](btn, tb[i], edid, i)){
+ toolbar.appendChild(btn);
+ }
+ continue;
+ }
+
+ console.log('unknown toolbar type: '+tb[i]['type']+' '+actionFunc); //FIXME make alert
+ } // end for
-/**
- * Get current selection/cursor position in a given textArea
- *
- * @link http://groups.drupal.org/node/1210
- * @returns object - a selection object
- */
-function getSelection(textArea) {
- var sel = new selection_class();
-
- sel.obj = textArea;
- sel.start = textArea.value.length;
- sel.end = textArea.value.length;
-
- textArea.focus();
- if(document.getSelection) { // Mozilla et al.
- sel.start = textArea.selectionStart;
- sel.end = textArea.selectionEnd;
- } else if(document.selection) { // MSIE
- // The current selection
- var range = document.selection.createRange();
- sel.rangeCopy = range.duplicate();
- // Select all text
- sel.rangeCopy.moveToElementText(textArea);
- // Now move 'dummy' end point to end point of original range
- sel.rangeCopy.setEndPoint( 'EndToEnd', range );
- // Now we can calculate start and end points
- sel.start = sel.rangeCopy.text.length - range.text.length;
- sel.end = sel.start + range.text.length;
- }
- return sel;
}
/**
- * Set the selection
+ * Button action for format buttons
*
- * You need to get a selection object via getSelection() first, then modify the
- * start and end properties and pass it back to this function.
- *
- * @link http://groups.drupal.org/node/1210
- * @param object selection - a selection object as returned by getSelection()
+ * @param DOMElement btn Button element to add the action to
+ * @param array props Associative array of button properties
+ * @param string edid ID of the editor textarea
+ * @author Gabriel Birke <birke@d-scribe.de>
+ * @author Andreas Gohr <andi@splitbrain.org>
*/
-function setSelection(selection){
- if(document.getSelection){ // FF
- // what a pleasure in FF ;)
- selection.obj.setSelectionRange(selection.start,selection.end);
- } else if(document.selection) { // IE
- // count number of newlines in str to work around stupid IE selection bug
- var countNL = function(str) {
- var m = str.split("\n");
- if (!m || !m.length) return 0;
- return m.length-1;
- };
- var fix = countNL(selection.obj.value.substring(0,selection.start));
-
- selection.rangeCopy.collapse(true);
- selection.rangeCopy.moveStart('character',selection.start - fix);
- selection.rangeCopy.moveEnd('character',selection.end - selection.start);
- selection.rangeCopy.select();
+function tb_format(btn, props, edid) {
+ var sample = props['title'];
+ if(props['sample']){
+ sample = props['sample'];
}
+ insertTags(edid,
+ fixtxt(props['open']),
+ fixtxt(props['close']),
+ fixtxt(sample));
+ return false;
}
/**
- * Inserts the given text at the current cursor position or replaces the current
- * selection
+ * Button action for insert buttons
*
+ * @param DOMElement btn Button element to add the action to
+ * @param array props Associative array of button properties
+ * @param string edid ID of the editor textarea
+ * @author Gabriel Birke <birke@d-scribe.de>
* @author Andreas Gohr <andi@splitbrain.org>
- * @param string text - the new text to be pasted
- * @param objct selecttion - selection object returned by getSelection
- * @param int opts.startofs - number of charcters at the start to skip from new selection
- * @param int opts.endofs - number of charcters at the end to skip from new selection
- * @param bool opts.ofs - set tru if new text should not be selected
*/
-function pasteText(selection,text,opts){
- if(!opts) opts = {};
- // replace the content
- selection.obj.value =
- selection.obj.value.substring(0, selection.start) + text +
- selection.obj.value.substring(selection.end, selection.obj.value.length);
-
- // set new selection
- selection.end = selection.start + text.length;
-
- // modify the new selection if wanted
- if(opts.startofs) selection.start += opts.startofs;
- if(opts.endofs) selection.end -= opts.endofs;
-
- // no selection wanted? set cursor to end position
- if(opts.nosel) selection.start = selection.end;
-
- setSelection(selection);
+function tb_insert(btn, props, edid) {
+ insertAtCarret(edid,fixtxt(props['insert']));
}
-/**
- * Format selection
- *
- * Apply tagOpen/tagClose to selection in textarea, use sampleText instead
- * of selection if there is none.
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-function insertTags(textAreaID, tagOpen, tagClose, sampleText){
- var txtarea = document.getElementById(textAreaID);
-
- var selection = getSelection(txtarea);
- var text = selection.getText();
- // don't include trailing space in selection
- if(text.charAt(text.length - 1) == ' '){
- selection.end--;
- text = selection.getText();
- }
-
- // nothing selected, use the sample text
- if(!text) text = sampleText;
-
- // surround with tags
- text = tagOpen + text + tagClose;
- // prepare options
- var opts = {
- startofs: tagOpen.length,
- endofs: tagClose.length
- };
- // do it
- pasteText(selection,text,opts);
-}
/**
- * Wraps around pasteText() for backward compatibility
- *
- * @author Andreas Gohr <andi@splitbrain.org>
+ * Replaces \n with linebreaks
*/
-function insertAtCarret(textAreaID, text){
- var txtarea = document.getElementById(textAreaID);
- var selection = getSelection(txtarea);
- pasteText(selection,text,{nosel: true});
+function fixtxt(str){
+ return str.replace(/\\n/g,"\n");
}