function reAction()
	{
	if($reAction.length < 1) return false; // neni deklarovana zadna instrukce
	this.instructions = new Array(); // pole s instrukcemi
	this.RASwitch = new Object(); // objekt se stavy prepinacu
	var $assign = new Array(); // pole obsahujici funkce pro prirazeni k udalostem
	var $elements = new Array(); // seznam elementu propojeny s $assign pomoci klicu
	
	for(var $i_instruction = 0; $i_instruction < $reAction.length; ++$i_instruction) // prochazeni instrukci
		{
		this.instructions[$i_instruction] = {}; // aktualni instukce
		this.instructions[$i_instruction] = $reAction[$i_instruction]; // pravidla instukce
		
		var $foundNodeList = FindElementBySelector(this.instructions[$i_instruction].element); //najit sledovane prvky
		if(!$foundNodeList.length) continue; // zadny prvek nebyl nalezen
		
		var $isCoordinate = false;
		if(this.instructions[$i_instruction].coordinate) // jsou zadany souradnice => bude volan cursorFilter
			{
			if(this.instructions[$i_instruction].coordinate.length >= 4) // souradnice obsahuji potrebny pocet parametru
				{
				$isCoordinate = true;
				
				// vytvoreni funkce kontrolujici polohu kurzoru v ramci zadanych souradnic
				eval('this.instructions[$i_instruction].cursorFilter = function($ref) { return CursorInTheField($ref, $RA.instructions['+$i_instruction+'].coordinate, $RA.instructions['+$i_instruction+'].coordinate[4]); }');
				}
			}
		
		var $_cursorPointer = false; // ukazatel kursoru se meni na Pointer
		
		for(var $i_node = 0; $i_node < $foundNodeList.length; ++$i_node) // prochazeni vsech nalezenych prvku
			{
			/* VVV - aktualni element - VVV */
				var $_thisNode = $foundNodeList[$i_node];
				var $_key = ArraySearch($elements, $_thisNode); // klic existujiciho elementu
				if($_key < 0) // element dosud neni v seznamu
					{
					$_key = $elements.length; // index noveho elementu
					$elements[$_key] = $_thisNode; // novy element
					$assign[$_key] = new Object(); // pole se seznamem udalosti a funkci k prirazeni k nove vytvorenemu elementu
					}
			/* AAA - aktualni element - AAA */
			
			for(var $i_action = 0; $i_action < this.instructions[$i_instruction].actions.length; ++$i_action) // prochazeni akci
				{
				var $_thisFunction = '.instructions['+$i_instruction+'].actions['+$i_action+'].functionString'; // odkaz na aktualni funkci
				eval('this' + $_thisFunction + ' = function($ref) { ' + this.instructions[$i_instruction].actions[$i_action].code.replace(/\bthis\b/g, "$ref") + '}'); // vytvoreni funkce provadejici definovane operace
				
				for(var $i_event = 0; $i_event < this.instructions[$i_instruction].actions[$i_action].events.length; ++$i_event) // prochazeni seznamu udalosti, ktere jsou spojeny s danou akci
					{
					var $_thisEvent = this.instructions[$i_instruction].actions[$i_action].events[$i_event].toLowerCase(); // nazev aktualni udalosti
					var $_newEvent = false;
					var $_eventFunction = '$RA' + $_thisFunction + '(this)'; // standardni prirazeni funkce k udalosti
					var $_eventCondition = '';
					
					if($isCoordinate) // jsou zadany souradnice
						{
						switch($_thisEvent)
							{
							case('onmouseover'):
							case('onmouseout'):
								this.instructions[$i_instruction].actions[$i_action].RASwitch = { name: 'overXout_'+$i_instruction+'_'+$i_node, value: (($_thisEvent == 'onmouseover') ? false : true), delay: false }; // nastaveni prepinace
								$_eventCondition = (($_thisEvent == 'onmouseover') ? '' : '!')+'$RA.instructions['+$i_instruction+'].cursorFilter(this)';
								$_newEvent = 'onmousemove';
								break;
							case('onclick'):
							case('ondblclick'):
							case('onmousedown'):
							case('onmouseup'):
							case('onmousemove'):
								$_eventCondition = '$RA.instructions['+$i_instruction+'].cursorFilter(this)';
								break;
							}
						}
					
					/* VVV - specialni akce pro vybrane udalosti - VVV */
						switch($_thisEvent)
							{
							case('onclick'):
							case('ondblclick'):
							case('onmousedown'):
							case('onmouseup'):
								$_cursorPointer = true; // ukazatel kursoru se meni na Pointer
								break;
							
							case('pageonload'):
								eval('this'+$_thisFunction+'();'); // vykonani funkce
								continue; // pokracovani dalsi iteraci - dalsi udalost
								break;
							}
					/* AAA - specialni akce pro vybrane udalosti - AAA */
					
					/* VVV - nastaveni prepinace - VVV */
						if(this.instructions[$i_instruction].actions[$i_action].RASwitch)
							{
							// nazev aktualniho prepinace
							if(this.instructions[$i_instruction].actions[$i_action].RASwitch.name)
								{
								var $_switchName = this.instructions[$i_instruction].actions[$i_action].RASwitch.name;
								if(this.instructions[$i_instruction].actions[$i_action].RASwitch.access >= 1) $_switchName = $_switchName+'_'+$i_instruction;
								if(this.instructions[$i_instruction].actions[$i_action].RASwitch.access >= 2) $_switchName = $_switchName+'_'+$i_node;
								}
							else
								{
								var $_switchName = 'main_'+$i_instruction+'_'+$i_node;
								}
							
							// vyhodnoceni hodnoty prepinace
							var $_switchCondition = 
								'('
									+'$RA.RASwitch.'+$_switchName+'.value == '+this.instructions[$i_instruction].actions[$i_action].RASwitch.value
									+((this.instructions[$i_instruction].actions[$i_action].RASwitch.delay !== false) ? ' && $RA.RASwitch.'+$_switchName+'.time <= NowUTS()-'+((this.instructions[$i_instruction].actions[$i_action].RASwitch.delay || 0.5)*1000) : '')
								+')';
							$_eventCondition = ($_eventCondition ? $_eventCondition+'&& ' : '') + $_switchCondition;
							
							// zmena hodnoty prepinace
							$_eventFunction = $_eventFunction 
								+"\n"+'$RA.RASwitch.'+$_switchName+'.value = '
									+(this.instructions[$i_instruction].actions[$i_action].RASwitch.newValue || !this.instructions[$i_instruction].actions[$i_action].RASwitch.value)+';'
								+"\n"+'$RA.RASwitch.'+$_switchName+'.time = NowUTS();';
							this.RASwitch[$_switchName] = { value: false, time: 0 }; // nastaveni vychozi hodnoty prepinace
							}
					/* AAA - nastaveni prepinace - AAA */
					
					/* VVV - tvorba seznamu polozek k prirazeni - VVV */
						if(!$_newEvent) $_newEvent = $_thisEvent; // nasteveni udalosti pro prirazeni
						
						if(!$assign[$_key][$_newEvent]) $assign[$_key][$_newEvent] = new Array(); // nova udalost
						$assign[$_key][$_newEvent].push( { eventFunction: $_eventFunction, condition: $_eventCondition } ); // nova funkce
						
						if($isCoordinate && $_thisEvent == 'onmouseout') // prirazeni funkce k udalosti onMouseOut pro pripad rychleho opusteni elementu
							{
							if(!$assign[$_key]['onmouseout']) $assign[$_key]['onmouseout'] = new Array(); // nova udalost
							$assign[$_key]['onmouseout'].push( { eventFunction: $_eventFunction, condition: $_switchCondition } ); // nova funkce
							}
					/* AAA - tvorba seznamu polozek k prirazeni - AAA */
					}
				}
			
			/* VVV - nastaveni ukazatele kurzoru - VVV */
				if($_cursorPointer)
					{
					if($isCoordinate)
						{
						if(!$assign[$_key]['onmousemove']) $assign[$_key]['onmousemove'] = new Array(); // onmousemove neni pro danou instrukci definovano
						$assign[$_key]['onmousemove'].push( { eventFunction: 'if($RA.instructions['+$i_instruction+'].cursorFilter(this)) { this.style.cursor = "pointer"; } else { this.style.cursor = "auto"; }' } ); // nova funkce
						
						if(!$assign[$_key]['onmouseout']) $assign[$_key]['onmouseout'] = new Array(); // onmouseout neni pro danou instrukci definovano
						$assign[$_key]['onmouseout'].push( { eventFunction: 'this.style.cursor = "auto";' } ); // nova funkce
						}
					else
						{
						$_thisNode.style.cursor = "pointer";
						}
					}
			/* AAA - nastaveni ukazatele kurzoru - AAA */
			}
		}
	
	/* VVV - prirazeni funkci k udalostem - VVV */
		for(var $i_node = 0; $i_node < $elements.length; ++$i_node)
			{
			var $_thisNode = $elements[$i_node];
			for(var $_thisEvent in $assign[$i_node])
				{
				var $_evalString = '';
				for(var $i_function = 0; $i_function < $assign[$i_node][$_thisEvent].length; ++$i_function)
					{
					if($assign[$i_node][$_thisEvent][$i_function].condition)
						{ $_evalString = $_evalString + "\n" + 'if('+$assign[$i_node][$_thisEvent][$i_function].condition+') {'+$assign[$i_node][$_thisEvent][$i_function].eventFunction+'}' }
					else
						{ $_evalString = $_evalString + "\n" + $assign[$i_node][$_thisEvent][$i_function].eventFunction; }
					}
				
				eval('$_thisNode.'+$_thisEvent+' = function() {' + $_evalString + '}');
				}
			}
	/* AAA - prirazeni funkci k udalostem - AAA */
	}

