﻿/*
输入检查的函数库
*/

//显示信息配置
var errorMsgStringConfig =
{
    "EmptyMsg": "不能为空",
    "LengthRangeMsg":
    {
        "LangerThan": "的长度应该大于",
        "ShorterThan": "的长度应该小于",
        "Range":
        {
            "Msg1": "的长度应该在",
            "Msg2": "到",
            "Msg3": "之间"
        }
    },
    "CheckEquals":"不一致",
    "CheckDate": "的格式须为：yyyy-mm-dd",
    "CheckIsNum":"必须是数字",
    "CheckEmailMsg":"的格式不正确",
    "CheckMaxLength":"的长度不能超过"
}


//清空现有提示信息信息
function ClearErrorMsg()
{
    var errorCtrl = _GetErrorCtrl();
    if (errorCtrl != null)
    {
        errorCtrl.innerHTML = "";
        errorCtrl.style.display = "none";
    }
}


//检查是否为空
function CheckEmpty(ctrlId, msg)
{
    //输入参数合法性检查
    if (_IsNullOrEmpty(ctrlId) || _IsNullOrEmpty(msg))
    {
        return false; 
    }

    var flag = false;
    var errorMsg = msg + errorMsgStringConfig.EmptyMsg;
    var ctrl = _GetElementById(ctrlId);

    if (_CheckCtrlType(ctrl) && ctrl.value.trim() != "")
    {
        flag = true;
    }
    
    if (flag == false)
    {
        _ShowError(errorMsg)
    }

    return flag;
}


//检查是否为空(第一个参数为字符串)
function CheckStringEmpty(str, msg)
{
    var notEmpty = false;
    var errorMsg = msg + errorMsgStringConfig.EmptyMsg;

    if (str != null && str.trim() != "")
    {
        notEmpty = true;
    }

    if (notEmpty == false)
    {
        _ShowError(errorMsg)
    }

    return notEmpty;
}


//检查长度范围
//不分全角半角
//参数不同代表的意义也不同：
//1. minLength != null 且 maxLength != null时：长度在于某个范围之间(包括等于minLength或maxLength)
//2. minLength == null 且 maxLength != null时：长度小于于某值
//3. minLength != null 且 maxLength == null时：长度大于于某值
function CheckLengthRange(ctrlId, msg, minLength, maxLength)
{
    //输入参数合法性检查
    if (_IsNullOrEmpty(ctrlId) || _IsNullOrEmpty(msg) || (_IsNullOrEmpty(minLength) && _IsNullOrEmpty(maxLength)))
    {
        return false;
    }
    //不对空值做检查
    if (_IsCtrlValueIsEmpty(ctrlId))
    {
        return true;
    }
    
    var flag = false;

    if (minLength != null && maxLength != null)
    {
        //长度在于某个范围之间(包括等于minLength或maxLength)
        flag = _CheckLengthRange(ctrlId, msg, minLength, maxLength);
    }
    else if (minLength == null && maxLength != null)
    {
        //长度小于于某值
        flag = _CheckLengthShorterThan(ctrlId, msg, maxLength);
    }
    else if (minLength != null && maxLength == null)
    {
        //长度大于于某值
        flag = _CheckLengthLangerThan(ctrlId, msg, minLength);
    }

    return flag;
}

//检查最大长度
function CheckMaxLength(ctrlId, msg, maxLength)
{
    //输入参数合法性检查
    if (_IsNullOrEmpty(ctrlId) || _IsNullOrEmpty(msg) || _IsNullOrEmpty(maxLength))
    {
        return false;
    }
    //不对空值做检查
    if (_IsCtrlValueIsEmpty(ctrlId))
    {
        return true;
    }

    var flag = false;
    var errorMsg = msg + errorMsgStringConfig.CheckMaxLength + maxLength.toString();
    var ctrl = _GetElementById(ctrlId);

    if (_CheckCtrlType(ctrl))
    {
        if (ctrl.value.trim().length <= maxLength)
        {
            flag = true;
        }
    }
    if (flag == false)
    {
        _ShowError(errorMsg)
    }

    return flag;
}


