323 lines
8.7 KiB
JavaScript
323 lines
8.7 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This Source Code Form is "Incompatible With Secondary Licenses", as
|
|
* defined by the Mozilla Public License, v. 2.0.
|
|
*/
|
|
|
|
/**
|
|
* Locate where an element is on the page, x-wise.
|
|
*
|
|
* @param obj Element of which location to return.
|
|
* @return Current position of the element relative to the left of the
|
|
* page window. Measured in pixels.
|
|
*/
|
|
function bz_findPosX(obj)
|
|
{
|
|
var curleft = 0;
|
|
|
|
if (obj.offsetParent) {
|
|
while (obj) {
|
|
curleft += obj.offsetLeft;
|
|
obj = obj.offsetParent;
|
|
}
|
|
}
|
|
else if (obj.x) {
|
|
curleft += obj.x;
|
|
}
|
|
|
|
return curleft;
|
|
}
|
|
|
|
/**
|
|
* Locate where an element is on the page, y-wise.
|
|
*
|
|
* @param obj Element of which location to return.
|
|
* @return Current position of the element relative to the top of the
|
|
* page window. Measured in pixels.
|
|
*/
|
|
function bz_findPosY(obj)
|
|
{
|
|
var curtop = 0;
|
|
|
|
if (obj.offsetParent) {
|
|
while (obj) {
|
|
curtop += obj.offsetTop;
|
|
obj = obj.offsetParent;
|
|
}
|
|
}
|
|
else if (obj.y) {
|
|
curtop += obj.y;
|
|
}
|
|
|
|
return curtop;
|
|
}
|
|
|
|
/**
|
|
* Get the full height of an element, even if it's larger than the browser
|
|
* window.
|
|
*
|
|
* @param fromObj Element of which height to return.
|
|
* @return Current height of the element. Measured in pixels.
|
|
*/
|
|
function bz_getFullHeight(fromObj)
|
|
{
|
|
var scrollY;
|
|
|
|
// All but Mac IE
|
|
if (fromObj.scrollHeight > fromObj.offsetHeight) {
|
|
scrollY = fromObj.scrollHeight;
|
|
// Mac IE
|
|
} else {
|
|
scrollY = fromObj.offsetHeight;
|
|
}
|
|
|
|
return scrollY;
|
|
}
|
|
|
|
/**
|
|
* Get the full width of an element, even if it's larger than the browser
|
|
* window.
|
|
*
|
|
* @param fromObj Element of which width to return.
|
|
* @return Current width of the element. Measured in pixels.
|
|
*/
|
|
function bz_getFullWidth(fromObj)
|
|
{
|
|
var scrollX;
|
|
|
|
// All but Mac IE
|
|
if (fromObj.scrollWidth > fromObj.offsetWidth) {
|
|
scrollX = fromObj.scrollWidth;
|
|
// Mac IE
|
|
} else {
|
|
scrollX = fromObj.offsetWidth;
|
|
}
|
|
|
|
return scrollX;
|
|
}
|
|
|
|
/**
|
|
* Causes a block to appear directly underneath another block,
|
|
* overlaying anything below it.
|
|
*
|
|
* @param item The block that you want to move.
|
|
* @param parent The block that it goes on top of.
|
|
* @return nothing
|
|
*/
|
|
function bz_overlayBelow(item, parent) {
|
|
var elemY = bz_findPosY(parent);
|
|
var elemX = bz_findPosX(parent);
|
|
var elemH = parent.offsetHeight;
|
|
|
|
item.style.position = 'absolute';
|
|
item.style.left = elemX + "px";
|
|
item.style.top = elemY + elemH + 1 + "px";
|
|
}
|
|
|
|
/**
|
|
* Checks if a specified value is in the specified array.
|
|
*
|
|
* @param aArray Array to search for the value.
|
|
* @param aValue Value to search from the array.
|
|
* @return Boolean; true if value is found in the array and false if not.
|
|
*/
|
|
function bz_isValueInArray(aArray, aValue)
|
|
{
|
|
for (var run = 0, len = aArray.length ; run < len; run++) {
|
|
if (aArray[run] == aValue) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Checks if a specified value is in the specified array by performing a
|
|
* case-insensitive comparison.
|
|
*
|
|
* @param aArray Array to search for the value.
|
|
* @param aValue Value to search from the array.
|
|
* @return Boolean; true if value is found in the array and false if not.
|
|
*/
|
|
function bz_isValueInArrayIgnoreCase(aArray, aValue)
|
|
{
|
|
var re = new RegExp(aValue.replace(/([^A-Za-z0-9])/g, "\\$1"), 'i');
|
|
for (var run = 0, len = aArray.length ; run < len; run++) {
|
|
if (aArray[run].match(re)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Create wanted options in a select form control.
|
|
*
|
|
* @param aSelect Select form control to manipulate.
|
|
* @param aValue Value attribute of the new option element.
|
|
* @param aTextValue Value of a text node appended to the new option
|
|
* element.
|
|
* @return Created option element.
|
|
*/
|
|
function bz_createOptionInSelect(aSelect, aTextValue, aValue) {
|
|
var myOption = new Option(aTextValue, aValue);
|
|
aSelect.options[aSelect.length] = myOption;
|
|
return myOption;
|
|
}
|
|
|
|
/**
|
|
* Clears all options from a select form control.
|
|
*
|
|
* @param aSelect Select form control of which options to clear.
|
|
*/
|
|
function bz_clearOptions(aSelect) {
|
|
|
|
var length = aSelect.options.length;
|
|
|
|
for (var i = 0; i < length; i++) {
|
|
aSelect.removeChild(aSelect.options[0]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Takes an array and moves all the values to an select.
|
|
*
|
|
* @param aSelect Select form control to populate. Will be cleared
|
|
* before array values are created in it.
|
|
* @param aArray Array with values to populate select with.
|
|
*/
|
|
function bz_populateSelectFromArray(aSelect, aArray) {
|
|
// Clear the field
|
|
bz_clearOptions(aSelect);
|
|
|
|
for (var i = 0; i < aArray.length; i++) {
|
|
var item = aArray[i];
|
|
bz_createOptionInSelect(aSelect, item[1], item[0]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Tells you whether or not a particular value is selected in a select,
|
|
* whether it's a multi-select or a single-select. The check is
|
|
* case-sensitive.
|
|
*
|
|
* @param aSelect The select you're checking.
|
|
* @param aValue The value that you want to know about.
|
|
*/
|
|
function bz_valueSelected(aSelect, aValue) {
|
|
var options = aSelect.options;
|
|
for (var i = 0; i < options.length; i++) {
|
|
if (options[i].selected && options[i].value == aValue) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns all Option elements that are selected in a <select>,
|
|
* as an array. Returns an empty array if nothing is selected.
|
|
*
|
|
* @param aSelect The select you want the selected values of.
|
|
*/
|
|
function bz_selectedOptions(aSelect) {
|
|
// HTML 5
|
|
if (aSelect.selectedOptions) {
|
|
return aSelect.selectedOptions;
|
|
}
|
|
|
|
var start_at = aSelect.selectedIndex;
|
|
if (start_at == -1) return [];
|
|
var first_selected = aSelect.options[start_at];
|
|
if (!aSelect.multiple) return first_selected;
|
|
// selectedIndex is specified as being the "first selected item",
|
|
// so we can start from there.
|
|
var selected = [first_selected];
|
|
var options_length = aSelect.options.length;
|
|
// We start after first_selected
|
|
for (var i = start_at + 1; i < options_length; i++) {
|
|
var this_option = aSelect.options[i];
|
|
if (this_option.selected) selected.push(this_option);
|
|
}
|
|
return selected;
|
|
}
|
|
|
|
/**
|
|
* Returns all Option elements that have the "selected" attribute, as an array.
|
|
* Returns an empty array if nothing is selected.
|
|
*
|
|
* @param aSelect The select you want the pre-selected values of.
|
|
*/
|
|
function bz_preselectedOptions(aSelect) {
|
|
var options = aSelect.options;
|
|
var selected = new Array();
|
|
for (var i = 0, l = options.length; i < l; i++) {
|
|
var attributes = options[i].attributes;
|
|
for (var j = 0, m = attributes.length; j < m; j++) {
|
|
if (attributes[j].name == 'selected') {
|
|
if (!aSelect.multiple) return options[i];
|
|
selected.push(options[i]);
|
|
}
|
|
}
|
|
}
|
|
return selected;
|
|
}
|
|
|
|
/**
|
|
* Tells you where (what index) in a <select> a particular option is.
|
|
* Returns -1 if the value is not in the <select>
|
|
*
|
|
* @param aSelect The select you're checking.
|
|
* @param aValue The value you want to know the index of.
|
|
*/
|
|
function bz_optionIndex(aSelect, aValue) {
|
|
for (var i = 0; i < aSelect.options.length; i++) {
|
|
if (aSelect.options[i].value == aValue) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/**
|
|
* Used to fire an event programmatically.
|
|
*
|
|
* @param anElement The element you want to fire the event of.
|
|
* @param anEvent The name of the event you want to fire,
|
|
* without the word "on" in front of it.
|
|
*/
|
|
function bz_fireEvent(anElement, anEvent) {
|
|
if (document.createEvent) {
|
|
// DOM-compliant browser
|
|
var evt = document.createEvent("HTMLEvents");
|
|
evt.initEvent(anEvent, true, true);
|
|
return !anElement.dispatchEvent(evt);
|
|
} else {
|
|
// IE
|
|
var evt = document.createEventObject();
|
|
return anElement.fireEvent('on' + anEvent, evt);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds a CSS class to an element if it doesn't have it. Removes the
|
|
* CSS class from the element if the element does have the class.
|
|
*
|
|
* Requires YUI's Dom library.
|
|
*
|
|
* @param anElement The element to toggle the class on
|
|
* @param aClass The name of the CSS class to toggle.
|
|
*/
|
|
function bz_toggleClass(anElement, aClass) {
|
|
if (YAHOO.util.Dom.hasClass(anElement, aClass)) {
|
|
YAHOO.util.Dom.removeClass(anElement, aClass);
|
|
}
|
|
else {
|
|
YAHOO.util.Dom.addClass(anElement, aClass);
|
|
}
|
|
}
|