var PrototypeEx = {
  CreateDate : '2007-07-04'
}

/**
    2007-07-04
        String.prototype.lenString 추가
    2007-06-21
        String.prototype.getByteLength 추가
	2007-06-01
		form.validate() 수정

	2007-05-25
		date prototype 추가
		시간 및 분 계산 함수 수정
	
	2007-04-28
		form 지칭하는 document..... 를 form[] 값으로 개선
	
	2007-04-18
		FormEx.checkBoxCheckToArray

	2007-04-13
		FormEx.validate 함수에 dateValidate 옵션 추가
		내장 메세지 정의 MSG_...
		String.prototype.isNumber
		String.prototype.getStringToHour 
		String.prototype.getStringToMinute		
	2007-04-11
		ComboObject setSelect 함수 추가
	2007-04-09 
		ComboObject xml 관련 기능 추가
	



**/

/**
    내장 객체
    Array, 
    Boolean, 
    Date, 
    Function, 
    Global, 
    Math, 
    Number, 
    Object, 
    RegExp, 
    Error, 
    String 
**/

/*******************************************************************************
    객체 Object ProtoType 
    
    .implements(obj, funcName) 	객체가 해당 함수를 가지고 있는지 확인
*******************************************************************************/



/*******************************************************************************
    배열 Array ProtoType 
    
    .clear()                        배열 초기화
    .compact()                      null, undefined 요소를 제외하고 
                                    배열 반환, 배열자체를 변경하지는 않는다.
    .first()                        배열의 첫번째 요소를 반환한다.
    .last()                         배열의 마지막 요소를 반환한다.
    .flatten()                      기복이 없고, 1차원 배열을 반환한다. 이 함수는 배열이고,
                                    반환된 배열내 요소를 포함하는 배열의 각 요소를 찾음으로써 수행된다.
    .indexOf(value)                 배열에서 해당하는 갓을 찾아 index값을 반환, 없으면 -1
    .inspect()                      요소를 가진 배열의 잘 포맷팅된 문자열 표시하여 보여줌. ex) [1,2,'dd']
    .reverse(true)                  역순서로 배열을 반환 
                                        true:해당 배열값자체도 바꿈, 
                                        false:리턴값만 바꿈
    .shift()                        첫번째 요소를 반환하고, 배열로부터 이것을 제거한다. 
                                    배열의 길이는 1감소한다.
    .without(var1[,var2[,..varN])   인자로 주어진 요소를 제외한 배열을 반환
    
    === 확장 ===
    .max()                          1차원 배열에서 최대값을 반환
    .min()                          1차원 배열에서 최소값을 반환
    .random()                       1차원 배열에서 램덤시켜서 배열 반환
    
    .searchArray(var1)              1차원 배열에서 인자를 포함하는 배열을 반환
    .sum()                          1차원 배열의 값을 합한 값을 반환한다. 
                                    숫자로 변환이 되지 않으면 ''을 반환된다.
*******************************************************************************/

Array.prototype.sum = function(){

    var value_=0;
    var int_;

    for(var i=0;i<this.length;i++){
    
        int_ = parseInt(this[i]);
        if (isNaN(int_)) return '';
        
        value_ += int_;
    }
    return value_;
}


Array.prototype.max = function(){
   var i, max = this[0];
   for (i = 1; i < this.length; i++){
       if (max < this[i]) max = this[i];
   }
   return max;
}

Array.prototype.min = function(){
    var i, min = this[0];
    for (i = 1; i < this.length; i++){
       if (min > this[i]) min = this[i];
   }   
   return min;
}

Array.prototype.random = function(){
    var len = this.length;
    shuffle = new Array(len);
    for(var i=0;i<len;i++){
        rand = random(len);
        shuffle[i] = this[rand];
        this.splice(rand,1);
    }
    return shuffle;
}


