(function () {
    if (window.jLayers && typeof window.jLayers == 'function') return;
    window.jLayers = function (base, s) {
        var settings = {
            alpha: 1,
            catchGlobalMove: false,
            cssPosition: undefined,
            cssLeft: undefined,
            cssTop: undefined,
            offsetX: 0,
            offsetY: 0,
            offsetCenter: 'center',
            easing: true,
            easingRate: 50,
            easingSpeed: 3
        };
        settings.get = function (key, index) {
            var val = this[key];
            if (index != undefined && val instanceof Array) {
                var s = val[index];
                if (s == undefined) s = val[val.length - 1];
                return s
            } else {
                if (typeof val == 'boolean') return (val) ? -1 : 1;
                else return parseInt(val)
            }
        };
        if (s && typeof s == 'object') {
            for (var key in settings) {
                if (s[key] != undefined) settings[key] = s[key]
            }
        }
        if (typeof base == "string") {
            base = document.getElementById(base)
        }
        if (settings.cssPosition) base.style.position = settings.cssPosition;
        if (settings.cssTop) base.style.top = settings.cssTop;
        if (settings.cssLeft) base.style.left = settings.cssLeft;
        var layers = new Array();
        var layer = base.firstChild;
        var wrapper;
        while (layer != undefined) {
            if (layer.nodeType == 1) {
                wrapper = document.createElement('div');
                base.insertBefore(wrapper, layer);
                wrapper.appendChild(layer);
                layers.push(wrapper);
                wrapper.className = 'jlayers-layer';
                layer.className += (layer.className.length == 0) ? 'jlayers-content' : ' jlayers-content';
                layer = wrapper
            }
            layer = layer.nextSibling
        }
        var i;
        var a;
        for (i = 0; i < layers.length; i++) {
            a = settings.get('alpha', i);
            if (a > 1) a = 1;
            if (a < 0) a = 0;
            if (navigator.appName.indexOf('Microsoft') == -1) {
                layers[i].style.opacity = a.toString()
            } else {
                layers[i].style.filter = 'alpha(opacity=' + a * 100 + ')'
            }
        }
        var getAbsolutePosition = function (t) {
                if (t == null) {
                    return [0, 0]
                } else {
                    var startX = t.offsetLeft;
                    var startY = t.offsetTop;
                    var tmp = arguments.callee(t.offsetParent);
                    return [startX + tmp[0], startY + tmp[1]]
                }
            };
        base.posx = getAbsolutePosition(base)[0];
        base.posy = getAbsolutePosition(base)[1];
        layers.tmpX = 0;
        layers.tmpY = 0;
        layers.endX = 0;
        layers.endY = 0;
        var updateLayerPosition = function () {
                if (Math.abs(layers.tmpX - layers.endX) > 0.0001 || Math.abs(layers.tmpX - layers.endX) > 0.0001) {
                    layers.tmpX += (layers.endX - layers.tmpX) / settings.easingSpeed;
                    layers.tmpY += (layers.endY - layers.tmpY) / settings.easingSpeed;
                    for (var i = 0; i < layers.length; i++) {
                        layers[i].style.left = layers.tmpX * settings.get('offsetX', i) + 'px';
                        layers[i].style.top = layers.tmpY * settings.get('offsetY', i) + 'px'
                    }
                }
            };
        var moveHandler = function (e) {
                e = e || window.event;
                var mouseX = e.clientX;
                var mouseY = e.clientY;
                if (settings.catchGlobalMove == false) {
                    mouseX -= base.posx;
                    mouseY -= base.posy
                }
                layers.endX = 2 * mouseX / base.offsetWidth - 1;
                layers.endY = 2 * mouseY / base.offsetHeight - 1;
                if (/left/i.test(settings.offsetCenter)) {
                    layers.endX = mouseX / base.offsetWidth
                }
                if (/right/i.test(settings.offsetCenter)) {
                    layers.endX = 1 - mouseX / base.offsetWidth
                }
                if (/top/i.test(settings.offsetCenter)) {
                    layers.endY = mouseY / base.offsetHeight
                }
                if (/bottom/i.test(settings.offsetCenter)) {
                    layers.endY = 1 - mouseY / base.offsetHeight
                }
                if (settings.easing) {
                    if (base.timer == undefined) base.timer = setInterval(updateLayerPosition, settings.easingRate)
                } else {
                    for (var i = 0; i < layers.length; i++) {
                        layers[i].style.left = layers.endX * settings.get('offsetX', i) + 'px';
                        layers[i].style.top = layers.endY * settings.get('offsetY', i) + 'px'
                    }
                }
            };
        var registerEventListener = function (target, event, listener) {
                if (target.addEventListener) {
                    target.addEventListener(event, listener, false)
                } else if (target.attachEvent) {
                    target.attachEvent('on' + event, listener)
                }
            };
        registerEventListener((settings.catchGlobalMove) ? document : base, 'mousemove', moveHandler);
        registerEventListener(window, 'unload', function () {
            clearInterval(base.timer)
        });
        registerEventListener(window, 'resize', function () {
            base.posx = getAbsolutePosition(base)[0];
            base.posy = getAbsolutePosition(base)[1]
        });
        return settings
    };
    window.jLayers.layerSize = function (layer) {
        if (typeof layer == 'string') layer = document.getElementById(layer);
        return {
            width: layer.offsetWidth,
            height: layer.offsetHeight
        }
    };
    window.jLayers.documentSize = function () {
        if (window.innerWidth) return {
            width: window.innerWidth,
            height: window.innerHeight
        };
        else if (document.body && document.body.offsetWidth) return {
            width: document.body.offsetWidth,
            height: document.body.offsetHeight
        };
        else if (document.documentElement && document.documentElement.offsetWidth) return {
            width: document.documentElement.offsetWidth,
            height: document.documentElement.offsetHeight
        }
    }
})();
