Namespace.register("U.UF.IMG");

/**
* 图片预加载方法
*
* @param  {string}  需要加载的图片地址
* @param  {function}  预加载回调函数
* @param  {function}  加载成功回调
* @param  {function}  错误处理回调
* @return  {element}  图片元素
*/
U.UF.IMG.imgReady = function (url, URD, ULD, UE) {
    var _UW,
    _UH,
    _UNW, //image对象的width属性
    _UNH, //image对象的height属性
    _UIMG = new Image(); //image对象
    _UOR = function () { //预加载
        _UIMG = _UIMG || this;
        _UNW = _UIMG.width;
        _UNH = _UIMG.height; //获取加载图片的长宽
        if ((_UNW !== _UW || _UNH !== _UH) || _UNH !== 0) {
            if (URD) { URD.call(_UIMG) };
            _UOR.end = true;
        }
    };
    U.selectEl(_UIMG).addAttrArray({ "src": url,
        "onload": function () { //成功加载回调
            setTimeout(function () {
                if (!_UOR.end) { _UOR() }; 
                if (_UIMG) { _UIMG.onload = _UIMG.onerror = null };
                if (_UIMG && ULD) { ULD.call(_UIMG) };
                _UIMG = null;
            }, 0);
        },
        "onerror": function () { //错误图片处理
            if (U.UF.C.IsNetwork()) {
                if (UE) { UE.call(_UIMG) };
            }
        }
    });
    if (_UIMG) { //说明图片还在加载中
        _UOR(); //执行预加载处理
        if (_UIMG.complete == true) { //判断是否已经成功加载过了 缓存图片处理
            _UIMG.onload(); return;
        }
    }
    if (!_UOR.end) { //添加进入图片大小加载事件
        U.UF.IMG.imgReady._UL.push(_UOR);
        if (U.UF.IMG.imgReady._UIT == null) {
            U.UF.IMG.imgReady._UIT = setInterval(U.UF.IMG.imgReady._URT, 40); //每40毫秒进入
        }
    }
    return _UIMG;
}

U.UF.IMG.imgReady._UIT; //计时器初始化
U.UF.IMG.imgReady._UL = []; //需要预加载的图片集

//去除预加载计时
U.UF.IMG.imgReady._US = function () {
    clearInterval(U.UF.IMG.imgReady._UIT);
    U.UF.IMG.imgReady._UIT = null;
};

//计时加载逐个加载处理
U.UF.IMG.imgReady._URT = function () {
    for (var i = 0; i < U.UF.IMG.imgReady._UL.length; i++) {
        U.UF.IMG.imgReady._UL[i].end ? U.UF.IMG.imgReady._UL.splice(i--, 1) : U.UF.IMG.imgReady._UL[i]();
    }
    if (!U.UF.IMG.imgReady._UL.length) { U.UF.IMG.imgReady._US() };
}