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

<head>
  <link rel="stylesheet/less" type="text/css" href="{{ SITEURL }}/theme/css/style.less">
  <script src="{{ SITEURL }}/theme/js/less-1.5.0.min.js" type="text/javascript"></script>

  <link rel="stylesheet" type="text/css" href="{{ SITEURL }}/theme/css/pygments.css">
  <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=PT+Sans|PT+Serif|PT+Mono">
  <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="Posts and writings by {{ AUTHOR }}">

  {% 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">
        {% else %}
        <img src="{{ SITEURL }}/theme/images/logo.png" alt="logo">
        {% endif %}
      </a>
      <h2><a href="{{ SITEURL }}" class="nohover">{{ AUTHOR }}</a></h2>
      <p>{{ TAGLINE }}</p>
      <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 %}

        {% for name, link in SOCIAL %}

        {% set temp = link|lower|replace('http://', '')|replace('https://', '') %}
        {% 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>
    </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 by Carey Metcalfe, availible on <a href="https://github.com/pR0Ps/pelican-svbhack" target="_blank">GitHub</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>