//检查长度范围
//分全角半角
function CheckRealLengthRange(ctrlId, msg, minLength, maxLength)
{
    //todo:暂时不做实现
}


//检查两个值是否一致
function CheckEquals(ctrlId1, ctrlId2, msg)
{
    //输入参数合法性检查
    if (_IsNullOrEmpty(ctrlId1) || _IsNullOrEmpty(ctrlId2) || _IsNullOrEmpty(msg))
    {
        return false;
    }
    
    var flag = false;
    var errorMsg = msg + errorMsgStringConfig.CheckEquals;
    var ctrl1 = _GetElementById(ctrlId1);
    var ctrl2 = _GetElementById(ctrlId2);

    if (_CheckCtrlType(ctrl1) && _CheckCtrlType(ctrl2))
    {
        if (ctrl1.value.trim() == ctrl2.value.trim())
        {
            flag = true; 
        }
    }

    if (flag == false)
    {
        _ShowError(errorMsg)
    }

    return flag;
}


//检查日期格式
function CheckDate(ctrlId, msg)
{
    //输入参数合法性检查
    if (_IsNullOrEmpty(ctrlId) || _IsNullOrEmpty(msg))
    {
        return false;
    }
    //不对空值做检查
    if (_IsCtrlValueIsEmpty(ctrlId))
    {
        return true;
    }

    var flag = false;
    var errorMsg = msg + errorMsgStringConfig.CheckDate;
    var ctrl = _GetElementById(ctrlId);

    if (_CheckCtrlType(ctrl))
    {
        if (ctrl.value.trim() == "")
        {
            flag = true;
        }
        else
        {
            var str = ctrl.value.trim();
            var result = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
            if (result != null)
            {
                var d = new Date(result[1], result[3] - 1, result[4]);
                var dflag = (d.getFullYear() == result[1] && d.getMonth() + 1 == result[3] && d.getDate() == result[4]);
                if (dflag == true)
                {
                    flag = true;
                }
            }
        }
    }

    if (flag == false)
    {
        _ShowError(errorMsg)
    }

    return flag;
}

//输入是否为浮点数（第一个参数控件ID）
function CheckStringIsDecimal(ctrlId, msg) {

    var flag = false;
    var errorMsg = msg + errorMsgStringConfig.CheckIsNum;
    var ctrl = _GetElementById(ctrlId);
    if (_CheckCtrlType(ctrl)) {
        flag = new RegExp("^\\d+(\\.\\d+)?$").test(ctrl.value.trim())
    }

    if (flag == false) {
        _ShowError(errorMsg)
    }
    return flag;
}

//输入是否为数字（第一个参数为字符串）
function CheckStringIsNum(str, msg)
{
    var errorMsg = msg + errorMsgStringConfig.CheckIsNum;
    var isNum = checkIsNum(str);

    if (!isNum)
    {
        _ShowError(errorMsg);
    }
    else
    {
        return true; 
    }
}


//输入是否为数字
function CheckInputIsNum(ctrlId, msg) {
    //输入参数合法性检查
    if (_IsNullOrEmpty(ctrlId) || _IsNullOrEmpty(msg)) {
        return false;
    }
    //不对空值做检查
    if (_IsCtrlValueIsEmpty(ctrlId)) 
    {
        return true;
    }

    var flag = false;
    var errorMsg = msg + "不是数字";
    var ctrl = _GetElementById(ctrlId);

    if (_CheckCtrlType(ctrl))
    {
        //todo:这个好像只检查正数了
        flag = checkIsNum(ctrl.value.trim());
    }

    if (flag == false) {
        _ShowError(errorMsg)
    }

    return flag;
}


