/**
 * Travel Lightbox loader
 *
 * @author mista_k
 */
if (typeof TRAVEL === 'undefined') {
    var TRAVEL = {};
}

(function () {

	var mid = 121;
	var sid = '$sid';
    var lightbox;

    /**
     * LightBox singleton
     * @param opts
     */
    TRAVEL.LightBox = function (opts) {
        opts = opts || {};
        if (lightbox) {
            extend(lightbox.options, opts);
            if (opts.url) {
                lightbox.show(opts.url);
            }
        } else {
            lightbox = new LightBox(opts);
        }
    };

    /**
     * Extend source object with options
     * @param src   {Object}
     * @param opts  {Object}
     */
    function extend(src, opts) {
        var name, copy;
        for (name in opts) {
            copy = opts[name];
            if (typeof copy !== "undefined") {
                src[name] = copy;
            }
        }
        return src;
    }

    /**
     * Asynchronous queue helper
     * @method  add       добавить функцию в очередь
     * @method  interate  выполнить первую в очереди функцию и удалить ее из очереди
     * @method  clear     очистить очередь
     */
    var Queue = function () {
        this.members = [];
    };

    Queue.prototype = {
        add: function (f) {
            if (f instanceof Function) {
                this.members.push(f);
            }
        },
        iterate: function () {
            if (this.members.length > 0) {
                var func = this.members.shift();
                func.call(this);
            }
        },
        clear: function () {
            this.members = [];
        }
    };

    /**
     * JavaScript loader
     * @param modules   {Array}     files
     * @param opts      {Object}    extra options
     */
    var ScriptLoader = function (modules, opts) {
        this.modules = modules.slice();
        this.options = extend({}, opts);
        this.queue = new Queue();
        this._init();
    };

    ScriptLoader.prototype = {
        run: function () {
            // test for header ready
            var head = document.getElementsByTagName("head");
            if (head.length > 0) {
                this.queue.iterate();
            } else {
                setTimeout(arguments.callee, 500);
            }
        },

        _init: function () {
            var i, me = this;
            for (i = 0; i < me.modules.length; i++) {
                (function (name) {
                    me.queue.add(function () {
                        var head, script;
                        head = document.getElementsByTagName("head");
                        if (head.length > 0) {
                            head = head[0];
                            script = document.createElement("script");
                            script.src = name;
                            script.type = "text/javascript";
                            script.onload = script.onreadystatechange = function () {
                                if ((!this.readyState || this.readyState == "loaded" || this.readyState == "complete") ) {
                                    me.queue.iterate();
                                    script.onload = script.onreadystatechange = null;
                                    head.removeChild(script);
                                }
                            };
                            head.appendChild(script);
                        }
                    });
                })(me.options.baseUrl + me.modules[i]);
            }
        }
    };


    /**
     * Light box
     * @param opts
     */
    var LightBox = function (opts) {
        var me = this,
            data = extend(me.options, opts);

        this.load(function () {
            me.init(data);
        });
    };

    LightBox.prototype = {
        JQUERY_MIN_VERSION: "1.2",

        options: {
            'debug': false,
            'baseUrl': 'http://shops.openxn.com/',
            'opacity': 0.8,
            'color': 'white',
            'height' : 0.8,
            'width' : 0.8
        },
		
		mappings : {
	'' : 'https://shops.openxn.com/oster/shoppingcart;jsessionid=$sid' 		},

        modules: [
            'foundation/js/jquery-1.3.2.min.js'
        ],

        uidx: (new Date()).getTime(),

        guid: function () {
            return 'lightbox' + '-' + this.uidx++;
        },

        load: function (callback) {
            var me = this;

            if (typeof jQuery !== 'undefined') {
                var version = jQuery().jquery;
                var comp = compareVersions(version, this.JQUERY_MIN_VERSION);
                if (comp < 0) {
                    alert('The used version of jQuery (' + version + ') isn\'t suitable.\n' +
                          'Update it to ' + this.JQUERY_MIN_VERSION);
                    return;
                } else if (comp >= 0) {
                    me.modules.shift();
                }
            }

            var loader = new ScriptLoader(me.modules, me.options);
            loader.queue.add(callback);
            loader.run();
        },

        init: function (opts) {
            var me = this, pattern = new RegExp('^' + opts.baseUrl.replace('http','https?'));

            if (typeof jQuery === 'undefined') {
                throw new Error("jQuery doesn't loaded!");
            }

            // ensure that document is ready
            $(function () {
                var links = $('a');

                if (opts.debug) {
                    try {
                        console.info(links.length + ' links found');
                    } catch (ex) {};
                }

                links.click(function () {
                    var url = $(this).attr('href');
					if(url) {
						for(var k in me.mappings) {
							if(k == url)
								url = me.mappings[k];
						}
					}
					
                    if (url && url.match(pattern)) {
                        if (opts.debug) {
                            try {
                                console.info('URL: ' + url);
                            } catch (ex) {};
                        }
                        me.show(url);
                        return false;
                    }
                });
            });
        },

        show: function () {
            showPage.apply(this, arguments);
        },

        hide: function () {
            hidePage.apply(this, arguments);
        }
    };


    function compareVersions(target, required) {
        var aTarget = target.split('.'),
                aRequired = required.split('.'),
                flag = 0, i;

        Array.prototype.push.apply(aTarget, [0, 0, 0]);
        Array.prototype.push.apply(aRequired, [0, 0, 0]);

        for (i = 0; i < 3 && !flag; i++) {
            if (!flag) {
                flag = parseInt(aTarget[i], 10) - parseInt(aRequired[i], 10);
                flag = (flag > 0) ? 1 : (flag < 0) ? -1 : 0;
            }
        }

        return flag;
    }


    function showPage(url) {
    
    	if(url.match(/;jsessionid/ig)) {
    		//remove jsessionid param
    		url = url.substring(0,url.search(/;jsessionid/ig));
    	}
    	url = url + ';jsessionid=$sid';

        var me = this;
        var opts = $.extend({}, me.options, {'url': url});
        var body = $('body').eq(0);
        var dimLayerNode, winLayerNode;

        this.dimLayerId = me.guid();

        dimLayerNode = $('<div id="' + this.dimLayerId + '"></div>').appendTo(body);

        dimLayerNode
                .width(Math.max($(window).width(), $(document).width()))
                .height(Math.max($(window).height(), $(document).height()))
                .css({'opacity': opts.opacity, 'background-color': opts.color, 'z-index': 9991,
                        'position': 'absolute', 'top': 0, 'left': 0});

        this.winLayerId = me.guid();

        winLayerNode = $('<div id="' + this.winLayerId + '"></div>').appendTo(body);
		
		opts.width = parseFloat(opts.width.toString().replace(/px$/,''));
		opts.height = parseFloat(opts.height.toString().replace(/px$/,''));
		//if width or height in pixels then check window boundaries for theirs
		if(opts.width > 1) {	//in pixels
			opts.width = Math.max($(window).width(), opts.width);
		} 
		if(opts.height > 1) {	//in pixels
			opts.height = Math.max($(window).height(), opts.height);
		}
		
        var w = opts.width > 1 ? opts.width : parseInt($(window).width() * (opts.width || 0.8), 10),
            h = opts.height > 1 ? opts.height : parseInt($(window).height() * (opts.height || 0.8), 10),
            top = $(window).scrollTop(),
            left = $(window).scrollLeft();

        winLayerNode
                .width(w).height(h)
                .css({'background-color': 'white', 'z-index': 9992,
                        'position': 'absolute', 'top': top + h / 8, 'left': left + w / 8});

        var closeButtonId = me.guid();

        var shadowpath = opts.baseUrl + 'foundation/i/lightbox/';
        var sh = h - 110, sw = w - 110;
        if (sh > 1 && sw > 1) {
            winLayerNode.append(
                '<div class="lightbox-shadow" style="position: relative; width: 0; height: 0;">' +
                    '<div style="background: transparent url(' + shadowpath + 'box-shadow-tl.png) no-repeat left top; position: absolute; top: -45px; left: -45px; width: 100px; height: 100px;"></div>' +
                    '<div style="background: transparent url(' + shadowpath + 'box-shadow-t.png) repeat-x left top; position: absolute; top: -45px; left: 55px; width: ' + sw + 'px; height: 100px;"></div>' +
                    '<div style="background: transparent url(' + shadowpath + 'box-shadow-tr.png) no-repeat left top; position: absolute; top: -45px; left: ' + (sw + 55) + 'px; width: 100px; height: 100px;"></div>' +
                    '<div style="background: transparent url(' + shadowpath + 'box-shadow-l.png) repeat-y left top; position: absolute; top: 55px; left: -45px; width: 100px; height: ' + sh + 'px;"></div>' +
                    '<div style="background: transparent url(' + shadowpath + 'box-shadow-r.png) repeat-y left top; position: absolute; top: 55px; left: ' + (sw + 55) + 'px; width: 100px; height: ' + sh + 'px;"></div>' +
                    '<div style="background: transparent url(' + shadowpath + 'box-shadow-bl.png) no-repeat left top; position: absolute; top: ' + (sh + 55) + 'px; left: -45px; width: 100px; height: 100px;"></div>' +
                    '<div style="background: transparent url(' + shadowpath + 'box-shadow-b.png) repeat-x left top; position: absolute; top: ' + (sh + 55) + 'px; left: 55px; width: ' + sw + 'px; height: 100px;"></div>' +
                    '<div style="background: transparent url(' + shadowpath + 'box-shadow-br.png) no-repeat left top; position: absolute; top: ' + (sh + 55) + 'px; left: ' + (sw + 55) + 'px; width: 100px; height: 100px;"></div>' +
                '</div>');
        }

        winLayerNode.append('<div style="position: absolute;"><iframe style="width: ' + w + 'px; height: ' + h + 'px;" width="' + w + '" height="' + h + '" src="' + opts.url + '" frameborder="0" scrolling="auto"></iframe></div>');
        winLayerNode.append('<div style="position: absolute; top: -15px; left: -15px; width: 30px; height: 30px; cursor: pointer;">' +
                            '<img id="' + closeButtonId + '" style="width: 30px; height: 30px;" src="' + opts.baseUrl + 'foundation/i/close-button.png" />' +
                            '</div>');

        $('#' + closeButtonId).each(function () {
            if ($.browser.msie) {
                this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.src + "',sizingMethod='scale')";
                this.src = opts.baseUrl + 'foundation/i/s.gif';
            }
            $(this).click(function () {
                me.hide.call(me);
            });
        });

        if ($.browser.msie) {
            $('div.lightbox-shadow > div', winLayerNode).each(function () {
                var url = this.style.backgroundImage.replace(/^url\((.+)\)$/, "$1");
                this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + url + "',sizingMethod='scale')";
                this.runtimeStyle.background = "none";
            });
        }

    }


    function hidePage() {
        $('#' + this.dimLayerId).remove();
        $('#' + this.winLayerId).remove();
    }


})();
