/**
 * GlobalFieldEventException JS class list
 * 
 * GlobalField
 * GlobalEvent 전역 이벤트 처리 함수들
 * Define
 * Exception 예외 처리 전역 함수들
 * TabOrderManager
 * TabOrderInfo
 */

var g_strPQWebURL = "";		// 이전 페이지 주소를 쿠키에 저장하기 위해 사용

/**
 * 모든 전역 변수는 이곳에 추가하세요.
 */
var g_strServerURL = "http://" + location.host + "/ups/";

/**
 * 포털 로그인 사용자 정보.
 */
var g_htPortalUserData = null;

/**
 * 자식폼 Window
 */
var g_arChildWindow = new Array();

/**
 * ToHtml_06.xsl
 */
var g_strTabPageName = "MainView";	// 현재활성 ViewID, 탭뷰가 없는경우 기본값=>MainView

/**
* ModelCore 객체 
*/
var g_objModelCore = null;

/**
* Model 객체 
*/
var g_objModel = null;

var g_htModelInfo = new Hashtable();

var g_htConnectionModelInfo = new Hashtable();
var g_bConnectionModel = false;

var g_objDivisionManager = null;


SOLUTION_NOT_LOGIN = 0;			// 솔루션 접속하지 않은 상태
SOLUTION_LOGIN_NOGLOBAL = 1;	// 솔루션 접속은 성공하였으나, 전역정보는 loading 되지 않았음
SOLUTION_LOGIN_GLOBAL = 2;		// 솔루션 접속하였고, 전역정보 loading 되었음

var g_nSolutionLoginState = SOLUTION_NOT_LOGIN;

/**
* BpmWork Model 객체 
*/
var g_bBpmWorkModel = false;
var g_bBpmWorkExecute = false;
var g_htBpmExcuteInfo = new Hashtable();
var g_htBpmContents = new Hashtable();

// Insert or Update
var g_strSaveType = "";

/**
 * PQService 객체
 */
var g_objPQService = null;

/**
 * PQPortalService 객체
 */
var g_objPQPortalService = null;

/**
 * PQOperation 객체
 */
var g_objPQOperation = null;

/**
 * PQScript 객체
 */
var g_objPQScript = null;

/**
 * PQConnectionSearch 객체
 */
var g_objPQConnectionSearch = null;

/**
 * PQConnectionInput 객체
 */
var g_objPQConnectionInput = null;

/**
 * PQConnectionModel 객체
 */
var g_objPQConnectionModel = null;

var g_objMakeRequest = null;
var g_objHandleResult = null;

/**
 * Vml 생성관련 함수 모음 
 */
var g_objVmlLib = null;

/**
 * 나를 감싸고 있는 ModelAtom 변수명
 */
var g_strWebModelAtomVarName = "";

/**
 * DOM 객체 쓰레기통 
 * DOM 객체의 메모리 누수를 방지하기 위해서, 화면상에 삭제된 엘리먼트를 자식으로 가진 안보이는 DIV
 * 브라우져에서 Garbage Collection이 일어날때 자식 객체들이 해제된다. 
 */
var g_heGarbageBin = null;

/**
 * 시연용인지 여부
 */
 var g_bTrialVersion = false;
 
/**
 * 참조아톰으로 연결된 아톰들의 변수명과 아톰 타입.
 */
var g_htRefAtomVarNames = new Hashtable();

// 부모창으로부터 받은 참조아톰정보
var g_htRefAtomInfo = new Object();

// 검색 필터 결과 리스트 - key : 검색필터의 RefName, Value : 결과 스트링(Where절)
var g_htSearchFilterResult		= new Hashtable();

// 검색식 리스트
var g_htSearchFormulaList		= new Hashtable();

// 팝업 차단 정보
var g_strPopupBlockInfo = "";
	
function GlobalField()
{
}

////////////////////////////////////////
// 전역 변수 getter / setter

/**
 * 포털 로그인 사용자 정보를 생성합니다.
 */
