<!DOCTYPE html>
<html lang="{{ DEFAULT_LANG }}">

<head>
  {% if SERVER_LESS %}
  <link rel="stylesheet" type="text/css" href="{{ SITEURL }}/theme/css/style.css">
  {% else %}
  <link rel="stylesheet/less" type="text/css" href="{{ SITEURL }}/theme/css/style.less">
  <script src="//cdnjs.cloudflare.com/ajax/libs/less.js/2.2.0/less.min.js" type="text/javascript"></script>
  {% endif %}

  <link rel="stylesheet" type="text/css" href="{{ SITEURL }}/theme/css/pygments.css">
  <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">

  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="author" content="{{ AUTHOR }}">
  <meta name="description" content="{% block description %}Posts by {{ AUTHOR }}{% endblock %}">

  {% if FEED_ALL_ATOM %}
  <link href="{{ FEED_DOMAIN }}/{{ FEED_ALL_ATOM }}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Full Atom Feed" />
  {% endif %}
  {% if FEED_ALL_RSS %}
  <link href="{{ FEED_DOMAIN }}/{{ FEED_ALL_RSS }}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Full RSS Feed" />
  {% endif %}

  {% block head %}
  <meta name="keywords" content="
    {%- if GLOBAL_KEYWORDS -%}
      {{ GLOBAL_KEYWORDS|join(', ') }}
      {%- if tags -%}{{', '}}{%- endif -%}
    {%- endif -%}
    {{tags|join(', ', attribute='0') }}">
  {% endblock %}

  <title>
    {% block title %}{{ SITENAME }}{% endblock %}
  </title>

  {% include "modules/analytics.html" %}
</head>

