/**
 * validate.js
 * 2008-03-06 gwangpa, kkbum2000
 *
 * Example
 * function formValidate() {
 *     var frm = document.frm;
 *     var v = new Validate();
 *     v.isRequired(frm.title);
 *     v.isRequired(frm.description);
 *     v.isRequired(frm.comment_use_yn, "comment_use_yn");
 *     return v.checkOut();
 * }
 *
 */
var Validate = Class.create();
Validate.prototype = {
    initialize: function(alert_title, error_message_field_prefix, error_message_class_name) {
        if (alert_title == false) {
            this.alert_title            = "";
        } else {
            this.alert_title            = alert_title || msg;
        }
        this.errorFields                = [];
        this.errorMsg                   = "";
        this.error_message_field_prefix = error_message_field_prefix || "form_error_";
        this.error_message_class_name   = error_message_class_name || "form_error";
        this.some_error                 = false;
        this.__clear();
    },

    isRequired: function(obj, errmsg_container_id, msg) {
        var len = obj.length;
        var isChecked = false;
        if (len > 0) {
            if (errmsg_container_id == null) {
                alert("checkbox or radio type is need errmsg_container_id");
                this.some_error = true;
            }
            if (obj.tagName == "SELECT") {
                if (obj.value.length > 0) {
                    isChecked = true;
                }
            } else {
                for (var i = 0; i < len; i++) {
                    if (obj[i].checked == true) {
                        isChecked = true;
                        break;
                    }
                }
            }
            if (isChecked == false) {
                if (obj.tagName == "SELECT") {
                    var tmp_id = obj.id;
                    if(obj.alt) {
                        var tmp_alt = obj.alt;
                    } else {
                        var tmp_alt = obj.readAttribute("alt");
                    }
                } else {
                    var tmp_id = obj[0].id;
                    var tmp_alt = obj[0].alt;
                }
                this.__setError(tmp_id, errmsg_container_id, msg || msg_select.format(tmp_alt));
                return false;
            }
        } else {
            if (obj.value.strip().length == 0) {
                if (msg == null) {
                    if (obj.tagName == "SELECT") {
                        msg = msg_select.format(obj.getAttribute("alt"));
                    } else {
                        msg = msg_input.format(obj.getAttribute("alt"));
                    }
                }
                this.__setError(obj.id, errmsg_container_id || obj.id, msg);
                return false;
            }
        }
        return true;
    },

    isEmail: function(obj, errmsg_container_id, msg) {
        if (obj.value.length > 0 && false == isValidEmail(obj.value)) {
            this.__setError(obj.id, errmsg_container_id || obj.id, msg || msg_invalid_email);
            return false;
        }
        return true;
    },

    isNumber: function(obj, errmsg_container_id, msg) {
        var chars = "0123456789.";
        if (obj.value.length > 0) {
            if (false == this.__containsCharsOnly(obj.value, chars)) {
                this.__setError(obj.id, errmsg_container_id || obj.id, msg_number.format(obj.alt));
                return false;
            }
        }
        return true;
    },

    comparePasswd: function(obj1, obj2, errmsg_container_id, msg) {
        if (obj1.value.length > 0 && obj2.value.length > 0 && obj1.value != obj2.value) {
            this.__setError(obj2.id, errmsg_container_id || obj2.id, msg_compare_passwd);
            return false;
        }
        return true;
    },

    isDateString: function(obj, errmsg_container_id, msg) {
        var tmp = obj.value.split(' ');
        var t_date = tmp[0].split('-');
        var t_time = tmp[1].split(':');
        var date = new Date(t_date[0], t_date[1], t_date[2], t_time[0], t_time[1], t_time[2]);
        if (!(date.getTime() / 1000.0)) {
            this.__setError(obj.id, errmsg_container_id || obj.id, msg_invalid_date.format(obj.alt));
            return false;
        }
    },

    checkMemberId: function(obj, errmsg_container_id, msg) {
        if (false == idCheck(obj.value)) {
            this.__setError(obj.id, errmsg_container_id || obj.id, msg_member_id);
            return false;
        }
        return true;
    },

    checkOut: function(json_data) {
        if (this.some_error == true) {
            return false;
        }
        if (json_data != null) {
            this.errorFields = json_data;
        }
        var len = this.errorFields.length;
        if (len > 0) {
            for (var i = 0; i < len; i++) {
                if (i == 0) {
                    try { var obj = $(this.errorFields[i].id).focus(); } catch(e) {}
                }
                if (this.errorMsg.length > 0) {
                    this.errorMsg += "\n";
                }
                this.errorMsg += this.errorFields[i].msg;
                if($(this.error_message_field_prefix + this.errorFields[i].field)) {
                    $(this.error_message_field_prefix + this.errorFields[i].field).update(this.errorFields[i].msg);
                }
            }
            alert(this.alert_title + this.errorMsg);
            return false;
        }
        return true;
    },
    
    /**
     * checkOutNoAlert 
     * Created at 2008/09/24
     * @author onodera
     */
    checkOutNoAlert: function(json_data) {
        if (this.some_error == true) {
            return false;
        }
        if (json_data != null) {
            this.errorFields = json_data;
        }
        var len = this.errorFields.length;
        if (len > 0) {
            for (var i = 0; i < len; i++) {
                /*
                if (i == 0) {
                    try { var obj = $(this.errorFields[i].id).focus(); } catch(e) {}
                }
                */
                if (this.errorMsg.length > 0) {
                    this.errorMsg += "\n";
                }

                this.errorMsg += this.errorFields[i].msg;
                $(this.error_message_field_prefix + this.errorFields[i].field).update(this.errorFields[i].msg);
            }
            return false;
        }
        return true;
    },

    __containsCharsOnly: function(value, chars) {
        for (var inx = 0; inx < value.length; inx++) {
            if (chars.indexOf(value.charAt(inx)) == -1) {
                return false;
            }
        }
        return true;
    },

    __setError: function(id, field, msg) {
        this.errorFields.push({"id":id, "field":field, "msg":msg});
    },

    __clear: function() {
        $$("span." + this.error_message_class_name).each(function(el) {
            el.update(null);
        });
    },
    
    /**
     * __clearErrorMsg 
     * Created at 2008/09/24
     * @author onodera
     */
    __clearErrorMsg: function(id) {
        var len = this.errorFields.length;
        if (len > 0) {
            for (var i = 0; i < len; i++) {
            if(this.errorFields[i]){
                if(this.errorFields[i]["id"] == id){
                    this.errorFields.splice(i,1);
                }
            }
            }
        }
    }
    

};

