[ Nexacro.Dataset -  검색 관련 ]

 

/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * Group : 4. Dataset Row 관련
 **=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


/******************************************************************************************
 * 기능 : 특정컬럼 값중 가장 큰 값에 대한 row를 return
 * 인자 : objDS   - 찾을 Dataset name
 *        psColId - 찾을 컬럼명
 * 리턴 : 가장큰 값에 대한 row
 * 예문 :
 *****************************************************************************************/

function gfn_GetMaxFirstRow(objDs, psColId){

    var sMaxVal;

    sMaxVal  = objDs.getMax(psColId);

    return objDs.findRow(psColId, sMaxVal);

}


/*******************************************************************************
 ★ 설명
     Dataset에서 strVal에 해당하는 Record 찾기
     찾기 시작하고자 하는 Record에서 끝까지 찾고 다시 처음부터 시작 Record까지
     찾은 후 그걸 한번에 Return하기 위해 만듬
 ★ parameter
    1. objDs : Dataset Object ( 예 : Dataset00 )
    2. strColID : Column명
    3. strVal : 찾고자 하는 값
    4. nStartRow : 찾기 시작하고자 하는 Record
 ★ return
    찾은 Record를 담은 Array
 ******************************************************************************/

function DsFindRow( objDs, strColID, strVal, nStartRow )

{

 if( fn_IsNull(nStartRow) )  nStartRow = 0;

 

 var frow = -1, expr;

 var arr=Array(), arr_no=0;

 while(1)

 {

  expr = objDs.name + ".getColumn(currow, " + "\"" + strColID + "\").toString().search(/" + strVal + "/) >= 0";

  frow = objDs.findRowExpr(expr, frow+1);

  if( frow < 0 )

   break;

  arr[arr_no] = frow;

  arr_no++;

 }

 

 return arr;

}

 

/*******************************************************************************
 ★ 설명
     DsFindRow()에서 대소문자 구별없이 찾을 수 있게 만듬
 ★ parameter
    1. objDs : Dataset Object ( 예 : Dataset00 )
    2. strColID : Column명
    3. strVal : 찾고자 하는 값
    4. nStartRow : 찾기 시작하고자 하는 Record
 ★ return
    찾은 Record를 담은 Array
 ******************************************************************************/

function DsFindRowCase( objDs, strColID, strVal, nStartRow )

{

 if( fn_IsNull(nStartRow) )  nStartRow = 0;

 

 var frow = -1, expr;

 var arr=Array(), arr_no=0;

 while(1)

 {

  expr = objDs.name + ".getColumn(currow, " + "\"" + strColID + "\").toString().search(/" + strVal + "/i) >= 0";

  frow = objDs.findRowExpr(expr, frow+1);

  if( frow < 0 )

   break;

  arr[arr_no] = frow;

  arr_no++;

 }

 

 return arr;

}

 
 
 
 
 
 
 
 

  

'Nexacro-Function > Dataset' 카테고리의 다른 글

Nexacro.Dataset - 한줄 추가.삭제  (0) 2017.01.28
Nexacro.Dataset - 복사(copy)  (0) 2017.01.28
Nexacro.Dataset - Check Box  (0) 2017.01.28
Nexacro.Dataset - 속성(Properties)  (0) 2017.01.28
Nexacro.Dataset - 컬럼 값  (2) 2017.01.28
Posted by 농부지기
,

[ Nexacro.Dataset -  Check Box ]

 

 

/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * Group : 3. Dataset Check box
 **=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


/******************************************************************************************
 * 기능 : 체크된 Row가 존재 하는지 검사
 * 인자 : objDS - 검사할 Dataset name
 * 리턴 : true  - check row존재
 *        false - check row 미 존재
 * 예문 :
 *****************************************************************************************/

function gfn_DeleteCheckExist(objDS)

{

    var nRow = objDS.findRow("_chk", "1");

    

    //1. 체크된 Row가 없을 경우

    if (nRow < 0){

        gfn_Alert('WRN00054'); //삭제할 항목을 선택하세요.

        return false;

    //2. 체크된 Row가 있을 경우

    }else{

        return true;

    }

}


/******************************************************************************************
 * 기능 : 체크된 Row가 존재 시 삭제
 * 인자 : objDS - 검사할 Dataset name
 *        sType - 바로삭제여부
 * 리턴 : true  - check row존재
 *        false - check row 미 존재
 * 예문 :
 *****************************************************************************************/

function gfn_DeleteChecked(objDS)

{

    var nRow = objDS.findRow("_chk", "1");

    

    //1. 체크된 Row가 없을 경우

    if (nRow < 0){

        gfn_Alert('WRN00054'); //삭제할 항목을 선택하세요.

        return false;

    //2. 체크된 Row가 있을 경우

    }else{

        var oExtCommon = new ExtCommon();

        var aIndex = oExtCommon.findRows(objDS, "_chk", "1");       

        

        for (var i = aIndex.length - 1; i > -1; i--) {

            objDS.deleteRow(parseInt(aIndex[i]));

        }

        return true;

    }

}

 
 
 
 
 
 
 

  

 

'Nexacro-Function > Dataset' 카테고리의 다른 글

Nexacro.Dataset - 한줄 추가.삭제  (0) 2017.01.28
Nexacro.Dataset - 복사(copy)  (0) 2017.01.28
Nexacro.Dataset - 검색 관련  (0) 2017.01.28
Nexacro.Dataset - 속성(Properties)  (0) 2017.01.28
Nexacro.Dataset - 컬럼 값  (2) 2017.01.28
Posted by 농부지기
,

[ Nexacro.Dataset -  속성(Properties) ]

 

/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * Group : 2. Dataset 속성(Properties)
 **=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


/******************************************************************************************
 * 기능 : 해당 dataset에서 컬럼명이 존재 하는지 검사
 * 인자 : objDs  - 검사할 dataset
 *        sColId - 검사할 컬럼명
 * 리턴 : true - 해당 컬럼 존재
 *        false - 해당 컬럼 미존재
 * 예문 :
 *****************************************************************************************/

function gfn_ExistColumnId(objDs, sColId){

    var nColCnt = objDs.colcount;

    

    for(var i=0; i < nColCnt; i++){

        if (sColId == objDs.getColID(i)) return true;

    }

    return false;

}


/******************************************************************************************
 * 기능 : Dataset 이 변경 되었는지 검사
 * 인자 : psDsList - String형식의 Dataset
 *        pbMsg     - 미 변경 시 Message 조회 여부
 * 리턴 : true - 수정된 dataset이 존재
 *        false - 수정된 dataset이 미 존재
 * 예문 : gfn_IsModified("dsName1,dsName2,dsName3", true);
 *****************************************************************************************/

function gfn_IsModified(psDsList, pbMsg){

    var paDsList = psDsList.split(',');

    var bChange  = false;

    

    for(var i=0; i<paDsList.length; i++){

        if (gfn_IsUpdate(eval(paDsList[i]))){

            bChange = true;

            break;

        }

    }

    

    if (pbMsg == true && bChange == true){

        alert("변경된 자료가 존재 합니다.");

        return true;

    }

    

    return false;

}


/******************************************************************************************
 * 기능 : Dataset의 변경 유무를 리턴한다.
 * 인자 : poDataset : 체크할 Dataset
 * 리턴 : true - 수정된 dataset이 존재
 *        false - 수정된 dataset이 미 존재
 *****************************************************************************************/

function gfn_IsUpdate(poDataset)

{

    // 삭제 여부

    if (poDataset.getDeletedRowCount() > 0) return true;

    

    // 입력/수정 여부

    for (var i = 0; i < poDataset.rowcount; i++) {

        if (poDataset.getRowType(i) == 2 || poDataset.getRowType(i) == 4) {

            return true;

        }

    }

    

    return false;

}

 

 

☞  

 
 
 
 

  

'Nexacro-Function > Dataset' 카테고리의 다른 글

Nexacro.Dataset - 한줄 추가.삭제  (0) 2017.01.28
Nexacro.Dataset - 복사(copy)  (0) 2017.01.28
Nexacro.Dataset - 검색 관련  (0) 2017.01.28
Nexacro.Dataset - Check Box  (0) 2017.01.28
Nexacro.Dataset - 컬럼 값  (2) 2017.01.28
Posted by 농부지기
,

[ Nexacro.Dataset -  컬럼 값 ]

 

/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * Group : 1. Dataset 컬럼 값
 * Group : 2. Dataset 속성(Properties)
 * Group : 3. Dataset Check box
 * Group : 4. Dataset Row 관련
 **=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 
/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * Group : 1. Dataset 컬럼 값
 **=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


/******************************************************************************************
 * 기능 : Dataset에서 값을 얻어올때 null이면 공백을 return
 * 인자 : objDs - Dataset
 *        nRow  - ds row
 *        sColId - 컬럼 id
 * 리턴 : Dataset에서 get한 값
 * 예문 :
 *****************************************************************************************/

function gfn_GetColumnEmpty(objDs, nRow, sColId){

    var sVal = objDs.getColumn(nRow, sColId);

    

    if (gfn_IsNull(sVal)) sVal = ''

    

    return sVal;

}

/******************************************************************************************
 * 기능 : Dataset에서 값을 얻어올때 null이면 0을 return
 * 인자 : objDs - Dataset
 *        nRow  - ds row
 *        sColId - 컬럼 id
 * 리턴 : Dataset에서 get한 값
 * 예문 :
 *****************************************************************************************/

function gfn_GetColumnZero(objDs, nRow, sColId){

    var nVal = objDs.getColumn(nRow, sColId);

    

    if (gfn_IsNull(nVal)) nVal = 0

    

    return nVal;

}

/******************************************************************************************
 * 기능 : dataset에서 필요한 값을 find한 후 해당 컬럼값을 얻어 오기
 * 인자 : objDs        - 검색 및 찾아올 dataset
 *        strFindExpr  - find에 찾을 조건값
 *        sColId       - getColumn할 column id
 * 리턴 : 검색한 결과
 * 예문 :
 *****************************************************************************************/

function gfn_FindGetColumn(objDs, strFindExpr, sColid ){

    var nFindRow = objDs.findRowExpr(strFindExpr);

    if (nFindRow < 0) return '';

    

    return objDs.getColumn(nFindRow, sColid);

}

/******************************************************************************************
 * 기능 : 중복data검사
 * 인자 : objDs          - 검사할 dataset
 *        aColList       - 컬럼목록   "EMP_NO,DEPT_NO";
 *        nRow           - 검사 소스 ROW (이 row를 기준으로 중복되었는지 검사)
 * 리턴 : true - 중복,   false - 중복 없음
 * 예문 :
 *****************************************************************************************/

function gfn_IsDuplicate(objDs, aColList, nRow){

    var sFildCond, sColValue, nFindRow;

    var paColList = aColList.split(',');

    

    sFildCond = paColList[0] + "=='" + objDs.getColumn(nRow, paColList[0]) + "'";

    for(var ii=0; ii<paColList.length; ii++){

        sFildCond += "&& " + paColList[ii] + "=='" + objDs.getColumn(nRow, paColList[ii]) + "'";

    }

    sFildCond += "&& currow <> " + nRow);  //<----  currow가 되는지 테스트 해 보지 않았음

    

    nFindRow = objDs.getCaseCount(sFildCond);

    

    if (nFindRow > 1){

        return true;

    }

    return false;

}

