	var ERROR_MESSAGE_SEPERATOR = "::";

	function getSaveFailedRow(IBSheetObjectID, statusColumn) {
		if (headerRowSize == null) headerRowSize = 1;
		if (IBSheetObjectID.RowCount == 0) return -1;
		for (var row = headerRowSize; row<=IBSheetObjectID.RowCount; row++) {
			if (IBSheetObjectID.CellValue(row, statusColumn) != "R") {
				//alert(row+"/"+IBSheetObjectID.CellValue(row, statusColumn));
				return row;
			}
		}
		return -1;
	}
	function alertMessage2(errorMessage) {
		if (isTransactionErrorMessage(errorMessage)) {
			alert(getMessageToken(errorMessage, 4));
			return getMessageToken(errorMessage, 1);
		} else {
			alert(errorMessage);
			return -1;
		}
	}
	
	function alertMessage(IBSheetObjectID, statusColumnIndex, errorMessage) {
		if (errorMessage == "") return -1;
		
		if (IBSheetObjectID == null) {
			return alertMessage2(errorMessage);
		}
		
		if (!isTransactionErrorMessage(errorMessage)) return alertGeneralErrorMessage(IBSheetObjectID, statusColumnIndex, errorMessage, 1);
		
		var errorHappendRow = getMessageToken(errorMessage, 1);
		if (errorHappendRow == "") return -1;
		errorHappendRow++;
		var errorCodeMessage = getMessageToken(errorMessage, 4);
		var focusRow = 0;
		
		for (var row=1; row<=IBSheetObjectID.RowCount; row++) {
//			if (IBSheetObjectID.CellValue(row, statusColumnIndex) != "R") {
			if (IBSheetObjectID.CellValue(row, statusColumnIndex) == "I" || IBSheetObjectID.CellValue(row, statusColumnIndex) == "U" ||IBSheetObjectID.CellValue(row, statusColumnIndex) == "D") {
				if (++focusRow == errorHappendRow) {
					alert(errorCodeMessage);
					IBSheetObjectID.SelectRow = row;
					alertErrorMessageWithData(errorCodeMessage, IBSheetObjectID, row);
					
					return row;
				}
			}
		}
		/*
		for (var row=headerRowSize; row<=IBSheetObjectID.RowCount; row++) {
			var sRow = mySheet.FindStatusRow(“U|D”);
			if (IBSheetObjectID.CellValue(row, statusColumnIndex) != "R") {
				if (++focusRow == errorHappendRow) {
					//alert(errorCodeMessage);
					IBSheetObjectID.SelectRow = row;
					alertErrorMessageWithData(errorCodeMessage, IBSheetObjectID, row);
					return row;
				}
			}
		}	
		*/
				
		return -1;
	}
	
	function isTransactionErrorMessage(errorMessage) {
		if (errorMessage.indexOf(ERROR_MESSAGE_SEPERATOR) == -1) return false;
		return true;
	}
	
	function alertGeneralErrorMessage(IBSheetObjectID, statusColumnIndex, errorMessage, headerRowSize) {
		for (var row=headerRowSize; row<=IBSheetObjectID.RowCount; row++) {
//			if (IBSheetObjectID.CellValue(row, statusColumnIndex) != "R") {

			if (IBSheetObjectID.CellValue(row, statusColumnIndex) == "I" || IBSheetObjectID.CellValue(row, statusColumnIndex) == "U" ||IBSheetObjectID.CellValue(row, statusColumnIndex) == "D") {
			       
				IBSheetObjectID.SelectRow = row;
				alertErrorMessageWithData(errorMessage, IBSheetObjectID, row);
				return row;
			}
		}
	}
	/**
	 * error message example
	 * [row]::[error code]::[status]::[message]
	 * 1::1::ORA-0001::젠장 에러다!!!
	 */
	function getFirstMessageToken(errorMessage) {
		if (errorMessage.indexOf(ERROR_MESSAGE_SEPERATOR) == -1) return errorMessage;
		return errorMessage.substring(0, errorMessage.indexOf(ERROR_MESSAGE_SEPERATOR));
	}
	
	function getMessageToken(errorMessage, tokenIndex) {
		var messageToken = errorMessage;
		while(tokenIndex-->1) {
			messageToken = messageToken.substring(messageToken.indexOf(ERROR_MESSAGE_SEPERATOR)+ERROR_MESSAGE_SEPERATOR.length);
		}
		return getFirstMessageToken(messageToken);
	}

	function alertErrorMessageWithData(errorMessage, IBSheetObjectID, errorRowIndex) {
		errorMessage += "\n";
		var maxColumnNameLength = 0;
		var columnSize = 0;
		for(;;columnSize++) {
			try {
				var columnName = IBSheetObjectID.CellValue(0,columnSize);
				if (columnName.length == 0) continue;
				if (columnName.length == "undefined") break;
				if (columnName.length > maxColumnNameLength) maxColumnNameLength = columnName.length;
			} catch(exception) {
				break;
			}
		}

		for (var columnIndex = 0; columnIndex <columnSize; columnIndex++) {
				var columnName = IBSheetObjectID.CellValue(0,columnIndex);
				if (columnName.length == 0) continue;
				errorMessage += "\n["+columnName+"]";
				for (var spaceSize=(maxColumnNameLength - columnName.length); spaceSize>0; spaceSize--) 
					errorMessage += "  ";
				errorMessage += "\t";
				errorMessage += "=["+IBSheetObjectID.CellText(errorRowIndex, columnIndex)+"]";
		}
		//alert(errorMessage);
		openErrorModalessDialog(errorMessage);
	}
	var errorModelessDialog;
	var errorModelessDialogErrorMessage;
	function openErrorModalessDialog(errorMessage) {
		if (errorModelessDialog != null && !errorModelessDialog.closed) {
			errorModelessDialog.showErrorMessage(errorMessage);
			errorModelessDialog.focus();
			return;
		}
		var xpos = ( screen.availWidth -  400  )/2 ; 
		var ypos = ( screen.availHeight - 400 )/2 ;  
		var windowStyle = "help:no;status:no;scroll:no;dialogTop:"+ypos+";dialogLeft:"+xpos+";dialogWidth:400px;dialogHeight:400px";
		errorModelessDialogErrorMessage = errorMessage;
			
		errorModelessDialog = window.showModelessDialog("/sys/js/alertMessage.jsp", window, windowStyle);
		errorModelessDialog.focus();

		/*
		var errorModelessDialogIsOpen = false;
		do {
			try {
				errorModelessDialog.showErrorMessage(errorMessage);
				errorModelessDialogIsOpen = true;
			} catch (EXCEPTION) {
			}
		} while(!errorModelessDialogIsOpen);
		*/
	}
	window.onunload = closeErrorModalessDialog;
	function closeErrorModalessDialog() {
		if (errorModelessDialog != null && !errorModelessDialog.closed) {
			errorModelessDialog.close();
			//modelessDialog = null;
			window.focus();
		}
	}

