﻿
function catchKey(e)
{
	var keyCode;
	var eventObj;
			
	if(e)
	{
		eventObj = e;
		keyCode = e.which;
	}
	else 
	{
		eventObj = event;
		keyCode = event.keyCode
	}
	
	var eventOrigin = null;
	if (eventObj.target) 
		var eventOrigin = eventObj.target;
	else if (eventObj.srcElement) 
		var eventOrigin = eventObj.srcElement;
		
	if (eventObj.type == "keyup")
	{
		catchKeyUp(keyCode);
	}
	else
	{
		if (catchKeyDown(keyCode) == false)
		{
			if (keyCode < 16 || keyCode > 18)
			{
				return keyAction(keyCode,eventObj.shiftKey,eventObj.ctrlKey,eventObj.altKey,eventOrigin);
			}
		}
	}
	return true;
}

var appleKeyDown = false;
function catchKeyDown(keyCode)
{
	if (keyCode == 224 || keyCode == 91)
	{
		appleKeyDown = true;
		return true;
	}
	return false;
}

function catchKeyUp(keyCode)
{
	if (keyCode == 224  || keyCode == 91)
	{
		appleKeyDown = false;
	}
}

var browserMenuVisibility
function catchMouse(e)
{	
	var eventObj;
	var eventOrigin = null;
		
	if(e)
		eventObj = e;
	else 
		eventObj = event;
	
	if (eventObj.target) 
		var eventOrigin = eventObj.target;
	else if (eventObj.srcElement) 
		var eventOrigin = eventObj.srcElement;

	
	//document.title = eventOrigin.tagName+": "+eventObj.button+" Type: "+eventObj.type;
	
	if (browserMenuVisibile() && eventObj.button != 2)
	{
		setBrowserMenuVisibility(false)
	}
	else if (eventObj.button == 2)
	{
		setBrowserMenuVisibility(true)
	}
	
	if (detectMouseAction(eventObj, eventOrigin))
	{
		return false;
	}
}


var mouseDownStart;
var mouseSelectTime = 250;
function detectMouseAction(eventObj, eventOrigin)
{
	if (eventObj.type == "mousedown")
	{
		if (mouseDownStart == null)
		{
			var d = new Date();
			mouseDownStart = d.getTime();
		}
	}
	else if (eventObj.type == "mouseup")
	{
		if (detectDoubleClick(eventObj, eventOrigin))
		{
			return true;
		}
		else
		{
			
			var d = new Date();
			var downtime = d.getTime()-mouseDownStart;
			mouseDownStart = null;
			
			if (downtime >= mouseSelectTime)
			{
				blockClickActionTemp();
				return true;
			}
		}
	}
	if (eventOrigin.className.match("wordBox"))
	{
		return true;
	}
	
}

var clickActionBlocked = false;
var	clickActionBlockTime = 100;
function blockClickActionTemp()
{
	clickActionBlocked = true;
	setTimeout('unblockClickAction()',clickActionBlockTime);
}

function unblockClickAction()
{
	clickActionBlocked = false;
}

function isClickActionBlocked()
{
	return (clickActionBlocked ? true : false);
}

var browserMenuVisibility;
function setBrowserMenuVisibility(visibility)
{
	if (visibility === true)
	{
		browserMenuVisibility = true;
	}
	else
	{
		browserMenuVisibility = false;
	}
}

function browserMenuVisibile()
{
	return browserMenuVisibility;
}

function keyActionElement(origin)
{
	var result = true
	var noKeyActionElements = new Array('INPUT','SELECT','TEXTAREA');
	for (var i = 0; i < noKeyActionElements.length; i++)
	{
		if (origin.tagName == noKeyActionElements[i] && origin.className.match("input2text") == null)
		{
			result = false;
			break;
		}
	}
	return result;
}

function keyAction(keyCode,shiftDown,ctrlDown,altDown,eventOrigin)
{
	//document.title = keyCode+" shift: "+(shiftDown ? "true" : "false")+" shift: "+(shiftDown ? "true" : "false")+" ctrl: "+(ctrlDown ? "true" : "false")+" alt: "+(altDown ? "true" : "false");
	if (!altDown &&	(keyCode == 37 || keyCode == 39) && (ctrlDown || keyActionElement(eventOrigin))	&& !shiftDown)
	{
		tabNavigation((keyCode == 37 ? -1 : 1));	
	}
	else if (keyActionElement(eventOrigin) && (!ctrlDown && !altDown && !appleKeyDown) && ((keyCode >= 65 && keyCode <= 90) || keyCode == 222 || keyCode == 221 || keyCode == 192))
	{
		focusOnSearchBox();
		
		return true;
	}
	else if (keyActionElement(eventOrigin) && (!ctrlDown && !altDown && !shiftDown) && ((keyCode>= 48 && keyCode <= 57) || (keyCode>= 96 && keyCode <= 105)) && openFuzzy(keyCode) != false)
	{
		return false;
	}
	else if (ctrlDown && keyCode == 65)
	{
		focusOnSearchBox();
		return false;
	}
	else if (keyActionElement(eventOrigin) && ctrlDown && keyCode == 86)
	{
		focusOnSearchBox();
		return true;
	}
	else
	{
		if (browserMenuVisibile() && (keyCode == 13 || keyCode == 27))
		{
			setBrowserMenuVisibility(false);
		}
		
		return true;
	}
	return false;
}

