/**
 * @target 팝업 관련 공통함수
 */

requires("uiplugin.popup");

/**
 * 팝업 관련 공통함수를 제공하는 개체입니다.
 *
 * @type {object}
 * @class popupLib
 * @namespace popupLib
 */
var popupLib = {};

/**
 * popupLib.open(id, url, options) - 지정한 옵션으로 WebSquare 팝업을 오픈합니다.<br>
 * popupLib.getPopupParam() - 팝업에 전달된 데이터를 JSON 개체로 반환합니다.<br>
 * popupLib.getPopupCallback() - 팝업에 전달된 콜백 함수명을 반환합니다.<br>
 * popupLib.closePopup(param) - 팝업을 닫고, 콜백 함수명을 전달 받았다면 호출합니다.<br>
 * popupLib.getScwinObj() - 부모창의 scwin 객체를 가져옵니다.
 */

popupLib.popupSeqn = 0;
popupLib.popupFuncName = "pop_" + (Math.round(Math.random()*80000) + 10000) + "_" + (Math.round(Math.random()*80000) + 10000) + "_";

/**
 * 지정한 옵션으로 WebSquare 팝업을 오픈합니다.
 *
 * @author SONG WONSEOK
 * @date 2017. 06. 15.
 * @memberOf popupLib
 * @param {string} id - 팝업 ID
 * @param {string} url - 팝업 경로
 * @param {object} [options] - 팝업 옵션
 *
 * @param {string} [options.title] - 팝업의 타이틀
 * @param {boolean} [options.useLayer] - 레이어 팝업 여부
 * @param {boolean} [options.modal] - 모달 여부
 * @param {string} [options.left] - 팝업의 좌측 위치
 * @param {string} [options.top] - 팝업의 상단 위치
 * @param {string} [options.width] - 팝업의 너비
 * @param {string} [options.height] - 팝업의 높이
 * @param {boolean} [options.scrollbars] - 팝업의 스크롤바 여부
 * @param {boolean} [options.resizable] - 팝업의 크기 조정 여부
 * @param {object} [options.param] - 팝업에 전달할 매개 변수
 * @param {string} [options.callback] - 콜백 함수명
 */
popupLib.open = function(id, url, options) {
	try {
		if (!options) {
			options = {};
		}
		if (window.parent !== window) {
			var tmpCallBackName = '_tmpPopCallBack_' + popupLib.popupFuncName + popupLib.popupSeqn;
			var parentCallBack = options.callback;
			window.parent.scwin[tmpCallBackName] = function(param) {
				commLib.callEvents(parentCallBack, param);
				delete window.parent.scwin[tmpCallBackName];
			}
			options.useModalStack = true;
			options.callback = 'scwin.' + tmpCallBackName;
			popupLib.popupSeqn++;
			window.parent.popupLib.open(id, url, options);
			return ;
		}
		var width = parseInt(options.width || 600, 10);
		var height = parseInt(options.height || 520, 10);

		var useLayer = false;
		if (typeof options.useLayer != "undefined") {
			useLayer = (typeof options.useLayer == "string") ? (options.useLayer.toLowerCase() == "true") : options.useLayer;
		}

		var modal = false;
		if (typeof options.modal != "undefined") {
			modal = (typeof options.modal == "string") ? (options.modal.toLowerCase() == "true") : options.modal;
		}

		var resizable = false;
		if (typeof options.resizable != "undefined") {
			resizable = (typeof options.resizable == "string") ? (options.resizable.toLowerCase() == "true") : options.resizable;
		}

		var scrollbars = false;
		if (typeof options.scrollbars != "undefined") {
			scrollbars = (typeof options.scrollbars == "string") ? (options.scrollbars.toLowerCase() == "true") : options.scrollbars;
		}

		// 듀얼 스크린 위치 보정 (TODO: 테스트 필요)
		var dualScreenLeft = (window.screenLeft != undefined) ? window.screenLeft : screen.left;
		var dualScreenTop = (window.screenTop != undefined) ? window.screenTop : screen.top;
		var brWidth = window.innerWidth ? window.innerWidth : (document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width);
		var brHeight = window.innerHeight ? window.innerHeight
				: (document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height);

		var left = parseInt(options.left, 10) || -1;
		var top = parseInt(options.top, 10) || -1;

		if (!useLayer) {
			left = (left > 0) ? (left + dualScreenLeft) : ((brWidth / 2) - (width / 2)) + dualScreenLeft;
			top = (top > 0) ? (top + dualScreenTop) : ((brHeight / 2) - (height / 2)) + dualScreenTop;
			top = top - 50;
		} else {
			left = (left > 0) ? (left + (window.pageXOffset || document.body.scrollLeft)) : ((brWidth / 2) - (width / 2))
					+ (window.pageXOffset || document.body.scrollLeft);
			top = (top > 0) ? (top + (window.pageYOffset || document.body.scrollTop)) : ((brHeight / 2) - (height / 2))
					+ (window.pageYOffset || document.body.scrollTop);
		}

		var popParam = (typeof options.param == "object") ? strLib.serialize(options.param) : options.param;
		var popParams = {
			callback : options.callback || "",
			popParam : popParam
		};

		var popupUrl = url;
		
		if (options.close == undefined) {
			options.close = true;
		}

		var options = {
			"id" : id,
			"type" : "window", // [defalut: browser] popup이 생성되는 타입으로 window, browser을 설정할 수있다. browser type의 경우 useIFrame 속성과 상관없이 window.open 형태로 열린다.
			"top" : top, // [defalut: 100px] popup의 top 설정값. top은 useIframe이 true인 경우 브라우져를 기준, false인 경우 모니터를 기준으로 한다. style 속성이 있으면 무시 됨.
			"left" : left, // [defalut: 100px] popup의 left 설정값. left는 useIframe이 true인 경우 브라우져를 기준, false인 경우 모니터를 기준으로 한다. style 속성이 있으면 무시 됨.
			"width" : (width > 0) ? width : "600px",
			"height" : (height > 0) ? height : "580px",
			"popupName" : options.title || "", // [defalut: WebSquarePopup] popup 프레임의 표시줄에 나타난다.
			"modal" : modal, // [defalut: false] modal을 이용해서 뒤 쪽 배경을 동작하지 않도록 만들기 위한 인자 이다. false이면 뒤쪽의 컴퍼넌트가 사용 가능함.
			"useIFrame" : useLayer, // [defalut: false, true] window type만 적용되며 true의 경우 popup을 호출 한 창(부모창)에서만 이동이 가능하다.
			"title" : false, // [defalut: false] title 출력 유무. (useIfrmae false인 경우)
			"xml" : strLib.serialize(popParams),
			"resizable" : resizable,
			"scrollbars" : false,
			"status" : true,
			"menubar" : false,
			"useControl" : true,
			"alwaysOnTop" : options.alwaysOnTop || false,
			"useModalStack" : options.useModalStack || false,
			"controls" : {
				"minimize" : false,
				"maximize" : false,
				"close" : options.close
			},
			"popupUrl" : "popup"
		};

		$w.openPopup(url, options);
	} catch (e) {
		//$W.exception.printStackTrace(e);
		//commLib.log("popupLib.open: " + e);
	}
};

