﻿/** 
 * @fileOverview 表单验证脚本
 * @author Tang Guohui 2011-4-13
 * @version 1.0.0
 */
//新註冊時密碼不能包含帳號，但其它登錄頁面要與舊帳號信息兼容
jQuery.validator.addMethod('likeName', function(value, element)
{
    if (PAGE_NAME == 'signup' || PAGE_NAME == 'activation') 
    {
        if ($('#user_name').length || $('.user_name').length) 
        {
            var name = $('#user_name').length ? $('#user_name').val() : $('.user_name').val();
            name = name.replace(/@.*/, '');
            return this.optional(element) || value.indexOf(name) == -1;
        }
        return true;
    }
    else 
    {
        return true;
    }
});
jQuery.validator.addMethod('pwdSimple', function(value, element)
{
    if (PAGE_NAME == 'signup' || PAGE_NAME == 'active') 
        return this.optional(element) || value != '123456';
    return true;
});
jQuery.validator.addMethod('userName', function(value, element)
{
    if (PAGE_NAME == 'signup') 
        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英文32字符）
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) < 33;
});

function getRemoteObj(data, url, reverse)
{
    var obj;
    data = data ||
    {};
    url = url || 'api.php';
    reverse = reverse ? true : false;
    
    obj = 
    {
        url: url,
        dataType: 'html',
        data: {},
        dataFilter: function(data)
        {
            if (reverse) 
                return data == '1' ? true : false;
            else 
                return data == '1' ? false : true;
        }
    }
    for (var key in data) 
    {
        var value = data[key];
        if (typeof(value) == 'string') 
        {
            if (value.indexOf('#') === 0) 
            {
                obj.data[key] = function()
                {
                    return $(value).val();
                };
            }
            else 
            {
                obj.data[key] = value;
            }
        }
    }
    
    return obj;
}

$(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').text(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').text(msg);
                    else 
                        jTips.appendTo(jElem.parent()).find('span').text(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', 'inline').addClass('invalid'); //添加可能在onfocusin移除的樣式 invalid
                }
                //先填写正确后面再出错时，把之前正确样式引用移去
                $('li input.error').nextAll().filter('div.tip.ok').removeClass('ok');
                //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();
        },
        rules: 
        {
            user_name: 
            {
                required: true,
                userName: true,
                rangelength: [5, 25],
                remote: getRemoteObj(
                {
                    name: '#user_name'
                }, AjaxUrl.username, PAGE_NAME != 'signup')
            },
            user_nick: 'required nickName',
            user_pw: 
            {
                required: true,
                rangelength: [6, 20]
            },
            user_pw1: 
            {
                required: true,
                pwdSimple: true,
                likeName: true,
                rangelength: [6, 20]
            },
            user_pw2: 
            {
                required: true,
                equalTo: '#user_pw1'
            },
            user_email: 
            {
                required: true,
                email: true,
                remote: getRemoteObj(
                {
                    action: 'checkEmail',
                    email: '#user_email'
                }, '/user/ajax/api.php')
            },
            validcode: 
            {
                required: true,
                validCode: true,
                remote: getRemoteObj(
                {
                    code: '#validcode'
                }, AjaxUrl.validcode)
            },
            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: 
            {
                pwdSimple: tip_psw_simple,
                likeName: tip_psw_like_name,
                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,
                remote: tip_email_taken
            },
            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);
});