/******************************************************************************************
 * 기능 : dataset에 null, space등의 결과로 tag 가 없는 컬럼에 대해서 tag 생성(default값 set)
 *        sql문장에서 null, space결과값은 dataset에 tag가 만들어지지 않는다.
 *        tag 가 만들어지지 않으면 getSum등의 함수에서 NaN 결과값을 return하게 됨
 *        값이 null, space인 경우 default 값 Setting으로도 가능함.
 * 인자 : bEvent - true : event 호출됨,   false : event 호출 안됨
 *        objDs  - 작업할 Dataset
 *        aColId - 값Setting Array형식의 컬럼리스트
 *        aVal   - 값Setting Array형식의 Setting할 값 리스트
 * 리턴 :
 * 예문 : var aColId = new Array('goodAllotSmtotScore', 'evalScoreSmtot');
 *        var aVal   = new Array('0', '');
 *        gfn_SetDsNullValue(true, dsProjectItem, aColId, aVal);
 *****************************************************************************************/

function gfn_SetDsNullValue(bEvent, objDs, aColId, aVal){

 

    if (bEvent == false)    objDs.enableevent = false;

    for(var nRow=0; nRow < objDs.getRowCount(); nRow++){

        for(var nIdx=0; nIdx<aColId.length; nIdx++){

            if ( gfn_IsNull(objDs.getColumn(nRow, aColId[nIdx])) ){

                objDs.setColumn(nRow, aColId[nIdx], aVal[nIdx]);

            }

        }

    }   

    

    if (bEvent == false)    objDs.enableevent = true;

}

 

 
 
 
 

  

 

'Nexacro-Function > Dataset' 카테고리의 다른 글

Nexacro.Dataset - 한줄 추가.삭제  (0) 2017.01.28
Nexacro.Dataset - 복사(copy)  (0) 2017.01.28
Nexacro.Dataset - 검색 관련  (0) 2017.01.28
Nexacro.Dataset - Check Box  (0) 2017.01.28
Nexacro.Dataset - 속성(Properties)  (0) 2017.01.28
Posted by 농부지기
,

[ Nexacro.Component -  Object Position2 ]

 

 

 

// L = left, T =top, R = right, B = bottom, W = width, H = height

var _L = 0, _T = 1, _R = 2, _B = 3, _W = 4, _H = 5;

/*******************************************************************************
★ 설명
Modal Dialog실행 함수
★ parameter
NewChildFrame()과 동일
★ return
- 성공 = variant ( Dialog창에서 close()에 의해 Return된 값 )
- 실패 = null
******************************************************************************/

function Dialog(sID, sURL, sArg, nLeft, nTop, nWidth, nHeight, sStyle)

{

var rtn=null;

var newChild;

var MyFrame = this.getOwnerFrame();

 

newChild = _NewChildFrame(sID, sURL, sArg, nLeft, nTop, nWidth, nHeight, sStyle);

rtn = newChild.showModal(MyFrame, sArg);

this.removeChild(newChild.name);

newChild.destroy();

newChild = null;

return rtn;

}

 

/*******************************************************************************
★ 설명
Modaless Dialog실행 함수
★ parameter
NewChildFrame()과 동일
★ return
- 성공 = true ( 정상작동여부 )
- 실패 = false
******************************************************************************/

function Open(sID, sURL, sArg, nLeft, nTop, nWidth, nHeight, sStyle)

{

var rtn;

var newChild;

var MyFrame = this.getOwnerFrame();

 

newChild = _NewChildFrame(sID, sURL, sArg, nLeft, nTop, nWidth, nHeight, sStyle);

 

return newChild.showModeless(MyFrame, sArg);

}

 

/*******************************************************************************
★ 설명
Grid Header Click하면 Sorting하는 함수
★ parameter
1. obj:Grid : Grid Object ( 예 : Grid00 )
2. e:GridClickEventInfo : Click Event Object ( Grid Onclick Envent의 Argument e )
3. ASC_MARK : Ascending Mark (옵션 : Default = "▼")( 예 : "▼" )
4. DESC_MARK : Descending Mark (옵션 : Default = "▲")( 예 : "▲" )
★ return
- 성공 = true
- 실패 = false
******************************************************************************/

function GridSort(obj:Grid, e:GridClickEventInfo, ASC_MARK, DESC_MARK)

{

// 컬럼의 정렬방식을 'head'의 text에 "↑,↓"여부로 판단.

// 이미지로 대체 가능.

var bindDs = eval(obj.binddataset);

var i, cell_cnt;

 

if (bindDs.rowcount == 0) return false;

if( gf_isNull(ASC_MARK) ) ASC_MARK = "▼";

if( gf_isNull(DESC_MARK) ) DESC_MARK = "▲";

 

cell_cnt = obj.getCellCount("head");

var BodyColId = (obj.getCellProperty("body", e.col,"text")).toString().split(":"); // e.col : 바인드된 컬럼.

 

for( i = 0 ; i < cell_cnt ; i++ )

{

if(obj.getCellText(-1, i)=="undefined")

continue;

 

var strHeadText = obj.getCellText(-1, i);

 

if(i==e.cell)

{

if(strHeadText.substr(strHeadText.length-1) == ASC_MARK)

{

obj.setCellProperty( "head", i, "text", strHeadText.substr(0, strHeadText.length - 1)+DESC_MARK);

bindDs.keystring = "S:-"+BodyColId[1];

}

else if (strHeadText.substr(strHeadText.length-1) == DESC_MARK)

{

obj.setCellProperty( "head", i, "text", strHeadText.substr(0, strHeadText.length - 1)+ASC_MARK);

bindDs.keystring = "S:+"+BodyColId[1];

}

else

{

obj.setCellProperty( "head", i, "text", strHeadText+ASC_MARK);

bindDs.keystring = "S:+"+BodyColId[1];

}

}

else // 정렬표시 삭제

{

if (strHeadText.substr(strHeadText.length-1) == ASC_MARK || strHeadText.substr(strHeadText.length-1) == DESC_MARK)

{

obj.setCellProperty( "head", i, "text", strHeadText.substr(0, strHeadText.length - 1));

}

}

}

return true;

}

 

/*********************************************************************************************
** 나중에?????
** function name : gf_exportExcel()
** function description : Grid의 내용을 Excel로 Export 한다.
** argument : CUCO_ICPH 고객유입경로
** SHORTCUT 단축키
** CONTENTS 상담내용
** return Type : None
** return description :
*********************************************************************************************/

function GridExportExcel(objGrid, strTitle, strCondition, strSheetName)

{

/*

var objExport = new ExportHCardObject();

objExport.exporttype = ExportHCardTypes.EXCEL;

objExport.activepagename = strSheetName;

 

objExport.addExportItem(ExportHCardItemTypes.GRID, objGrid, "A5", "allband","allrecord","suppress","allstyle", "맑은 고딕,9", "맑은 고딕,11,bold",

strTitle, //title

strCondition, //condition

"A4", //conditionposition

true //removefirstcol

);

 

objExport.export();

objExport = null;

*/

}

 

/*******************************************************************************
★ 설명
Object의 type을 문자열로 얻어온다.
★ parameter
1. oObj : type을 얻어올 Object
(예 : mainframe, this.getOwnerFrame(), this, button,...)
★ return
- 성공 = Object의 type문자열(예 : "MainFrame", "ChildFrame", "Form", "Button",...)
- 실패 = null ( oObj가 null인 경우 )
******************************************************************************/

function GetObjType(oObj)

{

var sType;

 

if( gf_isNull(oObj) ) return null;

 

sType = oObj.toString().valueOf().substr(1,6);

if( sType.toLowerCase() == "object" )

return Mid(oObj.toString().valueOf(), " ", "]");

 

return null;

}

 

/*******************************************************************************
★ 설명
모든 Collection이 type을 이용하여 얻어오는 것이 없으므로 type을 이용하여
Collection을 얻어오는 함수임
단, type은 Object에 의해 나오는 Value값을 의미한다.
예를들어, gf_message(Button0)="[object Button]" 에서 "Button"을 Type이라 한다.
★ parameter
1. oCollection : Collection Object(예 : this.components, mainframe.all, ...)
2. sType : Type문자열 (예 : "ChildFrame", "Button")
★ return
- 성공 = Collection List중 sType에 적합한 Object만 Array로 Return한다.
- 실패 =
******************************************************************************/

function GetObjTypeCollection(oCollection, sType)

{

var sType, i, arr=new Array(), arr_no=0, sColType;

 

if( gf_isNull(oCollection) ) return arr;

if( gf_isNull(sType) )

{

arr = oCollection;

return arr;

}

for( i = 0 ; i < oCollection.length ; i++ )

{

sColType = GetObjType(oCollection[i]);

if( sColType == null ) continue;

if( sType.toLowerCase() == sColType.toLowerCase() )

{

arr[arr_no] = oCollection[i];

arr_no++;

}

}

 

return arr;

}

 

/*******************************************************************************
★ 설명
oObj가 Popup창(showModaless()에 의해 뜬창)인지 확인한다.
단, gf_showModal()에 의해 뜬 창은 해당되지 않는다.
★ parameter
1. oObj : Popup창 여부를 확인할 Object
★ return
- oObj가 Popup창인 경우 = true
- oObj가 Popup창이 아닌 경우 = false
★ 주의사항
단, gf_showModal()에 의해 뜬 창은 해당되지 않는다.
******************************************************************************/

function IsObjPopup(oObj)

{

if( gf_isNull(oObj) ) return false;

 

if( application.popupframes(oObj.name) == null )

return false;

else

return true;

}

 

/*******************************************************************************
★ 설명
oObj에 해당하는 좌표계가 Screen좌표계인지를 체크한다.
★ parameter
1. oObj : 체크할 Object(예 : mainframe, this.getOwnerFrame(), this, button,...)
★ return
- oObj가 Screenr기준 좌표계인 경우 = true
- oObj가 Screenr기준 좌표계가 아닌경우 = false
******************************************************************************/

function IsObjScreenPos(oObj)

{

var sType;

 

sType = GetObjType(oObj);

if( gf_isNull(sType) ) return false;

 

if( sType.toLowerCase() == "mainframe" )

return true;

if( sType.toLowerCase() == "childframe" )

{

if( IsObjPopup(oObj) == true )

return true;

}

 

return false;

}

 

/*******************************************************************************
★ 설명
oObj에 해당하는 Object가 Position을 갖지 않는 Object인지 판단한다.
★ parameter
1. oObj : 체크할 Object(예 : application, mainframe, this.getOwnerFrame(), this, button,...)
★ return
- oObj가 position property가 없는 경우 = true
- oObj가 position property가 있는 경우 = false
******************************************************************************/

function IsObjNoPos(oObj)

{

var sType;

 

sType = GetObjType(oObj);

if( gf_isNull(sType) ) return false;

 

if( sType.toLowerCase() == "application" )

return true;

 

return false;

}

 

/*******************************************************************************
★ 설명
system의 cursorx, cursory를 해당 Object의 영역좌표에 맞는 값으로 변경한다.
★ parameter
1. oObj : Object
(예 : mainframe, this.getOwnerFrame(), this, button,...)
★ return
- 성공 = oObj좌표계에 해당하는 Cursor position 문자열 ( 예 : "20 20" )
- 실패 = null
★ 주의사항
단, event에서 얻어지는 cursor좌표는 아니다.
******************************************************************************/

function GetObjCursorPos(oObj)

