
// Open Popup Layer
/*
    basisEl : 기준 엘리먼트
    layerEl : 팝업 레이어 
    leftType : 
    0 : layerEL.left = basisEl.left 
    1 : layerEL.left = basisEl.left / 2
    2 : layerEl.right = basisEl.right
    3 : layerEL.left = basisEl.right
    
    0 : layerEl.top = basisEl.top
    1 : layerEl.top = basisEl.middle
    2 : layerEl.top = basisEl.bottom
*/
function openLayer(pBasisEl, pLayerEl, leftType, topType) {
    
    var basisEl = $(pBasisEl);
    var layerEl = $(pLayerEl);

    var pos = Element.cumulativeOffset(basisEl);
    var top = pos[1];
    var left = pos[0];
    var basisWidth = basisEl.getWidth();
    var basisHeight = basisEl.getHeight();
    var popupWidth = layerEl.getWidth();

    switch (leftType) {
    case 1 :
        left = left + (basisWidth/2);
    break;
    case 2 :
        left = left + basisWidth - popupWidth;
    break;
    case 3 :
        left = left + basisWidth;
    break;
    }
    
    switch (topType) {
    case 1 :
        top = top + (basisHeight/2);
    break;
    case 2 :
        top = top + basisHeight;
    break;
    }
    
    layerEl.style.left = left + "px";
    layerEl.style.top = top + "px";
    layerEl.show();
}

function openLayer_2(pLayerEl, leftType, topType, p_top, p_left) {
    
    var layerEl = $(pLayerEl);
    
    var top = Number(p_top);
    var left = Number(p_left);
    var basisWidth = 10;
    var basisHeight = 10;
    var popupWidth = layerEl.getWidth();
    switch (leftType) {
    case 1 :
        left = left + (basisWidth/2);
    break;
    case 2 :
        left = left + basisWidth - popupWidth;
    break;
    case 3 :
        left = left + basisWidth;
    break;
    }
    
    switch (topType) {
    case 1 :
        top = top + (basisHeight/2);
    break;
    case 2 :
        top = top + basisHeight;
    break;
    }
    
    layerEl.style.left = left + "px";
    layerEl.style.top = top + "px";
    layerEl.show();
}




// Close Popup Layer
function closeLayer(pLayerEl) {
    $(pLayerEl).hide();
}

// Open Modal Layer
function openModalLayer(viewLayer) {
    var div = $("MODAL_DIV_LAYER") || new Element('div', {id:'MODAL_DIV_LAYER'});
    div.style.cssText = "position:absolute;background-color:red;top:0px;left:0px;z-index:2000";
    
    var width, height;
    
    if (Prototype.Browser.IE) {
        width = document.body.scrollWidth;
        height = document.body.scrollHeight;
    } else {
        width = document.documentElement.offsetWidth;
        height = document.documentElement.offsetHeight;
    }
    div.style.width = width + "px";
    div.style.height = height + "px";

    document.body.appendChild(div);
    
    if (viewLayer != null) {
        viewLayer.show();
        div.appendChild(viewLayer);
    }
        
    window.onresize = function() {openModalLayer(viewLayer);};
}

// Close Modal Layer
function closeModalLayer() {
    var div = $("MODAL_DIV_LAYER");
    window.onresize = null;
    if (div) {
        div.hide();
    }
}

// Add Select Options 
function addOption(pSelect, pKey, pValue) {
    
    var select = $(pSelect);

    if (select && select.tagName == "SELECT") {
        var option = new Element("option", {value:pKey}).update(pValue);//document.createElement("option");
        select.appendChild(option);
    }
}

// Javascript Array To Select's Option
/*
    pSelect : SELECT object or object's id
    pArray : array
    pKeyProperty : array 안에 있는 객체의 프러퍼티. Select의 Option 으로 변환될 때 키 값
    pValueProperty : array 안에 있는 객체의 프로퍼티. Select 의 Option 으로 변환될 때 사용자가 볼 수 있는 값
*/
function arrayToSelect(pSelect, pArray, pKeyProperty, pValueProperty, pOptionAdditional) {

    var select = $(pSelect);

    if (select && select.tagName == "SELECT") {
	    if (!pOptionAdditional) {
	        select.length = 0;
	    }

        for ( var i=0, n=pArray.length; i < n; i++) {
            addOption(select, eval("pArray[i]." + pKeyProperty), eval("pArray[i]." + pValueProperty));
        }
    }
}

