/*
This file is part of JonDesign's SmoothGallery v2.0.

JonDesign's SmoothGallery is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

JonDesign's SmoothGallery is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with JonDesign's SmoothGallery; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

Main Developer: Jonathan Schemoul (JonDesign: http://www.jondesign.net/)
*/

var gallerySet = gallery.extend({
    initialize: function (element, options) {
        this.setOptions({
            manualSetData: [],
            gallerySelector: "div.galleryElement",
            galleryTitleSelector: "h2",
            textGallerySelector: 'Galleries',
            textShowGallerySelector: 'Other Galleries',
            textGalleryInfo: '{0} pictures',
            startWithSelector: true,
            /* Changing default options */
            textShowCarousel: '{0}/{1} Pictures',
            carouselPreloader: false
        }, options);
        this.gallerySet = this.options.manualSetData;
        this.addEvent('onPopulated', this.createGallerySelectorTab.bind(this));
        this.addEvent('onPopulated', this.createGallerySelector.bind(this));
        this.startWithSelectorFn = this.toggleGallerySelector.pass(true, this);
        if (this.options.startWithSelector)
            this.addEvent('onGallerySelectorCreated', this.startWithSelectorFn);
        this.parent(element, this.options);
    },
    populateData: function () {
        options = this.options;
        var data = $A(this.gallerySet);
        this.populateFrom.getElements(options.gallerySelector).each(function (galEl) {
            currentGalArrayPlace = 0;
            galleryDict = {
                title: galEl.getElement(options.galleryTitleSelector).innerHTML,
                elements: []
            }
            galleryDict.elements.extend(this.populateGallery(galEl, 0));
            data.extend([galleryDict]);
            if (this.options.destroyAfterPopulate)
                galEl.remove();
        }, this);
        this.gallerySet = data;
        this.galleryData = data[0].elements;
        this.currentGallery = 0;
        this.fireEvent('onPopulated');
    },
    changeGallery: function (number) {
        if (number != this.currentGallery) {
            this.changeData(this.gallerySet[number].elements);
            this.maxIter = this.gallerySet[number].elements.length;
            this.currentGallery = number;
            this.gallerySelectorBtn.setHTML(this.gallerySet[number].title);
            this.fireEvent('onGalleryChanged');
        }
        this.toggleGallerySelector(false);
    },
    createGallerySelectorTab: function () {
        this.gallerySelectorBtn = new Element('a').addClass('gallerySelectorBtn').setProperties({
            title: this.options.textShowGallerySelector
        }).setHTML(this.options.textShowGallerySelector).addEvent(
			'click',
			function () { this.toggleGallerySelector(true); } .bind(this)
		).injectInside(this.galleryElement);
        this.addEvent('onShowCarousel', function () { this.gallerySelectorBtn.setStyle('zIndex', 10) } .bind(this));
        this.addEvent('onCarouselHidden', function () { this.gallerySelectorBtn.setStyle('zIndex', 15) } .bind(this));
    },
    createGallerySelector: function () {
        this.gallerySelector = new Fx.Styles(
			new Element('div').addClass(
				'gallerySelector'
			).injectInside(
				this.galleryElement
			).setStyles({
			    'display': 'none',
			    'opacity': '0'
			})
		);
        this.gallerySelectorTitle =
			new Element('h2').setHTML(
				this.options.textGallerySelector
			).injectInside(this.gallerySelector.element);
        var gallerySelectorHeight = this.galleryElement.offsetHeight - 50 - 10 - 2;
        this.gallerySelectorWrapper = new Fx.Style(
			new Element('div').addClass(
				'gallerySelectorWrapper'
			).setStyle(
				'height',
				gallerySelectorHeight + "px"
			).injectInside(this.gallerySelector.element)
		);
        this.gallerySelectorInner = new Element('div').addClass('gallerySelectorInner').injectInside(this.gallerySelectorWrapper.element);
        this.gallerySelectorWrapper.scroller = new Scroller(this.gallerySelectorWrapper.element, {
            area: 100,
            velocity: 0.3
        }).start();
        this.createGalleryButtons();
        this.fireEvent('onGallerySelectorCreated');
    },
    createGalleryButtons: function () {
        var galleryButtonWidth =
			((this.galleryElement.offsetWidth - 30) / 2) - 14;
        this.gallerySet.each(function (galleryItem, index) {
            var button = new Element('div').addClass('galleryButton').injectInside(
				this.gallerySelectorInner
			).addEvents({
			    'mouseover': function (myself) {
			        myself.button.addClass('hover');
			    } .pass(galleryItem, this),
			    'mouseout': function (myself) {
			        myself.button.removeClass('hover');
			    } .pass(galleryItem, this),
			    'click': function (myself, number) {
			        this.changeGallery.pass(number, this)();
			    } .pass([galleryItem, index], this)
			}).setStyle('width', galleryButtonWidth);
            galleryItem.button = button;
            var thumbnail = "";
            if (this.options.showCarousel)
                thumbnail = galleryItem.elements[0].thumbnail;
            else
                thumbnail = galleryItem.elements[0].image;
            new Element('div').addClass('preview').setStyle(
				'backgroundImage',
				"url('" + thumbnail + "')"
			).injectInside(button);
            new Element('h3').setHTML(galleryItem.title).injectInside(button);
            new Element('p').addClass('info').setHTML(formatString(this.options.textGalleryInfo, galleryItem.elements.length)).injectInside(button);
        }, this);
        new Element('br').injectInside(this.gallerySelectorInner).setStyle('clear', 'both');
    },
    toggleGallerySelector: function (state) {
        if (state)
            this.gallerySelector.start({ 'opacity': 1 }).element.setStyle('display', 'block');
        else
            this.gallerySelector.start({ 'opacity': 0 });
    },
    initHistory: function () {
        this.fireEvent('onHistoryInit');
        this.historyKey = this.galleryElement.id + '-gallery';
        if (this.options.customHistoryKey)
            this.historyKey = this.options.customHistoryKey();
        this.history = HistoryManager.register(
			this.historyKey,
			[1, 1],
			function (values) {
			    this.changeGallery.pass(parseInt(values[0]) - 1, this).delay(10);
			    if (this.gallerySelector)
			        this.toggleGallerySelector.pass(false, this).delay(500);
			    this.goTo.pass(parseInt(values[1]) - 1, this).delay(100);
			} .bind(this),
			function (values) {
			    return [this.historyKey, '(', values[0], ')', '-picture', '(', values[1], ')'].join('');
			} .bind(this),
			this.historyKey + '\\((\\d+)\\)-picture\\((\\d+)\\)');
        updateHistory = function () {
            this.history.setValue(0, this.currentGallery + 1);
            this.history.setValue(1, this.currentIter + 1);
        } .bind(this);

        this.addEvent('onChanged', updateHistory);
        this.addEvent('onGalleryChanged', updateHistory);
        this.fireEvent('onHistoryInited');
    }
});