GlobalField.setPortalUserData = function (strDepCode, strUserID, strUserName, strGroupCode, 
		strJobLevel, strDocLevel, strGroupName, strAdditionalJob, strUPSType)
{
	g_htPortalUserData = new Hashtable();
	
	g_htPortalUserData["DP_SCODE"] = strDepCode;
	g_htPortalUserData["USER_ID"] = strUserID;
	g_htPortalUserData["USER_NAME"] = strUserName;
	g_htPortalUserData["PS_CODE"] = strGroupCode;
	g_htPortalUserData["JOB_LEVEL"] = strJobLevel;
	g_htPortalUserData["DocLevel"] = strDocLevel;
	g_htPortalUserData["PS_NAME"] = strGroupName;
	g_htPortalUserData["AdditionalJob"] = strAdditionalJob;
	g_htPortalUserData["UPSType"] = strUPSType;
}

/**
 * 포털 로그인 사용자 정보를 가져옵니다.
 * @param strKey 
 * @return 해당값이 없으면 null.
 */
GlobalField.getPortalUserData = function (strKey)
{
	if (null != g_htPortalUserData)
	{
		return g_htPortalUserData[strKey];
	}
	
	return null;
}

/**
 * 포털 로그인 사용자의 직무등급 정보를 가져옵니다.
 */
GlobalField.getPortalUserDataJobLevel = function ()
{
	if (null != g_htPortalUserData)
	{
		return g_htPortalUserData["JOB_LEVEL"];
	}
	return "";
}

/**
 * 포털 로그인 사용자의 그룹코드를 가져옵니다.
 */
GlobalField.getPortalUserDataGroupCode = function ()
{
	if (null != g_htPortalUserData)
	{
		return g_htPortalUserData["PS_CODE"];
	}
	return "";
}

/**
 * 로그인 사용자의 겸직 부서 정보를 가져옵니다.
 * @return {부서코드,부서명,부서코드1,부서명1,...}
 */
GlobalField.getAdditionalJob = function ()
{
	if (null != g_htPortalUserData)
	{
		return g_htPortalUserData["AdditionalJob"];
	}
	return "";
}

/**
 * 포털 로그인 사용자 정보를 제거합니다.
 */
GlobalField.removePortalUserData = function ()
{
	g_htPortalUserData = null;
}

/**
 * 포털 로그인 상태인가?
 */
GlobalField.isPortalLoggedin = function ()
{
	return null != g_htPortalUserData;
}

GlobalField.getChildWindows = function ()
{
	return g_arChildWindow;
}

GlobalField.setChildWindow = function (objWindow)
{
	g_arChildWindow[g_arChildWindow.length] = objWindow;
}

GlobalField.getModelCore = function ()
{
	return g_objModelCore;
}

GlobalField.getModelInfo = function ()
{
	return g_htModelInfo;
}

GlobalField.isConnectionModel = function ()
{
	return g_bConnectionModel;
}

GlobalField.isBpmWorkModel = function ()
{
	return g_bBpmWorkModel;
}

GlobalField.setIsBpmWorkModel = function (bBpmWorkModel)
{
	g_bBpmWorkModel = bBpmWorkModel;
}

GlobalField.isBpmWorkExecute = function ()
{
	return g_bBpmWorkExecute;
}

GlobalField.setIsBpmWorkExecute = function (bBpmWorkExecute)
{
	g_bBpmWorkExecute = bBpmWorkExecute;
}

GlobalField.setBpmExcuteInfoList = function (htBpmExcuteInfoList)
{
	g_htBpmExcuteInfo = htBpmExcuteInfoList;
}

GlobalField.getBpmExcuteInfoList = function ()
{
	return g_htBpmExcuteInfo;
}

GlobalField.getBpmContentList = function ()
{
	return g_htBpmContents;
}

GlobalField.getConnectionModelInfo = function ()
{
	return g_htConnectionModelInfo;
}

GlobalField.setConnectionModelInfo = function (htConnectionModelInfo)
{
	g_htConnectionModelInfo = htConnectionModelInfo;
	g_bConnectionModel = true;
}

GlobalField.getModel = function ()
{
	return g_objModel;
}

GlobalField.getSaveType = function ()
{
	return g_strSaveType;
}

GlobalField.setSaveType = function (strSaveType)
{
	g_strSaveType = strSaveType;
}

