
//	Zav.throttle()				// Ošetří nekontrolované spouštění funkce v krátkém časovém úseku za sebou
//	Zav.loadScript()				// Načte externí soubor javascriptu
//	Zav.loadScriptString()		// Vloží kód javascritpu do stránky
//	Zav.loadStyles()				// Načte externí soubor css a vloží jej do stránky
//	Zav.loadStyleString()			// Vloží kód css do stránky
//	Zav.getWindowDimensions()		// Vrací šířku a výšku viditelné plochy prohlížeče
//	Zav.getPageDimensions()			// Vrací šířku a výšku plochy prohlížeče včetně scrollování
//	Zav.getPageScrolling()			// Vrací hodnotu odscrolování stránky
//	Zav.getQueryStringLocation()		// Vrací objekt obsahující záznamy argumentů dotazovacího řetězce objektu location

var Zav = {

		throttle:					function ( method, context ) {
			
			clearTimeout(method.__timeoutId__);
			
			method.__timeoutId__ = setTimeout(function() {
				
				method.call(context);
			}, 80);
		},
		
		loadScript:					function ( url ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.loadScript"});
		
		        var script = Zav.Dom.CE("script");
		        script.type = "text/javascript";
		        script.src = url;
		
		        Zav.Dom.appendChild(document.body,script);
		},

		loadScriptString:			function ( code ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.loadScriptString"});
		
		        var script = Zav.Dom.CE("script");
		        script.type = "text/javascript";
		
		        try {
		            Zav.Dom.appendChild(script,Zav.Dom.CTN(code));
		        }
		        catch (ex) {
		            script.text = code;
		        }
		
		        Zav.Dom.appendChild(document.body,script);
		},
	
		loadStyles:					function ( url ) {
	
		        System.Console.log({type: "functionEntry", functionName: "Zav.loadStyles"});
		
		        var link, head;
		
		        link = Zav.Dom.CE("link");
		        link.rel = "stylesheet";
		        link.type = "text/css";
		        link.href = url;
		
		        head = document.getElementsByTagName("head")[0];
		        Zav.Dom.appendChild(head,link);
		},
	
		loadStyleString:			function ( css ) {
	
		        System.Console.log({type: "functionEntry", functionName: "Zav.loadStyleString"});
		
		        var style, head;
		
		        style = Zav.Dom.CE("style");
		        style.type = "text/css";
		
		        try {
		            style.appendChild(Zav.Dom.CTN(css));
		        }
		        catch (ex) {
		            style.styleSheet.cssText = css;
		        }
		
		        head = document.getElementsByTagName("head")[0];
		        head.appendChild(style);
		},

                getWindowDimensions:                    function ( ) {

                        // vsechny prohlizece mimo IE
                        if (window.innerWidth) {

                                Zav.getWindowDimensions = function() {
                                        return {
                                                width:  window.innerWidth,
                                    height: window.innerHeight
                                };
                            };
                        }

                        // IE
                        else if (System.Client.Browser.Ie) {

                                Zav.getWindowDimensions = function() {
                                        var docEl = document.documentElement;
                                return {
                                        width:  docEl.clientWidth,
                                    height: docEl.clientHeight
                                };
                            };
                        }

                        // ostatni prohlizece
                        else if (document.body) {

                                Zav.getWindowDimensions = function() {
                                        var docBody = document.body;
                                return {
                                        width:  docBody.clientWidth,
                                    height: docBody.clientHeight
                                    };
                            };
                        }

                        return Zav.getWindowDimensions();
                },

                getPageDimensions:                      function ( ) {

                        var dimensions  = Zav.getWindowDimensions(),
                        scrolling   = Zav.getPageScrolling();

                                return {
                                        width:  dimensions.width  + scrolling.width,
                            height: dimensions.height + scrolling.height
                        };
                },

                getPageScrolling:                       function ( ) {

                        var scrOfX = 0, scrOfY = 0;

                        if( typeof( window.pageYOffset ) == 'number' ) {
                            //Netscape compliant
                            scrOfY = window.pageYOffset;
                            scrOfX = window.pageXOffset;
                        }

                        else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
                            //DOM compliant
                            scrOfY = document.body.scrollTop;
                            scrOfX = document.body.scrollLeft;
                        }

                        else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
                            //IE6 standards compliant mode
                            scrOfY = document.documentElement.scrollTop;
                            scrOfX = document.documentElement.scrollLeft;
                        }

                        return {
                                width:  scrOfX,
                                height: scrOfY
                        };
                },

                getQueryStringLocation:                 function ( ) {

                        var ls = location.search,
                            qs,
                            args = {},
                            items, item, name, value;

                        qs = ls.length > 0
                            ? ls.substring(1)
                            : null;

                        if(qs == null) {
                            return {};
                        }

                        items = qs.split("&");
                        item = null;
                        name = null;
                        value = null;

                        for (var i = 0, length = items.length; i < length; i++) {
                            item = items[i].split("=");
                            name = decodeURIComponent(item[0]);
                            value = decodeURIComponent(item[1]);
                            args[name] = value;
                        }

                        return args;
                }
};

