(function ($) {
	
	$.press = function (options) {
		return $.press.impl.init(options);
	};
	
	$.fn.press = function (options) {
		return $.press.impl.init(this, options);
	};
	
	/*
	 * press default options
	 */
	$.press.defaults = {
	    page:       1,
	    item:       null,
	    pageSize:   3
	};
	
	$.press.impl = {
		
		/*
		 * press options
		 */
		opts: null,
		
		/*
		 * press helper
		 */
		helper: {},
		
		/*
		 * press length
		 */
		length: 0,
		
		/*
		 * Initialize the press
		 */
		init: function (options) {
            
            var self    = this;
            
            self.opts = $.extend({}, $.press.defaults, options);
            
            // create the helper objects
            self.helper.container   = $('div.press-container');
            self.helper.list        = self.helper.container.find('ul.pressitem-collection');
            self.helper.header      = self.helper.container.find('div.press-header');
            self.helper.pagination  = $('<ul class="page-collection"></ul>').appendTo(self.helper.container);
            self.helper.item        = $('<div class="pressitem-detail"><div class="pressitem-detail-scrollable"></div></div>').appendTo(self.helper.container);
            
            // create the pagination
            self.length = Math.ceil((self.helper.list.children().length)/(self.opts.pageSize));
            
            // append "read more" link
            self.helper.list.find('.pressitem-content').append('<a class="open-pressitem" href="#" title="Read More">Read More</a>');
            
            for (var page = 0; page < self.length; page++)
            {
                self.helper.pagination.append('<li><a class="page" href="#" title="' + (page + 1) + '">' + (page + 1) + '</a></li>');
            }
            
            self.helper.pagination.prepend('<li><a class="page-prev" href="#" title="Previous">Previous</a></li>');
            self.helper.pagination.append('<li><a class="page-next" href="#" title="Next">Next</a></li>');
            
            // set the initial item (if exists) and page
            if (self.opts.item)
            {
                var $item = self.helper.list.children('#' + self.opts.item);
                self.openItem($item);
                
                // set the page to match the item
                self.changePage(Math.ceil(($item.prevAll().length + 1)/(self.opts.pageSize)), true);
            }
            else
            {
                self.changePage(self.opts.page, true);
            }
            
            // bind the page events
            self.bindEvents();
            
			return self;
		},
		
		/*
		 * Change the page
		 */
		changePage: function (newPage, isInit) {
		    
		    var self    = this;
		    
		    self.opts.page = newPage;
		    
		    // update deep linking
		    if (!isInit)
		        SWFAddress.setValue(newPage + '/');
		    
            self.helper.list.children().each(function(i, item){
                
                if (i >= (self.opts.page - 1)*(self.opts.pageSize) && i < (self.opts.page)*(self.opts.pageSize))
                {
                    $(item).css('display', 'block');
                }
                else
                {
                    $(item).css('display', 'none');
                }
                
            });
            
            // disable buttons
            if (self.opts.page == self.length)
            {
                self.helper.pagination.find('a.page-next').addClass('page-next-disabled');
            }
            else
            {
                self.helper.pagination.find('a.page-next').removeClass('page-next-disabled');
            }
            
            if (self.opts.page == 1)
            {
                self.helper.pagination.find('a.page-prev').addClass('page-prev-disabled');
            }
            else
            {
                self.helper.pagination.find('a.page-prev').removeClass('page-prev-disabled');
            }
            
            $(self.helper.pagination.find('a.page')[self.opts.page - 1]).addClass('active').parent().siblings().children().removeClass('active');
		    
		    return;
		},
		
		/*
		 * Bind the page events
		 */
		bindEvents: function () {
		    
		    var self    = this;
		    
		    self.helper.pagination.find('a.page').click(function(e){
		        e.preventDefault();
		        
		        self.changePage($(this).text());
		        
		    });
		    
		    self.helper.pagination.find('a.page-prev').click(function(e){
		        e.preventDefault();
		        
		        if (self.opts.page != 1)
		        {
		            self.changePage(self.opts.page - 1);
		        }
		        
		    });
		    
		    self.helper.pagination.find('a.page-next').click(function(e){
		        e.preventDefault();
		        
		        if (self.opts.page != self.length)
		        {
		            self.changePage(self.opts.page + 1);
		        }
		        
		    });
		    
		    self.helper.list.find('a.open-pressitem').click(function(e){
		        e.preventDefault();
		        
		        self.openItem($(this).parent().parent());
		        
		    });
		    
		    return;
		},
		
		/*
		 * Open the item
		 */
		openItem: function ($item) {
		    
		    var self    = this;
		    var links   = $('<ul class="link-collection"></ul>');
		    
		    // update deep linking
		    SWFAddress.setValue(self.opts.page + '/' + ($item.attr('id')) + '/');
		    
		    links
		        .append('<li><a class="close-pressitem" href="#" title="Back to List">Back to List</a></li>')
		        ;
		    
		    if ($item.find('ul.pressitem-link-collection').length > 0)
		    {
		        links.prepend($item.find('ul.pressitem-link-collection li').clone())
		    }
		    
		    self.helper.list.css('display', 'none');
		    self.helper.header.css('display', 'none');
		    self.helper.pagination.css('display', 'none');
		    
		    self.helper.item
		        .empty()
		        .append('<div class="pressitem-detail-scrollable"></div>')
		        ;
		    
		    self.helper.item.find('.pressitem-detail-scrollable')
		        .empty()
		        .append($item.find('.pressitem-image').clone())
		        .append($item.find('.pressitem-content').clone())
		        .append('<div class="clear"></div>')
		        ;
		    
		    self.helper.item
		        .append(links)
		        ;
		    
		    self.helper.item.css({
		        display:    'block',
		        left:       '-999em'
		    });
		    
		    // init scroll pane
		    self.helper.item.find('.pressitem-detail-scrollable').jScrollPane({
                scrollbarWidth: 7,
                scrollbarMargin: 20,
                wheelSpeed: 32
            });
		    
		    self.helper.item.css({
	            left:   '0'
	        });
		    
		    // bind close click
		    self.helper.item.find('a.close-pressitem').unbind().click(function(e){
		        e.preventDefault();
		        
		        self.helper.item.css('display', 'none');
		        
		        self.helper.list.css('display', 'block');
		        self.helper.header.css('display', 'block');
		        self.helper.pagination.css('display', 'block');
		        
		        // update deep linking
		        SWFAddress.setValue(self.opts.page + '/');
		        
		    });
		    
		    return;
		}
		
	};
})(jQuery);