From: <Сохранено Windows Internet Explorer 7>
Subject: =?koi8-r?B?88XGxdIg5cPJ0sEgLSDrzsnHwSDzz9rEwc7J0SB8IO3l9uT17uHy7w==?=
	=?koi8-r?B?5O7h8SDh6+Hk5e3p8SDr4eLi4ez5IHwg7S4g7OHq9O3h7g==?=
Date: Sun, 11 Jan 2009 15:59:05 +0300
MIME-Version: 1.0
Content-Type: multipart/related;
	type="multipart/alternative";
	boundary="----=_NextPart_000_0233_01C97405.87D85510"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198

This is a multi-part message in MIME format.

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/design/general/images/basad.gif

R0lGODlhFQAKAIABAP///zPMZiH5BAEAAAEALAAAAAAVAAoAAAIfjI+pCtELTXtRguuyw5t5eVBg
QpXkp6UjyV1cBcdQAQA7

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/design/rus/images/logo.gif

[encoded data, 14516 characters]
cHgDCDCBAmeFjmSFEegBWaXvzA4IADs=

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/var/kbl/storage/images/kabbalah/kabbala_mezhdunarodnaya_akademiya_kabbaly_pod_rukovodstvom_prof_mihaelya_lajtmana_domashnyaya_stranica_sajta/top_banner/972702-17-rus-RU/top_banner.jpg

[encoded data, 15884 characters]
L02KXLidcNfqYqlN/wA/yf/Z

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/design/general/images/rss_icon.png

[encoded data, 4408 characters]
053sAYaAJv5PY0D7nwEAoc3W7UeNrdcAAAAASUVORK5CYII=

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/rus/stylesheets/header_inner.css

HTML {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; FONT: 11px Verdana, sans-serif; WIDTH: 100%; PADDING-TOP: 0px; =
HEIGHT: 100%
}
BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; FONT: 11px Verdana, sans-serif; WIDTH: 100%; PADDING-TOP: 0px; =
HEIGHT: 100%
}
BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; WIDTH: 100%; PADDING-TOP: 0px
}
#hp-header {
	CLEAR: both; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: =
150px; MARGIN: 0px 0px 150px; WIDTH: 1024px; PADDING-TOP: 0px; POSITION: =
relative; HEIGHT: 131px
}
#hp-header A {
	TEXT-DECORATION: none
}
#hp-header IMG {
	BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: =
none; BORDER-BOTTOM-STYLE: none
}
#grad {
	CLEAR: both; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: =
0px; MARGIN: 0px; FONT: bold 1px Verdana,sans-serif; WIDTH: 100%; =
PADDING-TOP: 0px; HEIGHT: 18px
}
#BB {
	PADDING-RIGHT: 0px; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; FONT: bold =
10px Verdana,sans-serif; WIDTH: 80%; COLOR: #fff; PADDING-TOP: 2px; =
HEIGHT: 9px; BACKGROUND-COLOR: transparent
}
#basad {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: right; PADDING-BOTTOM: =
0px; MARGIN: 0px 3px 0px 0px; PADDING-TOP: 0px; HEIGHT: 10px
}
#search {
	PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 5px; FLOAT: left; =
PADDING-BOTTOM: 2px; MARGIN: 0px; WIDTH: 50%; PADDING-TOP: 1px; HEIGHT: =
12px
}
#search #stext {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: =
0px; MARGIN: 0px; PADDING-TOP: 0px; HEIGHT: 12px
}
#search_button {
	BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: =
0px; BACKGROUND: #ebebeb; PADDING-BOTTOM: 0px; MARGIN: 0pt 0px 2px 5px; =
FONT: 10px Verdana,sans-serif; BORDER-LEFT: 0px; COLOR: #808080; =
PADDING-TOP: 0px; BORDER-BOTTOM: 0px; WHITE-SPACE: nowrap; HEIGHT: 12px; =
TEXT-ALIGN: right; font-size-adjust: none; font-stretch: normal
}
#search_text {
	BORDER-RIGHT: #006cc1 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: =
#006cc1 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; =
FONT: 10px Verdana, sans-serif; BORDER-LEFT: #006cc1 1px solid; =
PADDING-TOP: 0px; BORDER-BOTTOM: #006cc1 1px solid; WHITE-SPACE: nowrap; =
HEIGHT: 12px; TEXT-ALIGN: left
}
#search #sbut {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: =
0px; MARGIN: 0px 0px 0px 2px; WIDTH: 50px; PADDING-TOP: 0px; HEIGHT: =
12px; TEXT-ALIGN: center
}
#search #sbut A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; FONT: bold 10px Verdana, sans-serif; COLOR: #808080; PADDING-TOP: =
0px; WHITE-SPACE: nowrap; TEXT-ALIGN: center
}
#search #sbut A:visited {
	COLOR: #808080
}
#search #sbut A:hover {
	COLOR: red
}
#lang {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: right; PADDING-BOTTOM: =
0px; MARGIN: 1px 12px 0px 0px; COLOR: #808080; PADDING-TOP: 0px; HEIGHT: =
16px
}
#lang SELECT {
	FONT: bold 10px/0.3 Verdana, sans-serif; COLOR: #808080; HEIGHT: 17px
}
#logo {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; LEFT: 9px; PADDING-BOTTOM: 0px; =
MARGIN: 0px; PADDING-TOP: 0px; POSITION: absolute; TOP: 25px
}
#long_banner {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; LEFT: 300px; PADDING-BOTTOM: =
0px; MARGIN: 0px; PADDING-TOP: 0px; POSITION: absolute; TOP: 75px
}
#citat {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; RIGHT: 30px; PADDING-BOTTOM: =
0px; MARGIN: 0px; WIDTH: 422px; PADDING-TOP: 0px; POSITION: absolute; =
TOP: 21px; HEIGHT: 87px
}
#citat P {
	MARGIN-TOP: 8px; FONT: 11px Verdana,Tahoma,Arial,sans-serif; COLOR: =
#000; TEXT-ALIGN: justify
}
#citat P.author {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
-10px 0px 0px; FONT: 11px Verdana,Tahoma,Arial,sans-serif; PADDING-TOP: =
0px; TEXT-ALIGN: right
}
#citat I.author {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: right; PADDING-BOTTOM: =
0px; MARGIN: -20px 0px 0px; FONT: 12px Arial,Verdana,sans-serif; =
PADDING-TOP: 0px
}
#rss {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
10px 0px 0px; FONT: 12px Arial,Verdana,sans-serif; PADDING-TOP: 0px; =
TEXT-ALIGN: right
}
#rss A {
	COLOR: #006cc1
}
#panel {
	BACKGROUND: #ebebeb; LEFT: 0px; WIDTH: 1024px; POSITION: absolute; TOP: =
131px; HEIGHT: 18px
}

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-js
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/bin/common.js

sfHover =3D function() {=0A=
=0A=
   var sfLang =3D document.getElementById("lang");=0A=
   if (!sfLang) return;=0A=
   var sfEls =3D sfLang.getElementsByTagName("LI");=0A=
   for (var i=3D0; i<sfEls.length; i++) {=0A=
=0A=
      sfEls[i].onmouseover=3Dfunction() {=0A=
=0A=
         this.className+=3D" sfhover";=0A=
      }=0A=
=0A=
      sfEls[i].onmouseout=3Dfunction() {=0A=
=0A=
         this.className=3Dthis.className.replace(new RegExp(" =
sfhover\\b"), "");=0A=
      }=0A=
=0A=
   }=0A=
=0A=
}=0A=
=0A=
window.attachEvent && window.attachEvent("onload", sfHover);=0A=
=0A=
function OpenWin(link,width,height)=0A=
{=0A=
window.open(link,'_blank','width=3D'+(width||720)+',height=3D'+(height||6=
00)+',toolbar=3D0,location=3D0,menubar=3D0,top=3D0,left=3D0,scrollbars=3D=
1,resizable=3D1');=0A=
}=0A=
=0A=
function OpenNoScrollWin(link,width,height)=0A=
{=0A=
window.open(link,'_blank','width=3D'+(width||720)+',height=3D'+(height||6=
00)+',toolbar=3D0,location=3D0,menubar=3D0,top=3D0,left=3D0,scrollbars=3D=
0,resizable=3D1');=0A=
}=0A=
=0A=

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: multipart/alternative;
	boundary="----=_NextPart_001_0240_01C97405.87DA9F00"


------=_NextPart_001_0240_01C97405.87DA9F00
Content-Type: text/html;
	charset="utf-8"
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/rus/content/view/frame/3258?/rus/content/view/full/3258&main

[encoded data, 8040 characters]

------=_NextPart_001_0240_01C97405.87DA9F00
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/rus/content/view/top/33333

[encoded data, 12008 characters]
SVY+PC9CT0RZPjwvSFRNTD4NCg==

------=_NextPart_001_0240_01C97405.87DA9F00--

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/stylesheets/tree.css

HTML {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
10px 0px 0px 5px; FONT: bold 12px/1.5 Tahoma,sans-serif; OVERFLOW: =
hidden; WIDTH: 254px; PADDING-TOP: 0px; BACKGROUND-COLOR: white
}
BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
10px 0px 0px 5px; FONT: bold 12px/1.5 Tahoma,sans-serif; OVERFLOW: =
hidden; WIDTH: 254px; PADDING-TOP: 0px; BACKGROUND-COLOR: white
}
#choice SELECT {
	WIDTH: 100%
}
HTML {
	OVERFLOW: scroll
}
A {
	COLOR: #004276; TEXT-DECORATION: none
}
A:active {
	COLOR: #409957
}
A:hover {
	COLOR: #409957
}
.off1class A {
	COLOR: #006cc1
}
.off1class A:active {
	COLOR: #409957
}
.off1class A:hover {
	COLOR: #409957
}
.off2class A {
	FONT-WEIGHT: normal
}
.tree {
	PADDING-LEFT: 20px
}
.tree-top {
	PADDING-LEFT: 0px
}
.tree-item-more {
	PADDING-LEFT: 1px
}
.tree-item TD.label {
	CURSOR: pointer
}
.tree-item TABLE.tree-table {
=09
}
.tree-item TABLE.tree-table TD.label SPAN.label {
	PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
.tree-item .tgb {
	VERTICAL-ALIGN: top; WIDTH: 9px; CURSOR: default; HEIGHT: 9px
}
.tree-item .icon {
	PADDING-RIGHT: 4px; VERTICAL-ALIGN: middle; WIDTH: 18px; CURSOR: =
pointer; HEIGHT: 18px; TEXT-ALIGN: center
}
.tree-item-selected TABLE.tree-table TD.label A {
	COLOR: #409957
}
.image_novoe IMG {
	RIGHT: -2px; POSITION: relative; TOP: 1px
}

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/rus/stylesheets/choice.css

#choice {
	MARGIN: 0px
}
.rtheme {
	BACKGROUND-COLOR: rgb(238,238,238)
}
#choice SELECT {
	WIDTH: 222px
}
OPTION.folder_name {
	FONT-WEIGHT: bold; MARGIN: 0px 0px -5px; BACKGROUND-COLOR: =
rgb(238,238,238)
}
#homepage #choice SELECT {
	MARGIN: -15px 0px 0px
}

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-js
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/javascript/zptree/all.js

/*=0A=
* The Zapatec DHTML utils library=0A=
*=0A=
* Copyright (c) 2004-2005 by Zapatec, Inc.=0A=
* http://www.zapatec.com=0A=
* 1700 MLK Way, Berkeley, California,=0A=
* 94709, U.S.A.=0A=
* All rights reserved.=0A=
* $Id: utils.js 2245 2006-03-24 03:30:17Z ken $=0A=
*=0A=
*=0A=
* Various utility functions=0A=
*/=0A=
=0A=
// This can be defined in other modules=0A=
if (typeof Zapatec =3D=3D 'undefined') {=0A=
  /// define the global Zapatec namespace=0A=
  Zapatec =3D {};=0A=
}=0A=
=0A=
/// define the Utils namespace=0A=
Zapatec.Utils =3D {};=0A=
=0A=
/// Retrieves the absolute position (relative to <body>) of a given =
element.=0A=
///=0A=
/// If it doesn't work in IE 6, try this:=0A=
/// \code=0A=
/// setTimeout(function() {=0A=
///   var objPos =3D Zapatec.Utils.getAbsolutePos(objElement);=0A=
///   do something with objPos=0A=
/// }, 0);=0A=
/// \endcode=0A=
///=0A=
/// @param el [HTMLElement] reference to the element.=0A=
/// @return [object] { x, y } containing the position.=0A=
Zapatec.Utils.getAbsolutePos =3D function(el) {=0A=
	var SL =3D 0, ST =3D 0;=0A=
	var is_div =3D /^div$/i.test(el.tagName);=0A=
	if (is_div && el.scrollLeft)=0A=
		SL =3D el.scrollLeft;=0A=
	if (is_div && el.scrollTop)=0A=
		ST =3D el.scrollTop;=0A=
	var r =3D { x: el.offsetLeft - SL, y: el.offsetTop - ST };=0A=
	if (el.offsetParent) {=0A=
		var tmp =3D this.getAbsolutePos(el.offsetParent);=0A=
		r.x +=3D tmp.x;=0A=
		r.y +=3D tmp.y;=0A=
	}=0A=
	return r;=0A=
};=0A=
=0A=
/// Modify the position of a box to fit in browser's view.  This =
function will=0A=
/// modify the passed object itself, so it doesn't need to return a =
value.=0A=
///=0A=
/// @param [object] box { x, y, width, height } specifying the area.=0A=
Zapatec.Utils.fixBoxPosition =3D function(box) {=0A=
	if (box.x < 0)=0A=
		box.x =3D 0;=0A=
	if (box.y < 0)=0A=
		box.y =3D 0;=0A=
	var cp =3D Zapatec.Utils.createElement("div");=0A=
	var s =3D cp.style;=0A=
	s.position =3D "absolute";=0A=
	s.right =3D s.bottom =3D s.width =3D s.height =3D "0px";=0A=
	window.document.body.appendChild(cp);=0A=
	var br =3D Zapatec.Utils.getAbsolutePos(cp);=0A=
	window.document.body.removeChild(cp);=0A=
	if (Zapatec.is_ie) {=0A=
		br.y +=3D window.document.body.scrollTop;=0A=
		br.x +=3D window.document.body.scrollLeft;=0A=
	} else {=0A=
		br.y +=3D window.scrollY;=0A=
		br.x +=3D window.scrollX;=0A=
	}=0A=
	var tmp =3D box.x + box.width - br.x;=0A=
	if (tmp > 0) box.x -=3D tmp;=0A=
	tmp =3D box.y + box.height - br.y;=0A=
	if (tmp > 0) box.y -=3D tmp;=0A=
};=0A=
=0A=
/// Determines if an event is related to a certain element.  This is a =
poor=0A=
/// substitute for some events that are missing from DOM since forever =
(like=0A=
/// onenter, onleave, which MSIE provides).  Basically onmouseover and=0A=
/// onmouseout are fired even if the mouse was already in the element =
but moved=0A=
/// from text to a blank area, so in order not to close a popup element =
when=0A=
/// onmouseout occurs in this situation, one would need to first check =
if the=0A=
/// event is not related to that popup element:=0A=
///=0A=
/// \code=0A=
///      function handler_onMouseOut(event) {=0A=
///         if (!Zapatec.Utils.isRelated(this, event)) {=0A=
///            /// can safely hide it now=0A=
///            this.style.display =3D "none";=0A=
///         }=0A=
///      }=0A=
/// \endcode=0A=
///=0A=
/// @param el [HTMLElement] reference to the element to check the event =
against=0A=
/// @param evt [Event] reference to the Event object=0A=
/// @return [boolean] true if the event is related to the element=0A=
Zapatec.Utils.isRelated =3D function (el, evt) {=0A=
	evt || (evt =3D window.event);=0A=
	var related =3D evt.relatedTarget;=0A=
	if (!related) {=0A=
		var type =3D evt.type;=0A=
		if (type =3D=3D "mouseover") {=0A=
			related =3D evt.fromElement;=0A=
		} else if (type =3D=3D "mouseout") {=0A=
			related =3D evt.toElement;=0A=
		}=0A=
	}=0A=
	try {=0A=
		while (related) {=0A=
			if (related =3D=3D el) {=0A=
				return true;=0A=
			}=0A=
			related =3D related.parentNode;=0A=
		}=0A=
	} catch(e) {};=0A=
	return false;=0A=
};=0A=
=0A=
/// Remove a certain [CSS] class from the given element.=0A=
/// @param el [HTMLElement] reference to the element.=0A=
/// @param className [string] the class to remove.=0A=
Zapatec.Utils.removeClass =3D function(el, className) {=0A=
	if (!(el && el.className)) {=0A=
		return;=0A=
	}=0A=
	var cls =3D el.className.split(" ");=0A=
	var ar =3D [];=0A=
	for (var i =3D cls.length; i > 0;) {=0A=
		if (cls[--i] !=3D className) {=0A=
			ar[ar.length] =3D cls[i];=0A=
		}=0A=
	}=0A=
	el.className =3D ar.join(" ");=0A=
};=0A=
=0A=
/// Appends a certain [CSS] class to the given element.=0A=
/// @param el [HTMLElement] reference to the element.=0A=
/// @param className [string] the class to append.=0A=
Zapatec.Utils.addClass =3D function(el, className) {=0A=
	Zapatec.Utils.removeClass(el, className);=0A=
	el.className +=3D " " + className;=0A=
};=0A=
=0A=
/// Retrieves the current target element for some event (useful when =
bubbling).=0A=
/// This function is not actually very useful, but it's legacy from the =
old calendar code.=0A=
/// @param ev [Event] the event object.=0A=
/// @return [HTMLElement] window.event.srcElement for MSIE, =
ev.currentTarget for other browsers.=0A=
Zapatec.Utils.getElement =3D function(ev) {=0A=
	if (Zapatec.is_ie) {=0A=
		return window.event.srcElement;=0A=
	} else {=0A=
		return ev.currentTarget;=0A=
	}=0A=
};=0A=
=0A=
/// Retrieves the target element for some event (useful when bubbling).=0A=
/// This function is not actually very useful, but it's legacy from the =
old calendar code.=0A=
/// @param ev [Event] the event object.=0A=
/// @return [HTMLElement] window.event.srcElement for MSIE, ev.target =
for other browsers.=0A=
Zapatec.Utils.getTargetElement =3D function(ev) {=0A=
	if (Zapatec.is_ie) {=0A=
		return window.event.srcElement;=0A=
	} else {=0A=
		return ev.target;=0A=
	}=0A=
};=0A=
=0A=
/// Stops bubbling and propagation of some event.=0A=
/// @param ev [Event] the event object=0A=
/// @return false=0A=
Zapatec.Utils.stopEvent =3D function(ev) {=0A=
	ev || (ev =3D window.event);=0A=
	if (ev) {=0A=
		if (Zapatec.is_ie) {=0A=
			ev.cancelBubble =3D true;=0A=
			ev.returnValue =3D false;=0A=
		} else {=0A=
			ev.preventDefault();=0A=
			ev.stopPropagation();=0A=
		}=0A=
	}=0A=
	return false;=0A=
};=0A=
=0A=
/// Adds an event handler to a certain element.  This function adds a =
handler=0A=
/// using the DOM2 addEventListener (or attachEvent for MSIE).  Doing =
this=0A=
/// means that you can add multiple handlers for the same element and =
same=0A=
/// event name, and they will be called in order.=0A=
///=0A=
/// WARNING: for really old browsers that don't support attachEvent nor=0A=
/// addEventListener, it falls back to the default way: el.onclick =3D =
func.=0A=
/// This means that you CANNOT add multiple handlers in those browsers, =
as a=0A=
/// new one will override the old one.=0A=
///=0A=
/// @param el [HTMLElement] reference to the element.=0A=
/// @param evname [string] the event name, excluding the "on" prefix.=0A=
/// @param func event handler function.=0A=
Zapatec.Utils.addEvent =3D function(el, evname, func) {=0A=
	if (el.attachEvent) { // IE=0A=
		el.attachEvent("on" + evname, func);=0A=
	} else if (el.addEventListener) { // Gecko / W3C=0A=
		el.addEventListener(evname, func, false);=0A=
	} else {=0A=
		el["on" + evname] =3D func;=0A=
	}=0A=
};=0A=
=0A=
/// Removes an event handler added with Zapatec.Utils.removeEvent().  The=0A=
/// prototype scheme is the same.=0A=
Zapatec.Utils.removeEvent =3D function(el, evname, func) {=0A=
	if (el.detachEvent) { // IE=0A=
		el.detachEvent("on" + evname, func);=0A=
	} else if (el.removeEventListener) { // Gecko / W3C=0A=
		el.removeEventListener(evname, func, false);=0A=
	} else {=0A=
		el["on" + evname] =3D null;=0A=
	}=0A=
};=0A=
=0A=
/// Create an element of a certain type using document.createElement().  =
A=0A=
/// function was needed in order to add some common attributes to all =
created=0A=
/// elements, but also in order to be able to use it in XHTML too (Gecko =
and=0A=
/// other W3C-compliant browsers).=0A=
///=0A=
/// This function will create an element of the given type and set =
certain=0A=
/// properties to it: unselectable for IE, and the CSS =
"-moz-user-select" for=0A=
/// Gecko, in order to make the element unselectable in these browsers.=0A=
/// Optionally, if the second argument is passed, it will appendChild() =
the=0A=
/// newly created element to its parent.=0A=
///=0A=
/// @param type [string] the tag name of the new element.=0A=
/// @param parent [HTMLElement, optional] a parent for the new element.=0A=
/// @param selectable [boolean] the flag to indicate wether element is =
selectable(rather usefull).=0A=
/// @return [HTMLElement] reference to the new element.=0A=
Zapatec.Utils.createElement =3D function(type, parent, selectable) {=0A=
	var el =3D null;=0A=
	if (window.self.document.createElementNS)=0A=
		// use the XHTML namespace; IE won't normally get here unless=0A=
		// _they_ "fix" the DOM2 implementation.=0A=
		el =3D =
window.self.document.createElementNS("http://www.w3.org/1999/xhtml", =
type);=0A=
	else=0A=
		el =3D window.self.document.createElement(type);=0A=
	if (typeof parent !=3D "undefined" &&parent !=3D null)=0A=
		parent.appendChild(el);=0A=
	if (!selectable) {=0A=
		if (Zapatec.is_ie)=0A=
			el.setAttribute("unselectable", true);=0A=
		if (Zapatec.is_gecko)=0A=
			el.style.setProperty("-moz-user-select", "none", "");=0A=
	}=0A=
	return el;=0A=
};=0A=
=0A=
// Cookie management=0A=
=0A=
/// Sets a cooke given certain specifications.  It overrides any existing=0A=
/// cookie with the same name.=0A=
///=0A=
/// @param name [string] the cookie name.=0A=
/// @param value [string] the cookie value.=0A=
/// @param domain [string, optional] the cookie domain.=0A=
/// @param path [string, optional] the cookie path.=0A=
/// @param exp_days [number, optional] number of days of cookie validity.=0A=
Zapatec.Utils.writeCookie =3D function(name, value, domain, path, =
exp_days) {=0A=
	value =3D escape(value);=0A=
	var ck =3D name + "=3D" + value, exp;=0A=
	if (domain)=0A=
		ck +=3D ";domain=3D" + domain;=0A=
	if (path)=0A=
		ck +=3D ";path=3D" + path;=0A=
	if (exp_days) {=0A=
		exp =3D new Date();=0A=
		exp.setTime(exp_days * 86400000 + exp.getTime());=0A=
		ck +=3D ";expires=3D" + exp.toGMTString();=0A=
	}=0A=
	document.cookie =3D ck;=0A=
};=0A=
=0A=
/**=0A=
 * Retrieves the value of a cookie.=0A=
 *=0A=
 * @param name [string] the cookie name=0A=
 * @return [string or null] a string with the cookie value, or null if =
it can't be found.=0A=
 */=0A=
=0A=
/* ? inside regular expression is not supported in IE 5.0=0A=
Zapatec.Utils.getCookie =3D function(name) {=0A=
	var re =3D new RegExp("(^|;\\s*)" + name + "\\s*=3D(.*?)(;|$)");=0A=
	if (re.test(document.cookie)) {=0A=
		var value =3D RegExp.$2;=0A=
		value =3D unescape(value);=0A=
		return (value);=0A=
	}=0A=
	return null;=0A=
};=0A=
*/=0A=
=0A=
Zapatec.Utils.getCookie =3D function(name) {=0A=
	var pattern =3D name + "=3D";=0A=
	var tokenPos =3D 0;=0A=
	while (tokenPos < document.cookie.length) {=0A=
		var valuePos =3D tokenPos + pattern.length;=0A=
		if (document.cookie.substring(tokenPos, valuePos) =3D=3D pattern) {=0A=
			var endValuePos =3D document.cookie.indexOf(";", valuePos);=0A=
			if (endValuePos =3D=3D -1) { // Last cookie=0A=
				endValuePos =3D document.cookie.length;=0A=
			}=0A=
			return unescape(document.cookie.substring(valuePos, endValuePos));=0A=
		}=0A=
		tokenPos=3Ddocument.cookie.indexOf(" ",tokenPos)+1;=0A=
		if (tokenPos =3D=3D 0) { // No more tokens=0A=
			break;=0A=
		}=0A=
	}=0A=
	return null;=0A=
};=0A=
=0A=
/**=0A=
 * Given an object, create a string suitable for saving the object in a =
cookie.=0A=
 * This is similar to serialization.  WARNING: it does not support nested=0A=
 * objects.=0A=
 *=0A=
 * @param obj [Object] reference to the object to serialize.=0A=
 * @return [string] the serialized object.=0A=
 */=0A=
Zapatec.Utils.makePref =3D function(obj) {=0A=
	function stringify(val) {=0A=
		if (typeof val =3D=3D "object" && !val)=0A=
			return "null";=0A=
		else if (typeof val =3D=3D "number" || typeof val =3D=3D "boolean")=0A=
			return val;=0A=
		else if (typeof val =3D=3D "string")=0A=
			return '"' + val.replace(/\22/, "\\22") + '"';=0A=
		else return null;=0A=
	};=0A=
	var txt =3D "", i;=0A=
	for (i in obj)=0A=
		txt +=3D (txt ? ",'" : "'") + i + "':" + stringify(obj[i]);=0A=
	return txt;=0A=
};=0A=
=0A=
/**=0A=
 * The reverse of Zapatec.Utils.makePref(), this function unserializes =
the=0A=
 * given string and creates an object from it.=0A=
 *=0A=
 * @param txt [string] the serialized value.=0A=
 * @return [Object] a new object if it was created successfully or null =
otherwise.=0A=
 */=0A=
