﻿var Category = {
	data : {},
	
	sublist : {},
	
	bRemoveVal : true,
	
	bSubmit : false,
	
	bVaild : false,
	
	sFormNm : "",
	
	sCateCdId : "CATECD",
	
	bEmpty : true,
	
	sFunction : "",
	
	nIdx : 1,

	init : function(data, sSelCateCd, bRemoveVal) {
		this.sFormNm = "";		

		this.data = data;
		
		for(var sCateCd in data) {
			if(sCateCd == "indexOf") continue;
			
			var sCateNm  = data[sCateCd];
			var sPCateCd = this.getPCateCd(sCateCd);
			
			if(!this.sublist[sPCateCd]) {
				this.sublist[sPCateCd] = new Array();
			}
			
			this.sublist[sPCateCd][sCateCd] = sCateNm;
			this.bEmpty = false;
		}
		
		if(bRemoveVal != null)	this.setRemoveVal(bRemoveVal);
		if(sSelCateCd != null)	this.setSelectBoxVal(sSelCateCd);
		
		this.nIdx++;
	},

	getDepth : function(sCateCd) {
		return sCateCd.replace(/00/g, "").length / 2;
	},

	getPCateCd : function(sCateCd) {
		return sCateCd.replace(/00/g, "").substring(0, this.getDepth(sCateCd) * 2 - 2).padRight(10, '0');
	},
	
	getName : function(sCateCd) {
		return this.data[sCateCd];
	},

	getPath : function(sCateCd) {
		var sArrCatePath = new Array();
		var nDepth = this.getDepth(sCateCd);
		
		for(var i = 0; i < nDepth; i++) {
			sArrCatePath.push(this.getName(sCateCd.substring(0, (i + 1) * 2).padRight(10, '0')));
		}
		
		return sArrCatePath.toString().replace(/,/g, " > ");
	},
	
	getSubList : function(sCateCd) {
		if(sCateCd == null || sCateCd == "") sCateCd = "0000000000";
		return this.sublist[sCateCd];
	},
	
	setRemoveVal : function(bRemoveVal) {
		if(this.bSubmit)
			this.bRemoveVal = false;
		else
			this.bRemoveVal = bRemoveVal;
	},

	setSubmit : function(bSubmit) {
		this.bSubmit = bSubmit;
		if(bSubmit) this.bRemoveVal = false;
	},
	
	setCateCdId : function(sCateCdId) {
		this.sCateCdId = sCateCdId;
	},
	
	submit : function() {
		var form = document.forms[this.sFormNm];
		var elements = form.elements;
		var sArrPara = new Array();
		var objRegExp = new RegExp("^" + this.sCateCdId + "\\d+$");

		for(var i = 0; i < elements.length; i++) {
			var sName = elements[i].name;
			if(sName != "" && !objRegExp.test(sName)) {
				var sVal = elements[i].value;
				sArrPara.push(sName + "=" + encodeURI(sVal));
			}
		}

		location.href = "?" + sArrPara.join("&");
	},
	
	addFunction : function(sFunction) {
		this.sFunction = sFunction + "();";
	},

	setSelectBox : function(sCateCd, sCateCdId, nIdx) {
		if(this.bEmpty) return;
		
		if(sCateCdId == null || sCateCdId == "")
			sCateCdId = this.sCateCdId;
		else
			this.sCateCdId = sCateCdId;
		
		var nDepthSub = 1;

		if(!document.getElementById(sCateCdId))
			document.write("<input type='hidden' id='" + sCateCdId + "' name='" + sCateCdId + "' />");

		if(!this.bRemoveVal)
			document.getElementById(sCateCdId).value = sCateCd;

		if(this.bSubmit)
			document.write("<select id='" + sCateCdId + nIdx + nDepthSub + "' name='" + sCateCdId + nIdx + nDepthSub + "' align='absmiddle' onchange='Category.setSelectBoxSub(this.value, \"" + sCateCdId + "\", " + nIdx + "); " + this.sFunction + " Category.submit();'></select>");
		else
			document.write("<select id='" + sCateCdId + nIdx + nDepthSub + "' name='" + sCateCdId + nIdx + nDepthSub + "' align='absmiddle' onchange='Category.setSelectBoxSub(this.value, \"" + sCateCdId + "\", " + nIdx + "); " + this.sFunction + "'></select>");

		this.sFormNm = document.getElementById(sCateCdId).form.name;

		document.getElementById(sCateCdId + nIdx + nDepthSub).options.add(new Option("[SELECT]", ""));

		var sArrCateSubList = this.getSubList();
		for(var sCateCdSub in sArrCateSubList) {
			if(sCateCdSub == "indexOf") continue;
			document.getElementById(sCateCdId + nIdx + nDepthSub).options.add(new Option(sArrCateSubList[sCateCdSub], sCateCdSub));
		}
	},

	setSelectBoxSub : function(sCateCd, sCateCdId, nIdx) {
		if(this.bEmpty) return;
		
		var sArrCateSubList = this.getSubList(sCateCd);
		var nDepth = this.getDepth(sCateCd);

		if(document.getElementById(sCateCdId + nIdx + nDepth).options[0].value == "")
			document.getElementById(sCateCdId + nIdx + nDepth).options[0].parentNode.removeChild(document.getElementById(sCateCdId + nIdx + nDepth).options[0]);

		var nDepthSub = nDepth + 1;
		var nDepthMax = sCateCd.length / 2;

		for(var i = nDepthSub; i <= nDepthMax; i++) {
			var objCateSub = document.getElementById(sCateCdId + nIdx + i);
			if(objCateSub) objCateSub.parentNode.removeChild(objCateSub);
		}

		if(sArrCateSubList) {
			if(this.bSubmit)
				document.getElementById(sCateCdId + nIdx + nDepth).insertAdjacentHTML("afterEnd", "<select id='" + sCateCdId + nIdx + nDepthSub + "' name='" + sCateCdId + nIdx + nDepthSub + "' align='absmiddle' onchange='Category.setSelectBoxSub(this.value, \"" + sCateCdId + "\", " + nIdx + "); " + this.sFunction + " Category.submit();'></select>");
			else
				document.getElementById(sCateCdId + nIdx + nDepth).insertAdjacentHTML("afterEnd", "<select id='" + sCateCdId + nIdx + nDepthSub + "' name='" + sCateCdId + nIdx + nDepthSub + "' align='absmiddle' onchange='Category.setSelectBoxSub(this.value, \"" + sCateCdId + "\", " + nIdx + "); " + this.sFunction + "'></select>");
			
			document.getElementById(sCateCdId + nIdx + nDepthSub).options.add(new Option("[SELECT]", ""));
			
			for(var sCateCdSub in sArrCateSubList) {
				if(sCateCdSub == "indexOf") continue;
				document.getElementById(sCateCdId + nIdx + nDepthSub).options.add(new Option(sArrCateSubList[sCateCdSub], sCateCdSub));
			}

			if(this.bRemoveVal)
				document.getElementById(sCateCdId).value = "";
			else
				document.getElementById(sCateCdId).value = sCateCd;
			
			this.bVaild = false;
		}
		else {
			document.getElementById(sCateCdId).value = sCateCd;
			this.bVaild = true;
		}

		document.getElementById(sCateCdId + nIdx + nDepth).value = sCateCd;
	},

	setSelectBoxVal : function(sCateCd, sCateCdId) {
		if(sCateCdId == null || sCateCdId == "") 
			sCateCdId = this.sCateCdId;
		else
			this.sCateCdId = sCateCdId;

		if(this.sFormNm == "") this.setSelectBox(sCateCd, sCateCdId, this.nIdx);

		var nDepth = this.getDepth(sCateCd);

		for(var i = 1; i <= nDepth; i++) {
			this.setSelectBoxSub(sCateCd.substring(0, i * 2).padRight(10, '0'), sCateCdId, this.nIdx);
		}
	},
	
	isVaild : function() {
		return this.bVaild;
	}
};