/*================================================================================
* 공백 문자열 삭제 함수
* String().trim()				공백 문자를 삭제 한다.						prototype
* String().replaceAll()			문자열을 치환 한다.							prototype
* String().focus()				오브젝트에 포커싱							prototype
* String().range()				문자열의 길이를 리턴한다.						prototype
* String().isNumAlph()			숫자와 알파벳인지를 리턴한다.					prototype
* String().isNumber()			숫자 여부를 리턴한다.						prototype
* String().limitSpChar('허용할 특수문자','허용할 특수문자','허용할 특수문자')		prototype
						제한할 모든 문자를 arguments 로 작성한다.
*						특수문자를 체크 하여 허용할 특수 문자이외의 문자가 있다면 , true 리턴
						특수 문자가 없다면 , false 리턴
*						String().limitSpChar 	() 작성하지 않을경우 모든 특수문자 제한
* String().isCheckRadio()												prototype
* 								<s:radio key="info.name_noti" list="codeValue" cssClass="on" theme="simple"/>
* 								와 같이 라디오 jstl 을 사용하게되면 , 리스트 갯수 만큼 아이디가
* 								info_name_noti1 , info_name_noti2, info_name_noti3 과 같이 생성되는데 , 
* 								이 라디오가 체크 되어 있는지 체크 여부를 리턴한다.
* String().isNickName()			닉 네임 체커 
* 								영문자 , 숫자 ,  _ , - , @ , ! , : , ( , ) , $ 의 특수문자만 허용
================================================================================*/
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}

/**
* replace All
*/
String.prototype.replaceAll = function() {
	return this.split(arguments[0]).join(arguments[1]);
}

/**
* 문자열의 길이를 리턴한다.
*/
String.prototype.range = function() {
	var total = 0;
	for(var x=0; x<this.length; x++) {
		var tmp = this.charAt(x);
		if(escape(tmp).length > 4) total = total + 2;
		else total = total + 1;
	}
	return total;
}

/**
* 문자열의 길이를 리턴한다.
*/
function checkLen(str) 
{ 
    var len = str.length; 
    var han = 0; 
    var res = 0; 
     
    for(i=0;i<len;i++) { 
        var a=str.charCodeAt(i); 
        if(a>128) 
            han++; 
    } 
    res = (len-han) + (han*2); 
     
    return res; 
}

/**
* textarea의 글자수를 제한한다.
* maxSize를 초과할 경우 maxSize만큼 글자를 자른다.
* field : 글자가 입력되는 객체(document.getElementById('aaa'))
* maxSize : 최대 글자수(100)
* objFocus : 포커스를 임시로 줘야하는 input 태그. hidden 태그는 안됨(document.getElementById('bbb'))
* msg : msxSize가 넘을때 띄우는 메시지
*/
function checkByteLength(field, maxSize, objFocus, msg)
{	
	var temp;
	var len = 0;
	var strValue = "";
	var fLength = field.value.length;

	for(var i = 0; i < fLength; i++)
	{
		temp = field.value.charAt(i);
		
		len += charByteSize(temp);
		
		if(len > maxSize)
		{
			//objFocus.focus(); // 이건 꼭 해줘야 함. 왜 해줘야 하는지 궁금하면 빼고 테스트 해볼것. 이것 때문에 몇시간 고생했음.
			alert(msg);
			field.value = strValue;
			//field.focus();
			
			return;
		}
		else
		{
			strValue += temp;
		}
	}
} 

function checkCharLength(field, maxSize, objFocus, msg)
{	
	var temp;
	var len = 0;
	var strValue = "";
	var fLength = field.value.length;
	if(fLength > maxSize)
	{
		alert(msg);
		field.value = field.value.substr(0,maxSize);
		return;
	}else{
		
	}
}
 
