// create namespace
Core.createNamespace('nl.code.lightbox');

/**
 * Preloader Class
 *
 * Events: 'onPreloadComplete'
 */
nl.code.lightbox.Preloader = new Class({
    /**
     * Implements: Options, Events
     */
    Implements: [Options, Events],

    /**
     * @var Object
     */
    options: {
    },

    /**
     * @var Object
     */
    data: null,

    /**
     * @var int
     */
    images_preloaded: 0,

    /**
     * @var Array
     */
    preload_image_arr: null,

    /**
     * @var Element
     */
    preload_content: null,

    /**
     * Constructor
     *
     * @param Object, width, height, content, trigger, class
     * @param Object, used for adding events
     */
    initialize: function(data, options) {
        this.data = data;
        this.setOptions(options);

        this.preload_content = this.createContentContainer();
        this.addImageEvents();
    },

    /**
     * @return void
     */
    addImageEvents: function() {
        var thisObject = this;
        this.preload_image_arr = this.preload_content.getElements('img');
        if (this.preload_image_arr.length) {
            for (var i = 0; i < this.preload_image_arr.length; i++) {
                var preload_image = new Asset.image(this.preload_image_arr[i].src, {
                    onload: function() {
                        thisObject.onImagePreload();
                    },
                    onerror: function() {
                        thisObject.onImagePreload();
                    },
                    onabort: function() {
                        thisObject.onImagePreload();
                    }
                });
            }
        } else {
            this.onPreloadComplete();
        }
    },

    /**
     * @return Element
     */
    createContentContainer: function() {
        var preload_container = new Element('div', {
            'class': 'js-lightbox-preload-container'
        });
        preload_container.inject(document.body);

        var preload_content = new Element('div', {
            'class': 'js-lightbox-content-wrapper'
        });

        // check wich dimension is missing
        if (this.data.height != 0) {
            preload_content.setStyles({
                height: this.data.height,
                top: (-2 * this.data.height)
            });
        } else if (this.data.width != 0) {
            preload_content.setStyles({
                width: this.data.width,
                left: (-2 * this.data.width)
            });
        }

        preload_content.inject(preload_container);

        if (this.data.css_class) {
            preload_content.addClass(this.data.css_class);
        }

        preload_content.set('html', this.data.content);

        return preload_content;
    },

    /**
     * @return void
     */
    onPreloadComplete: function() {
        var coordinates = this.preload_content.getCoordinates();

        if (nl.code.lightbox.Lightboxer.fit_screen) {
            this.data.width  = (coordinates.width > (window.getSize().x - 40) ? (window.getSize().x - 40) : coordinates.width);
            this.data.height = (coordinates.height > (window.getSize().y - 40) ? (window.getSize().y - 40) : coordinates.height);
        } else {
            this.data.width  = coordinates.width;
            this.data.height = coordinates.height;
        }

        this.fireEvent('onPreloadComplete', this.data);
    },

    /**
     * @return void
     */
    onImagePreload: function() {
        this.images_preloaded++;

        if (this.images_preloaded == this.preload_image_arr.length) {
            this.onPreloadComplete();
        }
    }
});