﻿/** 
 * @fileOverview 表单验证脚本
 * @author Tang Guohui 2011-4-13
 * @version 1.0.0
 */
jQuery.validator.addMethod('userName', function(value, element)
{
    if (PAGE_NAME == 'lostpassword' || PAGE_NAME == 'login') 
        return this.optional(element) || /^[A-Za-z0-9_\-\.]*$/.test(value);
    else 
        return this.optional(element) || /^[A-Za-z0-9_\.]*$/.test(value);
});
//大小写英字母5~8位
jQuery.validator.addMethod('validCode', function(value, element)
{
    return this.optional(element) || /^[A-Za-z]{5,8}$/.test(value);
});
//小于等于（中文8英文16字符）
jQuery.validator.addMethod('nickName', function(value, element)
{
    var getLen = function(value)
    {
        var w = 0;
        for (var i = 0; i < value.length; i++) 
        {
            var c = value.charCodeAt(i);
            if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) 
                w++;
            else 
                w += 2;
        }
        return w;
    };
    return this.optional(element) || getLen(value) < 17;
});

$(document).ready(function()
{
    $('form.form1:eq(0)').validate(
    {
        onfocusin: function(elem)
        {
            var messages = tip_default_msg;
            
            var msg = messages[elem.name];
            if (!msg) 
                return;
            
            var jElem = $(elem);
            if (elem.type && (elem.type == 'text' || elem.type == 'password') && (elem.value == '' || jElem.hasClass('error'))) 
            {
                var tipDiv = jElem.next('div.tip');
                if (tipDiv.length) 
                {
                    tipDiv.removeClass('invalid').find('span').html(msg);
                }
                else 
                {
                    //這裡span要加error樣式引用，為了進入showErrors each判斷
                    var jTips = $('<div class="tip default"><span class="error"/><i/></div>');
                    //登录密码框特殊处理
                    if (elem.name == 'user_pw') 
                        jTips.insertAfter(elem).find('span').html(msg);
                    else 
                        jTips.appendTo(jElem.parent()).find('span').html(msg);
                }
            }
        },
        //onkeyup: false,
        ignore: '.ignore',
        wrapper: 'div class="tip invalid"',
        errorElement: 'span',
        errorPlacement: function(error, element)
        {
			if (element.attr('class').indexOf('ignore') != -1)
			{
				element.removeClass('error');
				return false;
			}
			
			var id = element.attr('id');
            //驗證碼與協議提示放在表單文字最後面
            if (id == 'validcode' || id == 'agreentment') 
                error.appendTo(element.parent());
            else 
                error.insertAfter(element);
        },
        showErrors: function(errorMap, errorList)
        {
            this.defaultShowErrors();
            $('div.tip span.error').each(function()
            {
                var _this = $(this), _parent = _this.parent();
                //控制div.tip的同步顯示與隱藏
                if (_this.css('display') == 'none') 
                {
                    _parent.css('display', 'none');
                }
                else 
                {
                    //刪除默認提示信息
                    if (_parent.hasClass('default')) 
                        _parent.remove();
                    //增加額外標籤以顯示小箭頭
                    if (!_parent.find('i').length) 
                        _parent.append('<i/>');
                    _parent.css('display', 'block').addClass('invalid'); //添加可能在onfocusin移除的樣式 invalid
                }
                //先填写正确后面再出错时，把之前正确样式引用移去，css('left', 0)因注册用户名勾符号而增加
                $('li input.error').nextAll().filter('div.tip.ok').removeClass('ok').css('left', 0);
                //4.29修正DIV重复添加
                _parent.nextAll('div').remove();
            });
        },
        success: function(label)
        {
            var div;
            if (label[0].tagName == 'SPAN') 
            {
                label.parent().addClass('ok');
                div = label.parent();
            }
            else 
            {
                label.addClass('ok');
                div = label;
            }
            div.prevAll('div.tip').remove();
			//注册勾符号位置调整
			if (PAGE_NAME == 'signup' && $(label).attr('htmlfor') == 'user_name')
			{
				div.css('left',300);
			}
        },
        rules: 
        {
            user_name: 
            {
                required: true,
                userName: true,
                rangelength: [5, 25],
                remote: 
                {
                    url: 'signup.php',
                    dataType: 'html',
                    //cache:false,
                    data: 
                    {
                        name: function()
                        {
                            return $("#user_name").val();
                        }
                    },
                    dataFilter: function(data)
                    {
                        if (PAGE_NAME == 'signup') 
                        {
                            //等于1不可用false
                            return data == '1' ? false : true;
                        }
                        else 
                        {
                            return data == '1' ? true : false;
                        }
                    }
                }
            },
            user_nick: 'required nickName',
            user_pw: 
            {
                required: true,
                rangelength: [6, 20]
            },
            user_pw1: 
            {
                required: true,
                rangelength: [6, 20]
            },
            user_pw2: 
            {
                required: true,
                equalTo: '#user_pw1'
            },
            user_email: 'required email',
            validcode: 
            {
                required: true,
                validCode: true,
                remote: 
                {
                    url: 'signup.php',
                    dataType: 'html',
                    //cache:false,
                    data: 
                    {
                        code: function()
                        {
                            return $("#validcode").val();
                        }
                    },
                    dataFilter: function(data)
                    {
                        return data == '1' ? false : true;
                    }
                }
            },
            agreentment: 'required'
        },
        messages: 
        {
            user_name: 
            {
                rangelength: tip_user_less_char,
                userName: tip_user_limit,
                remote: PAGE_NAME == 'signup' ? tip_user_taken : tip_user_not_exist
            },
            user_pw: 
            {
                password: tip_psw_limit
            },
            user_pw1: 
            
            {
                password: tip_psw_limit
            },
            user_pw2: 
            {
                equalTo: tip_psw_err
            },
            user_nick: 
            {
                required: tip_nick_err,
                nickName: tip_nick_tolen_err
            },
            user_email: 
            {
                email: tip_email_err
            },
            validcode: 
            {
                validCode: tip_format_err,
                remote: tip_valid_err
            },
            agreentment: 
            {
                required: tip_terms_err
            }
        }
    });
    
    function formSubmit()
    {
        //验证表单要加样式名class=form1
        var form1 = $('form.form1:eq(0)');
        if (form1.valid()) 
            form1.get(0).submit();
    }
    
    //回车键表单提交支持，提示按钮class=img-btn
    /*$(document).keydown(function(event)
     {
     if (event.keyCode == 13 && !$('a.img-btn').hasClass('disabled'))
     {
     formSubmit();
     }
     });*/
    //验证码图及及链接使用固定的样式名
    $('img.code-img ,a.code-a').click(function(event)
    {
        $('img.code-img').get(0).src += '?';
    });
    
    var sendBtn = $('a.img-btn');
    if (!sendBtn.hasClass('disabled')) 
    {
        sendBtn.bind('click', formSubmit);
    }
    
    /******************** 注册表单独有 ******************************/
    
    function agreentmentCheck()
    {
        var sendLink = $('a.reg-btn');
        if (this.checked) 
        {
            sendLink.removeClass('disabled');
            sendLink.bind('click', formSubmit);
        }
        else 
        {
            sendLink.addClass('disabled');
            sendLink.unbind('click', formSubmit);
        }
    }
    
    $('#agreentment').bind('click', agreentmentCheck);
});
