/* Author: Rune Botten <rbotten@gmail.com>
Copyright (c) 2011 Scandinavian Design Group

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
(function(){function d(c,b){if(!a.translations)return"Missing translations";if(!a.locale)return"Locale not set";if(a.translations[a.locale]){var e=a.translations[a.locale][c];return e?e:b?b:"Missing translation for '"+c+"'"}else return b?b:"Missing translations for locale '"+a.locale+"'"}var a={};a.setLocale=function(c){a.locale=c};a.translate=d;a.translatePage=function(){$(":[data-translation]").each(function(c,b){$(b).text(d($(b).attr("data-translation")))})};window.I18N=a})();

/* Underscore.js 1.1.4
(c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
Underscore is freely distributable under the MIT license.
Portions of Underscore are inspired or borrowed from Prototype,
Oliver Steele's Functional, and John Resig's Micro-Templating.
For all details and documentation:
http://documentcloud.github.com/underscore */
(function(){var q=this,C=q._,m={},j=Array.prototype,n=Object.prototype,i=j.slice,D=j.unshift,E=n.toString,o=n.hasOwnProperty,s=j.forEach,t=j.map,u=j.reduce,v=j.reduceRight,w=j.filter,x=j.every,y=j.some,p=j.indexOf,z=j.lastIndexOf;n=Array.isArray;var F=Object.keys,c=function(a){return new l(a)};if(typeof module!=="undefined"&&module.exports){module.exports=c;c._=c}else q._=c;c.VERSION="1.1.4";var k=c.each=c.forEach=function(a,b,d){if(a!=null)if(s&&a.forEach===s)a.forEach(b,d);else if(c.isNumber(a.length))for(var e=
0,f=a.length;e<f;e++){if(b.call(d,a[e],e,a)===m)break}else for(e in a)if(o.call(a,e))if(b.call(d,a[e],e,a)===m)break};c.map=function(a,b,d){var e=[];if(a==null)return e;if(t&&a.map===t)return a.map(b,d);k(a,function(f,g,h){e[e.length]=b.call(d,f,g,h)});return e};c.reduce=c.foldl=c.inject=function(a,b,d,e){var f=d!==void 0;if(a==null)a=[];if(u&&a.reduce===u){if(e)b=c.bind(b,e);return f?a.reduce(b,d):a.reduce(b)}k(a,function(g,h,G){if(!f&&h===0){d=g;f=true}else d=b.call(e,d,g,h,G)});if(!f)throw new TypeError("Reduce of empty array with no initial value");
return d};c.reduceRight=c.foldr=function(a,b,d,e){if(a==null)a=[];if(v&&a.reduceRight===v){if(e)b=c.bind(b,e);return d!==void 0?a.reduceRight(b,d):a.reduceRight(b)}a=(c.isArray(a)?a.slice():c.toArray(a)).reverse();return c.reduce(a,b,d,e)};c.find=c.detect=function(a,b,d){var e;A(a,function(f,g,h){if(b.call(d,f,g,h)){e=f;return true}});return e};c.filter=c.select=function(a,b,d){var e=[];if(a==null)return e;if(w&&a.filter===w)return a.filter(b,d);k(a,function(f,g,h){if(b.call(d,f,g,h))e[e.length]=
f});return e};c.reject=function(a,b,d){var e=[];if(a==null)return e;k(a,function(f,g,h){b.call(d,f,g,h)||(e[e.length]=f)});return e};c.every=c.all=function(a,b,d){b=b||c.identity;var e=true;if(a==null)return e;if(x&&a.every===x)return a.every(b,d);k(a,function(f,g,h){if(!(e=e&&b.call(d,f,g,h)))return m});return e};var A=c.some=c.any=function(a,b,d){b=b||c.identity;var e=false;if(a==null)return e;if(y&&a.some===y)return a.some(b,d);k(a,function(f,g,h){if(e=b.call(d,f,g,h))return m});return e};c.include=
c.contains=function(a,b){var d=false;if(a==null)return d;if(p&&a.indexOf===p)return a.indexOf(b)!=-1;A(a,function(e){if(d=e===b)return true});return d};c.invoke=function(a,b){var d=i.call(arguments,2);return c.map(a,function(e){return(b?e[b]:e).apply(e,d)})};c.pluck=function(a,b){return c.map(a,function(d){return d[b]})};c.max=function(a,b,d){if(!b&&c.isArray(a))return Math.max.apply(Math,a);var e={computed:-Infinity};k(a,function(f,g,h){g=b?b.call(d,f,g,h):f;g>=e.computed&&(e={value:f,computed:g})});
return e.value};c.min=function(a,b,d){if(!b&&c.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};k(a,function(f,g,h){g=b?b.call(d,f,g,h):f;g<e.computed&&(e={value:f,computed:g})});return e.value};c.sortBy=function(a,b,d){return c.pluck(c.map(a,function(e,f,g){return{value:e,criteria:b.call(d,e,f,g)}}).sort(function(e,f){var g=e.criteria,h=f.criteria;return g<h?-1:g>h?1:0}),"value")};c.sortedIndex=function(a,b,d){d=d||c.identity;for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(b)?
e=g+1:f=g}return e};c.toArray=function(a){if(!a)return[];if(a.toArray)return a.toArray();if(c.isArray(a))return a;if(c.isArguments(a))return i.call(a);return c.values(a)};c.size=function(a){return c.toArray(a).length};c.first=c.head=function(a,b,d){return b&&!d?i.call(a,0,b):a[0]};c.rest=c.tail=function(a,b,d){return i.call(a,c.isUndefined(b)||d?1:b)};c.last=function(a){return a[a.length-1]};c.compact=function(a){return c.filter(a,function(b){return!!b})};c.flatten=function(a){return c.reduce(a,function(b,
d){if(c.isArray(d))return b.concat(c.flatten(d));b[b.length]=d;return b},[])};c.without=function(a){var b=i.call(arguments,1);return c.filter(a,function(d){return!c.include(b,d)})};c.uniq=c.unique=function(a,b){return c.reduce(a,function(d,e,f){if(0==f||(b===true?c.last(d)!=e:!c.include(d,e)))d[d.length]=e;return d},[])};c.intersect=function(a){var b=i.call(arguments,1);return c.filter(c.uniq(a),function(d){return c.every(b,function(e){return c.indexOf(e,d)>=0})})};c.zip=function(){for(var a=i.call(arguments),
b=c.max(c.pluck(a,"length")),d=Array(b),e=0;e<b;e++)d[e]=c.pluck(a,""+e);return d};c.indexOf=function(a,b,d){if(a==null)return-1;if(d){d=c.sortedIndex(a,b);return a[d]===b?d:-1}if(p&&a.indexOf===p)return a.indexOf(b);d=0;for(var e=a.length;d<e;d++)if(a[d]===b)return d;return-1};c.lastIndexOf=function(a,b){if(a==null)return-1;if(z&&a.lastIndexOf===z)return a.lastIndexOf(b);for(var d=a.length;d--;)if(a[d]===b)return d;return-1};c.range=function(a,b,d){var e=i.call(arguments),f=e.length<=1;a=f?0:e[0];
b=f?e[0]:e[1];d=e[2]||1;e=Math.max(Math.ceil((b-a)/d),0);f=0;for(var g=Array(e);f<e;){g[f++]=a;a+=d}return g};c.bind=function(a,b){var d=i.call(arguments,2);return function(){return a.apply(b||{},d.concat(i.call(arguments)))}};c.bindAll=function(a){var b=i.call(arguments,1);if(b.length==0)b=c.functions(a);k(b,function(d){a[d]=c.bind(a[d],a)});return a};c.memoize=function(a,b){var d={};b=b||c.identity;return function(){var e=b.apply(this,arguments);return e in d?d[e]:d[e]=a.apply(this,arguments)}};
c.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};c.defer=function(a){return c.delay.apply(c,[a,1].concat(i.call(arguments,1)))};var B=function(a,b,d){var e;return function(){var f=this,g=arguments,h=function(){e=null;a.apply(f,g)};d&&clearTimeout(e);if(d||!e)e=setTimeout(h,b)}};c.throttle=function(a,b){return B(a,b,false)};c.debounce=function(a,b){return B(a,b,true)};c.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments));return b.apply(this,
d)}};c.compose=function(){var a=i.call(arguments);return function(){for(var b=i.call(arguments),d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};c.keys=F||function(a){if(c.isArray(a))return c.range(0,a.length);var b=[],d;for(d in a)if(o.call(a,d))b[b.length]=d;return b};c.values=function(a){return c.map(a,c.identity)};c.functions=c.methods=function(a){return c.filter(c.keys(a),function(b){return c.isFunction(a[b])}).sort()};c.extend=function(a){k(i.call(arguments,1),function(b){for(var d in b)a[d]=
b[d]});return a};c.clone=function(a){return c.isArray(a)?a.slice():c.extend({},a)};c.tap=function(a,b){b(a);return a};c.isEqual=function(a,b){if(a===b)return true;var d=typeof a;if(d!=typeof b)return false;if(a==b)return true;if(!a&&b||a&&!b)return false;if(a._chain)a=a._wrapped;if(b._chain)b=b._wrapped;if(a.isEqual)return a.isEqual(b);if(c.isDate(a)&&c.isDate(b))return a.getTime()===b.getTime();if(c.isNaN(a)&&c.isNaN(b))return false;if(c.isRegExp(a)&&c.isRegExp(b))return a.source===b.source&&a.global===
b.global&&a.ignoreCase===b.ignoreCase&&a.multiline===b.multiline;if(d!=="object")return false;if(a.length&&a.length!==b.length)return false;d=c.keys(a);var e=c.keys(b);if(d.length!=e.length)return false;for(var f in a)if(!(f in b)||!c.isEqual(a[f],b[f]))return false;return true};c.isEmpty=function(a){if(c.isArray(a)||c.isString(a))return a.length===0;for(var b in a)if(o.call(a,b))return false;return true};c.isElement=function(a){return!!(a&&a.nodeType==1)};c.isArray=n||function(a){return E.call(a)===
"[object Array]"};c.isArguments=function(a){return!!(a&&o.call(a,"callee"))};c.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};c.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};c.isNumber=function(a){return!!(a===0||a&&a.toExponential&&a.toFixed)};c.isNaN=function(a){return a!==a};c.isBoolean=function(a){return a===true||a===false};c.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};c.isRegExp=function(a){return!!(a&&a.test&&a.exec&&(a.ignoreCase||
a.ignoreCase===false))};c.isNull=function(a){return a===null};c.isUndefined=function(a){return a===void 0};c.noConflict=function(){q._=C;return this};c.identity=function(a){return a};c.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};c.mixin=function(a){k(c.functions(a),function(b){H(b,c[b]=a[b])})};var I=0;c.uniqueId=function(a){var b=I++;return a?a+b:b};c.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g};c.template=function(a,b){var d=c.templateSettings;d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+
a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.interpolate,function(e,f){return"',"+f.replace(/\\'/g,"'")+",'"}).replace(d.evaluate||null,function(e,f){return"');"+f.replace(/\\'/g,"'").replace(/[\r\n\t]/g," ")+"__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');";d=new Function("obj",d);return b?d(b):d};var l=function(a){this._wrapped=a};c.prototype=l.prototype;var r=function(a,b){return b?c(a).chain():a},H=function(a,b){l.prototype[a]=function(){var d=
i.call(arguments);D.call(d,this._wrapped);return r(b.apply(c,d),this._chain)}};c.mixin(c);k(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var b=j[a];l.prototype[a]=function(){b.apply(this._wrapped,arguments);return r(this._wrapped,this._chain)}});k(["concat","join","slice"],function(a){var b=j[a];l.prototype[a]=function(){return r(b.apply(this._wrapped,arguments),this._chain)}});l.prototype.chain=function(){this._chain=true;return this};l.prototype.value=function(){return this._wrapped}})();

