var System = {

		Client:					function ( ) {

			var ua = navigator.userAgent,
		        p =  navigator.platform,

		        Engine =
			    {
			        // vykreslovací systémy
			        Ie: 0,
			        Gecko: 0,
			        Webkit: 0,
			        Khtml: 0,    //Safari, Google Chrome
			        Opera: 0,

			        // konkrétní verze
			        Version: null
			    },

			    Browser =
			    {
			        // prohlížeče
			        Ie: 0,
			        Firefox: 0,
			        Safari: 0,
			        Konq: 0,
			        Opera: 0,
			        Chrome: 0,

			        // konkrétní verze
			        Version: null
			    },

			    System =
			    {
			        // platformy
			        Win: false,
			        Mac: false,
			        X11: false,  // Unix

			        // mobilní zařízení
			        Iphone: false,
			        Ipod: false,
			        NokiaN: false,
			        WinMobile: false,
			        MacMobile: false
			    };
		
			    System.Win = p.indexOf("Win") == 0;
			    System.Mac = p.indexOf("Mac") == 0;
			    System.X11 = (p.indexOf("X11") == 0) || (p.indexOf("Linux") == 0);
		
			    if (System.Win) {
			        if (/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)) {
			            if (RegExp["$1"] == "NT") {
			                switch(RegExp["$2"])
			                {
			                    case "5.0":
			                        System.Win = "2000";
			                        break;
			                    case "5.1":
			                        System.Win = "XP";
			                        break;
			                    case "6.0":
			                        System.Win = "Vista";
			                        break;
			                    case "6.1":
			                        System.Win = "Win7";
			                        break;
			                    default:
			                        System.Win = "NT";
			                        break;
			                }
			            }
			            else if (RegExp["$1"] == "9x") {
			                System.Win = "ME";
			            }
			            else {
			                System.Win = RegExp["$1"];
			            }
			        }
			    }
		
			    // mobilní zařízení
			    System.Iphone    = ua.indexOf("iPhone") > -1;
			    System.Ipod      = ua.indexOf("iPod")   > -1;
			    System.NokiaN    = ua.indexOf("NokiaN") > -1;
			    System.WinMobile = (System.Win == "CE");
			    System.MacMobile = (System.Iphone || System.Ipod);
		
			    // herní systémy
			    System.Wii = ua.indexOf("Wii") > -1;
			    System.Ps = /playstation/i.test(ua);
		
		
			    if (window.Opera) {
			        Engine.Version = Browser.Version = window.Opera.version();
			        Engine.Opera = Browser.Opera = parseFloat(Engine.Version);
			    }
			    else if (/AppleWebKit\/(\S+)/.test(ua)) {
			        Engine.Version = RegExp["$1"];
			        Engine.Webkit = parseFloat(Engine.Version);
			
			        // Chrome nebo Safari
			        if(/Chrome\/(\S+)/.test(ua)) {
			            Browser.Version = RegExp["$1"];
			            Browser.Chrome = parseFloat(Browser.Version);
			        }
			        else if (/Version\/(\S+)/.test(ua)) {
			            Browser.Version = RegExp["$1"];
			            Browser.Safari = parseFloat(Browser.Version);
			        }
			        else {
			            // přibližná verze
			            var safariVersion = 1;
			            if (Engine.Webkit < 100) {
			                safariVersion = 1;
			            }
			            else if (Engine.Webkit < 312) {
			                safariVersion = 1.2;
			            }
			            else if (Engine.Webkit < 412) {
			                safariVersion = 1.3;
			            }
			            else {
			                safariVersion = 2;
			            }
			            Browser.Safari = Browser.Version = safariVersion;
			        }
			    }
			    else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)) {
			        Engine.Version = Browser.Version = RegExp["$1"];
			        Engine.Khtml = Browser.Konq = parseFloat(Engine.Version);
			    }
			    else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) {
			        Engine.Version = RegExp["$1"];
			        Engine.Gecko = parseFloat(Engine.Version);
			
			        // Firefox
			        if(/Firefox\/(\S+)/.test(ua)) {
			            Browser.Version = RegExp["$1"];
			            Browser.Firefox = parseFloat(Browser.Version);
			        }
			    }
			    else if (/MSIE ([^;]+)/.test(ua)) {
			        Engine.Version = Browser.Version = RegExp["$1"];
			        Engine.Ie = Browser.Ie = parseFloat(Engine.Version);
			    }
			
			    return {
			        Engine: Engine,
			        Browser: Browser,
			        System: System
			    };
		}(),

		createBasicStructure:	function ( ) {
			
			System.root			= Zav.Dom.CE("div", "system-root");

			Zav.Dom.appendChild(document.body, System.root);
		},
		
		open:								function ( ) {

			if(!System.root) {
				
				System.createBasicStructure();
			}
			
			var root = System.root;
		
			if(!root.isAppendid) {
				
				Zav.Dom.appendChild(document.body, System.root);
			}
		},
	
		uniqueIdList:			{},

		lastUniqueId:			0,
		
		createUniqueId:			function( objName ) {

				/**
				 * Metoda vytváří unikátní id. Propojení mezi typem objektu (vlastností name) a tímto id uloží
				 * do objektu System.uniqueIdList.
				 * 
				 * <= System.Console.log()
				 * 
				 */

				var uniqueId = "__uniqueId__" + (++System.lastUniqueId),
				idList = System.uniqueIdList;
			
				if(objName) {
					
					if(!idList[objName]) idList[objName] = [];
						
					idList[objName].push(uniqueId);
				}
				
				return uniqueId;
		},

		getLastUniqueId:		function ( ) {
			
			return System.lastUniqueId;
		},
		
		maximalizedHeightList:	[],
		
		maximalizedWidthList:	[],
		
		registerMaximalizedHeight:			function ( obj ) {
			
			System.maximalizedHeightList.push(obj);
		},
		
		registerMaximalizedWidth:			function ( obj ) {
			
			System.maximalizedWidthList.push(obj);
		},
		
		maximalizedSizeControl:			function ( ) {
			
			var maximalizedHeightList = System.maximalizedHeightList,
				maximalizedWidthList  = System.maximalizedWidthList;
			
			for(var i=0, length = maximalizedHeightList.length; i<length; i++) {
				
				for(var j=0, minus=0, lengthTwo = maximalizedHeightList[i].relatedElements.length; j<lengthTwo; j++) {
					
					minus += maximalizedHeightList[i].relatedElements[j].offsetHeight;
				}
				
				maximalizedHeightList[i].element.style.height = (maximalizedHeightList[i].parent.offsetHeight - minus) + "px";
			}
			
			for(var i=0, length = maximalizedWidthList.length; i<length; i++) {
				
				for(var j=0, minus=0, lengthTwo = maximalizedWidthList[i].relatedElements.length; j<lengthTwo; j++) {
					
					minus += maximalizedWidthList[i].relatedElements[j].offsetWidth;
				}
				
				maximalizedWidthList[i].element.style.width = (maximalizedWidthList[i].parent.offsetWidth - minus) + "px";
			}
		}
};

