PageRenderTime 46ms CodeModel.GetById 2ms app.highlight 29ms RepoModel.GetById 1ms app.codeStats 0ms

/gc.xml

http://gocomics-stage.googlecode.com/
XML | 1538 lines | 1425 code | 110 blank | 3 comment | 0 complexity | d4c0f7c4304a17e8447d81fc78899817 MD5 | raw file
   1<?xml version="1.0" encoding="UTF-8"?>
   2<Module>
   3	<ModulePrefs title="GoComics from Universal Uclick"
   4				 title_url="http://www.gocomics.com"
   5				 author="Universal Uclick"
   6				 author_email="universaluclick@gmail.com"
   7				 description="Get a Laugh each and everyday with the GoComics gadget for iGoogle - giving you access to the 
   8				 			  best and most extensive online comics collection ever compiled! It's the only place to get your
   9				 			  favorites like 'Calvin and Hobbes', 'Garfield', 'Foxtrot', 'Doonesbury' and the newer hits like
  10							  'Lio', 'Pooch Cafe', 'The Argyle Sweater' and 'Cul de Sac'. Build your own personal daily comics
  11							  page and choose from over 200+ Comic Strips. Share comics with your Friends, Favorite those you
  12							  want to see again, and see Comments from other comic fans. Add GoComics to your iGoogle page now
  13							  and start laughing!"
  14				 screenshot="http://images.gocomics.com/images/google/comics_screenshot.jpg"
  15				 thumbnail="http://images.gocomics.com/images/google/gocomics_logo.jpg">
  16		<Require feature="opensocial-0.8"/>
  17		<Require feature="setprefs"/>
  18		<Require feature="views"/>
  19		<Require feature="dynamic-height"/>
  20		<Require feature="minimessage"/>
  21	</ModulePrefs>
  22	
  23	
  24	<!-- H O M E -->
  25	<Content type="html" view="home,profile"><![CDATA[
  26
  27		<style type='text/css'>
  28		  /* http://meyerweb.com/eric/tools/css/reset/ 
  29   v2.0 | 20110126
  30   License: none (public domain)
  31*/
  32
  33html, body, div, span, applet, object, iframe,
  34h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  35a, abbr, acronym, address, big, cite, code,
  36del, dfn, em, img, ins, kbd, q, s, samp,
  37small, strike, strong, sub, sup, tt, var,
  38b, u, i, center,
  39dl, dt, dd, ol, ul, li,
  40fieldset, form, label, legend,
  41table, caption, tbody, tfoot, thead, tr, th, td,
  42article, aside, canvas, details, embed, 
  43figure, figcaption, footer, header, hgroup, 
  44menu, nav, output, ruby, section, summary,
  45time, mark, audio, video {
  46	margin: 0;
  47	padding: 0;
  48	border: 0;
  49	font-size: 100%;
  50	font: inherit;
  51	vertical-align: baseline;
  52}
  53/* HTML5 display-role reset for older browsers */
  54article, aside, details, figcaption, figure, 
  55footer, header, hgroup, menu, nav, section {
  56	display: block;
  57}
  58body {
  59	line-height: 1;
  60}
  61ol, ul {
  62	list-style: none;
  63}
  64blockquote, q {
  65	quotes: none;
  66}
  67blockquote:before, blockquote:after,
  68q:before, q:after {
  69	content: '';
  70	content: none;
  71}
  72table {
  73	border-collapse: collapse;
  74	border-spacing: 0;
  75}
  76		  body {
  77  color: #474747;
  78  font-family: Helvetica, Arial, Verdana, sans-serif;
  79  font-size: 12px; }
  80
  81a {
  82  text-decoration: none;
  83  color: #4a91c1; }
  84
  85a:visited {
  86  color: #4a91c1; }
  87
  88.button, .big-button, .little-button {
  89  border-radius: 5px;
  90  -webkit-border-radius: 5px;
  91  -moz-border-radius: 5px;
  92  color: #FFF;
  93  font-weight: bold;
  94  text-align: center; }
  95
  96.button:visited, .big-button:visited, .little-button:visited {
  97  color: #FFF; }
  98
  99.big-button {
 100  background: #38a3cd;
 101  background: -webkit-gradient(linear, left top, left bottom, from(#8acae1), to(#38a3cd));
 102  background: -moz-linear-gradient(top, #8acae1, #38a3cd);
 103  width: 75px;
 104  display: block;
 105  padding: 6px 10px; }
 106
 107.big-button:hover {
 108  background: #8acae1;
 109  background: -webkit-gradient(linear, left top, left bottom, from(#38a3cd), to(#8acae1));
 110  background: -moz-linear-gradient(top, #38a3cd, #8acae1); }
 111
 112.little-button {
 113  background: #777777;
 114  background: -webkit-gradient(linear, left top, left bottom, from(#888888), to(#777777));
 115  background: -moz-linear-gradient(top, #888888, #777777);
 116  display: inline-block;
 117  width: 150px;
 118  padding: 4px 8px; }
 119
 120.little-button:hover {
 121  background: #888888;
 122  background: -webkit-gradient(linear, left top, left bottom, from(#777777), to(#888888));
 123  background: -moz-linear-gradient(top, #777777, #888888); }
 124
 125.clear {
 126  clear: both; }
 127
 128#home-container {
 129  display: block;
 130  width: 400px; }
 131  #home-container ul {
 132    list-style-type: none;
 133    text-align: center;
 134    width: inherit; }
 135    #home-container ul li {
 136      display: inline-block; }
 137  #home-container ul.feature-navigation {
 138    display: table;
 139    padding: 5px 0px;
 140    border-bottom: 1px solid #AAA; }
 141    #home-container ul.feature-navigation li {
 142      text-align: right;
 143      display: table-cell;
 144      padding-right: 10px;
 145      padding-left: 0px; }
 146    #home-container ul.feature-navigation li:first-child {
 147      padding-right: 0px;
 148      padding-left: 10px;
 149      text-align: left; }
 150  #home-container ul.feature-options {
 151    padding: 5px 0; }
 152
 153#feature {
 154  display: block;
 155  width: 400px; }
 156  #feature h1 {
 157    font-size: 16px;
 158    font-weight: bold;
 159    padding-bottom: 5px; }
 160    #feature h1 span {
 161      font-size: 12px; }
 162    #feature h1 span.date {
 163      float: right;
 164      text-align: right; }
 165  #feature div.feature-image {
 166    margin: 5px auto;
 167    width: 360px;
 168    border: 2px solid #FFF;
 169    padding: 10px;
 170    background: #f2f2f2;
 171    background: -webkit-gradient(linear, left top, left bottom, from(white), to(#f2f2f2));
 172    background: -moz-linear-gradient(top, white, #f2f2f2);
 173    -moz-box-shadow: 0 0 5px 1px #cccccc;
 174    -webkit-box-shadow: 0 0 5px 1px #cccccc;
 175    box-shadow: 0 0 5px 1px #cccccc;
 176    border-radius: 5px;
 177    -webkit-border-radius: 5px;
 178    -moz-border-radius: 5px; }
 179    #feature div.feature-image img {
 180      width: inherit;
 181      cursor: pointer; }
 182
 183		</style>
 184
 185		<div id="home">
 186	<div id="home-container">
 187		<div id="feature"></div>
 188		<ul class="feature-navigation">
 189			<li><a href="#" class="prev little-button">&larr;</a></li>
 190			<li><a href="#" class="next little-button">&rarr;</a></li>
 191		</ul>
 192		<ul class="feature-options">
 193			<li><a href="#" class="pick-comics big-button">Pick Comics</a></li>
 194			<li><a href="#" class="full-size big-button">Full Size</a></li>
 195		</ul>
 196	</div>
 197</div>
 198<script id="feature-template" type="text/mustache-tmpl">
 199	<h1>
 200		{{title}}
 201		<span class="byline">by {{author}}</span>
 202		<span class="date">{{display_date}}</span>
 203	</h1>
 204	<div class="feature-image">
 205		<img src="{{image_link}}" alt="{{title}}" />
 206	</div>
 207</script>
 208
 209		<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
 210		<script type="text/javascript">/*
 211  mustache.js — Logic-less templates in JavaScript
 212
 213  See http://mustache.github.com/ for more info.
 214*/
 215
 216var Mustache = function() {
 217  var Renderer = function() {};
 218
 219  Renderer.prototype = {
 220    otag: "{{",
 221    ctag: "}}",
 222    pragmas: {},
 223    buffer: [],
 224    pragmas_implemented: {
 225      "IMPLICIT-ITERATOR": true
 226    },
 227    context: {},
 228
 229    render: function(template, context, partials, in_recursion) {
 230      // reset buffer & set context
 231      if(!in_recursion) {
 232        this.context = context;
 233        this.buffer = []; // TODO: make this non-lazy
 234      }
 235
 236      // fail fast
 237      if(!this.includes("", template)) {
 238        if(in_recursion) {
 239          return template;
 240        } else {
 241          this.send(template);
 242          return;
 243        }
 244      }
 245
 246      template = this.render_pragmas(template);
 247      var html = this.render_section(template, context, partials);
 248      if(in_recursion) {
 249        return this.render_tags(html, context, partials, in_recursion);
 250      }
 251
 252      this.render_tags(html, context, partials, in_recursion);
 253    },
 254
 255    /*
 256      Sends parsed lines
 257    */
 258    send: function(line) {
 259      if(line != "") {
 260        this.buffer.push(line);
 261      }
 262    },
 263
 264    /*
 265      Looks for %PRAGMAS
 266    */
 267    render_pragmas: function(template) {
 268      // no pragmas
 269      if(!this.includes("%", template)) {
 270        return template;
 271      }
 272
 273      var that = this;
 274      var regex = new RegExp(this.otag + "%([\\w-]+) ?([\\w]+=[\\w]+)?" +
 275            this.ctag);
 276      return template.replace(regex, function(match, pragma, options) {
 277        if(!that.pragmas_implemented[pragma]) {
 278          throw({message: 
 279            "This implementation of mustache doesn't understand the '" +
 280            pragma + "' pragma"});
 281        }
 282        that.pragmas[pragma] = {};
 283        if(options) {
 284          var opts = options.split("=");
 285          that.pragmas[pragma][opts[0]] = opts[1];
 286        }
 287        return "";
 288        // ignore unknown pragmas silently
 289      });
 290    },
 291
 292    /*
 293      Tries to find a partial in the curent scope and render it
 294    */
 295    render_partial: function(name, context, partials) {
 296      name = this.trim(name);
 297      if(!partials || partials[name] === undefined) {
 298        throw({message: "unknown_partial '" + name + "'"});
 299      }
 300      if(typeof(context[name]) != "object") {
 301        return this.render(partials[name], context, partials, true);
 302      }
 303      return this.render(partials[name], context[name], partials, true);
 304    },
 305
 306    /*
 307      Renders inverted (^) and normal (#) sections
 308    */
 309    render_section: function(template, context, partials) {
 310      if(!this.includes("#", template) && !this.includes("^", template)) {
 311        return template;
 312      }
 313
 314      var that = this;
 315      // CSW - Added "+?" so it finds the tighest bound, not the widest
 316      var regex = new RegExp(this.otag + "(\\^|\\#)\\s*(.+)\\s*" + this.ctag +
 317              "\n*([\\s\\S]+?)" + this.otag + "\\/\\s*\\2\\s*" + this.ctag +
 318              "\\s*", "mg");
 319
 320      // for each {{#foo}}{{/foo}} section do...
 321      return template.replace(regex, function(match, type, name, content) {
 322        var value = that.find(name, context);
 323        if(type == "^") { // inverted section
 324          if(!value || that.is_array(value) && value.length === 0) {
 325            // false or empty list, render it
 326            return that.render(content, context, partials, true);
 327          } else {
 328            return "";
 329          }
 330        } else if(type == "#") { // normal section
 331          if(that.is_array(value)) { // Enumerable, Let's loop!
 332            return that.map(value, function(row) {
 333              return that.render(content, that.create_context(row),
 334                partials, true);
 335            }).join("");
 336          } else if(that.is_object(value)) { // Object, Use it as subcontext!
 337            return that.render(content, that.create_context(value),
 338              partials, true);
 339          } else if(typeof value === "function") {
 340            // higher order section
 341            return value.call(context, content, function(text) {
 342              return that.render(text, context, partials, true);
 343            });
 344          } else if(value) { // boolean section
 345            return that.render(content, context, partials, true);
 346          } else {
 347            return "";
 348          }
 349        }
 350      });
 351    },
 352
 353    /*
 354      Replace {{foo}} and friends with values from our view
 355    */
 356    render_tags: function(template, context, partials, in_recursion) {
 357      // tit for tat
 358      var that = this;
 359
 360      var new_regex = function() {
 361        return new RegExp(that.otag + "(=|!|>|\\{|%)?([^\\/#\\^]+?)\\1?" +
 362          that.ctag + "+", "g");
 363      };
 364
 365      var regex = new_regex();
 366      var tag_replace_callback = function(match, operator, name) {
 367        switch(operator) {
 368        case "!": // ignore comments
 369          return "";
 370        case "=": // set new delimiters, rebuild the replace regexp
 371          that.set_delimiters(name);
 372          regex = new_regex();
 373          return "";
 374        case ">": // render partial
 375          return that.render_partial(name, context, partials);
 376        case "{": // the triple mustache is unescaped
 377          return that.find(name, context);
 378        default: // escape the value
 379          return that.escape(that.find(name, context));
 380        }
 381      };
 382      var lines = template.split("\n");
 383      for(var i = 0; i < lines.length; i++) {
 384        lines[i] = lines[i].replace(regex, tag_replace_callback, this);
 385        if(!in_recursion) {
 386          this.send(lines[i]);
 387        }
 388      }
 389
 390      if(in_recursion) {
 391        return lines.join("\n");
 392      }
 393    },
 394
 395    set_delimiters: function(delimiters) {
 396      var dels = delimiters.split(" ");
 397      this.otag = this.escape_regex(dels[0]);
 398      this.ctag = this.escape_regex(dels[1]);
 399    },
 400
 401    escape_regex: function(text) {
 402      // thank you Simon Willison
 403      if(!arguments.callee.sRE) {
 404        var specials = [
 405          '/', '.', '*', '+', '?', '|',
 406          '(', ')', '[', ']', '{', '}', '\\'
 407        ];
 408        arguments.callee.sRE = new RegExp(
 409          '(\\' + specials.join('|\\') + ')', 'g'
 410        );
 411      }
 412      return text.replace(arguments.callee.sRE, '\\$1');
 413    },
 414
 415    /*
 416      find `name` in current `context`. That is find me a value
 417      from the view object
 418    */
 419    find: function(name, context) {
 420      name = this.trim(name);
 421
 422      // Checks whether a value is thruthy or false or 0
 423      function is_kinda_truthy(bool) {
 424        return bool === false || bool === 0 || bool;
 425      }
 426
 427      var value;
 428      if(is_kinda_truthy(context[name])) {
 429        value = context[name];
 430      } else if(is_kinda_truthy(this.context[name])) {
 431        value = this.context[name];
 432      }
 433
 434      if(typeof value === "function") {
 435        return value.apply(context);
 436      }
 437      if(value !== undefined) {
 438        return value;
 439      }
 440      // silently ignore unkown variables
 441      return "";
 442    },
 443
 444    // Utility methods
 445
 446    /* includes tag */
 447    includes: function(needle, haystack) {
 448      return haystack.indexOf(this.otag + needle) != -1;
 449    },
 450
 451    /*
 452      Does away with nasty characters
 453    */
 454    escape: function(s) {
 455      s = String(s === null ? "" : s);
 456      return s.replace(/&(?!\w+;)|["'<>\\]/g, function(s) {
 457        switch(s) {
 458        case "&": return "&amp;";
 459        case "\\": return "\\\\";
 460        case '"': return '&quot;';
 461        case "'": return '&#39;';
 462        case "<": return "&lt;";
 463        case ">": return "&gt;";
 464        default: return s;
 465        }
 466      });
 467    },
 468
 469    // by @langalex, support for arrays of strings
 470    create_context: function(_context) {
 471      if(this.is_object(_context)) {
 472        return _context;
 473      } else {
 474        var iterator = ".";
 475        if(this.pragmas["IMPLICIT-ITERATOR"]) {
 476          iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator;
 477        }
 478        var ctx = {};
 479        ctx[iterator] = _context;
 480        return ctx;
 481      }
 482    },
 483
 484    is_object: function(a) {
 485      return a && typeof a == "object";
 486    },
 487
 488    is_array: function(a) {
 489      return Object.prototype.toString.call(a) === '[object Array]';
 490    },
 491
 492    /*
 493      Gets rid of leading and trailing whitespace
 494    */
 495    trim: function(s) {
 496      return s.replace(/^\s*|\s*$/g, "");
 497    },
 498
 499    /*
 500      Why, why, why? Because IE. Cry, cry cry.
 501    */
 502    map: function(array, fn) {
 503      if (typeof array.map == "function") {
 504        return array.map(fn);
 505      } else {
 506        var r = [];
 507        var l = array.length;
 508        for(var i = 0; i < l; i++) {
 509          r.push(fn(array[i]));
 510        }
 511        return r;
 512      }
 513    }
 514  };
 515
 516  return({
 517    name: "mustache.js",
 518    version: "0.3.1-dev",
 519
 520    /*
 521      Turns a template and view into HTML
 522    */
 523    to_html: function(template, view, partials, send_fun) {
 524      var renderer = new Renderer();
 525      if(send_fun) {
 526        renderer.send = send_fun;
 527      }
 528      renderer.render(template, view, partials);
 529      if(!send_fun) {
 530        return renderer.buffer.join("\n");
 531      }
 532    }
 533  });
 534}();
 535</script>
 536		<script type="text/javascript">// Underscore.js 1.1.6
 537// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
 538// Underscore is freely distributable under the MIT license.
 539// Portions of Underscore are inspired or borrowed from Prototype,
 540// Oliver Steele's Functional, and John Resig's Micro-Templating.
 541// For all details and documentation:
 542// http://documentcloud.github.com/underscore
 543(function(){var p=this,C=p._,m={},i=Array.prototype,n=Object.prototype,f=i.slice,D=i.unshift,E=n.toString,l=n.hasOwnProperty,s=i.forEach,t=i.map,u=i.reduce,v=i.reduceRight,w=i.filter,x=i.every,y=i.some,o=i.indexOf,z=i.lastIndexOf;n=Array.isArray;var F=Object.keys,q=Function.prototype.bind,b=function(a){return new j(a)};typeof module!=="undefined"&&module.exports?(module.exports=b,b._=b):p._=b;b.VERSION="1.1.6";var h=b.each=b.forEach=function(a,c,d){if(a!=null)if(s&&a.forEach===s)a.forEach(c,d);else if(b.isNumber(a.length))for(var e=
 5440,k=a.length;e<k;e++){if(c.call(d,a[e],e,a)===m)break}else for(e in a)if(l.call(a,e)&&c.call(d,a[e],e,a)===m)break};b.map=function(a,c,b){var e=[];if(a==null)return e;if(t&&a.map===t)return a.map(c,b);h(a,function(a,g,G){e[e.length]=c.call(b,a,g,G)});return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var k=d!==void 0;a==null&&(a=[]);if(u&&a.reduce===u)return e&&(c=b.bind(c,e)),k?a.reduce(c,d):a.reduce(c);h(a,function(a,b,f){!k&&b===0?(d=a,k=!0):d=c.call(e,d,a,b,f)});if(!k)throw new TypeError("Reduce of empty array with no initial value");
 545return d};b.reduceRight=b.foldr=function(a,c,d,e){a==null&&(a=[]);if(v&&a.reduceRight===v)return e&&(c=b.bind(c,e)),d!==void 0?a.reduceRight(c,d):a.reduceRight(c);a=(b.isArray(a)?a.slice():b.toArray(a)).reverse();return b.reduce(a,c,d,e)};b.find=b.detect=function(a,c,b){var e;A(a,function(a,g,f){if(c.call(b,a,g,f))return e=a,!0});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(w&&a.filter===w)return a.filter(c,b);h(a,function(a,g,f){c.call(b,a,g,f)&&(e[e.length]=a)});return e};
 546b.reject=function(a,c,b){var e=[];if(a==null)return e;h(a,function(a,g,f){c.call(b,a,g,f)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=!0;if(a==null)return e;if(x&&a.every===x)return a.every(c,b);h(a,function(a,g,f){if(!(e=e&&c.call(b,a,g,f)))return m});return e};var A=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=!1;if(a==null)return e;if(y&&a.some===y)return a.some(c,d);h(a,function(a,b,f){if(e=c.call(d,a,b,f))return m});return e};b.include=b.contains=function(a,c){var b=
 547!1;if(a==null)return b;if(o&&a.indexOf===o)return a.indexOf(c)!=-1;A(a,function(a){if(b=a===c)return!0});return b};b.invoke=function(a,c){var d=f.call(arguments,2);return b.map(a,function(a){return(c.call?c||a:a[c]).apply(a,d)})};b.pluck=function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);var e={computed:-Infinity};h(a,function(a,b,f){b=c?c.call(d,a,b,f):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,
 548c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};h(a,function(a,b,f){b=c?c.call(d,a,b,f):a;b<e.computed&&(e={value:a,computed:b})});return e.value};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,f){return{value:a,criteria:c.call(d,a,b,f)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.sortedIndex=function(a,c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=
 549function(a){if(!a)return[];if(a.toArray)return a.toArray();if(b.isArray(a))return a;if(b.isArguments(a))return f.call(a);return b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?f.call(a,0,b):a[0]};b.rest=b.tail=function(a,b,d){return f.call(a,b==null||d?1:b)};b.last=function(a){return a[a.length-1]};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a){return b.reduce(a,function(a,d){if(b.isArray(d))return a.concat(b.flatten(d));
 550a[a.length]=d;return a},[])};b.without=function(a){var c=f.call(arguments,1);return b.filter(a,function(a){return!b.include(c,a)})};b.uniq=b.unique=function(a,c){return b.reduce(a,function(a,e,f){if(0==f||(c===!0?b.last(a)!=e:!b.include(a,e)))a[a.length]=e;return a},[])};b.intersect=function(a){var c=f.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.zip=function(){for(var a=f.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),
 551e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(o&&a.indexOf===o)return a.indexOf(c);d=0;for(e=a.length;d<e;d++)if(a[d]===c)return d;return-1};b.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};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);d=arguments[2]||1;for(var e=Math.max(Math.ceil((b-a)/
 552d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};b.bind=function(a,b){if(a.bind===q&&q)return q.apply(a,f.call(arguments,1));var d=f.call(arguments,2);return function(){return a.apply(b,d.concat(f.call(arguments)))}};b.bindAll=function(a){var c=f.call(arguments,1);c.length==0&&(c=b.functions(a));h(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,c){var d={};c||(c=b.identity);return function(){var b=c.apply(this,arguments);return l.call(d,b)?d[b]:d[b]=a.apply(this,arguments)}};b.delay=
 553function(a,b){var d=f.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(f.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)}};b.throttle=function(a,b){return B(a,b,!1)};b.debounce=function(a,b){return B(a,b,!0)};b.once=function(a){var b=!1,d;return function(){if(b)return d;b=!0;return d=a.apply(this,arguments)}};
 554b.wrap=function(a,b){return function(){var d=[a].concat(f.call(arguments));return b.apply(this,d)}};b.compose=function(){var a=f.call(arguments);return function(){for(var b=f.call(arguments),d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};b.after=function(a,b){return function(){if(--a<1)return b.apply(this,arguments)}};b.keys=F||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[],d;for(d in a)l.call(a,d)&&(b[b.length]=d);return b};b.values=function(a){return b.map(a,
 555b.identity)};b.functions=b.methods=function(a){return b.filter(b.keys(a),function(c){return b.isFunction(a[c])}).sort()};b.extend=function(a){h(f.call(arguments,1),function(b){for(var d in b)b[d]!==void 0&&(a[d]=b[d])});return a};b.defaults=function(a){h(f.call(arguments,1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,c){if(a===c)return!0;var d=typeof a;if(d!=
 556typeof c)return!1;if(a==c)return!0;if(!a&&c||a&&!c)return!1;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual)return a.isEqual(c);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c))return!1;if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return!1;if(a.length&&a.length!==c.length)return!1;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return!1;
 557for(var f in a)if(!(f in c)||!b.isEqual(a[f],c[f]))return!1;return!0};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(l.call(a,c))return!1;return!0};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=n||function(a){return E.call(a)==="[object Array]"};b.isArguments=function(a){return!(!a||!l.call(a,"callee"))};b.isFunction=function(a){return!(!a||!a.constructor||!a.call||!a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};
 558b.isNumber=function(a){return!!(a===0||a&&a.toExponential&&a.toFixed)};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===!0||a===!1};b.isDate=function(a){return!(!a||!a.getTimezoneOffset||!a.setUTCFullYear)};b.isRegExp=function(a){return!(!a||!a.test||!a.exec||!(a.ignoreCase||a.ignoreCase===!1))};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.noConflict=function(){p._=C;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=
 5590;e<a;e++)b.call(d,e)};b.mixin=function(a){h(b.functions(a),function(c){H(c,b[c]=a[c])})};var I=0;b.uniqueId=function(a){var b=I++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g};b.template=function(a,c){var d=b.templateSettings;d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.interpolate,function(a,b){return"',"+b.replace(/\\'/g,"'")+",'"}).replace(d.evaluate||
 560null,function(a,b){return"');"+b.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 c?d(c):d};var j=function(a){this._wrapped=a};b.prototype=j.prototype;var r=function(a,c){return c?b(a).chain():a},H=function(a,c){j.prototype[a]=function(){var a=f.call(arguments);D.call(a,this._wrapped);return r(c.apply(b,a),this._chain)}};b.mixin(b);h(["pop","push","reverse","shift","sort",
 561"splice","unshift"],function(a){var b=i[a];j.prototype[a]=function(){b.apply(this._wrapped,arguments);return r(this._wrapped,this._chain)}});h(["concat","join","slice"],function(a){var b=i[a];j.prototype[a]=function(){return r(b.apply(this._wrapped,arguments),this._chain)}});j.prototype.chain=function(){this._chain=!0;return this};j.prototype.value=function(){return this._wrapped}})();
 562</script>
 563		<script type="text/javascript">// Backbone.js 0.3.3
 564// (c) 2010 Jeremy Ashkenas, DocumentCloud Inc.
 565// Backbone may be freely distributed under the MIT license.
 566// For all details and documentation:
 567// http://documentcloud.github.com/backbone
 568(function(){var e;e=typeof exports!=="undefined"?exports:this.Backbone={};e.VERSION="0.3.3";var f=this._;if(!f&&typeof require!=="undefined")f=require("underscore")._;var h=this.jQuery||this.Zepto;e.emulateHTTP=false;e.emulateJSON=false;e.Events={bind:function(a,b){this._callbacks||(this._callbacks={});(this._callbacks[a]||(this._callbacks[a]=[])).push(b);return this},unbind:function(a,b){var c;if(a){if(c=this._callbacks)if(b){c=c[a];if(!c)return this;for(var d=0,g=c.length;d<g;d++)if(b===c[d]){c.splice(d,
 5691);break}}else c[a]=[]}else this._callbacks={};return this},trigger:function(a){var b,c,d,g;if(!(c=this._callbacks))return this;if(b=c[a]){d=0;for(g=b.length;d<g;d++)b[d].apply(this,Array.prototype.slice.call(arguments,1))}if(b=c.all){d=0;for(g=b.length;d<g;d++)b[d].apply(this,arguments)}return this}};e.Model=function(a,b){a||(a={});if(this.defaults)a=f.extend({},this.defaults,a);this.attributes={};this._escapedAttributes={};this.cid=f.uniqueId("c");this.set(a,{silent:true});this._previousAttributes=
 570f.clone(this.attributes);if(b&&b.collection)this.collection=b.collection;this.initialize(a,b)};f.extend(e.Model.prototype,e.Events,{_previousAttributes:null,_changed:false,initialize:function(){},toJSON:function(){return f.clone(this.attributes)},get:function(a){return this.attributes[a]},escape:function(a){var b;if(b=this._escapedAttributes[a])return b;b=this.attributes[a];return this._escapedAttributes[a]=(b==null?"":b).replace(/&(?!\w+;)/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,
 571"&quot;")},set:function(a,b){b||(b={});if(!a)return this;if(a.attributes)a=a.attributes;var c=this.attributes,d=this._escapedAttributes;if(!b.silent&&this.validate&&!this._performValidation(a,b))return false;if("id"in a)this.id=a.id;for(var g in a){var i=a[g];if(!f.isEqual(c[g],i)){c[g]=i;delete d[g];if(!b.silent){this._changed=true;this.trigger("change:"+g,this,i,b)}}}!b.silent&&this._changed&&this.change(b);return this},unset:function(a,b){b||(b={});var c={};c[a]=void 0;if(!b.silent&&this.validate&&
 572!this._performValidation(c,b))return false;delete this.attributes[a];delete this._escapedAttributes[a];if(!b.silent){this._changed=true;this.trigger("change:"+a,this,void 0,b);this.change(b)}return this},clear:function(a){a||(a={});var b=this.attributes,c={};for(attr in b)c[attr]=void 0;if(!a.silent&&this.validate&&!this._performValidation(c,a))return false;this.attributes={};this._escapedAttributes={};if(!a.silent){this._changed=true;for(attr in b)this.trigger("change:"+attr,this,void 0,a);this.change(a)}return this},
 573fetch:function(a){a||(a={});var b=this,c=j(a.error,b,a);(this.sync||e.sync)("read",this,function(d){if(!b.set(b.parse(d),a))return false;a.success&&a.success(b,d)},c);return this},save:function(a,b){b||(b={});if(a&&!this.set(a,b))return false;var c=this,d=j(b.error,c,b),g=this.isNew()?"create":"update";(this.sync||e.sync)(g,this,function(i){if(!c.set(c.parse(i),b))return false;b.success&&b.success(c,i)},d);return this},destroy:function(a){a||(a={});var b=this,c=j(a.error,b,a);(this.sync||e.sync)("delete",
 574this,function(d){b.collection&&b.collection.remove(b);a.success&&a.success(b,d)},c);return this},url:function(){var a=k(this.collection);if(this.isNew())return a;return a+(a.charAt(a.length-1)=="/"?"":"/")+this.id},parse:function(a){return a},clone:function(){return new this.constructor(this)},isNew:function(){return!this.id},change:function(a){this.trigger("change",this,a);this._previousAttributes=f.clone(this.attributes);this._changed=false},hasChanged:function(a){if(a)return this._previousAttributes[a]!=
 575this.attributes[a];return this._changed},changedAttributes:function(a){a||(a=this.attributes);var b=this._previousAttributes,c=false,d;for(d in a)if(!f.isEqual(b[d],a[d])){c=c||{};c[d]=a[d]}return c},previous:function(a){if(!a||!this._previousAttributes)return null;return this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)},_performValidation:function(a,b){var c=this.validate(a);if(c){b.error?b.error(this,c):this.trigger("error",this,c,b);return false}return true}});
 576e.Collection=function(a,b){b||(b={});if(b.comparator){this.comparator=b.comparator;delete b.comparator}this._boundOnModelEvent=f.bind(this._onModelEvent,this);this._reset();a&&this.refresh(a,{silent:true});this.initialize(a,b)};f.extend(e.Collection.prototype,e.Events,{model:e.Model,initialize:function(){},toJSON:function(){return this.map(function(a){return a.toJSON()})},add:function(a,b){if(f.isArray(a))for(var c=0,d=a.length;c<d;c++)this._add(a[c],b);else this._add(a,b);return this},remove:function(a,
 577b){if(f.isArray(a))for(var c=0,d=a.length;c<d;c++)this._remove(a[c],b);else this._remove(a,b);return this},get:function(a){if(a==null)return null;return this._byId[a.id!=null?a.id:a]},getByCid:function(a){return a&&this._byCid[a.cid||a]},at:function(a){return this.models[a]},sort:function(a){a||(a={});if(!this.comparator)throw Error("Cannot sort a set without a comparator");this.models=this.sortBy(this.comparator);a.silent||this.trigger("refresh",this,a);return this},pluck:function(a){return f.map(this.models,
 578function(b){return b.get(a)})},refresh:function(a,b){a||(a=[]);b||(b={});this._reset();this.add(a,{silent:true});b.silent||this.trigger("refresh",this,b);return this},fetch:function(a){a||(a={});var b=this,c=j(a.error,b,a);(this.sync||e.sync)("read",this,function(d){b.refresh(b.parse(d));a.success&&a.success(b,d)},c);return this},create:function(a,b){var c=this;b||(b={});if(a instanceof e.Model)a.collection=c;else a=new this.model(a,{collection:c});return a.save(null,{success:function(d,g){c.add(d);
 579b.success&&b.success(d,g)},error:b.error})},parse:function(a){return a},chain:function(){return f(this.models).chain()},_reset:function(){this.length=0;this.models=[];this._byId={};this._byCid={}},_add:function(a,b){b||(b={});a instanceof e.Model||(a=new this.model(a,{collection:this}));var c=this.getByCid(a);if(c)throw Error(["Can't add the same model to a set twice",c.id]);this._byId[a.id]=a;this._byCid[a.cid]=a;a.collection=this;this.models.splice(this.comparator?this.sortedIndex(a,this.comparator):
 580this.length,0,a);a.bind("all",this._boundOnModelEvent);this.length++;b.silent||a.trigger("add",a,this,b);return a},_remove:function(a,b){b||(b={});a=this.getByCid(a)||this.get(a);if(!a)return null;delete this._byId[a.id];delete this._byCid[a.cid];delete a.collection;this.models.splice(this.indexOf(a),1);this.length--;b.silent||a.trigger("remove",a,this,b);a.unbind("all",this._boundOnModelEvent);return a},_onModelEvent:function(a,b){if(a==="change:id"){delete this._byId[b.previous("id")];this._byId[b.id]=
 581b}this.trigger.apply(this,arguments)}});f.each(["forEach","each","map","reduce","reduceRight","find","detect","filter","select","reject","every","all","some","any","include","invoke","max","min","sortBy","sortedIndex","toArray","size","first","rest","last","without","indexOf","lastIndexOf","isEmpty"],function(a){e.Collection.prototype[a]=function(){return f[a].apply(f,[this.models].concat(f.toArray(arguments)))}});e.Controller=function(a){a||(a={});if(a.routes)this.routes=a.routes;this._bindRoutes();
 582this.initialize(a)};var o=/:([\w\d]+)/g,p=/\*([\w\d]+)/g;f.extend(e.Controller.prototype,e.Events,{initialize:function(){},route:function(a,b,c){e.history||(e.history=new e.History);f.isRegExp(a)||(a=this._routeToRegExp(a));e.history.route(a,f.bind(function(d){d=this._extractParameters(a,d);c.apply(this,d);this.trigger.apply(this,["route:"+b].concat(d))},this))},saveLocation:function(a){e.history.saveLocation(a)},_bindRoutes:function(){if(this.routes)for(var a in this.routes){var b=this.routes[a];
 583this.route(a,b,this[b])}},_routeToRegExp:function(a){a=a.replace(o,"([^/]*)").replace(p,"(.*?)");return RegExp("^"+a+"$")},_extractParameters:function(a,b){return a.exec(b).slice(1)}});e.History=function(){this.handlers=[];this.fragment=this.getFragment();f.bindAll(this,"checkUrl")};var l=/^#*/;f.extend(e.History.prototype,{interval:50,getFragment:function(a){return(a||window.location).hash.replace(l,"")},start:function(){var a=document.documentMode;if(a=h.browser.msie&&(!a||a<=7))this.iframe=h('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow;
 584"onhashchange"in window&&!a?h(window).bind("hashchange",this.checkUrl):setInterval(this.checkUrl,this.interval);return this.loadUrl()},route:function(a,b){this.handlers.push({route:a,callback:b})},checkUrl:function(){var a=this.getFragment();if(a==this.fragment&&this.iframe)a=this.getFragment(this.iframe.location);if(a==this.fragment||a==decodeURIComponent(this.fragment))return false;if(this.iframe)window.location.hash=this.iframe.location.hash=a;this.loadUrl()},loadUrl:function(){var a=this.fragment=
 585this.getFragment();return f.any(this.handlers,function(b){if(b.route.test(a)){b.callback(a);return true}})},saveLocation:function(a){a=(a||"").replace(l,"");if(this.fragment!=a){window.location.hash=this.fragment=a;if(this.iframe&&a!=this.getFragment(this.iframe.location)){this.iframe.document.open().close();this.iframe.location.hash=a}}}});e.View=function(a){this._configure(a||{});this._ensureElement();this.delegateEvents();this.initialize(a)};var q=/^(\w+)\s*(.*)$/;f.extend(e.View.prototype,e.Events,
 586{tagName:"div",$:function(a){return h(a,this.el)},initialize:function(){},render:function(){return this},remove:function(){h(this.el).remove();return this},make:function(a,b,c){a=document.createElement(a);b&&h(a).attr(b);c&&h(a).html(c);return a},delegateEvents:function(a){if(a||(a=this.events)){h(this.el).unbind();for(var b in a){var c=a[b],d=b.match(q),g=d[1];d=d[2];c=f.bind(this[c],this);d===""?h(this.el).bind(g,c):h(this.el).delegate(d,g,c)}}},_configure:function(a){if(this.options)a=f.extend({},
 587this.options,a);if(a.model)this.model=a.model;if(a.collection)this.collection=a.collection;if(a.el)this.el=a.el;if(a.id)this.id=a.id;if(a.className)this.className=a.className;if(a.tagName)this.tagName=a.tagName;this.options=a},_ensureElement:function(){if(!this.el){var a={};if(this.id)a.id=this.id;if(this.className)a["class"]=this.className;this.el=this.make(this.tagName,a)}}});var m=function(a,b){var c=r(this,a,b);c.extend=m;return c};e.Model.extend=e.Collection.extend=e.Controller.extend=e.View.extend=
 588m;var s={create:"POST",update:"PUT","delete":"DELETE",read:"GET"};e.sync=function(a,b,c,d){var g=s[a];a=a==="create"||a==="update"?JSON.stringify(b.toJSON()):null;b={url:k(b),type:g,contentType:"application/json",data:a,dataType:"json",processData:false,success:c,error:d};if(e.emulateJSON){b.contentType="application/x-www-form-urlencoded";b.processData=true;b.data=a?{model:a}:{}}if(e.emulateHTTP)if(g==="PUT"||g==="DELETE"){if(e.emulateJSON)b.data._method=g;b.type="POST";b.beforeSend=function(i){i.setRequestHeader("X-HTTP-Method-Override",
 589g)}}h.ajax(b)};var n=function(){},r=function(a,b,c){var d;d=b&&b.hasOwnProperty("constructor")?b.constructor:function(){return a.apply(this,arguments)};n.prototype=a.prototype;d.prototype=new n;b&&f.extend(d.prototype,b);c&&f.extend(d,c);d.prototype.constructor=d;d.__super__=a.prototype;return d},k=function(a){if(!(a&&a.url))throw Error("A 'url' property or function must be specified");return f.isFunction(a.url)?a.url():a.url},j=function(a,b,c){return function(d){a?a(b,d):b.trigger("error",b,d,c)}}})();
 590</script>
 591		<script type="text/javascript">var GLOBALS, adjustHeight, makeDataRequest, prefs, slugify;
 592prefs = new gadgets.Prefs();
 593GLOBALS = {
 594  rootUrl: "http://gocomics.com"
 595};
 596GLOBALS.feedUrl = "" + GLOBALS.rootUrl + "/feeds";
 597GLOBALS.featureUrl = "" + GLOBALS.feedUrl + "/recent_item/";
 598GLOBALS.featureListUrl = "" + GLOBALS.feedUrl + "/features?min=true&category=comic";
 599GLOBALS.navigation = {
 600  myComics: {
 601    title: 'My Comics',
 602    slug: 'MyComics',
 603    featureGroups: [
 604      {
 605        title: 'My Comics',
 606        slug: 'mycomics',
 607        ids: [],
 608        data: []
 609      }
 610    ]
 611  },
 612  favorites: {
 613    title: 'Favorites',
 614    slug: 'Favorites',
 615    featureGroups: [
 616      {
 617        title: 'My Favorites',
 618        slug: 'myfavorites',
 619        ids: [],
 620        data: []
 621      }, {
 622        title: "Friends' Favorites",
 623        slug: 'friendsfavorites',
 624        ids: [],
 625        data: []
 626      }
 627    ]
 628  },
 629  allComics: {
 630    title: 'All Comics',
 631    slug: 'AllComics',
 632    featureGroups: [
 633      {
 634        title: 'Popular',
 635        slug: 'popular',
 636        ids: [],
 637        data: []
 638      }, {
 639        title: "A-Z",
 640        slug: 'atoz',
 641        ids: [],
 642        data: []
 643      }
 644    ]
 645  }
 646};
 647adjustHeight = function() {
 648  return gadgets.window.adjustHeight();
 649};
 650makeDataRequest = function(url, callback) {
 651  return gadgets.io.makeRequest(url, function(obj) {
 652    if (!obj || obj.rc !== 200) {
 653      console.log('Failed to get data.');
 654    }
 655    return callback(obj.data);
 656  });
 657};
 658slugify = function(str) {
 659  var from, i, to, _ref;
 660  str = str.replace(/^\s+|\s+$/g, '').toLowerCase();
 661  from = "ŕáäâčéëęěíďîňóöôůúüűńçˇ/_,:;";
 662  to = "aaaaeeeeiiiioooouuuunc------";
 663  for (i = 0, _ref = from.length; 0 <= _ref ? i <= _ref : i >= _ref; 0 <= _ref ? i++ : i--) {
 664    str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
 665  }
 666  return str.replace(/[^a-z0-9 -]/g, '').replace(/\s+/g, '-').replace(/-+/g, '-');
 667};</script>
 668		<script type="text/javascript">var Feature, FeatureList, HomeView, init;
 669Feature = Backbone.Model.extend({
 670  BASE_URL: GLOBALS.featureUrl,
 671  url: function() {
 672    return this.BASE_URL + this.attributes.id;
 673  }
 674});
 675FeatureList = Backbone.Collection.extend({
 676  BASE_URL: GLOBALS.featureListUrl,
 677  model: Feature,
 678  url: function() {
 679    return this.BASE_URL;
 680  }
 681});
 682HomeView = Backbone.View.extend({
 683  el: $('#home-container'),
 684  template: $('#feature-template').html(),
 685  _features: null,
 686  _currentFeature: null,
 687  _previousFeature: null,
 688  _nextFeature: null,
 689  _index: 0,
 690  _supportedViews: null,
 691  events: {
 692    'click .pick-comics': 'pickComics',
 693    'click .full-size': 'fullSize',
 694    'click .feature-image img': 'fullSize',
 695    'click .prev': 'previous',
 696    'click .next': 'next'
 697  },
 698  initialize: function() {
 699    this.collection = new FeatureList(_.detect(GLOBALS.navigation.myComics.featureGroups, function(g) {
 700      return g.slug === 'mycomics';
 701    }).data);
 702    this.setFeature(this._index);
 703    this._supportedViews = gadgets.views.getSupportedViews();
 704    return this;
 705  },
 706  render: function() {
 707    $('#feature').html(Mustache.to_html(this.template, this._currentFeature.toJSON()));
 708    $('.prev').html("&larr; " + this._previousFeature.attributes.title);
 709    $('.next').html("" + this._nextFeature.attributes.title + " &rarr;");
 710    adjustHeight();
 711    return this;
 712  },
 713  up: function(i) {
 714    if (i + 1 > this.collection.length - 1) {
 715      return 0;
 716    } else {
 717      return i + 1;
 718    }
 719  },
 720  down: function(i) {
 721    if (i - 1 < 0) {
 722      return this.collection.length - 1;
 723    } else {
 724      return i - 1;
 725    }
 726  },
 727  cycle: function(increment) {
 728    this._index = increment ? this.up(this._index) : this.down(this._index);
 729    return this.setFeature(this._index);
 730  },
 731  setFeature: function(i) {
 732    this._currentFeature = this.collection.at(i);
 733    this._previousFeature = this.collection.at(this.down(i));
 734    this._nextFeature = this.collection.at(this.up(i));
 735    return this.render();
 736  },
 737  rockTheCanvasView: function(isEditMode) {
 738    var params;
 739    params = {
 740      'featureId': this._currentFeature.attributes.feature_id,
 741      'isEditMode': isEditMode
 742    };
 743    return gadgets.views.requestNavigateTo(this._supportedViews.canvas, params);
 744  },
 745  pickComics: function(e) {
 746    e.preventDefault();
 747    return this.rockTheCanvasView(true);
 748  },
 749  fullSize: function(e) {
 750    e.preventDefault();
 751    return this.rockTheCanvasView(false);
 752  },
 753  previous: function(e) {
 754    e.preventDefault();
 755    return this.cycle(false);
 756  },
 757  next: function(e) {
 758    e.preventDefault();
 759    return this.cycle(true);
 760  }
 761});
 762init = function() {
 763  var featureGroup, initialize;
 764  featureGroup = _.detect(GLOBALS.navigation.myComics.featureGroups, function(g) {
 765    return g.slug === 'mycomics';
 766  });
 767  if (prefs.getArray(featureGroup.slug).length <= 0) {
 768    featureGroup.ids = [609, 9, 32];
 769  } else {
 770    featureGroup.ids = prefs.getArray(featureGroup.slug);
 771  }
 772  initialize = _.after(featureGroup.ids.length, function() {
 773    return window.View = new HomeView;
 774  });
 775  _(featureGroup.ids).each(function(id) {
 776    return makeDataRequest("" + GLOBALS.featureUrl + id, function(obj) {
 777      featureGroup.data.push(JSON.parse(obj));
 778      return initialize();
 779    });
 780  });
 781  return this;
 782};
 783gadgets.util.registerOnLoadHandler(init);</script>
 784	
 785	]]>
 786	</Content>
 787	
 788	
 789	
 790	<!-- C A N V A S -->
 791	<Content type="html" view="canvas"><![CDATA[
 792		
 793		<style type='text/css'>
 794		  /* http://meyerweb.com/eric/tools/css/reset/ 
 795   v2.0 | 20110126
 796   License: none (public domain)
 797*/
 798
 799html, body, div, span, applet, object, iframe,
 800h1, h2, h3, h4, h5, h6, p, blockquote, pre,
 801a, abbr, acronym, address, big, cite, code,
 802del, dfn, em, img, ins, kbd, q, s, samp,
 803small, strike, strong, sub, sup, tt, var,
 804b, u, i, center,
 805dl, dt, dd, ol, ul, li,
 806fieldset, form, label, legend,
 807table, caption, tbody, tfoot, thead, tr, th, td,
 808article, aside, canvas, details, embed, 
 809figure, figcaption, footer, header, hgroup, 
 810menu, nav, output, ruby, section, summary,
 811time, mark, audio, video {
 812	margin: 0;
 813	padding: 0;
 814	border: 0;
 815	font-size: 100%;
 816	font: inherit;
 817	vertical-align: baseline;
 818}
 819/* HTML5 display-role reset for older browsers */
 820article, aside, details, figcaption, figure, 
 821footer, header, hgroup, menu, nav, section {
 822	display: block;
 823}
 824body {
 825	line-height: 1;
 826}
 827ol, ul {
 828	list-style: none;
 829}
 830blockquote, q {
 831	quotes: none;
 832}
 833blockquote:before, blockquote:after,
 834q:before, q:after {
 835	content: '';
 836	content: none;
 837}
 838table {
 839	border-collapse: collapse;
 840	border-spacing: 0;
 841}
 842		  body {
 843  color: #474747;
 844  font-family: Helvetica, Arial, Verdana, sans-serif;
 845  font-size: 12px; }
 846
 847a {
 848  text-decoration: none;
 849  color: #4a91c1; }
 850
 851a:visited {
 852  color: #4a91c1; }
 853
 854.button, .big-button, .little-button {
 855  border-radius: 5px;
 856  -webkit-border-radius: 5px;
 857  -moz-border-radius: 5px;
 858  color: #FFF;
 859  font-weight: bold;
 860  text-align: center; }
 861
 862.button:visited, .big-button:visited, .little-button:visited {
 863  color: #FFF; }
 864
 865.big-button {
 866  background: #38a3cd;
 867  background: -webkit-gradient(linear, left top, left bottom, from(#8acae1), to(#38a3cd));
 868  background: -moz-linear-gradient(top, #8acae1, #38a3cd);
 869  width: 75px;
 870  display: block;
 871  padding: 6px 10px; }
 872
 873.big-button:hover {
 874  background: #8acae1;
 875  background: -webkit-gradient(linear, left top, left bottom, from(#38a3cd), to(#8acae1));
 876  background: -moz-linear-gradient(top, #38a3cd, #8acae1); }
 877
 878.little-button {
 879  background: #777777;
 880  background: -webkit-gradient(linear, left top, left bottom, from(#888888), to(#777777));
 881  background: -moz-linear-gradient(top, #888888, #777777);
 882  display: inline-block;
 883  width: 150px;
 884  padding: 4px 8px; }
 885
 886.little-button:hover {
 887  background: #888888;
 888  background: -webkit-gradient(linear, left top, left bottom, from(#777777), to(#888888));
 889  background: -moz-linear-gradient(top, #777777, #888888); }
 890
 891.clear {
 892  clear: both; }
 893
 894#canvas {
 895  width: 950px;
 896  background: #FFF;
 897  margin-left: 5px;
 898  margin-top: 5px; }
 899
 900#canvas-container {
 901  background: #FFF; }
 902
 903#tab-navigation {
 904  color: #FFF;
 905  width: inherit; }
 906  #tab-navigation ul {
 907    background: #5e9100;
 908    background: -webkit-gradient(linear, left top, left bottom, from(#78ae07), to(#5e9100));
 909    background: -moz-linear-gradient(top, #78ae07, #5e9100);
 910    border-radius: 5px;
 911    -webkit-border-radius: 5px;
 912    -moz-border-radius: 5px;
 913    display: table;
 914    width: 300px; }
 915    #tab-navigation ul li {
 916      display: table-cell;
 917      border-right: 1px solid #629000;
 918      border-left: 1px solid #8CB94A; }
 919      #tab-navigation ul li a {
 920        font-weight: bold;
 921        color: inherit;
 922        text-align: center;
 923        display: block;
 924        padding: 12px 12px 20px 12px; }
 925      #tab-navigation ul li a:hover, #tab-navigation ul li a.selected {
 926        background: #85b334;
 927        background: -webkit-gradient(linear, left top, left bottom, from(#78ae07), to(#85b334));
 928        background: -moz-linear-gradient(top, #78ae07, #85b334); }
 929      #tab-navigation ul li a.selected {
 930        cursor: inherit; }
 931      #tab-navigation ul li #myComics:hover, #tab-navigation ul li #myComics.selected {
 932        border-top-left-radius: 5px;
 933        border-bottom-left-radius: 5px;
 934        -webkit-border-top-left-radius: 5px;
 935        -webkit-border-bottom-left-radius: 5px;
 936        -moz-border-radius-topleft: 5px;
 937        -moz-border-radius-bottomleft: 5px; }
 938      #tab-navigation ul li #allComics:hover, #tab-navigation ul li #allComics.selected {
 939        border-top-right-radius: 5px;
 940        border-bottom-right-radius: 5px;
 941        -webkit-border-top-right-radius: 5px;
 942        -webkit-border-bottom-right-radius: 5px;
 943        -moz-border-radius-topright: 5px;
 944        -moz-border-radius-bottomright: 5px; }
 945    #tab-navigation ul li:first-child {
 946      border-left: none; }
 947    #tab-navigation ul li.last-li {
 948      border-right: none; }
 949
 950#content {
 951  -moz-box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.3);
 952  -webkit-box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.3);
 953  box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.3);
 954  border-radius: 5px;
 955  -webkit-border-radius: 5px;
 956  -moz-border-radius: 5px;
 957  border-top: 4px solid #71A9CC;
 958  position: relative;
 959  background: #FFF;
 960  top: -10px;
 961  padding-left: 10px;
 962  padding-top: 10px;
 963  padding-bottom: 10px; }
 964
 965#feature {
 966  background: white;
 967  background: -webkit-gradient(linear, left top, left bottom, from(#f2f2f2), to(white));
 968  background: -moz-linear-gradient(top, #f2f2f2, white);
 969  -moz-box-shadow: 0 0 5px 2px #bbbbbb;
 970  -webkit-box-shadow: 0 0 5px 2px #bbbbbb;
 971  box-shadow: 0 0 5px 2px #bbbbbb;
 972  border-radius: 5px;
 973  -webkit-border-radius: 5px;
 974  -moz-border-radius: 5px;
 975  border: 2px solid #FFF;
 976  width: 615px;
 977  display: inline-block;
 978  padding: 15px; }
 979  #feature div.feature-header {
 980    display: table;
 981    width: inherit;
 982    margin-bottom: 10px; }
 983    #feature div.feature-header h1 {
 984      display: table-cell;
 985      vertical-align: middle;
 986      font-size: 24px; }
 987      #feature div.feature-header h1 .byline {
 988        color: #8e8e8e;
 989        font-size: 18px; }
 990    #feature div.feature-header ul.feature-navigation {
 991      display: table-cell;
 992      vertical-align: middle;
 993      text-align: right; }
 994      #feature div.feature-header ul.feature-navigation li {
 995        display: inline-block;
 996        padding: 0 2px; }
 997  #feature div.feature-image {
 998    width: inherit;
 999    text-align: center; }
1000  #feature ul.share-wrapper {
1001    background: #e4e4e4;
1002    background: -webkit-gradient(linear, left top, left bottom, from(white), to(#e4e4e4));
1003    background: -moz-linear-gradient(top, white, #e4e4e4);
1004    border-radius: 5px;
1005    -webkit-border-radius: 5px;
1006    -moz-border-radius: 5px;
1007    -moz-box-shadow: 0 0 5px 1px #cccccc;
1008    -webkit-box-shadow: 0 0 5px 1px #cccccc;
1009    box-shadow: 0 0 5px 1px #cccccc;
1010    font-size: 11px;
1011    border: 1px solid #CCC;
1012    text-align: center;
1013    text-transform: uppercase;
1014    margin-top: 10px; }
1015    #feature ul.share-wrapper li {
1016      display: inline-block;
1017      border-left: 1px solid #DDD; }
1018      #feature ul.share-wrapper li a {
1019        width: 203.667px;
1020        padding: 11px 0;
1021        display: block;
1022        color: inherit; }
1023      #feature ul.share-wrapper li a:hover {
1024        background: white;
1025        background: -webkit-gradient(linear, left top, left bottom, from(#e4e4e4), to(white));
1026        background: -moz-linear-gradient(top, #e4e4e4, white); }
1027      #feature ul.share-wrapper li a#share:hover {
1028        border-top-right-radius: 5px;
1029        border-bottom-right-radius: 5px;
1030        -webkit-border-top-right-radius: 5px;
1031        -webkit-border-bottom-right-radius: 5px;
1032        -moz-border-radius-topright: 5px;
1033        -moz-border-radius-bottomright: 5px; }
1034      #feature ul.share-wrapper li a#favorite:hover {
1035        border-top-left-radius: 5px;
1036        border-bottom-left-radius: 5px;
1037        -webkit-border-top-left-radius: 5px;
1038        -webkit-border-bottom-left-radius: 5px;
1039        -moz-border-radius-topleft: 5px;
1040        -moz-border-radius-bottomleft: 5px; }
1041    #feature ul.share-wrapper li:first-child {
1042      border-left: none; }
1043  #feature form#feature-comment {
1044    display: none;
1045    width: inherit;
1046    text-align: right; }
1047    #feature form#feature-comment h3 {
1048      text-align: left;
1049      font-size: 14px;
1050      color: #8e8e8e;
1051      padding: 10px 0; }
1052      #feature form#feature-comment h3 #counter {
1053        text-align: right;
1054        float: right;
1055        color: #d5d5d5; }
1056    #feature form#feature-comment textarea {
1057      width: inherit;
1058      text-align: left; }
1059
1060#feature-list {
1061  vertical-align: top;
1062  width: 288px;
1063  display: inline-block; }
1064  #feature-list ul, #feature-list > div {
1065    padding-left: 15px;
1066    padding-right: 15px; }
1067  #feature-list ul.feature-list-tabs {
1068    border-bottom: 1px solid #B2B2B2; }
1069    #feature-list ul.feature-list-tabs li {
1070      display: inline-block; }
1071      #feature-list ul.feature-list-tabs li a {
1072        background: white;
1073        background: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(white));
1074        background: -moz-linear-gradient(top, #e8e8e8, white);
1075        border-top-left-radius: 5px;
1076        border-top-right-radius: 5px;
1077        -webkit-border-top-left-radius: 5px;
1078        -webkit-border-top-right-radius: 5px;
1079        -moz-border-radius-topleft: 5px;
1080        -moz-border-radius-topbottom: 5px;
1081        display: block;
1082        padding: 6px 12px;
1083        border-top: 1px solid #B2B2B2;
1084        border-left: 1px solid #B2B2B2;
1085        border-right: 1px solid #B2B2B2;
1086        border-bottom: 1px solid #FFF;
1087        position: relative;
1088        top: 1px; }
1089  #feature-list div.feature-list-header {
1090    padding-top: 6px;
1091    padding-bottom: 8px;
1092    margin-top: 4px;
1093    font-size: 16px;
1094    font-weight: bold;
1095    overflow: hidden;
1096    border-bottom: 1px solid #DDD; }
1097    #feature-list div.feature-list-header h3 {
1098      width: 50%;
1099      float: left;
1100      padding: 2px 0; }
1101    #feature-list div.feature-list-header div.edit {
1102      font-weight: normal;
1103      float: right;
1104      color: #8e8e8e;
1105      font-size: 12px; }
1106      #feature-list div.feature-list-header div.edit a {
1107        width: auto; }
1108  #feature-list ul.feature-list-navigation {
1109    background: #e4e4e4;
1110    background: -webkit-gradient(linear, left top, left bottom, from(#f4f4f4), to(#e4e4e4));
1111    background: -moz-linear-gradient(top, #f4f4f4, #e4e4e4);
1112    border-bottom: 1px solid #CCC;
1113    margin-bottom: 5px;
1114    display: table;
1115    width: inherit;
1116    height: 24px;
1117    text-align: right; }
1118    #feature-list ul.feature-list-navigation li {
1119      vertical-align: middle;
1120      font-weight: bold;
1121      display: table-cell;
1122      width: 50%; }
1123    #feature-list ul.feature-list-navigation li:first-child {
1124      text-align: left; }
1125  #feature-list ul.features {
1126    padding: 0px; }
1127    #feature-list ul.features li a {
1128      display: block;
1129      padding: 5px 15px; }
1130    #feature-list ul.features li a:hover {
1131      background: #e7f2ff; }
1132    #feature-list ul.features li.alt a {
1133      background: #f4f4f4; }
1134    #feature-list ul.features li.alt a:hover {
1135      background: #e7f2ff; }
1136
1137		</style>
1138		
1139		<div id="canvas">
1140	<!-- Banner ad goes here. -->
1141	<div id="canvas-container">
1142		<div id="tab-navigation">
1143			<ul>
1144				<li>
1145					<a href="#" id="MyComics" class="top-tab">My Comics</a>
1146				</li>
1147				<li>
1148					<a href="#" id="Favorites" class="top-tab">Favorites</a>
1149				</li>
1150				<li class="last-li">
1151					<a href="#" id="AllComics" class="top-tab">All Comics</a>
1152				</li>
1153			</ul>
1154		</div>
1155		<div id="content">
1156			<div id="feature"></div>
1157			<div id="feature-list"></div>
1158			<div class="clear"></div>
1159			<div id="feature-comments"></div>
1160		</div>
1161	</div>
1162</div>
1163<script id="feature-template" type="text/mustache-tmpl">
1164	<div class="feature-header">
1165		<h1>{{title}} <span class="byline">by {{author}}</span></h1>
1166		<ul class="feature-navigation">
1167			<li>{{display_date}}</li>
1168			<li><a href="#" id="prev">&larr;</a></li>
1169			<li><a href="#" id="next">&rarr;</a></li>
1170		</ul>
1171	</div>
1172	<div class="feature-image">
1173		<img src="{{image_link}}" alt="{{title}}" />
1174	</div>
1175	<ul class="share-wrapper"><li><a href="{{id}}" id="favorite">Favorite</a></li><li><a href="{{feature_id}}" id="subscribe">Subscribe</a></li><li><a href="{{id}}" id="share">Share</a></li></ul>
1176	<form id="feature-comment">
1177		<h3>Share with comment: <span id="counter">140</span></h3>
1178		<textarea cols="40" rows="2" id="comment-field"></textarea>
1179		<input id="comment-button" type="button" value="Share" />
1180	</form>
1181</script>
1182<script id="feature-list-template" type="text/mustache-tmpl">
1183	<ul class="feature-list-tabs">
1184		{{#feature_groups}}
1185			<li class="little-tab"><a href="#" id="{{slug}}">{{title}}</a></li>
1186		{{/feature_groups}}
1187	</ul>
1188	<div class="feature-list-header">
1189		<h3>{{title}}</h3>
1190		<div class="edit"><a href="#" class="little-button">Edit</a></div>
1191	</div>
1192	<ul class="feature-list-navigation">
1193		<li><a href="#" id="prev">&larr; Previous</a></li>
1194		<li><a href="#" id="next">Next &rarr;</a></li>
1195	</ul>
1196	<ul class="features">
1197		{{#features}}
1198			<li><a href="{{id}}">{{title}}</a></li>
1199		{{/features}}
1200	</ul>
1201</script>
1202	
1203		<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
1204		<script type="text/javascript">/*
1205  mustache.js — Logic-less templates in JavaScript
1206
1207  See http://mustache.github.com/ for more info.
1208*/
1209
1210var Mustache = function() {
1211  var Renderer = function() {};
1212
1213  Renderer.prototype = {
1214    otag: "{{",
1215    ctag: "}}",
1216    pragmas: {},
1217    buffer: [],
1218    pragmas_implemented: {
1219      "IMPLICIT-ITERATOR": true
1220    },
1221    context: {},
1222
1223    render: function(template, context, partials, in_recursion) {
1224      // reset buffer & set context
1225      if(!in_recursion) {
1226        this.context = context;
1227        this.buffer = []; // TODO: make this non-lazy
1228      }
1229
1230      // fail fast
1231      if(!this.includes("", template)) {
1232        if(in_recursion) {
1233          return template;
1234        } else {
1235          this.send(template);
1236          return;
1237        }
1238      }
1239
1240      template = this.render_pragmas(template);
1241      var html = this.render_section(template, context, partials);
1242      if(in_recursion) {
1243        return this.render_tags(html, context, partials, in_recursion);
1244      }
1245
1246      this.render_tags(html, context, partials, in_recursion);
1247    },
1248
1249    /*
1250      Sends parsed lines
1251    */
1252    send: function(line) {
1253      if(line != "") {
1254        this.buffer.push(line);
1255      }
1256    },
1257
1258    /*
1259      Looks for %PRAGMAS
1260    */
1261    render_pragmas: function(template) {
1262      // no pragmas
1263      if(!this.includes("%", template)) {
1264        return template;
1265      }
1266
1267      var that = this;
1268      var regex = new RegExp(this.otag + "%([\\w-]+) ?([\\w]+=[\\w]+)?" +
1269            this.ctag);
1270      return template.replace(regex, function(match, pragma, options) {
1271        if(!that.pragmas_implemented[pragma]) {
1272          throw({message: 
1273            "This implementation of mustache doesn't understand the '" +
1274            pragma + "' pragma"});
1275        }
1276        that.pragmas[pragma] = {};
1277        if(options) {
1278          var opts = options.split("=");
1279          that.pragmas[pragma][opts[0]] = opts[1];
1280        }
1281        return "";
1282        // ignore unknown pragmas silently
1283      });
1284    },
1285
1286    /*
1287      Tries to find a partial in the curent scope and render it
1288    */
1289    render_partial: function(name, context, partials) {
1290      name = this.trim(name);
1291      if(!partials || partials[name] === undefined) {
1292        throw({message: "unknown_partial '" + name + "'"});
1293      }
1294      if(typeof(context[name]) != "object") {
1295        return this.render(partials[name], context, partials, true);
1296      }
1297      return this.render(partials[name], context[name], partials, true);
1298    },
1299
1300    /*
1301      Renders inverted (^) and normal (#) sections
1302    */
1303    render_section: function(template, context, partials) {
1304      if(!this.includes("#", template) && !this.includes("^", template)) {
1305        return template;
1306      }
1307
1308      var that = this;
1309      // CSW - Added "+?" so it finds the tighest bound, not the widest
1310      var regex = new RegExp(this.otag + "(\\^|\\#)\\s*(.+)\\s*" + this.ctag +
1311              "\n*([\\s\\S]+?)" + this.otag + "\\/\\s*\\2\\s*" + this.ctag +
1312              "\\s*", "mg");
1313
1314      // for each {{#foo}}{{/foo}} section do...
1315      return template.replace(regex, function(match, type, name, content) {
1316        var value = that.find(name, context);
1317        if(type == "^") { // inverted section
1318          if(!value || that.is_array(value) && value.length === 0) {
1319            // false or empty list, render it
1320            return that.render(content, context, partials, true);
1321          } else {
1322            return "";
1323          }
1324        } else if(type == "#") { // normal section
1325          if(that.is_array(value)) { // Enumerable, Let's loop!
1326            return that.map(value, function(row) {
1327              return that.render(content, that.create_context(row),
1328                partials, true);
1329            }).join("");
1330          } else if(that.is_object(value)) { // Object, Use it as subcontext!
1331            return that.render(content, that.create_context(value),
1332              partials, true);
1333          } else if(typeof value === "function") {
1334            // higher order section
1335            return value.call(context, content, function(text) {
1336              return that.render(text, context, partials, true);
1337            });
1338          } else if(value) { // boolean section
1339            return that.render(content, context, partials, true);
1340          } else {
1341            return "";
1342          }
1343        }
1344      });
1345    },
1346
1347    /*
1348      Replace {{foo}} and friends with values from our view
1349    */
1350    render_tags: function(template, context, partials, in_recursion) {
1351      // tit for tat
1352      var that = this;
1353
1354      var new_regex = function() {
1355        return new RegExp(that.otag + "(=|!|>|\\{|%)?([^\\/#\\^]+?)\\1?" +
1356          that.ctag + "+", "g");
1357      };
1358
1359      var regex = new_regex();
1360      var tag_replace_callback = function(match, operator, name) {
1361        switch(operator) {
1362        case "!": // ignore comments
1363          return "";
1364        case "=": // set new delimiters, rebuild the replace regexp
1365          that.set_delimiters(name);
1366          regex = new_regex();
1367          return "";
1368        case ">": // render partial
1369          return that.render_partial(name, context, partials);
1370        case "{": // the triple mustache is unescaped
1371          return that.find(name, context);
1372        default: // escape the value
1373          return that.escape(that.find(name, context));
1374        }
1375      };
1376      var lines = template.split("\n");
1377      for(var i = 0; i < lines.length; i++) {
1378        lines[i] = lines[i].replace(regex, tag_replace_callback, this);
1379        if(!in_recursion) {
1380          this.send(lines[i]);
1381        }
1382      }
1383
1384      if(in_recursion) {
1385        return lines.join("\n");
1386      }
1387    },
1388
1389    set_delimiters: function(delimiters) {
1390      var dels = delimiters.split(" ");
1391      this.otag = this.escape_regex(dels[0]);
1392      this.ctag = this.escape_regex(dels[1]);
1393    },
1394
1395    escape_regex: function(text) {
1396      // thank you Simon Willison
1397      if(!arguments.callee.sRE) {
1398        var specials = [
1399          '/', '.', '*', '+', '?', '|',
1400          '(', ')', '[', ']', '{', '}', '\\'
1401        ];
1402        arguments.callee.sRE = new RegExp(
1403          '(\\' + specials.join('|\\') + ')', 'g'
1404        );
1405      }
1406      return text.replace(arguments.callee.sRE, '\\$1');
1407    },
1408
1409    /*
1410      find `name` in current `context`. That is find me a value
1411      from the view object
1412    */
1413    find: function(name, context) {
1414      name = this.trim(name);
1415
1416      // Checks whether a value is thruthy or false or 0
1417      function is_kinda_truthy(bool) {
1418        return bool === false || bool === 0 || bool;
1419      }
1420
1421      var value;
1422      if(is_kinda_truthy(context[name])) {
1423        value = context[name];
1424      } else if(is_kinda_truthy(this.context[name])) {
1425        value = this.context[name];
1426      }
1427
1428      if(typeof value === "function") {
1429        return value.apply(context);
1430      }
1431      if(value !== undefined) {
1432        return value;
1433      }
1434      // silently ignore unkown variables
1435      return "";
1436    },
1437
1438    // Utility methods
1439
1440    /* includes tag */
1441    includes: function(needle, haystack) {
1442      return haystack.indexOf(this.otag + needle) != -1;
1443    },
1444
1445    /*
1446      Does away with nasty characters
1447    */
1448    escape: function(s) {
1449      s = String(s === null ? "" : s);
1450      return s.replace(/&(?!\w+;)|["'<>\\]/g, function(s) {
1451        switch(s) {
1452        case "&": return "&amp;";
1453        case "\\": return "\\\\";
1454        case '"': return '&quot;';
1455        case "'": return '&#39;';
1456        case "<": return "&lt;";
1457        case ">": return "&gt;";
1458        default: return s;
1459        }
1460      });
1461    },
1462
1463    // by @langalex, support for arrays of strings
1464    create_context: function(_context) {
1465      if(this.is_object(_context)) {
1466        return _context;
1467      } else {
1468        var iterator = ".";
1469        if(this.pragmas["IMPLICIT-ITERATOR"]) {
1470          iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator;
1471        }
1472        var ctx = {};
1473        ctx[iterator] = _context;
1474        return ctx;
1475      }
1476    },
1477
1478    is_object: function(a) {
1479      return a && typeof a == "object";
1480    },
1481
1482    is_array: function(a) {
1483      return Object.prototype.toString.call(a) === '[object Array]';
1484    },
1485
1486    /*
1487      Gets rid of leading and trailing whitespace
1488    */
1489    trim: function(s) {
1490      return s.replace(/^\s*|\s*$/g, "");
1491    },
1492
1493    /*
1494      Why, why, why? Because IE. Cry, cry cry.
1495    */
1496    map: function(array, fn) {
1497      if (typeof array.map == "function") {
1498        return array.map(fn);
1499      } else {
1500        var r = [];
1501        var l = array.length;
1502        for(var i = 0; i < l; i++) {
1503          r.push(fn(array[i]));
1504        }
1505        return r;
1506      }
1507    }
1508  };
1509
1510  return({
1511    name: "mustache.js",
1512    version: "0.3.1-dev",
1513
1514    /*
1515      Turns a template and view into HTML
1516    */
1517    to_html: function(template, view, partials, send_fun) {
1518      var renderer = new Renderer();
1519      if(send_fun) {
1520        renderer.send = send_fun;
1521      }
1522      renderer.render(template, view, partials);
1523      if(!send_fun) {
1524        return renderer.buffer.join("\n");
1525      }
1526    }
1527  });
1528}();
1529</script>
1530		<script type="text/javascript">// Underscore.js 1.1.6
1531// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
1532// Underscore is freely distributable under the MIT license.
1533// Portions of Underscore are inspired or borrowed from Prototype,
1534// Oliver Steele's Functional, and John Resig's Micro-Templating.
1535// For all details and documentation:
1536// http://documentcloud.github.com/underscore
1537(function(){var p=this,C=p._,m={},i=Array.prototype,n=Object.prototype,f=i.slice,D=i.unshift,E=n.toString,l=n.hasOwnProperty,s=i.forEach,t=i.map,u=i.reduce,v=i.reduceRight,w=i.filter,x=i.every,y=i.some,o=i.indexOf,z=i.lastIndexOf;n=Array.isArray;var F=Object.keys,q=Function.prototype.bind,b=function(a){return new j(a)};typeof module!=="undefined"&&module.exports?(module.exports=b,b._=b):p._=b;b.VERSION="1.1.6";var h=b.each=b.forEach=function(a,c,d){if(a!=null)if(s&&a.forEach===s)a.forEach(c,d);else if(b.isNumber(a.length))for(var e=
15380,k=a.length;e<k;e++){if(c.call(d,a[e],e,a)===m)break}else for(e in a)if(l.call(a,e)&&c.call(d,a[e],e,a)===m)break};b.map=function(a,c,b){var e=[];if(a==null)return e;if(t&&a.map===t)return a.map(c,b);h(a,function(a,g,G){e[e.length]=c.call(b,a,g,G)});return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var k=d!==void 0;a==null&&(a=[]);if(u&&a.reduce===u)return e&&(c=b.bi