{

var sObjPos;

var cursorx, cursory;

var sCursorPos;

 

if( gf_isNull(oObj) ) return null;

if( IsObjNoPos(oObj) ) return null;

 

cursorx = system.cursorx;

cursory = system.cursory;

 

if( IsObjScreenPos(oObj) == true )

sCursorPos = cursorx + " " + cursory;

else

sCursorPos = (system.screenToClientX(oObj, cursorx)+oObj.position.left) + " " + (system.screenToClientY(oObj, cursory)+oObj.position.top);

 

return sCursorPos;

}

 

/*******************************************************************************
★ 설명
sAreaPos의 Center위치에 맞는 sObjPos의 position을 구한다.
★ parameter
1. sAreaPos : 영역에 해당하는 Position 문자열
(예 : "10 10 50 50", this.position,...)
2. sObjPos : Center에 위치할 대상 Object의 Position
(옵션 : Default="" ==> Object의 Width=0, Height=0인 경우에 해당함)
(예 : "", "10 10 30 30", this.position,...)
★ return
- 성공 = sAreaPos의 좌표계에 해당하는 Center position 문자열
( 예 : sObjPos=""인 경우 ==> "30 30",
sObjPos="10 10 20 20"인 경우 ==> "20 20 40 40" )
- 실패 = null
******************************************************************************/

function GetCenterPos(sAreaPos, sObjPos)

{

var vAreaPos = new Array();

var vObjPos = new Array();

var vCenterPos = new Array();

 

vAreaPos = _PosStr2Arr(sAreaPos);

if( vAreaPos == null ) return null;

vObjPos = _PosStr2Arr(sObjPos);

if( vObjPos == null )

{

vCenterPos[_L] = vAreaPos[_L] + Math.round(vAreaPos[_W]/2);

vCenterPos[_T] = vAreaPos[_T] + Math.round(vAreaPos[_H]/2);

}

else

{

vCenterPos[_L] = vAreaPos[_L] + Math.round(vAreaPos[_W]/2) - Math.round(vObjPos[_W]/2);

vCenterPos[_T] = vAreaPos[_T] + Math.round(vAreaPos[_H]/2) - Math.round(vObjPos[_H]/2);

if( vObjPos.length > 2 )

{

vCenterPos[_R] = vCenterPos[_L] + vObjPos[_W];

vCenterPos[_B] = vCenterPos[_T] + vObjPos[_H];

}

}

 

return _PosArr2Str(vCenterPos);

}

 

/*******************************************************************************
★ 설명
nLeft, nTop좌표로
sPosition의 Width에 대해 n Offset Width만큼,
sPosition의 Height에 대해 n Offset Height만큼
이동한 좌표 Position문자열을 획득한다.
★ parameter
1. sPosition : position 문자열 (예 : "absolute 10 10 20 20" = object.position )
   단, "absolute"는 생략 가능하다.
2. nLeft : 이동할 Left 값 ( 예 : 10 또는 -10 )
3. nOffsetTop : 이동할 Top 값 ( 예 : 10 또는 -10 )
4. nOffsetWidth : 이동할 Offset Width값 ( 예 : 10 또는 -10 )
   (옵션 : Default = 0, 즉 이동하지 않는다)
5. nOffsetHeight : 이동할 Offset Height값 ( 예 : 10 또는 -10 )
(옵션 : Default = 0, 즉 이동하지 않는다)

★ return
- 성공 = 이동될 Position문자열 ( 예 : "absolute 20 20 30 30" 또는 "absolute 0 0 10 10" )
단, sPosition이 2개만 지정된 경우 offsetWidth, nOffsetHeight에 어떤값을 지정하면
이 경우는 Widht=0, Height=0와 동일하므로 4개로 바꾸어 Return한다.
( 예 : GetMovePos("10 10", 20, 20) = "20 20 20 20" )
- 실패 = null ( sPosition이 적합한 값이 아닌 경우 )
★ 목적
XPlatform은 Width, Height가 아닌 Right, Bottom을 적용하기 때문에 헷갈리는 면이 있다.
또한, object를 이동시키는 함수는 있지만 이동될 좌표만 구하는 함수가 없기 때문에
이 함수를 만들었다.
******************************************************************************/

function GetMovePos(sPosition, nLeft, nTop, nOffsetWidth, nOffsetHeight)

{

var sType;

var aPosition = new Array();

var aRetPosition = new Array();

 

aPosition = _PosStr2Arr(sPosition);

if( aPosition == null ) return null;

if( gf_isNull(nLeft) ) return null;

if( gf_isNull(nTop) ) return null;

 

aRetPosition[_L] = nLeft;

aRetPosition[_T] = nTop;

 

if( aPosition.length <= 2 )

{

if( gf_isNull(nOffsetWidth) == true && gf_isNull(nOffsetHeight) == true )

return _PosArr2Str(aRetPosition);

else

{

aPosition[_W] = 0;

aPosition[_H] = 0;

}

}

if( gf_isNull(nOffsetWidth) )

nOffsetWidth = 0;

if( gf_isNull(nOffsetHeight) )

nOffsetHeight = 0;

 

aRetPosition[_R] = aRetPosition[_L] + (aPosition[_W] + nOffsetWidth);

aRetPosition[_B] = aRetPosition[_T] + (aPosition[_H] + nOffsetHeight);

return _PosArr2Str(aRetPosition);

}

 

/*******************************************************************************
★ 설명
sPosition대비
Left좌표에 대해 nOffsetLeft만큼, Top좌표에 대해 nOffsetTop만큼,
Width에 대해 n Offset Width만큼, Height에 대해 n Offset Height만큼
이동한 좌표 Position문자열을 획득한다.
★ parameter
1. sPosition : position 문자열 (예 : "absolute 10 10 20 20" = object.position )
단, "absolute"는 생략 가능하다.
2. nLeft : sPosition대비 이동할 Left Offset값 ( 예 : 10 또는 -10 )
3. nOffsetTop : sPosition대비 이동할 Left Offset값 ( 예 : 10 또는 -10 )
4. nOffsetWidth : sPosition대비 이동할 Width Offset 값 ( 예 : 10 또는 -10 )
(옵션 : Default = 0, 즉 이동하지 않는다)
5. nOffsetHeight : sPosition대비 이동할 Height Offset 값 ( 예 : 10 또는 -10 )
(옵션 : Default = 0, 즉 이동하지 않는다)
★ return
- 성공 = 이동될 Position문자열 ( 예 : "absolute 20 20 30 30" 또는 "absolute 0 0 10 10" )
단, sPosition이 2개만 지정된 경우 offsetWidth, nOffsetHeight에 어떤값을 지정하면
이 경우는 Widht=0, Height=0와 동일하므로 4개로 바꾸어 Return한다.
( 예 : GetMovePos("10 10", 20, 20) = "20 20 20 20" )
- 실패 = null ( sPosition이 적합한 값이 아닌 경우 )
******************************************************************************/

function GetMoveToPos(sPosition, nOffsetLeft, nOffsetTop, nOffsetWidth, nOffsetHeight)

{

var nLeft, nTop;

var aPosition = new Array();

 

aPosition = _PosStr2Arr(sPosition);

if( aPosition == null ) return null;

 

if( gf_isNull(nOffsetLeft) ) return null;

if( gf_isNull(nOffsetTop) ) return null;

 

nLeft = aPosition[_L] + nOffsetLeft;

nTop = aPosition[_T] + nOffsetTop;

 

return GetMovePos(sPosition, nLeft, nTop, nOffsetWidth, nOffsetHeight);

}

 

/*******************************************************************************
★ 설명
oObj에 해당하는 Object의 border width를 구하는 함수이다.
★ parameter
1. oObj : Object
(예 : mainframe, this.getOwnerFrame(), this, button,...)
★ return
- 성공 = oObj의 Border Width
- 실패 = -1
★ 목적
현재 XPlatform(2009.12.10.1)에서 border가 지정되지 않고 style로 적용되어 있으면
border를 구하지 못하므로 만들었다.
★ BUG
1. Component border가 지정되어 있지 않으면 값을 구할 수 없어 0으로 처리했음
2. ChildFrame의 border가 지정되어 있지 않으면 값을 구할 수 없어 0으로 처리됨
******************************************************************************/

function GetObjBorderWidth(oObj)

{

if( gf_isNull(oObj) ) return -1;

if( IsObjNoPos(oObj) ) return -1;

 

if( isNaN(oObj.style.border.width) || gf_isNull(oObj.style.border.width) )

{

var sType;

 

sType = GetObjType(oObj);

if( IsObjScreenPos(oObj) == true )

return 0-system.screenToClientX(oObj, oObj.position.left);

else

{

if( GetObjType(oObj.parent).toLowerCase() == "form" )

return 0;

else

return system.clientToScreenX(oObj, 0) - system.clientToScreenX(oObj, oObj.position.left);

}

}

else

return oObj.style.border.width;

}

 

/*******************************************************************************
★ 설명
oFromObj 좌표계의 sFromObjPos에 해당하는 Position을
oToObj 좌표계에 해당하는 Position으로 바꾼다.
★ parameter
1. sFromPos : 변경하고자 하는 oFromAreaObj좌표계 내에서의 Position
(예 : "10 10" 또는 "10 10 20 20", Button.position, ...)
2. oFromAreaObj : 변경할 좌표계 Object, 단, Screen의 경우는 "screen"을 넣으면 된다.
(예 : "screen", mainframe, this,...)
3. oToAreaObj : 변경할 좌표계 Object
단, Screen의 경우는 "screen"을 넣으면 된다.
(예 : "screen", mainframe, this,...)
★ return
- 성공 = oToObj 좌표계로 변경된 position 문자열
- 실패 = null
★ 목적
ScreenToClient, ClientToScreen 밖에 없고 A Object에서 B Object좌표계로
한번에 변경하는 함수가 없어서 만들었음
★ BUG
oFromAreaObj = form, oToAreaObj = "screen"인 경우 Xplatform Bug같다.
******************************************************************************/

function GetObjConvPos(sFromPos, oFromAreaObj, oToAreaObj)

{

var aFromPos = new Array();

var aRetPos = new Array();

 

if( gf_isNull(sFromPos) ) return null;

if( gf_isNull(oFromAreaObj) ) return null;

if( gf_isNull(oToAreaObj) ) return null;

if( IsObjNoPos(oFromAreaObj) ) return null;

if( IsObjNoPos(oToAreaObj) ) return null;

 

if( oFromAreaObj == oToAreaObj )

return sFromPos;

aFromPos = _PosStr2Arr(sFromPos);

 

if( oFromAreaObj.toString().toLowerCase() == "screen" )

{

aRetPos[_L] = system.screenToClientX( oToAreaObj, aFromPos[_L] );

aRetPos[_T] = system.screenToClientY( oToAreaObj, aFromPos[_T] );

}

else if( oToAreaObj.toString().toLowerCase() == "screen" )

{

aRetPos[_L] = system.clientToScreenX( oFromAreaObj, aFromPos[_L] );

aRetPos[_T] = system.clientToScreenY( oFromAreaObj, aFromPos[_T] );

}

else

{

aRetPos[_L] = system.clientToScreenX( oFromAreaObj, aFromPos[_L] );

aRetPos[_T] = system.clientToScreenY( oFromAreaObj, aFromPos[_T] );

aRetPos[_L] = system.screenToClientX( oToAreaObj, aRetPos[_L] );

aRetPos[_T] = system.screenToClientY( oToAreaObj, aRetPos[_T] );

}

if( aFromPos.length > 2 )

{

aRetPos[_R] = aRetPos[_L] + aFromPos[_W];

aRetPos[_B] = aRetPos[_T] + aFromPos[_H];

}

 

return _PosArr2Str(aRetPos);

}

 

