uikit-sass-rails 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/CHANGELOG.md +5 -0
  4. data/LICENSE.md +155 -0
  5. data/README.md +78 -0
  6. data/lib/uikit-sass-rails.rb +1 -0
  7. data/lib/uikit/sass/rails.rb +2 -0
  8. data/lib/uikit/sass/rails/engine.rb +12 -0
  9. data/lib/uikit/sass/rails/version.rb +7 -0
  10. data/uikit-sass-rails.gemspec +24 -0
  11. data/vendor/assets/fonts/fontawesome-webfont.eot +0 -0
  12. data/vendor/assets/fonts/fontawesome-webfont.svg +504 -0
  13. data/vendor/assets/fonts/fontawesome-webfont.ttf +0 -0
  14. data/vendor/assets/fonts/fontawesome-webfont.woff +0 -0
  15. data/vendor/assets/javascripts/uikit.js +14 -0
  16. data/vendor/assets/javascripts/uikit/addons/autocomplete.js +306 -0
  17. data/vendor/assets/javascripts/uikit/addons/datepicker.js +365 -0
  18. data/vendor/assets/javascripts/uikit/addons/form-password.js +62 -0
  19. data/vendor/assets/javascripts/uikit/addons/form-select.js +62 -0
  20. data/vendor/assets/javascripts/uikit/addons/htmleditor.js +594 -0
  21. data/vendor/assets/javascripts/uikit/addons/nestable.js +574 -0
  22. data/vendor/assets/javascripts/uikit/addons/notify.js +177 -0
  23. data/vendor/assets/javascripts/uikit/addons/pagination.js +146 -0
  24. data/vendor/assets/javascripts/uikit/addons/search.js +90 -0
  25. data/vendor/assets/javascripts/uikit/addons/sortable.js +494 -0
  26. data/vendor/assets/javascripts/uikit/addons/sticky.js +130 -0
  27. data/vendor/assets/javascripts/uikit/addons/timepicker.js +163 -0
  28. data/vendor/assets/javascripts/uikit/addons/upload.js +239 -0
  29. data/vendor/assets/javascripts/uikit/uikit.js +2573 -0
  30. data/vendor/assets/stylesheets/extra/font-awesome.scss +16 -0
  31. data/vendor/assets/stylesheets/uikit.scss +5 -0
  32. data/vendor/assets/stylesheets/uikit/addons/uikit.addons.scss +1326 -0
  33. data/vendor/assets/stylesheets/uikit/addons/uikit.almost-flat.addons.scss +1423 -0
  34. data/vendor/assets/stylesheets/uikit/addons/uikit.gradient.addons.scss +1445 -0
  35. data/vendor/assets/stylesheets/uikit/almost-flat.scss +5 -0
  36. data/vendor/assets/stylesheets/uikit/gradient.scss +5 -0
  37. data/vendor/assets/stylesheets/uikit/uikit.almost-flat.scss +8207 -0
  38. data/vendor/assets/stylesheets/uikit/uikit.gradient.scss +8264 -0
  39. data/vendor/assets/stylesheets/uikit/uikit.scss +7874 -0
  40. metadata +100 -0
