function br(id, data, callback, callbackChangeImage) {

	var parent = this;

	this.id = id;
    this.callbackChangeImage = callbackChangeImage;
	this.images = data.images;
	this.config = data.config;
	this.pos = 0;
	this.upos = 0;
    this.milisec = 0;

    this.setBanner = function(callback) {

        if(!this.images.length)
            return;

		this.total = this.images.length;

		if(this.config.modal) {
			var id = parseInt(Math.random()*1000, 10);
			this.div = $('<div/>', {id: 'banner'+id, 'class': this.config.classe?this.config.classe:'banner'}).appendTo('body');
			this.id = 'banner'+id;
		}
		else if(this.id) {
        	this.div = $('#'+this.id);
			$(this.div).html('');
		}
		else
			return;

		this.parent = $(this.div).parent();

		if(this.config.legenda) {
			this.legenda = $('<div/>', {'class': 'legenda'}).appendTo(this.div)
			.append($('<h3/>')).append($('<p/>'));
		}

		if(this.config.status) {
			this.status = $('<div/>', {'class': 'status'}).appendTo(this.div)
			.append($('<p/>'));
		}

		if(this.config.controle) {
		    this.controle = $('<div/>', {'class': 'controle'}).css({opacity: 0}).appendTo(this.div);
		}

		if(this.config.painel) {
		    this.painel = $('<div/>', {'class': 'painel'}).css({opacity: 0}).appendTo(this.div);
			this.play_pause = $('<div/>').html('=>').click(function(){
				parent.setPS('auto');
				if(!parent.getPS())
					$(this).removeClass('pause').addClass('play');
				else
					$(this).removeClass('play').addClass('pause');
			});
			if(this.config.autostart)
				$(this.play_pause).addClass('pause');
			else
				$(this.play_pause).addClass('play');
			this.voltar = $('<div/>', {'class': 'voltar'}).html('<').click(function(){
				parent.setImage('<');
			});
			this.avancar = $('<div/>', {'class': 'avancar'}).html('>').click(function(){
				parent.setImage('>');
			});
			$(this.painel).append(this.play_pause, this.voltar, this.avancar);
		}

        var key;
        for(key in this.images){

            var a = $('<a/>', {
                href: this.images[key].link,
                target: this.images[key].target,
				title: this.images[key].titulo
            }).css({width: $(this.div).width(), height: $(this.div).height()}).appendTo(this.div)
			.mousedown(function(){
				if(parent.images[key].click)
					parent.images[key].click(this);
			});
            if(!this.images[key].link)
                $(a).removeAttr('href');

			// SETANDO PARA EFEITOS

			switch(this.config.efeito) {
				case 'trans':
				default:
					$(a).css({opacity: 0, display: 'none'});
					break;
				case 'carousel':
					$(a).css({left: key*$(this.div).width()});
					break;
			}

            $('<img/>', {
                src: this.images[key].url,
				alt: this.images[key].titulo
            }).appendTo(a);

            var img = $('<img/>', {
                src: this.images[key].murl,
				alt: this.images[key].titulo
            }).css({opacity: 0.5}).appendTo(this.controle);

        }

		function controleDimensao(){
			var total_largura = 0;
			var total_altura = 0;
			var maxima_largura = 0;
			var maxima_altura = 0;
			$('img', parent.controle).each(function(i){
				total_largura += $(this).outerWidth();
				total_altura += $(this).outerHeight();
				maxima_largura = maxima_largura<$(this).outerWidth()?$(this).outerWidth():maxima_largura;
				maxima_altura = maxima_altura<$(this).outerHeight()?$(this).outerHeight():maxima_altura;
			});
			if(parent.config.controle_pos == 'x') {
				if(total_largura < $(parent.div).width())
					total_largura = $(parent.div).width();
				$(parent.controle).css({width: total_largura, height: maxima_altura});
			} else if(parent.config.controle_pos == 'y') {
				if(total_altura < $(parent.div).height())
					total_altura = $(parent.div).height();
				$(parent.controle).css({height: total_altura, width: maxima_largura});
			}
		}

		setInterval(function(){
			controleDimensao();
		}, 300);

        $(this.div).mousemove(function(e){

			var clargura = $(parent.controle).outerWidth();
			var dlargura = $(parent.div).outerWidth();
			if(dlargura <= clargura) {
				var posX = e.pageX-$(parent.controle).offset().left;
				var largura = -((clargura-dlargura)/clargura)*posX;
				$(parent.controle).css({left: largura});
			}

			var caltura = $(parent.controle).outerHeight();
			var daltura = $(parent.div).outerHeight();
			if(daltura <= caltura) {
				var posY = e.pageY-$(parent.controle).offset().top;
				var altura = -((caltura-daltura)/caltura)*posY;
				$(parent.controle).css({top: altura});
			}

		});

        $(this.div).append(this.legenda, this.status, this.controle, this.painel);

		if(this.controle)
		    $('img', this.controle).each(function(i){
		        $(this).click(function(){
		            parent.setImage(i);
					if(parent.intervalo)
						 parent.setPS(true);
		    	});
		    });

        $(this.div).hover(function(){
            $(parent.controle).stop().animate({opacity: 1}, 500, 'swing');
            $(parent.painel).stop().animate({opacity: 1}, 500, 'swing');
        }, function(){
            $(parent.controle).stop().animate({opacity: 0}, 500, 'swing');
			$(parent.painel).stop().animate({opacity: 0}, 500, 'swing');
        });

        if(this.controle) {
            $('img', this.controle).hover(function(){
                if($(this).filter(':not(.selected)').length)
                    $(this).stop().animate({opacity: 1.0}, 250, 'linear');
            }, function(){
                if($(this).filter(':not(.selected)').length)
                    $(this).stop().animate({opacity: 0.5}, 250, 'linear');
            });
        }

        $('*', this.div).click(function(event){
            event.stopPropagation();
        });

        $(document).keyup(function(e){
            if(e.keyCode == 37)
                parent.setImage('<');
            else if(e.keyCode == 39)
                parent.setImage('>');
            else if(e.keyCode == 27)
                parent.setModal(false);
        });

        $(window).resize(function(){
            if(parent.config.modal == true && parent.config.alinhar_modal > 0)
                parent.centerAlign(parent.div, parent.config.alinhar_modal, true, true);
        });

		if(callback)
			callback(this.div);

		//return this;

    }

    this.centerAlign = function(sel, time, esquerda, topo) {

        if(esquerda)
            var left = $('.fullbg').outerWidth()/2-parseInt($(sel).outerWidth())/2;
        if(topo)
            var top = $('.fullbg').outerHeight()/2-parseInt($(sel).outerHeight())/2;

        left = left>=0?left:0;
        top = top>=0?top:0;

        $(sel).css({position: 'absolute'});

        if($(sel).css('margin') == '' || $(sel).css('margin') == 'auto')
            $(sel).css({'top': top, 'left': left, margin: '0'});
        else
            $(sel).stop().animate({'top': top, 'left': left}, time);

    }

    this.setImage = function(i, callback) {

        var data = new Date();
        var milis = Number(data);
        if(milis-this.config.tempo_efeito < this.milisec)
            return false;
        this.milisec = milis;

		if(this.intervalo)
			this.setPS(true);

		if(i == '>')
			if(this.pos+1 > this.total-1)
				this.pos = 0;
			else
				this.pos++;
		else if(i == '<')
			if(this.pos-1 < 0)
				this.pos = this.total-1;
			else
				this.pos--;
		else if(i != '<' && i != '>' && parseInt(i, 10) >= 0)
			this.pos = parseInt(i, 10);
		else
			this.pos = 0;

         if(this.pos < 0)
            this.pos = 0;
		else if(this.pos > this.total-1)
			this.pos = this.total-1;

        var as = $('a', this.div);

		setTimeout(function(){
			if(parent.controle)
				$('img', parent.controle).removeClass('selected').css({opacity: 0.5}).eq(parent.pos).addClass('selected').css({opacity: 1});
			if(parent.status)
				$('p', parent.status).html('<b>'+(parent.pos+1)+'</b> de <b>'+parent.total+'</b> imagens.');
		}, parseInt(parent.config.tempo_efeito/2, 10));

		// EFEITOS

		switch(this.config.efeito) {

			case 'trans':
			default:

				if(this.legenda)
					$(this.legenda).animate({height: 'hide'}, parseInt(this.config.tempo_efeito/2, 10), 'swing', function(){
						$('h3', parent.legenda).text(parent.images[parent.pos].titulo);
						$('p', parent.legenda).text(parent.images[parent.pos].resumo);
						$(this).animate({height: 'show'}, parseInt(parent.config.tempo_efeito/2, 10), 'swing');
					});

				$(as).filter(':visible').stop().animate({opacity: 0}, this.config.tempo_efeito, this.config.easing, function(){
				    $(this).css({display: 'none'});
				});
				$(as).filter(':eq('+this.pos+')').stop().css({display: 'block', opacity: 0}).animate({opacity: 1}, this.config.tempo_efeito, this.config.easing, function(){
					if(callback)
						callback(this, parent.pos, parent.images[parent.pos].titulo, parent.images[parent.pos].resumo);
                    if(parent.callbackChangeImage)
                        parent.callbackChangeImage(this, parent.pos, parent.images[parent.pos].titulo, parent.images[parent.pos].resumo);
				});

				break;

			case 'carousel':

				if(this.legenda)
					$(this.legenda).animate({opacity: 0}, parseInt(this.config.tempo_efeito/2, 10), 'linear', function(){
						$('h3', parent.legenda).text(parent.images[parent.pos].titulo);
						$('p', parent.legenda).text(parent.images[parent.pos].resumo);
						$(this).animate({opacity: 1}, parseInt(parent.config.tempo_efeito/2, 10), 'linear');
					});

				$(as).animate({left: '+='+((this.upos-this.pos)*$(this.div).width())}, this.config.tempo_efeito, this.config.easing, function(){
				    if(callback)
						callback($(this).get(parent.pos), parent.pos, parent.images[parent.pos].titulo, parent.images[parent.pos].resumo);
                    if(parent.callbackChangeImage)
                        parent.callbackChangeImage(this, parent.pos, parent.images[parent.pos].titulo, parent.images[parent.pos].resumo);
				});

				break;

		}

		this.upos = this.pos;

		return this;

    }

    this.setPlayer = function(){

        this.setPS(false);
        this.intervalo = setInterval(function(){
            if(parent.pos >= parent.images.length-1)
                parent.pos = 0;
            else
                parent.pos++;
			parent.setImage(parent.pos);
        }, this.config.tempo);

		return this;

    }

	this.setPS = function(opt){

		if(opt === true || (opt == 'auto' && !this.getPS()))
			this.setPlayer();
		else if(this.getPS() || opt == 'auto') {
			clearInterval(this.intervalo);
			this.intervalo = false;
		}

		return this;

	}

	this.getPS = function() {

		return this.intervalo?true:false;

	}

	this.getEnd = function() {

		return (this.pos >= this.total-1)?true:false;

	}

	this.getStart = function() {

		return (this.pos == 0)?true:false;

	}

	var antigo_mtop = $(this.div).css('margin-top');
	this.setModal = function(show) {

		if(show) {

			this.fechar = $('<div/>', {'class': 'fechar'}).appendTo(this.div).html('X').click(function(){
				parent.setModal(false);
			});

			this.fullbg = $('<div/>', {'class': 'fullbg'}).css({'z-index': 999999999})
			.height('100%').width('100%').append(this.div).appendTo('body')
            .click(function(){
                $(parent.fechar).click();
            })

			$(this.div).css({opacity: 0, 'margin-top': ($(this.fullbg).height()-$(this.div).height())/2})
			.animate({opacity: 1}, 1000, 'linear');

		}
		else {

			$(this.div).animate({opacity: 0}, 1000, 'linear', function(){
				$(parent.fechar).remove();
				$(parent.div).css({'margin-top': antigo_mtop, opacity: 1}).appendTo(parent.parent);
				$(parent.fullbg).remove();
				if(parent.config.modal)
					$(parent.div).remove();
			});

		}

		return this;

	}

    this.setBanner(callback);
	if(this.config.startimage >= 0)
		this.setImage(this.config.startimage);
	if(this.config.autostart)
		this.setPS(true);
	if(this.config.modal)
		this.setModal(true);

}
