var iBox = function () {
    var _pub = {
    	

        inherit_frames: false,
        fade_in_speed: 300,
        fade_out_speed: 300,
        attribute_name: "rel",
        tags_to_hide: ["select", "embed", "object"],
        default_width: 400,
        version_number: "2.2",
        build_number: "1612",
        is_opera: navigator.userAgent.indexOf("Opera/9") != -1,
        is_ie: navigator.userAgent.indexOf("MSIE ") != -1,
        is_ie6: false
        /*@cc_on || @_jscript_version < 5.7 @*/
        ,
        is_firefox: navigator.appName == "Netscape" && navigator.userAgent.indexOf("Gecko") != -1 && navigator.userAgent.indexOf("Netscape") == -1,
        is_mac: navigator.userAgent.indexOf("Macintosh") != -1,
        base_url: "",
        setPath: function (path) {
            _pub.base_url = path
        },
        checkTags: function (container, tag_name) {
            if (!container) {
                var container = document.body
            }
            if (!tag_name) {
                var tag_name = "a"
            }
            var els = container.getElementsByTagName(tag_name);
            for (var i = 0; i < els.length; i++) {
                if (els[i].getAttribute(_pub.attribute_name)) {
                    var t = els[i].getAttribute(_pub.attribute_name);
                    if ((t.indexOf("ibox") != -1) || t.toLowerCase() == "ibox") {
                        els[i].onclick = _pub.handleTag
                    }
                }
            }
        },
        bind: function (fn) {
            var args = [];
            for (var n = 1; n < arguments.length; n++) {
                args.push(arguments[n])
            }
            return function (e) {
                return fn.apply(this, [e].concat(args))
            }
        },
        html: function (content, params) {
            if (content === undefined) {
                return els.content
            }
            if (params === undefined) {
                var params = {}
            }
            if (!active.is_loaded) {
                return
            }
            _pub.clear();
            _pub.updateObject(els.wrapper.style, {
                display: "block",
                visibility: "hidden",
                left: 0,
                top: 0,
                height: "",
                width: ""
            });
            if (typeof(content) == "string") {
                els.content.innerHTML = content
            } else {
                els.content.appendChild(content)
            }
            var pagesize = _pub.getPageSize();
            if (params.can_resize === undefined) {
                params.can_resize = true
            }
            if (params.fade_in === undefined) {
                params.use_fade = true
            }
            if (params.fullscreen) {
                params.width = "100%";
                params.height = "100%"
            }
            offset.container = [els.wrapper.offsetLeft * 2, els.wrapper.offsetTop * 2];
            offset.wrapper = [els.wrapper.offsetWidth - els.content.offsetWidth, els.wrapper.offsetHeight - els.content.offsetHeight];
            offset.wrapper[1] += 4;
            if (params.width) {
                var width = params.width
            } else {
                var width = _pub.default_width
            }
            if (params.height) {
                var height = params.height
            } else {
                els.content.style.height = "100%";
                var height = els.content.offsetHeight + 12;
                els.content.style.height = ""
            }
            active.dimensions = [width, height];
            active.params = params;
            _pub.reposition();
            for (var i = 0; i < _pub.tags_to_hide.length; i++) {
                showTags(_pub.tags_to_hide[i], els.content)
            }
            els.wrapper.style.visibility = "visible"
        },
        clear: function () {
            els.loading.style.display = "none";
            while (els.content.firstChild) {
                els.content.removeChild(els.content.firstChild)
            }
        },
        show: function (text, title, params) {
            showInit(title, params, function () {
                _pub.html(text, active.params)
            })
        },
        showURL: function (url, title, params) {
            showInit(title, params, function () {
                for (var i = 0; i < _pub.plugins.list.length; i++) {
                    var plugin = _pub.plugins.list[i];
                    if (plugin.match(url)) {
                        active.plugin = plugin;
                        plugin.render(url, active.params);
                        break
                    }
                }
            })
        },
        hide: function () {
            if (active.plugin) {
                if (active.plugin.unload) {
                    active.plugin.unload()
                }
            }
            active = {};
            _pub.clear();
            for (var i = 0; i < _pub.tags_to_hide.length; i++) {
                showTags(_pub.tags_to_hide[i])
            }
            els.loading.style.display = "none";
            els.wrapper.style.display = "none";
            _pub.fade(els.overlay, _pub.getOpacity(null, els.overlay), 0, _pub.fade_out_speed, function () {
                els.overlay.style.display = "none"
            });
            _pub.fireEvent("hide")
        },
        reposition: function () {
            if (!active.is_loaded) {
                return
            }
            if (els.loading.style.display != "none") {
                _pub.center(els.loading)
            }
            if (active.dimensions) {
                var pagesize = _pub.getPageSize();
                var width = active.dimensions[0];
                var height = active.dimensions[1];
                if (height.toString().indexOf("%") != -1) {
                    els.wrapper.style.height = (Math.max(document.documentElement.clientHeight, document.body.clientHeight, pagesize.height) - offset.container[0]) * (parseInt(height) / 100) + "px"
                } else {
                    if (height) {
                        els.content.style.height = height + "px";
                        els.wrapper.style.height = els.content.offsetHeight + offset.wrapper[1] + "px"
                    } else {
                        els.wrapper.style.height = els.content.offsetHeight + offset.wrapper[1] + "px"
                    }
                }
                var container_offset = (els.content.offsetHeight - els.content.firstChild.offsetHeight);
                if (width.toString().indexOf("%") != -1) {
                    els.wrapper.style.width = (Math.max(document.documentElement.clientWidth, document.body.clientWidth, pagesize.width) - offset.container[1]) * (parseInt(width) / 100) + "px";
                    var container_offset = 0
                } else {
                    els.content.style.width = width + "px";
                    els.wrapper.style.width = els.content.offsetWidth + offset.wrapper[0] + "px"
                }
                _pub.updateObject(els.content.style, {
                    width: "",
                    height: ""
                });
                var width = parseInt(els.wrapper.style.width);
                var height = parseInt(els.wrapper.style.height);
                if (active.params.can_resize) {
                    var x = pagesize.width;
                    var y = pagesize.height;
                    x -= offset.container[0];
                    y -= offset.container[1];
                    if (width > x) {
                        if (active.params.constrain) {
                            height = height * (x / width)
                        }
                        width = x
                    }
                    if (height > y) {
                        if (active.params.constrain) {
                            width = width * (y / height)
                        }
                        height = y
                    }
                    _pub.updateObject(els.wrapper.style, {
                        width: width + "px",
                        height: height + "px"
                    })
                }
                els.content.style.height = height - offset.wrapper[1] + "px";
                if (active.dimensions != ["100%", "100%"]) {
                    _pub.center(els.wrapper)
                }
            }
            els.overlay.style.height = Math.max(document.body.clientHeight, document.documentElement.clientHeight) + "px"
        },
        updateObject: function (obj, params) {
            for (var i in params) {
                obj[i] = params[i]
            }
        },
        center: function (obj) {
            var pageSize = _pub.getPageSize();
            var scrollPos = _pub.getScrollPos();
            var emSize = _pub.getElementSize(obj);
            var x = Math.round((pageSize.width - emSize.width) / 2 + scrollPos.scrollX);
            var y = Math.round((pageSize.height - emSize.height) / 2 + scrollPos.scrollY);
            if (obj.offsetLeft) {
                x -= obj.offsetLeft
            }
            if (obj.offsetTop) {
                y -= obj.offsetTop
            }
            if (obj.style.left) {
                x += parseInt(obj.style.left)
            }
            if (obj.style.top) {
                y += parseInt(obj.style.top)
            }
            x -= 10;
            _pub.updateObject(obj.style, {
                top: y + "px",
                left: x + "px"
            })
        },
        getStyle: function (obj, styleProp) {
            if (obj.currentStyle) {
                return obj.currentStyle[styleProp]
            } else {
                if (window.getComputedStyle) {
                    return document.defaultView.getComputedStyle(obj, null).getPropertyValue(styleProp)
                }
            }
        },
        getScrollPos: function () {
            var docElem = document.documentElement;
            return {
                scrollX: document.body.scrollLeft || window.pageXOffset || (docElem && docElem.scrollLeft),
                scrollY: document.body.scrollTop || window.pageYOffset || (docElem && docElem.scrollTop)
            }
        },
        getPageSize: function () {
            return {
                width: window.innerWidth || (document.documentElement && document.documentElement.clientWidth) || document.body.clientWidth,
                height: window.innerHeight || (document.documentElement && document.documentElement.clientHeight) || document.body.clientHeight
            }
        },
        getElementSize: function (obj) {
            return {
                width: obj.offsetWidth || obj.style.pixelWidth,
                height: obj.offsetHeight || obj.style.pixelHeight
            }
        },
        fade: function (obj, start, end, speed, callback) {
            if (start === undefined || !(start >= 0) || !(start <= 100)) {
                var start = 0
            }
            if (end === undefined || !(end >= 0) || !(end <= 100)) {
                var end = 100
            }
            if (speed === undefined) {
                var speed = 0
            }
            if (obj.fader) {
                clearInterval(obj.fader)
            }
            if (!speed) {
                _pub.setOpacity(null, obj, end);
                if (callback) {
                    callback()
                }
            }
            var opacity_difference = end - start;
            var time_total = speed;
            var step_size = 25;
            var steps = time_total / step_size;
            var increment = Math.ceil(opacity_difference / steps);
            obj.fader = setInterval(_pub.bind(function (e, obj, increment, end, callback) {
                var opacity = _pub.getOpacity(e, obj) + increment;
                _pub.setOpacity(e, obj, opacity);
                if ((increment < 0 && opacity <= end) || (increment > 0 && opacity >= end)) {
                    _pub.setOpacity(e, obj, end);
                    clearInterval(obj.fader);
                    if (callback) {
                        callback()
                    }
                }
            },
            obj, increment, end, callback), step_size)
        },
        setOpacity: function (e, obj, value) {
            value = Math.round(value);
            obj.style.opacity = value / 100;
            obj.style.filter = "alpha(opacity=" + value + ")"
        },
        getOpacity: function (e, obj) {
            return _pub.getStyle(obj, "opacity") * 100
        },
        createXMLHttpRequest: function () {
            var http;
            if (window.XMLHttpRequest) {
                http = new XMLHttpRequest();
                if (http.overrideMimeType) {
                    http.overrideMimeType("text/html")
                }
            } else {
                if (window.ActiveXObject) {
                    try {
                        http = new ActiveXObject("Msxml2.XMLHTTP")
                    } catch(e) {
                        try {
                            http = new ActiveXObject("Microsoft.XMLHTTP")
                        } catch(e) {}
                    }
                }
            }
            if (!http) {
                alert("Cannot create XMLHTTP instance");
                return false
            }
            return http
        },
        addEvent: function (obj, evType, fn) {
            if (obj.addEventListener) {
                obj.addEventListener(evType, fn, false);
                return true
            } else {
                if (obj.attachEvent) {
                    var r = obj.attachEvent("on" + evType, fn);
                    return r
                } else {
                    return false
                }
            }
        },
        addEventListener: function (name, callback) {
            if (!events[name]) {
                events[name] = new Array()
            }
            events[name].push(callback)
        },
        fireEvent: function (name) {
            if (events[name] && events[name].length) {
                for (var i = 0; i < events[name].length; i++) {
                    var args = [];
                    for (var n = 1; n < arguments.length; n++) {
                        args.push(arguments[n])
                    }
                    if (events[name][i](args) === false) {
                        break
                    }
                }
            }
        },
        parseQuery: function (query) {
            var params = new Object();
            if (!query) {
                return params
            }
            var pairs = query.split(/[;&]/);
            var end_token;
            for (var i = 0; i < pairs.length; i++) {
                var keyval = pairs[i].split("=");
                if (!keyval || keyval.length != 2) {
                    continue
                }
                var key = unescape(keyval[0]);
                var val = unescape(keyval[1]);
                val = val.replace(/\+/g, " ");
                if (val[0] == '"') {
                    var token = '"'
                } else {
                    if (val[0] == "'") {
                        var token = "'"
                    } else {
                        var token = null
                    }
                }
                if (token) {
                    if (val[val.length - 1] != token) {
                        do {
                            i += 1;
                            val += "&" + pairs[i]
                        } while ((end_token = pairs[i][pairs[i].length - 1]) != token)
                    }
                    val = val.substr(1, val.length - 2)
                }
                if (val == "true") {
                    val = true
                } else {
                    if (val == "false") {
                        val = false
                    } else {
                        if (val == "null") {
                            val = null
                        }
                    }
                }
                params[key] = val
            }
            return params
        },
        handleTag: function (e) {
            var t = this.getAttribute("rel");
            var params = _pub.parseQuery(t.substr(5, 999));
            if (params.target) {
                var url = params.target
            } else {
                if (this.target && !params.ignore_target) {
                    var url = this.target
                } else {
                    var url = this.href
                }
            }
            var title = this.title;
            if (_pub.inherit_frames && window.parent) {
                window.parent.iBox.showURL(url, title, params)
            } else {
                _pub.showURL(url, title, params)
            }
            return false
        },
        plugins: {
            list: new Array(),
            register: function (func, last) {
                if (last === undefined) {
                    var last = false
                }
                if (!last) {
                    _pub.plugins.list = [func].concat(_pub.plugins.list)
                } else {
                    _pub.plugins.list.push(func)
                }
            }
        }
    };
    var active = {};
    var events = {};
    var els = {};
    var offset = {};
    var create = function (elem) {
        pagesize = _pub.getPageSize();
        els.container = document.createElement("div");
        els.container.id = "ibox";
        els.overlay = document.createElement("div");
        els.overlay.style.display = "none";
        _pub.setOpacity(null, els.overlay, 0);
        if (!_pub.is_firefox) {
            els.overlay.style.background = "#000000"
        } else {
            els.overlay.style.backgroundImage = "url('" + _pub.base_url + "template/bglightbox.png')"
        }
        els.overlay.id = "ibox_overlay";
        params = {
            position: "absolute",
            top: 0,
            left: 0,
            width: "100%"
        };
        _pub.updateObject(els.overlay.style, params);
        els.overlay.onclick = _pub.hide;
        els.container.appendChild(els.overlay);
        els.loading = document.createElement("div");
        els.loading.id = "ibox_loading";
        els.loading.innerHTML = "Loading...";
        els.loading.style.display = "none";
        els.loading.onclick = _pub.hide;
        els.container.appendChild(els.loading);
        els.wrapper = document.createElement("div");
        els.wrapper.id = "ibox_wrapper";
        _pub.updateObject(els.wrapper.style, {
            position: "absolute",
            top: 0,
            left: 0,
            display: "none"
        });
        els.content = document.createElement("div");
        els.content.id = "ibox_content";
        _pub.updateObject(els.content.style, {
            overflow: "auto"
        });
        els.wrapper.appendChild(els.content);
        var child = document.createElement("div");
        child.id = "ibox_footer_wrapper";
        var child2 = document.createElement("a");
        els.footer = document.createElement("div");
        els.footer.id = "ibox_footer";
        els.footer.innerHTML = "&nbsp;";
        child.appendChild(els.footer);
        els.wrapper.appendChild(child);
        els.container.appendChild(els.wrapper);
        elem.appendChild(els.container);
        _pub.updateObject(els.wrapper.style, {
            right: "",
            bottom: ""
        });
        return els.container
    };
    var hideTags = function (tag, container) {
        if (container === undefined) {
            var container = document.body
        }
        var list = container.getElementsByTagName(tag);
        for (var i = 0; i < list.length; i++) {
            if (_pub.getStyle(list[i], "visibility") != "hidden" && list[i].style.display != "none") {
                list[i].style.visibility = "hidden";
                list[i].wasHidden = true
            }
        }
    };
    var showTags = function (tag, container) {
        if (container === undefined) {
            var container = document.body
        }
        var list = container.getElementsByTagName(tag);
        for (var i = 0; i < list.length; i++) {
            if (list[i].wasHidden) {
                list[i].style.visibility = "visible";
                list[i].wasHidden = null
            }
        }
    };
    var showInit = function (title, params, callback) {
        if (!_initialized) {
            initialize()
        }
        if (params === undefined) {
            var params = {}
        }
        if (active.plugin) {
            _pub.hide()
        }
        active.is_loaded = true;
        active.params = params;
        els.loading.style.display = "block";
        _pub.center(els.loading);
        _pub.reposition();
        for (var i = 0; i < _pub.tags_to_hide.length; i++) {
            hideTags(_pub.tags_to_hide[i])
        }
        els.footer.innerHTML = title || "&nbsp;";
        els.overlay.style.display = "block";
        if (!_pub.is_firefox) {
            var amount = 70
        } else {
            var amount = 100
        }
        _pub.fade(els.overlay, _pub.getOpacity(null, els.overlay), amount, _pub.fade_in_speed, callback);
        _pub.fireEvent("show")
    };
    var drawCSS = function () {
        var core_styles = "#ibox {z-index:1000000;text-align:left;} #ibox_overlay {z-index:1000000;} #ibox_loading {position:absolute;z-index:1000001;} #ibox_wrapper {margin:30px;position:absolute;top:0;left:0;z-index:1000001;} #ibox_content {z-index:1000002;margin:5px 5px 5px 5px;padding:2px;} #ibox_content object {display:block;} #ibox_content .ibox_image {width:100%;height:100%;margin:0;padding:0;border:0;display:block;} #ibox_footer_wrapper a {float:right;display:block;outline:0;margin:0;padding:0;} #ibox_footer_wrapper {text-align:left;position:absolute;top:5px;right:5px;left:5px;white-space:nowrap;overflow:hidden;}";
        var default_skin = "#ibox_footer_wrapper {font-weight:bold;height:20px;line-height:20px;} #ibox_footer_wrapper a {text-decoration:none;background:#888;border:1px solid #666;line-height:16px;padding:0 5px;color:#333;font-weight:bold;font-family:Verdana, Arial, Helvetica, sans-serif;font-size:10px;} #ibox_footer_wrapper a:hover {background-color:#bbb;color:#111;} #ibox_footer_wrapper {font-size:12px;font-family:Verdana, Arial, Helvetica, sans-serif;color:#111;} #ibox_wrapper {border:1px solid #ccc;} #ibox_wrapper {background-color:#C3872E;}#ibox_content {background-color:#3B4151;border:0px solid #666;} #ibox_loading {padding:50px; background:#000;color:#fff;font-size:16px;font-weight:bold;}";
        var head = document.getElementsByTagName("head")[0];
        var htmDiv = document.createElement("div");
        htmDiv.innerHTML = '<p>x</p><style type="text/css">' + default_skin + "</style>";
        head.insertBefore(htmDiv.childNodes[1], head.firstChild);
        htmDiv.innerHTML = '<p>x</p><style type="text/css">' + core_styles + "</style>";
        head.insertBefore(htmDiv.childNodes[1], head.firstChild)
    };
    var _initialized = false;
    var initialize = function () {
        if (_initialized) {
            return
        }
        _initialized = true;
        drawCSS();
        var els = document.getElementsByTagName("script");
        var src;
        for (var i = 0, el = null;
        (el = els[i]); i++) {
            if (! (src = el.getAttribute("src"))) {
                continue
            }
            src = src.split("?")[0];
            if (src.substr(src.length - 8) == "/ibox.js") {
                _pub.setPath(src.substr(0, src.length - 7));
                break
            }
        }
        create(document.body);
        _pub.checkTags(document.body, "a");
        _pub.http = _pub.createXMLHttpRequest();
        _pub.fireEvent("load")
    };
    _pub.addEvent(window, "keypress", function (e) {
        if (e.keyCode == (window.event ? 27 : e.DOM_VK_ESCAPE)) {
            iBox.hide()
        }
    });
    _pub.addEvent(window, "resize", _pub.reposition);
    _pub.addEvent(window, "load", initialize);
    _pub.addEvent(window, "scroll", _pub.reposition);
    var iBoxPlugin_Container = function () {
        var was_error = false;
        var original_wrapper = null;
        return {
            match: function (url) {
                return url.indexOf("#") != -1
            },
            unload: function () {
                if (was_error) {
                    return
                }
                var elemSrc = _pub.html().firstChild;
                if (elemSrc) {
                    elemSrc.style.display = "none";
                    original_wrapper.appendChild(elemSrc)
                }
            },
            render: function (url, params) {
                was_error = false;
                var elemSrcId = url.substr(url.indexOf("#") + 1);
                var elemSrc = document.getElementById(elemSrcId);
                if (!elemSrc) {
                    was_error = true;
                    _pub.html(document.createTextNode("There was an error loading the document."), params)
                } else {
                    original_wrapper = elemSrc.parentNode;
                    elemSrc.style.display = "block";
                    _pub.html(elemSrc, params)
                }
            }
        }
    } ();
    _pub.plugins.register(iBoxPlugin_Container, true);
    var iBoxPlugin_Image = function () {
        var image_types = /\.jpg|\.jpeg|\.png|\.gif/gi;
        return {
            match: function (url) {
                return url.match(image_types)
            },
            render: function (url, params) {
                var img = document.createElement("img");
                img.onclick = _pub.hide;
                img.className = "ibox_image";
                img.style.cursor = "pointer";
                img.onload = function () {
                    _pub.html(img, {
                        width: this.width,
                        height: this.height,
                        constrain: true
                    })
                };
                img.onerror = function () {
                    _pub.html(document.createTextNode("There was an error loading the document."), params)
                };
                img.src = url
            }
        }
    } ();
    _pub.plugins.register(iBoxPlugin_Image);
    var iBoxPlugin_YouTube = function () {
        var youtube_url = /(?:http:\/\/)?(?:www\d*\.)?(youtube\.(?:[a-z]+))\/(?:v\/|(?:watch(?:\.php)?)?\?(?:.+&)?v=)([^&]+).*/;
        return {
            match: function (url) {
                return url.match(youtube_url)
            },
            render: function (url, params) {
                var _match = url.match(youtube_url);
                var domain = _match[1];
                var id = _match[2];
                params.width = 425;
                params.height = 355;
                params.constrain = true;
                var html = '<span><object width="100%" height="100%" style="overflow: hidden; display: block;"><param name="movie" value="http://www.' + domain + "/v/" + id + '"/><param name="wmode" value="transparent"/><embed src="http://www.' + domain + "/v/" + id + '" type="application/x-shockwave-flash" wmode="transparent" width="100%" height="100%"></embed></object></span>';
                _pub.html(html, params)
            }
        }
    } ();
    _pub.plugins.register(iBoxPlugin_YouTube);
    var iBoxPlugin_Document = function () {
        return {
            match: function (url) {
                return true
            },
            render: function (url, params) {
                _pub.http.open("get", url, true);
                _pub.http.onreadystatechange = function () {
                    if (_pub.http.readyState == 4) {
                        if (_pub.http.status == 200 || _pub.http.status == 0) {
                            _pub.html(_pub.http.responseText, params)
                        } else {
                            _pub.html(document.createTextNode("There was an error loading the document."), params)
                        }
                    }
                };
                _pub.http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
                try {
                    _pub.http.send(null)
                } catch(ex) {
                    _pub.html(document.createTextNode("There was an error loading the document."), params)
                }
            }
        }
    } ();
    _pub.plugins.register(iBoxPlugin_Document, true);
    return _pub
} ();