function applyComma(value) {
    var obj;
	if (typeof value == "object" && value.value != null) {
	   obj = value;
	   value = value.value;
	} 
	value = value.replace(/,/g,"");
	if (isNaN(value)) return "";
	
	var reg = /(^[+-]?\d+)(\d{3})/;
	value += '';
	
	while (reg.test(value))
        value = value.replace(reg, '$1' + ',' + '$2');
	
	if (obj)
	   obj.value = value;
	else
	   return value;
}

function removeComma(value) {
    var obj;
    if (typeof value == "object" && value.value != null) {
       obj = value;
       value = value.value;
    }
    value = value.replace(/,/g,"");
    
    if (obj)
       obj.value = value;
    else
       return value;
}

function allowNumber(value) {
    var obj;
    if (typeof value == "object" && value.value != null) {
       obj = value;
       value = value.value;
    }
    value = value.replace(/[^\d]/g,"");

    if (obj)
       obj.value = value;
    else
       return value;
}
function allowDecimal(value) {
    var obj;
    if (typeof value == "object" && value.value != null) {
       obj = value;
       value = value.value;
    }
    value = value.replace(/[^\d|\.]/g,"");
    
    if (obj)
       obj.value = value;
    else
       return value;
}

function convertToPathName(lineArea) {
    var inputs = $(lineArea).getElementsByTagName("input");
    var selects = $(lineArea).getElementsByTagName("select");
    var textareas = $(lineArea).getElementsByTagName("textarea");
    var objects = new Array();
    objects.push(inputs);
    objects.push(selects);
    objects.push(textareas);

    for (var i=0; i<objects.length; i++) {
        var object = objects[i];
        for (var k=0, n=object.length; k<n; k++) {
            var name = object[k].name;
            
            if (name) {
                var equalNameElements = document.getElementsByName(name); 
                for (var j=equalNameElements.length-1, m=0; j>=m; j--) {
                    var dotPosition = name.lastIndexOf(".");
                    
                    if (equalNameElements[j].name.match(/\[[0-9]+]/)) continue;
                    if (dotPosition > 0) {
                        equalNameElements[j].name = name.substring(0, dotPosition) + "[" + j + "]" + name.substring(dotPosition, name.length);
                    } else {
                        equalNameElements[j].name = name + "[" + j + "]";
                    }
                } 
            }
        }
    }
}

function restoreName(form) {
    for (var i=0, n=form.elements.length; i<n; i++) {
        form.elements[i].name = form.elements[i].name.replace(/\[[0-9]+]/,"");
    }
}

function applyFormat() {
    var forms = document.forms;
    
    for (var i=0, n=forms.length; i<n; i++) {
        var elements = forms[i].elements;
        for (var j=0, m=elements.length; j<m; j++) {
            var format = elements[j].getAttribute("format");
            if (format) {
                switch (format) {
                    case "currency" :
                        //elements[j].style.textAlign = "right";
                        elements[j].onfocus = function(event) {
                            removeComma(this);
                        }
                        elements[j].onblur = function(event) {
                            allowDecimal(this);
                            applyComma(this);
                        }  
                    break;
                    case "date" : 
                        elements[j].onblur = function(event) {
                            allowDecimal(this);
                        }  
                    break;
                }
            }
        }
    }
}

function initCalendar(inputFieldId, buttonId) {
    var cal = Calendar.setup(
      {
        inputField  : inputFieldId,         // ID of the input field
        ifFormat    : "%Y.%m.%d",    // the date format
        button      : buttonId,       // ID of the button
        weekNumbers : false
      }
    );
}

