function getStyle(obj, property) {
    var style = window.getComputedStyle
              ? window.getComputedStyle(obj, '')
              : obj.currentStyle;
    if (!style)    { return undefined; }
    if (!property) { return style; }
    return style[property];
}

function hasClass(className, el) {
    var classes = el.className.split(/\s+/);
    for (var i=0; i<classes.length; i++) {
        if (classes[i] === className) { return true; }
    }
    return false;
}

function PageLayer(obj, layer, isExternal) {
    this.caller    = obj;
    this.element   = layer;
    //this.printCss  = printCss;
    this.layerType = isExternal ? 'iframe' : 'div';
    if (!PageLayer.backgroundFader) {
        PageLayer.createBackgroundFader();
    }
    if (this.layerType == 'iframe') {
        this.createIframeElement();
    }
    //document.body.insertBefore(this.element, PageLayer.backgroundFader.nextSibling);
}
PageLayer.createBackgroundFader = function() {
    PageLayer.backgroundFader = document.createElement('div');
    PageLayer.backgroundFader.id = 'layerBackgroundFader';
    document.body.insertBefore(PageLayer.backgroundFader, document.body.firstChild);
    PageLayer.backgroundFader.style.height = document.body.offsetHeight + 'px';
    PageLayer.backgroundFader.onclick = function() {
        PageLayer.close(null);
    }
}
PageLayer.prototype.createIframeElement = function() {
    this.iframe = document.all&&!window.opera
                ? document.createElement('<iframe frameborder="0" scrolling="no">')
                : document.createElement('iframe');
    this.element.appendChild(this.iframe);
    this.element.iframe = this.iframe;
    this.element.layer  = this;
    this.iframe.src = 'empty.html';
    return this.iframe;
}
PageLayer.prototype.setIframeSize = function(width, height) {
    this.iframe.style.width  = width  + 'px';
    this.iframe.style.height = height + 'px';
    this.setPosition();
}
PageLayer.prototype.setPosition = function() {
    var offset = Math.min(this.element.offsetHeight/2, (window.innerHeight||document.documentElement.clientHeight)/2);
    this.element.style.marginLeft = '-'+(this.element.offsetWidth/2)+'px';
    this.element.style.marginTop  = '-'+offset+'px';
    var style = window.getComputedStyle
              ? window.getComputedStyle(this.element, '')
              : this.element.currentStyle;
    if (!style) { return; }
    if (style.position == 'absolute') {
        this.element.style.top = (document.documentElement.clientHeight/2 + document.documentElement.scrollTop) + 'px';
    }
}
PageLayer.prototype.open = function() {
    /*if (this.printCss) {
        this.setStylesheet(this.printCss);
    }*/
    if (PageLayer.openLayer) { new PageLayer(null, PageLayer.openLayer).close(true); }
    PageLayer.backgroundFader.style.display = 'block';
    this.element.style.display = 'block';
    this.setPosition();
    this.oldOnresize = window.onresize;
    window.onresize = this.setPosition.bind(this);
    document.getElementsByTagName('html')[0].style.overflow = 'hidden';
    PageLayer.openLayer = this.element;
    if (this.layerType == 'iframe') {
        this.iframe.style.width  = '1px'; // Required for IE 7 ...
        this.iframe.style.height = '1px';
        this.iframe.src = this.caller.href;
    }
}
PageLayer.prototype.close = function(skipBackground) {
    if (PageLayer.openLayer != this.element) { return true; }
    if (!skipBackground) { PageLayer.backgroundFader.style.display = 'none'; }
    if (typeof(window.pageYOffset) == 'number') {
        window.scrollTo(window.pageXOffset, window.pageYOffset+1); // Safari needs scrolling ...
        window.scrollTo(window.pageXOffset, window.pageYOffset-1); // ... or the scrollbars won't show up!
    }
    if (this.oldOnresize) { window.onresize = this.oldOnresize; }
    this.element.style.display = 'none';
    document.getElementsByTagName('html')[0].style.overflow = '';
}
PageLayer.close = function(caller) {
    if (PageLayer.openLayer) { new PageLayer(caller, PageLayer.openLayer).close(); }
}
/*PageLayer.prototype.setStylesheet = function(css) {
    if (!this.cssElement) {
        var el   = document.createElement('link');
        el.rel   = 'stylesheet';
        el.type  = 'text/css';
        el.media = 'all';
        document.getElementsByTagName('head')[0].appendChild(el);
        this.cssElement = el;
        this.cssSheet   = document.styleSheets[document.styleSheets.length-1];
    }
    if (css) {
        this.cssElement.href     = css;
        this.cssElement.disabled = false;
        var additionalRule = '#grid #'+this.element.id+', #grid #'+this.element.id+' div { display: block !important; }';
        if (this.cssSheet.insertRule) {
            this.cssSheet.insertRule(additionalRule, this.cssSheet.cssRules.length);
        } else {
            this.cssSheet.cssText += additionalRule;
        }
    } else {
        this.cssElement.disabled = true;
    }
}*/

function getPageLayer(obj, layer, isExternal) {
    if (layer instanceof PageLayer)  { return layer; }
    if (typeof(layer)=='string') { layer = document.getElementById(layer); }
    if (layer.className) {
        var re = new RegExp('(^|\\s)'+['page-layer'].join('|')+'(\\s|$)');
        while (!re.test(layer.className) && layer!=document.documentElement) {
            layer = layer.parentNode;
        }
    }
    if (!layer.layerObject) { layer.layerObject = new PageLayer(obj, layer, isExternal); }
    return layer.layerObject;
}

function openPageLayer(obj, layer, isExternal) {
    layer = getPageLayer(obj, layer, isExternal);
    if (!layer.element) { return true; }
    layer.open();
    return false;
}

function closePageLayer(layer) {
    layer = getPageLayer(null, layer);
    if (!layer.element) { return true; }
    layer.close();
    return false;
}