/**
* ModelInfomation을 초기화 한다. 
*/
GlobalField.initModelInfo = function ()
{
	if (null == g_objModel)
	{
		g_objModel = new Model();
	}
	g_objModel.initModel();
}

/**
 * DOM 객체 쓰레기통을 초기화 한다.
 */
GlobalField.initGarbageBin = function ()
{
	if (null == g_heGarbageBin)
	{
		g_heGarbageBin = document.createElement('DIV');
		g_heGarbageBin.id = '__IELeakGarbageBin__';
		g_heGarbageBin.style.display = 'none';
		
		document.body.appendChild(g_heGarbageBin);
	}
}


GlobalField.createModelUID = function ()
{
	g_htModelInfo["ModelUID"] = Number(new Date());
	
	return g_htModelInfo["ModelUID"];
}

GlobalField.getModelUID = function ()
{
	return g_htModelInfo["ModelUID"];
}

/**
 * 웹로그인 아톰에서 로그인 성공해서 페이지 전환이 이루어지려는 시점임을 설정합니다.
 */
GlobalField.setWebLoginInProgress = function ()
{
	g_htModelInfo["WebLoginInProgress"] = "true";	
}

GlobalField.isWebLoginInProgress = function ()
{
	return "true" == g_htModelInfo["WebLoginInProgress"];	
}

GlobalField.setModelName = function (strModelName)
{
	g_htModelInfo["ModelName"] = strModelName;
}

GlobalField.setModelFieldName = function (strModelFieldName)
{
	g_htModelInfo["ModelFieldName"] = strModelFieldName;
}

/*
 * 모델 루트 경로에서부터 모델이 위치한 곳까지의 하위경로.
 */
GlobalField.setModelSubPath = function (strModelSubPath)
{
	g_htModelInfo["ModelSubPath"] = strModelSubPath;
}

GlobalField.setModelCreateCondition = function (strModelCreateCondition)
{
	g_htModelInfo["ModelCreateCondition"] = strModelCreateCondition;
}

GlobalField.setServiceName = function (strServiceName)
{
	g_htModelInfo["ServiceName"] = strServiceName;
}

GlobalField.setServiceEventName = function (strServiceEventName)
{
	g_htModelInfo["ServiceEventName"] = strServiceEventName;
}

GlobalField.setEventVarName = function (strEventVarName)
{
	g_htModelInfo["EventVarName"] = strEventVarName;
}

GlobalField.setSearchCondition = function (strCondition)
{
	g_htModelInfo["WhereQuery"] = strCondition;
}

GlobalField.getServiceName = function ()
{
	return g_htModelInfo["ServiceName"];
}

/*
 * 스크립트 인텍스을 설정합니다.
 * 이진욱
 */ 
GlobalField.setScriptIndex = function (nScriptIndex)
{
	g_htModelInfo["ScriptIndex"] = nScriptIndex;
}

GlobalField.setScriptEventID = function (nEventID)
{
	g_htModelInfo["EventID"] = nEventID;
}

//문서모델 서식번호.
GlobalField.setDocumentNumber = function (strDocumentNumber)
{
	g_htModelInfo["DocumentNumber"] = strDocumentNumber;
}

GlobalField.setRegisterNumber = function (strRegisterNumber)
{
	g_htModelInfo["RegisterNumber"] = strRegisterNumber;
}

GlobalField.setUseTopDmt = function (strUseTopDmt)
{
	g_htModelInfo["UseTopDmt"] = strUseTopDmt;
}

GlobalField.getUseTopDmt = function ()
{
	return g_htModelInfo["UseTopDmt"];
}

GlobalField.getWebModelAtomName = function ()
{
	return g_strWebModelAtomVarName;
}

GlobalField.setWebModelAtomName = function (strVarName)
{
	g_strWebModelAtomVarName = strVarName;
}

GlobalField.isEmbededModel = function ()
{
	return null != g_strWebModelAtomVarName && 0 < g_strWebModelAtomVarName.length;
}

/**
 * 참조아톰으로 넘어온 아톰의 변수명과 타입을 저장합니다.
 *
 * @param strAtomVarName 아톰변수명
 * @param strAtomType 아톰타입
 */
