PageRenderTime 51ms CodeModel.GetById 35ms app.highlight 12ms RepoModel.GetById 1ms app.codeStats 1ms

/pigeoncms/Plugins/fckeditor/editor/_source/classes/fckspecialcombo.js

http://pigeoncms.googlecode.com/
JavaScript | 376 lines | 242 code | 64 blank | 70 comment | 42 complexity | b4c640abb1c00f613c23276c4e596cd6 MD5 | raw file
  1/*
  2 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
  3 * Copyright (C) 2003-2009 Frederico Caldeira Knabben
  4 *
  5 * == BEGIN LICENSE ==
  6 *
  7 * Licensed under the terms of any of the following licenses at your
  8 * choice:
  9 *
 10 *  - GNU General Public License Version 2 or later (the "GPL")
 11 *    http://www.gnu.org/licenses/gpl.html
 12 *
 13 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
 14 *    http://www.gnu.org/licenses/lgpl.html
 15 *
 16 *  - Mozilla Public License Version 1.1 or later (the "MPL")
 17 *    http://www.mozilla.org/MPL/MPL-1.1.html
 18 *
 19 * == END LICENSE ==
 20 *
 21 * FCKSpecialCombo Class: represents a special combo.
 22 */
 23
 24var FCKSpecialCombo = function( caption, fieldWidth, panelWidth, panelMaxHeight, parentWindow )
 25{
 26	// Default properties values.
 27	this.FieldWidth		= fieldWidth || 100 ;
 28	this.PanelWidth		= panelWidth || 150 ;
 29	this.PanelMaxHeight	= panelMaxHeight || 150 ;
 30	this.Label			= ' ' ;
 31	this.Caption		= caption ;
 32	this.Tooltip		= caption ;
 33	this.Style			= FCK_TOOLBARITEM_ICONTEXT ;
 34
 35	this.Enabled = true ;
 36
 37	this.Items = new Object() ;
 38
 39	this._Panel = new FCKPanel( parentWindow || window ) ;
 40	this._Panel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
 41	this._PanelBox = this._Panel.MainNode.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
 42	this._PanelBox.className = 'SC_Panel' ;
 43	this._PanelBox.style.width = this.PanelWidth + 'px' ;
 44
 45	this._PanelBox.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>' ;
 46
 47	this._ItemsHolderEl = this._PanelBox.getElementsByTagName('TD')[0] ;
 48
 49	if ( FCK.IECleanup )
 50		FCK.IECleanup.AddItem( this, FCKSpecialCombo_Cleanup ) ;
 51
 52//	this._Panel.StyleSheet = FCKConfig.SkinPath + 'fck_contextmenu.css' ;
 53//	this._Panel.Create() ;
 54//	this._Panel.PanelDiv.className += ' SC_Panel' ;
 55//	this._Panel.PanelDiv.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>' ;
 56//	this._ItemsHolderEl = this._Panel.PanelDiv.getElementsByTagName('TD')[0] ;
 57}
 58
 59function FCKSpecialCombo_ItemOnMouseOver()
 60{
 61	this.className += ' SC_ItemOver' ;
 62}
 63
 64function FCKSpecialCombo_ItemOnMouseOut()
 65{
 66	this.className = this.originalClass ;
 67}
 68
 69function FCKSpecialCombo_ItemOnClick( ev, specialCombo, itemId )
 70{
 71	this.className = this.originalClass ;
 72
 73	specialCombo._Panel.Hide() ;
 74
 75	specialCombo.SetLabel( this.FCKItemLabel ) ;
 76
 77	if ( typeof( specialCombo.OnSelect ) == 'function' )
 78		specialCombo.OnSelect( itemId, this ) ;
 79}
 80
 81FCKSpecialCombo.prototype.ClearItems = function ()
 82{
 83	if ( this.Items )
 84		this.Items = {} ;
 85
 86	var itemsholder = this._ItemsHolderEl ;
 87	while ( itemsholder.firstChild )
 88		itemsholder.removeChild( itemsholder.firstChild ) ;
 89}
 90
 91FCKSpecialCombo.prototype.AddItem = function( id, html, label, bgColor )
 92{
 93	// <div class="SC_Item" onmouseover="this.className='SC_Item SC_ItemOver';" onmouseout="this.className='SC_Item';"><b>Bold 1</b></div>
 94	var oDiv = this._ItemsHolderEl.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
 95	oDiv.className = oDiv.originalClass = 'SC_Item' ;
 96	oDiv.innerHTML = html ;
 97	oDiv.FCKItemLabel = label || id ;
 98	oDiv.Selected = false ;
 99
100	// In IE, the width must be set so the borders are shown correctly when the content overflows.
101	if ( FCKBrowserInfo.IsIE )
102		oDiv.style.width = '100%' ;
103
104	if ( bgColor )
105		oDiv.style.backgroundColor = bgColor ;
106
107	FCKTools.AddEventListenerEx( oDiv, 'mouseover', FCKSpecialCombo_ItemOnMouseOver ) ;
108	FCKTools.AddEventListenerEx( oDiv, 'mouseout', FCKSpecialCombo_ItemOnMouseOut ) ;
109	FCKTools.AddEventListenerEx( oDiv, 'click', FCKSpecialCombo_ItemOnClick, [ this, id ] ) ;
110
111	this.Items[ id.toString().toLowerCase() ] = oDiv ;
112
113	return oDiv ;
114}
115
116FCKSpecialCombo.prototype.SelectItem = function( item )
117{
118	if ( typeof item == 'string' )
119		item = this.Items[ item.toString().toLowerCase() ] ;
120
121	if ( item )
122	{
123		item.className = item.originalClass = 'SC_ItemSelected' ;
124		item.Selected = true ;
125	}
126}
127
128FCKSpecialCombo.prototype.SelectItemByLabel = function( itemLabel, setLabel )
129{
130	for ( var id in this.Items )
131	{
132		var oDiv = this.Items[id] ;
133
134		if ( oDiv.FCKItemLabel == itemLabel )
135		{
136			oDiv.className = oDiv.originalClass = 'SC_ItemSelected' ;
137			oDiv.Selected = true ;
138
139			if ( setLabel )
140				this.SetLabel( itemLabel ) ;
141		}
142	}
143}
144
145FCKSpecialCombo.prototype.DeselectAll = function( clearLabel )
146{
147	for ( var i in this.Items )
148	{
149		if ( !this.Items[i] ) continue;
150		this.Items[i].className = this.Items[i].originalClass = 'SC_Item' ;
151		this.Items[i].Selected = false ;
152	}
153
154	if ( clearLabel )
155		this.SetLabel( '' ) ;
156}
157
158FCKSpecialCombo.prototype.SetLabelById = function( id )
159{
160	id = id ? id.toString().toLowerCase() : '' ;
161
162	var oDiv = this.Items[ id ] ;
163	this.SetLabel( oDiv ? oDiv.FCKItemLabel : '' ) ;
164}
165
166FCKSpecialCombo.prototype.SetLabel = function( text )
167{
168	text = ( !text || text.length == 0 ) ? '&nbsp;' : text ;
169
170	if ( text == this.Label )
171		return ;
172
173	this.Label = text ;
174
175	var labelEl = this._LabelEl ;
176	if ( labelEl )
177	{
178		labelEl.innerHTML = text ;
179
180		// It may happen that the label is some HTML, including tags. This
181		// would be a problem because when the user click on those tags, the
182		// combo will get the selection from the editing area. So we must
183		// disable any kind of selection here.
184		FCKTools.DisableSelection( labelEl ) ;
185	}
186}
187
188FCKSpecialCombo.prototype.SetEnabled = function( isEnabled )
189{
190	this.Enabled = isEnabled ;
191
192	// In IE it can happen when the page is reloaded that _OuterTable is null, so check its existence
193	if ( this._OuterTable )
194		this._OuterTable.className = isEnabled ? '' : 'SC_FieldDisabled' ;
195}
196
197FCKSpecialCombo.prototype.Create = function( targetElement )
198{
199	var oDoc = FCKTools.GetElementDocument( targetElement ) ;
200	var eOuterTable = this._OuterTable = targetElement.appendChild( oDoc.createElement( 'TABLE' ) ) ;
201	eOuterTable.cellPadding = 0 ;
202	eOuterTable.cellSpacing = 0 ;
203
204	eOuterTable.insertRow(-1) ;
205
206	var sClass ;
207	var bShowLabel ;
208
209	switch ( this.Style )
210	{
211		case FCK_TOOLBARITEM_ONLYICON :
212			sClass = 'TB_ButtonType_Icon' ;
213			bShowLabel = false;
214			break ;
215		case FCK_TOOLBARITEM_ONLYTEXT :
216			sClass = 'TB_ButtonType_Text' ;
217			bShowLabel = false;
218			break ;
219		case FCK_TOOLBARITEM_ICONTEXT :
220			bShowLabel = true;
221			break ;
222	}
223
224	if ( this.Caption && this.Caption.length > 0 && bShowLabel )
225	{
226		var oCaptionCell = eOuterTable.rows[0].insertCell(-1) ;
227		oCaptionCell.innerHTML = this.Caption ;
228		oCaptionCell.className = 'SC_FieldCaption' ;
229	}
230
231	// Create the main DIV element.
232	var oField = FCKTools.AppendElement( eOuterTable.rows[0].insertCell(-1), 'div' ) ;
233	if ( bShowLabel )
234	{
235		oField.className = 'SC_Field' ;
236		oField.style.width = this.FieldWidth + 'px' ;
237		oField.innerHTML = '<table width="100%" cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldLabel"><label>&nbsp;</label></td><td class="SC_FieldButton">&nbsp;</td></tr></tbody></table>' ;
238
239		this._LabelEl = oField.getElementsByTagName('label')[0] ;		// Memory Leak
240		this._LabelEl.innerHTML = this.Label ;
241	}
242	else
243	{
244		oField.className = 'TB_Button_Off' ;
245		//oField.innerHTML = '<span className="SC_FieldCaption">' + this.Caption + '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;">&nbsp;</td></tr></tbody></table>' ;
246		//oField.innerHTML = '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;">&nbsp;</td></tr></tbody></table>' ;
247
248		// Gets the correct CSS class to use for the specified style (param).
249		oField.innerHTML = '<table title="' + this.Tooltip + '" class="' + sClass + '" cellspacing="0" cellpadding="0" border="0">' +
250				'<tr>' +
251					//'<td class="TB_Icon"><img src="' + FCKConfig.SkinPath + 'toolbar/' + this.Command.Name.toLowerCase() + '.gif" width="21" height="21"></td>' +
252					'<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
253					'<td class="TB_Text">' + this.Caption + '</td>' +
254					'<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
255					'<td class="TB_ButtonArrow"><img src="' + FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif" width="5" height="3"></td>' +
256					'<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
257				'</tr>' +
258			'</table>' ;
259	}
260
261
262	// Events Handlers
263
264	FCKTools.AddEventListenerEx( oField, 'mouseover', FCKSpecialCombo_OnMouseOver, this ) ;
265	FCKTools.AddEventListenerEx( oField, 'mouseout', FCKSpecialCombo_OnMouseOut, this ) ;
266	FCKTools.AddEventListenerEx( oField, 'click', FCKSpecialCombo_OnClick, this ) ;
267
268	FCKTools.DisableSelection( this._Panel.Document.body ) ;
269}
270
271function FCKSpecialCombo_Cleanup()
272{
273	this._LabelEl = null ;
274	this._OuterTable = null ;
275	this._ItemsHolderEl = null ;
276	this._PanelBox = null ;
277
278	if ( this.Items )
279	{
280		for ( var key in this.Items )
281			this.Items[key] = null ;
282	}
283}
284
285function FCKSpecialCombo_OnMouseOver( ev, specialCombo )
286{
287	if ( specialCombo.Enabled )
288	{
289		switch ( specialCombo.Style )
290		{
291			case FCK_TOOLBARITEM_ONLYICON :
292				this.className = 'TB_Button_On_Over';
293				break ;
294			case FCK_TOOLBARITEM_ONLYTEXT :
295				this.className = 'TB_Button_On_Over';
296				break ;
297			case FCK_TOOLBARITEM_ICONTEXT :
298				this.className = 'SC_Field SC_FieldOver' ;
299				break ;
300		}
301	}
302}
303
304function FCKSpecialCombo_OnMouseOut( ev, specialCombo )
305{
306	switch ( specialCombo.Style )
307	{
308		case FCK_TOOLBARITEM_ONLYICON :
309			this.className = 'TB_Button_Off';
310			break ;
311		case FCK_TOOLBARITEM_ONLYTEXT :
312			this.className = 'TB_Button_Off';
313			break ;
314		case FCK_TOOLBARITEM_ICONTEXT :
315			this.className='SC_Field' ;
316			break ;
317	}
318}
319
320function FCKSpecialCombo_OnClick( e, specialCombo )
321{
322	// For Mozilla we must stop the event propagation to avoid it hiding
323	// the panel because of a click outside of it.
324//	if ( e )
325//	{
326//		e.stopPropagation() ;
327//		FCKPanelEventHandlers.OnDocumentClick( e ) ;
328//	}
329
330	if ( specialCombo.Enabled )
331	{
332		var oPanel			= specialCombo._Panel ;
333		var oPanelBox		= specialCombo._PanelBox ;
334		var oItemsHolder	= specialCombo._ItemsHolderEl ;
335		var iMaxHeight		= specialCombo.PanelMaxHeight ;
336
337		if ( specialCombo.OnBeforeClick )
338			specialCombo.OnBeforeClick( specialCombo ) ;
339
340		// This is a tricky thing. We must call the "Load" function, otherwise
341		// it will not be possible to retrieve "oItemsHolder.offsetHeight" (IE only).
342		if ( FCKBrowserInfo.IsIE )
343			oPanel.Preload( 0, this.offsetHeight, this ) ;
344
345		if ( oItemsHolder.offsetHeight > iMaxHeight )
346//		{
347			oPanelBox.style.height = iMaxHeight + 'px' ;
348
349//			if ( FCKBrowserInfo.IsGecko )
350//				oPanelBox.style.overflow = '-moz-scrollbars-vertical' ;
351//		}
352		else
353			oPanelBox.style.height = '' ;
354
355//		oPanel.PanelDiv.style.width = specialCombo.PanelWidth + 'px' ;
356
357		oPanel.Show( 0, this.offsetHeight, this ) ;
358	}
359
360//	return false ;
361}
362
363/*
364Sample Combo Field HTML output:
365
366<div class="SC_Field" style="width: 80px;">
367	<table width="100%" cellpadding="0" cellspacing="0" style="table-layout: fixed;">
368		<tbody>
369			<tr>
370				<td class="SC_FieldLabel"><label>&nbsp;</label></td>
371				<td class="SC_FieldButton">&nbsp;</td>
372			</tr>
373		</tbody>
374	</table>
375</div>
376*/