function Gallery(objectName, nextButtonId, prevButtonId) {
    this._objectName = objectName;
    this._nextButtonId = nextButtonId;
    this._prevButtonId = prevButtonId;
}

Gallery.prototype =
{
    _objectName: null,
    _nextButtonId: null,
    _prevButtonId: null,
    _bios: null,
    _pagesCount: null,
    _currentPage: null,

    initialize: function(bios) {
        this._bios = bios;
        var count = this._bios.length;
        this._currentPage = 0;
        this._pagesCount = 0;
        this._pagesCount = count % 9 == 0 ? count / 9 : (count - count % 9) / 9 + 1;
        var ul = $("#pages")
        for (var k = 0; k < this._pagesCount; k++) {
            var li = $("<li></li>")
				.attr("id", "page" + k)
				.attr("class", "page")
				.appendTo(ul);

            var table = $("<table></table>")
                        .attr("cellspacing", "0")
                        .attr("cellpadding", "0")
                        .appendTo(li);
            for (var i = 0; i < 3 && 9 * k + 3 * i < count; i++) {
                var tr = $("<tr></tr>").appendTo(table);

                for (var j = 0; j < 3 && 9 * k + 3 * i + j < count; j++) {
                    var index = 9 * k + 3 * i + j;
                    var bio = this._bios[index];
                    var name = bio._name;
                    var photo = bio._photos[0];

                    var td = $("<td></td>")
							.appendTo(tr);
                    if (index == 0) {
                        td.attr("class", "cur");
                    }
                    var div = $("<div></div>")
                            .attr("class", "container")
				            .appendTo(td);
                    var img = $("<img></img>")
					    .attr("src", photo._path)
					    .attr("alt", name)
					    .attr("title", name)
					    .appendTo(div);
                    img.click(this.onShowBioClick.createDelegate(this, [index, img[0]]));
                    var name = $("<span></span>")
					            .text(name)
					            .appendTo(td);
                }
            }
        }

        this.getPrevControl().click(function(e) {
            e.preventDefault();
            var link = e.target;
            link.blur();
        });
        this.getNextControl().click(function(e) {
            e.preventDefault();
            var link = e.target;
            link.blur();
        });

        $.scrollTo.defaults.axis = 'x';
        $("#gallery").scrollTo(0);
        $.scrollTo(0);
        this.setButtonsSettings(0);
        this.registerEventHandlers();
    },

    registerEventHandlers: function() {
        this.getNextControl().click(this.onNextButtonClick.createDelegate(this));
        this.getPrevControl().click(this.onPrevButtonClick.createDelegate(this));

        this.getNextControl().mousedown(this.onNextButtonMouseDown.createDelegate(this));
        this.getNextControl().mouseup(this.onNextButtonMouseUp.createDelegate(this));
        this.getNextControl().mouseout(this.onNextButtonMouseUp.createDelegate(this));

        this.getPrevControl().mousedown(this.onPrevButtonMouseDown.createDelegate(this));
        this.getPrevControl().mouseup(this.onPrevButtonMouseUp.createDelegate(this));
        this.getPrevControl().mouseout(this.onPrevButtonMouseUp.createDelegate(this));
    },

    onShowBioClick: function(index, source) {
        if (!player._disableButtons && index != player._currentBioIndex) {
            $("#pages td.cur").attr("class", "");
            $(source.parentNode.parentNode).attr("class", "cur");
            if ($("#bio" + index).length == 0) {
                player.addBio(player._bios[index], 2, false, true);
            }
            player._timeoutValue = window.clearTimeout(player._timeoutValue);
            player.hideCurrentBio(true);
            player._currentBioIndex = index - 1;
            player._currentPhotoIndex = 0;
        }
    },

    onNextButtonClick: function() {
        if (this._currentPage < this._pagesCount - 1) {
            this._currentPage++;
            this.goToPage(this._currentPage)
        }
    },

    onPrevButtonClick: function() {
        if (this._currentPage > 0) {
            this._currentPage--;
            this.goToPage(this._currentPage)
        }
    },

    onNextButtonMouseDown: function() {
    this.getNextControl().attr("class", "next_active");
},

onPrevButtonMouseDown: function() {
    this.getPrevControl().attr("class", "prev_active");
},
    
    onNextButtonMouseUp: function() {
        this.getNextControl().attr("class", "next");
    },

    onPrevButtonMouseUp: function() {
        this.getPrevControl().attr("class", "prev");
    },

    goToPage: function(page) {
        $("#gallery").stop().scrollTo($("#page" + page), 700);
        this.setButtonsSettings(page);
    },

    setButtonsSettings: function(page) {
        if (page == 0) {
            this.getPrevControl().hide();
        }
        else {
            this.getPrevControl().show();
        }
        if (page == this._pagesCount - 1) {
            this.getNextControl().hide();
        }
        else {
            this.getNextControl().show();
        }
    },

    getNextControl: function() {
        return $('#' + this._nextButtonId);
    },
    getPrevControl: function() {
        return $('#' + this._prevButtonId);
    }
};