/*
 *=============================================
 * フォームユーティリティオブジェクト
 *=============================================
 */
function FormCheck(id){
    this.formId = id;
    this.start(id);
}
FormCheck.prototype.formId = null;
FormCheck.prototype.allCheck = function(e){

    // 全てのチェックを実行
    for (var i=0; i<this.callbacks.length; i++){
        this.callbacks[i]();
    }

    if (!this.elements.all()){
        Event.stop(e);
        return false;
    }

    return true;
}
FormCheck.prototype.allCheckCallback = null;
FormCheck.prototype.start = function(){
    this.allCheckCallback = this.allCheck.bindAsEventListener(this);
    Event.observe(this.formId, 'submit', this.allCheckCallback);
}
FormCheck.prototype.stop = function(){
    // submit時のチェックをキャンセル
    if (this.allCheckCallback)
    Event.stopObserving(this.formId, 'submit', this.allCheckCallback);
}
FormCheck.prototype.maxElements = 0;
FormCheck.prototype.elements = new Array();
FormCheck.prototype.callbacks = new Array();
FormCheck.prototype.register = function(target, callback, options){
    if (options){
        var errorMsg  = options['error'] || null;
        var preCheck  = options['preCheck'] || null;
        var postCheck = options['postCheck'] || null;
        var result    = options['result'] || null;
        var checkAll  = options['checkAll'] || null;
        var getFunc   = options['getFunc'] || null;
    }

    var index = this.maxElements;
    
    this.elements[index] = false;

    if (typeof target == 'array' || typeof target == 'object'){
        // チェックするフォームターゲットが複数の場合は0番目をキーにする
        var mainTarget = target[0];
    }else{
        var mainTarget = target;
    }
    
    if (!result){
        result = $(mainTarget).getAttribute('ID') + "Check";
        if (!result)
            return false;
    }

    
    var func = (function(){
        if (typeof target == 'array' || typeof target == 'object'){
            var elements = new Array(target.length);
            for (var i=0; i<target.length; i++){
                elements[i] = Form.Element.getValue(target[i]);
            }
        }else{
            var elements = Form.Element.getValue(target);
        }

        //================================
        // チェック用コールバック関数起動
        //================================
        if (preCheck && preCheck.length){
            for (var i=0; i<preCheck.length; i++){
                (preCheck[i] || Prototype.emptyFunction)();
            }
        }else{
            (preCheck || Prototype.emptyFunction)();
        }
        var check = callback(elements, errorMsg);

        if (!check || check.length != 2){
            // 結果が返ってこない関数
            return;
        }
        if (check[0]){
            // 成功
            if (postCheck && postCheck.length){
                for (var i=0; i<postCheck.length; i++){
                    (postCheck[i] || Prototype.emptyFunction)();
                }
            }else{
                (postCheck || Prototype.emptyFunction)();
            }

            Element.removeClassName(result, 'formCheckError');
            Element.addClassName(result, 'formCheckOk');
            this.elements[index] = true;
        }else{
            // 失敗
            Element.removeClassName(result, 'formCheckOk');
            Element.addClassName(result, 'formCheckError');
            this.elements[index] = false;
        }
        $(result).innerHTML = check[1];
    }).bind(this);

    if (getFunc){
        return func;
    }

    if (checkAll && (typeof target == 'array' || typeof target == 'object')){
        for (var i=0; i<target.length; i++){
            Event.observe(target[i], 'keyup', func);
            Event.observe(target[i], 'change', func);
        }
    }else{
        Event.observe(mainTarget, 'keyup', func);
        Event.observe(mainTarget, 'change', func);
    }

    this.callbacks[index] = func;

    this.maxElements++;

    return func;
}

/*
 *=============================================
 * 共通チェック関数
 *=============================================
 */
FormCheck.prototype.inputCheck = function(str){
    if (str.length == 0){
        return [false, '入力されておりません'];
    }else{
        return [true, ''];
    }
}
FormCheck.prototype.mailCheck = function(str){
    if (str.length == 0){
        return [false, 'メールアドレスをご入力下さい'];
    }else if (str.match(/^[-+a-zA-Z0-9_.]+@[-a-zA-Z0-9.]+\.[-a-zA-Z0-9.]+$/)){
        return [true, ''];
    }else{
        return [false, '正しいメールアドレスをご入力下さい'];
    }
}
FormCheck.prototype.passwordCheck = function(str){
    if (str.length == 0){
        return [false, 'パスワードを入力してください'];        
    }else if (str.length < 8){
        return [false, 'パスワードは半角8文字以上必要です'];
    }else{
        return [true, ''];
    }
}
/**
 * 入力同一チェック
 * @param array values 入力文字列
 * @param string errorMsg エラーメッセージ
 * @return array
 */
FormCheck.prototype.equalCheck = function(values, errorMsg){
    if (values[0].length == 0){
        return [false, '入力されておりません'];
    }

    if (!errorMsg){
        errorMsg = '入力されました内容が異なっております';
    }
    if (values[0] == values[1]){
        return [true, ''];
    }else{
        return [false, errorMsg];
    }
}

/**
 * どちらか片方が入力必須
 * @param array values 入力文字列
 * @param string errorMsg
 * @return array
 */
FormCheck.prototype.orCheck = function(values, errorMsg){
    if (!errorMsg){
        errorMsg = 'どちらか一方を必ず入力してください';
    }

    if (values[0].length == 0 && values[1].length == 0){
        return [false, errorMsg];
    }else{
        return [true, ''];
    }
}

/**
 * 電話番号チェック
 * @param string str
 * @param string errorMsg
 * @return array
 */
FormCheck.prototype.phoneCheck = function(str, errorMsg){
    if(!errorMsg){
        errorMsg = '電話番号を入力してください';
    }

    if (str.length == 0)
    return [true, ''];

    if(str.length > 13 && str.length < 11){
        return [false, errorMsg];
    } else if(str.match(/^[0-9]+-[0-9]+-[0-9]{4}$/)){
        return [true, ''];
    } else {
        return [false, errorMsg];
    }
}

/**
 * 電話番号どちらか片方が必須入力
 * @param array value 入力文字列
 * @param string errorMsg
 * @return array
 */
FormCheck.prototype.orPhoneCheck = function(values, errorMsg){
    if(!errorMsg){
        errorMsg = 'どちらか一方を必ず入力してください';
    }

    if(values[0].length == 0 && values[1].length == 0){
        return [false, errorMsg];
    } else {
        if(values[0].match(/[^0-9-]/) || values[1].match(/[^0-9-]/)){
            errorMsg = 'どちらかに数字とハイフン以外の文字が混ざっています';
            return [false, errorMsg];
        } else if(values[0].match(/^[0-9]{2,}-[0-9]+-[0-9]{4}$/)){
            return [true, ''];
        } else if(values[1].match(/^[0-9]{2,}-[0-9]+-[0-9]{4}$/)){
            return [true, ''];
        } else {
            errorMsg = 'どちらか一方の電話番号の形式が正しくありません';
            return [false, errorMsg];
        }
    }
}
