
function wnd_property_dmenu(id,value,multiSelect) {
	this.id=id;

	this.items=Array();
	this.container=null;
	this.input=null;
	this.onChange=null;
	this.className='wnd_property_dmenu';
	this.list=null;
	this.button=null;
	this.multiSelect=multiSelect;

	this.multiSelectMayBeEmpty=true;

	this.offsetLeft=0;
	this.offsetTop=0;

	if(this.multiSelect)
		this.value='';
	else
		this.value=value;

	this.multiSelectItem=null;
	this.templates=new Array();

	// If there's not enough room to drop down, we drop up!
	this.dropUp=false;

	//this.value=value;

	this.setTemplate=function(name,template) {
		this.templates[name]=template;
	}

	this.setValue=function(value) {
		if(this.multiSelect) {
			this.value='';

			// multiSlect may not be empty, count selected
			if(!this.multiSelectMayBeEmpty) {
				countSelected=0
				for(iItems=0;iItems<this.items.length;iItems++) {
					if(this.items[iItems].selected)
						countSelected++;
				}
			}

			for(iItems=0;iItems<this.items.length;iItems++) {
				if(this.items[iItems].value==value) {
					if(!this.multiSelectMayBeEmpty && countSelected==1 && this.items[iItems].selected) {
						// We should not touch the last one selected!
					}
					else {
						this.items[iItems].selected=(!this.items[iItems].selected);
						this.items[iItems].showSelected();
					}
				}
				if(this.items[iItems].selected)
					this.value+=(this.value ? ';' : '')+this.items[iItems].value;
			}
			if(this.input)
				this.input.value=this.value;
		}
		else {
			doChange=false;
			if(value!=this.value && this.onChange)
				doChange=true;
			this.value=value;
			if(this.input)
				this.input.value=this.value;
			this.setSelected();
			if(doChange)
				this.onChange();
		}
	}

	this.getSelected=function() {
		for(iItems=0;iItems<this.items.length;iItems++) {
			if(this.items[iItems].selected==true)
				return this.items[iItems];
		}
	}
	this.setSelected=function() {
		for(iItems=0;iItems<this.items.length;iItems++) {
			if(!this.multiSelect)
				this.items[iItems].selected=false;
			if(this.items[iItems].value==this.value)
				this.items[iItems].selected=true;
		}
		this.update();
	}

	this.setMultiSelectItem=function(item) {
		item.menu=this;
		this.multiSelectItem=item;
		return item;
	}
	this.addItem=function(item) {
		item.menu=this;
		this.items.push(item);
		if(this.multiSelect) {
			if(item.selected)
				this.value+=(this.value ? ';':'')+item.value;
		}
		else {
			if(item.selected==true && item.value!=this.value) {
				this.value=item.value;
				this.setValue(item.value);
			}
			if(item.value==this.value)
				item.selected=true;
		}
		return item;
	}

	this.listShown=function() {
		if(!this.list)
			return false;
		if(this.list.style.display=='block') {
			return true;
		}
		return false;
	}
	this.toggleList=function() {
		if(this.listShown())
			this.hideList();
		else
			this.showList();
	}
	this.showList=function() {
		// Fix offset if parent is positioned absolute;
		if(this.container.parentNode) {
			if(this.container.parentNode.style.position=='absolute') {
				this.offsetLeft=this.container.parentNode.offsetLeft;
				this.offsetTop=this.container.parentNode.offsetTop;
			}
			else if(this.container.parentNode.tagName=='TD') {
				//this.offsetLeft=this.container.parentNode.offsetLeft;
				//this.offsetTop=this.container.parentNode.offsetTop;
			}
		}
		this.beforeShowValue=this.value;
		this.button.listShown();
		this.list.style.display='block';
		// BF20080303: Increase z-index
		this.container.style.zIndex++;
		if(document.documentElement.offsetHeight<this.container.offsetTop+this.container.offsetHeight +this.list.offsetHeight) {
			this.list.style.top=this.offsetTop-this.list.offsetHeight;
			this.dropUp=true;
		}
	}
	this.hideList=function() {
		if(!this.listShown())
			return false;
		this.button.listHidden();
		this.list.style.display='none';
		// BF20080303: Decrease z-index
		this.container.style.zIndex--;
		if(this.value!=this.beforeShowValue && this.onChange) {
			this.onChange();
			this.beforeShowValue=this.value;
		}
	}
	this.checkHideList=function(e,object,isList) {
		switch(this.dropUp) {
			case false:
			default:
				if(	object==this.container &&
					e.clientX > this.offsetLeft + object.offsetLeft &&
					e.clientX < this.offsetLeft + object.offsetLeft+object.offsetWidth &&
					e.clientY > this.offsetTop + object.offsetTop &&
					e.clientY < this.offsetTop + object.offsetTop+object.offsetHeight +this.list.offsetHeight)  {
						return false;
				}
				else if(object==this.list &&
					e.clientX > this.offsetLeft + object.offsetLeft &&
					e.clientX < this.offsetLeft + object.offsetLeft+object.offsetWidth &&
					e.clientY > this.offsetTop + object.offsetTop - this.container.offsetHeight &&
					e.clientY < this.offsetTop + object.offsetTop+object.offsetHeight+this.container.offsetHeight) {
						return false;
				}
				break;
			case true:
				if(	object==this.container &&
					e.clientX > this.offsetLeft + object.offsetLeft &&
					e.clientX < this.offsetLeft + object.offsetLeft+object.offsetWidth &&
					e.clientY > this.offsetTop + object.offsetTop -this.list.offsetHeight &&
					e.clientY < this.offsetTop + object.offsetTop+object.offsetHeight )  {
						return false;
				}
				else if(object==this.list &&
					e.clientX > this.offsetLeft + (object.offsetLeft | this.container.offsetLeft) &&
					e.clientX < this.offsetLeft +  (object.offsetLeft | this.container.offsetLeft) +object.offsetWidth &&
					e.clientY > (this.offsetTop + this.container.offsetTop - this.list.offsetHeight) &&
					e.clientY < (this.offsetTop + this.container.offsetTop+this.container.offsetHeight)) {
						return false;
				}
				break;
		}


		if(object==this.list) {
			/*
			debug_message("clientX: "+e.clientX);
			debug_message("container.offestLeft: "+this.container.offsetLeft);
			debug_message("offsetLeft: "+this.list.offsetLeft);
			debug_message("object.offsetWidth: "+object.offsetWidth);
			debug_message(e.clientX > this.offsetLeft + (object.offsetLeft | this.container.offsetLeft));
			debug_message(e.clientX < this.offsetLeft + (object.offsetLeft | this.container.offsetLeft) +object.offsetWidth );
			*/
			/*
			message="ClientX: "+e.clientX;
			message+=" Left Bound: "+object.offsetLeft;
			message+=" Right Bound: "+(object.offsetLeft+object.offsetWidth);
			message+=" ClientY: "+e.clientY;
			message+=" Top Bound: "+(object.offsetTop - this.container.offsetHeight);
			message+=" Bottom Bound: "+(object.offsetTop+object.offsetHeight+this.container.offsetHeight);
			debug_message(message);
			*/
		}
		return true;
	}

	this.updateSelected=function() {
		if(this.multiSelect) {
			oSelected=this.multiSelectItem.parse(this.templates['selected'],this.templates['action']);
		}
		else {
			oSelected=this.getSelected().parse(this.templates['selected'],this.templates['action']);
		}
		oSelected.onclick=function(e) {
			e = e || window.event;
			this.item.onClick(e);
			if(!e.cancelBubble)
				this.menu.showList();
		}
		return oSelected;
	}
	this.updateDropDown=function() {
		oDropDown=new wnd_property_dmenu_dropdown(this);
		this.button=oDropDown;
		oElement=oDropDown.parse(this.templates['ddbutton']);
		if((!this.multiSelect && this.items.length<2) || this.items.length<1) {

			oElement.style.display='none';
		}
		return oElement;
	}
	this.updateList=function(show) {
		oList=document.createElement('div');
		oList.menu=this;
		oList.onmouseout=function(e) {
			e = e || window.event;
			if(this.menu.checkHideList(e,this,true)) {
				this.menu.hideList();
			}
		}
		oList.className=this.className+'_list';
		if(!show)
			oList.style.display='none';
		else
			oList.style.display='block';
		oList.innerHTML=this.templates['list'].parse();
		//firstNode=oList.childNodes[0];
		for(iList=0;iList<this.items.length;iList++) {
			if(this.multiSelect || this.items[iList].selected==false) {
				oList.appendChild(this.items[iList].parse(this.templates['item'],this.templates['action']));
			}
		}

		this.list=oList;
		return oList;
	}
	this.update=function() {
		if(!this.container)
			return;

		this.container.innerHTML='';
		this.container.appendChild(this.updateSelected());
		this.container.appendChild(this.updateDropDown());
		this.container.appendChild(this.updateList(this.listShown()));
		if(this.listShown())
			this.button.listShown();

	}
	this.parse=function() {
		document.write('<div class="'+this.className+'" id="'+this.id+'"></div>');
		document.write('<input type="hidden" name="'+this.id+'" id="'+this.id+'_input" value="'+this.value+'">');
		this.container=document.getElementById(this.id);
		this.container.menu=this;
		this.container.onmouseout=function(e) {
			e = e || window.event;
			if(this.menu.checkHideList(e,this,false)) {
				this.menu.hideList();
			}
		}
		this.input=document.getElementById(this.id+'_input');
		this.update();
	}
}

