﻿/*
    用于js的双向绑定，将js对象与控件绑定
*/
//DataBinder类
(function ($) {
    //name为绑定名，用于绑定控件的名字，如<input value="user.Name"/>
    //如果一个表单绑定了两个对象，为了防止冲突，必须设定name
    $.jbecool.DataBinder = function (obj,type, name) {
        var _obj = obj; //对象
        var _name = name;   //绑定名称
        var _type=type; //对象类型

        //设置值：将js实体对象值赋值到控件中
        this.setValue = function (value) {
            _obj = value;
            for (var p in value) {
                $("*[bind]").each(function () {
                    var tmp = $(this).attr("bind");
                    var attName = tmp.substr(tmp.lastIndexOf(".") + 1);
                    var objectName = tmp.substring(0, tmp.indexOf("."));
					if (((_name == null || _name == undefined) || _name == objectName) && (attName == p))
                        $(this).val(value[p]);
                });
            }
        };
        //获取值：从控件获取值到js实体对象中
        this.getValue = function () {
            for (var p in _obj) {
                $("*[bind]").each(function () {
                    var tmp = $(this).attr("bind");
                    var attName = tmp.substr(tmp.lastIndexOf(".") + 1);
                    var objectName = tmp.substring(0, tmp.indexOf("."));
					if (((_name == null || _name == undefined) || _name == objectName) && (attName == p))
                    {
                        //没有设置对象类型，就按值类型来取，但对于null值取出来可能不正确
                        if($.jbecool.isNullOrEmpty(_type))
                        {
                            switch (typeof (_obj[p])) {
                                case "number":
                                    _obj[p] = Number($(this).val());
                                    break;
                                case "string":
                                    _obj[p] = String($(this).val());
                                    break;
                                case "boolean":
                                    _obj[p] = Boolean($(this).val());
                                    break;
                                //对于obj仅支持为Date类型 
                                //要注意null类型也会解析为object类型  
                                //而null通常是数据库的某个字段为空，这个时候字段类型就无从辨别了
                                case "object":
                                    if (!$.jbecool.isNullOrEmpty($(this).val()))
                                    {
                                        var d = new Date();
                                        d.setTime(Date.parse($(this).val()));
                                        _obj[p] = d;
                                    } else
                                        _obj[p]=$(this).val();
                                    break;
                            }
                        } else {
                            //设置了对象类型，按成员变量的类型来获取，比较精准
                            var _tmpObj=new _type();
                            if(_tmpObj[p] instanceof Date)
                            {
                                var d = new Date();
                                d.setTime(Date.parse($(this).val()));
                                _obj[p] = d;
                            }else
                            {
                                switch (typeof (_tmpObj[p])) {
                                    case "number":
                                        _obj[p] = Number($(this).val());
                                        break;
                                    case "string":
                                        _obj[p] = String($(this).val());
                                        break;
                                    case "boolean":
                                        _obj[p] = Boolean($(this).val());
                                        break;
                                    //要注意null类型也会解析为object类型  
                                    //而null通常是数据库的某个字段为空，这个时候字段类型就无从辨别了
                                    //但js实体暂无对象中套对象的功能
                                    case "object":
                                        _obj[p]=$(this).val();
                                        break;
                                }
                            }
                        }
                    }
                });
            }
        };

        
    };
})(jQuery);
