TotForm = function(instanceName, tableCount, itemCount) { this.name = instanceName; this.isTotDoc = false; this.tableCount = tableCount; this.itemCount = itemCount; this.itemList = new Array(); this.tableList = new Array(); for(var j=1; j <= tableCount && tableCount > 0 ; j++) this.tableList[j]= new TotTable(1); for(var i=0;i -1){ // roundInStr = expr.substring(sumIndex+3, expr.length); // charCount = roundInStr.length; // var isErrorExpr = false; // for(var i=0; i < charCount; i++){ // alert(roundInStr.substring(i, i+1)); // if(alphabet.indexOf(roundInStr.substring(i, i+1)) > -1 && isErrorExpr){ // isErrorExpr = false; // break; // }else{ // isErrorExpr = true; // } // } // } // if(isErrorExpr){ // alert(expr+" 수식이 잘못 되었습니다. 다시확인해 주세요. \n정의한 수식중 SUM()안에 셀 이름이 하나만 있는지 확인해 주세요. "); // return true; // } if(sumIndex > -1){ //콜론이 없는 경우에는 알파벳+숫자가 2개 있어야 한다. if(colonIndex <= -1) { roundInStr = expr.substring(sumIndex+4, expr.length-1); charCount = roundInStr.length; for(var i=0; i < charCount; i++){ if(alphabet.indexOf(roundInStr.substring(i, i+1)) > -1){ if(alphabetCount == 1) { alphabetCount = 0; } alphabetCount = alphabetCount + 1; } else { if(alphabetCount == 2) { alphabetCount = 1; } alphabetCount = alphabetCount + 1; } } if(alphabetCount != 2){ alert(expr+" 수식이 잘못 되었습니다. 다시확인해 주세요."); return true; } //콜론이 1개 있는 경우에는 알파벳+숫자가 2개 있어야 한다. } else { //콜론의 앞쪽 roundInStr = expr.substring(sumIndex+4, colonIndex); charCount = roundInStr.length; for(var i=0; i < charCount; i++){ if(alphabet.indexOf(roundInStr.substring(i, i+1)) > -1){ if(alphaBeforeCount == 1) { alphaBeforeCount = 0; } alphaBeforeCount = alphaBeforeCount + 1; } else { if(alphaBeforeCount == 2) { alphaBeforeCount = 1; } alphaBeforeCount = alphaBeforeCount + 1; } } //콜론의 뒤쪽 roundInStr = expr.substring(colonIndex+1, expr.length-1); charCount = roundInStr.length; for(var i=0; i < charCount; i++){ if(alphabet.indexOf(roundInStr.substring(i, i+1)) > -1){ if(alphaAfterCount == 1) { alphaAfterCount = 0; } alphaAfterCount = alphaAfterCount + 1; } else { if(alphaAfterCount == 2) { alphaAfterCount = 1; } alphaAfterCount = alphaAfterCount + 1; } } if((alphaBeforeCount == 2 && alphaAfterCount != 2) || (alphaBeforeCount != 2 && alphaAfterCount == 2)) { alert(expr+" 수식이 잘못 되었습니다. 다시확인해 주세요. \n정의한 수식중 SUM()안에 셀 이름이 하나만 있는지 확인해 주세요. "); return true; } else if(alphaBeforeCount != 2 || alphaAfterCount != 2){ alert(expr+" 수식이 잘못 되었습니다. 다시확인해 주세요."); return true; } } } // 셀을 '숫자'로 선택하고, 계산식을 입력할 경우 입력가능한 문자외에는 등록하지 못하도록 체크한다. 2014.11.21 by YOUNGJUN,CHO //alert(SetCell.itemType.value); if (type === "숫자") { // 아래 문자가 아닌 경우(정규식 앞에 ^ 으로 아닌 경우를 체크)가 존재할 경우 true 로 리턴. // 영문 대문자 A-Z // 숫자 0-9 // 괄호 ( ) // 사칙연산 + - * / // 콜론 : var regexp = /[^A-Z|0-9|\(|\)|\+|\-|\/|\*|\:]/; //alert(regexp.test(expr)); if (regexp.test(expr) === true) { alert(expr+" 수식이 잘못 되었습니다.\n\n셀을 '숫자'로 선택하신 경우에는 수식에 소수점을 사용할 수 없으며\n\r아래 문자만 사용할 수 있습니다.\n\ \n** 알파벳(대문자), 숫자, 괄호, 사칙연산기호(+,-,*,/), 콜론(:) **\n\n수식을 다시 설정해 주십시오!"); return true; } } } //SUM없이 ','만 사용할때 사용불가 var comaIndex; if(sumIndex == -1){ comaIndex = expr.indexOf(","); if(comaIndex > -1){ alert(expr+" 수식이 잘못 되었습니다. 다시확인해 주세요. \n정의한 수식중 ','가 있는지 확인해주세요. \n','를 '+'로 바꿔 사용하면 정상적으로 작동합니다."); return true; } } //수식에 자기자신을 연산하는 경우 사용불가 if(expr.indexOf("+")==-1||expr.indexOf("-")==-1||expr.indexOf("*")==-1||expr.indexOf("/")==-1||expr.indexOf("SUM(")==-1){ var cellname=$(SetWin).find('td:first').text(); try{ cellname=cellname.trim(); }catch(e){} if(expr.indexOf(cellname)>-1&&cellname!=''){ alert('수식에는 자기 자신을 연산할 수 없습니다.'); return true; } } //셀 서식 적용 중 콤보박스와 연산이 있을 경우 콤보박스 값 중에 숫자값이 아닌 값이 있는지 체크 //수식 일 때 숫자가 아닌 셀 이 있는 지 확인 var temp=expr.replace('+',',').replace('-',',').replace('*',',').replace('/',',').replace('SUM(',',').replace(':',',').replace(')',',').split(','); if(temp.length>1){ for(var i=0;i-1){ var explist=exp.split('^'); for(var k=0;k-1||expr.indexOf('-')>-1||expr.indexOf('*')>-1||expr.indexOf('/')>-1||expr.indexOf('SUM(')>-1){ for(var i=0;j"+ this.itemList[index].itemName +""; htmlStr+=""+this.itemList[index].expr+""; htmlStr+="\ \ "; eval('cell_'+index).innerHTML = htmlStr; }; function showSetWinForCell(totForm, index){ totForm.itemList[index].setWin = true; SetWin.style.visibility='visible'; SetWin.style.width='auto'; //SetWin.style.top = window.event.y + document.body.scrollTop; //SetWin.style.left = window.event.x + document.body.scrollLeft; // 2014.08.21 by YoungJun Cho. 셀 서식지정 레이어 팝업 위치조절 SetWin.style.top = (window.event.clientY + document.body.scrollTop - 30) + "px"; // 위로 30px 밀기 SetWin.style.left = (window.event.clientX + document.body.scrollLeft + 20) + "px"; // 우측으로 20px 밀기 SetWin.innerHTML = "\ \ \ \ \ \ \ \
"+totForm.itemList[index].itemName+"
\
\ \ \ \ \ \ \ \ \ \
\ \ \ \ \ \ \ \
\ \ \
\        \ \ \
\
\
"; SetCell.itemSize.value = totForm.itemList[index].size; SetCell.itemExpr.value = totForm.itemList[index].expr; SetCell.itemType.value = totForm.itemList[index].type; SetCell.itemExpr.focus(); } var v0; function inExpNew(v1) { if(SetWin.style.visibility=='hidden'){ }else{ var itemName = SetCell.itemName; var itemExpr = SetCell.itemExpr; var itemType = SetCell.itemType; // console.log("입력 Type["+itemType.value+"]"); // console.log("입력값["+v1+"]"); // console.log("입력쉘["+itemName.value+"]"); if(itemType.value!='숫자') { return; } if(itemName.value==v1) { alert('수식에는 자기자식을 연산할 수 없습니다.'); return; } if(v1 == "SUM(:)") { if(itemExpr.value.length>0) { alert("SUM함수는 단독으로만 사용가능합니다."); itemExpr.value=""; return; } else{ itemExpr.value = v1; console.log(1); } } else { if(itemExpr.value=="SUM(:)"){ itemExpr.value="SUM("+v1+":)" console.log(2); } else if(itemExpr.value.indexOf("SUM(")>-1){ itemExpr.value=itemExpr.value.replace(":)",":"+v1+")"); console.log(3); } else { itemExpr.value = itemExpr.value+v1; console.log(4); } } } } /* //ie10,11 호환성 보기 수정 function inExp(v1) { if (SetWin.style.visibility == 'hidden') { } else { SetCell.itemExpr.focus(); window.document.selection.createRange().text = v1; } } function inExp(v1){ if(SetWin.style.visibility=='hidden'){ }else{ SetCell.itemExpr.focus(); //ie10,11 호환성 수정 var range; var txt=SetCell.itemExpr.value; try{ range = window.document.selection.createRange(); range.text=v1; if (v1.match('\\(\\)$')) { range.moveStart ('character', -1); range.moveEnd ('character', -1); range.select(); } else if (v1.match('\\(:\\)$')) { range.moveStart ('character', -2); range.moveEnd ('character', -2); range.select(); }else if(txt.substr(txt.length-2,2)==':)'){ range.moveStart ('character', 1); range.moveEnd ('character', 0); range.select(); } }catch(e){ range=SetCell.itemExpr.createTextRange(); var pos=SetCell.itemExpr.selectionStart; txt=txt.substring(0,pos)+v1+txt.substring(pos,txt.length); SetCell.itemExpr.value=txt; if (v1.match('\\(:\\)$')) { range.moveStart('character', SetCell.itemExpr.value.length-2); range.moveEnd('character',-2); range.select(); }else if(txt.substring(txt.length-2)==':)'&&txt.substring(txt.length-6)!='SUM(:)'){ range.moveStart('character', SetCell.itemExpr.value.length-1); range.moveEnd('character', -1); range.select(); } } } } */ function enter_catch(totForm, index){ if(event.keyCode==13){ setValue(totForm, index); SetWin.style.visibility='hidden'; totForm.reShowValue(index); } } String.prototype.trim = function() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); }; function compareColName(col1, col2) { col1 = col1.toUpperCase(); col2 = col2.toUpperCase(); if(col1.length != col2.length) return col2.length - col1.length; else { for(var x = 0; x < col1.length; x++) { if(col1.charCodeAt(x) == col2.charCodeAt(x)) continue; else return col2.charCodeAt(x) - col1.charCodeAt(x); } return 0; } } function isContainedIn(cellName, cellRange) { var cellNameArray = cellRange[0].split(/\s*:\s*/g); var cellName1 = cellNameArray[0].toUpperCase(); var cellName2 = cellNameArray[1].toUpperCase(); var colName1 = cellName1.match(/[A-Z]+/g); var colName2 = cellName2.match(/[A-Z]+/g); var rowNum1 = cellName1.match(/\d+/g); var rowNum2 = cellName2.match(/\d+/g); var startColName, endColName, startRowNum, endRowNum; if( (compareColName(colName1[0], colName2[0]) < 0) || (compareColName(colName1[0], colName2[0]) == 0 && rowNum1[0] - rowNum2[0] < 0) ) { startColName = colName1[0]; endColName = colName2[0]; startRowNum = rowNum1[0]; endRowNum = rowNum2[0]; } else /*if( (compareColName(colName1[0], colName2[0]) > 0) || (compareColName(colName1[0], colName2[0]) == 0 && rowNum1[0] - rowNum2[0] >= 0) )*/ { startColName = colName2[0]; endColName = colName1[0]; startRowNum = rowNum2[0]; endRowNum = rowNum1[0]; } var colNameTmp = cellName.toUpperCase().match(/[A-Z]+/g); var rowNumTmp = cellName.match(/\d+/g); var colName = colNameTmp[0]; var rowNum = rowNumTmp[0]; return compareColName(startColName, colName) <= 0 && compareColName(colName, endColName) <= 0 && startRowNum <= rowNum && rowNum <= endRowNum; } function getCalculationForm(str, rowNum, type){ //필요없는 EXPR ^ if(isSearch(str, "^")) return str; //"SUM", "(", ")", ":", ",", "+", "-", "*", "/" //SUM(B9:F99) var alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; var integer = '0123456789'; var charCount = str.length; var charList = new Array(charCount); var numList = new Array(charCount); var befoChar = ""; var currChar = ""; var afterChar = ""; if(charCount < 1) return str; //String array analysis //expr의 item name의 number add var exprbuf = ""; var isItemNum = false; var tmpNum = ""; var sumNum = ""; for(var i=0; i < charCount; i++){ currChar = str.substring(i, i+1); if(isSearch(alphabet, currChar)){ //문자 일때~~~~ if(currChar == 's' || currChar == 'S'){ sumNum = 1; isItemNum = true; }else if(sumNum == 1 && i > 0 && (currChar == 'u' || currChar == 'U')){ sumNum = 2; isItemNum = true; }else if(sumNum == 2 && i > 1 && (currChar == 'm' || currChar == 'M')){ sumNum = 3; isItemNum = false; }else{ sumNum = 0; isItemNum = true; } exprbuf += currChar; }else if(isSearch(integer, currChar)){ //숫자 일때~~~~ if(i > 0 && isSearch(alphabet, befoChar) && isItemNum == true){ //Item name의 첫번째 숫자라면 tmpNum = currChar; isItemNum = true; }else if(i > 0 && isSearch(integer, befoChar) && isItemNum == true){ //Item name의 두번째 이상의 숫자라면 tmpNum += currChar; isItemNum = true; }else{ //나머지 exprbuf += currChar; isItemNum = false; } afterChar = str.substring(i+1, i+2); if((i == (charCount-1) || !isSearch(integer, afterChar)) && isItemNum){ //Item name의 숫자 끝이라면 if(type == "add"){ //동적표에서 보가자료 보기시 보고한 행에 따라 수식을 변경해줌 exprbuf += (parseInt(tmpNum)+parseInt(rowNum)); isItemNum = false; }else if(type == "sub"){ //두개의 표를 등록할때 Form에 적용되는 수식사용 exprbuf += (parseInt(tmpNum)-parseInt(rowNum)); isItemNum = false; } } }else{ exprbuf += currChar; isItemNum = false;//수식 일때~~~ } befoChar = currChar; } return exprbuf; } function isSearch(strs, str){ var count = strs.length; var strList = new Array(count); for(var i=0; i < count; i++){ if(strs.substring(i, i+1) == str) return true; } return false; }