function FindElementBySelector($string)
	{
	if(!$string) return false; // neni zadan zadny selektor
	
	/* VVV - parsovani selektoru - VVV */
		var $selectorList = new Array();
		var $number = 0;
		var $level = 0;
		var $buffer = '';
		var $_type = '';
		var $lastId = false;
		var $not = false;
		
		for(var $i = 0; $i < $string.length; ++$i)
			{
			var $_letter = $string.substring($i, ($i+1));
			var $_newType = '';
			
			switch($_letter) // nastaveni selektoru
				{
				case('#'): $_newType = 'id'; break;
				case('.'): $_newType = 'class'; break;
				case('>'): $_newType = 'child'; break;
				case(' '): $_newType = 'descendant'; break;
				case('!'): $_newType = 'not'; $not = true; break; // neagece podminky
				}
			
			if($_newType) // byl definovan novy selektor
				{
				if($buffer) // buffer je zplnen
					{
					if(!$selectorList[$level]) $selectorList[$level] = {items: new Array(), burow: ''}; // vytvoreni hladiny pokud dosud neexistuje
					$selectorList[$level].items[$number] = {type:($_type || 'tag'), string:$buffer}; // zapis selektoru do seznamu
					if($not && $_newType != 'not') // negace podminky
						{
						$selectorList[$level].items[$number].not = true;
						$not = false;
						}
					if($_type == 'id') $lastId = {level: $level, name: $buffer}; // nastaveni posledniho ID pro rychlejsi vyhledavani
					$buffer = ''; // vyprazdneni bufferu
					$number++; // posun na dalsi pozici
					}
				
				if($_newType == 'child' || $_newType == 'descendant') // selektor zanoreni
					{
					$selectorList[$level].burrow = $_newType; // zapis zpusobu zanoreni do stavajici hladiny
					$number = 0; // reset pozice
					$level++; // zanoreni
					$_type = ''; // reset typu selektoru
					}
				else
					{
					$_type = $_newType; // nastaveni noveho selektoru
					}
				}
			else
				{
				$buffer = $buffer+$_letter;
				}
			}
		
		if($buffer) // buffer obsahuje neulozeny selektor
			{
			if(!$selectorList[$level]) $selectorList[$level] = {items: new Array(), burow: ''}; // vytvoreni hladiny pokud dosud neexistuje
			$selectorList[$level].items[$number] = {type:($_type || 'tag'), string:$buffer}; // zapis selektoru do seznamu
			if($not && $_newType != 'not') $selectorList[$level].items[$number].not = true; // negace podminky
			if($_type == 'id') $lastId = {level: $level, name: $buffer}; // nastaveni posledniho ID pro rychlejsi vyhledavani
			}
	/* AAA - parsovani selektoru - AAA */
	
	/* VVV - vypis seznamu selectoru - VVV /
		var $alert = '$selectorList = Array('+"\n";
		for(var $i = 0; $i < $selectorList.length; ++$i)
			{
			$alert = $alert+'	['+$i+'] => '+$selectorList[$i]+"\n";
			$alert = $alert+'		.burrow = '+$selectorList[$i].burrow+"\n";
			$alert = $alert+'		.items = '+$selectorList[$i].items+"\n";
			for(var $y = 0; $y < $selectorList[$i].items.length; ++$y)
				{
				$alert = $alert+'			['+$y+'] => '+$selectorList[$i].items[$y]+"\n";
				$alert = $alert+'				.type = '+$selectorList[$i].items[$y].type+"\n";
				$alert = $alert+'				.string = '+$selectorList[$i].items[$y].string+"\n";
				if($selectorList[$i].items[$y].not) $alert = $alert+'				.not = '+$selectorList[$i].items[$y].not+"\n";
				}
			}
		$alert = $alert+'	)';
		alert($alert);
	/* AAA - vypis seznamu selectoru - AAA */
	
	/* VVV - vychozi prvek - VVV */
		if($lastId.name) // mezi selektory je ID
			{
			$startingNode = document.getElementById($lastId.name);
			if(!$startingNode) return false; // hledany prvek nebyl nalezen
			var $start = $lastId.level+1;
			if(!$selectorList[$lastId.level].burrow) // pro nalezeny prvek uz nejsou specifikovany dalsi hladiny
				{
				var $foundNodeList = new Array(document.getElementById($lastId.name));
				return $foundNodeList;
				}
			}
		else // vychozim uzlem je Body
			{
			$startingNode = document.body;
			$selectorList[-1] = { burrow: 'descendant', tems: new Array() };
			var $start = 0;
			}
	/* AAA - vychozi prvek - AAA */
	
	return FindDescendants($startingNode, $selectorList, $start)
	}