//Zav.Event.addHandler()				// Přidá obsluhu události
//Zav.Event.removeHandler				// Odstraní obsluhu události
//Zav.Event.getEvent()					// Vrací odkaz na objekt event
//Zav.Event.getTarget()					// Vrací cíl události
//Zav.Event.preventDefault()			// Zastaví výchozí chování události
//Zav.Event.stopPropagation()			// Zastaví probublávání události
//Zav.Event.getDocumentMousePosition()	// Vrací pozici myši vzhledem k dokumentu
//Zav.Event.getScreenMousePosition()	// Vrací pozici myši na obrazovce
//Zav.Event.getModifierKey()			// Vrací seznam stisknutých modifikačních kláves
//Zav.Event.getRelatedTarget()			// Vrací související element
//Zav.Event.getMouseButton()			// Vrací kód stisknutého tlačítka myši
//Zav.Event.getWheelDelta()				// Vrací hodnotu whileDelta při otáčení kolečka myši
//Zav.Event.isMouseOutside()			// Zjišťuje, zda myš opustila hranice elementu
//Zav.Event.getKeyName()				// Vrací název stisknuté klávesy
//Zav.Event.getCharCode()				// Vrací kód stisknuté klávesy
//Zav.Event.getCharSymbol()				// Vrací znak stisknuté klávesy
//Zav.Event.keyCodeList					// Seznam zkrácených názvů klávesy

