/**********************************************************************************
 * modular_ibsheet7.js
 * 
 * Udapsoft Modular 프레임워크와 IBSheet7간 연계를 위한 부분이 포함되어 있는 스크립트 파일
 * 시스템별로 통신방식 확장,전처리,후처리등 공통 기능 추가를 위해 이 파일을 기반으로 확장할수 있다.
 * 
 * @author 김선엽(sunyoupk@udapsoft.co.kr)
 **********************************************************************************/

Modular.view.IBSheet7 = function () {
};

Modular.view.IBSheet7.Constants = {
	//Request Param Key : Client Type
	CLIENT_TYPE : "modular.web.clientType",
		
	//Request Param Key : IBSheet Command Type (search or save)
	COMMAND_TYPE : "modular.web.ibsheet7.command",
	
	//Request Param Key : IBSheet Id
	SHEET_ID : "modular.web.ibsheet7.id",

	//Request Param Key : IBSheet 레코드 컬럼 순서
	RECORD_SET_COLUMNS : "modular.web.ibsheet7.columns",
		
	//Request Param Key : IBSheet 확장 프로퍼티
	EXTEND_PROPS : "modular.web.ibsheet7.extend",
		
	//Request Param Key : 현재 페이지 정보
	CURRENT_PAGE : "modular.condition.currentPage",
		
	//Request Param Key : 페이지당 건수 사이즈
	VOLUME_PER_PAGE : "modular.condition.volumePerPage",

	//MultiSheet Param 구분자
	MULTI_SHEET_PARAM_SEP : "^"
};

/**
 * IBSheet7 데이터를 조회하는 함수
 * 
 * @param sheet sheet 객체
 * @param url 로직을 처리하기위한 서버 URL
 * @param form 파라미터들을 가지고 있는 form 객체
 * @param onePageRow 페이지당 데이터 건수
 * @param extendProperties 확장 파라미터 문자열(ex. key1=value1,key2=value2...)
 */
Modular.view.IBSheet7.doSearch = function (sheet, url, form, onePageRow, extendProperties) {
	var params = {};
	//Modular 연계용 필수 파라미터 설정
	params[Modular.view.IBSheet7.Constants.CLIENT_TYPE] = "IBSHEET7";
	params[Modular.view.IBSheet7.Constants.COMMAND_TYPE] = "search";
	params[Modular.view.IBSheet7.Constants.SHEET_ID] = sheet.id;
	
	//Modular 연계용 컬럼 바인드 변수 설정
	var columnOrder = Modular.view.IBSheet7.getColumnStr(sheet);
	params[Modular.view.IBSheet7.Constants.RECORD_SET_COLUMNS] = columnOrder;
	
	params[Modular.view.IBSheet7.Constants.CURRENT_PAGE] = 1;
	params[Modular.view.IBSheet7.Constants.VOLUME_PER_PAGE] = onePageRow;	
	
	//Modular 연계용 확장 파라미터 설정
	if(extendProperties) {
		params[Modular.view.IBSheet7.Constants.EXTEND_PROPS] = extendProperties;
	}	
	
	if(form) {
		Modular.view.Form.bindSearchParameters(form);
		jQuery(form).find(":input").each(function () {
			var target = jQuery(this);
			if (target.attr("name")) {
				params[target.attr("name")] = target.val();
			}
		});
	}
	params = jQuery.param(params);
	
	sheet.Redraw = false;
	sheet.DoSearch(url, params);
	
//	var sXml = sheet.GetSearchData(url, params);
//	alert(sXml);
//	sheet.LoadSearchData(sXml);
	
	sheet.Redraw = true;
};

/**
 * IBSheet7 데이터를 조회하는 함수
 * 
 * @param sheet sheet 객체
 * @param url 로직을 처리하기위한 서버 URL
 * @param form 파라미터들을 가지고 있는 form 객체
 * @param onePageRow 페이지당 데이터 건수 
 * @param extendProperties 확장 파라미터 문Modular자열(ex. key1=value1,key2=value2...)
 */
Modular.view.IBSheet7.doSearchPaging = function (sheet, url, form, onePageRow, extendProperties) {
	var isAppend = false; //스크롤 페이징의 경우 데이터가 계속 append된다.
	
	var params = {};
	//Modular 연계용 필수 파라미터 설정
	params[Modular.view.IBSheet7.Constants.CLIENT_TYPE] = "IBSHEET7";
	params[Modular.view.IBSheet7.Constants.COMMAND_TYPE] = "search";
	params[Modular.view.IBSheet7.Constants.SHEET_ID] = sheet.id;
	
	//Modular 연계용 컬럼 바인드 변수 설정
	var columnOrder = Modular.view.IBSheet7.getColumnStr(sheet);
	params[Modular.view.IBSheet7.Constants.RECORD_SET_COLUMNS] = columnOrder;
	
	params[Modular.view.IBSheet7.Constants.VOLUME_PER_PAGE] = onePageRow;	
	
	//Modular 연계용 확장 파라미터 설정
	if(extendProperties) {
		params[Modular.view.IBSheet7.Constants.EXTEND_PROPS] = extendProperties;
	}	
	
	if(form) {
		Modular.view.Form.bindSearchParameters(form);
		jQuery(form).find(":input").each(function () {
			var target = jQuery(this);
			if (target.attr("name")) {
				params[target.attr("name")] = target.val();
			}
		});
	}
	
	params = jQuery.param(params);
	
	var info = {"PageParam":Modular.view.IBSheet7.Constants.CURRENT_PAGE,"Param":params};
	
	sheet.Redraw = false;
	sheet.DoSearchPaging(url, info);
	sheet.Redraw = true;
};