/*******************************************************************************
    문자열 String ProtoType
    
    .stripTags()                    HTML이나 XML 태그가 삭제된 문자열을 반환
    .stripScripts()                 삭제된 <script/> 블럭을 가진 문자열반환
    .escapeHTML()                   HTML 마크업 문자들이 escaped된 문자열 반환
    .unescapeHTML()                 escapeHTML() 반대
    .extractScripts()               문자열내에서 발견되는 모든 <script/> 블럭을 포함하는 Array 객체 반환
    .evalScripts()                  문자열내에서 발견되는 각각의 <script/> 블럭을 평가하기
    .toQueryParams()                쿼리문자열을 파라미터 이름에 의해 인덱스화되는 결합된 Array로 쪼개기
    .parseQuery()                   toQueryParams() 동일
    .toArray()                      문자열을 배열로 반환
    .camelize()                     문자열에서 하이픈(-) 제거
    
    === 확장 ===
        
    .trim()                         공백제거
    .isMax(var1)                    문자열 비교, 인수가 커면 -1, 같으면 0, 작으면 1를 반환
    .isJuminNumber()                주민번호 유무 확인 true/false
    .isPhoneNumber()                전화번호 유무 확인 true/false
    .isHpNumber()                   HP 유무 확인 true/false
    .isMail()                       Mail 유무 확인 true/false
    .isDate()                       날짜 검정 유무 true/false
    .check2Byte()                   글자수 제한만 있는 필드 체크(null 허용, 한글도 체크)
    .checkLen()                     2Byte의 길이도 계산 가능(check2Byte()에서 사용)
    .isNumber()                     숫자 변환 유무
    
    .getStringToHour(str)			인자값을 시간 2자리로 반환 (반환 불가능시 오류 발생)
    .getStringToMinute(str)			인자값을 분 2자리로 반환 (반환 불가능시 오류 발생)
    
    .getByteLength()                문자열의 byte 수를 리턴한다.
    .lenString(len)                 문자열에서 해당 길이만큼 잘라내기(한글 포함해서)

*******************************************************************************/

//지정된 길이 만큼 잘라오기(한글 포함)
String.prototype.lenString = function(len_){
 
	var temp;
	var num;
	var len;
	num=0;
	len = this.length;
	
	for(k = 0 ; k < len ; k++)
	{
		temp = this.charAt(k);

		//내장함수 escape를 통해 그 글자의 길이가 4보다 크면 한글이므로 2를 더한다.
		if(escape(temp).length > 4){
			num += 2;
		}else{
			num ++;
		}
		
		if (num > len_){
		    return this.substr(0, k);   
		}
	}
    return this;
}


String.prototype.getByteLength = function(){
    
    var total_length = 0;
    var text_length = this.length;  // 텍스트의 문자열 길이를 받습니다.
    var char_ = "";
    
    for(var i=0;i<text_length;i++){  // 문자열 길이만큼 루프를 돌겠습니다.
        char_ = this.charAt(i);
        if (escape(char_).length > 4){// 만약 한글이라면 2를 더하고
            total_length += 2;             //한글이면
        }else if(char_ != "\r"){            //엔터가 아니라면
            total_length +=1;
        }
    }
    return total_length;
}
 
String.prototype.isNumber = function()
{
	if (isNaN(this) || (this == null) || (this == "")){
		return false;	
	}else{
		return true;
	}
}

//시간 2자리로 반환
String.prototype.getStringToHour = function()
{
    var returnValue = null;
	if (! this.isNumber()) return null;
	
	returnValue = parseInt(((this.substr(0,1) == "0") ? this.substr(1,1) : this));
	if (returnValue >=24) return null;
	
	if (returnValue <= 9) returnValue = "0" + returnValue;
	return returnValue;
}

//분 2자리로 반환
String.prototype.getStringToMinute = function()
{
    var returnValue = null;
	if (! this.isNumber()) return null;
	
	returnValue = parseInt(((this.substr(0,1) == "0") ? this.substr(1,1) : this));
	if (returnValue >=60) return null;
	
	if (returnValue <= 9) returnValue = "0" + returnValue;
	return returnValue;
}

//공백 제거
String.prototype.trim = function()
{
    // 정규식을 사용하여 선행 공백과 후행 공백을 빈 문자열로 
    // 바꿉니다.
    return this.replace(/(^\s*)|(\s*$)/g, "");
}


String.prototype.replaceAll = function( searchStr, replaceStr )
{
	var temp = this;
	while( temp.indexOf( searchStr ) != -1 )
	{
		temp = temp.replace( searchStr, replaceStr );
	}
	return temp;
}


String.prototype.isMax = function(var1){
    
    var t1, t2;
    var len = ((this.length > var1.length) ? var1.length: this.length);
    
    //문자 하나하나를 비교한다.
    
    for(var i=0;i<len;i++){
        
        if (this.charAt(i) == var1.charAt(i)){}
        else{
            if(this.charAt(i) > var1.charAt(i)) return 1;
            else if(this.charAt(i) < var1.charAt(i)) return -1;
        }
    }   
    
    //짧은 길이 이상의 길이이면, 짧은것이 작은것으로한다.
    if (this.length > len) return 1;
    else if(var1.length > len) return -1;
    else return 0;
}

