self::version, 'search-in-menubar' => 1, 'feature-newest-post' => 1, 'credit-in-footer' => 1 ) );
	}
	// Run when Blogfolio is deactivated.
	static function deactivate() {}
	// Run when BLogfolio is uninstalled.
	static function uninstall() {
		delete_option( self::options );
	}
	// Registry for accessing theme settings.
	static function config( $key = null ) {
		if( ! self::$config )
			return null;
		if( $key !== null )
			return isset( self::$config[ $key ] ) ? self::$config[ $key ] : null;
		else
			return self::$config;
	}
	// To be hooked into after_setup_theme
	static function after_setup_theme() {
		self::$config = get_option( self::options );
		// i18n support.
		load_theme_textdomain( self::options, get_template_directory() . '/resources/languages' );
		// Custom header support.
		add_theme_support( 'custom-header', array(
			'default-text-color' => '444',
			'default-image' => '',
			'width' => 718,
			'height' => 80,
			'flex-height' => true,
			'flex-width' => true
		) );
		// Custom background support.
		add_theme_support( 'custom-background', array(
			'default-color' => '000',
			'default-image' => get_template_directory_uri() . '/resources/images/darkwood.jpg',
		) );
		// Automatic feed links support.
		add_theme_support( 'automatic-feed-links' );
		// Post formats support.
		add_theme_support( 'post-formats', array( 'audio', 'video', 'image', 'gallery', 'link', 'chat', 'quote', 'status', 'aside' ) );
		// Post thumbnails support.
		add_theme_support( 'post-thumbnails' );
		set_post_thumbnail_size( 272, 204, true );
		// Custom menu support.
		register_nav_menu( 'primary', __( 'Primary Navigation', 'blogfolio' ) );
		// Hook into Blogfolio template hooks.
		add_action( 'blogfolio_topbar', array( self::template(), 'topbar' ) );
		add_action( 'blogfolio_site_header', array( self::template(), 'siteHeader' ) );
		add_action( 'blogfolio_before_content', array( self::template(), 'beforeContent' ) );
		add_action( 'blogfolio_post_feature', array( self::template(), 'postFeature' ) );
		add_action( 'blogfolio_loop_header', array( self::template(), 'loopHeader' ) );
		add_action( 'blogfolio_page_header', array( self::template(), 'pageHeader' ) );
		add_action( 'blogfolio_page_footer', array( self::template(), 'pageFooter' ) );
		add_action( 'blogfolio_single_header', array( self::template(), 'singleHeader' ) );
		add_action( 'blogfolio_single_footer', array( self::template(), 'singleFooter' ) );
		add_action( 'blogfolio_attachment_header', array( self::template(), 'attachmentHeader' ) );
		add_action( 'blogfolio_attachment_footer', array( self::template(), 'attachmentFooter' ) );
		add_action( 'blogfolio_after_content', array( self::template(), 'afterContent' ) );
		add_action( 'blogfolio_site_footer', array( self::template(), 'siteFooter' ) );
	}
	// To be hooked into init
	static function init() {
		self::_updateAsNeeded();
		add_editor_style( 'editor-style.css' );
		add_filter( 'wp_link_pages_args', array('BlogfolioTemplate', 'wpLinkPagesArgs') );
		remove_action( 'the_excerpt', 'sharing_display', 19 );
	}
	// To be hooked into widget_init
	static function widgets_init() {
		// Content Sidebar.
		register_sidebar( array(
			'name' => __( 'Content Sidebar', 'blogfolio' ),
			'id' => 'content-sidebar',
			'description' => __( 'For placing widgets alongside content', 'blogfolio' ),
			'before_widget' => '
',
			'after_widget' => '
',
			'before_title' => ''
		) );
		// Site Header widget area.
		register_sidebar( array(
			'name' => __( 'Site Header Widget Area', 'blogfolio' ),
			'id' => 'site-header-widget-container',
			'description' => __( 'For placing widgets immediately after the site header', 'blogfolio' ),
			'before_widget' => '',
			'before_title' => ''
		) );
		// Homepage widget area.
		register_sidebar( array(
			'name' => __( 'Home Page Widget Area', 'blogfolio' ),
			'id' => 'home-page-widget-container',
			'description' => __( 'For placing widgets on the home page', 'Blogfolio' ),
			'before_widget' => '',
			'after_widget' => '
',
			'before_title' => ''
		) );
		// Pre content Widget area.
		register_sidebar( array(
			'name' => __( 'Before Content Widget Area', 'blogfolio' ),
			'id' => 'before-content-widget-container',
			'description' => __( 'For placing widgets before the content', 'blogfolio' ),
			'before_widget' => '',
			'after_widget' => '
',
			'before_title' => ''
		) );
		// Post content Widget area.
		register_sidebar( array(
			'name' => __( 'After Content Widget Area', 'blogfolio' ),
			'id' => 'after-content-widget-container',
			'description' => __( 'For placing widgets after the content', 'blogfolio' ),
			'before_widget' => '',
			'after_widget' => '
',
			'before_title' => ''
		) );
	}
	// To be hooked into wp_enqueue_scripts
	static function wp_enqueue_scripts() {
		wp_enqueue_style( 'css.normalize', get_template_directory_uri() . '/resources/css/normalize.css' );
		wp_enqueue_style( 'html.styles', get_template_directory_uri() . '/resources/css/html.styles.css' );
		wp_enqueue_style( 'wordpress.styles', get_template_directory_uri() . '/resources/css/wordpress.styles.css' );
		wp_enqueue_style( 'wordpress.comments', get_template_directory_uri() . '/resources/css/wordpress.comments.css' );
		wp_enqueue_style( 'Blogfolio.theme', get_stylesheet_directory_uri() . '/style.css' );
		wp_add_inline_style( 'Blogfolio.theme', self::_themeSettingStyles() );
		wp_enqueue_script( 'html5shiv', get_template_directory_uri() . '/resources/js/html5shiv/html5shiv.js' );
	}
	// add category nicenames in body and post class
	static function body_class( $classes ) {
		if( ! is_active_sidebar( 'content-sidebar' ) || is_page_template( 'fullwidthpage.php' ) )
			$classes[] = 'full-width-content';
		return $classes;
	}
	// Creates css style rules from theme styling options.
	private static function _themeSettingStyles() {
		$styles = array();
		if( $sitetitlecolour = esc_html( self::config( 'site-title-colour' ) ) )
			$styles[] = ".site-title .text { color: $sitetitlecolour; }";
		if( $sitesubtitlecolour = esc_html( self::config( 'site-subtitle-colour' ) ) )
			$styles[] = ".site-subtitle { color: $sitesubtitlecolour; }";
		return implode("\n", $styles);
	}
	private static function _updateAsNeeded() {
		$_config = self::config();
		$_version = isset( $_config[ 'version' ] ) ? $_config[ 'version' ] : 0; 
		if( $_version == self::version )
			return;
		if( $_version <= 1.62 )
			update_option( self::options, array( 'version' => self::version, 'feature-newest-post' => 1, ) + $_config );
	}
}
/**
 * Defines template fragment loader, an enhanced version of get_template_part().
 * Implements behaviour for displaying major sections of site, heavily leveraging template fragments.
 * Also Provides some utility functionality for showing core components of the site.
 *
 */
