applicious_utils 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. data/Gemfile +4 -0
  2. data/Rakefile +2 -0
  3. data/app/assets/javascripts/applicious_utils/Applicious/applicious.coffee +9 -0
  4. data/app/assets/javascripts/applicious_utils/Applicious/facebook.coffee +12 -0
  5. data/app/assets/javascripts/applicious_utils/FbMultiFriendSelector/README.md +122 -0
  6. data/app/assets/javascripts/applicious_utils/FbMultiFriendSelector/index.html +100 -0
  7. data/app/assets/javascripts/applicious_utils/FbMultiFriendSelector/jquery.facebook.multifriend.select-list.css +158 -0
  8. data/app/assets/javascripts/applicious_utils/FbMultiFriendSelector/jquery.facebook.multifriend.select.css +160 -0
  9. data/app/assets/javascripts/applicious_utils/FbMultiFriendSelector/jquery.facebook.multifriend.select.js +366 -0
  10. data/app/assets/javascripts/applicious_utils/FbMultiFriendSelector/jquery.facebook.multifriend.select.min.js +11 -0
  11. data/app/assets/javascripts/applicious_utils/LightboxMe/LICENSE +11 -0
  12. data/app/assets/javascripts/applicious_utils/LightboxMe/README.markdown +44 -0
  13. data/app/assets/javascripts/applicious_utils/LightboxMe/jquery.lightbox_me.js +250 -0
  14. data/app/assets/javascripts/applicious_utils/index.js +4 -0
  15. data/app/assets/stylesheets/applicious_utils/Applicious/applicious.css +0 -0
  16. data/app/assets/stylesheets/applicious_utils/FbMultiFriendSelector/README.md +122 -0
  17. data/app/assets/stylesheets/applicious_utils/FbMultiFriendSelector/index.html +100 -0
  18. data/app/assets/stylesheets/applicious_utils/FbMultiFriendSelector/jquery.facebook.multifriend.select-list.css +158 -0
  19. data/app/assets/stylesheets/applicious_utils/FbMultiFriendSelector/jquery.facebook.multifriend.select.css +160 -0
  20. data/app/assets/stylesheets/applicious_utils/FbMultiFriendSelector/jquery.facebook.multifriend.select.js +366 -0
  21. data/app/assets/stylesheets/applicious_utils/FbMultiFriendSelector/jquery.facebook.multifriend.select.min.js +11 -0
  22. data/app/assets/stylesheets/applicious_utils/index.css +9 -0
  23. data/applicious_utils-0.0.1.gem +0 -0
  24. data/applicious_utils-0.0.2.gem +0 -0
  25. data/applicious_utils-0.0.3.gem +0 -0
  26. data/applicious_utils-0.0.4.gem +0 -0
  27. data/applicious_utils-0.0.5.gem +0 -0
  28. data/applicious_utils.gemspec +22 -0
  29. data/lib/applicious_utils/applicious_railtie.rb +11 -0
  30. data/lib/applicious_utils/engine.rb +5 -0
  31. data/lib/applicious_utils/version.rb +3 -0
  32. data/lib/applicious_utils/view_helpers.rb +16 -0
  33. data/lib/applicious_utils.rb +4 -0
  34. data/pkg/applicious_utils-0.0.4.gem +0 -0
  35. metadata +81 -0
