// Copyright (c) 2003, 2004 Four J's Development Tools.
// All Rights Reserved.
// Note that the modification of this file is not supported.
// For customizing with your own javascript and cascading style sheets
// please read the product documentation.
//
// $Id: genero.js,v 1.246.2.2 2007/10/29 16:49:19 ff Exp $
function DisabledBehabior( w ) {
gDetour( w, 'AppendElement', function( e ) {
gDetourCall();
e.disabled = false;
} );
w.enable = function( set ) {
w.elt.readOnly = !set;
gSetEvent.call( w, w.elt, gFOCUS_EVENT, w.HandleFocus, set && !w.state.currentField );
gSetClass( w.elt, 'disabled', !set );
}
w.Finalize = function() {
gRemoveEvents( w.elt );
}
}
function EditWrapper( w ) {
gDefaultFieldBehavior(w);
gNumAlignBehavior(w);
gAutonextBehavior(w);
DisabledBehabior(w);
gTypeCheckBehabior(w);
w.Focus = function() {
gSafeFocus(w.elt);
gSafeSelect(w.elt);
//w.elt.select();
}
w.Blur = function() {
gUnSelectField( w.elt );
gSafeBlur(w.elt);
}
}
gRegisterWrapper( EditWrapper, gBY_ELEMENT_CLASS, 'gEdit', gElementName, gInitFieldWrapper, 'field' );
function ButtonEditWrapper( w ) {
gDefaultFieldBehavior(w);
gAutonextBehavior(w);
DisabledBehabior(w);
gTypeCheckBehabior(w);
w.justify = gDefaultFieldBehavior.justify;
w.Focus = function() {
gSafeFocus(w.elt);
gSafeSelect(w.elt);
}
w.Blur = function() {
gUnSelectField(w.elt);
gSafeBlur(w.elt);
}
function sendFocus() {
if ( w.state.enable )
w.eventSink.Focus(w);
}
gDetour( w, 'currentField', function(set) {
gSetClass( w.elt.parentNode, 'activeButtonEdit', set );
gDetourCall();
}	);
function setEventToAction() {
gAddEvent( gNextSibling(w.elt), 'mousedown', sendFocus );
}
gDetour( w, 'AppendElement', function() {
gDetourCall();
g_state.Add('afterWrap', function() { setEventToAction(); this.Remove() });
} );
gDetour( w, 'Finalize', function() {
gDetourCall();
var next = gNextSibling(w.elt);
next &&	gRemoveEvents( next );
} );
}
gRegisterWrapper( ButtonEditWrapper, gBY_ELEMENT_CLASS, 'gButtonEdit', gElementName, gInitFieldWrapper, 'field' );
function TexteditWrapper( w ) {
gDefaultFieldBehavior(w);
DisabledBehabior(w);
gTypeCheckBehabior(w);
gDetour( w, 'enable', function( set ) {
gDetourCall();
gSetEvent( w.elt, g_KeyEvent, OnKey, set );
gSetEvent( w.elt, 'keypress', OnKey1, set );
} );
gDetour( w, 'AppendElement', function() {
gDetourCall();
} );
function OnKey1( event ) {
var maxLength = w.elt.getAttribute('maxlength');
if ( maxLength != undefined && w.elt.value.length >= maxLength && event.keyCode == 0 )
gEventHandled( event );
//gEventPreventDefault( event );
}
function OnKey( event ) {
//TRACE.Write( event.charCode );
var maxLength = w.elt.getAttribute('maxlength');
//gEventPreventDefault( event );
if ( w.state.wantReturns && event.keyCode == 13 )
gEventStopPropagation( event );
if ( w.state.wantTabs && event.keyCode == 9 ) {
gTextPast( w.elt, '\t' );
gEventHandled( event );
}
}
}
gRegisterWrapper( TexteditWrapper, gBY_ELEMENT_CLASS, 'gTextEdit', gElementName, gInitFieldWrapper, 'field' );
function DateeditWrapper( w ) {
if ( typeof(_calendar) == 'undefined' )
_calendar = new Calendar( gIdToElement('gDBDate').value, gLocalFirstDayOfTheWeek() );
var _anchor;
gDefaultFieldBehavior(w);
DisabledBehabior(w);
function OnIconClick() {
_calendar.OnChange( function(value) { w.elt.value = value; } );
_calendar.ParseDate( w.elt.value );
var calElt = _calendar.Element();
calElt.style.display = calElt.style.display == '' ? 'none' : '';
}
function ShowCalendarButton( set ) {
if ( !DateeditWrapper.icon )
DateeditWrapper.icon = gCreateElement('SPAN', { className:'calendarIcon', style:{ position:'relative' } } );
if ( set ) {
_anchor.appendChild( DateeditWrapper.icon );
DateeditWrapper.icon.style.left = -w.elt.offsetHeight;
DateeditWrapper.icon.style.width = DateeditWrapper.icon.style.height = w.elt.offsetHeight;
DateeditWrapper.icon.style.display = 'block';
} else {
gRemoveElement( DateeditWrapper.icon );
w.elt.style.borderRightStyle = '';
w.elt.style.borderRightWidth = '';
}
gSetEvent( DateeditWrapper.icon, 'mousedown', OnIconClick, set );
if ( set )
_anchor.appendChild( _calendar.Element() ).style.left = -w.elt.offsetWidth;
else
gRemoveElement( _calendar.Element() ).style.display = 'none';
}
gDetour( w, 'AppendElement', function( e ) {
gDetourCall();
_anchor = gInsertAfter( gCreateElement( 'SPAN', { style:{ position:'absolute', textAlign:'left' } } ), e );
} );
gDetour( w, 'currentField', function( set ) {
gDetourCall();
ShowCalendarButton( set );
} );
w.Focus = function() {
gSafeFocus(w.elt);
gSafeSelect(w.elt);
}
w.Blur = function() {
gUnSelectField( w.elt );
gSafeBlur(w.elt);
}
w.Finalize = function() {
DateeditWrapper.icon && gRemoveEvents( DateeditWrapper.icon );
}
}
gRegisterWrapper( DateeditWrapper, gBY_ELEMENT_CLASS, 'gDateEdit', gElementName, gInitFieldWrapper, 'field' );
function gInitComboboxWrapper( w, e, s ) {
gInitFieldWrapper( w, e, s );
}
function ComboboxWrapper( w ) {
var _api = {};
var _combobox = new ComboboxWidget(_api);
_api.OnFocus = function() {
if ( !w.state.currentField && w.state.enable ) {
w.eventSink.Focus(w);
}
}
_api.OnSelect = function( key, value, index ) {
_combobox.UnselectAll();
_combobox.SelectByIndex( index, true );
_combobox.SetText( value );
_combobox.ListShow( false );
w.state.onChange &&	w.eventSink.Changed( w );
}
_api.OnShow = function( set, source ) {
if ( w.state.query && set && source == 2 )
return;
_combobox.ListShow( w.state.currentField && w.state.enable && set );
}
_api.OnSourceRead = function() {
gLazyRemove( w.srcElt );
}
w.GetValue = function() {
var val = '';
_combobox.ForeachSelected( function( k ) { val = k; } );
if ( w.state.query ) {
var text = _combobox.GetText();
var id = _combobox.KeyByValue(text);
if ( id )
return id;
if ( text )
val = text;
else
_combobox.SetText( val );
}
return val;
}
w.value = function(key) {
_combobox.UnselectAll();
var index = _combobox.IndexByKey(key);
if ( index != undefined ) {
_combobox.SelectByIndex( index , true );
_combobox.SetText( _combobox.ValueByKey(key) );
} else {
if ( w.state.query )
_combobox.SetText( key );
else {
_combobox.UnselectAll();
_combobox.SetText( '' );
}
}
}
function HandleTab( key, shift ) {
w.eventSink.Next(shift);
}
function HandleEnter( key, shift ) {
w.eventSink.Action('accept');
}
w.currentField = function(set) {
g_keyManager.Set( set, HandleTab, 9 );
g_keyManager.Set( set, HandleEnter, 13 );
g_keyManager.Set.call( this, set, gDefaultFieldBehavior.HandleNav, 38, 40 );
_combobox.SetClass( 'gCurrentField', set );
set || _combobox.ListShow( false );
set ? w.Focus() : w.Blur();
}
w.Blur = function () { _combobox.Blur() }
w.Focus = function() { _combobox.Focus() }
w.enable = function(set) {
_combobox.SetClass( 'disabled', !set );
}
w.query = function( set ) {
_combobox.SetEditable(set);
_combobox.SetClass( 'gQuery', set );
}
w.AppendElement = function( e ) {
w.srcElt = e;
var cb = _combobox.Create( new ComboboxFeedSelect(e) );
var key = _combobox.KeyByValue( '#INVALID_VALUE!' );
key && _combobox.RemoveByIndex( _combobox.IndexByKey( key ) );
_combobox.EditSize( _combobox.MaxLength() );
_combobox.ToolTip( e.title );
w.elt = gInsertBefore( cb, e );
var tmp = e.className;
e.className.className = '';
w.elt.className = tmp;
}
gDetour( w, 'Finalize', function() {
_combobox.Finalize();
gDetourCall();
} );
}
gRegisterWrapper( ComboboxWrapper, gBY_ELEMENT_CLASS, 'gComboBox', gElementName, gInitComboboxWrapper, 'field' );
gAppendCssRule( g_styleSheet, 'SELECT.gComboBox', 'display:none' );
function RadiogroupInternal( _update ) {
var _options = [];
this.Add = function( key, value, userdata ) {
return (_options[key] = { value:value, selected:undefined, userdata:userdata });
}
this.IsSelected = function( key ) {
return _options[key].selected;
}
this.Select = function( key, set ) {
var option = _options[key];
if ( option && option.selected != set ) {
option.selected = set;
_update(option.userdata, set);
}
}
this.Refresh = function() {
for ( var k in _options ) {
var opt = _options[k];
_update(opt.userdata, opt.selected);
}
}
this.UnselectAll = function() {
for ( var k in _options )
this.Select( k, false );
}
this.FirstKey = function() {
for ( var k in _options )
return k;
}
this.FirstSelectedKey = function() {
for ( var k in _options )
if ( _options[k].selected )
return k;
}
this.UserData = function( key ) {
return _options[key].userdata;
}
this.Toggle = function( key ) {
this.Select( key, !_options[key].selected );
}
this.SelectKeys = function( keyList ) {
var remaining = [];
for ( var i in keyList ) {
var option = _options[keyList[i]];
if ( option ) {
if ( !option.selected )
this.Select( keyList[i], true );
} else
remaining.push( keyList[i] );
}
return remaining;
}
this.SelectedKeys = function() {
var selected = [];
for ( var k in _options )
if ( _options[k].selected )
selected.push(k);
return selected;
}
this.Foreach = function( fn ) {
for ( var k in _options ) {
var userdata = _options[k].userdata;
userdata && fn( userdata );
}
}
}
function RadiogroupWrapper( w ) {
gDefaultFieldBehavior(w);
var _radio = new RadiogroupInternal( _update );
function _update( optelt, set ) {
optelt.checked = set;
}
w.GetValue = function() {
return _radio.SelectedKeys().join('|');
}
w.value = function( data ) {
_radio.UnselectAll();
if ( _radio.SelectKeys( data ? data.split('|') : [] ).length > 0 ) {
_radio.UnselectAll();
return true;
}
}
function OnFocus( event ) {
if ( !w.state.currentField )
w.eventSink.Focus(w);
}
function OnClick( event ) {
if ( event.target.nodeName == 'INPUT' ) {
var key = event.target.value;
if ( w.state.currentField ) {
if ( w.state.query ) {
_radio.Toggle( key );
} else {
if ( _radio.IsSelected(key) ) {
if ( !w.state.notNull )
_radio.UnselectAll();
} else {
_radio.UnselectAll();
_radio.Toggle( key );
}
}
if ( w.state.onChange )
w.eventSink.Changed(w);
} else
_radio.Refresh();
}
}
w.enable = function( set ) {
_radio.Foreach( function(optelt) { optelt.disabled = !set; } );
gSetEvent( w.elt, 'mousedown', OnFocus, set );
gSetEvent( w.elt, 'click', OnClick, set );
}
w.Focus = function() {
gSafeFocus( _radio.UserData(_radio.FirstSelectedKey() || _radio.FirstKey()) );
}
w.Blur = gNoop;
w.AppendElement = function( e ) {
w.elt = gInsertBefore( gCreateElement( 'SPAN', { className:e.className, title:e.title } ), e );
for ( it = gFirstChild(e); it; it = gNextSibling(it) ) {
var key = it.value, value = it.text;
if ( value == '#INVALID_VALUE!' )
continue;
if ( key || value ) {
var box = w.elt.appendChild( gCreateElement('DIV') );
var radioElement = box.appendChild( gCreateElement('INPUT', { type:'radio', tabIndex:-1, value:key } ) );
gAppendTextNode( box.appendChild( gCreateElement( 'LABEL' ) ), value );
_radio.Add( key, value, radioElement );
}
}
}
}
gAppendCssRule( g_styleSheet, 'SELECT.gRadioGroup', 'display:none' );
gRegisterWrapper( RadiogroupWrapper, gBY_ELEMENT_CLASS, 'gRadioGroup', gElementName, gInitFieldWrapper, 'field' );
function CheckboxWrapper( w ) {
gDefaultFieldBehavior(w);
DisabledBehabior(w);
var _valueList = [], _selected, _cb, _label;
w.Focus = gNoop;
w.Blur = gNoop;
function SendFocus() {
w.state.enable && !w.state.currentField && w.eventSink.Focus(w);
}
w.AppendElement = function( e ) {
for ( var it = gFirstChild(e); it; it = gNextSibling(it) )
_valueList.push(it.value);
if ( _valueList.length < 3 )
_valueList.unshift('');
_selected = e.selectedIndex;
if ( _selected < 0 )
_selected = 0;
_cb = gCreateElement( 'INPUT', { type:'text', className:e.className, readOnly:true, title:e.title } );
gInsertBefore( _cb, e );
_label = gNextSibling(e);
if ( _label ) {
gMakeUnselectable(_label, true);
gAddEvent( _label, 'mousedown', SendFocus );
gAddEvent( _label, 'mouseup', Toggle );
}
gAddEvent( _cb, 'mouseup', Toggle );
w.elt = _cb;
gLazyRemove( e );
}
function Toggle() {
if ( w.state.enable && w.state.currentField ) {
_selected = (_selected+1)%3;
_selected == 0 && w.state.notNull && _selected++;
syncCheckImage();
w.state.onChange &&	w.eventSink.Changed( w );
}
}
gDetour( w, 'Finalize', function() {
_label && gRemoveEvents( _label );
gDetourCall();
} );
gDetour( w, 'currentField', function( set ) {
g_keyManager.Set( set, Toggle, 32 );
gDetourCall();
} );
function syncCheckImage() {
gSetClass( _cb, 'nullState', _selected == 0 );
gSetClass( _cb, 'checkedState', _selected == 1 );
gSetClass( _cb, 'uncheckedState', _selected == 2 );
}
gDetour( w, 'enable', function( set ) {
gDetourCall();
_cb.readOnly = true;
} );
w.value = function( value ) {
for ( var i = 0; i < _valueList.length; ++i )
if ( _valueList[i] == value )
_selected = i;
syncCheckImage();
}
w.GetValue = function() {
return _valueList[_selected];
}
}
gAppendCssRule( g_styleSheet, 'SELECT.gCheckbox', 'display:none' );
gRegisterWrapper( CheckboxWrapper, gBY_ELEMENT_CLASS, 'gCheckBox', gElementName, gInitFieldWrapper, 'field' );
function ActionWrapper( w ) {
w.eltList = [];
w.currentAction = function( set ) {
for ( var i in w.eltList )
gSetClass( w.eltList[i].parentNode, 'gCurrentAction', set );
}
w.enable = function( set ) {
for ( var i in w.eltList ) {
var elt = w.eltList[i];
elt.disabled = !set;
gSetEvent( elt, 'click', OnClick, set );
if ( elt.type == 'image' )
gGray( elt, !set );
}
}
w.RemoveElement = function( e ) {
for ( var i in w.eltList )
if ( w.eltList[i] == e ) {
w.eltList.splice( i,1 );
break;
}
return w.eltList.length == 0;
}
w.AppendElement = function( e ) {
for ( var i in w.eltList ) {
if ( !w.eltList[i].parentNode ) {
gRemoveEvents( w.eltList[i] );
delete w.eltList[i];
}
}
if ( e.type == 'image' && !e.src ) {
e.style.display = 'none';
e = gInsertBefore( gCreateElement( 'INPUT', { type:'button', className:e.className + ' defaultButton', title:e.alt, name:e.name } ), e );
}
w.eltList.push(e);
}
function OnClick( event ) {
if ( w.eventSink.Action( event.currentTarget.name ) )
gEventHandled( event );
}
w.Finalize = function() {
for ( var it in w.eltList )
gRemoveEvents( w.eltList[it] );
}
}
gRegisterWrapper( ActionWrapper, gBY_ELEMENT_CLASS, 'gAction', function(e) { return 'action_' + e.name }, gInitActionWrapper, 'action' );
function ButtonWrapper( w ) {
var _pressed;
function onMouseDown( event ) {
if ( !gFirstChild(w.elt).disabled && !_pressed ) {
gAddClass( w.elt, 'pressedButton' );
_pressed = true;
}
}
function onMouseUp( event ) {
if ( !gFirstChild(w.elt).disabled && _pressed ) {
if ( event.target == w.elt )
gFirstChild(w.elt).click();
gRemoveClass( w.elt, 'pressedButton' );
_pressed = false;
}
}
function onMouseOut( event ) {
if ( !gFirstChild(w.elt).disabled && _pressed ) {
gRemoveClass( w.elt, 'pressedButton' );
_pressed = false;
}
}
w.AppendElement = function( e ) {
gAddEvent( e, 'mousedown', onMouseDown );
gAddEvent( e, 'mouseup', onMouseUp );
gAddEvent( e, 'mouseout', onMouseOut );
w.elt = e;
}
w.Finalize = function() {
gRemoveEvents(w.elt);
}
}
gRegisterWrapper( ButtonWrapper, gBY_ELEMENT_CLASS, 'gButtonBox', gElementId );
function TableHeaderWrapper( w ) {
w.enable = function( set ) {
gSetClass( w.elt, 'disabledTableHeader', !set );
}
w.sorted = function( direction ) {
gSetClass( w.elt, 'gSortAsc', direction == 'asc' );
gSetClass( w.elt, 'gSortDesc', direction == 'desc' );
}
function OnClick( event ) {
w.state.enable && w.eventSink.Misc( w.elt.name, w.elt.value );
gEventHandled( event );
}
w.AppendElement = function( e ) {
e.disabled = false;
gAddEvent( e, 'click', OnClick );
w.elt = e;
}
w.Finalize = function() {
gRemoveEvents(w.elt);
}
}
gRegisterWrapper( TableHeaderWrapper, gBY_ELEMENT_CLASS, 'gTableHeader', gElementName, gInitTableHeaderWrapper );
function TableWrapper( w ) {
var _scrollBar = new gScrollable( w );
w.AppendElement = function( elt ) {
_scrollBar.Create(elt);
gForEach( elt.tBodies[0].rows, function(e) {
gAddEvent( e, 'mousedown', OnClick );
gAddEvent( e, 'dblclick', OnDblClick );
} );
w.elt = elt;
}
function OnClick( event ) {
var row = event.currentTarget.sectionRowIndex;
if ( w.state.enabledSelection && row != w.state.currentRow && w.state.offset + row < w.state.size )
if ( w.eventSink.Select( w.info.selectorName, event.currentTarget.sectionRowIndex ) )
gEventHandled( event );
}
function OnDblClick( event ) {
if ( g_wrapperManager.Item('action_accept') && w.state.enabledSelection && w.state.offset + event.currentTarget.sectionRowIndex < w.state.size && w.eventSink.Action( 'accept' ) )
gEventHandled( event );
}
w.currentRow = function( row ) {
if ( w.state.currentRow != undefined )
gRemoveClass( w.elt.tBodies[0].rows[w.state.currentRow], 'gCurrentRow' );
if ( row != undefined )
gAddClass( w.elt.tBodies[0].rows[row], 'gCurrentRow' );
}
w.Finalize = function() {
gRemoveEvents( w.elt );
gForEach( w.elt.tBodies[0].rows, function(e) { gRemoveEvents(e); } );
}
function OnNavKey( key, shift, ctrl, alt ) {
w.eventSink.Key( TranslateKey( key, shift, ctrl, alt ) );
}
w.enabledSelection = function( set ) {
g_keyManager.Set( set, OnNavKey, 38, 40 );
gMakeUnselectable( w.elt, set );
}
function OnAccept() {
return w.eventSink.Action( 'accept' );
}
gDetour( w, 'enabledScroll', function(set) {
g_keyManager.Set( set, OnNavKey, 33, 34 );
g_keyManager.Set( set, OnAccept, 13 );
gDetourCall();
} );
}
gAppendCssRule( g_styleSheet, '.gTable .gColSelect', 'display:none' );
if ( !g_IsIe )
gAppendCssRule( g_styleSheet, '.gTable tr > *:first-child', 'display: none' );
gRegisterWrapper( TableWrapper, gBY_ELEMENT_CLASS, 'gTable', gElementId, gInitTableWrapper, 'table' );
function gScrollgridWrapper( w ) {
var _scrollBar = new gScrollable(w);
w.AppendElement = function( e ) {
_scrollBar.Create(e);
}
function OnNavKey( key, shift, ctrl, alt ) {
w.eventSink.Key( TranslateKey( key, shift, ctrl, alt ) );
}
function OnAccept() {
return w.eventSink.Action( 'accept' );
}
gDetour( w, 'enabledScroll', function(set) {
g_keyManager.Set( set, OnNavKey, 33, 34, 38, 40 );
gDetourCall();
} );
}
gRegisterWrapper( gScrollgridWrapper, gBY_ELEMENT_CLASS, 'gScrollGrid', gElementId, gInitScrollgridWrapper );
function MatrixSelectorWrapper( w ) {
var _eltList = [];
w.currentCell = function( cell ) {
if ( w.state.currentCell !== undefined )
gRemoveClass( _eltList[w.state.currentCell], 'gCurrentCell' );
if ( cell != undefined )
gAddClass( _eltList[cell], 'gCurrentCell' );
}
function OnClick( event ) {
if ( gPreviousSibling(event.currentTarget).value != w.state.currentCell )
if ( w.eventSink.Select( w.id, gPreviousSibling(event.currentTarget).value ) )
gEventHandled( event );
}
function OnDblClick( e ) {
w.eventSink.Action( 'accept' );
}
w.activeCellCount = function( activeCellCount ) {
for ( var i in _eltList ) {
var set = ( i < activeCellCount );
gSetEvent( _eltList[i], 'mousedown', OnClick, set );
gSetEvent( _eltList[i], 'dblclick', OnDblClick, set );
}
}
w.AppendElement = function( e ) {
_eltList[Number(e.value)] = gNextSibling(e);
}
w.Finalize = function() {
for ( var it in _eltList )
gRemoveEvents( _eltList[it] );
}
}
gAppendCssRule( g_styleSheet, '.gMatrixSelect', 'display:none' );
gRegisterWrapper( MatrixSelectorWrapper, gBY_ELEMENT_CLASS, 'gMatrixSelect', gElementName, gInitMatrixSelectorWrapper );
function gInitFolderWrapper( w, e, s ) {
for ( var pageHeader = gFirstChild(e); pageHeader; pageHeader = gNextSibling(gNextSibling(pageHeader)) )
if ( gFirstChild(gNextSibling(pageHeader) ) )
s.currentPage = gNextSibling(pageHeader).id;
}
///
function FolderWrapper( w ) {
var _current = undefined;
function Select( headerElt ) {
if ( _current ) {
gRemoveClass( _current, 'selectedPageHeader' );
gRemoveClass( gNextSibling(_current), 'selectedPage' );
}
_current = headerElt;
gAddClass( _current, 'selectedPageHeader' );
gAddClass( gNextSibling(_current), 'selectedPage' );
g_state.Fire('folderPageChanged');
}
function OnCurrent( fw, set ) {
if ( set )
for ( var p, e = fw.elt; e != document; p=e, e = e.parentNode )
if ( e == w.elt ) {
Select( gPreviousSibling(p) );
break;
}
}
w.currentPage = function( pageId ) {
Select( gPreviousSibling(gIdToElement(pageId)) );
}
w.AppendElement = function( e ) {
for ( var pageHeader = gFirstChild(e); pageHeader; pageHeader = gNextSibling(gNextSibling(pageHeader)) ) {
for ( var headerElement = gFirstChild(pageHeader); headerElement; headerElement = gNextSibling(headerElement) ) {
if ( headerElement.type == 'submit' )
gAppendTextNode( gInsertBefore( gCreateElement( 'LABEL' ), headerElement ), headerElement.value || '\xA0' );
if ( headerElement.type == 'image' )
gInsertBefore( headerElement.parentNode.appendChild( gCreateElement( 'IMG' ) ), headerElement ).src = headerElement.src;
}
gAddEvent( pageHeader, 'mousedown', function(ev) {
var h = ev.currentTarget
var action = gLastChild(h);
if ( gFirstChild(gNextSibling(h)) ) {
action.click();
Select( h );
} else {
if ( !action.disabled )
w.eventSink.Misc( 'RequestedFolderPage', gNextSibling(h).id, 'Action', action.name );
else
w.eventSink.Misc( 'RequestedFolderPage', gNextSibling(h).id );
}
} );
}
g_wrapperManager.listenUpdate.Item( 'currentField' ).Add( OnCurrent );
g_wrapperManager.listenUpdate.Item( 'currentRow' ).Add( OnCurrent );
w.elt = e;
}
w.Finalize = function() {
for ( var e = gFirstChild(w.elt); e; e = gNextSibling(e) ) {
gRemoveEvents(e)
}
}
}
gAppendCssRule( g_styleSheet, 'DIV.gFolder .gPageHeader INPUT', 'display: none' );
gAppendCssRule( g_styleSheet, 'DIV.gFolder .gPage', 'display: none' );
gAppendCssRule( g_styleSheet, 'DIV.gFolder .selectedPage', 'display: block; float: left' );
gRegisterWrapper( FolderWrapper, gBY_ELEMENT_CLASS, 'gFolder', gElementId, gInitFolderWrapper );
function PanelWrapper( w ) {
w.Remove = function() {
gRemoveElement(w.elt);
delete w.elt;
}
function onMouseOver( event ) {
var t = event.target;
if ( t ) {
if ( t.nodeName == 'LI' )
gAddClass( t, 'hover' );
if ( t.nodeName == 'INPUT' )
gAddClass( t.parentNode, 'hover' );
}
}
function onMouseOut( event ) {
var t = event.target;
if ( t ) {
if ( t.nodeName == 'LI' )
gRemoveClass( t, 'hover' );
if ( t.nodeName == 'INPUT' )
gRemoveClass( t.parentNode, 'hover' );
}
}
function onMouseClick( event ) {
var t = event.target;
t && t.nodeName == 'LI' && gFirstChild(t).click();
}
gDetour( w, 'AppendElement', function( e ) {
gAddEvent( e, 'mouseover', onMouseOver );
gAddEvent( e, 'mouseout', onMouseOut );
gAddEvent( e, 'mousedown', onMouseOut );
gAddEvent( e, 'click', onMouseClick );
w.elt = e;
gDetourCall();
} );
w.RemoveElement = function(e) {
gRemoveEvent( e, 'mouseover', onMouseOver );
gRemoveEvent( e, 'mouseout', onMouseOut );
gRemoveEvent( e, 'mousedown', onMouseOut );
gRemoveEvent( e, 'click', onMouseClick );
return true;
}
w.Finalize = function() {
gRemoveEvents(w.elt);
}
}
gRegisterWrapper( PanelWrapper, gBY_ELEMENT_CLASS, 'gMenu', function(e) {
return 'panel';
});
gRegisterWrapper( PanelWrapper, gBY_ELEMENT_CLASS, 'gDialog', function(e) { return 'panel' } );
function ToolbarWrapper( w ) {
var _evToClass = { mouseover:'hover', mouseup:'hover', mouseout:'', mousedown:'pressed' };
function onMouse( event ) {
if ( event.target && event.target.nodeName == 'INPUT' && !event.target.disabled )
event.target.parentNode.className = _evToClass[event.type];
}
w.AppendElement = function( e ) {
gAddEvent( e, 'mouseover', onMouse );
gAddEvent( e, 'mouseout', onMouse );
gAddEvent( e, 'mousedown', onMouse );
gAddEvent( e, 'mouseup', onMouse );
w.elt = e;
}
w.Finalize = function() {
gRemoveEvents(w.elt);
}
}
gRegisterWrapper( ToolbarWrapper, gBY_ELEMENT_CLASS, 'gToolBar', gElementId );
function TopmenuWrapper( w ) {
var _current, _timeout;
function hide() {
if ( _current ) {
_current.parentNode.className = '';
for ( var it = gNextSibling(_current)?gNextSibling(_current):_current; it != gFirstChild(w.elt); it = it.parentNode.parentNode )
it.style.display='';
}
_current = null;
}
function onMouseOver( event ) {
var src = event.target;
if(src && src.nodeName == 'LI') {
src = gFirstChild(src);
}
if ( src && (src.nodeName == 'INPUT' || src.nodeName == 'LABEL' || src.nodeName == 'IMG') ) {
if ( _timeout )
gClearTimeout( _timeout );
src.parentNode.className = 'hover';
if ( _current ) {
if ( src.parentNode == _current.parentNode )
return;
if ( _current != src ) {
_current.parentNode.className = '';
for ( var it = gNextSibling(_current)?gNextSibling(_current):_current; it != src.parentNode.parentNode && it != gFirstChild(w.elt); it = it.parentNode.parentNode )
it.style.display = '';
}
}
var next = gNextSibling(src);
if(src.nodeName == 'IMG' && next) {
if(next.nodeName == 'INPUT' || next.nodeName == 'LABEL') {
src = next;
}
}
if (gNextSibling(src))
gNextSibling(src).style.display = 'inline';
_current = src;
}
}
function onMouseOut(event) {
var src = event.target;
if(src && src.nodeName == 'LI') {
src = gFirstChild(src);
}
if ( src && (src.nodeName == 'INPUT' || src.nodeName == 'LABEL' || src.nodeName == 'IMG') )
_timeout = gSetTimeout( hide, 400 );
}
w.AppendElement = function( e ) {
gAddEvent( e, 'mouseover', onMouseOver );
gAddEvent( e, 'mouseout', onMouseOut );
gAddEvent( e, 'mouseup', function(){ _timeout = gSetTimeout( hide, 100 ) } );
w.elt = e;
}
w.Finalize = function() {
gRemoveEvents(w.elt);
}
}
gRegisterWrapper( TopmenuWrapper, gBY_ELEMENT_CLASS, 'gTopMenu', gElementId );
//
// function TopmenuWrapper2( w ) {
//
//   var _current;
//
// 	function IsOpen( elt ) { // by LI element
//
// 		return gHasClass( elt.firstChild, 'open' );
// 	}
//
// 	function Open( elt, set ) { // by LI element
//
// 		gSetClass( elt.firstChild, 'open', set );
// 		elt.firstChild.nextSibling.style.display = set && 'block' || '';
// 	}
//
//   function Click( event ) {
//
//     var src = event.target;
//
//     if ( src.nodeName == 'LABEL' && src.parentNode != w.elt ) {
//
//
//       _current && gRemoveClass( _current, 'sel' );
//       _current = src;
//       gAddClass( _current, 'sel' );
//
//       if ( _current.nextSibling && _current.nextSibling.firstChild ) {
//
// 				var isCurrentOpen = IsOpen( _current.parentNode );
// 				for( var it = _current.parentNode.parentNode.firstChild; it; it = it.nextSibling )
// 					it.firstChild.nextSibling && Open(it, false);
// 				Open( _current.parentNode, !isCurrentOpen );
//       }
//     }
//
// 		if ( src.nodeName == 'INPUT' ) {
// 		}
//   }
//
//   w.AppendElement = function( e ) {
//
// 		gMakeUnselectable( e );
// 		gAddEvent( e, 'mouseup', Click );
// 		gAddEvent( e, 'click', gEventHandled );
//
// 		gMakeUnselectable( e, true );
//
//   	w.elt = e;
//   }
// }
//
// gRegisterWrapper( TopmenuWrapper2, gBY_ELEMENT_CLASS, 'gTopMenu', gElementId  );
//
function TranslateKey( key, shift, ctrl, alt ) {
return (ctrl?'CONTROL-':'') + (shift?'SHIFT-':'') + (alt?'ALT-':'') + { '9':'TAB', '33':'PRIOR', '34':'NEXT', '38':'UP', '40':'DOWN', '35':'END', '36':'HOME', '37':'LEFT', '39':'RIGHT' }[key];
}
function MoveableBehavior( w ) {
var _this = this;
var _xOff, _yOff;
function MoveTo( x, y ) {
w.elt.style.left = x;
w.elt.style.top = y;
}
function dragStop(e) {
gEventHandled(e);
gRemoveEvent( w.elt, 'mousemove', dragMove );
gRemoveEvent( w.elt, 'mouseup', dragStop );
gRemoveEvent( w.elt, 'mouseout', dragStop );
}
function dragMove( e ) {
gEventHandled(e);
MoveTo( e.pageX - _xOff, e.pageY - _yOff );
}
function dragStart(e) {
gEventHandled(e);
_xOff = e.layerX;
_yOff = e.layerY;
gAddEvent( w.elt, 'mouseup', dragStop );
gAddEvent( w.elt, 'mousemove', dragMove );
gAddEvent( w.elt, 'mouseout', dragStop );
}
gDetour( w, 'AppendElement', function(e) {
gDetourCall();
w.elt.style.position = 'absolute';
gAddEvent( e, 'mousedown', dragStart );
} );
gDetour( w, 'Create', function() {
gDetourCall();
gAddEvent( w.elt, 'mousedown', dragStart );
} );
gDetour( w, 'Finalize', function() {
gRemoveEvent( w.elt, 'mousedown', dragStart );
gDetourCall();
} );
}
function MessageWrapper( w ) {
w.text = function( text ) {
window.status = text.replace( '\n','  --  ');
}
w.AppendElement = function(e) {
gRemoveElement(e);
}
w.Create = gNoop;
w.Remove = function() {
window.status = '';
}
}
function ErrorWrapper_alert( w ) {
w.text = function( text ) {
alert( text );
}
w.AppendElement = function(e) {
gRemoveElement(e);
}
w.Create = gNoop;
w.Remove = gNoop;
}
function ErrorWrapper_popup( w ) {
w.text = function( text ) {
w.elt.innerHTML = gStringReplace( text, { '\n':'<br>', '&':'&amp;', '<':'&lt;', '>':'&gt;', '"':'&quot;'  } );
}
w.AppendElement = function(e) {
w.elt = e;
}
w.Create = function() {
w.elt = gCreateElement( 'P', { id:w.id, className:w.id } );
(gIdToElement('gInfo')||gIdToElement('gDialogForm')).appendChild( w.elt );
}
w.Remove = function() {
gRemoveElement( w.elt );
}
MoveableBehavior( w );
}
gRegisterWrapper( ErrorWrapper_popup, gBY_ELEMENT_ID, 'gError', gElementId, gInitMessageWrapper );
//gRegisterWrapper( MessageWrapper, gBY_ELEMENT_ID,  'gMessage', gElementId, gInitMessageWrapper );
//gAppendCssRule( g_styleSheet, '#gMessage', 'display: none' );
function ScrollableCommon( w ) {
var _scrollTimeout, _pos;
function OnNavigate( key ) {
switch ( key ) {
case 35:
return w.eventSink.Misc( 'Offset', w.state.size - w.state.pageSize, w.info.selectorName, - w.state.offset + w.state.size - 1 );
break;
case 36:
return w.eventSink.Misc( 'Offset', 0, w.info.selectorName, -w.state.offset );
break;
}
}
gDetour( w, 'enabledScroll', function(set) {
g_keyManager.Set( w.state.enabledSelection && set, OnNavigate, 35, 36 );
gDetourCall();
}	);
gDetour( w, 'offset', function(pos) {
_pos = pos;
gDetourCall();
}	);
function SetOffset() {
w.eventSink.Offset( _pos );
}
function SendPos() {
_pos = gMinMax( gRound(_pos), 0, w.state.size - w.state.pageSize );
if ( _scrollTimeout == undefined ) {
_pos != w.state.offset && SetOffset();
_scrollTimeout = gSetTimeout( function() { _pos != w.state.offset && SetOffset(); _scrollTimeout = undefined; }, 200 );
}
}
w.ScrollBy = function( n ) {
_pos += n;
SendPos();
}
w.ScrollTo = function( p ) {
if ( _pos != p ) {
_pos = p;
SendPos();
}
}
}
function MOZScrollable( w ) {
var _sb, _elt;
var _sbWidth = gScrollbarWidth();
ScrollableCommon( w );
gDetour( w, 'offset', function( o ) {
gDetourCall();
if ( !_sb )
return;
_sb.scrollTop = (_sb.scrollHeight - _sb.offsetHeight) * o / (w.state.size - w.state.pageSize);
} );
gDetour( w, 'size', function( s ) {
gDetourCall();
if ( !_sb )
return;
gFirstChild(_sb).style.height = _sb.offsetHeight * s / w.state.pageSize;
} );
gDetour( w, 'enabledScroll', function( set ) {
gDetourCall();
if ( !_sb )
return;
gFirstChild(_sb).style.display = set ? '' :'none';
gSetEvent( _sb, 'scroll',ScrollTimeout, set );
_elt.addEventListener('DOMMouseScroll', OnWheel, false);
} );
function OnWheel( event ) {
w.ScrollBy( event.detail > 0 ? 1: -1 );
gEventHandled( event );
}
var _scrollTimeout;
function ScrollTimeout(event) {
if ( _scrollTimeout != undefined )
clearTimeout(_scrollTimeout);
_scrollTimeout = setTimeout( function() { _scrollTimeout = undefined; SetScroll() }, 100 );
}
function SetScroll() {
w.ScrollTo( gRound( _sb.scrollTop * (w.state.size - w.state.pageSize) / (_sb.scrollHeight - _sb.offsetHeight) )  );
}
function AdjustScrollbar() {
_sb.style.height = _elt.parentNode.clientHeight;
_sb.style.left = _elt.offsetWidth - _sbWidth;
}
this.Create = function( elt ) {
_elt = elt;
var tmp = gCreateElement( 'DIV', { style:{ position:'relative', height:0 } } );
_sb = gCreateElement( 'DIV', { style:{ position:'absolute', overflow:'-moz-scrollbars-vertical' } } );
_sb.appendChild( gCreateElement( 'DIV' ) );
tmp.appendChild( _sb );
gInsertBefore( tmp, elt );
_sb.style.width = _sbWidth + 1;
elt.style.borderRightWidth = _sbWidth - 1;
elt.style.borderRightStyle = 'solid';
AdjustScrollbar();
g_state.Add('stateReady', AdjustScrollbar);
g_state.Add('folderPageChanged', AdjustScrollbar);
gDetour( w, 'Finalize', function() {
gRemoveEvent( _sb, 'scroll', ScrollTimeout );
gDetourCall();
} );
}
}
//
function IEScrollable( w ) {
var _sb, _elt, _scrollPos = 0 ;
ScrollableCommon( w );
gDetour( w, 'offset', function( o ) {
gDetourCall();
UpdateThumb( o, w.state.size, w.state.pageSize );
} );
gDetour( w, 'size', function( s ) {
gDetourCall();
UpdateLayout( s, w.state.pageSize );
UpdateThumb( w.state.offset, s, w.state.pageSize );
} );
gDetour( w, 'enabledScroll', function( set ) {
gDetourCall();
_sb.disabled = !set;
gSetEvent( _sb, 'mousemove', OnScrollEvent, set );
gSetEvent( _sb, 'mouseout', OnScrollEvent, set );
gSetEvent( _elt, 'mousewheel', OnWheel, set );
} );
function OnWheel( event ) {
w.ScrollBy( - event.wheelDelta / 120 );
gEventHandled( event );
}
function OnScrollEvent( ev ) {
if ( _scrollPos != _sb.scrollTop ) {
w.ScrollTo( (w.state.size - w.state.pageSize) * _sb.scrollTop / (_sb.scrollHeight - _sb.offsetHeight) );
_scrollPos = _sb.scrollTop;
}
}
function UpdateThumb( o, s, p ) {
_sb.scrollTop = (_sb.scrollHeight - _sb.offsetHeight) * o / (s - p);
_scrollPos = _sb.scrollTop;
}
function UpdateLayout( s, p ) {
if ( s > 0 && p > 0 ) {
var pxSize = ( _sb.offsetHeight - 19 ) * s / p;
if ( pxSize <= 0 )
return;
var half = gRound( pxSize / 2 );
_sb.style.paddingBottom = half;
_sb.style.paddingTop = pxSize - half;
}
}
function AdjustScrollbar() {
_sb.style.height = _elt.offsetHeight;
}
this.Create = function( elt ) {
_elt = elt;
elt.parentNode.style.whiteSpace = 'nowrap';
elt.style.display = 'inline';
_sb = elt.parentNode.appendChild( gCreateElement( 'SPAN', { style:{ overflowY:'scroll', overflowX:'hidden', verticalAlign:'top' } } ) );
var _sbWidth = gScrollbarWidth();
_sb.style.width = _sbWidth + 2;
elt.style.marginRight = -_sbWidth;
elt.style.borderRightWidth = _sbWidth - 1;
elt.style.borderRightStyle = 'solid';
AdjustScrollbar();
g_state.Add('stateReady', AdjustScrollbar );
g_state.Add('folderPageChanged', AdjustScrollbar);
gDetour( w, 'Finalize', function() {
gRemoveEvents(_sb);
gRemoveEvents(_elt);
gDetourCall();
} );
}
}
if ( g_IsIe ) {
gScrollable = IEScrollable;
}
if ( g_IsGecko ) {
gScrollable = MOZScrollable;
}
function Calendar( _format, _fd ) {
var _onChange, _current, _asInterval, _asDelay, _asStep, _year, _month, _day, days = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'], months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'], monthsdays = [31,28,31,30,31,30,31,31,30,31,30,31];
function DaysInTheMonth( year, month ) {
return ( month == 1 && !(year%4) && ( year%100 || !(year%400) ) )?29:monthsdays[month];
}
function DayOfTheWeek( year, month, day ) {
var a = gFloor( (13 - month) / 12 ), y = year - a;
return (day + y + gFloor(y/4) - gFloor(y/100) + gFloor(y/400) + gFloor((31*(month + 12*a - 1))/12)) % 7;
}
function cell( offset ) {
return _table.rows[2+gFloor(offset/7)].cells[offset%7].firstChild;
}
function updateMonth( year, month ) {
var start = ( DayOfTheWeek( year, month, 1 ) + 7 - _fd ) % 7, dim = DaysInTheMonth( year, month );
for ( var i = 0; i<42; i++ ) {
var mcell = cell( i );
mcell.nodeValue = ( i >= start && i < start + dim )?i-start+1:'';
mcell.parentNode.className = '';
}
var date = new Date();
if ( year == date.getFullYear() && month == date.getMonth() )
cell( start + date.getDate() - 1 ).parentNode.className = 'today';
}
function updateInfo( year, month, day ) {
_info.nodeValue = months[month] +' '+ (day?day:'') +', '+ year;
}
function makeDate( year, month, day ) {
var sep = _format.charAt(_format.length-1), date = '';
for ( var i=0; i < _format.length-1; i++ ) {
if ( i>0 )
date += sep;
switch ( _format.charAt(i) ) {
case 'Y':
date += (_format.charAt(++i)=='4')?year:year%100;
break;
case 'M':
date += month + 1;
break;
case 'D':
date += day;
break;
}
}
return date;
}
function scroll( step ) {
var amon = _year*12 + _month + step;
_year = gFloor(amon / 12);
_month = amon % 12;
}
function autoStep() {
scroll( _asStep );
updateMonth( _year, _month );
updateInfo( _year, _month );
_asInterval = gSetTimeout( autoStep, _asDelay );
_asDelay = _asDelay * 0.90 + 1;
}
function autoScroll( step ) {
_asStep = step;
_asDelay = 200;
autoStep();
gClearTimeout( _asInterval );
_asInterval = gSetTimeout( autoStep, 500 );
}
function stopScroll() {
gClearTimeout(_asInterval);
}
function onMouseDown( event ) {
var src = event.target;
if ( src.nodeName == 'TD' ) {
if ( src.parentNode.className == 'nav' ) {
switch ( src.firstChild.nodeValue ) {
case '<<':
autoScroll( -12 );
break;
case '<':
autoScroll( -1 );
break;
case '>>':
autoScroll( 12 );
break;
case '>':
autoScroll( 1 );
break;
default:
var date = new Date();
_month = date.getMonth();
_year = date.getFullYear();
_day = date.getDate();
}
updateMonth( _year, _month );
updateInfo( _year, _month );
}
if ( src.parentNode.parentNode.nodeName == 'TBODY' )
_onChange( makeDate( _year, _month, _day ) );
}
}
function onMouseOver( event ) {
var src = event.target;
if ( src.nodeName == 'TD' && src.parentNode.parentNode.nodeName == 'TBODY' && src.firstChild.nodeValue ) {
_day = src.firstChild.nodeValue;
if ( _current )
gSetClass( _current, 'hover', false );
gSetClass( src, 'hover', true );
_current = src;
updateInfo( _year, _month, _day );
}
}
this.ParseDate = function( date ) {
var res = date.match( /([0-9]*).([0-9]*).([0-9]*)/ );
if ( res && res.length == 4 && res[1] && res[2] && res[3] ) {
for ( var i=0, j=1; i < _format.length-1; i++ )
switch ( _format.charAt(i) ) {
case 'Y':
_year = Number(res[j++]) + (_format.charAt(++i) == '4' ? 0 : 2000);
break;
case 'M':
_month = Number(res[j++]) -1;
break;
case 'D':
_day = Number(res[j++]);
break;
}
} else {
var date = new Date();
_month = date.getMonth();
_year = date.getFullYear();
_day = date.getDate();
}
updateMonth( _year, _month );
updateInfo( _year, _month );
}
this.OnChange = function( fn ) {
_onChange = fn;
}
this.Element = function() {
return _table;
}
this.Finalize = function() {
gRemoveEvents( _table.tBodies[0] );
gRemoveEvents( _table );
}
function appendCell( element, text ) {
var newCell = element.insertCell(-1);
gAppendTextNode( newCell, text );
return newCell;
}
var _table = gCreateElement( 'TABLE', { className:'calendar', style:{ display:'none' } } );
for ( var i = 0; i<6; i++ ) {
var row = _table.insertRow(-1);
for ( var j = 0; j<7; j++ )
appendCell( row );
}
_table.createTHead();
var navRow = _table.tHead.insertRow(-1);
navRow.className = 'nav';
appendCell( navRow, '<<' );
appendCell( navRow, '<' );
tmp = appendCell( navRow );
tmp.className = 'info';
tmp.colSpan = 3;
var _info = tmp.firstChild;
appendCell( navRow, '>' );
appendCell( navRow, '>>' );
var daysRow = _table.tHead.insertRow(-1);
daysRow.className = 'days';
for ( var i = 0; i<7; i++ )
appendCell( daysRow, days[(_fd+i)%7] ).className = ((6+_fd+i)%7>=5)?'we':'';
gMakeUnselectable( _table );
gAddEvent( _table, 'mousedown', onMouseDown );
gAddEvent( _table, 'mouseover', onMouseOver );
gAddEvent( _table, 'mouseup', stopScroll );
gAddEvent( _table, 'mouseout', stopScroll );
gAddEvent( _table.tBodies[0], 'dblclick', function() { _table.style.display = 'none'; } );
}
var _calendar;
function ComboboxFeedSelect( selectElement ) {
this.ForEach = function( fct ) {
var len = selectElement.length;
for ( var i = 0; i < len; ++i ) {
var c = selectElement.options[i];
fct( c.value, c.text, i );
}
}
this.IndexByKey = function( key ) {
var len = selectElement.length;
for ( var i = 0; i < len; ++i )
if ( selectElement.options[i].value == key )
return i;
}
this.KeyByIndex = function( index ) {
var o = selectElement.options[index];
return o && o.value;
}
this.ValueByIndex = function( index ) {
var o = selectElement.options[index];
return o && o.text;
}
this.ValueByKey = function( key ) {
var len = selectElement.length;
for ( var i = 0; i < len; ++i ) {
var e = selectElement.options[i];
if ( e.value == key )
return e.text;
}
}
this.KeyByValue = function( value ) {
var len = selectElement.length;
for ( var i = 0; i < len; ++i ) {
var e = selectElement.options[i];
if ( e.text == value )
return e.value;
}
}
this.RemoveByIndex = function( index ) {
gRemoveElement( selectElement.options[index] );
}
}
function ComboboxWidget(api) {
var _combobox, _edit, _button, _list, _over;
var _listOpen = false;
var _feed;
var _selection = {};
this.Create = function( feed ) {
_feed = feed;
_combobox = gCreateElement('SPAN', { className:'combobox' } );
_edit = _combobox.appendChild( gCreateElement('INPUT', { className:'comboboxEdit', readOnly:true } ) );
_button = gCreateElement('SPAN', { className:'comboboxButton', UNSELECTABLE:'on' } );
_combobox.appendChild( _button );
_list = gCreateElement('DIV', { className:'comboboxList' });
_combobox.appendChild( gCreateElement('SPAN', { style:{ display:'none', position:'absolute' } } ) ).appendChild( _list );
gMakeUnselectable( _list, true );
gMakeUnselectable( _button, true );
gAddEvent( _edit, 'mousedown', OnFocus );
gAddEvent( _button, 'mousedown', OnFocus );
gAddEvent( _edit, 'mouseup', OnEditClick );
gAddEvent( _button, 'mouseup', OnButtonClick );
return _combobox;
}
this.Finalize = function() {
gRemoveEvents( _edit );
gRemoveEvents( _button );
gRemoveEvents( _list );
gRemoveEvent( document, 'mousedown', OnClose );
}
this.ForeachSelected = function( fct ) {
for ( var i in _selection )
fct( _feed.KeyByIndex(i), _feed.ValueByIndex(i), i );
}
this.KeyByValue = function( value ) {
return _feed.KeyByValue( value );
}
this.ValueByKey = function( key ) {
return _feed.ValueByKey( key );
}
this.IndexByKey = function( key ) {
return _feed.IndexByKey( key );
}
this.UnselectAll = function() {
_selection = {};
}
this.SelectByIndex = function( index, set ) {
if ( set )
_selection[index] = true;
else
delete _selection[index];
}
this.RemoveByIndex = function( index ) {
_feed.RemoveByIndex( index );
}
this.ListShow = function( set ) {
if ( set ) {
StateFilled.call(this);
this.ListShow(true);
}
}
this.MaxLength = function() {
var length = 0;
_feed.ForEach( function( k, v ) {
var len = v.length;
if ( len > length )
length = len;
} );
return length;
}
this.EditSize = function( size ) {
_edit.size = size || 1;
}
this.ToolTip = function( text ) {
_edit.title = text;
}
function StateFilled() {
_feed.ForEach( function( k, v ) {
var item = gCreateElement('DIV');
gAppendTextNode( item, v );
_list.appendChild( item );
} );
for ( var i in _selection )
gSetClass( _list.childNodes[i], 'selected', true );
api.OnSourceRead && api.OnSourceRead();
//
this.UnselectAll = function() {
for ( var i in _selection )
gSetClass( _list.childNodes.item(i), 'selected', false );
_selection = {};
}
this.IsSelectedByIndex = function( index ) {
return _selection[index];
}
this.SelectByIndex = function( index, set ) {
if ( set )
_selection[index] = true;
else
delete _selection[index];
gSetClass( _list.childNodes.item(index), 'selected', set );
}
this.ListShow = function( set ) {
_combobox.zIndex = set ? 1 : '';
if ( set ) {
_list.parentNode.style.display = '';
_list.style.left = - _edit.offsetWidth;
_list.style.width = gMinMax( _combobox.offsetWidth, 100, 500 );
_list.style.height = 'auto';
var height = _list.offsetHeight; //gMinMax( _list.clientHeight, 100, 200 );
var spaceTop = gBrowserY(_edit);
var spaceBottom = document.body.scrollTop + document.body.clientHeight - ( gBrowserY(_edit) + _edit.offsetHeight );
_list.style.top = _edit.offsetHeight;
_list.style.height = height = gMinMax( height, 5, 150 );
if ( spaceBottom > height || spaceTop < height )
_list.style.top = _edit.offsetHeight;
else
_list.style.top = - height - 2;
var f = 0;
for ( var i in _selection )
f = f?i<f?i:f:i;
f *= gFirstChild(_list).offsetHeight;
if ( f > _list.clientHeight )
_list.scrollTop = f;
gAddEvent( _list, 'mouseover', OnOver );
gAddEvent( _list, 'mouseup', OnSelect );
gAddEvent( document, 'mousedown', OnClose );
} else {
gRemoveEvent( _list, 'mouseover', OnOver );
gRemoveEvent( _list, 'mouseup', OnSelect );
gRemoveEvent( document, 'mousedown', OnClose );
_list.parentNode.style.display = 'none';
}
_listOpen = set;
}
this.MaxLength = function() {
var length = 0;
for ( var p = _list.firstChild; p; p = p.nextSibling ) {
var len = p.firstChild.data.length;
if ( len > length )
length = len;
}
return length;
}
}
function OnClose( ev ) {
gContains( _combobox, ev.target ) || ( _listOpen && api.OnShow( false, 0 ) );
}
function OnFocus( ev ) {
api.OnFocus();
}
function OnButtonClick(ev) {
api.OnShow( !_listOpen, 1 );
}
function OnEditClick(ev) {
api.OnShow( !_listOpen, 2 );
}
function OnSelect(ev) {
if ( ev.target.nodeName == 'DIV' && gHasClass( ev.target.parentNode, 'comboboxList' ) ) {
for ( var i = 0, p = ev.target; p; p = p.previousSibling, ++i );
i--;
api.OnSelect( _feed.KeyByIndex(i), _feed.ValueByIndex(i), i );
}
}
function OnOver(ev) {
if ( gHasClass( ev.target.parentNode, 'comboboxList' ) ) {
_over && gSetClass( _over, 'over', false );
_over = ev.target;
gSetClass( _over, 'over', true );
}
}
this.SetEditable = function( set ) {
_edit.readOnly = !set;
}
this.GetText = function() {
return _edit.value;
}
this.SetText = function( text ) {
_edit.value = text;
}
this.SetClass = function( className, set ) {
gSetClass( _combobox, className, set );
}
this.Focus = function() {
gSafeFocus(_edit);
}
this.Blur = function() {
gSafeBlur(_edit);
api.OnShow( false );
}
}