Zapatec.Utils.loadPref =3D function(txt) {=0A=
	var obj =3D null;=0A=
	try {=0A=
		eval("obj=3D{" + txt + "}");=0A=
	} catch(e) {}=0A=
	return obj;=0A=
};=0A=
=0A=
/**=0A=
 * Merges the values of the source object into the destination object.=0A=
 *=0A=
 * @param dest [Object] the destination object.=0A=
 * @param src [Object] the source object.=0A=
 */=0A=
Zapatec.Utils.mergeObjects =3D function(dest, src) {=0A=
	for (var i in src)=0A=
		dest[i] =3D src[i];=0A=
};=0A=
=0A=
// based on the WCH idea=0A=
// http://www.aplus.co.yu/WCH/code3/WCH.js=0A=
=0A=
/// \defgroup WCH functions=0A=
//@{=0A=
=0A=
Zapatec.Utils.__wch_id =3D 0;	/**< [number, static] used to create ID-s =
for the WCH objects */=0A=
=0A=
/**=0A=
 * Create an WCH object.  This function does nothing if the browser is =
not=0A=
 * IE5.5 or IE6.0.  A WCH object is one of the most bizarre tricks to =
avoid a=0A=
 * notorious IE bug: IE normally shows "windowed controls" on top of any =
HTML=0A=
 * elements, regardless of any z-index that might be specified in CSS.  =
This=0A=
 * technique is described at: http://www.aplus.co.yu/WCH/=0A=
 *=0A=
 * A "WCH object" is actually an HTMLIFrame element having a certain "CSS=0A=
 * filter" (proprietary MSIE extension) that forces opacity zero.  This =
object,=0A=
 * displayed on top of a windowed control such as a select box, will =
completely=0A=
 * hide the select box, allowing us to place other HTMLElement objects =
above.=0A=
 *=0A=
 * WCH stands for "Windowed Controls Hider".=0A=
 *=0A=
 * @param element [HTMLElement, optional] -- Create the WCH IFRAME =
inside this.=0A=
 *=0A=
 *=0A=
 * @return [HTMLIFrame or null] a new WCH object if the browser is =
"supported", null otherwise.=0A=
 */=0A=
Zapatec.Utils.createWCH =3D function(element) {=0A=
	var f =3D null;=0A=
	element =3D element || window.self.document.body;=0A=
	if (Zapatec.is_ie && !Zapatec.is_ie5) {=0A=
		var filter =3D =
'filter:progid:DXImageTransform.Microsoft.alpha(style=3D0,opacity=3D0);';=0A=
		var id =3D "WCH" + (++Zapatec.Utils.__wch_id);=0A=
		element.insertAdjacentHTML=0A=
			('beforeEnd', '<iframe id=3D"' + id + '" scroll=3D"no" =
frameborder=3D"0" ' +=0A=
			 'style=3D"z-index:0;position:absolute;visibility:hidden;' + filter +=0A=
			 'border:0;top:0;left:0;width:0;height:0;" ' +=0A=
			 'src=3D"javascript:false;"></iframe>');=0A=
		f =3D window.self.document.getElementById(id);=0A=
	}=0A=
	return f;=0A=
};=0A=
=0A=
/**=0A=
 * Configure a given WCH object to be displayed on top of the given =
element.=0A=
 * Optionally, a second element can be passed, and in this case it will =
setup=0A=
 * the WCH object to cover both elements.=0A=
 *=0A=
 * @param f [HTMLIFrame] the WCH object=0A=
 * @param el [HTMLElement] the element to cover.=0A=
 * @param el2 [HTMLElement, optional] another element to cover.=0A=
 */=0A=