Zav.Event = {

		addHandler:					function ( el, type, handler ) {

		        if (el.addEventListener && !System.Client.Browser.Ie) { //IE9 jako jediny podporuje addEventListener, ale ma problemy napr. s image.onload...
		                Zav.Event.addHandler = function ( el, type, handler ) {
		
		                    System.Console.log({type: "functionEntry", functionName: "Zav.Event.addHandler"});
		
		                    if(type == "mouseleave") {
		                        type = "mouseout";
		                    }
		                    if(type == "mousewheel") { // přidání totožné metody pro Firefox
		                        Zav.Event.addHandler(el, "DOMMouseScroll", handler);
		                    }
		                    el.addEventListener(type, handler, false);
		                };
		        }
		        else {  //(IE - el.attachEvent)
		                Zav.Event.addHandler = function ( el, type, handler ) {
		
		                    System.Console.log({type: "functionEntry", functionName: "Zav.Event.addHandler"});
//pridano kvuli problemum window.onload v IETesteru, pred nasazenim na ostrou verzi mozno odstranit
//		                    if(!el["on" + type]) {
		                        el["on" + type] = function() {
		                            var event = window.event;
		                                event.currentTarget = el;
		                            for(var i = 0, length = el["IEon" + type].length; i < length; i++) {
		                                el["IEon" + type][i](event);
		                            }
		                        };
//		                    }
		                    if(!el["IEon" + type]) {
		                        el["IEon" + type] = [];
		                    }
		                    el["IEon" + type].push(handler);
		                };
		        }
		        return Zav.Event.addHandler(el, type, handler);
		},

		removeHandler:				function ( el, type, handler ) {

		        if(el.removeEventListener) {
		                Zav.Event.removeHandler = function ( el, type, handler ) {
		
		                    System.Console.log({type: "functionEntry", functionName: "Zav.Event.removeHandler"});
		
		                    el.removeEventListener(type, handler, false);
		                };
		        }
		        else {  //(IE - el.attachEvent)
		                Zav.Event.removeHandler = function ( el, type, handler ) {
		
		                    System.Console.log({type: "functionEntry", functionName: "Zav.Event.removeHandler"});
		
		                    if(el["IEon" + type]) {
		                        for(var i = 0, length = el["IEon" + type].length; i < length; i++) {
		                            if(el["IEon" + type][i] == handler) {
		                                el["IEon" + type].splice(i,1);
		                            }
		                        }
		                        if(el["IEon" + type].length == 0) {
		                            el["on" + type] = null;
		                        }
		                    }
		                };
		        }
		        return Zav.Event.removeHandler(el, type, handler);
		},

		getEvent:					function ( event ) {

				return event || window.event;
		},

		getTarget:					function ( event ) {

				return event.target || event.srcElement;
		},

		preventDefault:				function ( event ) {

		        if (event.preventDefault) {
		                Zav.Event.preventDefault = function( event ) {
		
		                        event.preventDefault();
		                };
		
		        }
		        else {
		                Zav.Event.preventDefault = function( event ) {
		
		                        event.returnValue = false;
		                };
		        }
		
		        return Zav.Event.preventDefault(event);
		},

		stopPropagation:			function ( event ) {

		        if (event.stopPropagation) {
		                Zav.Event.stopPropagation = function( event ) {
		
		                        event.stopPropagation();
		                };
		
		        }
		        else {
		                Zav.Event.stopPropagation = function( event ) {
		
		                        event.cancelBubble = true;
		                };
		        }
		
		        return Zav.Event.stopPropagation(event);
		},

		getDocumentMousePosition:	function ( event ) {

		        if (event.pageX) {
		            Zav.Event.getDocumentMousePosition = function( event ) {
		
		                    return {
		                        left:   event.pageX,
		                        top:    event.pageY
		                    };
		            };
		        }
		
		        else {
		            Zav.Event.getDocumentMousePosition = function( event ) {
		
		                    return {
		                        left:   (event.clientX + document.body.scrollLeft
		                                    - document.body.clientLeft),
		                        top:    (event.clientY + document.body.scrollTop
		                                    - document.body.clientTop)
		                    };
		            };
		        }
		        return Zav.Event.getDocumentMousePosition(event);
		},

		getScreenMousePosition:		function ( event ) {

		        return {
		            left:   event.screenX,
		            top:    event.screenY
		        };
		},

		getModifierKey:				function ( event ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.Event.getModifierKey"});
		
		        return {
		            shift:  event.shiftKey,
		            ctrl:   event.ctrlKey,
		            alt:    event.altKey,
		            meta:   event.metaKey
		        };
		},

		getRelatedTarget: 			function ( event ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.Event.getRelatedTarget"});
		
		        if (event.relatedTarget) {
		            return event.relatedTarget;
		        }
		        else if (event.toElement) {
		            return event.toElement;
		        }
		        else if (event.fromElement) {
		            return event.fromElement;
		        }
		        else {
		            return null;
		        }
		},

		getMouseButton: 			function ( event ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.Event.getMouseButton"});
		
		        if (document.implementation.hasFeature("MouseEvents", "2.0")) {
		            return event.button;
		        }
		        else {
		            switch(event.button) {
		                case 0:
		                case 1:
		                case 3:
		                case 5:
		                case 7:
		                    return 0;
		                case 2:
		                case 6:
		                    return 2;
		                case 4:
		                    return 1;
		            }
		        }
		},

		getWheelDelta:				 function ( event ) {

		        if(event.wheelDelta) {
		            if(System.Client.Engine.Opera && System.Client.Engine.Opera < 9.5) {
		                Zav.Event.getWheelDelta = function ( event ) {
		
		                    return -event.wheelDelta;
		                };
		            }
		            else {
		                Zav.Event.getWheelDelta = function ( event ) {
		
		                    return event.wheelDelta;
		                };
		            }
		        }
		        else {
		                Zav.Event.getWheelDelta = function ( event ) {
		
		                    return (-event.detail * 40);
		                };
		        }
		        return Zav.Event.getWheelDelta(event);
		},

		isMouseOutside:				function (event) {

		        if(System.Client.Browser.Ie > 0) {
		            return true;
		        }
		
		        var currentTarget = event.currentTarget;
		
		        var relatedTarget = Zav.Event.getRelatedTarget(event);
		
		        if(currentTarget==relatedTarget || Zav.Dom.contains(currentTarget,relatedTarget)) {
		            return false;
		        }
		        return true;
		},

		getKeyName:					function ( event ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.Event.getKeyName"});
		
		        return Zav.Event.keyCodeList[event.keyCode];
		},

		getCharCode:				function ( event ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.Event.getCharCode"});
		
		        var charCode = typeof event.charCode == "number"
		            ? event.charCode
		            : event.keyCode;
		
		        return charCode;
		},

		getCharSymbol:				function ( event ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.Event.getCharSymbol"});
		
		        return String.fromCharCode(Zav.Event.getCharCode(event));
		},

		keyCodeList: {

		        // Horní řada
		        27:     "esc",
		        112:    "F1",
		        113:    "F2",
		        114:    "F3",
		        115:    "F4",
		        116:    "F5",
		        117:    "F6",
		        118:    "F7",
		        119:    "F8",
		        120:    "F9",
		        121:    "F10",
		        122:    "F11",
		        123:    "F12",
		        // PrtScr - nefunguje všude
		        145:    "scrollLock",
		        19:     "pauseBreak",

		        // Levá strana klávesnice
		        192:    ";",
		        9:      "tab",
		        20:     "capsLock",
		        16:     "shift",        // i pravý Shift
		        17:     "ctrl",         // i pravý CTRL

		        // Spodní řada klávesnice
		        91:     "windowsLeft",
		        18:     "alt",          // i pravý ALT
		        32:     "spacebar",
		        92:     "windowsRight",

		        // šipky
		        37:     "left",
		        63234:  "left",
		        38:     "top",
		        63232:  "top",
		        39:     "right",
		        63235:  "right",
		        40:     "bottom",
		        63233:  "bottom",

		        // nad šipkama
		        45:     "insert",
		        46:     "delete",
		        36:     "home",
		        35:     "end",
		        33:     "pageup",
		        63276:  "pageup",
		        34:     "pagedown",
		        63277:  "pagedown",

		        // numerický blok
		        96:     "num0",
		        97:     "num1",
		        98:     "num2",
		        99:     "num3",
		        100:    "num4",
		        101:    "num5",
		        102:    "num6",
		        103:    "num7",
		        104:    "num8",
		        105:    "num9",
		        111:    "/",
		        106:    "*",
		        109:    "-",
		        107:    "+",
		        13:     "enter",    // i hlavní enter ve středu klávesnice
		        110:    ".",

		        // ostatní
		        8:      "backspace",
		        93:     "windowsMenu"

		        // zvýbá několik kláves, ty jsou však již více problematické
		        // vzhledem k používanému prostředí, proto je vynechávám
		}
};

