/*
	DOM Pannels & Content Menus
		
*/
var debug = function () {};

function __isIe()
{
	if (navigator.userAgent.indexOf('MSIE') != -1)
		return true;
	else
		return false;
}


function Repository()
{
  this.addItem = function (id,obj) 
  {
        this[id+'_titem'] = obj;
        return obj;
  }
  this.addNode = function (id)
  {
  		this[id] = new Repository();
  }
  this.__splitHardId = function (__hardId)
  {
	__matches = __hardId.split(/\./gi);
	if (__matches)
		return {hvalue:__matches[0],lvalue:__matches[1]};
	else
		return false;
  }
  this.__returnObjectById = function (__objId,__part)
  {
  	if (!this.__splitHardId(__objId))
  	{
  		if (this[__objId])
  			return this[__objId];
  		else
  			return null;
  	}
  	else
  	{
  		__normalId = this.__splitHardId(__objId);
  		if (!__normalId.hvalue || !__normalId.lvalue)
  			return null;
  		switch (__part)
  		{
  			case 'low': 
  				if (this[__normalId.hvalue][__normalId.lvalue])
  					return this[__normalId.hvalue][__normalId.lvalue];
  				else 
  					return null;
  				break;
  			case 'hiegh':
  			default:
  				if (this[__normalId.hvalue])
  					return this[__normalId.hvalue];
  				else 
  					return null;
  		}
  	}
  }
  this.assignObjectToNode = function (id,object)
  {
  	this[id].object = object;
  }
}


var generalRepository = new Repository();

function Pannel(id,options)
{
	generalRepository.addNode('pannel_'+id);
	this.id = id;
	this.options = options;
	this.addChild = function (id,options)
	{
		generalRepository['pannel_'+this.id].addItem(id,new  panel_Button('pannel_'+this.id+'.'+id,'pannel_'+this.id,options));
	}
	this.setParent = function (__parent)
	{
		if (document.getElementById(__parent))
			__parent = document.getElementById(__parent);
	    if ('BODY' == __parent.tagName || 'content' == __parent.id)
	       this.pannel_element.style.width = '';
	    else
		   this.pannel_element.style.width = getElementPosition(__parent).width + 'px';
		if (!this.options.insertMode)
			__parent.appendChild(this.pannel_element);
		else
			switch (this.options.insertMode)
			{
				case 'before':
					__parent.parentNode.insertBefore(this.pannel_element,__parent);
					break;
				case 'after':
					__parent.parentNode.insertBefore(this.pannel_element,__parent);
					__parent.parentNode.insertBefore(__parent,this.pannel_element);
					break;
				case 'append_first':
					__parent.insertBefore(this.pannel_element,__parent.firstChild);
					break;
				case 'append':
				default:
					__parent.appendChild(this.pannel_element);
			}
	}
	this.pannel_element = document.createElement('div');
	if (this.options && this.options.className)
		this.pannel_element.className = this.options.className;
	this.pannel_element.id = 'pannel_'+id;
	generalRepository.assignObjectToNode('pannel_'+id,this)
}

function panel_Button(id,parent_id,options) 
{
	this.id = id;
	this.options = options;
	this.button_click = function (event)
	{ 	    
	    if (document.all)
	    {
	    	__elementId =  event.srcElement.id ? event.srcElement.id : event.srcElement.pid;
	        __container = generalRepository.__returnObjectById(__elementId,'low');
	    	__self = event.srcElement;
	    }
	    else
	    {
	        __elementId =  event.target.id ? event.target.id : event.target.pid;
	    	__container = generalRepository.__returnObjectById(__elementId,'low');
	    	__self = event.target;
	    }     
	    _alert('Button "'+__container.options.title+'" clicked');
		eval(__container.options.clickAction);
	}
	this.button_element = document.createElement('a');
	this.button_element.href = (options.href?_base_uri + options.href:'#');
	this.button_element.className = this.options.className;
	this.button_element.id = id+'_titem';	
	if (options.img)
	{
		button_image = document.createElement('img');
		button_image.src = _base_uri + options.img;
		button_image.alt = options.alt ? options.alt : options.title;
		button_image.title = options.alt ? options.alt : options.title;
		button_image.pid = this.button_element.id;
		this.button_element.appendChild(button_image);
		
	}
	var button_text = document.createTextNode(' '+this.options.title);
	this.button_element.appendChild(button_text);
	if(document.addEventListener)
		this.button_element.addEventListener('click', this.button_click,false);
	else
		this.button_element.attachEvent("onclick", this.button_click);
    if (options.enabled)
        this.button_element.className += options.enabled == 'yes' ? '' : ' disabled';
	document.getElementById(parent_id).appendChild(this.button_element);  
}