function FindDescendants($startingNode, $selectorList, $start, $noBurrow)
	{
	var $result = new Array(); // navratova hodnota obsahujici seznam nalezenych prvku
	var $foundNodeList = new Array(); // seznam nalezenych prvku
	var $selector = $selectorList[$start]; // selektor, jehoz shoda se bude kontrolovat
	var $children = $startingNode.childNodes; // seznam potomku
	
	if(!$children.length) return false; // vychozi uzel nema potomky
	
	/* VVV - prochazeni potomku - VVV */
		for(var $i = 0; $i < $children.length; ++$i)
			{
			var $child = $children[$i];
			if($child.nodeType != 1) continue; // potomek neni HTML element
			var $_success = true;
			
			/* VVV - kontrola selektoru - prochazeni vsech selektoru spadajicich do dane hladiny - VVV */
				for(var $y = 0; $y < $selector.items.length; ++$y)
					{
					var $_thisSuccess = true;
					switch($selector.items[$y].type)
						{
						case('id'):
							if($child.id != $selector.items[$y].string) { $_thisSuccess = false; }
							break;
						case('class'):
							if($child.className.search(new RegExp("\\b"+$selector.items[$y].string+"\\b")) < 0) { $_thisSuccess = false; }
							break;
						default: // tag
							if($child.tagName.toLowerCase() != $selector.items[$y].string) { $_thisSuccess = false; }
						}
					if($selector.items[$y].not) { $_success = !$_thisSuccess; } // negace podminky
					else { $_success = $_thisSuccess; } // normalni podminka
					
					if(!$_success) break; // prvek nevyhovuje skupine selektoru
					}
			/* AAA - kontrola selektoru - AAA */
			
			if($_success) $foundNodeList.push($child); // prvek vyhovuje a je zarazen do seznamu
			
			if($selectorList[$start-1].burrow == 'descendant') // aktualni hladina ma nasledovniky
				{
				var $_foundNodeList = FindDescendants($child, $selectorList, $start, true); // hledani potomku pro aktualniho potomka
				if($_foundNodeList.length) $foundNodeList = $foundNodeList.concat($_foundNodeList); // byli nalezeni nasledovnici
				}
			}
	/* AAA - prochazeni potomku - AAA */
	
	if($selector.burrow && !$noBurrow) // je definovana dalsi uroven
		{
		/* VVV - prochazeni dalsi urovne u nalezenych uzlu - VVV */
			for(var $i = 0; $i < $foundNodeList.length; ++$i)
				{
				var $_foundNodeList = FindDescendants($foundNodeList[$i], $selectorList, ($start+1)); // hledani potomku pro dalsi hladinu
				if($_foundNodeList.length) $result = $result.concat($_foundNodeList); // prvky odpovidajici podmince
				}
		/* AAA - prochazeni dalsi urovne - AAA */
		}
	else if($foundNodeList.length) { $result = $foundNodeList; }
	
	return $result; // vraceni seznamu nalezenych prvku
	}