function wnd_property_dmenu_item(title,value,image,action,selected) {
	this.menu=null
	this.title=title;
	this.value=value;
	this.image=image;
	this.selected=selected;
	this.actions=Array();
	this.action=action;
	this.container=null;

	this.baseClassName='';

	this.showSelected=function() {
		if(this.selected)
			this.container.childNodes[0].className=this.baseClassName+'_selected';
		else
			this.container.childNodes[0].className=this.baseClassName+'_hover';
	}
	this.onClick=function(e) {
		if(!this.action || this.action()!==false) {
			this.menu.setValue(this.value);
		}
		else {
			e.cancelBubble=true;
		}
	}
	this.addAction=function(action) {
		action.item=this;
		action.menu=this.menu;
		this.actions.push(action);
		return action;
	}

	this.onMouseOver=function() {
		this.container.childNodes[0].className=this.baseClassName+(this.menu.multiSelect &&  this.selected==true ? '_selected' : '')+'_hover';
	}
	this.onMouseOut=function(e) {
		this.container.childNodes[0].className=this.baseClassName+(this.menu.multiSelect &&  this.selected==true ? '_selected' : '');
	}
	this.onMouseDown=function() {
		this.container.childNodes[0].className=this.baseClassName+(this.menu.multiSelect &&  this.selected==true ? '_selected' : '')+'_down';
	}
	this.onMouseUp=function() {
		this.container.childNodes[0].className=this.baseClassName+(this.menu.multiSelect &&  this.selected==true ? '_selected' : '')+'_hover';
	}
	this.parseActions=function(oItem,actionTemplate) {
		oPlaceHolder=null;
		cElements=oItem.getElementsByTagName('div');
		for(iElements=0;iElements<cElements.length;iElements++) {
			if(cElements[iElements].id=='_tmp_wnd_property_item_actions') {
				oPlaceHolder=cElements[iElements];
				oContainer=oPlaceHolder.parentNode;
				break;
			}
		}
		if(!oPlaceHolder)
			return;
		for(iActions=this.actions.length-1;iActions>=0;iActions--) {
			oContainer.insertBefore(this.actions[iActions].parse(actionTemplate),oPlaceHolder);
		}
		oContainer.removeChild(oPlaceHolder);
	}
	this.parse=function (itemTemplate,actionTemplate) {
		oItem=document.createElement('div');
		oItem.item=this;
		oItem.menu=this.menu;
		oItem.onmouseover=function() { this.item.onMouseOver(); };
		oItem.onmouseout=function(e) { e = e || window.event;this.item.onMouseOut(e); };
		oItem.onmousedown=function() { this.item.onMouseDown(); };
		oItem.onmouseup=function() { this.item.onMouseUp(); };
		oItem.onclick=function(e) { e = e || window.event;this.item.onClick(e); };
		oItem.innerHTML=itemTemplate.parse({"TITLE" : this.title,"IMAGE" : this.image,'ACTIONS' : '<div id="_tmp_wnd_property_item_actions"></div>'});
		this.parseActions(oItem,actionTemplate);
		this.container=oItem;
		if(!this.container.hasChildNodes) {
			alert('Invalid templating on dmenu item! (No childNodes in container)');
		}
		this.baseClassName=this.container.childNodes[0].className;

		if(this.menu.multiSelect) {
			// Show selected only works with mouse action, we have to determine
			// the class ourselves
			//this.showSelected();
			if(this.selected)
				this.container.childNodes[0].className=this.baseClassName+'_selected';
		}

		return oItem;
	}
}

