-
Notifications
You must be signed in to change notification settings - Fork 110
/
context.js
executable file
·143 lines (143 loc) · 4.07 KB
/
context.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*!
* context.js Library associated with > v0.9.6.2 of intention.js
* http://intentionjs.com/
*
* Copyright 2011, 2013 Dowjones and other contributors
* Released under the MIT license
*
*/
(function () {
'use strict';
var context = function ($, Intention) {
// create a brand spankin new intention object
var intent = new Intention(),
// placeholder for the horizontal axis
horizontal_axis, orientation_axis;
// throttle function used for keeping calls to the resize responsive
// callback to a minimum
function throttle(callback, interval) {
var lastExec = new Date(), timer = null;
return function (e) {
var d = new Date();
if (d - lastExec < interval) {
if (timer) {
window.clearTimeout(timer);
}
var callbackWrapper = function (event) {
return function () {
callback(event);
};
};
timer = window.setTimeout(callbackWrapper(e), interval);
return false;
}
callback(e);
lastExec = d;
};
}
// catchall
// =======================================================================
intent.responsive([{ name: 'base' }]).respond('base');
// width context?
// =======================================================================
horizontal_axis = intent.responsive({
ID: 'width',
contexts: [
{
name: 'standard',
min: 840
},
{
name: 'tablet',
min: 510
},
{
name: 'mobile',
min: 0
}
],
matcher: function (test, context) {
if (typeof test === 'string') {
return test === context.name;
}
return test >= context.min;
},
measure: function (arg) {
if (typeof arg === 'string') {
return arg;
}
return $(window).width();
}
});
// orientation context?
// =======================================================================
orientation_axis = intent.responsive({
ID: 'orientation',
contexts: [
{
name: 'portrait',
rotation: 0
},
{
name: 'landscape',
rotation: 90
}
],
matcher: function (measure, ctx) {
return measure === ctx.rotation;
},
measure: function () {
var test = Math.abs(window.orientation);
if (test > 0) {
test = 180 - test;
}
return test;
}
});
// ONE TIME CHECK AXES:
// touch device?
// =======================================================================
intent.responsive({
ID: 'touch',
contexts: [{ name: 'touch' }],
matcher: function () {
return 'ontouchstart' in window;
}
}).respond();
// retina display?
// =======================================================================
intent.responsive({
ID: 'highres',
contexts: [{ name: 'highres' }],
matcher: function () {
return window.devicePixelRatio > 1;
}
}).respond();
// bind events to the window
$(window).on('resize', throttle(horizontal_axis.respond, 100)).on('orientationchange', horizontal_axis.respond).on('orientationchange', orientation_axis.respond);
// register the current width and orientation without waiting for a window
// resize
horizontal_axis.respond();
orientation_axis.respond();
$(function () {
// at doc ready grab all of the elements in the doc
intent.elements(document);
});
// return the intention object so that it can be extended by other plugins
return intent;
};
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define('context', [
'jquery',
'intention'
], factory);
} else {
// Browser globals
root.intent = factory(root.jQuery, root.Intention);
}
}(this, function ($, Intention) {
return context($, Intention);
}));
}.call(this));