spree_suppliers 0.1.0 → 0.60.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. data/README +46 -0
  2. data/Rakefile +137 -0
  3. data/app/controllers/admin/pickup_locations_controller.rb +52 -0
  4. data/app/controllers/admin/pickups_controller.rb +84 -0
  5. data/app/controllers/admin/shipping_options_controller.rb +32 -0
  6. data/app/controllers/admin/supplier_taxons_controller.rb +65 -0
  7. data/app/controllers/admin/suppliers_controller.rb +203 -0
  8. data/app/controllers/admin/vendor_overview_controller.rb +18 -0
  9. data/app/controllers/dash/base_controller.rb +10 -0
  10. data/app/controllers/dash/overview_controller.rb +6 -0
  11. data/app/controllers/dash/pickup_locations_controller.rb +27 -0
  12. data/app/controllers/dash/pickups_controller.rb +40 -0
  13. data/app/controllers/dash/products_controller.rb +15 -0
  14. data/app/controllers/messages_controller.rb +17 -0
  15. data/app/controllers/suppliers_controller.rb +19 -0
  16. data/app/controllers/user_sessions_decorator.rb +39 -0
  17. data/app/helpers/admin/suppliers_helper.rb +21 -0
  18. data/app/helpers/cities_helper.rb +2 -0
  19. data/app/helpers/dragonfly_helper.rb +16 -0
  20. data/app/helpers/messages_helper.rb +2 -0
  21. data/app/helpers/suppliers_helper.rb +16 -0
  22. data/app/mailers/supplier_mailer.rb +11 -0
  23. data/app/models/ability_decorator.rb +19 -0
  24. data/app/models/delivery.rb +6 -0
  25. data/app/models/hour.rb +4 -0
  26. data/app/models/item.rb +5 -0
  27. data/app/models/message.rb +3 -0
  28. data/app/models/pickup.rb +10 -0
  29. data/app/models/pickup_date.rb +3 -0
  30. data/app/models/pickup_location.rb +7 -0
  31. data/app/models/supplier.rb +33 -0
  32. data/app/models/supplier_invoice.rb +5 -0
  33. data/app/views/admin/orders/index.html.erb +107 -0
  34. data/app/views/admin/orders/show.html.erb +35 -0
  35. data/app/views/admin/orders/user.html.erb +19 -0
  36. data/app/views/admin/pickup_locations/_pickup_location.html.erb +10 -0
  37. data/app/views/admin/pickup_locations/edit.html.erb +44 -0
  38. data/app/views/admin/pickup_locations/new.html.erb +48 -0
  39. data/app/views/admin/pickup_locations/show.html.erb +1 -0
  40. data/app/views/admin/pickups/_pickup.erb +0 -0
  41. data/app/views/admin/pickups/index.html.erb +44 -0
  42. data/app/views/admin/pickups/new.html.erb +33 -0
  43. data/app/views/admin/pickups/show.html.erb +42 -0
  44. data/app/views/admin/products/_suppliers_form.html.erb +5 -0
  45. data/app/views/admin/shared/_order_tabs_decide.html.erb +5 -0
  46. data/app/views/admin/shared/_vendor_order_tabs.html.erb +39 -0
  47. data/app/views/admin/shipping_options/edit.html.erb +38 -0
  48. data/app/views/admin/supplier_taxons/_form.html.erb +23 -0
  49. data/app/views/admin/supplier_taxons/_taxon_table.html.erb +23 -0
  50. data/app/views/admin/supplier_taxons/available.js.erb +33 -0
  51. data/app/views/admin/supplier_taxons/edit.html.erb +11 -0
  52. data/app/views/admin/supplier_taxons/remove.html.erb +1 -0
  53. data/app/views/admin/supplier_taxons/select.js.erb +2 -0
  54. data/app/views/admin/supplier_taxons/selected.html.erb +51 -0
  55. data/app/views/admin/suppliers/_edit_form.html.erb +75 -0
  56. data/app/views/admin/suppliers/_edit_hours_form.html.erb +18 -0
  57. data/app/views/admin/suppliers/_form.html.erb +72 -0
  58. data/app/views/admin/suppliers/_hours_form.html.erb +11 -0
  59. data/app/views/admin/suppliers/_image_form.html.erb +40 -0
  60. data/app/views/admin/suppliers/_supplier.html.erb +37 -0
  61. data/app/views/admin/suppliers/_supplier_tabs.html.erb +18 -0
  62. data/app/views/admin/suppliers/_suppliers_table.html.erb +25 -0
  63. data/app/views/admin/suppliers/_upload_image.html.erb +14 -0
  64. data/app/views/admin/suppliers/available.js.erb +34 -0
  65. data/app/views/admin/suppliers/edit.html.erb +20 -0
  66. data/app/views/admin/suppliers/index.html.erb +102 -0
  67. data/app/views/admin/suppliers/line_items.html.erb +20 -0
  68. data/app/views/admin/suppliers/new.html.erb +22 -0
  69. data/app/views/admin/suppliers/remove.html.erb +1 -0
  70. data/app/views/admin/suppliers/select.html.erb +1 -0
  71. data/app/views/admin/suppliers/selected.html.erb +40 -0
  72. data/app/views/admin/suppliers/show.html.erb +2 -0
  73. data/app/views/admin/users/_form.html.erb +40 -0
  74. data/app/views/admin/vendor_overview/index.html.erb +1 -0
  75. data/app/views/checkout/_delivery.html.erb +5 -0
  76. data/app/views/dash/overview/index.html.erb +58 -0
  77. data/app/views/dash/pickup_locations/_pickup_location.html.erb +3 -0
  78. data/app/views/dash/pickup_locations/new.html.erb +47 -0
  79. data/app/views/dash/pickups/_pickup.erb +3 -0
  80. data/app/views/dash/pickups/new.html.erb +24 -0
  81. data/app/views/dash/products/new.html.erb +38 -0
  82. data/app/views/layouts/admin.html.erb +81 -0
  83. data/app/views/messages/_message_form.html.erb +17 -0
  84. data/app/views/messages/create.html.erb +2 -0
  85. data/app/views/messages/destroy.html.erb +2 -0
  86. data/app/views/messages/new.html.erb +2 -0
  87. data/app/views/shared/_deliveries.html.erb +113 -0
  88. data/app/views/shared/_hours.html.erb +21 -0
  89. data/app/views/shared/_products_vendor.html.erb +49 -0
  90. data/app/views/shared/_supplier_invoices.html.erb +67 -0
  91. data/app/views/supplier_mailer/invoice_email.html.erb +72 -0
  92. data/app/views/suppliers/_supplier.html.erb +7 -0
  93. data/app/views/suppliers/_supplier_list.erb +20 -0
  94. data/app/views/suppliers/index.html.erb +17 -0
  95. data/app/views/suppliers/show.html.erb +106 -0
  96. data/app/views/suppliers/supplier_list.erb +14 -0
  97. data/config/initializers/dragonfly.rb +8 -0
  98. data/config/initializers/supplier_invoice_mailer.rb +10 -0
  99. data/config/locales/en-US.yml +13 -0
  100. data/config/routes.rb +48 -0
  101. data/db/migrate/20091209201716_supplier_setup.rb +36 -0
  102. data/db/migrate/20110922213437_create_messages.rb +18 -0
  103. data/db/migrate/20110928203155_create_hours.rb +21 -0
  104. data/db/migrate/20111006185052_create_pickups.rb +17 -0
  105. data/db/migrate/20111010191125_add_location_to_addresses.rb +9 -0
  106. data/db/migrate/20111010214313_create_pickup_dates.rb +14 -0
  107. data/db/migrate/20111011180211_add_supplier_id_to_user.rb +9 -0
  108. data/db/migrate/20111012211422_create_pickup_locations.rb +21 -0
  109. data/db/migrate/20111013155257_create_supplier_invoices.rb +16 -0
  110. data/db/migrate/20111013161225_create_items.rb +18 -0
  111. data/db/migrate/20111018133543_add_attributes_to_products.rb +17 -0
  112. data/db/migrate/20111028190454_add_attributes_to_assets.rb +11 -0
  113. data/db/migrate/20111029230805_create_suppliers_taxons.rb +16 -0
  114. data/db/migrate/20111101165933_create_deliveries.rb +17 -0
  115. data/db/migrate/20111108213108_create_shipping_methods_suppliers.rb +16 -0
  116. data/db/seeds.rb +14 -0
  117. data/lib/spree_suppliers.rb +411 -0
  118. data/lib/spree_suppliers_hooks.rb +40 -0
  119. data/lib/tasks/spree_suppliers.rake +27 -0
  120. data/public/javascripts/jquery-ui.js +312 -0
  121. data/public/javascripts/jquery-ui.multidatespicker.js +398 -0
  122. data/public/javascripts/jquery.ui.datepicker.js +1791 -0
  123. data/public/stylesheets/suppliers.css +676 -0
  124. data/spec/controllers/cities_controller_spec.rb +157 -0
  125. data/spec/controllers/shipping_options_controller_spec.rb +12 -0
  126. data/spec/helpers/cities_helper_spec.rb +15 -0
  127. data/spec/models/city_spec.rb +5 -0
  128. data/spec/models/comment_spec.rb +64 -0
  129. data/spec/models/item_spec.rb +5 -0
  130. data/spec/models/message_spec.rb +5 -0
  131. data/spec/models/pickup_date_spec.rb +5 -0
  132. data/spec/models/pickup_location_spec.rb +5 -0
  133. data/spec/models/pickup_spec.rb +5 -0
  134. data/spec/models/rating_spec.rb +24 -0
  135. data/spec/models/supplier_invoice_spec.rb +5 -0
  136. data/spec/models/supplier_spec.rb +11 -0
  137. data/spec/requests/cities_spec.rb +11 -0
  138. data/spec/routing/cities_routing_spec.rb +35 -0
  139. data/spec/spec.opts +6 -0
  140. data/spec/spec_helper.rb +37 -0
  141. data/spec/views/cities/edit.html.erb_spec.rb +22 -0
  142. data/spec/views/cities/index.html.erb_spec.rb +28 -0
  143. data/spec/views/cities/new.html.erb_spec.rb +22 -0
  144. data/spec/views/cities/show.html.erb_spec.rb +21 -0
  145. data/spec/views/shipping_options/edit.html.erb_spec.rb +5 -0
  146. data/spree_suppliers.gemspec +24 -0
  147. metadata +181 -14
