function elementHandler_Engine() {
	this.properties = {};
}

elementHandler_Engine.prototype = {

	 parseTag: function(tag) {
		var elements = document.getElementsByTagName(tag);
		var l = elements.length;

		// walk input elements
		for (var i=0; i<l; i++)
		{
			var eID = elements[i].id;

			// skip items without ID attribute
			if ( !eID ) continue;

			if ( 
				!this.hasClass(elements[i].className, 'toggle') &&
				!this.hasClass(elements[i].className, 'togglerec') &&
				!this.hasClass(elements[i].className, 'ml') && 
				!this.hasClass(elements[i].className, 'jmp')
				)
			{
				continue;
			}

			// initalize properties for element
			this.properties[eID] = {'events': {}};

			var classList = elements[i].className.split(" ");
			for (var j=0; j<classList.length; j++)
			{
				prop = classList[j].split(":");
				switch (prop[0])
				{
					case 'ml':
						this.elementAdd(eID, 'keydown');
						this.properties[eID]['ml'] = prop[1];
						break;

					case 'jmp':
						this.properties[eID]['jmp'] = prop[1];
						break;

                    case 'toggle':
						this.elementAdd(eID, 'click');
						this.properties[eID]['toggle'] = prop[1];
                        break;

                    case 'togglerec':
						this.elementAdd(eID, 'click');
						this.properties[eID]['togglerec'] = prop[1];
						this.properties[eID]['tag'] = prop[2];
                        break;
				}
			}
		}

	},

	hasClass: function(c, s) {
		var classList = c.split(" ");
		for (var j=0; j<classList.length; j++)
		{
			prop = classList[j].split(":");
			if (prop[0] == s)
			{
				return true;
			}
		}
		return false
	},

	// register event to element only once
	elementAdd: function(eID, evt) {
		if ( this.properties[eID]['events'][evt] )
			return false;

		this.properties[eID]['events'][evt] = 1;
		Event.register(evt, function (e) {ElementHandler.events(e,eID)}, document.getElementById(eID));
	},

	events: function(e, eID) {
		if (!e) var e = window.event;
		var found = 0;

		// cursor mozgatok, backspace, tab, enter, esc
        if (typeof(e) != 'undefined') {
            if ( e.keyCode == 37 || e.keyCode == 38 || e.keyCode == 39 || e.keyCode == 40 || e.keyCode == 8 || e.keyCode == 9 || e.keyCode == 13 || e.keyCode == 27 || e.altKey || e.ctrlKey || e.shiftKey ) {
                return;
            }
        }

		if ( ElementHandler.properties[eID]['ml'] )
		{
			found = 1;

            var obj = document.getElementById(eID);
            var ml = ElementHandler.properties[eID]['ml'];
            var jmp = ElementHandler.properties[eID]['jmp'];

			if ( obj.value.length == ml && jmp )
			{
                document.getElementById(jmp).focus();
                return true;
			} 

            if ( obj.value.length >= ml  ) {
                stopEvent(e)
            }

		}
        
        if ( ElementHandler.properties[eID]['toggle'] )
		{
			found = 1;
			var o = document.getElementById(ElementHandler.properties[eID]['toggle'])
			if (o.style.display == 'none')
			{
				o.style.display = 'block';
			} else {
				o.style.display = 'none';
			}
		}

		if ( ElementHandler.properties[eID]['togglerec'] )
		{
			found = 1;

            var tmp = ElementHandler.properties[eID]['togglerec'].split("-");
            
    		var elements = document.getElementsByTagName(ElementHandler.properties[eID]['tag']);
    		var l = elements.length;

            for (var i=0; i<l; i++)
            {
    			var classList = elements[i].className.split(" ");
                for (var j=0; j<classList.length; j++)
                {
                    prop = classList[j].split(":");
                    if (prop[0] == 'togglerec-items' && prop[1] == tmp[0] ) {
                        elements[i].style.display = 'none'
                    }
                }
            }

			var o = document.getElementById(ElementHandler.properties[eID]['togglerec'])
            o.style.display = 'block';

		}

	}

}

var ElementHandler = new elementHandler_Engine();

