diff --git a/README.md b/README.md index 18e9f8241c535e90f310f9c16d44d8209d802628..d64a2f05860d73cae7a698416786666108bc8ea8 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,10 @@ * Highlight pre * Next & Previous Post * Disqus comment +* Projects +* Project page +* Share on social media +* Google analytics #### Screenshot diff --git a/_config.yml b/_config.yml index 5b342340b1370b4a06b52ee41f1d57335ab9c850..4a52f4468775c5170224e4351747018bc9d11174 100644 --- a/_config.yml +++ b/_config.yml @@ -3,16 +3,49 @@ description: My Personal Stack Problems author: Agus Makmun github: https://github.com/agusmakmun about: I am freelance developer. Currently doing more in backend, actually in Python and Django. +disqus_shortname: aboutashu +google_analytics: UA-XXXXXXXX-Y + +enableTags: true +tagarray: [] + +collections: + project: + output: true + permalink: /project/:path/ + +social: + - icon: fa-facebook + link: "#" + - icon: fa-skype + link: "#" + - icon: fa-twitter + link: "#" + - icon: fa-linkedin + link: "#" + - icon: fa-stack-exchange + link: "#" + +share: + twitter_username: 216ashutosh + fb_appid: 0000000000000 + urls: - text: About Me url: /about/ + - text: Projects + url: /projects/ - text: Github url: https://github.com/agusmakmun - text: XML Feed url: /feed.xml + url: "https://agusmakmun.github.io" baseurl: "" paginate: 20 per_page: 20 paginate_path: "/page:num/" -markdown: kramdown \ No newline at end of file +markdown: kramdown +gems: + - jekyll-paginate + - jekyll-gist \ No newline at end of file diff --git a/_data/projects.json b/_data/projects.json new file mode 100644 index 0000000000000000000000000000000000000000..c52980cb8df169c0333a09ca443603c04610f03a --- /dev/null +++ b/_data/projects.json @@ -0,0 +1,31 @@ +[ + { + "slug": "cool-project", + "name": "Cool project 1", + "image": "placeholder.jpg", + "url": "#", + "date": "Jan 2014", + "tags": ["Angular JS","API"] + }, + { + "name": "Cool project 2", + "image": "placeholder.jpg", + "url": "#", + "date": "May 2014", + "tags": ["Android","PHP"] + }, + { + "name": "Cool project 3", + "image": "placeholder.jpg", + "url": "#", + "date": "June 2014", + "tags": ["HTML","JQuery","PHP"] + }, + { + "name": "Cool project 4", + "image": "placeholder.jpg", + "date": "Oct 2016", + "tags": ["Android","nodejs"] + } + +] \ No newline at end of file diff --git a/_includes/analytics.html b/_includes/analytics.html new file mode 100644 index 0000000000000000000000000000000000000000..bb6b281de42b98ec8024c60d071e25073071f87c --- /dev/null +++ b/_includes/analytics.html @@ -0,0 +1,10 @@ +<script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); + + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + +</script> \ No newline at end of file diff --git a/_includes/project_tags.html b/_includes/project_tags.html new file mode 100644 index 0000000000000000000000000000000000000000..de11b902bee3bd0fb2d22fbc60fdcec6b442c36c --- /dev/null +++ b/_includes/project_tags.html @@ -0,0 +1,25 @@ +{% if site.enableTags == true %} + <div id="tag-filter" class="tag-group"> + <span class="tag-filter tag-cloud all active">All</span> + {% assign tagarray = site.tagarray %} + {% for project in site.data.projects %} + {% for tag in project.tags %} + {% assign tagarray = tagarray | push: tag %} + {% endfor %} + {% endfor %} + + {% assign tags = tagarray[1] %} + {% for item in tagarray %} + {% assign tagDown = item | downcase %} + {% assign tagComp = tags | downcase %} + {% unless tagComp contains tagDown %} + {% capture tags %}{{ tags }}|{{ item }}{% endcapture %} + {% endunless %} + {% endfor %} + + {% assign taglist = tags | split: '|' | sort %} + {% for tag in taglist %} + <span class="tag-filter tag-cloud" data-tag="{{ tag | downcase }}">{{ tag }}</span> + {% endfor %} + </div> +{% endif %} \ No newline at end of file diff --git a/_includes/share-page.html b/_includes/share-page.html new file mode 100644 index 0000000000000000000000000000000000000000..53355c7a9c713cea7f2cd97fde08f0e2ca67a595 --- /dev/null +++ b/_includes/share-page.html @@ -0,0 +1,20 @@ +<div class="share-page"> + Share this on → + <a href="https://twitter.com/share" class="twitter-share-button" data-via="{{ site.share.twitter_username }}">Tweet</a> +<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script> + +<!-- Google + --> +<div class="g-plus" data-action="share" data-annotation="bubble"></div> +<script src="https://apis.google.com/js/platform.js" async defer></script> + +<!-- Facebook --> +<div class="fb-share-button" data-href="{{site.url}}{{page.url}}" data-layout="button_count" style="position: relative; top: -8px; left: 3px;"></div> +</div> +<div id="fb-root"></div> +<script>(function(d, s, id) { + var js, fjs = d.getElementsByTagName(s)[0]; + if (d.getElementById(id)) return; + js = d.createElement(s); js.id = id; + js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.6&appId={{ site.share.fb_appid }}"; + fjs.parentNode.insertBefore(js, fjs); +}(document, 'script', 'facebook-jssdk'));</script> \ No newline at end of file diff --git a/_includes/social_links.html b/_includes/social_links.html new file mode 100644 index 0000000000000000000000000000000000000000..a8aa9afe5b53fe939cbf94fd78f9ac8e1c463c82 --- /dev/null +++ b/_includes/social_links.html @@ -0,0 +1,7 @@ +<div class="social"> + <ul> + {% for link in site.social %} + <li><a href="{{ link.link }}" target="_blank"><i class="fa {{ link.icon }}"></i></a></li> + {% endfor %} + </ul> +</div> \ No newline at end of file diff --git a/_layouts/default.html b/_layouts/default.html index 1a1287c2890715a81459dde54462890e036ab42a..2113f3585b807d69f7f41879cf66e2ddc182de2f 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -12,6 +12,69 @@ <meta name="keywords" content="{% if page.title %}{{ page.title }}, {{ site.title }}, {% for categ in page.categories %}{{ categ }}{% if forloop.last == false %}, {% endif %}{% endfor %}{% else %}{{ site.title }}, {% for category in site.categories %}{% capture categories_slug %}{{ category | first }}{% endcapture %}{% for categ in categories_slug %}{{ categ }}{% endfor %}{% if forloop.last == false %}, {% endif %}{% endfor %}{% endif %}" /> <link rel="alternate" type="application/rss+xml" title="RSS" href="/feed.xml"> + <meta content="{{ site.share.fb_appid }}" property="fb:app_id"> + <meta content="{{ site.title }}" property="og:site_name"> + {% if page.title %} + <meta content="{{ page.title }}" property="og:title"> + {% else %} + <meta content="{{ site.title }}" property="og:title"> + {% endif %} + {% if page.title %} + <meta content="article" property="og:type"> + {% else %} + <meta content="website" property="og:type"> + {% endif %} + {% if page.description %} + <meta content="{{ page.description }}" property="og:description"> + {% else %} + <meta content="{{ site.description }}" property="og:description"> + {% endif %} + {% if page.url %} + <meta content="{{ site.url }}{{ page.url }}" property="og:url"> + {% endif %} + {% if page.date %} + <meta content="{{ page.date | date_to_xmlschema }}" property="article:published_time"> + <meta content="{{ site.url }}/about/" property="article:author"> + {% endif %} + {% if page.image %} + <meta content="{{ site.url }}/static/img/posts/{{ page.image }}" property="og:image"> + {% else %} + <meta content="{{ site.url }}/static/img/logo-high-resolution.png" property="og:image"> + {% endif %} + {% if page.categories %} + {% for category in page.categories limit:1 %} + <meta content="{{ category }}" property="article:section"> + {% endfor %} + {% endif %} + {% if page.tags %} + {% for tag in page.tags %} + <meta content="{{ tag }}" property="article:tag"> + {% endfor %} + {% endif %} + + <meta name="twitter:card" content="summary"> + <meta name="twitter:site" content="@{{ site.share.twitter_username }}"> + <meta name="twitter:creator" content="@{{ site.share.twitter_username }}"> + {% if page.title %} + <meta name="twitter:title" content="{{ page.title }}"> + {% else %} + <meta name="twitter:title" content="{{ site.title }}"> + {% endif %} + {% if page.url %} + <meta name="twitter:url" content="{{ site.url }}{{ page.url }}"> + {% endif %} + {% if page.description %} + <meta name="twitter:description" content="{{ page.description }}"> + {% else %} + <meta name="twitter:description" content="{{ site.description }}"> + {% endif %} + {% if page.header-img %} + <meta name="twitter:image:src" content="{{ site.url }}/{{ page.header-img }}"> + {% endif %} + + <!-- Font awesome icons --> + <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-T8Gy5hrqNKT+hzMclPo118YTQO6cYprQmhrYwIiQ/3axmI1hQomh7Ud2hPOy8SP1" crossorigin="anonymous"> + <!-- syntax highlighting CSS --> <link rel="stylesheet" href="/static/css/syntax.css"> @@ -23,7 +86,12 @@ <!-- Custom CSS --> <link rel="stylesheet" href="/static/css/super-search.css"> + <link rel="stylesheet" href="/static/css/thickbox.css"> + <link rel="stylesheet" href="/static/css/projects.css"> <link rel="stylesheet" href="/static/css/main.css"> + + <!-- Google Analytics --> + {% include analytics.html %} </head> <body> @@ -37,7 +105,8 @@ </div> {% endif %} - <hr /> + {% include social_links.html %} + <div class="search" id="js-search"> <input type="text" placeholder="(sitemap)~$ type to search" class="search__input form-control" id="js-search__input"> <ul class="search__results" id="js-search__results"></ul> @@ -72,7 +141,10 @@ ================================================== --> <!-- Placed at the end of the document so the pages load faster --> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> + <script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script> <script src="/static/js/bootstrap.min.js"></script> <script src="/static/js/super-search.js"></script> + <script src="/static/js/thickbox-compressed.js"></script> + <script src="/static/js/projects.js"></script> </body> </html> diff --git a/_layouts/post.html b/_layouts/post.html index 7644718d483d88ddb09b130b70b7e293f23938a1..1cd9e101bc71a8454d4af354af7037800eae5154 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -11,6 +11,7 @@ layout: default <div class="content"> <div class="post">{{ content }}</div> + {% include share-page.html %} </div> {% assign hasSimilar = '' %} @@ -56,7 +57,7 @@ layout: default <script type="text/javascript"> /* <![CDATA[ */ - var disqus_shortname = 'stackproblems'; + var disqus_shortname = "{{ site.disqus_shortname }}"; var disqus_identifier = "{{ site.url }}_{{ page.title }}"; var disqus_title = "{{ page.title }}"; diff --git a/_layouts/project.html b/_layouts/project.html new file mode 100644 index 0000000000000000000000000000000000000000..e598f443538cc16486e909d50774c269dbc272f5 --- /dev/null +++ b/_layouts/project.html @@ -0,0 +1,63 @@ +--- +layout: default +--- +<article class="post"> + + <header class="post-header"> + <h1 class="post-title">{{ page.title }}</h1> + <hr /> + </header> + + <div class="post-content"> + {{ content }} + + {% assign p_array = "" | split:"|" %} + {% for project in site.project %} + {% capture p_slug %}{{ project.url | split:"/" | last }},{{ project.url }}{% endcapture %} + {% assign p_slug_arr = p_slug | split:"," %} + {% assign p_array = p_array | push: p_slug_arr %} + {% endfor %} + + <div class="projects"> + {% include project_tags.html %} + {% for i in site.data.projects %} + <div class="project-item project-outer" data-tags='{{ i.tags | jsonify | downcase }}'> + <div class="project-inner"> + <a href="/static/projects/{{ i.image }}" class="thickbox"> + <div class="project-img bordered" style="background-image: url('/static/projects/{{ i.image }}');"></div> + </a> + {% assign p_url = nil %} + {% for pr in p_array %} + {% if pr contains i.slug %} + {% assign p_url = pr[1] %} + {% endif %} + {% endfor %} + {% if p_url == nil %}{% assign p_url = i.url %}{% endif %} + {% if p_url %}<a href="{{ p_url }}">{% endif %} + <h3 class="project-headlines">{{ i.name }}</h3> + {% if p_url %} </a> {% endif %} + <div class="project-content"> + <div class="tag-holder"> + {% if i.tags %} + {% for j in i.tags %} + <span class="tags tag-filter" data-tag="{{ j | downcase }}"><a href="#">{{ j }}</a></span> + {% endfor %} + {% endif %} + </div> + + </div> + <div class="project-footer"> + {% if i.url %} + <a href="{{ i.url }}" class="project-link">View</a> + {% endif %} + <span class="project-timeline">{{ i.date }}</span> + </div> + </div> + <hr> + </div> + + {% endfor %} + </div> + </div> + +</article> diff --git a/_layouts/project_single.html b/_layouts/project_single.html new file mode 100644 index 0000000000000000000000000000000000000000..100f176da332f675c243e8ac6b7ba16ee8b54305 --- /dev/null +++ b/_layouts/project_single.html @@ -0,0 +1,15 @@ +--- +layout: default +--- +<article class="post"> + + <header class="post-header"> + <h1 class="post-title">{{ page.title }}</h1> + <hr /> + </header> + + <div class="post-content"> + {{ content }} + </div> + +</article> diff --git a/_project/cool-project.md b/_project/cool-project.md new file mode 100644 index 0000000000000000000000000000000000000000..2cca7cb5fb507442e26d5b791b1cb72c617ad0d3 --- /dev/null +++ b/_project/cool-project.md @@ -0,0 +1,5 @@ +--- +layout: project_single +title: "Cool Project" +--- +Just a demo text for now, which signifies there is lot of scope for improvement. \ No newline at end of file diff --git a/projects.md b/projects.md new file mode 100644 index 0000000000000000000000000000000000000000..f1295a87d710f72aae1c02acaa29807c6b8ac579 --- /dev/null +++ b/projects.md @@ -0,0 +1,7 @@ +--- +layout: project +title: Projects +permalink: /projects/ +--- + +Few of my projects. Currently doing more in Android, NodeJS. \ No newline at end of file diff --git a/static/css/main.css b/static/css/main.css index ed5ec619f6747b955cacfca942fc475cb5a24cf8..bc90d766dead6063608019d76342583ae82b1649 100755 --- a/static/css/main.css +++ b/static/css/main.css @@ -193,3 +193,20 @@ div.col-sm-3 img#about { .PageNavigation .prev { text-align: left; } + +.social{ + display: block; + margin: 10px 0; +} +.social ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.social ul li { + display: inline-block; + margin: 0 5px; +} +.social li a { + font-size: 16px; +} diff --git a/static/css/projects.css b/static/css/projects.css new file mode 100644 index 0000000000000000000000000000000000000000..68098831a7382688db82b0f1f9e1beab243216b9 --- /dev/null +++ b/static/css/projects.css @@ -0,0 +1,71 @@ +/** + * ////////////////////////////////// + * Project Elements + * ////////////////////////////////// + */ +.project-outer { + display: inline-block; + width: 30%; + vertical-align: top; + margin: 0 10px; +} +.project-img img { + width: 100%; +} +h3.project-headlines { + margin: 5px 0; + font-size: 20px; + border-bottom: 1px #EEE solid; +} +span.tags { + font-size: 10px; + border-bottom: 1px #888 dotted; + margin: 0 5px; +} +span.tags:first-child{ margin-left: 0; } +span.tags:last-child{ margin-right: 0; } + +.project-footer { + clear: both; + display: inline-block; + width: 100%; +} +.project-footer .project-link { + display: inline-block; + position: relative; + float: left; +} +.project-footer .project-timeline { + display: inline-block; + position: relative; + float: right; + font-size: 13px; + font-style: italic; +} +.project-inner > a { + display: block; +} +.project-img { + width: 230px; + height: 200px; + display: block; + background-size: cover; + background-repeat: no-repeat; + background-position: center center; +} +/** Project Tag Filters **/ +.tag-group{ + margin: 0 0 25px 0; +} +span.tag-cloud { + margin: 0 2px; + cursor: pointer; + font-size: 75%; + padding: .2em .6em .3em; + font-weight: 700; + display: inline; +} +.tag-cloud.active{ + background: #ccc; +} +.project-item.not-show{ display: none; } \ No newline at end of file diff --git a/static/css/thickbox.css b/static/css/thickbox.css new file mode 100644 index 0000000000000000000000000000000000000000..7f2b61559c3900e1402b1725a00445e13264bc99 --- /dev/null +++ b/static/css/thickbox.css @@ -0,0 +1,163 @@ +/* ----------------------------------------------------------------------------------------------------------------*/ +/* ---------->>> global settings needed for thickbox <<<-----------------------------------------------------------*/ +/* ----------------------------------------------------------------------------------------------------------------*/ +*{padding: 0; margin: 0;} + +/* ----------------------------------------------------------------------------------------------------------------*/ +/* ---------->>> thickbox specific link and font settings <<<------------------------------------------------------*/ +/* ----------------------------------------------------------------------------------------------------------------*/ +#TB_window { + font: 12px Arial, Helvetica, sans-serif; + color: #333333; +} + +#TB_secondLine { + font: 10px Arial, Helvetica, sans-serif; + color:#666666; +} + +#TB_window a:link {color: #666666;} +#TB_window a:visited {color: #666666;} +#TB_window a:hover {color: #000;} +#TB_window a:active {color: #666666;} +#TB_window a:focus{color: #666666;} + +/* ----------------------------------------------------------------------------------------------------------------*/ +/* ---------->>> thickbox settings <<<-----------------------------------------------------------------------------*/ +/* ----------------------------------------------------------------------------------------------------------------*/ +#TB_overlay { + position: fixed; + z-index:100; + top: 0px; + left: 0px; + height:100%; + width:100%; +} + +.TB_overlayMacFFBGHack {background: url(/static/img/macFFBgHack.png) repeat;} +.TB_overlayBG { + background-color:#000; + filter:alpha(opacity=75); + -moz-opacity: 0.75; + opacity: 0.75; +} + +* html #TB_overlay { /* ie6 hack */ + position: absolute; + height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); +} + +#TB_window { + position: fixed; + background: #ffffff; + z-index: 102; + color:#000000; + display:none; + border: 4px solid #525252; + text-align:left; + top:50%; + left:50%; +} + +* html #TB_window { /* ie6 hack */ +position: absolute; +margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); +} + +#TB_window img#TB_Image { + display:block; + margin: 15px 0 0 15px; + border-right: 1px solid #ccc; + border-bottom: 1px solid #ccc; + border-top: 1px solid #666; + border-left: 1px solid #666; +} + +#TB_caption{ + height:25px; + padding:7px 30px 10px 25px; + float:left; +} + +#TB_closeWindow{ + height:25px; + padding:11px 25px 10px 0; + float:right; +} + +#TB_closeAjaxWindow{ + padding:7px 10px 5px 0; + margin-bottom:1px; + text-align:right; + float:right; +} + +#TB_ajaxWindowTitle{ + float:left; + padding:7px 0 5px 10px; + margin-bottom:1px; +} + +#TB_title{ + background-color:#e8e8e8; + height:27px; +} + +#TB_ajaxContent{ + clear:both; + padding:2px 15px 15px 15px; + overflow:auto; + text-align:left; + line-height:1.4em; +} + +#TB_ajaxContent.TB_modal{ + padding:15px; +} + +#TB_ajaxContent p{ + padding:5px 0px 5px 0px; +} + +#TB_load{ + position: fixed; + display:none; + height:13px; + width:208px; + z-index:103; + top: 50%; + left: 50%; + margin: -6px 0 0 -104px; /* -height/2 0 0 -width/2 */ +} + +* html #TB_load { /* ie6 hack */ +position: absolute; +margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); +} + +#TB_HideSelect{ + z-index:99; + position:fixed; + top: 0; + left: 0; + background-color:#fff; + border:none; + filter:alpha(opacity=0); + -moz-opacity: 0; + opacity: 0; + height:100%; + width:100%; +} + +* html #TB_HideSelect { /* ie6 hack */ + position: absolute; + height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); +} + +#TB_iframeContent{ + clear:both; + border:none; + margin-bottom:-1px; + margin-top:1px; + _margin-bottom:1px; +} diff --git a/static/img/loadingAnimation.gif b/static/img/loadingAnimation.gif new file mode 100644 index 0000000000000000000000000000000000000000..82290f48334c81272ff5991962951758137a08ba Binary files /dev/null and b/static/img/loadingAnimation.gif differ diff --git a/static/img/macFFBgHack.png b/static/img/macFFBgHack.png new file mode 100644 index 0000000000000000000000000000000000000000..c6473b324ee1dae1faaacc0826639833f551116c Binary files /dev/null and b/static/img/macFFBgHack.png differ diff --git a/static/js/projects.js b/static/js/projects.js new file mode 100644 index 0000000000000000000000000000000000000000..3587591117728c3faba6db58df6b75f6e8e8e051 --- /dev/null +++ b/static/js/projects.js @@ -0,0 +1,41 @@ +(function($){ + $(document).ready(function(){ + $(document).on('click','.tag-filter',function(){ + var $this = $(this); + + $('span.tag-filter').removeClass("active"); + $this.addClass("active"); + + + $('.tag-group').children().each(function(){ + if( $(this).data('tag') == $this.data('tag')){ + $(this).addClass("active"); + } + }); + + if( $(this).hasClass('all')) + $('.project-item').showAll(); + else + $('.project-item').filterTags( $(this).data('tag') ); + }); + }); + + $.fn.extend({ + filterTags: function(tagName) { + this.removeClass('not-show'); + return this.each(function() { + var itemTagArray = JSON.parse( $(this).attr('data-tags') ); + if($.inArray(tagName, itemTagArray) === -1){ + $(this).addClass('not-show'); + } + }); + }, + showAll: function(){ + return this.each(function() { + if($(this).hasClass('not-show')){ + $(this).removeClass('not-show'); + } + }); + } + }); +})(jQuery) \ No newline at end of file diff --git a/static/js/thickbox-compressed.js b/static/js/thickbox-compressed.js new file mode 100644 index 0000000000000000000000000000000000000000..ea405f2c9b1c64984fd98bc2fe9aeafc6010fc9c --- /dev/null +++ b/static/js/thickbox-compressed.js @@ -0,0 +1,10 @@ +/* + * Thickbox 3 - One Box To Rule Them All. + * By Cody Lindley (http://www.codylindley.com) + * Copyright (c) 2007 cody lindley + * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php +*/ + +var tb_pathToImage = "/static/img/loadingAnimation.gif"; + +eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('$(o).2S(9(){1u(\'a.18, 3n.18, 3i.18\');1w=1p 1t();1w.L=2H});9 1u(b){$(b).s(9(){6 t=X.Q||X.1v||M;6 a=X.u||X.23;6 g=X.1N||P;19(t,a,g);X.2E();H P})}9 19(d,f,g){3m{3(2t o.v.J.2i==="2g"){$("v","11").r({A:"28%",z:"28%"});$("11").r("22","2Z");3(o.1Y("1F")===M){$("v").q("<U 5=\'1F\'></U><4 5=\'B\'></4><4 5=\'8\'></4>");$("#B").s(G)}}n{3(o.1Y("B")===M){$("v").q("<4 5=\'B\'></4><4 5=\'8\'></4>");$("#B").s(G)}}3(1K()){$("#B").1J("2B")}n{$("#B").1J("2z")}3(d===M){d=""}$("v").q("<4 5=\'K\'><1I L=\'"+1w.L+"\' /></4>");$(\'#K\').2y();6 h;3(f.O("?")!==-1){h=f.3l(0,f.O("?"))}n{h=f}6 i=/\\.2s$|\\.2q$|\\.2m$|\\.2l$|\\.2k$/;6 j=h.1C().2h(i);3(j==\'.2s\'||j==\'.2q\'||j==\'.2m\'||j==\'.2l\'||j==\'.2k\'){1D="";1G="";14="";1z="";1x="";R="";1n="";1r=P;3(g){E=$("a[@1N="+g+"]").36();25(D=0;((D<E.1c)&&(R===""));D++){6 k=E[D].u.1C().2h(i);3(!(E[D].u==f)){3(1r){1z=E[D].Q;1x=E[D].u;R="<1e 5=\'1X\'>&1d;&1d;<a u=\'#\'>2T &2R;</a></1e>"}n{1D=E[D].Q;1G=E[D].u;14="<1e 5=\'1U\'>&1d;&1d;<a u=\'#\'>&2O; 2N</a></1e>"}}n{1r=1b;1n="1t "+(D+1)+" 2L "+(E.1c)}}}S=1p 1t();S.1g=9(){S.1g=M;6 a=2x();6 x=a[0]-1M;6 y=a[1]-1M;6 b=S.z;6 c=S.A;3(b>x){c=c*(x/b);b=x;3(c>y){b=b*(y/c);c=y}}n 3(c>y){b=b*(y/c);c=y;3(b>x){c=c*(x/b);b=x}}13=b+30;1a=c+2G;$("#8").q("<a u=\'\' 5=\'1L\' Q=\'1o\'><1I 5=\'2F\' L=\'"+f+"\' z=\'"+b+"\' A=\'"+c+"\' 23=\'"+d+"\'/></a>"+"<4 5=\'2D\'>"+d+"<4 5=\'2C\'>"+1n+14+R+"</4></4><4 5=\'2A\'><a u=\'#\' 5=\'Z\' Q=\'1o\'>1l</a> 1k 1j 1s</4>");$("#Z").s(G);3(!(14==="")){9 12(){3($(o).N("s",12)){$(o).N("s",12)}$("#8").C();$("v").q("<4 5=\'8\'></4>");19(1D,1G,g);H P}$("#1U").s(12)}3(!(R==="")){9 1i(){$("#8").C();$("v").q("<4 5=\'8\'></4>");19(1z,1x,g);H P}$("#1X").s(1i)}o.1h=9(e){3(e==M){I=2w.2v}n{I=e.2u}3(I==27){G()}n 3(I==3k){3(!(R=="")){o.1h="";1i()}}n 3(I==3j){3(!(14=="")){o.1h="";12()}}};16();$("#K").C();$("#1L").s(G);$("#8").r({Y:"T"})};S.L=f}n{6 l=f.2r(/^[^\\?]+\\??/,\'\');6 m=2p(l);13=(m[\'z\']*1)+30||3h;1a=(m[\'A\']*1)+3g||3f;W=13-30;V=1a-3e;3(f.O(\'2j\')!=-1){1E=f.1B(\'3d\');$("#15").C();3(m[\'1A\']!="1b"){$("#8").q("<4 5=\'2f\'><4 5=\'1H\'>"+d+"</4><4 5=\'2e\'><a u=\'#\' 5=\'Z\' Q=\'1o\'>1l</a> 1k 1j 1s</4></4><U 1W=\'0\' 2d=\'0\' L=\'"+1E[0]+"\' 5=\'15\' 1v=\'15"+1f.2c(1f.1y()*2b)+"\' 1g=\'1m()\' J=\'z:"+(W+29)+"p;A:"+(V+17)+"p;\' > </U>")}n{$("#B").N();$("#8").q("<U 1W=\'0\' 2d=\'0\' L=\'"+1E[0]+"\' 5=\'15\' 1v=\'15"+1f.2c(1f.1y()*2b)+"\' 1g=\'1m()\' J=\'z:"+(W+29)+"p;A:"+(V+17)+"p;\'> </U>")}}n{3($("#8").r("Y")!="T"){3(m[\'1A\']!="1b"){$("#8").q("<4 5=\'2f\'><4 5=\'1H\'>"+d+"</4><4 5=\'2e\'><a u=\'#\' 5=\'Z\'>1l</a> 1k 1j 1s</4></4><4 5=\'F\' J=\'z:"+W+"p;A:"+V+"p\'></4>")}n{$("#B").N();$("#8").q("<4 5=\'F\' 3c=\'3b\' J=\'z:"+W+"p;A:"+V+"p;\'></4>")}}n{$("#F")[0].J.z=W+"p";$("#F")[0].J.A=V+"p";$("#F")[0].3a=0;$("#1H").11(d)}}$("#Z").s(G);3(f.O(\'37\')!=-1){$("#F").q($(\'#\'+m[\'26\']).1T());$("#8").24(9(){$(\'#\'+m[\'26\']).q($("#F").1T())});16();$("#K").C();$("#8").r({Y:"T"})}n 3(f.O(\'2j\')!=-1){16();3($.1q.35){$("#K").C();$("#8").r({Y:"T"})}}n{$("#F").34(f+="&1y="+(1p 33().32()),9(){16();$("#K").C();1u("#F a.18");$("#8").r({Y:"T"})})}}3(!m[\'1A\']){o.21=9(e){3(e==M){I=2w.2v}n{I=e.2u}3(I==27){G()}}}}31(e){}}9 1m(){$("#K").C();$("#8").r({Y:"T"})}9 G(){$("#2Y").N("s");$("#Z").N("s");$("#8").2X("2W",9(){$(\'#8,#B,#1F\').2V("24").N().C()});$("#K").C();3(2t o.v.J.2i=="2g"){$("v","11").r({A:"1Z",z:"1Z"});$("11").r("22","")}o.1h="";o.21="";H P}9 16(){$("#8").r({2U:\'-\'+20((13/2),10)+\'p\',z:13+\'p\'});3(!(1V.1q.2Q&&1V.1q.2P<7)){$("#8").r({38:\'-\'+20((1a/2),10)+\'p\'})}}9 2p(a){6 b={};3(!a){H b}6 c=a.1B(/[;&]/);25(6 i=0;i<c.1c;i++){6 d=c[i].1B(\'=\');3(!d||d.1c!=2){39}6 e=2a(d[0]);6 f=2a(d[1]);f=f.2r(/\\+/g,\' \');b[e]=f}H b}9 2x(){6 a=o.2M;6 w=1S.2o||1R.2o||(a&&a.1Q)||o.v.1Q;6 h=1S.1P||1R.1P||(a&&a.2n)||o.v.2n;1O=[w,h];H 1O}9 1K(){6 a=2K.2J.1C();3(a.O(\'2I\')!=-1&&a.O(\'3o\')!=-1){H 1b}}',62,211,'|||if|div|id|var||TB_window|function||||||||||||||else|document|px|append|css|click||href|body||||width|height|TB_overlay|remove|TB_Counter|TB_TempArray|TB_ajaxContent|tb_remove|return|keycode|style|TB_load|src|null|unbind|indexOf|false|title|TB_NextHTML|imgPreloader|block|iframe|ajaxContentH|ajaxContentW|this|display|TB_closeWindowButton||html|goPrev|TB_WIDTH|TB_PrevHTML|TB_iframeContent|tb_position||thickbox|tb_show|TB_HEIGHT|true|length|nbsp|span|Math|onload|onkeydown|goNext|Esc|or|close|tb_showIframe|TB_imageCount|Close|new|browser|TB_FoundURL|Key|Image|tb_init|name|imgLoader|TB_NextURL|random|TB_NextCaption|modal|split|toLowerCase|TB_PrevCaption|urlNoQuery|TB_HideSelect|TB_PrevURL|TB_ajaxWindowTitle|img|addClass|tb_detectMacXFF|TB_ImageOff|150|rel|arrayPageSize|innerHeight|clientWidth|self|window|children|TB_prev|jQuery|frameborder|TB_next|getElementById|auto|parseInt|onkeyup|overflow|alt|unload|for|inlineId||100||unescape|1000|round|hspace|TB_closeAjaxWindow|TB_title|undefined|match|maxHeight|TB_iframe|bmp|gif|png|clientHeight|innerWidth|tb_parseQuery|jpeg|replace|jpg|typeof|which|keyCode|event|tb_getPageSize|show|TB_overlayBG|TB_closeWindow|TB_overlayMacFFBGHack|TB_secondLine|TB_caption|blur|TB_Image|60|tb_pathToImage|mac|userAgent|navigator|of|documentElement|Prev|lt|version|msie|gt|ready|Next|marginLeft|trigger|fast|fadeOut|TB_imageOff|hidden||catch|getTime|Date|load|safari|get|TB_inline|marginTop|continue|scrollTop|TB_modal|class|TB_|45|440|40|630|input|188|190|substr|try|area|firefox'.split('|'),0,{})) \ No newline at end of file diff --git a/static/projects/placeholder.jpg b/static/projects/placeholder.jpg new file mode 100644 index 0000000000000000000000000000000000000000..241b755030dcaf0f950d9b22b9465ab3a5393cb1 Binary files /dev/null and b/static/projects/placeholder.jpg differ