Zapatec.Utils.setupWCH_el =3D function(f, el, el2) {=0A=
	if (f) {=0A=
		var pos =3D Zapatec.Utils.getAbsolutePos(el),=0A=
			X1 =3D pos.x,=0A=
			Y1 =3D pos.y,=0A=
			X2 =3D X1 + el.offsetWidth,=0A=
			Y2 =3D Y1 + el.offsetHeight;=0A=
		if (el2) {=0A=
			var p2 =3D Zapatec.Utils.getAbsolutePos(el2),=0A=
				XX1 =3D p2.x,=0A=
				YY1 =3D p2.y,=0A=
				XX2 =3D XX1 + el2.offsetWidth,=0A=
				YY2 =3D YY1 + el2.offsetHeight;=0A=
			if (X1 > XX1)=0A=
				X1 =3D XX1;=0A=
			if (Y1 > YY1)=0A=
				Y1 =3D YY1;=0A=
			if (X2 < XX2)=0A=
				X2 =3D XX2;=0A=
			if (Y2 < YY2)=0A=
				Y2 =3D YY2;=0A=
		}=0A=
		Zapatec.Utils.setupWCH(f, X1, Y1, X2-X1, Y2-Y1);=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
 * Configure a WCH object to cover a certain part of the screen.=0A=
 *=0A=
 * @param f [HTMLIFrame] the WCH object.=0A=
 * @param x [number] the X coordinate.=0A=
 * @param y [number] the Y coordinate.=0A=
 * @param w [number] the width of the area.=0A=
 * @param h [number] the height of the area.=0A=
 */=0A=
Zapatec.Utils.setupWCH =3D function(f, x, y, w, h) {=0A=
	if (f) {=0A=
		var s =3D f.style;=0A=
		(typeof x !=3D "undefined") && (s.left =3D x + "px");=0A=
		(typeof y !=3D "undefined") && (s.top =3D y + "px");=0A=
		(typeof w !=3D "undefined") && (s.width =3D w + "px");=0A=
		(typeof h !=3D "undefined") && (s.height =3D h + "px");=0A=
		s.visibility =3D "inherit";=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
 * Hide a WCH object.=0A=
 *=0A=
 * @param f [HTMLIFrame] object to hide.=0A=
 */=0A=
Zapatec.Utils.hideWCH =3D function(f) {=0A=
	if (f)=0A=
		f.style.visibility =3D "hidden";=0A=
};=0A=
=0A=
//@}=0A=
=0A=
/// \defgroup Scroll-with-window functions=0A=
//@{=0A=
=0A=
/**=0A=
 * A generic Utils function that returns the current scroll position.=0A=
 *=0A=
 */=0A=
Zapatec.Utils.getPageScrollY =3D function() {=0A=
	return window.pageYOffset ||=0A=
			document.documentElement.scrollTop ||=0A=
			(document.body ? document.body.scrollTop : 0) ||=0A=
			0;=0A=
};=0A=
=0A=
// Object setup.=0A=
Zapatec.ScrollWithWindow =3D {};=0A=
Zapatec.ScrollWithWindow.list =3D [];=0A=
// Set to a number between 0 and 1, lower means longer scrolling.=0A=
Zapatec.ScrollWithWindow.stickiness =3D 0.25;=0A=
=0A=
/**=0A=
 * Registers a given object to have its style.top set equal to the window=0A=
 * scroll position as the browser scrolls.=0A=
 *=0A=
 * @param node [HTMLElement] -- a reference to the node to scroll.=0A=
 */=0A=
Zapatec.ScrollWithWindow.register =3D function(node) {=0A=
	var top =3D parseInt(node.style.top) || 0;=0A=
	var scrollY =3D window.pageYOffset || document.body.scrollTop ||=0A=
		document.documentElement.scrollTop || 0;=0A=
	top -=3D scrollY;=0A=
	if (top < 0) top =3D 0;=0A=
	Zapatec.ScrollWithWindow.list[Zapatec.ScrollWithWindow.list.length] =3D =
{=0A=
		node: node,=0A=
		origTop: top=0A=
	};=0A=
};=0A=
=0A=
/**=0A=
 * Unregisters a given object.=0A=
 *=0A=
 * @param node [HTMLElement] -- a reference to the node to scroll.=0A=
 */=0A=
Zapatec.ScrollWithWindow.unregister =3D function(node) {=0A=
	for (var count =3D 0; count < Zapatec.ScrollWithWindow.list.length; =
count++) {=0A=
		var elm =3D Zapatec.ScrollWithWindow.list[count];=0A=
		if (node =3D=3D elm.node) {=0A=
			Zapatec.ScrollWithWindow.list.splice(count, 1);=0A=
			return;=0A=
		}=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
 * \internal Called each time the window is scrolled to set objects' =
positions.=0A=
 *=0A=
 * @param newScrollY [number] -- the new window scroll position.=0A=
 */=0A=
Zapatec.ScrollWithWindow.handler =3D function(newScrollY) {=0A=
	// Move oldScrollY towards newScrollY, evening up if the difference is =
small.=0A=
	oldScrollY +=3D ((newScrollY - oldScrollY) * this.stickiness);=0A=
	if (Math.abs(oldScrollY - newScrollY) <=3D 1) oldScrollY =3D newScrollY;=0A=
	for (var count =3D 0; count < Zapatec.ScrollWithWindow.list.length; =
count++) {=0A=
		var elm =3D Zapatec.ScrollWithWindow.list[count];=0A=
		var node =3D elm.node;=0A=
		if (!elm.origTop) {=0A=
			elm.origTop =3D Zapatec.Utils.getAbsolutePos(node).y;=0A=
			node.style.position =3D 'absolute';=0A=
		}=0A=
		node.style.top =3D elm.origTop + parseInt(oldScrollY) + 'px';=0A=
	}=0A=
};=0A=
=0A=
// Processed scroll position & Event hook.=0A=
var oldScrollY =3D Zapatec.Utils.getPageScrollY();=0A=
setInterval(=0A=
	'var newScrollY =3D Zapatec.Utils.getPageScrollY(); ' +=0A=
	'if (newScrollY !=3D oldScrollY) { ' +=0A=
		'Zapatec.ScrollWithWindow.handler(newScrollY); ' +=0A=
	'}', 50);=0A=
=0A=
//@}=0A=
=0A=
/**=0A=
 * Destroys the given element (remove it from the DOM tree) if it's not =
null=0A=
 * and it's parent is not null.=0A=
 *=0A=
 * @param el [HTMLElement] the element to destroy.=0A=
 */=0A=
Zapatec.Utils.destroy =3D function(el) {=0A=
	if (el && el.parentNode)=0A=
		el.parentNode.removeChild(el);=0A=
};=0A=
=0A=
/**=0A=
 * Opens a new window at a certain URL and having some properties.=0A=
 *=0A=
 * @param url [string] the URL to open a new window to.=0A=
 * @param windowName [string] the name of the new window (as for target =
attribute).=0A=
 * @param width [number] the width of the new window in pixels.=0A=
 * @param height [number] the height of the new window in pixels.=0A=
 * @param scrollbars [string] "yes" or "no" for scrollbars.=0A=
 *=0A=
 * @return [object] the new window=0A=
 */=0A=
Zapatec.Utils.newCenteredWindow =3D function(url, windowName, width, =
height, scrollbars){=0A=
	var leftPosition =3D 0;=0A=
	var topPosition =3D 0;=0A=
	if (screen.width)=0A=
		leftPosition =3D (screen.width -  width)/2;=0A=
	if (screen.height)=0A=
		topPosition =3D (screen.height -  height)/2;=0A=
	var winArgs =3D=0A=
		'height=3D' + height +=0A=
		',width=3D' + width +=0A=
		',top=3D' + topPosition +=0A=
		',left=3D' + leftPosition +=0A=
		',scrollbars=3D' + scrollbars +=0A=
		',resizable';=0A=
	var win =3D window.open(url,windowName,winArgs);=0A=
	return win;=0A=
};=0A=
=0A=
/**=0A=
 * Finds the size of the current web page. This is the usable size=0A=
 * and does not include the browser's menu and buttons.=0A=
 *=0A=
 * @return [object] dimension with the height and width of the window=0A=
 */=0A=
Zapatec.Utils.getWindowSize =3D function() {=0A=
  var iWidth =3D 0;=0A=
  var iHeight =3D 0;=0A=
  if (document.compatMode && document.compatMode =3D=3D 'CSS1Compat') {=0A=
    // Standards-compliant mode=0A=
    if (window.opera) {=0A=
    	iWidth =3D document.body.clientWidth || 0;=0A=
    	iHeight =3D document.body.clientHeight || 0;=0A=
    } else {=0A=
    	iWidth =3D document.documentElement.clientWidth || 0;=0A=
    	iHeight =3D document.documentElement.clientHeight || 0;=0A=
    }=0A=
  } else {=0A=
    // Non standards-compliant mode=0A=
  	iWidth =3D window.innerWidth || document.body.clientWidth ||=0A=
  	 document.documentElement.clientWidth || 0;=0A=
  	iHeight =3D window.innerHeight || document.body.clientHeight ||=0A=
  	 document.documentElement.clientHeight || 0;=0A=
  }=0A=
	return {=0A=
	  width: iWidth,=0A=
	  height: iHeight=0A=
	};=0A=
};=0A=
=0A=
=0A=
/**=0A=
 * Given a reference to a select element, this function will select the =
option=0A=
 * having the given value and optionally will call the default handler =
for=0A=
 * "onchange".=0A=
 *=0A=
 * @param sel [HTMLSelectElement] reference to the SELECT element.=0A=
 * @param val [string] the value that we should select.=0A=
 * @param call_default [boolean] true if the default onchange should be =
called.=0A=
 */=0A=
Zapatec.Utils.selectOption =3D function(sel, val, call_default) {=0A=
	var a =3D sel.options, i, o;=0A=
	for (i =3D a.length; --i >=3D 0;) {=0A=
		o =3D a[i];=0A=
		o.selected =3D (o.val =3D=3D val);=0A=
	}=0A=
	sel.value =3D val;=0A=
	if (call_default) {=0A=
		if (typeof sel.onchange =3D=3D "function")=0A=
			sel.onchange();=0A=
		else if (typeof sel.onchange =3D=3D "string")=0A=
			eval(sel.onchange);=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
 * A more flexible way to get the "nextSibling" of a given element.  If =
the=0A=
 * "tag" argument is passed, then this function will return the next =
sibling=0A=
 * that has a certain tag.  Otherwise it will simply return =
el.nextSibling.=0A=
 *=0A=
 * @param el [HTMLElement] reference to the anchor element.=0A=
 * @param tag [string] the tag name of the returned node.=0A=
 * @param alternateTag [string] the alternate tag name of the returned =
node.=0A=
 *=0A=
 * @return [HTMLElement or null] el.nextSibling if tag is not passed, or =
the=0A=
 * first element after el having the specified tag.  Null is returned if =
no=0A=
 * element could be found.=0A=
 */=0A=
Zapatec.Utils.getNextSibling =3D function(el, tag, alternateTag) {=0A=
	el =3D el.nextSibling;=0A=
	if (!tag) {=0A=
		return el;=0A=
	}=0A=
	tag =3D tag.toLowerCase();=0A=
	if (alternateTag) alternateTag =3D alternateTag.toLowerCase();=0A=
	while (el) {=0A=
		if (el.nodeType =3D=3D 1 && (el.tagName.toLowerCase() =3D=3D tag ||=0A=
		 (alternateTag && el.tagName.toLowerCase() =3D=3D alternateTag))) {=0A=
			return el;=0A=
		}=0A=
		el =3D el.nextSibling;=0A=
	}=0A=
	return el;=0A=
};=0A=
=0A=
/**=0A=
 * Similar to Zapatec.Utils.getNextSibling(), this function will return =
the=0A=
 * first child of the given element that has a specified tag.=0A=
 *=0A=
 * @param el [HTMLElement] reference to the anchor element.=0A=
 * @param tag [string] the tag name of the returned node.=0A=
 * @param alternateTag [string] the alternate tag name of the returned =
node.=0A=
 *=0A=
 * @return [HTMLElement] reference to the found node, or null if none =
could be=0A=
 * found.=0A=
 */=0A=
Zapatec.Utils.getFirstChild =3D function(el, tag, alternateTag) {=0A=
  if (!el) {=0A=
    return null;=0A=
  }=0A=
	el =3D el.firstChild;=0A=
  if (!el) {=0A=
    return null;=0A=
  }=0A=
	if (!tag) {=0A=
		return el;=0A=
	}=0A=
	tag =3D tag.toLowerCase();=0A=
	if (el.nodeType =3D=3D 1) {=0A=
		if (el.tagName.toLowerCase() =3D=3D tag) {=0A=
			return el;=0A=
		} else if (alternateTag) {=0A=
			alternateTag =3D alternateTag.toLowerCase();=0A=
			if (el.tagName.toLowerCase() =3D=3D alternateTag) {=0A=
				return el;=0A=
			}=0A=
		}=0A=
	}=0A=
	return Zapatec.Utils.getNextSibling(el, tag, alternateTag);=0A=
};=0A=
=0A=
/**=0A=
 * Function that concatenates and returns all text child nodes of the=0A=
 * specified node.=0A=
 *=0A=
 * @param objNode [Node] -- reference to the node.=0A=
 * @return [string] -- concatenated text child nodes=0A=
 */=0A=
Zapatec.Utils.getChildText =3D function(objNode) {=0A=
	if (objNode =3D=3D null) {=0A=
		return '';=0A=
	}=0A=
	var arrText =3D [];=0A=
	var objChild =3D objNode.firstChild;=0A=
	while (objChild !=3D null) {=0A=
		if (objChild.nodeType =3D=3D 3) { // Node.TEXT_NODE=0A=
			arrText.push(objChild.data);=0A=
		}=0A=
		objChild =3D objChild.nextSibling;=0A=
	}=0A=
	return arrText.join(' ');=0A=
};=0A=
=0A=
/**=0A=
 * Similar to the DOM's built in insertBefore.=0A=
 * Insert a node after an existing node.=0A=
 *=0A=
 * @param el [oldNode] The existing element=0A=
 * @param el [newNode] the new element to insert after the old one.=0A=
 *=0A=
 */=0A=
Zapatec.Utils.insertAfter =3D function(oldNode, newNode) {=0A=
	if(oldNode.nextSibling) {=0A=
		oldNode.parentNode.insertBefore(newNode, oldNode.nextSibling);=0A=
	} else {=0A=
		oldNode.parentNode.appendChild(newNode);=0A=
	}=0A=
}=0A=
=0A=
Zapatec.Utils._ids =3D {};	/**< [number, static] maintains a list of =
generated IDs */=0A=
=0A=
/**=0A=
 * Generates an unique ID, for a certain code (let's say "class").  If =
the=0A=
 * optional "id" argument is passed, then it just returns the id for =
that code=0A=
 * (no generation).  This function is sometimes useful when we need to =
create=0A=
 * elements and be able to access them later by ID.=0A=
 *=0A=
 * @param code [string] the class of ids.  User defined, can be anything.=0A=
 * @param id [string, optional] specify if the ID is already known.=0A=
 *=0A=
 * @return [string] the unique ID=0A=
 */=0A=
Zapatec.Utils.generateID =3D function(code, id) {=0A=
	if (typeof id =3D=3D "undefined") {=0A=
		if (typeof this._ids[code] =3D=3D "undefined")=0A=
			this._ids[code] =3D 0;=0A=
		id =3D ++this._ids[code];=0A=
	}=0A=
	return "zapatec-" + code + "-" + id;=0A=
};=0A=
=0A=
/**=0A=
*  Add a tooltip to the specified element.=0A=
*=0A=
*  Function that adds a custom tooltip for an element.  The "target" is =
the=0A=
*  element to where the tooltip should be added to, and the "tooltip" is =
a DIV=0A=
*  that contains the tooltip text.  Optionally, the tooltip DIV can have =
the=0A=
*  "title" attribute set; if so, its value will be displayed highlighted =
as=0A=
*  the title of the tooltip.=0A=
*=0A=
*  @param target  reference to or ID of the target element=0A=
*  @param tooltip reference to or ID of the tooltip content element=0A=
*/=0A=
=0A=
Zapatec.Utils.addTooltip =3D function(target, tooltip) {=0A=
return new Zapatec.Tooltip(target, tooltip);=0A=
};=0A=
=0A=
Zapatec.isLite=3Dtrue;=0A=
=0A=
Zapatec.Utils.checkActivation =3D function() {=0A=
	if (!Zapatec.isLite)	return true;=0A=
=0A=
	var arrProducts=3D[]=0A=
=0A=
	add_product=3Dfunction(script, webdir_in, name_in)=0A=
	{=0A=
	arrProducts[script]=3D{webdir:webdir_in, name:name_in, bActive:false}=0A=
	}=0A=
=0A=
	add_product('calendar.js', 'prod1',   'Calendar')=0A=
	add_product('menu.js',     'prod2',   'Menu')=0A=
	add_product('tree.js',     'prod3',   'Tree')=0A=
	add_product('form.js',     'forms',   'Forms')=0A=
	add_product('effects.js',  'effects', 'Effects')=0A=
	add_product('hoverer.js',  'effects', 'Effects - Hoverer')=0A=
	add_product('slideshow.js','effects', 'Effects - Slidshow')=0A=
	add_product('zpgrid.js',   'grid',    'Grid')=0A=
	add_product('slider.js',   'slider',  'Slider')=0A=
	add_product('zptabs.js',   'tabs',    'Tabs')=0A=
	add_product('zptime.js',   'time',    'Time')=0A=
	add_product('window.js',   'windows', 'Window')=0A=
=0A=
=0A=
	var strName, arrName, i=0A=
	var bProduct=3Dfalse // Flag yes if we have a zapatec script=0A=
	var scripts =3D document.getElementsByTagName('script');=0A=
	for (i=3D0; i<scripts.length; i++)=0A=
	{=0A=
		// If wizard then do NOT do link back check, which makes wizard err out=0A=
		if (/wizard.js/i.test(scripts[i].src))=0A=
			return true=0A=
=0A=
		arrName=3Dscripts[i].src.split('/')=0A=
		if (arrName.length=3D=3D0)=0A=
			strName=3Dscripts[i]=0A=
		else=0A=
			strName=3DarrName[arrName.length-1]=0A=
		strName=3DstrName.toLowerCase()=0A=
		// Get each active product=0A=
		if (typeof arrProducts[strName] !=3D 'undefined')=0A=
			{=0A=
			bProduct=3Dtrue=0A=
			arrProducts[strName].bActive=3Dtrue=0A=
			}=0A=
	}=0A=
=0A=
	// Is a LITE product even being used?=0A=
	if (!bProduct) return true;=0A=
=0A=
=0A=
	var anchors =3D document.getElementsByTagName('A');=0A=
	for(i =3D 0; i < anchors.length; i++)=0A=
		if (/(dev|www)\.zapatec\.com/i.test(anchors[i].href))=0A=
			return true;=0A=
=0A=
	var strMsg=3D'You are using the Free version of the Zapatec =
Software.\n'+=0A=
	'While using the Free version, a link to www.zapatec.com in this page =
is required.'=0A=
=0A=
	for (i in arrProducts)=0A=
		// Get each active product=0A=
		if (arrProducts[i].bActive=3D=3Dtrue)=0A=
			strMsg+=3D'\nTo purchase the Zapatec ' + arrProducts[i].name + ' =
visit www.zapatec.com/website/main/products/' + arrProducts[i].webdir + =
'/'=0A=
=0A=
	alert(strMsg)=0A=
=0A=
	return false;=0A=
}=0A=
=0A=
// Browser sniffing=0A=
=0A=
/// detect Opera browser=0A=
Zapatec.is_opera =3D /opera/i.test(navigator.userAgent);=0A=
=0A=
/// detect a special case of "web browser"=0A=
Zapatec.is_ie =3D ( /msie/i.test(navigator.userAgent) && =
!Zapatec.is_opera );=0A=
=0A=
/// detect IE5.0/Win=0A=
Zapatec.is_ie5 =3D ( Zapatec.is_ie && /msie =
5\.0/i.test(navigator.userAgent) );=0A=
=0A=
/// detect IE for Macintosh=0A=
Zapatec.is_mac_ie =3D ( /msie.*mac/i.test(navigator.userAgent) && =
!Zapatec.is_opera );=0A=
=0A=
/// detect KHTML-based browsers=0A=
Zapatec.is_khtml =3D /Konqueror|Safari|KHTML/i.test(navigator.userAgent);=0A=
=0A=
/// detect Konqueror=0A=
Zapatec.is_konqueror =3D /Konqueror/i.test(navigator.userAgent);=0A=
=0A=
/// detect Gecko=0A=
Zapatec.is_gecko =3D /Gecko/i.test(navigator.userAgent);=0A=
=0A=
/**=0A=
 * Simulation of Function call() method that is missing in IE 5.0.=0A=
 */=0A=
if (!Function.prototype.call) {=0A=
	Function.prototype.call =3D function () {=0A=
		var self =3D arguments[0];=0A=
		self._this_func =3D this;=0A=
		var args =3D new Array();=0A=
		for (var i=3D1; i < arguments.length; i++) {=0A=
			args[args.length] =3D 'arguments[' + i + ']';=0A=
		}=0A=
		var ret =3D eval('self._this_func(' + args.join(',') + ')');=0A=
		self._this_func =3D null;=0A=
		return ret;=0A=
	};=0A=
}=0A=
=0A=
/**=0A=
 * Simulation of Array pop() method that is missing in IE 5.0.=0A=
 */=0A=
if (!Array.prototype.pop) {=0A=
	Array.prototype.pop =3D function() {=0A=
		var last;=0A=
		if (this.length) {=0A=
			last =3D this[this.length - 1];=0A=
			this.length -=3D 1;=0A=
		}=0A=
		return last;=0A=
	};=0A=
}=0A=
=0A=
/**=0A=
 * Simulation of Array push() method that is missing in IE 5.0=0A=
 */=0A=
if (!Array.prototype.push) {=0A=
	Array.prototype.push =3D function() {=0A=
		for (var i =3D 0; i < arguments.length; i++) {=0A=
			this[this.length] =3D arguments[i];=0A=
		}=0A=
		return this.length;=0A=
	};=0A=
}=0A=
=0A=
/**=0A=
 * Simulation of Array shift() method that is missing in IE 5.0.=0A=
 */=0A=
if (!Array.prototype.shift) {=0A=
	Array.prototype.shift =3D function() {=0A=
		var first;=0A=
		if (this.length) {=0A=
			first =3D this[0];=0A=
			for (var i =3D 0; i < this.length - 1; i++) {=0A=
				this[i] =3D this[i + 1];=0A=
			}=0A=
			this.length -=3D 1;=0A=
		}=0A=
		return first;=0A=
	};=0A=
}=0A=
=0A=
/**=0A=
 * Simulation of Array unshift() method that is missing in IE 5.0.=0A=
 */=0A=
if (!Array.prototype.unshift) {=0A=
	Array.prototype.unshift =3D function() {=0A=
		if (arguments.length) {=0A=
			var i, len =3D arguments.length;=0A=
			for (i =3D this.length + len - 1; i >=3D len; i--) {=0A=
				this[i] =3D this[i - len];=0A=
			}=0A=
			for (i =3D 0; i < len; i++) {=0A=
				this[i] =3D arguments[i];=0A=
			}=0A=
		}=0A=
		return this.length;=0A=
	};=0A=
}=0A=
=0A=
/**=0A=
 * Simulation of Array splice() method that is missing in IE 5.0.=0A=
 */=0A=
if (!Array.prototype.splice) {=0A=
	Array.prototype.splice =3D function(index, howMany) {=0A=
		var elements =3D [], removed =3D [], i;=0A=
		for (i =3D 2; i < arguments.length; i++) {=0A=
			elements.push(arguments[i]);=0A=
		}=0A=
		for (i =3D index; (i < index + howMany) && (i < this.length); i++) {=0A=
			removed.push(this[i]);=0A=
		}=0A=
		for (i =3D index + howMany; i < this.length; i++) {=0A=
			this[i - howMany] =3D this[i];=0A=
		}=0A=
		this.length -=3D removed.length;=0A=
		for (i =3D this.length + elements.length - 1; i >=3D index + =
elements.length;=0A=
		 i--) {=0A=
			this[i] =3D this[i - elements.length];=0A=
		}=0A=
		for (i =3D 0; i < elements.length; i++) {=0A=
			this[index + i] =3D elements[i];=0A=
		}=0A=
		return removed;=0A=
	};=0A=
}=0A=
=0A=
/**=0A=
 * Displays error message. Override this if needed.=0A=
 *=0A=
 * \param objArgs [number] error object:=0A=
 * {=0A=
 *   severity: [string, optional] error severity,=0A=
 *   description: [string] human readable error description=0A=
 * }=0A=
 */=0A=
Zapatec.Log =3D function(objArgs) {=0A=
  // Check arguments=0A=
  if (!objArgs) {=0A=
    return;=0A=
  }=0A=
  // Form error message=0A=
  var strMessage =3D objArgs.description;=0A=
  if (objArgs.severity) {=0A=
    strMessage =3D objArgs.severity + ':\n' + strMessage;=0A=
  }=0A=
  // Display error message=0A=
  alert(strMessage);=0A=
};=0A=
=0A=
/// Zapatec.Utils.Array object which contains additional for arrays =
method=0A=
Zapatec.Utils.Array =3D {};=0A=
=0A=
/**=0A=
 * Inserts the element into array. =0A=
 * It influences the order in which the elements will be iterated in the =
for...in cycle.=0A=
 *=0A=
 * @param arr [array] array to work with.=0A=
 * @param el [mixed] element to insert.=0A=
 * @param key [string] element to insert.=0A=
 * @param nextKey [string] element to be inserted before.=0A=
 * @return [string] new Array.=0A=
 */=0A=
Zapatec.Utils.Array.insertBefore =3D function (arr, el, key, nextKey) {=0A=
	var tmp =3D new Array();=0A=
	for(var i in arr) {=0A=
		if (i =3D=3D nextKey) {=0A=
			if (key) {=0A=
				tmp[key] =3D el;=0A=
			} else {=0A=
				tmp.push(el);=0A=
			}=0A=
		}=0A=
		tmp[i] =3D arr[i];=0A=
	}=0A=
	return tmp;=0A=
}=0A=
/**=0A=
 * The Zapatec DHTML Calendar=0A=
 *=0A=
 * Copyright (c) 2004-2005 by Zapatec, Inc.=0A=
 * http://www.zapatec.com=0A=
 * 1700 MLK Way, Berkeley, California,=0A=
 * 94709, U.S.A.=0A=
 * All rights reserved.=0A=
 *=0A=
 *=0A=
 * Tree Widget=0A=
 */=0A=
// if (_zapatec_tree_url)=0A=
// 	_zapatec_tree_url =3D _zapatec_tree_url.replace(/\/*$/, '/');=0A=
=0A=
/**=0A=
 * The Zapatec.Tree object constructor.  Pass to it the ID of an UL =
element (or=0A=
 * a reference to the element should you have it already) and an optional=0A=
 * configuration object.  This function creates and initializes the tree =
widget=0A=
 * according to data existent in the nested list, and applies the =
configuration=0A=
 * specified.=0A=
 *=0A=
 * The configuration object may contain the following options (the =
following=0A=
 * shows default values):=0A=
 *=0A=
 * \code=0A=
 * {=0A=
 *    hiliteSelectedNode : true,     // boolean=0A=
 *    compact            : false,    // boolean=0A=
 *    dynamic            : false,    // boolean=0A=
 *    initLevel          : false,    // false or number=0A=
 *    defaultIcons       : null      // null or string=0A=
 * }=0A=
 * \endcode=0A=
 *=0A=
 * - hiliteSelectedNode -- if \b false is passed, the tree will not =
highlight=0A=
 *   the currently selected node.=0A=
 * - compact -- if \b true is passed the tree will work in a "compact" =
mode; in=0A=
 *   this mode it automatically closes sections not relevant to the =
current=0A=
 *   one.=0A=
 * - dynamic -- if \b true is passed the tree will use the "dynamic =
initialization"=0A=
 *   technique which greatly improves generation time.  Some =
functionality is=0A=
 *   not available in this mode until all the tree was generated.  In =
"dynamic"=0A=
 *   mode the tree is initially collapsed and levels are generated "on =
the fly"=0A=
 *   as the end user expands them.  You can't retrieve nodes by ID (which=0A=
 *   implies you can't synchronize to certain nodes) until they have been=0A=
 *   generated.=0A=
 * - initLevel -- when this is a numeric value, it specifies the maximum=0A=
 *   "expand level" that the tree will use initially.  Therefore, if for=0A=
 *   instance you specify 1 then the tree will be initially expanded one =
level.=0A=
 *   Pass here 0 to have the tree fully collapsed, or leave it \b false =
to have=0A=
 *   the tree fully expanded.=0A=
 * - defaultIcons -- you can pass here a string.  If so, all tree items =
will=0A=
 *   get an additional TD element containing that string in the \b class=0A=
 *   attribute.  This helps you to include custom default icons without=0A=
 *   specifying them as IMG tags in the tree.  See our examples.=0A=
 *=0A=
 * @param el [string or HTMLElement] -- the UL element=0A=
 * @param config [Object, optional] -- the configuration options=0A=
 *=0A=
 * @return=0A=
 */=0A=
Zapatec.Tree =3D function(el, config) {=0A=
	if (typeof config =3D=3D "undefined"){=0A=
		config =3D {};=0A=
	}=0A=
=0A=
	function param_default(name, value) {=0A=
		if (typeof config[name] =3D=3D "undefined"){=0A=
			config[name] =3D value;=0A=
		}=0A=
	};=0A=
=0A=
	param_default('d_profile', false);=0A=
	param_default('hiliteSelectedNode', true);=0A=
	param_default('compact', false);=0A=
	param_default('dynamic', false);=0A=
	param_default('initLevel', false);=0A=
=0A=
	//expand/collapse the tree when the text or image are clicked=0A=
	param_default('expandOnLabel', true); =0A=
=0A=
	//Keep track, using cookies, of the last location the user opened=0A=
	param_default('saveState', false); =0A=
	=0A=
	if(config.dynamic){=0A=
		config.initLevel =3D 0;=0A=
	}=0A=
=0A=
	if(=0A=
		config.dynamic ||=0A=
		config.saveState && =0A=
		(=0A=
			typeof(config.saveId) !=3D "string" || =0A=
			(=0A=
				typeof(config.saveId) =3D=3D "string" &&=0A=
				config.saveId.length =3D=3D 0=0A=
			)=0A=
		)=0A=
	){=0A=
		config.saveState =3D false;=0A=
	}=0A=
=0A=
	this.config =3D config;=0A=
	=0A=
	// <PROFILE>=0A=
	if (this.config.d_profile) {=0A=
		var T1 =3D new Date().getTime();=0A=
	=0A=
		profile =3D {=0A=
			items : 0,=0A=
			trees : 0,=0A=
			icons : 0=0A=
		};=0A=
	}=0A=
	// </PROFILE>=0A=
=0A=
	if (typeof el =3D=3D "string"){=0A=
		el =3D document.getElementById(el);=0A=
	}=0A=
=0A=
	this.list =3D el;=0A=
	this.items =3D {};=0A=
	this.trees =3D {};=0A=
	this.selectedItem =3D null;=0A=
	this.id =3D el.id || Zapatec.Utils.generateID("tree");=0A=
	var top =3D this.top_parent =3D Zapatec.Utils.createElement("div");=0A=
	top.className =3D "tree tree-top";=0A=
	this.createTree(el, top, 0);=0A=
	el.parentNode.insertBefore(top, el);=0A=
	el.parentNode.removeChild(el);=0A=
	Zapatec.Tree.all[this.id] =3D this;=0A=
=0A=
	// check if we have an initially selected node and sync. the tree if so=0A=
	if (this.selectedItem){=0A=
		this.sync(this.selectedItem.__msh_item);=0A=
	}=0A=
=0A=
	//if we're keeping track of state, and we have saved state information=0A=
	if(this.config.saveState) {=0A=
		//restore to previous node=0A=
		var txt =3D Zapatec.Utils.getCookie("Zapatec.Tree-" + config.saveId)=0A=
=0A=
		if (txt) {=0A=
			this.sync(txt);=0A=
		}=0A=
	}=0A=
=0A=
	// <PROFILE>=0A=
	if (this.config.d_profile) {=0A=
		alert("Generated in " + (new Date().getTime() - T1) + " =
milliseconds\n" +=0A=
		      profile.items + " total tree items\n" +=0A=
		      profile.trees + " total (sub)trees\n" +=0A=
		      profile.icons + " total icons");=0A=
	}=0A=
	// </PROFILE>=0A=
};=0A=
=0A=
/**=0A=
 * This global variable keeps a "hash table" (that is, a plain JavaScript=0A=
 * object) mapping ID-s to references to Zapatec.Tree objects.  It's =
helpful if=0A=
 * you want to operate on a tree but you don't want to keep a reference =
to it.=0A=
 * Example:=0A=
 *=0A=
 * \code=0A=
 *   // the following makes a tree for the <ul id=3D"tree-id"> element=0A=
 *   var tree =3D new Zapatec.Tree("tree-id");=0A=
 *   // ... later=0A=
 *   var existing_tree =3D Zapatec.Tree.all("tree-id");=0A=
 *   // and now we can use \b existing_tree the same as we can use \b =
tree=0A=
 *   // the following displays \b true=0A=
 *   alert(existing_tree =3D=3D tree);=0A=
 * \endcode=0A=
 *=0A=
 * So in short, this variable remembers values returned by "new=0A=
 * Zapatec.Tree(...)" in case you didn't.=0A=
 */=0A=
Zapatec.Tree.all =3D {};=0A=
=0A=
/**=0A=
 * \internal Function that creates a (sub)tree.  This function walks the =
UL=0A=
 * element, computes and assigns CSS class names and creates HTML =
elements for=0A=
 * a subtree.  Each time a LI element is encountered, createItem() is =
called=0A=
 * which effectively creates the item.  Beware that createItem() might =
call=0A=
 * back this function in order to create the item's subtree. (so =
createTree and=0A=
 * createItem form an indirect recursion).=0A=
 *=0A=
 * @param list [HTMLElement] -- reference to the UL element=0A=
 * @param parent [HTMLElement] -- reference to the parent element that =
should hold the (sub)tree=0A=
 * @param level [integer] -- the level of this (sub)tree in the main =
tree.=0A=
 *=0A=
 * @return id -- the (sub)tree ID; might be automatically generated.=0A=
 */=0A=
Zapatec.Tree.prototype.createTree =3D function(list, parent, level) {=0A=
	// PROFILE=0A=
	if (this.config.d_profile){=0A=
		++profile.trees;=0A=
	}=0A=
=0A=
	var id =3D list.id || Zapatec.Utils.generateID("tree.sub");=0A=
	var self =3D this;=0A=
=0A=
	function _makeIt() {=0A=
		self.creating_now =3D true;=0A=
		var last_li =3D null;=0A=
		var next_li =3D null;=0A=
		var i =3D list.firstChild;=0A=
        var items =3D parent.__msh_items =3D [];=0A=
=0A=
		self.trees[id] =3D parent;=0A=
		parent.__msh_level =3D level;=0A=
		parent.__msh_treeid =3D id;=0A=
=0A=
		while (i) {=0A=
			if (last_li){=0A=
				last_li.className +=3D " tree-lines-c";=0A=
			}=0A=
=0A=
			if (i.nodeType !=3D 1){=0A=
				i =3D i.nextSibling;=0A=
			} else {=0A=
				next_li =3D Zapatec.Utils.getNextSibling(i, 'li');=0A=
			=0A=
				if (i.tagName.toLowerCase() =3D=3D 'li') {=0A=
					last_li =3D self.createItem(i, parent, next_li, level);=0A=
				=0A=
					if (last_li) { //false when webmaster creates malformed tree =0A=
						items[items.length] =3D last_li.__msh_item;=0A=
					}=0A=
				}=0A=
=0A=
				i =3D next_li;=0A=
			}=0A=
		}=0A=
=0A=
		i =3D parent.firstChild;=0A=
		=0A=
		if (i && !level) {=0A=
			i.className =3D i.className.replace(/ tree-lines-./g, "");=0A=
			i.className +=3D (i =3D=3D=3D last_li) ? " tree-lines-s" : " =
tree-lines-t";=0A=
		}=0A=
		=0A=
		if (last_li && (level || last_li !=3D=3D i)) {=0A=
			last_li.className =3D last_li.className.replace(/ tree-lines-./g, "");=0A=
			last_li.className +=3D " tree-lines-b";=0A=
		}=0A=
		=0A=
		self.creating_now =3D false;=0A=
	};=0A=
=0A=
	if (this.config.dynamic && level > 0){=0A=
		(this.trees[id] =3D _makeIt);=0A=
	} else {=0A=
		_makeIt();=0A=
	}=0A=
=0A=
	return id;=0A=
};=0A=
=0A=
/**=0A=
 * \internal This function walks through a LI element and creates the =
HTML=0A=
 * elements associated with that tree item.  When it encounters an UL =
element=0A=
 * it calls createTree() in order to create the item's subtree.  This =
function=0A=
 * may also call item_addIcon() in order to add the +/- buttons or icons=0A=
 * present in the item definition as IMG tags, or item_addDefaultIcon() =
if the=0A=
 * tree configuration specifies "defaultIcons" and no IMG tag was =
present.=0A=
 *=0A=
 * @param li [HTMLElement] -- reference to the LI element=0A=
 * @param parent [HTMLElement] -- reference to the parent element where =
the HTML elements should be created=0A=
 * @param next_li [HTMLLiElement] -- reference to the next LI element, =
if this is not the last one=0A=
 * @param level [integer] -- the level of this item in the main tree=0A=
 * @param atStart [HTMLElement optional] -- reference to the element DIV =
with a TABLE object that represents the child following the new child =
added or inserted   =0A=
 *=0A=
 * @return [HTMLElement] -- a reference to a DIV element holding the =
HTML elements of the created item=0A=
 */=0A=
Zapatec.Tree.prototype.createItem =3D function(li, parent, next_li, =
level, atStart) {=0A=
    // PROFILE=0A=
	if (this.config.d_profile){=0A=
		++profile.items;=0A=
	}=0A=
=0A=
	if (!li.firstChild){=0A=
		return;=0A=
	}=0A=
=0A=
	var afterNode =3D null; =0A=
	if (atStart) { //Optional parameter after the fourth parameter to allow =
the new created node to be inserted before it, instead of appending to =
the parent =0A=
		afterNode =3D atStart; =0A=
	} =0A=
=0A=
	var=0A=
		id =3D li.id || Zapatec.Utils.generateID("tree.item"),=0A=
		item =3D this.items[id] =3D ((afterNode =3D=3D null) ? =
Zapatec.Utils.createElement("div", parent) : =
Zapatec.Utils.createElement("div")), //Do not append the new div element =
to the parent, the new node in the div will be inserted before the =
'afterNode'.=0A=
		t =3D Zapatec.Utils.createElement("table", item),=0A=
		tb =3D Zapatec.Utils.createElement("tbody", t),=0A=
		tr =3D Zapatec.Utils.createElement("tr", tb),=0A=
		td =3D Zapatec.Utils.createElement("td", tr),=0A=
		is_list,=0A=
		tmp,=0A=
		i =3D li.firstChild,=0A=
		has_icon =3D false;=0A=
=0A=
	t.className =3D "tree-table";=0A=
	t.cellSpacing =3D 0;=0A=
	t.cellPadding =3D 0;=0A=
	td.className =3D "label";=0A=
	item.className =3D li.className + " tree-item";=0A=
	item.__msh_item =3D id;=0A=
	item.__msh_tree =3D this.id;=0A=
	item.__msh_parent =3D parent.__msh_treeid;=0A=
=0A=
	if (afterNode) { //A child node from the same parent is sent in to let =
the new child node inserted before it. =0A=
		parent.insertBefore(item, afterNode); //New item inserted before the =
'afterNode'=0A=
	}=0A=
=0A=
	while (i) {=0A=
		is_list =3D i.nodeType =3D=3D 1 && /^[ou]l$/i.test(i.tagName);=0A=
=0A=
		if (i.nodeType !=3D 1 || !is_list) {=0A=
			if (i.nodeType =3D=3D 3) {=0A=
				// remove whitespace, it seems to cause layout trouble=0A=
				tmp =3D i.data.replace(/^\s+/, '');=0A=
				tmp =3D tmp.replace(/\s+$/, '');=0A=
				li.removeChild(i);=0A=
=0A=
				if (tmp) {=0A=
					i =3D Zapatec.Utils.createElement("span");=0A=
					i.className =3D "label";=0A=
					i.innerHTML =3D tmp;=0A=
					i.onclick =3D Zapatec.Tree.onItemToggle;=0A=
					td.appendChild(i);=0A=
				}=0A=
			} else if (i.tagName.toLowerCase() =3D=3D 'img') {=0A=
				this.item_addIcon(item, i);=0A=
				has_icon =3D true;=0A=
			} else {=0A=
				i.onclick =3D Zapatec.Tree.onItemToggle;=0A=
				td.appendChild(i);=0A=
			}=0A=
=0A=
			i =3D li.firstChild;=0A=
			=0A=
			continue;=0A=
		}=0A=
=0A=
		if (is_list) {=0A=
			this.item_addIcon(item, null);=0A=
=0A=
			var np; =0A=
			if (afterNode !=3D null) { =0A=
				np =3D Zapatec.Utils.createElement("div"); =0A=
				parent.insertBefore(np, afterNode); //New item inserted before the =
'afterNode' =0A=
			} else { =0A=
				np =3D Zapatec.Utils.createElement("div", item.parentNode); =0A=
			}=0A=
=0A=
			np.__msh_item =3D id;=0A=
			np.className =3D "tree";=0A=
=0A=
			if (next_li){=0A=
				np.className +=3D " tree-lined";=0A=
			}=0A=
=0A=
			item.__msh_subtree =3D this.createTree(i, np, level + 1);=0A=
=0A=
			if ((this.config.initLevel !=3D=3D false && this.config.initLevel =
<=3D level) ||=0A=
				(this.config.compact && !/(^|\s)expanded(\s|$)/i.test(li.className))=0A=
				|| /(^|\s)collapsed(\s|$)/i.test(li.className)=0A=
			){=0A=
				item.className +=3D " tree-item-collapsed";=0A=
				this.toggleItem(id, false);=0A=
			} else {=0A=
				item.className +=3D " tree-item-expanded";=0A=
			}=0A=
			=0A=
			if (/(^|\s)selected(\s|$)/i.test(li.className)){=0A=
				this.selectedItem =3D item;=0A=
			}=0A=
=0A=
			break;=0A=
		}=0A=
	}=0A=
=0A=
	if (!has_icon){=0A=
		this.item_addDefaultIcon(item, this.config.defaultIcons);=0A=
	}=0A=
=0A=
	return item;=0A=
};=0A=
=0A=
/** =0A=
 * Call this function to create a html element with the optional element =
type specified. =0A=
 * By default, it is a <LI> element. =0A=
 * @param html [string, optional] -- html of the node; may include <UL>, =
<LI> elements; user is responsible for the content of the html =0A=
 * @param type [string, optional] -- type of the node to be created  =0A=
 */ =0A=
Zapatec.Tree.prototype.makeNode =3D function(html, type) { =0A=
        if (!type) { =0A=
           type =3D "li"; //Make it a <LI> node if the type is not =
specified.      =0A=
        } =0A=
        var node =3D Zapatec.Utils.createElement(type); =0A=
        if (html) {  =0A=
                node.innerHTML =3D html; //Assign the inner html of the =
node if it is specified. =0A=
        } =0A=
        return node; =0A=
} =0A=
 =0A=
/** =0A=
 * Call to get the parent to append, insert or remove a child either at =
start or end position or in between two nodes of the (sub-)tree. =0A=
 * =0A=
 * For insert, if the user selects a tree-item that represents the root =
node of a subtree, then the new child will be inserted outside the =
subtree,  =0A=
 * i.e. exactly before the root node of the subtree. However, if the =
user selects the node that represents one of the children in the =
subtree, =0A=
 * then the new child will be inserted in the subtree under the root. =0A=
 * For remove, if the user selects the root node of a subtree, the root =
node including its children will be removed. If the user selects a node =
that is not =0A=
 * a root node of a subtree, then only that node will be deleted. =0A=
 * In the implementation, the p will first retrieve the subtree from =
Tree.trees. But this is just the object that encapsulates the subtree, =
not the root of the =0A=
 * entire subtree. For insert and remove,  =0A=
 * @param id     [String] -- id of the parent the new child will be =
added to or inserted before/at. =0A=
 * @param mode   [String optional] -- "I" is for inserting a child node. =
"R" is for removing a child node.  =0A=
 */ =0A=
Zapatec.Tree.prototype.getParent =3D function(id, mode) { =0A=
        var parent =3D null; =0A=
        for (var i in this.trees) { =0A=
            //id sent in may be name of the top tree or one of the tree =
item's or subtree parent's name  =0A=
            if ( (this.trees[i].__msh_treeid =3D=3D id) || =
(this.trees[i].__msh_item =3D=3D id) ) { =0A=
               parent =3D this.trees[i]; //Get the body of a subtree =0A=
               break; =0A=
            } =0A=
        } =0A=
        //For inserting a new child before the referece child, the =
reference child should be the tree item,  =0A=
        //not the subtree under it (in case it has tree nodes under it). =
This is because inserting a new child  =0A=
        //should be 'before' the subtree (if the tree item has tree =
nodes under it), not inside or become part of the subtree. =0A=
        if ( (mode !=3D null) && ((mode.toUpperCase() =3D=3D "I") || =
(mode.toUpperCase() =3D=3D "R")) ) {  //At this point, if p not null, =
then it must be body of the subtree. So, get the tree item (root node of =
the subtree) instead.  =0A=
           //Otherwise id doesn't refer to a subtree. In this case, get =
the tree item instead. =0A=
           if (parent !=3D null) { //A subtree (not include its root) =
has been retrieved. That means the insertion or removal operation got to =
be performed before or at the root of the subtree. This warrants the =
retrival of the root of the subtree. =0A=
              if (parent.className !=3D this.top_parent.className) //As =
long as p is not the top parent, get the previous sibling or node of p. =
The previous sibling will be the root of the subtree. =0A=
                 parent =3D parent.previousSibling; =0A=
           } else parent =3D this.items[id.toLowerCase()]; //If no =
subtree is retrieved, then it must an item node, then get it from array =
this.items. =0A=
        } =0A=
        if (!parent) { //If the node matching the id still cannot be =
found, then look into each item under a subtree  =0A=
           parent =3D this.items[id.toLowerCase()]; =0A=
        } =0A=
        return parent;   =0A=
} =0A=
 =0A=
/** =0A=
 * Append a child to the start or end of the given parent. =0A=
 * =0A=
 * @param parent   [HTMLElement] -- reference to a tree node (either as =
a node at top level or at a subtree level) the new child going to be =
appended to in the tree. =0A=
 * @param newChild [HTMLElement] -- reference to an HTML element created =
of type LI, to which futher HTML elements such UL and LI can be included =
to generate subtrees. =0A=
 * @param atStart  [boolean, optional] -- true if the child going to be =
added at the start of the parent.  =0A=
 */ =0A=
Zapatec.Tree.prototype.appendChild =3D function(parent, newChild, =
atStart) { =0A=
	atStart =3D (atStart =3D=3D true); =0A=
=0A=
    // Abort operation when either parent/child is empty or the child =
node is =0A=
    //   already added to the tree. =0A=
	if (=0A=
		parent =3D=3D null || =0A=
		newChild =3D=3D null || =0A=
		typeof(parent) =3D=3D "undefined" ||=0A=
		typeof(newChild) =3D=3D "undefined" ||=0A=
		this.items[newChild.id]=0A=
	){=0A=
		return; =0A=
	}     =0A=
=0A=
	var item =3D null; =0A=
=0A=
	if(parent.firstChild =3D=3D null){=0A=
		atStart =3D false;=0A=
	}=0A=
	=0A=
	if (atStart) { //Append new child before first child of the parent =0A=
		item =3D this.createItem(newChild, parent, =
parent.firstChild.nextSibling, parent.__msh_level, parent.firstChild); =0A=
	} else { //Append new child after last child of the parent =0A=
		item =3D this.createItem(newChild, parent, null, parent.__msh_level); =0A=
	} =0A=
         =0A=
	// After adding a child, re-draw tree lines that connect the new child =
to =0A=
	//   the tree. This is necessary because the tree structure has been =0A=
	//   changed due to addition or insertion of a new child node. =0A=
	if (item) { //Child added has no subtree =0A=
		var this_node =3D null; =0A=
		var next_node =3D null; =0A=
		var prev_node =3D null; =0A=
		var subtree   =3D false; =0A=
                 =0A=
		if (atStart) { //Child appended at start of the tree =0A=
			this_node =3D parent.childNodes[0]; //Always the first node =
regardless of whether has a subtree under it =0A=
			=0A=
			if (item.__msh_subtree=3D=3Dnull) { //New child appended has no =
subtree =0A=
				next_node =3D parent.childNodes[1]; //Next node will be the second =
node - the one after the new child node. =0A=
			} else { //New child appended has a subtree =0A=
				next_node =3D parent.childNodes[2]; //Next node will be the third =
node - two nodes after the new child node =0A=
			} =0A=
		} else { //Child appended at end of the tree =0A=
			//Get the appropriate tree node the new node going to attach to =0A=
			if (!item.__msh_subtree) { //Child appended has no subtree =0A=
				this_node =3D parent.childNodes[parent.childNodes.length-1]; //Last =
node =0A=
=0A=
				if(parent.childNodes.length > 1){=0A=
					prev_node =3D parent.childNodes[parent.childNodes.length-2]; =0A=
					subtree =3D (prev_node.className !=3D null && prev_node.className =
=3D=3D "tree"); =0A=
					=0A=
					if (subtree) { //prev_node is a not a tree item, it has a subtree =0A=
						prev_node.className +=3D " tree-lined"; //Add vertical tree line =
to the tree =0A=
						prev_node =3D parent.childNodes[parent.childNodes.length-3]; //Get =
its parent instead  =0A=
					} =0A=
				}=0A=
			} else { =0A=
				this_node =3D parent.childNodes[parent.childNodes.length-2]; =
//Second last node =0A=
                                          =0A=
				prev_node =3D parent.childNodes[parent.childNodes.length-3]; =0A=
				subtree =3D (prev_node.className !=3D null && prev_node.className =
=3D=3D "tree"); =0A=
				=0A=
				if (subtree) { //prev_node is a not a tree item, it has a subtree =0A=
					prev_node.className +=3D " tree-lined"; //Add vertical tree line to =
the tree =0A=
					prev_node =3D parent.childNodes[parent.childNodes.length-4]; //Get =
its parent instead =0A=
				} =0A=
			} =0A=
		} =0A=
                 =0A=
		//Draw tree lines between the child and the parent =0A=
		if (this_node) { //Make sure the child is in the parent (sub-)tree =0A=
			this_node.className =3D this_node.className.replace(/ tree-lines-./g, =
""); =0A=
			=0A=
			if (atStart) { =0A=
				this_node.className +=3D " tree-lines-t"; =0A=
				=0A=
				if (next_node) { =0A=
					next_node.className =3D next_node.className.replace(/ =
tree-lines-./g, ""); =0A=
					next_node.className +=3D " tree-lines-c"; =0A=
				} =0A=
			} else { =0A=
				this_node.className +=3D " tree-lines-b"; =0A=
=0A=
				if (prev_node) { =0A=
					prev_node.className =3D prev_node.className.replace(/ =
tree-lines-./g, ""); =0A=
                                          =0A=
					prev_node.className +=3D " tree-lines-c"; =0A=
					=0A=
					if (subtree) { =0A=
						prev_node.className +=3D " tree-lines-c"; =0A=
					} =0A=
				} =0A=
			} =0A=
		} =0A=
=0A=
		return item;=0A=
	} =0A=
};  =0A=
 =0A=
/** =0A=
 * A new child can be inserted between two nodes/children or before one =
node /children at the same tree level.  =0A=
 * Inserting the new child before the first node of a tree is allowed =
but not allowed  =0A=
 * after the last node of the tree, i.e. end of the tree, except before =
the last node. =0A=
 * @param newChild [HTMLElement] -- New child node to be inserted into =
the tree =0A=
 * @param refChild [HTMLElement] -- Reference to the child node which =
the new child node will be inserted before =0A=
 */ =0A=
Zapatec.Tree.prototype.insertBefore =3D function(newChild, refChild) { =0A=
	//Abort operation when either newChild/refChild is empty or the child =
node is already added to the tree..   =0A=
	if(=0A=
		newChild =3D=3D null || =0A=
		refChild =3D=3D null || =0A=
		typeof(newChild) =3D=3D "undefined" ||=0A=
		typeof(refChild) =3D=3D "undefined" || =0A=
		this.items[newChild.id]=0A=
	){=0A=
		return; =0A=
	} =0A=
=0A=
	var parent =3D refChild.parentNode; =0A=
	var item =3D this.createItem(newChild, parent, =
parent.firstChild.nextSibling, parent.__msh_level, refChild); =0A=
	var nodeBefore =3D false, nodeAfter =3D false; =0A=
	var next_node  =3D null; =0A=
 =0A=
	if(item.previousSibling){=0A=
		nodeBefore =3D true; =0A=
	}=0A=
=0A=
	if(item.nextSibling){=0A=
		nodeAfter =3D true;=0A=
	}=0A=
 =0A=
	item.className =3D item.className.replace(/ tree-lines-./g, ""); =0A=
=0A=
	if (nodeBefore && nodeAfter){=0A=
		item.className +=3D " tree-lines-c";=0A=
	} else if (nodeBefore){=0A=
		item.className +=3D " tree-lines-b"; =0A=
	} else if (nodeAfter) {=0A=
		//Insert new child at the start of the tree. =0A=
		item.className +=3D " tree-lines-t"; =0A=
=0A=
		//Since the node now after the new child was the first node before, =
the tree line from it is not connected to the new child. =0A=
		//So it needs to redraw the tree line for the second node (formerly =
the first node in the tree). =0A=
		if (item.className.indexOf("tree-item-more tree-item")>-1) { //New =
child has a subtree under it. =0A=
			next_node =3D item.nextSibling.nextSibling; //Get the next node at =
the 'same' level as the new child, skip the new child's subtree. =0A=
		} else { =0A=
			next_node =3D item.nextSibling; //Get the next node at the 'same' =
level. =0A=
		} =0A=
=0A=
		next_node.className =3D next_node.className.replace(/ tree-lines-./g, =
""); =0A=
=0A=
		//To find out whether next node has next node after it. =0A=
		if (next_node.className.indexOf("tree-item-more tree-item")>-1) { =
//Next node has a subtree =0A=
			if (next_node.nextSibling.nextSibling !=3D null){=0A=
				next_node.className +=3D " tree-lines-c";  =0A=
			} else {=0A=
				next_node.className +=3D " tree-lines-b"; =0A=
			}=0A=
		} else { //Next node is an tree item. =0A=
			if (next_node.nextSibling !=3D null){=0A=
				next_node.className +=3D " tree-lines-c";  =0A=
			} else {=0A=
				next_node.className +=3D " tree-lines-b"; =0A=
			}=0A=
		} =0A=
	} =0A=
}; =0A=
 =0A=
/** =0A=
 * An old child node in the tree can be removed at any level. =0A=
 * If the old child node happens to be the root of a subtree,  =0A=
 * then the entire subtree including child node(s) under the root node =
will be removed. =0A=
 * If the old child node is just an item node without any child node =
under it as children,  =0A=
 * then the only node removed is the old child node. =0A=
 * Once an item node or a subtree is removed, the node/subtree before =
and/or after the old  =0A=
 * node will be joined together, sometimes with tree lines redrawn. =0A=
 * The only limitations are that the root node of the top tree is not =
permitted for removal; =0A=
 * the first child node found will be removed if there are more than one =
tree node with the same id. =0A=
 * @param oldChild [HTMLElement] -- Old child node to be removed from =
the tree where it can  =0A=
 * be an item node without children or a subtree including the old child =
node as the root. =0A=
 */ =0A=
Zapatec.Tree.prototype.removeChild =3D function(oldChild) { =0A=
 	if (=0A=
		oldChild =3D=3D null || =0A=
		typeof(oldChild) =3D=3D "undefined"=0A=
	){=0A=
		//No child to remove =0A=
		return;=0A=
	} else if (oldChild.className =3D=3D this.top_parent.className) {=0A=
		//Top root node is not allowed =0A=
		alert("Removing root node not allowed.") =0A=
		return;  =0A=
	} =0A=
         =0A=
	//Get the child node's parent node =0A=
	var p =3D oldChild.parentNode; =0A=
         =0A=
	//Remove node(s) - check if the old child represents a root node of a =
subtree. If it does, remove the child nodes in the subtree as well as =
the root node. =0A=
	//If it does not represents a root node of a subtree, just remove it =
from the parent it attached to. =0A=
	//Clean up - remove the subtree's id from this.trees or the item node's =
id from this.items. =0A=
	if (oldChild.__msh_item && oldChild.__msh_tree && =
oldChild.__msh_parent) { //Make sure all common attributes of root node =
(of a subtree) or item node are there. =0A=
		var prev_node =3D oldChild.previousSibling; =0A=
		var next_node =3D oldChild.nextSibling; =0A=
		var hasPrevNode =3D false; =0A=
		var hasNextNode =3D false; =0A=
            =0A=
		//Find out if there is a node before the old node at the same tree =
level. =0A=
		if (prev_node) { =0A=
			//If the node before the old child is the entire subtree at next =
level, get the root node of that subtree. =0A=
			//The root node will be at the same level as the old child. =
Otherwise, the node before the old child is an item node. =0A=
=0A=
			if (prev_node.__msh_treeid) { //The node before the old child is a =
tree consists of all tree nodes in a subtree. =0A=
			    //Get the root node of that subtree. It should have the same =
level as the old child. =0A=
				prev_node =3D prev_node.previousSibling; =0A=
			} =0A=
=0A=
			hasPrevNode =3D true; =0A=
		} else { //No child before the old child at the same level. =0A=
			//Check if the old child has a parent node such as root of a subtree =
and the parent node is not the top of the tree =0A=
			if (oldChild.parentNode && oldChild.parentNode.className !=3D =
this.top_parent.className) {                 =0A=
			    //This is needed in order to 'not' change any tree line for the =
child node(s) under a subtree.  =0A=
				hasPrevNode =3D true; =0A=
			} =0A=
		} =0A=
      =0A=
		//Find out if there is a node after the old node at the same tree =
level. =0A=
		if (next_node) { =0A=
			if (oldChild.__msh_subtree) { //Old child is a subtree. So old node =
is the root of a subtree. Get the node after the subtree then. =0A=
			    //Get the node after the old node at the same level. =0A=
				next_node =3D next_node.nextSibling; =0A=
				=0A=
				if (next_node) {=0A=
					//There is a next node at same level as the old node. =0A=
					hasNextNode =3D true; =0A=
				}=0A=
		} else {=0A=
			//Old child is an item node. So old node is an item node, not a =
subtree. Old node and next node are at the same level. =0A=
			hasNextNode =3D true; //There is a next node at same level as the old =
node. =0A=
		} =0A=
	} //else no next node =0A=
       =0A=
	if (oldChild.__msh_subtree) { //Root node of a subtree; has child =
node(s) under it. =0A=
	    //Try to get the whole subtree of the old child node =0A=
		var subtreeNode =3D oldChild.nextSibling; =0A=
          =0A=
		if (subtreeNode && oldChild.__msh_subtree =3D=3D =
subtreeNode.__msh_treeid) { //Subtree node exists =0A=
			for (var i =3D 0; i < subtreeNode.childNodes.length; i++) { //Loop =
through each children of the subtree  =0A=
				if (subtreeNode.childNodes[i]){=0A=
					//and delete the corresponding object in this.items =0A=
					delete this.items[subtreeNode.childNodes[i].__msh_item];=0A=
				}=0A=
            } =0A=
=0A=
			//Remove the corresponding item in this.items for the root of the =
subtree =0A=
			delete this.items[subtreeNode.__msh_item]; =0A=
=0A=
			//Remove the whole subtree =0A=
			p.removeChild(subtreeNode); =0A=
		} =0A=
		=0A=
		//Remove the corresponding subtree in this.trees =0A=
		delete(this.trees[oldChild.__msh_subtree]); =0A=
=0A=
		//Remove the child node from its parent=0A=
		p.removeChild(oldChild); =0A=
	} else {=0A=
		//An item node, not a subtree =0A=
		delete this.items[oldChild.__msh_item]; //Remove the corresponding =
item in this.items for the item node =0A=
		p.removeChild(oldChild); //Remove the child node from its parent =0A=
	} =0A=
=0A=
	//Re-draw tree lines nodes/subtrees between removed node if necessary =0A=
	//If there is a previous node and next node between the old node, there =
is no need to redraw thr tree lines =0A=
	//as the previous and next node will become joined together after the =
old node is removed. =0A=
	//If 'before' removal of the old node, there is a next node after the =
old node but no previous node before  =0A=
	//the old node, then it needs to redraw the tree line of the next node. =
The next node thus become the first node of the tree. =0A=
	if (!hasPrevNode && hasNextNode) { =0A=
		if (next_node) { =0A=
			next_node.className =3D next_node.className.replace(/ tree-lines-./g, =
""); =0A=
			next_node.className +=3D " tree-lines-t"; =0A=
		} =0A=
	} else if (hasPrevNode && !hasNextNode) { =0A=
		if (prev_node) { =0A=
			if (prev_node.__msh_subtree) { =0A=
				prev_node.nextSibling.className =3D =
prev_node.nextSibling.className.replace(/ tree-lined/g, ""); =0A=
			} //else not a subtree  =0A=
=0A=
			prev_node.className =3D prev_node.className.replace(/ tree-lines-./g, =
""); =0A=
			prev_node.className +=3D " tree-lines-b"; =0A=
		} =0A=
	}=0A=
} =0A=
}; =0A=
=0A=
/**=0A=
 * \internal This function adds a TD element having a certain class =
attribute=0A=
 * which helps having a tree containing icons without defining IMG tags =
for=0A=
 * each item.  The class name will be "tgb icon className" (where =
"className"=0A=
 * is the specified parameter).  Further, in order to customize the =
icons, one=0A=
 * should add some CSS lines like this:=0A=
 *=0A=
 * \code=0A=
 *  div.tree-item td.customIcon {=0A=
 *    background: url("themes/img/fs/document2.png") no-repeat 0 50%;=0A=
 *  }=0A=
 *  div.tree-item-expanded td.customIcon {=0A=
 *    background: url("themes/img/fs/folder-open.png") no-repeat 0 50%;=0A=
 *  }=0A=
 *  div.tree-item-collapsed td.customIcon {=0A=
 *    background: url("themes/img/fs/folder.png") no-repeat 0 50%;=0A=
 *  }=0A=
 * \endcode=0A=
 *=0A=
 * As you can see, it's very easy to customize the default icons for a =
normal=0A=
 * tree item (that has no subtrees) or for expanded or collapsed items.  =
For=0A=
 * the above example to work, one has to pass { defaultIcons: =
"customIcon" } in=0A=
 * the tree configuration object.=0A=
 *=0A=
 * This function does nothing if the \b className parameter has a false =
logical=0A=
 * value (i.e. is null).=0A=
 *=0A=
 * @param item [HTMLElement] -- reference to the DIV element holding the =
item=0A=
 * @param className -- a string containing the additional class name=0A=
 */=0A=
Zapatec.Tree.prototype.item_addDefaultIcon =3D function(item, className) =
{=0A=
	if (!className){=0A=
		return;=0A=
	}=0A=
=0A=
	var last_td =3D item.firstChild.firstChild.firstChild.lastChild, td;=0A=
	var td =3D Zapatec.Utils.createElement("td");=0A=
	=0A=
	td.className =3D "tgb icon " + className;=0A=
	td.onclick =3D Zapatec.Tree.onItemToggle;=0A=
	last_td.parentNode.insertBefore(td, last_td);=0A=
};=0A=
=0A=
/** =0A=
 * \internal This function does different things, depending on whether =
the \b=0A=
 * img parameter is passed or not.  If the \b img is passed, then this =
function=0A=
 * adds it as an icon for the given item.  If not passed, this function =
creates=0A=
 * a "+/-" button for the given item.=0A=
 * =0A=
 * @param item [HTMLElement] -- reference to the DIV holding the item =
elements=0A=
 * @param img [HTMLImgElement, optional] -- reference to an IMG element; =
normally one found in the <LI>=0A=
 */=0A=
Zapatec.Tree.prototype.item_addIcon =3D function(item, img) {=0A=
	// PROFILE=0A=
	if (this.config.d_profile){=0A=
		++profile.icons;=0A=
	}=0A=
	=0A=
	var last_td =3D item.firstChild.firstChild.firstChild, td;=0A=
	last_td =3D img ? last_td.lastChild : last_td.firstChild;=0A=
	=0A=
	if (!img || !item.__msh_icon) {=0A=
		td =3D Zapatec.Utils.createElement("td");=0A=
		td.className =3D "tgb " + (img ? "icon" : "minus");=0A=
		last_td.parentNode.insertBefore(td, last_td);=0A=
		td.onclick =3D Zapatec.Tree.onItemToggle;=0A=
	} else {=0A=
		td =3D item.__msh_icon;=0A=
		img.style.display =3D "none";=0A=
	}=0A=
	=0A=
	if (!img) {=0A=
		td.innerHTML =3D "&nbsp;";=0A=
		item.className +=3D " tree-item-more";=0A=
		item.__msh_state =3D false; // collapsed=0A=
		item.__msh_expand =3D td;=0A=
	} else {=0A=
		td.appendChild(img);=0A=
		item.__msh_icon =3D td;=0A=
	}=0A=
};=0A=
=0A=
/** =0A=
 * This function gets called from a global event handler when some item =
was=0A=
 * clicked.  It selects the item and toggles it if it has a subtree =
(expands or=0A=
 * collapses it).=0A=
 * =0A=
 * @param item_id [string] -- the item ID=0A=
 */=0A=
Zapatec.Tree.prototype.itemClicked =3D function(item_id, expand) {=0A=
        if (! expand) {=0A=
		if (this.config.hiliteSelectedNode && this.selectedItem){=0A=
			Zapatec.Utils.removeClass(this.selectedItem, "tree-item-selected");=0A=
		}=0A=
		this.selectedItem =3D this.items[item_id];=0A=
	} else {=0A=
		this.toggleItem(item_id, null, expand);=0A=
	}=0A=
	Zapatec.Utils.writeCookie("Zapatec.Tree-" + this.config.saveId, =
this.selectedItem.__msh_item, null, '/', 7);=0A=
	if (this.config.hiliteSelectedNode && this.selectedItem){=0A=
		Zapatec.Utils.addClass(this.selectedItem, "tree-item-selected");=0A=
	}=0A=
	this.onItemSelect(item_id);=0A=
};=0A=
=0A=
/** =0A=
 * This function toggles an item if the \b state parameter is not =
specified.=0A=
 * If \b state is \b true then it expands the item, and if \b state is =
\b false=0A=
 * then it collapses the item.=0A=
 * =0A=
 * @param item_id [string] -- the item ID=0A=
 * @param state [boolean, optional] -- the desired item state=0A=
 * @param expand [boolean, optional] -- should expand/collapse if it is =
a branch=0A=
 * =0A=
 * @return a reference to the item element if found, null otherwise=0A=
 */=0A=
Zapatec.Tree.prototype.toggleItem =3D function(item_id, state, expand) {=0A=
	if (item_id) {=0A=
		var stateDefined =3D false;=0A=
=0A=
		if(this.config.saveState) {=0A=
			stateDefined =3D true;=0A=
		}=0A=
=0A=
		if (this.config.hiliteSelectedNode && this.selectedItem){=0A=
			Zapatec.Utils.removeClass(this.selectedItem, "tree-item-selected");=0A=
		}=0A=
		var item =3D this.items[item_id];=0A=
=0A=
		if (typeof(state) =3D=3D "undefined" || state =3D=3D null) {=0A=
			state =3D !item.__msh_state;=0A=
			stateDefined =3D false;=0A=
		}=0A=
		=0A=
		// Expand is true when the '+' or '-' are clicked. =0A=
		// If expandOnLabel is true we will expand even when the label is =
clicked=0A=
		// We will also expand when the state is explictally passed =0A=
=0A=
		if (=0A=
			(expand || this.config.expandOnLabel || stateDefined)=0A=
		){=0A=
			var subtree =3D this._getTree(item.__msh_subtree, this.creating_now);=0A=
=0A=
			if (subtree) {=0A=
				subtree.style.display =3D state ? "block" : "none";=0A=
				Zapatec.Utils.removeClass(item, "tree-item-expanded");=0A=
				Zapatec.Utils.removeClass(item, "tree-item-collapsed");=0A=
				Zapatec.Utils.addClass(item, state ?=0A=
					"tree-item-expanded" : "tree-item-collapsed");=0A=
			}=0A=
=0A=
			var img =3D item.__msh_expand;=0A=
=0A=
			if (img){=0A=
				img.className =3D "tgb " + (state ? "minus" : "plus");=0A=
			}=0A=
=0A=
			item.__msh_state =3D state;=0A=
			img =3D item.__msh_icon;=0A=
=0A=
			if (img) {=0A=
				img.firstChild.style.display =3D "none";=0A=
				img.appendChild(img.firstChild);=0A=
				img.firstChild.style.display =3D "block";=0A=
			}=0A=
=0A=
			if (this.config.compact && state) {=0A=
				var a =3D this._getTree(item.__msh_parent).__msh_items;=0A=
				for (var i =3D a.length; --i >=3D 0;)=0A=
					if (a[i] !=3D item_id)=0A=
						this.toggleItem(a[i], false);=0A=
			}=0A=
=0A=
			if(/zpLoad(JSON|HTML)=3D([^ $]*)/.test(item.className) && state){=0A=
				var dataType =3D RegExp.$1;=0A=
				var url =3D RegExp.$2;=0A=
=0A=
				item.className =3D item.className.replace(/zpLoad(JSON|HTML)=3D([^ =
$]*)/g, "");=0A=
				var loadingLabel =3D =
this.appendChild(this.getParent(item.__msh_item), =
this.makeNode(XXXLoadingXXX), true);=0A=
				var errorFunc =3D function (objError){=0A=
					alert(objError.errorDescription);=0A=
					item.className +=3D "zpLoad" + dataType + "=3D" + url;=0A=
=0A=
					self.removeChild(self.getParent(loadingLabel.__msh_item, "R"));=0A=
				}=0A=
=0A=
				var self =3D this;=0A=
=0A=
				if(dataType =3D=3D "JSON"){=0A=
					Zapatec.Transport.fetchJsonObj({=0A=
						url: url,=0A=
						method: "GET",=0A=
						onLoad: function(objResponse){=0A=
							function json2html(json){=0A=
								if(json =3D=3D null || json.length =3D=3D 0){=0A=
									return "";=0A=
								}=0A=
=0A=
								var res =3D "<ul>";=0A=
=0A=
								for(var ii =3D 0; ii < json.length; ii++){=0A=
									var currVal =3D json[ii];=0A=
=0A=
									if(typeof(currVal) =3D=3D "string"){=0A=
										currVal =3D [currVal];=0A=
									}=0A=
=0A=
									res +=3D "<li>" + currVal[0] + json2html(currVal[1]) + "</li>"=0A=
								}=0A=
=0A=
								res +=3D "</ul>";=0A=
=0A=
								return res=0A=
							}=0A=
=0A=
							var arr =3D objResponse;=0A=
=0A=
							for(var ii =3D0; ii < arr.length; ii++){=0A=
								var currVal =3D arr[ii];=0A=
=0A=
								if(typeof(currVal) =3D=3D "object" && currVal.length =3D=3D 1){=0A=
									currVal =3D currVal[0];=0A=
								} else if (typeof(currVal) =3D=3D "object" && currVal.length =
=3D=3D 2){=0A=
									currVal =3D currVal[0] + json2html(currVal[1]);=0A=
								}=0A=
								self.appendChild(self.getParent(item.__msh_item), =
self.makeNode(currVal));=0A=
							}=0A=
=0A=
							self.removeChild(self.getParent(loadingLabel.__msh_item, "R"));=0A=
						},=0A=
						onError : errorFunc=0A=
					});=0A=
				} else if(dataType =3D=3D "HTML"){=0A=
					Zapatec.Transport.fetchXmlDoc({=0A=
						url: url,=0A=
						method: "GET",=0A=
						onLoad: function(xmlDoc){=0A=
							var cNodes =3D xmlDoc.documentElement.childNodes;=0A=
=0A=
							for(var jj =3D 0; jj < cNodes.length; jj++){=0A=
								var currentNode =3D cNodes[jj];=0A=
=0A=
								if(currentNode.nodeType !=3D 1){=0A=
									continue;=0A=
								}=0A=
=0A=
								var li =3D self.makeNode(Zapatec.Tree.serializeNode(currentNode, =
true));=0A=
=0A=
								for (var ii =3D 0; ii < currentNode.attributes.length; ii++){=0A=
									var attr =3D currentNode.attributes[ii];=0A=
									if(attr.name =3D=3D 'class'){=0A=
										li.className =3D currentNode.getAttribute(attr.name);=0A=
									} else {=0A=
										li.setAttribute(attr.name, =
currentNode.getAttribute(attr.name));=0A=
									}=0A=
								}=0A=
=0A=
								self.appendChild(self.getParent(item.__msh_item), li);=0A=
							}=0A=
=0A=
							self.removeChild(self.getParent(loadingLabel.__msh_item, "R"));=0A=
						},=0A=
						onError : errorFunc=0A=
					});=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		return item;=0A=
	}=0A=
=0A=
	return null;=0A=
};=0A=
=0A=
/**=0A=
 * Call this function to collapse all items in the tree.=0A=
 */=0A=
Zapatec.Tree.prototype.collapseAll =3D function() {=0A=
	for (var i in this.trees){=0A=
		this.toggleItem(this._getTree(i).__msh_item, false, true);=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
 * Call this function to expand all items in the tree.=0A=
 */=0A=
Zapatec.Tree.prototype.expandAll =3D function() {=0A=
	for (var i in this.trees) {=0A=
		this.toggleItem(this._getTree(i).__msh_item, true, true);=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
 * Call this function to toggle all items in the tree.=0A=
 */=0A=
Zapatec.Tree.prototype.toggleAll =3D function() {=0A=
	for (var i in this.trees) {=0A=
		this.toggleItem(this._getTree(i).__msh_item);=0A=
	}=0A=
};=0A=
=0A=
/** =0A=
 * Call this function to synchronize the tree to a given item.  This =
means that=0A=
 * all items will be collapsed, except that item and the full path to it.=0A=
 * =0A=
 * @param item_id [string] -- the ID of the item to sync to.=0A=
 */=0A=
Zapatec.Tree.prototype.sync =3D function(item_id) {=0A=
	var item =3D this.items[item_id];=0A=
	=0A=
	if (item) {=0A=
		this.collapseAll();=0A=
		this.selectedItem =3D item;=0A=
		var a =3D [];=0A=
	=0A=
		while (item.__msh_parent) {=0A=
			a[a.length] =3D item;=0A=
			var pt =3D this._getTree(item.__msh_parent);=0A=
		=0A=
			if (pt.__msh_item){=0A=
				item =3D this.items[pt.__msh_item];=0A=
			} else {=0A=
				break;=0A=
			}=0A=
		}=0A=
=0A=
		for (var i =3D a.length; --i >=3D 0;){=0A=
			this.toggleItem(a[i].__msh_item, true);=0A=
		}=0A=
=0A=
		Zapatec.Utils.addClass(this.selectedItem, "tree-item-selected");=0A=
	}=0A=
};=0A=
=0A=
/** =0A=
 * Destroys the tree. Removes all elements. Does not destroy the =
Zapatec.Tree=0A=
 * object itself (actually there's no proper way in JavaScript to do =
that).=0A=
 */=0A=
Zapatec.Tree.prototype.destroy =3D function() {=0A=
	var p =3D this.top_parent;=0A=
	p.parentNode.removeChild(p);=0A=
};=0A=
=0A=
/** =0A=
 * \internal This function is used when "dynamic initialization" is on.  =
It=0A=
 * retrieves a reference to a subtree if already created, or creates it =
if it=0A=
 * wasn't yet and \b dont_call is \b false (returns null in that case).=0A=
 * =0A=
 * @param tree_id [string] the ID of the subtree=0A=
 * @param dont_call [boolean] pass true here if you don't want the =
subtree to be created=0A=
 * =0A=
 * @return reference to the tree if it was found or created, null =
otherwise.=0A=
 */=0A=
Zapatec.Tree.prototype._getTree =3D function(tree_id, dont_call) {=0A=
	var tree =3D this.trees[tree_id];=0A=
=0A=
	if (typeof(tree) =3D=3D "function") {=0A=
		if (dont_call){=0A=
			tree =3D null;=0A=
		} else {=0A=
			tree();=0A=
			tree =3D this.trees[tree_id];=0A=
			tree.__msh_state =3D false;=0A=
		}=0A=
	}=0A=
=0A=
	return tree;=0A=
};=0A=
=0A=
// CUSTOMIZABLE EVENT HANDLERS; default action is "do nothing"=0A=
=0A=
/** =0A=
 * Third party code can override this member in order to add an event =
handler=0A=
 * that gets called each time a tree item is selected.  It receives a =
single=0A=
 * string parameter containing the item ID.=0A=
 */=0A=
Zapatec.Tree.prototype.onItemSelect =3D function() {};=0A=
=0A=
// GLOBAL EVENT HANDLERS (to workaround the stupid Microsoft memory leak)=0A=
=0A=
/** =0A=
 * \internal This is a global event handler that gets called when a tree =
item=0A=
 * is clicked.  Don't override! ;-)=0A=
 */=0A=
Zapatec.Tree.onItemToggle =3D function() {=0A=
	var item =3D this;=0A=
	var body =3D document.body;=0A=
	var expand =3D false;=0A=
=0A=
	if(/tgb (minus|plus)/.test(this.className)) {=0A=
		expand =3D true;=0A=
	}=0A=
	=0A=
	while (item && item !=3D=3D body && !/tree-item/.test(item.className)){=0A=
		item =3D item.parentNode;=0A=
	}=0A=
=0A=
	Zapatec.Tree.all[item.__msh_tree].itemClicked(item.__msh_item, expand);=0A=
};=0A=
=0A=
/** \internal serialize Node object to text=0A=
*	@param currentNode [Node] - Node to serialize=0A=
*/=0A=
Zapatec.Tree.serializeNode =3D function(currentNode, omitTopLevel){=0A=
	if(currentNode =3D=3D null){=0A=
		return;=0A=
	}=0A=
=0A=
	if(currentNode.nodeType =3D=3D 3){ // text node=0A=
		return currentNode.nodeValue;=0A=
	}=0A=
=0A=
	if(omitTopLevel){=0A=
		var res =3D "";=0A=
=0A=
		if(currentNode.hasChildNodes()){=0A=
			for(var ii =3D 0; ii < currentNode.childNodes.length; ii++){=0A=
				res +=3D Zapatec.Tree.serializeNode(currentNode.childNodes[ii]);=0A=
			}=0A=
		}=0A=
	} else {=0A=
		var res =3D "<" + currentNode.tagName;=0A=
		=0A=
		for (var ii =3D 0; ii < currentNode.attributes.length; ii++){=0A=
			var attr =3D currentNode.attributes[ii];=0A=
			res +=3D " " + attr.name + "=3D\"" + =
currentNode.getAttribute(attr.name).replace(/"/g, '\\"') +  "\"";=0A=
		}=0A=
	    =0A=
		if(currentNode.hasChildNodes()){=0A=
			res +=3D ">";=0A=
	    =0A=
			for(var ii =3D 0; ii < currentNode.childNodes.length; ii++){=0A=
				res +=3D Zapatec.Tree.serializeNode(currentNode.childNodes[ii]);=0A=
			}=0A=
	    =0A=
			res +=3D "</" + currentNode.tagName + ">"=0A=
		} else {=0A=
			res +=3D "/>"=0A=
		}=0A=
	}=0A=
	    =0A=
	return res;=0A=
}=0A=
/**=0A=
 * \file transport.js=0A=
 * Zapatec Transport library.=0A=
 * Used to fetch data from the server, parse and serialize XML and JSON =
data.=0A=
 *=0A=
 * Copyright (c) 2004-2005 by Zapatec, Inc.=0A=
 * http://www.zapatec.com=0A=
 * 1700 MLK Way, Berkeley, California,=0A=
 * 94709, U.S.A.=0A=
 * All rights reserved.=0A=
 */=0A=
=0A=
if (typeof Zapatec =3D=3D 'undefined') {=0A=
  /**=0A=
   * Namespace definition.=0A=
   */=0A=
  Zapatec =3D {};=0A=
}=0A=
=0A=
/**=0A=
 * Namespace definition.=0A=
 */=0A=
Zapatec.Transport =3D {};=0A=
=0A=
// Determine most current versions of ActiveX objects available=0A=
if (typeof ActiveXObject !=3D 'undefined') {=0A=
=0A=
  /**=0A=
   * \internal String variable with most current version of XMLDOM =
ActiveX=0A=
   * object name available.=0A=
   */=0A=
  Zapatec.Transport.XMLDOM =3D null;=0A=
=0A=
  /**=0A=
   * \internal String variable with Most current version of XMLHTTP =
ActiveX=0A=
   * object name available.=0A=
   */=0A=
  Zapatec.Transport.XMLHTTP =3D null;=0A=
=0A=
  /**=0A=
   * \internal Returns first available ActiveX object name from the =
given list.=0A=
   *=0A=
   * \param arrVersions [object] list of ActiveX object names to test.=0A=
   * \return [string] first available ActiveX object name or null.=0A=
   */=0A=
  Zapatec.Transport.pickActiveXVersion =3D function(arrVersions) {=0A=
    for (var iVn =3D 0; iVn < arrVersions.length; iVn++) {=0A=
      try {=0A=
        var objDocument =3D new ActiveXObject(arrVersions[iVn]);=0A=
        // If it gets to this point, the string worked=0A=
        return arrVersions[iVn];=0A=
      } catch (objException) {};=0A=
    }=0A=
    return null;=0A=
  };=0A=
=0A=
  // Get most current version of XMLDOM ActiveX object=0A=
  Zapatec.Transport.XMLDOM =3D Zapatec.Transport.pickActiveXVersion([=0A=
    'Msxml2.DOMDocument.4.0',=0A=
    'Msxml2.DOMDocument.3.0',=0A=
    'MSXML2.DOMDocument',=0A=
    'MSXML.DOMDocument',=0A=
    'Microsoft.XMLDOM'=0A=
  ]);=0A=
=0A=
  // Get most current version of XMLHTTP ActiveX object=0A=
  Zapatec.Transport.XMLHTTP =3D Zapatec.Transport.pickActiveXVersion([=0A=
    'Msxml2.XMLHTTP.4.0',=0A=
    'MSXML2.XMLHTTP.3.0',=0A=
    'MSXML2.XMLHTTP',=0A=
    'Microsoft.XMLHTTP'=0A=
  ]);=0A=
=0A=
  // We don't need this any more=0A=
  Zapatec.Transport.pickActiveXVersion =3D null;=0A=
=0A=
}=0A=
=0A=
/**=0A=
 * Creates cross browser XMLHttpRequest object.=0A=
 *=0A=
 * \return [object] new XMLHttpRequest object.=0A=
 */=0A=
Zapatec.Transport.createXmlHttpRequest =3D function() {=0A=
  if (typeof XMLHttpRequest !=3D 'undefined') {=0A=
    return new XMLHttpRequest();=0A=
  }=0A=
  if (typeof ActiveXObject !=3D 'undefined') {=0A=
    try {=0A=
      return new ActiveXObject(Zapatec.Transport.XMLHTTP);=0A=
    } catch (objException) {};=0A=
  }=0A=
  return null;=0A=
};=0A=
=0A=
/**=0A=
 * Fetches specified URL using new XMLHttpRequest object.=0A=
 *=0A=
 * Asynchronous mode is used because it is safer and there is no risk of =
having=0A=
 * your script hang in case of network problem.=0A=
 *=0A=
 * When request is completed, one of provided callback functions is =
called:=0A=
 * onLoad on success or onError on error.=0A=
 *=0A=
 * onLoad callback function receives XMLHttpRequest object as argument =
and may=0A=
 * use its various properties like responseText, responseXML, etc.=0A=
 *=0A=
 * onError callback function receives following object:=0A=
 * {=0A=
 *   errorCode: server status number (404, etc.) [number],=0A=
 *   errorDescription: human readable error description [string]=0A=
 * }=0A=
 *=0A=
 * Note: Some browsers implement caching for GET requests. Caching can be=0A=
 * prevented by adding 'r=3D' + Math.random() parameter to URL.=0A=
 *=0A=
 * If you use POST method, content argument should be something like=0A=
 * 'var1=3Dvalue1&var2=3Dvalue2' with urlencoded values. If you wish to =
send other=0A=
 * content, set appropriate contentType. E.g. 'multipart/form-data', =
'text/xml',=0A=
 * etc.=0A=
 *=0A=
 * Server response should not contain non-ASCII characters.=0A=
 *=0A=
 * \param objArgs [object] associative array with arguments:=0A=
 * {=0A=
 *   url: relative or absolute URL to fetch [string],=0A=
 *   method: method ('GET', 'POST', 'HEAD', 'PUT') [string] (optional),=0A=
 *   contentType: content type when using POST [string] (optional),=0A=
 *   content: postable string or DOM object data when using POST=0A=
 *   [string or object] (optional),=0A=
 *   onLoad: function reference to call on success [function] (optional),=0A=
 *   onError: function reference to call on error [function] (optional),=0A=
 *   username: username [string] (optional),=0A=
 *   password: password [string] (optional)=0A=
 * }=0A=
 */=0A=
Zapatec.Transport.fetch =3D function(objArgs) {=0A=
  if (objArgs =3D=3D null || typeof objArgs !=3D 'object') {=0A=
    return;=0A=
  }=0A=
  if (!objArgs.url) {=0A=
    return;=0A=
  }=0A=
  if (!objArgs.method) {=0A=
    objArgs.method =3D 'GET';=0A=
  }=0A=
  if (!objArgs.contentType && objArgs.method.toUpperCase() =3D=3D =
'POST') {=0A=
    objArgs.contentType =3D 'application/x-www-form-urlencoded';=0A=
  }=0A=
  if (!objArgs.content) {=0A=
    objArgs.content =3D null;=0A=
  }=0A=
  if (!objArgs.onLoad) {=0A=
    objArgs.onLoad =3D null;=0A=
  }=0A=
  if (!objArgs.onError) {=0A=
    objArgs.onError =3D null;=0A=
  }=0A=
  // Request URL=0A=
  var objRequest =3D Zapatec.Transport.createXmlHttpRequest();=0A=
  if (objRequest =3D=3D null) {=0A=
    return;=0A=
  }=0A=
  /*=0A=
    IE 6 calls onreadystatechange and then raises an exception if local =
file is=0A=
    not found. This flag is used to prevent duplicate onError calls.=0A=
  */=0A=
  var boolErrorDisplayed =3D false;=0A=
  try {=0A=
    // Open request=0A=
    if (typeof objArgs.username !=3D 'undefined' &&=0A=
     typeof objArgs.password !=3D 'undefined') {=0A=
      objRequest.open(objArgs.method, objArgs.url, true,=0A=
       objArgs.username, objArgs.password);=0A=
    } else {=0A=
      objRequest.open(objArgs.method, objArgs.url, true);=0A=
    }=0A=
    // Set onreadystatechange handler=0A=
    objRequest.onreadystatechange =3D function () {=0A=
      if (objRequest.readyState =3D=3D 4) {=0A=
        // Request complete=0A=
        if (objRequest.status =3D=3D 200 || objRequest.status =3D=3D 304 =
||=0A=
         (location.protocol =3D=3D 'file:' && !objRequest.status)) {=0A=
          // OK or found, but determined unchanged and loaded from cache=0A=
          if (typeof objArgs.onLoad =3D=3D 'function') {=0A=
            objArgs.onLoad(objRequest);=0A=
          }=0A=
        } else if (!boolErrorDisplayed) {=0A=
          boolErrorDisplayed =3D true;=0A=
          // 404 Not found, etc.=0A=
          Zapatec.Transport.displayError(objRequest.status,=0A=
           'Error: Cannot fetch ' + objArgs.url + '.\n' +=0A=
           (objRequest.statusText || ''),=0A=
           objArgs.onError);=0A=
        }=0A=
      }=0A=
    };=0A=
    // Set content type if needed=0A=
    if (objArgs.contentType) {=0A=
      objRequest.setRequestHeader('Content-Type', objArgs.contentType);=0A=
    }=0A=
    // Send request=0A=
    objRequest.send(objArgs.content);=0A=
  } catch (objException) {=0A=
    if (!boolErrorDisplayed) {=0A=
      boolErrorDisplayed =3D true;=0A=
      if (objException.name &&=0A=
       objException.name =3D=3D 'NS_ERROR_FILE_NOT_FOUND') {=0A=
        Zapatec.Transport.displayError(0,=0A=
         'Error: Cannot fetch ' + objArgs.url + '.\nFile not found.',=0A=
         objArgs.onError);=0A=
      } else {=0A=
        Zapatec.Transport.displayError(0,=0A=
         'Error: Cannot fetch ' + objArgs.url + '.\n' +=0A=
         (objException.message || ''),=0A=
         objArgs.onError);=0A=
      }=0A=
    }=0A=
  };=0A=
};=0A=
=0A=
/**=0A=
 * Assigns passed HTML fragment to the specified element's innerHTML =
property=0A=
 * and evaluates in global scope javascripts found in the fragment.=0A=
 *=0A=
 * \param objArgs [object] following object:=0A=
 * {=0A=
 *   html: [string] HTML fragment,=0A=
 *   container: [object or string, optional] element or id of element to =
put=0A=
 *    HTML fragment into=0A=
 * }=0A=
 */=0A=
Zapatec.Transport.setInnerHtml =3D function(objArgs) {=0A=
  // Check arguments=0A=
  if (!objArgs || typeof objArgs.html !=3D 'string') {=0A=
    return;=0A=
  }=0A=
  var strHtml =3D objArgs.html;=0A=
  // Get container=0A=
  var objContainer =3D null;=0A=
  if (typeof objArgs.container =3D=3D 'string') {=0A=
    objContainer =3D document.getElementById(objArgs.container);=0A=
  } else if (typeof objArgs.container =3D=3D 'object') {=0A=
    objContainer =3D objArgs.container;=0A=
  }=0A=
  // Extract javascripts=0A=
  var arrScripts =3D [];=0A=
  var arrScript =3D null;=0A=
  while (arrScript =3D =
strHtml.match(/<script([^>]*)>([^<]*)<\/script>/)) {=0A=
    strHtml =3D strHtml.replace(/<script[^>]*>[^<]*<\/script>/, '');=0A=
    arrScripts.push(arrScript[2]);=0A=
  }=0A=
  // Set inner HTML=0A=
  if (objContainer) {=0A=
    // Opera hack=0A=
    objContainer.innerHTML =3D '<form></form>';=0A=
    objContainer.innerHTML =3D strHtml;=0A=
  }=0A=
  // Evaluate javascripts in global scope=0A=
  setTimeout(arrScripts.join(''), 0);=0A=
};=0A=
=0A=
/**=0A=
 * Fetches and parses XML document from the specified URL.=0A=
 *=0A=
 * Asynchronous mode is used because it is safer and there is no risk of =
having=0A=
 * your script hang in case of network problem.=0A=
 *=0A=
 * When XML document is fetched and parsed, one of provided callback =
functions=0A=
 * is called: onLoad on success or onError on error.=0A=
 *=0A=
 * onLoad callback function receives XMLDocument object as argument and =
may use=0A=
 * its documentElement and other properties.=0A=
 *=0A=
 * onError callback function receives following object:=0A=
 * {=0A=
 *   errorCode: error code [number],=0A=
 *   errorDescription: human readable error description [string]=0A=
 * }=0A=
 * Error code will be 0 unless Zapatec.Transport.fetch was used to fetch =
URL=0A=
 * and there was a problem during fetching.=0A=
 *=0A=
 * If method argument is not defined, more efficient XMLDOM in IE and=0A=
 * document.implementation.createDocument in Mozilla will be used to =
fetch=0A=
 * and parse document. Otherwise Zapatec.Transport.fetch will be used to =
fetch=0A=
 * document and Zapatec.Transport.parseXml to parse.=0A=
 *=0A=
 * Note: Some browsers implement caching for GET requests. Caching can be=0A=
 * prevented by adding 'r=3D' + Math.random() parameter to URL.=0A=
 *=0A=
 * If you use POST method, content argument should be something like=0A=
 * 'var1=3Dvalue1&var2=3Dvalue'. If you wish to send other content, set =
appropriate=0A=
 * contentType. E.g. to send XML string, you should set contentType: =
'text/xml'.=0A=
 *=0A=
 * Server response should not contain non-ASCII characters.=0A=
 *=0A=
 * \param objArgs [object] associative array with arguments:=0A=
 * {=0A=
 *   url: relative or absolute URL to fetch [string],=0A=
 *   method: method ('GET', 'POST', 'HEAD', 'PUT') [string] (optional),=0A=
 *   contentType: content type when using POST [string] (optional),=0A=
 *   content: postable string or DOM object data when using POST=0A=
 *   [string or object] (optional),=0A=
 *   onLoad: function reference to call on success [function],=0A=
 *   onError: function reference to call on error [function] (optional),=0A=
 *   username: username [string] (optional),=0A=
 *   password: password [string] (optional)=0A=
 * }=0A=
 */=0A=
Zapatec.Transport.fetchXmlDoc =3D function(objArgs) {=0A=
  if (objArgs =3D=3D null || typeof objArgs !=3D 'object') {=0A=
    return;=0A=
  }=0A=
  if (!objArgs.url) {=0A=
    return;=0A=
  }=0A=
  if (!objArgs.onLoad) {=0A=
    objArgs.onLoad =3D null;=0A=
  }=0A=
  if (!objArgs.onError) {=0A=
    objArgs.onError =3D null;=0A=
  }=0A=
  if (!objArgs.method && typeof objArgs.username =3D=3D 'undefined' &&=0A=
   typeof objArgs.password =3D=3D 'undefined') {=0A=
    // Try more efficient methods first=0A=
    if (document.implementation && =
document.implementation.createDocument) {=0A=
      // Mozilla=0A=
      var objDocument =3D document.implementation.createDocument('', '', =
null);=0A=
      if (objDocument.load) {=0A=
        // Opera 8.51 also has document.implementation, but hasn't =
implemented=0A=
        // XMLDOM load method yet=0A=
        objDocument.async =3D true;=0A=
        objDocument.onload =3D function() {=0A=
          Zapatec.Transport.onXmlDocLoad(objDocument, objArgs.onLoad,=0A=
           objArgs.onError);=0A=
        };=0A=
        try {=0A=
          objDocument.load(objArgs.url);=0A=
          return;=0A=
        } catch (objException) {=0A=
          if (objException.name &&=0A=
           objException.name =3D=3D 'NS_ERROR_FILE_NOT_FOUND') {=0A=
            Zapatec.Transport.displayError(0,=0A=
             'Error: Cannot fetch ' + objArgs.url + '.\nFile not found.',=0A=
             objArgs.onError);=0A=
          } else {=0A=
            Zapatec.Transport.displayError(0,=0A=
             'Error: Cannot fetch ' + objArgs.url + '.\n' +=0A=
             objException.toString(),=0A=
             objArgs.onError);=0A=
          }=0A=
        };=0A=
      }=0A=
    }=0A=
    if (typeof ActiveXObject !=3D 'undefined') {=0A=
      // IE=0A=
      try {=0A=
        var objDocument =3D new ActiveXObject(Zapatec.Transport.XMLDOM);=0A=
        objDocument.async =3D true;=0A=
        objDocument.onreadystatechange =3D function () {=0A=
          if (objDocument.readyState =3D=3D 4) {=0A=
            Zapatec.Transport.onXmlDocLoad(objDocument, objArgs.onLoad,=0A=
             objArgs.onError);=0A=
          }=0A=
        };=0A=
        objDocument.load(objArgs.url);=0A=
        return;=0A=
      } catch (objException) {};=0A=
    }=0A=
  }=0A=
  // Try XMLHttpRequest=0A=
  var objFetchArgs =3D {=0A=
    url: objArgs.url=0A=
  };=0A=
  if (typeof objArgs.method !=3D 'undefined') {=0A=
    objFetchArgs.method =3D objArgs.method;=0A=
  }=0A=
  if (typeof objArgs.contentType !=3D 'undefined') {=0A=
    objFetchArgs.contentType =3D objArgs.contentType;=0A=
  }=0A=
  if (typeof objArgs.content !=3D 'undefined') {=0A=
    objFetchArgs.content =3D objArgs.content;=0A=
  }=0A=
  objFetchArgs.onLoad =3D function(objRequest) {=0A=
    Zapatec.Transport.parseXml({=0A=
      strXml: objRequest.responseText,=0A=
      onLoad: objArgs.onLoad,=0A=
      onError: objArgs.onError=0A=
    });=0A=
  };=0A=
  objFetchArgs.onError =3D objArgs.onError;=0A=
  if (typeof objArgs.username !=3D 'undefined') {=0A=
    objFetchArgs.username =3D objArgs.username;=0A=
  }=0A=
  if (typeof objArgs.password !=3D 'undefined') {=0A=
    objFetchArgs.password =3D objArgs.password;=0A=
  }=0A=
  Zapatec.Transport.fetch(objFetchArgs);=0A=
};=0A=
=0A=
/**=0A=
 * Parses XML string into XMLDocument object.=0A=
 *=0A=
 * When XML string is parsed, one of provided callback functions is =
called:=0A=
 * onLoad on success or onError on error.=0A=
 * onLoad callback function receives XMLDocument object as argument and =
may use=0A=
 * its documentElement and other properties.=0A=
 * onError callback function receives following object:=0A=
 * {=0A=
 *   errorCode: error code [number],=0A=
 *   errorDescription: human readable error description [string]=0A=
 * }=0A=
 * Error code will be always 0.=0A=
 *=0A=
 * Returns XMLDocument object, so onLoad callback function is optional.=0A=
 * Returned value and its documentElement property should be checked =
before=0A=
 * use because they can be null or undefined.=0A=
 *=0A=
 * \param objArgs [object] associative array with arguments:=0A=
 * {=0A=
 *   strXml: XML string to parse [string],=0A=
 *   onLoad: function reference to call on success [function] (optional),=0A=
 *   onError: function reference to call on error [function] (optional)=0A=
 * }=0A=
 * \return [object] XMLDocument object or null.=0A=
 */=0A=
Zapatec.Transport.parseXml =3D function(objArgs) {=0A=
  if (objArgs =3D=3D null || typeof objArgs !=3D 'object') {=0A=
    return null;=0A=
  }=0A=
  if (!objArgs.strXml) {=0A=
    return null;=0A=
  }=0A=
  if (!objArgs.onLoad) {=0A=
    objArgs.onLoad =3D null;=0A=
  }=0A=
  if (!objArgs.onError) {=0A=
    objArgs.onError =3D null;=0A=
  }=0A=
  if (window.DOMParser) {=0A=
    // Mozilla=0A=
    try {=0A=
      var objDocument =3D (new =
DOMParser()).parseFromString(objArgs.strXml,=0A=
       'text/xml');=0A=
      Zapatec.Transport.onXmlDocLoad(objDocument, objArgs.onLoad,=0A=
       objArgs.onError);=0A=
      return objDocument;=0A=
    } catch (objException) {=0A=
      Zapatec.Transport.displayError(0,=0A=
       'Error: Cannot parse.\n' +=0A=
       'String does not appear to be a valid XML fragment.',=0A=
       objArgs.onError);=0A=
    };=0A=
    return null;=0A=
  }=0A=
  if (typeof ActiveXObject !=3D 'undefined') {=0A=
    // IE=0A=
    try {=0A=
      var objDocument =3D new ActiveXObject(Zapatec.Transport.XMLDOM);=0A=
      objDocument.loadXML(objArgs.strXml);=0A=
      Zapatec.Transport.onXmlDocLoad(objDocument, objArgs.onLoad,=0A=
       objArgs.onError);=0A=
      return objDocument;=0A=
    } catch (objException) {};=0A=
  }=0A=
};=0A=
=0A=
/**=0A=
 * \internal Checks if there were errors during XML document fetching and=0A=
 * parsing and calls onLoad or onError callback function correspondingly.=0A=
 *=0A=
 * \param objDocument [object] XMLDocument object.=0A=
 * \param onLoad [function] callback function provided by user.=0A=
 * \param onError [function] callback function provided by user.=0A=
 */=0A=
Zapatec.Transport.onXmlDocLoad =3D function(objDocument, onLoad, =
onError) {=0A=
  var strError =3D null;=0A=
  if (objDocument.parseError) {=0A=
    // Parsing error in IE=0A=
    strError =3D objDocument.parseError.reason;=0A=
    if (objDocument.parseError.srcText) {=0A=
      strError +=3D 'Location: ' + objDocument.parseError.url +=0A=
       '\nLine number ' + objDocument.parseError.line + ', column ' +=0A=
       objDocument.parseError.linepos + ':\n' +=0A=
       objDocument.parseError.srcText + '\n';=0A=
    }=0A=
  } else if (objDocument.documentElement &&=0A=
   objDocument.documentElement.tagName =3D=3D 'parsererror') {=0A=
    // If an error is caused while parsing, Mozilla doesn't throw an =
exception.=0A=
    // Instead, it creates an XML string containing the details of the =
error:=0A=
    // <parsererror xmlns=3D"http://www.w3.org/1999/xhtml">XML Parsing =
Error: ...=0A=
    // Check if strings has been generated.=0A=
    strError =3D objDocument.documentElement.firstChild.data + '\n' +=0A=
     objDocument.documentElement.firstChild.nextSibling.firstChild.data;=0A=
  } else if (!objDocument.documentElement) {=0A=
    strError =3D 'String does not appear to be a valid XML fragment.';=0A=
  }=0A=
  if (strError) {=0A=
    // Parsing error=0A=
    Zapatec.Transport.displayError(0,=0A=
     'Error: Cannot parse.\n' + strError,=0A=
     onError);=0A=
  } else {=0A=
    // Success=0A=
    if (typeof onLoad =3D=3D 'function') {=0A=
      onLoad(objDocument);=0A=
    }=0A=
  }=0A=
};=0A=
=0A=
/**=0A=
 * Serializes XMLDocument object into XML string.=0A=
 *=0A=
 * \param objDocument [object] XMLDocument object.=0A=
 * \return [string] XML string.=0A=
 */=0A=
Zapatec.Transport.serializeXmlDoc =3D function(objDocument) {=0A=
  if (window.XMLSerializer) {=0A=
    // Mozilla=0A=
    return (new XMLSerializer).serializeToString(objDocument);=0A=
  }=0A=
  if (objDocument.xml) {=0A=
    // IE=0A=
    return objDocument.xml;=0A=
  }=0A=
};=0A=
=0A=
/**=0A=
 * Fetches and parses JSON object from the specified URL.=0A=
 *=0A=
 * Asynchronous mode is used because it is safer and there is no risk of =
having=0A=
 * your script hang in case of network problem.=0A=
 *=0A=
 * When JSON object is fetched and parsed, one of provided callback =
functions=0A=
 * is called: onLoad on success or onError on error.=0A=
 *=0A=
 * onLoad callback function receives JSON object as argument.=0A=
 *=0A=
 * onError callback function receives following object:=0A=
 * {=0A=
 *   errorCode: error code [number],=0A=
 *   errorDescription: human readable error description [string]=0A=
 * }=0A=
 * Error code will be 0 unless there was a problem during fetching.=0A=
 *=0A=
 * Note: Some browsers implement caching for GET requests. Caching can be=0A=
 * prevented by adding 'r=3D' + Math.random() parameter to URL.=0A=
 *=0A=
 * If you use POST method, content argument should be something like=0A=
 * 'var1=3Dvalue1&var2=3Dvalue'. If you wish to send other content, set =
appropriate=0A=
 * contentType. E.g. to send XML string, you should set contentType: =
'text/xml'.=0A=
 *=0A=
 * Server response should not contain non-ASCII characters.=0A=
 *=0A=
 * \param objArgs [object] associative array with arguments:=0A=
 * {=0A=
 *   url: relative or absolute URL to fetch [string],=0A=
 *   reliable: false (string will be parsed) or true (evaluated) =
[boolean]=0A=
 *   (optional, false by default),=0A=
 *   method: method ('GET', 'POST', 'HEAD', 'PUT') [string] (optional),=0A=
 *   contentType: content type when using POST [string] (optional),=0A=
 *   content: postable string or DOM object data when using POST=0A=
 *   [string or object] (optional),=0A=
 *   onLoad: function reference to call on success [function],=0A=
 *   onError: function reference to call on error [function] (optional),=0A=
 *   username: username [string] (optional),=0A=
 *   password: password [string] (optional)=0A=
 * }=0A=
 */=0A=
Zapatec.Transport.fetchJsonObj =3D function(objArgs) {=0A=
  if (objArgs =3D=3D null || typeof objArgs !=3D 'object') {=0A=
    return;=0A=
  }=0A=
  if (!objArgs.url) {=0A=
    return;=0A=
  }=0A=
  var objFetchArgs =3D {=0A=
    url: objArgs.url=0A=
  };=0A=
  if (typeof objArgs.method !=3D 'undefined') {=0A=
    objFetchArgs.method =3D objArgs.method;=0A=
  }=0A=
  if (typeof objArgs.contentType !=3D 'undefined') {=0A=
    objFetchArgs.contentType =3D objArgs.contentType;=0A=
  }=0A=
  if (typeof objArgs.content !=3D 'undefined') {=0A=
    objFetchArgs.content =3D objArgs.content;=0A=
  }=0A=
  if (!objArgs.reliable) {=0A=
    objArgs.reliable =3D false;=0A=
  }=0A=
  if (!objArgs.onLoad) {=0A=
    objArgs.onLoad =3D null;=0A=
  }=0A=
  if (!objArgs.onError) {=0A=
    objArgs.onError =3D null;=0A=
  }=0A=
  objFetchArgs.onLoad =3D function(objRequest) {=0A=
    Zapatec.Transport.parseJson({=0A=
      strJson: objRequest.responseText,=0A=
      reliable: objArgs.reliable,=0A=
      onLoad: objArgs.onLoad,=0A=
      onError: objArgs.onError=0A=
    });=0A=
  };=0A=
  objFetchArgs.onError =3D objArgs.onError;=0A=
  if (typeof objArgs.username !=3D 'undefined') {=0A=
    objFetchArgs.username =3D objArgs.username;=0A=
  }=0A=
  if (typeof objArgs.password !=3D 'undefined') {=0A=
    objFetchArgs.password =3D objArgs.password;=0A=
  }=0A=
  Zapatec.Transport.fetch(objFetchArgs);=0A=
};=0A=
=0A=
/**=0A=
 * Parses JSON string into object.=0A=
 *=0A=
 * When JSON string is parsed, one of provided callback functions is =
called:=0A=
 * onLoad on success or onError on error.=0A=
 *=0A=
 * onLoad callback function receives JSON object as argument.=0A=
 *=0A=
 * onError callback function receives following object:=0A=
 * {=0A=
 *   errorCode: error code [number],=0A=
 *   errorDescription: human readable error description [string]=0A=
 * }=0A=
 * Error code will be always 0.=0A=
 *=0A=
 * Returns JSON object, so onLoad callback function is optional.=0A=
 * Returned value should be checked before use because it can be null.=0A=
 *=0A=
 * \param objArgs [object] associative array with arguments:=0A=
 * {=0A=
 *   strJson: XML string to parse [string],=0A=
 *   reliable: false (string will be parsed) or true (evaluated) =
[boolean]=0A=
 *   (optional, false by default),=0A=
 *   onLoad: function reference to call on success [function] (optional),=0A=
 *   onError: function reference to call on error [function] (optional)=0A=
 * }=0A=
 * \return [object] JSON object or null.=0A=
 */=0A=
Zapatec.Transport.parseJson =3D function(objArgs) {=0A=
  if (objArgs =3D=3D null || typeof objArgs !=3D 'object') {=0A=
    return null;=0A=
  }=0A=
  if (!objArgs.strJson) {=0A=
    return null;=0A=
  }=0A=
  if (!objArgs.reliable) {=0A=
    objArgs.reliable =3D false;=0A=
  }=0A=
  if (!objArgs.onLoad) {=0A=
    objArgs.onLoad =3D null;=0A=
  }=0A=
  if (!objArgs.onError) {=0A=
    objArgs.onError =3D null;=0A=
  }=0A=
  if (objArgs.reliable) {=0A=
    try {=0A=
      var objJson =3D eval('(' + objArgs.strJson + ')');=0A=
      if (typeof objArgs.onLoad =3D=3D 'function') {=0A=
        objArgs.onLoad(objJson);=0A=
      }=0A=
      return objJson;=0A=
    } catch (objException) {=0A=
      Zapatec.Transport.displayError(0,=0A=
       'Error: Cannot parse.\n' +=0A=
       'String does not appear to be a valid JSON fragment.',=0A=
       objArgs.onError);=0A=
    };=0A=
  } else {=0A=
    try {=0A=
      var objJson =3D Zapatec.Transport.parseJsonStr(objArgs.strJson);=0A=
      if (typeof objArgs.onLoad =3D=3D 'function') {=0A=
        objArgs.onLoad(objJson);=0A=
      }=0A=
      return objJson;=0A=
    } catch (objException) {=0A=
      Zapatec.Transport.displayError(0,=0A=
       'Error: Cannot parse.\n' +=0A=
       objException.message + '\n' + objException.text,=0A=
       objArgs.onError);=0A=
    };=0A=
  }=0A=
  return null;=0A=
};=0A=
=0A=
/**=0A=
 * \internal Parses JSON string into object.=0A=
 *=0A=
 * Was taken with changes from http://www.crockford.com/JSON/json.js.=0A=
 *=0A=
 * Throws exception if parsing error occurs.=0A=
 *=0A=
 * JSON format is described at http://www.crockford.com/JSON/js.html.=0A=
 *=0A=
 * \param text [string] JSON string to parse.=0A=
 * \return [object] JSON object.=0A=
 */=0A=
Zapatec.Transport.parseJsonStr =3D function(text) {=0A=
  var p =3D =
/^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|=
true|false|null)\s*/,=0A=
      token,=0A=
      operator;=0A=
  function error(m, t) {=0A=
      throw {=0A=
          name: 'JSONError',=0A=
          message: m,=0A=
          text: t || operator || token=0A=
      };=0A=
  }=0A=
  function next(b) {=0A=
      if (b && b !=3D operator) {=0A=
          error("Expected '" + b + "'");=0A=
      }=0A=
      if (text) {=0A=
          var t =3D p.exec(text);=0A=
          if (t) {=0A=
              if (t[2]) {=0A=
                  token =3D null;=0A=
                  operator =3D t[2];=0A=
              } else {=0A=
                  operator =3D null;=0A=
                  try {=0A=
                      token =3D eval(t[1]);=0A=
                  } catch (e) {=0A=
                      error("Bad token", t[1]);=0A=
                  }=0A=
              }=0A=
              text =3D text.substring(t[0].length);=0A=
          } else {=0A=
              error("Unrecognized token", text);=0A=
          }=0A=
      } else {=0A=
          // undefined changed to null because it is not supported in IE =
5.0=0A=
          token =3D operator =3D null;=0A=
      }=0A=
  }=0A=
  function val() {=0A=
      var k, o;=0A=
      switch (operator) {=0A=
      case '{':=0A=
          next('{');=0A=
          o =3D {};=0A=
          if (operator !=3D '}') {=0A=
              for (;;) {=0A=
                  if (operator || typeof token !=3D 'string') {=0A=
                      error("Missing key");=0A=
                  }=0A=
                  k =3D token;=0A=
                  next();=0A=
                  next(':');=0A=
                  o[k] =3D val();=0A=
                  if (operator !=3D ',') {=0A=
                      break;=0A=
                  }=0A=
                  next(',');=0A=
              }=0A=
          }=0A=
          next('}');=0A=
          return o;=0A=
      case '[':=0A=
          next('[');=0A=
          o =3D [];=0A=
          if (operator !=3D ']') {=0A=
              for (;;) {=0A=
                  o.push(val());=0A=
                  if (operator !=3D ',') {=0A=
                      break;=0A=
                  }=0A=
                  next(',');=0A=
              }=0A=
          }=0A=
          next(']');=0A=
          return o;=0A=
      default:=0A=
          if (operator !=3D=3D null) {=0A=
              error("Missing value");=0A=
          }=0A=
          k =3D token;=0A=
          next();=0A=
          return k;=0A=
      }=0A=
  }=0A=
  next();=0A=
  return val();=0A=
};=0A=
=0A=
/**=0A=
 * Serializes JSON object into JSON string.=0A=
 *=0A=
 * Was taken with changes from http://www.crockford.com/JSON/json.js.=0A=
 *=0A=
 * \param v [object] JSON object.=0A=
 * \return [string] JSON string.=0A=
 */=0A=
Zapatec.Transport.serializeJsonObj =3D function(v) {=0A=
  var a =3D [];=0A=
  /*=0A=
    Emit a string.=0A=
  */=0A=
  function e(s) {=0A=
      a[a.length] =3D s;=0A=
  }=0A=
  /*=0A=
    Convert a value.=0A=
  */=0A=
  function g(x) {=0A=
      var c, i, l, v;=0A=
      switch (typeof x) {=0A=
      case 'object':=0A=
          if (x) {=0A=
              if (x instanceof Array) {=0A=
                  e('[');=0A=
                  l =3D a.length;=0A=
                  for (i =3D 0; i < x.length; i +=3D 1) {=0A=
                      v =3D x[i];=0A=
                      if (typeof v !=3D 'undefined' &&=0A=
                              typeof v !=3D 'function') {=0A=
                          if (l < a.length) {=0A=
                              e(',');=0A=
                          }=0A=
                          g(v);=0A=
                      }=0A=
                  }=0A=
                  e(']');=0A=
                  return;=0A=
              } else if (typeof x.toString !=3D 'undefined') {=0A=
                  e('{');=0A=
                  l =3D a.length;=0A=
                  for (i in x) {=0A=
                      v =3D x[i];=0A=
                      if (x.hasOwnProperty(i) &&=0A=
                              typeof v !=3D 'undefined' &&=0A=
                              typeof v !=3D 'function') {=0A=
                          if (l < a.length) {=0A=
                              e(',');=0A=
                          }=0A=
                          g(i);=0A=
                          e(':');=0A=
                          g(v);=0A=
                      }=0A=
                  }=0A=
                  return e('}');=0A=
              }=0A=
          }=0A=
          e('null');=0A=
          return;=0A=
      case 'number':=0A=
          e(isFinite(x) ? +x : 'null');=0A=
          return;=0A=
      case 'string':=0A=
          l =3D x.length;=0A=
          e('"');=0A=
          for (i =3D 0; i < l; i +=3D 1) {=0A=
              c =3D x.charAt(i);=0A=
              if (c >=3D ' ') {=0A=
                  if (c =3D=3D '\\' || c =3D=3D '"') {=0A=
                      e('\\');=0A=
                  }=0A=
                  e(c);=0A=
              } else {=0A=
                  switch (c) {=0A=
                      case '\b':=0A=
                          e('\\b');=0A=
                          break;=0A=
                      case '\f':=0A=
                          e('\\f');=0A=
                          break;=0A=
                      case '\n':=0A=
                          e('\\n');=0A=
                          break;=0A=
                      case '\r':=0A=
                          e('\\r');=0A=
                          break;=0A=
                      case '\t':=0A=
                          e('\\t');=0A=
                          break;=0A=
                      default:=0A=
                          c =3D c.charCodeAt();=0A=
                          e('\\u00' + Math.floor(c / 16).toString(16) +=0A=
                              (c % 16).toString(16));=0A=
                  }=0A=
              }=0A=
          }=0A=
          e('"');=0A=
          return;=0A=
      case 'boolean':=0A=
          e(String(x));=0A=
          return;=0A=
      default:=0A=
          e('null');=0A=
          return;=0A=
      }=0A=
  }=0A=
  g(v);=0A=
  return a.join('');=0A=
};=0A=
=0A=
/**=0A=
 * \internal Displays error message.=0A=
 *=0A=
 * Calls onError callback function provided by user. If there is no =
onError=0A=
 * callback function, displays alert with human readable error =
description.=0A=
 * onError callback function receives following object:=0A=
 * {=0A=
 *   errorCode: error code [number],=0A=
 *   errorDescription: human readable error description [string]=0A=
 * }=0A=
 *=0A=
 * \param iErrCode [number] error code.=0A=
 * \param strError [string] human readable error description.=0A=
 * \param onError [function] callback function provided by user.=0A=
 */=0A=
Zapatec.Transport.displayError =3D function(iErrCode, strError, onError) =
{=0A=
  if (typeof onError =3D=3D 'function') {=0A=
    onError({=0A=
      errorCode: iErrCode,=0A=
      errorDescription: strError=0A=
    });=0A=
  } else {=0A=
    alert(strError);=0A=
  }=0A=
};=0A=
=0A=
/**=0A=
 * Translates a URL to the URL relative to the specified or to absolute =
URL.=0A=
 *=0A=
 * \param objArgs [object] associative array with arguments:=0A=
 * {=0A=
 *   url: absolute or relative URL to translate [string] (if absolute, =
will be=0A=
 *    returned as is),=0A=
 *   relativeTo: "url" will be translated to the URL relative to this =
absolute=0A=
 *    or relative URL [string] (optional, current page URL by default)=0A=
 * }=0A=
 * \return [string] translated URL=0A=
 */=0A=
Zapatec.Transport.translateUrl =3D function(objArgs) {=0A=
  if (objArgs =3D=3D null || typeof objArgs !=3D 'object') {=0A=
    return null;=0A=
  }=0A=
  if (!objArgs.url) {=0A=
    return null;=0A=
  }=0A=
  var strUrl =3D objArgs.url;=0A=
  // Check if it is absolute=0A=
  if (strUrl.charAt(0) =3D=3D '/' || strUrl.indexOf(':') >=3D 0) {=0A=
    return strUrl;=0A=
  }=0A=
  // Make relative to current page URL by default=0A=
  if (!objArgs.relativeTo) {=0A=
    objArgs.relativeTo =3D document.location.toString();=0A=
  }=0A=
  var arrUrl =3D strUrl.split('/');=0A=
  var arrRelativeTo =3D objArgs.relativeTo.split('/');=0A=
  // Remove file name=0A=
  arrRelativeTo.pop();=0A=
  // Form new URL=0A=
  for (var iToken =3D 0; iToken < arrUrl.length; iToken++) {=0A=
    var strToken =3D arrUrl[iToken];=0A=
    if (strToken =3D=3D '..') {=0A=
      arrRelativeTo.pop();=0A=
    } else if (strToken !=3D '.') {=0A=
      arrRelativeTo.push(strToken);=0A=
    }=0A=
  }=0A=
  return arrRelativeTo.join('/');=0A=
};=0A=
=0A=
/**=0A=
 * \internal Associative array to keep list of loaded JS files to prevent=0A=
 * duplicate loads.=0A=
 */=0A=
Zapatec.Transport.loadedJS =3D {};=0A=
=0A=
/**=0A=
 * Fetches JS file using fetch and evaluates it in global scope.=0A=
 *=0A=
 * When JS file is loaded successfully, onLoad callback function is =
called=0A=
 * without arguments. URL is added into Zapatec.Transport.loadedJS array=0A=
 * and will not be fetched again on next function call.=0A=
 *=0A=
 * onError callback function receives following object:=0A=
 * {=0A=
 *   errorCode: [number] server status number (404, etc.),=0A=
 *   errorDescription: [string] human readable error description=0A=
 * }=0A=
 *=0A=
 * One of the arguments: module or url is required. When url is passed,=0A=
 * module argument is ignored.=0A=
 *=0A=
 * If module argument is used, function gets all "script" elements using=0A=
 * getElementsByTagName and searches for the first element having "src"=0A=
 * attribute value ending with (relativeModule + ".js") (default =
relativeModule=0A=
 * value is "transport"). Path to the module is taken from that src =
attribute=0A=
 * value and will be the same as path to relativeModule file.=0A=
 *=0A=
 * \param objArgs [object] following object:=0A=
 * {=0A=
 *   url: [string, optional] absolute or relative URL of JS file,=0A=
 *   module: [string, optional] module name (file name without .js =
extension),=0A=
 *   relativeModule: [string, optional] search module in the same =
directory as=0A=
 *    relative module (default: 'transport') (file name without .js =
extension),=0A=
 *   onLoad: [function, optional] function reference to call on success,=0A=
 *   onError: [function, optional] function reference to call on error=0A=
 * }=0A=
 */=0A=
Zapatec.Transport.loadJS =3D function(objArgs) {=0A=
  if (!objArgs || typeof objArgs !=3D 'object') {=0A=
    return;=0A=
  }=0A=
  // Get URL of JS file=0A=
  var strUrl =3D null;=0A=
  if (objArgs.url) {=0A=
    strUrl =3D objArgs.url;=0A=
  } else if (objArgs.module) {=0A=
    var strPath =3D '';=0A=
    var strRelativeModule =3D 'transport.js';=0A=
    if (objArgs.relativeModule) {=0A=
      strRelativeModule =3D objArgs.relativeModule + '.js';=0A=
    }=0A=
    // Get path to module=0A=
    var arrScripts =3D document.getElementsByTagName('script');=0A=
    for (var iScript =3D 0; iScript < arrScripts.length; iScript++) {=0A=
      var strSrc =3D arrScripts[iScript].getAttribute('src') || '';=0A=
      var arrTokens =3D strSrc.split('/');=0A=
      // Remove last token=0A=
      var strLastToken =3D arrTokens.pop();=0A=
      if (strLastToken =3D=3D strRelativeModule) {=0A=
        strPath =3D arrTokens.join('/') + '/';=0A=
        break;=0A=
      }=0A=
    }=0A=
    strUrl =3D strPath + objArgs.module + '.js';=0A=
  } else {=0A=
    return;=0A=
  }=0A=
  // Get absolute URL of the JS file=0A=
  var strAbsoluteUrl =3D Zapatec.Transport.translateUrl({url: strUrl});=0A=
  // Check arguments=0A=
  if (!objArgs.onLoad) {=0A=
    objArgs.onLoad =3D null;=0A=
  }=0A=
  if (!objArgs.onError) {=0A=
    objArgs.onError =3D null;=0A=
  }=0A=
  // Check if it is already loaded=0A=
  if (Zapatec.Transport.loadedJS[strAbsoluteUrl]) {=0A=
    // onLoad callback=0A=
    if (typeof objArgs.onLoad =3D=3D 'function') {=0A=
      objArgs.onLoad();=0A=
    }=0A=
    return;=0A=
  }=0A=
  var arrScripts =3D document.getElementsByTagName('script');=0A=
  for (var iScript =3D 0; iScript < arrScripts.length; iScript++) {=0A=
    var strSrc =3D arrScripts[iScript].getAttribute('src') || '';=0A=
    if (strSrc =3D=3D strUrl) {=0A=
      // Add this URL to the list of loaded=0A=
      Zapatec.Transport.loadedJS[strAbsoluteUrl] =3D true;=0A=
      // onLoad callback=0A=
      if (typeof objArgs.onLoad =3D=3D 'function') {=0A=
        objArgs.onLoad();=0A=
      }=0A=
      return;=0A=
    }=0A=
  }=0A=
  // Load JS file=0A=
  Zapatec.Transport.fetch({=0A=
    url: strUrl,=0A=
    onLoad: function(objRequest) {=0A=
      // Can be loaded in two processes simultaneously=0A=
      if (!Zapatec.Transport.loadedJS[strAbsoluteUrl]) {=0A=
        // Evaluate code in global scope=0A=
        eval(objRequest.responseText);=0A=
        // Add this URL to the list of loaded=0A=
        Zapatec.Transport.loadedJS[strAbsoluteUrl] =3D true;=0A=
      }=0A=
      // onLoad callback=0A=
      if (typeof objArgs.onLoad =3D=3D 'function') {=0A=
        objArgs.onLoad();=0A=
      }=0A=
    },=0A=
    onError: objArgs.onError=0A=
  });=0A=
};=0A=
=0A=
/**=0A=
 * \internal Associative array to keep list of loaded CSS files to =
prevent=0A=
 * duplicate loads.=0A=
 */=0A=
Zapatec.Transport.loadedCss =3D {};=0A=
=0A=
/**=0A=
 * Fetches style sheet using fetch and loads it into the document.=0A=
 *=0A=
 * When stylesheet is loaded successfully, onLoad callback function is =
called=0A=
 * without arguments. URL is added into Zapatec.Transport.loadedCss array=0A=
 * and will not be fetched again on next function call.=0A=
 *=0A=
 * onError callback function receives following object:=0A=
 * {=0A=
 *   errorCode: server status number (404, etc.) [number],=0A=
 *   errorDescription: human readable error description [string]=0A=
 * }=0A=
 *=0A=
 * \param objArgs [object] associative array with arguments:=0A=
 * {=0A=
 *   url: absolute or relative URL of CSS file [string],=0A=
 *   onLoad: function reference to call on success [function] (optional),=0A=
 *   onError: function reference to call on error [function] (optional)=0A=
 * }=0A=
 */=0A=
Zapatec.Transport.loadCss =3D function(objArgs) {=0A=
  if (objArgs =3D=3D null || typeof objArgs !=3D 'object') {=0A=
    return;=0A=
  }=0A=
  // Check arguments=0A=
  if (!objArgs.url) {=0A=
    return;=0A=
  }=0A=
  if (!objArgs.onLoad) {=0A=
    objArgs.onLoad =3D null;=0A=
  }=0A=
  if (!objArgs.onError) {=0A=
    objArgs.onError =3D null;=0A=
  }=0A=
  // Get absolute URL of the CSS file=0A=
  var strAbsoluteUrl =3D Zapatec.Transport.translateUrl({url: =
objArgs.url});=0A=
  // Check if it is already loaded=0A=
  if (Zapatec.Transport.loadedCss[strAbsoluteUrl]) {=0A=
    // onLoad callback=0A=
    if (typeof objArgs.onLoad =3D=3D 'function') {=0A=
      objArgs.onLoad();=0A=
    }=0A=
    return;=0A=
  }=0A=
  var arrLinks =3D document.getElementsByTagName('link');=0A=
  for (var iLnk =3D 0; iLnk < arrLinks.length; iLnk++) {=0A=
    var strHref =3D arrLinks[iLnk].getAttribute('href') || '';=0A=
    if (strHref =3D=3D objArgs.url) {=0A=
      // Add this url to the list of loaded=0A=
      Zapatec.Transport.loadedCss[strAbsoluteUrl] =3D true;=0A=
      // onLoad callback=0A=
      if (typeof objArgs.onLoad =3D=3D 'function') {=0A=
        objArgs.onLoad();=0A=
      }=0A=
      return;=0A=
    }=0A=
  }=0A=
  // Load Zapatec.StyleSheet class definition=0A=
  Zapatec.Transport.loadJS({=0A=
    module: 'stylesheet',=0A=
    onLoad: function() {=0A=
      // Load CSS file=0A=
      Zapatec.Transport.fetch({=0A=
        url: objArgs.url,=0A=
        onLoad: function(objRequest) {=0A=
          // Parse CSS file.=0A=
          // Find URLs and translate them to absolute.=0A=
          // Find @import rules and load corresponding CSS files.=0A=
          var strCss =3D objRequest.responseText;=0A=
          var arrResultCss =3D [];=0A=
          // Will hold image URLs to preload=0A=
          var arrImgUrls =3D [];=0A=
          // Will hold CSS URLs to load=0A=
          var arrCssUrls =3D [];=0A=
          // Move first cursor to the beginning of the string=0A=
          var iPos =3D 0;=0A=
          // Move second cursor to the pattern=0A=
          var iNextPos =3D strCss.indexOf('url(', iPos);=0A=
          while (iNextPos >=3D 0) {=0A=
            // Move first cursor to the URL=0A=
            iNextPos +=3D 4;=0A=
            // Check if this is @import rule=0A=
            var strToken =3D strCss.substring(iPos, iNextPos);=0A=
            var boolIsImport =3D /@import\s+url\($/.test(strToken);=0A=
            // Add part of the string before URL=0A=
            arrResultCss.push(strToken);=0A=
            // Move second cursor to the new location to start the =
search from=0A=
            iPos =3D iNextPos;=0A=
            // Search the end of URL=0A=
            iNextPos =3D strCss.indexOf(')', iPos);=0A=
            if (iNextPos >=3D 0) {=0A=
              // Remove quotes=0A=
              var strImgUrl =3D strCss.substring(iPos, iNextPos);=0A=
              strImgUrl =3D strImgUrl.replace(/['"]/g, '');=0A=
              // Translate image URL relative to CSS file URL=0A=
              strImgUrl =3D Zapatec.Transport.translateUrl({=0A=
                url: strImgUrl,=0A=
                relativeTo: objArgs.url=0A=
              });=0A=
              // Convert to absolute URL=0A=
              strImgUrl =3D Zapatec.Transport.translateUrl({=0A=
                url: strImgUrl=0A=
              });=0A=
              // Add translated URL=0A=
              arrResultCss.push(strImgUrl);=0A=
              // Add URL to the list=0A=
              if (boolIsImport) {=0A=
                // Add CSS URL to load list=0A=
                arrCssUrls.push(strImgUrl);=0A=
              } else {=0A=
                // Add image URL to preload list=0A=
                arrImgUrls.push(strImgUrl);=0A=
              }=0A=
              // Move second cursor to the new location to start the =
search from=0A=
              iPos =3D iNextPos;=0A=
              // Search next pattern=0A=
              iNextPos =3D strCss.indexOf('url(', iPos);=0A=
            }=0A=
          }=0A=
          // Add the rest of string=0A=
          arrResultCss.push(strCss.substr(iPos));=0A=
          // Get translated CSS text=0A=
          strCss =3D arrResultCss.join('');=0A=
          // Load CSS files=0A=
          Zapatec.Transport.loadCssList({=0A=
            urls: arrCssUrls,=0A=
            onLoad: function() {=0A=
              // Add style sheet rules into the page=0A=
              var objStyleSheet =3D new Zapatec.StyleSheet();=0A=
              objStyleSheet.addParse(strCss);=0A=
              // onLoad callback=0A=
              if (typeof objArgs.onLoad =3D=3D 'function') {=0A=
                objArgs.onLoad();=0A=
              }=0A=
            }=0A=
          });=0A=
          // Add this URL to the list of loaded=0A=
          Zapatec.Transport.loadedCss[strAbsoluteUrl] =3D true;=0A=
        },=0A=
        onError: objArgs.onError=0A=
      });=0A=
    },=0A=
    onError: objArgs.onError=0A=
  });=0A=
};=0A=
=0A=
/**=0A=
 * Loads several CSS files one by one it into the document.=0A=
 *=0A=
 * This function behaves differently from other Zapatec.Transport =
functions.=0A=
 * onLoad callback function will be called in any case, even if errors =
occured=0A=
 * during loading. If there are multiple errors, onError callback =
function will=0A=
 * be called once for every passed URL that wasn't loaded successfully.=0A=
 *=0A=
 * onLoad callback function is called without arguments.=0A=
 *=0A=
 * onError callback function receives following object:=0A=
 * {=0A=
 *   errorCode: server status number (404, etc.) [number],=0A=
 *   errorDescription: human readable error description [string]=0A=
 * }=0A=
 *=0A=
 * \param objArgs [object] associative array with arguments:=0A=
 * {=0A=
 *   urls: array of absolute or relative URLs of CSS files to load =
[object]=0A=
 *    (files will be loaded in order they appear in the array),=0A=
 *   onLoad: function reference to call on completion [function] =
(optional),=0A=
 *   onError: function reference to call on error [function] (optional)=0A=
 * }=0A=
 */=0A=
Zapatec.Transport.loadCssList =3D function(objArgs) {=0A=
  if (objArgs =3D=3D null || typeof objArgs !=3D 'object') {=0A=
    return;=0A=
  }=0A=
  // Check arguments=0A=
  if (!objArgs.onLoad) {=0A=
    objArgs.onLoad =3D null;=0A=
  }=0A=
  if (!objArgs.onError) {=0A=
    objArgs.onError =3D null;=0A=
  }=0A=
  if (!objArgs.urls || !objArgs.urls.length) {=0A=
    // onLoad callback=0A=
    if (typeof objArgs.onLoad =3D=3D 'function') {=0A=
      objArgs.onLoad();=0A=
    }=0A=
    return;=0A=
  }=0A=
  // Get first URL in the array=0A=
  var strUrl =3D objArgs.urls.shift();=0A=
  // CSS file onLoad handler=0A=
  var funcOnLoad =3D function() {=0A=
    // Load the rest of URLs=0A=
    Zapatec.Transport.loadCssList({=0A=
      urls: objArgs.urls,=0A=
      onLoad: objArgs.onLoad,=0A=
      onError: objArgs.onError=0A=
    });=0A=
  };=0A=
  // Load CSS file=0A=
  Zapatec.Transport.loadCss({=0A=
    url: strUrl,=0A=
    onLoad: funcOnLoad,=0A=
    onError: function(objError) {=0A=
      Zapatec.Transport.displayError(objError.errorCode,=0A=
       objError.errorDescription, objArgs.onError);=0A=
      funcOnLoad();=0A=
    }=0A=
  });=0A=
};=0A=
=0A=
/**=0A=
 * \internal Array to hold image preloads.=0A=
 */=0A=
Zapatec.Transport.imagePreloads =3D [];=0A=
=0A=
/**=0A=
 * Preloads one or several images at once. See Zapatec.PreloadImages =
class=0A=
 * (utils/preloadimages.js) for details.=0A=
 *=0A=
 * \param objArgs [object] associative array with arguments:=0A=
 * {=0A=
 *   urls: [object] array of absolute or relative image URLs to preload,=0A=
 *   onLoad: [function, optional] onload event handler,=0A=
 *   timeout: [number, optional] number of milliseconds to wait for =
onload=0A=
 *    event before forcing it=0A=
 * }=0A=
 */=0A=
Zapatec.Transport.preloadImages =3D function(objArgs) {=0A=
  Zapatec.Transport.loadJS({=0A=
    module: 'preloadimages',=0A=
    onLoad: function() {=0A=
      Zapatec.Transport.imagePreloads.push(new =
Zapatec.PreloadImages(objArgs));=0A=
    }=0A=
  });=0A=
};=0A=

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/rus/content/view/left//(onload)/3258

[encoded data, 27192 characters]

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/var/kbl/storage/images/kabbalah/nauka_kabbala/spryyt_ktby_mqoblym/mihael_lajtman/sprym/knigi_predyduschih_izdanij/141511-7-rus-RU/knigi_predyduschih_izdanij_small.jpg

/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABGAGQDASIA
AhEBAxEB/8QAGwAAAgMBAQEAAAAAAAAAAAAABQYABAcDAgH/xAA1EAABAwMDAgMGBgICAwAAAAAB
AgMEAAURBhIhMVETIkEHFBVhgcEyQnGRsfAWM0SCksLR/8QAGQEAAwEBAQAAAAAAAAAAAAAAAgME
AQUA/8QAKREAAgIBBAECBQUAAAAAAAAAAQIAAxEEEiExIkFRBRMjMqEVQoGRsf/aAAwDAQACEQMR
AD8AxxhooaLm7ITVxuQ0+wULTtJ4BrzFiJdbxv6+lfQztOEgEg8ZqEAWE+4jySoliJpqRKT4kZ1D
mBlQ6YFU37jJtcgNsbMFIJCk5rQLKiDFbYTcoiVJfyAqMvkAcHNJ+pLcw5qt9MRJVDa2HaeCUk9K
YB4/U6gKTu8YWsWsmHHUouVu3oJAK2FeYfQ//aOXaXaXLhETEnoKFt7gl3yKTk9Dmh1h0hFnKQPB
nR3CM7kp8RH1xnFAdW2tTOrPh7a0kIbSAtflSepzz0qY6Sp1yoxKE1NiN3mN140q1Ntrkl1kIcCN
zchvkE+gJHBFIs/T863RhIW34jW7aVt8gds+oprZj3jTWk5sz/jrCU4S5vaXlQHIBrp/kEV7TbT8
hj3VZkISXErKkK4J6YyDQrXdQMKdy/mMFtdp8uDM+QujFnv0qzyQ4yrcg/jbV+FQ/vrTtN0nFvtq
jSI7jAeccCUyWCF+hOFgffmkS4adu1vW6XYinGmllCnWfOkEH5dPrRq6WjDDB9jNKleRyIxXWxW7
U0M3azoHip5kROige4H9z+tKXuDaE5DKcZweORXS3XWRa5qZMN7Y4n6gjsR6inBbELV0ZUy2JSzd
UJ3SIWf9ndSO/wDf1rfNBj0geJ5iozEbabG3CQrnB9KlXSwQEhSSCBgjHzqUvex9ZoUCB4i+BtUa
JFIDOSM/Imq1oVGTjxKvzVtBRDSdyVDpmqVfz24krDxzmOVoXDkW+O2ITbUgnPiIWFZA6jikLXOW
dVvoSojDaOh+VP8Apu6W2JZhGXZkpkrb8j4WDz34rPNXuIkavfK1bUEoBV2GBVPQxFDuaV7KIcra
pxtxS3dhKVpmbcHgglJ64+1LXtEuU0+0V5aVoU8tplJygYUccZ/er/s6FrYnpSq5BDRSSpxUTcUH
0G7FLut32ZGvpanHFeEAgbkDJwE8YocDbCH3TQb7hn2UqemQknxHWyVJaDRzvHQgkH9qXtYOxH9A
WlLaQ067MSdykp4AQc5Kf17Vavz8VPsrQyy66SuU1+NoJ8uevB5NBtZLV/idiR7+5JbL6i2laCna
No55/vFFMBmhabsJZtel1wJPL84lTgXngNq7dR9Ku2BCpltuD8mMnz3lxhDyDtyA6Rgj6dqr2N1J
jaEjhbCg3Jdc8i8DhsD1/Wu2lZSzpeGFOKV4+oXVDKs+UKdPHbpSjWGAzzCV2XoypqX2eWm4We5T
gylmRHbeeDrY2kbcdR0I61n7eh7lbXffYchzMV/apxs4UjCUq3Dv+MVtGopaWtIahBIz8OkY/wCy
iPtSs9cExINyIJSSuScj5JYSP4pb1EDCmOW3P3CAIzljea33aJLkTColbzKtoczzkjHXn0qVbkXi
RDEdlgp2iKwTlPr4Sc1Kl2MOM/iNyp5AmQspw0VAYAq0JHhpCykK2+h9aHpmEtlvHBqzGQJC0tKV
gKOCauGVBJkvBIAjLFvqZjcZCIjUcMgjLf5s96VL854t8krJ/MP4rSdP2fTkRkKkR3ZT2OEqcIGf
pQK72W2Sb7LdQyppKlDa2gnaniknWVAxy6S1uhOWk73HjRFRBASXVIKS94qgcn1x0NBr/wCNK1HK
U22teSnG1JPoKedP22029wLFuafX3eyoftXSa8F3uSpLbbe5QO1tIAHA6AdKS/xBMeIzGpoHJwxx
A8qz3ZWiWke4PoSqQ3+NOwHr3xXDUFjuXwizNeGgq3LO1LqSR0688U1zXVqtje9alEujqfkap3NY
zbRjp4hx/wCNK/UGPQjl0C+phfT9vnQn9OrdkRUGOl44U9vxkJGOAeasaZjuRrXZmXJTKima68Ut
pOclKz1OO9V25LcZUFT7rbQDbixvUE5HHTvQ616giIVZm2FOOlSlKyUFKR5fTPWiTUXOOBFtp6U7
MbNQLD2n7qjxFkORQjHTq4aATn4QgXD3hSQSZBG5Rzy7j/1FVp0m4XK2Sg4r3dhaI4AxySXOfnVQ
RkfC5b5HiKCXMuL5xuWs/aj+YfU8wlqGOF/ud5Uo+8q8HaUbGwOOzaR9qlGGLL4pcdfdbZK15QHO
CU4ABHy4qV7FZ5JkzA5MwlltxwgJSTR632x5JS6o4xziuUQobIwBRdpxR49MUd9zdCVafRfuaGoL
wAB7dqrSXCq6PH03fapBUEjK1JQj1Uo4FA52oIyLjIU0S4N2EqA4NQV0OzHAlPz60PkY6W88jOAK
F3G5w414kJfkJThYBHqOB6UGiannpBUwhpkYyFuYP7DvQBbc64XN18Idddcc3FeOp75p1WhwSbDi
T2a05+mI5X/U7DVrjot6XHHC7kuOoKU4wegPJ/WgF4vNxnLhlt91WxBADbYSBk54A+/NGE6fHuzD
tyX4q1ODDW4naAPU/YURmBtqVCbaQltCWSQlAwPxUa201cIuZi0XW8u2JVhWybKXGkzHVxgmE5lK
iVOKHPc8f3ijtjgQYUi3BhgBSWlqK1kqUeB36V78Bx1p95CRsZiHcrPTOcVZkuRbBNaCnSSLc4Ug
9VrOQAB9KR8x7eOhHiqusZ7M93DbHtbjkpYRh2MnB75Sf4NCAph6xF2UtaGnklDDAIBcUFKO4+u0
bq7vTUpaXdbykttlaFRImRncEgdfXOOaW3pSrhMLj6UeY8JSkYQOw7UxRtWLZi3E6SplxS955Liy
QDlJ4A7fKpV23QW5UNKl/lJQDnqBUpu0eokm4xIZWQRRVtxXhHB5x1qVKO0czp1nxgF1x1aCp15a
juwE+mKouf7T+tSpVyzhGMGn7P8AEVEuu7WUkFW0eY/IdqZghEea6yynY2hWEjsKlSuXrGJcg9Tq
6FRtzCMrKmoyc9XD/FfLrFMa+QGHFBRXHQo47KWalSoqh/krJ5EMahlptkG5sx2gFOMsNND8oJ55
obEhuvL+M3V4S3Gmdm3bwM5OB2FSpVhACgD1MhJO7+ID1Db5twUm5rfZcZSkbYziSEoGOgxQmPJb
giI8iOjaolbjZUSFc4xnr0qVKZS5evy95liBTke0d7PHQ7CK2PI0pxRQlXJAPIGfrUqVKI9yWf/Z

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/var/kbl/storage/images/kabbalah/vystavleno_na_sajte/spryyt_ktby_mqoblym/mihael_lajtman/sprym/knigi_predyduschih_izdanij/kniga_1_osnovnye_polozheniya/40271-6-rus-RU/kniga_1_osnovnye_polozheniya_small.gif

[encoded data, 11312 characters]

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/var/kbl/storage/images/kabbalah/vystavleno_na_sajte/spryyt_ktby_mqoblym/mihael_lajtman/sprym/knigi_predyduschih_izdanij/kniga_2_shema_mirozdaniya/40272-5-rus-RU/kniga_2_shema_mirozdaniya_small.gif

[encoded data, 11312 characters]

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/var/kbl/storage/images/kabbalah/vystavleno_na_sajte/spryyt_ktby_mqoblym/mihael_lajtman/sprym/knigi_predyduschih_izdanij/kniga_3_sistema_mirozdaniya/40273-5-rus-RU/kniga_3_sistema_mirozdaniya_small.gif

[encoded data, 11312 characters]

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/var/kbl/storage/images/kabbalah/nauka_kabbala/spryyt_ktby_mqoblym/mihael_lajtman/sprym/knigi_predyduschih_izdanij/kniga_4_postizhenie_vysshih_mirov/40275-8-rus-RU/kniga_4_postizhenie_vysshih_mirov_small.jpg

[encoded data, 4104 characters]

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/var/kbl/storage/images/kabbalah/nauka_kabbala/spryyt_ktby_mqoblym/mihael_lajtman/sprym/knigi_predyduschih_izdanij/kniga_9_vnutrennee_sozercanie__1/40280-6-rus-RU/kniga_9_vnutrennee_sozercanie_small.gif

[encoded data, 11552 characters]
C+SAF4gBF6CCXggIADs=

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/var/kbl/storage/images/kabbalah/nauka_kabbala/spryyt_ktby_mqoblym/mihael_lajtman/sprym/knigi_predyduschih_izdanij/kniga_10_plody_mudrosti/40281-7-rus-RU/kniga_10_plody_mudrosti_small.gif

[encoded data, 11552 characters]
C+SAF4gBF6CCXggIADs=

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/var/kbl/storage/images/kabbalah/nauka_kabbala/spryyt_ktby_mqoblym/mihael_lajtman/sprym/knigi_predyduschih_izdanij/kniga_11_voprosy_i_otvety_stat_i_lekcii_besedy/40282-6-rus-RU/kniga_11_voprosy_i_otvety_stat_i_lekcii_besedy_small.gif

[encoded data, 11552 characters]
C+SAF4gBF6CCXggIADs=

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/var/kbl/storage/images/kabbalah/nauka_kabbala/spryyt_ktby_mqoblym/mihael_lajtman/sprym/knigi_predyduschih_izdanij/kniga_12_raskrytie_tvorca/40283-8-rus-RU/kniga_12_raskrytie_tvorca_small.gif

[encoded data, 11172 characters]
AAA7

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/var/kbl/storage/images/kabbalah/nauka_kabbala/spryyt_ktby_mqoblym/mihael_lajtman/sprym/knigi_predyduschih_izdanij/kniga_13_stupeni_vozvysheniya/104289-9-rus-RU/kniga_13_stupeni_vozvysheniya_small.gif

[encoded data, 10412 characters]
Qte5C4BDAR0A3QB097OftaxpB9AA8WQAA2w5jxdCAAIoBAQAOw==

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/var/kbl/storage/images/kabbalah/vystavleno_na_sajte/spryyt_ktby_mqoblym/mihael_lajtman/sprym/knigi_predyduschih_izdanij/kniga_14_lestnica_v_nebo/40287-6-rus-RU/kniga_14_lestnica_v_nebo_small.gif

[encoded data, 10488 characters]
AQuAwH4h0CYG7AkB3rsRDDrAABCMSgAB2O+oCBCAgTzHvAchT0AAADs=

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/design/general/images/up.gif

R0lGODlhBwANAIABAAAAmf///yH5BAEAAAEALAAAAAAHAA0AAAISjGEJq8sf3Jk0RVsVvhj17QUF
ADs=

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/stylesheets/folder.css

#folder {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; FONT: =
16px/1.1 Verdana,Tahoma,Arial,sans-serif; PADDING-TOP: 0px; TEXT-ALIGN: =
justify
}
#folder H1 {
	PADDING-RIGHT: 20px; PADDING-LEFT: 20px; FONT-SIZE: 22px; =
PADDING-BOTTOM: 20px; MARGIN: -20px 0px 0px; COLOR: #004276; =
PADDING-TOP: 20px; TEXT-ALIGN: center
}
#folder #image IMG {
	FLOAT: left; MARGIN: 0px 20px 20px 0px
}
#folder #descr {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; FONT: 13px Verdana,Tahoma,Arial,sans-serif; TEXT-INDENT: 4ex; =
PADDING-TOP: 0px
}
#folder #descr P {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 6px; PADDING-TOP: 0px
}
#folder .hl {
	CLEAR: both; PADDING-RIGHT: 0px; BORDER-TOP: #006cc1 1px solid; =
PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 26px auto 10px; FONT: =
1px Verdana,sans-serif; WIDTH: 371px; PADDING-TOP: 0px; HEIGHT: 1px; =
TEXT-ALIGN: center
}
#folder .fitem {
	CLEAR: both; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: =
0px; MARGIN: 0px; FONT: 14px Arial, sans-serif; PADDING-TOP: 10px
}
#folder .fimage IMG {
	BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: =
none; BORDER-BOTTOM-STYLE: none
}
#folder .fitem A.fhdr {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; =
PADDING-BOTTOM: 0px; MARGIN: 0px; TEXT-TRANSFORM: uppercase; COLOR: =
#006cc1; PADDING-TOP: 0px; TEXT-DECORATION: none
}
#folder .fitem A.fhdr:visited {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; =
PADDING-BOTTOM: 0px; MARGIN: 0px; TEXT-TRANSFORM: uppercase; COLOR: =
#006cc1; PADDING-TOP: 0px; TEXT-DECORATION: none
}
#folder .fitem A.fhdr:hover {
	COLOR: #409957
}
#folder .fbook {
	CLEAR: both; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: right; =
PADDING-BOTTOM: 0px; MARGIN: 15px 0px 0px; FONT: 11px =
Verdana,sans-serif; PADDING-TOP: 0px
}
#folder .fbook A {
	CLEAR: both; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: =
0px; MARGIN: 15px 0px 0px; FONT: 11px Verdana,sans-serif; COLOR: =
#d03000; PADDING-TOP: 0px
}
#folder .fbook A:visited {
	CLEAR: both; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: =
0px; MARGIN: 15px 0px 0px; FONT: 11px Verdana,sans-serif; COLOR: =
#d03000; PADDING-TOP: 0px
}
#folder .fbook A:hover {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
15px 0px 0px; FONT: 11px Verdana,sans-serif; COLOR: #d03000; =
PADDING-TOP: 0px
}
#folder .fsdescr A {
	COLOR: #006cc1
}
#folder .fsdescr A:visited {
	COLOR: #006cc1
}
#folder .fsdescr A:hover {
	COLOR: #d03000
}
#folder .fimage {
	CLEAR: both; PADDING-RIGHT: 2px; DISPLAY: block; PADDING-LEFT: 2px; =
