
if (typeof Zapatec == 'undefined') {
/// define the global Zapatec namespace
Zapatec = {};
}

/// define the Utils namespace
Zapatec.Utils = {};

Zapatec.Utils.getAbsolutePos = function(el) {
var SL = 0, ST = 0;
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.fixBoxPosition = function(box) {
if (box.x < 0)
box.x = 0;
if (box.y < 0)
box.y = 0;
var cp = Zapatec.Utils.createElement("div");
var s = cp.style;
s.position = "absolute";
s.right = s.bottom = s.width = s.height = "0px";
window.document.body.appendChild(cp);
var br = Zapatec.Utils.getAbsolutePos(cp);
window.document.body.removeChild(cp);
if (Zapatec.is_ie) {
br.y += window.document.body.scrollTop;
br.x += window.document.body.scrollLeft;
} else {
br.y += window.scrollY;
br.x += window.scrollX;
}
var tmp = box.x + box.width - br.x;
if (tmp > 0) box.x -= tmp;
tmp = box.y + box.height - br.y;
if (tmp > 0) box.y -= tmp;
};
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.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.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.addEvent = function(el, evname, func) {
if (el.attachEvent) { // IE
el.attachEvent("on" + evname, func);
} else if (el.addEventListener) { // Gecko / W3C
el.addEventListener(evname, func, false);
} else {
el["on" + evname] = func;
}
};

Zapatec.Utils.removeEvent = function(el, evname, func) {
if (el.detachEvent) { // IE
el.detachEvent("on" + evname, func);
} else if (el.removeEventListener) { // Gecko / W3C
el.removeEventListener(evname, func, false);
} else {
el["on" + evname] = null;
}
};

Zapatec.Utils.createElement = function(type, parent, selectable) {
var el = null;
if (window.self.document.createElementNS)
// use the XHTML namespace; IE won't normally get here unless
// _they_ "fix" the DOM2 implementation.
el = window.self.document.createElementNS("http://www.w3.org/1999/xhtml", type);
else
el = window.self.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) { // Last cookie
endValuePos = document.cookie.length;
}
return unescape(document.cookie.substring(valuePos, endValuePos));
}
tokenPos=document.cookie.indexOf(" ",tokenPos)+1;
if (tokenPos == 0) { // No more tokens
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(/\22/, "\\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];
};

/// \defgroup WCH functions
//@{

Zapatec.Utils.__wch_id = 0;	/**< [number, static] used to create ID-s for the WCH objects */

Zapatec.Utils.createWCH = function(element) {
var f = null;
element = element || window.self.document.body;
if (Zapatec.is_ie && !Zapatec.is_ie5) {
var filter = 'filter:progid:DXImageTransform.Microsoft.alpha(style=0,opacity=0);';
var id = "WCH" + (++Zapatec.Utils.__wch_id);
element.insertAdjacentHTML
('beforeEnd', '<iframe id="' + id + '" scroll="no" frameborder="0" ' +
 'style="z-index:0;position:absolute;visibility:hidden;' + filter +
 'border:0;top:0;left:0;width:0;height:0;" ' +
 'src="javascript:false;"></iframe>');
f = window.self.document.getElementById(id);
}
return f;
};

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";
};

//@}

/// \defgroup Scroll-with-window functions
//@{

Zapatec.Utils.getPageScrollY = function() {
return window.pageYOffset ||
document.documentElement.scrollTop ||
(document.body ? document.body.scrollTop : 0) ||
0;
};

// Object setup.
Zapatec.ScrollWithWindow = {};
Zapatec.ScrollWithWindow.list = [];
// Set to a number between 0 and 1, lower means longer scrolling.
Zapatec.ScrollWithWindow.stickiness = 0.25;

Zapatec.ScrollWithWindow.register = function(node) {
var top = parseInt(node.style.top) || 0;
var scrollY = window.pageYOffset || document.body.scrollTop ||
document.documentElement.scrollTop || 0;
top -= scrollY;
if (top < 0) top = 0;
Zapatec.ScrollWithWindow.list[Zapatec.ScrollWithWindow.list.length] = {
node: node,
origTop: top
};
};

Zapatec.ScrollWithWindow.unregister = function(node) {
for (var count = 0; count < Zapatec.ScrollWithWindow.list.length; count++) {
var elm = Zapatec.ScrollWithWindow.list[count];
if (node == elm.node) {
Zapatec.ScrollWithWindow.list.splice(count, 1);
return;
}
}
};

