Skip to content
Browse files

Update to use latest Brunch with Hipsters.

  • Loading branch information...
1 parent 7792cf7 commit b00b38d0016cf884baef8e6b7c0abba12131d13c @elving committed Jan 5, 2013
Showing with 16,697 additions and 3,115 deletions.
  1. +35 −2 README.md
  2. 0 app/assets/crossdomain.xml
  3. BIN app/assets/fonts/fontawesome/FontAwesome.otf
  4. BIN app/assets/fonts/fontawesome/FontAwesome.ttf
  5. +8 −9 app/assets/fonts/fontawesome/README.md
  6. BIN app/assets/fonts/fontawesome/fontawesome-webfont.eot
  7. +0 −255 app/assets/fonts/fontawesome/fontawesome-webfont.svg
  8. BIN app/assets/fonts/fontawesome/fontawesome-webfont.ttf
  9. BIN app/assets/fonts/fontawesome/fontawesome-webfont.woff
  10. 0 app/assets/humans.txt
  11. +5 −4 app/assets/index.html
  12. +0 −4 app/assets/javascripts/modernizr-2.6.1.js
  13. +1,103 −0 app/assets/javascripts/modernizr.js
  14. 0 app/assets/robots.txt
  15. +1 −1 app/collections/{hacker_collection.coffee → hackers.coffee}
  16. +6 −1 app/initialize.coffee
  17. +0 −14 app/lib/app_helpers.coffee
  18. +3 −0 app/lib/collection.coffee
  19. +93 −0 app/lib/model.coffee
  20. +98 −0 app/lib/view.coffee
  21. +40 −0 app/models/search.coffee
  22. +0 −27 app/models/search_model.coffee
  23. +11 −0 app/views/app.coffee
  24. +0 −9 app/views/app_view.coffee
  25. +11 −0 app/views/hacker.coffee
  26. +0 −9 app/views/hacker_view.coffee
  27. +23 −0 app/views/hackers.coffee
  28. +0 −20 app/views/hackers_view.coffee
  29. +8 −3 app/views/{search_view.coffee → search.coffee}
  30. +2 −2 app/views/styles/_base.styl
  31. +13 −8 config.coffee
  32. 0 generators/collection/collection.coffee.hbs
  33. 0 generators/collection/generator.json
  34. +5 −0 generators/collection_test/collection_test.coffee.hbs
  35. 0 generators/collection_test/generator.json
  36. 0 generators/generator/generated_file.coffee.hbs
  37. 0 generators/generator/generator.json
  38. 0 generators/generator/generator.json.hbs
  39. 0 generators/model/generator.json
  40. 0 generators/model/model.coffee.hbs
  41. +1 −1 generators/model_test/generator.json
  42. 0 generators/model_test/model_test.coffee.hbs
  43. +19 −0 generators/module/generator.json
  44. +7 −0 generators/module/view.coffee.hbs
  45. 0 generators/style/generator.json
  46. +2 −1 generators/style/style.styl.hbs
  47. 0 generators/template/generator.json
  48. +1 −0 generators/template/template.hbs.hbs
  49. +1 −1 generators/view/generator.json
  50. +5 −1 generators/view/view.coffee.hbs
  51. +1 −1 generators/view_test/generator.json
  52. 0 generators/view_test/view_test.coffee.hbs
  53. +31 −33 package.json
  54. BIN public/fonts/fontawesome/FontAwesome.otf
  55. +8 −9 public/fonts/fontawesome/README.md
  56. BIN public/fonts/fontawesome/fontawesome-webfont.eot
  57. BIN public/fonts/fontawesome/fontawesome-webfont.ttf
  58. BIN public/fonts/fontawesome/fontawesome-webfont.woff
  59. BIN public/images/glyphicons-halflings-white.png
  60. BIN public/images/glyphicons-halflings.png
  61. +5 −4 public/index.html
  62. +804 −1 public/javascripts/app.js
  63. +1,103 −0 public/javascripts/modernizr.js
  64. +94 −0 public/test/javascripts/test.js
  65. 0 test/spec.coffee
  66. +4 −0 test/test-helpers.coffee
  67. +8 −0 test/views/app_view_test.coffee
  68. +545 −443 vendor/scripts/{backbone-0.9.2.js → backbone.js}
  69. +0 −201 vendor/scripts/backbone.mediator.js
  70. +0 −2 vendor/scripts/jquery-1.8.0.js
  71. +9,472 −0 vendor/scripts/jquery.js
  72. +2,178 −1,849 vendor/scripts/{lodash-v0.5.0-rc.1.js → lodash.js}
  73. +0 −1 vendor/scripts/swag-0.1.4.js
  74. +703 −0 vendor/scripts/swag.js
  75. +197 −31 vendor/styles/font-awesome.css
  76. 0 vendor/styles/helpers.css
  77. +43 −168 vendor/styles/normalize.css