//Zav.CustomEvent.Handlers					[O]		-> Seznam všech zaregistrovaných posluchačů
//Zav.CustomEvent.addHandler				[F]		-> Pro danou událost zaregistruje posluchače
//Zav.CustomEvent.removeHandler				[F]		-> U dané události odregistruje posluchače
//Zav.CustomEvent.fire						[F]		-> Spustí událost

Zav.CustomEvent = {
		
		Handlers: {},
		
		addHandler:					function ( type, handler ) {
			
				if(Object.isUndefined(this.Handlers[type])) {
					this.Handlers[type] = [];
				}
				
				this.Handlers[type].push(handler);
		},
		
		removeHandler:				function ( type, handler ) {
			
				if(Object.isArray(this.Handlers[type])) {
					
					var handlers = this.Handlers[type];
					
					for(var i=0, length = handlers.length; i<length; i++) {
						
						if(handlers[i] === handler) {
							break;
						}
					}
					
					handlers.splice(i, 1);
				}
		},
		
		fire:						function ( event ) {
			
				if(Object.isArray(this.Handlers[event.type])) {
					
					var handlers = this.Handlers[event.type];
					
					for(var i=0, length = handlers.length; i<length; i++) {
						
						handlers[i](event);
					}
				}
		}
};

//Zav.Dom.init()					// Vrací element. Je-li předán element, vrátí jej, jinak vyhledá a vrátí element s daným ID
//Zav.Dom.appendChild()				// Vloží element do jeho rodiče a nastaví jeho vlastnost zavIsAppendid na true
//Zav.Dom.removeChild()				// Vyjme element z jeho rodiče a nastaví jeho vlastnost zavIsAppendid na false
//Zav.Dom.insertBefore()			// Vloží element do jeho rodiče před referenční uzel a nastaví jeho vlastnost zavIsAppendid na true
//Zav.Dom.asyncInnerHTML()			// Vytvoří kód (s uvolněním stránky) pomocí fragmentu dokumentu a vrátí jej
//Zav.Dom.getAllAttributes()		// Vrací řetězec se seznamem všech atributů elementu ve formátu x="hodnota" y="hodnota
//Zav.Dom.CE()						// Obdoba (rozšíření) metody document.createElement()
//Zav.Dom.CTN()						// Vytvoří nový textový řetězec. Ekvivalent document.createTextNode()
//Zav.Dom.CDF()						// Vytvoří nový fragment dokumentu. Ekvivalent document.createDocumentFragment()
//Zav.Dom.childElements()			// Vrací všechny bezprostřední potomky elementu, jejichž nodeType === 1 (ELEMENT_NODE)
//Zav.Dom.firstElement()			// Vrací prvního potomka, jehož noteType === 1 (ELEMENT_NODE)
//Zav.Dom.lastElement()				// Vrací posledního potomka, jehož noteType === 1 (ELEMENT_NODE)
//Zav.Dom.contains()				// Ověří, zda-li je prvek následníkem předka
//Zav.Dom.getInnerText()			// Vrací textový obsah uvnitř elementu
//Zav.Dom.setInnerText()			// Odstraní všechny potomky a vloží textový uzel
//Zav.Dom.getStyle()				// Vrací styl elementu
//Zav.Dom.setStyle()				// Nastaví styl elementu
//Zav.Dom.getOpacity()				// Vrací hodnotu opacity
//Zav.Dom.setOpacity()				// Nastaví hodnotu opacity
//Zav.Dom.addClassName()			// Přidá css třídu
//Zav.Dom.removeClassName()			// Odstraní css třídu
//Zav.Dom.changeClassName()			// Vymění dvě css třídy (jednu odstraní a přidá jinou)
//Zav.Dom.hasClassName()			// Ověří, zda-li element obsahuje danou třídu
//Zav.Dom.getComputedStyle()		// Vrací všechny odvozené styly elementu
//Zav.Dom.getStyleSheet()			// Vrací objekt s šablonou stylů
//Zav.Dom.getElementByName()		// Vrací element s daným atributem name v kolekci HTMLCollection
//Zav.Dom.nodeToArray()				// Převede objekt typu NodeList na pole
//Zav.Dom.cumulativeOffset()		// Vrací vzdálenost od levé horní hrany prohlížeče
//Zav.Dom.myOffsetTop()

