uikit-on-rails 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/README.md +37 -0
  4. data/Rakefile +1 -0
  5. data/lib/uikit-on-rails.rb +1 -0
  6. data/lib/uikit/sass/rails.rb +2 -0
  7. data/lib/uikit/sass/rails/engine.rb +12 -0
  8. data/lib/uikit/sass/rails/version.rb +7 -0
  9. data/uikit-on-rails.gemspec +23 -0
  10. data/vendor/assets/fonts/fontawesome-webfont.eot +0 -0
  11. data/vendor/assets/fonts/fontawesome-webfont.otf +0 -0
  12. data/vendor/assets/fonts/fontawesome-webfont.svg +565 -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/fonts/fontawesome-webfont.woff2 +0 -0
  16. data/vendor/assets/javascripts/uikit.js +19 -0
  17. data/vendor/assets/javascripts/uikit/components/accordion.js +180 -0
  18. data/vendor/assets/javascripts/uikit/components/autocomplete.js +340 -0
  19. data/vendor/assets/javascripts/uikit/components/datepicker.js +3167 -0
  20. data/vendor/assets/javascripts/uikit/components/form-password.js +67 -0
  21. data/vendor/assets/javascripts/uikit/components/form-select.js +85 -0
  22. data/vendor/assets/javascripts/uikit/components/grid-parallax.js +168 -0
  23. data/vendor/assets/javascripts/uikit/components/grid.js +540 -0
  24. data/vendor/assets/javascripts/uikit/components/htmleditor.js +679 -0
  25. data/vendor/assets/javascripts/uikit/components/lightbox.js +591 -0
  26. data/vendor/assets/javascripts/uikit/components/nestable.js +653 -0
  27. data/vendor/assets/javascripts/uikit/components/notify.js +189 -0
  28. data/vendor/assets/javascripts/uikit/components/pagination.js +147 -0
  29. data/vendor/assets/javascripts/uikit/components/parallax.js +462 -0
  30. data/vendor/assets/javascripts/uikit/components/search.js +92 -0
  31. data/vendor/assets/javascripts/uikit/components/slider.js +552 -0
  32. data/vendor/assets/javascripts/uikit/components/slideset.js +523 -0
  33. data/vendor/assets/javascripts/uikit/components/slideshow-fx.js +383 -0
  34. data/vendor/assets/javascripts/uikit/components/slideshow.js +596 -0
  35. data/vendor/assets/javascripts/uikit/components/sortable.js +688 -0
  36. data/vendor/assets/javascripts/uikit/components/sticky.js +364 -0
  37. data/vendor/assets/javascripts/uikit/components/timepicker.js +192 -0
  38. data/vendor/assets/javascripts/uikit/components/tooltip.js +234 -0
  39. data/vendor/assets/javascripts/uikit/components/upload.js +262 -0
  40. data/vendor/assets/javascripts/uikit/core/alert.js +66 -0
  41. data/vendor/assets/javascripts/uikit/core/button.js +156 -0
  42. data/vendor/assets/javascripts/uikit/core/core.js +820 -0
  43. data/vendor/assets/javascripts/uikit/core/cover.js +95 -0
  44. data/vendor/assets/javascripts/uikit/core/dropdown.js +529 -0
  45. data/vendor/assets/javascripts/uikit/core/grid.js +117 -0
  46. data/vendor/assets/javascripts/uikit/core/modal.js +389 -0
  47. data/vendor/assets/javascripts/uikit/core/nav.js +152 -0
  48. data/vendor/assets/javascripts/uikit/core/offcanvas.js +197 -0
  49. data/vendor/assets/javascripts/uikit/core/scrollspy.js +209 -0
  50. data/vendor/assets/javascripts/uikit/core/smooth-scroll.js +62 -0
  51. data/vendor/assets/javascripts/uikit/core/switcher.js +309 -0
  52. data/vendor/assets/javascripts/uikit/core/tab.js +167 -0
  53. data/vendor/assets/javascripts/uikit/core/toggle.js +124 -0
  54. data/vendor/assets/javascripts/uikit/core/touch.js +175 -0
  55. data/vendor/assets/javascripts/uikit/core/utility.js +338 -0
  56. data/vendor/assets/javascripts/uikit/uikit.js +3905 -0
  57. data/vendor/assets/stylesheets/extra/font-awesome.scss +14 -0
  58. data/vendor/assets/stylesheets/uikit.scss +7 -0
  59. data/vendor/assets/stylesheets/uikit/components/accordion.scss +94 -0
  60. data/vendor/assets/stylesheets/uikit/components/autocomplete.scss +107 -0
  61. data/vendor/assets/stylesheets/uikit/components/datepicker.scss +197 -0
  62. data/vendor/assets/stylesheets/uikit/components/dotnav.scss +212 -0
  63. data/vendor/assets/stylesheets/uikit/components/form-advanced.scss +128 -0
  64. data/vendor/assets/stylesheets/uikit/components/form-file.scss +63 -0
  65. data/vendor/assets/stylesheets/uikit/components/form-password.scss +74 -0
  66. data/vendor/assets/stylesheets/uikit/components/form-select.scss +66 -0
  67. data/vendor/assets/stylesheets/uikit/components/htmleditor.scss +269 -0
  68. data/vendor/assets/stylesheets/uikit/components/nestable.scss +231 -0
  69. data/vendor/assets/stylesheets/uikit/components/notify.scss +190 -0
  70. data/vendor/assets/stylesheets/uikit/components/placeholder.scss +66 -0
  71. data/vendor/assets/stylesheets/uikit/components/progress.scss +173 -0
  72. data/vendor/assets/stylesheets/uikit/components/search.scss +309 -0
  73. data/vendor/assets/stylesheets/uikit/components/slidenav.scss +183 -0
  74. data/vendor/assets/stylesheets/uikit/components/slider.scss +139 -0
  75. data/vendor/assets/stylesheets/uikit/components/slideshow.scss +208 -0
  76. data/vendor/assets/stylesheets/uikit/components/sortable.scss +124 -0
  77. data/vendor/assets/stylesheets/uikit/components/sticky.scss +57 -0
  78. data/vendor/assets/stylesheets/uikit/components/tooltip.scss +177 -0
  79. data/vendor/assets/stylesheets/uikit/components/upload.scss +34 -0
  80. data/vendor/assets/stylesheets/uikit/core/alert.scss +141 -0
  81. data/vendor/assets/stylesheets/uikit/core/animation.scss +599 -0
  82. data/vendor/assets/stylesheets/uikit/core/article.scss +139 -0
  83. data/vendor/assets/stylesheets/uikit/core/badge.scss +110 -0
  84. data/vendor/assets/stylesheets/uikit/core/base.scss +563 -0
  85. data/vendor/assets/stylesheets/uikit/core/block.scss +155 -0
  86. data/vendor/assets/stylesheets/uikit/core/breadcrumb.scss +86 -0
  87. data/vendor/assets/stylesheets/uikit/core/button.scss +406 -0
  88. data/vendor/assets/stylesheets/uikit/core/close.scss +132 -0
  89. data/vendor/assets/stylesheets/uikit/core/column.scss +209 -0
  90. data/vendor/assets/stylesheets/uikit/core/comment.scss +172 -0
  91. data/vendor/assets/stylesheets/uikit/core/contrast.scss +493 -0
  92. data/vendor/assets/stylesheets/uikit/core/cover.scss +70 -0
  93. data/vendor/assets/stylesheets/uikit/core/description-list.scss +71 -0
  94. data/vendor/assets/stylesheets/uikit/core/dropdown.scss +280 -0
  95. data/vendor/assets/stylesheets/uikit/core/flex.scss +320 -0
  96. data/vendor/assets/stylesheets/uikit/core/form.scss +629 -0
  97. data/vendor/assets/stylesheets/uikit/core/grid.scss +731 -0
  98. data/vendor/assets/stylesheets/uikit/core/icon.scss +930 -0
  99. data/vendor/assets/stylesheets/uikit/core/list.scss +102 -0
  100. data/vendor/assets/stylesheets/uikit/core/modal.scss +343 -0
  101. data/vendor/assets/stylesheets/uikit/core/nav.scss +468 -0
  102. data/vendor/assets/stylesheets/uikit/core/navbar.scss +325 -0
  103. data/vendor/assets/stylesheets/uikit/core/offcanvas.scss +203 -0
  104. data/vendor/assets/stylesheets/uikit/core/overlay.scss +534 -0
  105. data/vendor/assets/stylesheets/uikit/core/pagination.scss +197 -0
  106. data/vendor/assets/stylesheets/uikit/core/panel.scss +332 -0
  107. data/vendor/assets/stylesheets/uikit/core/print.scss +61 -0
  108. data/vendor/assets/stylesheets/uikit/core/subnav.scss +213 -0
  109. data/vendor/assets/stylesheets/uikit/core/switcher.scss +38 -0
  110. data/vendor/assets/stylesheets/uikit/core/tab.scss +368 -0
  111. data/vendor/assets/stylesheets/uikit/core/table.scss +147 -0
  112. data/vendor/assets/stylesheets/uikit/core/text.scss +136 -0
  113. data/vendor/assets/stylesheets/uikit/core/thumbnail.scss +122 -0
  114. data/vendor/assets/stylesheets/uikit/core/thumbnav.scss +122 -0
  115. data/vendor/assets/stylesheets/uikit/core/utility.scss +610 -0
  116. data/vendor/assets/stylesheets/uikit/core/variables.scss +23 -0
  117. data/vendor/assets/stylesheets/uikit/uikit-mixins.scss +327 -0
  118. data/vendor/assets/stylesheets/uikit/uikit-variables.scss +819 -0
  119. data/vendor/assets/stylesheets/uikit/uikit.scss +52 -0
  120. metadata +177 -0