function CFSwitchChanger($instruction, $action, $event) // meni stavy prepinacu
	{
	if($RA.instructions[$instruction].actions[$action].CFSwitch.$event) { $RA.instructions[$instruction].actions[$action].CFSwitch.$event = false; }
	else { $RA.instructions[$instruction].actions[$action].CFSwitch.$event = true; }
	return $RA.instructions[$instruction].actions[$action].CFSwitch.$event;
	}

/* VVV - Cursor position - VVV */
	var cursor = {x:0, y:0};
	
	function CursorInitialize()
		{
		if(document.captureEvents && Event.MOUSEMOVE) { document.captureEvents(Event.MOUSEMOVE); }
		document.onmousemove = CursorPosotion;
		}
	
	function CursorPosotion(e) // funkce nastavuje aktualni polohu kurzoru v ramci stranky
		{
		cursor.x = e ? e.pageX : event.clientX+document.body.scrollLeft;
		cursor.y = e ? e.pageY : event.clientY+document.body.scrollTop;
		}
	
	function CursorOnObject($ref) // funkce vraci polohu kurzoru v ramci zadaneho objektu
		{
		if(!cursor) return false;
		var $coordinate = {x:0, y:0};
		var $position = { left: 0, top: 0 };
		var $_node = $ref;
		while($_node)
			{
			$position.left += $_node.offsetLeft;
			$position.top += $_node.offsetTop;
			$_node = $_node.offsetParent;
			}
		
		
		if(cursor.x >= $position.left && cursor.x <= $position.left + $ref.offsetWidth) { $coordinate.x = cursor.x - $position.left; }
		else { $coordinate.x = -1; }
		
		if(cursor.y >= $position.top && cursor.y <= $position.top + $ref.offsetHeight) { $coordinate.y = cursor.y - $position.top; }
		else { $coordinate.y = -1; }
		
		return $coordinate;
		}
	
	function CursorInTheField($element, $coordinate, $diagonal) // funkce vyhodnocuje, zda se kurzor nachazi uvnitr ramce definovaneho souradnicemi
		{
		var $position = CursorOnObject($element); // pozice kurzoru v ramci objektu
		if(!$position) return false;
		
		/* VVV - uprava souradnic podle typu jejich zadani - VVV */
			var $element_coord = new Array();
			
			for($i = 0; $i < 4; ++$i) // prochazeni vsech hodnot souradnic
				{
				if($i == 0 || $i == 2) { $_element_size = $element.offsetWidth; }
				else { $_element_size = $element.offsetHeight; }
				
				if($diagonal && $i > 1)
					{ $element_coord[$i] = $element_coord[$i-2] + numberXpercent($coordinate[$i], $_element_size); }
				else
					{ $element_coord[$i] = ($coordinate[$i].toString().indexOf("-") > -1 ? $_element_size : 0) + numberXpercent($coordinate[$i], $_element_size); }
				}
			
			var $area = new Array();
			$area[0] = Math.round(Math.min($element_coord[0], $element_coord[2]));
			$area[1] = Math.round(Math.min($element_coord[1], $element_coord[3]));
			$area[2] = Math.round(Math.max($element_coord[0], $element_coord[2]));
			$area[3] = Math.round(Math.max($element_coord[1], $element_coord[3]));
		/* AAA - uprava souradnic - AAA */
		
		if($position.x >= $area[0] && $position.x <= $area[2] && $position.y >= $area[1] && $position.y <= $area[3]) return true; // kurzor je uvnitr
		return false; // kurzor je mimo
		}
/* AAA - Cursor position - AAA */