function Menu(id,options)
{
	//alert(id);
	generalRepository.addNode('menu_'+id);
	this.id = id;
	if (options.sub)
		options.sub = 'menu_' + options.sub;
	this.options = options;
	if (!options.sub)
		__menus['menu_'+id] = new Array();
	this.subs = new Array();
	this.fade = function (elem)
	{
		if (typeof(elem) != 'object')
			elem = document.getElementById(elem);
		if (elem.style.opacity < 1)
		{
			x = elem.style.opacity*1 + 0.2;
			elem.style.opacity = x;
			elem.style.filter ='alpha(opacity='+x*100+')';
			tm = setTimeout('generalRepository["menu_'+this.id+'"].object.fade("menu_'+this.id+'");',75);
		}
	}
	this.addItem = function (id,options)
	{
		generalRepository['menu_'+this.id].addItem(id,new  menu_Item('menu_'+this.id+'.'+id,this.id+'_items_container','menu_'+this.id,options));
		if (options.sub)
			this.subs[this.__menu_sub_items++] = options.sub;
	}
	this.addRecursive = function (__items)
	{
		//alert(__items);
		for (var k in __items)
		{
			//alert(__items[k]);
			this.addItem('item_'+k,__items[k]);
		}
	
	}
	this.findEquealParent = function ()
	{
		if (!__isIe())
		{
			__parent = document.getElementsByTagName('body')[0];
		}
		else if (document.getElementsByTagName('div')[0])
		{
			__parent = document.getElementsByTagName('div')[0];
		}
		else if (document.getElementsByTagName('p')[0])
			__parent = document.getElementsByTagName('div')[0];
		else if (document.getElementsByTagName('td')[0])
			__parent = document.getElementsByTagName('td')[0];
		else 
			__parent = null;
		return __parent;
	}
	this.hide = function ()
	{
		if (this.options && !this.options.donothide)
		{
			document.getElementById('menu_'+this.id).style.display = 'none';
			this.hideSubs();
		}
	}
	this.contentClick = function (e)
	{
		if (!e) e = window.event;
		if (document.all)
	    {
	    	if (e.srcElement.id)
	    	{
	    		__self = e.srcElement;
	    		__menu = generalRepository[__context_menu[e.srcElement.id]].object;
	    		__target_id = e.srcElement.id;
	    	}
	    }
	    else
	    {
	    	if (e.target.id)
	    	{
	    		
	    		__self = e.target;
	    		__menu = generalRepository[__context_menu[e.target.id]].object;
	    		__target_id = e.target.id;
	    	}
	    }     
		if (e.pageX || e.pageY)
		{
			posx = e.pageX;
			posy = e.pageY;
		}
		else if (e.clientX || e.clientY) 	
		{
			posx = e.clientX + document.body.scrollLeft
				+ document.documentElement.scrollLeft;
			posy = e.clientY + document.body.scrollTop
				+ document.documentElement.scrollTop;
		}

		__menu.show('',{left:posx,top:posy});
		return false;
	}
	this.installContentMenu = function (__parent,__action)
	{
		if (document.getElementById(__parent))
			__parent = document.getElementById(__parent);
		__context_menu[__parent.id] = 'menu_' + this.id; 
		if (__action)
		{
			if (!this.options.contentAction)
				this.options.contentAction = new Array();
			this.options.contentAction[__parent.id] = __action;
		}
	}
	this.show = function (__parent, __position)
	{
		if (document.getElementById(__parent))
			__parent = document.getElementById(__parent);
		document.getElementById('menu_'+this.id).style.display = 'block';
	
		if (typeof(__position) == 'object')
		{
			if (__parent != '') {
				var __parent_position = getElementPosition(__parent);
				if (__isIe()) {
					__position.top = __position.top - 75;
					
				}
				document.getElementById('menu_'+this.id).style.left = (__parent_position.left + __position.left)  + 'px';
				document.getElementById('menu_'+this.id).style.top = (__parent_position.top + __position.top) + 'px';				
			}
			else {
				if (__isIe()) {
					__position.top = __position.top - 75;
				}
				document.getElementById('menu_'+this.id).style.left = __position.left  + 'px';
				document.getElementById('menu_'+this.id).style.top = __position.top + 'px';
			}
		} 
		else
		{
			var __parent_position = getElementPosition(__parent);
			if (__position == 'bottom')
			{
				if (__isIe()) {
					__parent_position.top = __parent_position.top - 75;
					
				}				
				document.getElementById('menu_'+this.id).style.left = __parent_position.left  + 'px';
				document.getElementById('menu_'+this.id).style.top = __parent_position.top + __parent_position.height + 'px';
			}
			else
			{
				if (__isIe()) {
					__parent_position.top = __parent_position.top - 75;
					
				}				
				document.getElementById('menu_'+this.id).style.left = __parent_position.left + __parent_position.width + 'px';
				document.getElementById('menu_'+this.id).style.top = __parent_position.top + 'px';
			}
		}
		if (this.options.fade)
		{
			document.getElementById('menu_'+this.id).style.opacity = .2;
			document.getElementById('menu_'+this.id).style.filter ='alpha(opacity=20)';
			tm = setTimeout('generalRepository["menu_'+this.id+'"].object.fade("menu_'+this.id+'");',75);
		}
	}
	this.hideSubs = function ()
	{
		if (this.subs)
			for (var k in this.subs)
				generalRepository[this.subs[k]].object.hide();
	}
	this.textClick = function (event)
	{
		if (document.all)
	    {
	    	if (event.srcElement.id)
	    	{
	    	__container = generalRepository.__returnObjectById(event.srcElement.id,'low');
	    	__self = event.srcElement;
	    	__menu = generalRepository[generalRepository.__splitHardId(event.srcElement.id).hvalue].object;
	    	}
	    }
	    else
	    {
	    	if (event.target.id)
	    	{
	    		__container = generalRepository.__returnObjectById(event.target.id,'low');
	    		__self = event.target;
	    		__menu = generalRepository[generalRepository.__splitHardId(event.target.id).hvalue].object;
	    	}
	    }     
		if (__container)
		{
			hide_all_menu();
			eval(__menu.options.contentAction)
		}
	}
	this.addTextBlock = function (__content)
	{
		content = document.getElementById('menu_'+this.id+'.textcontainer_titem');
		for (var key_id in __content.text)
		{
			content_text = document.createTextNode(__content.text[key_id]);
			content.appendChild(content_text);
			content.appendChild(document.createElement('br'));
		}
		if(document.addEventListener)
			content.addEventListener('click',this.textClick,false);
		else
			content.attachEvent('onclick',this.textClick);
		this.options.contentAction = __content.action;
	}
	this.menu_element = document.createElement('div');
	if (this.options && this.options.className)
		this.menu_element.className = this.options.className;
	this.menu_element.id = 'menu_'+id;
	if (this.options.textBlock)
	{
		menu_items = document.createElement('div');
		menu_items.id = 'menu_'+this.id+'.textcontainer_titem';
		if (options.tbClassName)
			menu_items.className = options.tbClassName;
		generalRepository['menu_'+this.id].addItem('textcontainer',menu_items);
		this.menu_element.appendChild(menu_items);
	} else
	{
		menu_items = document.createElement('ul');
 		menu_items.id = id+'_items_container';
		this.__menu_sub_items = 0;
		this.menu_element.appendChild(menu_items);
	}
 	if (this.options.pre_html)
 		this.menu_element.innerHTML = this.options.pre_html + this.menu_element.innerHTML;	

	if (this.options.post_html)
		this.menu_element.innerHTML += this.options.post_html;	
	
 	if (this.findEquealParent)
 	{
		__parent = this.findEquealParent()
 		__parent.appendChild(this.menu_element);
 	}
	generalRepository.assignObjectToNode('menu_'+id,this);
	document.body.onmousedown = set_content_holder;
	///alert(id);
}

