/* class BarManager */
function dx_BarManager() 
{
	this.evt = new dx_EventInfo();
	this.utl = new dx_Utils();
	this.obj = this.utl.CreateObjHelper();
	this.pos = this.utl.CreatePosHelper();
	this.bar = null;
	this.bars = [];
	
	this.CreateBar = function(id, properties) {
		var bar = new dx_BarElement(id);
		SetProperties(bar, properties);
		this.bars.Add(bar);
		return bar;
	}
	this.OnClick = function(e, id) {
		var el = this.evt.GetSrcElement(e);
		el = this.obj.GetParentById(el, "GroupItem");
		var bar = this.GetBarByID(id);
		var part = this.obj.GetParentByClass(el, "clsPart");
		
		if(Exists(bar) && part != null && el != null) {
			var action = "ItemClick";
			if( bar.containsAction(action) ) {
				var args = [["group", part.id], ["action", action], ["item", el.id]];
				__doPostBack(bar.uniqueID, DoEventArgs(args) );
			}
		}
	}
	this.OnDragStart = function(e) {
		var el = this.evt.GetSrcElement(e);
		if(el.className.indexOf("clsHead") >= 0) window.event.returnValue = false;
	}
	this.CollapseExpand = function(barID, partID) {
 		var bar = this.GetBarByID(barID);
		if(bar != null) {
			var part = bar.getPartByID(partID);
			if(part != null) {
				var visible = bar.isContentVisible(part) ? false : true;
				bar.setPartVisibility(part, visible);
			}
		}
	}
	this.StartDrag = function(e, barID, partID) {
		if(this.evt.IsLeftButton(e) == false) 
			return null;
		this.bar = this.GetBarByID(barID);
		if(this.bar != null) {
			var part = this.bar.getPartByID(partID);
			if(part != null) {
				this.bar.currentX = this.pos.GetEventX(e, window);
				this.bar.currentY = this.pos.GetEventY(e, window);
				this.bar.current = part;
				this.bar.showDragWindow();

				this.evtMove = window.document.onmousemove;
				window.document.onmousemove = function(e) { dxBar.Mng.OnMouseMove(e); }

				this.evtScroll = window.document.onscroll;
				window.document.onscroll = function(e) { dxBar.Mng.OnMouseMove(e); }

				this.evtUp = window.document.onmouseup;
				window.document.onmouseup = function(e) { dxBar.Mng.OnMouseUp(e); }

				this.evtSelect = window.document.onselectstart;
				window.document.onselectstart = function() { return dxBar.Mng.OnSelectStart(); }
			}
		}
	}
	this.GetBarByID = function(id) {
		for(var i = 0; i < this.bars.length; i++)
			if(this.bars[i].id == id) return this.bars[i];
		return null;
	}
	this.OnMouseMove = function(e) {
		var evt = this.evt.GetEvent(e);
		if(this.evt.IsLeftButton(e) == false && evt.button < 5) {
			this.OnMouseUp(e);
			return;
		}

		var x = this.pos.GetEventX(e, window);
		var	y = this.pos.GetEventY(e, window);
		var drag = this.bar.dragWindow.style;
		drag.left = parseInt(drag.left) + x - this.bar.currentX;
		drag.top = parseInt(drag.top) + y - this.bar.currentY;  
   		this.bar.currentX = x;
		this.bar.currentY = y;
		
		if(evt.clientY > window.document.body.clientHeight - 10) {
			window.scrollBy(0, 10);
		} else if(evt.clientY < 10) {
			window.scrollBy(evt.clientX, -10);
		}
	}
	this.OnMouseUp = function(e) {
		window.document.onmousemove = this.evtMove;
		window.document.onscroll = this.evtScroll;
		window.document.onmouseup = this.evtUp;
		window.document.onselectstart = this.evtSelect;
		if( Exists(this.bar.current) ) {
			this.bar.setDragPosition();
			this.bar.current = null;
			return true;
		} else { 
			return false;
		}
	}
	this.OnSelectStart = function() {
		return false;
	}
}