System.Console = {

		ready:						false,

		parent:						null,

		logList:					[],

		logTypeList: {

		        "info":                 	true,
		        "error":                	true,
		        "typeError":				true,
		        "argumentsError":			true,
		        "functionEntry":        	true,
		        "functionLeaving":			true
		},

		printedTypeList: {

		        "info":                 	true,
		        "error":                	true,
		        "typeError":				true,
		        "argumentsError":			true,
		        "functionEntry":        	true,
		        "functionLeaving":			true
		},

		lastLogSerialNumber:					0,

		supportFunctions: {

			appendChild:					function ( parent, el) {

					parent.appendChild(el);
					el.isAppendid = true;
			},

			removeChild:					function ( parent, el) {

					parent.removeChild(el);
					el.isAppendid = false;
			},

			insertBefore:					function ( parent, newNode, referNode) {

					parent.insertBefore(newNode, referNode);
					newNode.isAppendid = true;
			},

			childElements:					function ( 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 = System.Console.supportFunctions.childElements(el);
					
					return childElements[0] 
								? childElements[0]
								: null;
			},

			lastElement:					function ( el ) {

					if(!el.lastChild) return null;
				
					var childElements = System.Console.supportFunctions.childElements(el),
						length = childElements.length;
					
					if(length === 0) return null;
					
					return childElements[length-1];
			},

			addClassName:					function ( el, className ) {

					if (!System.Console.supportFunctions(el,className)) {
					
					      el.className += (el.className ? ' ' : '') + className;
					}
			},

			removeClassName:				function ( el, className) {

					if (System.Console.supportFunctions.hasClassName(el,className)) {
					
					      el.className = el.className.replace(
					          new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').trim();
					}
			},

			changeClassName:				function ( el, firstClassName, secondClassName) {

					if(System.Console.supportFunctions.hasClassName(el, firstClassName)) {
					
						System.Console.supportFunctions.removeClassName(el, firstClassName);
						System.Console.supportFunctions.addClassName(el, secondClassName);
					}
				
					else {
						
						System.Console.supportFunctions.removeClassName(el, secondClassName);
						System.Console.supportFunctions.addClassName(el, firstClassName);
					}
			},

			hasClassName:					function ( el,className ) {

					var elementClassName = el.className;
			
					return (elementClassName.length > 0 && (elementClassName == className ||
					      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
			}
	},

		open:								function ( ) {

				if(!System.Console.root) {
					
					System.Console.createBasicStructure();
					
					System.Console.createHtmlForLogTypeList();
					
					System.Console.createHtmlForMenuB();
				}
				
				var root = System.Console.root;
			
				if(!root.isAppendid) {
					
					System.Console.supportFunctions.appendChild(System.Console.parent || document.body,root);
				}
		},

		close:								function ( ) {
			
				var root = System.Console.root;
				
				if(root.isAppendid) {
					
					System.Console.supportFunctions.removeChild(System.Console.parent, root);
				}
		},

		setParent:							function ( newParent ) {
			
			System.Console.parent = newParent;
			
			System.Console.root.isAppendid = false; // nastavení na false z toho důvodu, že metoda open() kontroluje
													// aktuální vložení / nevložení ve stránce
			
			System.Console.open();
		},
		
		changeLogType:						function ( logType ) {

				var logTypeList = System.Console.logTypeList;
			
				if(logTypeList[logType]) {
					
						logTypeList[logType] = false;
				}
				
				else {
					
						logTypeList[logType] = true;
				}
		},

		changePrintedType:					function ( logType ) {

				var printedTypeList = System.Console.printedTypeList,
					value;
			
				if(printedTypeList[logType]) {
					
						printedTypeList[logType] = false;
						value = false;
				}
				
				else {
					
						printedTypeList[logType] = true;
						value = true;
				}
				
		        Zav.CustomEvent.fire({
		        	type:			"system-console-onPrintedTypeChanged",
		        	printedType:	logType,
		        	value:			value
		        });
		},
		
		logTypeListToText:					function ( logType ) {

			switch( logType ) {
			
				case "info":			return "Obecná informace";
				case "error":			return "Obecná chyba";
				case "typeError":		return "Chyba v typu dat";
				case "argumentsError":	return "Chyba argumentů ve funkci";
				case "functionEntry":	return "Vstup do funkce";
				case "functionLeaving":	return "Výstup z funkce";
			};
	},

		log:								function( logObj ) {
	
			/**
			 * Metoda zaloguje a uloží přijatou zprávu.
			 * 
			 * Jejím úkolem je vytvořit objekt obsahující všechny potřebné informace týkajících se daného typu logu a ten
			 * následně uložit do objektu System.Console.logList (Array).
			 * 
			 * Závěrem odpálí událost značící přidání nového logu.
			 * 
			 * Metoda je volána z mnoha míst ve stránce při nejrůznějších událostech.
			 * 
			 * => Zav.CustomEvent.fire()
			 */
	
				// pokračujeme pouze tehdy, pokud je konzola již vytvořena
				if(!System.Console.ready) return;
				
				// pokračujeme pouze tehdy, pokud je pro daný typ logu nastaveno logování
				if(!System.Console.logTypeList[logObj.type]) return;
				
		        // vytvoříme objekt logu
		        var log = {};
		            log.type = logObj.type || null;
		            log.text = logObj.text || null;
		            log.functionName = logObj.functionName || null;
		            log.argumentsErrorList = logObj.argumentsErrorList || null; 
		        	log.serialNumber = ++System.Console.lastLogSerialNumber;
		        	log.uniqueId = System.createUniqueId();
		        	log.time = new Date();
		
		        // uložíme log
		        System.Console.logList.push(log);
		        
		        // uložíme odkaz na objekt pomocí jeho id
		        System.Console.logList[log.uniqueId] = log;
		        
		        Zav.CustomEvent.fire({
		        	type:	"system-console-onLogCreated",
		        	logId:	log.uniqueId
		        });
		},	
	
		printMessage:					function( logId ) {

				var SC = System.Console;
	
		        // má-li být log daného typu tištěn v konzoli a je-li konzola otevřena, příslušný kód vložíme do konzole
		        if(!SC.printedTypeList[SC.logList[logId].type] || !SC.root.isAppendid) {
		        	
		        	return;
		        }
			
				var	content = SC.root.content,
			        htmlCode = "",
			        fragment = "",
			        temp,
			        firstElement = null;
	
				// vytvoříme html kód zprávy
	
		        htmlCode = SC.createHtmlForMessage(SC.logList[logId]);
		        
		        Zav.Dom.asyncInnerHTML(htmlCode, function(fragment) {
		        	
		        	firstElement = System.Console.supportFunctions.firstElement(content);
		        	
		        	if(firstElement) {
		        		System.Console.supportFunctions.insertBefore(content, fragment, firstElement);
		        	}
		        	else {
		        		System.Console.supportFunctions.appendChild(content, fragment);
		        	}
		        });
		},
		
		deleteMessage:						function ( messageid ) {
			
				var el = Zav.Dom.init(messageid);
		
				el.parentNode.removeChild(el);
				
				el = null;
		},
		
		expandMessage:						function ( target ) {

				var messageRoot	= target,
				messageHeader	= target.childNodes[0];
				messageContent	= target.childNodes[1];
	
				Zav.Dom.removeClassName(messageRoot, "collapsed");
				Zav.Dom.addClassName(messageRoot, "expanded");
	
				Zav.Dom.removeClassName(messageHeader, "collapsed");
				Zav.Dom.addClassName(messageHeader, "expanded");
	
				Zav.Dom.removeClassName(messageContent, "collapsed");
				Zav.Dom.addClassName(messageContent, "expanded");
		},

		collapseMessage:					function ( target ) {

			var divCollection = target.getElementsByTagName("div"),
				messageRoot		= target,
				messageHeader	= target.childNodes[0];
				messageContent	= target.childNodes[1];
		
				Zav.Dom.removeClassName(messageRoot, "expanded");
				Zav.Dom.addClassName(messageRoot, "collapsed");
			
				Zav.Dom.removeClassName(messageHeader, "expanded");
				Zav.Dom.addClassName(messageHeader, "collapsed");
			
				Zav.Dom.removeClassName(messageContent, "expanded");
				Zav.Dom.addClassName(messageContent, "collapsed");
		},

		deleteAllMessages:					function ( ) {

			System.Console.root.content.innerHTML = "";
		},

		expandAllMessages:					function ( ) {
	
				var childElements = System.Console.supportFunctions.childElements(System.Console.root.content);
	
				for(var i = 0, length = childElements.length; i < length; i++) {
					
						System.Console.expandMessage(childElements[i]);
				}
		},
	
		collapseAllMessages:				function ( ) {
	
			var childElements = System.Console.supportFunctions.childElements(System.Console.root.content);
	
				for(var i = 0, length = childElements.length; i < length; i++) {
					
						System.Console.collapseMessage(childElements[i]);
				}
		},

		createBasicStructure:				function ( ) {
			
			System.Console.root						= Zav.Dom.CE("div", "system-console-root");

			System.Console.root.menuA				= Zav.Dom.CE("div", "system-console-root-menuA");

			System.Console.root.menuA.header		= Zav.Dom.CE("div", "system-console-root-menuA-header", "", "expanded", "Konzole");

			System.Console.root.menuA.header.title	= "Kliknutím otevřete / zavřete nabídku Konzole";

			System.Console.root.menuA.content		= Zav.Dom.CE("div", "system-console-root-menuA-content", "", "expanded");

			System.Console.root.menuB				= Zav.Dom.CE("div", "system-console-root-menuB");

			System.Console.root.content				= Zav.Dom.CE("div", "system-console-root-content");

			System.Console.supportFunctions.appendChild(System.Console.root,System.Console.root.menuA);
				System.Console.supportFunctions.appendChild(System.Console.root.menuA, System.Console.root.menuA.header);
				System.Console.supportFunctions.appendChild(System.Console.root.menuA, System.Console.root.menuA.content);
			System.Console.supportFunctions.appendChild(System.Console.root,System.Console.root.menuB);
			System.Console.supportFunctions.appendChild(System.Console.root, System.Console.root.content);
		},
		
		createHtmlForMessage:				function( logObj ) {

			var SC = System.Console,

				messageClassName,
		    	headerClassName,
		        contentClassName,
		        
		        headerText,
		        contentText = logObj.text || "",
		
		        type = logObj.type,
				functionName		= logObj.functionName,
				argumentsErrorList	= logObj.argumentsErrorList,
				uniqueId			= logObj.uniqueId,
				time				= logObj.time;


	        switch(type) {
		        case "functionEntry":
		        			headerText			= "Vstup do funkce";
		                    typeClassName		= " type_functionEntry";
		                    contentText			= "Bylo vstoupeno do funkce " + functionName + "().";
		                    contentText			+= logObj.text ? "<br>" + logObj.text : "";
		                    break;
		        case "functionLeaving":
		        			headerText			= "Výstup z funkce";
		        			typeClassName		= " type_functionLeaving";
		        			break;
		        case "argumentsError":
		        			headerText			= "Chyba argumentů";
		        			typeClassName		= " type_argumentsError";
		        			break;
		        case "info":
		        			headerText			= "Obecná informace";
		        			typeClassName		= " type_info";
		        			break;
		        case "error":
		        			headerText			= "Obecná chyba";
		        			typeClassName		= " type_error";
		        			break;
		        case "typeError":
		        			headerText			= "Chyba v typu dat";
		        			typeClassName		= " type_typeError";
		        			break;
	        }

	        messageClassName		= "system-console-root-content-message collapsed";
	        headerClassName 		= "system-console-root-content-message-header collapsed" + typeClassName;
	        closeButtonClassName 	= "system-console-root-content-message-header-closeButton";
	        contentClassName		= "system-console-root-content-message-content collapsed";

	        if(type == "argumentsError") {
	        	
	        		for(var i = 0, length = argumentsErrorList.length; i < length; i++) {
	        			
	    				contentText += (contentText == "" ? "" : "<br>") +
	    				argumentsErrorList[i].argName
	    					+ " (" + argumentsErrorList[i].expectedType + ") -> " +
	    					"<span>" + argumentsErrorList[i].receivedType + "</span>";
	        		}
	        }
	        
	        contentText += "<br>Čas: " + time.to24HourTimeString() + " (" + time.getMilliseconds() + ")";
	
	           
	        var htmlCode  = "<div id='" + uniqueId + "' name='system-console-root-content-message' class='" + messageClassName + "'>";
	        
	        	htmlCode += "<div name='system-console-root-content-message-header' class='" + headerClassName + "'>";
	        	htmlCode += 	"<span class='type'>";
	        	htmlCode += 		headerText;
	        	htmlCode += 	"</span>";
	        	if(functionName) {
		        	htmlCode += 	"<span class='functionName'>";
		        	htmlCode += 		" (" + functionName + ")";
		        	htmlCode += 	"</span>";
	        	}
	        	htmlCode += 	"<div name='system-console-root-content-message-header-closeButton' class='" + closeButtonClassName + "'>";
	        	htmlCode += 	"</div>";
	        	htmlCode += "</div>";
	
	        	htmlCode += "<div name='system-console-root-content-message-content' class='" + contentClassName + "'>";
	        	htmlCode += 	contentText;
	        	htmlCode += "</div>";
	        	
	        	htmlCode += "</div>";
	        	
	        return htmlCode;
	},

		createHtmlForLogTypeList:			function ( ) {
	
				var code = "";
			
				code += "<table id='system-console-root-menuA-content-logTypeList'>";
		
				for(var param in System.Console.printedTypeList) {
					
						value = System.Console.printedTypeList[param];
					
					
						code += "<tr>" +
								"<td class='checkbox'>" +
									"<input type='checkbox'" +
										"name='system-console-root-menuA-content-logTypeList-checkbox'" +
										"id='system-console-root-menuA-content-logTypeList-checkbox-" + param + "'" +
										"checkboxLogType = '" + param + "'" + (value ? " checked" : "") + ">" +
								"</td>" +
								"<td class='text'>" + System.Console.logTypeListToText(param) + "</td>" +
								"</tr>";
				}
				
				code += "</table>";
				
				System.Console.root.menuA.content.innerHTML = code;
		},
		
		createHtmlForMenuB:					function ( ) {
	
				var code = "";
		
					code +=	"<a id='system-console-root-menuB-deleteAll'>Odstranit vše</a>";
					code +=	"<a id='system-console-root-menuB-collapseAll'>Sbalit vše</a>";
					code +=	"<a id='system-console-root-menuB-expandAll'>Rozbalit vše</a>";
				
				System.Console.root.menuB.innerHTML	= code;
		},
		
		eventProcessing:					function ( event ) {

				var currentTarget = event.currentTarget,	// System.Console.root
					target = Zav.Event.getTarget(event);		// některý z vnitřních prvků
			
				// nejprve zkontrolujeme přímé prvky
			
				if(target.getAttribute("name") == "system-console-root-menuA-content-logTypeList-checkbox") {
	
						var printedType = target.getAttribute("checkboxLogType");
						
						System.Console.changePrintedType(printedType);
						
						return;
				}
				
				else if(target.getAttribute("name") == "system-console-root-content-message-header-closeButton") {
					
						target = target.parentNode;
					
						while(target) {
							
							if(target.getAttribute("name") == "system-console-root-content-message") {
								
								System.Console.deleteMessage(target.id);
								
								return;
							}
							
							target = target.parentNode;
						}
				}
				
				else if(target.id == "system-console-root-menuB-deleteAll") {
					
						System.Console.deleteAllMessages();
					
						return;
				}
	
				else if(target.id == "system-console-root-menuB-collapseAll") {
					
						System.Console.collapseAllMessages();
				}
	
				else if(target.id == "system-console-root-menuB-expandAll") {
					
						System.Console.expandAllMessages();
				}
	
					
				while(target && target !== currentTarget) {
					
					var name = target.getAttribute("name");
					
					if(name=='system-console-root-content-message') {
						
							if(Zav.Dom.hasClassName(target, "expanded")) {
								
								System.Console.collapseMessage(target);
							}
							
							else {
								
								System.Console.expandMessage(target);
							}
					}
					
					else if(target.id == "system-console-root-menuA-header") {
						
						Zav.Dom.changeClassName(Zav.Dom.init("system-console-root-menuA-content"), "collapsed", "expanded");
						Zav.Dom.changeClassName(Zav.Dom.init("system-console-root-menuA-header"), "collapsed", "expanded");
					}
					
					target = target.parentNode;
				}
		},
		
		customEventProcessing:				function ( event ) {
	
				switch(event.type) {
					
					case "system-console-onReady" :
								
							System.Console.log({
									type:	"info",
									text: "Konzole byla úspěšně načtena a je připravena k použití."
							});
							return;
							
					case "system-console-onLogCreated" :
						
							System.Console.printMessage(event.logId);
							return;
							
					case "system-console-onPrintedTypeChanged" :

						Zav.Dom.init("system-console-root-menuA-content-logTypeList-checkbox-"
								+ event.printedType).checked = event.value;
							
				}
		},

		argumentsControll:					function ( functionName, objArray ) {

				if(!System.Console.ready) return;
		
				var textMessage = "",
					argName,
					expectedType,
					expectedTypeArray,
					receivedType,
				
				argumentsErrorList = [];
			
				for (var i = 0, length = objArray.length; i < length; i++) {
					
					argName				= objArray[i].argName,
					expectedType		= objArray[i].expectedType,
					expectedTypeArray	= expectedType.toArray("|").trim(),
					receivedType		= objArray[i].receivedType;
					
					if(!receivedType.compareWithArrayValues(expectedTypeArray)) {
						
						argumentsErrorList.push({
							argName:		argName,
							expectedType:	expectedType,
							receivedType:	receivedType
						});
					}
				}
			
				
				textMessage += (textMessage == "" ? "" : "<br>") +
				argName + "(" + expectedType + ") >" + receivedType;
				
				
				if(argumentsErrorList.length !== 0) {
					
				    System.Console.log({
				        type:				"argumentsError",
				        functionName:		functionName,
				        argumentsErrorList:	argumentsErrorList
				    });
				}
		}
};

System.Taskbar = {

		createBasicStructure:				function ( ) {
			
			System.Taskbar.root						= Zav.Dom.CE("div", "system-taskbar-root");

			System.Taskbar.root.startMenu			= Zav.Dom.CE("div", "system-taskbar-root-startMenu");
			
			Zav.Dom.appendChild(System.Taskbar.root,System.Taskbar.root.startMenu);
		},
		
		open:								function ( ) {

			if(!System.Taskbar.root) {
				
				System.Taskbar.createBasicStructure();
			}
			
			var root = System.Taskbar.root;
		
			if(!root.isAppendid) {
				
				Zav.Dom.appendChild(System.Taskbar.parent || System.root, root);
			}
		}
};

System.StartMenu = {
		
};

System.Screen = {
		
		createBasicStructure:		function ( ) {
			
			System.Screen.root = Zav.Dom.CE("div", "system-screen-root");
		},

		open:						function ( ) {
			
			if(!System.Screen.root) {
				
				System.Screen.createBasicStructure();
			}
			
			Zav.Dom.appendChild(System.root, System.Screen.root);
		}
};

System.ContextMenu = {

		show:			function(event) {
			
			Zav.Event.preventDefault(event);
			
			var clientX = event.clientX || window.event.clientX,
				clientY = event.clientY || window.event.clientY;
			
			if(!System.ContextMenu.root) {
				
				System.ContextMenu.createBasicStructure();
			}
			
			System.ContextMenu.root.style.left = clientX + "px";
			System.ContextMenu.root.style.top = clientY + "px";
			
			Zav.Dom.appendChild(document.body, System.ContextMenu.root);
			
		},

		createBasicStructure:		function() {
			
				System.ContextMenu.root = Zav.Dom.CE("div", "system-contextMenu-root");
				
				System.ContextMenu.root.appendChild(Zav.Dom.CE("a","","","","text"));
		}
};






