function SwapGroup() {
	var o = new JSObj();
	o.oType = "SwapGroup";
	o._list = new Array();
	o.add = SwapGroup_add;
	o.getList = SwapGroup_getList;
	o.create();
	return o;
	
	function SwapGroup_add(oSwappable) {
		this._list[oSwappable.oID] = oSwappable;
		oSwappable.swapGroup = this;
	}

	function SwapGroup_getList() {
		return this._list;
	}
}

function Swappable() {
	this.setOn = Swappable_setOn;
	this.setOff = Swappable_setOff;
	this.setActive = new Function();
	function Swappable_setOn() { this.setActive(true); }
	function Swappable_setOff() { this.setActive(false); }
}

function SwappableDiv(oDiv, oButton, sStyle) {
	var o = new JSObj();
	o.oType = "SwappableDiv";
	implement(Swappable, o);
	o.onclick = SwappableDiv_onclick;
	o.setActive = SwappableDiv_setActive;
	o.setButtonActive = SwappableDiv_setButtonActive;
	o.swapGroup = null;
	o.button = oButton;
	o.button.setAttribute("listener",o);
	o.div = oDiv;
	o.style = sStyle;
	o.create();
	// needs to occur after create.
	o.button.onclick = getEventHandler(o, "onclick");
		
	return o;

	function SwappableDiv_onclick() {
		var oSwappables = this.swapGroup.getList();

		for (var i in oSwappables) {
			if (i != this.oID) {
				oSwappables[i].setOff();
			} else {
				oSwappables[i].setOn();
			}
		}
	}
	function SwappableDiv_setButtonActive(bActive) {
		if (bActive) {
			this.button.className=this.style + "Active";
			this.button.childNodes.item(0).style.color = "#ffffff";
		} else {
			this.button.className=this.style;
			this.button.childNodes.item(0).style.color = "";
		}
	}
	function SwappableDiv_setActive(bActive) {
		this.setButtonActive(bActive);
		var sStyle = bActive ? "" : "none";
		this.active = bActive;
		this.div.style.display = sStyle;
	}
}

function SwappableCompactDiv(aDivArray, oButton, sStyle) {
	var o = new SwappableDiv(null, oButton, sStyle);
	o._setActive = o.setActive;
	o.divArray = aDivArray;
	o.setActive = SwappableCompactDiv_setActive;
	return o;
		function SwappableCompactDiv_setActive(bActive) {
		var sStyle = bActive ? "" : "none";
		this.active = bActive;
		for (var i = 0; i < this.divArray.length; i++) {
			this.divArray[i].style.display = sStyle;
		}
		this.setButtonActive(bActive);
	}
}

function getEventHandler(oObj, sEvent) {
	var fName = oObj.oType + "_" + oObj.oID + "_" + sEvent;
	eval("function " + fName + "() { " + getObjRef(oObj) + "." + sEvent + "(); }");
	return eval(fName);
}
