epyce 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -0
- data/LICENSE +3 -0
- data/README.md +59 -0
- data/Rakefile +1 -0
- data/VERSION +1 -0
- data/app/assets/stylesheets/html5S-libs/_core.sass +40 -0
- data/app/assets/stylesheets/html5S-libs/_normal.sass +193 -0
- data/app/assets/stylesheets/html5S-libs/_reset.sass +217 -0
- data/epyce.gemspec +23 -0
- data/lib/epyce.rb +6 -0
- data/lib/epyce/railtie.rb +12 -0
- data/lib/epyce/version.rb +5 -0
- data/lib/generators/epyce/install/install_generator.rb +24 -0
- data/lib/generators/epyce/template/app/views/layouts/_flashes.html.haml +4 -0
- data/lib/generators/epyce/template/app/views/layouts/_footer.html.haml +2 -0
- data/lib/generators/epyce/template/app/views/layouts/_header.html.haml +1 -0
- data/lib/generators/epyce/template/app/views/layouts/application.html.haml +57 -0
- data/lib/generators/epyce/template/public/apple-touch-icon-114x114-precomposed.png +0 -0
- data/lib/generators/epyce/template/public/apple-touch-icon-57x57-precomposed.png +0 -0
- data/lib/generators/epyce/template/public/apple-touch-icon-72x72-precomposed.png +0 -0
- data/lib/generators/epyce/template/public/apple-touch-icon-precomposed.png +0 -0
- data/lib/generators/epyce/template/public/apple-touch-icon.png +0 -0
- data/lib/generators/epyce/template/public/crossdomain.xml +14 -0
- data/lib/generators/epyce/template/public/favicon.png +0 -0
- data/vendor/assets/javascripts/epyce-debug.js.coffee +4 -0
- data/vendor/assets/javascripts/epyce-debug/dd_belatedpng.min.js +13 -0
- data/vendor/assets/javascripts/epyce-debug/head.js +681 -0
- data/vendor/assets/javascripts/epyce-debug/knockout-1.2.1.debug.js +2219 -0
- data/vendor/assets/javascripts/epyce-debug/respond.min.js +7 -0
- data/vendor/assets/javascripts/epyce-debug/underscore.js +839 -0
- data/vendor/assets/javascripts/epyce.js.coffee +4 -0
- data/vendor/assets/javascripts/epyce/dd_belatedpng.min.js +13 -0
- data/vendor/assets/javascripts/epyce/head.min.js +8 -0
- data/vendor/assets/javascripts/epyce/knockout-1.2.1.js +76 -0
- data/vendor/assets/javascripts/epyce/respond.min.js +7 -0
- data/vendor/assets/javascripts/epyce/underscore-min.js +27 -0
- data/vendor/assets/stylesheets/epyce.css.sass +4 -0
- data/vendor/assets/stylesheets/epyce/.gitkeep +0 -0
- data/vendor/assets/stylesheets/skeleton/base.css +336 -0
- data/vendor/assets/stylesheets/skeleton/layout.css +64 -0
- data/vendor/assets/stylesheets/skeleton/skeleton.css +237 -0
- metadata +111 -0
data/epyce.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "epyce/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.version = Epyce::VERSION
|
7
|
+
s.date = "2011-07-22"
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
|
10
|
+
s.name = "epyce"
|
11
|
+
s.authors = ["Yann Armand"]
|
12
|
+
s.summary = %q{A rails layout including skeleton, HTML5S and knockout }
|
13
|
+
s.description = %q{define a new layout and change asset manager defaults to get advantage of skeleton (http://www.getskeleton.com/),Damian Le Nouaille HTML5S (https://github.com/damln/Html5S) and knockout (http://knockoutjs.com)}
|
14
|
+
s.email = "yann@harakys.com"
|
15
|
+
s.homepage = "http://github.com/yarmand/html5-epyce"
|
16
|
+
s.has_rdoc = false
|
17
|
+
|
18
|
+
s.add_dependency "railties", "~> 3.1.0.rc1"
|
19
|
+
s.add_dependency "haml"
|
20
|
+
s.files = `git ls-files`.split("\n")
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
|
23
|
+
end
|
data/lib/epyce.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Epyce
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < ::Rails::Generators::Base
|
4
|
+
|
5
|
+
desc "This generator install default haml application layout and several files in public"
|
6
|
+
source_root File.expand_path('../../template', __FILE__)
|
7
|
+
|
8
|
+
def copy_layout
|
9
|
+
say_status("Copying", "application layout files", :green)
|
10
|
+
["application.html.haml", "_header.html.haml", "_footer.html.haml", "_flashes.html.haml"].each do |f|
|
11
|
+
copy_file "app/views/layouts/#{f}", "app/views/layouts/#{f}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def copy_public
|
16
|
+
say_status("Copying", "application layout files", :green)
|
17
|
+
["apple-touch-icon-114x114-precomposed.png", "apple-touch-icon-57x57-precomposed.png", "apple-touch-icon-72x72-precomposed.png", "apple-touch-icon-precomposed.png", "apple-touch-icon.png", "crossdomain.xml", "favicon.png" ].each do |f|
|
18
|
+
copy_file "public/#{f}", "public/#{f}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
%h1 Header
|
@@ -0,0 +1,57 @@
|
|
1
|
+
!!! 5
|
2
|
+
-# http://paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither
|
3
|
+
<!--[if lt IE 7 ]> <html class="no-js ie6" lang="en"> <![endif]-->
|
4
|
+
<!--[if IE 7 ]> <html class="no-js ie7" lang="en"> <![endif]-->
|
5
|
+
<!--[if IE 8 ]> <html class="no-js ie8" lang="en"> <![endif]-->
|
6
|
+
<!--[if (gte IE 9)|!(IE)]><!--> <html class="no-js" lang="fr"> <!--<![endif]-->
|
7
|
+
%html
|
8
|
+
%head
|
9
|
+
%meta{ :charset => "utf-8" }/
|
10
|
+
|
11
|
+
-# Always force latest IE rendering engine (even in intranet) & Chrome Frame
|
12
|
+
-# Remove this if you use the .htaccess
|
13
|
+
%meta{ "http-equiv" => "X-UA-Compatible", :content => "IE=edge,chrome=1" }/
|
14
|
+
|
15
|
+
%title
|
16
|
+
== #{ controller.controller_name.titleize } - #{ controller.action_name.titleize }
|
17
|
+
|
18
|
+
%meta{ :name => "description", :content => "" }/
|
19
|
+
%meta{ :name => "author", :content => "" }/
|
20
|
+
|
21
|
+
-# icons
|
22
|
+
= favicon_link_tag 'favicon.ico'
|
23
|
+
= favicon_link_tag 'apple-touch-icon.png', :rel => 'apple-touch-icon', :type => 'image/png'
|
24
|
+
-# for the ipad
|
25
|
+
= favicon_link_tag 'apple-touch-icon-72x72-precomposed', :rel => 'apple-touch-icon', :sizes => '72x72', :type => 'image/png'
|
26
|
+
-# for the iphone4
|
27
|
+
= favicon_link_tag 'apple-touch-icon-114x114-precomposed', :rel => 'apple-touch-icon', :sizes => '114x114', :type => 'image/png'
|
28
|
+
|
29
|
+
-# Mobile viewport optimized: j.mp/bplateviewport
|
30
|
+
%meta{ :name => "viewport", :content => "width=device-width, initial-scale=1.0" }/
|
31
|
+
|
32
|
+
|
33
|
+
- # standard asset manager inclusion
|
34
|
+
= stylesheet_link_tag 'application', :media => 'all'
|
35
|
+
= javascript_include_tag 'application'
|
36
|
+
|
37
|
+
- # use asset manager to include html-epyce. see vendor/assets
|
38
|
+
= stylesheet_link_tag 'epyce', :media => 'all'
|
39
|
+
- if Rails.env.development?
|
40
|
+
= javascript_include_tag 'epyce-debug'
|
41
|
+
- else
|
42
|
+
= javascript_include_tag 'epyce'
|
43
|
+
|
44
|
+
= csrf_meta_tag
|
45
|
+
|
46
|
+
%body{ :class => "#{controller.controller_name}" }
|
47
|
+
#container
|
48
|
+
%header#header
|
49
|
+
= render "layouts/header"
|
50
|
+
|
51
|
+
#main{ :role => 'main' }
|
52
|
+
= render "layouts/flashes"
|
53
|
+
= yield
|
54
|
+
|
55
|
+
%footer#footer
|
56
|
+
= render "layouts/footer"
|
57
|
+
|
Binary file
|
Binary file
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
|
3
|
+
<cross-domain-policy>
|
4
|
+
|
5
|
+
<!-- Most restrictive policy: -->
|
6
|
+
<site-control permitted-cross-domain-policies="none"/>
|
7
|
+
<!-- Least restrictive policy: -->
|
8
|
+
<!--
|
9
|
+
<site-control permitted-cross-domain-policies="all"/>
|
10
|
+
<allow-access-from domain="*" to-ports="*" secure="false"/>
|
11
|
+
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
|
12
|
+
-->
|
13
|
+
|
14
|
+
</cross-domain-policy>
|
Binary file
|
@@ -0,0 +1,13 @@
|
|
1
|
+
/**
|
2
|
+
* DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>.
|
3
|
+
* Author: Drew Diller
|
4
|
+
* Email: drew.diller@gmail.com
|
5
|
+
* URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/
|
6
|
+
* Version: 0.0.8a
|
7
|
+
* Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license
|
8
|
+
*
|
9
|
+
* Example usage:
|
10
|
+
* DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector
|
11
|
+
* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement
|
12
|
+
**/
|
13
|
+
var DD_belatedPNG={ns:"DD_belatedPNG",imgSize:{},delay:10,nodesFixed:0,createVmlNameSpace:function(){if(document.namespaces&&!document.namespaces[this.ns]){document.namespaces.add(this.ns,"urn:schemas-microsoft-com:vml")}},createVmlStyleSheet:function(){var b,a;b=document.createElement("style");b.setAttribute("media","screen");document.documentElement.firstChild.insertBefore(b,document.documentElement.firstChild.firstChild);if(b.styleSheet){b=b.styleSheet;b.addRule(this.ns+"\\:*","{behavior:url(#default#VML)}");b.addRule(this.ns+"\\:shape","position:absolute;");b.addRule("img."+this.ns+"_sizeFinder","behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;");this.screenStyleSheet=b;a=document.createElement("style");a.setAttribute("media","print");document.documentElement.firstChild.insertBefore(a,document.documentElement.firstChild.firstChild);a=a.styleSheet;a.addRule(this.ns+"\\:*","{display: none !important;}");a.addRule("img."+this.ns+"_sizeFinder","{display: none !important;}")}},readPropertyChange:function(){var b,c,a;b=event.srcElement;if(!b.vmlInitiated){return}if(event.propertyName.search("background")!=-1||event.propertyName.search("border")!=-1){DD_belatedPNG.applyVML(b)}if(event.propertyName=="style.display"){c=(b.currentStyle.display=="none")?"none":"block";for(a in b.vml){if(b.vml.hasOwnProperty(a)){b.vml[a].shape.style.display=c}}}if(event.propertyName.search("filter")!=-1){DD_belatedPNG.vmlOpacity(b)}},vmlOpacity:function(b){if(b.currentStyle.filter.search("lpha")!=-1){var a=b.currentStyle.filter;a=parseInt(a.substring(a.lastIndexOf("=")+1,a.lastIndexOf(")")),10)/100;b.vml.color.shape.style.filter=b.currentStyle.filter;b.vml.image.fill.opacity=a}},handlePseudoHover:function(a){setTimeout(function(){DD_belatedPNG.applyVML(a)},1)},fix:function(a){if(this.screenStyleSheet){var c,b;c=a.split(",");for(b=0;b<c.length;b++){this.screenStyleSheet.addRule(c[b],"behavior:expression(DD_belatedPNG.fixPng(this))")}}},applyVML:function(a){a.runtimeStyle.cssText="";this.vmlFill(a);this.vmlOffsets(a);this.vmlOpacity(a);if(a.isImg){this.copyImageBorders(a)}},attachHandlers:function(i){var d,c,g,e,b,f;d=this;c={resize:"vmlOffsets",move:"vmlOffsets"};if(i.nodeName=="A"){e={mouseleave:"handlePseudoHover",mouseenter:"handlePseudoHover",focus:"handlePseudoHover",blur:"handlePseudoHover"};for(b in e){if(e.hasOwnProperty(b)){c[b]=e[b]}}}for(f in c){if(c.hasOwnProperty(f)){g=function(){d[c[f]](i)};i.attachEvent("on"+f,g)}}i.attachEvent("onpropertychange",this.readPropertyChange)},giveLayout:function(a){a.style.zoom=1;if(a.currentStyle.position=="static"){a.style.position="relative"}},copyImageBorders:function(b){var c,a;c={borderStyle:true,borderWidth:true,borderColor:true};for(a in c){if(c.hasOwnProperty(a)){b.vml.color.shape.style[a]=b.currentStyle[a]}}},vmlFill:function(e){if(!e.currentStyle){return}else{var d,f,g,b,a,c;d=e.currentStyle}for(b in e.vml){if(e.vml.hasOwnProperty(b)){e.vml[b].shape.style.zIndex=d.zIndex}}e.runtimeStyle.backgroundColor="";e.runtimeStyle.backgroundImage="";f=true;if(d.backgroundImage!="none"||e.isImg){if(!e.isImg){e.vmlBg=d.backgroundImage;e.vmlBg=e.vmlBg.substr(5,e.vmlBg.lastIndexOf('")')-5)}else{e.vmlBg=e.src}g=this;if(!g.imgSize[e.vmlBg]){a=document.createElement("img");g.imgSize[e.vmlBg]=a;a.className=g.ns+"_sizeFinder";a.runtimeStyle.cssText="behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;";c=function(){this.width=this.offsetWidth;this.height=this.offsetHeight;g.vmlOffsets(e)};a.attachEvent("onload",c);a.src=e.vmlBg;a.removeAttribute("width");a.removeAttribute("height");document.body.insertBefore(a,document.body.firstChild)}e.vml.image.fill.src=e.vmlBg;f=false}e.vml.image.fill.on=!f;e.vml.image.fill.color="none";e.vml.color.shape.style.backgroundColor=d.backgroundColor;e.runtimeStyle.backgroundImage="none";e.runtimeStyle.backgroundColor="transparent"},vmlOffsets:function(d){var h,n,a,e,g,m,f,l,j,i,k;h=d.currentStyle;n={W:d.clientWidth+1,H:d.clientHeight+1,w:this.imgSize[d.vmlBg].width,h:this.imgSize[d.vmlBg].height,L:d.offsetLeft,T:d.offsetTop,bLW:d.clientLeft,bTW:d.clientTop};a=(n.L+n.bLW==1)?1:0;e=function(b,p,q,c,s,u){b.coordsize=c+","+s;b.coordorigin=u+","+u;b.path="m0,0l"+c+",0l"+c+","+s+"l0,"+s+" xe";b.style.width=c+"px";b.style.height=s+"px";b.style.left=p+"px";b.style.top=q+"px"};e(d.vml.color.shape,(n.L+(d.isImg?0:n.bLW)),(n.T+(d.isImg?0:n.bTW)),(n.W-1),(n.H-1),0);e(d.vml.image.shape,(n.L+n.bLW),(n.T+n.bTW),(n.W),(n.H),1);g={X:0,Y:0};if(d.isImg){g.X=parseInt(h.paddingLeft,10)+1;g.Y=parseInt(h.paddingTop,10)+1}else{for(j in g){if(g.hasOwnProperty(j)){this.figurePercentage(g,n,j,h["backgroundPosition"+j])}}}d.vml.image.fill.position=(g.X/n.W)+","+(g.Y/n.H);m=h.backgroundRepeat;f={T:1,R:n.W+a,B:n.H,L:1+a};l={X:{b1:"L",b2:"R",d:"W"},Y:{b1:"T",b2:"B",d:"H"}};if(m!="repeat"||d.isImg){i={T:(g.Y),R:(g.X+n.w),B:(g.Y+n.h),L:(g.X)};if(m.search("repeat-")!=-1){k=m.split("repeat-")[1].toUpperCase();i[l[k].b1]=1;i[l[k].b2]=n[l[k].d]}if(i.B>n.H){i.B=n.H}d.vml.image.shape.style.clip="rect("+i.T+"px "+(i.R+a)+"px "+i.B+"px "+(i.L+a)+"px)"}else{d.vml.image.shape.style.clip="rect("+f.T+"px "+f.R+"px "+f.B+"px "+f.L+"px)"}},figurePercentage:function(d,c,f,a){var b,e;e=true;b=(f=="X");switch(a){case"left":case"top":d[f]=0;break;case"center":d[f]=0.5;break;case"right":case"bottom":d[f]=1;break;default:if(a.search("%")!=-1){d[f]=parseInt(a,10)/100}else{e=false}}d[f]=Math.ceil(e?((c[b?"W":"H"]*d[f])-(c[b?"w":"h"]*d[f])):parseInt(a,10));if(d[f]%2===0){d[f]++}return d[f]},fixPng:function(c){c.style.behavior="none";var g,b,f,a,d;if(c.nodeName=="BODY"||c.nodeName=="TD"||c.nodeName=="TR"){return}c.isImg=false;if(c.nodeName=="IMG"){if(c.src.toLowerCase().search(/\.png$/)!=-1){c.isImg=true;c.style.visibility="hidden"}else{return}}else{if(c.currentStyle.backgroundImage.toLowerCase().search(".png")==-1){return}}g=DD_belatedPNG;c.vml={color:{},image:{}};b={shape:{},fill:{}};for(a in c.vml){if(c.vml.hasOwnProperty(a)){for(d in b){if(b.hasOwnProperty(d)){f=g.ns+":"+d;c.vml[a][d]=document.createElement(f)}}c.vml[a].shape.stroked=false;c.vml[a].shape.appendChild(c.vml[a].fill);c.parentNode.insertBefore(c.vml[a].shape,c)}}c.vml.image.shape.fillcolor="none";c.vml.image.fill.type="tile";c.vml.color.fill.on=false;g.attachHandlers(c);g.giveLayout(c);g.giveLayout(c.offsetParent);c.vmlInitiated=true;g.applyVML(c)}};try{document.execCommand("BackgroundImageCache",false,true)}catch(r){}DD_belatedPNG.createVmlNameSpace();DD_belatedPNG.createVmlStyleSheet();
|
@@ -0,0 +1,681 @@
|
|
1
|
+
/**
|
2
|
+
Head JS The only script in your <HEAD>
|
3
|
+
Copyright Tero Piirainen (tipiirai)
|
4
|
+
License MIT / http://bit.ly/mit-license
|
5
|
+
Version 0.96
|
6
|
+
|
7
|
+
http://headjs.com
|
8
|
+
*/
|
9
|
+
(function(doc) {
|
10
|
+
|
11
|
+
var html = doc.documentElement,
|
12
|
+
conf = {
|
13
|
+
screens: [320, 480, 640, 768, 1024, 1280, 1440, 1680, 1920],
|
14
|
+
section: "-section",
|
15
|
+
page: "-page",
|
16
|
+
head: "head"
|
17
|
+
},
|
18
|
+
klass = [];
|
19
|
+
|
20
|
+
|
21
|
+
if (window.head_conf) {
|
22
|
+
for (var key in head_conf) {
|
23
|
+
if (head_conf[key] !== undefined) {
|
24
|
+
conf[key] = head_conf[key];
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
function pushClass(name) {
|
30
|
+
klass[klass.length] = name;
|
31
|
+
}
|
32
|
+
|
33
|
+
function removeClass(name) {
|
34
|
+
var re = new RegExp("\\b" + name + "\\b");
|
35
|
+
html.className = html.className.replace(re, '');
|
36
|
+
}
|
37
|
+
|
38
|
+
function each(arr, fn) {
|
39
|
+
for (var i = 0, arr_length = arr.length; i < arr_length; i++) {
|
40
|
+
fn.call(arr, arr[i], i);
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
// API
|
45
|
+
var api = window[conf.head] = function() {
|
46
|
+
api.ready.apply(null, arguments);
|
47
|
+
};
|
48
|
+
|
49
|
+
api.feature = function(key, enabled, queue) {
|
50
|
+
|
51
|
+
// internal: apply all classes
|
52
|
+
if (!key) {
|
53
|
+
html.className += ' ' + klass.join( ' ' );
|
54
|
+
klass = [];
|
55
|
+
return;
|
56
|
+
}
|
57
|
+
|
58
|
+
if (Object.prototype.toString.call(enabled) == '[object Function]') {
|
59
|
+
enabled = enabled.call();
|
60
|
+
}
|
61
|
+
|
62
|
+
pushClass((enabled ? '' : 'no-') + key);
|
63
|
+
api[key] = !!enabled;
|
64
|
+
|
65
|
+
// apply class to HTML element
|
66
|
+
if (!queue) {
|
67
|
+
removeClass('no-' + key);
|
68
|
+
removeClass(key);
|
69
|
+
api.feature();
|
70
|
+
}
|
71
|
+
|
72
|
+
return api;
|
73
|
+
};
|
74
|
+
|
75
|
+
// browser type & version
|
76
|
+
var ua = navigator.userAgent.toLowerCase();
|
77
|
+
|
78
|
+
ua = /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
|
79
|
+
/(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) ||
|
80
|
+
/(msie) ([\w.]+)/.exec( ua ) ||
|
81
|
+
!/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) || [];
|
82
|
+
|
83
|
+
|
84
|
+
if (ua[1] == 'msie') {
|
85
|
+
ua[1] = 'ie';
|
86
|
+
ua[2] = document.documentMode || ua[2];
|
87
|
+
}
|
88
|
+
|
89
|
+
pushClass(ua[1]);
|
90
|
+
|
91
|
+
api.browser = { version: ua[2] };
|
92
|
+
api.browser[ua[1]] = true;
|
93
|
+
|
94
|
+
// IE specific
|
95
|
+
if (api.browser.ie) {
|
96
|
+
|
97
|
+
pushClass("ie" + parseFloat(ua[2]));
|
98
|
+
|
99
|
+
// IE versions
|
100
|
+
for (var ver = 3; ver < 11; ver++) {
|
101
|
+
if (parseFloat(ua[2]) < ver) { pushClass("lt-ie" + ver); }
|
102
|
+
}
|
103
|
+
|
104
|
+
// HTML5 support
|
105
|
+
each("abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video".split("|"), function(el) {
|
106
|
+
doc.createElement(el);
|
107
|
+
});
|
108
|
+
|
109
|
+
}
|
110
|
+
|
111
|
+
|
112
|
+
// CSS "router"
|
113
|
+
each(location.pathname.split("/"), function(el, i) {
|
114
|
+
|
115
|
+
if (this.length > 2 && this[i + 1] !== undefined) {
|
116
|
+
if (i) { pushClass(this.slice(1, i+1).join("-") + conf.section); }
|
117
|
+
|
118
|
+
} else {
|
119
|
+
|
120
|
+
// pageId
|
121
|
+
var id = el || "index", index = id.indexOf(".");
|
122
|
+
if (index > 0) { id = id.substring(0, index); }
|
123
|
+
html.id = id + conf.page;
|
124
|
+
|
125
|
+
// on root?
|
126
|
+
if (!i) { pushClass("root" + conf.section); }
|
127
|
+
}
|
128
|
+
});
|
129
|
+
|
130
|
+
|
131
|
+
// screen resolution: w-100, lt-480, lt-1024 ...
|
132
|
+
function screenSize() {
|
133
|
+
var w = window.outerWidth || html.clientWidth;
|
134
|
+
|
135
|
+
// remove earlier widths
|
136
|
+
html.className = html.className.replace(/ (w|lt)-\d+/g, "");
|
137
|
+
|
138
|
+
// add new ones
|
139
|
+
pushClass("w-" + Math.round(w / 100) * 100);
|
140
|
+
|
141
|
+
each(conf.screens, function(width) {
|
142
|
+
if (w <= width) { pushClass("lt-" + width); }
|
143
|
+
});
|
144
|
+
|
145
|
+
api.feature();
|
146
|
+
}
|
147
|
+
|
148
|
+
screenSize();
|
149
|
+
window.onresize = screenSize;
|
150
|
+
|
151
|
+
api.feature("js", true).feature();
|
152
|
+
|
153
|
+
})(document);
|
154
|
+
|
155
|
+
|
156
|
+
/**
|
157
|
+
Head JS The only script in your <HEAD>
|
158
|
+
Copyright Tero Piirainen (tipiirai)
|
159
|
+
License MIT / http://bit.ly/mit-license
|
160
|
+
Version 0.96
|
161
|
+
|
162
|
+
http://headjs.com
|
163
|
+
*/
|
164
|
+
(function() {
|
165
|
+
/*
|
166
|
+
To add a new test:
|
167
|
+
|
168
|
+
head.feature("video", function() {
|
169
|
+
var tag = document.createElement('video');
|
170
|
+
return !!tag.canPlayType;
|
171
|
+
});
|
172
|
+
|
173
|
+
Good place to grab more tests
|
174
|
+
|
175
|
+
https://github.com/Modernizr/Modernizr/blob/master/modernizr.js
|
176
|
+
*/
|
177
|
+
|
178
|
+
|
179
|
+
/* CSS modernizer */
|
180
|
+
var el = document.createElement("i"),
|
181
|
+
style = el.style,
|
182
|
+
prefs = ' -o- -moz- -ms- -webkit- -khtml- '.split(' '),
|
183
|
+
domPrefs = 'Webkit Moz O ms Khtml'.split(' '),
|
184
|
+
|
185
|
+
head_var = window.head_conf && head_conf.head || "head",
|
186
|
+
api = window[head_var];
|
187
|
+
|
188
|
+
|
189
|
+
// Thanks Paul Irish!
|
190
|
+
function testProps(props) {
|
191
|
+
for (var i in props) {
|
192
|
+
if (style[props[i]] !== undefined) {
|
193
|
+
return true;
|
194
|
+
}
|
195
|
+
}
|
196
|
+
}
|
197
|
+
|
198
|
+
|
199
|
+
function testAll(prop) {
|
200
|
+
var camel = prop.charAt(0).toUpperCase() + prop.substr(1),
|
201
|
+
props = (prop + ' ' + domPrefs.join(camel + ' ') + camel).split(' ');
|
202
|
+
|
203
|
+
return !!testProps(props);
|
204
|
+
}
|
205
|
+
|
206
|
+
var tests = {
|
207
|
+
|
208
|
+
gradient: function() {
|
209
|
+
var s1 = 'background-image:',
|
210
|
+
s2 = 'gradient(linear,left top,right bottom,from(#9f9),to(#fff));',
|
211
|
+
s3 = 'linear-gradient(left top,#eee,#fff);';
|
212
|
+
|
213
|
+
style.cssText = (s1 + prefs.join(s2 + s1) + prefs.join(s3 + s1)).slice(0,-s1.length);
|
214
|
+
return !!style.backgroundImage;
|
215
|
+
},
|
216
|
+
|
217
|
+
rgba: function() {
|
218
|
+
style.cssText = "background-color:rgba(0,0,0,0.5)";
|
219
|
+
return !!style.backgroundColor;
|
220
|
+
},
|
221
|
+
|
222
|
+
opacity: function() {
|
223
|
+
return el.style.opacity === "";
|
224
|
+
},
|
225
|
+
|
226
|
+
textshadow: function() {
|
227
|
+
return style.textShadow === '';
|
228
|
+
},
|
229
|
+
|
230
|
+
multiplebgs: function() {
|
231
|
+
style.cssText = "background:url(//:),url(//:),red url(//:)";
|
232
|
+
return new RegExp("(url\\s*\\(.*?){3}").test(style.background);
|
233
|
+
},
|
234
|
+
|
235
|
+
boxshadow: function() {
|
236
|
+
return testAll("boxShadow");
|
237
|
+
},
|
238
|
+
|
239
|
+
borderimage: function() {
|
240
|
+
return testAll("borderImage");
|
241
|
+
},
|
242
|
+
|
243
|
+
borderradius: function() {
|
244
|
+
return testAll("borderRadius");
|
245
|
+
},
|
246
|
+
|
247
|
+
cssreflections: function() {
|
248
|
+
return testAll("boxReflect");
|
249
|
+
},
|
250
|
+
|
251
|
+
csstransforms: function() {
|
252
|
+
return testAll("transform");
|
253
|
+
},
|
254
|
+
|
255
|
+
csstransitions: function() {
|
256
|
+
return testAll("transition");
|
257
|
+
},
|
258
|
+
|
259
|
+
/*
|
260
|
+
font-face support. Uses browser sniffing but is synchronous.
|
261
|
+
|
262
|
+
http://paulirish.com/2009/font-face-feature-detection/
|
263
|
+
*/
|
264
|
+
fontface: function() {
|
265
|
+
var ua = navigator.userAgent, parsed;
|
266
|
+
|
267
|
+
if (/*@cc_on@if(@_jscript_version>=5)!@end@*/0)
|
268
|
+
return true;
|
269
|
+
|
270
|
+
if (parsed = ua.match(/Chrome\/(\d+\.\d+\.\d+\.\d+)/))
|
271
|
+
return parsed[1] >= '4.0.249.4' || 1 * parsed[1].split(".")[0] > 5;
|
272
|
+
if ((parsed = ua.match(/Safari\/(\d+\.\d+)/)) && !/iPhone/.test(ua))
|
273
|
+
return parsed[1] >= '525.13';
|
274
|
+
if (/Opera/.test({}.toString.call(window.opera)))
|
275
|
+
return opera.version() >= '10.00';
|
276
|
+
if (parsed = ua.match(/rv:(\d+\.\d+\.\d+)[^b].*Gecko\//))
|
277
|
+
return parsed[1] >= '1.9.1';
|
278
|
+
|
279
|
+
return false;
|
280
|
+
}
|
281
|
+
};
|
282
|
+
|
283
|
+
// queue features
|
284
|
+
for (var key in tests) {
|
285
|
+
if (tests[key]) {
|
286
|
+
api.feature(key, tests[key].call(), true);
|
287
|
+
}
|
288
|
+
}
|
289
|
+
|
290
|
+
// enable features at once
|
291
|
+
api.feature();
|
292
|
+
|
293
|
+
})();
|
294
|
+
|
295
|
+
|
296
|
+
/**
|
297
|
+
Head JS The only script in your <HEAD>
|
298
|
+
Copyright Tero Piirainen (tipiirai)
|
299
|
+
License MIT / http://bit.ly/mit-license
|
300
|
+
Version 0.96
|
301
|
+
|
302
|
+
http://headjs.com
|
303
|
+
*/
|
304
|
+
(function(doc) {
|
305
|
+
|
306
|
+
var head = doc.documentElement,
|
307
|
+
isHeadReady,
|
308
|
+
isDomReady,
|
309
|
+
domWaiters = [],
|
310
|
+
queue = [], // waiters for the "head ready" event
|
311
|
+
handlers = {}, // user functions waiting for events
|
312
|
+
scripts = {}, // loadable scripts in different states
|
313
|
+
isAsync = doc.createElement("script").async === true || "MozAppearance" in doc.documentElement.style || window.opera;
|
314
|
+
|
315
|
+
|
316
|
+
/*** public API ***/
|
317
|
+
var head_var = window.head_conf && head_conf.head || "head",
|
318
|
+
api = window[head_var] = (window[head_var] || function() { api.ready.apply(null, arguments); });
|
319
|
+
|
320
|
+
// states
|
321
|
+
var PRELOADED = 1,
|
322
|
+
PRELOADING = 2,
|
323
|
+
LOADING = 3,
|
324
|
+
LOADED = 4;
|
325
|
+
|
326
|
+
|
327
|
+
// Method 1: simply load and let browser take care of ordering
|
328
|
+
if (isAsync) {
|
329
|
+
|
330
|
+
api.js = function() {
|
331
|
+
|
332
|
+
var args = arguments,
|
333
|
+
fn = args[args.length -1],
|
334
|
+
els = {};
|
335
|
+
|
336
|
+
if (!isFunc(fn)) { fn = null; }
|
337
|
+
|
338
|
+
each(args, function(el, i) {
|
339
|
+
|
340
|
+
if (el != fn) {
|
341
|
+
el = getScript(el);
|
342
|
+
els[el.name] = el;
|
343
|
+
|
344
|
+
load(el, fn && i == args.length -2 ? function() {
|
345
|
+
if (allLoaded(els)) { one(fn); }
|
346
|
+
|
347
|
+
} : null);
|
348
|
+
}
|
349
|
+
});
|
350
|
+
|
351
|
+
return api;
|
352
|
+
};
|
353
|
+
|
354
|
+
|
355
|
+
// Method 2: preload with text/cache hack
|
356
|
+
} else {
|
357
|
+
|
358
|
+
api.js = function() {
|
359
|
+
|
360
|
+
var args = arguments,
|
361
|
+
rest = [].slice.call(args, 1),
|
362
|
+
next = rest[0];
|
363
|
+
|
364
|
+
// wait for a while. immediate execution causes some browsers to ignore caching
|
365
|
+
if (!isHeadReady) {
|
366
|
+
queue.push(function() {
|
367
|
+
api.js.apply(null, args);
|
368
|
+
});
|
369
|
+
return api;
|
370
|
+
}
|
371
|
+
|
372
|
+
// multiple arguments
|
373
|
+
if (next) {
|
374
|
+
|
375
|
+
// load
|
376
|
+
each(rest, function(el) {
|
377
|
+
if (!isFunc(el)) {
|
378
|
+
preload(getScript(el));
|
379
|
+
}
|
380
|
+
});
|
381
|
+
|
382
|
+
// execute
|
383
|
+
load(getScript(args[0]), isFunc(next) ? next : function() {
|
384
|
+
api.js.apply(null, rest);
|
385
|
+
});
|
386
|
+
|
387
|
+
|
388
|
+
// single script
|
389
|
+
} else {
|
390
|
+
load(getScript(args[0]));
|
391
|
+
}
|
392
|
+
|
393
|
+
return api;
|
394
|
+
};
|
395
|
+
}
|
396
|
+
|
397
|
+
api.ready = function(key, fn) {
|
398
|
+
|
399
|
+
// DOM ready check: head.ready(document, function() { });
|
400
|
+
if (key == doc) {
|
401
|
+
if (isDomReady) { one(fn); }
|
402
|
+
else { domWaiters.push(fn); }
|
403
|
+
return api;
|
404
|
+
}
|
405
|
+
|
406
|
+
// shift arguments
|
407
|
+
if (isFunc(key)) {
|
408
|
+
fn = key;
|
409
|
+
key = "ALL";
|
410
|
+
}
|
411
|
+
|
412
|
+
// make sure arguments are sane
|
413
|
+
if (typeof key != 'string' || !isFunc(fn)) { return api; }
|
414
|
+
|
415
|
+
var script = scripts[key];
|
416
|
+
|
417
|
+
// script already loaded --> execute and return
|
418
|
+
if (script && script.state == LOADED || key == 'ALL' && allLoaded() && isDomReady) {
|
419
|
+
one(fn);
|
420
|
+
return api;
|
421
|
+
}
|
422
|
+
|
423
|
+
var arr = handlers[key];
|
424
|
+
if (!arr) { arr = handlers[key] = [fn]; }
|
425
|
+
else { arr.push(fn); }
|
426
|
+
return api;
|
427
|
+
};
|
428
|
+
|
429
|
+
|
430
|
+
// perform this when DOM is ready
|
431
|
+
api.ready(doc, function() {
|
432
|
+
|
433
|
+
if (allLoaded()) {
|
434
|
+
each(handlers.ALL, function(fn) {
|
435
|
+
one(fn);
|
436
|
+
});
|
437
|
+
}
|
438
|
+
|
439
|
+
if (api.feature) {
|
440
|
+
api.feature("domloaded", true);
|
441
|
+
}
|
442
|
+
});
|
443
|
+
|
444
|
+
|
445
|
+
/*** private functions ***/
|
446
|
+
|
447
|
+
|
448
|
+
// call function once
|
449
|
+
function one(fn) {
|
450
|
+
if (fn._done) { return; }
|
451
|
+
fn();
|
452
|
+
fn._done = 1;
|
453
|
+
}
|
454
|
+
|
455
|
+
|
456
|
+
function toLabel(url) {
|
457
|
+
var els = url.split("/"),
|
458
|
+
name = els[els.length -1],
|
459
|
+
i = name.indexOf("?");
|
460
|
+
|
461
|
+
return i != -1 ? name.substring(0, i) : name;
|
462
|
+
}
|
463
|
+
|
464
|
+
|
465
|
+
function getScript(url) {
|
466
|
+
|
467
|
+
var script;
|
468
|
+
|
469
|
+
if (typeof url == 'object') {
|
470
|
+
for (var key in url) {
|
471
|
+
if (url[key]) {
|
472
|
+
script = { name: key, url: url[key] };
|
473
|
+
}
|
474
|
+
}
|
475
|
+
} else {
|
476
|
+
script = { name: toLabel(url), url: url };
|
477
|
+
}
|
478
|
+
|
479
|
+
var existing = scripts[script.name];
|
480
|
+
if (existing && existing.url === script.url) { return existing; }
|
481
|
+
|
482
|
+
scripts[script.name] = script;
|
483
|
+
return script;
|
484
|
+
}
|
485
|
+
|
486
|
+
|
487
|
+
function each(arr, fn) {
|
488
|
+
if (!arr) { return; }
|
489
|
+
|
490
|
+
// arguments special type
|
491
|
+
if (typeof arr == 'object') { arr = [].slice.call(arr); }
|
492
|
+
|
493
|
+
// do the job
|
494
|
+
for (var i = 0; i < arr.length; i++) {
|
495
|
+
fn.call(arr, arr[i], i);
|
496
|
+
}
|
497
|
+
}
|
498
|
+
|
499
|
+
function isFunc(el) {
|
500
|
+
return Object.prototype.toString.call(el) == '[object Function]';
|
501
|
+
}
|
502
|
+
|
503
|
+
function allLoaded(els) {
|
504
|
+
|
505
|
+
els = els || scripts;
|
506
|
+
|
507
|
+
var loaded;
|
508
|
+
|
509
|
+
for (var name in els) {
|
510
|
+
if (els.hasOwnProperty(name) && els[name].state != LOADED) { return false; }
|
511
|
+
loaded = true;
|
512
|
+
}
|
513
|
+
|
514
|
+
return loaded;
|
515
|
+
}
|
516
|
+
|
517
|
+
|
518
|
+
function onPreload(script) {
|
519
|
+
script.state = PRELOADED;
|
520
|
+
|
521
|
+
each(script.onpreload, function(el) {
|
522
|
+
el.call();
|
523
|
+
});
|
524
|
+
}
|
525
|
+
|
526
|
+
function preload(script, callback) {
|
527
|
+
|
528
|
+
if (script.state === undefined) {
|
529
|
+
|
530
|
+
script.state = PRELOADING;
|
531
|
+
script.onpreload = [];
|
532
|
+
|
533
|
+
scriptTag({ src: script.url, type: 'cache'}, function() {
|
534
|
+
onPreload(script);
|
535
|
+
});
|
536
|
+
}
|
537
|
+
}
|
538
|
+
|
539
|
+
function load(script, callback) {
|
540
|
+
|
541
|
+
if (script.state == LOADED) {
|
542
|
+
return callback && callback();
|
543
|
+
}
|
544
|
+
|
545
|
+
if (script.state == LOADING) {
|
546
|
+
return api.ready(script.name, callback);
|
547
|
+
}
|
548
|
+
|
549
|
+
if (script.state == PRELOADING) {
|
550
|
+
return script.onpreload.push(function() {
|
551
|
+
load(script, callback);
|
552
|
+
});
|
553
|
+
}
|
554
|
+
|
555
|
+
script.state = LOADING;
|
556
|
+
|
557
|
+
scriptTag(script.url, function() {
|
558
|
+
|
559
|
+
script.state = LOADED;
|
560
|
+
|
561
|
+
if (callback) { callback(); }
|
562
|
+
|
563
|
+
// handlers for this script
|
564
|
+
each(handlers[script.name], function(fn) {
|
565
|
+
one(fn);
|
566
|
+
});
|
567
|
+
|
568
|
+
// everything ready
|
569
|
+
if (allLoaded() && isDomReady) {
|
570
|
+
each(handlers.ALL, function(fn) {
|
571
|
+
one(fn);
|
572
|
+
});
|
573
|
+
}
|
574
|
+
});
|
575
|
+
}
|
576
|
+
|
577
|
+
|
578
|
+
function scriptTag(src, callback) {
|
579
|
+
|
580
|
+
var s = doc.createElement('script');
|
581
|
+
s.type = 'text/' + (src.type || 'javascript');
|
582
|
+
s.src = src.src || src;
|
583
|
+
s.async = false;
|
584
|
+
|
585
|
+
s.onreadystatechange = s.onload = function() {
|
586
|
+
|
587
|
+
var state = s.readyState;
|
588
|
+
|
589
|
+
if (!callback.done && (!state || /loaded|complete/.test(state))) {
|
590
|
+
callback.done = true;
|
591
|
+
callback();
|
592
|
+
}
|
593
|
+
};
|
594
|
+
|
595
|
+
// use body if available. more safe in IE
|
596
|
+
(doc.body || head).appendChild(s);
|
597
|
+
}
|
598
|
+
|
599
|
+
/*
|
600
|
+
The much desired DOM ready check
|
601
|
+
Thanks to jQuery and http://javascript.nwbox.com/IEContentLoaded/
|
602
|
+
*/
|
603
|
+
|
604
|
+
function fireReady() {
|
605
|
+
if (!isDomReady) {
|
606
|
+
isDomReady = true;
|
607
|
+
each(domWaiters, function(fn) {
|
608
|
+
one(fn);
|
609
|
+
});
|
610
|
+
}
|
611
|
+
}
|
612
|
+
|
613
|
+
// W3C
|
614
|
+
if (window.addEventListener) {
|
615
|
+
doc.addEventListener("DOMContentLoaded", fireReady, false);
|
616
|
+
|
617
|
+
// fallback. this is always called
|
618
|
+
window.addEventListener("load", fireReady, false);
|
619
|
+
|
620
|
+
// IE
|
621
|
+
} else if (window.attachEvent) {
|
622
|
+
|
623
|
+
// for iframes
|
624
|
+
doc.attachEvent("onreadystatechange", function() {
|
625
|
+
if (doc.readyState === "complete" ) {
|
626
|
+
fireReady();
|
627
|
+
}
|
628
|
+
});
|
629
|
+
|
630
|
+
|
631
|
+
// avoid frames with different domains issue
|
632
|
+
var frameElement = 1;
|
633
|
+
|
634
|
+
try {
|
635
|
+
frameElement = window.frameElement;
|
636
|
+
|
637
|
+
} catch(e) {}
|
638
|
+
|
639
|
+
|
640
|
+
if (!frameElement && head.doScroll) {
|
641
|
+
|
642
|
+
(function() {
|
643
|
+
try {
|
644
|
+
head.doScroll("left");
|
645
|
+
fireReady();
|
646
|
+
|
647
|
+
} catch(e) {
|
648
|
+
setTimeout(arguments.callee, 1);
|
649
|
+
return;
|
650
|
+
}
|
651
|
+
})();
|
652
|
+
}
|
653
|
+
|
654
|
+
// fallback
|
655
|
+
window.attachEvent("onload", fireReady);
|
656
|
+
}
|
657
|
+
|
658
|
+
|
659
|
+
// enable document.readyState for Firefox <= 3.5
|
660
|
+
if (!doc.readyState && doc.addEventListener) {
|
661
|
+
doc.readyState = "loading";
|
662
|
+
doc.addEventListener("DOMContentLoaded", handler = function () {
|
663
|
+
doc.removeEventListener("DOMContentLoaded", handler, false);
|
664
|
+
doc.readyState = "complete";
|
665
|
+
}, false);
|
666
|
+
}
|
667
|
+
|
668
|
+
/*
|
669
|
+
We wait for 300 ms before script loading starts. for some reason this is needed
|
670
|
+
to make sure scripts are cached. Not sure why this happens yet. A case study:
|
671
|
+
|
672
|
+
https://github.com/headjs/headjs/issues/closed#issue/83
|
673
|
+
*/
|
674
|
+
setTimeout(function() {
|
675
|
+
isHeadReady = true;
|
676
|
+
each(queue, function(fn) { fn(); });
|
677
|
+
|
678
|
+
}, 300);
|
679
|
+
|
680
|
+
})(document);
|
681
|
+
|