function focusOnSearchBox(wordValue,focus)
{
	var wordObj = document.getElementById("word");
	if (wordValue == null)
		wordValue = "";

	wordObj.value = wordValue;
	
	if (focus != false)
		wordObj.focus();
}

function submitSearchBox()
{

	document.getElementById("searchform").submit();
}

function openFuzzy(keyCode)
{
	if (keyCode <= 57) {
		var fuzzyid = keyCode-48;	
	} else {
		var fuzzyid = keyCode-96;	
	}
	
	if (fuzzyid == 0)
	{
		fuzzyid = 10;
	}
	var dict = getCurrentDictTab();
	var obj;
	if (obj = document.getElementById("fuzzy_"+dict+"_"+fuzzyid))
	{
		window.location.href = obj.href;
	}
	else
	{
		return false;
	}
}

function tabNavigation(direction)
{
	var dictsObj;
	if (dictsObj = document.getElementById("dictsmenu"))
	{
		var tabs = getTabs();
		var currentTab = getCurrentTab(tabs);
		var nextPos = currentTab+direction;
		
		if (nextPos >= tabs.length)
		{
			nextPos = 0;
		}
		else if (nextPos < 0)
		{
			nextPos = tabs.length-1;
		}
		
		var nextTab = tabs[nextPos][2];
		var onclick;
		for (var x = 0; x < nextTab.childNodes.length; x++)
		{
			
			if (nextTab.childNodes[x].tagName == "A")
			{		
				onclick = nextTab.childNodes[x].getAttributeNode("onclick").value;
				
				var hrefSplit = nextTab.childNodes[x].href.split("#");
				
				if (hrefSplit.length > 1 && hrefSplit[1].length > 0)
				{
					document.location.href="#"+hrefSplit[1];
				}
				
				eval(onclick);
				break;
			}
			
		}
	}
}


function getTabs()
{
	var dictsObj = document.getElementById("dictsmenu");
	var ulObj;
	var tabList = new Array();
	for(var x = 0; x < dictsObj.childNodes.length; x++)
	{
		if (dictsObj.childNodes[x].tagName == "UL")
		{
			ulObj = dictsObj.childNodes[x];
		}
	}
	
	for(var x = 0; x < ulObj.childNodes.length; x++)
	{
		if (ulObj.childNodes[x].id)
		{
			tabList[tabList.length] = new Array(ulObj.childNodes[x].onclick, ulObj.childNodes[x].className, ulObj.childNodes[x]);
		}
	}
	return tabList;
}

function getCurrentTab(tabs)
{
	var current;
	for (var x = 0; x < tabs.length; x++)
	{
		//if (classNames.indexOf("current") != -1)
		//var classNames = tabs[x][1].split(/ /g)
		
		if (tabs[x][1].length > 32)
		{
			current = x;
		}
	}
	return current;
}
function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}


var dcTime=500;    // doubleclick time
var savEvtTime=0;  // save time of click event.
var savTO=null;    // handle of click setTimeOut

function detectDoubleClick(eventObj, eventOrigin) 
{
	if (isDoubleClick(eventObj))
   	{
		return doDoubleClick(eventObj, eventOrigin);
   	}

   	var d = new Date();
   	savEvtTime = d.getTime();
   	
   	return false;
}
 
function isDoubleClick(eventObj)
{
	if (eventObj.button > 1)
		return false;
 	
	var d = new Date();
	var now = d.getTime();
	if ((now-savEvtTime) < dcTime)
 	{
 		return true;
 	}
}
 
function doDoubleClick(eventObj,eventOrigin) 
{
	if (eventOrigin.className.match("wordBox"))
	{
		focusOnSearchBox(eventOrigin.value,false);
		submitSearchBox();
		return false;
	}
	return true;
}



document.onkeydown = catchKey;
document.onkeyup = catchKey;
document.onmousedown = catchMouse;
document.onmouseup = catchMouse;