class BlogfolioTemplate {
	const fragments = 'fragments/';
	// Utility method for rendering a navigation menu.
	static function showNavigation( $themeposition ) {
		self::loadFragment( 'navigation', $themeposition, compact( 'themeposition' ) );
	}
	// Utility method for rendering a widget area.
	static function showWidgetContainer( $widgetcontainer ) {
		self::loadFragment( 'sidebar', $widgetcontainer, compact( 'widgetcontainer' ) );
	}
	// Renders a theme preview, customized based on the post format.
	static function showPostPreview( $context = false ) {
		$format = get_post_format() or $format = 'standard';
		switch( $format ) {
			case 'audio' :
				echo '';
				break;
			case 'video' :
				echo '';
			case 'image' :
				echo '';
				break;
			case 'gallery' :
				echo '';
				break;
			case 'link' :
				echo '';
				break;
			case 'chat' :
				echo '';
				break;
			case 'quote' :
				echo '';
				break;
			case 'status' :
				echo '';
				break;
			case 'aside' :
				echo '';
				break;
			case 'standard' :
			default :
				echo '';
				the_excerpt();
				echo '
';
		}
	}
	// Utility method for rendering a pagination navigation menu.
	static function paginate( $location ) {
		self::loadFragment( 'pagination', $location);
	}
	// For inserting a new render type 'next_and_number' in wp_link_pages(). Makes output consistent with paginate_links()
	static function wpLinkPagesArgs( $args ) {
		global $page, $numpages, $more, $pagenow;
		if ( ! $more || $args[ 'next_or_number' ] != 'next_and_number' ) 
			return $args;
		$args[ 'next_or_number' ] = 'number';
		if( $page - 1 )
			$args[ 'before' ] = $args[ 'before' ]
				. _wp_link_page( $page - 1 )
				. $args[ 'link_before' ]
				. $args[ 'previouspagelink' ]
				. $args[ 'link_after' ]
				. '';
		if( $page < $numpages )
			$args[ 'after' ] = ' ' . _wp_link_page( $page + 1 )
				. $args[ 'link_before' ]
				. $args[ 'nextpagelink' ]
				. $args['link_after']
				. ''
				.$args[ 'after' ];
		return $args;
	}
	/*
		Template Fragment loader, based loosely on get_template_part(). Looks in the child theme first and then the parent theme.
		The reasoning behind this over get_template_part() is to be able to pass variables to the fragments.
	*/
	static function loadFragment( $slug, $name = null, array $args = array() ) {
		$fragments = array();
		if( isset( $name ) )
			$fragments[] = self::fragments . "{$slug}-{$name}.php";
		$fragments[] = self::fragments . "{$slug}.php";
		if( $template = locate_template( $fragments ) )
			self::_loadFragment( $template, $args );
		return $template;
	}
	// Does the actual loading once a template is found.
	private static function _loadFragment( $template, array $args = array() ) {
		extract($args);
		include($template);
	}
	/*
		Following are implementations that have been hooked into the Blogfolio template hooks.
	*/
	function topbar() {
		if( Blogfolio::config( 'search-in-menubar' ) ) get_search_form();
		self::showNavigation( 'primary' );
	}
	function siteHeader() {
		self::showWidgetContainer( 'siteheader' );
	}
	function beforeContent() {
		self::showWidgetContainer( 'beforecontent' );
	}
	function postFeature() {
		if( is_archive() || is_search() )
			self::loadFragment( 'thumbnail', 'loop' );
		else
			self::loadFragment( 'thumbnail' );
	}
	function loopHeader() {
		self::loadFragment( 'header', 'loop' );
		self::loadFragment( 'postmeta', 'authorship' );
	}
	function pageHeader() {
		self::loadFragment( 'header', 'page' );
	}
	function pageFooter() {}
	function singleHeader() {
		self::loadFragment( 'header', 'single' );
		self::loadFragment( 'postmeta', 'authorship' );
		if( has_excerpt() ) {
			echo '';
			the_excerpt();
			echo '
';
		}
	}
	function singleFooter() {
		self::loadFragment( 'postmeta', 'classification' );
	}
	function attachmentHeader() {
		self::loadFragment( 'header', 'attachment' );
		self::loadFragment( 'postmeta', 'authorship' );
		if( has_excerpt() ) {
			echo '';
			the_excerpt();
			echo '
';
		}
	}
	function attachmentFooter() {
		global $post;
		$link = get_permalink( $post->post_parent );
		$linktext = sprintf( __( 'Return to %s', 'blogfolio' ), get_the_title( $post->post_parent ) );
		echo '';
	}
	function afterContent() {
		self::showWidgetContainer( null );
		self::showWidgetContainer( 'aftercontent' );
		self::loadFragment( 'comments' );
	}
	function siteFooter() {
		self::loadFragment( 'sitefooter' );
	}
}
?>