function charByteSize(ch) 
{
       if (ch == null || ch.length == 0) 
       {
			return 0;
       }

       var charCode = ch.charCodeAt(0);

       if (charCode <= 0x00007F) {
         return 1;
       } else if (charCode <= 0x0007FF) {
         return 2;
       } else if (charCode <= 0x00FFFF) {
         return 3;
       } else {
         return 4;
       }
}

function stringByteSize(str) {
        if (str == null || str.length == 0) {
          return 0;
        }

        var size = 0;
        for (var i = 0; i < str.length; i++) {
          size += charByteSize(str.charAt(i));
        }

        return size;
}

function stringCharSize(str) {
        if (str == null || str.length == 0) {
          return 0;
        }

        var size = 0;
        size = str.length;

        return size;
}

/**
* null 체크 
*/
String.prototype.isnull = function() {
	if(this.replace(/ /gi,"") == "") {
		return true;
	}else return false;
}



/**
 * nick name 체크 
 * 영문자 
 * 숫자
 * 특수기호 : _ , - , ! , @ , : , ( , ) , $ 허용
 */
String.prototype.isNickName = function() {
	var reg = /[^a-zA-Z0-9_\-@!:()$]/i;
	return (!reg.test(this));
}
//영문자 체크 
String.prototype.isAlphbat = function() {
	var reg = /^[a-zA-Z]+$/;
	if(!reg.test(this)) {
		return false;
	}
	return true;
}

//영문자 , 숫자 체크 
String.prototype.isNumAlph = function() {
	var reg = /^[a-zA-Z0-9]+$/;
	if(!reg.test(this)) {
		return false;
	}
	return true;
}

//숫자 여부 체크 
//숫자 : true
//숫자 아닐 경우 ; falsel
String.prototype.isNumber = function() {
	var reg = /^[0-9]+$/;
	if(!reg.test(this)) {
		return false;
	}
	return true;
}

String.prototype.isInNumber = function() {
	this.num = ['1','2','3','4','5','6','7','8','9','0'];
	this.numCnt = 0;
	for(var x=0; x<this.length; x++) {
		for(var y=0; y<this.num.length; y++) {
			if(this.charAt(x) == this.num[y]) {
				this.numCnt++;
			}
		}
	}
	return this.numCnt;
}

//전화 번호 형식 체크
String.prototype.isPhone = function() {
    var reg = /^(\d+)$/;
    return reg.test(this)
}


//특수 문자 체크 
String.prototype.isSpChar = function() {
	this.special = ['~','`','!','@','#','$','%','^','&','*','(',')','_','-','+','=','|','\\','}',']','{','[','"','\'',':',';','?','/','>','.','<']; 
	this.spCnt = 0;

	for(var x=0; x<this.length; x++) {
		for(var y=0; y<this.special.length; y++) {
			if(this.charAt(x) == this.special[y])
				this.spCnt++;
		}
	}

	return this.spCnt;
}
String.prototype.limitSpChar = function() {
	var a_char = "";
	if(arguments.length > 0) {
		var sp_char = 0;
		var ex_cnt = 0;
		var extention = [];

		//예외를 제외한 모든 제한 특수 문자 목록
		for(var x=0; x<arguments.length; x++) {
			if(a_char != '') a_char += ',';
			a_char +=  '[' + arguments[x] + ']';
		}

		//모든 특수 문자가 있는지 체크
		for(var x=0; x<this.length; x++) {
			var ret = this.charCodeAt(x);
			if((ret >= 33 && ret <= 47) || (ret >= 58 && ret <= 64) ||
					(ret >= 91 && ret <= 96) || (ret >= 123 && ret <= 126)) {

				extention[ex_cnt] = this.charAt(x);
				ex_cnt++;

			}
		}

		//작성된 특수 문자 중 , 제한 특수 문자가 있는지 체크
		if(extention.length > 0) {
			for(var x=0; x<extention.length; x++) {
				for(var i=0; i<arguments.length; i++) {
					if(extention[x] == arguments[i]) sp_char++;
				}
			}
		}

		if(sp_char != extention.length) {
			return false;
		}else {
			return true;
		}
	}else { //모든 특수문자 제한
		var reg = /^[a-zA-Z0-9ㄱ-힣]+$/; 
		if(!reg.test(this.value)) {
			return false;
		}else {
			return true;
		}
	}
}

