
class Detect {
	
	static help(){
		console.log("elementEvent(메소드명,메소드변수1,2,3,...) : "
			+"HTML요소의 doctx를 탐지하고, 문서 내의 DatasetControl인스턴스나 PageObject객체를 탐색하여 메소드명이 일치하는 메소드를 실행합니다.");

		console.log("listSearch(메소드변수1,2,3,...) : " + Detect.helpStringForInference("검색버튼 클릭 이벤트"));
		console.log("excelDown(메소드변수1,2,3,...) : " + Detect.helpStringForInference("엑셀다운로드버튼 클릭 이벤트"));
		console.log("init(메소드변수1,2,3,...) : " + Detect.helpStringForInference("초기화버튼 클릭 이벤트"));
		console.log("gridClick(메소드변수1,2,3,...) : " + Detect.helpStringForInference("그리드 클릭 이벤트"));
		console.log("gridDoubleClick(메소드변수1,2,3,...) : " + Detect.helpStringForInference("그리드 더블클릭 이벤트"));
		console.log("gridCheck(메소드변수1,2,3,...) : " + Detect.helpStringForInference("그리드 체크박스 체크 이벤트"));
		console.log("openNew(메소드변수1,2,3,...) : " + Detect.helpStringForInference("새 정보 입력화면 호출 버튼 클릭 이벤트"));
		console.log("save(메소드변수1,2,3,...) : " + Detect.helpStringForInference("저장 버튼 클릭 이벤트"));
		console.log("remove(메소드변수1,2,3,...) : " + Detect.helpStringForInference("삭제 버튼 클릭 이벤트"));			
	}
	
	static helpStringForInference(str){
		return "HTML요소의 doctx를 탐지하고, 문서 내의 DatasetControl인스턴스나 PageObject객체를 탐색 한 후 "+str+"에 대한 메소드명을 추론하여 메소드를 실행합니다.";
	}
	
	static elementEvent(){
		if(arguments.length < 1){
			console.log('메소드 이름은 필수 입니다.');
			return;
		}
		let methodName = arguments[0];
		let sp = methodName.split(".");
		if(sp.length > 3){
			console.log('depth가 너무 깁니다.');
			return;
		}
		
		var args = Array.prototype.slice.call(arguments);
		args.shift();
		
		let element = event.target;
		
		let doctx;
		if(element.hasAttribute("data-ref-doctx")){
			doctx = element.getAttribute("data-ref-doctx");	
		} else {
			doctx = element.detectDoctx();
			element.setAttribute("data-ref-doctx", doctx);
		}
		
		//pageObject 전역객체가 있고, pageObject 내부에 doctx를 키로 갖는 객체가 있으면
		if((window.pageObject !== undefined) && (pageObject[doctx] !== undefined)){
			let curPO = pageObject[doctx];
			
			//STEP 1 : "pageObject전역객체.doctx명"에서 찾는다.
			if(sp.length == 1){
				if(curPO[methodName] !== undefined && curPO[methodName] instanceof Function){
					curPO[methodName].apply(curPO, args); //실행
					return;
				}
			} else if(sp.length == 2){
				if(curPO[sp[0]] !== undefined 
					&& curPO[sp[0]][sp[1]] !== undefined 
					&& curPO[sp[0]][sp[1]] instanceof Function){
					curPO[sp[0]][sp[1]].apply(curPO[sp[0]], args); //실행
					return;
				}
			} else if(sp.length == 3){
				if(curPO[sp[0]] !== undefined 
					&& curPO[sp[0]][sp[1]] !== undefined 
					&& curPO[sp[0]][sp[1]][sp[2]] !== undefined 
					&& curPO[sp[0]][sp[1]][sp[2]] instanceof Function){
					curPO[sp[0]][sp[1]][sp[2]].apply(curPO[sp[0]][sp[1]], args); //실행
					return;
				}
			}
			
			//STEP 2 : "pageObject전역객체.doctx명.ctrl또는control"에서 찾는다.
			if(sp.length == 1){
				let findedCtrl = null;
				if(curPO["ctrl"] !== undefined){
					findedCtrl = curPO["ctrl"];
				} else if(curPO["control"] !== undefined){
					findedCtrl = curPO["control"];
				}
				if(findedCtrl != null){
					if(findedCtrl[methodName] !== undefined && findedCtrl[methodName] instanceof Function){
						findedCtrl[methodName].apply(findedCtrl, args); //실행
						return;
					}
				}
			}
		}
		
		//STEP 3 : doctx를 갖는 DatasetControl 전역객체에서 찾는다.
		if(sp.length == 1){
			let findedCtrl = null;
			for(var member in window){
			    if(window[member] instanceof DatasetControl){
					if(window[member].doctx == "[data-doctx='"+doctx+"']"){
						findedCtrl = window[member]; 
					}
				}
			}
			if(findedCtrl != null){
				if(findedCtrl[methodName] !== undefined && findedCtrl[methodName] instanceof Function){
					findedCtrl[methodName].apply(findedCtrl, args); //실행
					return;
				}
			}
		}
		
		console.log('메소드를 찾을 수 없습니다.');
		return;
	}
	
