﻿/** 
* @fileoverview
* 일반적으로 사용되는 값과 참조 데이터 형식,
* 이벤트와 이벤트 처리기, 인터페이스, 특성 및 처리 예외 등을 정의하는 기본 클래스가 포함됩니다.
* 다른 클래스에서는 데이터 형식 변환, 메서드 매개 변수 조작, 수학적 처리,
* 원격 및 로컬 프로그램 호출, 응용 프로그램 환경 관리 및 관리되는 응용 프로그램과
* 관리되지 않는 응용 프로그램의 감독 등을 지원하는 서비스를 제공합니다.
* @author sejeon
* @version 0.1 
*/

/**
* @class 프레임웍을 위한 공통 기능을 수행하는 클래스 입니다.
* @constructor
*/
function System() {
}

/**
* JavaScript Framework의 root 경로 입니다.
*/
System.rootPath = "http://script.auction.co.kr";

/**
* JavaScript Framework의 버전 정보 입니다.
*/
System.version = "0.1";

/**
* @private
*/
if(typeof(javascriptLoader) == "undefined")
	javascriptLoader = new JavaScriptLoader();

System.javaScriptLoader = javascriptLoader;

/**
* JavaScript Framework의 module을 로딩합니다.
* 클래스를 사용하기 위해서는 이 메서드를 호출하여 클래스가 속한 모듈을 먼저 로딩해야 합니다.
* @param {String} moduleName 모듈 이름
*/
System.loadModule = function (moduleName) {
	System.javaScriptLoader.loadModule(moduleName);
}

/**
* JavaScript Framework의 파일이 아닌 다른 위치의 JavaScript 정의 파일을 로드하는 기능을 수행합니다.
* @param {String} url 파일 경로
*/
System.loadFile = function (url, id) {
	System.javaScriptLoader.loadFile(url, id);
}

/**
* @class JavaScript 파일을 읽고 관리하는 기능을 수행하는 클래스 입니다.
* @constructor
*/
function JavaScriptLoader() {
	var loadedFiles = new Array();

	/**
	* JavaScript Framework의 module을 로딩합니다.
	* 클래스를 사용하기 위해서는 이 메서드를 호출하여 클래스가 속한 모듈을 먼저 로딩해야 합니다.
	* @param {String} moduleName 모듈 이름
	*/
	this.loadModule = function (moduleName) {
		this.loadFile(System.rootPath + "/" + moduleName + ".js");
	}


	/**
	* JavaScript Framework의 파일이 아닌 다른 위치의 JavaScript 정의 파일을 로드하는 기능을 수행합니다.
	* @param {String} url 파일 경로
	*/
	this.loadFile = function (url, id) {
		if (!url) throw new "Arguement is null.";
		if (loadedFiles[url]) return;
		loadedFiles[url] = true;
		if(id == null)
			document.write("<script type=\"text/javascript\" src=\"" + url + "\"></script>");
		else if(document.getElementById(id) == null)
			document.write("<script type=\"text/javascript\" src=\"" + url + "\" id=\"" + id + "\"></script>");
	}
}