FLOAT: left; PADDING-BOTTOM: 2px; MARGIN: 10px 20px 5px 0px; FONT: 14px =
Arial, sans-serif; PADDING-TOP: 2px
}
#folder .fimage IMG {
	BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: =
none; BORDER-BOTTOM-STYLE: none
}
#folder .fsdescr P {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
10px 0px 0px; FONT: 13px Verdana,sans-serif; PADDING-TOP: 0px
}
#folder A.fmore {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: right; PADDING-BOTTOM: =
0px; MARGIN: 0px; FONT: 11px Verdana,sans-serif; COLOR: #d03000; =
PADDING-TOP: 0px
}
#folder A.read_more {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: right; PADDING-BOTTOM: =
0px; MARGIN: 0px; FONT: 11px Verdana,sans-serif; COLOR: #d03000; =
PADDING-TOP: 0px
}
#folder .tng {
	PADDING-RIGHT: 3px; PADDING-LEFT: 3px; FONT-WEIGHT: bold; FONT-SIZE: =
12px; PADDING-BOTTOM: 2px; MARGIN: 35px 0px 0px; TEXT-TRANSFORM: =
uppercase; WIDTH: 100%; COLOR: #ffffff; PADDING-TOP: 2px; =
BACKGROUND-COLOR: #0068bd
}
#folder .vtable {
	MARGIN: 0px auto
}
#folder .vtable IMG {
	BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: =