String.prototype.isCheckRadio = function() {
	var ischecked = false;
	var obj = document.getElementsByTagName('input');

	for(var x=0; x<obj.length; x++) {
		if(obj[x].type == 'radio') {
			if(this == obj[x].id.substring(0, (obj[x].id.length - 1))) {
			
				if(obj[x].checked || (obj[x].getAttribute('checked') == 'checked')) {
					ischecked = true;
				}
			}
		}
	}
	return ischecked;
}

String.prototype.isValidEmail = function() {
	var mailFilter = new RegExp('(^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*$)');

	if(this.isnull()) {
		return false;
	}

	if(!(this.limitSpChar('@','-','_','.'))) {
		return false;
	}

	if(!mailFilter.test(this)) {
		return false;
	}

	return true;
}
/*================================================================================
* @select box 년
*================================================================================*/
function getWriteYearLists() {
	var d = new Date();

	//var b = d.getFullYear() - 10;
	var b = 1900;
	var a = d.getFullYear();

	for(var x=b; x<=a; x++) {
		with(document) {
			writeln('<option value=' + x);
			if(arguments[0] != null && arguments[0] == x)
				writeln(' selected');
			writeln('>');
			writeln(x);
			writeln('</option>');
		}
	}
}
function getYearLists(){
	var d = new Date();

	//var b = d.getFullYear() - 10;
	var b = 1900;
	var a = d.getFullYear();
	
	var years = '';
	for(var x=b; x<=a; x++) {
		with(document) {
			years += ('<option value=' + x);
			if(arguments[0] != null && arguments[0] == x)
				years += (' selected');
			years += ('>');
			years += (x);
			years += ('</option>');
		}
	}
	return years;
}

function Js_RadioInit() {
	var isChecked = false;
	for(var x=0; x<arguments[0].length; x++) {
		if(arguments[0][x].checked) {
			isChecked = true;
			break;
		}
	}
	if(!isChecked) arguments[0][2].checked = true;
}



/*================================================================================
존재 하는 함수 여부
//alert(base.isFunc('function name..'));

특정 함수에 접근 하기/실행
//base.$(testfunc2)

특정 함수의 메서드에 접근 하기/실행
//base.$(testfunc).testAlert();

특정 함수의 변수에 접근 하기
//var fn = base.$(testfunc);
//alert('11 >>' + fn.var1);
//fn.var1 = '333';
//alert('22 >>' + fn.var1);

스케쥴
함수 실행하기
//base.schedules([testfunc2, testfunc3,testfunc3]);
//base.schedules([testfunc2,testfunc3]);
//base.jobs(0).run(0,0);

//스케쥴 타이머로 순차적으로 실행 하기.
//base.jobs().run(0,3000);
*================================================================================*/
/**
	function testfunc() {
		this.var1 = '111';
		this.testAlert = function() {
			alert('testfunc :: 11');
		}
		this.testAlert2 = function() {
			alert('testfunc :: 22');
		}
		this.testAlert3 = function() {
			alert('testfunc :: 33');
		}
	}
	function testfunc2() {
		var var2 = '222';
		alert('testfunc2');
	}
	function testfunc3() {
		var var2 = '333';
		alert('testfunc3');
	}
 */