function deleteWord(event, keyEl) {
    var e = event || window.event;
    var el = event.target || event.srcElement;

    if (e.keyCode == "8") {
        var delimit = ";";
        var keyEl = document.getElementById(keyEl);
        var currPos = getSelectionEnd(el);
        if (el.value.charAt(currPos-1) == delimit) {
            currPos--;
        }
        var last = el.value.lastIndexOf(delimit, currPos-1);
        var first = el.value.indexOf(delimit, currPos);
        
        last = last == -1 ? 0 : last + 1;
        first = first == -1 ? el.value.length : first;
        selectedValue = el.value.substring(last, first);

        var valueArr = el.value.split(delimit);
        var keyArr = keyEl.value.split(delimit);
        var selectedIndex = -1;
        el.value = "";
        for (var i=0, n=valueArr.length; i<n; i++) {
            if (valueArr[i] == selectedValue) {
                selectedIndex = i;
            } else {
                el.value += valueArr[i] + delimit;
            }
        }
        
        keyEl.value = "";
        for (var i=0, n=keyArr.length; i<n; i++) {
            if (selectedIndex != i) {
                keyEl.value += keyArr[i] + delimit;
            } 
        }
        el.value = el.value.replace(/;$/,"");
        keyEl.value = keyEl.value.replace(/;$/,"");
        setSelectionRange(el, last, last);

    } 
    
    if ( e.keyCode == "37" || e.keyCode == "38" || e.keyCode == "39" || e.keyCode == "40") {
        return true;
    } else {
	    if(e.preventDefault){
	        e.preventDefault();
	        e.stopPropagation();
	    } else {
	        e.returnValue = false;
	        e.cancelBubble = true;
	    }
    }

    return false;
}
function debug(message) {
    var debug = $("debug");
    if (debug == null) {
        debug = new Element("div");
        document.body.appendChild(debug);
    }
    debug.update(message);
}
function getSelectionEnd(o) {
    if (o.createTextRange) {
        var r = document.selection.createRange().duplicate();
        r.moveStart("character", - o.value.length);
        return r.text.length;
    } else {
        return o.selectionEnd;
    }
}

function setSelectionRange(element, start, end)
{
    if(end === undefined) end = start;

    // firefox
    if("selectionStart" in element)
    {
        element.setSelectionRange(start, end);
        element.focus(); // to make behaviour consistent with IE
    }
    // ie win
    else if(document.selection)
    {
        var range = element.createTextRange();
        range.collapse(true);
        range.moveStart("character", start);
        range.moveEnd("character", end - start);
        range.select();
    }
}

function checkFileExtension(file, extensions) {
    var ext = file.substring(file.lastIndexOf(".")+1);
    ext = ext.toUpperCase();
    
    for ( var i=0, n=extensions.length; i<n; i++) {
        if (ext == extensions[i].toUpperCase()) {
            return true;
        }
    }
    return false;
}

function checkDate(s) { 
    var pt = /^\d{4}\.\d{2}\.\d{2}$/; 
    if (!pt.test(s)) return false;
    var y = parseInt(s.substr(0,4), 10); 
    var m = parseInt(s.substr(5,2), 10) - 1; 
    var d = parseInt(s.substr(8,2), 10); 
    var dt = new Date(y, m, d); 
    if (dt.getYear() == y && dt.getMonth() == m && dt.getDate() == d) { 
        return true; 
    } else { 
        return false; 
    } 
}



/****************************************************
    tbl      : 병합할 대상 table object
    startRow : 병합 시작 row, title 한 줄일 경우 1
    cNum     : 병합 실시할 컬럼번호, 0부터 시작
    length   : 병합할 row의 길이, 보통 1
    add      : 비교할 기준에 추가할 컬럼번호
              A | 1
              B | 1
             을 서로 구분하고 싶다면, add에 0번째
             컬럼을 추가
*****************************************************/
function mergeCell(tbl, startRow, cNum, length, add)
{
    var isAdd = false;
    if(tbl == null) return;
    if(startRow == null || startRow.length == 0) startRow = 1;
    if(cNum == null || cNum.length == 0) return ;
    if(add  == null || add.length == 0) {
        isAdd = false;
    }else {
        isAdd = true;
        add   = parseInt(add);
    }
    cNum   = parseInt(cNum);
    length = parseInt(length);

    rows   = tbl.rows;
    rowNum = rows.length;
    
    tempVal  = '';
    cnt      = 0;
    startRow = parseInt(startRow);

    for( i = startRow; i < rowNum; i++ ) { 
        if (!rows[i].cells[cNum])continue;
        curVal = rows[i].cells[cNum].innerHTML;
        if(isAdd) curVal += rows[i].cells[add].innerHTML;
        if( curVal == tempVal ) {
            if(cnt == 0) {
                cnt++;
                startRow = i - 1;
            }
            cnt++;
        }else if(cnt > 0) {
            merge(tbl, startRow, cnt, cNum, length);
            startRow = endRow = 0;
            cnt = 0;
        }else {
        }
        tempVal = curVal;
    }

    if(cnt > 0) {
        merge(tbl, startRow, cnt, cNum, length);
    }
}