//(주민번호 체크)
String.prototype.isJuminNumber = function(){

    var str = this.replace('-','');
    
    //전체 길이 검사
    if (str.length != 13) return false;
    
    // 잘못된 생년월일을 검사합니다. 
    var  b_Year = (str.charAt(6) <= "2") ? "19" : "20" 
    
    /* 2000년도부터 성구별 번호가 바뀌였슴으로 구별수가 2보다 작다면 
    1900년도 생이되고 2보다 크다면 2000년도 이상생이 됩니다. 
    단 1800년도 생은 계산에서 제외합니다.*/ 
 
    b_Year += str.substr(0, 2) 
    // 주민번호의 앞에서 2자리를 이어서 4자리의 생년을 저장합니다. 
    var b_Month = str.substr(2, 2) - 1 
    // 달을 구합니다. 1을 뺀것은 자바스크립트에서는 1월을 0으로 표기하기 때문입니다. 
  
    var b_Date = str.substr(4, 2) 
    var b_sum = new Date(b_Year, b_Month, b_Date) 
    
    if ( b_sum.getYear() % 100 != str.substr(0,2) || b_sum.getMonth() != b_Month || b_sum.getDate() != b_Date) { 
        return false; 
      // 생년월일의 타당성을 검사하여 거짓이 있을시 에러메세지를 나타냄 
    }
    
    total = 0 
    temp = new Array(13) 
    for(i=1; i<=6; i++) temp[i] = str.charAt(i-1) 
    for(i=7; i<=13; i++) temp[i] = str.charAt(i-1) 
    for(i=1; i<=12; i++) { 
        k = i + 1 
        if(k >= 10) k = k % 10 + 2 
        /* 각 수와 곱할 수를 뽑아냅니다. 곱수가 만일 10보다 크거나 같다면 
        계산식에 의해 2로 다시 시작하게 됩니다. */ 
        total = total + (temp[i] * k) 
        // 각 자리수와 계산수를 곱한값을 변수 total에 누적합산시킵니다. 
  
    } 
 
    last_num = (11- (total % 11)) % 10 
    // 마지막 계산식을 변수 last_num에 대입합니다. 
    if(last_num == temp[13]) return true;
    // laster_num이 주민번호의마지막수와 같은면 참을 틀리면 거짓을 반환합니다. 
    else return false; 
    
}

//(전화번호- 휴대폰 포함) 유무
String.prototype.isPhoneNumber = function(){
    var this_ = this.replace(/[^0-9]/g,'');
    var re = new RegExp(/^0[2|\d{2}]\d{3,4}\d{4}$/);
    return re.test(this_);
}

//HP Validate
String.prototype.isHpNumber = function(){
    var this_ = this.replace(/[^0-9]/g,'');
    var re = new RegExp(/^01[0|1|6|7|8|9]\d{3,4}\d{4}$/);
    return re.test(this_);
}

//mail validate
String.prototype.isMail = function(){
    var re = new RegExp(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/);
    return re.test(this);
}

//date validate
String.prototype.isDate = function(){
    
    var date_ = this.replace(/[^0-9]/g,'');
    if (date_.length <8) return false;
    
    var year_ = parseInt(date_.substr(0,4),10);
    var month_ = parseInt(date_.substr(4,2),10);
    var day_ = parseInt(date_.substr(6,2),10);
    var daytable = new Array(0,31,28,31,20,31,30,31,31,30,31,30,31);

    if( month_ < 1 || month_ > 12 ) return false;
    if( day_ < 1 || year_ < 1 ) return false;

    //윤달
    if((year_%400==0) || (year_%100!=0 && year_%4==0)){
        if( month_ == 2) result = daytable[month_]+1 - day_;
        else             result = daytable[month_] - day_;
        
    }else{
        if( day_ <= daytable[month_] )
            result = daytable[month_] - day_;
    }
    
    if( result >= 0 ) return true;
    else return false;
}

String.prototype.isPost = function(){
    var re = new RegExp(/^\d{3}\[-+]\d{3}$/);   
} 

// 2Byte의 길이도 계산 가능(check2Byte()에서 사용)
String.prototype.checkLen = function(){
	var temp;
	var num;
	var len;
	num=0;
	len = this.length;

	for(k = 0 ; k < len ; k++)
	{
		temp = this.charAt(k);

		//내장함수 escape를 통해 그 글자의 길이가 4보다 크면 한글이므로 2를 더한다.
		if(escape(temp).length > 4)
			num += 2;
		else
			num ++;
	}
	return num;
}


// 글자수 제한만 있는 필드 체크(null 허용, 한글도 체크)
String.prototype.check2Byte = function(len_){
    if (this.checkLen(this) > len_ ){
        alert("'"+this + "'는 영문 "+len_ +"자나 한글 "+len_/2+"자 이하로 입력해야 합니다.");
		return false;
	} 
	return true;
}



