You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
548 lines
16 KiB
548 lines
16 KiB
/* Copyright (c) Business Objects 2006. All rights reserved. */
|
|
|
|
/*
|
|
================================================================================
|
|
ViewerFlexParameterAdapter.js
|
|
|
|
Viewer's implementaion for flex prompting UI
|
|
================================================================================
|
|
*/
|
|
|
|
bobj.crv.params.ViewerFlexParameterAdapter = {
|
|
_viewerLayoutType : [],
|
|
_promptData : [],
|
|
_paramCtrl : [],
|
|
_iParam : [],
|
|
_iPromptUnitData : [],
|
|
_iParamData : [],
|
|
_moveArea : null,
|
|
|
|
///////////////////////////
|
|
// Member setters
|
|
//////////////////////////
|
|
setViewerLayoutType : function(id, l) {
|
|
this._viewerLayoutType[id] = l;
|
|
},
|
|
|
|
setPromptData : function(id, d, forIParams) {
|
|
if (!forIParams){
|
|
/* Full prompt UI data */
|
|
this._promptData[id] = d;
|
|
this.clearIParamPromptUnitData(id);
|
|
}else{
|
|
/* Interactive prompt UI data */
|
|
for(var i = 0, l = d.length; i < l; i++) {
|
|
var unit = d[i];
|
|
this._addIParamPromptUnitData(id, unit.id, unit.names, unit.data);
|
|
}
|
|
}
|
|
},
|
|
|
|
setCurrentIParamInfo : function(id, c, p) {
|
|
this._paramCtrl[id] = c;
|
|
this._iParam[id] = p;
|
|
},
|
|
|
|
getShowMinUI : function (id) {
|
|
return this.hasIParamPromptUnitData(id);
|
|
},
|
|
|
|
getWidth : function (id) {
|
|
if(this.hasIParamPromptUnitData(id))
|
|
return 300;
|
|
else
|
|
return this.getSWFWidth(id);
|
|
},
|
|
|
|
getHeight : function (id) {
|
|
if(this.hasIParamPromptUnitData(id))
|
|
return 315;
|
|
else
|
|
return this.getSWFHeight(id);
|
|
},
|
|
|
|
getScreenHeight : function (id) {
|
|
var lDim = MochiKit.Style.getElementDimensions(getLayer(id));
|
|
return lDim.h - 2;
|
|
},
|
|
|
|
getScreenWidth : function (id) {
|
|
var lDim = MochiKit.Style.getElementDimensions(getLayer(id));
|
|
return lDim.w - 2;
|
|
},
|
|
|
|
/*
|
|
* Returns the ideal height of the prompting window
|
|
*/
|
|
getSWFHeight : function(id) {
|
|
var lTypes = bobj.crv.Viewer.LayoutTypes;
|
|
var layout = lTypes.CLIENT;
|
|
if (this._viewerLayoutType[id]) {
|
|
layout = this._viewerLayoutType[id];
|
|
}
|
|
|
|
var min = layout === lTypes.FIXED ? 0 : 480;
|
|
var sH = this.getScreenHeight(id);
|
|
return Math.max(min, sH - 200);
|
|
},
|
|
|
|
getSWFWidth : function(id) {
|
|
var sW = this.getScreenWidth(id);
|
|
return Math.min(600, sW - 20);
|
|
},
|
|
|
|
getAllowFullScreen : function(id)
|
|
{
|
|
return !this.hasIParamPromptUnitData(id);
|
|
},
|
|
|
|
hasIParamPromptUnitData : function (id) {
|
|
return (this._iPromptUnitData[id] != null) && (this._iParamData[id] != null) && (this._iParam[id] != null);
|
|
},
|
|
|
|
_addIParamPromptUnitData : function(id, unitID, names, data) {
|
|
if (!this.hasIParamPromptUnitData(id)) {
|
|
this._iPromptUnitData[id] = [];
|
|
this._iParamData[id] = [];
|
|
}
|
|
|
|
this._iPromptUnitData[id][unitID] = data;
|
|
for ( var i = 0, len = names.length; i < len; i++) {
|
|
this._iParamData[id][names[i]] = unitID;
|
|
}
|
|
},
|
|
|
|
clearIParamPromptUnitData : function (id) {
|
|
if (!this.hasIParamPromptUnitData(id)) {
|
|
return;
|
|
}
|
|
|
|
delete this._iPromptUnitData[id];
|
|
delete this._iParamData[id];
|
|
delete this._iParam[id];
|
|
},
|
|
|
|
///////////////////////////
|
|
// Callbacks
|
|
//////////////////////////
|
|
|
|
getPromptData : function (id) {
|
|
if (this.hasIParamPromptUnitData(id)) {
|
|
var promptUUID = this._iParamData[id][this._iParam[id].paramName];
|
|
if (promptUUID) {
|
|
return this._iPromptUnitData[id][promptUUID];
|
|
}
|
|
}
|
|
|
|
return this._promptData[id];
|
|
},
|
|
|
|
/**
|
|
* Flex callback to start moving the dialog
|
|
*/
|
|
startDrag : function(id) {
|
|
var swf = bobj.crv.params.FlexParameterBridge.getSWF(id);
|
|
if (swf) {
|
|
if (this._moveArea) {
|
|
return;
|
|
}
|
|
|
|
this._moveArea = document.createElement('div');
|
|
this._moveArea.id = bobj.uniqueId();
|
|
|
|
MOVE_STYLE = this._moveArea.style;
|
|
|
|
var STYLE = swf.style;
|
|
var P_STYLE = swf.parentNode.style;
|
|
|
|
MOVE_STYLE.top = P_STYLE.top;
|
|
MOVE_STYLE.left = P_STYLE.left;
|
|
MOVE_STYLE.width = STYLE.width ? STYLE.width : swf.width + 'px';
|
|
MOVE_STYLE.height = STYLE.height ? STYLE.height : swf.height + 'px';;
|
|
MOVE_STYLE.border = '1px';
|
|
MOVE_STYLE.borderStyle = 'solid';
|
|
MOVE_STYLE.borderColor = '#000000';
|
|
MOVE_STYLE.backgroundColor = '#FFFFFF';
|
|
MOVE_STYLE.position = 'absolute';
|
|
MOVE_STYLE.opacity = 0.50;
|
|
MOVE_STYLE.filter = 'alpha(opacity=50)';
|
|
MOVE_STYLE.zIndex = bobj.constants.modalLayerIndex - 1;
|
|
|
|
document.body.appendChild(this._moveArea);
|
|
document.body.style.cursor = 'move';
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Flex callback when finished moving the dialog
|
|
*/
|
|
stopDrag : function(id) {
|
|
if (this._moveArea) {
|
|
var p = MochiKit.Style.getElementPosition(this._moveArea);
|
|
this.move(id, p.x, p.y);
|
|
|
|
document.body.removeChild(this._moveArea);
|
|
delete this._moveArea;
|
|
|
|
document.body.style.cursor = 'default';
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Flex callback for moving the dialog.
|
|
* x is the amount to move on the x axis, -:left +:right
|
|
* y is the amount to move on the y axis, -:up +:down
|
|
*/
|
|
drag : function(id, x, y) {
|
|
var LOG = bobj.crv.logger;
|
|
LOG.info('doMove Called viewer:' + id + ' x:' + x + ' y:' + y);
|
|
|
|
var l = getLayer(id);
|
|
if (!l) {
|
|
LOG.error('Shifting SWF could not find the viewer:' + id);
|
|
return;
|
|
}
|
|
|
|
var m = this._moveArea;
|
|
if (!m) {
|
|
LOG.error('Unable to move SWF, no move area available');
|
|
return;
|
|
}
|
|
|
|
var mX = m.offsetLeft;
|
|
var mY = m.offsetTop;
|
|
var mH = m.offsetHeight;
|
|
var mW = m.offsetWidth;
|
|
var vX = l.offsetLeft;
|
|
var vY = l.offsetTop;
|
|
var vH = l.offsetHeight;
|
|
var vW = l.offsetWidth;
|
|
|
|
var newX = mX + x;
|
|
var newY = mY + y;
|
|
|
|
if (newY < vY) {
|
|
newY = vY;
|
|
} else if (newY + mH > vY + vH) {
|
|
newY = vH - mH;
|
|
}
|
|
|
|
if (newX < vX) {
|
|
newX = vX;
|
|
} else if (newX + mW > vX + vW) {
|
|
newX = vW - mW;
|
|
}
|
|
|
|
m.style.top = newY + 'px';
|
|
m.style.left = newX + 'px';
|
|
|
|
LOG.info('Moved the SWF to x:' + newX + ' y:' + newY);
|
|
},
|
|
|
|
|
|
/**
|
|
* Flex callback when finished moving the dialog
|
|
*/
|
|
move : function(id, x, y) {
|
|
var swf = bobj.crv.params.FlexParameterBridge.getSWF(id);
|
|
if (swf) {
|
|
var p = new MochiKit.Style.Coordinates(x,y);
|
|
MochiKit.Style.setElementPosition(swf.parentNode, p);
|
|
}
|
|
},
|
|
|
|
setParamValues : function(id, valueData) {
|
|
bobj.crv.logger.info('setting parameter values');
|
|
if (this.hasIParamPromptUnitData(id)){
|
|
this._setIParamValues (id, valueData);
|
|
} else {
|
|
this._setFullParamValues (id, valueData);
|
|
this.closeDialog(id);
|
|
}
|
|
},
|
|
|
|
_setFullParamValues : function (id, valueData) {
|
|
bobj.event.publish('crprompt_flexparam', id, valueData);
|
|
},
|
|
|
|
_setIParamValues : function (id, valueData) {
|
|
var param = this._iParam[id];
|
|
var ctrl = this._paramCtrl[id];
|
|
var data = this._iParamData[id];
|
|
var unitData = this._iPromptUnitData[id];
|
|
|
|
if (!param || !ctrl || !data || !unitData || valueData.length != 1) {
|
|
return;
|
|
}
|
|
|
|
var vPromptUnit = valueData[0];
|
|
var vPrompts = vPromptUnit.prompts;
|
|
for (var i = 0, len = vPrompts.length; i < len; i++) {
|
|
var vPrompt = vPrompts[i];
|
|
|
|
if (!vPrompt || !vPrompt.name || !vPrompt.values) {
|
|
continue;
|
|
}
|
|
|
|
ctrl.updateParameter(decodeURI(vPrompt.name), this._convertFlexValues(vPrompt, param.valueDataType));
|
|
}
|
|
|
|
ctrl._updateToolbar();
|
|
|
|
this._updatePromptData(id, vPromptUnit, param.valueDataType);
|
|
|
|
this.closeDialog(id);
|
|
},
|
|
|
|
_updatePromptData: function (id, newUnitData, type){
|
|
var newPrompts = newUnitData.prompts;
|
|
|
|
var data = this._iPromptUnitData[id][newUnitData.id];
|
|
var unitData = data.promptUnits[0];
|
|
var prompts = unitData.prompts;
|
|
for (var i = 0, pLen = prompts.length; i < pLen; i++) {
|
|
var prompt = prompts[i];
|
|
for (var j = 0, npLen = newPrompts.length; j < npLen; j++) {
|
|
var newPrompt = newPrompts[j];
|
|
if (prompt.id == newPrompt.id){
|
|
prompt.values = this._unescapeFlexValues(newPrompt.values, type);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
_unescapeFlexValues: function (fValues, type){
|
|
if (type != bobj.crv.params.DataTypes.STRING) {
|
|
return fValues;
|
|
}
|
|
|
|
for (var i = 0, len = fValues.length; i < len; i++) {
|
|
this._unescapeFlexValue(fValues[i], type);
|
|
}
|
|
|
|
return fValues;
|
|
},
|
|
|
|
_unescapeFlexValue: function (fValue, type) {
|
|
if (type != bobj.crv.params.DataTypes.STRING) {
|
|
return;
|
|
}
|
|
|
|
if ((fValue.value !== undefined && fValue.value !== null)){
|
|
fValue.value = decodeURI(fValue.value);
|
|
|
|
if (fValue.labels !== undefined && fValue.labels !== null){
|
|
for (var i = 0, len = fValue.labels.length; i < len; i++) {
|
|
fValue.labels[i] = decodeURI(fValue.labels[i]);
|
|
}
|
|
}
|
|
|
|
} else {
|
|
// Range
|
|
if (fValue.start){
|
|
this._unescapeFlexValue(fValue.start, type);
|
|
}
|
|
|
|
if (fValue.end){
|
|
this._unescapeFlexValue(fValue.end, type);
|
|
}
|
|
}
|
|
},
|
|
|
|
_getDescriptionIndex: function (prompt)
|
|
{
|
|
var vIndex = prompt.lovValueIndex;
|
|
var types = prompt.lovFieldTypes;
|
|
if (vIndex !== undefined && types !== undefined)
|
|
{
|
|
for (var i=0, len=types.length; i<len; i++) {
|
|
if (i != vIndex && types[i] == "s"){
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
},
|
|
|
|
_convertFlexValues: function (prompt, type){
|
|
var dIndex = this._getDescriptionIndex(prompt);
|
|
var fValues = prompt.values;
|
|
var jsValues = [];
|
|
for (var i = 0, len = fValues.length; i < len; i++) {
|
|
jsValues.push(this._convertFlexValue(fValues[i], type, dIndex));
|
|
}
|
|
return jsValues;
|
|
},
|
|
|
|
_convertFlexValue: function (fValue, type, dIndex) {
|
|
var jsValue = {};
|
|
if ((fValue.value !== undefined && fValue.value !== null)){
|
|
// Discrete
|
|
if (dIndex > -1 && fValue.labels && fValue.labels.length > dIndex){
|
|
jsValue.desc = decodeURI(fValue.labels[dIndex]);
|
|
}
|
|
|
|
var Type = bobj.crv.params.DataTypes;
|
|
switch (type) {
|
|
case Type.DATE:
|
|
case Type.TIME:
|
|
case Type.DATE_TIME:
|
|
jsValue.value = this._convertDateTimeFlexValue(fValue.value, type);
|
|
break;
|
|
default:
|
|
jsValue.value = decodeURI(fValue.value);
|
|
break;
|
|
}
|
|
|
|
} else {
|
|
// Range
|
|
if (fValue.start){
|
|
jsValue.lowerBoundType = fValue.start.inc == true ? 2 : 1;
|
|
jsValue.beginValue = this._convertFlexValue(fValue.start, type);
|
|
} else {
|
|
jsValue.lowerBoundType = 0;
|
|
}
|
|
|
|
if (fValue.end){
|
|
jsValue.upperBoundType = fValue.end.inc == true ? 2 : 1;
|
|
jsValue.endValue = this._convertFlexValue(fValue.end, type);
|
|
} else {
|
|
jsValue.upperBoundType = 0;
|
|
}
|
|
}
|
|
|
|
return jsValue;
|
|
},
|
|
|
|
_convertDateTimeFlexValue : function (fValue, type) {
|
|
var Type = bobj.crv.params.DataTypes;
|
|
var dValue = {};
|
|
var parts = fValue.split(',');
|
|
switch(type) {
|
|
case Type.DATE:
|
|
dValue.y = parseInt(parts[0].substring(5), 10);
|
|
dValue.m = parseInt(parts[1], 10) - 1;
|
|
dValue.d = parseInt(parts[2].substring(parts[2].length - 1, 0), 10);
|
|
break;
|
|
|
|
case Type.TIME:
|
|
dValue.h = parseInt(parts[0].substring(5), 10);
|
|
dValue.min = parseInt(parts[1], 10);
|
|
dValue.s = parseInt(parts[2].substring(parts[2].length - 1, 0), 10);
|
|
dValue.ms = 0;
|
|
break;
|
|
|
|
case Type.DATE_TIME:
|
|
dValue.y = parseInt(parts[0].substring(9), 10);
|
|
dValue.m = parseInt(parts[1], 10) - 1;
|
|
dValue.d = parseInt(parts[2], 10);
|
|
dValue.h = parseInt(parts[3], 10);
|
|
dValue.min = parseInt(parts[4]);
|
|
dValue.s = parseInt(parts[5].substring(parts[5].length - 1, 0), 10);
|
|
dValue.ms = 0;
|
|
break;
|
|
}
|
|
return dValue;
|
|
},
|
|
|
|
|
|
logon : function(id, logonData) {
|
|
bobj.crv.logger.info('logging on');
|
|
this.closeDialog(id);
|
|
bobj.event.publish('crprompt_flexlogon', id, logonData);
|
|
},
|
|
|
|
processingCancel : function(id) {
|
|
var v = getWidgetFromID(id);
|
|
if (v && v._reportProcessing) {
|
|
v._reportProcessing.cancelShow();
|
|
}
|
|
},
|
|
|
|
processingDelayedShow : function(id) {
|
|
var v = getWidgetFromID(id);
|
|
if (v && v._reportProcessing) {
|
|
v._reportProcessing.delayedShow();
|
|
}
|
|
},
|
|
|
|
logger : function(text) {
|
|
bobj.crv.logger.info(text);
|
|
},
|
|
|
|
getSWFBaseURL : function() {
|
|
return bobj.crvUri("../../swf/");
|
|
},
|
|
|
|
getSWFID : function() {
|
|
return bobj.uniqueId();
|
|
},
|
|
|
|
getZIndex : function() {
|
|
return bobj.constants.modalLayerIndex;
|
|
},
|
|
|
|
getUseSavedData : function(id) {
|
|
return this.hasIParamPromptUnitData(id);
|
|
},
|
|
|
|
closeDialog : function(id) {
|
|
var v = getWidgetFromID(id);
|
|
if (v) {
|
|
v.hideFlexPromptDialog();
|
|
}
|
|
},
|
|
|
|
getUseOKCancelButtons : function(id) {
|
|
return this.hasIParamPromptUnitData(id);
|
|
},
|
|
|
|
getIsDialog : function(id) {
|
|
return true;
|
|
},
|
|
|
|
getShouldAutoResize : function(id) {
|
|
return true;
|
|
},
|
|
|
|
setVisibility : function(id) {
|
|
var swf = bobj.crv.params.FlexParameterBridge.getSWF(id);
|
|
if (swf) {
|
|
var P_STYLE = swf.parentNode.style;
|
|
|
|
P_STYLE.position = 'absolute';
|
|
P_STYLE.visibility = 'visible';
|
|
P_STYLE.borderStyle = 'none';
|
|
P_STYLE.opacity = 1;
|
|
|
|
if (swf.focus !== undefined) {
|
|
swf.focus();
|
|
}
|
|
}
|
|
},
|
|
|
|
getReportStateInfo : function(id) {
|
|
var s = bobj.crv.stateManager.getComponentState(id);
|
|
if (s && s.common && s.common.reqCtx) {
|
|
return MochiKit.Base.serializeJSON(s.common.reqCtx);
|
|
}
|
|
},
|
|
|
|
setReportStateInfo : function(id, rsInfo) {
|
|
var s = bobj.crv.stateManager.getComponentState(id);
|
|
if (s && s.common && s.common.reqCtx) {
|
|
s.common.reqCtx = MochiKit.Base.evalJSON(unescape(rsInfo));
|
|
}
|
|
},
|
|
|
|
sendAsyncRequest : function(id, args) {
|
|
bobj.event.publish('crprompt_asyncrequest', id, args);
|
|
},
|
|
|
|
readyToShow: function(id) {
|
|
this.processingCancel(id);
|
|
}
|
|
};
|