function ProfileStructureView()
{ 

    var TAB_HOME 		= 0;
    var TAB_BOOKS 		= 1;
    var TAB_AUTHORS 	= 2;
    var TAB_FOLLOWERS 	= 3;
    var TAB_ABOUT 		= 4;
    var TAB_CONTACT 	= 5;

    this.prototype = BookessBase.call(this);
    this.requirement = ['jquery', 'jquery.history', 'jquery.autoclean', 'jquery.charcounter', 'jquery.pagination', 'jquery.qtip'];

    var self = this;

    this.totalNews = 0;
    this.newsCurrentPage = 1;
    this.showNewsPerPage = 3;
    this.newsMaxLength = 160;

    this.objectData = {};

    this.objectData[TAB_BOOKS] = {};
    this.objectData[TAB_BOOKS].total = null;
    this.objectData[TAB_BOOKS].currentPage = 0;
    this.objectData[TAB_BOOKS].perPage = 8;
    this.objectData[TAB_BOOKS].search = null;

    this.objectData[TAB_FOLLOWERS] = {};
    this.objectData[TAB_FOLLOWERS].total = null;
    this.objectData[TAB_FOLLOWERS].currentPage = 0;
    this.objectData[TAB_FOLLOWERS].perPage = 10;
    this.objectData[TAB_FOLLOWERS].search = null;

    this.objectData[TAB_AUTHORS] = {};
    this.objectData[TAB_AUTHORS].total = null;
    this.objectData[TAB_AUTHORS].currentPage = 0;
    this.objectData[TAB_AUTHORS].perPage = 5;
    this.objectData[TAB_AUTHORS].search = null;


    this.urlCalls =
    {
		'^#?(home|)$' : function(url, params)
        { 
    		self.changeTab(TAB_HOME);
        },	
    		
        '#books' : function(url, params)
        {            
        	var total = this.objectData[TAB_BOOKS].total;
        	
        	self.objectData[TAB_BOOKS].currentPage = params[0];
        	self.changeTab(TAB_BOOKS);
        	
        	if(total != null)
            {
            	self.requestObjects(params[0]);
            }
        },

        '#followers' : function(url, params)
        {
        	var total = this.objectData[TAB_AUTHORS].total;
        	
        	self.objectData[TAB_FOLLOWERS].currentPage = params[0];
        	self.changeTab(TAB_FOLLOWERS);
        	
        	if(total != null)
            {
            	self.requestObjects(params[0]);
            }
        },

        '#authors' : function(url, params)
        {
        	var total = this.objectData[TAB_AUTHORS].total;
        	
        	// só para paginação
        	if(params[0] && !params[1])
        	{
        		self.objectData[TAB_AUTHORS].currentPage = params[0];        		
        	}
        	// quando vai a um perfil diretamente
        	else if(params[1])
        	{
        		self.objectData[TAB_AUTHORS].currentPage = 0;
        		self.objectData[TAB_AUTHORS].search = params[0];
        	}
        	
        	self.changeTab(TAB_AUTHORS);
        	
        	if(total != null)
        	{        		
        		self.requestObjects();
        	}
        	
        	// coloca no campo de busca o nome do author
        	if(params[1])
        	{
        		//delete params[0];
        		//var name = params.join(" ").replace(/[^\sa-z0-9]/g, '').replace(/^\s+|\s+$/g, '');
        		//self.objectData[TAB_AUTHORS].search = name;
        		//$('#content-search').blur().val(name).focus();
        		
        		self.objectData[TAB_AUTHORS].search = null;
        	}
        	
        	
        },

        '#about' : function(url, params)
        {
        	self.changeTab(TAB_ABOUT);
        },
        
        '#contact' : function(url, params)
        {
        	self.changeTab(TAB_CONTACT);
        }
    };

    this.messages =
    {
        noMore: 'fim das mensagens',
        noNews: 'nenhuma mensagem',
        viewMore: '+ Ver mais',
        viewLess: '- Ver menos',
        noInfo: 'Não informado',
        follow: 'seguir esta editora',
        unfollow: 'deixar de seguir editora'
    };

    var $news = $('#publisher-news');
    var $search = $('#search-profile');
    var $pagination = $("#pager");
    var $contentHeader = $("#content-header");
   

    var currentTab = 0;

    this.DOMTemplates =
    {
        '#news-all':
         {
            '.news':
             {
                fields: ['id', 'message', 'date'],
                attributes:
                {
                    'message': {id: 'news-{id}'}
                }
             }
         },

         '#content-books':
         {
            '.publisher-book':
             {
                fields: ['id', 'title', 'author', 'authorProfile', 'cover', 'synopsis', 'views', 'favorites', 'rate', 'mediavotes', 'pages', 'date', 'link', 'url'],
                attributes:
                {
        	 		'author': {href: '{authorProfile}'},
                    'rate': {className: 'rating rate-{mediavotes}', alt: '{mediavotes}', title: '{mediavotes}'},
                    'title': {href: '{url}'},
                    'link': {href: '{url}'},
                    'cover': {src: '{cover}', alt: '{title}', title: '{title}'}
                }
             }
         },

         '#content-followers':
         {
            '.publisher-follower':
             {
                fields: ['id', 'name', 'date', 'photo', 'url'],
                attributes:
                {
                    photo: {src: '{photo}', alt: '{name}', title: '{name}'},
                    name: {href: '{url}'}
                }
             }
         },

         '#content-authors':
         {
            '.publisher-author':
             {
                fields: ['id', 'name',  'photo', 'birth', 'hometown', 'categories', 'categories', 'books', 'website', 'about'],
                defaults:
                {
                    website: this.messages.noInfo,
                    birth: this.messages.noInfo,
                    hometown: this.messages.noInfo,
                    categories: this.messages.noInfo,
                    about: this.messages.noInfo
                },
                attributes:
                {
                    photo: {src: '{photo}', alt: '{name}', title: '{name}'},
                    name: {href: '{url}'},
                    website: {href: '{website}'}
                }
             }
         }
    };

    this.init = function()
    {
        this.saveTemplates();

        var $newsinput = $('#newscontent');

        $newsinput
        .charCounter(self.newsMaxLength, {container: "#addnews-charcounter"})
        .autoclean
        ({
            onFocus: function()
            {
                $(this).trigger('keydown');
                $('.addnews .buttons').show();
            }
          //  onBlur : function(){ $('.addnews .buttons').hide(); }
        });
        
        $('.services .service[title]', $news).qtip(
        {
            position:
            {
                corner:
                {
                    target: 'topRight',
                    tooltip: 'bottomLeft'
                }
            },

            style:
            {
                 name: 'cream',
                 padding: '7px 13px',
                 border: {radius: 5, width: 2},
                 tip: true
            }
        })
        .mousedown(function()
		{
        	var className = $(this).attr('class');
        	
        	if(/-checked/i.test(className))
        	{
        		className = className.replace(/checked/, 'unchecked');
        	}
        	else
        	{        		
        		className = className.replace(/unchecked/, 'checked');
        	}

        	$(this).attr('class', className);        	
		});
        

        $('#content-search').keydown(function(e)
        {
            // on enter
            if(e.keyCode == 13)
            {
                self.search();
            }
        }).autoclean();

        $('#search-clear').click(this.clearSearch);
        $('#search-button').click(this.search);


        $('.more', $news).click(this.showMoreNews);
        $('.news-delete', $news).click(self.deleteNews);

        //$('.viewarea-tabs a').click(this.changeTab);

        $('#save-news').mousedown(this.saveNews);
        $('#newscontent').keydown(function(e)
        {
            // on enter
            if(e.keyCode == 13)
            {
                self.saveNews();
            }
        });
        
        $('#view-all-followers').click(function()
		{
        	$('#tab-followers').trigger('click');
		});
        
        $('.follow').click(this.onFollow);
        $('.unfollow').click(this.onUnfollow);
        
        $('#form-contact').submit(this.onSendContact);
        
        var catsHeight = $('.publisher-categories .sidebar-box-content').height();         
        $('#view-all-categories').click(function()
        {
        	var $button = $(this);
        	var $container = $('.sidebar-box-content', $(this).parent());
        	var $hiden = $('.hide', $container);
        	var $cats = $('.publisher-category', $container);
        	
        	if($hiden.length == 0)
        	{
        		return false;
        	}
        	
        	if($hiden.is(':visible'))
        	{
            	$container.css({overflow: 'hidden'});
            	
            	$container.animate({height: catsHeight}, function()
    			{
            		$hiden.hide();
            		$(this).css({overflow: 'auto', height: 'auto'});
            		$button.html(self.messages.viewMore);
    			});
        	}
        	else
        	{
        		$hiden.show();
            	
        		var cHeight = $container.height();
        		
            	$container.css({overflow: 'hidden', height: catsHeight});            	
            	var nHeight = cHeight > 300 ? 300 : cHeight;
            	
            	$container.animate({height: nHeight}, function()
    			{
            		$(this).css({overflow: 'auto'});
            		$button.html(self.messages.viewLess);
    			});
        	}
        	
        	return false;
        });
        
        $('.publisher-category a').click(function()
		{
        	var categorie = $(this).attr('title');
        	
        	if(self.objectData[TAB_BOOKS].search != categorie)
        	{
        		self.objectData[TAB_BOOKS].search = categorie;
        		
        		$('#content-search').focus().val(categorie);
        		
        		if(currentTab == TAB_BOOKS)
        		{
        			self.requestObjects(0);
        		}       
        		else
        		{
        			self.objectData[TAB_BOOKS].total = null;
        		}
        	}

        	return true;
		});
        

        self.checkHasMoreNews();        
        self.initUrlCalls();   
    };
        
    this.onFollow = function()
    {
    	var $button = $(this);
    	
    	$button.unbind()
    	.click(function(){ return false; })
    	.removeClass('follow')
    	.addClass('loading');

    	self.httpRequest(self.baseDir + 'follow/', {}, function(result)
    	{
    		$button.removeClass('loading').addClass('unfollow').html(self.messages.unfollow);    		
    		$button.click(self.onUnfollow);    		
    	});
    	
    	return false;
    };
    
    this.onUnfollow = function()
    {
    	var $button = $(this);
    	
    	$button.unbind()
    	.click(function(){ return false; })
    	.removeClass('unfollow')
    	.addClass('loading');

    	self.httpRequest(self.baseDir + 'unfollow/', {}, function(result)
    	{
    		$button.removeClass('loading').addClass('follow').html(self.messages.follow);       		
    		$button.click(self.onFollow);    		
    	});
    	
    	return false;
    };

    this.onSendContact = function()
    {
    	 var $content = $('.content:eq(' + currentTab + ')');
    	
    	$('.loading-contact', $content).show();
    	
    	var params = {};
    	
    	$('input, textarea', this).each(function()
		{
    		params[this.name] = this.value;
		});
    	
    	self.httpRequest(self.baseDir + 'contact/', params, function(result)
    	{
    		alert("Enviado!");
    		
    		$('.loading-contact', $content).hide();
    	});
    	
    	return false;
    };

    this.clearSearch = function()
    {
        $('#content-search').val('');
        self.objectData[currentTab].search = null;
        self.objectData[currentTab].currentPage = 0;
        self.search();
    };

    this.search = function(value)
    {
    	if(typeof(value) != 'string') value = null;
    	
        var value = value || $('#content-search').val();

        if(self.objectData[currentTab].search == value) return false;

        if(!value)
        {
        	$('#search-clear').attr('disabled', true);
        }
        
        window.location.href = '#books';
        
        self.objectData[currentTab].search = value;
        self.requestObjects(0);
    };


    this.changeTab = function(tab)
    {
        currentTab = typeof(tab) == 'number' ? tab : $('.viewarea-tabs a').index( this );
        var selected = $('.viewarea-tabs li').index( $('.viewarea-tabs .selected') );
        var $tab = $('.viewarea-tabs a:eq(' + currentTab + ')');

        if(currentTab == selected)
        {
        	return false;
        }
        
        var $contentView = $('.viewarea-content');
        var $content = $('.content:eq(' + currentTab + ')', $contentView);

        $('.viewarea-tabs li').removeClass('selected');
        $tab.parent().addClass('selected').css('position', 'relative');
        
        $('.content', $contentView).hide();
        $pagination.hide();

        switch(currentTab)
        {
        	case TAB_HOME:
            case TAB_ABOUT:
            case TAB_CONTACT:
                {
                	$contentHeader.hide();                  	
                	$content.show();
                    break;
                }

            case TAB_BOOKS:
            case TAB_FOLLOWERS:
            case TAB_AUTHORS:
                {         
                	var searchTerm = self.objectData[currentTab].search;
                	
                	document.getElementById('search-button').display = 'block';
                	
                	if(self.objectData[currentTab].total == null)
                	{
                		$('#content-search').val('').blur();
                		 self.requestObjects(self.objectData[currentTab].currentPage);
                	}
                	else
                	{
                		if(searchTerm)
                		{
                			$('#content-search').blur().val(searchTerm).focus();
                			$('#search-button, #search-clear').attr('disabled', false);  
                		} 
                		else
                		{
                			$('#content-search').val('').blur();
                			$('#search-button').attr('disabled', false); 
                			$('#search-clear').attr('disabled', true);  
                		}
                		
                		$content.show();
                	}
                	
                	$contentHeader.show();  
                    
                    break;
                }
        }
        
        return true;
    };

    this.requestObjects = function(page)
    {
    	var currentSaved = self.objectData[currentTab].currentPage;
    	page = page ? parseInt(page) : (currentSaved ? currentSaved : 0);
    	
    	var searchTerm = self.objectData[currentTab].search;
    	
        self.showLoading($contentHeader);

        var $content = $('.viewarea-content .content:eq(' + currentTab + ')').show();
        
        $('#content-search, #search-button, #search-clear').attr('disabled', true);        
        $('.search-noresults', $content).hide();
        
        var params = {rp: self.objectData[currentTab].perPage, page: page};

        if(searchTerm)
        {
            params.search = self.objectData[currentTab].search;
        }

        var data = [];
        var $elm = null;
        var p, t, link, url;

        switch(currentTab)
        {           
            case TAB_BOOKS:
                {
                    p = ['#content-books', '.publisher-book'];
                    t = self.DOMTemplates[p[0]][p[1]].fields;
                    url = self.baseDir + 'getBooks/';
                    link = '#books-__id__';

                    break;
                }

            case TAB_FOLLOWERS:
            {
                p = ['#content-followers', '.publisher-follower'];
                t = self.DOMTemplates[p[0]][p[1]].fields;
                url = self.baseDir + 'getFollowers/';
                link = '#followers-__id__';

                break;
            }

            case TAB_AUTHORS:
            {
                p = ['#content-authors', '.publisher-author'];
                t = self.DOMTemplates[p[0]][p[1]].fields;
                url = self.baseDir + 'getAuthors/';
                link = '#authors-__id__';

                break;
            }
        }

        self.httpRequest(url, params, function(result)
        {
            self.objectData[currentTab].total = result.total;

            if(result.total == 0)
            {
                $('.search-noresults', $content).show();
                
                // fix ie bug
                if($.browser.msie)
                {
                	$('div[className^=publisher]', $content).css('zoom', 1);
                }
                
                if(!searchTerm)
                {
                	$contentHeader.hide();
                }
            }
            else
            {            	
                self.objectData[currentTab].currentPage = page;

                if(result.total > self.objectData[currentTab].perPage)
                {
	                var pConfig = 
	                {
	                    items_per_page: self.objectData[currentTab].perPage,
	                    current_page: page > 0 ? page-1 : 0,
	                    link_to: link,
	                    callback: function(current_page)
	                    {
	                		if(current_page != self.objectData[currentTab].currentPage)
	                		{
	                			$('#content-header').setFocus();
	                		}
	                	
	                		return true;
	                    }
	                };
	                
	                $pagination.insertAfter( $content ).show();
	                $('div', $pagination).pagination(result.total, pConfig);
                }
                else
                {
                	$pagination.hide();
                }
                
                $(p[1], $content).remove();

                for(var id in result.data)
                {
                    data = result.data[id];
                    $elm = self.getNewObject.apply(self, self.formatArray(p, t, data));
                    $content.append($elm);
                }
            }

            self.hideLoading($contentHeader);
            $('#content-search, #search-button').attr('disabled', false);            
            if(searchTerm) $('#search-clear').attr('disabled', false);
            
            $('#content-search').blur().focus();

            $content.show();
            
        });

        return false;
    };







    /*
     * News
     */

    this.showLoading = function(elm)
    {
         for(var p=0; p<7; p++)
         {
             if(p%2 == 0)
             {
                 $('.loading', elm).fadeIn();
             }
             else
             {
                 $('.loading', elm).fadeOut();
             }
         }
    };

    this.addLoading = function(elm, pos)
    {
         var $icon = $('<span />').attr('className', 'icon-loading-small');
         
         if(!pos || pos == 'after')
         {
        	 $icon.appendTo(elm);
         }
         else
         {
        	 $icon.prependTo(elm);
         }
    };

    this.hideLoading = function(elm)
    {
        $('.loading', elm).stop(true, true).hide();
    };

    this.hasMoreNews = function()
    {
        return self.newsCurrentPage <= Math.ceil(self.totalNews/self.showNewsPerPage)-1;
    };

    this.parseId = function(id)
    {
        return parseInt(id.replace(/[^0-9]+/g, ''));
    };

    this.deleteNews = function()
    {
        var $button = $(this);
        var parentNews = $(this).parent();
        var id = parseInt($('.news-message', parentNews).attr('id').replace(/[^0-9]+/g, ''));

        $(this).html('').addClass('icon-loading-small');
        
        parentNews.fadeTo(0, 0.5);

        var data = {messageId: id, rp: self.showNewsPerPage, page: self.newsCurrentPage};

        self.httpRequest(self.baseDir + 'deleteNews/', data, function(result)
        {
            var $newsAll = $('#news-all');

            parentNews.remove();

            self.totalNews--;

            if(result)
            {
                self.addNews(result);
            }
            else if(self.totalNews > 0 && (self.totalNews%self.showNewsPerPage) == 0)
            {
                self.newsCurrentPage--;
            }

            $('.news:first', $newsAll).removeClass('first').addClass('first');

            self.checkHasMoreNews();
        });
        
        return false;
    };

    this.saveNews = function()
    { 
        var $newsContent = $('#newscontent', $news);
        var $button = $(this);

        $newsContent
        .addClass('loading');
        
        $('#newscontent, #save-news')
        .attr('disabled', true);

        var data = {message: $newsContent.val(), 'services[]': []};        
        
        $('.services .service', $news).each(function()
		{
        	var className = $(this).attr('class');
        	var matches = className.match(/service icon-service-([^-]+)-(un)?checked/i);
        	var service = matches[1];
        	var checked = !matches[2]; // matches[2] = "" quando selecionado e matches[2] = un -> quando não está selecionado
        	
        	if(checked)
        	{
        		data['services[]'].push(service);
        	}        	
		});

        self.httpRequest(self.baseDir + 'addnews/', data, function(result)
        {
            if(result)
            {
                var $newsAll = $('#news-all');
                var totalNews = $('.news', $newsAll).length;

                $('.news:first', $newsAll).removeClass('first');
                self.addNews(result, true);
                $('.news:first', $newsAll).addClass('first');
                 
                 self.totalNews++;

                 $('#newscontent, #save-news')
                 .attr('disabled', false);
                 
                 $('#save-news').focus();
                 
                 $newsContent
                 .val('') 
                 .focus()          
                 .removeClass('loading');
                 
                 
                 if(totalNews > 0 && (totalNews%self.showNewsPerPage) == 0)
                 {
                    $('.news:last', $newsAll).remove();
                 }
                 
                 self.checkHasMoreNews();
            }
        });

    };

    this.checkHasMoreNews = function()
    {
        var buttonDisabled = $('.more-disabled', $news);
        var buttonEnabled = $('.more', $news);

        if(!self.hasMoreNews())
        {
            if(buttonDisabled.length > 0)
            {
                buttonDisabled.show();
                buttonEnabled.hide();
            }
            else
            {
                buttonDisabled = $('<div />')
                .attr('className', 'more-disabled')
                .fadeTo(0, 0.8);

                buttonEnabled.hide();

                $(buttonDisabled).insertBefore(buttonEnabled);
            }

            buttonDisabled
            .html(self.totalNews == 0 ? self.messages.noNews : self.messages.noMore);

        }
        else
        {
            if(buttonDisabled.length > 0)
            {
                buttonDisabled.hide();
            }

            buttonEnabled.show();
        }


    };

    this.showMoreNews = function()
    {
        if(!self.hasMoreNews())
        {
            return false;
        }

        var button = this;
        var $clone = $(this).clone(true);

        var loading = $('<div />').attr('className', 'more-loading');
        $(this).replaceWith(loading);        

        var data = {rp: self.showNewsPerPage, page: ++self.newsCurrentPage};

        self.httpRequest(self.baseDir + 'getnews/', data, function(result)
        {
            self.addNews(result);

            $(loading).replaceWith($clone);

            self.checkHasMoreNews();          
        });

        return false;
    };

    this.addNews = function(result, before)
    {          
        var $elm;
        var data;

        var $newsAll = $('#news-all');

        for(var id in result.data)
        {           
            data = result.data[id];
            $elm = self.getNewObject('#news-all', '.news', data.id, data.message, data.date);

            $('.news-delete', $elm).click(self.deleteNews);

            if(before)
            {
                 $newsAll.prepend($elm);
            }
            else
            {
                 $newsAll.append($elm);
            }

        }
    };

}