/*******************************************************************************
    Date ProtoType
    
    	
    
    === 확장 ===
    
    .getTypeString(str)             인자를 날짜의 구분으로 해서 문자열 반환
    .getMonth2()					2자리 값으로 월 리턴
    .getDate2()						2자리 값으로 일 리턴
    .getFullDate(type)				8 자리 문자열을 가져온다. type은 구분자 옵션

*******************************************************************************/

/**
	date1, date2, 비교할 날짜
	firstdayofweek : d, h, n, s
**/

Date.prototype.DateDiff = function(date1, date2, firstdayofweek){
	
	var type_ = ((arguments.length<3)? "d": firstdayofweek);
	var type_array = new Array("d","h","n","s");
	var return_="";
	
	if (type_array.indexOf(type_) == -1){
		return_ = -1;
	}else{
		switch(type_){
			case "d"	:	return_ = Math.ceil((date1 - date2)/24/60/60/1000);break;
			case "h"	:	return_ = Math.ceil((date1 - date2)/60/60/1000);break;
			case "n"	:	return_ = Math.ceil((date1 - date2)/60/1000);break;
			case "s"	:	return_ = Math.ceil((date1 - date2)/1000);break;
		}
	}
	return return_;
}

Date.prototype.DateDiff2 = function(date1, firstdayofweek){
	
	var type_ = ((arguments.length<3)? "d": firstdayofweek);
	var type_array = new Array("d","h","n","s");
	var return_="";
	
	if (type_array.indexOf(type_) == -1){
		return_ = -1;
	}else{
		switch(type_){
			case "d"	:	return_ = Math.ceil((date1 - this)/24/60/60/1000);break;
			case "h"	:	return_ = Math.ceil((date1 - this)/60/60/1000);break;
			case "n"	:	return_ = Math.ceil((date1 - this)/60/1000);break;
			case "s"	:	return_ = Math.ceil((date1 - this)/1000);break;
		}
	}
	return return_;
}

Date.prototype.getFullDate = function(type_){
	return ((arguments.length == 0) ? 
		this.getFullYear() + this.getMonth2() + this.getDate2() : 
		this.getFullYear() + arguments[0] + this.getMonth2() + arguments[0] + this.getDate2());
}

Date.prototype.getMonth2 = function(){

	var temp = this.getMonth()+1;
	if (temp <10) temp = "0" + temp;
	return temp;
}

Date.prototype.getDate2 = function(){

	var temp = this.getDate();
	if (temp <10) temp = "0" + temp;
	return temp;
}

Date.prototype.getTypeString = function(type_){
    
    var year_ = this.getYear() + "";
    var month_ = (this.getMonth()+1) + "";
    var day_ = this.getDate() + "";
    
    if (month_.length <2) month_ = "0" + month_;
    if (day_.length <2) day_ = "0" + day_;
    
    if ((type_ == null) || (type_ == "")) return (year_ + month_ + day_);
    else return (year_ + type_ + month_ + type_ + day_);

}


/*******************************************************************************
    Form ProtoType
    
    Form.serialize(form)            필드명과 값이 url형태의 목록을 반환
    Form.findFirstElement(form)     form에서 첫번째 사용가능한 필드 반환
    Form.getElements(form)          폼내 모든 입력 filed를 포함하는 배열 반환
    Form.getInputs(form[, typeName[,name]])
                                    폼내 모든 <input>요소를 포함하는 배열반환
                                    선택적으로 목록은 요소의 타입이나 이름속성에 의해 필터링 가능
    Form.disable(form)              폼내 모든 입력 필드를 사용불가능
    Form.enable(form)
    Form.focusFirstElement(form)    첫번째 가시성을 활성화하고, 폼내 입력 필드를 가능하게 하기
    Form.reset(form)                폼을 리셋
    Form.debug(form)				폼의 값  디버그 알림창
    
    Form.Element
            .serialize(element)     name=value
            .getValue(element)      요소의 값을 반환
            
    Form.Element.Serializers
            .inputSelector(element) 요소의 이름과 값을 가지는 배열반환
            .textarea(element)      요소의 이름과 값을 가지는 배열반환
            .select(element)        ['elementName','selOpt1',...] 배열반환
    
    === 확장 ===
    FormEx.checkAll(form, sElement, bl) 	체크박스 전체선택 및 해제
    FormEx.checkSelect(form,sElement)		체크 박스가 하나라도 체크되어있는지 확인
    FormEx.insertHiddenElement(form, sName_, sValue_, bUpdate_) hidden 폼 생성
    FormEx.checkSelectValue(form, sElement_, value_)    체크또는 라디오 박스에서 해당 값과 같은것을 체크한다.
  
  	FormEx.checkedCount(form, sElement)		radio, checkbox 에서 체크된 것만 갯수 카운팅
  	FormEx.checkBoxCheckToString(form, sElement, type) 체크 박스에서 체크단것을 묶어서 문자열로 변환 type 은 구분자로 디폴트(',')
  	FormEx.checkBoxCheckToNumber(form, sEelemet)	체크 박스에서 체크된것의 위치를 배열로
  	FormEx.checkBoxValueToArray(formm sElement)		체크 박스에서 체크된 것의 값을 배열로
  	FormEx.inputBoxUpdateValueAll(form, sElement, sValue, sFixValue)	InputBox 값 같은 이름으로 된 것 같은 값으로 등록 sFixValue 값은 불변
  	FormEx.elementValueToString(form, sElement, type_) 	element 값 문자열로..
  	FormEx.elementValueToArray(form, sElement)		element 값을 배열로
  
*******************************************************************************/