function Base() {
	this.runIndex = 0;

	this.timeID = null;

	this.functions = null;
	this.funcsLists = [];

	this.methodCnt = 0;
	this.methods = new Object();
	this.funcItems = new Object();
	
	this.$ = function() {
		if(arguments[0] == null) return;
		try {
			this.functions = new arguments[0];
			for(var item in (this.functions)) {
				this.funcItems[item] = this.functions[item];
			}
		}catch(e) {
			return -1;
		}
		return this.funcItems;
	}
	this.schedules = function() {
		if(arguments[0].length > 0) {
			for(var x=0; x<arguments[0].length; x++) {
				this.methods[this.methodCnt++] = (arguments[0][x]);
			}
		}
		return;
	}
	this.jobs = function() {
		this.tmpFunctions = [];
		this.isJobs = false;
		try {
			this.index = 0;
			for(var item in (this.methods)) {
				if(typeof this.methods[item] == 'function') {
					this.index = item;
					this.isJobs = true;

					this.tmpFunctions[this.tmpFunctions.length] = 'base.$(' + this.methods[item] + ')';
				}
			}

			if(this.isJobs) {
				this.funcsLists = this.tmpFunctions;
				//this.run(arguments[0], 0);
			}
		}catch(e) {
			return -1;
		}
		return this;
	}
	this.run = function() {
		this.runIndex = parseInt(arguments[1]);
		if((this.runIndex) >= this.funcsLists.length) {
			clearTimeout(this.timeID);
			this.runIndex = 0;
			return;
		}
		eval(this.funcsLists[this.runIndex]);
		this.timeID = setTimeout('base.run(' + arguments[0] + ', ' + (this.runIndex + 1) + ');', parseInt(arguments[0]));
		return;
	}
	this.isFunc = function() {
		if(eval('window.' + arguments[0])) return true;
		else return false;
	}
}

var base = new Base();

/*================================================================================
* Browser Version
*================================================================================*/
function getNavigatorInfo() {
    var name = navigator.appName, ver = navigator.appVersion,
        ver_int = parseInt(navigator.appVersion), ua = navigator.userAgent, infostr;
    if(name == "Microsoft Internet Explorer")  {
        if(ver.indexOf("MSIE 3.0") != -1) return "Internet Explorer 3.0x";
        if(ver_int != 4) return "Internet Explorer " + ver.substring(0, ver.indexOf(" "));

        var real_ver = parseInt(ua.substring(ua.indexOf("MSIE ") + 5));
        if(real_ver >= 7) infostr = "Windows Internet Explorer ";
        else infostr = "Microsoft Internet Explorer ";

        if(ua.indexOf("MSIE 5.5") != -1) return infostr + "5.5";
        else return infostr + real_ver + ".x";

        return "Internet Explorer";
    }else if(name == "Netscape") {
        if(parseInt(ua.substring(8, 8)) <= 4)
          return "Netscape " + ver.substring(0, ver.indexOf(" "));
        else if(ua.lastIndexOf(" ") < ua.lastIndexOf("/"))
          return ua.substring(ua.lastIndexOf(" "));
        else return "Netscape";
    }
    else return name;
}
/*================================================================================
* @Cookie
* 쿠키 설정
* Js_SetCookie(cookieName,cookieValue)			쿠키 설정
* Js_GetCookie(cookieName)						쿠키 값을 가져온다.
* Js_ParseCokieValue(cookieName)				쿠키 값을 파싱 한다.
* Js_DelCookie(cookieName)						쿠키를 삭제 한다.
*================================================================================*/
function J_Cookie() {
	this.day = 7;
	this.set = function() {
		if(arguments[2] != null) this.day = arguments[2];
		else this.day = 7;
		this.expires = new Date();
		if(arguments[2] == null) {
			this.expires.setTime(this.expires.getTime() + (this.day * 24 * 60 * 60 * 1000));//7일간 저장 한다.
			var expires = "; expires=" + this.expires.toGMTString();
		}else {
			this.expires.setTime(this.expires.getTime() + ((-1) * 24 * 60 * 60 * 1000));
			var expires = "; expires=" + this.expires.toGMTString();
		}
		document.cookie = arguments[0] + "=" + arguments[1] + expires + "; path=/";
		return;
	}
	this.get = function() {
		this.cookieValue = null;
		this.posName = document.cookie.indexOf(escape(arguments[0]) + '=');

		if (this.posName != -1) {
			var posValue = this.posName + (escape(arguments[0]) + '=').length;
			var endPos = document.cookie.indexOf(';', posValue);
			
			if (endPos != -1)
				this.cookieValue = unescape(document.cookie.substring(posValue, endPos));
			else
				this.cookieValue = unescape(document.cookie.substring(posValue));
		}
		return this.cookieValue;
	}
	this.del = function() {
		this.set(arguments[0], "", -1);
		return;
	}
}
var cookie = new J_Cookie();

