﻿/*
创建者:     杨韦庚
创建时间:   2008-03-03
类功能描述: 打开显示层同时遮挡后面的页面  
调用方法： “divBox” 弹出层的id
var box = new LightBox("divBox");
$("btnClose").onclick = function(){ box.Close(); }
$("btnOpen").onclick = function(){ box.Show(); }
*/

//是否IE
var isIE = (document.all) ? true : false;
//是否IE6
var isIE6 = isIE && ([/MSIE (\d)\.0/i.exec(navigator.userAgent)][0][1] == 6);
//根据ID获取控件
var $ = function (id) {
    return "string" == typeof id ? document.getElementById(id) : id;
};
var Class = {
    create: function() {
	    return function() { this.initialize.apply(this, arguments); }
    }
}
var Extend = function(destination, source) {
    for (var property in source) {
	    destination[property] = source[property];
    }
}
var Bind = function(object, fun) {
    return function() {
	    return fun.apply(object, arguments);
    }
}
var Each = function(list, fun){
    for (var i = 0, len = list.length; i < len; i++) { fun(list[i], i); }
};
var Contains = function(a, b){
    return a.contains ? a != b && a.contains(b) : !!(a.compareDocumentPosition(b) & 16);
}
var OverLay = Class.create();
OverLay.prototype = 
{
    initialize: function(options) 
    {
        this.SetOptions(options);
        this.Lay = $(this.options.Lay) || document.body.insertBefore(document.createElement("div"), document.body.childNodes[0]);
        this.Color = this.options.Color;
        this.Opacity = parseInt(this.options.Opacity);
        this.zIndex = parseInt(this.options.zIndex);
        with(this.Lay.style){ display = "none"; zIndex = this.zIndex; left = top = 0; position = "fixed"; width = height = "100%"; }
        if(isIE6){
	        this.Lay.style.position = "absolute";
	        //ie6设置覆盖层大小程序
	        this._resize = Bind(this, function(){
		        this.Lay.style.width = Math.max(document.documentElement.scrollWidth, document.documentElement.clientWidth) + "px";
		        this.Lay.style.height = Math.max(document.documentElement.scrollHeight, document.documentElement.clientHeight) + "px";
	        });
	        //遮盖select
	        this.Lay.innerHTML = '<iframe style="position:absolute;top:0;left:0;width:100%;height:100%;filter:alpha(opacity=0);"></iframe>'
    }
  },
  //设置默认属性
  SetOptions: function(options) {
    this.options = {//默认值
	    Lay:		null,//覆盖层对象
	    Color:		"#fff",//背景色
	    Opacity:	50,//透明度(0-100)
	    zIndex:		1000//层叠顺序
    };
    Extend(this.options, options || {});
  },
  //显示
  Show: function() {
    //兼容ie6
    if(isIE6){ this._resize(); window.attachEvent("onresize", this._resize); }
    //设置样式
    with(this.Lay.style){
	    //设置透明度
	    isIE ? filter = "alpha(opacity:" + this.Opacity + ")" : opacity = this.Opacity / 100;
	    backgroundColor = this.Color; display = "block";
    }
  },
  //关闭
  Close: function() {
    this.Lay.style.display = "none";
    if(isIE6){ window.detachEvent("onresize", this._resize); }
  }
};

var LightBox = Class.create();
LightBox.prototype = 
{
    initialize: function(box, options) 
    {
        this.Box = $(box);//显示层
        this.OverLay = new OverLay(options);//覆盖层
        this.SetOptions(options);
        this.Fixed = !!this.options.Fixed;
        this.Over = !!this.options.Over;
        this.Center = !!this.options.Center;
        this.onShow = this.options.onShow;
        this.Box.style.zIndex = this.OverLay.zIndex + 1;
        this.Box.style.display = "none";
        //兼容ie6用的属性
        if(isIE6)
        {
	        this._top = this._left = 0; this._select = [];
	        this._fixed = Bind(this, function(){ this.Center ? this.SetCenter() : this.SetFixed(); });
        }
   },
  //设置默认属性
  SetOptions: function(options) {
    this.options = {//默认值
	    Over:	true,//是否显示覆盖层
	    Fixed:	true,//是否固定定位
	    Center:	true,//是否居中
	    onShow:	function(){}//显示时执行
    };
    Extend(this.options, options || {});
  },
  //兼容ie6的固定定位程序
  SetFixed: function(){
    this.Box.style.top = document.documentElement.scrollTop - this._top + this.Box.offsetTop + "px";
    this.Box.style.left = document.documentElement.scrollLeft - this._left + this.Box.offsetLeft + "px";
	
    this._top = document.documentElement.scrollTop; this._left = document.documentElement.scrollLeft;
  },
  //兼容ie6的居中定位程序
  SetCenter: function(){
    this.Box.style.marginTop = document.documentElement.scrollTop - this.Box.offsetHeight / 2 + "px";
    this.Box.style.marginLeft = document.documentElement.scrollLeft - this.Box.offsetWidth / 2 + "px";
  },
  //显示
  Show: function(options) {
    //固定定位
    this.Box.style.position = this.Fixed && !isIE6 ? "fixed" : "absolute";
    //覆盖层
    this.Over && this.OverLay.Show();
    this.Box.style.display = "block";
    //居中
    if(this.Center){
	    this.Box.style.top = this.Box.style.left = "50%";
	    //设置margin
	    if(this.Fixed){
		    this.Box.style.marginTop = - this.Box.offsetHeight / 2 + "px";
		    this.Box.style.marginLeft = - this.Box.offsetWidth / 2 + "px";
	    }else{
		    this.SetCenter();
	    }
    }
    //兼容ie6
    if(isIE6){
	    if(!this.Over){
		    //没有覆盖层ie6需要把不在Box上的select隐藏
		    this._select.length = 0;
		    Each(document.getElementsByTagName("select"), Bind(this, function(o){
			    if(!Contains(this.Box, o)){ o.style.visibility = "hidden"; this._select.push(o); }
		    }))
	    }
	    //设置显示位置
	    this.Center ? this.SetCenter() : this.Fixed && this.SetFixed();
	    //设置定位
	    this.Fixed && window.attachEvent("onscroll", this._fixed);
    }
	
    this.onShow();
  },
  //关闭
  Close: function() {
    this.Box.style.display = "none";
    this.OverLay.Close();
    if(isIE6){
	    window.detachEvent("onscroll", this._fixed);
	    Each(this._select, function(o){ o.style.visibility = "visible"; });
    }
  }
};