/*******************************************
    mergeCell에서 사용하는 함수
********************************************/
function merge(tbl, startRow, cnt, cellNum, length)
{
    rows = tbl.rows;
    row  = rows[startRow];
    for( var i = startRow + 1; i < startRow + cnt; i++ ) {
        for( j = 0; j < length; j++) {
            rows[i].deleteCell(cellNum);
        }
    }
    for( j = 0; j < length; j++) {
        row.cells[cellNum + j].rowSpan = cnt;
    }
}
/************************************************************************
*  Function Name : isNumberCheck()                                      *
*  Description   : 숫자를 제외한 다른 문자(특수문자/한글)의 입력을 막는다. *
*  Input Data    : theObj                                               *
*  Output Data   : None                                                 *
*  사용 Function : onKeyDown                                            *
*************************************************************************/
function isNumberCheck(theObj) {

    var data = theObj.value;

    /* event.keyCode :  21 =
                        16 = shiftkey
                        8 = back space
                        9 = tab
                        7 = del
                        37 = lef 방향키
                        38 = up 방향키
                        39 = right 방향키
                        40 = down 방향키
                        46 = del 키
                        95 ~ 105 : 숫자키패드의 키
    */

    //alert('aaaa:['+event.keyCode);


    if( (event.keyCode != 21 && event.keyCode != 8 && event.keyCode != 9
        && event.keyCode != 16 && event.keyCode != 7 && event.keyCode != 46)
        && !(event.keyCode >= 37 && event.keyCode <= 40 )
        && !(event.keyCode >= 95 && event.keyCode <= 105) ){

        if( event.keyCode < 48 || event.keyCode > 57 ){
            theObj.innerText = data;
            event.returnValue=false;
        }
        else{
            if( event.shiftKey ) {
                theObj.innerText = data;
                event.returnValue=false;
            }
        }
    }
} 
//해당 데이터의 모든 문자를 치환한다.
function replace(Data,str1,str2)
{
    var len  = Data.length;
    var temp = "";
	for ( i=0;i<len;i++) {
		if( Data.substr(i,1) != str1)
			temp = temp + Data.substr(i,1);
		else
			temp = temp + str2;
	}

	return temp;
}
/************************************************************************
*  Function Name : isNumberCheck()                                      *
*  Description   : 숫자를 제외한 다른 문자(특수문자/한글)의 입력을 막는다. *
*  Input Data    : theObj                                               *
*  Output Data   : None                                                 *
*  사용 Function : onKeyDown                                            *
*************************************************************************/
function isNumberCheck(theObj) {

    var data = theObj.value;

    /* event.keyCode :  21 =
                        16 = shiftkey
                        8 = back space
                        9 = tab
                        7 = del
                        37 = lef 방향키
                        38 = up 방향키
                        39 = right 방향키
                        40 = down 방향키
                        46 = del 키
                        95 ~ 105 : 숫자키패드의 키
    */

    //alert('aaaa:['+event.keyCode);


    if( (event.keyCode != 21 && event.keyCode != 8 && event.keyCode != 9
        && event.keyCode != 16 && event.keyCode != 7 && event.keyCode != 46)
        && !(event.keyCode >= 37 && event.keyCode <= 40 )
        && !(event.keyCode >= 95 && event.keyCode <= 105) ){

        if( event.keyCode < 48 || event.keyCode > 57 ){
            theObj.innerText = data;
            event.returnValue=false;
        }
        else{
            if( event.shiftKey ) {
                theObj.innerText = data;
                event.returnValue=false;
            }
        }
    }
}
/*-------------------------------------------------------------------
    Description   : 빈 값 점검
-------------------------------------------------------------------*/
function isBlank()
{
    var args = isBlank.arguments;

	if (args.length == 0)
	{
	    theObj = this.field;
	}
	else
	{
        theObj = args[0];
	}
    var Whitespace = /^\s+$/;

  	if(theObj.type == 'select-one')
	{ 
        data = theObj[theObj.selectedIndex].value;
	}
	else
	{ 
  	    data = theObj.value;
	}

    var len = data.length;

    if (len == 0 || Whitespace.test(data))
    {
	   theObj.value = "";
       if(theObj.type != "hidden" || theObj.disabled != true) {
	      theObj.focus();
	   }
       return true;
	}
	else
	{
	   return false;
	}
}
/*-------------------------------------------------------------------
    Description   : 숫자데이터에 콤마 찍기
                    -> showComma는 음수부호(-),소수점 이하숫자에도 
                       콤마를 붙이므로 개선
-------------------------------------------------------------------*/
function showCommaFloat(theObj)
{
    var num = theObj.value;
    var re = /[^0-9\-]/g;
    var re2 = /[^0-9]/g;
    var flag = "";   // 음수
	var ptNum = "" ; //소수점 뒤의 문자
	if (num.toString().indexOf('.') > 0 ) {
		//소수점 뒷자리가 있다면
		ptNum = "." + num.substr(num.toString().indexOf('.')+1).replace(re2,'');
		num = num.substr(0,num.toString().indexOf('.'));
	}
	
    var num = num.toString().replace(re,'');

    if (num.substr(0,1) == "-") {
    	flag = "-";
        num = num.substr(1,num.length - 1);
				
    }
    if(isNaN(num)) {num = "";}
    
    num = Math.floor(num).toString();
    for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++) 
    num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3)); 
    num = flag + num + ptNum ;
    
    if(num == "0") {num = "";}
    else if( num == "-0" ) { num = "-"; }
    
    theObj.value = num;
    
    if(theObj.value == '' || theObj.value == 0)
    {
        theObj.value = 0;
    }
}

