blob: c8aebf6605105ae3a7a322b3dc9d0adf0f862211 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2004 Actuate Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Actuate Corporation - Initial implementation.
*****************************************************************************/
/**
* BirtParameterDialog
* ...
*/
BirtParameterDialog = Class.create( );
BirtParameterDialog.prototype = Object.extend( new AbstractParameterDialog( ),
{
/**
* Parameter dialog working state. Whether embedded inside
* designer dialog.
*/
__mode : Constants.SERVLET_FRAMESET,
/**
* Identify the parameter value is null.
*/
__isnull : '__isnull',
/**
* Identify the parameter value list is null.
*/
__isnulllist : '__isnulllist',
/**
* Prefix that identify the parameter is to set Display Text for "select" parameter
*/
__isdisplay : '__isdisplay__',
/**
* identify the parameter value is a locale string
*/
__islocale : '__islocale',
/**
* Prefix that identify the parameter value is a locale string
*/
__prefix_islocale : '__islocale__',
/**
* Event handler closures.
*/
__neh_change_cascade_text_closure : null,
__neh_mouseover_select_closure : null,
__neh_mouseout_select_closurre : null,
/**
* Check if parameter is required or not.
*/
__is_parameter_required : null,
/**
* Check if allow parameter blank or not.
*/
__is_parameter_allowblank : null,
/*
* Clear the sub cascading parameters
*/
__clearSubCascadingParameter : null,
/**
* Mutex: counts the pending calls to __E_CASCADING_PARAMETER
*
* >0 if a cascading value has just been changed.
* Used to defer the ok button clicks until
* a response has been received.
*/
__pendingCascadingCalls : 0,
/**
* Function to call after the dialog data has been updated.
* Use to defer the click to ok whenever
* an onchange event is still pending.
*/
__onDataChanged : null,
/**
* Cancels the next onchange event.
* Used for an IE select box behaviour workaround where pressing
* a key fires onchange events. It makes the select box
* behaviour similar to the one of FireFox.
*/
__cancelOnChange : false,
/**
* Cancels the show operation.
* This flag is used when the user clicked the cancel button and
* wants to close the dialog box, and there are pending server requests.
* The bind() method of the base class will call the __l_show() method
* after receiving the response, which would popup the dialog again.
* This flag will prevent this to happen.
*/
__cancelShow : false,
/**
* Stores the selected index from the focused select box. (IE only)
*/
__currentSelectedIndex : null,
MIN_MULTILINES : 5,
MAX_MULTLIINES : 10,
/**
* if previous is visible.
*/
preVisible: null,
/**
* Initialization routine required by "ProtoType" lib.
* @return, void
*/
initialize : function( id, mode )
{
this.__mode = mode || Constants.request.servletPath;
this.preVisible = false;
this._hint = document.getElementById( "birt_hint" );
// Change event for parameter text field
this.__neh_change_cascade_text_closure = this.__neh_change_cascade_text.bindAsEventListener( this );
this.__neh_change_select_closure = this.__neh_change_select.bindAsEventListener( this );
this.__neh_change_cascade_select_closure = this.__neh_change_cascade_select.bindAsEventListener( this );
if ( BrowserUtility.isIE6 )
{
// Mouse over event for Select field
this.__neh_mouseover_select_closure = this.__neh_mouseover_select.bindAsEventListener( this );
this.__neh_mouseout_select_closure = this.__neh_mouseout_select.bindAsEventListener( this );
}
if ( BrowserUtility.isIE )
{
// Focus events
this.__neh_focus_select_closure = this.__neh_focus_select.bindAsEventListener( this );
this.__neh_blur_select_closure = this.__neh_blur_select.bindAsEventListener( this );
}
this.initializeBase( id );
if ( this.__mode == Constants.SERVLET_PARAMETER )
{
// Hide dialog title bar if embedded in designer.
this.__setTitleBarVisibile(false);
}
this.__local_installEventHandlers_extend( id );
},
/**
* Install native/birt event handlers.
*
* @id, toolbar id (optional since there is only one toolbar)
* @return, void
*/
__local_installEventHandlers_extend : function( id )
{
// Observe "keydown" event
this.keydown_closure = this.__neh_keydown.bindAsEventListener( this );
Event.observe( $(id), 'keydown', this.keydown_closure, false );
var oSC = document.getElementById( "parameter_table" ).getElementsByTagName( "select" );
for( var i = 0; i < oSC.length; i++ )
{
var element = oSC[i];
Event.observe( element, 'change', this.__neh_change_select_closure, false );
if ( BrowserUtility.isIE6 )
{
Event.observe( element, 'mouseover', this.__neh_mouseover_select_closure, false );
Event.observe( element, 'mouseout', this.__neh_mouseout_select_closure, false );
}
if ( BrowserUtility.isIE )
{
Event.observe( element, 'focus', this.__neh_focus_select_closure, false );
Event.observe( element, 'blur', this.__neh_blur_select_closure, false );
}
// Set initial hint
if ( element.selectedIndex >= 0 )
{
element.title = element.options[element.selectedIndex].text;
}
// Set size for multi-value parameter
if( element.multiple )
{
var len = oSC[i].options.length;
if( len < this.MIN_MULTILINES )
{
len = this.MIN_MULTILINES;
}
else if( len > this.MAX_MULTLIINES )
{
len = this.MAX_MULTLIINES;
}
element.size = len;
}
}
},
/**
* Binding data to the dialog UI. Data includes zoom scaling factor.
* @data, data DOM tree (schema TBD)
* @return, void
*/
__bind : function( data )
{
if ( !data )
{
return;
}
var cascadeParamObj = data.getElementsByTagName( 'CascadeParameter' );
var confirmObj = data.getElementsByTagName( 'Confirmation' );
if ( cascadeParamObj.length > 0 )
{
this.__propogateCascadeParameter( data );
}
else if ( confirmObj.length > 0 )
{
this.__close( );
}
// call the internal onDataChanged event handler
if ( this.__pendingCascadingCalls > 0 )
{
this.__pendingCascadingCalls--;
}
if ( this.__pendingCascadingCalls == 0 && this.__onDataChanged )
{
this.__pendingCascadingCalls = 0;
var callback = this.__onDataChanged;
this.__onDataChanged = null;
// add the handler in the browser's event queue
window.setTimeout( callback, 0 );
}
},
/**
* Install the event handlers for cascade parameter.
*
* @table_param, container table object.
* @counter, index of possible cascade parameter.
* @return, void
*/
__install_cascade_parameter_event_handler : function( table_param, counter )
{
var oSC = table_param.getElementsByTagName( "select" );
var matrix = new Array( );
var m = 0;
var oTRC = table_param.getElementsByTagName( "TR" );
for( var i = 0; i < oTRC.length; i++ )
{
var oSelect = oTRC[i].getElementsByTagName( "select" );
var oInput = oTRC[i].getElementsByTagName( "input" );
var oCascadeFlag = "";
if ( oInput && oInput.length > 0 )
{
var oLastInput = oInput[oInput.length - 1];
if ( oLastInput.id == "isCascade" )
oCascadeFlag = oLastInput.value;
}
// find select items to install event listener
if( oSelect.length > 0 && oCascadeFlag == "true" )
{
if ( i < oTRC.length - 1 )
{
Event.observe( oSelect[0], 'change', this.__neh_change_cascade_select_closure, false );
// find text item to install event listener
var oText;
for( var j = 0; j < oInput.length; j++ )
{
if( oInput[j].type == "text" )
{
oText = oInput[j];
break;
}
}
if( oText )
{
Event.observe( oText, 'change', this.__neh_change_cascade_text_closure, false );
}
}
if( !matrix[m] )
{
matrix[m] = {};
}
var name = oSelect[0].id.substr( 0, oSelect[0].id.length - 10 )
var value = oSelect[0].value;
if ( value == Constants.nullValue )
{
matrix[m].name = this.__isnull;
matrix[m++].value = name;
}
else
{
matrix[m].name = name;
matrix[m++].value = oSelect[0].value;
}
}
}
this.__cascadingParameter[counter] = matrix;
},
/**
* Collect parameters, Support ComboBox/Listbox,Hidden,Radio,TextBox,Checkbox.
*
* @return, void
*/
collect_parameter : function( )
{
// Clear parameter array
this.__parameter = new Array( );
var k = 0;
//oTRC[i] is <tr></tr> section
var oTRC = document.getElementById( "parameter_table" ).getElementsByTagName( "TR" );
for( var i = 0; i < oTRC.length; i++ )
{
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
//input element collection
var oIEC = oTRC[i].getElementsByTagName( "input" );
//select element collection
var oSEC = oTRC[i].getElementsByTagName( "select" );
//avoid group parameter
var oTable = oTRC[i].getElementsByTagName( "table" );
if( oTable.length > 0 || ( oSEC.length == 0 && oIEC.length == 0 ) || ( oIEC.length == 1 && oIEC[0].type == 'submit' ) )
{
continue;
}
// control type
var oType = oIEC[0].value;
// deal with "hidden" parameter
if( oType == 'hidden' )
{
var temp = oIEC[1];
this.__parameter[k].name = temp.name;
this.__parameter[k].value = temp.value;
k++;
// set display text
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = this.__isdisplay + this.__parameter[k-1].name;
this.__parameter[k].value = oIEC[2].value;
k++;
continue;
}
// deal with "checkbox" parameter
if( oType == 'checkbox' )
{
var temp = oIEC[2];
this.__parameter[k].name = temp.value;
temp.checked?this.__parameter[k].value = 'true':this.__parameter[k].value = 'false';
k++;
continue;
}
// deal with "text" parameter
if( oType == 'text' )
{
// data type of current parameter
var dataType = oIEC[1].value;
// allow null
if( oIEC[2] && oIEC[2].type == 'radio' )
{
if( oIEC[2].checked )
{
var paramName = oIEC[3].name;
var paramValue = oIEC[4].value;
var displayText = oIEC[5].value;
if( displayText != oIEC[3].value )
{
// change the text field value,regard as a locale string
paramValue = oIEC[3].value;
// set isLocale flag
this.__parameter[k].name = this.__islocale;
this.__parameter[k].value = paramName;
k++;
}
// check if required
if( this.__is_parameter_required( oIEC )
&& birtUtility.trim( paramValue ) == '' && this.visible )
{
oIEC[3].focus( );
alert( birtUtility.formatMessage( Constants.error.parameterRequired, paramName ) );
return false;
}
// check if allow blank
if( !this.__is_parameter_allowblank( dataType )
&& birtUtility.trim( paramValue ) == '' && this.visible )
{
oIEC[3].focus( );
alert( birtUtility.formatMessage( Constants.error.parameterNotAllowBlank, paramName ) );
return false;
}
// set parameter value
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = paramName;
this.__parameter[k].value = paramValue;
k++;
// set display text
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = this.__isdisplay + this.__parameter[k-1].name;
this.__parameter[k].value = oIEC[3].value;
k++;
}
else
{
// select null value
this.__parameter[k].name = this.__isnull;
this.__parameter[k].value = oIEC[2].value;
k++;
}
}
// not allow null
else
{
var paramName = oIEC[2].name;
var fieldValue = oIEC[2].value;
var paramValue = oIEC[3].value;
var displayText = oIEC[4].value;
// convert spaces to non-breakable spaces if data type is a number
if ( this.__is_parameter_number( dataType ) )
{
fieldValue = this.__convert_spaces_to_nbsp( fieldValue );
}
if( displayText != fieldValue )
{
// change the text field value,regard as a locale string
paramValue = fieldValue;
// set isLocale flag
this.__parameter[k].name = this.__islocale;
this.__parameter[k].value = paramName;
k++;
}
// check if required
if( this.__is_parameter_required( oIEC )
&& birtUtility.trim( paramValue ) == '' && this.visible )
{
oIEC[2].focus( );
alert( birtUtility.formatMessage( Constants.error.parameterRequired, paramName ) );
return false;
}
// check if allow blank
if( !this.__is_parameter_allowblank( dataType )
&& birtUtility.trim( paramValue ) == '' && this.visible )
{
oIEC[2].focus( );
alert( birtUtility.formatMessage( Constants.error.parameterNotAllowBlank, paramName ) );
return false;
}
// set parameter value
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = paramName;
this.__parameter[k].value = paramValue;
k++;
// set display text
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = this.__isdisplay + this.__parameter[k-1].name;
this.__parameter[k].value = fieldValue;
k++;
}
continue;
}
// deal with "radio" parameter
if( oType == 'radio' )
{
var dataType = oIEC[1].value;
if( oIEC.length > 2 )
{
for( var j = 2; j < oIEC.length; j++ )
{
// deal with radio
if( oIEC[j].type == 'radio' && oIEC[j].checked )
{
// null value
if( oIEC[j].id == oIEC[j].name + "_null" )
{
this.__parameter[k].name = this.__isnull;
this.__parameter[k].value = oIEC[j].name;
k++;
}
else
{
// check if allow blank
if( !this.__is_parameter_allowblank( dataType )
&& birtUtility.trim( oIEC[j].value ) == '' && this.visible )
{
oIEC[j].focus( );
alert( birtUtility.formatMessage( Constants.error.parameterNotAllowBlank, oIEC[j].name ) );
return false;
}
// common radio value
this.__parameter[k].name = oIEC[j].name;
this.__parameter[k].value = oIEC[j].value;
k++;
// set display text for the "radio" parameter
var displayLabel = document.getElementById( oIEC[j].id + "_label" );
if( displayLabel )
{
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = this.__isdisplay + this.__parameter[k-1].name;
this.__parameter[k].value = displayLabel.title;
k++;
}
}
break;
}
}
}
continue;
}
// deal with "select" parameter
if( oType == 'select' && oSEC.length == 1 )
{
var dataType = oIEC[1].value;
var paramName = oIEC[2].name;
var flag = true;
if( oIEC[3] && oIEC[3].type == 'radio' && !oIEC[3].checked )
{
flag = false;
}
// need check selection
if( flag )
{
if ( this.__is_parameter_required( oIEC ) && oSEC[0].selectedIndex < 0 && this.visible )
{
oSEC[0].focus( );
alert( birtUtility.formatMessage( Constants.error.parameterNotSelected, paramName ) );
return false;
}
if( oSEC[0].multiple )
{
var options = oSEC[0].options;
for( var l = 0; l < options.length; l++ )
{
if( !options[l].selected )
continue;
var tempText = options[l].text;
var tempValue = options[l].value;
// check if isRequired
if( this.__is_parameter_required( oIEC )
&& birtUtility.trim( tempValue ) == '' && this.visible )
{
oSEC[0].focus( );
alert( birtUtility.formatMessage( Constants.error.parameterRequired, paramName ) );
return false;
}
if( tempValue == Constants.nullValue )
continue;
// check if allow blank
if( !this.__is_parameter_allowblank( dataType )
&& birtUtility.trim( tempValue ) == '' && this.visible )
{
oSEC[0].focus( );
alert( birtUtility.formatMessage( Constants.error.parameterNotAllowBlank, paramName ) );
return false;
}
}
}
else
{
var tempText = oSEC[0].options[oSEC[0].selectedIndex].text;
var tempValue = oSEC[0].options[oSEC[0].selectedIndex].value;
// check if isRequired
if ( this.__is_parameter_required( oIEC )
&& birtUtility.trim( tempValue ) == '' && this.visible )
{
oSEC[0].focus( );
alert( birtUtility.formatMessage( Constants.error.parameterRequired, paramName ) );
return false;
}
// Check if select 'Null Value' option for single parameter
if( tempValue == Constants.nullValue )
{
this.__parameter[k].name = this.__isnull;
this.__parameter[k].value = paramName;
k++;
continue;
}
// check if allow blank
if( !this.__is_parameter_allowblank( dataType )
&& birtUtility.trim( tempValue ) == '' && this.visible )
{
oSEC[0].focus( );
alert( birtUtility.formatMessage( Constants.error.parameterNotAllowBlank, paramName ) );
return false;
}
}
}
// allow new value
if( oIEC[3] && oIEC[3].type == 'radio' )
{
if( oIEC[3].checked )
{
// select value
var tempText = oSEC[0].options[oSEC[0].selectedIndex].text;
var tempValue = oSEC[0].options[oSEC[0].selectedIndex].value;
// set value
this.__parameter[k].name = paramName;
this.__parameter[k].value = tempValue;
k++;
// set display text
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = this.__isdisplay + this.__parameter[k-1].name;
this.__parameter[k].value = tempText;
k++;
}
else
{
var inputValue = oIEC[5].value;
var paramValue = oIEC[2].value;
var displayText = oIEC[6].value;
// if change the text field value or input text field isn't focus default,regard as a locale string
if( displayText != inputValue || oIEC[5].name.length <= 0 )
{
paramValue = inputValue;
// set isLocale flag
this.__parameter[k].name = this.__islocale;
this.__parameter[k].value = paramName;
k++;
}
// check if isRequired
if ( this.__is_parameter_required( oIEC )
&& birtUtility.trim( paramValue ) == '' && this.visible )
{
oIEC[5].focus( );
alert( birtUtility.formatMessage( Constants.error.parameterRequired, paramName ) );
return false;
}
// check if allow blank
if( !this.__is_parameter_allowblank( dataType )
&& birtUtility.trim( paramValue ) == '' && this.visible )
{
oIEC[5].focus( );
alert( birtUtility.formatMessage( Constants.error.parameterNotAllowBlank, paramName ) );
return false;
}
// set value
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = paramName;
this.__parameter[k].value = paramValue;
k++;
// set display text
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = this.__isdisplay + this.__parameter[k-1].name;
this.__parameter[k].value = inputValue;
k++;
}
}
else
{
// don't allow new value
// multi-value case
if( oSEC[0].multiple )
{
// allow multi value
var options = oSEC[0].options;
// record the old length
var ck = k;
for( var l = 0; l < options.length; l++ )
{
if( !options[l].selected )
continue;
var tempText = options[l].text;
var tempValue = options[l].value;
// Check if select 'Null Value' option
if( tempValue == Constants.nullValue )
{
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = this.__isnull;
this.__parameter[k].value = paramName;
k++;
continue;
}
// set value
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = paramName;
this.__parameter[k].value = tempValue;
k++;
// set display text
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = this.__isdisplay + this.__parameter[k-1].name;
this.__parameter[k].value = tempText;
k++;
}
// compare the length, if no any selection processed, should be an empty list.
if ( ck == k )
{
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = this.__isnulllist;
this.__parameter[k].value = paramName;
k++;
}
}
else
{
// allow single value
var tempText = oSEC[0].options[oSEC[0].selectedIndex].text;
var tempValue = oSEC[0].options[oSEC[0].selectedIndex].value;
// set value
this.__parameter[k].name = paramName;
this.__parameter[k].value = tempValue;
k++;
// set display text
if( !this.__parameter[k] )
{
this.__parameter[k] = { };
}
this.__parameter[k].name = this.__isdisplay + this.__parameter[k-1].name;
this.__parameter[k].value = tempText;
k++;
}
}
continue;
}
}
return true;
},
/**
* Check if current parameter is required or not.
*
* @oInputs, Input control collection
* @return, true or false
*/
__is_parameter_required : function( oInputs )
{
if( !oInputs || oInputs.length <= 0 )
return false;
var flag = false;
for( var i = 0; i< oInputs.length; i++ )
{
// if find defined input control
if( oInputs[i].id == 'isRequired' && oInputs[i].value == 'true' )
{
flag = true;
break;
}
}
return flag;
},
/**
* Check if current parameter allows blank value.
* Currently, only any and string data type parameter can allow blank value.
*
* @dataType, data type for parameter
* @return, true or false
*/
__is_parameter_allowblank : function( dataType )
{
if( !dataType )
return false;
if( dataType == Constants.TYPE_ANY )
return true;
if( dataType == Constants.TYPE_STRING )
return true;
return false;
},
/**
* Check if current parameter is a number.
*
* @dataType data type for parameter
* @return true or false
*/
__is_parameter_number : function( dataType )
{
if( !dataType )
return false;
return ( dataType == Constants.TYPE_FLOAT
|| dataType == Constants.TYPE_DECIMAL
|| dataType == Constants.TYPE_INTEGER );
},
/**
* Converts the spaces to non-breakable spaces (unicode 0x00a0).
* This is mandatory for numbers which use a space separator,
* because the server-side parser expects it.
* @param value formatted string to process
* @return processed string
*/
__convert_spaces_to_nbsp : function( aValue )
{
var value = aValue;
var startIndex = value.search(/\d/);
if ( startIndex < 0 )
{
return value;
}
var endIndex = value.search(/\d\D*$/);
if ( endIndex < 0 )
{
endIndex = value.length;
}
var prefix = value.substring(0, startIndex);
var suffix = value.substr(endIndex + 1);
var number = value.substring(startIndex, endIndex + 1).replace(/ /g,"\u00a0");
return prefix + number + suffix;
},
/**
* Handle mouseover event on select.
*
* @event, incoming browser native event
* @return, void
*/
__neh_mouseover_select : function( event )
{
var oSC = Event.element( event );
var tempText;
if( oSC.selectedIndex >=0 )
tempText = oSC.options[oSC.selectedIndex].text;
if( tempText && this._hint )
{
this._hint.innerHTML = tempText;
this._hint.style.display = "block";
this._hint.style.left = ( event.clientX - parseInt( this.__instance.style.left ) ) + "px";
this._hint.style.top = ( 15 + event.clientY - parseInt( this.__instance.style.top ) ) + "px";
}
},
/**
* Handle mouseout event on select.
*
* @event, incoming browser native event
* @return, void
*/
__neh_mouseout_select : function( event )
{
if( this._hint )
{
this._hint.style.display = "none";
}
},
/**
* Handle focus event on select elements.
*
* @event, incoming browser native event
* @return, void
*/
__neh_focus_select : function( event )
{
var el = Event.element( event );
if ( el )
{
this.__currentSelectedIndex = el.selectedIndex;
}
else
{
this.__currentSelectedIndex = -2;
}
},
/**
* Handle blur event on select elements.
*
* @event, incoming browser native event
* @return, void
*/
__neh_blur_select : function( event )
{
var el = Event.element( event );
// prevents firing onchange twice, if the previous onchange has
// already updated the current selected index
if ( el && el.selectedIndex != this.__currentSelectedIndex)
{
this.__neh_change_cascade_select( event );
}
this.__currentSelectedIndex = -2;
},
/**
* Handle change event when clicking on select.
*
* @event, incoming browser native event
* @return, void
*/
__neh_change_select : function( event )
{
var element = Event.element( event );
if ( element.selectedIndex >= 0 )
{
element.title = element.options[element.selectedIndex].text;
}
else
{
element.title = "";
}
},
/**
* Handle change event when clicking on cascading select.
*
* @event incoming browser native event
* @return
*/
__neh_change_cascade_select : function( event )
{
if ( this.__cancelOnChange )
{
/**
* Cancel event because of keyboard selection.
* Event will be fired later when the element loses focus (like in Firefox)
*/
this.__cancelOnChange = false;
return;
}
var element = Event.element( event );
this.__currentSelectedIndex = element.selectedIndex;
this.__refresh_cascade_select(element);
},
/**
* Refreshes the cascading elements following the given element.
*/
__refresh_cascade_select : function( element )
{
var matrix = new Array( );
var m = 0;
for( var i = 0; i < this.__cascadingParameter.length; i++ )
{
for( var j = 0; j < this.__cascadingParameter[i].length; j++ )
{
var paramName = this.__cascadingParameter[i][j].name;
if( paramName == this.__isnull )
paramName = this.__cascadingParameter[i][j].value;
if( paramName == element.id.substr( 0, element.id.length - 10 ) )
{
var tempText = element.options[element.selectedIndex].text;
var tempValue = element.options[element.selectedIndex].value;
// Null Value Parameter
if ( tempValue == Constants.nullValue )
{
this.__cascadingParameter[i][j].name = this.__isnull;
this.__cascadingParameter[i][j].value = paramName;
}
else if( tempValue == '' )
{
if( tempText == "" )
{
var target = element;
target = target.parentNode;
var oInputs = target.getElementsByTagName( "input" );
if( oInputs.length >0 && oInputs[1].value != Constants.TYPE_STRING )
{
// Only String parameter allows blank value
alert( birtUtility.formatMessage( Constants.error.parameterNotAllowBlank, paramName ) );
this.__clearSubCascadingParameter( this.__cascadingParameter[i], j );
return;
}
else
{
// Blank Value
this.__cascadingParameter[i][j].name = paramName;
this.__cascadingParameter[i][j].value = tempValue;
}
}
else
{
// Blank Value
this.__cascadingParameter[i][j].name = paramName;
this.__cascadingParameter[i][j].value = tempValue;
}
}
else
{
this.__cascadingParameter[i][j].name = paramName;
this.__cascadingParameter[i][j].value = tempValue;
}
for( var m = 0; m <= j; m++ )
{
if( !matrix[m] )
{
matrix[m] = {};
}
matrix[m].name = this.__cascadingParameter[i][m].name;
matrix[m].value = this.__cascadingParameter[i][m].value;
}
this.__pendingCascadingCalls++;
birtEventDispatcher.broadcastEvent( birtEvent.__E_CASCADING_PARAMETER, matrix );
}
}
}
},
/**
* Clear the sub cascading parameter for the elements
* following the given element
* @param element element
*/
__clearSubCascadingParameterByName: function(parameterName)
{
for( var i = 0; i < this.__cascadingParameter.length; i++ )
{
for( var j = 0; j < this.__cascadingParameter[i].length; j++ )
{
var paramName = this.__cascadingParameter[i][j].name;
if( paramName == parameterName )
{
this.__clearSubCascadingParameter( this.__cascadingParameter[i], j );
}
}
}
},
/**
* Clear the sub cascading parameter.
*
* @cascadingParameterGroup
* @index
* @return, void
*/
__clearSubCascadingParameter : function( cascadingParameterGroup, index )
{
for( var i = index + 1; i < cascadingParameterGroup.length; i++ )
{
var param_name = cascadingParameterGroup[i].name;
if( param_name == this.__isnull )
param_name = cascadingParameterGroup[i].value;
var selection = document.getElementById( param_name + "_selection" );
var len = selection.options.length;
// Clear our selection list.
for( var j = 0; j < len; j++ )
{
selection.remove( 0 );
}
}
},
/**
* Handle clicking on radio.
*
* @event, incoming browser native event
* @return, void
*/
__neh_click_radio : function( event )
{
var temp = Event.element( event );
var oInput = temp.parentNode.getElementsByTagName( "input" );
var oSelect = temp.parentNode.getElementsByTagName( "select" );
// check if current parameter is cascading parameter
var oCascadeFlag = false;
if ( oInput && oInput.length > 0 )
{
var oLastInput = oInput[oInput.length - 1];
if ( oLastInput.id == "isCascade" )
oCascadeFlag = ( oLastInput.value == "true" );
}
var oSelectElement = oSelect[0];
for( var i = 0; i < oInput.length; i++ )
{
if( oInput[i].id == temp.id )
{
var element = oInput[i+1];
//enable the next component
oInput[i].checked = true;
if( element && ( element.type == "text" || element.type == "password" ) )
{
element.disabled = false;
element.focus( );
if ( oCascadeFlag )
{
// refresh cascading elements (remove the "_input" suffix)
this.__clearSubCascadingParameterByName(element.id.substr(0, element.id.length - 6));
}
}
else if( oSelectElement )
{
oSelectElement.selectedIndex = 0;
oSelectElement.disabled = false;
oSelectElement.focus( );
if ( oCascadeFlag )
{
// refresh cascading elements (remove the "_selection" suffix)
this.__clearSubCascadingParameterByName(oSelectElement.id.substr(0, oSelectElement.id.length - 10));
}
}
}
// if i points to the element that must be disabled
else if( oInput[i].type == "radio" && oInput[i].id != temp.id )
{
var element = oInput[i+1];
//disable the next component and clear the radio
oInput[i].checked = false;
if( element && ( element.type == "text" || element.type == "password" ) )
{
element.disabled = true;
// if cascading parameter, clear value
if ( oCascadeFlag )
{
element.value = "";
}
}
else if( oSelectElement )
{
oSelectElement.disabled = true;
// if cascading parameter, clear value
if ( oCascadeFlag )
{
oSelectElement.selectedIndex = -1;
oSelectElement.title = "";
}
}
}
}
},
/**
* Check whether obj is the last select control
*/
__ifLastSelect : function( obj )
{
if( obj )
{
var oTABLE = obj.parentNode.parentNode.parentNode;
if( oTABLE )
{
var oSelect = oTABLE.getElementsByTagName( "select" );
if( oSelect && oSelect.length > 0 && oSelect[oSelect.length - 1].id == obj.id )
{
return true;
}
}
}
return false;
},
/**
* Handle changing on cascading parameter text field.
*
* @event, incoming browser native event
* @return, void
*/
__neh_change_cascade_text : function( event )
{
var temp = Event.element( event );
this.__refresh_cascade_text(temp);
},
/**
* Refresh cascade elements from a text box.
*/
__refresh_cascade_text : function( element )
{
// trim the "_text" suffix from the parameter name
var paramName = element.id.substr( 0, element.id.length - 6 );
var matrix = new Array( );
var m = 0;
for( var i = 0; i < this.__cascadingParameter.length; i++ )
{
for( var j = 0; j < this.__cascadingParameter[i].length; j++ )
{
if( this.__cascadingParameter[i][j].name == paramName )
{
this.__cascadingParameter[i][j].value = element.value;
for( var m = 0; m <= j; m++ )
{
if( !matrix[m] )
{
matrix[m] = {};
}
matrix[m].name = this.__prefix_islocale + this.__cascadingParameter[i][m].name;
matrix[m].value = this.__cascadingParameter[i][m].value;
}
this.__pendingCascadingCalls++;
birtEventDispatcher.broadcastEvent( birtEvent.__E_CASCADING_PARAMETER, matrix );
}
}
}
},
/**
* Handle press "Enter" key.
*
* @event, incoming browser native event
* @return, void
*/
__neh_keydown: function( event )
{
// If press 'Enter' key
if( event.keyCode == 13 )
{
var target = Event.element( event );
// Focus on INPUT and SELECT controls
if ( target.tagName == "INPUT" || target.tagName == "SELECT" )
{
// (exclude 'button' type for non-Safari browsers)
if ( target.type != "button" )
{
// blur the focus to force the onchange/onselect events
target.blur();
// defer okPress to let those events run first
window.setTimeout( this.__okPress.bindAsEventListener(this), 0 );
}
// Safari needs explicit click
else if ( BrowserUtility.isSafari || BrowserUtility.isKHTML )
{
target.click();
// prevent browser "beep"
Event.stop( event );
}
}
}
// in IE, when a key is pressed on a select box, cancel the onchange event
else if ( BrowserUtility.isIE && event.keyCode != 9 && Event.element( event ).tagName == "SELECT" )
{
this.__cancelOnChange = true;
}
},
/**
* Handle clicking on okRun.
*
* @event, incoming browser native event
* @return, void
*/
__okPress : function( )
{
// if a cascading parameter just changed
if ( this.__pendingCascadingCalls > 0 )
{
debug("defer okPress call");
// defer the call to the okPress function until the data has been updated
this.__onDataChanged = this.__okPress.bindAsEventListener(this);
return;
}
if( birtParameterDialog.collect_parameter( ) )
{
// workaround for Bugzilla Bug 146566.
// If change parameter and re-generate docuemnt file, close TOC panel.
if ( this.__mode == Constants.SERVLET_FRAMESET )
{
var oToc = $( 'display0' );
var oDoc = $( 'Document' );
if( oToc && oDoc )
{
oDoc.style.width = BirtPosition.viewportWidth( ) + "px";
oToc.style.display="none";
oToc.query = '0';
}
}
var action = soapURL.toLowerCase( );
if ( this.__mode == Constants.SERVLET_PARAMETER )
{
// check whether set __nocache setting in URL
if ( this.__ifCache( action ) )
birtEventDispatcher.broadcastEvent( birtEvent.__E_CACHE_PARAMETER );
else
this.__doSubmitWithPattern( );
}
else if ( this.__ifSubmit( this.__mode, action ) )
{
this.__doSubmit( );
}
else
{
if( this.__mode == Constants.SERVLET_FRAMESET )
{
var targetPage = "1";
var bookmark = birtUtility.getURLParameter(soapURL, "bookmark");
// if a bookmark is defined, reset the target page
// to force the server-side to use it
if ( bookmark && bookmark.length > 0 )
{
targetPage = "";
}
var oPageNumber = $( 'pageNumber' );
if ( oPageNumber )
{
oPageNumber.innerHTML = targetPage;
}
birtEventDispatcher.broadcastEvent( birtEvent.__E_CHANGE_PARAMETER );
}
else
{
// if 'run' mode, fire GetPageAll event
this.__init_page_all( );
}
this.__l_hide( );
}
}
},
/**
* Override cancel button click.
*/
__neh_cancel : function( )
{
// if cascading parameter calls are pending
if ( this.__pendingCascadingCalls > 0 )
{
// prevent the response to popup the dialog again
this.__cancelShow = true;
// reset the counter for the next time the dialog is needed
this.__pendingCascadingCalls = 0;
}
if ( this.__mode == Constants.SERVLET_PARAMETER )
{
this.__cancel();
}
else
{
this.__l_hide( );
}
},
/**
* Handle submit form with defined servlet pattern and current parameters.
*
* @return, void
*/
__doSubmitWithPattern : function( )
{
var url = soapURL;
// parse pattern
var reg = new RegExp( "[&|?]{1}__pattern\s*=([^&|^#]*)", "gi" );
var arr = url.match( reg );
var pattern;
if( arr && arr.length > 0 )
pattern = RegExp.$1;
else
pattern = "frameset";
// parse target
reg = new RegExp( "[&|?]{1}__target\s*=([^&|^#]*)", "gi" );
arr = url.match( reg );
var target;
if( arr && arr.length > 0 )
target = RegExp.$1;
reg = new RegExp( "[^/|^?]*[?]{1}", "gi" );
if( url.search( reg ) > -1 )
url = url.replace( reg, pattern + "?" );
this.__doSubmit( url, target );
},
/**
* Handle submit form with current parameters.
*
* @param, url
* @param, target
* @return, void
*/
__doSubmit : function( url, target )
{
var action = url;
if( !action )
action = soapURL;
var divObj = document.createElement( "DIV" );
document.body.appendChild( divObj );
divObj.style.display = "none";
var formObj = document.createElement( "FORM" );
divObj.appendChild( formObj );
if ( this.__parameter != null )
{
for( var i = 0; i < this.__parameter.length; i++ )
{
var param = document.createElement( "INPUT" );
formObj.appendChild( param );
param.TYPE = "HIDDEN";
param.name = this.__parameter[i].name;
param.value = this.__parameter[i].value;
//replace the URL parameter
var reg = new RegExp( "&" + param.name + "[^&]*&*", "g" );
action = action.replace( reg, "&" );
}
}
if ( Constants.viewingSessionId )
{
// append sub session in the POST part
birtUtility.addHiddenFormField(formObj, Constants.PARAM_SESSION_ID, Constants.viewingSessionId);
action = birtUtility.deleteURLParameter(action, Constants.PARAM_SESSION_ID);
}
// replace __parameterpage setting
var reg = new RegExp( "([&|?]{1})(__parameterpage\s*=[^&|^#]*)","gi" );
if ( action.search( reg ) > -1 )
{
action = action.replace( reg, "$1" );
}
// set target window
if( target )
formObj.target = target;
formObj.action = action;
formObj.method = "post";
// if don't set target, hide the parameter dialog
if( !target )
this.__l_hide( );
formObj.submit( );
},
/**
* Caching parameters success, close window.
*
* @return, void
*/
__close : function( )
{
if ( BrowserUtility.__isIE( ) )
{
window.opener = null;
window.close( );
}
else
{
window.status = "close";
}
},
/**
* Click 'Cancel', close window.
*
* @return, void
*/
__cancel : function( )
{
window.status = "cancel";
document.title = "cancel";
},
/**
Called right before element is shown
*/
__preShow: function()
{
// disable the toolbar buttons
birtUtility.setButtonsDisabled ( "toolbar", true );
// disable the Navigation Bar buttons
birtUtility.setButtonsDisabled ( "navigationBar", true );
// set preVisible
this.preVisible = this.visible;
},
/**
* Override the dialog's show method.
*/
__l_show: function()
{
if ( !this.__cancelShow )
{
// call to superclass method
AbstractParameterDialog.prototype.__l_show.call( this );
}
this.__cancelShow = false;
},
/**
Called after element is shown
*/
__postShow: function()
{
// if previous is visible, return directly
if( this.preVisible )
return;
// focus on the first input text/password or select or button control
this.__init_focus( );
},
/**
* Try to focus on the first control.
* Input text/password, select and button.
*/
__init_focus: function( )
{
var oFirstITC;
var oFirstIBT;
var oFirstST;
var oITCs = this.__instance.getElementsByTagName( "input" );
for( var i = 0; i < oITCs.length; i++ )
{
// get the first input text/password control
if( oITCs[i].type == "text"
|| oITCs[i].type == "password" )
{
if( !oITCs[i].disabled && !oFirstITC )
{
oFirstITC = oITCs[i];
}
continue;
}
// get the first input button control
if( !oFirstIBT && oITCs[i].type == "button" && !oITCs[i].disabled )
{
oFirstIBT = oITCs[i];
}
}
// get the first select control
var oSTs = this.__instance.getElementsByTagName( "select" );
for( var i = 0; i < oSTs.length; i++ )
{
if( !oSTs[i].disabled )
{
oFirstST = oSTs[i];
break;
}
}
if( oFirstITC && !oFirstST )
{
// if exist input text/password, no select control
oFirstITC.focus( );
}
else if( !oFirstITC && oFirstST )
{
// if exist select control, no input text/password
oFirstST.focus( );
}
else if( oFirstITC && oFirstST )
{
// exist select control and input text/password
// compare the parent div offsetTop
if( oFirstITC.parentNode && oFirstST.parentNode )
{
// Bugzilla 265615: need to use cumulative offset for special cases
// where one element is inside a group container
var offsetITC = Position.cumulativeOffset( oFirstITC );
var offsetST = Position.cumulativeOffset( oFirstST );
// compare y-offset first, then x-offset to determine the visual order
if( ( offsetITC[1] > offsetST[1] ) || ( offsetITC[1] == offsetST[1] && offsetITC[0] > offsetST[0] ) )
{
oFirstST.focus( );
}
else
{
oFirstITC.focus( );
}
}
else
{
// default to focus on input control
oFirstITC.focus( );
}
}
else
{
// focus on button control
oFirstIBT.focus( );
}
},
/**
Called before element is hidden
*/
__preHide: function( )
{
// enable the toolbar buttons
birtUtility.setButtonsDisabled ( "toolbar", false );
// enable the Navigation Bar buttons
birtUtility.setButtonsDisabled ( "navigationBar", false );
},
/**
* Retrieve all pages
*/
__init_page_all: function( )
{
if( birtParameterDialog.collect_parameter( ) )
{
birtEventDispatcher.broadcastEvent( birtEvent.__E_GETPAGE_ALL );
}
},
/**
* Check if cache parameter, default to true
*
* @param url
* @return, true or false
*/
__ifCache: function( url )
{
if( url )
url = url.toLowerCase( );
else
url = "";
// if don't set __nocache, default is true
var reg = new RegExp( "[&|?]{1}__nocache[^&|^#]*", "gi" );
if( url.search( reg ) < 0 )
return true;
else
return false;
return true;
},
/**
* Check if submit request
* @param mode
* @param url
* @return, true or false
*/
__ifSubmit: function( mode, url )
{
// if use '/preview' pattern, submit anyway
if( mode == 'preview' )
return true;
if( url )
url = url.toLowerCase( );
else
url = "";
// if use '/frameset' or '/run', check format.
// if format is not HTML, submit request.
if( mode == 'run' || mode == 'frameset' )
{
var format = Constants.request.format;
return !( format == "htm" || format == "html" );
}
return false;
}
}
);