/**
*
* @author hooriza at nhncorp.com
* @version 0.1
*
* @created Nov.8.2007.
*/

var Observe = function(oEl) {
  this._o = oEl;
  this._value = oEl.value;

  this._bindEvents();
};

Observe.prototype._bindEvents = function() {
  var self = this;
  var bind = function(oEl, sEvent, pHandler) {
    if (oEl.attachEvent) oEl.attachEvent('on' + sEvent, pHandler);
    else oEl.addEventListener(sEvent, pHandler, false);
  };

  bind(this._o, 'focus', function() {
    if (self._timer) clearInterval(self._timer);
    self._timer = setInterval(function() {

      // window.console.debug('compare : ' + self._value + ' == ' + self._o.value);
      if (self._value != self._o.value) {
        self._value = self._o.value;
        self._fireEvent();
      }
    }, 50);
  });

  bind(this._o, 'blur', function() {
    if (self._timer) clearInterval(self._timer);
    self._timer = null;
  });
};

Observe.prototype._fireEvent = function() {
  if (document.createEvent) {
    var e;
    if (window.KeyEvent) {

      e = document.createEvent('KeyEvents');
      e.initKeyEvent('keyup', true, true, window, false, false, false, false, 65, 0);
    } else {
      e = document.createEvent('UIEvents');
      e.initUIEvent('keyup', true, true, window, 1);
      e.keyCode = 65;
    }
    this._o.dispatchEvent(e);
  } else {
    var e = document.createEventObject();
    e.keyCode = 65;
    this._o.fireEvent('onkeyup', e);
  }
};


if(typeof(FormUtil) != "object"){			FormUtil			= {};	}
if(typeof(FormUtil.checkbox) != "object"){	FormUtil.checkbox	= {};	}


/**
 * 모든 체크박스를 체크 or 언체크
 * 1 : 폼네임
 * 2 : 체크할 checkbox 네임(배열)
 * 3 : 컨트롤할 checkbox 네임
 */
FormUtil.checkbox.checkAll =  function() {
	var formName = arguments[0];
	var checkboxName = arguments[1];
	var mainCheckboxName = arguments[2];

	if (document.forms[formName].elements[checkboxName] == null) {
		return;
	}



	var length = document.forms[formName].elements[checkboxName].length;
	var objCheck = document.forms[formName].elements[checkboxName];
	var objMainCheckbox = document.forms[formName].elements[mainCheckboxName];
	var checked = objMainCheckbox.checked;

	if (length > 0) {
		for (var i = 0; i < length; i++) {
			objCheck[i].checked = checked;
		}
	} else {
		objCheck.checked = checked;
	}
}

FormUtil.checkbox.isChecked =  function() {
	var formName = arguments[0];
	var checkboxName = arguments[1];

	if (document.forms[formName].elements[checkboxName] == null) {
		return false;
	}

	var length = document.forms[formName].elements[checkboxName].length;
	var objCheck = document.forms[formName].elements[checkboxName];
	

	if (length > 0) {
		for (var i = 0; i < length; i++) {
			if (objCheck[i].checked) {
				return true;
			}
		}
	} else {
		if (objCheck.checked) {
			return true;
		}
	}

	return false;
}