@@ -0,0 +1,177 @@
1
+ /*! UIkit 2.8.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
2
+
3
+ (function(addon) {
4
+
5
+ var component;
6
+
7
+ if (jQuery && jQuery.UIkit) {
8
+ component = addon(jQuery, jQuery.UIkit);
9
+ }
10
+
11
+ if (typeof define == "function" && define.amd) {
12
+ define("uikit-notify", ["uikit"], function(){
13
+ return component || addon(jQuery, jQuery.UIkit);
14
+ });
15
+ }
16
+
17
+ })(function($, UI){
18
+
19
+ var containers = {},
20
+ messages = {},
21
+
22
+ notify = function(options){
23
+
24
+ if ($.type(options) == 'string') {
25
+ options = { message: options };
26
+ }
27
+
28
+ if (arguments[1]) {
29
+ options = $.extend(options, $.type(arguments[1]) == 'string' ? {status:arguments[1]} : arguments[1]);
30
+ }
31
+
32
+ return (new Message(options)).show();
33
+ },
34
+ closeAll = function(group, instantly){
35
+ if(group) {
36
+ for(var id in messages) { if(group===messages[id].group) messages[id].close(instantly); }
37
+ } else {
38
+ for(var id in messages) { messages[id].close(instantly); }
39
+ }
40
+ };
41
+
42
+ var Message = function(options){
43
+
44
+ var $this = this;
45
+
46
+ this.options = $.extend({}, Message.defaults, options);
47
+
48
+ this.uuid = "ID"+(new Date().getTime())+"RAND"+(Math.ceil(Math.random() * 100000));
49
+ this.element = $([
50
+
51
+ '<div class="uk-notify-message">',
52
+ '<a class="uk-close"></a>',
53
+ '<div>'+this.options.message+'</div>',
54
+ '</div>'
55
+
56
+ ].join('')).data("notifyMessage", this);
57
+
58
+ // status
59
+ if (this.options.status) {
60
+ this.element.addClass('uk-notify-message-'+this.options.status);
61
+ this.currentstatus = this.options.status;
62
+ }
63
+
64
+ this.group = this.options.group;
65
+
66
+ messages[this.uuid] = this;
67
+
68
+ if(!containers[this.options.pos]) {
69
+ containers[this.options.pos] = $('<div class="uk-notify uk-notify-'+this.options.pos+'"></div>').appendTo('body').on("click", ".uk-notify-message", function(){
70
+ $(this).data("notifyMessage").close();
71
+ });
72
+ }
73
+ };
74
+
75
+
76
+ $.extend(Message.prototype, {
77
+
78
+ uuid: false,
79
+ element: false,
80
+ timout: false,
81
+ currentstatus: "",
82
+ group: false,
83
+
84
+ show: function() {
85
+
86
+ if (this.element.is(":visible")) return;
87
+
88
+ var $this = this;
89
+
90
+ containers[this.options.pos].show().prepend(this.element);
91
+
92
+ var marginbottom = parseInt(this.element.css("margin-bottom"), 10);
93
+
94
+ this.element.css({"opacity":0, "margin-top": -1*this.element.outerHeight(), "margin-bottom":0}).animate({"opacity":1, "margin-top": 0, "margin-bottom":marginbottom}, function(){
95
+
96
+ if ($this.options.timeout) {
97
+
98
+ var closefn = function(){ $this.close(); };
99
+
100
+ $this.timeout = setTimeout(closefn, $this.options.timeout);
101
+
102
+ $this.element.hover(
103
+ function() { clearTimeout($this.timeout); },
104
+ function() { $this.timeout = setTimeout(closefn, $this.options.timeout); }
105
+ );
106
+ }
107
+
108
+ });
109
+
110
+ return this;
111
+ },
112
+
113
+ close: function(instantly) {
114
+
115
+ var $this = this,
116
+ finalize = function(){
117
+ $this.element.remove();
118
+
119
+ if(!containers[$this.options.pos].children().length) {
120
+ containers[$this.options.pos].hide();
121
+ }
122
+
123
+ delete messages[$this.uuid];
124
+ };
125
+
126
+ if(this.timeout) clearTimeout(this.timeout);
127
+
128
+ if(instantly) {
129
+ finalize();
130
+ } else {
131
+ this.element.animate({"opacity":0, "margin-top": -1* this.element.outerHeight(), "margin-bottom":0}, function(){
132
+ finalize();
133
+ });
134
+ }
135
+ },
136
+
137
+ content: function(html){
138
+
139
+ var container = this.element.find(">div");
140
+
141
+ if(!html) {
142
+ return container.html();
143
+ }
144
+
145
+ container.html(html);
146
+
147
+ return this;
148
+ },
149
+
150
+ status: function(status) {
151
+
152
+ if(!status) {
153
+ return this.currentstatus;
154
+ }
155
+
156
+ this.element.removeClass('uk-notify-message-'+this.currentstatus).addClass('uk-notify-message-'+status);
157
+
158
+ this.currentstatus = status;
159
+
160
+ return this;
161
+ }
162
+ });
163
+
164
+ Message.defaults = {
165
+ message: "",
166
+ status: "",
167
+ timeout: 5000,
168
+ group: null,
169
+ pos: 'top-center'
170
+ };
171
+
172
+ UI.notify = notify;
173
+ UI.notify.message = Message;
174
+ UI.notify.closeAll = closeAll;
175
+
176
+ return notify;
177
+ });
@@ -0,0 +1,146 @@
1
+ /*! UIkit 2.8.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
2
+
3
+ /*
4
+ * Based on simplePagination - Copyright (c) 2012 Flavius Matis - http://flaviusmatis.github.com/simplePagination.js/ (MIT)
5
+ */
6
+ (function(addon) {
7
+
8
+ var component;
9
+
10
+ if (jQuery && jQuery.UIkit) {
11
+ component = addon(jQuery, jQuery.UIkit);
12
+ }
13
+
14
+ if (typeof define == "function" && define.amd) {
15
+ define("uikit-pagination", ["uikit"], function(){
16
+ return component || addon(jQuery, jQuery.UIkit);
17
+ });
18
+ }
19
+
20
+ })(function($, UI){
21
+
22
+ "use strict";
23
+
24
+ UI.component('pagination', {
25
+
26
+ defaults: {
27
+ items : 1,
28
+ itemsOnPage : 1,
29
+ pages : 0,
30
+ displayedPages : 3,
31
+ edges : 3,
32
+ currentPage : 1,
33
+ lblPrev : false,
34
+ lblNext : false,
35
+ onSelectPage : function() {}
36
+ },
37
+
38
+ init: function() {
39
+
40
+ var $this = this;
41
+
42
+ this.pages = this.options.pages ? this.options.pages : Math.ceil(this.options.items / this.options.itemsOnPage) ? Math.ceil(this.options.items / this.options.itemsOnPage) : 1;
43
+ this.currentPage = this.options.currentPage - 1;
44
+ this.halfDisplayed = this.options.displayedPages / 2;
45
+
46
+ this.on("click", "a[data-page]", function(e){
47
+ e.preventDefault();
48
+ $this.selectPage($(this).data("page"));
49
+ });
50
+
51
+ this._render();
52
+ },
53
+
54
+ _getInterval: function() {
55
+
56
+ return {
57
+ start: Math.ceil(this.currentPage > this.halfDisplayed ? Math.max(Math.min(this.currentPage - this.halfDisplayed, (this.pages - this.options.displayedPages)), 0) : 0),
58
+ end : Math.ceil(this.currentPage > this.halfDisplayed ? Math.min(this.currentPage + this.halfDisplayed, this.pages) : Math.min(this.options.displayedPages, this.pages))
59
+ };
60
+ },
61
+
62
+ render: function(pages) {
63
+ this.pages = pages ? pages : this.pages;
64
+ this._render();
65
+ },
66
+
67
+ selectPage: function(pageIndex, pages) {
68
+ this.currentPage = pageIndex;
69
+ this.render(pages);
70
+
71
+ this.options.onSelectPage.apply(this, [pageIndex]);
72
+ this.trigger('uk-select-page', [pageIndex, this]);
73
+ },
74
+
75
+ _render: function() {
76
+
77
+ var o = this.options, interval = this._getInterval(), i;
78
+
79
+ this.element.empty();
80
+
81
+ // Generate Prev link
82
+ if (o.lblPrev) this._append(o.currentPage - 1, {text: o.lblPrev});
83
+
84
+ // Generate start edges
85
+ if (interval.start > 0 && o.edges > 0) {
86
+
87
+ var end = Math.min(o.edges, interval.start);
88
+
89
+ for (i = 0; i < end; i++) this._append(i);
90
+
91
+ if (o.edges < interval.start && (interval.start - o.edges != 1)) {
92
+ this.element.append('<li><span>...</span></li>');
93
+ } else if (interval.start - o.edges == 1) {
94
+ this._append(o.edges);
95
+ }
96
+ }
97
+
98
+ // Generate interval links
99
+ for (i = interval.start; i < interval.end; i++) this._append(i);
100
+
101
+ // Generate end edges
102
+ if (interval.end < this.pages && o.edges > 0) {
103
+
104
+ if (this.pages - o.edges > interval.end && (this.pages - o.edges - interval.end != 1)) {
105
+ this.element.append('<li><span>...</span></li>');
106
+ } else if (this.pages - o.edges - interval.end == 1) {
107
+ this._append(interval.end++);
108
+ }
109
+
110
+ var begin = Math.max(this.pages - o.edges, interval.end);
111
+
112
+ for (i = begin; i < this.pages; i++) this._append(i);
113
+ }
114
+
115
+ // Generate Next link (unless option is set for at front)
116
+ if (o.lblNext) this._append(o.currentPage + 1, {text: o.lblNext});
117
+ },
118
+
119
+ _append: function(pageIndex, opts) {
120
+
121
+ var $this = this, item, link, options;
122
+
123
+ pageIndex = pageIndex < 0 ? 0 : (pageIndex < this.pages ? pageIndex : this.pages - 1);
124
+ options = $.extend({ text: pageIndex + 1 }, opts);
125
+
126
+ item = (pageIndex == this.currentPage) ? '<li class="uk-active"><span>' + (options.text) + '</span></li>'
127
+ : '<li><a href="#page-'+(pageIndex+1)+'" data-page="'+pageIndex+'">'+options.text+'</a></li>';
128
+
129
+ this.element.append(item);
130
+ }
131
+ });
132
+
133
+ // init code
134
+ $(document).on("uk-domready", function(e) {
135
+
136
+ $("[data-uk-pagination]").each(function(){
137
+ var ele = $(this);
138
+
139
+ if (!ele.data("pagination")) {
140
+ var obj = UI.pagination(ele, UI.Utils.options(ele.attr("data-uk-pagination")));
141
+ }
142
+ });
143
+ });
144
+
145
+ return UI.pagination;
146
+ });
@@ -0,0 +1,90 @@
1
+ /*! UIkit 2.8.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
2
+
3
+ (function(addon) {
4
+
5
+ var component;
6
+
7
+ if (jQuery && jQuery.UIkit) {
8
+ component = addon(jQuery, jQuery.UIkit);
9
+ }
10
+
11
+ if (typeof define == "function" && define.amd) {
12
+ define("uikit-search", ["uikit"], function(){
13
+ return component || addon(jQuery, jQuery.UIkit);
14
+ });
15
+ }
16
+
17
+ })(function($, UI){
18
+
19
+ "use strict";
20
+
21
+ UI.component('search', {
22
+ defaults: {
23
+ msgResultsHeader : 'Search Results',
24
+ msgMoreResults : 'More Results',
25
+ msgNoResults : 'No results found',
26
+ template : '<ul class="uk-nav uk-nav-search uk-autocomplete-results">\
27
+ {{#msgResultsHeader}}<li class="uk-nav-header uk-skip">{{msgResultsHeader}}</li>{{/msgResultsHeader}}\
28
+ {{#items && items.length}}\
29
+ {{~items}}\
30
+ <li data-url="{{!$item.url}}">\
31
+ <a href="{{!$item.url}}">\
32
+ {{{$item.title}}}\
33
+ {{#$item.text}}<div>{{{$item.text}}}</div>{{/$item.text}}\
34
+ </a>\
35
+ </li>\
36
+ {{/items}}\
37
+ {{#msgMoreResults}}\
38
+ <li class="uk-nav-divider uk-skip"></li>\
39
+ <li class="uk-search-moreresults" data-moreresults="true"><a href="#" onclick="jQuery(this).closest(\'form\').submit();">{{msgMoreResults}}</a></li>\
40
+ {{/msgMoreResults}}\
41
+ {{/end}}\
42
+ {{^items.length}}\
43
+ {{#msgNoResults}}<li class="uk-skip"><a>{{msgNoResults}}</a></li>{{/msgNoResults}}\
44
+ {{/end}}\
45
+ </ul>',
46
+
47
+ renderer: function(data) {
48
+
49
+ var $this = this, opts = this.options;
50
+
51
+ this.dropdown.append(this.template({"items":data.results || [], "msgResultsHeader":opts.msgResultsHeader, "msgMoreResults": opts.msgMoreResults, "msgNoResults": opts.msgNoResults}));
52
+ this.show();
53
+ }
54
+ },
55
+
56
+ init: function() {
57
+ var $this = this;
58
+
59
+ this.autocomplete = UI.autocomplete(this.element, this.options);
60
+
61
+ this.autocomplete.dropdown.addClass('uk-dropdown-search');
62
+
63
+ this.autocomplete.input.on("keyup", function(){
64
+ $this.element[$this.autocomplete.input.val() ? "addClass":"removeClass"]("uk-active");
65
+ }).closest("form").on("reset", function(){
66
+ $this.value="";
67
+ $this.element.removeClass("uk-active");
68
+ });
69
+
70
+ this.on('autocomplete-select', function(e, data) {
71
+ if (data.url) {
72
+ location.href = data.url;
73
+ } else if(data.moreresults) {
74
+ this.autocomplete.input.closest('form').submit();
75
+ }
76
+ });
77
+
78
+ this.element.data("search", this);
79
+ }
80
+ });
81
+
82
+ // init code
83
+ $(document).on("focus.search.uikit", "[data-uk-search]", function(e) {
84
+ var ele = $(this);
85
+
86
+ if (!ele.data("search")) {
87
+ var obj = UI.search(ele, UI.Utils.options(ele.attr("data-uk-search")));
88
+ }
89
+ });
90
+ });
@@ -0,0 +1,494 @@
1
+ /*! UIkit 2.8.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
2
+
3
+ /*
4
+ * Based on nativesortable - Copyright (c) Brian Grinstead - https://github.com/bgrins/nativesortable
5
+ */
6
+ (function(addon) {
7
+
8
+ var component;
9
+
10
+ if (jQuery && jQuery.UIkit) {
11
+ component = addon(jQuery, jQuery.UIkit);
12
+ }
13
+
14
+ if (typeof define == "function" && define.amd) {
15
+ define("uikit-sortable", ["uikit"], function(){
16
+ return component || addon(jQuery, jQuery.UIkit);
17
+ });
18
+ }
19
+
20
+ })(function($, UI){
21
+
22
+ "use strict";
23
+
24
+ var supportsTouch = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch),
25
+ supportsDragAndDrop = !supportsTouch && (function() {
26
+ var div = document.createElement('div');
27
+ return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);
28
+ })(),
29
+
30
+ draggingPlaceholder, moving, clickedlink;
31
+
32
+ // disable native dragndrop support for now
33
+ supportsDragAndDrop = false;
34
+
35
+ UI.component('sortable', {
36
+
37
+ defaults: {
38
+
39
+ warp : false,
40
+ animation : 150,
41
+
42
+ childClass : 'uk-sortable-item',
43
+ placeholderClass : 'uk-sortable-placeholder',
44
+ overClass : 'uk-sortable-over',
45
+ draggingClass : 'uk-sortable-dragged',
46
+ dragMovingClass : 'uk-sortable-moving',
47
+ dragCustomClass : '',
48
+
49
+ handleClass : false,
50
+
51
+ stop : function() {},
52
+ start : function() {},
53
+ change : function() {}
54
+ },
55
+
56
+ init: function() {
57
+
58
+ var $this = this,
59
+ element = this.element[0],
60
+ currentlyDraggingElement = null,
61
+ currentlyDraggingTarget = null,
62
+ children;
63
+
64
+ if (supportsDragAndDrop) {
65
+ this.element.children().attr("draggable", "true");
66
+
67
+ } else {
68
+
69
+ // prevent leaving page after link clicking
70
+ this.element.on('mousedown touchstart', 'a[href]', function(e) {
71
+ clickedlink = $(this);
72
+ }).on('click', 'a[href]', function(e) {
73
+ clickedlink = $(this);
74
+ e.stopImmediatePropagation();
75
+ return false;
76
+ });
77
+ }
78
+
79
+ var handleDragStart = delegate(function(e) {
80
+
81
+ moving = false;
82
+
83
+ var target = $(e.target), children = $this.element.children();
84
+
85
+ if (!supportsTouch && e.button==2) {
86
+ return;
87
+ }
88
+
89
+ if ($this.options.handleClass) {
90
+
91
+ var handle = target.hasClass($this.options.handleClass) ? target : target.closest('.'+$this.options.handleClass, element);
92
+
93
+ if (!handle.length) {
94
+ e.preventDefault();
95
+ return;
96
+ }
97
+ }
98
+
99
+ if (e.dataTransfer) {
100
+ e.dataTransfer.effectAllowed = 'move';
101
+ e.dataTransfer.dropEffect = 'move';
102
+ e.dataTransfer.setData('Text', "*"); // Need to set to something or else drag doesn't start
103
+ }
104
+
105
+ currentlyDraggingElement = this;
106
+
107
+ // init drag placeholder
108
+ if (draggingPlaceholder) draggingPlaceholder.remove();
109
+
110
+ var $current = $(currentlyDraggingElement), offset = $current.offset();
111
+
112
+ draggingPlaceholder = $('<div class="'+([$this.options.draggingClass, $this.options.dragCustomClass].join(' '))+'"></div>').css({
113
+ display : 'none',
114
+ top : offset.top,
115
+ left : offset.left,
116
+ width : $current.width(),
117
+ height : $current.height(),
118
+ padding : $current.css('padding')
119
+ }).data('mouse-offset', {
120
+ 'left': offset.left - parseInt(e.pageX, 10),
121
+ 'top' : offset.top - parseInt(e.pageY, 10)
122
+ }).append($current.html()).appendTo('body');
123
+
124
+ draggingPlaceholder.$current = $current;
125
+ draggingPlaceholder.$sortable = $this;
126
+
127
+ addFakeDragHandlers();
128
+
129
+ $this.options.start(this, currentlyDraggingElement);
130
+ $this.trigger('sortable-start', [$this, currentlyDraggingElement]);
131
+
132
+ if (!supportsDragAndDrop) {
133
+ e.preventDefault();
134
+ }
135
+ });
136
+
137
+ var handleDragOver = delegate(function(e) {
138
+
139
+ if (!currentlyDraggingElement) {
140
+ return true;
141
+ }
142
+
143
+ if (e.preventDefault) {
144
+ e.preventDefault();
145
+ }
146
+
147
+ return false;
148
+ });
149
+
150
+ var handleDragEnter = delegate($.UIkit.Utils.debounce(function(e) {
151
+
152
+ if (!currentlyDraggingElement || currentlyDraggingElement === this) {
153
+ return true;
154
+ }
155
+
156
+ // Prevent dragenter on a child from allowing a dragleave on the container
157
+ var previousCounter = $this.dragenterData(this);
158
+
159
+ $this.dragenterData(this, previousCounter + 1);
160
+
161
+ if (previousCounter === 0) {
162
+
163
+ $(this).addClass($this.options.overClass);
164
+
165
+ if (!$this.options.warp) {
166
+ $this.moveElementNextTo(currentlyDraggingElement, this);
167
+ }
168
+ }
169
+
170
+ return false;
171
+ }), 40);
172
+
173
+ var handleDragLeave = delegate(function(e) {
174
+
175
+ // Prevent dragenter on a child from allowing a dragleave on the container
176
+ var previousCounter = $this.dragenterData(this);
177
+ $this.dragenterData(this, previousCounter - 1);
178
+
179
+ // This is a fix for child elements firing dragenter before the parent fires dragleave
180
+ if (!$this.dragenterData(this)) {
181
+ $(this).removeClass($this.options.overClass);
182
+ $this.dragenterData(this, false);
183
+ }
184
+ });
185
+
186
+ var handleDrop = delegate(function(e) {
187
+
188
+ if (e.type === 'drop') {
189
+
190
+ if (e.stopPropagation) {
191
+ e.stopPropagation();
192
+ }
193
+
194
+ if (e.preventDefault) {
195
+ e.preventDefault();
196
+ }
197
+ }
198
+
199
+ if (this === currentlyDraggingElement) {
200
+ return;
201
+ }
202
+
203
+ if ($this.options.warp) {
204
+ var thisSibling = currentlyDraggingElement.nextSibling;
205
+ this.parentNode.insertBefore(currentlyDraggingElement, this);
206
+ this.parentNode.insertBefore(this, thisSibling);
207
+ }
208
+
209
+ $this.options.change(this, currentlyDraggingElement);
210
+ $this.trigger('sortable-change', [$this, currentlyDraggingElement]);
211
+ });
212
+
213
+ var handleDragEnd = function(e) {
214
+
215
+ currentlyDraggingElement = null;
216
+ currentlyDraggingTarget = null;
217
+
218
+ $this.element.children().each(function() {
219
+ if (this.nodeType === 1) {
220
+ $(this).removeClass($this.options.overClass).removeClass($this.options.placeholderClass).removeClass($this.options.childClass);
221
+ $this.dragenterData(this, false);
222
+ }
223
+ });
224
+
225
+ $('html').removeClass($this.options.dragMovingClass);
226
+
227
+ removeFakeDragHandlers();
228
+
229
+ $this.options.stop(this);
230
+ $this.trigger('sortable-stop', [$this]);
231
+
232
+ draggingPlaceholder.remove();
233
+ draggingPlaceholder = null;
234
+ };
235
+
236
+ var handleTouchMove = delegate(function(e) {
237
+
238
+ if (!currentlyDraggingElement ||
239
+ currentlyDraggingElement === this ||
240
+ currentlyDraggingTarget === this) {
241
+ return true;
242
+ }
243
+
244
+ children.removeClass($this.options.overClass);
245
+ currentlyDraggingTarget = this;
246
+
247
+ if (!$this.options.warp) {
248
+ $this.moveElementNextTo(currentlyDraggingElement, this);
249
+ } else {
250
+ $(this).addClass($this.options.overClass);
251
+ }
252
+
253
+ return prevent(e);
254
+ });
255
+
256
+ function delegate(fn) {
257
+ return function(e) {
258
+
259
+ var touch = (supportsTouch && e.touches && e.touches[0]) || { },
260
+ target = touch.target || e.target;
261
+
262
+ // Fix event.target for a touch event
263
+ if (supportsTouch && document.elementFromPoint) {
264
+ target = document.elementFromPoint(e.pageX - document.body.scrollLeft, e.pageY - document.body.scrollTop);
265
+ }
266
+
267
+ if ($(target).hasClass($this.options.childClass)) {
268
+ fn.apply(target, [e]);
269
+ } else if (target !== element) {
270
+
271
+ // If a child is initiating the event or ending it, then use the container as context for the callback.
272
+ var context = moveUpToChildNode(element, target);
273
+
274
+ if (context) {
275
+ fn.apply(context, [e]);
276
+ }
277
+ }
278
+ };
279
+ }
280
+
281
+ // Opera and mobile devices do not support drag and drop. http://caniuse.com/dragndrop
282
+ // Bind/unbind standard mouse/touch events as a polyfill.
283
+ function addFakeDragHandlers() {
284
+ if (!supportsDragAndDrop) {
285
+ if (supportsTouch) {
286
+ element.addEventListener("touchmove", handleTouchMove, false);
287
+ } else {
288
+ element.addEventListener('mouseover', handleDragEnter, false);
289
+ element.addEventListener('mouseout', handleDragLeave, false);
290
+ }
291
+
292
+ element.addEventListener(supportsTouch ? 'touchend' : 'mouseup', handleDrop, false);
293
+ document.addEventListener(supportsTouch ? 'touchend' : 'mouseup', handleDragEnd, false);
294
+ document.addEventListener("selectstart", prevent, false);
295
+
296
+ }
297
+ }
298
+
299
+ function removeFakeDragHandlers() {
300
+ if (!supportsDragAndDrop) {
301
+ if (supportsTouch) {
302
+ element.removeEventListener("touchmove", handleTouchMove, false);
303
+ } else {
304
+ element.removeEventListener('mouseover', handleDragEnter, false);
305
+ element.removeEventListener('mouseout', handleDragLeave, false);
306
+ }
307
+
308
+ element.removeEventListener(supportsTouch ? 'touchend' : 'mouseup', handleDrop, false);
309
+ document.removeEventListener(supportsTouch ? 'touchend' : 'mouseup', handleDragEnd, false);
310
+ document.removeEventListener("selectstart", prevent, false);
311
+ }
312
+ }
313
+
314
+ if (supportsDragAndDrop) {
315
+ element.addEventListener('dragstart', handleDragStart, false);
316
+ element.addEventListener('dragenter', handleDragEnter, false);
317
+ element.addEventListener('dragleave', handleDragLeave, false);
318
+ element.addEventListener('drop', handleDrop, false);
319
+ element.addEventListener('dragover', handleDragOver, false);
320
+ element.addEventListener('dragend', handleDragEnd, false);
321
+ } else {
322
+
323
+ element.addEventListener(supportsTouch ? 'touchstart':'mousedown', handleDragStart, false);
324
+ }
325
+ },
326
+
327
+ dragenterData: function(element, val) {
328
+
329
+ element = $(element);
330
+
331
+ if (arguments.length == 1) {
332
+ return parseInt(element.attr('data-child-dragenter'), 10) || 0;
333
+ } else if (!val) {
334
+ element.removeAttr('data-child-dragenter');
335
+ } else {
336
+ element.attr('data-child-dragenter', Math.max(0, val));
337
+ }
338
+ },
339
+
340
+ moveElementNextTo: function(element, elementToMoveNextTo) {
341
+
342
+ var $this = this,
343
+ list = $(element).parent().css('min-height', ''),
344
+ next = isBelow(element, elementToMoveNextTo) ? elementToMoveNextTo : elementToMoveNextTo.nextSibling,
345
+ children = list.children(),
346
+ count = children.length;
347
+
348
+ if($this.options.warp || !$this.options.animation) {
349
+ elementToMoveNextTo.parentNode.insertBefore(element, next);
350
+ $(document).trigger("uk-check-display");
351
+ return;
352
+ }
353
+
354
+ list.css('min-height', list.height());
355
+
356
+ children.stop().each(function(){
357
+ var ele = $(this),
358
+ offset = ele.position();
359
+
360
+ offset.width = ele.width();
361
+
362
+ ele.data('offset-before', offset);
363
+ });
364
+
365
+ elementToMoveNextTo.parentNode.insertBefore(element, next);
366
+
367
+ children = list.children().each(function() {
368
+ var ele = $(this);
369
+ ele.data('offset-after', ele.position());
370
+ }).each(function() {
371
+ var ele = $(this),
372
+ before = ele.data('offset-before');
373
+ ele.css({'position':'absolute', 'top':before.top, 'left':before.left, 'min-width':before.width });
374
+ });
375
+
376
+ children.each(function(){
377
+
378
+ var ele = $(this),
379
+ before = ele.data('offset-before'),
380
+ offset = ele.data('offset-after');
381
+
382
+ ele.css('pointer-events', 'none').width();
383
+
384
+ setTimeout(function(){
385
+ ele.animate({'top':offset.top, 'left':offset.left}, $this.options.animation, function() {
386
+ ele.css({'position':'','top':'', 'left':'', 'min-width': '', 'pointer-events':''}).removeClass($this.options.overClass).attr('data-child-dragenter', '');
387
+ count--
388
+ if (!count) {
389
+ list.css('min-height', '');
390
+ $(document).trigger("uk-check-display");
391
+ }
392
+ });
393
+ }, 0);
394
+ });
395
+
396
+
397
+ }
398
+ });
399
+
400
+ // helpers
401
+
402
+ function isBelow(el1, el2) {
403
+
404
+ var parent = el1.parentNode;
405
+
406
+ if (el2.parentNode != parent) {
407
+ return false;
408
+ }
409
+
410
+ var cur = el1.previousSibling;
411
+
412
+ while (cur && cur.nodeType !== 9) {
413
+ if (cur === el2) {
414
+ return true;
415
+ }
416
+ cur = cur.previousSibling;
417
+ }
418
+
419
+ return false;
420
+ }
421
+
422
+ function moveUpToChildNode(parent, child) {
423
+ var cur = child;
424
+ if (cur == parent) { return null; }
425
+
426
+ while (cur) {
427
+ if (cur.parentNode === parent) {
428
+ return cur;
429
+ }
430
+
431
+ cur = cur.parentNode;
432
+ if ( !cur || !cur.ownerDocument || cur.nodeType === 11 ) {
433
+ break;
434
+ }
435
+ }
436
+ return null;
437
+ }
438
+
439
+ function prevent(e) {
440
+ if (e.stopPropagation) {
441
+ e.stopPropagation();
442
+ }
443
+ if (e.preventDefault) {
444
+ e.preventDefault();
445
+ }
446
+ e.returnValue = false;
447
+ }
448
+
449
+ // auto init
450
+ $(document).on("uk-domready", function(e) {
451
+
452
+ $("[data-uk-sortable]").each(function(){
453
+
454
+ var ele = $(this);
455
+
456
+ if(!ele.data("sortable")) {
457
+ var plugin = UI.sortable(ele, UI.Utils.options(ele.attr("data-uk-sortable")));
458
+ }
459
+ });
460
+ });
461
+
462
+ $(document).on('mousemove touchmove', function(e) {
463
+
464
+ if (draggingPlaceholder) {
465
+
466
+ if (!moving) {
467
+ moving = true;
468
+ draggingPlaceholder.show();
469
+
470
+ draggingPlaceholder.$current.addClass(draggingPlaceholder.$sortable.options.placeholderClass);
471
+ draggingPlaceholder.$sortable.element.children().addClass(draggingPlaceholder.$sortable.options.childClass);
472
+
473
+ $('html').addClass(draggingPlaceholder.$sortable.options.dragMovingClass);
474
+ }
475
+
476
+ var offset = draggingPlaceholder.data('mouse-offset'),
477
+ left = parseInt(e.originalEvent.pageX, 10) + offset.left,
478
+ top = parseInt(e.originalEvent.pageY, 10) + offset.top;
479
+
480
+ draggingPlaceholder.css({'left': left, 'top': top });
481
+ }
482
+ });
483
+
484
+ $(document).on('mouseup touchend', function() {
485
+
486
+ if(!moving && clickedlink) {
487
+ location.href = clickedlink.attr('href');
488
+ }
489
+
490
+ clickedlink = false;
491
+ });
492
+
493
+ return UI.sortable;
494
+ });