/* * FCKeditor - The text editor for internet * Copyright (C) 2003-2006 Frederico Caldeira Knabben * * Licensed under the terms of the GNU Lesser General Public License: * http://www.opensource.org/licenses/lgpl-license.php * * For further information visit: * http://www.fckeditor.net/ * * "Support Open Source software. What about a donation today?" * * File Name: fckspecialcombo.js * FCKSpecialCombo Class: represents a special combo. * * File Authors: * Frederico Caldeira Knabben (fredck@fckeditor.net) */ var FCKSpecialCombo = function( caption, fieldWidth, panelWidth, panelMaxHeight, parentWindow ) { // Default properties values. this.FieldWidth = fieldWidth || 100 ; this.PanelWidth = panelWidth || 150 ; this.PanelMaxHeight = panelMaxHeight || 150 ; this.Label = ' ' ; this.Caption = caption ; this.Tooltip = caption ; this.Style = FCK_TOOLBARITEM_ICONTEXT ; this.Enabled = true ; this.Items = new Object() ; this._Panel = new FCKPanel( parentWindow || window, true ) ; this._Panel.AppendStyleSheet( FCKConfig.SkinPath + 'fck_editor.css' ) ; this._PanelBox = this._Panel.MainNode.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ; this._PanelBox.className = 'SC_Panel' ; this._PanelBox.style.width = this.PanelWidth + 'px' ; this._PanelBox.innerHTML = '
' ; this._ItemsHolderEl = this._PanelBox.getElementsByTagName('TD')[0] ; if ( FCK.IECleanup ) FCK.IECleanup.AddItem( this, FCKSpecialCombo_Cleanup ) ; // this._Panel.StyleSheet = FCKConfig.SkinPath + 'fck_contextmenu.css' ; // this._Panel.Create() ; // this._Panel.PanelDiv.className += ' SC_Panel' ; // this._Panel.PanelDiv.innerHTML = '
' ; // this._ItemsHolderEl = this._Panel.PanelDiv.getElementsByTagName('TD')[0] ; } function FCKSpecialCombo_ItemOnMouseOver() { this.className += ' SC_ItemOver' ; } function FCKSpecialCombo_ItemOnMouseOut() { this.className = this.originalClass ; } function FCKSpecialCombo_ItemOnClick() { this.className = this.originalClass ; this.FCKSpecialCombo._Panel.Hide() ; this.FCKSpecialCombo.SetLabel( this.FCKItemLabel ) ; if ( typeof( this.FCKSpecialCombo.OnSelect ) == 'function' ) this.FCKSpecialCombo.OnSelect( this.FCKItemID, this ) ; } FCKSpecialCombo.prototype.AddItem = function( id, html, label, bgColor ) { //
Bold 1
var oDiv = this._ItemsHolderEl.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ; oDiv.className = oDiv.originalClass = 'SC_Item' ; oDiv.innerHTML = html ; oDiv.FCKItemID = id ; oDiv.FCKItemLabel = label || id ; oDiv.FCKSpecialCombo = this ; oDiv.Selected = false ; // In IE, the width must be set so the borders are shown correctly when the content overflows. if ( FCKBrowserInfo.IsIE ) oDiv.style.width = '100%' ; if ( bgColor ) oDiv.style.backgroundColor = bgColor ; oDiv.onmouseover = FCKSpecialCombo_ItemOnMouseOver ; oDiv.onmouseout = FCKSpecialCombo_ItemOnMouseOut ; oDiv.onclick = FCKSpecialCombo_ItemOnClick ; this.Items[ id.toString().toLowerCase() ] = oDiv ; return oDiv ; } FCKSpecialCombo.prototype.SelectItem = function( itemId ) { itemId = itemId ? itemId.toString().toLowerCase() : '' ; var oDiv = this.Items[ itemId ] ; if ( oDiv ) { oDiv.className = oDiv.originalClass = 'SC_ItemSelected' ; oDiv.Selected = true ; } } FCKSpecialCombo.prototype.SelectItemByLabel = function( itemLabel, setLabel ) { for ( var id in this.Items ) { var oDiv = this.Items[id] ; if ( oDiv.FCKItemLabel == itemLabel ) { oDiv.className = oDiv.originalClass = 'SC_ItemSelected' ; oDiv.Selected = true ; if ( setLabel ) this.SetLabel( itemLabel ) ; } } } FCKSpecialCombo.prototype.DeselectAll = function( clearLabel ) { for ( var i in this.Items ) { this.Items[i].className = this.Items[i].originalClass = 'SC_Item' ; this.Items[i].Selected = false ; } if ( clearLabel ) this.SetLabel( '' ) ; } FCKSpecialCombo.prototype.SetLabelById = function( id ) { id = id ? id.toString().toLowerCase() : '' ; var oDiv = this.Items[ id ] ; this.SetLabel( oDiv ? oDiv.FCKItemLabel : '' ) ; } FCKSpecialCombo.prototype.SetLabel = function( text ) { this.Label = text.length == 0 ? ' ' : text ; if ( this._LabelEl ) this._LabelEl.innerHTML = this.Label ; } FCKSpecialCombo.prototype.SetEnabled = function( isEnabled ) { this.Enabled = isEnabled ; this._OuterTable.className = isEnabled ? '' : 'SC_FieldDisabled' ; } FCKSpecialCombo.prototype.Create = function( targetElement ) { var oDoc = FCKTools.GetElementDocument( targetElement ) ; var eOuterTable = this._OuterTable = targetElement.appendChild( oDoc.createElement( 'TABLE' ) ) ; eOuterTable.cellPadding = 0 ; eOuterTable.cellSpacing = 0 ; eOuterTable.insertRow(-1) ; var sClass ; var bShowLabel ; switch ( this.Style ) { case FCK_TOOLBARITEM_ONLYICON : sClass = 'TB_ButtonType_Icon' ; bShowLabel = false; break ; case FCK_TOOLBARITEM_ONLYTEXT : sClass = 'TB_ButtonType_Text' ; bShowLabel = false; break ; case FCK_TOOLBARITEM_ICONTEXT : bShowLabel = true; break ; } if ( this.Caption && this.Caption.length > 0 && bShowLabel ) { var oCaptionCell = eOuterTable.rows[0].insertCell(-1) ; oCaptionCell.innerHTML = this.Caption ; oCaptionCell.className = 'SC_FieldCaption' ; } // Create the main DIV element. var oField = FCKTools.AppendElement( eOuterTable.rows[0].insertCell(-1), 'div' ) ; if ( bShowLabel ) { oField.className = 'SC_Field' ; oField.style.width = this.FieldWidth + 'px' ; oField.innerHTML = '
 
' ; this._LabelEl = oField.getElementsByTagName('label')[0] ; // Memory Leak this._LabelEl.innerHTML = this.Label ; } else { oField.className = 'TB_Button_Off' ; //oField.innerHTML = '' + this.Caption + '
 
' ; //oField.innerHTML = '
 
' ; // Gets the correct CSS class to use for the specified style (param). oField.innerHTML = '' + '' + //'' + '' + '' + '' + '' + '' + '' + '
' + this.Caption + '
' ; } // Events Handlers oField.SpecialCombo = this ; oField.onmouseover = FCKSpecialCombo_OnMouseOver ; oField.onmouseout = FCKSpecialCombo_OnMouseOut ; oField.onclick = FCKSpecialCombo_OnClick ; FCKTools.DisableSelection( this._Panel.Document.body ) ; } function FCKSpecialCombo_Cleanup() { this._LabelEl = null ; this._OuterTable = null ; this._ItemsHolderEl = null ; this._PanelBox = null ; if ( this.Items ) { for ( var key in this.Items ) this.Items[key] = null ; } } function FCKSpecialCombo_OnMouseOver() { if ( this.SpecialCombo.Enabled ) { switch ( this.SpecialCombo.Style ) { case FCK_TOOLBARITEM_ONLYICON : this.className = 'TB_Button_On_Over'; break ; case FCK_TOOLBARITEM_ONLYTEXT : this.className = 'TB_Button_On_Over'; break ; case FCK_TOOLBARITEM_ICONTEXT : this.className = 'SC_Field SC_FieldOver' ; break ; } } } function FCKSpecialCombo_OnMouseOut() { switch ( this.SpecialCombo.Style ) { case FCK_TOOLBARITEM_ONLYICON : this.className = 'TB_Button_Off'; break ; case FCK_TOOLBARITEM_ONLYTEXT : this.className = 'TB_Button_Off'; break ; case FCK_TOOLBARITEM_ICONTEXT : this.className='SC_Field' ; break ; } } function FCKSpecialCombo_OnClick( e ) { // For Mozilla we must stop the event propagation to avoid it hiding // the panel because of a click outside of it. // if ( e ) // { // e.stopPropagation() ; // FCKPanelEventHandlers.OnDocumentClick( e ) ; // } var oSpecialCombo = this.SpecialCombo ; if ( oSpecialCombo.Enabled ) { var oPanel = oSpecialCombo._Panel ; var oPanelBox = oSpecialCombo._PanelBox ; var oItemsHolder = oSpecialCombo._ItemsHolderEl ; var iMaxHeight = oSpecialCombo.PanelMaxHeight ; if ( oSpecialCombo.OnBeforeClick ) oSpecialCombo.OnBeforeClick( oSpecialCombo ) ; // This is a tricky thing. We must call the "Load" function, otherwise // it will not be possible to retrieve "oItemsHolder.offsetHeight" (IE only). if ( FCKBrowserInfo.IsIE ) oPanel.Preload( 0, this.offsetHeight, this ) ; if ( oItemsHolder.offsetHeight > iMaxHeight ) // { oPanelBox.style.height = iMaxHeight + 'px' ; // if ( FCKBrowserInfo.IsGecko ) // oPanelBox.style.overflow = '-moz-scrollbars-vertical' ; // } else oPanelBox.style.height = '' ; // oPanel.PanelDiv.style.width = oSpecialCombo.PanelWidth + 'px' ; oPanel.Show( 0, this.offsetHeight, this ) ; } // return false ; } /* Sample Combo Field HTML output:
 
*/