function openLicensePopup()
{
	var x = (screen.availWidth - 450) / 2;
 	var y = (screen.availHeight - 400) / 2;
 	
	window.open('/contents/favorites!openLicensePopup.do','popup','width=460,height=400,left=' + x + ',top=' + y + ',scrollbars=no,resizable=no,status=no');
}

function showPrintPopup(seq)
{
	//var url = "";
 	//url = url + "tid=<c:out value="${contents.memNo}"/>&";
    //url = url + "contentSeq=<c:out value="${contents.contentSeq}"/>&";
    //url = url + "contentType=<c:out value="${contents.contentType}"/>&";
    //url = url + "categorySeq=<c:out value="${contents.categorySeq}"/>&";
    var x = (screen.availWidth - 762) / 2;
 	var y = (screen.availHeight - 500) / 2;
                
	window.open('/contents/contents!showPrintPopup.do?contentSeq=' + seq,'preview','width=766,height=500,left=' + x + ',top=' + y + ',scrollbars=yes,resizable=yes');
}


 /**
 *	내용 Byte 체크 (100 byte) 	
 */
 function fc_chk_byte(aro_name,ari_max)
 {
  var msglen = 100;
  var ls_str = aro_name.value; // 이벤트가 일어난 컨트롤의 value 값
  var li_str_len = ls_str.length; // 전체길이

  // 변수초기화
  var li_max = ari_max; // 제한할 글자수 크기
  var i = 0; // for문에 사용
  var li_byte = 0; // 한글일경우는 2 그밗에는 1을 더함
  var li_len = 0; // substring하기 위해서 사용
  var ls_one_char = ""; // 한글자씩 검사한다
  var ls_str2 = ""; // 글자수를 초과하면 제한할수 글자전까지만 보여준다.

  for(i=0; i< li_str_len; i++)
  {
   // 한글자추출
   ls_one_char = ls_str.charAt(i);

   // 한글이면 2를 더한다.
   if (escape(ls_one_char).length > 4)
   {
    li_byte += 2;
   }
   // 그밗의 경우는 1을 더한다.
   else
   {
    li_byte++;
   }

   // 전체 크기가 li_max를 넘지않으면
   if(li_byte <= li_max)
   {
    li_len = i + 1;
   }
  }

  // 전체길이를 초과하면  
  if(li_byte > li_max)
  {
   //alert( li_max + " 글자를 초과 입력할수 없습니다. \n 초과된 내용은 자동으로 삭제 됩니다. ");
   ls_str2 = ls_str.substr(0, li_len);
   aro_name.value = ls_str2;
   frm.msglen.value = 0;
  }/*
  else  
	frm.msglen.value = ari_max-li_byte;
  }

  frm.contents.style.imeMode="auto";
  */

  aro_name.focus(); 
 }



//확장자 가져오기.
String.prototype.getExtension = function() {

	var ext = "";
	var index = this.lastIndexOf(".");
	if (index >= 0) {
		ext = this.substring(index + 1);
	}

	return ext;
}

function StringBuffer() {
	this.text = '';
	
	this.append = function() {
		this.text = this.text + arguments[0];
		return this;
	}
	this.clear = function() {
		this.text = '';
		return this;
	}
	this.toString = function() {
		return this.text;
	}
}
var sb = new StringBuffer();

/*
Send Message 메시지창 띄우기
*/
function inboxSendMessage(type, userId, toName, sslServerName,ssoServerName) {
	if(userId == '') {
		popLogin.openSSO(sslServerName,ssoServerName);
		return;
	}
	
	var url;
	//if (toName == '') {
		url = "/contents/inbox!insertForm.do?type=1";
	//}else {
		//url = "/contents/inbox!insertForm.do?type=" + type + "&toName=" + toName;
	//}
	window.open(url, "", "scrollbars=no,width=460, height=310");
}