var FormEx = {

    //radio or checkbox 중 해당값을 선택할 수 있도록    
    checkSelectValue:function(form, sElement_, value_){
        var obj_ = form[sElement_];
        if (obj_ == null) return;
        
        if (isNaN(obj_.length) == true){
            if (obj_.value == value_){
                obj_.checked = true;
            }
        }else{
            for(i=0; i<obj_.length;i++){
                if (obj_[i].value == value_){
                    obj_[i].checked= true;
                    break;
                }
            }
        }
    },        
    
    //체크 박스 전체선택/해제
    
    checkAll:function(form, sElement_, bl_){
        var obj_ = form[sElement_];
        if (obj_ == null) return;
        if (isNaN(obj_.length) == true){
            obj_.checked = bl_;
        }else{
            for(i=0; i<obj_.length;i++){obj_[i].checked= bl_;}
        }
    },
    
    //체크 박스가 하나라도 체크되어있는지 확인
    checkSelect:function(form, sElement_){

        var returnBl = false;
        
        var obj_ = form[sElement_];
        if (obj_ == null) return returnBl;
        
        if (returnBl == false){
        
            if (isNaN(obj_.length) == true){
                returnBl = obj_.checked;
            }else{
                for(i=0; i<obj_.length;i++){
                    if (obj_[i].checked == true){
                        returnBl = true;
                        break;
                    }
                }
            }
        }
        return returnBl;
    },
    
    /**
        특정 hidden element 동적 추가
    bUpdate_ : 기존에 존재 유무 체크
    **/
    
    insertHiddenElement:function(form, sName_, sValue_, bUpdate_){
    
        var bl_ = true;
        
        for(var i=0;i<form.elements.length;i++){
            if (form.elements[i].name == sName_){
                if (bUpdate_ == true){
                    form.elements[i].value = sValue_;
                }
                bl_ = false;
                break;
            }
        }
        if (bl_ == true){  //기존에 값이 존재하면 갱신처리한다.
            
            try{	
        		//IE
	        	var Ele = document.createElement("<input type='hidden' name='" + sName_ + "' value='" + sValue_ + "'>");
    	        form.appendChild(Ele);
    	    }catch(e){
				//FF
	        	var Ele = document.createElement("input");
	        	Ele.name = sName_;
	        	Ele.type = "hidden";
	        	Ele.value = sValue_;
	            form.appendChild(Ele);
			}
        }
    },
    
    /**
        폼 내의 유효성 검정
    **/
    
    validate:function(form_){

    	var return_obj = null;
    	var selectObj = null;

        for(var i=0;i<form_.elements.length;i++){
			selectObj = form_.elements[i];
			
            if (selectObj.attributes["required"]){
            
	        	switch(selectObj.type){
	        		case "text" :
	        		case "password" :
	        		case "textarea":
	        			if ($F(selectObj) == ""){
	        				return_obj = selectObj;
	        			}
	        			break;
	        
	        		case "checkbox":
	        		case "radio":
	        			if (! FormEx.checkSelect(form_, selectObj.name)){
	        				return_obj = selectObj;
	        			}
	        			break;
	        		case "select-one":
	        		case "select-multiple":
	        			if (selectObj.selectedIndex == 0){
	        				return_obj = selectObj;
	        			}
	        			break;
					default :
						return_obj = null;	        			
	        	}
            }
            
            if (return_obj != null){
	        	if (selectObj.attributes["msg"]){
	            	selectObj.msg = selectObj.attributes["msg"].value;
	            }else{
	                selectObj.msg = MSG_REQUIRED_BLANK;
	            }
	            break;
            }
            
            //포맷 체크
            if (selectObj.attributes["format"]){
            	var format_value = selectObj.attributes["format"].value;
            	
            	//HH 시간 두자리 00 ~ 23
            	if (format_value == "HH"){
            		var temp_val = selectObj.value.getStringToHour();
            		if (temp_val == null){
            			selectObj.msg = MSG_NOT_DATE;
            			return_obj = selectObj;
            			break;
            		}else{
            			selectObj.value = temp_val;
            		}
            	}else if(format_value == "MI"){
            	//MI 분 00 ~ 60 
            		var temp_val = selectObj.value.getStringToMinute();
            		if (temp_val == null){
            			selectObj.msg = MSG_NOT_DATE;
            			return_obj = selectObj;
            			break;
            		}else{
            			selectObj.value = temp_val;
            		}
            	}else if(format_value == "Number"){
            	    if (selectObj.value.isNumber() == false){
            	        selectObj.msg = MSG_NOT_NUMBER;
            	        return_obj = selectObj;
            	        break;
            	    }
            	}
            }            
            
            //날짜 비교
            if (selectObj.attributes["dateValidate"]){
            	var date_string = selectObj.attributes["dateValidate"].value;

            	var date_array = date_string.split(":");
            	
            	if (form_[date_array[0]].value.isDate()){
		       		date_array[0] = form_[date_array[0]].value.replace(/[^0-9]/g,'');
            	}else{
            		form_[date_array[0]].msg = MSG_NOT_DATE;
					return_obj = form_[date_array[0]];
            	}
            	
            	if (form_[date_array[1]].value.isDate()){
		       		date_array[1] = form_[date_array[1]].value.replace(/[^0-9]/g,'');
            	}else{
            		form_[date_array[1]].msg = MSG_NOT_DATE;
					return_obj = form_[date_array[1]];
            	}
            	
            	if (date_array[0] > date_array[1]){
					selectObj.msg = MSG_NOT_TOW_DAY_BETWEEN;
					return_obj = selectObj;
					break;
            	}
            }
            
            if (return_obj != null) break;
        }
        return return_obj;
    },
    
    
    //체크된 요소에 대하여 카운팅
    checkedCount:function(form_, sElement_){
    
    	var obj = form_[sElement_];

    	if (obj == null) return 0;

    	if (isNaN(obj.length)){
    		if (obj.checked) return 1;
    		else return 0;
    	}

    	var count = 0;
    	for(var i=0;i<obj.length;i++){
    		if (obj[i].checked)count++;
    	}

		return count;    
    },
    
    checkBoxCheckToString:function(form_, sElement_, type_){
    	
    	var returnString = "";
    	var typeString = "";
    	
    	if ((type_ == null) || (type_ == "") || (type_ == "undifiled")){
    		typeString =",";
    	}else{
    		typeString = type_;
    	}
    	var obj = form_[sElement_];
    	if (obj == null) return "";
    	
    	if (isNaN(obj.length) == true){
    		if (obj.checked) return obj.value;
    	}else{
    	
    		for(var i=0;i<obj.length;i++){
    			if (obj[i].checked) returnString += obj[i].value + typeString;
    		}
    		
    		if (returnString.length >0){
    			returnString = returnString.substr(0, returnString.length - typeString.length) ;
    		}
    	}
    
		return returnString;    
    },
    
    debug:function(form_){
    
    	alert(Form.serialize(form_));
    
    },
    
    checkBoxCheckToNumber:function(form_, sElement_){
    
    	var returnArray = new Array();
    	var typeString = "";
    	
    	var obj = form_[sElement_];
    	if (obj == null) return null;
    	
    	if (isNaN(obj.length) == true){
    		returnArray[0] = 0;
    		if (obj.checked) return returnArray;
    	}else{
    	
    		for(var i=0;i<obj.length;i++){
    			if (obj[i].checked)returnArray[returnArray.length] = i;
    		}
    	}
		return returnArray;
    },
    
    inputBoxUpdateValueAll:function(form_, sElement, sValue_, sFixValue){

    	var obj_ = form_[sElement];
    
    	if (obj_ == null) return;
        if (isNaN(obj_.length) == true){
            obj_.value = sValue_;
        }else{
            for(i=0; i<obj_.length;i++){
            	if ((obj_[i].value != sFixValue) && (sFixValue != "undifined")){
	            	obj_[i].value= sValue_;
	            }
            }
        }
    },
    
    elementValueToString:function(form_, sElement_, type_){
        var returnString = "";
    	var typeString = "";
    	
    	if ((type_ == null) || (type_ == "") || (type_ == "undifiled")){
    		typeString =",";
    	}else{
    		typeString = type_;
    	}
    	var obj = form_[sElement_];
    	if (obj == null) return "";
    	
    	if (isNaN(obj.length) == true){
    		return obj.value;
    	}else{
    	
    		for(var i=0;i<obj.length;i++){
    			returnString += obj[i].value + typeString;
    		}
    		
    		if (returnString.length >0){
    			returnString = returnString.substr(0, returnString.length - typeString.length) ;
    		}
    	}
		return returnString;
    },
    
    elementValueToArray:function(form_, sElement_){
    	
    	var returnArray = new Array();
    	var obj = form_[sElement_];
    	if (obj == null) return returnArray;
    	
	   	if (isNaN(obj.length) == true){
    		returnArray[returnArray.length] = obj.value;
    	}else{
    		for(var i=0;i<obj.length;i++){
    			returnArray[returnArray.length] = obj[i].value ;
    		}
    	}
    
		return returnArray;    
    },
    
    checkBoxValueToArray:function(form_, sElement_){
    	
    	var returnArray = new Array();
    	var obj = form_[sElement_];
    	if (obj == null) return returnArray;
    	
	   	if (isNaN(obj.length) == true){
    		if (obj.checked) return (returnArray[returnArray.length] = obj.value);
    	}else{
    		for(var i=0;i<obj.length;i++){
    			if (obj[i].checked){returnArray[returnArray.length] = obj[i].value ;}
    		}
    	}
    
		return returnArray;    
    }
}