@@ -0,0 +1,312 @@
1
+ /*!
2
+ * jQuery UI 1.8.13
3
+ *
4
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
5
+ * Dual licensed under the MIT or GPL Version 2 licenses.
6
+ * http://jquery.org/license
7
+ *
8
+ * http://docs.jquery.com/UI
9
+ */
10
+ (function( $, undefined ) {
11
+
12
+ // prevent duplicate loading
13
+ // this is only a problem because we proxy existing functions
14
+ // and we don't want to double proxy them
15
+ $.ui = $.ui || {};
16
+ if ( $.ui.version ) {
17
+ return;
18
+ }
19
+
20
+ $.extend( $.ui, {
21
+ version: "1.8.13",
22
+
23
+ keyCode: {
24
+ ALT: 18,
25
+ BACKSPACE: 8,
26
+ CAPS_LOCK: 20,
27
+ COMMA: 188,
28
+ COMMAND: 91,
29
+ COMMAND_LEFT: 91, // COMMAND
30
+ COMMAND_RIGHT: 93,
31
+ CONTROL: 17,
32
+ DELETE: 46,
33
+ DOWN: 40,
34
+ END: 35,
35
+ ENTER: 13,
36
+ ESCAPE: 27,
37
+ HOME: 36,
38
+ INSERT: 45,
39
+ LEFT: 37,
40
+ MENU: 93, // COMMAND_RIGHT
41
+ NUMPAD_ADD: 107,
42
+ NUMPAD_DECIMAL: 110,
43
+ NUMPAD_DIVIDE: 111,
44
+ NUMPAD_ENTER: 108,
45
+ NUMPAD_MULTIPLY: 106,
46
+ NUMPAD_SUBTRACT: 109,
47
+ PAGE_DOWN: 34,
48
+ PAGE_UP: 33,
49
+ PERIOD: 190,
50
+ RIGHT: 39,
51
+ SHIFT: 16,
52
+ SPACE: 32,
53
+ TAB: 9,
54
+ UP: 38,
55
+ WINDOWS: 91 // COMMAND
56
+ }
57
+ });
58
+
59
+ // plugins
60
+ $.fn.extend({
61
+ _focus: $.fn.focus,
62
+ focus: function( delay, fn ) {
63
+ return typeof delay === "number" ?
64
+ this.each(function() {
65
+ var elem = this;
66
+ setTimeout(function() {
67
+ $( elem ).focus();
68
+ if ( fn ) {
69
+ fn.call( elem );
70
+ }
71
+ }, delay );
72
+ }) :
73
+ this._focus.apply( this, arguments );
74
+ },
75
+
76
+ scrollParent: function() {
77
+ var scrollParent;
78
+ if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
79
+ scrollParent = this.parents().filter(function() {
80
+ return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
81
+ }).eq(0);
82
+ } else {
83
+ scrollParent = this.parents().filter(function() {
84
+ return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
85
+ }).eq(0);
86
+ }
87
+
88
+ return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
89
+ },
90
+
91
+ zIndex: function( zIndex ) {
92
+ if ( zIndex !== undefined ) {
93
+ return this.css( "zIndex", zIndex );
94
+ }
95
+
96
+ if ( this.length ) {
97
+ var elem = $( this[ 0 ] ), position, value;
98
+ while ( elem.length && elem[ 0 ] !== document ) {
99
+ // Ignore z-index if position is set to a value where z-index is ignored by the browser
100
+ // This makes behavior of this function consistent across browsers
101
+ // WebKit always returns auto if the element is positioned
102
+ position = elem.css( "position" );
103
+ if ( position === "absolute" || position === "relative" || position === "fixed" ) {
104
+ // IE returns 0 when zIndex is not specified
105
+ // other browsers return a string
106
+ // we ignore the case of nested elements with an explicit value of 0
107
+ // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
108
+ value = parseInt( elem.css( "zIndex" ), 10 );
109
+ if ( !isNaN( value ) && value !== 0 ) {
110
+ return value;
111
+ }
112
+ }
113
+ elem = elem.parent();
114
+ }
115
+ }
116
+
117
+ return 0;
118
+ },
119
+
120
+ disableSelection: function() {
121
+ return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
122
+ ".ui-disableSelection", function( event ) {
123
+ event.preventDefault();
124
+ });
125
+ },
126
+
127
+ enableSelection: function() {
128
+ return this.unbind( ".ui-disableSelection" );
129
+ }
130
+ });
131
+
132
+ $.each( [ "Width", "Height" ], function( i, name ) {
133
+ var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
134
+ type = name.toLowerCase(),
135
+ orig = {
136
+ innerWidth: $.fn.innerWidth,
137
+ innerHeight: $.fn.innerHeight,
138
+ outerWidth: $.fn.outerWidth,
139
+ outerHeight: $.fn.outerHeight
140
+ };
141
+
142
+ function reduce( elem, size, border, margin ) {
143
+ $.each( side, function() {
144
+ size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
145
+ if ( border ) {
146
+ size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
147
+ }
148
+ if ( margin ) {
149
+ size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
150
+ }
151
+ });
152
+ return size;
153
+ }
154
+
155
+ $.fn[ "inner" + name ] = function( size ) {
156
+ if ( size === undefined ) {
157
+ return orig[ "inner" + name ].call( this );
158
+ }
159
+
160
+ return this.each(function() {
161
+ $( this ).css( type, reduce( this, size ) + "px" );
162
+ });
163
+ };
164
+
165
+ $.fn[ "outer" + name] = function( size, margin ) {
166
+ if ( typeof size !== "number" ) {
167
+ return orig[ "outer" + name ].call( this, size );
168
+ }
169
+
170
+ return this.each(function() {
171
+ $( this).css( type, reduce( this, size, true, margin ) + "px" );
172
+ });
173
+ };
174
+ });
175
+
176
+ // selectors
177
+ function focusable( element, isTabIndexNotNaN ) {
178
+ var nodeName = element.nodeName.toLowerCase();
179
+ if ( "area" === nodeName ) {
180
+ var map = element.parentNode,
181
+ mapName = map.name,
182
+ img;
183
+ if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
184
+ return false;
185
+ }
186
+ img = $( "img[usemap=#" + mapName + "]" )[0];
187
+ return !!img && visible( img );
188
+ }
189
+ return ( /input|select|textarea|button|object/.test( nodeName )
190
+ ? !element.disabled
191
+ : "a" == nodeName
192
+ ? element.href || isTabIndexNotNaN
193
+ : isTabIndexNotNaN)
194
+ // the element and all of its ancestors must be visible
195
+ && visible( element );
196
+ }
197
+
198
+ function visible( element ) {
199
+ return !$( element ).parents().andSelf().filter(function() {
200
+ return $.curCSS( this, "visibility" ) === "hidden" ||
201
+ $.expr.filters.hidden( this );
202
+ }).length;
203
+ }
204
+
205
+ $.extend( $.expr[ ":" ], {
206
+ data: function( elem, i, match ) {
207
+ return !!$.data( elem, match[ 3 ] );
208
+ },
209
+
210
+ focusable: function( element ) {
211
+ return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
212
+ },
213
+
214
+ tabbable: function( element ) {
215
+ var tabIndex = $.attr( element, "tabindex" ),
216
+ isTabIndexNaN = isNaN( tabIndex );
217
+ return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
218
+ }
219
+ });
220
+
221
+ // support
222
+ $(function() {
223
+ var body = document.body,
224
+ div = body.appendChild( div = document.createElement( "div" ) );
225
+
226
+ $.extend( div.style, {
227
+ minHeight: "100px",
228
+ height: "auto",
229
+ padding: 0,
230
+ borderWidth: 0
231
+ });
232
+
233
+ $.support.minHeight = div.offsetHeight === 100;
234
+ $.support.selectstart = "onselectstart" in div;
235
+
236
+ // set display to none to avoid a layout bug in IE
237
+ // http://dev.jquery.com/ticket/4014
238
+ body.removeChild( div ).style.display = "none";
239
+ });
240
+
241
+
242
+
243
+
244
+
245
+ // deprecated
246
+ $.extend( $.ui, {
247
+ // $.ui.plugin is deprecated. Use the proxy pattern instead.
248
+ plugin: {
249
+ add: function( module, option, set ) {
250
+ var proto = $.ui[ module ].prototype;
251
+ for ( var i in set ) {
252
+ proto.plugins[ i ] = proto.plugins[ i ] || [];
253
+ proto.plugins[ i ].push( [ option, set[ i ] ] );
254
+ }
255
+ },
256
+ call: function( instance, name, args ) {
257
+ var set = instance.plugins[ name ];
258
+ if ( !set || !instance.element[ 0 ].parentNode ) {
259
+ return;
260
+ }
261
+
262
+ for ( var i = 0; i < set.length; i++ ) {
263
+ if ( instance.options[ set[ i ][ 0 ] ] ) {
264
+ set[ i ][ 1 ].apply( instance.element, args );
265
+ }
266
+ }
267
+ }
268
+ },
269
+
270
+ // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
271
+ contains: function( a, b ) {
272
+ return document.compareDocumentPosition ?
273
+ a.compareDocumentPosition( b ) & 16 :
274
+ a !== b && a.contains( b );
275
+ },
276
+
277
+ // only used by resizable
278
+ hasScroll: function( el, a ) {
279
+
280
+ //If overflow is hidden, the element might have extra content, but the user wants to hide it
281
+ if ( $( el ).css( "overflow" ) === "hidden") {
282
+ return false;
283
+ }
284
+
285
+ var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
286
+ has = false;
287
+
288
+ if ( el[ scroll ] > 0 ) {
289
+ return true;
290
+ }
291
+
292
+ // TODO: determine which cases actually cause this to happen
293
+ // if the element doesn't have the scroll set, see if it's possible to
294
+ // set the scroll
295
+ el[ scroll ] = 1;
296
+ has = ( el[ scroll ] > 0 );
297
+ el[ scroll ] = 0;
298
+ return has;
299
+ },
300
+
301
+ // these are odd functions, fix the API or move into individual plugins
302
+ isOverAxis: function( x, reference, size ) {
303
+ //Determines when x coordinate is over "b" element axis
304
+ return ( x > reference ) && ( x < ( reference + size ) );
305
+ },
306
+ isOver: function( y, x, top, left, height, width ) {
307
+ //Determines when x, y coordinates is over "b" element
308
+ return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
309
+ }
310
+ });
311
+
312
+ })( jQuery );
@@ -0,0 +1,398 @@
1
+ /*
2
+ * MultiDatesPicker v1.5.2
3
+ * http://multidatespickr.sourceforge.net/
4
+ *
5
+ * Copyright 2011, Luca Lauretta
6
+ * Dual licensed under the MIT or GPL version 2 licenses.
7
+ */
8
+ (function( $ ){
9
+ $.extend($.ui, { multiDatesPicker: { version: "1.5.2" } });
10
+
11
+ $.fn.multiDatesPicker = function(method) {
12
+ var mdp_arguments = arguments;
13
+ var ret = this;
14
+ var today_date = new Date();
15
+ var day_zero = new Date(0);
16
+ var mdp_events = {};
17
+
18
+ function removeDate(index, type) {
19
+ if(!type) type = 'picked';
20
+ this.multiDatesPicker.dates[type].splice(index, 1);
21
+ }
22
+ function addDate(date, type, no_sort) {
23
+ if(!type) type = 'picked';
24
+ if (methods.gotDate.call(this, date, type) === false) {
25
+ this.multiDatesPicker.dates[type].push(dateConvert.call(this, date));
26
+ if(!no_sort) this.multiDatesPicker.dates[type].sort(methods.compareDates);
27
+ }
28
+ }
29
+ function sortDates(type) {
30
+ if(!type) type = 'picked';
31
+ this.multiDatesPicker.dates[type].sort(methods.compareDates);
32
+ }
33
+ function dateConvert(date, desired_type, date_format) {
34
+ if(!desired_type) desired_type = 'object';
35
+ if(!date_format && (typeof date == 'string')) {
36
+ date_format = $(this).datepicker('option', 'dateFormat');
37
+ if(!date_format) date_format = $.datepicker._defaults.dateFormat;
38
+ }
39
+
40
+ return methods.dateConvert.call(this, date, desired_type, date_format);
41
+ }
42
+
43
+ var methods = {
44
+ init : function( options ) {
45
+ var $this = $(this);
46
+ this.multiDatesPicker.changed = false;
47
+
48
+ var mdp_events = {
49
+ beforeShow: function(input, inst) {
50
+ this.multiDatesPicker.changed = false;
51
+ if(this.multiDatesPicker.originalBeforeShow) this.multiDatesPicker.originalBeforeShow.call(this, input, inst);
52
+ },
53
+ onSelect : function(dateText, inst) {
54
+ var $this = $(this);
55
+ this.multiDatesPicker.changed = true;
56
+
57
+ if (dateText) {
58
+ $this.multiDatesPicker('toggleDate', dateText);
59
+ var current_date = dateConvert.call(this, dateText);
60
+ }
61
+ var dates_picked = $this.multiDatesPicker('getDates');
62
+ var datos = this.multiDatesPicker.mode.options;
63
+
64
+ if (dates_picked.length > 0) {
65
+ if (this.multiDatesPicker.mode.modeName == 'normal') {
66
+ if (datos.pickableRange) {
67
+ var min_date = methods.compareDates(dateConvert.call(this, this.multiDatesPicker.minDate, 'object'), today_date);
68
+ var max_date = min_date + datos.pickableRangeDelay + pickableRange;
69
+
70
+ // min
71
+ var n_min_date = methods.compareDates(dateConvert.call(this, dates_picked[0], 'object'), dateConvert.call(this, min_date, 'object'));
72
+
73
+ // max
74
+ var n_max_date = n_min_date + datos.pickableRange;
75
+
76
+ // adjust
77
+ if (n_max_date > max_date) min_date = max_date - datos.pickableRange + 1;
78
+ else {
79
+ max_date = n_max_date;
80
+ min_date = n_min_date;
81
+ }
82
+
83
+ // counts the number of disabled dates in the range
84
+ var c_disabled;
85
+ do {
86
+ c_disabled = 0;
87
+ for(var i in this.multiDatesPicker.dates.disabled) {
88
+ var avdatei = dateConvert.call(this, this.multiDatesPicker.dates.disabled[i], 'object');
89
+ if(methods.compareDates(avdatei, min_date) >= 0 &&
90
+ methods.compareDates(avdatei, max_date) <= 0)
91
+ c_disabled++;
92
+ }
93
+ max_date = max_date + c_disabled;
94
+ } while(c_disabled != 0);
95
+
96
+ $this.datepicker("option", "minDate", min_date);
97
+ $this.datepicker("option", "maxDate", max_date);
98
+ }
99
+ }
100
+ }
101
+
102
+ if(this.tagName == 'INPUT') { // for inputs
103
+ $this.val(
104
+ $this.multiDatesPicker('getDates', 'string')
105
+ );
106
+ }
107
+
108
+ if(this.multiDatesPicker.originalOnSelect && dateText)
109
+ this.multiDatesPicker.originalOnSelect.call(this, dateText, inst);
110
+
111
+ // thanks to bibendus83 -> http://sourceforge.net/tracker/?func=detail&atid=1495384&aid=3403159&group_id=358205
112
+ if ($this.datepicker('option', 'altField') != undefined && $this.datepicker('option', 'altField') != "") {
113
+ $($this.datepicker('option', 'altField')).val(
114
+ $this.multiDatesPicker('getDates', 'string')
115
+ );
116
+ }
117
+ },
118
+ beforeShowDay : function(date) {
119
+ var $this = $(this);
120
+ var gotThisDate = $this.multiDatesPicker('gotDate', date) !== false;
121
+ var highlight_class = gotThisDate
122
+ ? 'ui-state-highlight'
123
+ : '';
124
+
125
+ var isDisabledDate = $this.multiDatesPicker('gotDate', date, 'disabled') !== false;
126
+ var allSelected = this.multiDatesPicker.mode.options.maxPicks == $this.multiDatesPicker('getDates').length;
127
+ var selectable_date = (isDisabledDate || (allSelected && !highlight_class))
128
+ ? false
129
+ : true;
130
+
131
+ if(this.multiDatesPicker.originalBeforeShowDay) this.multiDatesPicker.originalBeforeShowDay.call(this, date);
132
+
133
+ return [selectable_date, highlight_class];
134
+ },
135
+ onClose: function(dateText, inst) {
136
+ if(this.tagName == 'INPUT' && this.multiDatesPicker.changed) {
137
+ $(inst.dpDiv[0]).stop(false,true);
138
+ setTimeout('$("#'+inst.id+'").datepicker("show")',50);
139
+ }
140
+ if(this.multiDatesPicker.originalOnClose) this.multiDatesPicker.originalOnClose.call(this, dateText, inst);
141
+ }
142
+ };
143
+
144
+ if(options) {
145
+ this.multiDatesPicker.originalBeforeShow = options.beforeShow;
146
+ this.multiDatesPicker.originalOnSelect = options.onSelect;
147
+ this.multiDatesPicker.originalBeforeShowDay = options.beforeShowDay;
148
+ this.multiDatesPicker.originalOnClose = options.onClose;
149
+
150
+ $this.datepicker(options);
151
+
152
+ this.multiDatesPicker.minDate = $.datepicker._determineDate(this, options.minDate, day_zero);
153
+ this.multiDatesPicker.firstAvailableDay = methods.compareDates(this.multiDatesPicker.minDate, day_zero);
154
+
155
+ if(options.addDates) methods.addDates.call(this, options.addDates);
156
+ if(options.addDisabledDates)
157
+ methods.addDates.call(this, options.addDisabledDates, 'disabled');
158
+
159
+ if(options.mode)
160
+ methods.setMode.call(this, options.mode);
161
+ } else {
162
+ $this.datepicker();
163
+ }
164
+
165
+ $this.datepicker('option', mdp_events);
166
+
167
+ if(this.tagName == 'INPUT') $this.val($this.multiDatesPicker('getDates', 'string'));
168
+
169
+ // Fixes the altField filled with defaultDate by default
170
+ var altFieldOption = $this.datepicker('option', 'altField');
171
+ if (altFieldOption) $(altFieldOption).val($this.multiDatesPicker('getDates', 'string'));
172
+ },
173
+ compareDates : function(date1, date2) {
174
+ var one_day = 1000*60*60*24;
175
+ // return > 0 means date1 is later than date2
176
+ // return == 0 means date1 is the same day as date2
177
+ // return < 0 means date1 is earlier than date2
178
+ return Math.ceil(date1.getTime()/one_day) - Math.ceil(date2.getTime()/one_day);
179
+ },
180
+ sumDays : function( date, n_days ) {
181
+ var origDateType = typeof date;
182
+ obj_date = dateConvert.call(this, date);
183
+ obj_date.setDate(obj_date.getDate() + n_days);
184
+ return dateConvert.call(this, obj_date, origDateType);
185
+ },
186
+ dateConvert : function( date, desired_format, dateFormat ) {
187
+ if(typeof date == desired_format) return date;
188
+
189
+ var $this = $(this);
190
+ if(typeof date == 'undefined') date = new Date(0);
191
+
192
+ if(desired_format != 'string' && desired_format != 'object')
193
+ $.error('Date format "'+ desired_format +'" not supported on jQuery.multiDatesPicker');
194
+
195
+ var conversion = typeof date + '->' + desired_format;
196
+ if(!dateFormat) {
197
+ dateFormat = $.datepicker._defaults.dateFormat;
198
+
199
+ // thanks to bibendus83 -> http://sourceforge.net/tracker/index.php?func=detail&aid=3213174&group_id=358205&atid=1495382
200
+ var dp_dateFormat = $this.datepicker('option', 'dateFormat');
201
+ if (dp_dateFormat) {
202
+ dateFormat = dp_dateFormat;
203
+ }
204
+ }
205
+ switch(conversion) {
206
+ case 'object->string':
207
+ return $.datepicker.formatDate(dateFormat, date);
208
+ case 'string->object':
209
+ return $.datepicker.parseDate(dateFormat, date);
210
+ default:
211
+ $.error('Conversion "'+ conversion +'" not allowed on jQuery.multiDatesPicker');
212
+ }
213
+ return false;
214
+ },
215
+ gotDate : function( date, type ) {
216
+ if(!type) type = 'picked';
217
+ for(var i = 0; i < this.multiDatesPicker.dates[type].length; i++) {
218
+ if(methods.compareDates(dateConvert.call(this, this.multiDatesPicker.dates[type][i]), dateConvert.call(this, date)) == 0) {
219
+ return i;
220
+ }
221
+ }
222
+ return false;
223
+ },
224
+ getDates : function( format, type ) {
225
+ if(!type) type = 'picked';
226
+ switch (format) {
227
+ case 'object':
228
+ return this.multiDatesPicker.dates[type];
229
+ default:
230
+ var o_dates = new Array();
231
+ for(var i in this.multiDatesPicker.dates[type])
232
+ o_dates.push(
233
+ dateConvert.call(
234
+ this,
235
+ this.multiDatesPicker.dates[type][i],
236
+ 'string'
237
+ )
238
+ );
239
+ return o_dates;
240
+ }
241
+ },
242
+ addDates : function( dates, type ) {
243
+ if(!type) type = 'picked';
244
+ switch(typeof dates) {
245
+ case 'object':
246
+ case 'array':
247
+ if(dates.length) {
248
+ for(var i in dates)
249
+ addDate.call(this, dates[i], type, true);
250
+ sortDates.call(this, type);
251
+ break;
252
+ } // else does the same as 'string'
253
+ case 'string':
254
+ addDate.call(this, dates, type);
255
+ break;
256
+ default:
257
+ $.error('Date format "'+ typeof dates +'" not allowed on jQuery.multiDatesPicker');
258
+ }
259
+ $(this).datepicker('refresh');
260
+ },
261
+ removeDates : function( indexes, type ) {
262
+ if(!type) type = 'picked';
263
+ if(typeof indexes == 'array')
264
+ for(var i in indexes) removeDate.call(this, i, type);
265
+ else
266
+ removeDate.call(this, indexes, type);
267
+ $(this).datepicker('refresh');
268
+ },
269
+ resetDates : function ( type ) {
270
+ if(!type) type = 'picked';
271
+ this.multiDatesPicker.dates[type] = [];
272
+ $(this).datepicker('refresh');
273
+ },
274
+ toggleDate : function( date, type ) {
275
+ if(!type) type = 'picked';
276
+ var index = methods.gotDate.call(this, date);
277
+ var mode = this.multiDatesPicker.mode;
278
+
279
+ switch(mode.modeName) {
280
+ case 'daysRange':
281
+ this.multiDatesPicker.dates[type] = []; // deletes all picked/disabled dates
282
+ var end = mode.options.autoselectRange[1];
283
+ var begin = mode.options.autoselectRange[0];
284
+ if(end < begin) { // switch
285
+ end = mode.options.autoselectRange[0];
286
+ begin = mode.options.autoselectRange[1];
287
+ }
288
+ for(var i = begin; i < end; i++)
289
+ methods.addDates.call(this, methods.sumDays(date, i), type);
290
+ break;
291
+ default:
292
+ if(index === false) // adds dates
293
+ methods.addDates.call(this, date, type);
294
+ else // removes dates
295
+ methods.removeDates.call(this, index, type);
296
+ break;
297
+ }
298
+ },
299
+ setMode : function( mode ) {
300
+ this.multiDatesPicker.mode.modeName = mode.modeName;
301
+ var option;
302
+ switch(mode.modeName) {
303
+ case 'normal':
304
+ for(option in mode.options)
305
+ switch(option) {
306
+ case 'maxPicks':
307
+ case 'minPicks':
308
+ case 'pickableRange':
309
+ case 'pickableRangeDelay':
310
+ case 'adjustRangeToDisabled':
311
+ this.multiDatesPicker.mode.options[option] = mode.options[option];
312
+ break;
313
+ default: $.error('Option ' + option + ' does not exist for setMode on jQuery.multiDatesPicker');
314
+ }
315
+ break;
316
+ case 'daysRange':
317
+ case 'weeksRange':
318
+ var mandatory = 1;
319
+ for(option in mode.options)
320
+ switch(option) {
321
+ case 'autoselectRange':
322
+ mandatory--;
323
+ case 'pickableRange':
324
+ case 'pickableRangeDelay':
325
+ case 'adjustRangeToDisabled':
326
+ this.multiDatesPicker.mode.options[option] = mode.options[option];
327
+ break;
328
+ default: $.error('Option ' + option + ' does not exist for setMode on jQuery.multiDatesPicker');
329
+ }
330
+ if(mandatory > 0) $.error('Some mandatory options not specified!');
331
+ break;
332
+ }
333
+
334
+ if(mode.options.pickableRange) {
335
+ $(this).datepicker("option", "maxDate", mode.options.pickableRange + (mode.options.pickableRangeDelay || 0));
336
+ $(this).datepicker("option", "minDate", this.multiDatesPicker.minDate);
337
+ }
338
+
339
+ if(mdp_events.onSelect) mdp_events.onSelect();
340
+ $(this).datepicker('refresh');
341
+ }
342
+ };
343
+
344
+ this.each(function() {
345
+ if (!this.multiDatesPicker)
346
+ this.multiDatesPicker = {
347
+ dates: {
348
+ picked: [],
349
+ disabled: []
350
+ },
351
+ mode: {
352
+ modeName: 'normal',
353
+ options: {
354
+ adjustRangeToDisabled: true
355
+ }
356
+ }
357
+ };
358
+
359
+ if(methods[method]) {
360
+ var exec_result = methods[method].apply(this, Array.prototype.slice.call(mdp_arguments, 1));
361
+ switch(method) {
362
+ case 'getDates':
363
+ case 'gotDate':
364
+ case 'sumDays':
365
+ case 'compareDates':
366
+ case 'dateConvert':
367
+ ret = exec_result;
368
+ }
369
+ return exec_result;
370
+ } else if( typeof method === 'object' || ! method ) {
371
+ return methods.init.apply(this, mdp_arguments);
372
+ } else {
373
+ $.error('Method ' + method + ' does not exist on jQuery.multiDatesPicker');
374
+ }
375
+ return false;
376
+ });
377
+
378
+ if(method != 'gotDate' && method != 'getDates') {
379
+ aaaa = 1;
380
+ }
381
+
382
+ return ret;
383
+ };
384
+
385
+ var PROP_NAME = 'multiDatesPicker';
386
+ var dpuuid = new Date().getTime();
387
+ var instActive;
388
+
389
+ $.multiDatesPicker = {version: false};
390
+ //$.multiDatesPicker = new MultiDatesPicker(); // singleton instance
391
+ $.multiDatesPicker.initialized = false;
392
+ $.multiDatesPicker.uuid = new Date().getTime();
393
+ $.multiDatesPicker.version = $.ui.multiDatesPicker.version;
394
+
395
+ // Workaround for #4055
396
+ // Add another global to avoid noConflict issues with inline event handlers
397
+ window['DP_jQuery_' + dpuuid] = $;
398
+ })( jQuery );