/*******************************************************************************
★ 설명
sAreaPos좌표계 내에서 주어진 Align 조건에 따라
sObjPos의 좌표를 재 계산한다.
★ parameter
1. sAreaPos : Object가 움직일 좌표영역에 해당하는 Position 문자열 ( 예 : "10 10 100 100" )
2. sObjPos : Align될 Object의 현재 Position문자열 ( 예 : "50 50 60 60" )
3. sAxisPos : 기준이 되는 X,Y축 Position문자열
( 옵션 : Default=""==>sAreaPos의 center ) ( 예 : "60 60" )
4. sOffsetPos : sAxisPos로부터의 Offset Position문자열
( 옵션 : Default="0 0" ) ( 예 : "10 10" 또는 "-10 -10" )
5. nAlign : sAxisPos를 기준으로 한 정렬형태 ( 옵션 : Default=0 )
0 = 중앙정렬, 1 = 1사분면, 2 = 2사분면, 3 = 3사분면, 4 = 4사분면
6. bAuto : nAlign을 기준으로 sObjPos의 Width, Height가 들어갈 수 있는
사분면을 자동으로 찾아 정렬한다.( 옵션 : Default=false )
true = 자동정렬, false = 자동정렬 하지 않음
7. bBigResize : Object의 width, height가 해당 4분면의 영역보다 크면 4분면에 맞추어
Object의 width, height를 줄여서 조정한다.
즉, obj > Area이면 obj를 Area의 사분면에 맞춰 줄인다. ( 옵션 : Default = false )
true = Size 조정, false = Size 조정하지 않음
8. bSmallResize : Object의 width, height가 해당 4분면의 영역보다 작으면 4분면에 맞추어
Object의 width, height를 늘려서 조정한다.
즉, obj < Area이면 obj를 Area의 사분면에 맞춰 늘인다. ( 옵션 : Default = false )
true = Size 조정, false = Size 조정하지 않음
★ return
- 성공 = 주어진 조건에 맞는 정렬된 Object의 Position문자열
- 실패 = null
★ 주의사항
1. bAuto와 (bBigResize, bSmallResize)는 동시에 true일 수 없다.
bAuto가 true이면 bBigResize, bSmallResize는 false로 처리된다.
2. (sAxisPos+sOffsetPos)가 sAreaPos의 범위를 벗어나면 null이 return된다.
단, sObjPos의 최종 Align된 Position은 sAreaPos의 범위를 벗어날 수도 있다.
2. 모든 Position은 sAreaPos의 좌표계에 맞도록 전달되어야 한다.
따라서, 머리가 아프다면 모든 좌표를 screen좌표로 처리한다면
좀 더 쉬워지겠지...
******************************************************************************/

function GetAlignPos( sAreaPos, sObjPos, sAxisPos, sOffsetPos, nAlign, bAuto, bBigResize, bSmallResize )

{

var aAreaPos = new Array();

var aAxisPos = new Array();

var aObjPos = new Array();

var aOffsetPos = new Array();

var aAlignPos = new Array();

 

aAreaPos = _PosStr2Arr(sAreaPos);

if( aAreaPos == null ) return null;

aObjPos = _PosStr2Arr(sObjPos);

if( aObjPos == null ) return null;

if( gf_isNull(sAxisPos) != true )

{

aAxisPos = _PosStr2Arr(sAxisPos);

if( aAxisPos == null ) return null;

}

else

{

aAxisPos[_L] = aAreaPos[_L] + Math.round(aAreaPos[_W]/2);

aAxisPos[_T] = aAreaPos[_T] + Math.round(aAreaPos[_H]/2);

}

 

if( gf_isNull(sOffsetPos) != true )

{

aOffsetPos = _PosStr2Arr(sOffsetPos);

if( aOffsetPos == null ) return null;

}

else

{

aOffsetPos[_L] = 0;

aOffsetPos[_T] = 0;

}

if( gf_isNull(nAlign) ) nAlign = 0;

if( gf_isNull(bAuto) ) bAuto = true;

if( gf_isNull(bBigResize) ) bBigResize = false;

if( gf_isNull(bSmallResize) ) bSmallResize = false;

if( bAuto == true )

{

bBigResize = false;

bSmallResize = false;

}

 

// Axis를 Offset만큼 보정

aAxisPos[_L] += aOffsetPos[_L];

aAxisPos[_T] += aOffsetPos[_T];

 

// Axis가 Area의 범위를 벗어나면 return null

if( aAxisPos[_L] < aAreaPos[_L] )

return null;

if( aAxisPos[_L] > aAreaPos[_R] )

return null;

if( aAxisPos[_T] < aAreaPos[_T] )

return null;

if( aAxisPos[_T] > aAreaPos[_B] )

return null;

 

// Center에 위치

if( nAlign == 0 )

{

aAlignPos[_L] = aAxisPos[_L] - Math.round(aObjPos[_W]/2);

aAlignPos[_T] = aAxisPos[_T] - Math.round(aObjPos[_H]/2);

}

// 1사분면에 위치

else if( nAlign == 1 )

{

aAlignPos[_L] = aAxisPos[_L];

aAlignPos[_T] = aAxisPos[_T] - aObjPos[_H];

}

// 2사분면에 위치

else if( nAlign == 2 )

{

aAlignPos[_L] = aAxisPos[_L] - aObjPos[_W];

aAlignPos[_T] = aAxisPos[_T] - aObjPos[_H];

}

// 3사분면에 위치

else if( nAlign == 3 )

{

aAlignPos[_L] = aAxisPos[_L] - aObjPos[_W];

aAlignPos[_T] = aAxisPos[_T];

}

// 4사분면에 위치

else if( nAlign == 4 )

{

aAlignPos[_L] = aAxisPos[_L];

aAlignPos[_T] = aAxisPos[_T];

}

 

aAlignPos[_R] = aAlignPos[_L] + aObjPos[_W];

aAlignPos[_B] = aAlignPos[_T] + aObjPos[_H];

 

// Auto처리

if( bAuto == true )

{

var i;

var aAlignPosAuto, sAlignPosAuto, nCurAlign;

if( nAlign != 0 )

{

for( i = 0 ; i <= 4 ; i++ )

{

nCurAlign = (nAlign+i)%5;

if( nCurAlign == 0 )

continue;

sAlignPosAuto = GetAlignPos( sAreaPos, sObjPos, sAxisPos, sOffsetPos,

nCurAlign, false, false, false );

aAlignPosAuto = _PosStr2Arr(sAlignPosAuto);

if( (aAlignPosAuto[_L] >= aAreaPos[_L]) &&

(aAlignPosAuto[_R] <= aAreaPos[_R]) &&

(aAlignPosAuto[_T] >= aAreaPos[_T]) &&

(aAlignPosAuto[_B] <= aAreaPos[_B]) )

{

aAlignPos = aAlignPosAuto;

break;

}

}

}

}

 

// Resize처리

if( bBigResize == true || bSmallResize == true )

{

if( nAlign == 1 )

{

if( bBigResize == true )

{

if( aAlignPos[_R] > aAreaPos[_R] ) aAlignPos[_R] = aAreaPos[_R];

if( aAlignPos[_T] < aAreaPos[_T] ) aAlignPos[_T] = aAreaPos[_T];

}

if( bSmallResize == true )

{

if( aAlignPos[_R] < aAreaPos[_R] ) aAlignPos[_R] = aAreaPos[_R];

if( aAlignPos[_T] > aAreaPos[_T] ) aAlignPos[_T] = aAreaPos[_T];

}

}

if( nAlign == 2 )

{

if( bBigResize == true )

{

if( aAlignPos[_L] < aAreaPos[_L] ) aAlignPos[_L] = aAreaPos[_L];

if( aAlignPos[_T] < aAreaPos[_T] ) aAlignPos[_T] = aAreaPos[_T];

}

if( bSmallResize == true )

{

if( aAlignPos[_L] > aAreaPos[_L] ) aAlignPos[_L] = aAreaPos[_L];

if( aAlignPos[_T] > aAreaPos[_T] ) aAlignPos[_T] = aAreaPos[_T];

}

}

if( nAlign == 3 )

{

if( bBigResize == true )

{

if( aAlignPos[_L] < aAreaPos[_L] ) aAlignPos[_L] = aAreaPos[_L];

if( aAlignPos[_B] > aAreaPos[_B] ) aAlignPos[_B] = aAreaPos[_B];

}

if( bSmallResize == true )

{

if( aAlignPos[_L] > aAreaPos[_L] ) aAlignPos[_L] = aAreaPos[_L];

if( aAlignPos[_B] < aAreaPos[_B] ) aAlignPos[_B] = aAreaPos[_B];

}

}

if( nAlign == 4 )

{

if( bBigResize == true )

{

if( aAlignPos[_R] > aAreaPos[_R] ) aAlignPos[_R] = aAreaPos[_R];

if( aAlignPos[_B] > aAreaPos[_B] ) aAlignPos[_B] = aAreaPos[_B];

}

if( bSmallResize == true )

{

if( aAlignPos[_R] < aAreaPos[_R] ) aAlignPos[_R] = aAreaPos[_R];

if( aAlignPos[_B] < aAreaPos[_B] ) aAlignPos[_B] = aAreaPos[_B];

}

}

// Axis를 중심으로 작은 쪽에 맞추어 Resizing한다.

if( nAlign == 0 )

{

var nSmallWidth, nSmallHeight;

nSmallWidth = Math.min(aAxisPos[_L] - aAreaPos[_L], aAreaPos[_R] - aAxisPos[_L]);

nSmallHeight = Math.min(aAxisPos[_T] - aAreaPos[_T], aAreaPos[_B] - aAxisPos[_T]);

 

var bWFlag=false, bHFlag=false;

if( bSmallResize == true )

{

if( Math.round(aObjPos[_W]/2) < nSmallWidth )

bWFlag = true;

if( Math.round(aObjPos[_H]/2) < nSmallHeight )

bHFlag = true;

}

if( bBigResize == true )

{

if( Math.round(aObjPos[_W]/2) > nSmallWidth )

bWFlag = true;

if( Math.round(aObjPos[_H]/2) > nSmallHeight )

bHFlag = true;

}

if( bWFlag == true )

{

aAlignPos[_L] = aAxisPos[_L] - nSmallWidth;

aAlignPos[_R] = aAxisPos[_L] + nSmallWidth;

}

if( bHFlag == true )

{

aAlignPos[_T] = aAxisPos[_T] - nSmallHeight;

aAlignPos[_B] = aAxisPos[_T] + nSmallHeight;

}

}

}

 

aAlignPos[_W] = aAlignPos[_R] - aAlignPos[_L];

aAlignPos[_H] = aAlignPos[_B] - aAlignPos[_T];

 

return _PosArr2Str(aAlignPos);

}

 