none; BORDER-BOTTOM-STYLE: none
}
#folder .fcol {
	BORDER-RIGHT: #ebebeb 2px solid; PADDING-RIGHT: 10px; BORDER-TOP: =
#ebebeb 2px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; =
VERTICAL-ALIGN: top; BORDER-LEFT: #ebebeb 2px solid; WIDTH: 50%; =
PADDING-TOP: 15px; BORDER-BOTTOM: #ebebeb 2px; HEIGHT: 100%
}
#folder .fcol .vfimage IMG {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: =
0px; MARGIN: 0px 15px 0px 0px; PADDING-TOP: 0px
}
#folder .scol .vfimage IMG {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: =
0px; MARGIN: 0px 15px 0px 0px; PADDING-TOP: 0px
}
#folder .scol {
	BORDER-RIGHT: #ebebeb 2px solid; PADDING-RIGHT: 10px; BORDER-TOP: =
#ebebeb 2px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; =
VERTICAL-ALIGN: top; BORDER-LEFT: #ebebeb 2px solid; WIDTH: 50%; =
PADDING-TOP: 15px; BORDER-BOTTOM: #ebebeb 2px; HEIGHT: 100%
}
#folder .vcol {
	BORDER-RIGHT: #ebebeb 2px solid; BORDER-TOP: #ebebeb 2px; BORDER-LEFT: =
