/**
 * 폼 정합성 체크
 * @param
 * @return
 * @date 2009-01-10
 */
var ns_form = {
    invalid: function(form) {
        var result = true;
        for (var i=0; i < form.length; i++) {
            var element = form[i];
            var tagName = element.tagName.toUpperCase();
            var typeName= element.type.toUpperCase();
            if ((tagName == 'INPUT' && typeName == 'TEXT') || 
                (tagName == 'INPUT' && typeName == 'FILE') ||
                (tagName == 'INPUT' && typeName == 'PASSWORD') ||
                (tagName == 'INPUT' && typeName == 'CHECKBOX') || 
                tagName == 'SELECT' || tagName == 'TEXTAREA'
               ) {
                if (element.getAttribute('trim')) {
                    if (element.getAttribute('trim').toLowerCase() == 'true') {
                        element.value = element.value.replace(/(^\s*)|(\s*$)/g, '');
                    }
                }
                if (element.getAttribute('require')) {
                    if (element.getAttribute('require') == 'true') {
                        if (tagName == "INPUT" && typeName == "CHECKBOX") {
                            if (!element.checked) {
                                result = false;
                                alert(element.getAttribute('invalidMessage'));
                                if (!element.disabled) {
                                    element.focus();
                                }
                                break;
                            }
                        } else {
                            if (!element.value) {
                                result = false;
                                alert(element.getAttribute('invalidMessage'));
                                if (!element.disabled) {
                                    element.focus();
                                }
                                break;
                            }
                        }
                    }
                }
            }
        }
        
        return result;
    },

    /**
     * textarea maxlength 체크
     * @since 2009-12-24
     */
    checkTextareaMaxLength: function(control) {
        var maxlength = Number(control.getAttribute('maxlength'));
        var curlength = this.getByteLength(control.value);
        var val       = control.value;
        if (curlength > maxlength) {
            var resultMessage = control.getAttribute('invalidMessage').replace('%s', maxlength);
            alert(resultMessage);
            control.value = val.substr(0, val.length-1);
        }
    },

    /**
     * 문자열 길이 가져오기
     * @since 2009-12-24
     */
    getByteLength: function(val) { 
        var result = 0; 
        if (val == null || !val) return 0; 
        for (var i=0; i < val.length; i++) {
            var c = escape(val.charAt(i)); 
            if (c.length == 1) 
                result ++; 
            else if ( c.indexOf("%u") != -1)
                result += 2; 
            else if (c.indexOf("%") != -1)
                result += c.length / 3;
        }
        
        return result;
    },

    /**
     * 값이 없으면 default값 지정
     * @since 2009-01-16
     */
    setDefaultValue: function(control, value) {
        if (!control.value) {
            control.value = value;
        }
    },

    setDefaultNumberValue: function(control, value) {
        control.value = control.value.replace(/(^\s*)|(\s*$)/g, "");
        if (!value) value = 0;
        if (isNaN(control.value) || !control.value) {
            control.value = value;
        }
    },

    setDefaultDoubleValue: function(control, value, limitLength) {
        control.value = control.value.replace(/(^\s*)|(\s*$)/g, "");
        if (!value) value = 0;
        if (isNaN(control.value) || !control.value) {
            control.value = value;
        }
        var val = control.value.split('.');
        if (val.length < 2) {
            val.push('');
        }

        for (var i=val[1].length; i < limitLength; i++) {
            val[1] += '0';
        }

        control.value = val[0]+'.'+val[1];
    },
    
    /**
     * 폼안의 모든 컨트롤 이름과 값 가져오기
     * @since 2009-01-16
     */
    getValues: function(form) {
        function getRadioValue(paramObject) {
            var result = '';
            if (!paramObject) return '';
            
            var count;
            try {
                count = paramObject.length;
            } catch (e) {
            }
            if (!count) {
                if (paramObject.checked) {
                    result = paramObject.value;
                }
            } else {
                for (var i=0; i < count; i++) {
                    if (paramObject[i].checked) {
                        result = paramObject[i].value;
                        break;
                    }
                }    
            }
            
            return result;
        }
        
        var struct = new Array();
        var oldControlName = null;
        var j = 0;
        
        for (var i=0; i < form.length; i++) {
            var control  = form[i];
            var tagName  = control.tagName.toUpperCase();
            var typeName = control.type.toUpperCase();   

            if (typeName == 'RADIO' || typeName == 'CHECKBOX') {
                if (oldControlName != control.name) {
                    struct[j] = new Object();            
                    struct[j].name  = control.name;
                    struct[j].value = getRadioValue(document.getElementsByName(struct[j].name)); 
                    j++;
                }

                oldControlName  = control.name;                        
            } else {
                struct[j] = new Object();            
                struct[j].name  = control.name;
                struct[j].value = control.value;
                j++;                
            }
        }
        
        return struct;
    },
    
    /**
     * 초기 폼과 사용자가 입력한 폼안의 값을 비교하여 변경사항이 있으면 true, 없으면 false 리턴
     * @since 2009-01-16
     */
    compareValues: function(struct, form) {
        var result = true;
        var oldStruct = struct;
        var curStruct = this.getValues(form);
        
        for (var i=0; i < oldStruct.length; i++) {
            if (oldStruct[i].value != curStruct[i].value) {
                result = false;
                break;
            }
        }    
        
        return result;
    },

    /**
     * 체크된 라디오 버튼의 값 구하기
     * @since 2008-12-05
     */
    getRadioValue: function(paramObject) {
        var result = '';
        if (!paramObject) return '';
        
        var count = paramObject.length;
        if (!count) {
            if (paramObject.checked) {
                result = paramObject.value;
            }
        } else {
            for (var i=0; i < count; i++) {
                if (paramObject[i].checked) {
                    result = paramObject[i].value;
                    break;
                }
            }    
        }
        
        return result;
    },

    /**
     * 값으로 라디오 버튼 체크하기
     * @since 2008-12-05
     */
    setRadioValue: function(paramObject, paramString) {
        var result = '';
        if (!paramObject) return '';
        
        var count = paramObject.length;
        if (!count) {
            if (paramObject.value == paramString) {
                paramObject.checked = true;
            }
        } else {
            for (var i=0; i < count; i++) {
                if (paramObject[i].value == paramString) {
                    paramObject[i].checked = true;
                    break;
                }
            }    
        }
    },

    /**
     * 텍스트 박스에 숫자만 입력 가능하게 체크.
     * @since 2008-12-05
     */
    checkNumber: function (e) {
        /*
        if (dojo.isIE) {
            if ((e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105) || e.keyCode == 8 || e.keyCode == 9 || e.keyCode == 16 || e.keyCode == 46 || (e.keyCode >= 35 && e.keyCode <= 40)) {
                e.returnValue = true;
            } else {
                e.returnValue = false;
            }
        } else {
            if ((e.which < 48 || e.which > 57) && (e.which < 96 || e.which > 105) && e.which != 8 && e.which != 9 && e.which != 16 && e.which != 46 && (e.which < 35 || e.which > 40)) {
                e.preventDefault();
            }
        }
        */

        if (dojo.isIE) {
            if ((e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105) || e.keyCode == 8 || e.keyCode == 9 || e.keyCode == 16 || e.keyCode == 46 || (e.keyCode >= 35 && e.keyCode <= 40)) {
                e.returnValue = true;
            } else {
                e.returnValue = false;
            }
        } else {
            if ((e.which < 48 || e.which > 57) && (e.which < 96 || e.which > 105) && e.which != 8 && e.which != 9 && e.which != 16 && e.which != 46 && (e.which < 35 || e.which > 40)) {
                e.preventDefault();
            }
        }
    },

    /**
     * 텍스트 박스에 숫자만 입력 가능하게 체크.
     * @since 2009-02-13
     */
    checkMoney: function (e, control) {
        if (dojo.isIE) {
            if ((e.keyCode >= 48 && e.keyCode <= 57) || e.keyCode == 45) {
                if (e.keyCode == 45 && control.value.indexOf('-') > -1) {
                    e.returnValue = false;
                } else {
                    e.returnValue = true;
                }
            } else {
                e.returnValue = false;
            }
        } else {
            if ((e.which >= 48 && e.which <= 57) || e.which == 45 || e.keyCode == 46 || e.keyCode == 8 || e.keyCode == 37 || e.keyCode == 39) {
                if (e.which == 45 && control.value.indexOf('-') > -1) {
                    e.preventDefault();
                }
            } else {
                e.preventDefault();
            }
        }
    },
    
    /**
     * 텍스트 박스에 숫자만 입력 가능하게 체크 (소수점 포함).
     * @since 2009-02-04
     */
    checkDouble: function (e, element, limitLength) {
        /*
        if (dojo.isIE) {
            if ((e.keyCode >= 48 && e.keyCode <= 57) || e.keyCode == 45 || e.keyCode == 46) {
                if (e.keyCode == 45 && control.value.indexOf('-') > -1) {
                    e.returnValue = false;
                    control.value = '';
                } else {
                    e.returnValue = true;
                }
                var val = control.value.split('.');
                if (val.length < 2) {
                    val.push('');
                }
                if ((e.keyCode == 46 && control.value.indexOf('.') > -1) || (val[1].length == limitLength && val[1] != '00')) {
                    e.returnValue = false;
                } else {
                    e.returnValue = true;    
                }
            } else {
                e.returnValue = false;
            }
        } else {
            if ((e.which >= 48 && e.which <= 57) || (e.keyCode >= 96 && e.keyCode <= 105) ||  e.keyCode == 45 || e.which == 45 || e.which == 46 || e.keyCode == 46 || e.keyCode == 8 || e.keyCode == 37 || e.keyCode == 39) {
                if ((e.which == 45 || e.keyCode == 45) && control.value.indexOf('-') > -1) {
                    e.returnValue = false;
                    if (dojo.isFF) {
                        control.value = '';
                    }
                } else {
                    e.returnValue = true;
                }
                var val = control.value.split('.');
                if (val.length < 2) {
                    val.push('');
                }
                if ((e.which == 46 && control.value.indexOf('.') > -1) || (val[1].length == limitLength && val[1] != '00')) {
                    if (e.keyCode != 8 && e.keyCode != 37 && e.keyCode != 39 && e.keyCode != 46) {
                        e.preventDefault();
                    }
                } else {

                }                
            } else {
                e.preventDefault();
            }
        }
        */

        if (dojo.isIE) {
            if ((e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105) || e.keyCode == 8 || e.keyCode == 9 || (e.keyCode >= 35 && e.keyCode <= 40) || e.keyCode == 45 || e.keyCode == 46 || e.keyCode == 110 || e.keyCode == 190) {
                if (element.value.substring(0,1) == '.') {
                    element.value = '0.';
                }
                var val = element.value.split('.');
                if (val.length > 2) {
                    element.value = val[0]+'.'+val[1];
                    e.returnValue = false;
                }
                if (val.length < 2) {
                    val.push('');
                }
                if (val[1].length > limitLength) {
                    element.value = element.value.substring(0, element.value.length-1);
                    e.returnValue = false;
                }
            } else {
                e.returnValue = false;
            }
        } else {
            if ((e.which >= 48 && e.which <= 57) || (e.keyCode >= 96 && e.keyCode <= 105) || e.keyCode == 8 || e.keyCode == 9 || (e.keyCode >= 35 && e.keyCode <= 40) || e.keyCode == 45 || e.keyCode == 46 || e.keyCode == 110 || e.keyCode == 190) {
                if (element.value.substring(0,1) == '.') {
                    element.value = '0.';
                }
                var val = element.value.split('.');
                if (val.length > 2) {
                    element.value = val[0]+'.'+val[1];
                    e.preventDefault();
                }
                if (val.length < 2) {
                    val.push('');
                }
                if (val[1].length > limitLength) {
                    element.value = element.value.substring(0, element.value.length-1);
                    e.preventDefault();
                }            
            } else {
                e.preventDefault();
            }
        }
    },

    /**
     * 콤보박스 동적 생성
     * @since 2009-02-02
     */
    createComboBox: function(paramString1, paramString2, paramObject, paramString3, paramString4, paramString5) {   
        var combobox = document.createElement('select');
        combobox.id = paramString2;
        combobox.name = paramString2;
        
        var option = null;    
        if (paramString3) {
            if (paramString5) {
                option = new Option(paramString3, paramString5);
            } else {
                option = new Option(paramString3, '');
            }
            combobox.options[0] = option;
        }
            
        if (paramObject && paramObject.length > 0) {
            var j = 0;    
            var optionCount = combobox.options.length;
            for (var i=optionCount; i < paramObject.length+optionCount; i++) {
                option = new Option(paramObject[j].text, paramObject[j].value);
                combobox.options[i] = option;
                
                j++;
            }
        }
        
        this.setComboBoxValue(combobox, paramString4);    
        document.getElementById(paramString1).appendChild(combobox);
    },

    /**
     * 선택된 Select박스의 값 구하기
     * @since 2008-12-05
     */
    getComboBoxValue: function(paramObject) {
        if (!paramObject) return '';
        return paramObject.options[paramObject.selectedIndex].value;
    },

    /**
     * 값으로 콤보박스 선택하기
     * @author hl_lee@wegonet.com
     * @since 2008-12-05
     * @version 1.0
     */
    setComboBoxValue: function(paramObject, paramString) {
        if (!paramObject) return;
        
        for (var i=0; i < paramObject.options.length; i++) {
            if (paramObject.options[i].value == paramString) {
                paramObject.options.selectedIndex = i;
                break;
            }
        }
    },

    /**
     * 값으로 콤보박스 선택하기 (Ajax)
     * @author hl_lee@wegonet.com
     * @since 2009-05-30
     * @version 1.0
     */
    setComboBoxAjaxValueTimeout: function(paramFunc1, paramFunc2, paramObject, paramString, paramTimeout, paramValueCount, paramFunc) {
        if (paramObject.options.length > paramValueCount || paramTimeout <= 0) {
            paramFunc2(paramObject, paramString);
            if (typeof paramFunc == 'function') {
                paramFunc();
            }
            return;
        }

        window.setTimeout(function(){
            paramFunc1(paramFunc1, paramFunc2, paramObject, paramString, paramTimeout-100, paramValueCount, paramFunc);
        }, 100);
    },

    /**
     * 값으로 콤보박스 선택하기 (Ajax)
     * @author hl_lee@wegonet.com
     * @since 2009-05-30
     * @version 1.0
     */
    setComboBoxAjaxValue: function(paramObject, paramString, paramTimeout, paramValueCount) {
        if (!paramObject) return;
        if (!paramValueCount) {
            paramValueCount = 1;
        }

        var setComboBoxValue = this.setComboBoxValue;
        var setComboBoxAjaxValueTimeout = this.setComboBoxAjaxValueTimeout;
        this.setComboBoxAjaxValueTimeout(setComboBoxAjaxValueTimeout, setComboBoxValue, paramObject, paramString, paramTimeout, paramValueCount);
    },

    /**
     * 값으로 콤보박스 선택하기 (Ajax)
     * @author hl_lee@wegonet.com
     * @since 2009-05-30
     * @version 1.0
     */
    setComboBoxAjaxValueFunc: function(paramObject, paramString, paramTimeout, paramValueCount, paramFunc) {
        if (!paramObject) return;
        if (!paramValueCount && paramValueCount != 0) {
            paramValueCount = 1;
        }

        var setComboBoxValue = this.setComboBoxValue;
        var setComboBoxAjaxValueTimeout = this.setComboBoxAjaxValueTimeout;
        this.setComboBoxAjaxValueTimeout(setComboBoxAjaxValueTimeout, setComboBoxValue, paramObject, paramString, paramTimeout, paramValueCount, paramFunc);
    },

    /**
     * 선택된 Select박스의 텍스트 구하기
     * @since 2008-12-05
     */
    getComboBoxText: function(paramObject) {
        if (!paramObject) return '';
        return paramObject.options[paramObject.selectedIndex].text;
    },

    /**
     * util.Form.Select.setText
     * @author hl_lee@wegonet.com
     * @since 2008-12-05
     * @version 1.0
     */
    setComboBoxText: function(paramObject, paramString) {
        if (!paramObject) return;
        
        for (var i=0; i < paramObject.options.length; i++) {
            if (paramObject.options[i].text == paramString) {
                paramObject.options.selectedIndex = i;
                break;
            }
        }
    }
}