GlobalField.setRefAtomVarName = function (strAtomVarName, strAtomType)
{
	g_htRefAtomVarNames[strAtomVarName] = strAtomType;
}

GlobalField.getRefAtomVarName = function ()
{
	return g_htRefAtomVarNames;
}

/**
 * ModelAction에서 사용
 * 부모창에서 받은 참조아톰의 아톰명, 변수명을 저장
 */
GlobalField.setRefAtomInfo = function (strVarName, strValue)
{
	g_htRefAtomInfo[strVarName] = strValue;
}

/**
 * ModelAction에서 사용
 * @return 부모창에서 받은 참조아톰들의 아톰명, 변수명
 */
GlobalField.getRefAtomInfos = function ()
{
	return g_htRefAtomInfo;
}

/**
 * 팝업 차단 정보를 초기화 합니다.
 */
GlobalField.initPopupBlockInfo = function ()
{
	g_strPopupBlockInfo = "";
	var alCookieList = CookieLib.getAllCookieWithName();
	
	for (var j = 0; j < alCookieList.length; j+=1)
	{
		var strName = alCookieList[j].Name;
		
		// 팝업차단 정보 키값은 알파벳 4자리이고, *AAAA 형식으로 저장된다. 
		if ("*" == strName.charAt(0) && 5 == strName.length)
		{
			g_strPopupBlockInfo += strName.substring(1) + "$" + "1;";
		}
	}
}

/////////////////////////////////////////
// GlobalEvent 전역이벤트 처리 함수

/**
 * body 태그에서 keydown 이벤트를 처리한다.
 */
function onKeyDownBody (objEvent)
{
	// 120 : F9 키
	if (objEvent && 120 == objEvent.keyCode)
	{
		Model.switchAllVanish();
	}
}

/**
 * body 태그에서 mousedown 이벤트를 처리한다.
 */
function onMouseDownBody (objEvent)
{
	AdditionalMenu.onContextMenu("FORM", objEvent);
}

/**
 * body 태그에서 mousedown 이벤트를 처리한다.
 */
function onMouseUpBody (objEvent)
{
	if (ContainsReportBrowseAtom())
	{
		var heDownAtom = ReportBrowseAtom.getHeaderDownAtom();
		
		if (null != heDownAtom)
		{
			heDownAtom.mouseUpHeaderDown(objEvent);
		}
	}
	
	if (ContainsGridExAtom())
	{
		var heDownAtom = GridExAtom.getHeaderDownAtom();
		
		if (null != heDownAtom)
		{
			heDownAtom.mouseUpHeaderDown(objEvent);
		}
	}
	
	if (ContainsTreeAtom())
	{
		var heDownAtom = TreeAtom.getHeaderDownAtom();
		
		if (null != heDownAtom)
		{
			heDownAtom.mouseUpHeaderDown(objEvent);
		}
	}
	
	if (ContainsScrollAtom())
	{
		var heScroll = ScrollBar.getScrollAtom();
		
		if (null != heScroll)
		{
			var strVarName = heScroll.getVarName();
			var objScrollBar = ScrollBar.getScrollBar(strVarName);
			if (null != objScrollBar)
			{
				ScrollBar.onBodyMouseUp(strVarName);
			}
		}
	}
	
	if (ContainsWebBoardAtom())
	{
		WebBoardAtom.onMouseUp();
	}
	
	if (ContainsWebFileAttachAtom())
	{
		var nXPos = window.event.clientX;
		var nYPos = window.event.clientY;
		
		WebFileAttachAtom.onBlurEvent(nXPos,nYPos);
	}
}

/**
 * body 태그에서 mousedown 이벤트를 처리한다.
 */