/*******************************************************************************

    Form.Element ProtoType
    
    serialize(element)              'elementName=elementValue'처럼 요소의 name=value 짝을 반환
    getValue(element)               요소의 값을 반환
    
    === 확장 ===
    
    new ComboBox(obj)				selectbox 객체를 인자로 생성 
    	.setDefault(txt_,value_)	기본값을 입력
    	.setDataArray(array_)		option 값을 이차원 배열로 입력
    	.setDataText(str_)			option 값을 텍스트로 입력(txt:value;txt:value)			
    	.setDataXml(xml_)			option 값을 xml 입력 
    									<options>
    										<option value='' txt=''/>
    									</options>
    	.gen()						해당 객체에 반영    	
    
    
*******************************************************************************/   


/**
 * Combo Box 값 스크립트 상으로 변경하기 
 */

	ComboObject = Class.create();
	Object.extend(
	ComboObject.prototype = {
	  	initialize: function(obj_) {
	    	this.obj = obj_;
	  	},
		setDefault: function(txt_, value_, index_){
			this._dataType = "";
			this._detaultTxt = txt_;
			this._detaultValue = value_;
			this._index = index_;
			this.gen();
		},
		setSelect: function(value_){
			var obj = this.obj;
			for(var i=0;i<obj.options.length;i++){
				if (obj.options[i].value == value_){
					obj.selectedIndex = i;
					break;
				}
			}
		},
		setDataArray: function(array_){
			this._dataType = "array";
			this._arrayData = array_;
			this.gen();
		},
		setDataXml: function(xml_){
			this._dataType = "xml";
			this._xml = xml_;
			this.gen();			
		},
		setDataText: function(txt_){
			this._dataType = "text";
			this._textData =txt_;
			this.gen();
		},
		clear: function(){
			this.obj.length = 0;
		},
		gen: function(){
			var temp_ = "";
			var option = "";
			var obj = this.obj;
			//obj.options.length = 0;
			
			//default 값  세팅
			
			if (this._dataType == ""){
				if ((this._detaultTxt != null) && (this._detaultTxt != "")){
					if ((this._index == null) || (this._index == "")){
						this._index = this.obj.options.length;
					}else if(this._index > this.obj.options.length){
						this._index = this.obj.options.length;
					}
					
					
					obj.options[this._index] = new Option(this._detaultTxt,this._detaultValue);
				}
			}else if (this._dataType == "array"){
				
				for(var i=0;i<this._arrayData.length;i++){
					
					temp_array = (this._arrayData)[i];					
					obj.options[obj.options.length] = new Option(temp_array[0],temp_array[1]);	
				}
			}else if(this._dataType == "xml"){
				var xmlDom = new ActiveXObject('Microsoft.XMLDOM');
				xmlDom.async = false;
				xmlDom.loadXML(this._xml);

				var nodeRoot = xmlDom.documentElement;

				if (nodeRoot == null){
				}else{
		
					var nodeChild 	= nodeRoot.firstChild;
					var text 		= null;
					var value	 	= null;
					
					while (nodeChild != null){

						if (nodeChild.nodeName == "option"){
							text = nodeChild.getAttribute("txt");
							value = nodeChild.getAttribute("value");
							obj.options[obj.options.length] = new Option(text, value);
						}
					}
				}	

			}else if(this._dataType == "text"){
			
				var temp_str = this._textData;
				var temp_array, temp_array2;

				if (temp_str != ""){
					temp_array = temp_str.split(';');

					for(var i=0;i<temp_array.length;i++){
						temp_array2 = temp_array[i].split(':');

						obj.options[obj.options.length] = new Option(temp_array2[0],temp_array2[1]);
					}
				}
			}
		}
	}
	);