/*******************************************************************************
★ 설명
Position문자열을 Rect Object로 바꾼다.
★ parameter
1. sPos : Position 문자열 (예 : "10 10 50 50" 또는 "10 10")
★ return
1. 성공 = Rect Object
(※ 단, sPos = "10 10" ==> 2개인 경우
Rect.right = Rect.left, Rect.bottom = Rect.top,
Rect.width = 0, Rect.height = 0)
2. 실패 = null
★ 주의사항
Rect Object는 좌표를 처리하는 XPlatform 내부 Object로서 메뉴얼에는 존재치 않는다.
Rect Object의 멤버는 left, top, right, bottom, width, height가 있다.
(예 : rect가 Rect Object라면 rect.left, rect.top으로 사용하면 된다.)
******************************************************************************/

function PosStr2Rect(sPos)

{

var oRect = new Rect();

 

aPos = _PosStr2Arr(sPos);

if( aPos == null )

return null;

 

oRect.left = aPos[_L];

oRect.top = aPos[_T];

if( aPos.length == 2 )

{

oRect.right = aPos[_L];

oRect.bottom = aPos[_T];

oRect.width = 0;

oRect.height = 0;

}

else

{

oRect.right = aPos[_R];

oRect.bottom = aPos[_B];

oRect.width = aPos[_W];

oRect.height = aPos[_H];

}

 

return oRect;

}

 

/*******************************************************************************
★ 설명
Rect Object를 Position문자열로 바꾼다.
★ parameter
1. oRect : Rect Object(예 : Rect.left = 10, ... )
★ return
1. 성공 = Position문자열 ( 예 : "10 20 30 40" )
(※ 단, Rect.right = Rect.left, Rect.right = Rect.left,
Rect.right = 0, Rect.bottom = 0,
Rect.width = 0, Rect.height = 0 인경우는
return = "10 10")
2. 실패 = null
★ 주의사항
Rect Object는 좌표를 처리하는 XPlatform 내부 Object로서 메뉴얼에는 존재치 않는다.
Rect Object의 멤버는 left, top, right, bottom, width, height가 있다.
(예 : rect가 Rect Object라면 rect.left, rect.top으로 사용하면 된다.)
******************************************************************************/

function PosRect2Str(oRect)

{

if( gf_isNull(oRect) ) return null;

 

// 2개인 경우 처리

if( ( ( oRect.left == oRect.right ) || oRect.right == 0 || oRect.width == 0 ) &&

( ( oRect.top == oRect.bottom ) || oRect.bottom == 0 || oRect.height == 0 ) )

return oRect.left + " " + oRect.top;

else

return oRect.left + " " + oRect.top + " " + oRect.right + " " + oRect.bottom;

}

 

 

☞  

 

☞  

 
 
 
 

  

 

Posted by 농부지기
,

[ Nexacro.Component -  Object Position1 ]

 


/*******************************************************************************
 ★ 설명
    oObj에 해당하는 좌표계가 Screen좌표계인지를 체크한다.
 ★ parameter
    1. oObj : 체크할 Object(예 : mainframe, this.getOwnerFrame(), this, button,...)
  ★ return
    - oObj가 Screenr기준 좌표계인 경우 = true
    - oObj가 Screenr기준 좌표계가 아닌경우 = false
    - oObj가 null인 경우 = false    
 ******************************************************************************/

function IsObjScreenPos(oObj)

{

 var sType;

 

 if( fn_IsNull(oObj) )  return false;

 

 sType = GetObjType(oObj);

 if( fn_IsNull(sType) )  return false;

 

 

 if( sType.toLowerCase() == "mainframe" )

  return true;

 if( sType.toLowerCase() == "childframe" )

 {

  if( IsObjPopup(oObj.name) == true )

   return true;

 }

  

 return false;

}

 

/*******************************************************************************
 ★ 설명
    oObj에 해당하는 Object가 Position을 갖지 않는 Object인지 판단한다.
    즉, oObj가 invisible Object인지 판단한다.
 ★ parameter
    1. oObj : 체크할 Object(예 : application, mainframe, this.getOwnerFrame(), this, button,...)
 ★ return
    - oObj가 position property가 없는 경우 = true
    - oObj가 position property가 있는 경우 = false
    - oObj가 null인 경우 = false
******************************************************************************/

function IsObjNoPos(oObj)

{

 var sType;

 

 if( fn_IsNull(oObj) )  return false;

 

 sType = GetObjType(oObj);

 if( fn_IsNull(sType) )  return false;

 

 if( fn_IsNull(oObj.position) )

  return true;

  

 return false;

}

 

/*******************************************************************************
 ★ 설명
     system의 cursorx, cursory를 해당 Object의 영역좌표에 맞는 값으로 변경한다.
 ★ parameter
    1. oObj : Object
       (예 : mainframe, this.getOwnerFrame(), this, button,...)
 ★ return
    - 성공 = oObj좌표계에 해당하는 Cursor position 문자열 ( 예 : "20 20" )
    - 실패 = ""
 ★ 주의사항  
    단, event에서 얻어지는 cursor좌표는 아니다.
 ******************************************************************************/

function GetObjCursorPos(oObj)

{

 var sObjPos;

 var cursorx, cursory;

 var sCursorPos;

 

 if( fn_IsNull(oObj) )  return "";

 if( IsObjNoPos(oObj) )  return "";

 

 cursorx = system.cursorx;

 cursory = system.cursory;

 

 if( IsObjScreenPos(oObj) == true )

  sCursorPos = cursorx + " " + cursory;

 else

  sCursorPos = (system.screenToClientX(oObj, cursorx)+oObj.position.left) + " " + (system.screenToClientY(oObj, cursory)+oObj.position.top);  

 

 return sCursorPos;

}

 

/*******************************************************************************
 ★ 설명
    Position문자열을 Rect Object로 바꾼다.
 ★ parameter
    1. sPos : Position 문자열 (예 : "10 10 50 50" 또는 "10 10")
 ★ return
    1. 성공 = Rect Object
              (※ 단,  sPos = "10 10" ==> 2개인 경우
                  Rect.right = Rect.left, Rect.bottom = Rect.top,
                  Rect.width = 0, Rect.height = 0)
    2. 실패 = null
 ★ 주의사항
    1. Rect Object는 좌표를 처리하는 XPlatform 내부 Object로서 메뉴얼에는 존재치 않는다.
       Rect Object의 멤버는 left, top, right, bottom, width, height가 있다.
       (예 : rect가 Rect Object라면 rect.left, rect.top으로 사용하면 된다.)
    2. Rect Object내에서의 좌표 처리 방법 (
       1) right ==> width순으로 처리하면 right는 재계산된다.
          width ==> right순으로 처리하면 right는 재계산 되지 않는다.
       2) width처리를 하지 않고 right만 처리하면 width는 자동계산 된다.
          right처리를 하지 않고 width만 처리하면 right는 자동계산 된다.
       3) 위 1), 2)는 left를 먼저 지정했을 경우에 한하여 처리된다.
          또한, top, bottom에 대해서도 동일하게 처리된다.
******************************************************************************/

function Str2Rect(sPos)

{

 var oRect = new Rect();

 var i;

 var aPos, no;

 

 if( fn_IsNull(sPos) ) return null;

 

 aPos = sPos.toString().split(" ");;

 if( aPos.length == 0 )

  return null;

  

 no = 0;

 for( i = 0 ; i < aPos.length ; i++ )

 {

  if( IsNum(aPos[i]) == true )

  {

   if( no == 0 )  oRect.left = Math.round(parseFloat(aPos[i]),1);

   if( no == 1 )  oRect.top = Math.round(parseFloat(aPos[i]),1);

   if( no == 2 )  oRect.right = Math.round(parseFloat(aPos[i]),1);

   if( no == 3 )  oRect.bottom = Math.round(parseFloat(aPos[i]),1);

   if( no == 4 )  oRect.width = Math.round(parseFloat(aPos[i]),1);

   if( no == 5 )  oRect.height = Math.round(parseFloat(aPos[i]),1);

   no++;

  }

 }

 

 if( no != 2 && no != 4 && no != 6 )

  return null;

  

 if( no == 2 )

 {

  oRect.right = oRect.left;

  oRect.bottom = oRect.top;

  oRect.width = 0;

  oRect.height = 0;

 }

 

 return oRect;

}

 

/*******************************************************************************
 ★ 설명
    Rect Object를 Position문자열로 바꾼다.
 ★ parameter
    1. oRect : Rect Object(예 : Rect.left = 10, ... )
 ★ return
    1. 성공 = Position문자열 ( 예 : "10 20 30 40" )
              (※ 단,  
                  Rect.right = Rect.left, Rect.right = Rect.left,
                  Rect.width = 0, Rect.height = 0 인경우는
                  return = "10 10")
    2. 실패 = ""
 *****************************************************************************/

function Rect2Str(oRect)

{

 if( fn_IsNull(oRect) )  return "";

 

 if( IsPoint(oRect) == true )

  return oRect.left + " " + oRect.top;

 else

  return oRect.left + " " + oRect.top + " " + oRect.right + " " + oRect.bottom;

}

 

/*******************************************************************************
 ★ 설명
    Rect Object의 내용이 Point(left, top만  유효한 경우)인지 판단한다.
 ★ parameter
    1. oRect : Rect Object(예 : Rect.left = 10, ... )
 ★ return
    1. 성공 = true (Point인 경우)
    2. 실패 = false ( oRect가 null이거나 Point가 아닌 경우)
 *****************************************************************************/

function IsPoint(oRect)

{

 if( fn_IsNull(oRect) )  return false;

 

 if( (oRect.left == oRect.right && oRect.top == oRect.bottom) ||

  (oRect.width == 0 && oRect.height == 0 ) ||

  ( (oRect.left != 0 && oRect.right == 0) && (oRect.top != 0 && oRect.bottom == 0) ) )

  return true;

 else

  return false;

}

 

/*******************************************************************************
 ★ 설명
     sAreaPos의 Center위치에 맞는 sObjPos의 position을 구한다.
 ★ parameter
    1. sAreaPos : 영역에 해당하는 Position 문자열
     (예 : "10 10 50 50", this.position,...)
    2. sObjPos  : Center에 위치할 대상 Object의 Position
                  (옵션 : Default="" ==> Object의 Width=0, Height=0인 경우에 해당함)
    (예 : "", "10 10 30 30", this.position,...)
 ★ return
    - 성공 = sAreaPos의 좌표계에 해당하는 Center position 문자열
              ( 예 : sObjPos=""인 경우 ==> "30 30",
                     sObjPos="10 10 20 20"인 경우 ==> "20 20 40 40" )
    - 실패 = ""                     
 ******************************************************************************/

function GetCenterPos(sAreaPos, sObjPos)

{

 var vAreaPos;

 var vObjPos  = new Rect();

 var vCenterPos = new Rect();

 

 if( fn_IsNull(sAreaPos) ) return "";

 vAreaPos = Str2Rect(sAreaPos);

 

 if( fn_IsNull(vAreaPos) )  return "";

 

 if( fn_IsNull(sObjPos) )

 {

  vObjPos.left = vObjPos.right = 0;

  vObjPos.top = vObjPos.bottom = 0;

  vObjPos.width = 0;

  vObjPos.height = 0;

 }

 else

 {

  vObjPos = Str2Rect(sObjPos);

  if( fn_IsNull(vObjPos) )  return "";

 }

 

 if( IsPoint(vObjPos) == true )

 {

  vCenterPos.left = vAreaPos.left + Math.round(vAreaPos.width/2,1);

  vCenterPos.top = vAreaPos.top + Math.round(vAreaPos.height/2,1);

 }

 else

 {

  vCenterPos.left = vAreaPos.left + Math.round(vAreaPos.width/2,1) - Math.round(vObjPos.width/2,1);

  vCenterPos.top = vAreaPos.top + Math.round(vAreaPos.height/2,1) - Math.round(vObjPos.height/2,1);

  vCenterPos.right = vCenterPos.left + vObjPos.width;

  vCenterPos.bottom = vCenterPos.top + vObjPos.height;

 }

 

 return Rect2Str(vCenterPos);

}

 