/**
 * 복수의 IBSheet7 데이터를 일괄 조회하는 함수
 * 
 * @param sheetArray sheet 객체 배열
 * @param url 로직을 처리하기위한 서버 URL
 * @param form 파라미터들을 가지고 있는 form 객체
 * @param onePageRow 페이지당 데이터 건수 
 * @param extendProperties 확장 파라미터 문자열(ex. key1=value1,key2=value2...)
 */
Modular.view.IBSheet7.doMultiSearch = function (sheetArray, url, form, onePageRow, extendProperties) {
	//TODO sheetArray가 Array타입인지 체크 필요
	
	var params = {};
	//Modular 연계용 필수 파라미터 설정
	params[Modular.view.IBSheet7.Constants.CLIENT_TYPE] = "IBSHEET7";
	params[Modular.view.IBSheet7.Constants.COMMAND_TYPE] = "multiSearch";
	
	var sheetIds = "";
	jQuery.each(sheetArray, function(n, sheet) {
		sheetIds = sheetIds + sheet.id + Modular.view.IBSheet7.Constants.MULTI_SHEET_PARAM_SEP;
		params[sheet.id + "." + Modular.view.IBSheet7.Constants.RECORD_SET_COLUMNS] = Modular.view.IBSheet7.getColumnStr(sheet);
	});
	params[Modular.view.IBSheet7.Constants.SHEET_ID] = sheetIds;
	
	//Modular 연계용 페이징 변수 설정
	params[Modular.view.IBSheet7.Constants.VOLUME_PER_PAGE] = onePageRow;
	
	//Modular 연계용 확장 파라미터 설정
	if(extendProperties) {
		params[Modular.view.IBSheet7.Constants.EXTEND_PROPS] = extendProperties;
	}	
	
	if(form) {
		Modular.view.Form.bindSearchParameters(form);
		jQuery(form).find(":input").each(function () {
			var target = jQuery(this);
			if (target.attr("name")) {
				params[target.attr("name")] = target.val();
			}
		});
	}
	
	params = jQuery.param(params);		
		
	var sXml = sheetArray[0].GetSearchData(url, params);
	var arrXml = Modular.view.IBSheet7.parseSearchXml(sXml);	

	jQuery.each(sheetArray, function(n, sheet) {
		sheet.LoadSearchData(arrXml[n]);
	});
};

/**
 * IBSheet 데이터를 저장하는 함수
 * 
 * @param sheet sheet 객체
 * @param url 로직을 처리하기위한 서버 URL
 * @param form 파라미터들을 가지고 있는 form 객체
 * @param ajax 직접 호출 여부(기본값 false)
 * @return (Boolean) 저장 성공 여부
 */
Modular.view.IBSheet7.doSave = function (sheet, url, form, sString, ajaxCall) {
	var sheetArray = new Array(sheet);
	return Modular.view.IBSheet7.doMultiSave(sheetArray, url, form, sString, ajaxCall);
};

/**
 * 복수의 IBSheet 데이터를 일괄 저장하는 함수
 * 
 * @param sheetArray sheet 객체 배열
 * @param url 로직을 처리하기위한 서버 URL
 * @param form 파라미터들을 가지고 있는 form 객체
 * @param ajax 직접 호출 여부(기본값 false)
 */