#ebebeb 2px solid; BORDER-BOTTOM: #ebebeb 2px solid
}
#folder .vfimage IMG {
	BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: =
none; BORDER-BOTTOM-STYLE: none
}
#folder .vfitem {
	TEXT-ALIGN: left
}
#folder .vfitem A.fhdr {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 0px 5px; FONT: 13px Verdana,Tahoma,Arial,sans-serif; TEXT-TRANSFORM: =
uppercase; COLOR: #006cc1; PADDING-TOP: 0px; TEXT-DECORATION: none
}
#folder .vfitem A.fhdr:visited {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 0px 5px; FONT: 13px Verdana,Tahoma,Arial,sans-serif; TEXT-TRANSFORM: =
uppercase; COLOR: #006cc1; PADDING-TOP: 0px; TEXT-DECORATION: none
}
#folder .vcol A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
5px 0px 0px; PADDING-TOP: 0px
}
#news_archive {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
35px 20px 20px; FONT: 13px Verdana,Tahoma,Arial,sans-serif; PADDING-TOP: =
0px; TEXT-ALIGN: justify
}
#news_archive H1 {
	PADDING-RIGHT: 20px; PADDING-LEFT: 20px; FONT-SIZE: 22px; =
PADDING-BOTTOM: 20px; MARGIN: -20px 0px 0px; COLOR: #004276; =
PADDING-TOP: 20px; TEXT-ALIGN: center
}
#news_archive H3 {
	PADDING-RIGHT: 20px; PADDING-LEFT: 20px; FONT-SIZE: 15px; =
