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.
zhky/web/js/2k3MenuSelect.htc

687 lines
17 KiB

1 year ago
<PUBLIC:COMPONENT
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>lightWeight<EFBFBD>=<3D>true
>
<PUBLIC:DEFAULTS
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>contentEditable<EFBFBD>=<3D>false
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>tabStop<EFBFBD>=<3D>true
/>
<PUBLIC:attach event="ondocumentready" onevent="initElement()" />
<PUBLIC:attach event="onmouseover" onevent="elementOnMouseOver()" />
<PUBLIC:attach event="onmouseout" onevent="elementOnMouseOut()" />
<PUBLIC:attach event="onmousedown" onevent="elementOnMouseDown()" />
<PUBLIC:attach event="onmouseup" onevent="elementOnMouseUp()" />
<PUBLIC:attach event="onpropertychange" onevent="elementPropertyChange()" />
<PUBLIC:attach event="onselectstart" onevent="elementOnSelect()" />
<PUBLIC:attach event="oncontextmenu" onevent="elementOnContextMenu()" />
<PUBLIC:attach event="ondetach" onevent="cleanupElement()" />
<PUBLIC:property name="enabled" value=true />
<PUBLIC:property name="options" value="" />
<PUBLIC:property name="dropDownState" value=false />
<PUBLIC:property name="size" value=-1 />
<PUBLIC:property name="value" id="propValue" value="" get="returnValue" />
<PUBLIC:property name="text" id="propText" value="" get="returnText" />
<PUBLIC:property name="selectedIndex" value=-1 />
<PUBLIC:method name="itemCount" />
<PUBLIC:method name="addItem" />
<PUBLIC:method name="removeItem" />
<PUBLIC:method name="clear" />
<PUBLIC:method name="getItemIndex" />
<PUBLIC:method name="getItemIndexFromValue" />
<PUBLIC:method name="setSelectedItem" />
<PUBLIC:method name="getItemText" />
<PUBLIC:method name="getItemValue" />
<PUBLIC:method name="getItemTag" />
<PUBLIC:event name="onchange" id="onchange" />
<script language="jscript">
// ----------------------------------------------------
// 2k3Widgets: 2k3MenuSelect
//
// Copyright <20>2002-2004 Stedy Software and Systems
// Please see http://www.stedy.com for terms of use.
// ----------------------------------------------------
var imageCell = 0 ;
var captionCell = 1 ;
var valueCell = 2 ;
var tagCell = 3 ;
var elementDropdown = null ;
var optionsElement = null ;
var elementCaption = null ;
var menuShadowArray = new Array(null, null, null, null) ;
var normalWidth = 0 ;
var settingValueInternally = false ;
// ----------------------------------------------------
// initialize/terminate functions
// ----------------------------------------------------
function initElement() {
settingValueInternally = true ;
element.enabled = makeBooleanOfAttribute("enabled") ;
element.dropDownState = makeBooleanOfAttribute("dropDownState") ;
if (!element.enabled) {
element.className = "2k3MenuSelectDisabled" ; ;
}
settingValueInternally = false ;
elementCaption = document.createElement("<span class='2k3MenuSelectCaption'>") ;
element.insertAdjacentElement("afterBegin", elementCaption) ;
elementDropdown = window.document.getElementById(element.options) ;
optionsElement = elementDropdown.children[0] ;
with (optionsElement) {
for (var i = 0; i < rows.length; i++) {
var row = rows[i] ;
if (element.selectedIndex == -1) {
if (row.outerHTML.indexOf("selected") != -1) {
with (element) {
selectedIndex = row.rowIndex ;
text = row.children[captionCell].innerText ;
value = row.children[valueCell].innerText ;
elementCaption.innerText = row.children[captionCell].innerText ;
}
}
}
with (row.children[imageCell]) {
if (children.length == 0) {
var imgElement = document.createElement("IMG") ;
imgElement.src = element.currentStyle.noImageUrl ;
insertAdjacentElement("beforeEnd", imgElement) ;
}
children[0].hideFocus = true ;
}
}
}
with (elementDropdown) {
with (style) {
zIndex = 5000 ;
if (element.size != -1) {
height = getDropdownHeight(element.size) ;
}
width = element.offsetWidth + 2 ;
}
}
}
function cleanupElement() {
elementCaption.removeNode(true) ;
}
// ----------------------------------------------------
// element functions
// ----------------------------------------------------
function elementOnMouseOver() {
if (!element.enabled) { return ; }
if (normalWidth == 0) {
normalWidth = element.offsetWidth ;
}
var fromElement = window.event.fromElement ;
if (fromElement != null) {
if (getRealItem(fromElement) == element) { return ; }
}
if (!element.dropDownState) {
if (element.parentElement.parentElement.parentElement.parentElement.activeChild == null) {
showOver(element) ;
}
}
}
function elementOnMouseOut() {
if (!element.enabled) { return ; }
var toElement = window.event.toElement ;
if (toElement != null) {
if (getRealItem(toElement) == element) { return ; }
}
if (!element.dropDownState) {
if (element.parentElement.parentElement.parentElement.parentElement.activeChild == null) {
showNormal(element) ;
}
}
}
function elementOnMouseDown() {
if (!element.enabled) { return ; }
if (!element.dropDownState) {
if (element.parentElement.parentElement.parentElement.parentElement.activeChild == null) {
showActive(element) ;
}
}
}
function elementOnMouseUp() {
if (!element.enabled) { return ; }
if (element.dropDownState) {
hideDropdown() ;
showOver(element) ;
element.dropDownState = false ;
}
else {
if (element.parentElement.parentElement.parentElement.parentElement.activeChild == null) {
showDropdown() ;
element.dropDownState = true ;
}
}
}
function elementPropertyChange() {
if (settingValueInternally) { return ; }
if (window.event.propertyName == "enabled") {
if (element.enabled) {
showEnabled(element) ;
}
else {
showDisabled(element) ;
}
}
}
function elementOnSelect() {
with (window.event) {
cancelBubble = true ;
returnValue = false ;
}
return false ;
}
function elementOnContextMenu() {
with (window.event) {
cancelBubble = true ;
returnValue = false ;
}
return false ;
}
// ----------------------------------------------------
// public element methods
// ----------------------------------------------------
function itemCount() {
return optionsElement.rows.length ;
}
function addItem(itmType, text, value, itemIndex, exData, tagData) {
var strSaveText = element.text ;
if (element.selectedIndex != -1) {
optionsElement.rows[element.selectedIndex].className = "2k3MenuSelectItem" ;
}
element.selectedIndex = -1 ;
var row = optionsElement.insertRow(itemIndex) ;
with (row) {
className = "2k3MenuSelectItem" ;
for (var c = 0; c <= 3; c++) { insertCell(c) ; }
with (children[imageCell]) {
className = "itemImage" ;
switch ((itmType).toLowerCase()) {
case "n":
innerHTML = "<img src='" + element.currentStyle.noImageUrl + "'>" ;
break ;
case "i":
if (exData == "") {
exData = element.currentStyle.noImageUrl ;
}
innerHTML = "<img src='" + exData + "'>" ;
break ;
}
}
with (children[captionCell]) {
className = "itemCaption" ;
innerHTML = text ;
}
with (children[valueCell]) {
className = "itemValue" ;
innerText = value ;
}
with (children[tagCell]) {
className = "itemTag" ;
innerText = tagData ;
}
}
if (element.size != -1) {
elementDropdown.style.height = getDropdownHeight(element.size) ;
}
setSelectedItem(getItemIndex(strSaveText)) ;
}
function removeItem(itemIndex) {
var strSaveText = element.text ;
if (itemIndex > (element.itemCount() - 1) || element.itemCount() == 0) {
return ;
}
if (element.selectedIndex != -1) {
optionsElement.rows[element.selectedIndex].className = "2k3MenuSelectItem" ;
}
element.selectedIndex = -1 ;
optionsElement.deleteRow(itemIndex) ;
if (element.size != -1) {
elementDropdown.style.height = getDropdownHeight(element.size) ;
}
setSelectedItem(getItemIndex(strSaveText)) ;
}
function clear() {
for (var i = 0; i < element.itemCount(); i++) {
optionsElement.deleteRow(-1) ;
}
element.selectedIndex = -1 ;
}
function getItemIndex(itemText) {
with (optionsElement) {
for (var i = 0; i < element.itemCount(); i++) {
with (rows[i].children[captionCell]) {
if (innerText == itemText) {
return rows[i].rowIndex ;
}
}
}
}
return -1 ;
}
function getItemIndexFromValue(itemValueText) {
with (optionsElement) {
for (var i = 0; i < element.itemCount(); i++) {
with (rows[i].children[valueCell]) {
if (innerText == itemValueText) {
return rows[i].rowIndex ;
}
}
}
}
}
function getItemText(itemIndex) {
if (itemIndex > (element.itemCount() - 1) || element.itemCount() == 0) {
return ;
}
return optionsElement.rows[itemIndex].children[captionCell].innerText ;
}
function getItemValue(itemIndex) {
if (itemIndex > (element.itemCount() - 1) || element.itemCount() == 0) {
return ;
}
return optionsElement.rows[itemIndex].children[valueCell].innerText ;
}
function getItemTag(itemIndex) {
if (itemIndex > (element.itemCount() - 1) || element.itemCount() == 0) {
return ;
}
return optionsElement.rows[itemIndex].children[tagCell].innerText ;
}
function setSelectedItem(itemIndex) {
var currentText = element.text ;
if (itemIndex == -1) {
if (element.selectedIndex != -1) {
if (element.selectedIndex > (element.itemCount() - 1)) {
with (element) {
selectedIndex = -1 ;
text = "" ;
value = "" ;
if (ctlStyle == 1) {
elementCaption.value = "" ;
}
else {
elementCaption.innerText = "" ;
}
}
return
}
optionsElement.rows[element.selectedIndex].className = "2k3MenuSelectItem" ;
with (element) {
selectedIndex = -1 ;
text = "" ;
value = "" ;
if (ctlStyle == 1) {
elementCaption.value = "" ;
}
else {
elementCaption.innerText = "" ;
}
}
onchange.fire() ;
}
else {
with (element) {
selectedIndex = -1 ;
text = "" ;
value = "" ;
if (ctlStyle == 1) {
elementCaption.value = "" ;
}
else {
elementCaption.innerText = "" ;
}
}
}
}
else {
if (itemIndex > (element.itemCount() - 1)) {
with (element) {
selectedIndex = -1 ;
text = "" ;
value = "" ;
if (ctlStyle == 1) {
elementCaption.value = "" ;
}
else {
elementCaption.innerText = "" ;
}
}
return ;
}
if (element.selectedIndex != -1) {
optionsElement.rows[element.selectedIndex].className = "jsSelectItem" ;
}
with (optionsElement.rows(itemIndex)) {
className = "jsSelectItemSelected" ;
element.selectedIndex = rowIndex ;
element.text = children[captionCell].innerText ;
element.value = children[valueCell].innerText ;
if (element.ctlStyle == 1) {
elementCaption.value = children[captionCell].innerText ;
}
else {
elementCaption.innerText = children[captionCell].innerText ;
}
scrollIntoView(false) ;
}
if (itemIndex > element.size - 1) {
elementDropdown.scrollTop = elementDropdown.scrollTop + 1 ;
}
if (currentText != element.text) {
onchange.fire() ;
}
}
}
// ----------------------------------------------------
// element dropdown functions
// ----------------------------------------------------
function dropdownOnMouseOver() {
var el = getRealItem(window.event.srcElement) ;
if (el.className == "2k3MenuSelectItem" || el.className == "2k3MenuSelectItemSelected") {
el.className = "2k3MenuSelectItemOver" ;
}
}
function dropdownOnMouseOut() {
var el = getRealItem(window.event.srcElement) ;
if (el.className == "2k3MenuSelectItemOver") {
if (parseInt(element.selectedIndex) == parseInt(el.rowIndex)) {
el.className = "2k3MenuSelectItemSelected" ;
}
else {
el.className = "2k3MenuSelectItem" ;
}
}
}
function dropdownOnClick() {
var el = getRealItem(window.event.srcElement) ;
if (el.className == "2k3MenuSelectItemOver") {
window.event.cancelBubble = true ;
window.event.returnValue = false ;
if (element.selectedIndex != -1) {
optionsElement.rows[element.selectedIndex].className = "2k3MenuSelectItem" ;
}
el.className = "2k3MenuSelectItemSelected" ;
with (element) {
selectedIndex = el.rowIndex ;
text = el.children[captionCell].innerText ;
value = el.children[valueCell].innerText ;
elementCaption.innerText = el.children[captionCell].innerText ;
}
element.dropDownState = false ;
showNormal(element) ;
hideDropdown() ;
onchange.fire() ;
}
}
// ----------------------------------------------------
// show dropdown functions
// ----------------------------------------------------
function showDropdown() {
var dropDownTop = 0 ;
var absoluteX = getRealLeft(element) ;
var absoluteY = getRealTop(element) ;
if (parseInt(element.selectedIndex) != -1) {
with (optionsElement.rows[selectedIndex]) {
className = "2k3MenuSelectItemSelected" ;
scrollIntoView(false) ;
}
with (elementDropdown) {
if (parseInt(element.selectedIndex) > parseInt(element.size - 1)) {
scrollTop += 1 ;
}
}
}
window.document.attachEvent("onmousedown", hideDropdownEx) ;
with (elementDropdown) {
if (parseInt(window.document.body.clientHeight - absoluteY - element.offsetHeight - 4) < parseInt(offsetHeight)) {
dropDownTop = (absoluteY - offsetHeight) ;
}
else {
dropDownTop = (absoluteY + element.offsetHeight) ;
}
with (style) {
top = dropDownTop ;
left = absoluteX ;
visibility = "visible" ;
}
}
showMenuShadow(elementDropdown) ;
with (elementDropdown) {
attachEvent("onmouseover", dropdownOnMouseOver) ;
attachEvent("onmouseout", dropdownOnMouseOut) ;
attachEvent("onclick", dropdownOnClick) ;
}
element.parentElement.parentElement.parentElement.parentElement.activeChild = element ;
}
function hideDropdown() {
window.document.detachEvent("onmousedown", hideDropdownEx) ;
with (elementDropdown) {
detachEvent("onmouseover", dropdownOnMouseOver) ;
detachEvent("onmouseout", dropdownOnMouseOut) ;
detachEvent("onclick", dropdownOnClick) ;
hideMenuShadow() ;
style.visibility = "hidden" ;
}
element.parentElement.parentElement.parentElement.parentElement.activeChild = null ;
}
function hideDropdownEx() {
if (!isElement(window.event.srcElement, element) &&
!isElement(window.event.srcElement, elementDropdown)) {
hideDropdown() ;
showNormal(element) ;
element.dropDownState = false ;
}
}
// ----------------------------------------------------
// internal functions
// ----------------------------------------------------
function showMenuShadow(el) {
for (var i = 3; i >= 0; i--) {
if (menuShadowArray[i] == null) {
menuShadowArray[i] = window.document.createElement("SPAN") ;
menuShadowArray[i].className = "2k3ShadowElement" ;
window.document.body.insertAdjacentElement("afterBegin", menuShadowArray[i]) ;
}
with (menuShadowArray[i].style) {
left = el.offsetLeft + (4 + i) ;
top = el.offsetTop + (4 + i) ;
width = el.offsetWidth - (i * 2) ;
height = el.offsetHeight - (i * 2) ;
zIndex = el.style.zIndex - 1 ;
visibility = "visible" ;
}
}
}
function hideMenuShadow() {
for (var i = 0; i <= 3; i++) {
if (menuShadowArray[i] != null) {
menuShadowArray[i].style.visibility = "hidden" ;
menuShadowArray[i].removeNode(true) ;
menuShadowArray[i] = null ;
}
}
}
function showNormal(el) {
with (el) {
className = "2k3MenuSelect" ;
style.width = normalWidth ;
}
}
function showOver(el) {
with (el) {
className = "2k3MenuSelectOver" ;
style.width = normalWidth + 2 ;
}
}
function showActive(el) {
with (el) {
className = "2k3MenuSelectActive" ;
style.width = normalWidth + 2 ;
}
}
function showDisabled(el) {
with (el) {
className = "2k3MenuSelectDisabled" ;
style.width = normalWidth ;
}
}
function showEnabled(el) {
with (el) {
className = "2k3MenuSelect" ;
style.width = normalWidth ;
}
}
function returnText() {
if (element.selectedIndex == -1) {
return "" ;
}
else {
return optionsElement.rows[element.selectedIndex].children[captionCell].innerText ;
}
}
function returnValue() {
if (element.selectedIndex == -1) {
return "" ;
}
else {
return optionsElement.rows[element.selectedIndex].children[valueCell].innerText ;
}
}
function makeBooleanOfAttribute(attName) {
a = element.getAttribute(attName) ;
if (typeof(a) == "boolean") {
return a ;
}
else if (a == null) {
a = false ;
}
else if (typeof(a) == "string") {
a = a.toLowerCase() ;
a = (a == "true" || a == "1" || a == "yes") ;
}
else {
a = new Boolean(a) ;
}
return a ;
}
function isElement(el, parentElement) {
var tElement = el ;
while (tElement != null) {
if (tElement == parentElement) {
return true ;
}
tElement = tElement.parentElement ;
}
return false ;
}
function getDropdownHeight(intSize) {
var intHeight = 0 ;
for (var i = 0; i < intSize; i++) {
if (i > element.itemCount() - 1) {
break ;
}
intHeight += optionsElement.rows[i].offsetHeight ;
}
return intHeight + 2 ;
}
function getRealTop(el) {
var t = 0 ;
var tElement = el ;
while (tElement != null) {
t += tElement.offsetTop ;
tElement = tElement.offsetParent ;
}
return t ;
}
function getRealLeft(el) {
var l = 0 ;
var tElement = el ;
while (tElement != null) {
l += tElement.offsetLeft ;
tElement = tElement.offsetParent ;
}
return l ;
}
function getRealItem(el) {
var tmpElement = el ;
if (tmpElement == null) { return tmpElement ; }
if (tmpElement.tagName.toLowerCase() == "img") {
tmpElement = tmpElement.parentElement ;
}
if (tmpElement.tagName.toLowerCase() == "span") {
tmpElement = tmpElement.parentElement ;
}
if (tmpElement.tagName.toLowerCase() == "td") {
tmpElement = tmpElement.parentElement ;
}
return tmpElement ;
}
</script>
</PUBLIC:COMPONENT>