$(function() {


    
    var Lang_ja = {
        'MessageDateJP':"ご希望日をyyyy/mm/ddの形式で入力して下さい。",
        'MessagePhone':"電話番号をご確認下さい。(半角数字と'-'ハイフンのみ受付可能です。)",
        'MessageEnableReserve':"ご希望の時間でご予約をお取りできます。",
        'MessageCantGet':"ご希望日時のご予約状況を確認できませんでした。",
        'MessageEmail':"メールアドレスを入力して下さい。",
        'MessagePostcode':"郵便番号を入力して下さい",
        'MessageKatakana':"全角カタカナで入力して下さい。",
        'MessageAlpha':"半角英字で入力して下さい。",
        'MessageAlnum':"半角英数字で入力して下さい。",
        'required':"必須項目です",
        'maxlength' : "{0} 文字以下を入力してください",
        'minlength' : "{0} 文字以上を入力してください",
        'rangelength' : "{0} 文字以上 {1} 文字以下で入力してください",
        'email' : "メールアドレスを入力してください",
        'url' : "URLを入力してください",
        'tell' : "電話番号を入力してください",
        'firstname' : "お名前(名)を入力してください",
        'dateISO' : "日付を入力してください",
        'number' : "有効な数字を入力してください",
        'digits' : "半角数字で入力してください",
        'equalTo' : "同じ値を入力してください",
        'range' : " {0} から {1} までの値を入力してください",
        'max' : "{0} 以下の値を入力してください",
        'min' : "{0} 以上の値を入力してください",
        'creditcard' : "クレジットカード番号を入力してください"
    };

    var Lang_en = {
        'MessageDateJP':"Here is invalid format.",
        'MessagePhone':"Please input format 000-0000-0000",
        'MessageEnableReserve':"OK! Your desired time is vacancy.",
        'MessageCantGet':"Sorry! I can't check your desired time.",
        'MessageEmail':"Please input E-mail.",
        'MessagePostcode':"Please input postcode.",
        'MessageKatakana':"Please input Zenkaku-Katakana.",
        'MessageAlpha':"Please input alpha",
        'MessageAlnum':"Please input alpha-numeric",
        'required':"This field is required.",
        'maxlength' : "Please input {0} characters or less.",
        'minlength' : "Please input over {0} characters",
        'rangelength' : "Please input from {0} to {1} characters",
        'email' : "Please input E-mail.",
        'url' : "Please input URL format. (http://www.domain.com/)",
        'tell' : "Please input Dial Number.",
        'firstname' : "Please input firstname,",
        'dateISO' : "Please input date.",
        'number' : "Please input number.",
        'digits' : "Please input digits",
        'equalTo' : "Please input same password.",
        'range' : " Please input form {0} to {1}",
        'max' : "Please input {0} or less.",
        'min' : "Please input over {0}.",
        'creditcard' : "Please input creditcard."
    };
    

    
    //翻訳関数
    var translate = function(key){
        this.lang = $('#language').val();
        this.lang_ja = Lang_ja;
        this.lang_en = Lang_en;
            
        if(this.lang == 'ja'){
            if(this.lang_ja[key] == undefined){
                return key;
            }else{
                return this.lang_ja[key];                
            }
        }else{
            if(this.lang_en[key] == undefined){
                return key;
            }else{
            return this.lang_en[key];                
            }
        }
    }

    /* 全体の設定 */
    var MessageDateJP = translate('MessageDateJP');
    var MessagePhone = translate('MessagePhone');
    var MessageEnableReserve = translate('MessageEnableReserve');
    var MessageCantGet = translate('MessageCantGet');
    var MessageEmail = translate('MessageEmail');
    var MessagePostcode = translate('MessagePostcode');
    var MessageKatakana = translate('MessageKatakana');
    var MessageAlpha = translate('MessageAlpha');
    var MessageAlnum = translate('MessageAlnum');

    jQuery.extend(jQuery.validator.messages, {
        required : translate('required'),
        maxlength : jQuery.format(translate('maxlength')),
        minlength : jQuery.format(translate('minlength')),
        rangelength : jQuery.format(translate('rangelength')),
        email : translate('email'),
        url : translate('url'),
        tell : translate('tell'),
        firstname : translate('firstname'),
        dateISO : translate('dateISO'),
        number : translate('number'),
        digits : translate('digits'),
        equalTo : translate('equalTo'),
        range : jQuery.format(translate('range')),
        max : jQuery.format(translate('max')),
        min : jQuery.format(translate('min')),
        creditcard : translate('creditcard')
    });

    /* jQuery additional-method.js & message_ja.js */
    /* jQuery Validate メソッド追加 */
    /* Emailチェック */
    jQuery.validator
            .addMethod("mmail", function(value, element) {
                // PC-Mail等のみ return this.optional(element) ||
                    // /^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([;.](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$/i.test(value);
                    return this.optional(element)
                            || /^([*+!.&#$|\'\\%\/0-9a-z^_`{}=?~:-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i
                                    .test(value);
                }, MessageEmail);

    /* 郵便番号チェック */
    jQuery.validator.addMethod("zip", function(value, element) {
        return this.optional(element) || /^\d{3}-?\d{4}$/.test(value);
    }, MessagePostcode);

    

    /* 全角カタカナチェック */
    jQuery.validator.addMethod("katakana", function(value, element) {
        return this.optional(element) || /^[ァ-ヶー　 ]+$/.test(value);
    }, MessageKatakana);
    /* 英字のみ */

    jQuery.validator.addMethod("alpha", function(value, element) {
        return this.optional(element) || /^[a-zA-Z \-_]+$/.test(value);
    }, MessageAlpha);

    /* 英数字のみ */

    jQuery.validator.addMethod("alnum", function(value, element) {
        return this.optional(element) || /^[a-zA-Z0-9 \-_]+$/.test(value);
    }, MessageAlnum);

    /* 日本日付チェック */
    jQuery.validator.addMethod("dateJP", function(value, element) {
        var check = false;
        var re = /^(\d{4})[\/-](\d{1,2})[\/-](\d{1,2})$/;
        var re2 = /^(\d{4})(\d{2})(\d{2})$/;

        if (value.match(re)) {
            var aaaa = RegExp.$1;
            var mm = RegExp.$2;
            var gg = RegExp.$3;
        } else if (value.match(re2)) {
            var aaaa = RegExp.$1;
            var mm = RegExp.$2;
            var gg = RegExp.$3;
        } else {
            check = false;
            return this.optional(element) || check;
        }

        var xdata = new Date(aaaa, mm - 1, gg);

        if ((xdata.getFullYear() == aaaa)
            && (xdata.getMonth() == mm - 1)
            && (xdata.getDate() == gg)) {
            check = true;
        } else {
            check = false;
        }
        return this.optional(element) || check;

    }, MessageDateJP);


    
    /* 電話番号チェック */
    jQuery.validator
            .addMethod(
                    "phone",
                    function(phone_number, element) {
                        phone_number = phone_number.replace(/\s+/g, "");
                        return this.optional(element)
                                || phone_number.length > 9
                                && phone_number
                            .match(/^((1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4})|([0-9]{2,5}-[0-9]{1,4}-[0-9]{4})$/)
                    }, MessagePhone);

    /* check_cal関数の 成功時に呼び出される関数 */
    var successCallback = function(response) {
        var text = $.trim(decodeURIComponent(response));

        if (text == true) {
            // $("#CheckRes img").css('display', 'none');
            $("#CheckRes div.loadImg").css('display', 'none');
            $("#CheckRes").removeClass("loading").removeClass("booked")
                    .addClass("vacancy");

            $("#CheckRes span").html(MessageEnableReserve);
            $("#CheckRes span").fadeIn(500);
	    //updnWatermarkのラベルを再度付加
	    $.updnWatermark.attachAll();  
        } else {
            // $("#CheckRes img").css('display', 'none');
            $("#CheckRes div.loadImg").css('display', 'none');
            $("#CheckRes").removeClass("loading").removeClass("vacancy")
                    .addClass("booked");
            $("#CheckRes span").html(text);
            $("#CheckRes span").fadeIn(500);
	    //updnWatermarkのラベルを再度付加
	    $.updnWatermark.attachAll();  
        }
    }

    /* check_cal関数の 失敗時に呼び出される関数 */
    var errorCallback = function(xml, status, e) {
	//updnWatermarkのラベルを再度付加
	$.updnWatermark.attachAll(); 
 
        alert('returnSuccess')
        // $("#CheckRes img").css('display', 'none');
        $("#CheckRes div.loadImg").css('display', 'none');
        $("#CheckRes").removeClass("loading").removeClass("vacancy").addClass(
                "booked");

        $("#CheckRes span").html(MessageCantGet);

        $("#CheckRes span").fadeIn(500);
    }

    function check_cal(event) {
        if ($('#optionMenu-element input:checked').size() == 0){
            $("#CheckRes span").css('display','none');
        }
        
        if ($("form").validate().check("#rsvDate")
                && $("form").validate().check("#dateH")
                && $("form").validate().check("#datei")
            && (($('#menu').size() > 0
                     && $("form").validate().check("#menu"))
                    || ($('#menu').size() == 0
                        && $('#optionMenu-element input:checked').size() > 0))
            && (($('#assign').size() > 0 && $("form").validate().check("#assign"))
                || $("#assign").size() === 0)
           ){

            $("#rsvDate").valid();
            $("#dateH").valid();
            $("#datei").valid();
            if ($('#menu').size() > 0) {
                $("#menu").valid();
            }
            if ($('#assign').size() > 0) {
                $('#assign').valid();
            }

            $("#CheckRes span").css('display', 'none');

            $("#CheckRes").removeClass('vacancy').removeClass('booked')
                    .addClass('loading');

            $("#CheckRes div.loadImg").fadeIn(300);
	    //updnWatermarkのlabelを消去
	    $("label.updnWatermark").remove();
            var url = document.URL;
            if (url.split("/")[3] === 'form') {
                var param = url.split("form/")[1];
                var params = param.split("/");
                var sid = params[0];
                var fid = params[1];

            } else {
                if (url.indexOf("sid/")) {
                    var param = url.split("sid/")[1];
                    var params = param.split("/");
                    var sid = params[0];
                    var fid = params[2];
                }
            }
            var json = $("form").serializeArray();

            var data = {};
            var optionMenu = new Array();
            for ( var i in json) {
                switch (json[i].name) {
                    case "rsvDate":
                        data.rsvDate = json[i].value;
                        break;
                    case "dateH":
                        data.dateH = json[i].value;
                        break;
                    case "datei":
                        data.datei = json[i].value;
                        break;
                    case "assign":
                        data.assign = json[i].value;
                        break;
                    case "menu":
                        data.menu = json[i].value;
                        break;
                    case "optionMenu[]":
                        optionMenu.push(json[i].value);
                        break;
                    default:
                        break;
                }
            }

            data['optionMenu[]'] = optionMenu;

            $.ajax( {
                'type' : "POST",
                'url' : "/reserve/reserve/ajax/sid/" + sid + '/fid/' + fid,
                'data' : data,
                'success' : successCallback,
                'error' : errorCallback
            });

        } else {
            $("#CheckRes").removeClass('vacancy').removeClass('booked')
                    .removeClass('loading');
        }
    }

    if($("#reqSub").size() > 0){
        $("form").validate({
            rules:{
                "optionMenu[]":{
                    required:true,
                    minlength:1
                }
            }
        })        
    }

    jQuery(document).ready(function($) {  
	$.updnWatermark.attachAll();  
    });  

    //サブミットで行が増えてズレが生じたら再度ラベルを付加
    $("form").submit(function(){
        $("label.updnWatermark").remove();
        $.updnWatermark.attachAll();
    });
    
    $("#dateH").blur(check_cal);
    $("#datei").blur(check_cal);
    $("#menu").blur(check_cal);
    $("#assign").blur(check_cal);
    $("#optionMenu-element input").click(check_cal);

    $("form").validate( {
        groups : {
            date : "dateH datei"
        },
        errorPlacement : function(error, element) {
            switch (element.attr('name')) {
                case "dateH":
                    error.insertAfter($('#datei'));
                    break;
                default:
                    error.insertAfter(element);
                    break;
            }
        },
        success : function(label) {
            $("input:filled").validate();
            $("select:filled").validate();
            $("textarea:filled").validate();
            label.addClass("valid").text("OK!");
        }
    });



    
    // $("#rsvDate").trigger("focus");

    $("#rsvDate:not(:hidden)").datepicker(
            {
                beforeShowDay : function(date) {
                    var weeks = date.getDay();
                    var texts = "";
                    if (weeks == 0)
                        texts = "休日";
                    // 休日のチェック
                    if (date.isJpHoliday()) {
                        texts = date.jp_hol_name;
                        // description = d.jp_hol_desc;
                        weeks = 0;
                    }
                    if (weeks == 0)
                        return [ true, 'days_red', texts ];
                    else if (weeks == 6)
                        return [ true, 'days_blue' ];
                    return [ true, 'days_black' ];
                },
                // showButtonPanel : true,
                minDate : $('#sdate').val(),
                maxDate : $('#edate').val(),
                closeText : 'close',
                firstDay : 1,
                dayNamesMin : [ '日', '月', '火', '水', '木', '金', '土' ],
                monthNames : [ '1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月',
                        '9月', '10月', '11月', '12月' ],
                dateFormat : 'yy/mm/dd',
                showOn : 'both', // buttonとfocusでtriger
                buttonText : 'カレンダー',
                buttonImageOnly : true,
                buttonImage : '/images/frame.png',
                onClose : function(dateText, inst) {
                    $("#rsvDate").valid();
                    check_cal();
                }
            });
});