function menu_Item(id,parent_id,menu_id,options) 
{
	this.id = id;
	if (options.sub)
		options.sub = 'menu_' + options.sub;
	this.options = options;
	this.options.parent_id = parent_id;
	this.options.menu_id = menu_id;
	this.mouse_over = function (event)
	{
	    if (document.all)
	    {
	    	if (event.srcElement.id)
	    	{
	    	__container = generalRepository.__returnObjectById(event.srcElement.id,'low');
	    	__self = event.srcElement;
	    	__menu = generalRepository[generalRepository.__splitHardId(event.srcElement.id).hvalue].object;
	    	}
	    }
	    else
	    {
	    	if (event.target.id)
	    	{
	    		__container = generalRepository.__returnObjectById(event.target.id,'low');
	    		__self = event.target;
	    		__menu = generalRepository[generalRepository.__splitHardId(event.target.id).hvalue].object;
	    	}
	    }     
		if (__container)
		{
	    	__menu.hideSubs();
	    	if (__container.options.sub)			
	    		generalRepository[__container.options.sub].object.show(__self, '');
		}
	}
	this.click = function (event)
	{
		hide_all_menu;
	    if (document.all)
	    {
	    	if (event.srcElement.id)
	    	{
	    	__container = generalRepository.__returnObjectById(event.srcElement.id,'low');
	    	__self = event.srcElement;
	    	__menu = generalRepository[generalRepository.__splitHardId(event.srcElement.id).hvalue].object;
	    	}
	    }
	    else
	    {
	    	if (event.target.id)
	    	{
	    		__container = generalRepository.__returnObjectById(event.target.id,'low');
	    		__self = event.target;
	    		__menu = generalRepository[generalRepository.__splitHardId(event.target.id).hvalue].object;
	    	}
	    }
	    _alert('Menu clicked');
	    debug(__container.onClick);
		if (__container.onClick != undefined)
			__container.onClick(event)
	}
	this.menu_item = document.createElement('li');
	menu_link = document.createElement('a');
	menu_link.id = id+'_titem';
	if (this.options.img != '') {
		menu_image = document.createElement('img');
		menu_image.src = (this.options.img != ''?_base_uri+this.options.img:_base_uri+'/var/images/16/empty.gif');
		menu_image.alt = this.options.title;
	}
	
	menu_link.href = (this.options.url?_base_uri + this.options.url:'#');
	if (this.options.clickAction != undefined && this.options.clickAction != '')
	try {
		//this.onClick =
		 eval('this.onClick = ' + this.options.clickAction);
		_alert('adding event to menu item');
	}
	catch (e)
	{
		debug(e);
	}
	debug(this.onClick);
	addEvent('click',this.click,menu_link);
	addEvent('mouseover',this.mouse_over,menu_link);
	if (this.options.statusHint)
	{
		menu_link.statusHint = this.options.statusHint;
		addEvent('mouseover',showStatusHint,menu_link);
		addEvent('mouseout',hideStatusHint,menu_link);
	}
	
    menu_item_title = document.createTextNode(' '+this.options.title);
	if (this.options.sub)
	{
		more_image = document.createElement('img');
		more_image.src = _base_uri+'/var/images/16/menu_more.gif';
  		more_image.style.cssText = 'float:right; display: block;';
		menu_link.appendChild(more_image);
	}
	if (this.options.img != '') 
		menu_link.appendChild(menu_image);
	menu_link.appendChild(menu_item_title);
	this.menu_item.appendChild(menu_link);
  	document.getElementById(parent_id).appendChild(this.menu_item); 
}