Modular.view.IBSheet7.doMultiSave = function (sheetArray, url, form, sString, ajaxCall) {
	if (ajaxCall == null || ajaxCall == 'undefined') {
		ajaxCall = false;
	}
	
	if(sString == null || sString == 'undefined'){
		sString = false;
	}
	
	var params = {};  
	//Modular 연계용 필수 파라미터 설정
	params[Modular.view.IBSheet7.Constants.CLIENT_TYPE] = "IBSHEET7";
	params[Modular.view.IBSheet7.Constants.COMMAND_TYPE] = "multiSave";
	
	var sheetIds = "";
	jQuery.each(sheetArray, function(n, sheet) {
		sheetIds = sheetIds + sheet.id + Modular.view.IBSheet7.Constants.MULTI_SHEET_PARAM_SEP;
		params[ sheet.id + "." + Modular.view.IBSheet7.Constants.RECORD_SET_COLUMNS] = Modular.view.IBSheet7.getColumnStr(sheet);
	});
	params[Modular.view.IBSheet7.Constants.SHEET_ID] = sheetIds;

	//일반 form 파라미터 가 있는 경우 파라미터 추가
	if(form) {
		Modular.view.Form.bindSearchParameters(form);
		jQuery(form).find(":input").each(function () {
			var target = jQuery(this);
			
			//input type이 radio 인 경우 체크된 값만 넘어가도록 수정
			//2013-08-22 김선엽 추가
			//radio는 동일 이름으로 작성되기 때문에 한번만 체크하는 기능으로 개선 필요함
			
			if (target.attr("type") == "radio") {
				if (target.attr("name")) {
					params[target.attr("name")] = jQuery('input[name='+target.attr("name")+']:radio:checked').val();
				}
			} else {
				
				if (target.attr("name")) {
					params[target.attr("name")] = target.val();
				}
			}
		});
	}
	
	//Sheet 저장 파라미터 설정
	var sheetParamString = "";
	var sheetData = "";
	jQuery.each(sheetArray, function(n, sheet) {
		if (sString) {
			sheetData = sheet.GetSaveString(true);
		} else {
			sheetData = sheet.GetSaveString();
		}
		var tempStr = sheetData.split("&");
		jQuery.each(tempStr, function(n, paramValue) {
			sheetParamString += sheet.id + "." + paramValue + "&";
		});		
	});
	
	// keyField 체크 오류 시 return
	// 2012-10-15 JSH 추가
	if (sheetData == "KeyFieldError") return false;
	
	var paramString = jQuery.param(params) + "&" + sheetParamString;
	
	if(ajaxCall) {
		//IBSheet API를 통하지 않고 직접 Ajax 방식으로 요청하는 경우
		Modular.view.IBSheet7.doAjaxSave(url, paramString);
	}
	else {
		var sXml = sheetArray[0].GetSaveData(url, paramString);
		
		//alert(sheetArray[0].id+" , "+sheetArray[0].GetSaveString());
		
		var arrXml = Modular.view.IBSheet7.parseSaveXml(sXml);
		
		if(jQuery.isArray(arrXml)) {
			jQuery.each(sheetArray, function(n, sheet) {
				sheet.LoadSaveData(arrXml[n]);
			});		
			return true;
		}
		else {
			return false;
		}
	}
};

/**
 * 해당 Sheet에 지정된 컬럼 이름을 ,로 구분되는 단일 문자열로 반환
 * ex) sStatus,userId,userName
 */
Modular.view.IBSheet7.getColumnStr = function(sheet) {

	var columnStr = ""; 			
	for(var i=0; i<=sheet.LastCol(); i++) {
		columnStr = columnStr + sheet.ColSaveName(i)+",";
	}

	if( columnStr.endsWith(",") ) {
		columnStr = columnStr.substring(0, columnStr.length -1);
	}

	return columnStr;
};

/**
 * 멀티 조회의 경우 SHEET별로 XML를 분리해서 반환해줌
 * @param sXml 조회 결과 XML
 * @return Array 조회 결과 XML Array
 */
Modular.view.IBSheet7.parseSearchXml = function(sXml) {
	var arrXml = new Array();

	for(i=0; sXml.indexOf("<SHEET>") >= 0; i++ ) {
		var stIdx = sXml.indexOf("<SHEET>");
		var endIdx = sXml.indexOf("</SHEET>")+8;		
		arrXml[i] = sXml.substring(stIdx, endIdx);
		sXml = sXml.substring(endIdx);
	}
	
	return arrXml;
};

/**
 * 멀티 저장의 경우 SHEET별로 XML를 분리해서 반환해줌
 * @param sXml 저장 결과 XML
 * @return Array 저장 결과 XML Array
 */
Modular.view.IBSheet7.parseSaveXml = function(sXml) {
	var arrXml = new Array();

	for(i=0; sXml.indexOf("<SHEET>") >= 0; i++ ) {
		var stIdx = sXml.indexOf("<SHEET>");
		var endIdx = sXml.indexOf("</SHEET>")+8;		
		arrXml[i] = sXml.substring(stIdx, endIdx);
		sXml = sXml.substring(endIdx);
	}
	
	return arrXml;
};

/**
 * 저장시 IBSHEET API를 거치지 않고 직접 Ajax통신을 통해
 * 서비스를 호출하고 json 형태로 응답을 받게됨.
 * (하위 구현으로 재구현 가능) 
 * @param url 서비스 url
 * @return paramString 저장 파라미터
 */
Modular.view.IBSheet7.doAjaxSave = function(url, paramString) {
	jQuery.ajax({
		async: false,
		type: "POST",
		url: url,
		data: paramString,
		dataType: "json",
		success: function(data) {
			// alert message
			if (data.message != undefined) {
				alert(data.message);
			}
		}
	});	
};