View
37 README.md 100755 → 100644
@@ -1,3 +1,36 @@
-# Hackerank
+# Brunch with Hipsters and Bootstrap
-[Hackerank](http://hackerank.herokuapp.com/) is a [Brunch with Hipsters](https://github.com/elving/brunch-with-hipsters) example app that finds the top hackers from a github search.
+![image](http://www.latimes.com/media/photo/2011-07/63171841.jpg)
+
+Brunch with Hipsters is a rad [Brunch](http://brunch.io/) app skeleton that comes with unicorns out of the box. Take a look at [Hackerank (an example app)](https://github.com/elving/Hackerank) to see how it works. Brunch with Hipsters was awesome before awesome was awesome.
+
+## Languages
+
+- [CoffeeScript](http://coffeescript.org/)
+- [Stylus](http://learnboost.github.com/stylus/)
+- [Handlebars](http://handlebarsjs.com/)
+
+## Features
+
+- [Swag v0.2.1](https://github.com/elving/swag)
+- [Font Awesome v3.0](https://github.com/FortAwesome/Font-Awesome)
+- [Modernizr v2.6.2](https://github.com/Modernizr/Modernizr)
+- [Brunch Auto-Reload v1.3.2](https://github.com/brunch/auto-reload-brunch)
+- [Lodash v1.0.0-rc.3](https://github.com/bestiejs/lodash)
+- [HTML5 Boilerplate v3.0.0](https://github.com/h5bp/html5-boilerplate)
+- [Coffeelint 1.4.4](https://github.com/ilkosta/coffeelint-brunch)
+
+## Getting started
+
+ brunch new <appname> --skeleton git@github.com:elving/brunch-with-hipsters.git
+ brunch w -s
+
+or
+
+ $ git clone git@github.com:elving/brunch-with-hipsters.git
+ $ npm install
+ $ brunch w -s
+
+or
+
+ $ git clone git@github.com:elving/brunch-with-hipsters.git && npm install && brunch w -s
View
0 app/assets/crossdomain.xml 100755 → 100644
File mode changed.
View
BIN app/assets/fonts/fontawesome/FontAwesome.otf
Binary file not shown.
View
BIN app/assets/fonts/fontawesome/FontAwesome.ttf
Binary file not shown.
View
17 app/assets/fonts/fontawesome/README.md
@@ -1,18 +1,17 @@
-#Font Awesome 2.0
+#Font Awesome 3.0
##the iconic font designed for use with Twitter Bootstrap
The full suite of pictographic icons, examples, and documentation can be found at:
http://fortawesome.github.com/Font-Awesome/
+
+##License
+- The Font Awesome font is licensed under the SIL Open Font License - http://scripts.sil.org/OFL
+- Font Awesome CSS, LESS, and SASS files are licensed under the MIT License - http://opensource.org/licenses/mit-license.html
+- The Font Awesome pictograms are licensed under the CC BY 3.0 License - http://creativecommons.org/licenses/by/3.0/
+- Attribution is no longer required in Font Awesome 3.0, but much appreciated: "Font Awesome by Dave Gandy - http://fortawesome.github.com/Font-Awesome"
+
##Contact
- Email: dave@davegandy.com
- Twitter: http://twitter.com/fortaweso_me
- Work: Lead Product Designer @ http://kyru.us
-
-##License
-Version 2.0 of the Font Awesome font, CSS, and LESS files are licensed under CC BY 3.0:
-http://creativecommons.org/licenses/by/3.0/
-A mention of 'Font Awesome - http://fortawesome.github.com/Font-Awesome'
-in human-readable source code is considered acceptable attribution (most common on the
-web). If human readable source code is not available to the end user, a mention in an 'About'
-or 'Credits' screen is considered acceptable (most common in desktop or mobile software).
View
BIN app/assets/fonts/fontawesome/fontawesome-webfont.eot
Binary file not shown.
View
255 app/assets/fonts/fontawesome/fontawesome-webfont.svg
0 additions, 255 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
View
BIN app/assets/fonts/fontawesome/fontawesome-webfont.ttf
Binary file not shown.
View
BIN app/assets/fonts/fontawesome/fontawesome-webfont.woff
Binary file not shown.
View
0 app/assets/humans.txt 100755 → 100644
File mode changed.
View
9 app/assets/index.html 100755 → 100644
@@ -6,7 +6,7 @@
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
- <title>Hackerank</title>
+ <title></title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width">
@@ -17,9 +17,10 @@
window.brunch = window.brunch || {};
window.brunch['auto-reload'] = { enabled: true };
</script>
- <link rel='stylesheet' href='http://fonts.googleapis.com/css?family=Varela&subset=latin,latin-ext'>
+
+ <script src="javascripts/modernizr.js"></script>
+
<link rel="stylesheet" href="stylesheets/app.css">
- <script src="javascripts/modernizr-2.6.1.js"></script>
</head>
<body class="application">
@@ -51,7 +52,7 @@ <h1 class="application-title">Hackerank</h1>
<script src="javascripts/vendor.js" defer></script>
<script src="javascripts/app.js" defer onload="require('initialize');"></script>
- <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
+ <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
<script>
var _gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']];
(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
View
4 app/assets/javascripts/modernizr-2.6.1.js
@@ -1,4 +0,0 @@
-/* Modernizr 2.6.1 (Custom Build) | MIT & BSD
- * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-flexbox_legacy-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-printshiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
- */
-;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d<e;d++)u[c[d]]=c[d]in k;return u.list&&(u.list=!!b.createElement("datalist")&&!!a.HTMLDataListElement),u}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)k.setAttribute("type",f=a[d]),e=k.type!=="text",e&&(k.value=l,k.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&k.style.WebkitAppearance!==c?(g.appendChild(k),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(k,null).WebkitAppearance!=="textfield"&&k.offsetHeight!==0,g.removeChild(k)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=k.checkValidity&&k.checkValidity()===!1:e=k.value!=l)),t[a[d]]=!!e;return t}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var d="2.6.1",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k=b.createElement("input"),l=":)",m={}.toString,n=" -webkit- -moz- -o- -ms- ".split(" "),o="Webkit Moz O ms",p=o.split(" "),q=o.toLowerCase().split(" "),r={svg:"http://www.w3.org/2000/svg"},s={},t={},u={},v=[],w=v.slice,x,y=function(a,c,d,e){var f,i,j,k=b.createElement("div"),l=b.body,m=l?l:b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),k.appendChild(j);return f=["&#173;",'<style id="s',h,'">',a,"</style>"].join(""),k.id=h,(l?k:m).innerHTML+=f,m.appendChild(k),l||(m.style.background="",g.appendChild(m)),i=c(k,a),l?k.parentNode.removeChild(k):m.parentNode.removeChild(m),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(['#modernizr:after{content:"',l,'";visibility:hidden}'].join(""),function(b){a=b.offsetHeight>=1}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="<svg/>",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}function v(a){var b,c=a.getElementsByTagName("*"),d=c.length,e=RegExp("^(?:"+l().join("|")+")$","i"),f=[];while(d--)b=c[d],e.test(b.nodeName)&&f.push(b.applyElement(w(b)));return f}function w(a){var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(t+":"+a.nodeName);while(d--)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function x(a){var b,c=a.split("{"),d=c.length,e=RegExp("(^|[\\s,>+~])("+l().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),f="$1"+t+"\\:$2";while(d--)b=c[d]=c[d].split("}"),b[b.length-1]=b[b.length-1].replace(e,f),c[d]=b.join("}");return c.join("{")}function y(a){var b=a.length;while(b--)a[b].removeNode()}function z(a){function g(){clearTimeout(d._removeSheetTimer),b&&b.removeNode(!0),b=null}var b,c,d=m(a),e=a.namespaces,f=a.parentWindow;return!u||a.printShived?a:(typeof e[t]=="undefined"&&e.add(t),f.attachEvent("onbeforeprint",function(){g();var d,e,f,h=a.styleSheets,i=[],j=h.length,l=Array(j);while(j--)l[j]=h[j];while(f=l.pop())if(!f.disabled&&s.test(f.media)){try{d=f.imports,e=d.length}catch(m){e=0}for(j=0;j<e;j++)l.push(d[j]);try{i.push(f.cssText)}catch(m){}}i=x(i.reverse().join("")),c=v(a),b=k(a,i)}),f.attachEvent("onafterprint",function(){y(c),clearTimeout(d._removeSheetTimer),d._removeSheetTimer=setTimeout(g,500)}),a.printShived=!0,a)}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b);var s=/^$|\b(?:all|print)\b/,t="html5shiv",u=!j&&function(){var c=b.documentElement;return typeof b.namespaces!="undefined"&&typeof b.parentWindow!="undefined"&&typeof c.applyElement!="undefined"&&typeof c.removeNode!="undefined"&&typeof a.attachEvent!="undefined"}();r.type+=" print",r.shivPrint=z,z(b)}(this,document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
View
1,103 app/assets/javascripts/modernizr.js
@@ -0,0 +1,1103 @@
+/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
+ * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-flexboxlegacy-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-printshiv-mq-cssclasses-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
+ */
+;
+
+
+
+window.Modernizr = (function( window, document, undefined ) {
+
+ var version = '2.6.2',
+
+ Modernizr = {},
+
+ enableClasses = true,
+
+ docElement = document.documentElement,
+
+ mod = 'modernizr',
+ modElem = document.createElement(mod),
+ mStyle = modElem.style,
+
+ inputElem = document.createElement('input') ,
+
+ smile = ':)',
+
+ toString = {}.toString,
+
+ prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
+
+
+
+ omPrefixes = 'Webkit Moz O ms',
+
+ cssomPrefixes = omPrefixes.split(' '),
+
+ domPrefixes = omPrefixes.toLowerCase().split(' '),
+
+
+ tests = {},
+ inputs = {},
+ attrs = {},
+
+ classes = [],
+
+ slice = classes.slice,
+
+ featureName,
+
+
+ injectElementWithStyles = function( rule, callback, nodes, testnames ) {
+
+ var style, ret, node, docOverflow,
+ div = document.createElement('div'),
+ body = document.body,
+ fakeBody = body || document.createElement('body');
+
+ if ( parseInt(nodes, 10) ) {
+ while ( nodes-- ) {
+ node = document.createElement('div');
+ node.id = testnames ? testnames[nodes] : mod + (nodes + 1);
+ div.appendChild(node);
+ }
+ }
+
+ style = ['&#173;','<style id="s', mod, '">', rule, '</style>'].join('');
+ div.id = mod;
+ (body ? div : fakeBody).innerHTML += style;
+ fakeBody.appendChild(div);
+ if ( !body ) {
+ fakeBody.style.background = '';
+ fakeBody.style.overflow = 'hidden';
+ docOverflow = docElement.style.overflow;
+ docElement.style.overflow = 'hidden';
+ docElement.appendChild(fakeBody);
+ }
+
+ ret = callback(div, rule);
+ if ( !body ) {
+ fakeBody.parentNode.removeChild(fakeBody);
+ docElement.style.overflow = docOverflow;
+ } else {
+ div.parentNode.removeChild(div);
+ }
+
+ return !!ret;
+
+ },
+
+ testMediaQuery = function( mq ) {
+
+ var matchMedia = window.matchMedia || window.msMatchMedia;
+ if ( matchMedia ) {
+ return matchMedia(mq).matches;
+ }
+
+ var bool;
+
+ injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {
+ bool = (window.getComputedStyle ?
+ getComputedStyle(node, null) :
+ node.currentStyle)['position'] == 'absolute';
+ });
+
+ return bool;
+
+ },
+
+
+ isEventSupported = (function() {
+
+ var TAGNAMES = {
+ 'select': 'input', 'change': 'input',
+ 'submit': 'form', 'reset': 'form',
+ 'error': 'img', 'load': 'img', 'abort': 'img'
+ };
+
+ function isEventSupported( eventName, element ) {
+
+ element = element || document.createElement(TAGNAMES[eventName] || 'div');
+ eventName = 'on' + eventName;
+
+ var isSupported = eventName in element;
+
+ if ( !isSupported ) {
+ if ( !element.setAttribute ) {
+ element = document.createElement('div');
+ }
+ if ( element.setAttribute && element.removeAttribute ) {
+ element.setAttribute(eventName, '');
+ isSupported = is(element[eventName], 'function');
+
+ if ( !is(element[eventName], 'undefined') ) {
+ element[eventName] = undefined;
+ }
+ element.removeAttribute(eventName);
+ }
+ }
+
+ element = null;
+ return isSupported;
+ }
+ return isEventSupported;
+ })(),
+
+
+ _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;
+
+ if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {
+ hasOwnProp = function (object, property) {
+ return _hasOwnProperty.call(object, property);
+ };
+ }
+ else {
+ hasOwnProp = function (object, property) {
+ return ((property in object) && is(object.constructor.prototype[property], 'undefined'));
+ };
+ }
+
+
+ if (!Function.prototype.bind) {
+ Function.prototype.bind = function bind(that) {
+
+ var target = this;
+
+ if (typeof target != "function") {
+ throw new TypeError();
+ }
+
+ var args = slice.call(arguments, 1),
+ bound = function () {
+
+ if (this instanceof bound) {
+
+ var F = function(){};
+ F.prototype = target.prototype;
+ var self = new F();
+
+ var result = target.apply(
+ self,
+ args.concat(slice.call(arguments))
+ );
+ if (Object(result) === result) {
+ return result;
+ }
+ return self;
+
+ } else {
+
+ return target.apply(
+ that,
+ args.concat(slice.call(arguments))
+ );
+
+ }
+
+ };
+
+ return bound;
+ };
+ }
+
+ function setCss( str ) {
+ mStyle.cssText = str;
+ }
+
+ function setCssAll( str1, str2 ) {
+ return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
+ }
+
+ function is( obj, type ) {
+ return typeof obj === type;
+ }
+
+ function contains( str, substr ) {
+ return !!~('' + str).indexOf(substr);
+ }
+
+ function testProps( props, prefixed ) {
+ for ( var i in props ) {
+ var prop = props[i];
+ if ( !contains(prop, "-") && mStyle[prop] !== undefined ) {
+ return prefixed == 'pfx' ? prop : true;
+ }
+ }
+ return false;
+ }
+
+ function testDOMProps( props, obj, elem ) {
+ for ( var i in props ) {
+ var item = obj[props[i]];
+ if ( item !== undefined) {
+
+ if (elem === false) return props[i];
+
+ if (is(item, 'function')){
+ return item.bind(elem || obj);
+ }
+
+ return item;
+ }
+ }
+ return false;
+ }
+
+ function testPropsAll( prop, prefixed, elem ) {
+
+ var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),
+ props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');
+
+ if(is(prefixed, "string") || is(prefixed, "undefined")) {
+ return testProps(props, prefixed);
+
+ } else {
+ props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');
+ return testDOMProps(props, prefixed, elem);
+ }
+ } tests['flexbox'] = function() {
+ return testPropsAll('flexWrap');
+ };
+
+
+ tests['flexboxlegacy'] = function() {
+ return testPropsAll('boxDirection');
+ };
+
+
+ tests['canvas'] = function() {
+ var elem = document.createElement('canvas');
+ return !!(elem.getContext && elem.getContext('2d'));
+ };
+
+ tests['canvastext'] = function() {
+ return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));
+ };
+ tests['postmessage'] = function() {
+ return !!window.postMessage;
+ };
+
+
+ tests['websqldatabase'] = function() {
+ return !!window.openDatabase;
+ };
+
+ tests['indexedDB'] = function() {
+ return !!testPropsAll("indexedDB", window);
+ };
+
+ tests['hashchange'] = function() {
+ return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);
+ };
+
+ tests['history'] = function() {
+ return !!(window.history && history.pushState);
+ };
+
+ tests['draganddrop'] = function() {
+ var div = document.createElement('div');
+ return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);
+ };
+
+ tests['websockets'] = function() {
+ return 'WebSocket' in window || 'MozWebSocket' in window;
+ };
+
+
+ tests['rgba'] = function() {
+ setCss('background-color:rgba(150,255,150,.5)');
+
+ return contains(mStyle.backgroundColor, 'rgba');
+ };
+
+ tests['hsla'] = function() {
+ setCss('background-color:hsla(120,40%,100%,.5)');
+
+ return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');
+ };
+
+ tests['multiplebgs'] = function() {
+ setCss('background:url(https://),url(https://),red url(https://)');
+
+ return (/(url\s*\(.*?){3}/).test(mStyle.background);
+ }; tests['backgroundsize'] = function() {
+ return testPropsAll('backgroundSize');
+ };
+
+ tests['borderimage'] = function() {
+ return testPropsAll('borderImage');
+ };
+
+
+
+ tests['borderradius'] = function() {
+ return testPropsAll('borderRadius');
+ };
+
+ tests['boxshadow'] = function() {
+ return testPropsAll('boxShadow');
+ };
+
+ tests['textshadow'] = function() {
+ return document.createElement('div').style.textShadow === '';
+ };
+
+
+ tests['opacity'] = function() {
+ setCssAll('opacity:.55');
+
+ return (/^0.55$/).test(mStyle.opacity);
+ };
+
+
+ tests['cssanimations'] = function() {
+ return testPropsAll('animationName');
+ };
+
+
+ tests['csscolumns'] = function() {
+ return testPropsAll('columnCount');
+ };
+
+
+ tests['cssgradients'] = function() {
+ var str1 = 'background-image:',
+ str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',
+ str3 = 'linear-gradient(left top,#9f9, white);';
+
+ setCss(
+ (str1 + '-webkit- '.split(' ').join(str2 + str1) +
+ prefixes.join(str3 + str1)).slice(0, -str1.length)
+ );
+
+ return contains(mStyle.backgroundImage, 'gradient');
+ };
+
+
+ tests['cssreflections'] = function() {
+ return testPropsAll('boxReflect');
+ };
+
+
+ tests['csstransforms'] = function() {
+ return !!testPropsAll('transform');
+ };
+
+
+ tests['csstransforms3d'] = function() {
+
+ var ret = !!testPropsAll('perspective');
+
+ if ( ret && 'webkitPerspective' in docElement.style ) {
+
+ injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {
+ ret = node.offsetLeft === 9 && node.offsetHeight === 3;
+ });
+ }
+ return ret;
+ };
+
+
+ tests['csstransitions'] = function() {
+ return testPropsAll('transition');
+ };
+
+
+
+ tests['fontface'] = function() {
+ var bool;
+
+ injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) {
+ var style = document.getElementById('smodernizr'),
+ sheet = style.sheet || style.styleSheet,
+ cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';
+
+ bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;
+ });
+
+ return bool;
+ };
+
+ tests['generatedcontent'] = function() {
+ var bool;
+
+ injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {
+ bool = node.offsetHeight >= 3;
+ });
+
+ return bool;
+ };
+ tests['video'] = function() {
+ var elem = document.createElement('video'),
+ bool = false;
+
+ try {
+ if ( bool = !!elem.canPlayType ) {
+ bool = new Boolean(bool);
+ bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,'');
+
+ bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,'');
+
+ bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,'');
+ }
+
+ } catch(e) { }
+
+ return bool;
+ };
+
+ tests['audio'] = function() {
+ var elem = document.createElement('audio'),
+ bool = false;
+
+ try {
+ if ( bool = !!elem.canPlayType ) {
+ bool = new Boolean(bool);
+ bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,'');
+ bool.mp3 = elem.canPlayType('audio/mpeg;') .replace(/^no$/,'');
+
+ bool.wav = elem.canPlayType('audio/wav; codecs="1"') .replace(/^no$/,'');
+ bool.m4a = ( elem.canPlayType('audio/x-m4a;') ||
+ elem.canPlayType('audio/aac;')) .replace(/^no$/,'');
+ }
+ } catch(e) { }
+
+ return bool;
+ };
+
+
+ tests['localstorage'] = function() {
+ try {
+ localStorage.setItem(mod, mod);
+ localStorage.removeItem(mod);
+ return true;
+ } catch(e) {
+ return false;
+ }
+ };
+
+ tests['sessionstorage'] = function() {
+ try {
+ sessionStorage.setItem(mod, mod);
+ sessionStorage.removeItem(mod);
+ return true;
+ } catch(e) {
+ return false;
+ }
+ };
+
+
+ tests['webworkers'] = function() {
+ return !!window.Worker;
+ };
+
+
+ tests['applicationcache'] = function() {
+ return !!window.applicationCache;
+ };
+
+
+ function webforms() {
+ Modernizr['input'] = (function( props ) {
+ for ( var i = 0, len = props.length; i < len; i++ ) {
+ attrs[ props[i] ] = !!(props[i] in inputElem);
+ }
+ if (attrs.list){
+ attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);
+ }
+ return attrs;
+ })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));
+ Modernizr['inputtypes'] = (function(props) {
+
+ for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {
+
+ inputElem.setAttribute('type', inputElemType = props[i]);
+ bool = inputElem.type !== 'text';
+
+ if ( bool ) {
+
+ inputElem.value = smile;
+ inputElem.style.cssText = 'position:absolute;visibility:hidden;';
+
+ if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {
+
+ docElement.appendChild(inputElem);
+ defaultView = document.defaultView;
+
+ bool = defaultView.getComputedStyle &&
+ defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&
+ (inputElem.offsetHeight !== 0);
+
+ docElement.removeChild(inputElem);
+
+ } else if ( /^(search|tel)$/.test(inputElemType) ){
+ } else if ( /^(url|email)$/.test(inputElemType) ) {
+ bool = inputElem.checkValidity && inputElem.checkValidity() === false;
+
+ } else {
+ bool = inputElem.value != smile;
+ }
+ }
+
+ inputs[ props[i] ] = !!bool;
+ }
+ return inputs;
+ })('search tel url email datetime date month week time datetime-local number range color'.split(' '));
+ }
+ for ( var feature in tests ) {
+ if ( hasOwnProp(tests, feature) ) {
+ featureName = feature.toLowerCase();
+ Modernizr[featureName] = tests[feature]();
+
+ classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);
+ }
+ }
+
+ Modernizr.input || webforms();
+
+
+ Modernizr.addTest = function ( feature, test ) {
+ if ( typeof feature == 'object' ) {
+ for ( var key in feature ) {
+ if ( hasOwnProp( feature, key ) ) {
+ Modernizr.addTest( key, feature[ key ] );
+ }
+ }
+ } else {
+
+ feature = feature.toLowerCase();
+
+ if ( Modernizr[feature] !== undefined ) {
+ return Modernizr;
+ }
+
+ test = typeof test == 'function' ? test() : test;
+
+ if (typeof enableClasses !== "undefined" && enableClasses) {
+ docElement.className += ' ' + (test ? '' : 'no-') + feature;
+ }
+ Modernizr[feature] = test;
+
+ }
+
+ return Modernizr;
+ };
+
+
+ setCss('');
+ modElem = inputElem = null;
+
+
+ Modernizr._version = version;
+
+ Modernizr._prefixes = prefixes;
+ Modernizr._domPrefixes = domPrefixes;
+ Modernizr._cssomPrefixes = cssomPrefixes;
+
+ Modernizr.mq = testMediaQuery;
+
+ Modernizr.hasEvent = isEventSupported;
+
+ Modernizr.testProp = function(prop){
+ return testProps([prop]);
+ };
+
+ Modernizr.testAllProps = testPropsAll;
+
+
+ Modernizr.testStyles = injectElementWithStyles; docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') +
+
+ (enableClasses ? ' js ' + classes.join(' ') : '');
+
+ return Modernizr;
+
+})(this, this.document);
+/*! HTML5 Shiv v3.6 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */
+;(function(window, document) {
+/*jshint evil:true */
+ /** Preset options */
+ var options = window.html5 || {};
+
+ /** Used to skip problem elements */
+ var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
+
+ /** Not all elements can be cloned in IE (this list can be shortend) **/
+ var saveClones = /^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i;
+
+ /** Detect whether the browser supports default html5 styles */
+ var supportsHtml5Styles;
+
+ /** Name of the expando, to work with multiple documents or to re-shiv one document */
+ var expando = '_html5shiv';
+
+ /** The id for the the documents expando */
+ var expanID = 0;
+
+ /** Cached data for each document */
+ var expandoData = {};
+
+ /** Detect whether the browser supports unknown elements */
+ var supportsUnknownElements;
+
+ (function() {
+ try {
+ var a = document.createElement('a');
+ a.innerHTML = '<xyz></xyz>';
+ //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
+ supportsHtml5Styles = ('hidden' in a);
+
+ supportsUnknownElements = a.childNodes.length == 1 || (function() {
+ // assign a false positive if unable to shiv
+ (document.createElement)('a');
+ var frag = document.createDocumentFragment();
+ return (
+ typeof frag.cloneNode == 'undefined' ||
+ typeof frag.createDocumentFragment == 'undefined' ||
+ typeof frag.createElement == 'undefined'
+ );
+ }());
+ } catch(e) {
+ supportsHtml5Styles = true;
+ supportsUnknownElements = true;
+ }
+
+ }());
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Creates a style sheet with the given CSS text and adds it to the document.
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @param {String} cssText The CSS text.
+ * @returns {StyleSheet} The style element.
+ */
+ function addStyleSheet(ownerDocument, cssText) {
+ var p = ownerDocument.createElement('p'),
+ parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
+
+ p.innerHTML = 'x<style>' + cssText + '</style>';
+ return parent.insertBefore(p.lastChild, parent.firstChild);
+ }
+
+ /**
+ * Returns the value of `html5.elements` as an array.
+ * @private
+ * @returns {Array} An array of shived element node names.
+ */
+ function getElements() {
+ var elements = html5.elements;
+ return typeof elements == 'string' ? elements.split(' ') : elements;
+ }
+
+ /**
+ * Returns the data associated to the given document
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @returns {Object} An object of data.
+ */
+ function getExpandoData(ownerDocument) {
+ var data = expandoData[ownerDocument[expando]];
+ if (!data) {
+ data = {};
+ expanID++;
+ ownerDocument[expando] = expanID;
+ expandoData[expanID] = data;
+ }
+ return data;
+ }
+
+ /**
+ * returns a shived element for the given nodeName and document
+ * @memberOf html5
+ * @param {String} nodeName name of the element
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived element.
+ */
+ function createElement(nodeName, ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createElement(nodeName);
+ }
+ if (!data) {
+ data = getExpandoData(ownerDocument);
+ }
+ var node;
+
+ if (data.cache[nodeName]) {
+ node = data.cache[nodeName].cloneNode();
+ } else if (saveClones.test(nodeName)) {
+ node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
+ } else {
+ node = data.createElem(nodeName);
+ }
+
+ // Avoid adding some elements to fragments in IE < 9 because
+ // * Attributes like `name` or `type` cannot be set/changed once an element
+ // is inserted into a document/fragment
+ // * Link elements with `src` attributes that are inaccessible, as with
+ // a 403 response, will cause the tab/window to crash
+ // * Script elements appended to fragments will execute when their `src`
+ // or `text` property is set
+ return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;
+ }
+
+ /**
+ * returns a shived DocumentFragment for the given document
+ * @memberOf html5
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived DocumentFragment.
+ */
+ function createDocumentFragment(ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createDocumentFragment();
+ }
+ data = data || getExpandoData(ownerDocument);
+ var clone = data.frag.cloneNode(),
+ i = 0,
+ elems = getElements(),
+ l = elems.length;
+ for(;i<l;i++){
+ clone.createElement(elems[i]);
+ }
+ return clone;
+ }
+
+ /**
+ * Shivs the `createElement` and `createDocumentFragment` methods of the document.
+ * @private
+ * @param {Document|DocumentFragment} ownerDocument The document.
+ * @param {Object} data of the document.
+ */
+ function shivMethods(ownerDocument, data) {
+ if (!data.cache) {
+ data.cache = {};
+ data.createElem = ownerDocument.createElement;
+ data.createFrag = ownerDocument.createDocumentFragment;
+ data.frag = data.createFrag();
+ }
+
+
+ ownerDocument.createElement = function(nodeName) {
+ //abort shiv
+ if (!html5.shivMethods) {
+ return data.createElem(nodeName);
+ }
+ return createElement(nodeName, ownerDocument, data);
+ };
+
+ ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
+ 'var n=f.cloneNode(),c=n.createElement;' +
+ 'h.shivMethods&&(' +
+ // unroll the `createElement` calls
+ getElements().join().replace(/\w+/g, function(nodeName) {
+ data.createElem(nodeName);
+ data.frag.createElement(nodeName);
+ return 'c("' + nodeName + '")';
+ }) +
+ ');return n}'
+ )(html5, data.frag);
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Shivs the given document.
+ * @memberOf html5
+ * @param {Document} ownerDocument The document to shiv.
+ * @returns {Document} The shived document.
+ */
+ function shivDocument(ownerDocument) {
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ var data = getExpandoData(ownerDocument);
+
+ if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
+ data.hasCSS = !!addStyleSheet(ownerDocument,
+ // corrects block display not defined in IE6/7/8/9
+ 'article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}' +
+ // adds styling not present in IE6/7/8/9
+ 'mark{background:#FF0;color:#000}'
+ );
+ }
+ if (!supportsUnknownElements) {
+ shivMethods(ownerDocument, data);
+ }
+ return ownerDocument;
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * The `html5` object is exposed so that more elements can be shived and
+ * existing shiving can be detected on iframes.
+ * @type Object
+ * @example
+ *
+ * // options can be changed before the script is included
+ * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
+ */
+ var html5 = {
+
+ /**
+ * An array or space separated string of node names of the elements to shiv.
+ * @memberOf html5
+ * @type Array|String
+ */
+ 'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video',
+
+ /**
+ * A flag to indicate that the HTML5 style sheet should be inserted.
+ * @memberOf html5
+ * @type Boolean
+ */
+ 'shivCSS': (options.shivCSS !== false),
+
+ /**
+ * Is equal to true if a browser supports creating unknown/HTML5 elements
+ * @memberOf html5
+ * @type boolean
+ */
+ 'supportsUnknownElements': supportsUnknownElements,
+
+ /**
+ * A flag to indicate that the document's `createElement` and `createDocumentFragment`
+ * methods should be overwritten.
+ * @memberOf html5
+ * @type Boolean
+ */
+ 'shivMethods': (options.shivMethods !== false),
+
+ /**
+ * A string to describe the type of `html5` object ("default" or "default print").
+ * @memberOf html5
+ * @type String
+ */
+ 'type': 'default',
+
+ // shivs the document according to the specified `html5` object options
+ 'shivDocument': shivDocument,
+
+ //creates a shived element
+ createElement: createElement,
+
+ //creates a shived documentFragment
+ createDocumentFragment: createDocumentFragment
+ };
+
+ /*--------------------------------------------------------------------------*/
+
+ // expose html5
+ window.html5 = html5;
+
+ // shiv the document
+ shivDocument(document);
+
+ /*------------------------------- Print Shiv -------------------------------*/
+
+ /** Used to filter media types */
+ var reMedia = /^$|\b(?:all|print)\b/;
+
+ /** Used to namespace printable elements */
+ var shivNamespace = 'html5shiv';
+
+ /** Detect whether the browser supports shivable style sheets */
+ var supportsShivableSheets = !supportsUnknownElements && (function() {
+ // assign a false negative if unable to shiv
+ var docEl = document.documentElement;
+ return !(
+ typeof document.namespaces == 'undefined' ||
+ typeof document.parentWindow == 'undefined' ||
+ typeof docEl.applyElement == 'undefined' ||
+ typeof docEl.removeNode == 'undefined' ||
+ typeof window.attachEvent == 'undefined'
+ );
+ }());
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Wraps all HTML5 elements in the given document with printable elements.
+ * (eg. the "header" element is wrapped with the "html5shiv:header" element)
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @returns {Array} An array wrappers added.
+ */
+ function addWrappers(ownerDocument) {
+ var node,
+ nodes = ownerDocument.getElementsByTagName('*'),
+ index = nodes.length,
+ reElements = RegExp('^(?:' + getElements().join('|') + ')$', 'i'),
+ result = [];
+
+ while (index--) {
+ node = nodes[index];
+ if (reElements.test(node.nodeName)) {
+ result.push(node.applyElement(createWrapper(node)));
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Creates a printable wrapper for the given element.
+ * @private
+ * @param {Element} element The element.
+ * @returns {Element} The wrapper.
+ */
+ function createWrapper(element) {
+ var node,
+ nodes = element.attributes,
+ index = nodes.length,
+ wrapper = element.ownerDocument.createElement(shivNamespace + ':' + element.nodeName);
+
+ // copy element attributes to the wrapper
+ while (index--) {
+ node = nodes[index];
+ node.specified && wrapper.setAttribute(node.nodeName, node.nodeValue);
+ }
+ // copy element styles to the wrapper
+ wrapper.style.cssText = element.style.cssText;
+ return wrapper;
+ }
+
+ /**
+ * Shivs the given CSS text.
+ * (eg. header{} becomes html5shiv\:header{})
+ * @private
+ * @param {String} cssText The CSS text to shiv.
+ * @returns {String} The shived CSS text.
+ */
+ function shivCssText(cssText) {
+ var pair,
+ parts = cssText.split('{'),
+ index = parts.length,
+ reElements = RegExp('(^|[\\s,>+~])(' + getElements().join('|') + ')(?=[[\\s,>+~#.:]|$)', 'gi'),
+ replacement = '$1' + shivNamespace + '\\:$2';
+
+ while (index--) {
+ pair = parts[index] = parts[index].split('}');
+ pair[pair.length - 1] = pair[pair.length - 1].replace(reElements, replacement);
+ parts[index] = pair.join('}');
+ }
+ return parts.join('{');
+ }
+
+ /**
+ * Removes the given wrappers, leaving the original elements.
+ * @private
+ * @params {Array} wrappers An array of printable wrappers.
+ */
+ function removeWrappers(wrappers) {
+ var index = wrappers.length;
+ while (index--) {
+ wrappers[index].removeNode();
+ }
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Shivs the given document for print.
+ * @memberOf html5
+ * @param {Document} ownerDocument The document to shiv.
+ * @returns {Document} The shived document.
+ */
+ function shivPrint(ownerDocument) {
+ var shivedSheet,
+ wrappers,
+ data = getExpandoData(ownerDocument),
+ namespaces = ownerDocument.namespaces,
+ ownerWindow = ownerDocument.parentWindow;
+
+ if (!supportsShivableSheets || ownerDocument.printShived) {
+ return ownerDocument;
+ }
+ if (typeof namespaces[shivNamespace] == 'undefined') {
+ namespaces.add(shivNamespace);
+ }
+
+ function removeSheet() {
+ clearTimeout(data._removeSheetTimer);
+ if (shivedSheet) {
+ shivedSheet.removeNode(true);
+ }
+ shivedSheet= null;
+ }
+
+ ownerWindow.attachEvent('onbeforeprint', function() {
+
+ removeSheet();
+
+ var imports,
+ length,
+ sheet,
+ collection = ownerDocument.styleSheets,
+ cssText = [],
+ index = collection.length,
+ sheets = Array(index);
+
+ // convert styleSheets collection to an array
+ while (index--) {
+ sheets[index] = collection[index];
+ }
+ // concat all style sheet CSS text
+ while ((sheet = sheets.pop())) {
+ // IE does not enforce a same origin policy for external style sheets...
+ // but has trouble with some dynamically created stylesheets
+ if (!sheet.disabled && reMedia.test(sheet.media)) {
+
+ try {
+ imports = sheet.imports;
+ length = imports.length;
+ } catch(er){
+ length = 0;
+ }
+
+ for (index = 0; index < length; index++) {
+ sheets.push(imports[index]);
+ }
+
+ try {
+ cssText.push(sheet.cssText);
+ } catch(er){}
+ }
+ }
+
+ // wrap all HTML5 elements with printable elements and add the shived style sheet
+ cssText = shivCssText(cssText.reverse().join(''));
+ wrappers = addWrappers(ownerDocument);
+ shivedSheet = addStyleSheet(ownerDocument, cssText);
+
+ });
+
+ ownerWindow.attachEvent('onafterprint', function() {
+ // remove wrappers, leaving the original elements, and remove the shived style sheet
+ removeWrappers(wrappers);
+ clearTimeout(data._removeSheetTimer);
+ data._removeSheetTimer = setTimeout(removeSheet, 500);
+ });
+
+ ownerDocument.printShived = true;
+ return ownerDocument;
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ // expose API
+ html5.type += ' print';
+ html5.shivPrint = shivPrint;
+
+ // shiv for print
+ shivPrint(document);
+
+}(this, document));/*yepnope1.5.4|WTFPL*/
+(function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}})(this,document);
+Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0));};
+;
+
View
0 app/assets/robots.txt 100755 → 100644
File mode changed.
View
2 app/collections/hacker_collection.coffee → app/collections/hackers.coffee
@@ -1,3 +1,3 @@
module.exports = class HackerCollection extends Backbone.Collection
initialize: ->
- Backbone.Mediator.subscribe 'hacker:added', (hacker) => @add hacker
+ Backbone.Events.on 'hacker:added', (hacker) => @add hacker
View
7 app/initialize.coffee 100755 → 100644
@@ -5,6 +5,11 @@ Hackerank.Views ?= {}
Hackerank.Models ?= {}
Hackerank.Collections ?= {}
+# Load App Helpers
+require 'lib/app_helpers'
+
$ ->
+ AppView = require 'views/app'
+
# Initialize App
- Hackerank.Views.AppView = new AppView = require 'views/app_view'
+ Hackerank.Views.App = new AppView()
View
14 app/lib/app_helpers.coffee 100755 → 100644
@@ -15,19 +15,5 @@
console[method] = console[method] or dummy while method = methods.pop()
)()
- # Extend Backbone Views
- Backbone.View::template = ->
-
- Backbone.View::getRenderData = ->
-
- Backbone.View::render = ->
- console.debug "Rendering #{@constructor.name}", @
- @$el.html @template @getRenderData()
- @afterRender()
- @
-
- Backbone.View::afterRender = ->
- # console.debug "Rendered #{@constructor.name}", @
-
# Put your handlebars.js helpers here.
)()
View
3 app/lib/collection.coffee
@@ -0,0 +1,3 @@
+module.exports = class Collection extends Backbone.Collection
+ resetSilent: (models) ->
+ @reset(models, silent: yes)
View
93 app/lib/model.coffee
@@ -0,0 +1,93 @@
+module.exports = class Model extends Backbone.Model
+ setSilent: (attributes) ->
+ @set(attributes, { silent: yes })
+
+ push: (attribute, values...) ->
+ obj = {}
+ attr = @get(attribute)
+
+ attr.push(values...)
+ obj[attribute] = attr
+
+ @set(obj)
+
+ pop: (attribute) ->
+ obj = {}
+ attr = @get(attribute)
+
+ attr.pop()
+ obj[attribute] = attr
+
+ @set(obj)
+
+ reverse: (attribute) ->
+ obj = {}
+ attr = @get(attribute)
+
+ attr.reverse()
+ obj[attribute] = attr
+
+ @set(obj)
+
+ shift: (attribute) ->
+ obj = {}
+ attr = @get(attribute)
+
+ attr.shift()
+ obj[attribute] = attr
+
+ @set(obj)
+
+ unshift: (attribute, values...) ->
+ obj = {}
+ attr = @get(attribute)
+
+ attr.unshift(values...)
+ obj[attribute] = attr
+
+ @set(obj)
+
+ splice: (attribute, values...) ->
+ obj = {}
+ attr = @get(attribute)
+
+ attr.splice(values...)
+ obj[attribute] = attr
+
+ @set(obj)
+
+ add: (attribute, values...) ->
+ obj = {}
+ attr = @get(attribute)
+
+ attr += value for value in values
+ obj[attribute] = attr
+
+ @set(obj)
+
+ subtract: (attribute, values...) ->
+ obj = {}
+ attr = @get(attribute)
+
+ attr -= value for value in values
+ obj[attribute] = attr
+
+ @set(obj)
+
+ divide: (attribute, values...) ->
+ obj = {}
+ attr = @get(attribute)
+
+ attr /= value for value in values
+ obj[attribute] = attr
+
+ @set(obj)
+
+ multiply: (attribute, values...) ->
+ obj = {}
+ attr = @get(attribute)
+
+ attr *= value for value in values
+ obj[attribute] = attr
+
+ @set(obj)
View
98 app/lib/view.coffee
@@ -0,0 +1,98 @@
+Model = require 'lib/model'
+
+module.exports = class View extends Backbone.View
+ debug: off
+
+ startDebugging: ->
+ @on "#{@cid}:initialize", -> console.debug "Initialized #{@name}", @
+ @on "#{@cid}:render", -> console.debug "Rendered #{@name}", @
+ @on "#{@cid}:update", -> console.debug "Updated #{@name}", @
+ @on "#{@cid}:destroy", -> console.debug "Destroyed #{@name}", @
+
+ type: 'view'
+
+ name: null
+
+ autoRender: off
+
+ rendered: no
+
+ model: new Model()
+
+ template: -> ''
+
+ # jQuery Shortcuts
+ html: (dom) ->
+ @$el.html(dom)
+ @trigger "#{@cid}:#{if @rendered then 'update' else 'render'}", @
+ @$el
+
+ append: (dom) ->
+ @$el.append(dom)
+ @trigger "#{@cid}:#{if @rendered then 'update' else 'render'}", @
+ @$el
+
+ prepend: (dom) ->
+ @$el.prepend(dom)
+ @trigger "#{@cid}:#{if @rendered then 'update' else 'render'}", @
+ @$el
+
+ after: (dom) ->
+ @$el.after(dom)
+ @trigger "#{@cid}:update", @
+ @$el
+
+ before: (dom) ->
+ @$el.after(dom)
+ @trigger "#{@cid}:update", @
+ @$el
+
+ css: (css) ->
+ @$el.css(css)
+ @trigger "#{@cid}:update", @
+ @$el
+
+ find: (selector) ->
+ @$el.find(selector)
+
+ delegate: (event, selector, handler) ->
+ handler = selector if arguments.length is 2
+ handler = (handler).bind @
+
+ if arguments.length is 2
+ @$el.on event, handler
+ else
+ @$el.on event, selector, handler
+
+ # Use bootstrap method instead of initialize
+ bootstrap: ->
+
+ initialize: ->
+ @bootstrap()
+
+ @name = @name or @constructor.name
+ @startDebugging() if @debug is on
+ @render() if @autoRender is on
+
+ @trigger "#{@cid}:initialize", @
+
+ getRenderData: ->
+ @model?.toJSON()
+
+ render: ->
+ @trigger "#{@cid}:render:before", @
+
+ @$el.attr('data-cid', @cid)
+ @html @template(@getRenderData())
+ @rendered = yes
+
+ @trigger "#{@cid}:render:after", @
+ @
+
+ destroy: (keepDOM = no) ->
+ @trigger "#{@cid}:destroy:before", @
+
+ if keepDOM then @dispose() else @remove()
+ @model?.destroy()
+
+ @trigger "#{@cid}:destroy:after", @
View
40 app/models/search.coffee
@@ -0,0 +1,40 @@
+module.exports = class SearchModel extends Backbone.Model
+ defaults:
+ query: ''
+
+ validate: (attrs) ->
+ return 'Query can\'t be empty' unless attrs.query
+
+ initialize: ->
+ @on 'change:query', @search
+
+ search: ->
+ url = "https://api.github.com/legacy/repos/search/"
+
+ $.getJSON("#{url}#{@get('query')}?callback=?").done (response) =>
+ repos = response.data.repositories
+ repos = _.sortBy repos, (repo) -> -repo.watchers
+ @searchHackers repos.slice 0, 3
+
+ searchHackers: (repos) ->
+ place = 1
+ find = ->
+ repo = repos.shift()
+ url = "https://api.github.com/users/#{repo.owner}?callback=?"
+
+ $.getJSON(url).done (hacker) =>
+ hacker = hacker.data
+
+ _.extend hacker, {
+ place: place
+ repoUrl: repo.url
+ repoName: repo.name
+ repoLanguage: repo.language
+ repoFollowers: repo.followers
+ }
+
+ Backbone.Events.trigger 'hacker:added', hacker
+ place += 1
+ find() if repos.length > 0
+
+ find()
View
27 app/models/search_model.coffee
@@ -1,27 +0,0 @@
-module.exports = class SearchModel extends Backbone.Model
- defaults:
- query: ''
-
- validate: (attrs) ->
- return 'Query can\'t be empty' unless attrs.query
-
- initialize: ->
- @on 'change:query', @search
-
- search: ->
- $.getJSON("https://api.github.com/legacy/repos/search/#{@get('query')}?callback=?").done (response) =>
- repos = _.sortBy response.data.repositories, (repo) -> -repo.watchers
- @searchHackers repos.slice 0, 3
-
- searchHackers: (repos) ->
- place = 1
- findHacker = ->
- repo = repos.shift()
- $.getJSON("https://api.github.com/users/#{repo.owner}?callback=?").done (hacker) =>
- hacker = hacker.data
- _.extend hacker, { repoName: repo.name, repoLanguage: repo.language, repoFollowers: repo.followers, repoUrl: repo.url, place: place }
- Backbone.Mediator.publish 'hacker:added', hacker
- place += 1
- findHacker() if repos.length > 0
-
- findHacker()
View
11 app/views/app.coffee
@@ -0,0 +1,11 @@
+View = require 'lib/view'
+SearchView = require 'views/search'
+HackersView = require 'views/hackers'
+
+module.exports = class AppView extends View
+ el: 'body.application'
+
+ initialize: ->
+ Hackerank.Views.Search = new SearchView()
+ Hackerank.Views.Hackers = new HackersView()
+
View
9 app/views/app_view.coffee
@@ -1,9 +0,0 @@
-module.exports = class AppView extends Backbone.View
- el: 'body.application'
-
- initialize: ->
- require '../lib/app_helpers'
- Hackerank.Routers.AppRouter = new AppRouter = require '../routers/app_router'
- Hackerank.Views.SearchView = new SearchView = require './search_view'
- Hackerank.Views.HackersView = new HackersView = require './hackers_view'
-
View
11 app/views/hacker.coffee
@@ -0,0 +1,11 @@
+View = require 'lib/view'
+
+module.exports = class HackerView extends View
+ tagName: 'li'
+
+ className: 'hacker clearfix'
+
+ template: require 'views/templates/hacker'
+
+ getRenderData: ->
+ @model.toJSON()
View
9 app/views/hacker_view.coffee
@@ -1,9 +0,0 @@
-module.exports = class HackerView extends Backbone.View
- tagName: 'li'
-
- className: 'hacker clearfix'
-
- template: require './templates/hacker'
-
- getRenderData: ->
- @model.toJSON()
View
23 app/views/hackers.coffee
@@ -0,0 +1,23 @@
+View = require 'lib/view'
+Collection = require 'collections/hackers'
+HackerView = require 'views/hacker'
+
+module.exports = class HackersView extends View
+ el: 'section.hackers'
+
+ initialize: ->
+ @collection = Hackerank.Collections.Hackers = new Collection()
+ @collection.on 'add', @addHacker, @
+
+ Backbone.Events.on 'search:new', @cleanResults, @
+
+ cleanResults: ->
+ @collection.reset()
+ @$el.find('ol.hackers-list').empty().attr 'data-state', 'loading'
+
+ addHacker: (hacker) ->
+ view = new HackerView model: hacker
+ @$el.find('ol.hackers-list')
+ .attr('data-state', 'default')
+ .append(view.render().el)
+
View
20 app/views/hackers_view.coffee
@@ -1,20 +0,0 @@
-module.exports = class HackersView extends Backbone.View
- el: 'section.hackers'
-
- subscriptions:
- 'search:new': 'cleanResults'
-
- initialize: ->
- @collection = Hackerank.Collections.HackerCollection = new HackerCollection = require '../collections/hacker_collection'
- @collection.on 'add', @addHacker, @
-
- cleanResults: ->
- @collection.reset()
- @$el.find('ol.hackers-list').empty().attr 'data-state', 'loading'
-
- addHacker: (hacker) ->
- @$el.find('ol.hackers-list').attr 'data-state', 'default'
- view = require './hacker_view'
- HackerView = new view model: hacker
- @$el.find('ol.hackers-list').append HackerView.render().el
-
View
11 app/views/search_view.coffee → app/views/search.coffee
@@ -1,15 +1,20 @@
-module.exports = class SearchView extends Backbone.View
+View = require 'lib/view'
+Model = require 'models/search'
+
+module.exports = class SearchView extends View
el: 'section.search'
events:
'click a.search-button': 'search'
'keyup input.search-input': (event) -> @search() if event.keyCode is 13
initialize: ->
- @model = Hackerank.Models.SearchModel = new SearchModel = require '../models/search_model'
+ @model = Hackerank.Models.Search = new Model()
search: (event) ->
event.preventDefault() if event?
- Backbone.Mediator.publish 'search:new'
+ Backbone.Events.trigger 'search:new'
@model.set query: $.trim @$el.find('input.search-input').val()
+
+
View
4 app/views/styles/_base.styl
@@ -14,12 +14,12 @@ body
body,
input
color #444
- font 300 16px 'Varela', sans-serif
+ font 300 16px Geneva, Verdana, "Lucida Sans", "Lucida Grande", "Lucida Sans Unicode", sans-serif
line-height 1.2
a,
a:visited
- color #3e8dcc
+ color #0086cc
text-decoration none
&:hover
View
21 config.coffee 100755 → 100644
@@ -1,28 +1,33 @@
exports.config =
# See docs at http://brunch.readthedocs.org/en/latest/config.html.
+ coffeelint:
+ pattern: /^app\/.*\.coffee$/
+ options:
+ indentation:
+ value: 4
+ level: "error"
+
files:
javascripts:
joinTo:
'javascripts/app.js': /^app/
'javascripts/vendor.js': /^vendor/
+ 'test/javascripts/test.js': /^test(\/|\\)(?!vendor)/
+ 'test/javascripts/test-vendor.js': /^test(\/|\\)(?=vendor)/
order:
# Files in `vendor` directories are compiled before other files
# even if they aren't specified in order.
before: [
- 'vendor/scripts/jquery-1.8.0.js'
- 'vendor/scripts/lodash-v0.5.0-rc.1.js'
- 'vendor/scripts/backbone-0.9.2.js'
+ 'vendor/scripts/jquery.js'
+ 'vendor/scripts/lodash.js'
+ 'vendor/scripts/backbone.js'
]
stylesheets:
joinTo: 'stylesheets/app.css'
order:
before: ['vendor/styles/normalize.css']
- after: [
- 'vendor/styles/helpers.css'
- 'vendor/styles/bootstrap.min.css'
- 'vendor/styles/bootstrap-responsive.min.css'
- ]
+ after: ['vendor/styles/helpers.css']
templates:
joinTo: 'javascripts/app.js'
View
0 generators/collection/collection.coffee.hbs 100755 → 100644
File mode changed.
View
0 generators/collection/generator.json 100755 → 100644
File mode changed.
View
5 generators/collection_test/collection_test.coffee.hbs 100755 → 100644
@@ -0,0 +1,5 @@
+{{#camelize}}{{pluralName}}{{/camelize}}Collection = require 'collections/{{pluralName}}'
+
+describe '{{#camelize}}{{pluralName}}{{/camelize}}Collection', ->
+ beforeEach ->
+ @collection = new {{#camelize}}{{pluralName}}{{/camelize}}Collection()
View
0 generators/collection_test/generator.json 100755 → 100644
File mode changed.
View
0 generators/generator/generated_file.coffee.hbs 100755 → 100644
File mode changed.
View
0 generators/generator/generator.json 100755 → 100644
File mode changed.
View
0 generators/generator/generator.json.hbs 100755 → 100644
File mode changed.
View
0 generators/model/generator.json 100755 → 100644
File mode changed.
View
0 generators/model/model.coffee.hbs 100755 → 100644
File mode changed.
View
2 generators/model_test/generator.json 100755 → 100644
@@ -1,7 +1,7 @@
{
"files": [{
"from": "model_test.coffee.hbs",
- "to": "test/models/{{name}}.coffee"
+ "to": "test/models/{{name}}_test.coffee"
}],
"dependencies": []
}
View
0 generators/model_test/model_test.coffee.hbs 100755 → 100644
File mode changed.
View
19 generators/module/generator.json
@@ -0,0 +1,19 @@
+{
+ "files": [{
+ "from": "view.coffee.hbs",
+ "to": "app/views/{{name}}.coffee"
+ }],
+ "dependencies": [{
+ "name": "model",
+ "params": "{{name}}"
+ }, {
+ "name": "view_test",
+ "params": "{{name}}"
+ }, {
+ "name": "style",
+ "params": "{{name}}"
+ }, {
+ "name": "template",
+ "params": "{{name}}"
+ }]
+}
View
7 generators/module/view.coffee.hbs
@@ -0,0 +1,7 @@
+View = require '../lib/view'
+{{#camelize}}{{name}}{{/camelize}}Model = require '../models/{{name}}'
+
+module.exports = class {{#camelize}}{{name}}{{/camelize}}View extends View
+ template: require 'views/templates/{{name}}'
+
+ model: new {{#camelize}}{{name}}{{/camelize}}Model()
View
0 generators/style/generator.json 100755 → 100644
File mode changed.
View
3 generators/style/style.styl.hbs 100755 → 100644
@@ -1 +1,2 @@
-// {{#camelize}}{{name}}{{/camelize}}
+.{{name}}
+ // {{#camelize}}{{name}}{{/camelize}} Module
View
0 generators/template/generator.json 100755 → 100644
File mode changed.
View
1 generators/template/template.hbs.hbs 100755 → 100644
@@ -0,0 +1 @@
+<!-- .{{name}} -->
View
2 generators/view/generator.json 100755 → 100644
@@ -1,7 +1,7 @@
{
"files": [{
"from": "view.coffee.hbs",
- "to": "app/views/{{name}}_view.coffee"
+ "to": "app/views/{{name}}.coffee"
}],
"dependencies": [{
"name": "view_test",
View
6 generators/view/view.coffee.hbs 100755 → 100644
@@ -1,2 +1,6 @@
-module.exports = class {{#camelize}}{{name}}{{/camelize}}View extends Backbone.View
+View = require '../lib/view'
+
+module.exports = class {{#camelize}}{{name}}{{/camelize}}View extends View
template: require 'views/templates/{{name}}'
+
+ className: {{name}}
View
2 generators/view_test/generator.json 100755 → 100644
@@ -2,7 +2,7 @@
"files": [
{
"from": "view_test.coffee.hbs",
- "to": "test/views/{{name}}_view.coffee"
+ "to": "test/views/{{name}}_test.coffee"
}
],
"dependencies": []
View
0 generators/view_test/view_test.coffee.hbs 100755 → 100644
File mode changed.
View
64 package.json 100755 → 100644
@@ -1,40 +1,38 @@
{
- "author": "Elving Rodriguez",
- "name": "Hackerank",
- "description": "Find the top hackers of a github repo search.",
- "version": "0.0.2",
- "homepage": "http://hackerank.herokuapp.com/",
- "repository": {
- "type": "git",
- "url": "https://github.com/elving/Hackerank"
- },
- "engines": {
- "node": "0.6.x",
- "npm": "1.1.x"
- },
- "scripts": {
- "start": "brunch watch --server"
- },
- "dependencies": {
- "javascript-brunch": "> 1.0 < 1.5",
- "coffee-script-brunch": "> 1.0 < 1.5",
+ "author": "Your Name",
+ "name": "package-name",
+ "description": "Package description",
+ "version": "0.0.1",
+ "homepage": "",
+ "repository": {
+ "type": "git",
+ "url": ""
+ },
+ "engines": {
+ "node": "~0.6.10 || 0.8 || 0.9"
+ },
+ "scripts": {
+ "start": "brunch watch --server"
+ },
+ "dependencies": {
+ "javascript-brunch": "> 1.0 < 1.5",
+ "coffee-script-brunch": "> 1.0 < 1.5",
- "css-brunch": "> 1.0 < 1.5",
- "stylus-brunch": "> 1.0 < 1.5",
+ "css-brunch": "> 1.0 < 1.5",
+ "stylus-brunch": "> 1.0 < 1.5",
- "handlebars-brunch": "> 1.0 < 1.5",
+ "handlebars-brunch": "> 1.0 < 1.5",
- "uglify-js-brunch": "> 1.0 < 1.5",
- "clean-css-brunch": "> 1.0 < 1.5",
+ "uglify-js-brunch": "> 1.0 < 1.5",
+ "clean-css-brunch": "> 1.0 < 1.5",
- "auto-reload-brunch": "> 1.0 < 1.5",
+ "coffeelint-brunch": "> 1.0 < 1.5",
- "coffee-script": "",
- "express": ""
- },
- "devDependencies": {
- "mocha": "0.14.0",
- "expect.js": "0.1.2",
- "ws": "0.4.21"
- }
+ "auto-reload-brunch": "> 1.0 < 1.5"
+ },
+ "devDependencies": {
+ "mocha": "0.14.0",
+ "expect.js": "0.1.2",
+ "ws": "0.4.21"
+ }
}
View
BIN public/fonts/fontawesome/FontAwesome.otf
Binary file not shown.
View
17 public/fonts/fontawesome/README.md
@@ -1,18 +1,17 @@
-#Font Awesome 2.0
+#Font Awesome 3.0
##the iconic font designed for use with Twitter Bootstrap
The full suite of pictographic icons, examples, and documentation can be found at:
http://fortawesome.github.com/Font-Awesome/
+
+##License
+- The Font Awesome font is licensed under the SIL Open Font License - http://scripts.sil.org/OFL
+- Font Awesome CSS, LESS, and SASS files are licensed under the MIT License - http://opensource.org/licenses/mit-license.html
+- The Font Awesome pictograms are licensed under the CC BY 3.0 License - http://creativecommons.org/licenses/by/3.0/
+- Attribution is no longer required in Font Awesome 3.0, but much appreciated: "Font Awesome by Dave Gandy - http://fortawesome.github.com/Font-Awesome"
+
##Contact
- Email: dave@davegandy.com
- Twitter: http://twitter.com/fortaweso_me
- Work: Lead Product Designer @ http://kyru.us
-
-##License
-Version 2.0 of the Font Awesome font, CSS, and LESS files are licensed under CC BY 3.0:
-http://creativecommons.org/licenses/by/3.0/
-A mention of 'Font Awesome - http://fortawesome.github.com/Font-Awesome'
-in human-readable source code is considered acceptable attribution (most common on the
-web). If human readable source code is not available to the end user, a mention in an 'About'
-or 'Credits' screen is considered acceptable (most common in desktop or mobile software).
View
BIN public/fonts/fontawesome/fontawesome-webfont.eot
Binary file not shown.
View
BIN public/fonts/fontawesome/fontawesome-webfont.ttf
Binary file not shown.
View
BIN public/fonts/fontawesome/fontawesome-webfont.woff
Binary file not shown.
View
BIN public/images/glyphicons-halflings-white.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN public/images/glyphicons-halflings.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View