var __menus = new Array();
var _base_uri = '';
var t_editor_id = '';
var __context_menu = new Array();
var __prevent_hide = false;

function getElementPosition(elem)
{
	if 	(document.getElementById(elem))
		elem = document.getElementById(elem);
   	var w = elem.offsetWidth;
   	var h = elem.offsetHeight;
	
    var l = 0;
    var t = 0;

    while (elem)
    {
        l += elem.offsetLeft;
        t += elem.offsetTop;
        elem = elem.offsetParent;
    }

    return {"left":l, "top":t, "width": w, "height":h};
}

function hide_all_menu()
{
	if (__prevent_hide)
	{
		__prevent_hide = false;
		return;
	}
	for ( var k in __menus)
		if (generalRepository[k])
			generalRepository[k].object.hide();
}

function set_content_holder(event)
{
	if (event == null) 
		event = window.event; 
	
	var target = ( event.srcElement? event.srcElement : event.target);
	
	if (event.button == 2 && __context_menu[target.id])
	{
		hide_all_menu();
		document.body.oncontextmenu = generalRepository[__context_menu[target.id]].object.contentClick;
		if (generalRepository[__context_menu[target.id]].object.options.contentAction[target.id])
			eval(generalRepository[__context_menu[target.id]].object.options.contentAction[target.id]);

	}
	else
	{
		document.body.oncontextmenu = null;
		setTimeout("hide_all_menu()",250);
	}	
}

//if (__isIe())
//addEvent('click',set_content_holder,window);