//检查email格式是否正确
function CheckEmail(ctrlId, msg)
{
    //输入参数合法性检查
    if (_IsNullOrEmpty(ctrlId) || _IsNullOrEmpty(msg))
    {
        return false;
    }
    //不对空值做检查
    if (_IsCtrlValueIsEmpty(ctrlId))
    {
        return true;
    }

    var isFormatCorrect = false;
    var errorMsg = msg + errorMsgStringConfig.CheckEmailMsg;
    var ctrl = _GetElementById(ctrlId);

    if (_CheckCtrlType(ctrl))
    {
        if (ctrl.value.trim() == "")
        {
            isFormatCorrect = true;
        }
        else
        {
            var str = ctrl.value.trim();
            isFormatCorrect = CheckIsEMail(str);
        }
    }

    if (!isFormatCorrect)
    {
        _ShowError(errorMsg)
    }

    return isFormatCorrect;
}

//检查金额
function CheckMoney(ctrlId, msg)
{
    //输入参数合法性检查
    if (_IsNullOrEmpty(ctrlId) || _IsNullOrEmpty(msg))
    {
        return false;
    }
    //不对空值做检查
    if (_IsCtrlValueIsEmpty(ctrlId))
    {
        return true;
    }

    var flag = true;

    var reg = /^((\d{1,})|(\d{1,}\.\d{1,2}))$/;
    var obj = _GetElementById(ctrlId);

    if (!reg.test(obj.value.trim()))
    {
        _ShowError(msg + "必须是数字，且小数点后只能有两位，例如99.99");
        isPostAble = false;
    }

    return flag;
}

//检查电话
function CommonValidator_CheckTel(ctrlId, msg)
{
    //输入参数合法性检查
    if (_IsNullOrEmpty(ctrlId) || _IsNullOrEmpty(msg))
    {
        return false;
    }
    //不对空值做检查
    if (_IsCtrlValueIsEmpty(ctrlId))
    {
        return true;
    }

    var flag = true;
    var obj = _GetElementById(ctrlId);
    var reg = /^(([0-9]{3,4}[0-9]{7,8})|([0-9]{3,4}\-[0-9]{7,8}))$/g;

    if (!reg.test(obj.value.trim()))
    {
        _ShowError(msg + "格式不正确！正确的格式为：010-88888888 或 01088888888");
        flag = false;
    }

    return flag;
}

//检查电话
function CommonValidator_CheckEmail(ctrlId, msg) {
    //输入参数合法性检查
    //    if (_IsNullOrEmpty(ctrlId) || _IsNullOrEmpty(msg)) {
    //        return false;
    //    }
    //不对空值做检查
    if (_IsCtrlValueIsEmpty(ctrlId)) {
        return true;
    }

    var flag = true;
    var obj = _GetElementById(ctrlId);
    var reg = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;

    if (!reg.test(obj.value.trim())) {
        _ShowError(msg + "格式不正确！正确的格式为：123@abc.net");
        flag = false;
    }

    return flag;
}

//检查手机
function CommonValidator_CheckMobile(ctrlId, msg)
{
    //输入参数合法性检查
    if (_IsNullOrEmpty(ctrlId) || _IsNullOrEmpty(msg))
    {
        return false;
    }
    //不对空值做检查
    if (_IsCtrlValueIsEmpty(ctrlId))
    {
        return true;
    }

    var flag = true;
    var obj = _GetElementById(ctrlId);
    var reg = /^(1[358]\d{9})$/;

    if (!reg.test(obj.value.trim()))
    {
        _ShowError(msg + "格式不正确！正确格式为：13999999999 或 15999999999 或 18999999999");
        flag = false;
    }

    return flag;
}

//检查邮编
function CommonValidator_CheckPostalCode(ctrlId, msg)
{
    //输入参数合法性检查
    if (_IsNullOrEmpty(ctrlId) || _IsNullOrEmpty(msg))
    {
        return false;
    }
    //不对空值做检查
    if (_IsCtrlValueIsEmpty(ctrlId))
    {
        return true;
    }

    var flag = true;
    var obj = _GetElementById(ctrlId);
    var reg = /^[0-9]{6}$/;

    if (!reg.test(obj.value.trim()))
    {
        _ShowError(msg + "格式不正确！需要六位的数字，例如：100086");
        flag = false;
    }

    return flag;
}