/*******************************************************************************
 ★ 설명
     nLeft, nTop좌표로
     sPosition의 Width에 대해 n Offset Width만큼,
     sPosition의 Height에 대해 n Offset Height만큼
     이동한 좌표 Position문자열을 획득한다.
 ★ parameter
    1. sPosition     : position 문자열 (예 : "absolute 10 10 20 20" = object.position )
                       단, "absolute"는 생략 가능하다.
    2. nLeft         : 이동할 Left 값 ( 예 : 10 또는 -10 )
    3. nTop          : 이동할 Top 값 ( 예 : 10 또는 -10 )
    4. nOffsetWidth  : 이동할 Offset Width값 ( 예 : 10 또는 -10 )
      (옵션 : Default = 0, 즉 이동하지 않는다)
    5. nOffsetHeight : 이동할 Offset Height값 ( 예 : 10 또는 -10 )
      (옵션 : Default = 0, 즉 이동하지 않는다)
 ★ return
    - 성공 = 이동될 Position문자열 ( 예 : "absolute 20 20 30 30" 또는 "absolute 0 0 10 10" )
              단, sPosition이 2개만 지정된 경우 offsetWidth, nOffsetHeight에 어떤값을 지정하면
              이 경우는 Widht=0, Height=0와 동일하므로 4개로 바꾸어 Return한다.
              ( 예 : GetMovePos("10 10", 20, 20) = "20 20 20 20" )
    - 실패 = ""
 ★ 목적
    XPlatform은 Width, Height가 아닌 Right, Bottom을 적용하기 때문에 헷갈리는 면이 있다.
    또한, object를 이동시키는 함수는 있지만 이동될 좌표만 구하는 함수가 없기 때문에
    이 함수를 만들었다.
 ******************************************************************************/

function GetMovePos(sPosition, nLeft, nTop, nOffsetWidth, nOffsetHeight)

{

 var sType;

 var vPosition;

 var vRetPosition = new Rect();

 

 if( fn_IsNull(sPosition) || fn_IsNull(nLeft) || fn_IsNull(nTop) ) return "";

 if( fn_IsNull(nOffsetWidth) )   

  nOffsetWidth = 0;

 

 if( fn_IsNull(nOffsetHeight) )   

  nOffsetHeight = 0;

 

 vPosition = Str2Rect(sPosition);

 if( fn_IsNull(vPosition) )  return "";

 

 vRetPosition.left = nLeft;

 vRetPosition.top = nTop;

 if( IsPoint(vPosition) == true )

 {

  if( nOffsetWidth == 0 && nOffsetHeight == 0 )

   return Rect2Str(vRetPosition);

  else

  {

   vPosition.width = 0;

   vPosition.height = 0;

  }

 }

 

 vRetPosition.right = vRetPosition.left + (vPosition.width + nOffsetWidth);

 vRetPosition.bottom = vRetPosition.top + (vPosition.height + nOffsetHeight);

 

 return Rect2Str(vRetPosition);

}

 

/*******************************************************************************
 ★ 설명
     sPosition대비
     Left좌표에 대해 nOffsetLeft만큼, Top좌표에 대해 nOffsetTop만큼,
     Width에 대해 n Offset Width만큼, Height에 대해 n Offset Height만큼
     이동한 좌표 Position문자열을 획득한다.
 ★ parameter
    1. sPosition     : position 문자열 (예 : "absolute 10 10 20 20" = object.position )
                       단, "absolute"는 생략 가능하다.
    2. nOffsetLeft   : sPosition대비 이동할 Left Offset값 ( 예 : 10 또는 -10 )
    3. nOffsetTop    : sPosition대비 이동할 Left Offset값 ( 예 : 10 또는 -10 )
    4. nOffsetWidth  : sPosition대비 이동할 Width Offset 값 ( 예 : 10 또는 -10 )
      (옵션 : Default = 0, 즉 이동하지 않는다)
    5. nOffsetHeight : sPosition대비 이동할 Height Offset 값 ( 예 : 10 또는 -10 )
      (옵션 : Default = 0, 즉 이동하지 않는다)
 ★ return
    - 성공 = 이동될 Position문자열 ( 예 : "absolute 20 20 30 30" 또는 "absolute 0 0 10 10" )
              단, sPosition이 2개만 지정된 경우 offsetWidth, nOffsetHeight에 어떤값을 지정하면
              이 경우는 Widht=0, Height=0와 동일하므로 4개로 바꾸어 Return한다.
              ( 예 : GetMovePos("10 10", 20, 20) = "20 20 20 20" )
    - 실패 = ""
 ******************************************************************************/

function GetMoveToPos(sPosition, nOffsetLeft, nOffsetTop, nOffsetWidth, nOffsetHeight)

{

 var nLeft, nTop;

 var vPosition;

 

 if( fn_IsNull(sPosition) || fn_IsNull(nOffsetLeft) || fn_IsNull(nOffsetTop) ) return "";

 if( fn_IsNull(nOffsetWidth) )

  nOffsetWidth = 0;

 

 if( fn_IsNull(nOffsetHeight) )

  nOffsetHeight = 0;

 

 vPosition = Str2Rect(sPosition);

 

 if( fn_IsNull(vPosition) )  return "";

 

 nLeft = vPosition.left + nOffsetLeft;

 nTop = vPosition.top + nOffsetTop;

 

 return GetMovePos(sPosition, nLeft, nTop, nOffsetWidth, nOffsetHeight);

 

}

 

/*******************************************************************************
 ★ 설명
    oObj에 해당하는 Object의 border width를 구하는 함수이다.
 ★ parameter
    1. oObj : Object
       (예 : mainframe, this.getOwnerFrame(), this, button,...)
 ★ return
    - 성공 = oObj의 Border Width
    - 실패 = -1    
 ★ 목적    
    현재 XPlatform(2009.12.10.1)에서 border가 지정되지 않고 style로 적용되어 있으면
    border를 구하지 못하므로 만들었다.
 ******************************************************************************/

function GetObjBorderWidth(oObj)

{

 if( fn_IsNull(oObj) ) return -1;

 if( IsObjNoPos(oObj) )  return -1;

 if( fn_IsNull(oObj.style.border.width) || fn_IsNull(oObj.style.border.width) )

 {

  var sType;

  

  sType = GetObjType(oObj);

  if( IsObjScreenPos(oObj) == true )

   return 0-system.screenToClientX(oObj, oObj.position.left);

  else

  {

   if( GetObjType(oObj.parent).toLowerCase() == "form" )

    return 0;

   else

    return system.clientToScreenX(oObj, 0) - system.clientToScreenX(oObj, oObj.position.left);

  }

 }

 else

  return oObj.style.border.width;

}

 

/*******************************************************************************
 ★ 설명
     oFromObj 좌표계의 sFromObjPos에 해당하는 Position을
     oToObj 좌표계에 해당하는 Position으로 바꾼다.
 ★ parameter
    1. sFromPos : 변경하고자 하는 oFromAreaObj좌표계 내에서의 Position
            (예 : "10 10" 또는 "10 10 20 20", Button.position, ...)
    2. oFromAreaObj : 변경할 좌표계 Object,
                  단, Screen의 경우는 "screen"을 넣으면 된다.
    (예 : "screen", mainframe, this,...)
    3. oToAreaObj  : 변경할 좌표계 Object
                 단, Screen의 경우는 "screen"을 넣으면 된다.
    (예 : "screen", mainframe, this,...)
 ★ return
    - 성공 = oToObj 좌표계로 변경된  position 문자열
    - 실패 = ""
 ★ 목적
     ScreenToClient, ClientToScreen 밖에 없고 A Object에서 B Object좌표계로
     한번에 변경하는 함수가 없어서 만들었음
 ★ BUG
     oFromAreaObj = form, oToAreaObj = "screen"인 경우 잘 안됨(???(모름))
 ******************************************************************************/

function GetObjConvPos(sFromPos, oFromAreaObj, oToAreaObj)

{

 var vFromPos;

 var vRetPos = new Rect();

 

 if( fn_IsNull(sFromPos) || fn_IsNull(oFromAreaObj) || fn_IsNull(oToAreaObj) )  return "";

 if( IsObjNoPos(oFromAreaObj) )  return "";

 if( IsObjNoPos(oToAreaObj) )  return "";  

 

 if( oFromAreaObj == oToAreaObj )

  return sFromPos;

 

 vFromPos = Str2Rect(sFromPos);

 

 if( fn_IsNull(vFromPos) )  return "";

 if( oFromAreaObj.toString().toLowerCase() == "screen" )

 {

  vRetPos.left = system.screenToClientX( oToAreaObj, vFromPos.left );

  vRetPos.top = system.screenToClientY( oToAreaObj, vFromPos.top );

 }

 else if( oToAreaObj.toString().toLowerCase() == "screen" )

 {

  vRetPos.left = system.clientToScreenX( oFromAreaObj, vFromPos.left );

  vRetPos.top = system.clientToScreenY( oFromAreaObj, vFromPos.top );

 }

 else

 {

  vRetPos.left = system.clientToScreenX( oFromAreaObj, vFromPos.left );

  vRetPos.top = system.clientToScreenY( oFromAreaObj, vFromPos.top );

  vRetPos.left = system.screenToClientX( oToAreaObj, vRetPos.left );

  vRetPos.top = system.screenToClientY( oToAreaObj, vRetPos.top );

 }

 if( IsPoint(vFromPos) == false )

 {

  vRetPos.right = vRetPos.left + vFromPos.width;

  vRetPos.bottom = vRetPos.top + vFromPos.height;

 }

 return Rect2Str(vRetPos);

}

 