Zapatec.ScrollWithWindow.handler = function(newScrollY) {
// Move oldScrollY towards newScrollY, evening up if the difference is small.
oldScrollY += ((newScrollY - oldScrollY) * this.stickiness);
if (Math.abs(oldScrollY - newScrollY) <= 1) oldScrollY = newScrollY;
for (var count = 0; count < Zapatec.ScrollWithWindow.list.length; count++) {
var elm = Zapatec.ScrollWithWindow.list[count];
var node = elm.node;
if (!elm.origTop) {
elm.origTop = Zapatec.Utils.getAbsolutePos(node).y;
node.style.position = 'absolute';
}
node.style.top = elm.origTop + parseInt(oldScrollY) + 'px';
}
};

// Processed scroll position & Event hook.
var oldScrollY = Zapatec.Utils.getPageScrollY();
setInterval(
'var newScrollY = Zapatec.Utils.getPageScrollY(); ' +
'if (newScrollY != oldScrollY) { ' +
'Zapatec.ScrollWithWindow.handler(newScrollY); ' +
'}', 50);

//@}

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 (document.compatMode && document.compatMode == 'CSS1Compat') {
// Standards-compliant mode
if (window.opera) {
iWidth = document.body.clientWidth || 0;
iHeight = document.body.clientHeight || 0;
} else {
iWidth = document.documentElement.clientWidth || 0;
iHeight = document.documentElement.clientHeight || 0;
}
} else {
// Non standards-compliant mode
iWidth = window.innerWidth || document.body.clientWidth ||
 document.documentElement.clientWidth || 0;
iHeight = window.innerHeight || document.body.clientHeight ||
 document.documentElement.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.val == 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.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.getChildText = function(objNode) {
if (objNode == null) {
return '';
}
var arrText = [];
var objChild = objNode.firstChild;
while (objChild != null) {
if (objChild.nodeType == 3) { // Node.TEXT_NODE
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 = {};	/**< [number, static] maintains a list of generated 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, tooltip);
};

Zapatec.isLite=false;

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('menu.js', 'prod2', '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 - Slidshow')
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 // Flag yes if we have a zapatec script
var scripts = document.getElementsByTagName('script');
for (i=0; i<scripts.length; i++)
{
// If wizard then do NOT do link back check, which makes wizard err out
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()
// Get each active product
if (typeof arrProducts[strName] != 'undefined')
{
bProduct=true
arrProducts[strName].bActive=true
}
}

// Is a LITE product even being used?
if (!bProduct) return true;


var anchors = document.getElementsByTagName('A');
for(i = 0; i < anchors.length; i++)
if (/(dev|www)\.zapatec\.com/i.test(anchors[i].href))
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)
// Get each active product
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;
}

// Browser sniffing

/// detect Opera browser
Zapatec.is_opera = /opera/i.test(navigator.userAgent);

/// detect a special case of "web browser"
Zapatec.is_ie = ( /msie/i.test(navigator.userAgent) && !Zapatec.is_opera );

/// detect IE5.0/Win
Zapatec.is_ie5 = ( Zapatec.is_ie && /msie 5\.0/i.test(navigator.userAgent) );

/// detect IE for Macintosh
Zapatec.is_mac_ie = ( /msie.*mac/i.test(navigator.userAgent) && !Zapatec.is_opera );

/// detect KHTML-based browsers
Zapatec.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);

/// detect Konqueror
Zapatec.is_konqueror = /Konqueror/i.test(navigator.userAgent);

/// detect Gecko
Zapatec.is_gecko = /Gecko/i.test(navigator.userAgent);

if (!Function.prototype.call) {
Function.prototype.call = function () {
var self = arguments[0];
self._this_func = this;
var args = new Array();
for (var i=1; i < arguments.length; i++) {
args[args.length] = 'arguments[' + i + ']';
}
var ret = eval('self._this_func(' + args.join(',') + ')');
self._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.Log = function(objArgs) {
// Check arguments
if (!objArgs) {
return;
}
// Form error message
var strMessage = objArgs.description;
if (objArgs.severity) {
strMessage = objArgs.severity + ':\n' + strMessage;
}
// Display error message
alert(strMessage);
};

/// Zapatec.Utils.Array object which contains additional for arrays method
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;
}