Zav.Dom = {
		
		init:						function ( el ) {

				var __functionName = "Zav.Dom.init";
				System.Console.argumentsControll(__functionName,
					[
				        {argName: "el", expectedType: "string | element", receivedType: Object.Type(el)}
				    ]
				);
				
				if(typeof el == "string") {
		    		
		    		el = document.getElementById(el);
		    		if(!el) return null;
		    	};
		    	return el;
		},

		appendChild:				function ( parent, el) {
	
                                if(el) {
                                        parent.appendChild(el);
                                        el.zavIsAppendid = true;
                                }
		},
		
		removeChild:				function ( el ) {

                                if(el) {
                                        el.parentNode.removeChild(el);
                                        el.zavIsAppendid = false;
                                }
		},

		insertBefore:				function ( parent, newNode, referNode) {
	
				parent.insertBefore(newNode, referNode);
				newNode.zavIsAppendid = true;
		},

		asyncInnerHTML:				function ( htmlCode, callback ) {
	
				var temp = document.createElement('div'),
		        	frag = document.createDocumentFragment();
			
				temp.innerHTML = htmlCode;
				
			    (function(){
			        if(temp.firstChild){
			            frag.appendChild(temp.firstChild);
			            setTimeout(arguments.callee, 0);
			        } else {
			            callback(frag);
			        }
			    })();
		},

		getAllAttributes:			function ( el ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.Dom.getAllAttributes"});
		
		        el = Zav.Dom.init(el);
		
		        if (!el) return null;
		
		        var pairs = [];
		
		        for( var i = 0, length = el.attributes.length; i<length; i++) {
		            var attrName  = el.attributes[i].nodeName;
		            var attrValue = el.attributes[i].nodeValue;
		
		            if(el.attributes[i].specified) {
		                pairs.push(attrName + "=\"" + attrValue + "\"");
		            }
		        }
		        return pairs.join(" ");
		},

		CE:							function ( tagName, id, name, className, textNode ) {

				var __functionName = "Zav.Dom.CE";
			    System.Console.log({type: "functionEntry", functionName: __functionName});
			    System.Console.argumentsControll(__functionName,
			    	[
			    	    {argName: "tagName", expectedType: "string", receivedType: Object.Type(tagName)},
			    	    {argName: "id", expectedType: "string | undefined", receivedType: Object.Type(id)},
			    	    {argName: "name", expectedType: "string | undefined", receivedType: Object.Type(name)},
			    	    {argName: "className", expectedType: "string | undefined", receivedType: Object.Type(className)},
			    	    {argName: "textNode", expectedType: "string | undefined", receivedType: Object.Type(textNode)}
			    	]
			    );
		
		        if(Object.Type(tagName) != "string") return null;
		
		        var newElem = document.createElement(tagName);
		
		        if(Object.Type(id) == "string" && !id.isEmpty()) newElem.id = id;
		
		        if(Object.Type(textNode) == "string" && !textNode.isEmpty()) {
		
		            if(Object.Type(textNode) == "string") newElem.appendChild(Zav.Dom.CTN(textNode));
		
		            else Zav.Dom.appendChild(newElem,textNode);
		        }
		
		        if(Object.Type(className) == "string" && !className.isEmpty()) Zav.Dom.addClassName(newElem,className);
		
		        return newElem;
		},

		CTN:						function ( textNode ) {

				var __functionName = "Zav.Dom.CTN";
		        System.Console.log({type: "functionEntry", functionName: __functionName});
		        System.Console.argumentsControll(__functionName,
		        	[
		        	    {argName: "textNode", expectedType: "string", receivedType: Object.Type(textNode)}
		        	]
		        );
		        
		        return Object.Type(textNode) == "string"
		            ? document.createTextNode(textNode)
		            : document.createTextNode("");
		},

		CDF:						function ( ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.Dom.CDF"});
		
		        return document.createDocumentFragment();
		},

		childElements:				function ( el ) {

				var __functionName = "Zav.Dom.childElements";
			    System.Console.log({type: "functionEntry", functionName: __functionName});
			    System.Console.argumentsControll(__functionName,
			    	[
			    	    {argName: "el", expectedType: "element", receivedType: Object.Type(el)}
			    	]
			    );
		
		        var children = [];
		
		        for(var i=0, length = el.childNodes.length; i < length; i++) {
		            if(el.childNodes[i].nodeType == 1) {
		                children.push(el.childNodes[i]);
		            }
		        }
		
		        return children;
		},

		firstElement:				function ( el ) {
	
				if(!el.firstChild) return null;
			
				var childElements = Zav.Dom.childElements(el);
				
				return childElements[0] 
							? childElements[0]
							: null;
		},

		lastElement:				function ( el ) {
	
				if(!el.lastChild) return null;
			
				var childElements = Zav.Dom.childElements(el),
					length = childElements.length;
				
				if(length === 0) return null;
				
				return childElements[length-1];
		},

		contains:					function ( ancestor, follower) {

				var __functionName = "Zav.Dom.contains";
			    System.Console.log({type: "functionEntry", functionName: __functionName});
			    System.Console.argumentsControll(__functionName,
			    	[
			    	    {argName: "ancestor", expectedType: "element", receivedType: Object.Type(ancestor)},
			    	    {argName: "follower", expectedType: "element", receivedType: Object.Type(follower)}
			    	]
			    );
		
		        if ( document.documentElement.contains ) {
		                Zav.Dom.contains = function( ancestor, follower ) {
		                        return ancestor !== follower && ancestor.contains(follower);
		                };
		
		        } else if ( document.documentElement.compareDocumentPosition ) {
		                Zav.Dom.contains = function( ancestor, follower ) {
		                        return !!(ancestor.compareDocumentPosition(follower) & 16);
		                };
		
		        } else {
		                Zav.Dom.contains = function( ancestor, follower ) {
		                        var node = follower.parentNode;
		                        do {
		                            if(node === ancestor) {
		                                return true;
		
		                            } else {
		                                node = node.parentNode;
		                            }
		                        } while (node !== null);
		
		                        return false;
		                    };
		        }
		
		        return Zav.Dom.contains (ancestor, follower);
		},

		getInnerText:				function ( el ) {

				var __functionName = "Zav.Dom.getInnerText";
			    System.Console.log({type: "functionEntry", functionName: __functionName});
			    System.Console.argumentsControll(__functionName,
			    	[
			    	    {argName: "el", expectedType: "element", receivedType: Object.Type(el)}
			    	]
			    );
		
		        return (typeof el.textContent == "string")
		            ? el.textContent
		            : el.innerText;
		},

		setInnerText:				function ( el, text ) {

				var __functionName = "Zav.Dom.setInnerText";
			    System.Console.log({type: "functionEntry", functionName: __functionName});
			    System.Console.argumentsControll(__functionName,
			    	[
			    	    {argName: "el", expectedType: "element", receivedType: Object.Type(el)},
			    	    {argName: "text", expectedType: "string", receivedType: Object.Type(text)}
			    	]
			    );
		
		        if (typeof el.textContent == "string") {
		            el.textContent = text;
		        }
		        else {
		            el.innerText = text;
		        }
		},

		getStyle:					function ( el, style ) {

		        if(System.Client.Browser.Ie > 0) {
		            Zav.Dom.getStyle = function( el, style ) {
		
		            		System.Console.log({type: "functionEntry", functionName: "Zav.Dom.getStyle"});
		
		                    var value;
		
		                    style = (style == 'float' || style == 'cssFloat')
		                        ? 'styleFloat'
		                        : style.camelize();
		
		                    value = el.style[style] || el.currentStyle[style];
		
		                    if (style == 'opacity') {
		                        return Zav.Dom.getOpacity(el, value);
		                    }
		
		                    return value;
		            };
		        }
		
		        else {
		            Zav.Dom.getStyle = function ( el, style ) {
		
		            		System.Console.log({type: "functionEntry", functionName: "Zav.Dom.getStyle"});
		
		                    var value;
		
		                    style = (style == 'float' || style == 'styleFloat')
		                        ? 'cssFloat'
		                        : style.camelize();
		
		                    value = el.style[style];
		
		                    if (!value || value == 'auto') {
		                        var css = document.defaultView.getComputedStyle(el, null);
		                        value = css ? css[style] : null;
		                    }
		
		                    if (style == 'opacity') {
		                        return value
		                            ? parseFloat(value)
		                            : 1.0;
		                    }
		
		                    return value == 'auto' ? null : value;
		            };
		        }
		
		        return Zav.Dom.getStyle(el, style);
		},

		setStyle:					function ( el, styles ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.Dom.setStyle"});
		
		        var elStyle = el.style;
		
		        for(var property in styles) {
		
		            if (property == 'opacity') Zav.Dom.setOpacity(el,styles[property]);
		
		            else {
		                elStyle[(property == 'float' || property == 'cssFloat')
		                    ? (Object.isUndefined(elStyle.styleFloat)
		                        ? 'cssFloat'
		                        : 'styleFloat')
		                    : property] = styles[property];
		            }
		        }
		},

		getOpacity:					function ( el, value ) {

		        if(System.Client.Browser.Ie > 0) {
		            Zav.Dom.getOpacity = function( el ) {
		
		                    var value =
		                        el.style['filter'] || el.currentStyle['filter'];
		
		                    value = value.match(/alpha\(opacity:(.*)\)/);
		
		                    if (value[1]) return parseFloat(value[1]) / 100;
		
		                    return 1.0;
		            };
		        }
		
		        else {
		            Zav.Dom.getOpacity = function ( el, style ) {
		
		                    return Zav.Dom.getStyle(el,"opacity");
		            };
		        }
		
		        return Zav.Dom.getOpacity( el, value );
		},

		setOpacity:					function ( el, value ) {

		        if(System.Client.Browser.Ie > 0) {
		
		            Zav.Dom.setOpacity = function( el, value ) {
		
		                    el.style.filter = 'alpha(opacity:' + (value * 100) + ')';
		
		                    el.style.zoom = 1; // přiřazení 'hasLayout'u
		
		            };
		        }
		
		        else {
		            Zav.Dom.setOpacity = function( el, value ) {
		
		                    el.style.opacity = value;
		            };
		        }
		
		        return Zav.Dom.setOpacity( el, value );
		},

		addClassName: 				function ( el, className ) {

		        if (!Zav.Dom.hasClassName(el,className)) {
		
		            el.className += (el.className ? ' ' : '') + className;
		        }
		},

		removeClassName: 			function ( el, className) {

		        if (Zav.Dom.hasClassName(el,className)) {
		
		            el.className = el.className.replace(
		                new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').trim();
		        }
		},

		removeAllDescendantsClassName:          function ( parent, tagName, className) {

                        var children = parent.getElementsByTagName(tagName || "*");

                        for(var i=0; i<children.length; i++) {

                                if(!Object.isElement(children[i])) continue;

                                if (Zav.Dom.hasClassName(children[i],className)) {

                                    children[i].className = children[i].className.replace(
                                        new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').trim();
                                }
                        }
		},

		changeClassName: 			function ( el, firstClassName, secondClassName) {

				if(Zav.Dom.hasClassName(el, firstClassName)) {
				
					Zav.Dom.removeClassName(el, firstClassName);
					Zav.Dom.addClassName(el, secondClassName);
				}
		
				else {
					
					Zav.Dom.removeClassName(el, secondClassName);
					Zav.Dom.addClassName(el, firstClassName);
				}
		},

		hasClassName:				function ( el,className ) {

		        var elementClassName = el.className;
		
		        return (elementClassName.length > 0 && (elementClassName == className ||
		            new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
		},

		getComputedStyle: 			function ( el ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.Dom.getComputedStyle"});
		
		        return el.currentStyle
		            ? el.currentStyle
		            : document.defaultView.getComputedStyle(el, null);
		},

		getStyleSheet:				function ( el ) {

		        System.Console.log({type: "functionEntry", functionName: "Zav.Dom.getStyleSheet"});
		
		        return el.sheet || el.styleSheet;
		},

		getElementByName:			function ( HTMLCollection, nameValue) {
	
				for(var i = 0, length = HTMLCollection.length; i < length; i++) {
					
					if(HTMLCollection[i].getAttribute("name")==nameValue) {
						
						return HTMLCollection[i];
					}
				}

                                return null;
		},

		getElementByClassName:			function ( className, parent) {

                        parent = parent || document;

                        var children = parent.getElementsByTagName("*");

                        for(var i = 0, length = children.length; i < length; i++) {

                                if(!Object.isElement(children[i])) continue;

                                if(Zav.Dom.hasClassName(children[i], className)) return children[i];
                        }

                        return null;
		},

                getElementsByAttribute:                 function ( el, tagName, attrName, attrValue) {

                        var arrElements = el.getElementsByTagName(tagName && tagName != "" ? tagName : "*"),
                            returnArray = [],
                            oAttributeValue = (typeof attrValue != "undefined")
                                ? new RegExp("(^|\\s)" + attrValue + "(\\s|$)")
                                : null;

                        for(var i=0, elem, attribute; i<arrElements.length; i++) {

                            elem = arrElements[i];
                            attribute = elem.getAttribute(attrName);

                            if(typeof attribute == "string" && attribute.length > 0) {

                                if(typeof attrValue == "undefined" || (oAttributeValue && oAttributeValue.test(attribute))) {

                                    returnArray.push(elem);
                                }
                            }
                        }

                        return returnArray;
                },

                nodeToArray:                            function ( nodes ) {

                        var array = null;
                        try {
                            array = Array.prototype.slice.call(nodes, 0); // non IE
                        }
                        catch (ex) {
                            array = new Array();
                            for (var i=0, length = nodes.length; i < length; i++) {
                                array.push(nodes[i]);
                            }
                        }

                        return array;
                },

		cumulativeOffset:			function ( el, stopParent ){

		        // přijde dodělat, zatím jsem odložil

		        var left = 0, top  = 0;

		        if(!el.nodeType) return false; // ochrana

		        while (el.offsetParent) {

		            if(stopParent && stopParent == el.offsetParent) break;

		            left += el.offsetLeft;

		            top += el.offsetTop;

		            el = el.offsetParent;
		        }

		        left += el.offsetLeft;

		        top  += el.offsetTop;

		        return {left:left, top:top};
		},

		myOffsetTop: 				function ( el ) {

				//return el.offsetTop;
		}
};

Zav.Effect = {

                fadeIn:                                 function ( el, opacityStart, opacityEnd, opacityStep, speed, startDisplay, finalAction ) {

                        // zamezeni behu fadeOutu a fadeInu soucasne

                        if(el.zav_effect_fade_stopAction) return;

                        el.zav_effect_fade_stopAction = true;

                        // nastaveni zakladnich parametru a rozsireni elementu, pokud dosud rozsiren nebyl

                        if(!el.zav_effect_fade_initParameters)

                                Zav.Effect.fade_initParameters(el);

                        //
                        el.zav_effect_fade_startDisplay = startDisplay || "block";

                        el.zav_effect_fade_startOpacity = opacityStart || 0;

                        el.zav_effect_fade_opacityEnd = opacityEnd || 1;

                        el.zav_effect_fade_opacityStep = opacityStep || 0.05;

                        el.zav_effect_fade_speed = speed || 35;

                        var opacity = el.zav_effect_fade_startOpacity;

                        // ??? probihaFade = true; // globalni promenna (vyuzivana ve funkci onMouseMove)

                        // docasna uprava stylu elementu

                        Zav.Effect.fade_initStyle(el);

                        // vnitrni funkce - jeden krok efektu

                        function fade() {

                                opacity += el.zav_effect_fade_opacityStep;

                                if(opacity < el.zav_effect_fade_opacityEnd) {

                                        Zav.Dom.setOpacity(el, opacity);
                                }

                                else {
                                        clearInterval(mujInterval);

                                        Zav.Dom.setOpacity(el, el.zav_effect_fade_opacityEnd); //osetreni

                                        Zav.Effect.fade_revertStyle(el,"in");

                                        // ??? probihaFade = false;

                                        el.zav_effect_fade_stopAction = false;

                                        el.zav_effect_fade_callback();

                                        el.zav_effect_fadeIn_callback();

                                        if(finalAction) finalAction();
                                }
                        }

                        // spusteni efektu

                        Zav.Dom.setOpacity(el,el.zav_effect_fade_startOpacity); // osetreni

                        el.style.display = el.zav_effect_fade_startDisplay;

                        var mujInterval = setInterval(fade, el.zav_effect_fade_speed);
                },

                fadeOut:                                function ( el, opacityStart, opacityEnd, opacityStep, speed, endDisplay, finalAction) {

                        // zamezeni behu fadeOutu a fadeInu soucasne

                        if(el.zav_effect_fade_stopAction) return;

                        el.zav_effect_fade_stopAction = true;

                        // nastaveni zakladnich parametru a rozsireni elementu, pokud dosud rozsiren nebyl

                        if(!el.zav_effect_fade_initParameters)

                                Zav.Effect.fade_initParameters(el, opacityStep, speed);

                        // preddefinovani vlastnosti

                        el.zav_effect_fade_endDisplay = endDisplay || "none";

                        el.zav_effect_fade_startOpacity = opacityStart || 1;

                        el.zav_effect_fade_opacityEnd = opacityEnd || 0;

                        el.zav_effect_fade_opacityStep = opacityStep || 0.05;

                        el.zav_effect_fade_speed = speed || 35;

                        var opacity = el.zav_effect_fade_startOpacity;

                        // ??? probihaFade = true; // globalni promenna (vyuzivana ve funkci onMouseMove)

                        // docasna uprava stylu elementu

                        Zav.Effect.fade_initStyle(el);

                        // vnitřní funkce - jeden krok efektu

                        function fade() {

                                opacity -= el.zav_effect_fade_opacityStep;

                                if(opacity > el.zav_effect_fade_opacityEnd) {

                                        Zav.Dom.setOpacity(el, opacity);
                                }

                                else {

                                        clearInterval(mujInterval);

                                        Zav.Dom.setOpacity(el, el.fade_opacityEnd); // osetreni

                                        el.zav_effect_fade_endDisplay == "none" ? el.style.display = "none" : "";

                                        Zav.Effect.fade_revertStyle(el,"out");

                                        // ??? probihaFade = false;

                                        el.zav_effect_fade_stopAction = false;

                                        el.zav_effect_fade_callback();

                                        el.zav_effect_fadeOut_callback();

                                        if(finalAction) finalAction();
                                }
                        }

                        // spusteni efektu

                        Zav.Dom.setOpacity(el,el.zav_effect_fade_startOpacity); //osetreni

                        var mujInterval = window.setInterval(fade, el.zav_effect_fade_speed);
                },

                fade_initParameters:                    function ( el ) {

                        if(!el.zav_effect_fade_callback)

                                el.zav_effect_fade_callback = function() {};

                        if(!el.zav_effect_fadeOut_callback)

                                el.zav_effect_fadeOut_callback = function() {};

                        if(!el.zav_effect_fadeIn_callback)

                                el.zav_effect_fadeIn_callback = function() {};

                        el.zav_effect_fade_initParameters = true;
                },

                fade_initStyle:                         function ( el ) {

                        // je zde pouzit trik pro Internet Explorer s nastavenim relativni

                        // pozice takovemu prvku, ktery ma pozici static

                        // pro IE 8 je nastaven z-index v pripade, ze je jeho hodnota "auto"

                        el.zav_effect_fade_originalPosition = Zav.Dom.getStyle(el, "position");

                        if(el.zav_effect_fade_originalPosition != "relative" && el.zav_effect_fade_originalPosition != "absolute") {

                                el.style.position = "relative";
                        }

                        el.zav_effect_fade_originalZindex = Zav.Dom.getStyle(el,"z-index");

                        el.style.zIndex = Zav.Effect.fade_findZindex(el);
                },

                fade_findZindex:                        function ( el ) {

                        var zIndex;

                        while(el.tagName.toLowerCase() != "html") {

                                zIndex = Zav.Dom.getStyle(el,"z-index");

                                if(zIndex != "auto") break;

                                el = el.parentNode;
                        }

                        zIndex = zIndex != "auto" ? zIndex : 0;

                        return zIndex;
                },

                fade_revertStyle:                       function ( el, fade ) {

                        el.style.position = el.zav_effect_fade_originalPosition;

                        el.style.zIndex = el.zav_effect_fade_originalZindex;

                        if(fade=="out" && el.zav_effect_fade_endActionReventOpacity)

                                Zav.Dom.setOpacity(el,el.zav_effect_fade_startOpacity); // navraceni puvodni hodnoty opacity

                        if(fade=="in" && el.zav_effect_fade_endActionReventOpacity)

                                Zav.Dom.setOpacity(el,el.zav_effect_fade_endOpacity); // navraceni puvodni hodnoty opacity
                }
}