PADDING-BOTTOM: 20px; COLOR: #004173; PADDING-TOP: 20px; TEXT-ALIGN: =
center
}
#news_archive .date {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; COLOR: #000; PADDING-TOP: 0px
}
#news_archive .litem {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
20px 0px 0px; PADDING-TOP: 0px
}
#news_archive A.nline {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; =
PADDING-BOTTOM: 0px; MARGIN: 0px; COLOR: #006cc1; PADDING-TOP: 0px
}
#news_archive .ntext {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; COLOR: #000; PADDING-TOP: 0px
}
#news_archive .hl {
	CLEAR: both; BORDER-TOP: #006cc1 1px solid; FONT-SIZE: 1px; MARGIN: =
0px; WIDTH: 500px; HEIGHT: 1px; TEXT-ALIGN: center
}
#news_archive .fitem {
	CLEAR: both; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 14px; =
PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 20px
}
#news_archive .fitem A.fhdr {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; =
PADDING-BOTTOM: 0px; MARGIN: 0px; TEXT-TRANSFORM: uppercase; COLOR: =
#009; PADDING-TOP: 0px; TEXT-DECORATION: none
}
#news_archive .fitem A.fhdr:hover {
	COLOR: #d03000
}
#news_archive .fsdescr A.fmore:hover {
	COLOR: #d03000
}
#news_archive .fimage {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: =
0px; MARGIN: 10px 20px 5px 0px; PADDING-TOP: 0px
}
#news_archive .fsdescr P {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 13px; PADDING-BOTTOM: =
0px; MARGIN: 10px 0px 0px; PADDING-TOP: 0px
}
#news_archive A.fmore {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 11px; FLOAT: right; =
PADDING-BOTTOM: 0px; MARGIN: 15px 0px 0px; COLOR: #d03000; PADDING-TOP: =
0px
}

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/stylesheets/embed_image.css

