1 2// used to identify pickers 3var pickercounter=0; 4 5/** 6 * Create a toolbar 7 * 8 * @param string tbid ID of the element where to insert the toolbar 9 * @param string edid ID of the editor textarea 10 * @param array tb Associative array defining the buttons 11 * @author Andreas Gohr <andi@splitbrain.org> 12 */ 13function initToolbar(tbid,edid,tb){ 14 var toolbar = $(tbid); 15 if(!toolbar) return; 16 17 //empty the toolbar area: 18 toolbar.innerHTML=''; 19 20 var cnt = tb.length; 21 for(var i=0; i<cnt; i++){ 22 var actionFunc; 23 24 // create new button 25 var btn = createToolButton(tb[i]['icon'], 26 tb[i]['title'], 27 tb[i]['key']); 28 29 30 // type is a tb function -> assign it as onclick 31 actionFunc = 'tb_'+tb[i]['type']; 32 if( isFunction(window[actionFunc]) ){ 33 addEvent(btn,'click', function(func,btn, props, edid){ 34 return function(){ 35 window[func](btn, props, edid); 36 return false; 37 } 38 }(actionFunc,btn,tb[i],edid) ); 39 //above fixes the scope problem as descried at http://www.mennovanslooten.nl/blog/post/62 40 toolbar.appendChild(btn); 41 continue; 42 } 43 44 // type is a init function -> execute it 45 actionFunc = 'addBtnAction'+tb[i]['type'].charAt(0).toUpperCase()+tb[i]['type'].substring(1); 46 if( isFunction(window[actionFunc]) ){ 47 if(window[actionFunc](btn, tb[i], edid)){ 48 toolbar.appendChild(btn); 49 } 50 continue; 51 } 52 53 alert('unknown toolbar type: '+tb[i]['type']+' '+actionFunc); 54 } // end for 55 56} 57 58/** 59 * Button action for format buttons 60 * 61 * @param DOMElement btn Button element to add the action to 62 * @param array props Associative array of button properties 63 * @param string edid ID of the editor textarea 64 * @author Gabriel Birke <birke@d-scribe.de> 65 * @author Andreas Gohr <andi@splitbrain.org> 66 */ 67function tb_format(btn, props, edid) { 68 var sample = props['title']; 69 if(props['sample']){ 70 sample = props['sample']; 71 } 72 insertTags(edid, 73 fixtxt(props['open']), 74 fixtxt(props['close']), 75 fixtxt(sample)); 76 pickerClose(); 77 return false; 78} 79 80/** 81 * Button action for format buttons 82 * 83 * This works exactly as tb_format() except that, if multiple lines 84 * are selected, each line will be formatted seperately 85 * 86 * @param DOMElement btn Button element to add the action to 87 * @param array props Associative array of button properties 88 * @param string edid ID of the editor textarea 89 * @author Gabriel Birke <birke@d-scribe.de> 90 * @author Andreas Gohr <andi@splitbrain.org> 91 */ 92function tb_formatln(btn, props, edid) { 93 var sample = props['title']; 94 if(props['sample']){ 95 sample = props['sample']; 96 } 97 sample = fixtxt(sample); 98 99 var selection = getSelection($(edid)); 100 if(selection.getLength()) sample = selection.getText(); 101 102 props['open'] = fixtxt(props['open']); 103 props['close'] = fixtxt(props['close']); 104 105 sample = sample.split("\n").join(props['close']+"\n"+props['open']); 106 sample = props['open']+sample+props['close']; 107 108 pasteText(selection,sample,{nosel: true}); 109 110 pickerClose(); 111 return false; 112} 113 114/** 115 * Button action for insert buttons 116 * 117 * @param DOMElement btn Button element to add the action to 118 * @param array props Associative array of button properties 119 * @param string edid ID of the editor textarea 120 * @author Gabriel Birke <birke@d-scribe.de> 121 * @author Andreas Gohr <andi@splitbrain.org> 122 */ 123function tb_insert(btn, props, edid) { 124 insertAtCarret(edid,fixtxt(props['insert'])); 125 pickerClose(); 126} 127 128 129/** 130 * Add button action for picker buttons and create picker element 131 * 132 * @param DOMElement btn Button element to add the action to 133 * @param array props Associative array of button properties 134 * @param string edid ID of the editor textarea 135 * @return boolean If button should be appended 136 * @author Gabriel Birke <birke@d-scribe.de> 137 */ 138function addBtnActionPicker(btn, props, edid) { 139 var pickerid = 'picker'+(pickercounter++); 140 createPicker(pickerid, props, edid); 141 addEvent(btn,'click',function(){ 142 pickerToggle(pickerid,btn); 143 return false; 144 }); 145 return true; 146} 147 148/** 149 * Show/Hide a previosly created picker window 150 * 151 * @author Andreas Gohr <andi@splitbrain.org> 152 */ 153function pickerToggle(pickerid,btn){ 154 var picker = $(pickerid); 155 if(picker.style.display == 'none'){ 156 var x = findPosX(btn); 157 var y = findPosY(btn); 158 picker.style.display = 'block'; 159 picker.style.left = (x+3)+'px'; 160 picker.style.top = (y+btn.offsetHeight+3)+'px'; 161 }else{ 162 picker.style.display = 'none'; 163 } 164} 165 166/** 167 * Close all open pickers 168 * 169 * @author Andreas Gohr <andi@splitbrain.org> 170 */ 171function pickerClose(){ 172 var pobjs = getElementsByClass('picker'); 173 for(var i=0; i<pobjs.length; i++){ 174 pobjs[i].style.display = 'none'; 175 } 176} 177 178 179/** 180 * Replaces \n with linebreaks 181 */ 182function fixtxt(str){ 183 return str.replace(/\\n/g,"\n"); 184} 185 186