/* Markdown */
var Showdown={};Showdown.converter=function(){var s;var r;var p;var n=0;this.makeHtml=function(H){s=new Array();r=new Array();p=new Array();H=H.replace(/~/g,"~T");H=H.replace(/\$/g,"~D");H=H.replace(/\r\n/g,"\n");H=H.replace(/\r/g,"\n");H="\n\n"+H+"\n\n";H=k(H);H=H.replace(/^[ \t]+$/mg,"");H=i(H);H=h(H);H=g(H);H=q(H);H=H.replace(/~D/g,"$$");H=H.replace(/~T/g,"~");return H};var h=function(H){var H=H.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|\Z)/gm,function(L,M,K,J,I){M=M.toLowerCase();s[M]=l(K);if(J){return J+I}else{if(I){r[M]=I.replace(/"/g,"&quot;")}}return""});return H};var i=function(J){J=J.replace(/\n/g,"\n\n");var I="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del";var H="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math";J=J.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,d);J=J.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm,d);J=J.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,d);J=J.replace(/(\n\n[ ]{0,3}<!(--[^\r]*?--\s*)+>[ \t]*(?=\n{2,}))/g,d);J=J.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,d);J=J.replace(/\n\n/g,"\n");return J};var d=function(J,I){var H=I;H=H.replace(/\n\n/g,"\n");H=H.replace(/^\n/,"");H=H.replace(/\n+$/g,"");H="\n\n~K"+(p.push(H)-1)+"K\n\n";return H};var g=function(H){H=j(H);var I=f("<hr />");H=H.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,I);H=H.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,I);H=H.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,I);H=e(H);H=c(H);H=a(H);H=i(H);H=D(H);return H};var C=function(H){H=B(H);H=A(H);H=z(H);H=y(H);H=v(H);H=u(H);H=l(H);H=t(H);H=H.replace(/ +\n/g," <br />\n");return H};var A=function(I){var H=/(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|<!(--.*?--\s*)+>)/gi;I=I.replace(H,function(K){var J=K.replace(/(.)<\/?code>(?=.)/g,"$1`");J=x(J,"\\`*_");return J});return I};var v=function(H){H=H.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,G);H=H.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?(.*?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,G);H=H.replace(/(\[([^\[\]]+)\])()()()()()/g,G);return H};var G=function(Q,U,T,S,R,P,O,N){if(N==undefined){N=""}var I=U;var M=T;var L=S.toLowerCase();var H=R;var K=N;if(H==""){if(L==""){L=M.toLowerCase().replace(/ ?\n/g," ")}H="#"+L;if(s[L]!=undefined){H=s[L];if(r[L]!=undefined){K=r[L]}}else{if(I.search(/\(\s*\)$/m)>-1){H=""}else{return I}}}H=x(H,"*_");var J='<a href="'+H+'"';if(K!=""){K=K.replace(/"/g,"&quot;");K=x(K,"*_");J+=' title="'+K+'"'}J+=">"+M+"</a>";return J};var y=function(H){H=H.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,o);H=H.replace(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,o);return H};var o=function(N,U,T,S,R,Q,P,O){var I=U;var M=T;var L=S.toLowerCase();var H=R;var K=O;if(!K){K=""}if(H==""){if(L==""){L=M.toLowerCase().replace(/ ?\n/g," ")}H="#"+L;if(s[L]!=undefined){H=s[L];if(r[L]!=undefined){K=r[L]}}else{return I}}M=M.replace(/"/g,"&quot;");H=x(H,"*_");var J='<img src="'+H+'" alt="'+M+'"';K=K.replace(/"/g,"&quot;");K=x(K,"*_");J+=' title="'+K+'"';J+=" />";return J};var j=function(H){H=H.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm,function(J,I){return f("<h1>"+C(I)+"</h1>")});H=H.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,function(J,I){return f("<h2>"+C(I)+"</h2>")});H=H.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm,function(L,K,J){var I=K.length;return f("<h"+I+">"+C(J)+"</h"+I+">")});return H};var w;var e=function(I){I+="~0";var H=/^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;if(n){I=I.replace(H,function(J,L,K){var O=L;var M=(K.search(/[*+-]/g)>-1)?"ul":"ol";O=O.replace(/\n{2,}/g,"\n\n\n");var N=w(O);N=N.replace(/\s+$/,"");N="<"+M+">"+N+"</"+M+">\n";return N})}else{H=/(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g;I=I.replace(H,function(Q,O,M,K){var P=O;var N=M;var L=(K.search(/[*+-]/g)>-1)?"ul":"ol";var N=N.replace(/\n{2,}/g,"\n\n\n");var J=w(N);J=P+"<"+L+">\n"+J+"</"+L+">\n";return J})}I=I.replace(/~0/,"");return I};w=function(H){n++;H=H.replace(/\n{2,}$/,"\n");H+="~0";H=H.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm,function(N,M,L,K,J){var P=J;var I=M;var O=L;if(I||(P.search(/\n{2,}/)>-1)){P=g(m(P))}else{P=e(m(P));P=P.replace(/\n$/,"");P=C(P)}return"<li>"+P+"</li>\n"});H=H.replace(/~0/g,"");n--;return H};var c=function(H){H+="~0";H=H.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,function(M,K,I){var L=K;var J=I;L=b(m(L));L=k(L);L=L.replace(/^\n+/g,"");L=L.replace(/\n+$/g,"");L="<pre><code>"+L+"\n</code></pre>";return f(L)+J});H=H.replace(/~0/,"");return H};var f=function(H){H=H.replace(/(^\n+|\n+$)/g,"");return"\n\n~K"+(p.push(H)-1)+"K\n\n"};var B=function(H){H=H.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(M,L,K,J,I){var N=J;N=N.replace(/^([ \t]*)/g,"");N=N.replace(/[ \t]*$/g,"");N=b(N);return L+"<code>"+N+"</code>"});return H};var b=function(H){H=H.replace(/&/g,"&amp;");H=H.replace(/</g,"&lt;");H=H.replace(/>/g,"&gt;");H=x(H,"*_{}[]\\",false);return H};var t=function(H){H=H.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,"<strong>$2</strong>");H=H.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,"<em>$2</em>");return H};var a=function(H){H=H.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,function(K,I){var J=I;J=J.replace(/^[ \t]*>[ \t]?/gm,"~0");J=J.replace(/~0/g,"");J=J.replace(/^[ \t]+$/gm,"");J=g(J);J=J.replace(/(^|\n)/g,"$1 ");J=J.replace(/(\s*<pre>[^\r]+?<\/pre>)/gm,function(M,L){var N=L;N=N.replace(/^ /mg,"~0");N=N.replace(/~0/g,"");return N});return f("<blockquote>\n"+J+"\n</blockquote>")});return H};var D=function(M){M=M.replace(/^\n+/g,"");M=M.replace(/\n+$/g,"");var L=M.split(/\n{2,}/g);var K=new Array();var H=L.length;for(var J=0;J<H;J++){var N=L[J];if(N.search(/~K(\d+)K/g)>=0){K.push(N)}else{if(N.search(/\S/)>=0){N=C(N);N=N.replace(/^([ \t]*)/g,"<p>");N+="</p>";K.push(N)}}}H=K.length;for(var J=0;J<H;J++){while(K[J].search(/~K(\d+)K/)>=0){var I=p[RegExp.$1];I=I.replace(/\$/g,"$$$$");K[J]=K[J].replace(/~K\d+K/,I)}}return K.join("\n\n")};var l=function(H){H=H.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&amp;");H=H.replace(/<(?![a-z\/?\$!])/gi,"&lt;");return H};var z=function(H){H=H.replace(/\\(\\)/g,F);H=H.replace(/\\([`*_{}\[\]()>#+-.!])/g,F);return H};var u=function(H){H=H.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,'<a href="$1">$1</a>');H=H.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,function(J,I){return E(q(I))});return H};var E=function(H){function J(K){var L="0123456789ABCDEF";var M=K.charCodeAt(0);return(L.charAt(M>>4)+L.charAt(M&15))}var I=[function(K){return"&#"+K.charCodeAt(0)+";"},function(K){return"&#x"+J(K)+";"},function(K){return K}];H="mailto:"+H;H=H.replace(/./g,function(K){if(K=="@"){K=I[Math.floor(Math.random()*2)](K)}else{if(K!=":"){var L=Math.random();K=(L>0.9?I[2](K):L>0.45?I[1](K):I[0](K))}}return K});H='<a href="'+H+'">'+H+"</a>";H=H.replace(/">.+:/g,'">');return H};var q=function(H){H=H.replace(/~E(\d+)E/g,function(K,J){var I=parseInt(J);return String.fromCharCode(I)});return H};var m=function(H){H=H.replace(/^(\t|[ ]{1,4})/gm,"~0");H=H.replace(/~0/g,"");return H};var k=function(H){H=H.replace(/\t(?=\t)/g," ");H=H.replace(/\t/g,"~A~B");H=H.replace(/~B(.+?)~A/g,function(M,K,J){var I=K;var N=4-I.length%4;for(var L=0;L<N;L++){I+=" "}return I});H=H.replace(/~A/g," ");H=H.replace(/~B/g,"");return H};var x=function(K,L,J){var I="(["+L.replace(/([\[\]\\])/g,"\\$1")+"])";if(J){I="\\\\"+I}var H=new RegExp(I,"g");K=K.replace(H,F);return K};var F=function(J,I){var H=I.charCodeAt(0);return"~E"+H+"E"}};

/*(function() {
	// Underscore is loaded; abort!
	if ( window._ )
		return;

	//datefromstring.min.js added by Dotgrid
	var deps = [
		"i18n-1.0.0.min",
		"underscore-1.1.4",
		"markdown"
	];

	for ( var i=0; i < deps.length; i++ )
    	document.write("<script src='js/libs/" + deps[i] + ".js'></script>");
})();*/

if (typeof console == "undefined" || typeof console.log == "undefined") var console = { log: function() {} }; 

$(function() {
	var ID = parseInt(location.search.replace('?p_kp_id=', ''), 10);
	var notavailable = 'Programmet er ikke formattert for mobil-visning. Vennligst se <a href="http://www.teknakurs.no/portal/page/portal/kurs/vis_arrangement?p_kp_id='+ID+'">fullversjonen av nettsidene.</a>';
	var notavailable_en = 'Not available in mobile format. Please see the <a href="http://www.teknakurs.no/portal/page/portal/kurs/vis_arrangement?p_kp_id='+ID+'">full event web page.</a>';

	function dateToTimeString(date) {
		function pad(number) {
			return (number < 10) ? '0' + number : '' + number;
    	}
		return "" + pad(date.getHours()) + ':' + pad(date.getMinutes());
	}

	// Getting data
	var timeouts = {};
	function fetch(resource, fn) {
		$.getJSON(resource, function(json, status) {
			data = json;
			fn(json);
		});
	}

	function getEventProgram(id, callback) {
		//Unsupported browser. Continue at your own risk. (Opera) function() handles error
		google.gdata.client.init(function() {});
		// Create the calendar service object
		var calendarService = new google.gdata.calendar.CalendarService('m.tekna.no');

		// And set the locale based on it
		var locale = 'N';

		// The default "private/full" feed is used to retrieve events from
		// the primary private calendar with full projection
		var feedUri = "https://www.google.com/calendar/feeds/"+id+"/public/full-noattendees";
		var query = new google.gdata.calendar.CalendarEventQuery(feedUri);	
		query.setOrderBy('starttime');
		query.setMaxResults(1000);
		query.setSortOrder('a');

		var days = {
			'N' : ['SÃ¸ndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'LÃ¸rdag'],
			'E' : ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
		};

		var months = {
			'N' : ['Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember'],
			'E' : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
		};

		function eventToDateString(event) {
			var start = event.getTimes()[0].getStartTime().getDate();
			return "" + days[locale][start.getDay()] + ' ' + start.getDate() + ". " + months[locale][start.getMonth()];
		}

		function eventToTimeString(event) {
			var start = event.getTimes()[0].getStartTime().getDate();
			var end   = event.getTimes()[0].getEndTime().getDate();

			var startString = dateToTimeString(start);
			var endString = dateToTimeString(end);

			return (startString == endString) ? startString : startString + '-' + endString;
		}

		// The callback method that will be called when getEventsFeed() returns feed data
		var innercallback = function(result) {

			var entries2 = result.feed.entry;
			console.log('Total of ' + entries2.length + ' event(s)');
			for (var i = 0; i < entries2.length; i++ ) {
				var eventEntry = entries2[i];
				var eventTitle = eventEntry.getTitle().getText();
				console.log('Event title = ' + eventTitle);
			}

			// Obtain the array of CalendarEventEntry
			// and sort them by ascending start time
			var entries = _.sortBy(result.feed.entry, function(entry){
				return entry.getTimes()[0].getStartTime().getDate().getTime();
			});

			var returning = {}, dateString;
			for (var i = 0; i < entries.length; i++ ) {
				var eventEntry = entries[i];
				dateString = eventToDateString(eventEntry);

				if ( returning[dateString] == null )
					returning[dateString] = [];

				returning[dateString].push({
					'timeString'  : eventToTimeString(eventEntry),
					'title' : eventEntry.getTitle().getText(),
					'summary' : eventEntry.getContent().getText()
				});
			}

			// prep array
			var _ref, events, res;
			res = [];
			_ref = returning;
			for ( dateString in _ref ) {
				if ( !Object.prototype.hasOwnProperty.call(_ref, dateString) )
					continue;

				events = _ref[dateString];
				res.push({
					'dateString': dateString,
					'events': events
				});
			}

			callback(res);
		};

		// Error handler to be invoked when getEventsFeed() produces an error
		var handleError = function(error) {
			console.log("Google Calendar error: " + error);
		};

		// Submit the request using the calendar service object
		calendarService.getEventsFeed(query, innercallback, handleError);
	}

	// Load the courses program from Google Calendar, if it has one
	function loadMapAndCalendar() {
		if ( ID ) {
			var url = "/ikbViewer/page/json/kartdata?p_kp_id=" + ID;
			//@Test url. Henter ut json fra fil.
			//var url = 'js/kartdata.json';
			fetch(url, function(json) {
				if ( json != null ) {
					if ( json.kalender ) {
						var getter = function getter() {
							converter = new Showdown.converter();
							getEventProgram(json.kalender + '@group.calendar.google.com', function(result) {
								var html = '<div id="programDiv"><table>';
								$.each(result, function() {
									var classname = 'odd';
									html += '<tr><th colspan="2" class="title">' + this.dateString + '</th></tr>';
									var events = this.events;
									$.each(events, function() {
										if ( classname == 'even' )
											classname = 'odd';
										else
											classname = 'even';
										html += '<tr class="'+classname+'"><td class="date">' + this.timeString + '</td><td class="content"><h3>' + this.title + '</h3><div class="summary"><p>' + converter.makeHtml(this.summary) + '</p></div></td></tr>';
									});
								});
								html += '</table></div>';

								$('div#embed_gcal').html(html);
								$('div#programDiv').fadeIn();
							});
						};

						if ( google.gdata.calendar.CalendarService ) {
							getter();
						}
						else {
							google.setOnLoadCallback(function() {
								getter();
							});
						}
					}
				}
				else {
					$('div#embed_gcal').prepend($('<div />').attr('id', 'programDiv').html('<p>' + notavailable + '</p>').hide());
				}
			});
		}
	}

	loadMapAndCalendar();
});