DIV.Embed {
=09
}
DIV.object-center {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 15px; MARGIN: =
10px 0px; PADDING-TOP: 15px; TEXT-ALIGN: center
}
DIV.object-left {
	CLEAR: left; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; =
PADDING-BOTTOM: 5px; MARGIN: 0px; PADDING-TOP: 5px
}
DIV.object_description A {
	BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: =
0px
}
DIV.object_description A:hover {
	BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: =
0px
}
DIV.object_description P {
	MARGIN: 0px auto
}
DIV.object_description A IMG {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px =
auto; BORDER-TOP-STYLE: none; PADDING-TOP: 5px; BORDER-RIGHT-STYLE: =
none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none
}
DIV.object_description A IMG:hover {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px =
auto; BORDER-TOP-STYLE: none; PADDING-TOP: 5px; BORDER-RIGHT-STYLE: =
none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none
}
DIV.object_name {
	FONT-WEIGHT: bold
}
DIV.object_description A {
	TEXT-DECORATION: none
}
DIV.object_name A {
	TEXT-DECORATION: none
}

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/stylesheets/general.css

HTML {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; FONT: 13px Verdana,Tahoma,Arial,sans-serif; WIDTH: 710px; =
PADDING-TOP: 0px; HEIGHT: 100%
}
BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; FONT: 13px Verdana,Tahoma,Arial,sans-serif; WIDTH: 710px; =
PADDING-TOP: 0px; HEIGHT: 100%
}
#up {
	CLEAR: both; PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; =
PADDING-BOTTOM: 15px; MARGIN: 0px; FONT: 12px =
Verdana,Tahoma,Arial,sans-serif; PADDING-TOP: 15px; TEXT-ALIGN: center
}
#up IMG {
	BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: =
none; BORDER-BOTTOM-STYLE: none
}
#up A {
	COLOR: #004276
}
#up A:visited {
	COLOR: #004276
}
#up A:hover {
	COLOR: #d03000
}
.clearfix:unknown {
	CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: =
"."
}
* HTML .clearfix {
	HEIGHT: 1%
}
#folder {
	MARGIN: 27px 40px 0px; WIDTH: 630px
}

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/stylesheets/footer.css

#footer {
	CLEAR: both; PADDING-RIGHT: 0px; BORDER-TOP: #006cc1 1px solid; =
PADDING-LEFT: 0px; PADDING-BOTTOM: 20px; MARGIN: -10px 0px 0px 38px; =
WIDTH: 630px; PADDING-TOP: 18px
}
.links {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 15px; MARGIN: =
0px; FONT: 11px Verdana, sans-serif; COLOR: #004276; PADDING-TOP: 0px; =
TEXT-ALIGN: center
}
.links A {
	FONT: bold 11px Verdana, sans-serif; COLOR: #004276; TEXT-DECORATION: =
none
}
.links A:hover {
	FONT: bold 11px Verdana, sans-serif; COLOR: #004276; TEXT-DECORATION: =
none
}
.links A:visited {
	FONT: bold 11px Verdana, sans-serif; COLOR: #004276; TEXT-DECORATION: =
none
}
.links A:hover {
	COLOR: #004276
}
.copyright {
	MARGIN: 0px auto; FONT: 10px Tahoma, sans-serif; WIDTH: 550px; COLOR: =
#000; TEXT-ALIGN: center
}
.copyright A {
	COLOR: #000; TEXT-DECORATION: underline
}
.copyright A:hover {
	COLOR: red
}
.links A:hover {
	COLOR: red
}
.copyright #zapatec {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
FONT: 8px Tahoma, sans-serif; COLOR: silver; PADDING-TOP: 0px; =
BORDER-RIGHT-WIDTH: 0px
}
.copyright #zapatec A {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
FONT: 8px Tahoma, sans-serif; COLOR: silver; PADDING-TOP: 0px; =
BORDER-RIGHT-WIDTH: 0px
}

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/stylesheets/panel.css

#panel {
	PADDING-RIGHT: 0px; BORDER-TOP: #ccc 1px solid; PADDING-LEFT: 0px; =
PADDING-BOTTOM: 0px; MARGIN: 20px auto 30px; WIDTH: 550px; PADDING-TOP: =
0px; BORDER-BOTTOM: #ccc 1px solid
}
#panel A {
	COLOR: #000! important
}
#panel A.lonclass {
	COLOR: #f00! important
}
#panel IMG {
	BORDER-RIGHT: 0px; BORDER-TOP: 0px; VERTICAL-ALIGN: top; BORDER-LEFT: =
0px; BORDER-BOTTOM: 0px
}
.tronclass {
	TEXT-DECORATION: none
}
.troffclass {
	TEXT-DECORATION: none
}
.lonclass {
	TEXT-DECORATION: none
}
.loffclass {
	TEXT-DECORATION: none
}
.tronclass {
	FONT: 11px Verdana,serif
}
.troffclass {
	FONT: 11px Verdana,serif
}
.lonclass {
	FONT: 11px Verdana,serif
}
.loffclass {
	FONT: 11px Verdana,serif
}
.toconclass {
	FONT: 11px Verdana,serif
}
.tocoffclass {
	FONT: 11px Verdana,serif
}
.lessonclass {
	FONT: 11px Verdana,serif
}
.lessoffclass {
	FONT: 11px Verdana,serif
}
.loffclass {
	COLOR: #000
}
.lonclass {
	COLOR: #f00
}
.tronclass {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 3px; BACKGROUND-COLOR: #fff
}
.troffclass {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 3px; BACKGROUND-COLOR: #fff
}
.toconclass {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 3px; BACKGROUND-COLOR: #fff
}
.tocoffclass {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 3px; BACKGROUND-COLOR: #fff
}
.lessonclass {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 3px; BACKGROUND-COLOR: #fff
}
.lessoffclass {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 3px; BACKGROUND-COLOR: #fff
}
.troffclass {
	COLOR: #006cc1
}
.tocoffclass {
	COLOR: #006cc1
}
.lessoffclass {
	COLOR: #006cc1
}
.tronclass {
	COLOR: red
}
.toconclass {
	COLOR: red
}
.lessonclass {
	COLOR: red
}

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-css
Content-Transfer-Encoding: 7bit
Content-Location: http://www.kabbalah.info/design/general/stylesheets/path.css

DIV#path {
	MARGIN-BOTTOM: 25px; FONT: 11px Verdana,Tahoma,Arial,sans-serif
}
DIV#path SPAN {
	PADDING-RIGHT: 10px; FONT-WEIGHT: bold
}

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/stylesheets/panel_print.css

#panel {
	DISPLAY: none
}
.lonclass {
	TEXT-DECORATION: none
}
.loffclass {
	TEXT-DECORATION: none
}
.tronclass {
	FONT: 11px Verdana,serif
}
.troffclass {
	FONT: 11px Verdana,serif
}
.lonclass {
	FONT: 11px Verdana,serif
}
.loffclass {
	FONT: 11px Verdana,serif
}
.toconclass {
	FONT: 11px Verdana,serif
}
.tocoffclass {
	FONT: 11px Verdana,serif
}
.lessonclass {
	FONT: 11px Verdana,serif
}
.lessoffclass {
	FONT: 11px Verdana,serif
}
.loffclass {
	COLOR: #000
}
.lonclass {
	COLOR: #f00
}
.tronclass {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 3px; BACKGROUND-COLOR: #fff
}
.troffclass {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 3px; BACKGROUND-COLOR: #fff
}
.toconclass {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 3px; BACKGROUND-COLOR: #fff
}
.tocoffclass {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 3px; BACKGROUND-COLOR: #fff
}
.lessonclass {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 3px; BACKGROUND-COLOR: #fff
}
.lessoffclass {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 3px; BACKGROUND-COLOR: #fff
}
.troffclass {
	COLOR: #006cc1
}
.tocoffclass {
	COLOR: #006cc1
}
.lessoffclass {
	COLOR: #006cc1
}
.tronclass {
	COLOR: red
}
.toconclass {
	COLOR: red
}
.lessonclass {
	COLOR: red
}

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/stylesheets/updates.css

#updates {
	MARGIN: 25px 20px 20px
}
#updates H2 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 5px; FONT: bold 12px Verdana,Tahoma,Arial,sans-serif; COLOR: =
#004276; PADDING-TOP: 0px; TEXT-ALIGN: left
}
#updates .mnth {
	CLEAR: both; MARGIN: 10px 0px; FONT: bold 16px =
Verdana,Tahoma,Arial,sans-serif; COLOR: #004276; TEXT-ALIGN: left
}
#updates .iname {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 2px; FONT: bold 12px Verdana,Tahoma,Arial,sans-serif; PADDING-TOP: =
0px
}
#updates TD.date {
	PADDING-RIGHT: 5px; PADDING-LEFT: 0px; FONT-SIZE: 11px; PADDING-BOTTOM: =
0px; MARGIN: 0px 3px 0px 0px; VERTICAL-ALIGN: top; WIDTH: 80px; =
PADDING-TOP: 2px; TEXT-ALIGN: center
}
#updates TD.name {
	PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; =
VERTICAL-ALIGN: top; WIDTH: 450px; PADDING-TOP: 2px; TEXT-ALIGN: justify
}
#updates TD.ilang {
	PADDING-RIGHT: 2px; PADDING-LEFT: 2px; FONT-SIZE: 11px; PADDING-BOTTOM: =
2px; VERTICAL-ALIGN: bottom; WIDTH: 180px; PADDING-TOP: 2px; TEXT-ALIGN: =
left
}
#updates A {
	FONT: 11px Verdana,Tahoma,Arial,sans-serif; COLOR: #006cc1
}
#updates A:hover {
	FONT: 11px Verdana,Tahoma,Arial,sans-serif; COLOR: #006cc1
}
#updates A:visited {
	FONT: 11px Verdana,Tahoma,Arial,sans-serif; COLOR: #006cc1
}
#updates .obtype {
	FONT: bold 12px Verdana,Tahoma,Arial,sans-serif
}
#updates .section A {
	FONT: bold 11px Verdana,Tahoma,Arial,sans-serif; COLOR: green
}
#updates .section A:hover {
	FONT: bold 11px Verdana,Tahoma,Arial,sans-serif; COLOR: green
}
#updates .section A:visited {
	FONT: bold 11px Verdana,Tahoma,Arial,sans-serif; COLOR: green
}
#updates H1 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 5px; FONT: bold 20px Verdana,Tahoma,Arial,sans-serif; COLOR: =
#004276; PADDING-TOP: 0px; TEXT-ALIGN: center
}

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-js
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/javascript/milonic_src.js

/*

Milonic DHTML Menu - JavaScript Website Navigation System.
Version 5.742 - Built: Wednesday January 25 2006 - 9:17
Copyright 2006 (c) Milonic Solutions Limited. All Rights Reserved.
This is a commercial software product, please visit =
http://www.milonic.com/ for more information.
See http://www.milonic.com/license.php for Commercial License Agreement
All Copyright statements must always remain in place in all files at all =
times
*******  PLEASE NOTE: THIS IS NOT FREE SOFTWARE, IT MUST BE LICENSED FOR =
ALL USE  *******=20

License Details:=0A=
 Number: 194087=0A=
    URL: www.kabbalahscience.com=0A=
   Type: Professional=0A=
  Dated: Tuesday June 21 2005

*/


_mD=3D2;_d=3Ddocument;_dB=3D_d.body;_n=3Dnavigator;_L=3Dlocation;_nv=3D$t=
L(_n.appVersion);_nu=3D$tL(_n.userAgent);_ps=3DparseInt(_n.productSub);_f=
=3Dfalse;_t=3Dtrue;_toL=3D_X=3D_Y=3D_n=3Dnull;_W=3Dwindow;$$=3D" =
";Z$=3D"";_wp=3D_W.createPopup;ie=3D(_d.all)?_t:_f;ie4=3D(!_d.getElementB=
yId&&ie)?_t:_f;ie5=3D(!ie4&&ie&&!_wp)?_t:_f;ie55=3D(!ie4&&ie&&_wp)?_t:_f;=
ns6=3D(_nu.indexOf("gecko")!=3D-1)?_t:_f;konq=3D(_nu.indexOf("konqueror")=
!=3D-1)?_t:_f;sfri=3D(_nu.indexOf("safari")!=3D-1)?_t:_f;if(konq||sfri){_=
ps=3D0;ns6=3D0}ns4=3D(_d.layers)?_t:_f;ns61=3D(_ps>=3D20010726)?_t:_f;ns7=
=3D(_ps>=3D20020823)?_t:_f;ns72=3D(_ps>=3D20040804)?_t:_f;op=3D(_W.opera)=
?_t:_f;if(op||konq)ie=3D0;op5=3D(_nu.indexOf("opera =
5")!=3D-1)?_t:_f;op6=3D(_nu.indexOf("opera =
6")!=3D-1||_nu.indexOf("opera/6")!=3D-1)?_t:_f;op7=3D((op&&_W.opera.versi=
on&&_W.opera.version()>6)||_nu.indexOf("opera =
7")!=3D-1||_nu.indexOf("opera/7")!=3D-1)?_t:_f;mac=3D(_nv.indexOf("mac")!=
=3D-1)?_t:_f;if(ns6||ns4||op||sfri)mac=3D_f;ns60=3D_f;if(ns6&&!ns61)ns60=3D=
_t;if(op7)op=3D_f;IEDtD=3D0;if(!op&&((_d.all||ns7)&&_d.compatMode=3D=3D"C=
SS1Compat")||(mac&&_d.doctype&&_d.doctype.name.indexOf(".dtd")!=3D-1))IED=
tD=3D1;_jv=3D"javascript:void(0)";inEditMode=3D_rstC=3DinDragMode=3D_d.dn=
e=3Dlcl=3D$R=3D$mD=3D_mcnt=3D_sL=3D_sT=3D_ofMT=3D_oldbW=3D_bW=3D_oldbH=3D=
_bl=3D_el=3D_st=3D_en=3D_cKA=3D0;_startM=3D_c=3D1;_trueItemRef=3DfocusedM=
enu=3Dt_=3D_itemRef=3D_mn=3D-1;_zi=3D_aN=3D_bH=3D999;if(op)ie55=3D_f;B$=3D=
"absolute";$O=3D"menu";$5=3D"hidden";_d.write("<style>.milonic{width:1px;=
visibility:hidden;position:absolute}</style>");function =
_StO(_fnc,_ms){return =
setTimeout(_fnc,_ms)}tTipt=3DZ$;_m=3D[];_mi=3D[];_sm=3D[];_tsm=3D[];_cip=3D=
[];$S3=3D"2E636F6D2F";$S4=3D"646D2E706870";_MT=3D_StO(Z$,0);_oMT=3D_StO(Z=
$,0);_cMT=3D_StO(Z$,0);_mst=3D_StO(Z$,0);_Mtip=3D_StO(Z$,0);$u=3D"undefin=
ed =
";lNum=3D194087;lURL=3D"www.kabbalahscience.com";lVer=3D"5.742";_Lhr=3D_L=
.href;$6=3D"visible";if(op5){$5=3D$tU($5);$6=3D$tU($6)}function =
M_hideLayer(){}function _oTree(){}function mmMouseMove(){}function =
_cL(){}function _TtM(){}function _ocURL(){}function mmClick(){}function =
autoOT(){}function _iF0C(){}function showtip(){}function =
isEditMode(){}function hidetip(){}function mmVisFunction(){}function =
doMenuResize(){}function _p7(_ar,_dta){var =
_tar=3D[];for(_a=3D0;_a<_ar.length;_a++){if(_ar[_a]!=3D_dta){_tar[_tar.le=
ngth]=3D_ar[_a]}}return _tar}function copyOf(_w){for(_cO in =
_w){this[_cO]=3D_w[_cO]}}function $tL($v){if($v)return =
$v.toLowerCase()}function $tU($v){if($v)return $v.toUpperCase()}function =
$pU($v){if($v)return parseInt($v)}function =
drawMenus(){_startM=3D1;_oldbH=3D0;_oldbW=3D0;for(_y=3D_mcnt;_y<_m.length=
;_y++){o$(_y,1)}}_$S=3D{menu:0,text:1,url:2,showmenu:3,status:4,onbgcolor=
:5,oncolor:6,offbgcolor:7,offcolor:8,offborder:9,separatorcolor:10,paddin=
g:11,fontsize:12,fontstyle:13,fontweight:14,fontfamily:15,high3dcolor:16,=
low3dcolor:17,pagecolor:18,pagebgcolor:19,headercolor:20,headerbgcolor:21=
,subimagepadding:22,subimageposition:23,subimage:24,onborder:25,ondecorat=
ion:26,separatorsize:27,itemheight:28,image:29,imageposition:30,imagealig=
n:31,overimage:32,decoration:33,type:34,target:35,align:36,imageheight:37=
,imagewidth:38,openonclick:39,closeonclick:40,keepalive:41,onfunction:42,=
offfunction:43,onbold:44,onitalic:45,bgimage:46,overbgimage:47,onsubimage=
:48,separatorheight:49,separatorwidth:50,separatorpadding:51,separatorali=
gn:52,onclass:53,offclass:54,itemwidth:55,pageimage:56,targetfeatures:57,=
visitedcolor:58,pointer:59,imagepadding:60,valign:61,clickfunction:62,bor=
dercolor:63,borderstyle:64,borderwidth:65,overfilter:66,outfilter:67,marg=
in:68,pagebgimage:69,swap3d:70,separatorimage:71,pageclass:72,menubgimage=
:73,headerborder:74,pageborder:75,title:76,pagematch:77,rawcss:78,fileima=
ge:79,clickcolor:80,clickbgcolor:81,clickimage:82,clicksubimage:83,imageu=
rl:84,pagesubimage:85,dragable:86,clickclass:87,clickbgimage:88,imagebord=
erwidth:89,overseparatorimage:90,clickseparatorimage:91,pageseparatorimag=
e:92,menubgcolor:93,opendelay:94,tooltip:95,disabled:96,dividespan:97,tip=
delay:98,tipfollow:99,tipmenu:100};function mm_style(){for($i in =
_$S)this[$i]=3D_n;this.built=3D0}_$M=3D{items:0,name:1,top:2,left:3,itemw=
idth:4,screenposition:5,style:6,alwaysvisible:7,align:8,orientation:9,kee=
palive:10,openstyle:11,margin:12,overflow:13,position:14,overfilter:15,ou=
tfilter:16,menuwidth:17,itemheight:18,followscroll:19,menualign:20,mm_cal=
lItem:21,mm_obj_ref:22,mm_built:23,menuheight:24,ignorecollision:25,divid=
es:26,zindex:27,opendelay:28,resizable:29,minwidth:30,maxwidth:31};functi=
on menuname(name){for($i in =
_$M)this[$i]=3D_n;this.name=3D$tL(name);_c=3D1;_mn++}function =
f_(_it){_mi[_bl]=3D[];for($i in =
_x[6])if(_x[6][$i])_mi[_bl][_$S[$i]]=3D_x[6][$i];_mi[_bl][0]=3D_mn;_it=3D=
_it.split(";");_sc=3DZ$;for(_a=3D0;_a<_it.length;_a++){_sp=3D_it[_a].inde=
xOf("`");if(_sp!=3D-1){_sc=3D";";_tI=3D_it[_a];if(_sp=3D=3D_it[_a].lastIn=
dexOf("`")){for(_b=3D_a;_b<_it.length;_b++){if(_it[_b+1]){_tI+=3D";"+_it[=
_b+1];_a++;if(_it[_b+1].indexOf("`")!=3D-1)_b=3D_it.length}}}_it[_a]=3D_t=
I.replace(/`/g,Z$)}_sp=3D_it[_a].indexOf("=3D");if(_sp=3D=3D-1){if(_it[_a=
])_si=3D_si+";"+_it[_a]+_sc}else{_si=3D_it[_a].slice(_sp+1);_w=3D_it[_a].=
slice(0,_sp);if(_w=3D=3D"showmenu")_si=3D$tL(_si)}if(_it[_a]&&_$S[_w]){_m=
i[_bl][_$S[_w]]=3D_si}}_m[_mn][0][_c-2]=3D_bl;_c++;_bl++}_c=3D0;function =
ami(txt){_t=3Dthis;if(_c=3D=3D1){_c++;_m[_mn]=3D[];_x=3D_m[_mn];for($i =
in =
_t)_x[_$M[$i]]=3D_t[$i];_x[21]=3D-1;_x[0]=3D[];if(!_x[12])_x[12]=3D0;_S=3D=
_m[_mn][6];_M=3D_m[_mn];if(_M[15]=3D=3D_n)_M[15]=3D_S.overfilter;if(_M[16=
]=3D=3D_n)_M[16]=3D_S.outfilter;_S[65]=3D(_S.borderwidth)?$pU(_S.borderwi=
dth):0;_S[64]=3D_S.borderstyle;_S[63]=3D_S.bordercolor;if(_W.ignoreCollis=
ions)_M[25]=3D1;if(!_S.built){_WzI=3D_zi;if(_W.menuZIndex){_WzI=3D_W.menu=
ZIndex;_zi=3D_WzI}lcl++;_vC=3D_S.visitedcolor;if(_vC){_oC=3D_S.offcolor;i=
f(!_oC)_oC=3D"#000000";if(!_vC)_vC=3D"#ff0000";_Lcl=3D"<style>.g_"+lcl+":=
link{color:"+_oC+"}.g_"+lcl+":visited{color:"+_vC+"}</style>";_d.write(_L=
cl);_S.g_=3D"g_"+lcl}_S.built=3D1}}f_(txt)}menuname.prototype.aI=3Dami;=0A=

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-js
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/javascript/tocmenu.js

/*=0A=
   Milonic DHTML Menu HTML Unordered List Based Module version 1.3 - =
20th October 2005=0A=
   This module is only compatible with the Milonic DHTML Menu version =
5.7 or higher=0A=
=0A=
   Copyright 2004 (c) Milonic Solutions Limited. All Rights Reserved.=0A=
   This is a commercial software product, please visit =
http://www.milonic.com/ for more information.=0A=
   =0A=
   The object of this module is to enable data entered as a HTML =
un-ordered list to be used inside menus.=0A=
   Data for menu items is taken from HTML Lists and used for menus. =
Styles are created as normal DHTML Menus and referenced as a CSS =
classname.=0A=
*/=0A=
=0A=
_y5=3D0;=0A=
_y3=3Dnew Array();=0A=
_y2=3D0;=0A=
_y1=3D0;=0A=
for(_a=3D0;_a<_d.links.length;_a++){=0A=
_y4=3D_d.links[_a];=0A=
	pE=3D_y4.parentNode;=0A=
	if(pE.tagName=3D=3D"LI"){=0A=
		while(pE){=0A=
			if(pE.tagName=3D=3D"UL"){=0A=
				=0A=
				if(!pE.id){=0A=
					=0A=
					pE.id=3D"mmenu"+_y5;=0A=
					pE.style.display=3D"none"=0A=
					_y3[_y5]=3Dnew Array();=0A=
					=
if(_y1)_y3[_y1][_y3[_y1].length-1]+=3D";showmenu=3Dlistmenu"+_y5+";";=0A=
					if(pE.className)_y3[_y5].menuStyle=3DpE.className=0A=
					_y5++;=0A=
				}=0A=
				break;=0A=
			}=0A=
			pE=3DpE.parentNode;=0A=
		}=0A=
		_y1=3DpE.id.substr(5,3);=0A=
		if(sfri||ie)txt=3D_y4.innerHTML;else txt=3D_y4.text;=0A=
		txt =3D txt.replace(/;/g,'\\\;');=0A=
		txt =3D txt.replace(/"/g,'\\\"');=0A=
		txt =3D txt.replace(/'/g,'\\\'');=0A=
		_y4.href.replace(/;/g,'\\\;');=0A=
		_y4.href.replace(/"/g,'\\\"');=0A=
		if (txt =3D=3D "") {=0A=
			_y3[_y1][_y3[_y1].length]=3D"type=3Dheader;text=3D ;"=0A=
		}else{=0A=
			_y3[_y1][_y3[_y1].length]=3D"type=3Dtree;text=3D"+txt+";"=0A=
		}=0A=
		=
if(_y4.href.substr(_y4.href.length-1,1)!=3D"#")_y3[_y1][_y3[_y1].length-1=
]+=3D"url=3D"+_y4+";"=0A=
		_y2++;=0A=
	}=0A=
}=0A=
_y6=3D"";=0A=
for(_a=3D0;_a<_y3.length;_a++){=0A=
	_y6+=3D"with(milonic=3Dnew menuname('TOC')){"=0A=
	if(_y3[_a].menuStyle)_y6+=3D"style=3D"+_y3[_a].menuStyle+";";else =
_y6+=3D"style=3Dtoc;orientation=3D'vertical';overflow=3D'scroll';";=0A=
	len =3D _y3[_a].length - 1;=0A=
	for(_b=3D0;_b<=3Dlen;_b++){=0A=
		_y6+=3D"aI(\""+_y3[_a][_b]+"\");\r\n"=0A=
	}=0A=
	_y6+=3D"}"=0A=
}=0A=
=0A=
_d.write("<script>"+_y6.replace(/\n/g,"")+"<\/script>")=0A=

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/x-js
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kabbalah.info/design/general/javascript/services.js

function SaveAs(filename)=0A=
{=0A=
	if (navigator.appName =3D=3D "Microsoft Internet Explorer" && =
navigator.appVersion >=3D "4.0")=0A=
		document.execCommand('SaveAs', 1, filename);=0A=
	else=0A=
		alert("Hit CTRL-S to save this page");=0A=
	//var Fso =3D new ActiveXObject("Scripting.FileSystemObject");=0A=
}=0A=
=0A=
=0A=
function AddBookmark(location_href, document_title)=0A=
{=0A=
	// We'd like to return people to a 'frame' view, not to a 'full' one=0A=
	if (!location_href.match('/clean/'))=0A=
		location_href =3D location_href.replace('/full/', '/frame/');=0A=
	if (navigator.appName =3D=3D "Microsoft Internet Explorer" && =
navigator.appVersion >=3D "4.0")=0A=
		window.external.AddFavorite(location_href, document_title);=0A=
	else=0A=
		window.sidebar.addPanel(document_title, location_href, "");=0A=
}=0A=
=0A=

------=_NextPart_000_0233_01C97405.87D85510
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://www.kabbalah.info/rus/content/view/full/3161

[encoded data, 75692 characters]

------=_NextPart_000_0233_01C97405.87D85510--