/**
* @class 화폐형식을 표현하는 클래스 입니다.
* @constructor
* @param {Number} amount 금액
*/
function Money(amount) {

	var arrKor1 = new Array("영", "일", "이", "삼", "사", "오", "육", "칠", "팔", "구");
	var arrKor2 = new Array("일",  "만",  "억",  "조");
	var arrKor3 = new Array("일", "십",  "백",  "천");
	var delimiter = " ";

	if (isNaN(amount)) throw "amount는 정수값이어야 합니다.";
	var amount = amount;

	/**
	* 금액을 반환합니다.
	* @return 금액
	* @type Number
	*/
	this.getAmount = function () {
		return amount;
	}
	
	/**
	* 숫자값을 원화 기준으로 포매팅된 문자열을 반환합니다.
	* @return 원화기준으로 포매팅된 문자열
	* @type String
	*/
	this.toCurrencyString = function () {
		var bPos = 0;
		var sPos = 0;
		var isStart = false;
		var appendFF = false;
		var amountString = new String(amount);
		var reversedCurrenyString = "";
		for (var i = amountString.length - 1; i >= 0; i--) {
			var digit = parseInt(amountString.substring(i, i + 1));
			if (digit != 0) {
				if (bPos != 0 && sPos == 0) {
					if (isStart) reversedCurrenyString += delimiter;
					reversedCurrenyString += arrKor2[bPos];
					appendFF = false;
				}
				if (bPos != 0 && appendFF) {
					if (isStart) reversedCurrenyString += delimiter;
					reversedCurrenyString += arrKor2[bPos];
					appendFF = false;
				}
				if (sPos!=0) reversedCurrenyString += arrKor3[sPos];
				reversedCurrenyString += arrKor1[digit];
				isStart = true;
			}
			else if (sPos == 0 && bPos != 0) appendFF = true;
			sPos++;
			if (sPos%4 == 0) {
				sPos = 0;
				bPos++;
				if (bPos >= 4) return "(범위초과)";
			}
		}
		if (isStart == false) reversedCurrenyString += "영";
		
		return reverse(reversedCurrenyString) + " 원";
	}
	
	/**
	* @private
	*/
	function reverse(text) {
		var ret = "";
		for(var i = text.length - 1; i >= 0; i--) {
			ret += text.charAt(i);
		}
		return ret;
	}
}
/**
* @class 날짜 형식의 값을 해당하는 문자열 표현으로 변환합니다.
* @constructor
*/
function DateFormatter() {
}
/**
* 지정된 형식을 사용하여 Date개체를 문자열 표현으로 변환합니다.
* @param {Date} val 날짜
* @param {Number} format 형식
* 가능한 format형식은 .NET Framework의 System.Globalization.DateTimeFormatInfo 속성에 대한 표준 형식 입니다.
* @return 문자열 표현
* @type String
*/
DateFormatter.toString = function (val, format) {
	if (!val || !format) throw "Argument null exception";
	var year = val.getFullYear();
	var month = val.getMonth() + 1;
	var day = val.getDate();
	var hour = val.getHours();
	var min = val.getMinutes();
	var dayOfWeek = val.getDay();
	if (format == "d") {
		return year + "-" + month + "-" + day;
	}
	if (format == "MM/dd hh:ss") {
		month = month + "";
		if (month.length == 1) {
			month = "0" + month;
		}
		day = day + "";
		if (day.length == 1) {
			day = "0" + day;
		}
		hour = hour + "";
		if (hour.length == 1) {
			hour = "0" + hour;
		}
		min = min + "";
		if (min.length == 1) {
			min = "0" + min;
		}
		return month + "/" + day + " " + hour + ":" + min;
	}
	throw new "아직 구현되지 않았습니다.";	
}

/**
* 날짜영역을 지역 문자열 표현으로 변환합니다.
* @param {Date} val 날짜
* 가능한 format형식은 .NET Framework의 System.Globalization.DateTimeFormatInfo 속성에 대한 표준 형식 입니다.
* @return 문자열 표현
* @type String
*/
DateFormatter.toLocalDateString = function (val) {
	if (!val) throw "Argument null exception";
	var year = val.getFullYear();
	var month = val.getMonth() + 1;
	var day = val.getDate();
	return year + "년 " + month + "월 " + day + "일";
}

/**
* 요일을 문자열 표현으로 변환합니다.
* @param {Number} val 요일 (0~6)
* @param {bool} fullLength 자세한 요일 이름을 반환할지 여부
* @return 문자열 표현
* @type String
*/
DateFormatter.toDayOfWeekString = function (val, fullLength) {
	var ret = null;
	if (val == 0) ret = "일";
	else if (val == 1) ret = "월";
	else if (val == 2) ret = "화";
	else if (val == 3) ret = "수";
	else if (val == 4) ret = "목";
	else if (val == 5) ret = "금";
	else if (val == 6) ret = "토";
	return (fullLength) ? ret + "요일" : ret;
}

/**
* @class 기본 데이터 형식을 다른 데이터 형식으로 변환합니다.
* @constructor
*/
function Convert() {
}
/**
* 지정된 Number 값을 천단위별로 콤마(",")로 구분된 String 표현으로 변환합니다.
* @param {Number} val Number 값 입니다.
* @return 천단위별로 콤마(",")로 구분된 String 표현을 반환합니다.
* @type String
*/
Convert.numberToCommaSeparatedString = function (val) {
	if (isNaN(val)) throw "Argument val is not Number type.";
	var localeString = val.toLocaleString();
	return localeString.substring(0, localeString.indexOf("."));
}
/**
* 지정된 숫자의 String 표현을 해당하는 Number로 변환합니다.
* 변환시 String 표현 안의 숫자가 아닌 문자는 무시됩니다.
* @param {String} 변환할 숫자가 들어 있는 String 입니다.
* @return val의 값에 해당하는 Number를 반환합니다.
* @type Number
*/
Convert.stringToNumber = function (val) {
	if (typeof(val) != "string") val = new String(val);
	return new Number(val.replace(/[^\d]/g, ""));
}