/*******************************************************************************
    Number ProtoType
    
    .toColorPart()                  숫자의 16진법 표현을 반환. 색상의 RGB컴포넌트를 HTML표현으로 변환할때 유용
    
    
    === 확장 ===
    
    .getTypeString(str)             인자를 날짜의 구분으로 해서 문자열 반환


*******************************************************************************/


/*******************************************************************************
    script.aculo.us Drag and drop
    
    Draggable('div', {options});	d&d 가능한 객체 생성 (new) 로 생성한다. 
		option	
			handle		: 객체내부의 특정 객체를 지정해서 d&d 할 수 있도록 한다. default : 전체
			revert		: drop 시 다시 재자리로 들어올 것인지 체크 default : false
			sanp		: [x] or [x,y] 지정한 크기 단위로 움직인다.
			zindex		: 
			constraint	: horizontal’ or ‘vertical' 이동시 제약 조건을 준다.
			ghosting	: drop 되기 전까지 원래 위치의 잔상 효과
			onStart		: drag 시작시 이벤트
			onDrag		: drag 중일때 이벤트
    		onEnd		: drop 일때 이벤트
		
	ex) new Draggable('test',{handle:'test',revert:true});
    
    
    Droppables.add('id_of_element',[options]);	d&d 에서 drop 되는 곳의 등록
    	option
    		accept		: 해당 클래스를 가지고 있는 d&d 객체만 감지
    		containment	: 해당 id 를 가진 객체만 이동가능하게 한다. sortables와 사용
    		hoverclass	: 개체가 drop 지역에 있을대 css 변경
    		overlap		: horizontal’ or ‘vertical'에서 다른 객체 위로 지나갈때 정렬
    		greedy		:
    		onHover		: 객체가 drop 존 위에 있을때 발생하는 이벤트
    		onDrop		: 객체가 drop 될 시 이벤트
    		
    ex) Droppables.add('xxxx',{accept:['box1','box2'],onDrop:function(){alert('drop!')}});
    
    	
    		
    		
    		
    		
    		Position.includeScrollOffsets = true;
Sortable.create('thelist2',{scroll:'scroll-container'});
    
*******************************************************************************/
	