<body>
  <aside>
    <div id="user_meta">
      <a href="{{ SITEURL }}">
        {% if USER_LOGO_URL %}
        <img src="{{ USER_LOGO_URL }}" alt="logo" id="logo">
        {% endif %}
      </a>
      <h2><a href="{{ SITEURL }}" class="nohover">{{ SITENAME }}</a></h2>
      <p>{{ TAGLINE }}</p>
      <ul>
        {% for name, link in SOCIAL %}

        {# Attempt to normalize link URLs #}
        {% set temp = link|lower|replace('http://', '')|replace('https://', '')|replace('www.', '') %}

        {% set class = 'fa-external-link-square' %}

        {% if MANGLE_EMAILS and temp.startswith('mailto:') %}
        <li><a data-email="{{ link|reverse }}" title="You need javascript enabled to view this email" class="email">{{ name }}<i class="fa fa-envelope fa-lg"></i></a></li>
        {% else %}

        {# Choosing a specific link icon #}
        {%   if temp.startswith('bitcoin:') %}{% set class = 'fa-btc' %}
        {% elif temp.startswith('irc:') %}{% set class = 'fa-comments' %}
        {% elif temp.startswith('mailto:') %}{% set class = 'fa-envelope' %}
        {% elif temp.startswith('skype:') %}{% set class = 'fa-skype' %}

        {% elif temp.endswith('.pdf') or
                temp.endswith('.txt') or
                temp.endswith('.doc') or
                temp.endswith('.docx') %}{% set class = 'fa-file-text' %}

        {% elif temp.startswith('bitbucket.org') %}{% set class = 'fa-bitbucket' %}
        {% elif temp.startswith('delicious.com') %}{% set class = 'fa-delicious' %}
        {% elif temp.startswith('deviantart.com') %}{% set class = 'fa-deviantart' %}
        {% elif temp.startswith('facebook.com') %}{% set class = 'fa-facebook' %}
        {% elif temp.startswith('flickr.com') %}{% set class = 'fa-flickr' %}
        {% elif temp.startswith('foursquare.com') %}{% set class = 'fa-foursquare' %}
        {% elif temp.startswith('github.com') %}{% set class = 'fa-github' %}
        {% elif temp.startswith('instagram.com') %}{% set class = 'fa-instagram' %}
        {% elif temp.startswith('last.fm') %}{% set class = 'fa-lastfm' %}
        {% elif temp.startswith('linkedin.com') %}{% set class = 'fa-linkedin' %}
        {% elif temp.startswith('news.ycombinator.com') %}{% set class = 'fa-hacker-news' %}
        {% elif temp.startswith('pinterest.com') %}{% set class = 'fa-pinterest' %}
        {% elif temp.startswith('plus.google.com') %}{% set class = 'fa-google-plus' %}
        {% elif temp.startswith('reddit.com') %}{% set class = 'fa-reddit' %}
        {% elif temp.startswith('spotify.com') %}{% set class = 'fa-spotify' %}
        {% elif temp.startswith('stackoverflow.com') %}{% set class = 'fa-stack-overflow' %}
        {% elif temp.startswith('steamcommunity.com') %}{% set class = 'fa-steam' %}
        {% elif temp.startswith('soundcloud.com') %}{% set class = 'fa-soundcloud' %}
        {% elif temp.startswith('twitch.tv') %}{% set class = 'fa-twitch' %}
        {% elif temp.startswith('twitter.com') %}{% set class = 'fa-twitter' %}
        {% elif temp.startswith('vimeo.com') %}{% set class = 'fa-vimeo-square' %}
        {% elif temp.startswith('vine.co') %}{% set class = 'fa-vine' %}
        {% elif temp.startswith('youtube.com') %}{% set class = 'fa-youtube' %}

        {% elif '.stackexchange.com' in temp %}{% set class = 'fa-stack-exchange' %}
        {% elif '.tumblr.com' in temp %}{% set class = 'fa-tumblr' %}

        {% endif %}

        <li><a href="{{ link }}">{{ name }}<i class="fa {{ class }} fa-lg"></i></a></li>
        {% endif %}
        {% endfor %}
      </ul>
      <ul>
        {% for name, link in LINKS %}
        <li><a href="{{ link }}">{{ name }}<i class="fa fa-external-link-square fa-lg"></i></a></li>
        {% endfor %}
      </ul>
    </div>
  </aside>

  <main id="main">
    <header>
      {% block header %}
      <p id="header">
      <a href="{{ SITEURL }}">Home</a>
      
      {% for p in pages|sort %}
      {% if p.url != "index.html" %}
      &#124; <a href="{{ SITEURL }}/{{ p.url }}">{{ p.title }}</a>
      {% endif %}
      {% endfor %}
      {% if INDEX_SAVE_AS and INDEX_SAVE_AS != "index.html" %}
      &#124; <a href="{{ SITEURL }}/{{ INDEX_SAVE_AS }}">Blog</a>
      {% endif %}
      {% if FEED_ALL_ATOM %}
      &#124; <a href="{{ FEED_DOMAIN }}/{{ FEED_ALL_ATOM }}">Atom Feed</a>
      {% endif %}
      {% if FEED_ALL_RSS %}
      &#124; <a href="{{ FEED_DOMAIN }}/{{ FEED_ALL_RSS }}">RSS Feed</a>
      {% endif %}
      </p>
      {% endblock header %}
      {% block subheader %}{% include "modules/blogsubheader.html" %}{% endblock subheader %}
    </header>

    {% block content %}
    {% endblock %}

    {% block footer %}
    {% endblock %}

    <div id="ending_message">
        <p>&copy; {{ AUTHOR }}. Built using <a href="http://getpelican.com">Pelican</a>. Theme is <a href="https://github.com/pR0Ps/pelican-subtle">subtle</a> by <a href="http://cmetcalfe.ca">Carey Metcalfe</a>. Based on <a href="https://github.com/giulivo/pelican-svbhack">svbhack</a> by Giulio Fidente.</p>
    </div>
  </main>

  {% block scripts %}
  <script type="text/javascript">
    window.addEventListener('load', function(){
    if (window.location.pathname != '/' && window.location.pathname != '/index.html'){
      window.scroll(0, document.getElementById('main').offsetTop);
    }})
  </script>

  {% if MANGLE_EMAILS %}
  <script type="text/javascript">
    window.addEventListener('load', function(){
      var e = document.querySelectorAll(".email");
      for (var i = 0; i < e.length; i++) {
        var email = e[i].getAttribute("data-email")
        if (email){
          e[i].href = email.split("").reverse().join("");
          e[i].removeAttribute("data-email");
          e[i].removeAttribute("title");
          e[i].removeAttribute("class");
        }
      }
    })
  </script>
  {% endif %}
  {% endblock scripts %}
</body>
</html>
