/**
 * Sticky
 * @author Jeffrey van der Veen
 */
var Sticky = function(options) {this.init(options);};
Sticky.prototype =
{
	/**
	 * Constructor
	 * @param	object options
	 * @return	void
	 */
	init: function(options)
	{
		this.options = {
			selector: '[data-sticky]'
		};
		
		$.extend(this.options, options);
		
		this.window			= $(window);
		this.viewport_node	= $('#viewport');
		this.scroll_node	= $();
		this.page_node		= $();
		this.sticky_nodes	= $();
		
		this.sticky_support	= false;
		this.sticky_heights	= [];
		this.sticky_tops	= [];
		
		this.start();
	},
	
	/**
	 * Start
	 * @return void
	 */
	start: function()
	{
		this.scroll_node	= this.viewport_node.css('overflow') == 'visible' ? this.window : this.viewport_node;
		this.sticky_nodes	= $(this.options.selector);
		
		if (this.sticky_nodes.length) {
			this.sticky_support = this.sticky_nodes.first().css('position').match('sticky');
			
			if (this.sticky_support) {
				this.initSticky();
			} else {
				this.page_node = this.sticky_nodes.first().parents('.page:first');
				
				this.setStickyData();
				this.setSticky();
				this.setStickySize();
			}
			
			this.setEvents();
		}
	},
	
	/**
	 * Set events
	 * @return void
	 */
	setEvents: function()
	{
		var _this = this;
		
		if (this.sticky_support) {
			this.window.resize(function() {
				_this.initSticky();
			});
		} else {
			this.scroll_node.scroll(function() {
				_this.setSticky();
				_this.setStickySize();
			});
			
			this.window.resize(function() {
				_this.setStickyData();
				_this.setSticky();
				_this.setStickySize();
			});
		}
	},
	
	/**
	 * Init sticky
	 * @return void
	 */
	initSticky: function()
	{
		var sticky_heights = 0;
		
		this.sticky_nodes.each(function() {
			var sticky_node = $(this);
			
			if (sticky_heights) {
				sticky_node.css('top', sticky_heights);
			}
			
			sticky_heights += sticky_node.outerHeight();
		});
	},
	
	/**
	 * Set sticky data
	 * @return void
	 */
	setStickyData: function()
	{
		var _this = this;
		
		this.sticky_heights	= [];
		this.sticky_tops	= [];
		
		this.sticky_nodes.each(function() {
			var sticky_node	= $(this);
			var is_sticky	= sticky_node.hasClass('sticky');
			
			if (is_sticky) {
				var ghost_node = sticky_node.next('.ghost');
				
				sticky_node.removeClass('sticky').css('top', '');
				ghost_node.css('height', '');
			}
			
			if (sticky_node.is(':visible')) {
				var sticky_height	= sticky_node.outerHeight(true);
				var sticky_top		= sticky_node.offset().top;
			} else {
				var sticky_height	= 0;
				var sticky_top		= 0;
			}
			
			_this.sticky_heights.push(sticky_height);
			_this.sticky_tops.push(sticky_top);
		});
	},
	
	/**
	 * Set sticky
	 * @return void
	 */
	setSticky: function()
	{
		var _this		= this;
		var scroll_top	= this.scroll_node.scrollTop();
		
		this.sticky_nodes.each(function(index) {
			var sticky_node		= $(this);
			var sticky_height	= _this.sticky_heights[index];
			var sticky_top		= _this.sticky_tops[index];
			var sticky_nodes	= sticky_node.prevAll('.sticky');
			var sticky_heights	= 0;
			var ghost_node		= sticky_node.next('.ghost');
			var is_sticky		= sticky_node.hasClass('sticky');
			
			if (sticky_nodes.length) {
				sticky_nodes.each(function() {
					sticky_heights += $(this).outerHeight();
				});
				
				sticky_top -= sticky_heights;
			}
			
			if (!is_sticky && sticky_top <= scroll_top) {
				sticky_node.addClass('sticky');
				
				if (sticky_heights) {
					sticky_node.css('top', sticky_heights);
				}
				
				if (!ghost_node.length) {
					ghost_node = $('
', {class: 'ghost'});
					
					sticky_node.after(ghost_node);
				}
				
				ghost_node.css('height', sticky_height);
			} else if (is_sticky && sticky_top > scroll_top) {
				sticky_node.removeClass('sticky').css('top', '');
				
				ghost_node.css('height', '');
			}
		});
	},
	
	/**
	 * Set sticky size
	 * @return void
	 */
	setStickySize: function()
	{
		if (!this.viewport_node.is('body')) {
			var scroll_width	= this.scroll_node.outerWidth();
			var page_width		= this.page_node.outerWidth();
			
			this.sticky_nodes.each(function() {
				var sticky_node	= $(this);
				var is_sticky	= sticky_node.hasClass('sticky');
				
				sticky_node.css({'margin-left': '', width: ''});
				
				if (is_sticky) {
					var sticky_width = sticky_node.outerWidth();
					
					if (sticky_width < page_width) {
						sticky_node.css('margin-left', Math.round((page_width - sticky_width) / 2));
					} else if (scroll_width > page_width) {
						sticky_node.width(page_width);
					}
				}
			});
		}
	}
};/**
 * Anchor
 * @author Jeffrey van der Veen
 */
var Anchor = function(options) {this.init(options);};
Anchor.prototype =
{
	/**
	 * Constructor
	 * @param	object options
	 * @return	void
	 */
	init: function(options)
	{
		this.options = {
			selector: 'a[href^="#"]'
		};
		
		$.extend(this.options, options);
		
		this.window				= $(window);
		this.html_body_nodes	= $('html, body');
		this.viewport_node		= $('#viewport');
		this.scroll_node		= $();
		this.link_nodes			= $();
		
		this.scroll_top = 0;
		
		this.start();
	},
	
	/**
	 * Start
	 * @return void
	 */
	start: function()
	{
		this.link_nodes = $(this.options.selector);
		
		if (this.viewport_node.css('overflow') == 'visible') {
			this.scroll_node = this.html_body_nodes;
		} else {
			this.scroll_node	= this.viewport_node;
			this.scroll_top		= this.viewport_node.offset().top;
		}
		
		this.setEvents();
	},
	
	/**
	 * Set events
	 * @return void
	 */
	setEvents: function()
	{
		var _this = this;
		
		this.link_nodes.each(function() {
			var link_node	= $(this);
			var link_href	= link_node.attr('href');
			var anchor_name	= link_href.substr(1);
			var anchor_node	= $('a[name="'+anchor_name+'"]:first');
			
			if (anchor_node.length) {
				var li_node			= link_node.parents('li:first');
				var sticky_nodes	= anchor_node.parent().prevAll('[data-sticky]');
				
				link_node.click(function(event) {
					event.preventDefault();
					
					var anchor_top = anchor_node.offset().top - _this.scroll_top;
					
					if (_this.scroll_node === _this.viewport_node) {
						anchor_top += _this.scroll_node.scrollTop();
					} else {
						anchor_top += _this.window.scrollTop();
					}
					
					if (li_node.length) {
						var active_li_nodes = li_node.siblings('li.active');
						
						active_li_nodes.removeClass('active');
						li_node.addClass('active');
					}
					
					sticky_nodes.each(function() {
						var sticky_node		= $(this);
						var sticky_height	= sticky_node.outerHeight(true);
						
						anchor_top -= sticky_height;
					});
					
					_this.scroll_node.animate({
						scrollTop: anchor_top
					},
					500);
				});
			}
		});
	}
};/**
 * Scale
 * @author Jeffrey van der Veen
 */
var Scale = function(options) {this.init(options);};
Scale.prototype =
{
	/**
	 * Constructor
	 * @param	object options
	 * @return	void
	 */
	init: function(options)
	{
		this.options = {
			selector		: '[class*="heading-"], [class*="text-"]',
			min_font_size	: 8
		};
		
		$.extend(this.options, options);
		
		this.window			= $(window);
		this.scale_nodes	= $();
		
		this.start();
	},
	
	/**
	 * Start
	 * @return void
	 */
	start: function()
	{
		this.scale_nodes = $(this.options.selector).not(':has([style*="font-size"])');
		
		this.setEvents();
		this.scale();
	},
	
	/**
	 * Set events
	 * @return void
	 */
	setEvents: function()
	{
		var _this = this;
		
		this.window.resize(function() {
			_this.scale();
		});
	},
	
	/**
	 * Scale
	 * @param	object	scale_node
	 * @param	integer	font_size
	 * @return	void
	 */
	scale: function(scale_nodes, font_size)
	{
		var _this = this;
		
		if (!scale_nodes) {
			scale_nodes = this.scale_nodes;
		}
		
		scale_nodes.each(function() {
			var scale_node		= $(this);
			var parent_node		= scale_node.parent(':visible');
			var parent_width	= parent_node.width();
			
			scale_node.css({display: 'inline-block', 'font-size': ''});
			parent_node.css('max-width', '100%');
			
			var _parent_width = parent_node.width();
			
			if (_parent_width < parent_width) {
				parent_width = _parent_width;
				
				var scale_width = scale_node.outerWidth();
				
				parent_node.css('max-width', '');
			} else {
				parent_node.css('max-width', '');
				
				var scale_width = scale_node.outerWidth();
			}
			
			scale_node.css('display', '');
			
			if (scale_width > parent_width) {
				var _font_size	= font_size ? font_size : parseInt(scale_node.css('font-size'));
				var reduction	= Math.round(_font_size / 10);
				
				if (reduction < 1) {
					reduction = 1;
				}
				
				_font_size -= reduction;
				
				if (_font_size >= _this.options.min_font_size) {
					scale_node.css({display: 'inline-block', 'font-size': _font_size});
					
					scale_width = scale_node.outerWidth();
					
					scale_node.css('display', '');
					
					if (_font_size > _this.options.min_font_size && scale_width > parent_width) {
						_this.scale(scale_node, _font_size);
					}
				}
			}
		});
	}
};/**
 * Menu
 * @author Jeffrey van der Veen
 */
var Menu = function(options) {this.init(options);};
Menu.prototype =
{
	/**
	 * Constructor
	 * @param	object options
	 * @return	void
	 */
	init: function(options)
	{
		this.options = {
			selector	: '.menu',
			mobile		: false,
			mobile_size	: 0,
			aside		: true,
			init		: true,
			bottom		: false
		};
		
		$.extend(this.options, options);
		
		this.window			= $(window);
		this.viewport_node	= $('#viewport');
		this.scroll_node	= $();
		this.page_node		= $();
		this.block_node		= $();
		this.col_node		= $();
		this.menu_node		= $();
		this.handler_node	= $();
		this.listener_node	= $();
		this.outer_node		= $();
		this.inner_node		= $();
		this.item_nodes		= $();
		
		this.viewport_top	= 0;
		this.set_mobile		= false;
		this.mobile			= false;
		this.mobile_size	= this.options.mobile_size;
		this.position		= null;
		this.inner_width	= 0;
		this.transition		= typeof document.body.style.transition !== 'undefined';
		
		this.start();
	},
	
	/**
	 * Start
	 * @return void
	 */
	start: function()
	{
		var _this		= this;
		var selectors	= this.options.selector.split(',');
		
		this.scroll_node = this.viewport_node.css('overflow') == 'visible' ? this.window : this.viewport_node;
		
		if (selectors.length > 1) {
			for (var x in selectors) {
				var options = $.extend({}, this.options);
				
				options.selector = $.trim(selectors[x]);
				
				new Menu(options);
			}
		} else {
			var menu_nodes = $(this.options.selector);
			
			menu_nodes.each(function(index) {
				if (index) {
					var options = $.extend({}, _this.options);
					
					options.selector	+= ':eq('+index+')';
					options.init	 	 = false;
					
					new Menu(options);
				} else {
					_this.menu_node		= $(this);
					_this.page_node		= _this.menu_node.parents('.page:first');
					_this.block_node	= _this.menu_node.parents('header, section, footer').first();
					_this.col_node		= _this.menu_node.parents('.col:first');
					_this.handler_node	= _this.menu_node.find('.handler:first');
					_this.listener_node	= _this.menu_node.find('.mobile-menu:first');
					_this.outer_node	= _this.listener_node.children('.outer:first');
					_this.inner_node	= _this.outer_node.children('.inner:first');
					_this.item_nodes	= _this.inner_node.find('li:has(ul)');
					
					if (_this.viewport_node.css('overflow') != 'visible') {
						_this.viewport_top = _this.viewport_node.offset().top;
					}
					
					if (!_this.options.mobile && !_this.options.mobile_size) {
						_this.inner_node.addClass('nowrap');
						
						_this.inner_width = _this.inner_node.outerWidth();
					}
					
					/*
					if (!_this.options.aside) {
						if (_this.block_node.data('sticky') !== undefined) {
							_this.listener_node.attr('data-sticky', 'sticky');
						}
					}
					*/
					
					_this.setSubHeight();
					
					if (_this.options.bottom) {
						_this.setSubPosition();
					}
					
					_this.setMobile();
					_this.setEvents();
					
					_this.menu_node.addClass('init');
				}
			});
		}
	},
	
	/**
	 * Set mobile
	 * @param	boolean force
	 * @return	void
	 */
	setMobile: function(force)
	{
		var window_width = this.window.width();
		
		if (this.page_node.hasClass('aside-'+this.position) || this.listener_node.hasClass('active')) {
			this.set_mobile = true;
			
			this.page_node.removeClass('aside-'+this.position);
			this.listener_node.removeClass('active');
		} else if (!this.set_mobile) {
			force = true;
		}
		
		if (!this.transition) {
			this.page_node.add(this.listener_node).trigger('classchange');
		}
		
		if (!this.transition || force) {
			if (!this.options.mobile && !this.options.mobile_size) {
				if (window_width > this.mobile_size) {
					if (this.mobile) {
						this.menu_node.removeClass('mobile');
						
						var outer_width = this.outer_node.width();
						
						this.menu_node.addClass('mobile');
					} else {
						var outer_width = this.outer_node.width();
					}
					
					if (this.inner_width > outer_width) {
						this.mobile_size = window_width;
					}
				}
			}
			
			if (this.options.mobile || this.mobile_size) {
				if (this.options.mobile || window_width <= this.mobile_size) {
					this.menu_node.addClass('mobile');
					
					if (!this.position) {
						this.setPosition();
					}
					
					this.mobile = true;
				} else {
					this.menu_node.removeClass('mobile');
					
					this.mobile = false;
				}
			}
		}
	},
	
	/**
	 * Set position
	 * @return void
	 */
	setPosition: function()
	{
		if (this.page_node.length && this.handler_node.length) {
			var menu_display = this.menu_node.css('display');
			
			if (this.options.aside) {
				if (this.col_node.prev('.col').length) {
					this.position = 'right';
				} else if (this.col_node.next('.col').length) {
					this.position = 'left';
				} else {
					var handler_width	= this.handler_node.width();
					var handler_left	= this.handler_node.offset().left;
					var handler_center	= handler_left + (handler_width / 2);
					var page_width		= this.page_node.width();
					var page_left		= this.page_node.offset().left;
					var page_center		= page_left + (page_width / 2);
					
					this.position = handler_center < page_center ? 'left' : 'right';
				}
			} else {
				this.position = 'center';
			}
			
			if (menu_display !== 'table-cell') {
				this.menu_node.addClass(this.position);
			}
			
			this.listener_node.addClass(this.position);
		}
	},
	
	/**
	 * Set sub height
	 * @return void
	 */
	setSubHeight: function()
	{
		this.item_nodes.each(function() {
			var item_node	= $(this);
			var list_node	= item_node.children('ul:first');
			
			list_node.addClass('measure nosize');
			
			var list_height = list_node.outerHeight();
			
			list_node.removeClass('measure nosize').css('height', list_height);
		});
	},
	
	/**
	 * Set sub position
	 * @return void
	 */
	setSubPosition: function()
	{
		if (this.item_nodes.length) {
			var col_bottom		= this.col_node.offset().top + this.col_node.outerHeight();
			var item_top		= this.item_nodes.first().offset().top;
			var list_top		= col_bottom - item_top;
			var spacer_height	= list_top - this.item_nodes.first().outerHeight();
			
			this.item_nodes.each(function() {
				var item_node	= $(this);
				var spacer_node	= item_node.children('.spacer:first');
				var list_node	= item_node.children('ul:first');
				
				if (!spacer_node.length) {
					spacer_node = $('
', {class: 'spacer'});
					
					list_node.before(spacer_node);
				}
				
				spacer_node.css('height', spacer_height);
				list_node.css('top', list_top);
			});
		}
	},
	
	/**
	 * Set events
	 * @return void
	 */
	setEvents: function()
	{
		var _this = this;
		
		if (!this.options.mobile && this.options.init) {
			this.window.resize(function(event, force) {
				_this.setMobile();
			});
		}
		
		if (this.options.bottom) {
			this.window.resize(function(event, force) {
				_this.setSubPosition();
			});
		}
		
		this.page_node.on({
			classchange: function() {
				if (!_this.page_node.hasClass('aside-'+_this.position)) {
					_this.listener_node.trigger('reset');
				}
			},
			click: function() {
				if (_this.page_node.hasClass('aside-'+_this.position)) {
					_this.page_node.removeClass('aside-'+_this.position);
					
					if (!_this.transition) {
						_this.page_node.trigger('classchange');
					}
				}
			}
		});
		
		if (this.transition) {
			this.page_node.add(this.listener_node).on('transitionend', function() {
				if ('target' in event && ($(event.target).is(_this.page_node) || $(event.target).is(_this.listener_node))) {
					$(this).trigger('classchange');
					
					if (_this.set_mobile) {
						_this.setMobile(true);
					}
					
					_this.set_mobile = false;
				}
			});
		}
		
		this.handler_node.click(function(event) {
			event.stopPropagation();
			event.preventDefault();
			
			if (_this.page_node.hasClass('aside-'+_this.position)) {
				_this.page_node.removeClass('aside-'+_this.position);
				_this.listener_node.removeClass('active');
				
				if (!_this.options.aside && _this.block_node.css('position') === 'fixed') {
					_this.outer_node.css({overflow: '', width: ''});
				}
				
				if (!_this.transition) {
					_this.page_node.add(_this.listener_node).trigger('classchange');
				}
			} else {
				_this.page_node.before(_this.listener_node);
				
				if (_this.options.aside) {
					var outer_width		= _this.outer_node.outerWidth();
					var inner_width		= _this.inner_node.outerWidth();
					var scrollbar_width	= outer_width - inner_width;
					
					outer_width += scrollbar_width;
					
					_this.outer_node.width(outer_width);
					
					if (_this.position == 'right') {
						var viewport_width	= _this.viewport_node.outerWidth();
						var page_width		= _this.page_node.outerWidth();
						
						scrollbar_width = viewport_width - page_width;
						
						_this.listener_node.css('right', scrollbar_width);
					}
				} else {
					var block_height	= _this.block_node.outerHeight();
					var block_top		= _this.block_node.offset().top - _this.viewport_top;
					var block_bottom	= block_height + block_top;
					
					_this.listener_node.addClass('measure nosize');
					
					var listener_height = _this.listener_node.outerHeight();
					
					_this.listener_node.removeClass('measure nosize');
					
					if (_this.block_node.css('position') === 'fixed') {
						var window_height	= _this.window.height();
						var scroll_width	= _this.scroll_node.outerWidth();
						var page_width		= _this.page_node.outerWidth();
						
						if (scroll_width > page_width) {
							_this.listener_node.width(page_width);
						}
						
						if (listener_height > (window_height - block_bottom)) {
							listener_height = window_height - block_bottom;
						}
						
						_this.listener_node.css('position', 'fixed');
					}
					
					_this.listener_node.css({height: listener_height, top: block_bottom}).height();
				}
				
				_this.handler_node.addClass('active');
				_this.page_node.addClass('aside-'+_this.position);
				_this.listener_node.addClass('active');
			}
		});
		
		this.listener_node.on({
			classchange: function() {
				if (_this.listener_node.hasClass('active')) {
					if (!_this.options.aside && _this.block_node.css('position') === 'fixed') {
						_this.outer_node.css({height: '100%', overflow: 'auto'});
						
						var outer_width		= _this.outer_node.outerWidth();
						var inner_width		= _this.inner_node.outerWidth();
						var scrollbar_width	= outer_width - inner_width;
						
						outer_width += scrollbar_width;
						
						_this.outer_node.width(outer_width);
					}
				} else {
					_this.listener_node.trigger('reset');
				}
			},
			reset: function() {
				_this.handler_node.removeClass('active').after(_this.listener_node);
				
				if (_this.options.aside) {
					_this.outer_node.css('width', '');
				} else {
					_this.listener_node.css({position: '', top: '', width: ''});
				}
			}
		});
		
		this.item_nodes.on({
			mouseenter: function() {
				var item_node		= $(this);
				var list_node		= item_node.children('ul:first');
				var list_right		= list_node.offset().left + list_node.outerWidth();
				var window_width	= _this.window.width();
				
				if (list_right > window_width) {
					var list_left = window_width - list_right;
					
					list_node.css('left', list_left);
				}
			},
			mouseleave: function() {
				var item_node	= $(this);
				var list_node	= item_node.children('ul:first');
				
				list_node.css('left', '');
			}
		});
	}
};/**
 * Cover
 * @author Jeffrey van der Veen
 */
var Cover = function(options) {this.init(options);};
Cover.prototype =
{
	/**
	 * Constructor
	 * @param	object options
	 * @return	void
	 */
	init: function(options)
	{
		this.options = {
			selector: '.cover'
		};
		
		$.extend(this.options, options);
		
		this.window		= $(window);
		this.cover_node	= $();
		this.image_node	= $();
		
		this.start();
	},
	
	/**
	 * Start
	 * @return void
	 */
	start: function()
	{
		var _this		= this;
		var selectors	= this.options.selector.split(',');
		
		if (selectors.length > 1) {
			for (var x in selectors) {
				var options = $.extend({}, this.options);
				
				options.selector = $.trim(selectors[x]);
				
				new Cover(options);
			}
		} else {
			var cover_nodes = $(this.options.selector);
			
			cover_nodes.each(function(index) {
				if (index) {
					var options = $.extend({}, _this.options);
					
					options.selector += ':eq('+index+')';
					
					new Cover(options);
				} else {
					_this.cover_node	= $(this);
					_this.image_node	= _this.cover_node.children('img:first');
					
					_this.scaleImage();
					_this.setEvents();
				}
			});
		}
	},
	
	/**
	 * Scale image
	 * @return void
	 */
	scaleImage: function()
	{
		this.image_node.css({height: '', width: ''});
		
		var _this			= this;
		var image_height	= this.image_node.height();
		
		if (image_height) {
			var cover_height = this.cover_node.outerHeight();
			
			if (image_height < cover_height) {
				this.image_node.css({height: '101%', width: 'auto'});
			}
		} else {
			this.image_node.on('load', function() {
				_this.scaleImage();
			});
		}
	},
	
	/**
	 * Set events
	 * @return void
	 */
	setEvents: function()
	{
		var _this = this;
		
		this.window.resize(function() {
			_this.scaleImage();
		});
	}
};/**
 * Popup
 * @author Jeffrey van der Veen
 */
var Popup = function(options) {this.init(options);};
Popup.prototype =
{
	/**
	 * Constructor
	 * @param	object options
	 * @return	void
	 */
	init: function(options)
	{
		this.options = {
			selector: 'a[href][target="popup"]'
		};
		
		$.extend(this.options, options);
		
		this.window			= $(window);
		this.body_node		= $('body');
		this.handler_nodes	= $();
		this.handler_node	= $();
		this.popup_node		= $();
		this.viewport_node	= $();
		this.coltrols_node	= $();
		this.close_node		= $();
		this.previous_node	= $();
		this.next_node		= $();
		this.counter_node	= $();
		
		this.handler_index	= 0;
		this.handler_count	= 0;
		
		this.start();
	},
	
	/**
	 * Start
	 * @return void
	 */
	start: function()
	{
		this.handler_nodes	= $(this.options.selector);
		this.handler_count	= this.handler_nodes.length;
		
		if (this.handler_count) {
			this.popup_node		= $('
', {class: 'popup', style: 'display: none;'});
			this.viewport_node	= $('
', {class: 'viewport'});
			this.controls_node	= $('
', {class: 'controls'});
			this.close_node		= $('
', {href: '#', class: 'close'});
			
			this.controls_node.append(this.close_node);
			
			if (this.handler_count > 1) {
				this.previous_node	= $('', {href: '#', class: 'previous'});
				this.next_node		= $('', {href: '#', class: 'next'});
				this.counter_node	= $('', {class: 'counter'});
				
				this.controls_node.append(this.previous_node, this.next_node, this.counter_node);
			}
			
			this.popup_node.append(this.viewport_node, this.controls_node);
			this.body_node.append(this.popup_node);
			
			this.setEvents();
			
			this.handler_nodes.addClass('loaded');
		}
	},
	
	/**
	 * Set events
	 * @return void
	 */
	setEvents: function()
	{
		var _this = this;
		
		this.window.keyup(function(event) {
			var is_visible = _this.popup_node.is(':visible');
			
			if (is_visible) {
				var key_code = event.keyCode;
				
				switch (key_code) {
					case 27:
						_this.close_node.trigger('click');
						break;
					case 37:
						_this.previous_node.trigger('click');
						break;
					case 39:
						_this.next_node.trigger('click');
				}
			}
		});
		
		this.popup_node.click(function() {
			_this.popup_node.hide();
			_this.viewport_node.empty();
		});
		
		this.close_node.click(function(event) {
			event.preventDefault();
		});
		
		this.previous_node.click(function(event) {
			event.preventDefault();
			event.stopPropagation();
			
			var previous_handler_index	= _this.handler_index ? _this.handler_index - 1 : _this.handler_count - 1;
			var previous_handler_node	= _this.handler_nodes.filter(':eq('+previous_handler_index+')');
			
			previous_handler_node.trigger('click');
		});
		
		this.next_node.click(function(event) {
			event.preventDefault();
			event.stopPropagation();
			
			var next_handler_index	= _this.handler_index < (_this.handler_count - 1) ? _this.handler_index + 1 : 0;
			var next_handler_node	= _this.handler_nodes.filter(':eq('+next_handler_index+')');
			
			next_handler_node.trigger('click');
		});
		
		this.handler_nodes.click(function(event) {
			event.preventDefault();
			
			_this.handler_node	= $(this);
			_this.handler_index	= _this.handler_nodes.index(_this.handler_node);
			
			var href		= _this.handler_node.attr('href');
			var counter		= _this.handler_index + 1;
			var is_visible	= _this.popup_node.is(':visible');
			var matches		= null;
			
			_this.counter_node.text(counter+'/'+_this.handler_count);
			
			if (href.match(/\.(bmp|gif|jpeg|jpg|png|svg|tif|tiff)$/i)) {
				var content_node = $('
![]()
', {src: href});
			} else if (href.match(/\.mp4$/i)) {
				var content_node = $('