/*************************************************************************
 * 
 * Intelligence Quotient Box (iqBox)
 * @name           iqBox.js
 * @time           2018-05-09 18:53
 *
*************************************************************************/
;!(function (window, factory){
    if(typeof define === "function" && define.amd){
        define(factory);
    }else if(typeof module === "object" && typeof module.exports === "object"){
        module.exports = factory();
    }else{
        window.iqBox = factory();
    }
})(this, function(){
    var IQobj = {endfun:{}}, regPxe = /\px|em/g, ieBrowser = !-[1, ] ? parseInt(navigator.appVersion.split(";")[1].replace(/MSIE|[ ]/g, "")) : 9;
    // 缓存常用字符
    var doms = ["iqBox", ".iqBox-wrap", ".iqBox-header", ".iqBox-content", ".iqBox-footer", ".iqBox-close", ".iqBox-maxbtn"];
	var random = Math.floor(Math.random() * 9e3);
    var iqDialog = function(options){
        var that = this;
		var config = {
			cell:"",                 // 独立ID,用于控制弹层唯一标识
    		title:"提示信息",         // 标题,参数一：提示文字，参数二：提示条样式  ["提示信息",{color:"#ff0000"}]
     		content:"暂无内容！",      // 内容
    		boxStyle:{},             // 设置弹层的样式
			closeBtn:true,           // 标题上的关闭按钮
			closefun:null,
			maxBtn:false,            // 是否开启最大化按钮
			boxSize:["auto", "auto"],// 参数一：弹层宽度，参数二： 弹层高度
			padding:"5px",           // 自定义边距
			offset:["auto", "auto"], // 坐标轴
			type:'dialog',           // 显示基本层类型
			icon:0,                  // 图标,信息框和加载层的私有参数
			button:[],               // 各按钮
			btnAlign:"right",        // btnAlign 按钮对齐方式  left center right
			time:0,                  // 自动关闭时间(秒),0表示不自动关闭
			maskLock:true,           // 是否开启遮罩层
			maskClose:true,          // 点击遮罩层是否可以关闭
			maskColor:["#000", .5],  // 参数一：遮罩层颜色，参数二：遮罩层透明度
			isDrag:true,             // 是否可以拖拽
			isOutAnim:true,          // 关闭动画
			fixed:true,              // 是否静止定位
			zIndex:9999,             // 弹层层级关系
			scrollbar:false,         // 是否允许浏览器出现滚动条
			shadow:true,             // 拖拽风格
			success:null,            // 层弹出后的成功回调方法
			endfun:null
		};
        that.config = $.extend({}, config, options);
        that.iqidx = (that.config.cell == "" || that.config.cell == undefined) ? ++random : that.config.cell.replace(/[#.]/, "");
        that.initView()
    };
    var iqfn = iqDialog.prototype;
    // 初始化并加载弹层骨架
    iqfn.initView = function(){
        var that = this, opts = that.config, idx = that.iqidx, msgCell = opts.content, isType = opts.type, icons = opts.icon, lays = ['dialog', 'iframe', 'loading', 'tips', 'progress'], conType = typeof msgCell === "object", msgType = msgCell[0] && msgCell[0].nodeType === 1, iconMsg = '<div class="iqBox-iconbox iqicon' + icons + '">' + msgCell + "</div>";
        IQobj.scrollbar = opts.scrollbar;
        // 判断ID是否已经存在
        if(opts.cell && $("#" + doms[0] + that.iqidx)[0]) return;
        switch(isType){
            case lays[0]:
                opts.type = lays[0];
                if(typeof msgCell === "string"){
                    opts.content = icons !== 0 ? iconMsg : msgCell;
                }else if(msgType){
                    opts.content = "";
                    // 查询传入的位置
                    IQobj["dispy" + idx] = msgCell.css("display");
                    IQobj["prev" + idx] = msgCell.prev();
                    IQobj["next" + idx] = msgCell.next();
                    IQobj["parent" + idx] = msgCell.parent();
                    if(msgCell.css("display") == "none") msgCell.css("display", "block");
                }
                iqBox.closeAll(lays[0]);
            break;
            case lays[1]:
                opts.type = lays[1];
                var conMsg = conType ? msgCell : [msgCell || "http://ui.sdl888.net/", "auto"];
                opts.content = '<iframe scrolling="' + (conMsg[1] || "auto") + '" allowtransparency="true" id="iqboxiframe' + idx + '" name="' + idx + '" onload="this.className=\'\';" frameborder="0" width="100%" height="100%" src="' + conMsg[0] + '"></iframe>';
                iqBox.closeAll(lays[1]);
            break;
            case lays[2]:
                opts.type = lays[2];
				msgCell = msgCell ? '<div class="text">' + msgCell + '</div>' : '';
				switch(icons){
					case 1:
					case 11:
					case 12:
					case 13:
						opts.content = '<div class="loadbox load' + icons + '"><div class="L"><div class="elem1"></div><div class="elem2"></div></div>' + msgCell + '</div>';
					break;
					case 2:
					case 9:
					case 10:
						opts.content = '<div class="loadbox load' + icons + '"><div class="L"><div class="elem1"></div></div>' + msgCell + '</div>';
					break;
					case 3:
						opts.content = '<div class="loadbox load' + icons + '"><div class="L"><div class="elem1"></div><div class="elem2"></div><div class="elem3"></div><div class="elem4"></div><div class="elem5"></div><div class="elem6"></div><div class="elem7"></div><div class="elem8"></div><div class="elem9"></div><div class="elem10"></div><div class="elem11"></div><div class="elem12"></div></div>' + msgCell + '</div>';
					break;
					case 4:
						opts.content = '<div class="loadbox load' + icons + '"><div class="L"><div class="elem1"></div><div class="elem2"></div><div class="elem3"></div></div>' + msgCell + '</div>';
					break;
					case 5:
						opts.content = '<div class="loadbox load' + icons + '"><div class="L"><div class="elem1"></div><div class="elem2"></div><div class="elem3"></div><div class="elem4"></div><div class="elem5"></div></div>' + msgCell + '</div>';
					break;
					case 6:
					case 7:
						opts.content = '<div class="loadbox load' + icons + '"><div class="L"><div class="elem1"><div></div></div><div class="elem2"><div></div></div><div class="elem3"><div></div></div><div class="elem4"><div></div></div><div class="elem5"><div></div></div></div>' + msgCell + '</div>';
					break;
					case 8:
						opts.content = '<div class="loadbox load' + icons + '"><div class="L"><div class="elem1"></div><div class="elem2"></div><div class="elem3"></div><div class="elem4"></div><div class="elem5"></div><div class="elem6"></div><div class="elem7"></div><div class="elem8"></div><div class="elem9"></div><div class="elem10"></div><div class="elem11"></div><div class="elem12"></div></div>' + msgCell + '</div>';
					break;
				}
                iqBox.closeAll(lays[2]);
            break;
            case lays[3]:
                opts.type = lays[3];
                iqBox.closeAll(lays[3]);
            break;
			case lays[4]:
				opts.type = lays[4];
				iqBox.closeAll(lays[4]);
			break;
        }
		switch(opts.type){
			case lays[3]:
				// tips提示
				var tipW = $.isArray(opts.boxSize) ? opts.boxSize[0] : opts.boxSize, tipH = $.isArray(opts.boxSize) ? opts.boxSize[1] : opts.boxSize;
				var tipDiv = $("<div>",{"class":"iqBox-tips","id":doms[0] + idx}).css({width:tipW,height:tipH,'z-index':opts.zIndex}).css(opts.boxStyle);
				$("body").append(tipDiv.append("<em></em><div class='iqBox-tipscon'>" + opts.content + "</div>"));
				var post = $(opts.cell).offset().top, posl = $(opts.cell).offset().left, tiptop, tipleft, edgecolor, aligngo, spac = opts.spacing, selfH = $(opts.cell).outerHeight(), selfW = $(opts.cell).outerWidth(), tipH = tipDiv.outerHeight(true), tipW = tipDiv.outerWidth(true);
				switch(opts.align){
					case 'top':
					case 'bottom':
						aligngo = opts.align == 'top' ? 'bottom' : 'top';
						edgecolor = 'border-right-color', tipleft = posl;
						tiptop = opts.align == 'top' ? (post - tipH - spac) : (post + selfH + spac);
					break;
					case 'left':
					case 'right':
						aligngo = opts.align == 'left' ? 'right' : 'left';
						edgecolor = 'border-bottom-color', tiptop = post;
						tipleft = opts.align == 'left' ? (posl - tipW - spac) : (posl + selfW + spac);
					break;
				}
				tipDiv.css({top:tiptop,left:tipleft});
				tipDiv.find("em").css(edgecolor, tipDiv.css('background-color')).css(aligngo, -8);
				tipDiv.attr("iqtype", opts.type);
				that.btnCallback(tipDiv);
			break;
			case lays[4]:
				// progress
				var progressDiv = $("<div>",{"id":"nprogress"}), timepid, pN = -100;
				var clamp = function(n, min, max){
					if(n < min) return min;
					if(n > max) return max;
					return n;
				}
				var barPositionCSS = function(){
					var barCSS;
					switch(opts.positionUsing){
						case 'translate3d':
							barCSS = "transform:translate3d(" + pN + "%,0,0);";
						break;
						case 'translate':
							barCSS = "transform:translate(" + pN + "%,0);";
						break;
						default:
							barCSS = "margin-left:" + pN + "%;";
					}
					barCSS += "transition:all 200ms ease";
					return barCSS;
				}
				var _Con = '<div class="bar" style="' + barPositionCSS() + '"><div class="peg"></div></div>';
				_Con += opts.showSpinner ? '<div class="spinner"><div class="icon"></div></div>' : '';
				switch(opts.status){
					case 'start':
						if(!document.getElementById('nprogress')){
							$("body").append(progressDiv.append(_Con));
							timepid = setInterval(function(){
								if(pN >= -1){
									clearInterval(timepid);
									return;
								}
								var n = 0.3 + 0.5 * Math.random();
								var amount = (1 - n) * clamp(Math.random() * n, 0.1, 0.95);
								pN += clamp(n + amount, 0.08, 0.994);
								progressDiv.find(".bar").attr("style", barPositionCSS());
							}, 800);
						}
					break;
					case 'done':
						if(document.getElementById("nprogress")){
							clearInterval(timepid);
							pN = 0;
							$("#nprogress").find(".bar").attr("style", barPositionCSS());
							setTimeout(function(){
								$("#nprogress").remove();
							}, 200);
						}
					break;
				}
			break;
			default:
				that.creatBox(function(cell){
					if(msgType){
						cell.attr("iqnode", msgCell.selector.toString());
						// 把已知的html片段包裹并插入到弹层中
						cell.find(doms[3]).append(msgCell);
					}
					cell.attr("iqtype", opts.type);
					that.btnCallback(cell);
					// 是否可拖动
					if(opts.isDrag){
						var wrapCell = cell, titCell = cell.find(doms[2]);
						that.dragLayer(wrapCell, titCell, 0.4, opts.shadow);
					};
					that.setSize(cell);
					that.setPosition(cell);
				});
		}
    };
    // 创建弹层骨架
    iqfn.creatBox = function(callback){
        var that = this, opts = that.config, idx = that.iqidx;
        // 创建按钮模板
        var arrButton = opts.button, btnLen = arrButton.length;
        var btnHtml = function(){
            var btnStrs = btnLen != 0 ? function(){
                var btnArr = [];
                $.each(arrButton, function(i, val){
                    btnArr.push('<button type="button" class="iqBox-btn'+i+'" iqbtn="'+i+'" '+(val.disabled == true ? "disabled" : "")+'>'+val.name+'</button>');
                });
                return btnArr.join("");
            }() : "";
            return '<div class="iqBox-footer">' + btnStrs + "</div>";
        }();
        var paddings = opts.padding, skinCell = opts.skinCell || "iqBox-anim";
        // 创建默认的弹出层内容模板
        var templates = '<span class="iqBox-headbtn"><a href="javascript:;" class="iqBox-maxbtn" title="最大化"></a><a href="javascript:;" class="iqBox-close" title="&#20851;&#38381;"></a></span><div class="iqBox-header"></div><div class="iqBox-content" style="padding:' + (paddings != "" ? paddings : 0) + ';">'+opts.content+'</div>' + btnHtml;
        // 创建弹窗外部DIV
        var getZindex = function(elem){
                var maxZindex = 0;
                elem.each(function(){
                    maxZindex = Math.max(maxZindex, $(this).css("z-index"));
                });
                return maxZindex;
		}, zIndexs = opts.zIndex;
        // 计算层级并置顶
        var Zwarp = $(doms[1]).size() > 0 ? getZindex($(doms[1])) + 5 : zIndexs + 5, Zmask = $(doms[1]).size() > 0 ? getZindex($(doms[1])) + 2 : zIndexs, divBoxs = $("<div/>", {"id": doms[0] + idx, "class": doms[1].replace(/\./g, "")});
        $("body").append(divBoxs.append(templates));
        divBoxs.attr("iqitem", idx);
        divBoxs.css({position:opts.fixed ? "fixed" : "absolute", "z-index":Zwarp});
        (parseInt(ieBrowser) < 9) ? divBoxs.addClass("iqBox-ies") : divBoxs.addClass(skinCell);
        iqBox.zIndex = parseInt(divBoxs.css("z-index"));
        !IQobj.scrollbar && $("body").css("overflow", "hidden");
        // 是否开启遮罩层
        if(opts.maskLock){
            var maskBox = $("<div/>", {"id":"iqmask"+idx, "class":"iqBox-mask"}), maskColor = opts.maskColor;
            $("body").append(maskBox);
            maskBox.css({left:0, top:0, "background-color":maskColor[0], "z-index":Zmask, opacity:maskColor[1], filter:"alpha(opacity=" + maskColor[1] * 100 + ")"})
        };
        var titles = opts.title == false ? "" : (opts.title || config.title), titType = typeof titles === "object", isTitle =  titles ? (titType ? titles[0] : titles) : "";
        divBoxs.find(doms[2]).html(isTitle).css({"display": isTitle != "" ? "" : "none", "height": isTitle != "" ? "" : "0px" }).css(titType ? titles[1] : {});
        divBoxs.find(doms[4]).css({"display": btnLen != 0 ? "block" : "none", "text-align": opts.btnAlign});
        divBoxs.find(doms[5]).css("display", opts.closeBtn ? "" : "none");
        divBoxs.find(doms[6]).css("display", opts.maxBtn ? "" : "none");
        callback && callback(divBoxs);
    };
    // 设置弹层尺寸
    iqfn.setSize = function(cell){
        var that = this, opts = that.config, wrapWidth, wrapHeight, conWidth, conHeight, conCell = cell.find(doms[3]), areas = opts.boxSize, conPad = function(prop) { return parseInt(conCell.css(prop).replace(regPxe, "")) }, conhead = IQobj.conhead = cell.find(doms[2]).height(), confoot = IQobj.confoot = cell.find(doms[4]).height(), winW = $(window).width(), winH = $(window).height(), Padtb = conPad("padding-top") + conPad("padding-bottom"), Padlr = conPad("padding-left") + conPad("padding-right"), Martb = conPad("margin-top") + conPad("margin-bottom"), Marlr = conPad("margin-left") + conPad("margin-right");
        var toSize = function(wval, fval){
            return /^\d+%$/.test(fval.toString()) ? parseInt(wval * (fval.toString().replace("%", "") / 100)) : parseInt(fval.toString().replace(regPxe, ""));
        };
        if($.isArray(areas)){
            var fixW = areas[0], fixH = areas[1], bfW = toSize(winW, fixW), bfH = toSize(winH, fixH), nPerW = bfW >= winW ? winW : bfW, nPerH = bfH >= winH ? winH : bfH;
            // 设置层的宽度
            if($.type(fixW) === "number"){
                wrapWidth = bfW + Padlr + Marlr;
                conWidth = bfW;
            }else if(fixW == "auto"){
                conWidth = cell.width();
                wrapWidth = conWidth + Padlr + Marlr;
            }else{
                wrapWidth = nPerW;
                conWidth = nPerW - Padlr - Marlr;
            }
            // 设置层的高度
            if($.type(fixH) === "number"){
                wrapHeight = bfH + Padtb + Martb;
                conHeight = bfH - conhead - confoot;
            }else if(fixH == "auto"){
                wrapHeight = cell.height();
				var conPaadding = parseInt(cell.find(doms[3]).css("padding")) * 2;
                conHeight = wrapHeight - Martb - conhead - confoot - conPaadding;
            }else{
                wrapHeight = nPerH;
                conHeight = nPerH - Martb - conhead - confoot;
            }
        }
        opts.maxBtn && cell.attr("area", [wrapWidth, wrapHeight, conWidth, conHeight]);
        cell.css({"width":wrapWidth,"min-height":wrapHeight}).css(opts.boxStyle);
        cell.find(doms[3]).css({"height":conHeight});
    };
    // 定位层显示的位置
    iqfn.setPosition = function(cell){
        var that = this, opts = that.config, Postr, elemtr, elembl, offsets = opts.offset, isOffsetArr = $.isArray(offsets), eleW = cell.width(), eleH = cell.height(), Postr = offsets[0], Posbl = offsets[1], winWidth = $(window).width(), winHeight = $(window).height();
        // 设置位置
        elemtr = (isOffsetArr && /^\@/.test(Postr)) ? Postr.replace(/\@/g, "") : ((Postr == "auto") ? (winHeight - eleH) / 2 : /^\d+%$/.test(Postr) ? Postr : Postr.replace(regPxe, ""));
        elembl = (isOffsetArr && /^\@/.test(Posbl)) ? Posbl.replace(/\@/g, "") : ((Posbl == "auto") ? (winWidth - eleW) / 2 : /^\d+%$/.test(Posbl) ? Posbl : Posbl.replace(regPxe, ""));
        // 判断设置位置类型
        cell.css( (isOffsetArr && (/^\@/.test(Postr) || /^\@/.test(Posbl))) ? {"right":elemtr, "bottom":elembl} : {"top":elemtr,"left":elembl});
        if(opts.maxBtn){
            cell.attr("offset", [elemtr, elembl]);
        }
    };
    // 各关闭按钮的事件
    iqfn.btnCallback = function(cell){
        var that = this, opts = that.config, idx = that.iqidx, maxBtn = cell.find(doms[6]), times = opts.time, btns = opts.button, offsets = opts.offset;
        if(opts.success){
            if(opts.type == "iframe"){
                cell.find("iframe").on("load", function(){
                    opts.success(cell, idx);
                });
            }else{
                opts.success(cell, idx);
            }
        };
        // 自动关闭
        times <= 0 || setTimeout(function(){
            iqBox.close(idx, opts.isOutAnim);
        }, times * 1e3);
        if(opts.type != "tips" || opts.type != "progress"){
            // 按钮队列
            if(!$.isArray(btns)) btns = btns ? [btns] : [];
            // 关闭按钮事件
            if(opts.closeBtn){
                cell.find(doms[5]).on("click", function(){
                    var close = opts.closefun && opts.closefun(idx);
                    close === false || iqBox.close(idx, opts.isOutAnim);
                });
            }
            // 最大化按钮
            if(opts.maxBtn){
                maxBtn.bind("click", function(){
                    if(maxBtn.hasClass("revert")){
                        maxBtn.removeClass("revert");
                        iqBox.restore(idx);
                        $(this).attr("title", "最大化");
                    }else{
                        maxBtn.addClass("revert");
                        iqBox.full(idx);
                        $(this).attr("title", "还原");
                    }
                });
            }
            // 更多按钮
            if(btns.length > 0){
                cell.find(doms[4] + " button").on("click", function(){
                    var index = parseInt($(this).attr("iqbtn"));
                    if(index === 0){
                        btns[0]["callback"] ? btns[0]["callback"](idx, cell) : iqBox.close(idx, opts.isOutAnim);
                    }else if(index > 0){
                        var close = btns[index]["callback"] && btns[index]["callback"](idx, cell);
                        close === false || iqBox.close(idx, opts.isOutAnim);
                    }
                });
            }
            // 点遮罩关闭
            if(opts.maskClose){
                $("#iqmask" + idx).on("click", function(){
                    iqBox.close(idx, opts.isOutAnim);
                });
            } 
            // 自适应
            $(window).resize(function(){
                if($.isArray(offsets) && (/^\@/.test(offsets[0]) || /^\@/.test(offsets[1]))){
                    cell.css({"top": "", "left": ""});
                }
                that.setPosition(cell);
            });
        }
        opts.endfun && (IQobj.endfun[idx] = opts.endfun);
    };
    //拖拽事件
    iqfn.dragLayer = function(warpCell, titCell, opacityVal, isShadow){
        var that = this, isIES = !-[1];
        titCell = titCell || warpCell;
        var tmpX = tmpY = 0;
        that.isMoveable = false;
        titCell.css("cursor", "move");
        if(isShadow){
            that.isShadow = isShadow ? isShadow == true || isShadow == false ? isShadow : false : false;
            if(that.isShadow) that.opacity = opacityVal;
        }else{
            that.opacity = 100, that.isShadow = false;
        }
        titCell.on("mousedown", function(event){
            var event = event || window.event;
            var tempLayer = $("<div/>",{"id":"iqBox-moves","class":"iqBox-moves"}), warpLeft = warpCell.css("left"), warpTop = warpCell.css("top");
            var tempLayerCon = $("<div/>",{class:"movescon"});
            // 只允许通过鼠标左键进行拖拽,IE鼠标左键为1 FireFox为0
            if(isIES && event.button != 1 || isIES && event.button == 0) return false;
            // 创建临时拖动层
            if(that.isShadow){
                tempLayer.css({width:(warpCell.outerWidth() - 4), height:(warpCell.outerHeight() - 4), left:warpLeft, top:warpTop, "z-index":parseInt(warpCell.css("z-index")) + 10});
                $("body").append(tempLayer.append(tempLayerCon));
            }
            that.isMoveable = true;
            tmpX = event.pageX - warpLeft.replace(regPxe, "");
            tmpY = event.pageY - warpTop.replace(regPxe, "");
            // FireFox 去除容器内拖拽图片问题
            if(event.preventDefault){
                event.preventDefault();
				event.stopPropagation();
            }
            $(document).on("mousemove", function(event){
                if(!that.isMoveable) return;
                window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
                // 控制元素不被拖出窗口外
                var event = event || window.event, elemCopy = that.isShadow ? tempLayer : warpCell, DmpX = event.pageX - tmpX, DmpY = event.pageY - tmpY, maxW = $(window).width() - warpCell.outerWidth(), maxH = $(window).height() - warpCell.outerHeight();
                DmpX <= 0 && (DmpX = 0);
				DmpY <= 0 && (DmpY = 0);
                DmpX >= maxW && (DmpX = maxW);
				DmpY >= maxH && (DmpY = maxH);
                elemCopy.css({"top": DmpY, "left": DmpX});
            }).on("mouseup", function(){
                if(that.isMoveable){
                    that.isMoveable = false;
                    tmpX = tmpY = 0;
                    warpCell.css({"right": "", "bottom": ""});
                    if(that.isShadow){
                        // 判断并把虚框的位置信息传给弹层
                        warpCell.css({"top":tempLayer.css("top"), "left":tempLayer.css("left")});
                        // 判断并删除新创建的虚框
                        $("#iqBox-moves").remove();
                    }
                    if($(window).width() != warpCell.outerWidth()){
                        warpCell.attr("offset", [warpCell.css("top").replace(regPxe, ""), warpCell.css("left").replace(regPxe, "")]);
                    }
                }
            });
        });
    };
    // 让传入的元素在对话框关闭后可以返回到原来的地方
    IQobj.backInSitu = function(elem, iqPrev, iqNext, iqParent, iqDispy){
        if(iqPrev.length > 0 && iqPrev.parent()){
            iqPrev.after(elem);
        }else if(iqNext.length > 0 && iqNext.parent()){
            iqNext.before(elem);
        }else if(iqParent.length > 0){
            iqParent.append(elem);
        }
        elem.css("display", iqDispy);
    };
    // 弹层核心
    var iqBox = function(opts){
        var iqShow = new iqDialog(opts || {});
        return iqShow.iqidx;
    };
    // 关闭指定层
    iqBox.close = function(idx, opts){
        var boxCell = $("#" + doms[0] + idx), maskCell = $("#iqmask" + idx);
        var nodeCell = boxCell.attr("iqnode"), arr = ["prev" + idx,"next" + idx,"parent" + idx,"dispy" + idx];
        if(!boxCell) return;
        if($(nodeCell).size() > 0 && $(nodeCell)[0].nodeType === 1){
            IQobj.backInSitu($(nodeCell), IQobj[arr[0]], IQobj[arr[1]], IQobj[arr[2]], IQobj[arr[3]]);
        };
		var GoTS = function(){
			boxCell && boxCell.remove();
			maskCell && maskCell.remove();
			$("body").css("overflow") == "hidden" && $("body").css("overflow", "");
			$.each(arr, function(i, val){
				delete IQobj[val];
			});
			typeof IQobj.endfun[idx] === 'function' && IQobj.endfun[idx]();
			delete IQobj.endfun[idx];
		}
		if(opts){
			boxCell.addClass("iq-anim-close");
			setTimeout(function(){
				GoTS();
			}, 200)
		}else{
			GoTS();
		}
    };
    // 关闭所有层
    iqBox.closeAll = function(type){
        $.each($(doms[1]), function(){
            var that = $(this);
            var istype = type ? (that.attr('iqtype') === type) : 1;
            istype && iqBox.close(parseInt(that.attr("iqitem")));
            istype = null;
        });
    };
    // 最常用提示层
    iqBox.msg = function(content, options, end){
        var type = $.isFunction(options);
        if(type) end = options;
        return iqBox($.extend({
            title:false,
            content:content,
            padding:"10px",
            skinCell:"iqBox-animMsg",
            time:3,
            maskLock:false,
            closeBtn:false,
            end:end
        }, !type && function(){
			options = options || {};
			return options;
		}()));
    };
    iqBox.alert = function(content, options, yes){
        var type = $.isFunction(options);
        if(type) yes = options;
        return iqBox($.extend({
            content: content,
            button:[{name:'确定', callback:yes}]
        }, type ? {} : options));
    };
    iqBox.loading = function(icon, content, options){
        return iqBox($.extend({
            title:false,
            closeBtn:false,
            type:'loading',
            skinCell:"iqBox-animLoading",
			maskClose:false,
            content: content == undefined ? "" : content,
            icon: icon || 1
        }, options));
    };
	iqBox.progress = function(status, options){
		var getPositioningCSS = function(){
			// Sniff on document.body.style
			var bodyStyle = document.body.style;
			// Sniff prefixes
			var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' : ('MozTransform' in bodyStyle) ? 'Moz' : ('msTransform' in bodyStyle) ? 'ms' : ('OTransform' in bodyStyle) ? 'O' : '';
			if(vendorPrefix + 'Perspective' in bodyStyle){
				// Modern browsers with 3D support, e.g. Webkit, IE10
				return 'translate3d';
			}else if(vendorPrefix + 'Transform' in bodyStyle){
				// Browsers without 3D support, e.g. IE9
				return 'translate';
			}else{
				// Browsers without translate() support, e.g. IE7-8
				return 'margin';
			}
		};
		return iqBox($.extend({
            title:false,
			content:"",
            closeBtn:false,
            type:'progress',
			maskLock:false,
			positionUsing:getPositioningCSS(),
			showSpinner:true,
			status:status,
        }, options));
	}
    // tip提示泡泡
    iqBox.tips = function(cell, content, options){
        return iqBox( $.extend({
            cell:cell,
            type:'tips',
            content:content == undefined ? "" : content,
            align:"top",                            // 提示层的箭头方向
            boxStyle:{'background-color':"#5eb95e"},// 提示层的风格，参数为提示边框颜色
            spacing:10                              // 默认为箭头距离对象的尺寸
        },options||{}));
    };
    // 改变当前弹层title
    iqBox.title = function(name, idx){
        $("#" + doms[0] + idx).find(doms[2]).html(name);
    };
    // 改变当前弹层内容
    iqBox.content = function(content, idx){
        $("#" + doms[0] + idx).find(doms[3]).html(content);
    };
    // 还原
    iqBox.restore = function(index){
        var boxCell = $("#" + doms[0] + index), conCell = boxCell.find(doms[3]), revArea = boxCell.attr("area").split(/,/g), revOffset = boxCell.attr("offset").split(/,/g);
        $("body").css('overflow', IQobj.scrollbar == false ? 'hidden' : '');
        boxCell.css({width:revArea[0], height:revArea[1], top: revOffset[0] + "px", left: revOffset[1] + "px", right:"", bottom:""});
        conCell.css({width:revArea[2], height:revArea[3]});
    };
    // 全屏
    iqBox.full = function(index){
        var timer, boxCell = $("#" + doms[0] + index), conCell = boxCell.find(doms[3]);
        $("body").css('overflow', 'hidden');
        clearTimeout(timer);
        timer = setTimeout(function(){
            boxCell.find(doms[6]).addClass("revert");
            var isfix = boxCell.css('position') === 'fixed', offset = boxCell.attr("offset").split(","), docWidth = $(window).width(), docHeight = $(window).height(), conW = conCell.outerWidth(true) - conCell.width(), conH = conCell.outerHeight(true) - conCell.height(), headHeight = boxCell.find(doms[2]).outerHeight(true), footHeight = boxCell.find(doms[4]).outerHeight(true);
            boxCell.css({width:docWidth, height:docHeight, top: isfix ? 0 : offset[0], left: isfix ? 0 : offset[1], right:"", bottom:""});
            conCell.css({width: docWidth - conW, height: docHeight - conH - headHeight - footHeight});
        }, 50);
    };
    // 获取子iframe的DOM
    iqBox.frameCell = function(selector, index){
        index = index || $(".iqboxiframe").attr("iqitem");
        return $("#" + doms[0] + index).find("iframe").contents().find(selector);
    };
    // 得到当前iframe层的索引，子iframe时使用
    iqBox.frameIndex = function(name){
        return $("#" + doms[0] + name).attr("iqitem");
    };
    // 重置iframe url
    iqBox.frameUrl = function(idx, url){
        $("#" + doms[0] + idx).find("iframe").attr("src", url);
    };
    return iqBox
});