var Reader = function()
{
	var self = this;
	
	this.onReaderLoaded = function(page){};
	this.onAfterFlipPage = function(page){};
	this.onFlipPage = function(page){};
	this.onCloseAll = function(page){};
	this.onBeforeZoom = function(page){};
	this.onAfterZoom = function(page){};
	
	this.getReader = function() {
	     return window.frames['reader-iframe'].window.BookessReader.getReader();
	};
};

var BookessReader = new Reader();

function ReadView()
{ 
    this.prototype = BookessBase.call(this);
    this.requirement = ['jquery', 'bookess.services'];

    var self = this;
    this.urlCalls = {};
    this.urlRemoveComment = null;
    this.baseDir = null;
    this.bookUrl = null;
    this.embedUrl = null;
    this.bookId = 0;
    this.commentsLimit = null;
    this.lastCommentId = null;
    this.isAdultContent = false;
    
    this.readersListType = '';

    this.readerInitialized = false;
    this.readersPerPage = 10;
    this.totalReaders = 0;
    
    this.lastReviewId = null;
    this.reviewsLimit = 0;
   
    this.lastPage = -1;
    this.readerInterval = 0;
    
    this.messages =
    {
    	signupButton: 'Criar Minha Conta',
		signup: 'Cadastre-se gratuitamente em menos de 1 minuto!',
		error: 'Desculpe, ocorreram problemas ao inserir sua atualização.<br /> Por favor, atualize a página e tente novamente.'
    };
    
    this.DOMTemplates =
    {
        '#comments':
         {
            '.comment':
             {
                fields: ['id', 'text', 'date', 'rate', 'user', 'userUrl', 'userPhoto', 'removeLink', 'photoLink', 'remove', 'ratebox'],
                attributes:
                {
    				photoLink: {href: '{userUrl}'},
    				userPhoto: {src: '{userPhoto}', title: '{user}', alt: '{user}'},
    				user: {href: '{userUrl}'},
    				ratebox: {className: 'ratebox-{rate}'},
    				remove: {href: '{removeLink}{id}/'}
                }
             }
         },
         '#reviews':
         {
            '.review':
             {
                fields: ['id', 'text', 'date', 'user', 'userUrl', 'userPhoto', 'photoLink', 'del'],
                attributes:
                {
                	id: {id: 'review-{id}'},
    				photoLink: {href: '{userUrl}'},
    				userPhoto: {src: '{userPhoto}', title: '{user}', alt: '{user}'},
    				user: {href: '{userUrl}'}
                }
             }
         },
         '#readers':
         {
            '.reader':
             {
                fields: ['id', 'firstName', 'name', 'profile', 'photo', 'profileLink'],
                attributes:
                {
                	profileLink: {href: '{profile}'},
    				photo: {src: '{photo}', title: '{name}', alt: '{name}'},
    				firstName: {href: '{profile}'}
                }
             }
         }
    };
    
    this.closeReader = function(event)
    {
    	$('#reader-window').hide();
		//$('#sidebar .updates').show();
		//$('#sidebar').removeClass('reader-sidebar');
    	$('body').css('overflow', 'auto');
    	$(document).unbind('keyup', self.closeReader);
    	
    	return false;
    };
    
    this.onBeforeZoomReader = function()
    {
    	$('#sidebar').hide();
    	$('#reader-container').addClass('reader-container-expanded');
    };
    
    this.onAfterZoomReader = function()
    {
    	$('#reader-container').removeClass('reader-container-expanded');
    	$('#sidebar').show();
    };
    
    this.onAfterFlipPage = function(page)
    {
    	self.lastPage = page;
    };
    
    this.onReaderLoaded = function(page)
    {
    	if(self.lastPage > -1)
    	{
    		BookessReader.getReader().goTo(self.lastPage);
    	}
    };
    
    this.init = function()
    {
    	BookessReader.onReaderLoaded = self.onReaderLoaded;
    	BookessReader.onAfterFlipPage = self.onAfterFlipPage;
    	BookessReader.onCloseAll = self.closeReader;
    	BookessReader.onBeforeZoom = self.onBeforeZoomReader;
    	BookessReader.onAfterZoom = self.onAfterZoomReader;
    	
    	this.saveTemplates();
    	
    	$('.buy-title').click(function() {
    		$('#buy-submit').parent().submit();
    	});
    	
    	var $readerBar = $('#reader-bar');
    	var $reader = $('#reader');
    	
    	$('#reader-overlay').fadeTo(0, 0.9);
    	
    	// Comments
    	$('.input-comment, #readers-search').autoclean();
    	
    	$('.specifications').toggle(
    	function()
    	{
    		$('.specifications-list', $(this).parent()).fadeIn();
    	},
    	function()
    	{
    		$('.specifications-list', $(this).parent()).fadeOut();
    	});
    	
    	$('#reader-revision-info .icon-close-blue').click(function()
    	{
    		$(this).parent().fadeOut();
    	});
    	
    	// Efeito page-curl
    	$('#lookinside').click(self.openReader);
    	$('.cover-big').unbind().each(function()
		{
    		$('a:first', this).click(self.openReader);
    		
			$(this).css('position', 'relative');
			
			var $curl = $('.book-curl', this);
			var $img = $('<img />').css({position: 'absolute', bottom:0, right: 0, width: '40%', height: '40%'});
			var timeout = null;
			var animation = function()
			{
				if(timeout)
					clearTimeout(timeout);
				
				$img.animate({width: "100%", height: "100%"}, 500, function()
				{
					timeout = setTimeout(function(){
						$img.animate({width: "40%", height: "40%"}, 500, animation);
						timeout = null;
					}, 5000);
				});
			};
			
			$img
			.appendTo($curl)
			.load(animation)
			.attr('src', self.baseDir + 'images/cover-curl-medium-bottom.png');
			
			$(this).mouseenter(function(){
				if(timeout)	clearTimeout(timeout);		
				$img.stop();
				$img.animate({width: "40%", height: "40%"}, 100, animation);
			});
			
			$curl.css('background-image', 'none').show();
		});			
    	
    	
    	$('#embed').click(function()
    	{
    		this.focus();
    		this.select();
    	});
    	
    	$('.book-stamp-disabled').mouseenter(function() 
		{
    		var $button = $(this);
    		var $parent = $(this).parent();
    		$button.removeClass('book-stamp-disabled').addClass('book-stamp');
			$parent.removeClass('book-stamp-box-closed');
			
			$parent.mouseleave(function()
			{
				$button.removeClass('book-stamp').addClass('book-stamp-disabled');
				$parent.addClass('book-stamp-box-closed');
			});
		}).click(function(){ return false; });
    	
    	var $checkboxes = $('input[type=checkbox]', $('.book-stamp-disabled').parent());
    	$checkboxes.click(function() {
    		if($(this).is(':checked')) {
    			$('label', $(this).parent()).addClass('checked');
    		} else {
    			$('label', $(this).parent()).removeClass('checked');
    		}
    		var checked = 0;
    		$checkboxes.each(function() {
    			if($(this).attr('name') != 'distribution' && $(this).is(':checked'))
    				checked++;
    		});
    		
    		$('#stamp-submit').attr('disabled', !(checked == $checkboxes.length-1));
    	});
    	
    	$('#stamp-submit').click(function() {
    		$(this).attr('disabled', true);
    		$('#stamp-loading').show();
		    $.ajax(
		    {
		        type: 'POST',
		        dataType: 'json',
		        url: self.bookUrl + 'requestStamp',
		        data: {distribution: $('#stamp-distribution').is(':checked')},
		        success: function(response) {
		        	if(response.success) {
		        		$('.book-stamp-disabled, .book-stamp').unbind()
		        		.removeClass('book-stamp-disabled')
		        		.addClass('book-stamp-pending')
		        		.attr({title: 'Em Avaliação', href:'#'})
		        		.parent()
		        		.addClass('book-stamp-box-closed');
		        		
		        		showMessage('Pedido de avaliação enviado!<br />Obrigado.', 'success', 8000);
		        	} else {
		        		showMessage(response.error, 'error', 8000);
		        		$('#stamp-loading').hide();
		        	}
		        }
		    });
    	});
    	
    };
    
    this.openReader = function()
	{
		//$(window).scrollTop(0);
		$('body').css('overflow', 'hidden');
		$('#reader-window').show();
		//$('#sidebar .updates').hide();
		//$('#sidebar').addClass('reader-sidebar');
		
		if(self.readerInitialized == false)
		{
			var $iframe = $('<iframe />').attr(
			{
				width: '100%',
				height: '100%',
				border: 0,
				frameborder: 'no',
				name: 'reader-iframe',
				id: 'reader-iframe',
				allowTransparency: 'true',
				scrolling: 'no',
				src: self.embedUrl
				
			});
			
			$('#reader').append($iframe);
			
			self.readerInitialized = true;
		}
		
		return false;
	};
    
/*
 * Index
 */
    this.viewIndex = function()
    {
    	var $comments 		= $('#comments');
    	var $addComment 	= $('#add-comment');
    	var commentsLimit 	= self.commentsLimit;
    	var $textComment = $('#comment-text');
    	var defaultValue = $textComment.text();
    	
    	
    	if(this.isAdultContent)
		{
    		$.blockUI(
			{
			    message: $('#adultContent'),
			    showScroll: true,

			    css:
			    {
			       border:0,
			       cursor: 'default'

			    },

			    overlayCSS:
			    {
			        backgroundColor: '#ffffff',
			        cursor: 'default',
			        opacity: 0.9
			    }
			});

			$('#acceptAdultContent').click(function()
			{
			    $.unblockUI();

			    $.ajax(
			    {
			        type: 'POST',
			        dataType: 'json',
			        data :
			        {
			            bookId : self.bookId
			        },
			        url: self.bookUrl + 'acceptadultcontent'
			    });

			    return false;
			});
		}
    	
    	var instance, removeComment = function()
        {
        	var $container = $(this).parent().parent();
        	
    		$.ajax(
    	    {
    	        type: 		'POST',
    	        dataType: 	'json',
    	        url:		$(this).attr('href'),
    	        success: function(data)
    	        {
    	        	if(data.success)
    	        	{
    	        		instance.current--;
    	        		
    	        		var $total = $('#more-comments .count span');
    	        		$total.text(parseInt($total.text()) - 1);

    	        		if(instance.current == 0)
    	        			$('#nocomments').fadeIn();
    	        		
    	        		$container.fadeOut(function(){$(this).remove(); });
    	        	}
    	        	else
    	        		showMessage(self.messages.error, 'error', 8000);
    	        },
    	        error: function(){
    	        	showMessage(self.messages.error, 'error', 8000);
    	        }
    	    });
    		
    		return false;
        };

    	instance = $('#more-comments').simplePagination(
    	{
    		loadingClass: 'viewmore-loading',
    		perPage: commentsLimit,
    		requestUrl: self.bookUrl + 'list_comments/',
    		totalField: 'totalComments',
    		dataListIndex: 'comments',
    		onSuccess: function(data)
    		{
    			for(i=0; i<data.comments.length; i++)
    			{
					var c = data.comments[i];

					var $comment = self.getNewObject('#comments', '.comment', c.id, c.text, c.date, c.rate, c.userName, c.userUrl, c.userPhoto, self.urlRemoveComment).hide();
					
					if(typeof(c['delete']) == 'undefined')
						$('.delete', $comment).hide();
					else
						$('.comment-remove', $comment).click(removeComment);
					
					$comment.appendTo($comments).fadeIn();
					
					c = null;
				}
	        },
	        
	        onError: function(){
	        	showMessage('Problemas ao contactar o servidor.', 'error', 8000);
	        }
    	});
    	
    	instance.doRequest();

    	$textComment.keydown(function(event)
    	{
    		if(event.keyCode == 13)
    			$('#send-comment').trigger('click');
    	});

    	$('#send-comment').click(function()
    	{
    		var content = $.trim($textComment.val());

    		if(content == '' || content == defaultValue){
    			return false;
    		}
    		
    		$textComment.blur();
    		$('input', $addComment).attr('disabled', true);
    		$('.post-network', $addComment).fadeTo(0, 0.5);
    		$('.icon-loading-small', $addComment).fadeIn();
    		
    		var data = {'services[]': []};
    		$('.network-checkbox').each(function() { if(this.checked) data['services[]'].push(this.name); });
    		data.comment = $('#comment-text').val();

    		$.ajax(
    	    {
    	        type: 		'POST',
    	        dataType: 	'json',
    	        url: 		self.bookUrl + 'send_comment/',
    	        crossDomain: true,
    	        data: data,

    	        success: function(data)
    	        {
    	        	if(data.success)
    	        	{
    	        		instance.current++;
    	        		var $comment = self.getNewObject('#comments', '.comment', data.id, data.text, data.date, data.rate, data.userName, data.userUrl, data.userPhoto, self.urlRemoveComment);
    	        		
    	        		if(typeof(data['delete']) == 'undefined')
    						$('.delete', $comment).hide();
    					else
    						$('.comment-remove', $comment).click(removeComment);
    	        		
    	        		var $total = $('#more-comments .count span');
    	        		$total.text(parseInt($total.text()) + 1);
    	        		
    	        		$comment.hide().prependTo($comments).fadeIn();
    	        	}
    	        	else
    	        	{
    	        		showMessage('Problemas ao inserir seu comentário.<br /> Por favor, atualize a página.', 'error', 8000);
    	        	}
    	        },
    	        error: function(){
    	        	showMessage('Problemas ao inserir seu comentário.<br />Por favor, atualize a página.', 'error', 8000);
    	        },
    	        
    	        complete: function(jqXHR, textStatus) {
    	        	if($('#nocomments').is(':visible')){
    	        		$('#nocomments').fadeOut();
    	        	}
    				
    	        	$('input', $addComment).attr('disabled', false);
    	        	$('.icon-loading-small', $addComment).fadeOut();
    	        	$textComment.val('').focus();
    	        	$('.post-network', $addComment).fadeTo(0, 1);
    	        }
    	    });
    	});
    };
    
    /*
     * Readers
     */
    this.viewReaders = function()
    {
    	var $readers	= $('#readers');
    	var restart = false;
    	var changed = false;
    	var search			= '';
    	var pagination;
    	
    	$('#search-filter-list a').click(function(evt)
    	{
    		var $radio = $('.radio', this);
    		
    		if($radio.hasClass('icon-radio-checked'))
    		{
    			if($(this).parent().hasClass('selectall'))
    			{
    				$('.text', this).text('Marcar todos');
    				
    				$('#search-filter-list .radio').each(function()
    				{
    					$('input', $(this).parents('li')).attr('checked', false);
    					$(this).removeClass('icon-radio-checked').addClass('icon-radio-unchecked');
    				});
    			}
    			else
    			{
    				$('input', $(this).parents('li')).attr('checked', false);
    				$radio.removeClass('icon-radio-checked').addClass('icon-radio-unchecked');
    			}
    			
    			changed = true;
    		}
    		else
    		{
    			if($(this).parent().hasClass('selectall'))
    			{
    				$('.text', this).text('Desmarcar todos');
    				
    				$('#search-filter-list .radio').each(function()
    				{
    					$('input', $(this).parents('li')).attr('checked', true);
    					$(this).removeClass('icon-radio-unchecked').addClass('icon-radio-checked');
    				});
    			}
    			else
    			{
    				$('input', $(this).parents('li')).attr('checked', true);
    				$radio.removeClass('icon-radio-unchecked').addClass('icon-radio-checked');
    			}
    			
    			changed = true;
    		}
    		
    		return false;
    	});
    	
    	$('#search-filter-list').click(function(evt)
    	{
    		evt.stopPropagation();
    		return false;
    	});
    	
    	$('#search-filter').click(function()
    	{
    		if($('#search-filter-list').is(':visible'))
    		{
    			$(document).trigger('click');
    			return false;
    		}
    	
    		$(this).addClass('search-filter-selected');
    		
    		$(document).one('click', function()
    		{
    			if(changed)
    			{
    				pagination(0);
    				changed = false;
    			}
    			
    			$('#search-filter').removeClass('search-filter-selected');
    			$('#search-filter-list').hide();
    		});
    		
    		$('#search-filter-list').show();
    		
    		return false;
    	});
    	
    	var changed		= false;

    	pagination = function(page)
    	{
    		if(restart == 'finished')
    		{
    			restart = false;
    			return;
    		}
    		
    		$('#reader-loading').show();

    		page += 1;

    		var data = {
	        	page: 	page,
	        	search: search
	        };
    		
    		$('#search-filter-list input').each(function()
    		{
    			if(this.checked)
    				data[this.name] = this.value;
    		});

    		$.ajax(
    		{
    			type: 		'POST',
    	        dataType: 	'json',
    	        url: 		self.bookUrl + 'list_readers/',
    	        data : data,

    	        success: function(data)
    	        {
    	        	$('.reader').fadeIn(function(){ $(this).remove(); });

    	        	if(restart)
    	        	{
    	        		restart = 'finished';

    	        		$(".pagination:first").pagination(data.records, {
    	        	        items_per_page: self.readersPerPage,
    	        	        callback: pagination,
    	        	        next_text: 'Próximo',
    	        	        prev_text: 'Anterior'
    	        		});
    	        	}

    	        	if(data.records == 0)
    	        	{
    	        		$('#readers .nodata').fadeIn();
    	        	}
    	        	else
    	        	{
    	        		$('#readers .nodata').hide();
    	        		
    	        		for(i=0; i<data.readers.length; i++){
    						var r = data.readers[i];

    						var $element = self.getNewObject('#readers', '.reader', r.id, r.firstName, r.name, r.profile, r.photo).hide();
    						
    						if($('.reader', $readers).length%5 == 0)
    						{
    							$('<div />').addClass('clear').appendTo($readers);
    						}
    						
    						$element.appendTo($readers).fadeIn();

    						for(var l in r.list){
    							$('.icon-' + r.list[l].icon, $element).show();	
    						}

    						r = null;
    					}
    	        	}
    	        },

    	        error: function(){
    	        	showMessage('Problemas ao contactar o servidor.', 'error', 8000);
    	        },
    	        
    	        complete: function()
    	        {
    	        	$('#reader-loading').hide();
    	        }
    		});

    		return false;
    	};
    	
    	$(".pagination:first").pagination(self.totalReaders, {
            items_per_page: self.readersPerPage,
            callback: pagination,
            next_text: 'Próximo',
            prev_text: 'Anterior'
    	});
    	
    	$('#clear-search').click(function()
    	{
    		$('#search-title').fadeOut();
    		$('#readers-search').val('');
    		search = '';
    		restart = true;
    		pagination(0);

    		return false;
    	});
    	
    	$('#readers-search').keydown(function(event)
    	{
    		if(event.keyCode == 13)
    		{
    			search = $(this).val();
    			restart = true;
   				pagination(0);

    			return false;
    		}
    	});
    };
    
    /*
     * Reviews
     */
    this.viewReviews = function()
    {
    	var $textReview = $('#text-review');
    	$textReview.charCounter(2000);
    	var defaultValue = $textReview.text();

    	var $reviews		=	$('#reviews');
    	var lastReviewId	=	this.lastReviewId;
    	var $addReview		=	$('#add-review');
    	var reviewsLimit	= 	this.reviewsLimit;
    	var reviewsCount 	= 	$('.review:visible', $reviews).length ? $('.review:visible', $reviews).length-1 : 0;
    	
    	var instance = $('#more-reviews').simplePagination(
    	{
    		loadingClass: 'viewmore-loading',
    		perPage: reviewsLimit,
    		requestUrl: self.bookUrl + 'list_reviews/',
    		totalField: 'totalReviews',
    		dataListIndex: 'reviews',
    		onSuccess: function(data)
    		{
	        	if(data.reviews && data.reviews.length > 0)
	        	{
    				for(i=0; i<data.reviews.length; i++)
    				{
    					var r = data.reviews[i];

    					self.getNewObject('#reviews', '.review', r.id, r.text, r.date, r.userName, r.userUrl, r.userPhoto)
    					.hide().appendTo($reviews).fadeIn();
    				}
	        	}
	        },
	        
	        onError: function(){
	        	showMessage('Problemas ao contactar o servidor.', 'error', 8000);
	        }
    	});
    	
    	instance.doRequest();

    	$('#send-review').click(function()
    	{
    		var content = $.trim($textReview.val());

    		if(content == '' || content == defaultValue){
    			return false;
    		}

    		$textReview.blur().attr('disabled', true);
    		$('input', $addReview).attr('disabled', true);
    		$('.icon-loading-small', $addReview).fadeIn();

    		$.ajax(
    	    {
    	        type: 		'POST',
    	        dataType: 	'json',
    	        url: 		self.bookUrl + 'send_review/',
    	        crossDomain: true,
    	        data :{
    	        	review: content
    	        },

    	        success: function(data)
    	        {
    	        	if(data.success)
    	        	{
    	        		instance.current++;
    	        		var $elm = self.getNewObject('#reviews', '.review', data.id, data.text, data.date, data.userName, data.userUrl, data.userPhoto, data.photo, data.photoImg);
    	        		$elm.hide().prependTo($reviews).fadeIn();
    	        		$('.nodata', $reviews).hide();
    	        		$('#tab-reviews .count').text(data.total);
    	        	}
    	        	else
    	        	{
    	        		showMessage('Problemas com inserir sua resenha.<br /> Por favor, atualize a página.', 'error', 8000);
    	        	}
    	        },
    	        error: function(){
    	        	showMessage('Problemas com inserir sua resenha.<br />Por favor, atualize a página.', 'error', 8000);
    	        },
    	        
    	        complete: function(jqXHR, textStatus)
    	        {
    	        	$('.icon-loading-small', $addReview).fadeOut();
    	    		$('input', $addReview).attr('disabled', false);
    	        	$textReview.attr('disabled', false).val('').focus();
    	        }
    	    });
    	});
    };
    	
}