	/**************************************************************************
	* 검색버튼 클릭 이벤트 탐지 및 실행
	**************************************************************************/
	static listSearch(){
		let inference = [
			"Data_Open", //델파이(클린파킹)
			"search", //DatasetControl 
			"searchList", "fnSearch", "fnSearchList"
		];
		
		var args = Array.prototype.slice.call(arguments);
		Detect.byInference(inference, args);
	}
	
	/**************************************************************************
	* 엑셀버튼 클릭 이벤트 탐지 및 실행
	**************************************************************************/
	static excelDown(){
		let inference = [
			"fnExcel", "fnExcelDown", "excelDown"
		];
		var args = Array.prototype.slice.call(arguments);
		Detect.byInference(inference, args);
	}

	/**************************************************************************
	* 초기화버튼 클릭 이벤트 탐지 및 실행
	**************************************************************************/
	static init(){
		let inference = [
			"fnInit", "fnReset"
		];
		var args = Array.prototype.slice.call(arguments);
		Detect.byInference(inference, args);
	}

	/**************************************************************************
	* 그리드 클릭 이벤트탐지 및 실행
	**************************************************************************/
	static gridClick(){
		let inference = [
			"setCurrent", //DatasetControl
			"clickList", "fnClickList"
		];
		var args = Array.prototype.slice.call(arguments);
		Detect.byInference(inference, args);
	}

	/**************************************************************************
	* 그리드 더블클릭 이벤트탐지 및 실행
	**************************************************************************/
	static gridDoubleClick(){
		let inference = [
			"getInfo", //DatasetControl
			"dblclickList", "fnDblclickList"
		];
		var args = Array.prototype.slice.call(arguments);
		Detect.byInference(inference, args);
	}

	/**************************************************************************
	* 그리드 체크박스 체크 이벤트탐지 및 실행
	**************************************************************************/
	static gridCheck(){
		let inference = [
			"select", //DatasetControl
			"checkList", "fnCheckList"
		];
		var args = Array.prototype.slice.call(arguments);
		Detect.byInference(inference, args);
	}


	/**************************************************************************
	* 새 정보 입력화면 호출 버튼 클릭 이벤트탐지 및 실행
	**************************************************************************/
	static openNew(){
		let inference = [
			"newInfo", "getInfo", //DatasetControl
			"fnCreate"
		];
		var args = Array.prototype.slice.call(arguments);
		Detect.byInference(inference, args);
	}

	/**************************************************************************
	* 저장 버튼 클릭 이벤트탐지 및 실행
	**************************************************************************/
	static save(){
		let inference = [
			"save", //DatasetControl
			"fnSave"
		];
		var args = Array.prototype.slice.call(arguments);
		Detect.byInference(inference, args);
	}

	/**************************************************************************
	* 삭제 버튼 클릭 이벤트탐지 및 실행
	**************************************************************************/
	static remove(){
		let inference = [
			"remove", //DatasetControl
			"fnDelete", "fnRemove"
		];
		var args = Array.prototype.slice.call(arguments);
		Detect.byInference(inference, args);
	}
	
	/**************************************************************************
	* 이벤트 추론
	**************************************************************************/
	static byInference(inference, args){
		
		let element = event.target;
		
		let doctx;
		if(element.hasAttribute("data-ref-doctx")){
			doctx = element.getAttribute("data-ref-doctx");	
		} else {
			doctx = element.detectDoctx();
			element.setAttribute("data-ref-doctx", doctx);
		}
		
		//pageObject 전역객체가 있고, pageObject 내부에 doctx를 키로 갖는 객체가 있으면
		if((window.pageObject !== undefined) && (pageObject[doctx] !== undefined)){
			let curPO = pageObject[doctx];
			
			//STEP 1 : "pageObject전역객체.doctx명"에서 찾는다.
			for(let keyword of inference){
				if(curPO.hasOwnProperty(keyword)){
					if(curPO[keyword] instanceof Function){
						curPO[keyword].apply(curPO, args);
						return;
					}
				}
			}
			
			//STEP 2 : "pageObject전역객체.doctx명.ctrl또는control"에서 찾는다.
			let findedCtrl = null;
			if(curPO["ctrl"] !== undefined){
				findedCtrl = curPO["ctrl"];
			} else if(curPO["control"] !== undefined){
				findedCtrl = curPO["control"];
			}
			if(findedCtrl != null){
				for(let keyword of inference){
					if(findedCtrl[keyword] !== undefined && findedCtrl[keyword] instanceof Function){
						findedCtrl[keyword].apply(findedCtrl, args);
						return;
					}
				}
			}
		}
		
		//STEP 3 : doctx를 갖는 DatasetControl 전역객체에서 찾는다.
		let findedCtrl = null;
		for(var member in window){
		    if(window[member] instanceof DatasetControl){
				if(window[member].doctx == "[data-doctx='"+doctx+"']"){
					findedCtrl = window[member]; 
				}
			}
		}
		if(findedCtrl != null){
			for(let keyword of inference){
				if(findedCtrl[keyword] !== undefined && findedCtrl[keyword] instanceof Function){
					findedCtrl[keyword].apply(findedCtrl, args);
					return;
				}
			}
		}
		
		console.log('메소드를 찾을 수 없습니다.');
		return;
	}
}