function wnd_property_dmenu_item_action(image,action) {
	this.image=image;
	this.action=action;
	this.item=null;
	this.menu=null;
	this.container=null;

	this.onClick=function(e) {
		e.cancelBubble=true;
		if(this.action)
			this.action();
	}
	this.onMouseOver=function(e) {
		//e.cancelBubble=true;
		this.container.childNodes[0].className=this.baseClassName+'_hover';
	}
	this.onMouseOut=function(e) {
		//e.cancelBubble=true;
		this.container.childNodes[0].className=this.baseClassName;
	}
	this.onMouseDown=function(e) {
		e.cancelBubble=true;
		this.container.childNodes[0].className=this.baseClassName+'_down';
	}
	this.onMouseUp=function(e) {
		e.cancelBubble=true;
		this.container.childNodes[0].className=this.baseClassName+'_hover';
	}

	this.parse=function(actionTemplate) {
		oAction=document.createElement('div');
		oAction.action=this;
		oAction.onmouseover=function(e) {e = e || window.event;this.action.onMouseOver(e); };
		oAction.onmouseout=function(e) { e = e || window.event;this.action.onMouseOut(e); };
		oAction.onmousedown=function(e) { e = e || window.event;this.action.onMouseDown(e); };
		oAction.onmouseup=function(e) { e = e || window.event;this.action.onMouseUp(e); };
		oAction.onclick=function(e) { e = e || window.event; this.action.onClick(e); };

		oAction.innerHTML=actionTemplate.parse({"IMAGE" : this.image});
		this.container=oAction;
		if(!this.container.hasChildNodes) {
			alert('Invalid templating on dmenu item! (No childNodes in container)');
		}
		this.baseClassName=this.container.childNodes[0].className;
		return oAction;
	}
}