/*******************************************************************************
	메시지 정리
*******************************************************************************/
var MSG_NOT_TOW_DAY_BETWEEN = "날짜사이의 기간 조건이 맞지 않습니다.";
var MSG_NOT_DATE = "날짜 타입으로 변환이 안됩니다.";
var MSG_REQUIRED_BLANK = "필수 값이 없습니다.";
var MSG_NOT_NUMBER = "값이 숫자가 아닙니다.";


/*******************************************************************************
    Event ProtoType
    
    KEY_BACKSPACE Number    8: 되돌리기(<-) 키를 위한 상수 코드. 
    KEY_TAB Number          9: 탭키를 위한 상수코드 
    KEY_RETURN Number       13: 리턴키를 위한 상수코드 
    KEY_ESC Number          27: Esc키를 위한 상수코드 
    KEY_LEFT Number         37: 왼쪽 화살표 키를 위한 상수코드 
    KEY_UP Number           38: 위쪽 화살표 키를 위한 상수코드 
    KEY_RIGHT Number        39: 오른쪽 화살표 키를 위한 상수코드 
    KEY_DOWN Number         40: 아래쪽 화살표 키를 위한 상수코드 
    KEY_DELETE Number       46: Delete키를 위한 상수코드    
    
    observe(element, 
        name, 
        observer, 
        useCapture)
                            element: 객체 또는 아이디, 
                            name: 이벤트 명 (like 'click', 'load', etc), 
                            observer: 이벤트를 다루는 함수, 
                            useCapture: true라면, capture내 이벤트를 다루고 
                             false라면 bubbling 내 이벤트를 다룬다. 
                             
                            이벤트를 위한 이벤트 핸들러 함수를 추가
                            
                            <script>
                            	Event.observe(window, 'load', showMessage, false);
                            
                            	function showMessage() {
                            	  alert('Page loaded.');
                            	}
                            </script>	
                            
    stopObserving(element, 
        name, 
        observer, 
        useCapture)
                            element: 객체 또는 아이디, 
                            name: 이벤트 명 ('click' 처럼), 
                            observer: 이벤트를 다루는 함수, 
                            useCapture: true라면 capture내 이벤트를 다루고, 
                             false라면 bubbling내에서 다룬다.
                             
                            이벤트로부터 이벤트 핸들러를 제거
    
    === 확장 ===
    
    .getTypeString(str)             인자를 날짜의 구분으로 해서 문자열 반환


*******************************************************************************/


/*******************************************************************************
	xml object 




********************************************************************************/
var xmlParser = {
  create: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  }
}