function onMouseMoveBody (objEvent)
{
	if (ContainsMoveAtom())
	{
		MoveAtom.onMouseMove(objEvent);
	}
	
	if (ContainsReportBrowseAtom())
	{
		var heDownAtom = ReportBrowseAtom.getHeaderDownAtom();
		
		if (null != heDownAtom)
		{
			heDownAtom.mouseMoveHeaderDown(objEvent);
		}
	}
	
	if (ContainsGridExAtom())
	{
		var heDownAtom = GridExAtom.getHeaderDownAtom();
		
		if (null != heDownAtom)
		{
			heDownAtom.mouseMoveHeaderDown(objEvent);
		}
	}
	
	if (ContainsTreeAtom())
	{
		var heDownAtom = TreeAtom.getHeaderDownAtom();
		
		if (null != heDownAtom)
		{
			heDownAtom.mouseMoveHeaderDown(objEvent);
		}
	}
	
	if (ContainsScrollAtom())
	{
		var heScroll = ScrollBar.getScrollAtom();
		
		if (null != heScroll)
		{
			var strVarName = heScroll.getVarName();
			var objScrollBar = ScrollBar.getScrollBar(strVarName);
			
			if (null != objScrollBar)
			{
				objScrollBar.onScrollBarMouseMove(objEvent);
			}
		}
	}
}

/**
 * Define
 */
function Define ()
{
}

Define.isOccurEvent = function (nOccurEventType)
{
	if (null == nOccurEventType || Define.OCCUR_EVENT == nOccurEventType || Define.OCCUR_CHANGE_FLAG == nOccurEventType)
	{
		return true;
	}
	
	return false;
}

Define.OCCUR_EVENT = 0; // or null;
Define.NO_OCCUR_EVENT = 1;
Define.OCCUR_CHANGE_FLAG = 3;

function HandleException (e)
{
	if (e instanceof SureInputException
		|| e instanceof NotConfigTreeAtomParentKey)
	{
		alert(e.message + " (" + e.description + ")");
	}
	if (e instanceof NotInstallClientProgram
		|| e instanceof FailExecuteAjaxAction)
	{
		//alert(e.message + " (" + e.description + ")");
	}
	else if (e instanceof CannotFindSearchAtomException)
	{
	}
	else
	{
		//alert(e.message);
	}
}

function Exception (strMessage)
{
	this.description = strMessage;
	this.name = strMessage;
	this.message = strMessage;	
}

function SureInputException (strMessage)
{
	this.description = "필수입력 항목에 자료가 없습니다.";
	this.name = "필수 입력 체크 실패";
	this.message = strMessage;	
}

/**
 * 스크롤 유효성 관련 예외
 * @param strScrollName (해당 스크롤의 이름)
 */
function SureInputScrollException (strScrollName)
{
	this.description = strScrollName + " 에 유효행이 존재하지 않습니다";
	this.name = "";
	this.message = strScrollName + " 에 유효행이 존재하지 않습니다";
}

function CannotFindSearchAtomException ()
{
	this.description = "검색 아톰을 찾을 수 없습니다.";
	this.name = "";
	this.message = "";
}

function NotConfigTreeAtomParentKey ()
{
	this.description = "상위키 항목이 설정되어 있지 않습니다.";
	this.name = "";
	this.message = "상위키 항목이 설정되어 있지 않습니다.";
}

function NotInstallClientProgram ()
{
	this.description = "PQ 클라이언트 프로그램이 정상적으로 설치되지 않았습니다.";
	this.name = "";
	this.message = "PQ 클라이언트 프로그램이 정상적으로 설치되지 않았습니다.";
}

function FailExecuteAjaxAction (code)
{
	this.description = "AJAX 동작이 실패했습니다.";
	this.name = "";
	this.message = "";
	this.code = code;
}

// 실제 Exception이 아니라, 객체생성(#폼)을 실행시 다음 루틴을 실행하지 않기 위해 발생합니다.
function PQScriptCreateModelException ()
{
	this.description = "객체생성(#폼)을 실행시 다음 루틴을 실행하지 않기 위해 발생합니다.";
	this.name = "";
	this.message = "";
}

function PQLoginException (strMessage)
{
	this.description = "로그인, 아웃 동작의 실패시에 발생 합니다.";
	this.name = "";
	this.message = strMessage;
}


/**
 * 탭이동 정보 관리자
 * 항목순서에 따른 커서 포커스 이동을 수행한다.
 * @author : 손영훈
 */
function TabOrderManager ()
{
	this.m_alTabInfoList = new Array ();
}

