|
|
function DoNothing() { // Stub
}
//******************************
// BUILD TASKPAD BUTTON FUNCTION
//******************************
function BuildTaskpadButtons( iPageStyle ) { var szNextButton;
for( var i = 0; i <= giTotalButtons; i++ ) { szNextButton = GetNextButton( iPageStyle, i ); divSymbolContainer.insertAdjacentHTML ( 'BeforeEnd', szNextButton ); } }
//**************************
// GET NEXT BUTTON FUNCTIONS
//**************************
function GetNextButton( iPageStyle, theIndex ) { // Calculate the column & row placement of the button
// based on its index
var theColumn = theIndex % giTotalColumns; // mod returns column
var theRow = Math.floor( theIndex / giTotalColumns ); // division returns row
// Multiply row & column by offset base to determine relative placement
// of button in percentage terms.
switch( iPageStyle ) { case CON_TASKPAD_STYLE_VERTICAL1: // Vertical layout with 2 listviews
var iLeftLoc = theColumn * 52; // columns are 52% apart in this layout
var iTopLoc = theRow * 25; // rows are 25% apart in this layout
break; case CON_TASKPAD_STYLE_HORIZONTAL1: // Horizontal layout with 1 listview
var iLeftLoc = theColumn * 25; // columns are 25% apart in this layout
var iTopLoc = theRow * 52; // rows are 52% apart in this layout
break; case CON_TASKPAD_STYLE_NOLISTVIEW: // Buttons-only layout (no listview)
var iLeftLoc = theColumn * 25; // columns are 25% apart in this layout
var iTopLoc = theRow * 25; // rows are 25% apart in this layout
break; } // Get the HTML for the button
var szFormattedBtn; szFormattedBtn = GetButtonHTML(gaiBtnObjectType[theIndex], theIndex, iLeftLoc, iTopLoc) return szFormattedBtn; }
//*************************
// GET BUTTON HTML FUNCTION
//*************************
function GetButtonHTML(iBtnType, theIndex, iLeftLoc, iTopLoc) { // Build up the HTML for the button
var szBtnHTML = ''; switch( iBtnType ) { case CON_TASK_DISPLAY_TYPE_SYMBOL: // EOT-based symbol | font
szBtnHTML += '<DIV class=divSymbol id=divSymbol_' + theIndex + ' style=\"LEFT: ' + iLeftLoc + '%; TOP: ' + iTopLoc + '%\">\n'; szBtnHTML += '<TABLE border=0 cellPadding=0 cellSpacing=0 frame=none rules=none width=100%>\n'; szBtnHTML += '<TBODY>\n'; szBtnHTML += '<TR>\n'; szBtnHTML += '<TD align=middle class=tdSymbol id=tdSymbol_' + theIndex + ' noWrap vAlign=top>'; szBtnHTML += '<SPAN class=clsSymbolBtn id=spanSymbol_' + theIndex + ' '; szBtnHTML += 'style=\"COLOR: windowtext; FONT-FAMILY: Webdings; FONT-SIZE: 68px; FONT-WEIGHT: normal\" TaskpadButton>'; szBtnHTML += '<!--Insert Here--></SPAN></TD></TR>\n'; szBtnHTML += '<TR>\n'; szBtnHTML += '<TD align=middle class=tdSymbol id=tdSymbol_' + theIndex + ' vAlign=top width=100%>'; szBtnHTML += '<A class=clsSymbolBtn href=\"\" id=anchorCaption_' + theIndex + ' '; szBtnHTML += 'style=\"COLOR: windowtext; FONT-SIZE: 18px; TEXT-DECORATION: none\" TaskpadButton>'; szBtnHTML += '<!--Insert Here--></A></TD></TR></TBODY></TABLE></DIV><!--divSymbol_' + theIndex + '-->\n'; break; case CON_TASK_DISPLAY_TYPE_VANILLA_GIF: // (GIF) index 0 is transparent
case CON_TASK_DISPLAY_TYPE_CHOCOLATE_GIF: // (GIF) index 1 is transparent
szBtnHTML += '<DIV class=divSymbol id=divSymbol_' + theIndex + ' style=\"LEFT: ' + iLeftLoc + '%; TOP: ' + iTopLoc + '%\">\n'; szBtnHTML += '<TABLE border=0 cellPadding=0 cellSpacing=0 frame=none rules=none width=100%>\n'; szBtnHTML += '<TBODY>\n'; szBtnHTML += '<TR>\n'; szBtnHTML += '<TD align=middle class=tdSymbol id=tdSymbol_' + theIndex + ' noWrap vAlign=top>'; szBtnHTML += '<IMG class=clsTaskBtn height=250 id=imgTaskBtn_' + theIndex + ' src=\"\" '; szBtnHTML += 'style=\"FILTER: mask(color=000000); HEIGHT: 66px; WIDTH: 66px\" width=250 TaskpadButton></TD></TR>\n'; szBtnHTML += '<TR>\n'; szBtnHTML += '<TD align=middle class=tdSymbol id=tdAnchor_' + theIndex + ' vAlign=top width=100% TaskpadButton>'; szBtnHTML += '<A class=clsSymbolBtn href=\"\" id=anchorCaption_' + theIndex + ' '; szBtnHTML += 'style=\"FONT-SIZE: 18px\" TaskpadButton>'; szBtnHTML += '<!--Insert Here--></A></TD></TR></TBODY></TABLE></DIV><!--divSymbol_' + theIndex + '-->\n'; break; case CON_TASK_DISPLAY_TYPE_BITMAP: // non-transparent raster image
szBtnHTML += '<DIV class=divSymbol id=divSymbol_' + theIndex + ' style=\"LEFT: ' + iLeftLoc + '%; TOP: ' + iTopLoc + '%\">\n'; szBtnHTML += '<TABLE border=0 cellPadding=0 cellSpacing=0 frame=none rules=none width=100%>\n'; szBtnHTML += '<TBODY>\n'; szBtnHTML += '<TR>\n'; szBtnHTML += '<TD align=middle class=tdSymbol id=tdSymbol_' + theIndex + ' noWrap vAlign=top>'; szBtnHTML += '<IMG class=clsTaskBtn height=250 id=imgTaskBtn_' + theIndex + ' src=\"\" '; szBtnHTML += 'style=\"HEIGHT: 66px; WIDTH: 66px\" width=250 TaskpadButton></TD></TR>\n'; szBtnHTML += '<TR>\n'; szBtnHTML += '<TD align=middle class=tdSymbol id=tdSymbol_' + theIndex + ' vAlign=top width=100%>'; szBtnHTML += '<A class=clsSymbolBtn href=\"\" id=anchorCaption_' + theIndex + ' '; szBtnHTML += 'style=\"FONT-SIZE: 18px\" TaskpadButton>'; szBtnHTML += '<!--Insert Here--></A></TD></TR></TBODY></TABLE></DIV><!--divSymbol_' + theIndex + '-->\n'; break; } return szBtnHTML; }
//********************************
// COMMON BUTTON BUILDING FUNCTION
//********************************
function InsertButtonBitmaps() { for( var i = 0; i <= giTotalButtons; i++ ) { switch( gaiBtnObjectType[i] ) { case CON_TASK_DISPLAY_TYPE_VANILLA_GIF: // (GIF) index 0 is transparent
case CON_TASK_DISPLAY_TYPE_CHOCOLATE_GIF: // (GIF) index 1 is transparent
case CON_TASK_DISPLAY_TYPE_BITMAP: // non-transparent raster image
document.all('imgTaskBtn_' + i).src = gaszBtnOffBitmap[i]; break; } } }
function InsertFontFamilyAndString() { for( var i = 0; i <= giTotalButtons; i++ ) { if( typeof( gaszFontFamilyName[i] ) == 'string' ) { document.all('spanSymbol_' + i).style.fontFamily = gaszFontFamilyName[i]; document.all('spanSymbol_' + i).innerText = gaszSymbolString[i]; } } }
function InsertCaptionText() { // Insert caption text for each taskpad button
for( var i = 0; i <= giTotalButtons; i++ ) { document.all('anchorCaption_' + i).innerHTML = gaszBtnCaptions[i]; } }
function EnableGrayscaleFilter() { for( var i = 0; i <= giTotalButtons; i++ ) { // Grayscale filter only applies to raster-based images
if( gaiBtnObjectType[i] == CON_TASK_DISPLAY_TYPE_BITMAP ) { // Grayscale filter only applies if gaszBtnOverBitmap[i] is undefined
if ( typeof( gaszBtnOverBitmap[i] ) == 'undefined' ) { document.all( 'imgTaskBtn_' + i ).style.filter = 'gray'; } } } }
function InsertTaskpadText() { // Insert text for taskpad title, description, and watermark
// Use insertAdjacentText('AfterBegin') for divTitle so that we
// don't blow out the contained divAbout element
divTitle.insertAdjacentText('AfterBegin', gszTaskpadTitle);
// Use innerHTML for elements below to support formatting (e.g. <br>)
divDescription.innerHTML = gszTaskpadDescription; // Use innerText for stand-alone elements
// Watermark (e.g. Background) - uses inner HTML
var objWatermark = MMCCtrl.GetBackground( szHash );
if( objWatermark != null ) { // Keep track of the watermark display object type
giWatermarkObjectType = objWatermark.DisplayObjectType; switch (giWatermarkObjectType) { default: alert ("skipping due to background.DisplayObjectType == " + background.DisplayObjectType); break; // skip
case 1: // MMC_TASK_DISPLAY_TYPE_SYMBOL
str = ""; str += "<SPAN STYLE=\"position:absolute; top:20%; left:0; z-index:-20; font-family:"; str += objWatermark.FontFamilyName; str += "; \">"; str += objWatermark.SymbolString; str += "</SPAN>"; tdWatermark.innerHTML = str; break; case 2: // MMC_TASK_DISPLAY_TYPE_VANILLA_GIF, // (GIF) index 0 is transparent
tdWatermark.innerHTML = "<IMG SRC=\"" + objWatermark.MouseOffBitmap + "\" STYLE=\"position:absolute; filter:alpha(opacity=20); left:0%; top:75%; overflow:hidden;\">"; break; case 3: // MMC_TASK_DISPLAY_TYPE_CHOCOLATE_GIF, // (GIF) index 1 is transparent
tdWatermark.innerHTML = "<IMG SRC=\"" + objWatermark.MouseOffBitmap + "\" STYLE=\"position:absolute; filter:alpha(opacity=20); left:0%; top:75%; overflow:hidden;\">"; break; case 4: // MMC_TASK_DISPLAY_TYPE_BITMAP // non-transparent raster
tdWatermark.innerHTML = "<IMG SRC=\"" + objWatermark.MouseOffBitmap + "\" STYLE=\"position:absolute; filter:alpha(opacity=20); left:0%; top:75%; overflow:hidden;\">"; break; } } }
function SetupListview() { if( gbShowLVTitle == true ) { // if gbShowLVTitle is true, add strings to listview
tdLVTitle.innerText = gszLVTitle;
// Determine if author really wants to show the listview button
if( gbHasLVButton == true ) { anchorLVButton_0.innerText = gszLVBtnCaption; } // If not, hide it
else { divLVButton_0.style.visibility = 'hidden'; } } else { // gbShowLVTitle is false, so nothing has been specified for a listview header or button;
// hide these elements and let the listview occupy 100% of its parent's height
divLVTitle.style.visibility= 'hidden'; divLV.style.top = '0%'; divLV.style.height = '100%'; } }
//***************************************
// BUTTON HIGHLIGHT/UNHIGHLIGHT FUNCTIONS
//***************************************
function HighlightButton(szBtnIndex) { // Determine button type
switch( gaiBtnObjectType[szBtnIndex] ) { case 1: // Symbol
document.all( 'spanSymbol_' + szBtnIndex ).style.color = 'highlight'; break;
case 2: // GIF Vanilla
case 3: // GIF Chocolate
document.all( 'imgTaskBtn_' + szBtnIndex ).filters.mask.color = SysColorX.RGBHighlight; break;
case 4: // Raster
if( typeof( gaszBtnOverBitmap[szBtnIndex] ) == 'string' ) { // Use SRC swapping if an "OverBitmap" is specified
document.all( 'imgTaskBtn_' + szBtnIndex ).src = gaszBtnOverBitmap[szBtnIndex]; } else { // Otherwise, toggle from grayscale to color for single bitmap
document.all( 'imgTaskBtn_' + szBtnIndex ).filters[0].enabled = 0; } break; default: alert( 'Unrecognized image format for button index ' + szBtnIndex ); break; }
document.all( 'anchorCaption_' + szBtnIndex ).style.color = 'highlight'; document.all( 'anchorCaption_' + szBtnIndex ).style.textDecoration = 'underline';
// Keep track of tooltip index and display tooltip
giTooltipIndex = szBtnIndex;
// Show the tooltip after latency period specified by giTooltipLatency
gTooltipTimer = window.setTimeout( 'TaskpadTooltipShow()', giTooltipLatency, 'jscript' ); }
function UnhighlightButton() { if( typeof( gszLastBtn ) != 'undefined' ) {
// Determine button type
switch( gaiBtnObjectType[gszLastBtn] ) { case 1: // Symbol
document.all( 'spanSymbol_' + gszLastBtn ).style.color = 'windowtext'; break;
case 2: // GIF Vanilla
case 3: // GIF Chocolate
document.all( 'imgTaskBtn_' + gszLastBtn ).filters.mask.color = SysColorX.RGBwindowtext; break;
case 4: // Raster
if( typeof( gaszBtnOverBitmap[gszLastBtn] ) == 'string' ) { // Use SRC swapping if an "OverBitmap" is specified
document.all( 'imgTaskBtn_' + gszLastBtn ).src = gaszBtnOffBitmap[gszLastBtn]; } else { // Otherwise, toggle from color to grayscale for single bitmap
document.all( 'imgTaskBtn_' + gszLastBtn ).filters[0].enabled = 1; } break; default: alert( 'Unrecognized image format for index ' + gszLastBtn ); break; }
document.all( 'anchorCaption_' + gszLastBtn ).style.color = 'windowtext'; document.all( 'anchorCaption_' + gszLastBtn ).style.textDecoration = 'none';
TaskpadTooltipHide(); } }
function IsStillOverButton() { // Purpose: Determines if a mouseover or mouseout event
// was fired over the same button (indicating that the pointer
// is still over the button and that highlighting/unhighlighting
// should be ignored.
//
// Returns true if and only if:
// * both fromElement and toElement are not null;
// * both elements contain a user-defined "TaskpadButton" attribute;
// * both element IDs match.
var fromX = window.event.fromElement; var toX = window.event.toElement;
// Trap case where mouse pointer appeared over a button out of nowhere,
// (e.g. as a result of switching focus from another app).
if( (fromX != null) && (toX != null) ) { // return true if moving within elements of a single button
if( (fromX.getAttribute('TaskpadButton') != null) == (toX.getAttribute('TaskpadButton') != null) ) { if( GetElementIndex(fromX.id) == GetElementIndex(toX.id) ) { return true; } } } return false; }
//******************
// TOOLTIP FUNCTIONS
//******************
function LoadTooltipPointer() { divTooltipPointer.innerText = L_gszTooltipPointer_StaticText; }
function TaskpadTooltipShow() { // DEBUG NOTE: This function only works correctly for vertical layouts; I need to implement separate
// functions for horizontal and link layouts.
// Load in appropriate tooltip text from the module-level string array
tdTooltip.innerHTML = gaszBtnTooltips[giTooltipIndex];
//***************************
// Calc Y (vertical) location
//***************************
var iYLoc = document.all('divSymbol_' + giTooltipIndex).offsetTop; iYLoc += divSymbolContainer.offsetTop; iYLoc -= tblTooltip.offsetHeight; // Subtract scrollTop to account for container div scrolling
iYLoc -= divSymbolContainer.scrollTop; // RETROFIT HACK BELOW...
switch( gaiBtnObjectType[giTooltipIndex] ) { case 1: // Symbol
// Offset the top by an additional fixed-constant size of the symbol fontSize
iYLoc -= (GetPixelSize(document.all('spanSymbol_' + giTooltipIndex).style.fontSize) * L_ConstTooltipOffsetBottom_Number); break;
case 2: // GIF Vanilla
case 3: // GIF Chocolate
case 4: // Raster
iYLoc -= ((document.all('imgTaskBtn_' + giTooltipIndex).offsetHeight) * L_ConstTooltipOffsetBottom_Number); break; default: // Stub
break; }
// Position the tooltip vertically
divTooltip.style.pixelTop = iYLoc; iYLoc += tblTooltip.offsetHeight - (GetPixelSize(divTooltipPointer.style.fontSize) / L_ConstTooltipPointerOffsetBottom_Number);
// Position the tooltip pointer vertically
divTooltipPointer.style.pixelTop = iYLoc;
//*****************************
// Calc X (horizontal) location
//*****************************
var iSymbolLeft = document.all('divSymbol_' + giTooltipIndex).offsetLeft; var iSymbolWidth = document.all('divSymbol_' + giTooltipIndex).offsetWidth; var iTooltipWidth = document.all('divTooltip').offsetWidth;
// Center the tooltip horizontally w/ respect to its symbol
var iXLoc; if( iSymbolWidth >= iTooltipWidth) { // Symbol is wider than tooltip
iXLoc = ( (iSymbolWidth - iTooltipWidth) / 2) + iSymbolLeft; } else { // Tooltip is wider than symbol
iXLoc = ( (iTooltipWidth - iSymbolWidth) / 2) + iSymbolLeft; }
iXLoc += divSymbolContainer.style.pixelLeft;
// Position the tooltip horizontally
divTooltip.style.left = iXLoc; iXLoc += (iTooltipWidth / 2) - ( GetPixelSize(divTooltipPointer.style.fontSize) / 2 );
// Position the tooltip pointer horizontally
divTooltipPointer.style.pixelLeft = iXLoc;
// Show the tooltip & pointer
divTooltip.style.visibility = 'visible'; divTooltipPointer.style.visibility = 'visible'; }
function TaskpadTooltipHide() { divTooltip.style.visibility = 'hidden'; divTooltipPointer.style.visibility = 'hidden'; window.clearTimeout(gTooltipTimer); //Empty the innerHTML, which causes the height to collapse
tdTooltip.innerHTML = ''; }
//****************
// RESIZE FUNCTION
//****************
function ResizeTaskpadElements( iTaskpadStyle ) { var iSmallerDimension = GetSmallerDimension(); // Title & description
divTitle.style.fontSize = iSmallerDimension * L_ConstTitleText_Number; divDescription.style.fontSize = iSmallerDimension * L_ConstDescriptionText_Number;
// Watermark
// TODO: NEED TO IMPLEMENT FULL SUPPORT FOR WATERMARK IN ALL ITS FLAVORS
switch( iTaskpadStyle ) { case CON_TASKPAD_STYLE_VERTICAL1: tdWatermark.style.fontSize = iSmallerDimension * L_ConstWatermarkVerticalText_Number; break; case CON_TASKPAD_STYLE_HORIZONTAL1: tdWatermark.style.fontSize = iSmallerDimension * L_ConstWatermarkHorizontalText_Number; break; case CON_TASKPAD_STYLE_NOLISTVIEW: tdWatermark.style.fontSize = iSmallerDimension * L_ConstWatermarkNoListviewText_Number; break; }
// Tooltips
tblTooltip.style.fontSize = iSmallerDimension * L_ConstTooltipText_Number; divTooltipPointer.style.fontSize = iSmallerDimension * L_ConstTooltipPointerText_Number;
// Listview elements
if( iTaskpadStyle != CON_TASKPAD_STYLE_NOLISTVIEW ) { tdLVButton_0.style.fontSize = iSmallerDimension * L_ConstLVButtonText_Number; tdLVTitle.style.fontSize = iSmallerDimension * L_ConstLVTitleText_Number; } // Apply multipliers to symbol text
for( var i = 0; i <= giTotalButtons; i++ ) { // All buttons have an anchor caption
document.all( 'anchorCaption_' + i ).style.fontSize = iSmallerDimension * L_ConstSpanAnchorText_Number; // Determine button type (either symbol- or image-based)
switch( gaiBtnObjectType[i] ) { case 1: // Symbol
document.all( 'spanSymbol_' + i ).style.fontSize = iSmallerDimension * L_ConstSpanSymbolSize_Number; break; case 2: // GIF Vanilla
case 3: // GIF Chocolate
case 4: // Raster
document.all( 'imgTaskBtn_' + i ).style.width = iSmallerDimension * L_ConstTaskButtonBitmapSize_Number; document.all( 'imgTaskBtn_' + i ).style.height = iSmallerDimension * L_ConstTaskButtonBitmapSize_Number; break; default: alert( 'Unrecognized image format for index ' + i ); } } }
//******************
// UTILITY FUNCTIONS
//******************
function SynchColorsToSystem( iType ) { // Get derived colors
document.body.style.backgroundColor = SysColorX.GetHalfLightHex( 'buttonface', 'CSS' );
if( giTaskpadStyle != CON_TASKPAD_STYLE_NOLISTVIEW ) { divLVTitle.style.backgroundColor = SysColorX.GetQuarterLightHex( 'buttonshadow', 'CSS' ); }
// TODO: NEED TO IMPLEMENT FULL SUPPORT FOR WATERMARK IN ALL ITS FLAVORS
tdWatermark.style.color = SysColorX.GetQuarterLightHex( 'buttonface', 'CSS' ); divDescription.style.color = SysColorX.GetQuarterLightHex( 'graytext', 'CSS' );
// Use CSS system constants for other colors
divTitle.style.color = 'graytext'; divTitle.style.borderColor = 'graytext'; // Special case the taskpad type
switch( iType ) { case CON_TASKPAD_STYLE_VERTICAL1: case CON_TASKPAD_STYLE_HORIZONTAL1: divLVContainerTop.style.backgroundColor = 'window'; break; case CON_TASKPAD_STYLE_NOLISTVIEW: // Stub
break; } }
|