/*******************************************************************************
 ★ 설명
    sAreaPos좌표계 내에서 주어진 Align 조건에 따라
    sObjPos의 좌표를 재 계산한다.
 ★ parameter
    1. sAreaPos   : Object가 움직일 좌표영역에 해당하는 Position 문자열 ( 예 : "10 10 100 100" )
    2. sObjPos    : Align될 Object의 현재 Position문자열 ( 예 : "50 50 60 60" )
    3. sAxisPos   : 기준이 되는 X,Y축 Position문자열
     ( 옵션 : Default=""==>sAreaPos의 center ) ( 예 : "60 60" )
    4. sOffsetPos : sAxisPos로부터의 Offset Position문자열
                    ( 옵션 : Default="0 0" ) ( 예 : "10 10" 또는 "-10 -10" )
    5. nAlign     : sAxisPos를 기준으로 한 정렬형태 ( 옵션 : Default=0 )
                    0 = 중앙정렬, 1 = 1사분면, 2 = 2사분면, 3 = 3사분면, 4 = 4사분면
    6. bAuto      : nAlign을 기준으로 sObjPos의 Width, Height가 들어갈 수 있는
                    사분면을 자동으로 찾아 정렬한다.( 옵션 : Default=true )
                    true = 자동정렬, false = 자동정렬 하지 않음
    7. bBigResize : Object의 width, height가 해당 4분면의 영역보다 크면 4분면에 맞추어
                    Object의 width, height를 줄여서 조정한다.
                    즉, obj > Area이면 obj를 Area의 사분면에 맞춰 줄인다. ( 옵션 : Default = false )
                    true = Size 조정, false = Size 조정하지 않음
    8. bSmallResize : Object의 width, height가 해당 4분면의 영역보다 작으면 4분면에 맞추어
                    Object의 width, height를 늘려서 조정한다.
                    즉, obj < Area이면 obj를 Area의 사분면에 맞춰 늘인다. ( 옵션 : Default = false )
                    true = Size 조정, false = Size 조정하지 않음
 ★ return
    - 성공 = 주어진 조건에 맞는 정렬된 Object의 Position문자열
    - 실패 = ""
 ★ 주의사항
    1. bAuto와 (bBigResize, bSmallResize)는 동시에 true일 수 없다.
       bAuto가 true이면 bBigResize, bSmallResize는 false로 처리된다.
    2. (sAxisPos+sOffsetPos)가 sAreaPos의 범위를 벗어나면 null이 return된다.
       단, sObjPos의 최종 Align된 Position은 sAreaPos의 범위를 벗어날 수도 있다.
    2. 모든 Position은 sAreaPos의 좌표계에 맞도록 전달되어야 한다.
       따라서, 머리가 아프다면 모든 좌표를 screen좌표로 처리한다면
       좀 더 쉬워지겠지...
 ******************************************************************************/

function GetAlignPos( sAreaPos, sObjPos, sAxisPos, sOffsetPos, nAlign, bAuto, bBigResize, bSmallResize )

{

 var vAreaPos;

 var vAxisPos = new Rect();

 var vObjPos;

 var vOffsetPos;

 var vAlignPos = new Rect();

 

 if( fn_IsNull(sAreaPos) || fn_IsNull(sObjPos) ) return "";

 

 if( fn_IsNull(sAxisPos) )

  sAxisPos = "";

 

 if( fn_IsNull(sOffsetPos) )

  sOffsetPos = "0 0";

 

 if( fn_IsNull(nAlign) )

  nAlign = 0;

 

 if( fn_IsNull(bAuto) )

  bAuto = false;

 

 if( fn_IsNull(bBigResize) )

  bBigResize = false;

 

 if( fn_IsNull(bSmallResize) )

  bSmallResize = false;

 

 vAreaPos = Str2Rect(sAreaPos);

 if( fn_IsNull(vAreaPos) ) return "";

 vObjPos = Str2Rect(sObjPos);

 if( fn_IsNull(vObjPos) ) return "";

 if( sAxisPos != "" )

 {

  vAxisPos = Str2Rect(sAxisPos);

  if( fn_IsNull(vAxisPos) ) return null;

 }

 else

 {

  vAxisPos.left = vAreaPos.left + Math.round(vAreaPos.width/2,1);

  vAxisPos.top = vAreaPos.top + Math.round(vAreaPos.height/2,1);

 }

 

 vOffsetPos = Str2Rect(sOffsetPos);

 if( fn_IsNull(vOffsetPos) ) return "";

 

 if( bAuto == true )

 {

  bBigResize = false;

  bSmallResize = false;

 }

 

 // Axis를 Offset만큼 보정

 vAxisPos.left += vOffsetPos.left;

 vAxisPos.top += vOffsetPos.top;

 

 // Axis가 Area의 범위를 벗어나면 return null

 if( vAxisPos.left < vAreaPos.left )

  return "";

 if( vAxisPos.left > vAreaPos.right )

  return "";

 if( vAxisPos.top < vAreaPos.top )

  return "";

 if( vAxisPos.top > vAreaPos.bottom )

  return "";

 

 // Center에 위치

 if( nAlign == 0 )

 {

  vAlignPos.left = vAxisPos.left - Math.round(vObjPos.width/2,1);

  vAlignPos.top = vAxisPos.top - Math.round(vObjPos.height/2,1);

 }

 // 1사분면에 위치

 else if( nAlign == 1 )

 {

  vAlignPos.left = vAxisPos.left;

  vAlignPos.top = vAxisPos.top - vObjPos.height;

 }

 // 2사분면에 위치

 else if( nAlign == 2 )

 {

  vAlignPos.left = vAxisPos.left - vObjPos.width;

  vAlignPos.top = vAxisPos.top - vObjPos.height;

 }

 // 3사분면에 위치

 else if( nAlign == 3 )

 {

  vAlignPos.left = vAxisPos.left - vObjPos.width;

  vAlignPos.top = vAxisPos.top;

 }

 // 4사분면에 위치

 else if( nAlign == 4 )

 {

  vAlignPos.left = vAxisPos.left;

  vAlignPos.top = vAxisPos.top;

 }

 

 vAlignPos.right = vAlignPos.left + vObjPos.width;

 vAlignPos.bottom = vAlignPos.top + vObjPos.height;

 

 // Auto처리

 if( bAuto == true )

 {

  var i;

  var aAlignPosAuto, sAlignPosAuto, nCurAlign;

  if( nAlign != 0 )

  {

   for( i = 0 ; i <= 4 ; i++ )

   {

    nCurAlign = (nAlign+i)%5;

    if( nCurAlign == 0 )

     continue;

    sAlignPosAuto = GetAlignPos( sAreaPos, sObjPos, sAxisPos, sOffsetPos,

            nCurAlign, false, false, false );

    vAlignPosAuto = Str2Rect(sAlignPosAuto);

    if( (vAlignPosAuto.left >= vAreaPos.left) &&

     (vAlignPosAuto.right <= vAreaPos.right) &&

     (vAlignPosAuto.top >= vAreaPos.top) &&

     (vAlignPosAuto.bottom <= vAreaPos.bottom) )

    {

     vAlignPos = vAlignPosAuto;

     break;

    }

   }

  }

 }

 

 // Resize처리

 if( bBigResize == true || bSmallResize == true )

 {

  if( nAlign == 1 )

  {

   if( bBigResize == true )

   {

    if( vAlignPos.right > vAreaPos.right )  vAlignPos.right = vAreaPos.right;

    if( vAlignPos.top < vAreaPos.top )  vAlignPos.top = vAreaPos.top;      

   }

   if( bSmallResize == true )

   {

    if( vAlignPos.right < vAreaPos.right )  vAlignPos.right = vAreaPos.right;

    if( vAlignPos.top > vAreaPos.top )  vAlignPos.top = vAreaPos.top;      

   }

  }

  if( nAlign == 2 )

  {

   if( bBigResize == true )

   {

    if( vAlignPos.left < vAreaPos.left )  vAlignPos.left = vAreaPos.left;

    if( vAlignPos.top < vAreaPos.top )  vAlignPos.top = vAreaPos.top;      

   }

   if( bSmallResize == true )

   {

    if( vAlignPos.left > vAreaPos.left )  vAlignPos.left = vAreaPos.left;

    if( vAlignPos.top > vAreaPos.top )  vAlignPos.top = vAreaPos.top;      

   }

  }

  if( nAlign == 3 )

  {

   if( bBigResize == true )

   {

    if( vAlignPos.left < vAreaPos.left )  vAlignPos.left = vAreaPos.left;

    if( vAlignPos.bottom > vAreaPos.bottom )  vAlignPos.bottom = vAreaPos.bottom;      

   }

   if( bSmallResize == true )

   {

    if( vAlignPos.left > vAreaPos.left )  vAlignPos.left = vAreaPos.left;

    if( vAlignPos.bottom < vAreaPos.bottom )  vAlignPos.bottom = vAreaPos.bottom;      

   }

  }

  if( nAlign == 4 )

  {

   if( bBigResize == true )

   {

    if( vAlignPos.right > vAreaPos.right )  vAlignPos.right = vAreaPos.right;

    if( vAlignPos.bottom > vAreaPos.bottom )  vAlignPos.bottom = vAreaPos.bottom;      

   }

   if( bSmallResize == true )

   {

    if( vAlignPos.right < vAreaPos.right )  vAlignPos.right = vAreaPos.right;

    if( vAlignPos.bottom < vAreaPos.bottom )  vAlignPos.bottom = vAreaPos.bottom;      

   }

  }

  // Axis를 중심으로 작은 쪽에 맞추어 Resizing한다.

  if( nAlign == 0 )

  {

   var nSmallWidth, nSmallHeight;

   nSmallWidth = Math.min(vAxisPos.left - vAreaPos.left, vAreaPos.right - vAxisPos.left);

   nSmallHeight = Math.min(vAxisPos.top - vAreaPos.top, vAreaPos.bottom - vAxisPos.top);

 

   var bWFlag=false, bHFlag=false;  

   if( bSmallResize == true )

   {

    if( Math.round(vObjPos.width/2,1) < nSmallWidth )

     bWFlag = true;

    if( Math.round(vObjPos.height/2,1) < nSmallHeight )

     bHFlag = true;

   }

   if( bBigResize == true )

   {

    if( Math.round(vObjPos.width/2,1) > nSmallWidth )

     bWFlag = true;

    if( Math.round(vObjPos.height/2,1) > nSmallHeight )

     bHFlag = true;

   }

   if( bWFlag == true )

   {

    vAlignPos.left = vAxisPos.left - nSmallWidth;

    vAlignPos.right = vAxisPos.left + nSmallWidth;

   }

   if( bHFlag == true )

   {

    vAlignPos.top = vAxisPos.top - nSmallHeight;

    vAlignPos.bottom = vAxisPos.top + nSmallHeight;

   }

  }

 }

 

 vAlignPos.width = vAlignPos.right - vAlignPos.left;

 vAlignPos.height = vAlignPos.bottom - vAlignPos.top;

 

 return Rect2Str(vAlignPos);

}


/*******************************************************************************
 ★ 설명
    nX, nY좌표를 nCx, nCy를 중심으로 nAngle만큼 회전한 좌표를 구한다.
 ★ parameter
    1. nX : 회전할 X좌표
    2. nY : 회전할 Y좌표
    3. nCx : 회전 중심 X좌표
    4. nCy : 회전 중심 Y좌표
    5. nAngle : 회전 각(※ radian, 숫자값이 아니다.)(예:Math.PI, Math.PI/2,...)
 ★ return
    1. 성공 = Rect Object( 단, Rect.left = 회전된 X좌표, Rect.top = 화전된 Y좌표 )
    2. 실패 = null
******************************************************************************/

function RotatePoint(nX, nY, nCx, nCy, nAngle)

{

 var vPoint = new Rect();

 

 if( fn_IsNull(nX) || fn_IsNull(nY) || fn_IsNull(nCx) || fn_IsNull(nCy) || fn_IsNull(nAngle) )

  return null;

 

 nY = -1*nY;

 nCy = -1*nCy;

 vPoint.left = nCx + Math.round(Math.cos(nAngle)*(nX-nCx) - Math.sin(nAngle)*(nY-nCy),1);

 vPoint.top = nCy + Math.round(Math.sin(nAngle)*(nX-nCx) + Math.cos(nAngle)*(nY-nCy),1);

 vPoint.top = -1*vPoint.top;

 

 return vPoint;

}

 