@@ -0,0 +1,160 @@
1
+ /*
2
+ Copyright 2010 Mike Brevoort http://mike.brevoort.com @mbrevoort
3
+
4
+ v1.0 jquery-facebook-multi-friend-selector
5
+
6
+ Licensed under the Apache License, Version 2.0 (the "License");
7
+ you may not use this file except in compliance with the License.
8
+ You may obtain a copy of the License at
9
+
10
+ http://www.apache.org/licenses/LICENSE-2.0
11
+
12
+ Unless required by applicable law or agreed to in writing, software
13
+ distributed under the License is distributed on an "AS IS" BASIS,
14
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ See the License for the specific language governing permissions and
16
+ limitations under the License.
17
+ */
18
+
19
+ #jfmfs-friend-selector input {
20
+ background-color: #fcfcfc;
21
+ border: 1px solid #ccc;
22
+ font: 11px verdana, arial, helvetica, sans-serif;
23
+ margin: 2px 0;
24
+ padding: 2px 4px;
25
+ }
26
+ .jfmfs-friend {
27
+ cursor:pointer;
28
+ display:block;
29
+ float:left;
30
+ height:56px;
31
+ margin:3px;
32
+ padding:4px;
33
+ width:126px;
34
+ border: 1px solid #FFFFFF;
35
+ -moz-border-radius: 5px;
36
+ -webkit-border-radius: 5px;
37
+ -webkit-user-select:none;
38
+ -moz-user-select:none;
39
+ overflow:hidden;
40
+ }
41
+
42
+ .jfmfs-friend img {
43
+ border: 1px solid #CCC;
44
+ float:left;
45
+ margin:0;
46
+ }
47
+
48
+ .jfmfs-friend.selected img {
49
+ border: 1px solid #233E75;
50
+ }
51
+
52
+ .jfmfs-friend div {
53
+ color:#111111;
54
+ font-size:11px;
55
+ overflow:hidden;
56
+ padding:2px 0 0 6px;
57
+ }
58
+
59
+ #jfmfs-friend-container {
60
+ overflow:scroll;
61
+ overflow-x: hidden;
62
+ -ms-overflow-x: hidden;
63
+ width:100%;
64
+ height:400px;
65
+ font-family: 'lucida grande', tahoma, verdana, arial, sans-serif;
66
+ color: #333;
67
+ font-size: 12px;
68
+ }
69
+
70
+ #jfmfs-friend-selector {
71
+ width:725px;
72
+ height:376px;
73
+ overflow-y:hidden;
74
+ }
75
+
76
+ #jfmfs-inner-header {
77
+ background:none repeat scroll 0 0 #F7F7F7;
78
+ border-bottom:1px solid #CCCCCC;
79
+ color:#3B5998;
80
+ font-size:11px;
81
+ font-weight:bold;
82
+ height:25px;
83
+ padding:2px;
84
+ }
85
+
86
+ .jfmfs-friend.selected {
87
+ background-color: #3B5998;
88
+ border: 1px solid #3B5998;
89
+
90
+ background: #6D84B4; /* for non-css3 browsers */
91
+
92
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#233E75', endColorstr='#6D84B4'); /* for IE */
93
+ background: -webkit-gradient(linear, left top, left bottom, from(#233E75), to(#6D84B4)); /* for webkit browsers */
94
+ background: -moz-linear-gradient(top, #233E75, #6D84B4); /* for firefox 3.6+ */
95
+ }
96
+
97
+ .jfmfs-friend.selected div {
98
+ color: #FFFFFF;
99
+ }
100
+
101
+ .hover {
102
+ background-color: #EFF2F7;
103
+ }
104
+
105
+ .hide-non-selected, .hide-filtered {
106
+ display: none;
107
+ }
108
+
109
+ div.jfmfs-button {
110
+ background:none repeat scroll 0 0 #6D84B4;
111
+ border:1px solid #3B5998;
112
+ color:white;
113
+ cursor:pointer;
114
+ margin:4px 5px 0 4px;
115
+ padding:2px 5px;
116
+ text-decoration:none;
117
+ }
118
+
119
+ #jfmfs-friend-selector a.filter-link:link, a.filter-link:visited {
120
+ font-weight: bold;
121
+ text-decoration: none;
122
+ }
123
+
124
+ #jfmfs-friend-selector a.filter-link:hover, #jfmfs-friend-selector a.selected {
125
+ background-color: #6D84B4;
126
+ -moz-border-radius: 5px;
127
+ -webkit-border-radius: 5px;
128
+ color: #FFFFFF;
129
+ }
130
+
131
+ #jfmfs-friend-selector .filter-link {
132
+ margin:4px 5px 4px 5px;
133
+ padding:3px 5px 3px 5px;
134
+ }
135
+
136
+ #jfmfs-inner-header .filter-link {
137
+ float:right;
138
+ }
139
+
140
+ #jfmfs-inner-header div.jfmfs-button-hover {
141
+ text-decoration: underline;
142
+ }
143
+
144
+
145
+ #jfmfs-friend-filter-text {
146
+ height: 23px;
147
+ }
148
+
149
+
150
+ #jfmfs-inner-header span.jfmfs-title {
151
+ color: #333333;
152
+ font-weight: bold;
153
+ margin: 3px 0 2px;
154
+ }
155
+
156
+ #jfmfs-max-selected-wrapper {
157
+ float: right;
158
+ margin:4px 5px 4px 5px;
159
+ padding:3px 5px 3px 5px;
160
+ }
@@ -0,0 +1,366 @@
1
+ // Copyright 2010 Mike Brevoort http://mike.brevoort.com @mbrevoort
2
+ //
3
+ // v1.0 jquery-facebook-multi-friend-selector
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 (the "License");
6
+ // you may not use this file except in compliance with the License.
7
+ // You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing, software
12
+ // distributed under the License is distributed on an "AS IS" BASIS,
13
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ // See the License for the specific language governing permissions and
15
+ // limitations under the License.
16
+
17
+ (function($) {
18
+ var JFMFS = function(element, options) {
19
+ var elem = $(element),
20
+ obj = this,
21
+ uninitializedImagefriendElements = [], // for images that are initialized
22
+ keyUpTimer,
23
+ friends_per_row = 0,
24
+ friend_height_px = 0,
25
+ first_element_offset_px;
26
+
27
+ var settings = $.extend({
28
+ max_selected: -1,
29
+ max_selected_message: "{0} of {1} selected",
30
+ pre_selected_friends: [],
31
+ exclude_friends: [],
32
+ friend_fields: "id,name",
33
+ sorter: function(a, b) {
34
+ var x = a.name.toLowerCase();
35
+ var y = b.name.toLowerCase();
36
+ return ((x < y) ? -1 : ((x > y) ? 1 : 0));
37
+ },
38
+ labels: {
39
+ selected: "Selected",
40
+ filter_default: "Start typing a name",
41
+ filter_title: "Find Friends:",
42
+ all: "All",
43
+ max_selected_message: "{0} of {1} selected"
44
+ }
45
+ }, options || {});
46
+ var lastSelected; // used when shift-click is performed to know where to start from to select multiple elements
47
+
48
+ var arrayToObjectGraph = function(a) {
49
+ var o = {};
50
+ for(var i=0, l=a.length; i<l; i++){
51
+ o[a[i]]='';
52
+ }
53
+ return o;
54
+ };
55
+
56
+ // ----------+----------+----------+----------+----------+----------+----------+
57
+ // Initialization of container
58
+ // ----------+----------+----------+----------+----------+----------+----------+
59
+ elem.html(
60
+ "<div id='jfmfs-friend-selector'>" +
61
+ " <div id='jfmfs-inner-header'>" +
62
+ " <span class='jfmfs-title'>" + settings.labels.filter_title + " </span><input type='text' id='jfmfs-friend-filter-text' value='" + settings.labels.filter_default + "'/>" +
63
+ " <a class='filter-link selected' id='jfmfs-filter-all' href='#'>" + settings.labels.all + "</a>" +
64
+ " <a class='filter-link' id='jfmfs-filter-selected' href='#'>" + settings.labels.selected + " (<span id='jfmfs-selected-count'>0</span>)</a>" +
65
+ ((settings.max_selected > 0) ? "<div id='jfmfs-max-selected-wrapper'></div>" : "") +
66
+ " </div>" +
67
+ " <div id='jfmfs-friend-container'></div>" +
68
+ "</div>"
69
+ );
70
+
71
+ var friend_container = $("#jfmfs-friend-container"),
72
+ container = $("#jfmfs-friend-selector"),
73
+ preselected_friends_graph = arrayToObjectGraph(settings.pre_selected_friends),
74
+ excluded_friends_graph = arrayToObjectGraph(settings.exclude_friends),
75
+ all_friends;
76
+
77
+ FB.api('/me/friends?fields=' + settings.friend_fields, function(response) {
78
+ var sortedFriendData = response.data.sort(settings.sorter),
79
+ preselectedFriends = {},
80
+ buffer = [],
81
+ selectedClass = "";
82
+
83
+ $.each(sortedFriendData, function(i, friend) {
84
+ if(! (friend.id in excluded_friends_graph)) {
85
+ selectedClass = (friend.id in preselected_friends_graph) ? "selected" : "";
86
+ buffer.push("<div class='jfmfs-friend " + selectedClass + " ' id='" + friend.id +"'><img/><div class='friend-name'>" + friend.name + "</div></div>");
87
+ }
88
+ });
89
+ friend_container.append(buffer.join(""));
90
+
91
+ uninitializedImagefriendElements = $(".jfmfs-friend", elem);
92
+ uninitializedImagefriendElements.bind('inview', function (event, visible) {
93
+ if( $(this).attr('src') === undefined) {
94
+ $("img", $(this)).attr("src", "//graph.facebook.com/" + this.id + "/picture");
95
+ }
96
+ $(this).unbind('inview');
97
+ });
98
+
99
+ init();
100
+ });
101
+
102
+
103
+ // ----------+----------+----------+----------+----------+----------+----------+
104
+ // Public functions
105
+ // ----------+----------+----------+----------+----------+----------+----------+
106
+
107
+ this.getSelectedIds = function() {
108
+ var ids = [];
109
+ $.each(elem.find(".jfmfs-friend.selected"), function(i, friend) {
110
+ ids.push($(friend).attr("id"));
111
+ });
112
+ return ids;
113
+ };
114
+
115
+ this.getSelectedIdsAndNames = function() {
116
+ var selected = [];
117
+ $.each(elem.find(".jfmfs-friend.selected"), function(i, friend) {
118
+ selected.push( {id: $(friend).attr("id"), name: $(friend).find(".friend-name").text()});
119
+ });
120
+ return selected;
121
+ };
122
+
123
+ this.clearSelected = function () {
124
+ all_friends.removeClass("selected");
125
+ };
126
+
127
+ // ----------+----------+----------+----------+----------+----------+----------+
128
+ // Private functions
129
+ // ----------+----------+----------+----------+----------+----------+----------+
130
+
131
+ var init = function() {
132
+ all_friends = $(".jfmfs-friend", elem);
133
+
134
+ // calculate friends per row
135
+ first_element_offset_px = all_friends.first().offset().top;
136
+ for(var i=0, l=all_friends.length; i < l; i++ ) {
137
+ if($(all_friends[i]).offset().top === first_element_offset_px) {
138
+ friends_per_row++;
139
+ } else {
140
+ friend_height_px = $(all_friends[i]).offset().top - first_element_offset_px;
141
+ break;
142
+ }
143
+ }
144
+
145
+ // handle when a friend is clicked for selection
146
+ elem.delegate(".jfmfs-friend", 'click', function(event) {
147
+
148
+ // if the element is being selected, test if the max number of items have
149
+ // already been selected, if so, just return
150
+ if(!$(this).hasClass("selected") &&
151
+ maxSelectedEnabled() &&
152
+ $(".jfmfs-friend.selected").length >= settings.max_selected &&
153
+ settings.max_selected != 1) {
154
+ return;
155
+ }
156
+
157
+ // if the max is 1 then unselect the current and select the new
158
+ if(settings.max_selected == 1) {
159
+ elem.find(".selected").removeClass("selected");
160
+ }
161
+
162
+ $(this).toggleClass("selected");
163
+ $(this).removeClass("hover");
164
+
165
+ // support shift-click operations to select multiple items at a time
166
+ if( $(this).hasClass("selected")) {
167
+ if ( !lastSelected ) {
168
+ lastSelected = $(this);
169
+ }
170
+ else {
171
+ if( event.shiftKey ) {
172
+ var selIndex = $(this).index();
173
+ var lastIndex = lastSelected.index();
174
+ var end = Math.max(selIndex,lastIndex);
175
+ var start = Math.min(selIndex,lastIndex);
176
+ for(var i=start; i<=end; i++) {
177
+ var aFriend = $( all_friends[i] );
178
+ if(!aFriend.hasClass("hide-non-selected") && !aFriend.hasClass("hide-filtered")) {
179
+ if( maxSelectedEnabled() && $(".jfmfs-friend.selected").length < settings.max_selected ) {
180
+ $( all_friends[i] ).addClass("selected");
181
+ }
182
+ }
183
+ }
184
+ }
185
+ }
186
+ }
187
+
188
+ // keep track of last selected, this is used for the shift-select functionality
189
+ lastSelected = $(this);
190
+
191
+ // update the count of the total number selected
192
+ updateSelectedCount();
193
+
194
+ if( maxSelectedEnabled() ) {
195
+ updateMaxSelectedMessage();
196
+ }
197
+ elem.trigger("jfmfs.selection.changed", [obj.getSelectedIdsAndNames()]);
198
+ });
199
+
200
+ // filter by selected, hide all non-selected
201
+ $("#jfmfs-filter-selected").click(function(event) {
202
+ event.preventDefault();
203
+ all_friends.not(".selected").addClass("hide-non-selected");
204
+ $(".filter-link").removeClass("selected");
205
+ $(this).addClass("selected");
206
+ });
207
+
208
+ // remove filter, show all
209
+ $("#jfmfs-filter-all").click(function(event) {
210
+ event.preventDefault();
211
+ all_friends.removeClass("hide-non-selected");
212
+ $(".filter-link").removeClass("selected");
213
+ $(this).addClass("selected");
214
+ });
215
+
216
+ // hover effect on friends
217
+ elem.find(".jfmfs-friend:not(.selected)").live(
218
+ 'hover', function (ev) {
219
+ if (ev.type == 'mouseover') {
220
+ $(this).addClass("hover");
221
+ }
222
+ if (ev.type == 'mouseout') {
223
+ $(this).removeClass("hover");
224
+ }
225
+ });
226
+
227
+ // filter as you type
228
+ elem.find("#jfmfs-friend-filter-text")
229
+ .keyup( function() {
230
+ var filter = $(this).val();
231
+ clearTimeout(keyUpTimer);
232
+ keyUpTimer = setTimeout( function() {
233
+ if(filter == '') {
234
+ all_friends.removeClass("hide-filtered");
235
+ }
236
+ else {
237
+ container.find(".friend-name:not(:Contains(" + filter +"))").parent().addClass("hide-filtered");
238
+ container.find(".friend-name:Contains(" + filter +")").parent().removeClass("hide-filtered");
239
+ }
240
+ showImagesInViewPort();
241
+ }, 400);
242
+ })
243
+ .focus( function() {
244
+ if($.trim($(this).val()) == 'Start typing a name') {
245
+ $(this).val('');
246
+ }
247
+ })
248
+ .blur(function() {
249
+ if($.trim($(this).val()) == '') {
250
+ $(this).val('Start typing a name');
251
+ }
252
+ });
253
+
254
+ // hover states on the buttons
255
+ elem.find(".jfmfs-button").hover(
256
+ function(){ $(this).addClass("jfmfs-button-hover");} ,
257
+ function(){ $(this).removeClass("jfmfs-button-hover");}
258
+ );
259
+
260
+ // manages lazy loading of images
261
+ var getViewportHeight = function() {
262
+ var height = window.innerHeight; // Safari, Opera
263
+ var mode = document.compatMode;
264
+
265
+ if ( (mode || !$.support.boxModel) ) { // IE, Gecko
266
+ height = (mode == 'CSS1Compat') ?
267
+ document.documentElement.clientHeight : // Standards
268
+ document.body.clientHeight; // Quirks
269
+ }
270
+
271
+ return height;
272
+ };
273
+
274
+ var showImagesInViewPort = function() {
275
+ var container_height_px = friend_container.innerHeight(),
276
+ scroll_top_px = friend_container.scrollTop(),
277
+ container_offset_px = friend_container.offset().top,
278
+ $el, top_px,
279
+ elementVisitedCount = 0,
280
+ foundVisible = false,
281
+ allVisibleFriends = $(".jfmfs-friend:not(.hide-filtered )");
282
+
283
+ $.each(allVisibleFriends, function(i, $el){
284
+ elementVisitedCount++;
285
+ if($el !== null) {
286
+ $el = $(allVisibleFriends[i]);
287
+ top_px = (first_element_offset_px + (friend_height_px * Math.ceil(elementVisitedCount/friends_per_row))) - scroll_top_px - container_offset_px;
288
+ if (top_px + friend_height_px >= -10 &&
289
+ top_px - friend_height_px < container_height_px) { // give some extra padding for broser differences
290
+ $el.data('inview', true);
291
+ $el.trigger('inview', [ true ]);
292
+ foundVisible = true;
293
+ }
294
+ else {
295
+ if(foundVisible) {
296
+ return false;
297
+ }
298
+ }
299
+ }
300
+ });
301
+ };
302
+
303
+ var updateSelectedCount = function() {
304
+ $("#jfmfs-selected-count").html( selectedCount() );
305
+ };
306
+
307
+ friend_container.bind('scroll', $.debounce( 250, showImagesInViewPort ));
308
+
309
+ updateMaxSelectedMessage();
310
+ showImagesInViewPort();
311
+ updateSelectedCount();
312
+ elem.trigger("jfmfs.friendload.finished");
313
+ };
314
+
315
+ var selectedCount = function() {
316
+ return $(".jfmfs-friend.selected").length;
317
+ };
318
+
319
+ var maxSelectedEnabled = function () {
320
+ return settings.max_selected > 0;
321
+ };
322
+
323
+ var updateMaxSelectedMessage = function() {
324
+ var message = settings.labels.max_selected_message.replace("{0}", selectedCount()).replace("{1}", settings.max_selected);
325
+ $("#jfmfs-max-selected-wrapper").html( message );
326
+ };
327
+
328
+ };
329
+
330
+
331
+
332
+ $.fn.jfmfs = function(options) {
333
+ return this.each(function() {
334
+ var element = $(this);
335
+
336
+ // Return early if this element already has a plugin instance
337
+ if (element.data('jfmfs')) { return; }
338
+
339
+ // pass options to plugin constructor
340
+ var jfmfs = new JFMFS(this, options);
341
+
342
+ // Store plugin object in this element's data
343
+ element.data('jfmfs', jfmfs);
344
+
345
+ });
346
+ };
347
+
348
+ // todo, make this more ambiguous
349
+ jQuery.expr[':'].Contains = function(a, i, m) {
350
+ return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
351
+ };
352
+
353
+
354
+ })(jQuery);
355
+
356
+ if($.debounce === undefined) {
357
+ /*
358
+ * jQuery throttle / debounce - v1.1 - 3/7/2010
359
+ * http://benalman.com/projects/jquery-throttle-debounce-plugin/
360
+ *
361
+ * Copyright (c) 2010 "Cowboy" Ben Alman
362
+ * Dual licensed under the MIT and GPL licenses.
363
+ * http://benalman.com/about/license/
364
+ */
365
+ (function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this);
366
+ }
@@ -0,0 +1,11 @@
1
+ (function(a){var t=function(j,l){var b=a(j),m=this,g=[],o,v=0,k=0,r,c=a.extend({max_selected:-1,max_selected_message:"{0} of {1} selected",pre_selected_friends:[],exclude_friends:[],friend_fields:"id,name",sorter:function(d,h){var f=d.name.toLowerCase(),p=h.name.toLowerCase();return f<p?-1:f>p?1:0},labels:{selected:"Selected",filter_default:"Start typing a name",filter_title:"Find Friends:",all:"All",max_selected_message:"{0} of {1} selected"}},l||{}),u,w=function(d){for(var h={},f=0,p=d.length;f<
2
+ p;f++)h[d[f]]="";return h};b.html("<div id='jfmfs-friend-selector'> <div id='jfmfs-inner-header'> <span class='jfmfs-title'>"+c.labels.filter_title+" </span><input type='text' id='jfmfs-friend-filter-text' value='"+c.labels.filter_default+"'/> <a class='filter-link selected' id='jfmfs-filter-all' href='#'>"+c.labels.all+"</a> <a class='filter-link' id='jfmfs-filter-selected' href='#'>"+c.labels.selected+" (<span id='jfmfs-selected-count'>0</span>)</a>"+(c.max_selected>0?"<div id='jfmfs-max-selected-wrapper'></div>":
3
+ "")+" </div> <div id='jfmfs-friend-container'></div></div>");var q=a("#jfmfs-friend-container"),x=a("#jfmfs-friend-selector"),F=w(c.pre_selected_friends),G=w(c.exclude_friends),i;FB.api("/me/friends?fields="+c.friend_fields,function(d){d=d.data.sort(c.sorter);var h=[],f="";a.each(d,function(p,e){if(!(e.id in G)){f=e.id in F?"selected":"";h.push("<div class='jfmfs-friend "+f+" ' id='"+e.id+"'><img/><div class='friend-name'>"+e.name+"</div></div>")}});q.append(h.join(""));g=a(".jfmfs-friend",
4
+ b);g.bind("inview",function(){a(this).attr("src")===undefined&&a("img",a(this)).attr("src","//graph.facebook.com/"+this.id+"/picture");a(this).unbind("inview")});H()});this.getSelectedIds=function(){var d=[];a.each(b.find(".jfmfs-friend.selected"),function(h,f){d.push(a(f).attr("id"))});return d};this.getSelectedIdsAndNames=function(){var d=[];a.each(b.find(".jfmfs-friend.selected"),function(h,f){d.push({id:a(f).attr("id"),name:a(f).find(".friend-name").text()})});return d};this.clearSelected=function(){i.removeClass("selected")};
5
+ var H=function(){i=a(".jfmfs-friend",b);r=i.first().offset().top;for(var d=0,h=i.length;d<h;d++)if(a(i[d]).offset().top===r)v++;else{k=a(i[d]).offset().top-r;break}b.delegate(".jfmfs-friend","click",function(e){if(!(!a(this).hasClass("selected")&&c.max_selected>0&&a(".jfmfs-friend.selected").length>=c.max_selected&&c.max_selected!=1)){c.max_selected==1&&b.find(".selected").removeClass("selected");a(this).toggleClass("selected");a(this).removeClass("hover");if(a(this).hasClass("selected"))if(u){if(e.shiftKey){var n=
6
+ a(this).index(),s=u.index();e=Math.max(n,s);for(n=Math.min(n,s);n<=e;n++){s=a(i[n]);!s.hasClass("hide-non-selected")&&!s.hasClass("hide-filtered")&&c.max_selected>0&&a(".jfmfs-friend.selected").length<c.max_selected&&a(i[n]).addClass("selected")}}}else u=a(this);u=a(this);p();c.max_selected>0&&A();b.trigger("jfmfs.selection.changed",[m.getSelectedIdsAndNames()])}});a("#jfmfs-filter-selected").click(function(e){e.preventDefault();i.not(".selected").addClass("hide-non-selected");a(".filter-link").removeClass("selected");
7
+ a(this).addClass("selected")});a("#jfmfs-filter-all").click(function(e){e.preventDefault();i.removeClass("hide-non-selected");a(".filter-link").removeClass("selected");a(this).addClass("selected")});b.find(".jfmfs-friend:not(.selected)").live("hover",function(e){e.type=="mouseover"&&a(this).addClass("hover");e.type=="mouseout"&&a(this).removeClass("hover")});b.find("#jfmfs-friend-filter-text").keyup(function(){var e=a(this).val();clearTimeout(o);o=setTimeout(function(){if(e=="")i.removeClass("hide-filtered");
8
+ else{x.find(".friend-name:not(:Contains("+e+"))").parent().addClass("hide-filtered");x.find(".friend-name:Contains("+e+")").parent().removeClass("hide-filtered")}f()},400)}).focus(function(){a.trim(a(this).val())=="Start typing a name"&&a(this).val("")}).blur(function(){a.trim(a(this).val())==""&&a(this).val("Start typing a name")});b.find(".jfmfs-button").hover(function(){a(this).addClass("jfmfs-button-hover")},function(){a(this).removeClass("jfmfs-button-hover")});var f=function(){var e=q.innerHeight(),
9
+ n=q.scrollTop(),s=q.offset().top,z,B=0,C=false,D=a(".jfmfs-friend:not(.hide-filtered )");a.each(D,function(I,y){B++;if(y!==null){y=a(D[I]);z=r+k*Math.ceil(B/v)-n-s;if(z+k>=-10&&z-k<e){y.data("inview",true);y.trigger("inview",[true]);C=true}else if(C)return false}})},p=function(){a("#jfmfs-selected-count").html(E())};q.bind("scroll",a.debounce(250,f));A();f();p();b.trigger("jfmfs.friendload.finished")},E=function(){return a(".jfmfs-friend.selected").length},A=function(){var d=c.labels.max_selected_message.replace("{0}",
10
+ E()).replace("{1}",c.max_selected);a("#jfmfs-max-selected-wrapper").html(d)}};a.fn.jfmfs=function(j){return this.each(function(){var l=a(this);if(!l.data("jfmfs")){var b=new t(this,j);l.data("jfmfs",b)}})};jQuery.expr[":"].Contains=function(j,l,b){return jQuery(j).text().toUpperCase().indexOf(b[3].toUpperCase())>=0}})(jQuery);
11
+ $.debounce===undefined&&function(a,t){var j=a.jQuery||a.Cowboy||(a.Cowboy={}),l;j.throttle=l=function(b,m,g,o){function v(){function c(){r=+new Date;g.apply(w,x)}function u(){k=t}var w=this,q=+new Date-r,x=arguments;o&&!k&&c();k&&clearTimeout(k);if(o===t&&q>b)c();else if(m!==true)k=setTimeout(o?u:c,o===t?b-q:b)}var k,r=0;if(typeof m!=="boolean"){o=g;g=m;m=t}if(j.guid)v.guid=g.guid=g.guid||j.guid++;return v};j.debounce=function(b,m,g){return g===t?l(b,m,false):l(b,g,m!==false)}}(this);
@@ -0,0 +1,9 @@
1
+ /*
2
+ * This is a manifest file that'll automatically include all the stylesheets available in this directory
3
+ * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
4
+ * the top of the compiled file, but it's generally better to create a new file per style scope.
5
+ *require_self
6
+ *require_tree .
7
+ *= require ./FbMultiFriendSelector/jquery.facebook.multifriend.select.css
8
+ *= require ./Applicious/applicious.css
9
+ */
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "applicious_utils/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "applicious_utils"
7
+ s.version = AppliciousUtils::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Applicious"]
10
+ s.email = ["mail@appliciousagency.com"]
11
+ s.homepage = "http://appliciousagency.com"
12
+ s.summary = %q{Applicious Utilities}
13
+ s.description = %q{Helper JS & Ruby Functions}
14
+
15
+ s.rubyforge_project = "applicious_utils"
16
+
17
+ #s.files = `git ls-files`.split("\n")
18
+ s.files = Dir['**/*'].reject {|fn| File.directory?(fn) }
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.require_paths = ["lib"]
22
+ end
@@ -0,0 +1,11 @@
1
+ require 'applicious_utils/view_helpers'
2
+
3
+ module AppliciousUtils
4
+ class AppliciousRailtie < Rails::Railtie
5
+
6
+ initializer "applicious_utils.view_helpers" do
7
+ ActionView::Base.send :include, ViewHelpers
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ module AppliciousUtils
2
+ class Engine < Rails::Engine
3
+ # auto wire
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module AppliciousUtils
2
+ VERSION = "0.0.6"
3
+ end
@@ -0,0 +1,16 @@
1
+ module AppliciousUtils
2
+ module ViewHelpers
3
+
4
+ def applicious_assets
5
+ asset_tags = ''
6
+ #asset_tags << javascript_include_tag "applicious_utils"
7
+ #asset_tags << stylesheet_link_tag "applicious_utils"
8
+ return asset_tags
9
+ end
10
+
11
+ def pre(text)
12
+ content_tag :pre, text
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ module AppliciousUtils
2
+ require 'applicious_utils/engine'
3
+ require 'applicious_utils/applicious_railtie.rb' if defined?(Rails)
4
+ end
Binary file