@@ -0,0 +1,234 @@
1
+ /*! UIkit 2.27.1 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
2
+ (function(addon) {
3
+ var component;
4
+
5
+ if (window.UIkit) {
6
+ component = addon(UIkit);
7
+ }
8
+
9
+ if (typeof define == "function" && define.amd) {
10
+ define("uikit-tooltip", ["uikit"], function(){
11
+ return component || addon(UIkit);
12
+ });
13
+ }
14
+
15
+ })(function(UI){
16
+
17
+ "use strict";
18
+
19
+ var $tooltip, // tooltip container
20
+ tooltipdelay, checkdelay;
21
+
22
+ UI.component('tooltip', {
23
+
24
+ defaults: {
25
+ offset: 5,
26
+ pos: 'top',
27
+ animation: false,
28
+ delay: 0, // in miliseconds
29
+ cls: "",
30
+ activeClass: "uk-active",
31
+ src: function(ele) {
32
+ var title = ele.attr('title');
33
+
34
+ if (title !== undefined) {
35
+ ele.data('cached-title', title).removeAttr('title');
36
+ }
37
+
38
+ return ele.data("cached-title");
39
+ }
40
+ },
41
+
42
+ tip: "",
43
+
44
+ boot: function() {
45
+
46
+ // init code
47
+ UI.$html.on("mouseenter.tooltip.uikit focus.tooltip.uikit", "[data-uk-tooltip]", function(e) {
48
+ var ele = UI.$(this);
49
+
50
+ if (!ele.data("tooltip")) {
51
+ UI.tooltip(ele, UI.Utils.options(ele.attr("data-uk-tooltip")));
52
+ ele.trigger("mouseenter");
53
+ }
54
+ });
55
+ },
56
+
57
+ init: function() {
58
+
59
+ var $this = this;
60
+
61
+ if (!$tooltip) {
62
+ $tooltip = UI.$('<div class="uk-tooltip"></div>').appendTo("body");
63
+ }
64
+
65
+ this.on({
66
+ focus : function(e) { $this.show(); },
67
+ blur : function(e) { $this.hide(); },
68
+ mouseenter : function(e) { $this.show(); },
69
+ mouseleave : function(e) { $this.hide(); }
70
+ });
71
+ },
72
+
73
+ show: function() {
74
+
75
+ this.tip = typeof(this.options.src) === "function" ? this.options.src(this.element) : this.options.src;
76
+
77
+ if (tooltipdelay) clearTimeout(tooltipdelay);
78
+ if (checkdelay) clearTimeout(checkdelay);
79
+
80
+ if (typeof(this.tip) === 'string' ? !this.tip.length:true) return;
81
+
82
+ $tooltip.stop().css({"top": -2000, "visibility": "hidden"}).removeClass(this.options.activeClass).show();
83
+ $tooltip.html('<div class="uk-tooltip-inner">' + this.tip + '</div>');
84
+
85
+ var $this = this,
86
+ pos = UI.$.extend({}, this.element.offset(), {width: this.element[0].offsetWidth, height: this.element[0].offsetHeight}),
87
+ width = $tooltip[0].offsetWidth,
88
+ height = $tooltip[0].offsetHeight,
89
+ offset = typeof(this.options.offset) === "function" ? this.options.offset.call(this.element) : this.options.offset,
90
+ position = typeof(this.options.pos) === "function" ? this.options.pos.call(this.element) : this.options.pos,
91
+ tmppos = position.split("-"),
92
+ tcss = {
93
+ "display" : "none",
94
+ "visibility" : "visible",
95
+ "top" : (pos.top + pos.height + height),
96
+ "left" : pos.left
97
+ };
98
+
99
+
100
+ // prevent strange position
101
+ // when tooltip is in offcanvas etc.
102
+ if (UI.$html.css('position')=='fixed' || UI.$body.css('position')=='fixed'){
103
+ var bodyoffset = UI.$('body').offset(),
104
+ htmloffset = UI.$('html').offset(),
105
+ docoffset = {'top': (htmloffset.top + bodyoffset.top), 'left': (htmloffset.left + bodyoffset.left)};
106
+
107
+ pos.left -= docoffset.left;
108
+ pos.top -= docoffset.top;
109
+ }
110
+
111
+
112
+ if ((tmppos[0] == "left" || tmppos[0] == "right") && UI.langdirection == 'right') {
113
+ tmppos[0] = tmppos[0] == "left" ? "right" : "left";
114
+ }
115
+
116
+ var variants = {
117
+ "bottom" : {top: pos.top + pos.height + offset, left: pos.left + pos.width / 2 - width / 2},
118
+ "top" : {top: pos.top - height - offset, left: pos.left + pos.width / 2 - width / 2},
119
+ "left" : {top: pos.top + pos.height / 2 - height / 2, left: pos.left - width - offset},
120
+ "right" : {top: pos.top + pos.height / 2 - height / 2, left: pos.left + pos.width + offset}
121
+ };
122
+
123
+ UI.$.extend(tcss, variants[tmppos[0]]);
124
+
125
+ if (tmppos.length == 2) tcss.left = (tmppos[1] == 'left') ? (pos.left) : ((pos.left + pos.width) - width);
126
+
127
+ var boundary = this.checkBoundary(tcss.left, tcss.top, width, height);
128
+
129
+ if(boundary) {
130
+
131
+ switch(boundary) {
132
+ case "x":
133
+
134
+ if (tmppos.length == 2) {
135
+ position = tmppos[0]+"-"+(tcss.left < 0 ? "left": "right");
136
+ } else {
137
+ position = tcss.left < 0 ? "right": "left";
138
+ }
139
+
140
+ break;
141
+
142
+ case "y":
143
+ if (tmppos.length == 2) {
144
+ position = (tcss.top < 0 ? "bottom": "top")+"-"+tmppos[1];
145
+ } else {
146
+ position = (tcss.top < 0 ? "bottom": "top");
147
+ }
148
+
149
+ break;
150
+
151
+ case "xy":
152
+ if (tmppos.length == 2) {
153
+ position = (tcss.top < 0 ? "bottom": "top")+"-"+(tcss.left < 0 ? "left": "right");
154
+ } else {
155
+ position = tcss.left < 0 ? "right": "left";
156
+ }
157
+
158
+ break;
159
+
160
+ }
161
+
162
+ tmppos = position.split("-");
163
+
164
+ UI.$.extend(tcss, variants[tmppos[0]]);
165
+
166
+ if (tmppos.length == 2) tcss.left = (tmppos[1] == 'left') ? (pos.left) : ((pos.left + pos.width) - width);
167
+ }
168
+
169
+
170
+ tcss.left -= UI.$body.position().left;
171
+
172
+ tooltipdelay = setTimeout(function(){
173
+
174
+ $tooltip.css(tcss).attr("class", ["uk-tooltip", "uk-tooltip-"+position, $this.options.cls].join(' '));
175
+
176
+ if ($this.options.animation) {
177
+ $tooltip.css({opacity: 0, display: 'block'}).addClass($this.options.activeClass).animate({opacity: 1}, parseInt($this.options.animation, 10) || 400);
178
+ } else {
179
+ $tooltip.show().addClass($this.options.activeClass);
180
+ }
181
+
182
+ tooltipdelay = false;
183
+
184
+ // close tooltip if element was removed or hidden
185
+ checkdelay = setInterval(function(){
186
+ if(!$this.element.is(':visible')) $this.hide();
187
+ }, 150);
188
+
189
+ }, parseInt(this.options.delay, 10) || 0);
190
+ },
191
+
192
+ hide: function() {
193
+ if(this.element.is("input") && this.element[0]===document.activeElement) return;
194
+
195
+ if(tooltipdelay) clearTimeout(tooltipdelay);
196
+ if (checkdelay) clearTimeout(checkdelay);
197
+
198
+ $tooltip.stop();
199
+
200
+ if (this.options.animation) {
201
+
202
+ var $this = this;
203
+
204
+ $tooltip.fadeOut(parseInt(this.options.animation, 10) || 400, function(){
205
+ $tooltip.removeClass($this.options.activeClass)
206
+ });
207
+
208
+ } else {
209
+ $tooltip.hide().removeClass(this.options.activeClass);
210
+ }
211
+ },
212
+
213
+ content: function() {
214
+ return this.tip;
215
+ },
216
+
217
+ checkBoundary: function(left, top, width, height) {
218
+
219
+ var axis = "";
220
+
221
+ if(left < 0 || ((left - UI.$win.scrollLeft())+width) > window.innerWidth) {
222
+ axis += "x";
223
+ }
224
+
225
+ if(top < 0 || ((top - UI.$win.scrollTop())+height) > window.innerHeight) {
226
+ axis += "y";
227
+ }
228
+
229
+ return axis;
230
+ }
231
+ });
232
+
233
+ return UI.tooltip;
234
+ });
@@ -0,0 +1,262 @@
1
+ /*! UIkit 2.27.1 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
2
+ (function(addon) {
3
+
4
+ var component;
5
+
6
+ if (window.UIkit) {
7
+ component = addon(UIkit);
8
+ }
9
+
10
+ if (typeof define == "function" && define.amd) {
11
+ define("uikit-upload", ["uikit"], function(){
12
+ return component || addon(UIkit);
13
+ });
14
+ }
15
+
16
+ })(function(UI){
17
+
18
+ "use strict";
19
+
20
+ UI.component('uploadSelect', {
21
+
22
+ init: function() {
23
+
24
+ var $this = this;
25
+
26
+ this.on("change", function() {
27
+ xhrupload($this.element[0].files, $this.options);
28
+ var twin = $this.element.clone(true).data('uploadSelect', $this);
29
+ $this.element.replaceWith(twin);
30
+ $this.element = twin;
31
+ });
32
+ }
33
+ });
34
+
35
+ UI.component('uploadDrop', {
36
+
37
+ defaults: {
38
+ 'dragoverClass': 'uk-dragover'
39
+ },
40
+
41
+ init: function() {
42
+
43
+ var $this = this, hasdragCls = false;
44
+
45
+ this.on("drop", function(e){
46
+
47
+ if (e.originalEvent.dataTransfer && e.originalEvent.dataTransfer.files) {
48
+
49
+ e.stopPropagation();
50
+ e.preventDefault();
51
+
52
+ $this.element.removeClass($this.options.dragoverClass);
53
+ $this.element.trigger('dropped.uk.upload', [e.originalEvent.dataTransfer.files]);
54
+
55
+ xhrupload(e.originalEvent.dataTransfer.files, $this.options);
56
+ }
57
+
58
+ }).on("dragenter", function(e){
59
+ e.stopPropagation();
60
+ e.preventDefault();
61
+ }).on("dragover", function(e){
62
+ e.stopPropagation();
63
+ e.preventDefault();
64
+
65
+ if (!hasdragCls) {
66
+ $this.element.addClass($this.options.dragoverClass);
67
+ hasdragCls = true;
68
+ }
69
+ }).on("dragleave", function(e){
70
+ e.stopPropagation();
71
+ e.preventDefault();
72
+ $this.element.removeClass($this.options.dragoverClass);
73
+ hasdragCls = false;
74
+ });
75
+ }
76
+ });
77
+
78
+
79
+ UI.support.ajaxupload = (function() {
80
+
81
+ function supportFileAPI() {
82
+ var fi = document.createElement('INPUT'); fi.type = 'file'; return 'files' in fi;
83
+ }
84
+
85
+ function supportAjaxUploadProgressEvents() {
86
+ var xhr = new XMLHttpRequest(); return !! (xhr && ('upload' in xhr) && ('onprogress' in xhr.upload));
87
+ }
88
+
89
+ function supportFormData() {
90
+ return !! window.FormData;
91
+ }
92
+
93
+ return supportFileAPI() && supportAjaxUploadProgressEvents() && supportFormData();
94
+ })();
95
+
96
+
97
+ function xhrupload(files, settings) {
98
+
99
+ if (!UI.support.ajaxupload){
100
+ return this;
101
+ }
102
+
103
+ settings = UI.$.extend({}, xhrupload.defaults, settings);
104
+
105
+ if (!files.length){
106
+ return;
107
+ }
108
+
109
+ if (settings.allow !== '*.*') {
110
+
111
+ for(var i=0,file;file=files[i];i++) {
112
+
113
+ if(!matchName(settings.allow, file.name)) {
114
+
115
+ if(typeof(settings.notallowed) == 'string') {
116
+ alert(settings.notallowed);
117
+ } else {
118
+ settings.notallowed(file, settings);
119
+ }
120
+ return;
121
+ }
122
+ }
123
+ }
124
+
125
+ var complete = settings.complete;
126
+
127
+ if (settings.single){
128
+
129
+ var count = files.length,
130
+ uploaded = 0,
131
+ allow = true;
132
+
133
+ settings.beforeAll(files);
134
+
135
+ settings.complete = function(response, xhr){
136
+
137
+ uploaded = uploaded + 1;
138
+
139
+ complete(response, xhr);
140
+
141
+ if (settings.filelimit && uploaded >= settings.filelimit){
142
+ allow = false;
143
+ }
144
+
145
+ if (allow && uploaded<count){
146
+ upload([files[uploaded]], settings);
147
+ } else {
148
+ settings.allcomplete(response, xhr);
149
+ }
150
+ };
151
+
152
+ upload([files[0]], settings);
153
+
154
+ } else {
155
+
156
+ settings.complete = function(response, xhr){
157
+ complete(response, xhr);
158
+ settings.allcomplete(response, xhr);
159
+ };
160
+
161
+ upload(files, settings);
162
+ }
163
+
164
+ function upload(files, settings){
165
+
166
+ // upload all at once
167
+ var formData = new FormData(), xhr = new XMLHttpRequest();
168
+
169
+ if (settings.before(settings, files)===false) return;
170
+
171
+ for (var i = 0, f; f = files[i]; i++) { formData.append(settings.param, f); }
172
+ for (var p in settings.params) { formData.append(p, settings.params[p]); }
173
+
174
+ // Add any event handlers here...
175
+ xhr.upload.addEventListener("progress", function(e){
176
+ var percent = (e.loaded / e.total)*100;
177
+ settings.progress(percent, e);
178
+ }, false);
179
+
180
+ xhr.addEventListener("loadstart", function(e){ settings.loadstart(e); }, false);
181
+ xhr.addEventListener("load", function(e){ settings.load(e); }, false);
182
+ xhr.addEventListener("loadend", function(e){ settings.loadend(e); }, false);
183
+ xhr.addEventListener("error", function(e){ settings.error(e); }, false);
184
+ xhr.addEventListener("abort", function(e){ settings.abort(e); }, false);
185
+
186
+ xhr.open(settings.method, settings.action, true);
187
+
188
+ if (settings.type=="json") {
189
+ xhr.setRequestHeader("Accept", "application/json");
190
+ }
191
+
192
+ for (var h in settings.headers) {
193
+ xhr.setRequestHeader(h, settings.headers[h]);
194
+ }
195
+
196
+ xhr.onreadystatechange = function() {
197
+
198
+ settings.readystatechange(xhr);
199
+
200
+ if (xhr.readyState==4){
201
+
202
+ var response = xhr.responseText;
203
+
204
+ if (settings.type=="json") {
205
+ try {
206
+ response = UI.$.parseJSON(response);
207
+ } catch(e) {
208
+ response = false;
209
+ }
210
+ }
211
+
212
+ settings.complete(response, xhr);
213
+ }
214
+ };
215
+ settings.beforeSend(xhr);
216
+ xhr.send(formData);
217
+ }
218
+ }
219
+
220
+ xhrupload.defaults = {
221
+ action: '',
222
+ single: true,
223
+ method: 'POST',
224
+ param : 'files[]',
225
+ params: {},
226
+ allow : '*.*',
227
+ type : 'text',
228
+ filelimit: false,
229
+ headers: {},
230
+
231
+ // events
232
+ before : function(o){},
233
+ beforeSend : function(xhr){},
234
+ beforeAll : function(){},
235
+ loadstart : function(){},
236
+ load : function(){},
237
+ loadend : function(){},
238
+ error : function(){},
239
+ abort : function(){},
240
+ progress : function(){},
241
+ complete : function(){},
242
+ allcomplete : function(){},
243
+ readystatechange: function(){},
244
+ notallowed : function(file, settings){ alert('Only the following file types are allowed: '+settings.allow); }
245
+ };
246
+
247
+ function matchName(pattern, path) {
248
+
249
+ var parsedPattern = '^' + pattern.replace(/\//g, '\\/').
250
+ replace(/\*\*/g, '(\\/[^\\/]+)*').
251
+ replace(/\*/g, '[^\\/]+').
252
+ replace(/((?!\\))\?/g, '$1.') + '$';
253
+
254
+ parsedPattern = '^' + parsedPattern + '$';
255
+
256
+ return (path.match(new RegExp(parsedPattern, 'i')) !== null);
257
+ }
258
+
259
+ UI.Utils.xhrupload = xhrupload;
260
+
261
+ return xhrupload;
262
+ });