(function ($) {
	
	$.pressList = function (options) {
		return $.pressList.impl.init(options);
	};
	
	$.fn.pressList = function (options) {
		return $.pressList.impl.init(this, options);
	};
	
	/*
	 * default options
	 */
	$.pressList.defaults = {
	    index:      0,
	    pageSize:   8,
	    pageCount:  0,
	    res:        {}
	};
	
	$.pressList.impl = {
		
		/*
		 * options
		 */
		opts:           null,
		
		/*
		 * helper
		 */
		helper:         {},
		
		/*
		 * Initialize the page
		 */
		init: function (options) {
            
            var self = this;
            
            this.opts = $.extend({}, $.pressList.defaults, options);
            
            // helpers
            self.helper.container = $('div.page-presslist');
            self.helper.list = self.helper.container.find('ul.pressitem-collection');
            self.helper.pages = $('<ul class="page-collection"></ul>').appendTo(self.helper.container.find('td'));
            self.helper.prev = $('<a class="prev-page prev-page-disabled" href="#">' + self.opts.res.previous + '</a>').appendTo(self.helper.container);
            self.helper.next = $('<a class="next-page" href="#">' + self.opts.res.next + '</a>').appendTo(self.helper.container);
            
            // initialize cufon
            Cufon.replace(self.helper.container.find('h1'), {
                fontFamily: 'Helvetica Neue LT Std'
            });
            Cufon.now();
            
            // pagination
            self.opts.pageCount = Math.ceil(self.helper.list.children().length/self.opts.pageSize);
            if (self.opts.pageCount > 1)
            {
                var length = self.opts.pageCount - 1;
                
                for (var i = 0; i <= length; i++)
                {
                    var $li = $('<li class="page page-' + i + '"><a href="#">' + (i + 1) + '</a></li>').appendTo(self.helper.pages);
                    
                    if (i == 0)
                    {
                        $li.find('a')
                            .html((i + 1) + ' <span>&#8230;</span>')
                            ;
                    }
                    else if (i == length)
                    {
                        $li.find('a')
                            .html('<span>&#8230;</span> ' + (i + 1))
                            ;
                    }
                }
            }
            
            // bind page click
            self.helper.pages.find('a').click(function(e){
                e.preventDefault();
                
                var $li = $(this).parent();
                
                if ($li.hasClass('page-active'))
                    return;
                
                self.opts.index = $li.prevAll().length;
                
                self.page(self.opts.index);
                
            });
            
            // bind prev click
            self.helper.prev.click(function(e){
                e.preventDefault();
                
                self.page(self.opts.index--);
                
            });
            
            // bind next click
            self.helper.next.click(function(e){
                e.preventDefault();
                
                self.page(self.opts.index++);
                
            });
            
            // bind hover
            self.helper.list.children().hover(
                function(){
                    $(this).addClass('pressitem-hover');
                },
                function(){
                    $(this).removeClass('pressitem-hover');
                }
            );
            
            // bind open click
            self.helper.list.find('a.open-pressitem-detail').click(function(e){
                e.preventDefault();
                
                self.detail($(this).parent().clone());
                
            });
            
            self.page(0);
            
			return self;
		},
		
		/*
		 * Pagination
		 */
		pagination: function () {
		    
		    var self = this;
		    
            self.opts.range = 2;
            
            var length = self.helper.pages.children().length;
            var first = 0;
            var last = self.opts.pageCount - 1;
            var start = first;
            var atFirst;
            var atLast;
            
            if (self.opts.index <= self.opts.range)
            {
                start = first;
                atFirst = true;
                atLast = false;
            }
            else if (self.opts.index >= (last - self.opts.range))
            {
                start = last - 2*self.opts.range;
                atFirst = false;
                atLast = true;
            }
            else
            {
                start = self.opts.index - self.opts.range;
                atFirst = false;
                atLast = false;
            }
            
            var finish = start + 2*self.opts.range;
            
            self.helper.pages.children().each(function(i, item){
                
                if (i >= start && i <= finish)
                {
                    $(item)
                        .addClass('page-visible')
                        ;
                }
                else
                {
                    $(item)
                        .removeClass('page-visible')
                        ;
                }
                
            });
            
            if (self.opts.pageCount <= 5)
            {
                $(self.helper.pages.children()[last])
                    .addClass('page-atlast')
                    ;
                
                $(self.helper.pages.children()[first])
                    .addClass('page-atfirst')
                    ;
                
                return;
            }
            
            if (self.opts.pageCount > 5)
            {
                if (atFirst)
                {
                    $(self.helper.pages.children()[last])
                        .addClass('page-visible')
                        .removeClass('page-atlast')
                        ;
                    
                    $(self.helper.pages.children()[first])
                        .addClass('page-atfirst')
                        ;
                }
                else if (atLast)
                {
                    $(self.helper.pages.children()[first])
                        .addClass('page-visible')
                        .removeClass('page-atfirst')
                        ;
                    
                    $(self.helper.pages.children()[last])
                        .addClass('page-atlast')
                        ;
                }
                else
                {
                    $(self.helper.pages.children()[first])
                        .addClass('page-visible')
                        .removeClass('page-atfirst')
                        ;
                    $(self.helper.pages.children()[last])
                        .addClass('page-visible')
                        .removeClass('page-atlast')
                        ;
                }
            }
		    
		    return;
		},
		
		/*
		 * Page
		 */
		page: function (p) {
		    
		    var self =  this;
		    var $page = $(self.helper.pages.children()[self.opts.index]);
            
            if (self.opts.index == 0)
            {
                self.helper.prev
                    .addClass('prev-page-disabled')
                    ;
            }
            else
            {
                self.helper.prev
                    .removeClass('prev-page-disabled')
                    ;
            }
            
            if (self.opts.index == self.opts.pageCount - 1)
            {
                self.helper.next
                    .addClass('next-page-disabled')
                    ;
            }
            else
            {
                self.helper.next
                    .removeClass('next-page-disabled')
                    ;
            }
            
            if (self.opts.pageCount > 1)
                $page
                    .addClass('page-active')
                    .siblings()
                    .removeClass('page-active')
                    ;
		    
		    self.helper.list.children()
		        .css({
		            display:    'none'
		        })
		        ;
		    
		    var start = self.opts.index*self.opts.pageSize;
		    var finish = start + self.opts.pageSize - 1;
		    
		    for (var i = start; i <= finish; i++)
		    {
		        $(self.helper.list.children()[i])
		            .css({
		                display:    'block'
		            })
		            ;
		    }
		    
		    self.pagination();
		    
		    return;
		},
		
		/*
		 * Detail
		 */
		detail: function ($item) {
		    
		    var self = this;
		    var $detail = $('<div class="pressitem-detail"><div class="pressitem-detail-bg"></div></div>');
		    var $images = $item.find('ul.image-collection').appendTo($detail);
		    var $info = $item.find('.pressitem-info').css('display', 'none').appendTo($detail);
		    
		    $detail
		        .css({
		            left:       self.helper.list.offset().left - self.helper.container.offset().left + 6 + 'px',
		            top:        self.helper.list.offset().top - self.helper.container.offset().top + 6 + 'px',
		            display:    'none'
		        })
		        .appendTo(self.helper.container)
		        .fadeIn(500, function(){
		            
		            var i = 0;
		            var $img = $($images.find('.image img')[i]);
		            
		            $(new Image()).load(function(){
		                
		                $img
		                    .fadeIn(500)
		                    ;
		                
		                $info
		                    .fadeIn(500)
		                    ;
		                
		            }).attr('src', $img.attr('src'));
		            
		        })
		        ;
		    
		    self.helper.pages
		        .fadeOut(500)
		        ;
		        
            self.helper.prev
                .fadeOut(500)
                ;
            
            self.helper.next
                .fadeOut(500)
                ;
		    
		    var $close = $('<a class="close-pressitem-detail" href="#">' + self.opts.res.close + '</a>').appendTo($detail);
		    
		    // bind close click
		    $close.click(function(e){
		        e.preventDefault();
		        
		        $detail
		            .fadeOut(500, function(){
		                
		                $detail
		                    .remove()
		                    ;
		                
		            })
		            ;
		        
		        self.helper.pages
		            .fadeIn(500)
		            ;
		        
		        if (!self.helper.prev.hasClass('prev-page-disabled'))
		        {
		            
		            self.helper.prev
		                .fadeIn(500)
		                ;
		        }
		        
		        if (!self.helper.next.hasClass('next-page-disabled'))
		        {
		            self.helper.next
		                .fadeIn(500)
		                ;
		        }
		        
		    });
		    
		    return;
		}
		
	};
})(jQuery);
