﻿/*
	File：通用浮动选择窗
	Author：elvis@dotop
	Update：3:53 2008-5-12
*/

function floatSelectCls()
{
	var dSelect, dCheck, dList;
	this.Arr = new Array();
	this.LimitNum = 0;
	this.NoSelect = 0;
	this.domFrm = '';
	this.DomName1 = '';
	this.TitleName = 'CM Select Div Demo.';
	this.TipsName = 'Your data:(cm demo)';

	this.OpenState = 0;
	this.CheckNum = 0;
	this.CheckStr = '';
	this.parentStr = '';
	this.thirdNum = 0;
	this.OtherS = '';
	this.defValue = '';
	
	this.liTag = 'LI';
	this.quotTag = '';
	this.spaceTag = ' ';
	this.checkList1 = '<LI><INPUT id=ListO_[sIDs] onclick="[parent]fslCls.delStr(this, [bID])" type=checkbox CHECKED><LABEL class=none title=[str] for=ListO_[sIDs]>[str]</LABEL></LI>';
	this.checkList2 = '<LI><INPUT id=ListO_[sIDs] onclick="[parent]fslCls.delStr(this, [bID], \'[str]$[sID]\')" type=checkbox CHECKED><LABEL class=none title=[str] for=ListO_[sIDs]>[str]</LABEL></LI>';
	if(is_ns)
	{
		this.liTag = 'li';
		this.quotTag = '"';
		this.spaceTag = '"';
		this.checkList1 = '<li><input id="ListO_[sIDs]" onclick="[parent]fslCls.delStr(this, [bID])" checked="checked" type="checkbox"><label class="none" title="[str]" for="ListO_[sIDs]">[str]</label></li>';
		this.checkList2 = '<li><input id="ListO_[sIDs]" onclick="[parent]fslCls.delStr(this, [bID], \'[str]$[sID]\')" checked="checked" type="checkbox"><label class="none" title="[str]" for="ListO_[sIDs]">[str]</label></li>';
	}

	this.init = function()
	{
		var tB = '';
		tB += '<div class="purple" id="cmSelectDv" style="width:660px; display:none"><div class="purple_h_out"><div class="purple_h_in"><button type="button" class="purple_close" onclick="fslCls.closeDiv()"></button><span id="fslCls.TitleName">loading...</span></div></div>';
		tB += '		<div class="purple_con">';
		tB += '			<p id="fslCls_SelectDiv"><strong>请选择：</strong></label><select id="selectObj"></select></p>';
		tB += '			<div id="listDiv"></div>';
		tB += '			<div>';
		tB += '				<hr size="1" color="#DDDDDD" />';
		tB += '				<p><strong id="fslCls.TipsName">loading...</strong></p>';
		tB += '				<ul class="item-7" id="checkDiv"></ul>';
		tB += '			</div>';
		tB += '			<hr size="1" color="#DDDDDD" />';
		tB += '			<p class="center">';
		tB += '				<button type="button" class="submit_btn four" onclick="fslCls.goSubmit(\'cmSelectDv\')">确定选择</button>';
		tB += '				<button type="button" class="cancel_btn" onclick="fslCls.closeDiv()">取消/关闭</button>';
		tB += '			</p>';
		tB += '		</div>';
		tB += '		<div class="purple_b_out"><div class="purple_b_in"></div></div>';
		tB += '</div>';
		document.write(tB);
	}
	this.init();

	//检测bID_sID是否已被选中
	this.isChecked = function(sID)
	{
		if(-1 == this.CheckStr.indexOf('ListO_' + sID + '_')) return false;
		else return true;
	}

	//获得checklist li
	this.getCheckbox = function(bID, str, isBig)
	{
		if('undefined' == typeof(str)) return;
		var arr = str.toString().split('$');
		
		var tStr = this.checkList2;
		if(this.NoSelect) bID = 0;
		else
		{
			if(isBig > 0) tStr = this.checkList1;
		}		
		if(bID < 0) bID = 0;
		//alert('debug->' + bID + ',' + str + ',' + isBig + ',' + this.NoSelect + '\n\n' + tStr);
		
		while(-1 != tStr.indexOf('[parent]')) tStr = tStr.replace('[parent]', this.parentStr);
		while(-1 != tStr.indexOf('[bID]')) tStr = tStr.replace('[bID]', bID);
		if(1 == this.OpenState)
			while(-1 != tStr.indexOf('[sIDs]')) tStr = tStr.replace('[sIDs]', arr[1] + '_cmOtherS');
		else
			while(-1 != tStr.indexOf('[sIDs]')) tStr = tStr.replace('[sIDs]', arr[1] + '_' + this.OtherS);
		while(-1 != tStr.indexOf('[sID]')) tStr = tStr.replace('[sID]', arr[1]);
		while(-1 != tStr.indexOf('[str]')) tStr = tStr.replace('[str]', arr[0]);
		
		return tStr;
	}

	//检查当前索引号
	this.checkIndex = function()
	{
		var tStr = this.CheckStr;
		var tFlag = 'fslCls.delStr(this, ';
		var tNum = tStr.indexOf(tFlag);
		var cNum = 0, mNum = 99;
		while(-1 != tNum)
		{
			tStr = tStr.substr(tNum + tFlag.length);
			tNum = tStr.indexOf(',');
			if(-1 == tNum) tNum = tStr.indexOf(')');
			cNum = parseInt(tStr.substr(0, tNum));
			if(cNum < mNum) mNum = cNum;
			dSelect.options[cNum].style.background = '#ffff99';
			tNum = tStr.indexOf(tFlag);
		}
		if(99 == mNum) mNum = 0;
		dSelect.options[mNum].selected = true;
		return true;
	}

	//载入选择框
	this.loadSelect = function()
	{
		this.OpenState = 1;
		
		dSelect = $('selectObj');
		dCheck = $('checkDiv');
		dList = $('listDiv');
		
		//初始化
		$('fslCls.TitleName').innerHTML = this.TitleName.replace('[LimitNum]', this.LimitNum);
		$('fslCls.TipsName').innerHTML = this.TipsName.replace('[LimitNum]', this.LimitNum);
		
		this.CheckNum = 0;
		this.CheckStr = '';
		eval('var tO = ' + this.domFrm + 'document.getElementById(\'' + this.DomName1 + '2\');');
		if(tO) this.CheckStr = tO.innerHTML;
		if(this.CheckStr)
		{
			var tArr = this.CheckStr.split('<' + this.liTag + '>');
			this.CheckNum = tArr.length - 1;
		}
		while(-1 != this.CheckStr.indexOf(this.OtherS)) this.CheckStr = this.CheckStr.replace(this.OtherS, 'cmOtherS');
		//alert(this.OtherS + '\n\n' + this.CheckStr);
		dCheck.innerHTML = this.CheckStr;
		
		//不需选择
		var Arr = this.Arr;
		
		if(this.NoSelect)
		{
			dSelect.style.visibility = 'hidden';
		}
		else
		{
			dSelect.style.visibility = 'visible';
			dSelect.style.display = '';
			
			while(dSelect.options.length) dSelect.remove(0);
			
			for(var i = 0; i < Arr.length; i++)
			{
				var tArr = Arr[i][0].split('$');
				var tO1 = new Option;
				tO1.text = tArr[0];
				tO1.value = tArr[1];
				dSelect.options.add(tO1);
			}
			
			addEvent(dSelect, 'change', this.loadList);
			
			this.checkIndex();
		}
		
		this.loadList();
	}

	//载入可选列表
	this.loadList = function()
	{
		var bID = dSelect.selectedIndex;
		var tArr = (this.NoSelect ? fslCls.Arr : fslCls.Arr[bID]);
		
		//检测大类的一些属性
		var tB = '<hr size="1" color="#DDDDDD" />';
		var iStart = 0;
		if(!this.NoSelect)
		{
			iStart = 1;
			
			//显示大类
			var tipStr = '';
			if(tArr.length > 1) tipStr = '(选择此大类，将包括以下所有小类)';
			
			var arr = tArr[0].toString().split('$');
			var RootID = arr[1];
			
			var tChecked = '';
			if(fslCls.isChecked(RootID)) tChecked = ' checked';
			
			tB += '<p><input id="ListS0" type="checkbox" onclick="fslCls.selectBig(this)"' + tChecked + ' /><label for="ListS0" class="none"><strong>' + arr[0] + '</strong></label> <span class="font-red">' + tipStr + '</span></p>';
		}
		
		var tStr = '';
		for(var i = iStart; i < tArr.length; i++)
		{
			arr = tArr[i].toString().split('$');
			tStr += '<li><input id="ListS' + i + '" type="checkbox" onClick="fslCls.checkOver(this, ' + i + ')"';
			if(fslCls.isChecked(arr[1])) tStr += ' checked="true"';
			tStr += ' /><label class="none" for="ListS' + i + '">' + arr[0] + '</label></li>';
		}
		//alert('debug->' + tStr);
		tB += '<ul class="item-6">' + tStr + '</ul>';
		dList.innerHTML = tB;
		
		if(fslCls.isChecked(RootID)) fslCls.selectBig($('ListS0'));
	}

	//选中了大类
	this.selectBig = function(tO, cID)
	{
		var bID = dSelect.selectedIndex;
		var tArr = this.Arr[bID];
		
		var Hits = 0;
		if(tO)
		{
			if(tO.checked) Hits = 1;
		}

		if(Hits)
		{
			//检测并清除本类已选中的
			var vCheck = false;
			for(var i = 1; i < tArr.length; i++)
			{
				if(this.isChecked(tArr[i].split('$')[1]))
				{
					vCheck = true;
					this.checkOut(bID, tArr[i]);
				}
			}
			
			//增加大类
			var vLimit = true;
			if(!fslCls.isChecked(tArr[0].split('$')[1])) vLimit = this.checkOver(tO, 0);
			
			//清除dList
			if(vCheck || vLimit)
			{
				var e = dList.getElementsByTagName("input");
				var j = 0;
				for(var i = 0; i < e.length; i++)
				{
					if('checkbox' == e[i].type)
					{
						if(j)
						{
							e[j].checked = false;
							e[j].disabled = true;
						}
						j++;
					}
				}
			}
		}
		else
		{
			//只恢复当前页的大类disabled
			if(!IsNumeric(cID)) cID = bID;
			if(cID == bID)
			{
				for(var j = 0; j < tArr.length; j++)
				{
					var tO = $('ListS' + j);
					tO.checked = false;
					tO.disabled = false;
				}
			}
			else
			{
				tArr = this.Arr[cID];
			}

			//清除本类已选中的（大类）
			this.checkOut(cID, tArr[0], 1);
		}
	}

	//选中一项
	this.checkOver = function(tO, i)
	{
		var bID = dSelect.selectedIndex;
		var tArr = (this.NoSelect ? this.Arr : this.Arr[bID]);
		var sID = tArr[i].toString().split('$')[1];

		if(this.CheckNum >= this.LimitNum && !this.isChecked(sID))
		{
			alert('已经达到限制数目啦！');
			tO.checked = false;
			return false;
		}
		if(!tO.checked) return this.checkOut(bID, tArr[i]);
		
		var tB = '';
		var tStr = '';
		
		var isBig = 0;
		if(0 == i) isBig = 1;
		this.CheckStr += this.getCheckbox(bID, tArr[i], isBig);

		dCheck.innerHTML = this.CheckStr;
		this.CheckNum++;

		return true;
	}

	//反选一项
	this.checkOut = function(bID, str, isBig)
	{
		//先清除本List大类
		var tStr = this.getCheckbox(bID, str, isBig);
		//alert(tStr + '\n\n' + this.CheckStr);
		this.CheckStr = this.CheckStr.replace(tStr, '');
		
		//清除本页上已选中的项目
		var tID = dSelect.selectedIndex;
		if(tID < 0) tID = 0;
		if(bID == tID)
		{
			var tArr = (this.NoSelect ? this.Arr : this.Arr[bID]);
			var tI = (this.NoSelect ? 0 : 1);
			for(var j = tI; j < tArr.length; j++)
			{
				var tO = $('ListS' + j);
				if(tO)
				{
					tO.checked = false;
					if(this.isChecked(tArr[j].toString().split('$')[1])) tO.checked = true;
				}
			}
		}
		
		dCheck.innerHTML = this.CheckStr;
		this.CheckNum--;
	}

	this.delStr = function(tO, bID, str, isBig)
	{
		if(this.OpenState)
		{
			if(str)
			{
				this.checkOut(bID, str, isBig);
			}
			else
			{
				this.selectBig(tO, bID);
			}
			tO.checked = true;
		}
		else
		{
			tO.parentNode.parentNode.innerHTML = tO.parentNode.parentNode.innerHTML.toString().replace('<' + this.liTag + '>' + tO.parentNode.innerHTML + '</' + this.liTag + '>', '');
		}
	}

	//点击确定
	this.goSubmit = function()
	{
		eval('var tO = ' + this.domFrm + '$(\'' + this.DomName1 + '2\');');
		if(tO)
		{
			while(-1 != this.CheckStr.indexOf('cmOtherS')) this.CheckStr = this.CheckStr.replace('cmOtherS', this.OtherS);
			tO.innerHTML = '' + this.CheckStr + '';
		}
		
		this.get_thirdStr();
		
		this.closeDiv();
	}

	this.closeDiv = function()
	{
		this.OpenState = 0;
		
		closeDiv('cmSelectDv');
	}

	//写入dom + '3'中扩展内容
	this.get_thirdStr = function(Str)
	{
		writeDebug('floatSelectCls->get_thirdStr:Start  this.thirdNum=' + this.thirdNum + '\n');
		if(!this.thirdNum) return 0;
		if(!Str) Str = this.CheckStr;
		
		var tStr = '', tO = null;
		if(Str)
		{
			var tArr = Str.split('title=' + this.quotTag);
			for(var i = 1; i < tArr.length; i++)
			{
				tStr += tArr[i].toString().substr(0, tArr[i].indexOf(this.spaceTag)) + ',';
			}
			writeDebug('floatSelectCls->get_thirdStr:tStr=' + tStr + ',tO=' + tO);
		}
		
		eval('tO = ' + this.domFrm + '$(\'' + this.DomName1 + '3\');');
		if(tO)
		{
			if(tStr)
			{
				tStr = tStr.substr(0, tStr.length - 1);
				tO.title = tStr;
			}
			else
			{
				if(tStr.length < 3) tStr = this.defValue;
			}
			
			tO.value = tStr;
		}
		
		return 1;
	}

	this.getValue = function(tStr, frmStr)
	{
		eval('var tO1 = ' + frmStr + '$(\'' + tStr + '\');');
		eval('var tO2 = ' + frmStr + '$(\'' + tStr + '2\');');
		var Str = tO2.innerHTML;
		var Arr = Str.split('ListO_');
		Str = '';
		for(var i = 1; i < Arr.length; i = i + 2)
		{
			Str += Arr[i].substr(0, Arr[i].indexOf('_')) + ',';
		}
		if(Str) Str = Str.substr(0, Str.length - 1);
		tO1.value = ',' + Str + ',';
	}

	this.setValue = function(dom1, frmStr, noSelect, parentStr, thirdNum, OtherS, defValue)
	{
		this.domFrm = frmStr;
		this.DomName1 = dom1;
		this.NoSelect = noSelect;
		this.parentStr = parentStr;
		this.thirdNum = thirdNum;
		this.OtherS = OtherS;
		this.defValue = defValue;
		
		eval('var tO2 = ' + frmStr + '$(\'' + this.DomName1 + '2\');');
		
		var Str = tO2.innerHTML;
		var Arr = Str.split('==');
		Str = '';
		for(var i = 0; i < Arr.length - 1; i++)
		{
			var tArr = Arr[i].split('=');
			Str += this.getCheckbox(tArr[0], tArr[1], tArr[2]);
		}
		tO2.innerHTML = Str;
		
		writeDebug('floatSelectCls->setValue:tO2=' + tO2);
		
		this.get_thirdStr(Str);
	}
}

function loadHnrcSo(arr, num, noselect, domFrm, dom1, title, tips, parent, thirdNum, OtherS)
{
	hide();

	fslCls.Arr = arr;
	fslCls.LimitNum = num;
	fslCls.NoSelect = noselect;
	fslCls.domFrm = domFrm;
	fslCls.DomName1 = dom1;
	fslCls.thirdNum = thirdNum;
	fslCls.TitleName = (title ? title : fslCls.TitleName);
	fslCls.TipsName = (tips ? tips : fslCls.TipsName);
	fslCls.parentStr = parent;
	fslCls.OtherS = OtherS;
	fslCls.loadSelect();

	GetCenterXY_ForLayer($('cmSelectDv'));
	displayLayer($('cmSelectDv'));
}

var fslCls = new floatSelectCls();