<!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/1.6.1/less.min.js" type="text/javascript"></script>
  {% endif %}

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

  <meta charset="utf-8" />
  <meta name="viewport" id="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 GOOGLE_PLUS_URL %}
  <link rel="author" href="{{ GOOGLE_PLUS_URL }}?rel=author">
  {% endif %}

  {% 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" href="#" class="email" target="_blank">{{ name }}<i class="fa fa-envelope fa-lg"></i></a></li>
        {% else %}

        {# Choosing a specific link icon #}
        {%   if temp.startswith('bitbucket.org') %}{% set class = 'fa-bitbucket' %}
        {% elif temp.startswith('facebook.com') %}{% set class = 'fa-facebook' %}
        {% elif temp.startswith('github.com') %}{% set class = 'fa-github' %}
        {% elif temp.startswith('linkedin.com') %}{% set class = 'fa-linkedin' %}
        {% elif temp.startswith('pinterest.com') %}{% set class = 'fa-pinterest' %}
        {% elif temp.startswith('plus.google.com') %}{% set class = 'fa-google-plus' %}
        {% elif temp.startswith('stackoverflow.com') %}{% set class = 'fa-stack-overflow' %}
        {% elif temp.startswith('twitter.com') %}{% set class = 'fa-twitter' %}
        {% elif temp.startswith('vimeo.com') %}{% set class = 'fa-vimeo-square' %}
        {% elif temp.startswith('youtube.com') %}{% set class = 'fa-youtube' %}
        
        {% elif temp.endswith('.pdf') %}{% set class = 'fa-file-text' %}
        
        {% elif '.stackexchange.com' in temp %}{% set class = 'fa-stack-exchange' %}
        {% elif '.tumblr.com' in temp %}{% set class = 'fa-tumblr' %}
        
        {% elif temp.startswith('bitcoin:') %}{% set class = 'fa-bitcoin' %}
        {% elif temp.startswith('irc:') %}{% set class = 'fa-comments' %}
        {% elif temp.startswith('mailto:') %}{% set class = 'fa-envelope' %}
        {% elif temp.startswith('skype:') %}{% set class = 'fa-skype' %}
        {% endif %}
        
        <li><a href="{{ link }}" target="_blank">{{ name }}<i class="fa {{ class }} fa-lg"></i></a></li>
        {% endif %}
        {% endfor %}
      </ul>
      <ul>
        {% for name, link in LINKS %}
        <li><a href="{{ link }}" target="_blank">{{ 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 %}
      {% endblock subheader %}
    </header>

    {% block content %}
    {% endblock %}

    {% block footer %}
    {% endblock %}

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

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

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

  {% if FORCE_PIXELS %}
  <script type="text/javascript">
    var ratio = 1/window.devicePixelRatio;
    var tag = document.getElementById("viewport")
    if (ratio != 1 && tag != null){
      tag.content = "width=device-width, initial-scale=" + ratio;
    }
  </script>
  {% endif %}
</body>
</html>