TabOrderManager.prototype.addInfo = function (nType, strVarName, strScrollName, nTabId)
{
	var objInfo = new TabOrderInfo (nType, strVarName, strScrollName, nTabId);
	
	this.m_alTabInfoList.push(objInfo);
}

/**
 * 포커스를 이동할 다음 아톰을 찾은 다음 이동한다.
 */
TabOrderManager.prototype.moveNextFocus = function (nType, strVarName, strScrollName, strTabID, nOffset)
{
	var nFromIndex = -1;
	var nSize = this.m_alTabInfoList.length;
	
	// Tab 이벤트가 발생한 원본 아톰의 index를 찾는다.
	for (var i = 0; i < nSize; i+=1)
	{
		var objInfo = this.m_alTabInfoList[i];
		if (nType == objInfo.getType() && strVarName == objInfo.getVarName())
		{
			nFromIndex = i;
			break;
		}
	}
	
	if (-1 == nFromIndex)
	{
		// 원본 아톰을 찾지 못하면 리턴
		return;
	}
	
	// 포커스가 이동할 대상 아톰을 찾아서, 있으면 포커스 이동
	var objTargetAtom = null;
	
	var nRealOffset = (null != nOffset) ? nOffset : 1;
	
	// 원본 아톰의 다음 아톰을 순서대로 찾는다.
	for (var j = nFromIndex + nRealOffset; j < nSize; j+=1)
	{
		var objAtom = this._getInfoAtom(this.m_alTabInfoList[j], strTabID, strScrollName);
		
		if (null != objAtom && objAtom.isFocusable())
		{
			objTargetAtom = objAtom;
			break;
		}
	}
	
	if (null != objTargetAtom)
	{
		if (objTargetAtom.setFocus())
		{
			return true;
		}
	}
	else
	{
		// 스크롤에 묶인 아톰은 다음행으로 이동한다.
		if (10 < nType && 0 < strScrollName.length)
		{
			var objScroll = ScrollAtom.getAtom(strScrollName);
			if (null != objScroll)
			{
				objScroll.moveNextRow();
			}
		}
	
		// 리스트의 처음부터 다시 찾는다.
		for (var j = 0; j < nFromIndex; j++)
		{
			var objAtom = this._getInfoAtom(this.m_alTabInfoList[j], strTabID, strScrollName);
			
			if (null != objAtom && objAtom.isFocusable())
			{
				objTargetAtom = objAtom;
				break;
			}
		}
		
		if (null != objTargetAtom)
		{
			if (objTargetAtom.setFocus())
			{
				return true;
			}
		}
	}
	
	return false;
}

/**
 * 포커스를 이동할 이전 아톰을 찾은 다음 이동한다.
 */
TabOrderManager.prototype.movePrevFocus = function (nType, strVarName, strScrollName, strTabID)
{
	var nFromIndex = -1;
	var nSize = this.m_alTabInfoList.length;
	
	// Tab 이벤트가 발생한 원본 아톰의 index를 찾는다.
	for (var i = 0; i < nSize; i++)
	{
		var objInfo = this.m_alTabInfoList[i];
		if (nType == objInfo.getType() && strVarName == objInfo.getVarName())
		{
			nFromIndex = i;
			break;
		}
	}
	
	// 포커스가 이동할 대상 아톰을 찾아서, 있으면 포커스 이동
	if (-1 < nFromIndex)
	{
		var objTargetAtom = null;
		
		// 원본 아톰의 이전 아톰을 순서대로 찾는다.
		for (var j = nFromIndex - 1; 0 <= j; j--)
		{
			var objAtom = this._getInfoAtom(this.m_alTabInfoList[j], strTabID, strScrollName);
			
			if (null != objAtom && objAtom.isFocusable())
			{
				objTargetAtom = objAtom;
				break;
			}
		}
		
		if (null != objTargetAtom)
		{
			if (objTargetAtom.setFocus())
			{
				return true;
			}
		}
		else
		{
			// 스크롤에 묶인 아톰은 이전행으로 이동한다.
			if (10 < nType && 0 < strScrollName.length)
			{
				var objScroll = ScrollAtom.getAtom(strScrollName);
				if (null != objScroll)
				{
					objScroll.movePrevRow();
				}
			}
			
			// 리스트의 끝부터 다시 찾는다.
			for (var j = nSize - 1; nFromIndex < j; j--)
			{
				var objAtom = this._getInfoAtom(this.m_alTabInfoList[j], strTabID, strScrollName);
				
				if (null != objAtom && objAtom.isFocusable())
				{
					objTargetAtom = objAtom;
					break;
				}
			}
			
			if (null != objTargetAtom)
			{
				if (objTargetAtom.setFocus())
				{
					return true;
				}
			}
		}
	}
	
	return false;
}


