atreides 2.0.3 → 2.0.4

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 (163) hide show
  1. data/LICENSE +1 -1
  2. data/app/assets/javascripts/atreides/admin_base.js.erb +11 -16
  3. data/app/assets/stylesheets/atreides/admin_base.css.erb +2 -3
  4. data/app/controllers/atreides/admin_controller.rb +14 -0
  5. data/app/models/atreides/{preferences.rb → preference.rb} +1 -1
  6. data/app/views/admin/atreides/common/_sidebar_publish.html.haml +16 -0
  7. data/app/views/admin/atreides/features/_form.html.haml +11 -18
  8. data/app/views/admin/atreides/pages/_form.html.haml +1 -4
  9. data/app/views/admin/atreides/posts/_form_sidebar.html.haml +1 -8
  10. data/app/views/admin/common/_list_table.html.haml +30 -0
  11. data/app/views/admin/common/_list_table_row.html.haml +11 -0
  12. data/app/views/admin/common/_pagination.html.haml +1 -0
  13. data/app/views/admin/common/_search_form.html.haml +4 -0
  14. data/lib/assets/flash/atreides/player.swf +0 -0
  15. data/lib/assets/flash/atreides/slideshowpro.swf +0 -0
  16. data/lib/assets/flash/atreides/swfupload.swf +0 -0
  17. data/lib/assets/images/atreides/share/aim_16.png +0 -0
  18. data/lib/assets/images/atreides/share/apple_16.png +0 -0
  19. data/lib/assets/images/atreides/share/bebo_16.png +0 -0
  20. data/lib/assets/images/atreides/share/blogger_16.png +0 -0
  21. data/lib/assets/images/atreides/share/brightkite_16.png +0 -0
  22. data/lib/assets/images/atreides/share/cargo_16.png +0 -0
  23. data/lib/assets/images/atreides/share/delicious_16.png +0 -0
  24. data/lib/assets/images/atreides/share/designfloat_16.png +0 -0
  25. data/lib/assets/images/atreides/share/designmoo_16.png +0 -0
  26. data/lib/assets/images/atreides/share/deviantart_16.png +0 -0
  27. data/lib/assets/images/atreides/share/digg_16.png +0 -0
  28. data/lib/assets/images/atreides/share/digg_alt_16.png +0 -0
  29. data/lib/assets/images/atreides/share/dopplr_16.png +0 -0
  30. data/lib/assets/images/atreides/share/dribbble_16.png +0 -0
  31. data/lib/assets/images/atreides/share/email_16.png +0 -0
  32. data/lib/assets/images/atreides/share/ember_16.png +0 -0
  33. data/lib/assets/images/atreides/share/evernote_16.png +0 -0
  34. data/lib/assets/images/atreides/share/facebook_16.png +0 -0
  35. data/lib/assets/images/atreides/share/flickr_16.png +0 -0
  36. data/lib/assets/images/atreides/share/friendfeed_16.png +0 -0
  37. data/lib/assets/images/atreides/share/gamespot_16.png +0 -0
  38. data/lib/assets/images/atreides/share/google_16.png +0 -0
  39. data/lib/assets/images/atreides/share/google_voice_16.png +0 -0
  40. data/lib/assets/images/atreides/share/google_wave_16.png +0 -0
  41. data/lib/assets/images/atreides/share/googletalk_16.png +0 -0
  42. data/lib/assets/images/atreides/share/gowalla_16.png +0 -0
  43. data/lib/assets/images/atreides/share/grooveshark_16.png +0 -0
  44. data/lib/assets/images/atreides/share/ilike_16.png +0 -0
  45. data/lib/assets/images/atreides/share/komodomedia_azure_16.png +0 -0
  46. data/lib/assets/images/atreides/share/komodomedia_wood_16.png +0 -0
  47. data/lib/assets/images/atreides/share/lastfm_16.png +0 -0
  48. data/lib/assets/images/atreides/share/license.txt +9 -0
  49. data/lib/assets/images/atreides/share/linkedin_16.png +0 -0
  50. data/lib/assets/images/atreides/share/mixx_16.png +0 -0
  51. data/lib/assets/images/atreides/share/mobileme_16.png +0 -0
  52. data/lib/assets/images/atreides/share/mynameise_16.png +0 -0
  53. data/lib/assets/images/atreides/share/myspace_16.png +0 -0
  54. data/lib/assets/images/atreides/share/netvibes_16.png +0 -0
  55. data/lib/assets/images/atreides/share/newsvine_16.png +0 -0
  56. data/lib/assets/images/atreides/share/openid_16.png +0 -0
  57. data/lib/assets/images/atreides/share/orkut_16.png +0 -0
  58. data/lib/assets/images/atreides/share/pandora_16.png +0 -0
  59. data/lib/assets/images/atreides/share/paypal_16.png +0 -0
  60. data/lib/assets/images/atreides/share/picasa_16.png +0 -0
  61. data/lib/assets/images/atreides/share/plurk_16.png +0 -0
  62. data/lib/assets/images/atreides/share/posterous_16.png +0 -0
  63. data/lib/assets/images/atreides/share/qik_16.png +0 -0
  64. data/lib/assets/images/atreides/share/readernaut_16.png +0 -0
  65. data/lib/assets/images/atreides/share/reddit_16.png +0 -0
  66. data/lib/assets/images/atreides/share/roboto_16.png +0 -0
  67. data/lib/assets/images/atreides/share/rss_16.png +0 -0
  68. data/lib/assets/images/atreides/share/sharethis_16.png +0 -0
  69. data/lib/assets/images/atreides/share/skype_16.png +0 -0
  70. data/lib/assets/images/atreides/share/stumbleupon_16.png +0 -0
  71. data/lib/assets/images/atreides/share/technorati_16.png +0 -0
  72. data/lib/assets/images/atreides/share/tumblr_16.png +0 -0
  73. data/lib/assets/images/atreides/share/twitter_16.png +0 -0
  74. data/lib/assets/images/atreides/share/viddler_16.png +0 -0
  75. data/lib/assets/images/atreides/share/vimeo_16.png +0 -0
  76. data/lib/assets/images/atreides/share/virb_16.png +0 -0
  77. data/lib/assets/images/atreides/share/windows_16.png +0 -0
  78. data/lib/assets/images/atreides/share/wordpress_16.png +0 -0
  79. data/lib/assets/images/atreides/share/xing_16.png +0 -0
  80. data/lib/assets/images/atreides/share/yahoo_16.png +0 -0
  81. data/lib/assets/images/atreides/share/yahoobuzz_16.png +0 -0
  82. data/lib/assets/images/atreides/share/yelp_16.png +0 -0
  83. data/lib/assets/images/atreides/share/youtube_16.png +0 -0
  84. data/lib/assets/javascripts/atreides/facebox.js +309 -0
  85. data/lib/assets/javascripts/atreides/fileuploader.js +1250 -0
  86. data/lib/assets/javascripts/atreides/galleria.js +2 -0
  87. data/lib/assets/javascripts/atreides/galleria/src/galleria.js +3816 -0
  88. data/lib/assets/javascripts/atreides/galleria/src/plugins/galleria.flickr.js +221 -0
  89. data/lib/assets/javascripts/atreides/galleria/src/plugins/galleria.history.js +602 -0
  90. data/lib/assets/javascripts/atreides/galleria/src/themes/classic/classic-loader.gif +0 -0
  91. data/lib/assets/javascripts/atreides/galleria/src/themes/classic/classic-map.png +0 -0
  92. data/lib/assets/javascripts/atreides/galleria/src/themes/classic/galleria.classic.css +202 -0
  93. data/lib/assets/javascripts/atreides/galleria/src/themes/classic/galleria.classic.js +92 -0
  94. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/b.png +0 -0
  95. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/down.gif +0 -0
  96. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/fix.gif +0 -0
  97. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/fullscreen-demo.html +34 -0
  98. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/galleria.fullscreen.css +46 -0
  99. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/galleria.fullscreen.js +193 -0
  100. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/i.png +0 -0
  101. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/l.gif +0 -0
  102. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/l2.png +0 -0
  103. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/loader.gif +0 -0
  104. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/n.gif +0 -0
  105. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/p.gif +0 -0
  106. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/r.gif +0 -0
  107. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/r2.png +0 -0
  108. data/lib/assets/javascripts/atreides/galleria/src/themes/fullscreen/up.gif +0 -0
  109. data/lib/assets/javascripts/atreides/jquery.autogrow.js +132 -0
  110. data/lib/assets/javascripts/atreides/jquery.cookie.js +96 -0
  111. data/lib/assets/javascripts/atreides/jquery.countdown.js +759 -0
  112. data/lib/assets/javascripts/atreides/jquery.cycle.js +918 -0
  113. data/lib/assets/javascripts/atreides/jquery.easing.1.3.js +205 -0
  114. data/lib/assets/javascripts/atreides/jquery.flash.js +288 -0
  115. data/lib/assets/javascripts/atreides/jquery.iphone-checkboxes.js +214 -0
  116. data/lib/assets/javascripts/atreides/jquery.jBreadCrumb.1.1.js +240 -0
  117. data/lib/assets/javascripts/atreides/jquery.multipleselectbox-min.js +15 -0
  118. data/lib/assets/javascripts/atreides/jquery.multipleselectbox.js +446 -0
  119. data/lib/assets/javascripts/atreides/jquery.swfupload.js +64 -0
  120. data/lib/assets/javascripts/atreides/jquery.tipsy.js +104 -0
  121. data/lib/assets/javascripts/atreides/jquery.uniform.js +461 -0
  122. data/lib/assets/javascripts/atreides/jtags.js +125 -0
  123. data/lib/assets/javascripts/atreides/raphael-min.js +7 -0
  124. data/lib/assets/javascripts/atreides/raphael.analytics.js +205 -0
  125. data/lib/assets/javascripts/atreides/raphael.path.methods.js +53 -0
  126. data/lib/assets/javascripts/atreides/raphael.pie.js +44 -0
  127. data/lib/assets/javascripts/atreides/sifr.js +18 -0
  128. data/lib/assets/javascripts/atreides/swfobject.js +4 -0
  129. data/lib/assets/javascripts/atreides/swfupload/handlers.js +290 -0
  130. data/lib/assets/javascripts/atreides/swfupload/swfupload.cookies.js +53 -0
  131. data/lib/assets/javascripts/atreides/swfupload/swfupload.js +980 -0
  132. data/lib/assets/javascripts/atreides/swfupload/swfupload.queue.js +98 -0
  133. data/lib/assets/javascripts/atreides/swfupload/swfupload.speed.js +342 -0
  134. data/lib/assets/javascripts/atreides/swfupload/swfupload.swfobject.js +111 -0
  135. data/lib/assets/javascripts/atreides/underscore-1.1.6.js +807 -0
  136. data/lib/assets/stylesheets/atreides/admin_grid.css +258 -0
  137. data/lib/assets/stylesheets/atreides/facebox.css +80 -0
  138. data/lib/assets/stylesheets/atreides/formtastic.css +144 -0
  139. data/lib/assets/stylesheets/atreides/galleria.css +24 -0
  140. data/lib/assets/stylesheets/atreides/ie.css +35 -0
  141. data/lib/assets/stylesheets/atreides/images/bg_fallback.png +0 -0
  142. data/lib/assets/stylesheets/atreides/images/icon_sprite.png +0 -0
  143. data/lib/assets/stylesheets/atreides/images/progress_bar.gif +0 -0
  144. data/lib/assets/stylesheets/atreides/images/slider_handles.png +0 -0
  145. data/lib/assets/stylesheets/atreides/images/ui-icons_222222_256x240.png +0 -0
  146. data/lib/assets/stylesheets/atreides/images/ui-icons_454545_256x240.png +0 -0
  147. data/lib/assets/stylesheets/atreides/jquery-ui.css +738 -0
  148. data/lib/assets/stylesheets/atreides/multipleselectbox.css +33 -0
  149. data/lib/assets/stylesheets/atreides/print.css +29 -0
  150. data/lib/assets/stylesheets/atreides/public_grid.css +258 -0
  151. data/lib/assets/stylesheets/atreides/tipsy.css +7 -0
  152. data/lib/assets/stylesheets/atreides/uniform.default.css +476 -0
  153. data/lib/atreides.rb +4 -0
  154. data/lib/atreides/schema.rb +53 -0
  155. data/lib/atreides/time_zone.rb +6 -0
  156. data/lib/atreides/version.rb +1 -1
  157. data/lib/generators/templates/create_pages.rb +1 -2
  158. data/lib/generators/templates/create_posts.rb +1 -2
  159. metadata +155 -13
  160. data/app/views/admin/common/_list_table.html.erb +0 -37
  161. data/app/views/admin/common/_list_table_row.html.erb +0 -18
  162. data/app/views/admin/common/_pagination.html.erb +0 -1
  163. data/app/views/admin/common/_search_form.html.erb +0 -6