/* class BarElement */
function dx_BarElement(id) 
{
	this.inf = new dx_Info();
	this.utl = new dx_Utils();
	this.obj = this.utl.CreateObjHelper();
	this.pos = this.utl.CreatePosHelper();

	this.id = id;
	this.table = null;
	this.dragWindow = this.obj.GetElementById("DragWindow");
	this.dragWindow.style.cursor = "move";
	this.createUniqueID = function(s) { return this.id + s; }
	this.getPartParent = function() { return this.table.rows[0].cells[0]; }
	this.getBorderColor = function(part) { return ("open" == part.state) ? this.backColor : this.collapsedBorderColor; }
	this.getBackColor = function(part) { return ("open" == part.state) ? this.backColor : this.collapsedBackColor; }
	this.getForeColor = function(part) { return ("open" == part.state) ? this.foreColor : this.collapsedForeColor; }
	this.getSeparatorColor = function(part) { return ("open" == part.state) ? this.groupSeparatorColor : this.collapsedGroupSeparatorColor; }
	this.getLeftImage = function(part) { return ("open" == part.state) ? this.leftExpandedImage : this.leftCollapsedImage; }
	this.getRightImage = function(part) { return ("open" == part.state) ? this.rightExpandedImage : this.rightCollapsedImage; }
	this.formatFileName = function(name) { if("string" == typeof(name)) { name = name.replace( /[\W]/gi, "" ); return name; } }

	this.stateElem = this.obj.GetElementById( this.createUniqueID("_state") );
	this.sContentID = this.formatFileName(window.location.href);

	this.initialize = function() {
		if( Exists(this.table) ) { 
			return;
		}
		
		this.table = this.obj.GetElementById(this.id);
		this.setPartArray();
		var value = this.loadState();
		
		if(value != null) {
			this.setOrder(value);
		} else {
			value = this.stateElem.value;
			this.setOrder(value);
			this.saveState();                      
		}
	}
	this.setOrder = function(value) {
		var state = this.parseUserData(value);
		this.reorder(state);
	}
	this.parseUserData = function( s ) {
		try {
			var tmpArray = s.split( ";" );
			var array = new Array(tmpArray.length - 1);
			for(var i = 0; i < array.length; i++) {
				array[i] = tmpArray[i].split( "=" );
			}
			return array;
		} catch(e) { return null; }
	}
	this.getLayout = function() {
		if(Exists(this.layout) == false)
			this.layout = this.getChildById(this.table, this.id + "_layout");
		return this.layout;
	}
	this.getChildById = function(el, id) {
		return this.obj.GetChildById(el, id);
	}
	this.setPartArray = function() {
		var nodes = this.obj.ChildrenOf(this.table.rows[0].cells[0]);
		this.parts = [];
		for(var i = 0; i < nodes.length; i++)
			if("clsPart" == nodes[i].className) this.parts.Add( nodes[i] );
	}
	this.getPartByID = function(id) {
		for(var i = 0; i < this.parts.length; i++)
			if(this.parts[i].id == id) return this.parts[i];
		return null;
	}
	this.hideDragWindow = function() {
		var style = this.dragWindow.style;
		style.visibility = "hidden";
		//this.dragWindow.style.display = "none";
		style.height = "";
		style.top = "";
		style.left = "";
		style.width = "";
		style.zIndex = 0;
	}
	this.showDragWindow = function() {
		var part = this.current;
		var style = this.dragWindow.style;

		var height = part.offsetHeight;
		style.height = height;
		var pt = this.pos.GetAbsolutePos(part);
		style.top = pt.y + 3;
		style.left = pt.x + 3;
		style.width = part.offsetWidth;
		style.zIndex = 1000;
		//drag.style.display = "block";
		style.visibility = "visible";
	}
	this.containsAction = function(action) { 
		return (this.action.indexOf(action) != -1) ? true : false;
	}
	this.getState = function() {
		var state = "";
		try {		
			for(var i = 0; i < this.parts.length; i++) {
				var part = this.parts[i];
				var s = Exists( part.state ) ? part.state : "open";
				state += ( part.id + "=" + s + ";" );
			}
		} catch(e) {}
		return state;
	}
	this.loadState = function() {
		if(this.inf.ie && this.enableReadState) {
			var data = this.getLayout();
			try { data.load(this.sContentID + this.id); }
			catch(e) { data = null; }
			if( Exists(data) ) return data.getAttribute("userdata");
		}
		return null;
	}
	this.saveState = function() {
		var value = this.getState();
		this.stateElem.value = value;
		if(this.enableWriteState) {
			try {
				var data = this.getLayout();	
				data.setAttribute("userdata", value);
				data.save(this.sContentID + this.id);
			} catch(e) {}
		}
	}
	this.setPartPosition = function(part, nextPart) {
		var parent = this.obj.ParentOf(part);
		var lastPart = this.parts.Last();
		if(this.inf.ie4) {
			var index = (nextPart != null) ? GetItemIndex(parent.children, nextPart) : 1000;
			parent.innerHTML = this.getPartHTML(parent.children, this.current, index);
	//		InitElement( this );
		} else if(this.inf.dom) {
			var nextElem = (nextPart != null) ? nextPart : lastPart.nextSibling;
			parent.insertBefore(part, nextElem);
		}
	}   
	this.getPartHTML = function(siblings, part, partIndex) {
		var s = "";
		for(var i = 0; i < siblings.length; i++) {
			if(i == partIndex) s += part.outerHTML;
			try {
				var item = siblings[i];
				if(item == part) continue;
				s += item.outerHTML;
			} catch(e) {}
		}
		if(Exists(part) && partIndex >= siblings.length)
			s += part.outerHTML;
		return s;
	}
	this.getNextPartIndex = function(el) {
		var pte = this.pos.GetAbsolutePos(el);
		for(var i = 0; i < this.parts.length; i++) {
			var pt = this.pos.GetAbsolutePos(this.parts[i]);
			if(pt.y > pte.y) break;
		}
		return i;
	}   
	this.setDragPosition = function() {
		if(null == this.current) return;
		
		var part = this.current;
		var nextIndex = this.getNextPartIndex(this.dragWindow);
		this.hideDragWindow();
		var action = "Order";

		if( this.containsAction(action) ) {
			var index = nextIndex;
			if(this.parts.IndexOf(part) < index) index--;
			var args = [["group", part.id], ["action", action], ["visIndex", index]];
			__doPostBack(this.uniqueID, DoEventArgs(args) );
		}
		else {
			if(this.parts.IndexOf(part) != nextIndex) {
				var nextPart = this.parts[nextIndex];
				this.setPartPosition(part, nextPart);
				this.setPartArray();
				this.saveState();
			}
		}
	}
	this.reorder = function(state) {
		if(null == state) return;
		for(var i = 0; i < state.length; i++) {
			var id = state[i][0];
			if( this.parts[i].id != id ) {
				var nextPart = this.parts[i];
				var part = this.getChildById(this.table, id);
				if(part != null) {
					this.setPartPosition(part, nextPart);
					this.setPartArray();
				}
			}
		}
		var closed = false;
		for( var i = 0; i < this.parts.length; i++ ) {
			try { closed = (state[i][1] == "close"); } 
			catch(e) { closed = false; }
			this.setContentVisibility(this.parts[i], !closed);
		}
	}
	this.setContentVisibility = function(part, visible) {
		this.showContent(part, visible);
		part.state = visible ? "open" : "close";
	
		var img = this.getChildById(part, "LeftImage");
		if(img != null) img.src = this.getLeftImage(part);

		img = this.getChildById(part, "RightImage");
		if(img != null) img.src = this.getRightImage(part);
	
		var borderColor = this.getBorderColor(part);
		var bgColor = this.getBackColor(part);
		var color = this.getForeColor(part);
		var separatorColor = this.getSeparatorColor(part);
		for(var i = 0; i < part.rows.length; i++) {
			var row = part.rows[i];
			for(var j = 0; j < row.cells.length; j++) {
				var cell = row.cells[j];
				if(Exists(cell.className) == false)
					continue;
				var className = cell.className;
				if(className.indexOf("clsSeparator") != -1)
					cell.style.backgroundColor = separatorColor;
				if(className.indexOf("clsBorder") != -1)
					cell.style.backgroundColor = borderColor;
				else if(className.indexOf("clsHead") != -1)
					cell.style.backgroundColor = bgColor;
				if(className.indexOf("clsHeadText") != -1)
					cell.style.color = color;
			}
		}
	}
	this.setPartVisibility = function(part, visible) {
		var action = visible ? "Expand" : "Collapse";
		if(this.containsAction(action)) {
			var args = [["group", part.id], ["action", action]];
			__doPostBack(this.uniqueID, DoEventArgs(args) );
		} else {
			this.setContentVisibility(part, visible);
			this.saveState();                      
		}
	}
	this.isContentVisible = function(part) {
		if(this.inf.ie) {
			var content = this.getPartContent(part);
			return (content.style.display != "none");
		} else if(this.inf.dom) {
			return (Exists(part.content) == false);
		}
		return false;
	}
	this.showContent = function(part, visible) {
		if(this.inf.ie) {
			var display = visible ? "inline" : "none";
			var el = this.getPartContent(part);
			el.style.display = display;
			el = this.getBottomBorder(part);
			if(el!=null)
				el.style.display = display;
		} else if(this.inf.dom) {
			var container = this.getPartContainer(part);
			if(visible) {
				var child = this.getPartSeparator(part);

				if( Exists(part.content) ) {
   					container.insertBefore(part.content, child);
   					part.content = null;
   				}
				if( Exists(part.bottomBorder) ) {
   					container.insertBefore(part.bottomBorder, child);
   					part.bottomBorder = null;
   				}
			} else {
				part.content = this.getPartContent(part);
				if( Exists(part.content))
   					container.removeChild(part.content);
  				
 				part.bottomBorder = this.getBottomBorder(part);
				if( Exists(part.bottomBorder))
   					container.removeChild(part.bottomBorder);
			}
		}
	}
	this.getPartContainer = function(part) {
		return part.tBodies[0];
	}
	this.getPartContent = function(part) {
		return this.getChildById(part, "PartContent");
	}
	this.getBottomBorder = function(part) {
		return this.getChildById(part, "PartBottomBorder");
	}
	this.getPartSeparator = function(part) {
		return this.getChildById(part, "PartSeparator");
	}
}

// globals
var dxBar = [];
dxBar["Mng"] = new dx_BarManager();
dxBar["Evt"] = new dx_EventManager();
dxBar["Version"] = "1.0.0.10";

function CollapseExpand(barID, partID) { dxBar.Mng.CollapseExpand(barID, partID); }
function StartDrag(e, barID, partID) { dxBar.Mng.StartDrag(e, barID, partID); }
function OnBarClick(e, id) { dxBar.Mng.OnClick(e, id); }
function OnBarDrag(e) { dxBar.Mng.OnDragStart(e); }
function AppendBar(id, properties) { 
	var bar = dxBar.Mng.CreateBar(id, properties); 
	bar.initialize();
}

window.onerror = function() { 
	return true;
};