function wnd_property_dmenu_dropdown(menu) {
	this.menu=menu;
	this.container=null;

	this.baseClassName='';

	this.onClick=function(e) {
		this.menu.toggleList();
		//e.cancelBubble=true;
	}

	this.onMouseOver=function() {
		if(!this.menu.listShown())
			this.container.childNodes[0].className=this.baseClassName+'_hover';
	}
	this.onMouseOut=function() {
		if(!this.menu.listShown())
			this.container.childNodes[0].className=this.baseClassName;
	}
	this.onMouseDown=function() {
		this.container.childNodes[0].className=this.baseClassName+'_down';
	}
	this.onMouseUp=function() {
		if(!this.menu.listShown())
			this.container.childNodes[0].className=this.baseClassName+'_hover';
	}
	this.listShown=function() {
		this.container.childNodes[0].className=this.baseClassName+'_down';
	}
	this.listHidden=function() {
		this.container.childNodes[0].className=this.baseClassName;
	}
	this.parse=function (dropdownTemplate) {
		oItem=document.createElement('div');
		oItem.item=this;
		oItem.menu=this.menu;
		oItem.onmouseover=function() { this.item.onMouseOver(); };
		oItem.onmouseout=function() { this.item.onMouseOut(); };
		oItem.onmousedown=function() { this.item.onMouseDown(); };
		oItem.onmouseup=function() { this.item.onMouseUp(); };
		oItem.onclick=function(e) { e = e || window.event;this.item.onClick(e); };
		oItem.innerHTML=dropdownTemplate.parse({"TITLE2" : this.title});
		this.container=oItem;
		if(!this.container.hasChildNodes) {
			alert('Invalid templating on dmenu dropdown button! (No childNodes in container)');
		}
		this.baseClassName=this.container.childNodes[0].className;
		return oItem;
	}
}