/*--以下是私有函数，大家不要调用------------------------------------------------------------------------------------------------------------------*/

//得到用于错误显示的控件
function _GetErrorCtrl()
{
    var ctrl = null;

    //todo:待定
    var ctrlId = "divErrorMsg";
    ctrl = _GetElementById(ctrlId);
    
    return ctrl;
}

//显示错误信息
function _ShowError(fullMsg)
{
    var errorCtrl = _GetErrorCtrl();
    if (errorCtrl != null)
    {
        if (errorCtrl.innerHTML == "")
        {
            errorCtrl.innerHTML = fullMsg;
        }
        else
        {
            errorCtrl.innerHTML += "<br/>" + fullMsg;
        }
        errorCtrl.style.display = "";
        
        //调整页面位置到错误信息
        ScrollToElement(document.getElementById(errorCtrl.id));
    }
}

//长度大于某值
function _CheckLengthLangerThan(ctrlId, msg, length)
{
    var flag = false;
    var errorMsg = msg + errorMsgStringConfig.LengthRangeMsg.LangerThan + length;
    var ctrl = _GetElementById(ctrlId);

    if (_CheckCtrlType(ctrl))
    {
        if (ctrl.value.trim().length > length)
        {
            flag = true;
        }
    }
    
    if (flag == false)
    {
        _ShowError(errorMsg)
    }

    return flag;
}

//长度小于于某值
function _CheckLengthShorterThan(ctrlId, msg, length)
{
    var flag = false;
    var errorMsg = msg + errorMsgStringConfig.LengthRangeMsg.ShorterThan + length;
    var ctrl = _GetElementById(ctrlId);

    if (_CheckCtrlType(ctrl))
    {
        if (ctrl.value.trim().length < length)
        {
            flag = true;
        }
    }
    
    if (flag == false)
    {
        _ShowError(errorMsg)
    }

    return flag;
}

//长度在于某个范围之间
function _CheckLengthRange(ctrlId, msg, minLength, maxLength)
{
    var flag = false;
    var errorMsg = msg + errorMsgStringConfig.LengthRangeMsg.Range.Msg1 + minLength + errorMsgStringConfig.LengthRangeMsg.Range.Msg2 + maxLength + errorMsgStringConfig.LengthRangeMsg.Range.Msg3;
    var ctrl = _GetElementById(ctrlId);

    if (_CheckCtrlType(ctrl))
    {
        if (ctrl.value.trim().length >= minLength && ctrl.value.trim().length <= maxLength)
        {
            flag = true;
        }
    }
    
    if (flag == false)
    {
        _ShowError(errorMsg)
    }

    return flag;
}

//根据id得到服务器端控件
//因为在子母页中控件的id变化了，所以要用这个方法来取控件
function _GetElementById(ctrlId)
{
    var element = null;

    var firstPart = "";
    
    //非子母页没有定义这个变量，所以会出异常，忽略就可以了
    try
    {
        firstPart = __firstPartOfServiceCtrlClientID;        
    }
    catch (ex)
    { }

    if (firstPart == "")
    {
        element = document.getElementById(ctrlId);
    }
    else
    {
        element = document.getElementById(firstPart + "_" + ctrlId);
    }
    
    return element;
}


//是否为null或者empty
//todo:现在为私有方法，以后可以考虑公有
function _IsNullOrEmpty(str)
{
    var flag = false;

    if (str == null || str == "")
    {
        flag = true;
    }

    return flag;
}

//检查控件是否存在，是否具有value属性
//原理：我们现在所检查的控件只针对具有value属性的控件
function _CheckCtrlType(ctrl)
{
    var flag = false;
    
    if (ctrl != null && ctrl.value != null)
    {
        flag = true;
    }

    return flag;
}

//检查控件的值是否为空
function _IsCtrlValueIsEmpty(ctrlId)
{
    var flag = false;

    var ctrl = _GetElementById(ctrlId);
    if (_CheckCtrlType(ctrl) && ctrl.value.trim() == "")
    {
        flag = true;   
    }

    return flag;
}