/*******************************************************************************
 ★ 설명
    A직선(Start ~ End)과 B직선(Start ~ End)의 교차점을 구한다.
 ★ parameter
    1. nA_StartX : A직선의 Start X값
    2. nA_StartY : A직선의 Start Y값
    3. nA_EndX   : A직선의 End X값
    4. nA_EndY   : A직선의 End Y값
    5. nB_StartX : B직선의 Start X값
    6. nB_StartY : B직선의 Start Y값
    7. nB_EndX   : B직선의 End X값
    8. nB_EndY   : B직선의 End Y값
 ★ return
    1. 성공 = Rect Object( 단, Rect.left = 교차점 X좌표, Rect.top = 교차점 Y좌표 )
    2. 실패 = null
 *****************************************************************************/

function CrossPoint(nA_StartX, nA_StartY, nA_EndX, nA_EndY, nB_StartX, nB_StartY, nB_EndX, nB_EndY)

{

 var vPoint = new Rect();

 var nA_Angle, nB_Angle;

 

 if( fn_IsNull(nA_StartX) || fn_IsNull(nA_StartY) || fn_IsNull(nA_EndX) || fn_IsNull(nA_EndY) ||

  fn_IsNull(nB_StartX) || fn_IsNull(nB_StartY) || fn_IsNull(nB_EndX) || fn_IsNull(nB_EndY) )

  return null;

 

 nA_StartY = -1*nA_StartY;

 nB_StartY = -1*nB_StartY;

 nA_EndY = -1*nA_EndY;

 nB_EndY = -1*nB_EndY;  

 nA_Angle = Math.tan(Math.atan2((nA_EndY - nA_StartY), (nA_EndX - nA_StartX)));

 nB_Angle = Math.tan(Math.atan2((nB_EndY - nB_StartY), (nB_EndX - nB_StartX)));

 

 // 평행한 경우

 if( Math.abs(Deg2Rad(nA_Angle - nB_Angle))%180  == 0 )

  return null;

  

 vPoint.left = (nA_StartY - nB_StartY - nA_Angle*nA_StartX + nB_Angle*nB_StartX)/(nB_Angle - nA_Angle);

 vPoint.top = nA_StartY - nA_Angle*(nA_StartX - vPoint.left);

 

 vPoint.left = Math.round(vPoint.left,1);

 vPoint.top = -1*Math.round(vPoint.top,1);

 

 return vPoint;

}

 

/*******************************************************************************
 ★ 설명
    화면좌표에서 nBase(X,Y)를 지나는 가로선 대비 n(X,Y)좌표를 Radian각으로 구한다.
 ★ parameter
    1. nBaseX, nBaseY : 기준 X, Y좌표
    2. nX, nY : X, Y좌표
 ★ return
    1. 성공 = Radian(예: Math.PI, ...)
    2. 실패 = NaN
******************************************************************************/

function fn_GetAngle(nBaseX, nBaseY, nX, nY)

{

 return Math.atan2((nBaseY-nY),(nX-nBaseX));

}

☞  

 

☞  

 
위쪽 공통 함수 (즉, 위에서 호출)


/*******************************************************************************
 ★ 설명
     sObjName이 Popup창(showModaless()에 의해 뜬창)인지 확인한다.
     단, showModal()에 의해 뜬 창은 해당되지 않는다.
 ★ parameter
    1. sObjName : Popup창 여부를 확인할 Object Name
 ★ return
    - sObjName이 Popup창인 경우 = true
    - sObjName이 Popup창이 아닌 경우 = false
 ★ 주의사항
    단, showModal()에 의해 뜬 창은 해당되지 않는다.
 ******************************************************************************/

function IsObjPopup(sPopupName)

{

 if( fn_IsNull(sPopupName) ) return false;

 

 if( fn_IsNull(application.popupframes(sPopupName)) )

  return false;

 else

  return true;

}

 

 

  

Posted by 농부지기
,

[ Nexacro.Component -  Object 생성.삭제 ]

 


/*******************************************************************************
 ★ 설명
     Object를 생성한다. 만일 Object가 이미 존재하면 존재하는 Object를 return한다.
     (예 : sObjType="Button", sObjName="Button00"이면
           Button00 Object를 생성하여 oParent에 포함시킨 후 Return한다.)
 ★ parameter
    1. sObjName : 생성할 Object Name ( 예 : "Button00" )
    2. sObjType : 생성할 Object Type ( 예 : "Button", "Static", ... )
    3. oParent  : 포함시킬 부모 Object(옵션 : Default=this) (예 : this, childframe, ... )
    4. bShow    : 화면에 보여질지 여부 (옵션 : Default=true)
 ★ return
    - 성공 = 생성된 Object 또는 이미 존재하면 해당 Object
    - 실패 = null
 ★ 주의사항
    - Component생성만 할것, 다른 Object는 Test안해봐서 신뢰할 수 없음
 ******************************************************************************/

function NewObj(sObjName, sObjType, oParent, bShow)

{

 var sFstr, oRet, aObjExist;

 

 if( fn_IsNull(sObjName) ) return null;

 if( fn_IsNull(sObjType) )  return null;

 

 if( fn_IsNull(oParent) ) oParent = this;

 if( fn_IsNull(bShow) )  bShow = true;

 

 aObjExist = oParent.all(sObjName);

 if( aObjExist != null )

  return aObjExist;

 

 sFstr = "new " + sObjType + "(\"" + sObjName + "\")";

 oRet = eval(sFstr);

 if( fn_IsNull(oRet) )

  return null;

  

 if( oParent.addChild(sObjName, oRet) == -1 )

  return null;

 

 

 if( bShow == true )

  oRet.show();

 

 return oRet;

}

 

/*******************************************************************************
 ★ 설명
     Object를 생성한다. 만일 Object가 이미 존재하면 존재하는 Object를 return한다.
     (예 : sObjType="Button", sObjName="Button00"이면
           Button00 Object를 생성하여 oParent에 포함시킨 후 Return한다.)
 ★ parameter
    1. sObjName : 생성할 Object Name ( 예 : "Button00" )
    2. sObjType : 생성할 Object Type ( 예 : "Button", "Static", ... )
    3. oParent  : 포함시킬 부모 Object(옵션 : Default=this) (예 : this, childframe, ... )
    4. bShow    : 화면에 보여질지 여부 (옵션 : Default=true)
 ★ return
    - 성공 = 생성된 Object 또는 이미 존재하면 해당 Object
    - 실패 = null
 ★ 주의사항
    - Component파괴만 할것, 다른 Object는 Test안해봐서 신뢰할 수 없음
 ******************************************************************************/

function DelObj(sObjName, oParent)

{

 var oObj;

 

 if( fn_IsNull(sObjName) ) return false;

 

 if( fn_IsNull(oParent) )

  oParent = this;

 

 oObj = oParent.all(sObjName);

 if( oObj == null ) return true;

 

 oParent.removeChild(sObjName);  

 

 oObj.destroy();

 oObj = null;

 

 return true;

}

 

☞  

 

☞  

 
 
 
 

  

 

Posted by 농부지기
,

[ Nexacro.Component -  Object Properties ]

 


/*******************************************************************************
 ★ 설명
     Object의 Property를  설정한다.
 ★ parameter
    1. sObjName = Object Name ( 예 : Button00, ... )
    2. sPropName = Property Name ( 예 : enable, style.border, ... )
    3. sPropVal - Property Value ( 예 : true, "1 solid blue", ... )
 ★ return
    - 성공 = 수행된 Property Setting 문자열 ( TEST를 위해 Return함 )
    - 실패 = ""
 ******************************************************************************/

function SetProp(sObjName, sPropName, sPropVal)

{

 if( fn_IsNull(sObjName) || fn_IsNull(sPropName) || fn_IsNull(sPropVal) )  return "";

 

 var sPropExpr = sObjName+"."+sPropName+" = " + sPropVal;

 eval(sPropExpr);

 

 return sPropExpr;

}

 

/*******************************************************************************
 ★ 설명
     Object의 Property를  가져온다.
 ★ parameter
    1. sObjName = Object Name ( 예 : Button00, ... )
    2. sPropName = Property Name ( 예 : enable, style.border, ... )
 ★ return
    - 성공 = Property 값
    - 실패 = eval()과 동일
 ******************************************************************************/

function GetProp(sObjName, sPropName, sPropVal)

{

 var sPropExpr = sObjName+"."+sPropName;

 return eval(sPropExpr);

}

 

 

 

 

 

/*******************************************************************************
 ★ 설명
     Object의 Property를  가져온다.
 ★ parameter
    1. sObjName = Object Name ( 예 : Button00, ... )
    2. sPropName = Property Name ( 예 : enable, style.border, ... )
 ★ return
    - 성공 = Property 값
    - 실패 = eval()과 동일
 ******************************************************************************/

function GetPropList(oObj)

{

 if( fn_IsNull(oObj) ) return null;

 

 for( var x in oObj )

 {

  trace( x + ":" + oObj[x] );

 }

}


/*******************************************************************************
 ★ 설명
     Object의 type을 문자열로 얻어온다.
 ★ parameter
    1. oObj : type을 얻어올 Object
    (예 : mainframe, this.getOwnerFrame(), this, button,...)
 ★ return
    - 성공 = Object의 type문자열(예 : "MainFrame", "ChildFrame", "Form", "Button",...)
    - 실패 = ""
 ******************************************************************************/

function GetObjType(oObj)

{

 var sType;

 

 if( fn_IsNull(oObj) )  return "";

 

 sType = oObj.toString().valueOf().substr(1,6);

 if( sType.toLowerCase() == "object" )

 

    return Mid(oObj.toString().valueOf(), " ", "]");

 

 return "";

}

☞  

 

☞  

 
 
 
 

  

Posted by 농부지기
,

[ Nexacro.Component -  combo ]

 

 

/**********************************************************************************
 * 함수명      : gfn_getCboValue
 * 설명        : 콤보에 존재하는 values값들을 return
 * argument     :
 * return Type : String
**********************************************************************************/

function gfn_getCboValue(obj) {

    if(!obj instanceof Combo) return;

    var ds = obj.innerdataset;

    if ( gfn_GetCompType(ds) != "Dataset"){

        ds = eval(ds);

    }

    if (obj.index < 0) obj.index = 0;

    var cd   = obj.codecolumn;

    var nm   = obj.datacolumn;

    var rtnCd = "";

 

    if (ds.getColumn(obj.index, nm) == "선택" || ds.getColumn(obj.index, nm) == "전체") {

        for (var i=1; i<ds.rowcount; i++) {

            if (i==1) {

                rtnCd += "'" + ds.getColumn(i, "CD") + "'";

            } else {

                rtnCd += ",'" + ds.getColumn(i, "CD") + "'";

            }

        }

    } else {

        rtnCd = "'" + ds.getColumn(obj.index, cd) + "'";

    }

    return rtnCd;

}

 

☞  

 

☞  

 
 
 
 

  

Posted by 농부지기
,

[ Nexacro.Component -  checkBox ]

 

 

/**
* 선택된 라디오버튼이 있는지 체크
*/

function hasCheckedRadio(input) {

    if (input.length > 1) {

        for (var inx = 0; inx < input.length; inx++) {

            if (input[inx].checked) return true;

        }

    } else {

        if (input.checked) return true;

    }

    return false;

}

 

/**
* 선택된 체크박스가 있는지 체크
*/

function hasCheckedBox(input) {

    return hasCheckedRadio(input);

}

 

☞  

 

☞  

 
 
 
 

  

 

Posted by 농부지기
,