tfHelper.js 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874
  1. /************************************************************************************************
  2. DATE : 2006-12-12
  3. WRITER : Comsquare
  4. DEFINITION : TrustForm4.0 공통 JavaScript ( CMC )
  5. *************************************************************************************************/
  6. /************************************************************************************************
  7. 함수명 : addComboItem ()
  8. 인자 :
  9. String comboID - 해당 콤보 아이디
  10. String label - 추가 할 아이템 Lavel
  11. String value - 추가 할 아이템 Value
  12. String [postion] - 추가 할 위치( "above" | "below" )
  13. 결과값 :
  14. 함수설명 : 콤보 아이템 추가 함수
  15. ************************************************************************************************
  16. 작 성 자 : 김 기용
  17. 작 성 일 : 2007. 08. 21
  18. ************************************************************************************************/
  19. function addComboItem( comboID, label, value, position ) {
  20. var comboObj = document.all.item(comboID);
  21. // Combo ItemSet 정보
  22. var comboItemNodeSet = comboObj.choices.itemset.attribute("nodeset");
  23. var comboLabelRef = comboObj.choices.itemset.label.attribute("ref");
  24. var comboValueRef = comboObj.choices.itemset.value.attribute("ref");
  25. var nodeNn = instance1.selectSingleNode(comboItemNodeSet);
  26. if (nodeNn == null) {
  27. model.makeNode(comboItemNodeSet);
  28. model.makeNode(comboItemNodeSet+"/"+comboLabelRef);
  29. model.makeNode(comboItemNodeSet+"/"+comboValueRef);
  30. position = "init";
  31. }
  32. // Item 노드 생성
  33. var itemNode = instance1.createNode("element", instance1.selectSingleNode(comboItemNodeSet).nodeName, "");
  34. var labelNode = instance1.createNode("element", comboLabelRef, "");
  35. var valueNode = instance1.createNode("element", comboValueRef, "");
  36. if( label == null || label == "" ) label = "- 전 체 -";
  37. labelNode.value = label;
  38. itemNode.appendChild(labelNode);
  39. if( value == null || value == "" ) value = "";
  40. valueNode.value = value;
  41. itemNode.appendChild(valueNode);
  42. if( position == null || position == "" )
  43. position = "above";
  44. var destNode = instance1.selectSingleNode(comboItemNodeSet);
  45. var pDestNode = destNode.parentNode;
  46. if( position == "above" ) {
  47. pDestNode.insertBefore(itemNode, destNode);
  48. } else if ( position == "init" ) {
  49. pDestNode.insertBefore(itemNode, destNode);
  50. pDestNode.removeChild(destNode);
  51. }
  52. else {
  53. pDestNode.appendChild(itemNode);
  54. }
  55. comboObj.refresh();
  56. }
  57. /************************************************************************************************
  58. 함수명 : addComboItemAll ()
  59. 인자 :
  60. String comboIDs - 해당 콤보 아이디 예)"combo1|combo2|combo3"
  61. String label - 추가 할 아이템 Label (default="- 전 체 - ");
  62. 결과값 :
  63. 함수설명 : 모든 콤보 아이템 추가 함수
  64. ************************************************************************************************
  65. 작 성 자 : 김 기용
  66. 작 성 일 : 2007. 08. 21
  67. ************************************************************************************************/
  68. function addComboItemAll( comboIDs, label ) {
  69. var comboIDArray = comboIDs.split("|");
  70. if(label == null || label == "" )
  71. label = "- 전 체 -";
  72. for( var i = 0; i < comboIDArray.length; i++ )
  73. addComboItem( comboIDArray[i], label, "");
  74. }
  75. /************************************************************************************************
  76. 함수명 : fileDownload ()
  77. 인자 :
  78. String filePath - 다운로드 파일 Path
  79. Boolean encodingURI - URI Encoding 설정(Default True)
  80. 결과값 :
  81. 함수설명 : filePath
  82. ************************************************************************************************
  83. 작 성 자 : 김 기용
  84. 작 성 일 : 2007. 03. 15
  85. ************************************************************************************************/
  86. function fileDownload( filePath, encode ) {
  87. if( encode == null )
  88. encode = true;
  89. if( encode )
  90. filePath = encodeURI(filePath);
  91. if(!body.isChild("_tmp_browserObj_forDown")) {
  92. document.body.createChild("xforms:browser", "id:_tmp_browserObj_forDown; visibility:hidden");
  93. }
  94. _tmp_browserObj_forDown.navigate(filePath);
  95. }
  96. /************************************************************************************************
  97. 함수명 : checkFileSize ()
  98. 인자 :
  99. Object uploadObj - 업로드 컴트롤 Object
  100. 결과값 : true or false
  101. 함수설명 : upload 컨트롤의 마지막 인덱스 파일의 크기를 비교한다.
  102. ************************************************************************************************
  103. 작 성 자 : 김 기용
  104. 작 성 일 : 2007. 03. 15
  105. ************************************************************************************************/
  106. function checkFileSize( uploadObj ) {
  107. var fileCnt = uploadObj.getFileCount();
  108. var lastIndex = fileCnt - 1;
  109. var fileSize = uploadObj.getFileSize(lastIndex);
  110. var maxSize = uploadObj.attribute("filesize");
  111. /*
  112. var fileFullName = uploadObj.getFileName(lastIndex);
  113. var fileNameArray = fileFullName.split("\\");
  114. var fileName = fileNameArray[fileNameArray.length - 1];
  115. */
  116. //alert(fileName + " / " + fileSize);
  117. if ( fileSize <= maxSize )
  118. return true;
  119. else
  120. return false;
  121. }
  122. /************************************************************************************************
  123. 함수명 : checkFormUpdate ()
  124. 인자 :
  125. 결과값 : true or false
  126. 함수설명 : gvFormUpdateYN 전역 변수 return
  127. ************************************************************************************************
  128. 작 성 자 : 김 기용
  129. 작 성 일 : 2007. 04. 11
  130. ************************************************************************************************/
  131. function checkFormUpdate() {
  132. return gvFormUpdateYN;
  133. }
  134. /************************************************************************************************
  135. 함수명 : checkKeyColumn ()
  136. 인자 :
  137. String gridID - 그리드 아이디
  138. 결과값 : true or false
  139. 함수설명 : datagrid > col@_key="true"의 컬럼에서 추가된 로우의 key 값을 체크 한다.(조회 데이터 수정 불가)
  140. ************************************************************************************************
  141. 작 성 자 : 김 기용
  142. 작 성 일 : 2007. 04. 12
  143. ************************************************************************************************/
  144. function checkKeyColumn( gridID ) {
  145. var rowsArray = getUpdateRows( gridID, "insert" );
  146. var colsArray = getKeyCols( gridID, "_key" );
  147. var gridObj = document.controls.item(gridID);
  148. var i, j;
  149. for( i = 0; i < rowsArray.length; i++ ) {
  150. for( j = 0; j < colsArray.length; j++ ) {
  151. // alert(rowsArray[i] + " / " + colsArray[j]);
  152. if( gridObj.valueMatrix(rowsArray[i], colsArray[j]) == "" ) {
  153. messageBox(gridObj.valueMatrix(gridObj.fixedRows - 1, colsArray[j]) + "은(는)", "I003");
  154. gridObj.row = rowsArray[i];
  155. gridObj.col = colsArray[j];
  156. gridObj.editCell();
  157. return false;
  158. }
  159. }
  160. }
  161. return true;
  162. }
  163. /************************************************************************************************
  164. 함수명 : checkRequiredColumn ()
  165. 인자 :
  166. String gridID - 그리드 아이디
  167. 결과값 : true or false
  168. 함수설명 : datagrid > col@_required="true"의 컬럼에서 추가된 로우의 key 값을 체크 한다.(조회 데이터 수정 가능)
  169. ************************************************************************************************
  170. 작 성 자 : 김 기용
  171. 작 성 일 : 2007. 10. 12
  172. ************************************************************************************************/
  173. function checkRequiredColumn( gridID ) {
  174. var rowsArray = getUpdateRows( gridID, "insert" );
  175. rowsArray = getUpdateRows( gridID, "update", rowsArray );
  176. var colsArray = getKeyCols( gridID, "_required" );
  177. var gridObj = document.controls.item(gridID);
  178. var i, j;
  179. for( i = 0; i < rowsArray.length; i++ ) {
  180. for( j = 0; j < colsArray.length; j++ ) {
  181. // alert(rowsArray[i] + " / " + colsArray[j]);
  182. if( gridObj.valueMatrix(rowsArray[i], colsArray[j]) == "" ) {
  183. messageBox(gridObj.valueMatrix(gridObj.fixedRows - 1, colsArray[j]) + "은(는)", "I003");
  184. gridObj.row = rowsArray[i];
  185. gridObj.col = colsArray[j];
  186. gridObj.editCell();
  187. return false;
  188. }
  189. }
  190. }
  191. return true;
  192. }
  193. function getUpdateRows( gridID, status, rowsArray ) {
  194. var gridObj = document.controls.item(gridID);
  195. var sCol = gridObj.attribute("colsep");
  196. var sRow = gridObj.attribute("rowsep");
  197. var gridStatus = gridObj.getUpdateData(status);
  198. var rowStatusArray = gridStatus.split(sRow);
  199. var rowStatusCnt = rowStatusArray.length;
  200. var rowsArrayLen = 0;
  201. if( rowsArray == null ) {
  202. rowsArray = new Array();
  203. }
  204. else {
  205. rowsArrayLen = rowsArray.length;
  206. }
  207. for( var i = 0; i < rowStatusCnt - 2; i++ ) {
  208. rowsArray[i + rowsArrayLen] = rowStatusArray[i + 1].split(sCol)[1];
  209. }
  210. return rowsArray;
  211. }
  212. function getKeyCols( gridID, atttibutezName ) {
  213. var gridObj = document.controls.item(gridID);
  214. var gridCols = gridObj.cols;
  215. var rColsArray = new Array();
  216. var i, j = 0;
  217. for( i = 0; i < gridCols; i++) {
  218. if( gridObj.colAttribute(i, atttibutezName) == "true" ) {
  219. rColsArray[j++] = i;
  220. }
  221. }
  222. return rColsArray;
  223. }
  224. /************************************************************************************************
  225. 함수명 : copyNodeListType ()
  226. 인자 :
  227. String strDest - 목적 노드 경로
  228. String strSrc - 소스 노드 리스트 경로
  229. String [mode] - copy 방식( "replace" | "after" | "before" )
  230. Object [destModel] - 목적 노드 리스트 모델
  231. Object [srcModel] - 목적 노드 리스트 모델
  232. 결과값 :
  233. 함수설명 : 목적 노드에 소스 노드들을 mdoe방식에 따라 copy 함.
  234. ************************************************************************************************
  235. 작 성 자 : 김 기용
  236. 작 성 일 : 2007. 05. 01
  237. ************************************************************************************************/
  238. function copyNodeListType(strDest, strSrc, mode, destModel, srcModel) {
  239. if( typeof(destModel) == "object" || typeof(destModel) == "undefined" ) {
  240. if( destModel == null ) {
  241. destModel = model;
  242. }
  243. }
  244. else {
  245. if( destModel == "" ) {
  246. destModel = model;
  247. }
  248. }
  249. var destNode = destModel.instance1.selectSingleNode(strDest);
  250. if( destNode == null )
  251. return;
  252. var destChildNodeList = destNode.childNodes;
  253. if( typeof(srcModel) == "object" || typeof(srcModel) == "undefined" ) {
  254. if( srcModel == null ) {
  255. srcModel = model;
  256. }
  257. }
  258. else {
  259. if( srcModel == "" ) {
  260. srcModel = model;
  261. }
  262. }
  263. var srcNodeList = srcModel.instance1.selectNodes(strSrc);
  264. var srcNode;
  265. if( srcNodeList.length == 0 )
  266. return;
  267. // mode = "replace" | "after" | null
  268. if( mode != "before" ) {
  269. if( mode == "replace" || mode == null ) {
  270. removeChildren(strDest, destModel)
  271. }
  272. while( srcNode = srcNodeList.nextNode() ) {
  273. // destNode.appendChild(srcNode.cloneNode(true));
  274. model.duplicate(destNode, srcNode);
  275. }
  276. }
  277. // before mode는 테스트 필요!!!
  278. else {
  279. /*
  280. var destFirstChildNode = destNode.firstChild;
  281. while( srcNode = srcNodeList.nextNode() ) {
  282. destNode.insertBefore(srcNode.cloneNode(true), destFirstChildNode);
  283. }
  284. */
  285. for( var i = srcNodeList.length - 1; i >= 0; i-- ) {
  286. destNode = destModel.instance1.selectSingleNode(strDest);
  287. srcNode = srcNodeList.item(i);
  288. model.duplicate(destNode, srcNode, "*[1]");
  289. }
  290. }
  291. }
  292. /************************************************************************************************
  293. 함수명 : copyNodesetType ()
  294. 인자 :
  295. String strDest - 목적 노드 리스트 경로
  296. String strSrc - 소스 노드 리스트 경로
  297. String [mode] - copy 방식( "replace" | "after" | "before" )
  298. Object [destModel] - 목적 노드 리스트 모델
  299. Object [srcModel] - 목적 노드 리스트 모델
  300. 결과값 :
  301. 함수설명 : 목적 노드셋에 소스 하위 노드셋들을 mdoe방식에 따라 copy 함.
  302. ************************************************************************************************
  303. 작 성 자 : 김 기용
  304. 작 성 일 : 2007. 05. 02
  305. ************************************************************************************************/
  306. function copyNodesetType(strDest, strSrc, mode, destModel, srcModel) {
  307. if( typeof(destModel) == "object" || typeof(destModel) == "undefined" ) {
  308. if( destModel == null ) {
  309. destModel = model;
  310. }
  311. }
  312. else {
  313. if( destModel == "" ) {
  314. destModel = model;
  315. }
  316. }
  317. if( typeof(srcModel) == "object" || typeof(srcModel) == "undefined" ) {
  318. if( srcModel == null ) {
  319. srcModel = model;
  320. }
  321. }
  322. else {
  323. if( srcModel == "" ) {
  324. srcModel = model;
  325. }
  326. }
  327. var destNodeList = destModel.instance1.selectNodes(strDest);
  328. if( destNodeList == null || destNodeList.length == 0 ) {
  329. return;
  330. }
  331. var pDestNode = destNodeList(0).parentNode;
  332. var destLastNodesetName = destNodeList(0).nodeName;
  333. var srcNodeList = srcModel.instance1.selectNodes(strSrc);
  334. if( srcNodeList == null || srcNodeList.length == 0 )
  335. return;
  336. if( mode != "before" ) {
  337. if( mode == "replace" || mode == null ) {
  338. destModel.removeNodeset(strDest);
  339. }
  340. var srcNode;
  341. var tmpSrcNode;
  342. while( srcNode = srcNodeList.nextNode() ) {
  343. tmpSrcNode = srcNode.cloneNode(true);
  344. tmpSrcNode.nodeName = destLastNodesetName;
  345. // pDestNode.appendChild(tmpSrcNode);
  346. model.duplicate(pDestNode, tmpSrcNode);
  347. }
  348. }
  349. else {
  350. /*
  351. var destFirstChildNode = destNodeList.firstChild;
  352. var srcNode;
  353. var tmpSrcNode;
  354. while( srcNode = srcNodeList.nextNode() ) {
  355. tmpSrcNode = srcNode.cloneNode(true);
  356. tmpSrcNode.nodeName = destLastNodesetName;
  357. pDestNode.insertBefore(tmpSrcNode, destFirstChildNode);
  358. }
  359. */
  360. var tmpSrcNode;
  361. for( var i = srcNodeList.length - 1; i >= 0; i-- ) {
  362. pDestNode = destModel.instance1.selectSingleNode(strDest).parentNode;
  363. tmpSrcNode = srcNodeList.item(i).cloneNode(true);
  364. tmpSrcNode.nodeName = destLastNodesetName;
  365. model.duplicate(pDestNode, tmpSrcNode, "*[1]");
  366. }
  367. }
  368. }
  369. /************************************************************************************************
  370. 함수명 : copyNodeType ()
  371. 인자 :
  372. String strDest - 목적 노드 경로
  373. String strSrc - 소스 노드 경로
  374. String [mode] - copy 방식( "replace" | "after" | "before" )
  375. Object [destModel] - 목적 노드 모델
  376. Object [srcModel] - 목적 노드 모델
  377. 결과값 :
  378. 함수설명 : 목적 노드에 소스 하위 노드들을 mdoe방식에 따라 copy 함.
  379. ************************************************************************************************
  380. 작 성 자 : 김 기용
  381. 작 성 일 : 2007. 03. 21
  382. 수 정 일 : 2007. 04. 10 ( - 함수명 변경 : copyNodeset() -> copyNodeType() )
  383. ************************************************************************************************/
  384. function copyNodeType(strDest, strSrc, mode, destModel, srcModel) {
  385. if( typeof(destModel) == "object" || typeof(destModel) == "undefined" ) {
  386. if( destModel == null ) {
  387. destModel = model;
  388. }
  389. }
  390. else {
  391. if( destModel == "" ) {
  392. destModel = model;
  393. }
  394. }
  395. var destNode = destModel.instance1.selectSingleNode(strDest);
  396. if( destNode == null )
  397. return;
  398. var destChildNodeList = destNode.childNodes;
  399. if( typeof(srcModel) == "object" || typeof(srcModel) == "undefined" ) {
  400. if( srcModel == null ) {
  401. srcModel = model;
  402. }
  403. }
  404. else {
  405. if( srcModel == "" ) {
  406. srcModel = model;
  407. }
  408. }
  409. var srcNode = srcModel.instance1.selectSingleNode(strSrc);
  410. if( srcNode == null )
  411. return;
  412. var cSrcNode = srcNode.cloneNode(true);
  413. var cSrcChildNodeList = cSrcNode.childNodes;
  414. var cSrcChildNode;
  415. if( cSrcChildNodeList.length == 0 )
  416. return;
  417. // mode = "replace" | "after" | null
  418. if( mode != "before" ) {
  419. if( mode == "replace" || mode == null ) {
  420. removeChildren(strDest, destModel)
  421. }
  422. while( cSrcChildNode = cSrcChildNodeList.nextNode() ) {
  423. // destNode.appendChild(cSrcChildNode);
  424. model.duplicate(destNode, cSrcChildNode);
  425. }
  426. }
  427. // before mode는 테스트 필요!!!
  428. else {
  429. /*
  430. var destFirstChildNode = destNode.firstChild;
  431. while( cSrcChildNode = cSrcChildNodeList.nextNode() ) {
  432. destNode.insertBefore(cSrcChildNode, destFirstChildNode);
  433. }
  434. */
  435. for( var i = cSrcChildNodeList.length - 1; i >= 0; i-- ) {
  436. destNode = destModel.instance1.selectSingleNode(strDest);
  437. cSrcChildNode = cSrcChildNodeList.item(i);
  438. model.duplicate(destNode, cSrcChildNode, "*[1]");
  439. }
  440. }
  441. }
  442. /************************************************************************************************
  443. 함수명 : copyNodeWithPostfix ()
  444. 인자 :
  445. String strDest - 목적 노드 경로
  446. String strSrc - 소스 노드 경로
  447. String postfix - 추가 할 노드 네임
  448. Object [destModel] - 목적 노드 모델
  449. Object [srcModel] - 목적 노드 모델
  450. 결과값 :
  451. 함수설명 : 목적 노드의 자식 노드를 삭제후 소스 노드의 자식 노드에 postfix의 노드네임을 추가 하여 copy
  452. ************************************************************************************************
  453. 작 성 자 : 김 기용
  454. 작 성 일 : 2007. 03. 21
  455. ************************************************************************************************/
  456. function copyNodeWithPostfix(strDest, strSrc, postfix, destModel, srcModel) {
  457. removeChildren(strDest, destModel);
  458. var modelObj;
  459. if( srcModel == null ) {
  460. modelObj = model;
  461. }
  462. else
  463. modelObj = srcModel;
  464. var srcNode = modelObj.instance1.selectSingleNode(strSrc);
  465. var cSrcNode = srcNode.cloneNode(true);
  466. var cSrcChildNodeList = cSrcNode.childNodes;
  467. var cSrcChildNode;
  468. var destNode;
  469. if( destModel == null )
  470. destNode = instance1.selectSingleNode(strDest);
  471. else
  472. destNode = destModel.instance1.selectSingleNode(strDest);
  473. while( cSrcChildNode = cSrcChildNodeList.nextNode() ) {
  474. cSrcChildNode.nodeName = cSrcChildNode.nodeName + postfix;
  475. // destNode.appendChild(cSrcChildNode);
  476. model.duplicate(destNode, cSrcChildNode);
  477. }
  478. }
  479. /************************************************************************************************
  480. 함수명 : setCSVToNode ()
  481. 인자 :
  482. String destRef - 목적 노드 경로
  483. String CSV - CSV
  484. * getNodeListCSV() 함수 return value
  485. String [nodeSetName] - 노드셋 네임
  486. 결과값 :
  487. 함수설명 : 목적노드(destRef)에 CSV를 makeValue 해준다.
  488. ************************************************************************************************
  489. 작 성 자 : 김 기용
  490. 작 성 일 : 2007. 04. 13
  491. ************************************************************************************************/
  492. function setCSVToNode(destRef, CSV, nodeSetName) {
  493. var sColSep = "▦";
  494. var sRowSep = "▩";
  495. // 헤더값, 즉 컬럼명을 얻어온다
  496. var nodeNameArray = CSV.split(sRowSep)[0].split(sColSep);
  497. // 컬럼의 개수를 얻어온다
  498. var nodeNameArrayCnt = nodeNameArray.length;
  499. // tempDestNode
  500. if( nodeSetName == null || nodeSetName == "")
  501. nodeSetName = "list";
  502. // nodeSetName라는 이름의 element를 생성한다
  503. var tmpDestNode = instance1.createElement(nodeSetName);
  504. var tmpDestChildNode;
  505. var i, j;
  506. for( i = 0; i < nodeNameArrayCnt; i++ ) {
  507. // nodeNameArray[i]의 이름으로 element를 생성한다(즉 컬럼명 하나하나로 element를 생성한다)
  508. tmpDestChildNode = instance1.createElement(nodeNameArray[i]);
  509. // tmpDestNode에 tmpDestChildNode의 값을 복사한다
  510. model.duplicate(tmpDestNode, tmpDestChildNode);
  511. }
  512. // 헤더값, 즉 컬럼명과 선택한 데이터들을 로우(행)단위로 잘라서 얻어온다
  513. var CSVArray = CSV.split(sRowSep);
  514. // CSVArray에서 얻어온 로우(행)의 갯수를 가지고 온다(데이터가 2개이면 컬럼명 까지 해서 총 3을 얻어온다)
  515. var CSVArrayCnt = CSVArray.length - 1;
  516. // destRef노드를 반환한다
  517. var srcNode = instance1.selectSingleNode(destRef);
  518. var nodeValueArray;
  519. // 시작점을 1로 하는 이유는 컬럼명은 필요 없기 때문에 1부터 해서 데이터만 뽑아오기 위해서이다
  520. for( i = 1; i < CSVArrayCnt; i++ ) {
  521. // 첫번째 로우(행)의 데이터를 가지고 온다
  522. nodeValueArray = CSVArray[i];
  523. for ( j = 0; j < nodeNameArrayCnt; j++ ) {
  524. // 각 로우(행)의 데이터를 컬럼 단위로 하나하나 가지고 와서 tmpDestNode의 자식노드에 하나하나 넣어준다
  525. tmpDestNode.childNodes.item(j).text = nodeValueArray.split(sColSep)[j];
  526. }
  527. model.duplicate(srcNode, tmpDestNode);
  528. }
  529. }
  530. /************************************************************************************************
  531. 함수명 : deleteSelectedRows ()
  532. 인자 :
  533. Object grd - 그리드 객체
  534. Boolean markonly - true이면 지우지 않고 상태만 delete 상태로 변경
  535. 결과값 :
  536. 함수설명 : 선택된 행들을 모두 지우거나 deleted 상태로 마크
  537. ************************************************************************************************
  538. 작 성 자 : 김 형도
  539. 작 성 일 : 2007. 02. 21
  540. ************************************************************************************************/
  541. function deleteSelectedRows(grd,markonly) {
  542. var rowIdx;
  543. if (grd.selectedRows > 0) {
  544. var selectedRows = Array(grd.selectedRows);
  545. for(i=0;i<grd.selectedRows;i++) {
  546. selectedRows[i] = grd.selectedRow(i);
  547. }
  548. if (markonly != null && markonly == true) { // mark delete
  549. for(i=selectedRows.length-1;i>=0;i--) {
  550. rowIdx = selectedRows[i];
  551. if(grd.rowstatus(rowIdx) == 1 ) { // just inserted row
  552. grd.deleterow(rowIdx,false);
  553. } else {
  554. grd.addStatus(rowIdx,"delete");
  555. }
  556. }
  557. } else {
  558. for(i=selectedRows.length-1;i>=0;i--) {
  559. rowIdx = selectedRows[i];
  560. grd.deleterow(rowIdx,false);
  561. }
  562. }
  563. }
  564. }
  565. /************************************************************************************************
  566. 함수명 : getGridUpdateData ()
  567. 인자 :
  568. Object gridID - 그리드 아이디
  569. 결과값 : String updataData or ""
  570. 함수설명 : 그리드 업데이트 데이터 반환, 업데이트 정보가 없을경우 "" 반환
  571. ************************************************************************************************
  572. 작 성 자 : 김 기용
  573. 작 성 일 : 2007. 02. 20
  574. ************************************************************************************************/
  575. function getGridUpdateData(gridObj, statusType) {
  576. var updataData = gridObj.getUpdateData(statusType);
  577. var rowsep = gridObj.attribute("rowsep");
  578. var split = updataData.split(rowsep);
  579. if(split.length > 2){
  580. return updataData;
  581. }
  582. else
  583. return "";
  584. }
  585. /************************************************************************************************
  586. 함수명 : getImageSize ()
  587. 인자 :
  588. String fileName - 이미지 파일명
  589. 결과값 : String width^height
  590. 예) 20^20)
  591. 함수설명 : 이미지 Width, Height 반환 함수
  592. ************************************************************************************************
  593. 작 성 자 : 김 기용
  594. 작 성 일 : 2007. 01. 31
  595. ************************************************************************************************/
  596. function getImageSize(fileName) {
  597. var newCtrObj = null;
  598. if(document.controls("_image_forSize") == null) {
  599. newCtrObj = body.createChild("xforms:img", "id:_image_forSize; src:" + fileName + "; left:0px; top:0px; width:1px; height:1px;");
  600. newCtrObj.visible = false;
  601. }
  602. else{
  603. //_image_forSize.visible = true;
  604. newCtrObj = document.controls("_image_forSize");
  605. newCtrObj.src = fileName;
  606. }
  607. newCtrObj.attribute("width") = null;
  608. newCtrObj.attribute("height") = null;
  609. newCtrObj.visible = false;
  610. var imgW = newCtrObj.attribute("width").replace("px", "");
  611. var imgH = newCtrObj.attribute("height").replace("px", "");
  612. body.removeChild("_image_forSize"); //스크롤이 생기는걸 막기위해서 지워줌.
  613. return imgW + "^" + imgH;
  614. }
  615. /************************************************************************************************
  616. 함수명 : getNodeListCSV ()
  617. 인자 :
  618. Object nodeList - 노드 리스트
  619. 결과값 : String rCSV
  620. 예) a▦b▦c▩true▦1▦1▩true▦3▦3▩true▦5▦5▩
  621. 함수설명 : 노드리스트를 CSV로 반환한다.
  622. ************************************************************************************************
  623. 작 성 자 : 김 기용
  624. 작 성 일 : 2007. 04. 13
  625. ************************************************************************************************/
  626. function getNodeListCSV(nodeList) {
  627. if( nodeList.length == 0 )
  628. return;
  629. var sColSep = "▦";
  630. var sRowSep = "▩";
  631. var rCSV = "";
  632. var childNodeList = nodeList.item(0).childNodes;
  633. var childNodeCnt = childNodeList.length;
  634. if( childNodeCnt == 0 )
  635. return;
  636. var i, j;
  637. for( i = 0; i < childNodeCnt - 1; i++) {
  638. rCSV += childNodeList.item(i).nodeName + sColSep;
  639. }
  640. rCSV += childNodeList.item(i).nodeName + sRowSep;
  641. var node;
  642. while( node = nodeList.nextNode() ) {
  643. childNodeList = node.childNodes;
  644. for( i = 0; i < childNodeCnt - 1; i++) {
  645. rCSV += childNodeList.item(i).text + sColSep;
  646. }
  647. rCSV += childNodeList.item(i).text + sRowSep;
  648. }
  649. return rCSV;
  650. }
  651. /************************************************************************************************
  652. 함수명 : getNodesetCount ()
  653. 인자 :
  654. String nodeSet - xPath
  655. 결과값 : Integer Count
  656. 함수설명 : 노드셋의 갯수 반환
  657. ************************************************************************************************
  658. 작 성 자 : 김 기용
  659. 작 성 일 : 2007. 03. 12
  660. ************************************************************************************************/
  661. function getNodesetCount( nodeSet ) {
  662. var xPathFunction = "count(" + nodeSet + ")";
  663. return model.getXPathValue(xPathFunction);
  664. }
  665. /************************************************************************************************
  666. 함수명 : isDataCell ()
  667. 인자 :
  668. 결과값 : Boolean true or false
  669. 함수설명 : datagrid click or dbclick 시점에 현재 click target이 data 영역인지 check
  670. ************************************************************************************************
  671. 작 성 자 : 김 기용
  672. 작 성 일 : 2007. 04. 12
  673. ************************************************************************************************/
  674. function isDataCell() {
  675. var gridObj = event.ptarget.parent;
  676. if( gridObj.isCell(event.target) && gridObj.row >= gridObj.fixedRows && gridObj.col >= gridObj.fixedCols) {
  677. return true;
  678. }
  679. else
  680. return false;
  681. }
  682. /************************************************************************************************
  683. 함수명 : isRequiredControls ()
  684. 인자 :
  685. String controlID_1 - 컨트롤 아이디
  686. String [controlID_2] - 컨트롤 아이디
  687. ...
  688. 결과값 : Boolean true or false
  689. 함수설명 : 입력 컨트롤들의 필수값 체크
  690. * 사용예) isRequiredControls("ipt_01", "sct_02", "tar_03");
  691. * 주의) 입력 컨트롤이 아이디가 "ipt_01"일 경우 messageBox pMessage는 "cap_01" 캡션 컨트롤을 참조 함.
  692. ************************************************************************************************
  693. 작 성 자 : 김 기용
  694. 작 성 일 : 2007. 02. 15
  695. ************************************************************************************************/
  696. function isRequiredControls() {
  697. var controlCnt = isRequiredControls.arguments.length;
  698. var controlID, captionID;
  699. var controlObj, captionObj;
  700. for(var i=0; i<controlCnt ;i++) {
  701. controlID = isRequiredControls.arguments[i];
  702. controlObj = document.controls(controlID);
  703. if(controlObj != null) { // 인풋 컨트롤 유무 여부
  704. if(controlObj.value == "") {
  705. captionID = controlID.replace(controlID.substr(0, 3), "cap");
  706. captionObj = document.controls(captionID);
  707. if(captionObj != null) { // 캡션 컨트롤 유무 여부
  708. var captionLabel = captionObj.label;
  709. if(captionLabel.indexOf(":") == captionLabel.length - 1) {
  710. captionLabel = captionLabel.substr(0, captionLabel.length - 1);
  711. }
  712. messageBox(captionLabel, "I003");
  713. }
  714. else
  715. messageBox("", "I003");
  716. model.setFocus(controlID);
  717. return false;
  718. }
  719. }
  720. }
  721. return true;
  722. }
  723. /************************************************************************************************
  724. 함수명 : isRequiredGroup ()
  725. 인자 :
  726. String groupID - 그룹 아이디
  727. 결과값 :
  728. 함수설명 : 그룹 차일드 입력 컨트롤들 중 @required="true" 필수값 체크
  729. * 주의) 입력 컨트롤 @required="true" 설정, 컨트롤이 아이디가 "ipt_01"일 경우 messageBox pMessage는 "cap_01" 캡션 컨트롤을 참조 함.
  730. ************************************************************************************************
  731. 작 성 자 : 김 기용
  732. 작 성 일 : 2007. 02. 06
  733. ************************************************************************************************/
  734. function isRequiredGroup(groupID){
  735. var groupObj = document.controls(groupID);
  736. var childID, captionID;
  737. var childObj, captionObj;
  738. for(var i=0; i<groupObj.children.length; i++) {
  739. childObj = groupObj.children.item(i)
  740. if(childObj.elementName == "xforms:input" || childObj.elementName == "xforms:secret" || childObj.elementName == "xforms:textarea" || childObj.elementName == "xforms:select" || childObj.elementName == "xforms:select1") {
  741. if(childObj.attribute("_required") == "true") {
  742. if(childObj.value == "") {
  743. childID = childObj.attribute("id");
  744. captionID = childID.replace(childID.substr(0, 3), "cap");
  745. captionObj = document.controls(captionID);
  746. if(captionObj != null) { // 캡션 컨트롤 유무 여부
  747. var captionLabel = captionObj.label;
  748. if(captionLabel.indexOf(":") == captionLabel.length - 1) {
  749. captionLabel = captionLabel.substr(0, captionLabel.length - 1);
  750. }
  751. messageBox(captionLabel, "I003");
  752. }
  753. else
  754. messageBox("", "I003");
  755. model.setFocus(childID);
  756. return false;
  757. }
  758. }
  759. }
  760. }
  761. return true;
  762. }
  763. /************************************************************************************************
  764. 함수명 : isXPathTextNull ()
  765. 인자 :
  766. String xPath - XPath
  767. 결과값 : true or false
  768. 함수설명 : XPath의 Text(Value)값이 ""인지 체크한다.
  769. ************************************************************************************************
  770. 작 성 자 : 김 기용
  771. 작 성 일 : 2007. 02. 06
  772. ************************************************************************************************/
  773. function isXPathTextNull(xPath) {
  774. var node = instance1.selectSingleNode(xPath);
  775. if( node != null ) {
  776. if( node.text == "" ) {
  777. return true;
  778. }
  779. else
  780. return false;
  781. }
  782. else
  783. return false;
  784. }
  785. /************************************************************************************************
  786. 함수명 : inputEnterKey ()
  787. 인자 :
  788. String controlID - 컨트롤 아이디
  789. String dispatchEvent - 컨트롤 Dispatch 이벤트 명
  790. String mask - 제거할 마스크 문자
  791. 결과값 :
  792. 함수설명 : 인풋에 Enter Key 입력시 controlID에 Dispatch 이벤트 호출
  793. * 사용예) inputEnterKey("button1", "DOMActivate");
  794. ************************************************************************************************
  795. 작 성 자 : 김 기용
  796. 작 성 일 : 2007. 02. 09
  797. ************************************************************************************************/
  798. function inputEnterKey( controlID, dispatchEvent, mask ) {
  799. if(event.keyCode == "13") {
  800. // model.setFocus(controlID);
  801. setInputNodeCurText(mask); // 현재 인풋값 노드 반영
  802. var controlObj = document.controls(controlID);
  803. controlObj.dispatch(dispatchEvent);
  804. }
  805. }
  806. /************************************************************************************************
  807. 함수명 : openImageFileDialog ()
  808. 인자 :
  809. Integer maxBytes - 이미지 파일 제한 싸이즈(Byte)
  810. 결과값 : file Path or ""
  811. 함수설명 : 이미지 파일 선택 다이알로그를 띄운다. 선택한 파일의 크기를 제한하고 싶으면 최대치 byte를 인자로 준다.
  812. 선택한 파일 경로를 반환한다. 취소하였거나 파일크기가 최대치를 초과했을 경우 ""를 반환한다.
  813. ************************************************************************************************
  814. 작 성 자 : 김 형도
  815. 작 성 일 : 2007. 02. 23
  816. ************************************************************************************************/
  817. function openImageFileDialog(maxBytes) {
  818. var file = window.fileDialog("open","","false","","","All Files (*.*)|*.*|JPEG Files(*.jpg)|*.jpg|GIF Files(*.gif)|*.gif|BMP Files(*.bmp)|*.bmp");
  819. if (file != "" && maxBytes != null) { // 파일 크기 확인
  820. var fso = new ActiveXObject("Scripting.FileSystemObject");
  821. var f = fso.GetFile(file);
  822. if (f.size > maxBytes) {
  823. messageBox("파일 크기가 최대치("+(maxBytes/1024)+"K)를","E003");
  824. return "";
  825. }
  826. }
  827. return file;
  828. }
  829. /************************************************************************************************
  830. 함수명 : removeChildren ()
  831. 인자 :
  832. String destNodePath - 목적 노드 경로
  833. Object [destModel] - 목적 노드 모델
  834. 결과값 :
  835. 함수설명 : 경로의 노드를 삭제 후 동일 노드를 생성 한다.
  836. ************************************************************************************************
  837. 작 성 자 : 김 기용
  838. 작 성 일 : 2007. 03. 21
  839. ************************************************************************************************/
  840. function removeChildren( destNodePath, destModel ) {
  841. var modelObj;
  842. if( destModel == null ) {
  843. modelObj = model;
  844. }
  845. else
  846. modelObj = destModel;
  847. // 1
  848. /*
  849. modelObj.removenode(xPath);
  850. modelObj.makeNode(xPath);
  851. */
  852. // 2
  853. var node = modelObj.instance1.selectSingleNode(destNodePath);
  854. var childNodeList = node.childNodes;
  855. var childNode;
  856. while( childNode = childNodeList.nextNode() ) {
  857. node.removeChild( childNode );
  858. }
  859. }
  860. /************************************************************************************************
  861. 함수명 : removeMask ()
  862. 인자 :
  863. String mask - 제거할 마스크 문자
  864. 결과값 :
  865. 함수설명 : 스트링 객체의 해당 마스크 문자를 제거후 반환 한다.
  866. ************************************************************************************************
  867. 작 성 자 : 김 기용
  868. 작 성 일 : 2007. 05. 31
  869. ************************************************************************************************/
  870. String.prototype.removeMask = removeMask;
  871. function removeMask( mask ) {
  872. var tmp_this = this;
  873. while( tmp_this.indexOf(mask) > -1 ) {
  874. tmp_this = tmp_this.replace(mask, "");
  875. }
  876. return tmp_this;
  877. }
  878. /************************************************************************************************
  879. 함수명 : setFormUpdate ()
  880. 인자 :
  881. 결과값 :
  882. 함수설명 : gvFormUpdateYN 전역 변수 true 설정
  883. ************************************************************************************************
  884. 작 성 자 : 김 기용
  885. 작 성 일 : 2007. 04. 01
  886. ************************************************************************************************/
  887. function setFormUpdate() {
  888. gvFormUpdateYN = true;
  889. }
  890. /************************************************************************************************
  891. 함수명 : setGridColorPicker ()
  892. 인자 :
  893. String gridID - 그리드 아이디
  894. String xPath - 컬러 상태를 저장항 노드(디폴트로 그리드 노드셋 형제노드(cellState, rowStaye)에 저장됨)
  895. 결과값 :
  896. 함수설명 : 그리드의 Cell 또는 Row의 BackGround-Color 설정 Iviewer 생성 함수
  897. * xforms-ready :: setGridColorPicker();
  898. ************************************************************************************************
  899. 작 성 자 : 김 기용
  900. 작 성 일 : 2007. 01. 25
  901. ************************************************************************************************/
  902. /************************************************************************************************
  903. 함수명 : setImageRefInstance ()
  904. 인자 :
  905. String xPath - 노드 XPath
  906. 결과값 :
  907. 함수설명 : 이미지 컨트롤이 참조하는 ref 인스턴스 노드(xpath)의 type 속성을 "xsd:base64Binary"로 설정한다.
  908. ************************************************************************************************
  909. 작 성 자 : 김 형도
  910. 작 성 일 : 2007. 02. 23
  911. ************************************************************************************************/
  912. function setImageRefInstance(xpath) {
  913. var node = instance1.selectSingleNode(xpath);
  914. if( node == null )
  915. return;
  916. node.setattribute("type","xsd:base64Binary");
  917. }
  918. /************************************************************************************************
  919. 함수명 : setInputNodeCurText ()
  920. 인자 :
  921. String mask - 제거할 마스크 문자
  922. 결과값 :
  923. 함수설명 : 인풋에 ref 노드에 현재 label setValue
  924. * 참고) 인풋 컨트롤은 포커스아웃 시점에 노드에 값이 반영됨
  925. * 주의) ev:event="onkeyup"에 적용
  926. ************************************************************************************************
  927. 작 성 자 : 김 기용
  928. 작 성 일 : 2007. 02. 09
  929. ************************************************************************************************/
  930. function setInputNodeCurText( mask ) {
  931. var inputID = event.target;
  932. var inputObj = document.controls(inputID);
  933. var inputRef = inputObj.attribute("ref");
  934. if( mask == null )
  935. model.setValue(inputRef, inputObj.currentText);
  936. else
  937. model.setValue(inputRef, inputObj.currentText.removeMask(mask));
  938. inputObj.refresh();
  939. setFormUpdate();
  940. }
  941. /************************************************************************************************
  942. 함수명 : setCellStyle ()
  943. 인자 :
  944. String gridID - 그리드 아이디
  945. String styleFlag - 컬러 인덱스
  946. String data - 데이터 값
  947. Srting colRef - 비교할 컬럼 Ref
  948. String [control] - 조건 smaller | smallerThen | equal | biggerThen | bigger
  949. 결과값 :
  950. 함수설명 : 그리드 특정 컬럼값을 비교하여 Cell의 BackGround-Corol 변경
  951. * 사용예) setCellStyle("datagrid1", "1", "1", "b", "bigger");
  952. ************************************************************************************************
  953. 작 성 자 : 어 승옥
  954. 작 성 일 : 2007. 07. 28
  955. ************************************************************************************************/
  956. function setCellStyle( gridID , styleFlag , data , colRef , control ) {
  957. var style = new Array("#fcd2c1" , "#ffe79d" , "#f3e1bf" , "#7BE6B7" , "#b9e5fb" , "#f7a08b" , "#fec34d" , "#dec6a4" , "#c8e67b" , "#43c8f5", "#99cf16", "#e5f3c2" );
  958. var styleFlags = styleFlag.split("^");
  959. var datas = data.split("^");
  960. if( control == null || control == "" )
  961. control = "equal";
  962. var controls = control.split("^");
  963. gridObj = document.all(gridID);
  964. gridObj.backcoloralternate = "transparent";
  965. for( var j = 0 ; j < datas.length ; j++ ) {
  966. var dataValue = datas[j];
  967. var styleValue = style[styleFlags[j]];
  968. for( var i = gridObj.fixedRows ; i < gridObj.Rows ; i++ ) {
  969. if(controls[j] == null)
  970. controls[j] = "equal";
  971. switch( controls[j] ) {
  972. case "small":
  973. if( gridObj.valueMatrix(i , gridObj.colRef(colRef)) < dataValue ) {
  974. gridObj.cellStyle("background-color", i, gridObj.colRef(colRef)) = styleValue;
  975. }
  976. break;
  977. case "smallThen":
  978. if( gridObj.valueMatrix(i , gridObj.colRef(colRef)) <= dataValue ) {
  979. gridObj.cellStyle("background-color", i, gridObj.colRef(colRef)) = styleValue;
  980. }
  981. break;
  982. case "bigger":
  983. if( gridObj.valueMatrix(i , gridObj.colRef(colRef)) > dataValue ) {
  984. gridObj.cellStyle("background-color", i, gridObj.colRef(colRef)) = styleValue;
  985. }
  986. break;
  987. case "biggerThen":
  988. if( gridObj.valueMatrix(i , gridObj.colRef(colRef)) >= dataValue ) {
  989. gridObj.cellStyle("background-color", i, gridObj.colRef(colRef)) = styleValue;
  990. }
  991. break;
  992. case "notEqual":
  993. if( gridObj.valueMatrix(i , gridObj.colRef(colRef)) != dataValue ) {
  994. gridObj.cellStyle("background-color", i, gridObj.colRef(colRef)) = styleValue;
  995. }
  996. break;
  997. case "equal":
  998. if( gridObj.valueMatrix(i , gridObj.colRef(colRef)) == dataValue ) {
  999. gridObj.cellStyle("background-color", i, gridObj.colRef(colRef)) = styleValue;
  1000. }
  1001. break;
  1002. }
  1003. }
  1004. }
  1005. }
  1006. /************************************************************************************************
  1007. 함수명 : setRowStyle ()
  1008. 인자 :
  1009. String gridID - 그리드 아이디
  1010. String styleFlag - 컬러 인덱스
  1011. String data - 데이터 값
  1012. Srting colRef - 비교할 컬럼 Ref
  1013. String [control] - 조건 smaller | smallerThen | equal | biggerThen | bigger
  1014. 결과값 :
  1015. 함수설명 : 그리드 특정 컬럼값을 비교하여 로우 백컬러 변경
  1016. * 사용예) setRowStyle("datagrid1", "1", "1", "b", "bigger");
  1017. ************************************************************************************************
  1018. 작 성 자 : 어 승옥
  1019. 작 성 일 : 2006. 12. 01
  1020. ************************************************************************************************/
  1021. function setRowStyle( gridID , styleFlag , data , colRef , control ) {
  1022. var style = new Array("#fcd2c1" , "#ffe79d" , "#f3e1bf" , "#7BE6B7" , "#b9e5fb" , "#f7a08b" , "#fec34d" , "#dec6a4" , "#c8e67b" , "#43c8f5", "#99cf16", "#e5f3c2" ,"#fd97b7", "#99ccff", "#ffff99", "#ccffcc");
  1023. var styleFlags = styleFlag.split("^");
  1024. var datas = data.split("^");
  1025. if( control == null || control == "" )
  1026. control = "equal";
  1027. var controls = control.split("^");
  1028. gridObj = document.all(gridID);
  1029. gridObj.backcoloralternate = "transparent";
  1030. for( var j = 0 ; j < datas.length ; j++ ) {
  1031. var dataValue = datas[j];
  1032. var styleValue = style[styleFlags[j]];
  1033. for( var i = gridObj.fixedRows ; i < gridObj.Rows ; i++ ) {
  1034. if(controls[j] == null)
  1035. controls[j] = "equal";
  1036. switch( controls[j] ) {
  1037. case "small":
  1038. if( gridObj.valueMatrix(i , gridObj.colRef(colRef)) < dataValue ) {
  1039. gridObj.rowstyle( i , "data" , "background-color" ) = styleValue;
  1040. }
  1041. break;
  1042. case "smallThen":
  1043. if( gridObj.valueMatrix(i , gridObj.colRef(colRef)) <= dataValue ) {
  1044. gridObj.rowstyle( i , "data" , "background-color" ) = styleValue;
  1045. }
  1046. break;
  1047. case "bigger":
  1048. if( gridObj.valueMatrix(i , gridObj.colRef(colRef)) > dataValue ) {
  1049. gridObj.rowstyle( i , "data" , "background-color" ) = styleValue;
  1050. }
  1051. break;
  1052. case "biggerThen":
  1053. if( gridObj.valueMatrix(i , gridObj.colRef(colRef)) >= dataValue ) {
  1054. gridObj.rowstyle( i , "data" , "background-color" ) = styleValue;
  1055. }
  1056. break;
  1057. case "notEqual":
  1058. if( gridObj.valueMatrix(i , gridObj.colRef(colRef)) != dataValue ) {
  1059. gridObj.rowstyle( i , "data" , "background-color" ) = styleValue;
  1060. }
  1061. break;
  1062. case "equal":
  1063. if( gridObj.valueMatrix(i , gridObj.colRef(colRef)) == dataValue ) {
  1064. gridObj.rowstyle( i , "data" , "background-color" ) = styleValue;
  1065. }
  1066. break;
  1067. }
  1068. }
  1069. }
  1070. }
  1071. /************************************************************************************************
  1072. 함수명 : initGridStyle ()
  1073. 인자 :
  1074. Object gridObj - 그리드 오브텍트
  1075. 결과값 :
  1076. 함수설명 : 그리드의 cell, row 스타일 초기화
  1077. ************************************************************************************************
  1078. 작 성 자 : 김선희
  1079. 작 성 일 : 2007. 10. 15
  1080. ************************************************************************************************/
  1081. function initGridStyle(gridID){
  1082. gridObj = document.all(gridID);
  1083. gridObj.rebuildStyle();
  1084. gridObj.backcoloralternate = "#f4f4f4";
  1085. }
  1086. /************************************************************************************************
  1087. 함수명 : setTree ()
  1088. 인자 :
  1089. Object gridObj - 그리드 오브텍트
  1090. Integer levelcol - Depth 컬럼 위치
  1091. Integer targetcol - 아웃라인 생성 컬럼 위치
  1092. Boolean collapsed - Expand 설정
  1093. Integer outlinebar - 아웃라인 형태 (0:트리구조로 보여지지 않음-일반컬럼)
  1094. (1:트리를 연결하는 선보이지 않음/박스보임)
  1095. (2:기본값-트리를 연결하는 선보임/박스보임)
  1096. (3:트리를 연결하는 선보이지 않음/하위노드가 없으면 박스 보이지 않)
  1097. (4:트리를 연결하는 선보임/하위노드가 없으면 박스 보이지 않음)
  1098. (5:트리를 연결하는 선보이지 않음/박스보이지 않음)
  1099. 결과값 :
  1100. 함수설명 : 아웃라인 옵션 추가 - 2008.04.25 by hoya
  1101. ************************************************************************************************
  1102. 작 성 자 : 어 승옥
  1103. 작 성 일 : 2006. 12. 01
  1104. ************************************************************************************************/
  1105. function setTree( gridObj, levelcol, targetcol, collapsed, outlinebar ) {
  1106. // 그리드 아웃라이바 초기화
  1107. //gridObj.outlinebar=0;
  1108. //tree 및 레벨설정
  1109. for(var i = gridObj.fixedRows; i < gridObj.rows; i++)
  1110. {
  1111. //gridObj.issubtotal(i) = true;
  1112. try {
  1113. gridObj.outlinelevel(i)=gridObj.valuematrix(i, levelcol); //인스턴스 levl 값임
  1114. } catch(e) {
  1115. }
  1116. }
  1117. // tree 대상 컬럼 및 형태 설정
  1118. gridObj.outlinecol=targetcol; //연결선이 표현되는 컬럼
  1119. if (outlinebar == "" || outlinebar == null) {
  1120. gridObj.outlinebar = 2;
  1121. } else {
  1122. gridObj.outlinebar=outlinebar; //연결선 형태 설정 (+ , - , 사각형 안보이게 하려면 0 으로 세팅)
  1123. }
  1124. gridObj.treecolor="#948777"
  1125. // 자식 트리 접기
  1126. if(collapsed != null) {
  1127. setCollapsed(gridObj, collapsed);
  1128. }
  1129. }
  1130. /************************************************************************************************
  1131. 함수명 : setCollapsed ()
  1132. 인자 :
  1133. Object gridObj - 그리드 오브텍트
  1134. Boolean collapsed - Expand 설정
  1135. 결과값 :
  1136. 함수설명 :
  1137. ************************************************************************************************
  1138. 작 성 자 : 김 기용
  1139. 작 성 일 : 2007. 07. 24
  1140. ************************************************************************************************/
  1141. function setCollapsed( gridObj, collapsed ) {
  1142. for(var i = gridObj.fixedrows; i <gridObj.rows; i++)
  1143. {
  1144. gridObj.iscollapsed(i)=collapsed; //자식 트리 접기
  1145. }
  1146. }
  1147. /**
  1148. * @desc : nodelist sort
  1149. * @return :
  1150. */
  1151. // param1 : 노드리스트 XPath
  1152. // param2 : 기준 컬럼 Ref
  1153. // [param3]: 오른차순 내림차순 mode
  1154. // 예) sortNodeList("/root/main/grid01/row", "a", "asc");
  1155. function sortNodeList( nodeset, trgRef, mode ) {
  1156. var nodesetCnt = model.getXPathValue("count(" + nodeset + ")");
  1157. if( nodesetCnt == 0 )
  1158. return;
  1159. var tmpValue_01, tmpValue_02;
  1160. var tmpIndex;
  1161. var i, j;
  1162. for( i = 1; i <= nodesetCnt; i++ ) {
  1163. tmpIndex = i;
  1164. for( j = i + 1; j <= nodesetCnt; j++ ) {
  1165. tmpValue_01 = model.getValue(nodeset + "[" + i + "]/" + trgRef);
  1166. tmpValue_02 = model.getValue(nodeset + "[" + j + "]/" + trgRef);
  1167. switch(mode) {
  1168. case "desc":
  1169. if( tmpValue_01 < tmpValue_02 ) {
  1170. tmpIndex = j;
  1171. }
  1172. break;
  1173. default :
  1174. if( tmpValue_01 > tmpValue_02 ) {
  1175. tmpIndex = j;
  1176. }
  1177. break;
  1178. }
  1179. if( i != tmpIndex ) {
  1180. model.duplicate(instance1.selectSingleNode(nodeset).parentNode, nodeset + "[" + tmpIndex + "]", "*[" + i + "]");
  1181. model.removenode(nodeset + "[" + ( tmpIndex + 1 ) + "]");
  1182. tmpIndex = i;
  1183. }
  1184. }
  1185. }
  1186. }
  1187. //===============================================================================================
  1188. // 전역 변수
  1189. //===============================================================================================
  1190. var gvFormUpdateYN = false; // xforms_value_changed 관련 boolen 변수
  1191. //===============================================================================================
  1192. // onaftersort
  1193. //===============================================================================================
  1194. function onaftersort() {
  1195. var gridObj = document.controls.item(event.target);
  1196. var gridSelMode = gridObj.selectionMode;
  1197. var smallistNum, tempNum;
  1198. var i;
  1199. if( gridSelMode != "free" && gridSelMode != "bycol" ) {
  1200. // sorting selectedRow 기능개선후 적용
  1201. gridObj.topRow = gridObj.selectedRow(0);
  1202. // 임시
  1203. /*
  1204. smallistNum = gridObj.selectedRow(0);
  1205. for( i = 1; i < gridObj.selectedRows; i++ ) {
  1206. tempNum = gridObj.selectedRow(i);
  1207. if( smallistNum > tempNum )
  1208. smallistNum = tempNum;
  1209. }
  1210. gridObj.topRow = smallistNum + gridObj.fixedRows - 1;
  1211. */
  1212. }
  1213. else {
  1214. // sorting selecteCells 기능개선후 적용
  1215. if(gridObj.selectedCells.length > 0) {
  1216. gridObj.topRow = gridObj.selectedCells.item(0).row;
  1217. }
  1218. // 임시
  1219. //smallistNum = gridObj.selectedCells.item(0).row;
  1220. //for( i = 1; i < gridObj.selectedCells.length; i++ ) {
  1221. // tempNum = gridObj.selectedCells.item(i).row;
  1222. // if( smallistNum > tempNum )
  1223. // smallistNum = tempNum + gridObj.fixedRows - 1;
  1224. //}
  1225. //gridObj.topRow = smallistNum;
  1226. }
  1227. // event.stopPropagation();
  1228. }
  1229. //===============================================================================================
  1230. // onkeypress
  1231. //===============================================================================================
  1232. function onkeypress(){
  1233. var ctrlObj = event.ptarget;
  1234. // 2007-09-18 : multilinegrid일 경우 처리
  1235. var pGridObj = ctrlObj.parent;
  1236. if(pGridObj.elementName == "xforms:multilinegrid" || pGridObj.elementName == "xforms:row")
  1237. return;
  1238. if(ctrlObj.elementName == "xforms:input") {
  1239. input_onkeypress(ctrlObj);
  1240. }
  1241. // 2007-02-07 추가 : Cell이 editmode 상태가 아닐경우 처리
  1242. else if(ctrlObj.elementName == "xforms:col") {
  1243. // alert(pGridObj.colAttribute(pGridObj.col, "type") == "inputbutton");
  1244. if(pGridObj.colAttribute(pGridObj.col, "type") == "input" || pGridObj.colAttribute(pGridObj.col, "type") == "inputbutton")
  1245. grid_onkeypress(event.ptarget);
  1246. }
  1247. else if(ctrlObj.elementName == "xforms:gridinput") {
  1248. grid_onkeypress(event.ptarget);
  1249. }
  1250. //문자열convert(대소문자)
  1251. //toConvertChar("keypress");
  1252. //onkeypress에 event.stopPropagation()이 있으면 입력이 안됨...
  1253. //event.stopPropagation();
  1254. }
  1255. function grid_onkeypress(ctrlObj) {
  1256. var pObj = ctrlObj.parent;
  1257. var charType = pObj.colAttribute (pObj.col, "_chartype");
  1258. if( charType == "upper") {
  1259. if(event.keyCode >= 97 && event.keyCode <= 122) {
  1260. event.keyCode = event.keyCode - 32;
  1261. }
  1262. }
  1263. else if( charType == "lower" ) {
  1264. if(event.keyCode >= 65 && event.keyCode <= 90) {
  1265. event.keyCode = event.keyCode + 32;
  1266. }
  1267. }
  1268. var inputMode = pObj.colAttribute (pObj.col, "_inputmode");
  1269. if( inputMode == "koreanOnly" ) {
  1270. // var pattern = new RegExp('[!-■]', 'i');
  1271. var pattern = new RegExp('[a-zA-Z]', 'i');
  1272. if (pattern.exec(String.fromCharCode(event.keyCode)) != null){//한글이 아니라면..
  1273. event.preventDefault();
  1274. }
  1275. }
  1276. }
  1277. function input_onkeypress(ctrlObj) {
  1278. if( ctrlObj.attribute("_chartype") == "upper") {
  1279. if(event.keyCode >= 97 && event.keyCode <= 122) {
  1280. event.keyCode = event.keyCode - 32;
  1281. }
  1282. }
  1283. else if( ctrlObj.attribute("_chartype") == "lower" ) {
  1284. if(event.keyCode >= 65 && event.keyCode <= 90) {
  1285. event.keyCode = event.keyCode + 32;
  1286. }
  1287. }
  1288. if( ctrlObj.attribute("_inputmode") == "koreanOnly" ) {
  1289. // var pattern = new RegExp('[!-■]', 'i');
  1290. var pattern = new RegExp('[a-zA-Z]', 'i');
  1291. if (pattern.exec(String.fromCharCode(event.keyCode)) != null){//한글이 아니라면..
  1292. event.preventDefault();
  1293. }
  1294. }
  1295. }
  1296. //===============================================================================================
  1297. // oncopy
  1298. // param1 - "value" | "" = 그리드상에 select 계열데이터가 존재할 경우 해당 select 데이터의 value를 저장(기본값)
  1299. // - "label" = 그리드상에 select 계열데이터가 존재할 경우 해당 select 데이터의 label을 저장
  1300. //===============================================================================================
  1301. function grid_oncopy(type) {
  1302. if (type == null || type == "") type = "value";
  1303. var trgObj = document.all.item(event.target);
  1304. if( trgObj.elementName == "xforms:datagrid" ) // event.target이 datagrid > input일 경우 return
  1305. gridObj = trgObj;
  1306. else
  1307. return;
  1308. var cellValue;
  1309. var rClipBoardValue = "";
  1310. var gridSelMode = gridObj.selectionMode;
  1311. // alert(gridSelMode);
  1312. // datagrid@selectionmode가 free일 경우
  1313. if( gridSelMode == "free" ) {
  1314. if( gridObj.selectedCells.length == 0 )
  1315. return;
  1316. var firstCell = getFirstCell(gridObj.selectedCells);
  1317. var lastCell = getLastCell(gridObj.selectedCells);
  1318. var i, j;
  1319. if (type == "value") {
  1320. for( i = firstCell.row; i <= lastCell.row; i++ ) {
  1321. for ( j = firstCell.col; j <= lastCell.col; j++ ) {
  1322. cellValue = gridObj.valueMatrix(i, j);
  1323. if( cellValue.indexOf("\n") != -1 )
  1324. cellValue = '"' + cellValue + '"';
  1325. rClipBoardValue += cellValue;
  1326. if( j != lastCell.col )
  1327. rClipBoardValue += "\t";
  1328. }
  1329. rClipBoardValue += "\r\n";
  1330. }
  1331. } else if (type == "label") {
  1332. for( i = firstCell.row; i <= lastCell.row; i++ ) {
  1333. for ( j = firstCell.col; j <= lastCell.col; j++ ) {
  1334. cellValue = gridObj.labelMatrix(i, j);
  1335. if( cellValue.indexOf("\n") != -1 )
  1336. cellValue = '"' + cellValue + '"';
  1337. rClipBoardValue += cellValue;
  1338. if( j != lastCell.col )
  1339. rClipBoardValue += "\t";
  1340. }
  1341. rClipBoardValue += "\r\n";
  1342. }
  1343. }
  1344. var setClipBoardFlag = true;
  1345. // selectedCells 갯수와 rClipBoardValue의 갯수 비교
  1346. var cntRClip = 0;
  1347. var cntRRow = rClipBoardValue.split("\r\n").length;
  1348. var cntRCol = rClipBoardValue.split("\r\n")[0].split("\t").length;
  1349. if( gridObj.selectedCells.length != ( cntRRow - 1 ) * cntRCol ) {
  1350. setClipBoardFlag = false;
  1351. }
  1352. // selectedCell이 firstCell부터 lastCell까지 속해있나 비교
  1353. for( i = 0; i < gridObj.selectedCells.length; i++ ) {
  1354. if( firstCell.row > gridObj.selectedCells.item(i).row || lastCell.row < gridObj.selectedCells.item(i).row ) {
  1355. setClipBoardFlag = false;
  1356. break;
  1357. }
  1358. if( firstCell.col > gridObj.selectedCells.item(i).col || lastCell.col < gridObj.selectedCells.item(i).col ) {
  1359. setClipBoardFlag = false;
  1360. break;
  1361. }
  1362. }
  1363. if( !setClipBoardFlag ) {
  1364. messageBox("다중 선택 범위에서는", "E001");
  1365. return;
  1366. }
  1367. }
  1368. // datagrid@selectionmode가 bycol일 경우
  1369. else if( gridSelMode == "bycol" ) {
  1370. if( gridObj.selectedCells.length == 0 )
  1371. return;
  1372. var firstCell = getFirstCell(gridObj.selectedCells);
  1373. var lastCell = getLastCell(gridObj.selectedCells);
  1374. var i, j;
  1375. if (type == "value") {
  1376. for( i = gridObj.fixedRows; i < gridObj.rows; i++ ) {
  1377. for ( j = firstCell.col; j <= lastCell.col; j++ ) {
  1378. cellValue = gridObj.valueMatrix(i, j);
  1379. if( cellValue.indexOf("\n") != -1 )
  1380. cellValue = '"' + cellValue + '"';
  1381. rClipBoardValue += cellValue;
  1382. if( j != lastCell.col )
  1383. rClipBoardValue += "\t";
  1384. }
  1385. rClipBoardValue += "\r\n";
  1386. }
  1387. } else if (type == "label") {
  1388. for( i = gridObj.fixedRows; i < gridObj.rows; i++ ) {
  1389. for ( j = firstCell.col; j <= lastCell.col; j++ ) {
  1390. cellValue = gridObj.labelMatrix(i, j);
  1391. if( cellValue.indexOf("\n") != -1 )
  1392. cellValue = '"' + cellValue + '"';
  1393. rClipBoardValue += cellValue;
  1394. if( j != lastCell.col )
  1395. rClipBoardValue += "\t";
  1396. }
  1397. rClipBoardValue += "\r\n";
  1398. }
  1399. }
  1400. }
  1401. // datagrid@selectionmode가 default이거나 byrow일 경우
  1402. else {
  1403. var gridCols = gridObj.Cols;
  1404. var selRow;
  1405. var i, j;
  1406. if (type == "value") {
  1407. for( i = 0; i < gridObj.selectedRows; i++ ) {
  1408. selRow = gridObj.selectedRow(i);
  1409. for ( j = gridObj.fixedCols; j < gridCols; j++ ) {
  1410. cellValue = gridObj.valueMatrix(selRow, j);
  1411. if( cellValue.indexOf("\n") != -1 )
  1412. cellValue = '"' + cellValue + '"';
  1413. rClipBoardValue += cellValue;
  1414. if( j != gridCols - 1 )
  1415. rClipBoardValue += "\t";
  1416. }
  1417. rClipBoardValue += "\r\n";
  1418. }
  1419. } else if (type == "label") {
  1420. for( i = 0; i < gridObj.selectedRows; i++ ) {
  1421. selRow = gridObj.selectedRow(i);
  1422. for ( j = gridObj.fixedCols; j < gridCols; j++ ) {
  1423. cellValue = gridObj.labelMatrix(selRow, j);
  1424. if( cellValue.indexOf("\n") != -1 )
  1425. cellValue = '"' + cellValue + '"';
  1426. rClipBoardValue += cellValue;
  1427. if( j != gridCols - 1 )
  1428. rClipBoardValue += "\t";
  1429. }
  1430. rClipBoardValue += "\r\n";
  1431. }
  1432. }
  1433. }
  1434. if( rClipBoardValue != "" )
  1435. window.clipBoardData = rClipBoardValue;
  1436. }
  1437. function getFirstCell( cellCollection ) {
  1438. var cntCell = cellCollection.length;
  1439. if( cntCell == 0 )
  1440. return null;
  1441. var curCell = null;
  1442. var tmpCell = cellCollection.item(0);
  1443. for( var i = 0; i < cntCell; i++ ) {
  1444. curCell = cellCollection.item(i);
  1445. if( curCell.row <= tmpCell.row ) {
  1446. if( curCell.col <= tmpCell.col ) {
  1447. tmpCell = curCell;
  1448. }
  1449. }
  1450. }
  1451. return tmpCell;
  1452. }
  1453. function getLastCell( cellCollection ) {
  1454. var cntCell = cellCollection.length;
  1455. if( cntCell == 0 )
  1456. return null;
  1457. var curCell = null;
  1458. var tmpCell = cellCollection.item(0);
  1459. for( var i = 0; i < cntCell; i++ ) {
  1460. curCell = cellCollection.item(i);
  1461. if( curCell.row >= tmpCell.row ) {
  1462. if( curCell.col >= tmpCell.col ) {
  1463. tmpCell = curCell;
  1464. }
  1465. }
  1466. }
  1467. return tmpCell;
  1468. }
  1469. /************************************************************************************************
  1470. 함수명 : initPopupMenu ()
  1471. 인자 :
  1472. 결과값 :
  1473. 함수설명 : 사용자 팝업 설정 초기화
  1474. * 주의) ev:event="DOMFOcusOut"에 적용
  1475. ************************************************************************************************/
  1476. function initPopupMenu() {
  1477. window.setPopupMenu(false);
  1478. }
  1479. /************************************************************************************************
  1480. 함수명 : setPopupMenu ()
  1481. 인자 :
  1482. String ctrlID - 해당 컨트롤 아이디
  1483. Boolean onmenuEvent - body에 onmenu이벤트 호출 여부(true|false)
  1484. String itemNodeset - 사용자 정의 팝업 아이템 구성 노드셋 XPath
  1485. String label - 아이템의 Label 구성 노드 이름
  1486. String value - 아이템의 Value 구성 노드 이름
  1487. 결과값 :
  1488. 함수설명 : 컨트롤에서 사용자 팝업 설정 함수
  1489. * 주의) ev:event="onmousedown"에 적용
  1490. ************************************************************************************************/
  1491. // DataGrid or TreeView or textarea
  1492. function setPopupMenu(ctrlID, onmenuEvent, itemNodeset, label, value) {
  1493. if(event.button == 3) {
  1494. if( itemNodeset == null )
  1495. itemNodeset = "/root/hidden/popupmenu/item";
  1496. if( label == null )
  1497. itemNodeset = "name";
  1498. if( value == null )
  1499. value = "func";
  1500. var ctrlObj = document.controls.item(ctrlID);
  1501. if( ctrlObj.elementName == "xforms:datagrid" ) {
  1502. if( ctrlObj.isCell(event.target) && ctrlObj.mouseRow >= ctrlObj.fixedrows ){
  1503. window.showPopupMenu(true);
  1504. window.setPopupMenu(true, itemNodeset, label, value, onmenuEvent);
  1505. }else{
  1506. initPopupMenu();
  1507. }
  1508. }else if( ctrlObj.elementName == "xforms:treeview" ) {
  1509. if( ctrlObj.isCell(event.target) ){
  1510. window.showPopupMenu(true);
  1511. window.setPopupMenu(true, itemNodeset, label, value, onmenuEvent);
  1512. }else{
  1513. initPopupMenu();
  1514. }
  1515. }else {
  1516. window.showPopupMenu(true);
  1517. window.setPopupMenu(true, itemNodeset, label, value, onmenuEvent);
  1518. }
  1519. }
  1520. }
  1521. //===============================================================================================
  1522. // onstartedit
  1523. //===============================================================================================
  1524. function onstartedit(){
  1525. var ctrlObj = event.ptarget;
  1526. if(ctrlObj.elementName == "xforms:datagrid") {
  1527. grid_onstartedit(ctrlObj);
  1528. }
  1529. }
  1530. function grid_onstartedit(ctrlObj)
  1531. {
  1532. // 그리드 col에 _key 를 검색함.
  1533. var colIndex = ctrlObj.col;
  1534. var _keyValue = ctrlObj.colAttribute(colIndex, "_key");
  1535. if(_keyValue == "true")
  1536. {
  1537. if( ctrlObj.rowStatus( ctrlObj.row ) != 3 && ctrlObj.rowStatus( ctrlObj.row ) != 1)
  1538. {
  1539. event.preventDefault();
  1540. return;
  1541. }
  1542. }
  1543. }
  1544. //===============================================================================================
  1545. // xforms-submit-done
  1546. //===============================================================================================
  1547. function xforms_submit_done() {
  1548. if( document.all(event.currentTarget).elementName == "xforms:model" ) {
  1549. event.stopPropagation();
  1550. return;
  1551. }
  1552. gvFormUpdateYN = false;
  1553. }
  1554. //===============================================================================================
  1555. // xforms-value-changed
  1556. //===============================================================================================
  1557. function xforms_value_changed() {
  1558. if( event.currentTarget == "document") {
  1559. event.stopPropagation();
  1560. return;
  1561. }
  1562. // alert(event.currentTarget + " :: setFormUpdate();");
  1563. setFormUpdate();
  1564. }