@@ -0,0 +1,214 @@
1
+ /*!
2
+ // iPhone-style Checkboxes jQuery plugin
3
+ // Copyright Thomas Reynolds, licensed GPL & MIT
4
+ */
5
+ ;(function($, iphoneStyle) {
6
+
7
+ // Constructor
8
+ $[iphoneStyle] = function(elem, options) {
9
+ this.$elem = $(elem);
10
+
11
+ // Import options into instance variables
12
+ var obj = this;
13
+ $.each(options, function(key, value) {
14
+ obj[key] = value;
15
+ });
16
+
17
+ // Initialize the control
18
+ this.wrapCheckboxWithDivs();
19
+ this.attachEvents();
20
+ this.disableTextSelection();
21
+
22
+ if (this.resizeHandle) { this.optionallyResize('handle'); }
23
+ if (this.resizeContainer) { this.optionallyResize('container'); }
24
+
25
+ this.initialPosition();
26
+ };
27
+
28
+ $.extend($[iphoneStyle].prototype, {
29
+ // Wrap the existing input[type=checkbox] with divs for styling and grab DOM references to the created nodes
30
+ wrapCheckboxWithDivs: function() {
31
+ this.$elem.wrap('<div class="' + this.containerClass + '" />');
32
+ this.container = this.$elem.parent();
33
+
34
+ this.offLabel = $('<label class="'+ this.labelOffClass +'">' +
35
+ '<span>'+ this.uncheckedLabel +'</span>' +
36
+ '</label>').appendTo(this.container);
37
+ this.offSpan = this.offLabel.children('span');
38
+
39
+ this.onLabel = $('<label class="'+ this.labelOnClass +'">' +
40
+ '<span>'+ this.checkedLabel +'</span>' +
41
+ '</label>').appendTo(this.container);
42
+ this.onSpan = this.onLabel.children('span');
43
+
44
+ this.handle = $('<div class="' + this.handleClass + '">' +
45
+ '<div class="' + this.handleRightClass + '">' +
46
+ '<div class="' + this.handleCenterClass + '" />' +
47
+ '</div>' +
48
+ '</div>').appendTo(this.container);
49
+ },
50
+
51
+ // Disable IE text selection, other browsers are handled in CSS
52
+ disableTextSelection: function() {
53
+ if (!$.browser.msie) { return; }
54
+
55
+ // Elements containing text should be unselectable
56
+ $.each([this.handle, this.offLabel, this.onLabel, this.container], function(el) {
57
+ $(el).attr("unselectable", "on");
58
+ });
59
+ },
60
+
61
+ // Automatically resize the handle or container
62
+ optionallyResize: function(mode) {
63
+ var onLabelWidth = this.onLabel.width(),
64
+ offLabelWidth = this.offLabel.width(),
65
+ newWidth = (onLabelWidth < offLabelWidth) ? onLabelWidth : offLabelWidth;
66
+
67
+ if (mode == 'container') { newWidth += this.handle.width() + 15; }
68
+ this[mode].css({ width: newWidth });
69
+ },
70
+
71
+ attachEvents: function() {
72
+ var obj = this;
73
+
74
+ // A mousedown anywhere in the control will start tracking for dragging
75
+ this.container
76
+ .bind('mousedown touchstart', function(event) {
77
+ event.preventDefault();
78
+
79
+ if (obj.$elem.is(':disabled')) { return; }
80
+
81
+ var x = event.pageX || event.originalEvent.changedTouches[0].pageX;
82
+ $[iphoneStyle].currentlyClicking = obj.handle;
83
+ $[iphoneStyle].dragStartPosition = x - (parseInt(obj.handle.css('left'), 10) || 0);
84
+ })
85
+
86
+ // Utilize event bubbling to handle drag on any element beneath the container
87
+ .bind('iPhoneDrag', function(event, x) {
88
+ event.preventDefault();
89
+
90
+ if (obj.$elem.is(':disabled')) { return; }
91
+
92
+ var p = (x - $[iphoneStyle].dragStartPosition) / obj.rightSide;
93
+ if (p < 0) { p = 0; }
94
+ if (p > 1) { p = 1; }
95
+
96
+ obj.handle.css({ left: p * obj.rightSide });
97
+ obj.onLabel.css({ width: p * obj.rightSide + 4 });
98
+ obj.offSpan.css({ marginRight: -p * obj.rightSide });
99
+ obj.onSpan.css({ marginLeft: -(1 - p) * obj.rightSide });
100
+ })
101
+
102
+ // Utilize event bubbling to handle drag end on any element beneath the container
103
+ .bind('iPhoneDragEnd', function(event, x) {
104
+ if (obj.$elem.is(':disabled')) { return; }
105
+
106
+ if ($[iphoneStyle].dragging) {
107
+ var p = (x - $[iphoneStyle].dragStartPosition) / obj.rightSide;
108
+ obj.$elem.attr('checked', (p >= 0.5));
109
+ } else {
110
+ obj.$elem.attr('checked', !obj.$elem.attr('checked'));
111
+ }
112
+
113
+ $[iphoneStyle].currentlyClicking = null;
114
+ $[iphoneStyle].dragging = null;
115
+ obj.$elem.change();
116
+ });
117
+
118
+ // Animate when we get a change event
119
+ this.$elem.change(function() {
120
+ if (obj.$elem.is(':disabled')) {
121
+ obj.container.addClass(obj.disabledClass);
122
+ return false;
123
+ } else {
124
+ obj.container.removeClass(obj.disabledClass);
125
+ }
126
+
127
+ var new_left = obj.$elem.attr('checked') ? obj.rightSide : 0;
128
+
129
+ obj.handle.animate({ left: new_left }, obj.duration);
130
+ obj.onLabel.animate({ width: new_left + 4 }, obj.duration);
131
+ obj.offSpan.animate({ marginRight: -new_left }, obj.duration);
132
+ obj.onSpan.animate({ marginLeft: new_left - obj.rightSide }, obj.duration);
133
+ });
134
+ },
135
+
136
+ // Setup the control's inital position
137
+ initialPosition: function() {
138
+ this.offLabel.css({ width: this.container.width() - 5 });
139
+
140
+ var offset = ($.browser.msie && $.browser.version < 7) ? 3 : 6;
141
+ this.rightSide = this.container.width() - this.handle.width() - offset;
142
+
143
+ if (this.$elem.is(':checked')) {
144
+ this.handle.css({ left: this.rightSide });
145
+ this.onLabel.css({ width: this.rightSide + 4 });
146
+ this.offSpan.css({ marginRight: -this.rightSide });
147
+ } else {
148
+ this.onLabel.css({ width: 0 });
149
+ this.onSpan.css({ marginLeft: -this.rightSide });
150
+ }
151
+
152
+ if (this.$elem.is(':disabled')) {
153
+ this.container.addClass(this.disabledClass);
154
+ }
155
+ }
156
+ });
157
+
158
+ // jQuery-specific code
159
+ $.fn[iphoneStyle] = function(options) {
160
+ var checkboxes = this.filter(':checkbox');
161
+
162
+ // Fail early if we don't have any checkboxes passed in
163
+ if (!checkboxes.length) { return this; }
164
+
165
+ // Merge options passed in with global defaults
166
+ var opt = $.extend({}, $[iphoneStyle].defaults, options);
167
+
168
+ checkboxes.each(function() {
169
+ $(this).data(iphoneStyle, new $[iphoneStyle](this, opt));
170
+ });
171
+
172
+ if (!$[iphoneStyle].initComplete) {
173
+ // As the mouse moves on the page, animate if we are in a drag state
174
+ $(document)
175
+ .bind('mousemove touchmove', function(event) {
176
+ if (!$[iphoneStyle].currentlyClicking) { return; }
177
+ if (event.pageX != $[iphoneStyle].dragStartPosition) { $[iphoneStyle].dragging = true; }
178
+ event.preventDefault();
179
+
180
+ var x = event.pageX || event.originalEvent.changedTouches[0].pageX;
181
+ $(event.target).trigger('iPhoneDrag', [x]);
182
+ })
183
+
184
+ // When the mouse comes up, leave drag state
185
+ .bind('mouseup touchend', function(event) {
186
+ if (!$[iphoneStyle].currentlyClicking) { return; }
187
+ event.preventDefault();
188
+
189
+ var x = event.pageX || event.originalEvent.changedTouches[0].pageX;
190
+ $($[iphoneStyle].currentlyClicking).trigger('iPhoneDragEnd', [x]);
191
+ });
192
+
193
+ $[iphoneStyle].initComplete = true;
194
+ }
195
+
196
+ return this;
197
+ }; // End of $.fn[iphoneStyle]
198
+
199
+ $[iphoneStyle].defaults = {
200
+ duration: 200, // Time spent during slide animation
201
+ checkedLabel: 'ON', // Text content of "on" state
202
+ uncheckedLabel: 'OFF', // Text content of "off" state
203
+ resizeHandle: true, // Automatically resize the handle to cover either label
204
+ resizeContainer: true, // Automatically resize the widget to contain the labels
205
+ disabledClass: 'iPhoneCheckDisabled',
206
+ containerClass: 'iPhoneCheckContainer',
207
+ labelOnClass: 'iPhoneCheckLabelOn',
208
+ labelOffClass: 'iPhoneCheckLabelOff',
209
+ handleClass: 'iPhoneCheckHandle',
210
+ handleCenterClass: 'iPhoneCheckHandleCenter',
211
+ handleRightClass: 'iPhoneCheckHandleRight'
212
+ };
213
+
214
+ })(jQuery, 'iphoneStyle');
@@ -0,0 +1,240 @@
1
+ /**
2
+ * @author Jason Roy for CompareNetworks Inc.
3
+ * Thanks to mikejbond for suggested udaptes
4
+ *
5
+ * Version 1.1
6
+ * Copyright (c) 2009 CompareNetworks Inc.
7
+ *
8
+ * Licensed under the MIT license:
9
+ * http://www.opensource.org/licenses/mit-license.php
10
+ *
11
+ */
12
+ (function($)
13
+ {
14
+
15
+ // Private variables
16
+
17
+ var _options = {};
18
+ var _container = {};
19
+ var _breadCrumbElements = {};
20
+ var _autoIntervalArray = [];
21
+ var _easingEquation;
22
+
23
+ // Public functions
24
+
25
+ jQuery.fn.jBreadCrumb = function(options)
26
+ {
27
+ _options = $.extend({}, $.fn.jBreadCrumb.defaults, options);
28
+
29
+ return this.each(function()
30
+ {
31
+ _container = $(this);
32
+ setupBreadCrumb();
33
+ });
34
+
35
+ };
36
+
37
+ // Private functions
38
+
39
+ function setupBreadCrumb()
40
+ {
41
+ //Check if easing plugin exists. If it doesn't, use "swing"
42
+ if(typeof(jQuery.easing) == 'object')
43
+ {
44
+ _easingEquation = 'easeOutQuad'
45
+ }
46
+ else
47
+ {
48
+ _easingEquation = 'swing'
49
+ }
50
+
51
+ //The reference object containing all of the breadcrumb elements
52
+ _breadCrumbElements = jQuery(_container).find('li');
53
+
54
+ //Keep it from overflowing in ie6 & 7
55
+ jQuery(_container).find('ul').wrap('<div style="overflow:hidden; position:relative; width: ' + jQuery(_container).css("width") + ';"><div>');
56
+ //Set an arbitrary width width to avoid float drop on the animation
57
+ jQuery(_container).find('ul').width(5000);
58
+
59
+ //If the breadcrumb contains nothing, don't do anything
60
+ if (_breadCrumbElements.length > 0)
61
+ {
62
+ jQuery(_breadCrumbElements[_breadCrumbElements.length - 1]).addClass('last');
63
+ jQuery(_breadCrumbElements[0]).addClass('first');
64
+
65
+ //If the breadcrumb object length is long enough, compress.
66
+
67
+ if (_breadCrumbElements.length > _options.minimumCompressionElements)
68
+ {
69
+ compressBreadCrumb();
70
+ };
71
+ };
72
+ };
73
+
74
+ function compressBreadCrumb()
75
+ {
76
+
77
+ // Factor to determine if we should compress the element at all
78
+ var finalElement = jQuery(_breadCrumbElements[_breadCrumbElements.length - 1]);
79
+
80
+
81
+ // If the final element is really long, compress more elements
82
+ if (jQuery(finalElement).width() > _options.maxFinalElementLength)
83
+ {
84
+ if (_options.beginingElementsToLeaveOpen > 0)
85
+ {
86
+ _options.beginingElementsToLeaveOpen--;
87
+
88
+ }
89
+ if (_options.endElementsToLeaveOpen > 0)
90
+ {
91
+ _options.endElementsToLeaveOpen--;
92
+ }
93
+ }
94
+ // If the final element is within the short and long range, compress to the default end elements and 1 less beginning elements
95
+ if (jQuery(finalElement).width() < _options.maxFinalElementLength && jQuery(finalElement).width() > _options.minFinalElementLength)
96
+ {
97
+ if (_options.beginingElementsToLeaveOpen > 0)
98
+ {
99
+ _options.beginingElementsToLeaveOpen--;
100
+
101
+ }
102
+ }
103
+
104
+ var itemsToRemove = _breadCrumbElements.length - 1 - _options.endElementsToLeaveOpen;
105
+
106
+ // We compress only elements determined by the formula setting below
107
+
108
+ //TODO : Make this smarter, it's only checking the final elements length. It could also check the amount of elements.
109
+ jQuery(_breadCrumbElements[_breadCrumbElements.length - 1]).css(
110
+ {
111
+ background: 'none'
112
+ });
113
+
114
+ $(_breadCrumbElements).each(function(i, listElement)
115
+ {
116
+ if (i > _options.beginingElementsToLeaveOpen && i < itemsToRemove)
117
+ {
118
+
119
+ jQuery(listElement).find('a').wrap('<span></span>').width(jQuery(listElement).find('a').width() + 10);
120
+
121
+ // Add the overlay png.
122
+ jQuery(listElement).append(jQuery('<div class="' + _options.overlayClass + '"></div>').css(
123
+ {
124
+ display: 'block'
125
+ })).css(
126
+ {
127
+ background: 'none'
128
+ });
129
+ if (isIE6OrLess())
130
+ {
131
+ fixPNG(jQuery(listElement).find('.' + _options.overlayClass).css(
132
+ {
133
+ width: '20px',
134
+ right: "-1px"
135
+ }));
136
+ }
137
+ var options =
138
+ {
139
+ id: i,
140
+ width: jQuery(listElement).width(),
141
+ listElement: jQuery(listElement).find('span'),
142
+ isAnimating: false,
143
+ element: jQuery(listElement).find('span')
144
+
145
+ };
146
+ jQuery(listElement).bind('mouseover', options, expandBreadCrumb).bind('mouseout', options, shrinkBreadCrumb);
147
+ jQuery(listElement).find('a').unbind('mouseover', expandBreadCrumb).unbind('mouseout', shrinkBreadCrumb);
148
+ listElement.autoInterval = setInterval(function()
149
+ {
150
+ clearInterval(listElement.autoInterval);
151
+ jQuery(listElement).find('span').animate(
152
+ {
153
+ width: _options.previewWidth
154
+ }, _options.timeInitialCollapse, _options.easing);
155
+ }, (150 * (i - 2)));
156
+
157
+ }
158
+ });
159
+
160
+ };
161
+
162
+ function expandBreadCrumb(e)
163
+ {
164
+ var elementID = e.data.id;
165
+ var originalWidth = e.data.width;
166
+ jQuery(e.data.element).stop();
167
+ jQuery(e.data.element).animate(
168
+ {
169
+ width: originalWidth
170
+ },
171
+ {
172
+ duration: _options.timeExpansionAnimation,
173
+ easing: _options.easing,
174
+ queue: false
175
+ });
176
+ return false;
177
+
178
+ };
179
+
180
+ function shrinkBreadCrumb(e)
181
+ {
182
+ var elementID = e.data.id;
183
+ jQuery(e.data.element).stop();
184
+ jQuery(e.data.element).animate(
185
+ {
186
+ width: _options.previewWidth
187
+ },
188
+ {
189
+ duration: _options.timeCompressionAnimation,
190
+ easing: _options.easing,
191
+ queue: false
192
+ });
193
+ return false;
194
+ };
195
+
196
+ function isIE6OrLess()
197
+ {
198
+ var isIE6 = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent);
199
+ return isIE6;
200
+ };
201
+ // Fix The Overlay for IE6
202
+ function fixPNG(element)
203
+ {
204
+ var image;
205
+ if (jQuery(element).is('img'))
206
+ {
207
+ image = jQuery(element).attr('src');
208
+ }
209
+ else
210
+ {
211
+ image = $(element).css('backgroundImage');
212
+ image.match(/^url\(["']?(.*\.png)["']?\)$/i);
213
+ image = RegExp.$1;
214
+ ;
215
+ }
216
+ $(element).css(
217
+ {
218
+ 'backgroundImage': 'none',
219
+ 'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=scale, src='" + image + "')"
220
+ });
221
+ };
222
+
223
+ // Public global variables
224
+
225
+ jQuery.fn.jBreadCrumb.defaults =
226
+ {
227
+ maxFinalElementLength: 400,
228
+ minFinalElementLength: 200,
229
+ minimumCompressionElements: 4,
230
+ endElementsToLeaveOpen: 1,
231
+ beginingElementsToLeaveOpen: 1,
232
+ timeExpansionAnimation: 800,
233
+ timeCompressionAnimation: 500,
234
+ timeInitialCollapse: 600,
235
+ easing: _easingEquation,
236
+ overlayClass: 'chevronOverlay',
237
+ previewWidth: 5
238
+ };
239
+
240
+ })(jQuery);