/**
 * 탭이동 정보를 가지고 해당 아톰을 찾아 리턴한다.
 */
TabOrderManager.prototype._getInfoAtom = function (objInfo, strTabID, strScrollName)
{
	if (0 < strTabID.length && -1 < objInfo.getTabID())
	{
		if (strTabID != "TabID" + objInfo.getTabID())
		{
			return null;
		}
	}
	
	// 스크롤에서 탭이동이 발생하면, 스크롤 내부에 있는 다른 아톰으로만 포커스 이동한다.
	if (0 < strScrollName.length && strScrollName != objInfo.getScrollName())
	{
		return null;
	}
	
	return this._getAtomByType(objInfo.getType(), objInfo.getVarName(), objInfo.getScrollName());
}

TabOrderManager.prototype._getAtomByType = function (nType, strVarName, strScrollName)
{
	var objAtom = null;
	
	if (TabOrderManager.ATOMKIND_INPUTDATA == nType)
	{
		objAtom = InputDataAtom.getAtom(strVarName);
	}
	else if (TabOrderManager.ATOMKIND_DATE == nType)
	{
		objAtom = InputTimeAtom.getAtom(strVarName);
	}
	else if (TabOrderManager.ATOMKIND_CHECKBOX == nType)
	{
		objAtom = CheckAtom.getAtom(strVarName);
	}
	else if (TabOrderManager.ATOMKIND_COMBOBOX == nType)
	{
		objAtom = ComboAtom.getAtom(strVarName);
	}
	else if (10 < nType)
	{
		// 스크롤에 묶인 아톰일 경우
		var objScrollAtom = ScrollAtom.getAtom(strScrollName);
		
		var nRowIndex = objScrollAtom.getSelectedRowIndex();
		
		objAtom = objScrollAtom.getBindedAtom(strVarName, nRowIndex);
	}
	
	return objAtom;
}

/**
 * 탭이동 정보에서 아톰을 구분하기 위해 쓰이는 상수
 */
TabOrderManager.ATOMKIND_INPUTDATA = 1;
TabOrderManager.ATOMKIND_DATE = 2;
TabOrderManager.ATOMKIND_CHECKBOX = 3;
TabOrderManager.ATOMKIND_COMBOBOX = 4;
TabOrderManager.ATOMKIND_RADIOBTN = 5;
TabOrderManager.ATOMKIND_POPUP = 6;

TabOrderManager.ATOMKIND_SCROLL = 10;
TabOrderManager.ATOMKIND_SCROLLINPUT = 11;
TabOrderManager.ATOMKIND_SCROLLDATE = 12;
TabOrderManager.ATOMKIND_SCROLLCHECK = 13;
TabOrderManager.ATOMKIND_SCROLLCOMBO = 14;
TabOrderManager.ATOMKIND_SCROLLRADIO = 15;
TabOrderManager.ATOMKIND_SCROLLPOPUP = 16;


function TabOrderInfo (nType, strVarName, strScrollName, nTabID)
{
	this.m_nType = nType;
	this.m_strVarName = strVarName;
	this.m_strScrollName = strScrollName;
	this.m_nTabID = nTabID;
}

TabOrderInfo.prototype.getType = function ()
{
	return this.m_nType;
}

TabOrderInfo.prototype.getVarName = function ()
{
	return this.m_strVarName;
}

TabOrderInfo.prototype.getScrollName = function ()
{
	return this.m_strScrollName;
}

TabOrderInfo.prototype.getTabID = function ()
{
	return this.m_nTabID;
}