/**
 * isEqual
 * Created at 2008/10/15
 * @author onodera
 * @param param1
 * @param param2
 */
function isEqual(str1,str2){
    if(str1!=str2){
        return false;
    }else{
        return true;
    }
}

/**
 * 아이디 유효성 체크 함수
 * 아이디는 영문, 숫자만 가능하며(하이픈, 언더바) 4자에서 24자까지 가능함
 * 이부분을 수정하게 되면 lib/util.php.utlMemberIdCheck 함수도 같이 수정할것
 */
function idCheck(id) {
    var id_pattern = /[^a-z0-9]+/ig;
    if (id_pattern.test(id) == true || id.length < 4 || id.length > 24) {
        return false;
    } else {
        return true;
    }
}

function isValidEmail(strEmail) {
    var str = strEmail;
    var at="@"
    var dot="."
    var lat=str.indexOf(at)
    var lstr=str.length
    var ldot=str.indexOf(dot)

    if (str.indexOf(at)==-1){
        return false
    }
    if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
        return false
    }
    if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
        return false
    }
    if (str.indexOf(at,(lat+1))!=-1){
        return false
    }
    if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
        return false
    }
    if (str.indexOf(dot,(lat+2))==-1){
        return false
    }
    if (str.indexOf(" ")!=-1){
        return false
    }
    var iChars = "*|,\":<>[]{}`\';()&$#%";
    for (var i = 0; i < str.length; i++) {
        if (iChars.indexOf(str.charAt(i)) != -1) {
            return false;
        }
    }
    return true                    
}
