utils.js
Summary
Common functions used in all Zapatec widgets.
Copyright (c) 2004-2007 by Zapatec, Inc.
http://www.zapatec.com
1700 MLK Way, Berkeley, California,
94709, U.S.A.
All rights reserved.
if (typeof Zapatec == 'undefined') {
Zapatec = function() {};
}
Zapatec.Utils = {};
Zapatec.Utils.getAbsolutePos = function(el, scrollOff) {
var SL = 0, ST = 0;
if (!scrollOff) {
var is_div = /^div$/i.test(el.tagName);
if (is_div && el.scrollLeft)
SL = el.scrollLeft;
if (is_div && el.scrollTop)
ST = el.scrollTop;
}
var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
if (el.offsetParent) {
var tmp = this.getAbsolutePos(el.offsetParent);
r.x += tmp.x;
r.y += tmp.y;
}
return r;
};
Zapatec.Utils.getElementOffset = function(oEl) {
var iLeft = iTop = iWidth = iHeight = 0;
var sTag;
if (oEl.getBoundingClientRect) {
var oRect = oEl.getBoundingClientRect();
iLeft = oRect.left;
iTop = oRect.top;
iWidth = oRect.right - iLeft;
iHeight = oRect.bottom - iTop;
iLeft += Zapatec.Utils.getPageScrollX() - 2;
iTop += Zapatec.Utils.getPageScrollY() - 2;
} else {
iWidth = oEl.offsetWidth;
iHeight = oEl.offsetHeight;
var sPos = Zapatec.Utils.getStyleProperty(oEl, 'position');
if (sPos == 'fixed') {
iLeft = oEl.offsetLeft + Zapatec.Utils.getPageScrollX();
iTop = oEl.offsetTop + Zapatec.Utils.getPageScrollY();
} else if (sPos == 'absolute') {
while (oEl) {
sTag = oEl.tagName;
if (sTag) {
sTag = sTag.toLowerCase();
if (sTag != 'body' && sTag != 'html') {
iLeft += parseInt(oEl.offsetLeft, 10) || 0;
iTop += parseInt(oEl.offsetTop, 10) || 0;
}
}
oEl = oEl.offsetParent;
sTag = oEl ? oEl.tagName : null;
if (sTag) {
sTag = sTag.toLowerCase();
if (sTag != 'body' && sTag != 'html') {
iLeft -= oEl.scrollLeft;
iTop -= oEl.scrollTop;
}
}
}
} else {
var bMoz = (Zapatec.is_gecko && !Zapatec.is_khtml);
var fStyle = Zapatec.Utils.getStyleProperty;
var oP = oEl;
while (oP) {
if (bMoz) {
sTag = oP.tagName;
if (sTag) {
sTag = sTag.toLowerCase();
if (sTag == 'body' && !(fStyle(oP, '-moz-box-sizing') == 'border-box')) {
iLeft += parseInt(fStyle(oP, 'border-left-width'));
iTop += parseInt(fStyle(oP, 'border-top-width'));
}
}
}
iLeft += parseInt(oP.offsetLeft, 10) || 0;
iTop += parseInt(oP.offsetTop, 10) || 0;
oP = oP.offsetParent;
}
oP = oEl;
while (oP.parentNode) {
oP = oP.parentNode;
sTag = oP.tagName;
if (sTag) {
sTag = sTag.toLowerCase();
if (sTag != 'body' && sTag != 'html' && sTag != 'tr') {
iLeft -= oP.scrollLeft;
iTop -= oP.scrollTop;
}
}
}
}
}
return {
left: iLeft,
top: iTop,
x: iLeft,
y: iTop,
width: iWidth,
height: iHeight
};
};
Zapatec.Utils.getElementOffsetScrollable = function(oEl) {
var oPos = Zapatec.Utils.getElementOffset(oEl);
if (oEl.scrollLeft) {
oPos.left -= oEl.scrollLeft;
oPos.x = oPos.left;
}
if (oEl.scrollTop) {
oPos.top -= oEl.scrollTop;
oPos.y = oPos.top;
}
return oPos;
};
Zapatec.Utils.fixBoxPosition = function(box, leave) {
var screenX = Zapatec.Utils.getPageScrollX();
var screenY = Zapatec.Utils.getPageScrollY();
var sizes = Zapatec.Utils.getWindowSize();
leave = parseInt(leave, 10) || 0;
if (box.x < screenX) {
box.x = screenX + leave;
}
if (box.y < screenY) {
box.y = screenY + leave;
}
if (box.x + box.width > screenX + sizes.width) {
box.x = screenX + sizes.width - box.width - leave;
}
if (box.y + box.height > screenY + sizes.height) {
box.y = screenY + sizes.height - box.height - leave;
}
};
Zapatec.Utils.isRelated = function (el, evt) {
evt || (evt = window.event);
var related = evt.relatedTarget;
if (!related) {
var type = evt.type;
if (type == "mouseover") {
related = evt.fromElement;
} else if (type == "mouseout") {
related = evt.toElement;
}
}
try {
while (related) {
if (related == el) {
return true;
}
related = related.parentNode;
}
} catch(e) {};
return false;
};
Zapatec.Utils.removeClass = function(el, className) {
if (!(el && el.className)) {
return;
}
var cls = el.className.split(" ");
var ar = [];
for (var i = cls.length; i > 0;) {
if (cls[--i] != className) {
ar[ar.length] = cls[i];
}
}
el.className = ar.join(" ");
};
Zapatec.Utils.addClass = function(el, className) {
Zapatec.Utils.removeClass(el, className);
el.className += " " + className;
};
Zapatec.Utils.replaceClass = function(el, className, withClassName) {
if (!Zapatec.isHtmlElement(el) || !className) {
return false;
}
el.className.replace(className, withClassName);
};
Zapatec.Utils.getElement = function(ev) {
if (Zapatec.is_ie) {
return window.event.srcElement;
} else {
return ev.currentTarget;
}
};
Zapatec.Utils.getTargetElement = function(ev) {
if (Zapatec.is_ie) {
return window.event.srcElement;
} else {
return ev.target;
}
};
Zapatec.Utils.getMousePos = function(oEv) {
oEv || (oEv = window.event);
var oPos = {
pageX: 0,
pageY: 0,
clientX: 0,
clientY: 0
};
if (oEv) {
var bIsPageX = (typeof oEv.pageX != 'undefined');
var bIsClientX = (typeof oEv.clientX != 'undefined');
if (bIsPageX || bIsClientX) {
if (bIsPageX) {
oPos.pageX = oEv.pageX;
oPos.pageY = oEv.pageY;
} else {
oPos.pageX = oEv.clientX + Zapatec.Utils.getPageScrollX();
oPos.pageY = oEv.clientY + Zapatec.Utils.getPageScrollY();
}
if (bIsClientX) {
oPos.clientX = oEv.clientX;
oPos.clientY = oEv.clientY;
} else {
oPos.clientX = oEv.pageX - Zapatec.Utils.getPageScrollX();
oPos.clientY = oEv.pageY - Zapatec.Utils.getPageScrollY();
}
}
}
return oPos;
};
Zapatec.Utils.stopEvent = function(ev) {
ev || (ev = window.event);
if (ev) {
if (Zapatec.is_ie) {
ev.cancelBubble = true;
ev.returnValue = false;
} else {
ev.preventDefault();
ev.stopPropagation();
}
}
return false;
};
Zapatec.Utils.removeOnUnload = [];
Zapatec.Utils.addEvent = function(oElement, sEvent, fListener, bUseCapture) {
if (oElement.addEventListener) {
if (!bUseCapture) {
bUseCapture = false;
}
oElement.addEventListener(sEvent, fListener, bUseCapture);
} else if (oElement.attachEvent) {
oElement.detachEvent('on' + sEvent, fListener);
oElement.attachEvent('on' + sEvent, fListener);
if (bUseCapture) {
oElement.setCapture(false);
}
}
Zapatec.Utils.removeOnUnload.push({
'element': oElement,
'event': sEvent,
'listener': fListener,
'capture': bUseCapture
});
};
Zapatec.Utils.removeEvent = function(oElement, sEvent, fListener, bUseCapture) {
if (oElement.removeEventListener) {
oElement.removeEventListener(sEvent, fListener, bUseCapture);
} else if (oElement.detachEvent) {
oElement.detachEvent('on' + sEvent, fListener);
}
for (var iLis = Zapatec.Utils.removeOnUnload.length - 1; iLis >= 0; iLis--) {
var oParams = Zapatec.Utils.removeOnUnload[iLis];
if (!oParams) {
continue;
}
if (oElement == oParams['element'] && sEvent == oParams['event'] &&
fListener == oParams['listener'] && bUseCapture == oParams['capture']) {
Zapatec.Utils.removeOnUnload[iLis] = null;
Zapatec.Utils.removeEvent(
oParams['element'],
oParams['event'],
oParams['listener'],
oParams['capture']
);
}
}
};
Zapatec.Utils.createElement = function(type, parent, selectable) {
var el = null;
if (document.createElementNS)
el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
else
el = document.createElement(type);
if (typeof parent != "undefined" && parent != null)
parent.appendChild(el);
if (!selectable) {
if (Zapatec.is_ie)
el.setAttribute("unselectable", true);
if (Zapatec.is_gecko)
el.style.setProperty("-moz-user-select", "none", "");
}
return el;
};
Zapatec.Utils.writeCookie = function(name, value, domain, path, exp_days) {
value = escape(value);
var ck = name + "=" + value, exp;
if (domain)
ck += ";domain=" + domain;
if (path)
ck += ";path=" + path;
if (exp_days) {
exp = new Date();
exp.setTime(exp_days * 86400000 + exp.getTime());
ck += ";expires=" + exp.toGMTString();
}
document.cookie = ck;
};
Zapatec.Utils.getCookie = function(name) {
var pattern = name + "=";
var tokenPos = 0;
while (tokenPos < document.cookie.length) {
var valuePos = tokenPos + pattern.length;
if (document.cookie.substring(tokenPos, valuePos) == pattern) {
var endValuePos = document.cookie.indexOf(";", valuePos);
if (endValuePos == -1) {
endValuePos = document.cookie.length;
}
return unescape(document.cookie.substring(valuePos, endValuePos));
}
tokenPos=document.cookie.indexOf(" ",tokenPos)+1;
if (tokenPos == 0) {
break;
}
}
return null;
};
Zapatec.Utils.makePref = function(obj) {
function stringify(val) {
if (typeof val == "object" && !val)
return "null";
else if (typeof val == "number" || typeof val == "boolean")
return val;
else if (typeof val == "string")
return '"' + val.replace(/\x22/, "\\22") + '"';
else return null;
};
var txt = "", i;
for (i in obj)
txt += (txt ? ",'" : "'") + i + "':" + stringify(obj[i]);
return txt;
};
Zapatec.Utils.loadPref = function(txt) {
var obj = null;
try {
eval("obj={" + txt + "}");
} catch(e) {}
return obj;
};
Zapatec.Utils.mergeObjects = function(dest, src) {
for (var i in src)
dest[i] = src[i];
};
Zapatec.Utils.__wch_id = 0;
Zapatec.Utils.createWCH = function(oEl) {
if (!Zapatec.is_ie || Zapatec.is_ie5 || Zapatec.is_ie7) {
return null;
}
var sId = 'WCH' + (++Zapatec.Utils.__wch_id);
var sIframe = [
'<iframe id="',
sId,
'" scrolling="no" frameborder="0" style="z-index:0;position:absolute;visibility:hidden;filter:progid:DXImageTransform.Microsoft.alpha(style=0,opacity=0);border:0;top:0;left:0;width:0;height:0" src="javascript:false"></iframe>'
].join('')
if (!oEl) {
oEl = document.body;
}
if (Zapatec.windowLoaded) {
oEl.insertAdjacentHTML('beforeEnd', sIframe);
} else {
Zapatec.Utils.addEvent(window, 'load', function() {
oEl.insertAdjacentHTML('beforeEnd', sIframe);
oEl = null;
});
}
return document.getElementById(sId);
};
Zapatec.Utils.setupWCH_el = function(f, el, el2) {
if (f) {
var pos = Zapatec.Utils.getAbsolutePos(el),
X1 = pos.x,
Y1 = pos.y,
X2 = X1 + el.offsetWidth,
Y2 = Y1 + el.offsetHeight;
if (el2) {
var p2 = Zapatec.Utils.getAbsolutePos(el2),
XX1 = p2.x,
YY1 = p2.y,
XX2 = XX1 + el2.offsetWidth,
YY2 = YY1 + el2.offsetHeight;
if (X1 > XX1)
X1 = XX1;
if (Y1 > YY1)
Y1 = YY1;
if (X2 < XX2)
X2 = XX2;
if (Y2 < YY2)
Y2 = YY2;
}
Zapatec.Utils.setupWCH(f, X1, Y1, X2-X1, Y2-Y1);
}
};
Zapatec.Utils.setupWCH = function(f, x, y, w, h) {
if (f) {
var s = f.style;
(typeof x != "undefined") && (s.left = x + "px");
(typeof y != "undefined") && (s.top = y + "px");
(typeof w != "undefined") && (s.width = w + "px");
(typeof h != "undefined") && (s.height = h + "px");
s.visibility = "inherit";
}
};
Zapatec.Utils.hideWCH = function(f) {
if (f)
f.style.visibility = "hidden";
};
Zapatec.Utils.getPageScrollY = function() {
if (window.pageYOffset) {
return window.pageYOffset;
} else if (document.body && document.body.scrollTop) {
return document.body.scrollTop;
} else if (document.documentElement && document.documentElement.scrollTop) {
return document.documentElement.scrollTop;
}
return 0;
};
Zapatec.Utils.getPageScrollX = function() {
if (window.pageXOffset) {
return window.pageXOffset;
} else if (document.body && document.body.scrollLeft) {
return document.body.scrollLeft;
} else if (document.documentElement && document.documentElement.scrollLeft) {
return document.documentElement.scrollLeft;
}
return 0;
};
Zapatec.ScrollWithWindow = {};
Zapatec.ScrollWithWindow.list = [];
Zapatec.ScrollWithWindow.stickiness = 0.25;
Zapatec.ScrollWithWindow.register = function(oElement) {
var iTop = oElement.offsetTop || 0;
var iLeft = oElement.offsetLeft || 0;
Zapatec.ScrollWithWindow.list.push({
node: oElement,
origTop: iTop,
origLeft: iLeft
});
if (!Zapatec.ScrollWithWindow.interval) {
Zapatec.ScrollWithWindow.on();
}
};
Zapatec.ScrollWithWindow.unregister = function(oElement) {
for (var iItem = 0; iItem < Zapatec.ScrollWithWindow.list.length; iItem++) {
var oItem = Zapatec.ScrollWithWindow.list[iItem];
if (oElement == oItem.node) {
Zapatec.ScrollWithWindow.list.splice(iItem, 1);
if (!Zapatec.ScrollWithWindow.list.length) {
Zapatec.ScrollWithWindow.off();
}
return;
}
}
};
Zapatec.ScrollWithWindow.moveTop = function(iTop) {
Zapatec.ScrollWithWindow.top += (iTop - Zapatec.ScrollWithWindow.top) *
Zapatec.ScrollWithWindow.stickiness;
if (Math.abs(Zapatec.ScrollWithWindow.top - iTop) <= 1) {
Zapatec.ScrollWithWindow.top = iTop;
}
for (var iItem = 0; iItem < Zapatec.ScrollWithWindow.list.length; iItem++) {
var oItem = Zapatec.ScrollWithWindow.list[iItem];
var oElement = oItem.node;
oElement.style.position = 'absolute';
if (!oItem.origTop && oItem.origTop !== 0) {
oItem.origTop = parseInt(oElement.style.top) || 0;
}
oElement.style.top = oItem.origTop +
parseInt(Zapatec.ScrollWithWindow.top) + 'px';
}
};
Zapatec.ScrollWithWindow.moveLeft = function(iLeft) {
Zapatec.ScrollWithWindow.left += (iLeft - Zapatec.ScrollWithWindow.left) *
Zapatec.ScrollWithWindow.stickiness;
if (Math.abs(Zapatec.ScrollWithWindow.left - iLeft) <= 1) {
Zapatec.ScrollWithWindow.left = iLeft;
}
for (var iItem = 0; iItem < Zapatec.ScrollWithWindow.list.length; iItem++) {
var oItem = Zapatec.ScrollWithWindow.list[iItem];
var oElement = oItem.node;
oElement.style.position = 'absolute';
if (!oItem.origLeft && oItem.origLeft !== 0) {
oItem.origLeft = parseInt(oElement.style.left) || 0;
}
oElement.style.left = oItem.origLeft +
parseInt(Zapatec.ScrollWithWindow.left) + 'px';
}
};
Zapatec.ScrollWithWindow.cycle = function() {
var iTop = Zapatec.Utils.getPageScrollY();
var iLeft = Zapatec.Utils.getPageScrollX();
if (iTop != Zapatec.ScrollWithWindow.top) {
Zapatec.ScrollWithWindow.moveTop(iTop);
}
if (iLeft != Zapatec.ScrollWithWindow.left) {
Zapatec.ScrollWithWindow.moveLeft(iLeft);
}
};
Zapatec.ScrollWithWindow.on = function() {
if (Zapatec.ScrollWithWindow.interval) {
return;
}
Zapatec.ScrollWithWindow.top = Zapatec.Utils.getPageScrollY();
Zapatec.ScrollWithWindow.left = Zapatec.Utils.getPageScrollX();
Zapatec.ScrollWithWindow.interval =
setInterval(Zapatec.ScrollWithWindow.cycle, 50);
};
Zapatec.ScrollWithWindow.off = function() {
if (!Zapatec.ScrollWithWindow.interval) {
return;
}
clearInterval(Zapatec.ScrollWithWindow.interval);
Zapatec.ScrollWithWindow.interval = null;
};
Zapatec.FixateOnScreen = {};
Zapatec.FixateOnScreen.getExpression = function(coord, direction) {
return "Zapatec.Utils.getPageScroll" + direction.toUpperCase() + "() + " + coord;
};
Zapatec.FixateOnScreen.parseCoordinates = function(element) {
if (!this.isRegistered(element)) {
return false;
}
var x = 0;
var y = 0;
var style = element.style;
if (Zapatec.is_ie && !Zapatec.is_ie7) {
x = style.getExpression("left").split(" ");
x = parseInt(x[x.length - 1], 10);
y = style.getExpression("top").split(" ");
y = parseInt(y[y.length - 1], 10);
} else {
x = parseInt(style.left, 10);
y = parseInt(style.top, 10);
}
x += Zapatec.Utils.getPageScrollX();
y += Zapatec.Utils.getPageScrollY();
return {x : x, y : y};
};
Zapatec.FixateOnScreen.correctCoordinates = function(x, y) {
position = {x : x, y : y};
if (position.x || position.x === 0) {
position.x -= Zapatec.Utils.getPageScrollX();
if (Zapatec.is_ie && !Zapatec.is_ie7) {
position.x = this.getExpression(position.x, "X");;
} else {
position.x += "px";
}
}
if (position.y || position.y === 0) {
position.y -= Zapatec.Utils.getPageScrollY();
if (Zapatec.is_ie && !Zapatec.is_ie7) {
position.y = this.getExpression(position.y, "Y");;
} else {
position.y += "px";
}
}
return position;
};
Zapatec.FixateOnScreen.register = function(element) {
if (!Zapatec.isHtmlElement(element)) {
return false;
}
if (this.isRegistered(element)) {
return true;
}
var pos = Zapatec.Utils.getElementOffset(element);
pos = {
x : parseInt(element.style.left, 10) || pos.x,
y : parseInt(element.style.top, 10) || pos.y
}
pos = this.correctCoordinates(pos.x, pos.y);
if (!Zapatec.is_ie || Zapatec.is_ie7) {
var restorer = element.restorer;
if (!restorer || !restorer.getObject || restorer.getObject() != element) {
restorer = element.restorer = new Zapatec.SRProp(element);
}
restorer.saveProp("style.position");
element.style.position = "fixed";
element.style.left = pos.x;
element.style.top = pos.y;
} else {
element.style.setExpression("left", pos.x);
element.style.setExpression("top", pos.y);
}
element.zpFixed = true;
return true;
};
Zapatec.FixateOnScreen.unregister = function(element) {
if (!Zapatec.isHtmlElement(element)) {
return false;
}
var pos = this.parseCoordinates(element);
if (pos === false) {
return true;
}
if (Zapatec.is_ie && !Zapatec.is_ie7) {
element.style.removeExpression("left");
element.style.removeExpression("top");
}
element.style.left = pos.x + "px";
element.style.top = pos.y + "px";
if (!Zapatec.is_ie || Zapatec.is_ie7) {
element.restorer.restoreProp("style.position", true);
}
element.zpFixed = false;
return true;
};
Zapatec.FixateOnScreen.isRegistered = function(element) {
if (element.zpFixed) {
return true;
}
return false;
};
Zapatec.Utils.destroy = function(el) {
if (el && el.parentNode)
el.parentNode.removeChild(el);
};
Zapatec.Utils.newCenteredWindow = function(url, windowName, width, height, scrollbars){
var leftPosition = 0;
var topPosition = 0;
if (screen.width)
leftPosition = (screen.width - width)/2;
if (screen.height)
topPosition = (screen.height - height)/2;
var winArgs =
'height=' + height +
',width=' + width +
',top=' + topPosition +
',left=' + leftPosition +
',scrollbars=' + scrollbars +
',resizable';
var win = window.open(url,windowName,winArgs);
return win;
};
Zapatec.Utils.getWindowSize = function() {
var iWidth = 0;
var iHeight = 0;
if (Zapatec.is_opera) {
iWidth = document.body.clientWidth || 0;
iHeight = document.body.clientHeight || 0;
} else if (Zapatec.is_khtml) {
iWidth = window.innerWidth || 0;
iHeight = window.innerHeight || 0;
} else if (document.compatMode && document.compatMode == 'CSS1Compat') {
iWidth = document.documentElement.clientWidth || 0;
iHeight = document.documentElement.clientHeight || 0;
} else {
iWidth = document.body.clientWidth || 0;
iHeight = document.body.clientHeight || 0;
}
return {
width: iWidth,
height: iHeight
};
};
Zapatec.Utils.selectOption = function(sel, val, call_default) {
var a = sel.options, i, o;
for (i = a.length; --i >= 0;) {
o = a[i];
o.selected = (o.value == val);
}
sel.value = val;
if (call_default) {
if (typeof sel.onchange == "function")
sel.onchange();
else if (typeof sel.onchange == "string")
eval(sel.onchange);
}
};
Zapatec.Utils.getNextSibling = function(el, tag, alternateTag) {
el = el.nextSibling;
if (!tag) {
return el;
}
tag = tag.toLowerCase();
if (alternateTag) alternateTag = alternateTag.toLowerCase();
while (el) {
if (el.nodeType == 1 && (el.tagName.toLowerCase() == tag ||
(alternateTag && el.tagName.toLowerCase() == alternateTag))) {
return el;
}
el = el.nextSibling;
}
return el;
};
Zapatec.Utils.getPreviousSibling = function(el, tag, alternateTag) {
el = el.previousSibling;
if (!tag) {
return el;
}
tag = tag.toLowerCase();
if (alternateTag) alternateTag = alternateTag.toLowerCase();
while (el) {
if (el.nodeType == 1 && (el.tagName.toLowerCase() == tag ||
(alternateTag && el.tagName.toLowerCase() == alternateTag))) {
return el;
}
el = el.previousSibling;
}
return el;
};
Zapatec.Utils.getFirstChild = function(el, tag, alternateTag) {
if (!el) {
return null;
}
el = el.firstChild;
if (!el) {
return null;
}
if (!tag) {
return el;
}
tag = tag.toLowerCase();
if (el.nodeType == 1) {
if (el.tagName.toLowerCase() == tag) {
return el;
} else if (alternateTag) {
alternateTag = alternateTag.toLowerCase();
if (el.tagName.toLowerCase() == alternateTag) {
return el;
}
}
}
return Zapatec.Utils.getNextSibling(el, tag, alternateTag);
};
Zapatec.Utils.getLastChild = function(el, tag, alternateTag) {
if (!el) {
return null;
}
el = el.lastChild;
if (!el) {
return null;
}
if (!tag) {
return el;
}
tag = tag.toLowerCase();
if (el.nodeType == 1) {
if (el.tagName.toLowerCase() == tag) {
return el;
} else if (alternateTag) {
alternateTag = alternateTag.toLowerCase();
if (el.tagName.toLowerCase() == alternateTag) {
return el;
}
}
}
return Zapatec.Utils.getPreviousSibling(el, tag, alternateTag);
};
Zapatec.Utils.getChildText = function(objNode) {
if (objNode == null) {
return '';
}
var arrText = [];
var objChild = objNode.firstChild;
while (objChild != null) {
if (objChild.nodeType == 3) {
arrText.push(objChild.data);
}
objChild = objChild.nextSibling;
}
return arrText.join(' ');
};
Zapatec.Utils.insertAfter = function(oldNode, newNode) {
if(oldNode.nextSibling) {
oldNode.parentNode.insertBefore(newNode, oldNode.nextSibling);
} else {
oldNode.parentNode.appendChild(newNode);
}
}
Zapatec.Utils._ids = {};
Zapatec.Utils.generateID = function(code, id) {
if (typeof id == "undefined") {
if (typeof this._ids[code] == "undefined")
this._ids[code] = 0;
id = ++this._ids[code];
}
return "zapatec-" + code + "-" + id;
};
Zapatec.Utils.addTooltip = function(target, tooltip) {
return new Zapatec.Tooltip({target: target, tooltip: tooltip});
};
Zapatec.isLite=true;
Zapatec.Utils.checkLinks = function(){
var anchors = document.getElementsByTagName('A');
for(var ii = 0; ii < anchors.length; ii++){
if(Zapatec.Utils.checkLink(anchors[ii])){
return true;
}
}
return false;
}
Zapatec.Utils.checkLink = function(lnk){
if(!lnk){
return false;
}
if(!/^https?:\/\/((dev|www)\.)?zapatec\.com/i.test(lnk.href)){
return false;
}
var textContent = ""
for(var ii = 0; ii < lnk.childNodes.length; ii++){
if(lnk.childNodes[ii].nodeType == 3){
textContent += lnk.childNodes[ii].nodeValue;
}
}
if(textContent.length < 4){
return false;
}
var parent = lnk;
while(parent && parent.nodeName.toLowerCase() != "html"){
if(
Zapatec.Utils.getStyleProperty(parent, "display") == "none" ||
Zapatec.Utils.getStyleProperty(parent, "visibility") == "hidden" ||
Zapatec.Utils.getStyleProperty(parent, "opacity") == "0" ||
Zapatec.Utils.getStyleProperty(parent, "-moz-opacity") == "0" ||
/alpha\(opacity=0\)/i.test(Zapatec.Utils.getStyleProperty(parent, "filter"))
){
return false;
}
parent = parent.parentNode;
}
var coords = Zapatec.Utils.getElementOffset(lnk);
if(coords.left < 0 || coords.top < 0){
return false;
}
return true;
}
Zapatec.Utils.checkActivation = function() {
if (!Zapatec.isLite) return true;
var arrProducts=[]
add_product=function(script, webdir_in, name_in)
{
arrProducts[script]={webdir:webdir_in, name:name_in, bActive:false}
}
add_product('calendar.js', 'prod1', 'Calendar')
add_product('zpmenu.js', 'menu', 'Menu')
add_product('tree.js', 'prod3', 'Tree')
add_product('form.js', 'forms', 'Forms')
add_product('effects.js', 'effects', 'Effects')
add_product('hoverer.js', 'effects', 'Effects - Hoverer')
add_product('slideshow.js','effects', 'Effects - Slideshow')
add_product('zpgrid.js', 'grid', 'Grid')
add_product('slider.js', 'slider', 'Slider')
add_product('zptabs.js', 'tabs', 'Tabs')
add_product('zptime.js', 'time', 'Time')
add_product('window.js', 'windows', 'Window')
var strName, arrName, i
var bProduct=false
var scripts = document.getElementsByTagName('script');
for (i=0; i<scripts.length; i++)
{
if (/wizard.js/i.test(scripts[i].src))
return true
arrName=scripts[i].src.split('/')
if (arrName.length==0)
strName=scripts[i]
else
strName=arrName[arrName.length-1]
strName=strName.toLowerCase()
if (typeof arrProducts[strName] != 'undefined')
{
bProduct=true
arrProducts[strName].bActive=true
}
}
if(!bProduct || Zapatec.Utils.checkLinks()){
return true;
}
var strMsg='You are using the Free version of the Zapatec Software.\n'+
'While using the Free version, a link to www.zapatec.com in this page is required.'
for (i in arrProducts)
if (arrProducts[i].bActive==true)
strMsg+='\nTo purchase the Zapatec ' + arrProducts[i].name + ' visit www.zapatec.com/website/main/products/' + arrProducts[i].webdir + '/'
alert(strMsg)
return false;
}
Zapatec.Utils.clone = function(oSrc) {
if (typeof oSrc == 'object' && oSrc) {
var oClone = new oSrc.constructor();
var fClone = Zapatec.Utils.clone;
for (var sProp in oSrc) {
oClone[sProp] = fClone(oSrc[sProp]);
}
return oClone;
}
return oSrc;
};
Zapatec.is_opera = /opera/i.test(navigator.userAgent);
Zapatec.is_ie = ( /msie/i.test(navigator.userAgent) && !Zapatec.is_opera );
Zapatec.is_ie5 = ( Zapatec.is_ie && /msie 5\.0/i.test(navigator.userAgent) );
Zapatec.is_ie7 = ( Zapatec.is_ie && /msie 7\.0/i.test(navigator.userAgent) );
Zapatec.is_mac_ie = ( /msie.*mac/i.test(navigator.userAgent) && !Zapatec.is_opera );
Zapatec.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
Zapatec.is_konqueror = /Konqueror/i.test(navigator.userAgent);
Zapatec.is_gecko = /Gecko/i.test(navigator.userAgent);
Zapatec.is_webkit = /WebKit/i.test(navigator.userAgent);
Zapatec.webkitVersion = Zapatec.is_webkit?parseInt(navigator.userAgent.replace(
/.+WebKit\/([0-9]+)\..+/, "$1")):-1;
if (!Object.prototype.hasOwnProperty) {
Object.prototype.hasOwnProperty = function(strProperty) {
try {
var objPrototype = this.constructor.prototype;
while (objPrototype) {
if (objPrototype[strProperty] == this[strProperty]) {
return false;
}
objPrototype = objPrototype.prototype;
}
} catch (objException) {}
return true;
};
}
if (!Function.prototype.call) {
Function.prototype.call = function() {
var objThis = arguments[0];
objThis._this_func = this;
var arrArgs = [];
for (var iArg = 1; iArg < arguments.length; iArg++) {
arrArgs[arrArgs.length] = 'arguments[' + iArg + ']';
}
var ret = eval('objThis._this_func(' + arrArgs.join(',') + ')');
objThis._this_func = null;
return ret;
};
}
if (!Function.prototype.apply) {
Function.prototype.apply = function() {
var objThis = arguments[0];
var objArgs = arguments[1];
objThis._this_func = this;
var arrArgs = [];
if (objArgs) {
for (var iArg = 0; iArg < objArgs.length; iArg++) {
arrArgs[arrArgs.length] = 'objArgs[' + iArg + ']';
}
}
var ret = eval('objThis._this_func(' + arrArgs.join(',') + ')');
objThis._this_func = null;
return ret;
};
}
if (!Array.prototype.pop) {
Array.prototype.pop = function() {
var last;
if (this.length) {
last = this[this.length - 1];
this.length -= 1;
}
return last;
};
}
if (!Array.prototype.push) {
Array.prototype.push = function() {
for (var i = 0; i < arguments.length; i++) {
this[this.length] = arguments[i];
}
return this.length;
};
}
if (!Array.prototype.shift) {
Array.prototype.shift = function() {
var first;
if (this.length) {
first = this[0];
for (var i = 0; i < this.length - 1; i++) {
this[i] = this[i + 1];
}
this.length -= 1;
}
return first;
};
}
if (!Array.prototype.unshift) {
Array.prototype.unshift = function() {
if (arguments.length) {
var i, len = arguments.length;
for (i = this.length + len - 1; i >= len; i--) {
this[i] = this[i - len];
}
for (i = 0; i < len; i++) {
this[i] = arguments[i];
}
}
return this.length;
};
}
if (!Array.prototype.splice) {
Array.prototype.splice = function(index, howMany) {
var elements = [], removed = [], i;
for (i = 2; i < arguments.length; i++) {
elements.push(arguments[i]);
}
for (i = index; (i < index + howMany) && (i < this.length); i++) {
removed.push(this[i]);
}
for (i = index + howMany; i < this.length; i++) {
this[i - howMany] = this[i];
}
this.length -= removed.length;
for (i = this.length + elements.length - 1; i >= index + elements.length;
i--) {
this[i] = this[i - elements.length];
}
for (i = 0; i < elements.length; i++) {
this[index + i] = elements[i];
}
return removed;
};
}
Zapatec.Utils.arrIndexOf = function(aArr, vSearchEl, iFromInd) {
if (!(aArr instanceof Array)) {
return -1;
}
if (Array.prototype.indexOf) {
return aArr.indexOf(vSearchEl, iFromInd);
}
if (!iFromInd) {
iFromInd = 0;
}
var iEls = aArr.length;
for (var iEl = iFromInd; iEl < iEls; iEl++) {
if (aArr[iEl] == vSearchEl) {
return iEl;
}
}
return -1;
};
Zapatec.Log = function(objArgs) {
if (!objArgs) {
return;
}
var strMessage = objArgs.description;
if (objArgs.severity) {
strMessage = objArgs.severity + ':\n' + strMessage;
}
if (objArgs.type != "warning") {
alert(strMessage);
}
};
Zapatec.Utils.Array = {};
Zapatec.Utils.Array.insertBefore = function (arr, el, key, nextKey) {
var tmp = new Array();
for(var i in arr) {
if (i == nextKey) {
if (key) {
tmp[key] = el;
} else {
tmp.push(el);
}
}
tmp[i] = arr[i];
}
return tmp;
}
Zapatec.inherit = function(oSubClass, oSuperClass, oArg) {
var Inheritance = function() {};
Inheritance.prototype = oSuperClass.prototype;
oSubClass.prototype = new Inheritance();
oSubClass.prototype.constructor = oSubClass;
oSubClass.SUPERconstructor = oSuperClass;
oSubClass.SUPERclass = oSuperClass.prototype;
if (typeof oSuperClass.path != 'undefined') {
if (oArg && oArg.keepPath) {
oSubClass.path = oSuperClass.path;
} else {
oSubClass.path = Zapatec.getPath(oSubClass.id);
}
}
};
Zapatec.getPath = function(sId) {
var sSrc;
if (typeof sId == 'string') {
var oScript = document.getElementById(sId);
if (oScript) {
sSrc = oScript.getAttribute('src');
}
}
if (!sSrc) {
if (typeof Zapatec.lastLoadedModule == 'string') {
return Zapatec.lastLoadedModule;
}
if (document.documentElement) {
var sHtml = document.documentElement.innerHTML;
var aMatch = sHtml.match(/<script[^>]+src=[^>]+>/gi);
if (aMatch && aMatch.length) {
sHtml = aMatch[aMatch.length - 1];
aMatch = sHtml.match(/src="([^"]+)/i);
if (aMatch && aMatch.length == 2) {
sSrc = aMatch[1];
}
}
}
if (!sSrc) {
return '';
}
}
sSrc = sSrc.replace(/\\/g, '/');
var aTokens = sSrc.split('?');
aTokens = aTokens[0].split('/');
aTokens = aTokens.slice(0, -1);
if (!aTokens.length) {
return '';
}
return aTokens.join('/') + '/';
};
Zapatec.Utils.setWindowEvent = function(oEvent) {
if (oEvent) {
window.event = oEvent;
}
};
Zapatec.Utils.emulateWindowEvent = function(aEvents) {
if (document.addEventListener) {
var iEvents = aEvents.length;
var oUtils = Zapatec.Utils;
var iEvent;
for (iEvent = 0; iEvent < iEvents; iEvent++) {
document.addEventListener(aEvents[iEvent], oUtils.setWindowEvent, true);
}
}
};
Zapatec.windowLoaded = typeof(document.readyState) != 'undefined' ?
(
document.readyState == 'loaded' ||
document.readyState == 'complete'
) :
document.getElementsByTagName != null && typeof(document.getElementsByTagName('body')[0]) != 'undefined'
;
Zapatec.Utils.addEvent(window, "load", function() {Zapatec.windowLoaded = true;});
Zapatec.Utils.warnUnload = function(msg, win){
Zapatec.Utils.warnUnloadFlag = true;
if(typeof(msg) != "string"){
msg = "All your changes will be lost.";
}
if(typeof(win) == 'undefined'){
win = window;
}
Zapatec.Utils.addEvent(win, 'beforeunload', function(ev){
if(Zapatec.Utils.warnUnloadFlag != true){
return true;
}
if(typeof(ev) == 'undefined'){
ev = window.event;
}
ev.returnValue = msg;
return false;
});
}
Zapatec.Utils.unwarnUnload = function(msg, win){
Zapatec.Utils.warnUnloadFlag = false;
}
Zapatec.Utils.warnUnloadFlag = false;
Zapatec.Utils.getMaxZindex = function() {
if (window.opera || Zapatec.is_khtml) {
return 2147483583;
} else if (Zapatec.is_ie){
return 2147483647;
} else {
return 10737418239;
}
};
Zapatec.Utils.correctCssLength = function(val) {
if (typeof val == 'undefined' || (typeof val == 'object' && !val)) {
return 'auto';
}
val += '';
if (!val.length) {
return 'auto';
}
if (/\d$/.test(val)) {
val += 'px';
}
return val;
};
Zapatec.Utils.destroyOnUnload = [];
Zapatec.Utils.addDestroyOnUnload = function(objElement, strProperty) {
Zapatec.Utils.destroyOnUnload.push([objElement, strProperty]);
};
Zapatec.Utils.createProperty = function(objElement, strProperty, val) {
objElement[strProperty] = val;
Zapatec.Utils.addDestroyOnUnload(objElement, strProperty);
};
Zapatec.Utils.addEvent(window, 'unload', function() {
for (var iObj = Zapatec.Utils.destroyOnUnload.length - 1; iObj >= 0; iObj--) {
var objDestroy = Zapatec.Utils.destroyOnUnload[iObj];
objDestroy[0][objDestroy[1]] = null;
objDestroy[0] = null;
}
for (var iLis = Zapatec.Utils.removeOnUnload.length - 1; iLis >= 0; iLis--) {
var oParams = Zapatec.Utils.removeOnUnload[iLis];
if (!oParams) {
continue;
}
Zapatec.Utils.removeOnUnload[iLis] = null;
Zapatec.Utils.removeEvent(
oParams['element'],
oParams['event'],
oParams['listener'],
oParams['capture']
);
}
});
Zapatec.Utils.htmlEncode = function(str) {
str = str.replace(/&/ig, "&");
str = str.replace(/</ig, "<");
str = str.replace(/>/ig, ">");
str = str.replace(/\x22/ig, """);
return str;
};
Zapatec.Utils.applyStyle = function(elRef, style){
if(typeof(elRef) == 'string'){
elRef = document.getElementById(elRef);
}
if(elRef == null || style == null || elRef.style == null){
return null;
}
if(Zapatec.is_opera){
var pairs = style.split(";");
for(var ii =0; ii < pairs.length; ii++){
var kv = pairs[ii].split(":");
if (!kv[1]) {
continue;
}
var value = kv[1].replace(/^\s*/, '').replace(/\s*$/, '');
var key = "";
for(var jj = 0; jj < kv[0].length; jj++){
if(kv[0].charAt(jj) == "-"){
jj++;
if(jj < kv[0].length){
key += kv[0].charAt(jj).toUpperCase();
}
continue;
}
key += kv[0].charAt(jj);
}
switch(key){
case "float":
key = "cssFloat";
break;
}
try{
elRef.style[key] = value;
} catch(e){}
}
} else {
elRef.style.cssText = style;
}
return true;
}
Zapatec.Utils.getStyleProperty = function(oEl, sPr) {
var oDV = document.defaultView;
if (oDV && oDV.getComputedStyle) {
var oCS = oDV.getComputedStyle(oEl, '');
if (oCS) {
sPr = sPr.replace(/([A-Z])/g, '-$1').toLowerCase();
return oCS.getPropertyValue(sPr);
}
} else if (oEl.currentStyle) {
return oEl.currentStyle[sPr];
}
return oEl.style[sPr];
};
Zapatec.Utils.getPrecision = function(dFloat){
return (dFloat + '').replace(/^-?\d*\.*/, '').length;
};
Zapatec.Utils.setPrecision = function(dFloat, iPrecision){
dFloat *= 1;
if (dFloat.toFixed) {
return dFloat.toFixed(iPrecision) * 1;
}
var iPow = Math.pow(10, iPrecision);
return parseInt(dFloat * iPow, 10) / iPow;
};
Zapatec.Utils.setPrecisionString = function(dFloat, iPrecision){
var sFloat = Zapatec.Utils.setPrecision(dFloat, iPrecision) + '';
var iOldPrecision = Zapatec.Utils.getPrecision(sFloat);
var iZeros = iPrecision - iOldPrecision;
if (iZeros) {
if (!iOldPrecision) {
sFloat += '.';
}
for (var iZero = 0; iZero < iZeros; iZero++) {
sFloat += '0';
}
}
return sFloat;
};
Zapatec.Utils.createNestedHash = function(parent, keys, value){
if(parent == null || keys == null){
return null;
}
var tmp = parent;
for(var ii = 0; ii < keys.length; ii++){
if(typeof(tmp[keys[ii]]) == 'undefined'){
tmp[keys[ii]] = {};
}
if(ii == keys.length - 1 && typeof(value) != 'undefined'){
tmp[keys[ii]] = value;
}
tmp = tmp[keys[ii]];
}
}
Zapatec.implement = function(classOrObject, interfaceStr) {
if (typeof interfaceStr != "string") {
return false;
}
if (typeof classOrObject == "function") {
classOrObject = classOrObject.prototype;
}
if (!classOrObject || typeof classOrObject != "object") {
return false;
}
var interfaceObj = window;
var objs = interfaceStr.split(".");
try {
for(var i = 0; i < objs.length; ++i) {
interfaceObj = interfaceObj[objs[i]];
}
} catch(e) {
return false;
}
if (typeof classOrObject.interfaces != "object") {
classOrObject.interfaces = {};
classOrObject.interfaces[interfaceStr] = true;
} else if (classOrObject.interfaces[interfaceStr] !== true) {
classOrObject.interfaces = Zapatec.Utils.clone(classOrObject.interfaces);
classOrObject.interfaces[interfaceStr] = true;
} else {
return true;
}
for(var iProp in interfaceObj) {
classOrObject[iProp] = interfaceObj[iProp];
}
classOrObject.hasInterface = function(interfaceStr) {
if (this.interfaces[interfaceStr] === true) {
return true;
}
return false;
};
classOrObject.requireInterface = function(interfaceStr) {
if (!this.hasInterface(interfaceStr)) {
Zapatec.Log({description : "The object with ID '" + this.id + "' has no " + interfaceStr + " interface!"});
return false;
}
return true;
};
interfaceObj.setNamedProperty = classOrObject.setNamedProperty = function(name, val) {
this[name] = val;
};
interfaceObj.getNamedProperty = classOrObject.getNamedProperty = function(name) {
return this[name];
};
return true;
};
Zapatec.Utils.getCharFromEvent = function(evt){
if(!evt) {
evt = window.event;
}
var response = {};
if(Zapatec.is_gecko && !Zapatec.is_khtml && evt.type != "keydown" && evt.type != "keyup"){
if(evt.charCode){
response.chr = String.fromCharCode(evt.charCode);
} else {
response.charCode = evt.keyCode;
}
} else {
response.charCode = evt.keyCode || evt.which;
response.chr = String.fromCharCode(response.charCode);
}
if(Zapatec.is_opera && response.charCode == 0){
response.charCode = null;
response.chr = null;
}
if(Zapatec.is_khtml && response.charCode == 63272){
response.charCode = 46;
response.chr = null;
}
return response;
}
Zapatec.Utils.convertHTML2DOM = function(txt){
var el = document.createElement("div");
el.innerHTML = txt;
var currEl = el.firstChild;
while(!currEl.nodeType || currEl.nodeType != 1){
currEl = currEl.nextSibling;
}
Zapatec.Utils.destroy(currEl);
return currEl;
};
Zapatec.Utils.escapeRegExp = function(s) {
return s.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1');
};
Documentation generated by
JSDoc on Thu Aug 16 12:18:39 2007