/*------------------------------------------------------------------------------
    Description : 공백이면 숫자 0 세팅
------------------------------------------------------------------------------*/
function zeroSet()
{ 
    var args = zeroSet.arguments;

	if (args.length == 0)
	{
	    theObj = this.field;
	}
	else
	{
        theObj = args[0];
	}

    if(isBlank(theObj))
    {
        theObj.value = 0;
    }
}
/*-------------------------------------------------------------------
    Description   : 날짜에 보여주기( YYYY/MM/DD )
-------------------------------------------------------------------*/
function dispDate(data)
{
    var yearStr;
    var monthStr;
    var dayStr;
    var Result;

    if(data == null || data == "" || data == " ") {
        Result = "&nbsp;";
		return Result;
	}

    if(data.length == 6) {
        yearStr = data.substring(0,4);
        monthStr = data.substring(4,6);
        Result = yearStr + "/" + monthStr;
		return Result;
	}
	else if(data.length == 8) {
        yearStr = data.substring(0,4);
        monthStr = data.substring(4,6);
        dayStr = data.substring(6,8);
        Result = yearStr + "/" + monthStr + "/" + dayStr;
		return Result;
	} 
	else if(data.length == 4) {
        yearStr = data.substring(0,2);
        monthStr = data.substring(2,4);
        Result = yearStr + "/" + monthStr;
		return Result;
	}
}

var oDialog2 = "/_pages/delay.html";    // Passes URL and filename of dialog box as a variable
var bDialogStatus = false;    // Indicates whether modeless dialog box is currently open
var oObj = null;             // Indicates whether modeless dialog box is currently open
function showDelay(){
	if ( bDialogStatus == false ) {
		var iwidth = 400;
		var ihight = 120;
		var lefter = (screen.width-iwidth)/2;
		var topper = (screen.height-ihight)/2;
		var sFeatures=js_Features(ihight,iwidth, topper, lefter,"No","No","No");
		bDialogStatus = true;
		oObj = showModelessDialog(oDialog2,window,sFeatures);
	} else {
		oObj.focus();
	}
}
function js_Features(iHeight, iWidth, lefter,topper,bResize,bStatus,bScroll)
{
	var iLeft  =lefter;
	var iTop   =topper;
	var sEdge  ="Raised";
	var bCenter="Yes";
	var bHelp  ="No";
	
	var sFeatures ="";
	sFeatures +="dialogHeight:"+iHeight+"px; ";
	sFeatures +="dialogWidth:"+iWidth+"px; ";
	sFeatures +="dialogTop:"+iTop+"px; ";
	sFeatures +="dialogLeft:"+iLeft+"px; ";
	sFeatures +="edge:"+sEdge+"; ";
	sFeatures +="center:"+bCenter+"; ";
	sFeatures +="help:"+bHelp+"; ";
	sFeatures +="resizable:"+bResize+"; ";
	sFeatures +="status:"+bStatus+"; ";
	sFeatures +="scroll:"+bScroll+";";
	
	return sFeatures;
}