2025-11-28 00:35:46 +09:00

297 lines
7.7 KiB
Plaintext

<!-- ---------------------------------------------------------------------
//
// Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
// File: dataselect.htc
//
// Description: This behavior allows web authors to create databound
// SELECT elements. The OPTION elements are populated by
// using a Tabular Data Control Object as the dataSrc.
//
//-------------------------------------------------------------------- -->
<PROPERTY NAME="datasrc" />
<PROPERTY NAME="datafldtext" />
<PROPERTY NAME="datafldvalue" />
<PROPERTY NAME="value" />
<METHOD NAME="FillBox" />
<METHOD NAME="SetValue" />
<EVENT NAME="ondatasetcomplete" ID="dataset" />
<EVENT NAME="onerror" ID="error" />
<ATTACH EVENT="ondocumentready" HANDLER="DoInit" />
<SCRIPT LANGUAGE="jscript">
var sChange = ""; //Records script for onchange event set on page
//+----------------------------------------------------------------------------
//
// Function: DoInit
//
// Description: Calls functions, set variables, and attaches events to
// initialize behavior
//
// Arguments: none
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function DoInit()
{
// Gets the name of the TDC object on the page
var sData = dataSrc.substring(1,dataSrc.length);
// If the dataFldValue property is not set, use the dataFldText property
if (dataFldValue == null) dataFldValue = dataFldText;
// HTML to write to page
var sTab = '<TABLE ID="' + uniqueID + 'tab" '
+ 'STYLE="display:none" onreadystatechange="'
+ uniqueID + '.FillBox()" DATASRC="' + dataSrc + '"><TR>'
+ '<TD><SPAN DATAFLD="' + dataFldValue + '"></SPAN></TD>'
+ '<TD><SPAN DATAFLD="' + dataFldText + '"></SPAN></TD>'
+ '</TR></TABLE>';
// Write HTML to page
insertAdjacentHTML("AfterEnd", sTab);
OverrideOnchange();
}
//+----------------------------------------------------------------------------
//
// Function: FillBox
//
// Description: Called after the SELECT HTML is written to the page in
// DoInit() by the onreadystatechange event. Uses the data
// from the TDC object to fill the OPTION tags of the SELECT
// element.
//
// Arguments: none
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function FillBox()
{
var e = window.event.srcElement;
// If the SELECT element is done rendering on the page...
if (e.readyState == "complete" || e.readyState == 4)
{
// Loop through the data rows and create OPTION tags for each
for (i=0; i<e.rows.length; i++)
{
var oOpt = document.createElement("OPTION");
oOpt.value = e.rows(i).cells(0).children(0).innerText;
oOpt.text = e.rows(i).cells(1).children(0).innerText;
// If this data value is the same as the VALUE property, select it.
if (value == e.rows(i).cells(0).children(0).innerText)
{
oOpt.selected = true;
}
// Add element to the SELECT element
add(oOpt);
}
// Fire the ondatasetcomplete event from the HTC
dataset.fire();
// Attach the onpropertychange event
attachEvent("onpropertychange", DoPropChange);
}
}
//+----------------------------------------------------------------------------
//
// Function: EmptyBox
//
// Description: This function is called when the dataSrc is changed. It
// purges the OPTION elements in the SELECT element.
//
// Arguments: none
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function EmptyBox()
{
while (options.length > 0)
{
remove(options.item(0));
}
}
//+----------------------------------------------------------------------------
//
// Function: SetValue
//
// Description: Sets the value of the linked INPUT element (used in the
// FORM submit).
//
// Arguments: none
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function SetValue()
{
value = options(selectedIndex).value;
//
// Loop through OPTION elements until finding one with a value equal to
// that specified by the VALUE property.
//
for (i=0; i<options.length; i++)
{
if (options(i).value == value)
{
options(i).selected = true;
break;
}
}
//
// Execute the script stored in the sChange variable. This is the script
// that was originally saved when the onchange event was erased.
//
eval(sChange);
}
//+----------------------------------------------------------------------------
//
// Function: DoPropChange
//
// Description: Handles property changes on CSS and regular property/
// attributes.
//
// Arguments: none
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function DoPropChange()
{
var propertyName = window.event.propertyName;
if (propertyName.substring(0,5) == "style")
{
}
else
{
detachEvent("onpropertychange", DoPropChange);
switch(propertyName)
{
case "dataFldValue" :
EmptyBox();
var oTab = eval(uniqueID + "tab");
oTab.dataSrc = "";
oTab.rows(0).cells(0).children(0).dataFld = dataFldValue;
oTab.dataSrc = dataSrc;
break;
case "dataFldText" :
EmptyBox();
var oTab = eval(uniqueID + "tab");
oTab.dataSrc = "";
oTab.rows(0).cells(1).children(0).dataFld = dataFldText;
oTab.dataSrc = dataSrc;
break;
case "dataSrc" :
EmptyBox();
var oTab = eval(uniqueID + "tab");
if (dataSrc.charAt(0) != "#") dataSrc = "#" + dataSrc;
oTab.dataSrc = dataSrc;
break;
case "value" :
SetValue();
break;
case "onchange" :
OverrideOnchange();
break;
case "selectedIndex" :
break;
default :
ReturnError(propertyName + " not a valid property");
break;
}
attachEvent("onpropertychange", DoPropChange);
}
}
//+----------------------------------------------------------------------------
//
// Function: OverrideOnchange
//
// Description: Disallows the user from setting the onchange property.
// Instead, takes the script intended for the onchange event
// on the page and stores it in a variable to be executed
// from the HTC. This approach is required due to the timing
// of the onchange event firing from the page - if the page is
// utilizing the event, it will get it first and the HTC will
// not have had a chance to change the value.
//
// Arguments: none
//
// Returns: false if the onchange event is equal to null
//
//-----------------------------------------------------------------------------
function OverrideOnchange()
{
if (onchange == null) return false;
// Get the current script for the onchange event (specified on the page)
sChange = getAttribute("onchange");
sChange = sChange.toString();
sChange = sChange.substring(23, sChange.length-2);
// Set the onchange event to nothing
onchange = "";
}
//+----------------------------------------------------------------------------
//
// Function: ReturnError
//
// Description: Fires the error event, along with a descriptive text
// message.
//
// Arguments: sMsg - descriptive text message
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function ReturnError(sMsg)
{
var oEvent = createEventObject();
oEvent.setAttribute("error", sMsg);
error.fire(oEvent);
}
</SCRIPT>