/**
 * 팝업에 전달된 데이터를 JSON 개체로 반환합니다.
 *
 * @author SONG WONSEOK
 * @date 2017. 06. 15.
 * @memberOf popupLib
 * @returns {string[]} 그리드뷰에서 제외할 컬럼들의 배열
 */
popupLib.getPopupParam = function() {
	try {
		var result = {};
		var param = $w.getPopupParam();

		try {
			result = strLib.parse(param);
		} catch (e2) {
			// do nothing
		}

		if (result && result.popParam) {
			try {
				result = strLib.parse(result.popParam);
			} catch (e2) {
				// do nothing
			}
		} else {
			result = {};
		}

		return result;
	} catch (e) {
		//$W.exception.printStackTrace(e);
		//commLib.log("popupLib.getPopupParam: " + e);
	}
};

/**
 * 팝업을 닫고, 콜백 함수명을 전달 받았다면 호출합니다.
 *
 * @author SONG WONSEOK
 * @date 2017. 06. 15.
 * @memberOf popupLib
 * @param {string} [param] - 콜백 함수에 전달할 매개변수
 */
popupLib.closePopup = function(param) {
	try {
		if (param && strLib.isJSON(param)) {
			param = strLib.serialize(param);
		}
		var callback = popupLib.getPopupCallback().trim();
		commLib.callEvents(callback, param);
		$w.closePopup();
	} catch (e) {
		//$W.exception.printStackTrace(e);
		//commLib.log("popupLib.closePopup: " + e);
	}
};

/**
 * 팝업에 전달된 콜백 함수명을 반환합니다.
 *
 * @author SONG WONSEOK
 * @date 2017. 06. 15.
 * @memberOf popupLib
 * @returns {string} 콜백 함수명
 */
popupLib.getPopupCallback = function() {
	try {
		var result = {};
		var param = $w.getPopupParam();

		try {
			result = strLib.parse(param);
		} catch (e2) {
			// do nothing
		}

		return (result && result.callback) ? result.callback.replace(/^scwin\./img, "") : "";
	} catch (e) {
		//$W.exception.printStackTrace(e);
		//commLib.log("popupLib.getPopupCallback: " + e);
	}
};

/**
 * 부모창의 scwin 객체를 가져옵니다.
 *
 * @author SONG WONSEOK
 * @date 2017. 06. 15.
 * @memberOf popupLib
 * @returns {Object} 부모창 scwin 객체
 * popupLib.getScwinObj().sysCd
 * popupLib.getScwinObj().prgId
 * popupLib.getScwinObj().prgAuth...
 */
popupLib.getScwinObj = function() {
	try {
		var target;
		if(opener){
			target = opener;
		} else {
			target = parent;
		}
		if(target.udc_obj){
			target = target.udc_obj.scope;
		}
		return target.scwin;
	} catch (e) {
		//$W.exception.printStackTrace(e);
		//commLib.log("popupLib.getParentPrgAuth: " + e);
	}
};

popupLib.isPop = function() {
	try {
		if (opener || parent.length > 1) {
			return true;
		} else {
			return false;
		}
	} catch (e) {
		//$W.exception.printStackTrace(e);
		//commLib.log("popupLib.getParentPrgAuth: " + e);
	}
};
