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,15 @@
1
+ /*
2
+ * jQuery Multiple Select Box Plugin 0.5.1
3
+ *
4
+ * http://plugins.jquery.com/project/jquerymultipleselectbox
5
+ * http://code.google.com/p/jquerymultipleselectbox/
6
+ *
7
+ * Apache License 2.0
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * @author dreamltf
11
+ * @date 2011/03/06
12
+ *
13
+ * Depends: jquery.js
14
+ */
15
+ (function(h){var e="MultipleSelectBox";var d="disabled";var c="selected";var g="selecting";var b={maxLimit:-1,valueRendererArray:null,isMouseEventEnabled:true,isKeyEventEnabled:true,onSelectStart:null,onSelectEnd:null,onSelectChange:null};h.extend(h.fn,{multipleSelectBox:function(i){i=h.extend({},b,i);return this.each(function(){var j=h(this);j.addClass(e).data("options",i);j.css("MozUserSelect","none").bind("selectstart",function(){return false;});j.destroyMultipleSelectBox().recalculateMultipleSelectBox();if(i.onSelectStart){j.bind("onSelectStart",i.onSelectStart);}if(i.onSelectEnd){j.bind("onSelectEnd",i.onSelectEnd);}if(i.onSelectChange){j.bind("onSelectChange",i.onSelectChange);}f(j,i);});},getMultipleSelectBoxCachedRows:function(i){return this.pushStack(h.map(this,function(j){var l=h(j);var k=l.data("rows");if(i||!k){k=l.children("li");l.data("rows",k);}return k.get();}));},getMultipleSelectBoxRowIndex:function(){return this.data("index");},getMultipleSelectBoxOptions:function(){return this.data("options");},drawMultipleSelectBox:function(m,j,l,i,k,n){return this.each(function(){var y=h(this);var x=y.getMultipleSelectBoxCachedRows();var z=y.getMultipleSelectBoxOptions();if(!l){y.recalculateMultipleSelectBox(true,true);}var p=y.data("info");var o=m>j;if(m<0||j<0||z.maxLimit==0||x.eq(m).hasClass(d)){return this;}var t=Math.min(m,j);var r=Math.max(m,j);var v=[];var s=[];var q=0;x.each(function(A){var C=h(this);C.removeClass(g);if(!C.hasClass(d)){var B=C.hasClass(c);if(t<=A&&A<=r){if(B){if(i){v.push(C);}else{q++;}}else{s.push(C);}}else{if(B){if(k){q++;}else{v.push(C);}}}}});var u=s.length;if(z.maxLimit>0&&(u+q)>z.maxLimit){return this;}x.eq(j).addClass(g);for(var w in v){v[w].removeClass(c);}for(var w in s){s[w].addClass(c);}if(!n){y.scrollTop(o?p.rowInfoArray[j].topPos:p.rowInfoArray[j].bottomPos-p.height);}p.lastStartIndex=m;p.lastCurrentIndex=j;return this;});},serializeMultipleSelectBoxArray:function(){var i=this.getMultipleSelectBoxOptions();return h.map(this.getMultipleSelectBoxCachedRows(),function(m,j){var l=h(m);var k=null;if(!l.hasClass(d)&&l.hasClass(c)&&(i.valueRendererArray==null||(k=i.valueRendererArray[j])==null)){k=l.text();}return k;});},yieldMultipleSelectBox:function(){h(document).unbind("mouseleave."+e+" mousemove."+e);return this.unbind("mouseenter mouseleave mouseover");},destroyMultipleSelectBox:function(){return this.yieldMultipleSelectBox().each(function(){var j=h(this);j.unbind("mousedown onSelectStart onSelectEnd onSelectChange");var i=j.data("rows");if(i){i.removeData("index");}j.removeData("info").removeData("rows");});},recalculateMultipleSelectBox:function(k,i,l,j){return this.each(function(){var q=h(this);var n=q.getMultipleSelectBoxCachedRows(j);var m=q.data("info");if(!m){k=true;i=true;l=true;m={};q.data("info",m);}if(i){var p=[];var o=-1;n.each(function(r){var t=h(this);var s=t.offset().top;if(r==0){o=s;}s-=o;t.data("index",r);p.push({topPos:s,bottomPos:s+t.outerHeight()});});m.rowInfoArray=p;}if(k){m.topPos=q.offset().top;m.bottomPos=m.topPos+q.outerHeight();m.height=q.innerHeight();m.scrollHeight=this.scrollHeight;}if(l){m.lastStartIndex=-1;m.lastCurrentIndex=-1;m.prevStartIndex=-1;m.prevCurrentIndex=-1;}});}});function a(){return h("ul."+e).yieldMultipleSelectBox().each(function(){var k=h(this);var j=k.getMultipleSelectBoxOptions();var i=k.data("info");if(k.hasClass(g)&&(j.onSelectEnd||j.onSelectChange)){var l=[k.serializeMultipleSelectBoxArray(),i.lastStartIndex,i.lastCurrentIndex,i.prevStartIndex,i.prevCurrentIndex];if(j.onSelectEnd){k.trigger("onSelectEnd",l);}if(j.onSelectChange&&(l[0]!=l[2]||l[1]!=l[3])){k.trigger("onSelectChange",l);}}k.removeClass(g);i.prevStartIndex=i.lastStartIndex;i.prevCurrentIndex=i.lastCurrentIndex;});}function f(l,j){var i=l.getMultipleSelectBoxCachedRows();var k=i.length;if(j.isMouseEventEnabled){l.bind("mousedown",function(r){var n=h(r.target);if(this==n[0]){return true;}else{if(this!=n.parent()[0]){n=n.parents("ul."+e+">li").eq(0);}}l.recalculateMultipleSelectBox(true,true);var p=l.data("info");var s=n.getMultipleSelectBoxRowIndex();var o=s;var m=false;var q=false;if(j.isKeyEventEnabled){if(r.shiftKey){s=p.lastStartIndex;}else{if(r.ctrlKey){m=true;q=true;}}}l.addClass(g);l.drawMultipleSelectBox(s,o,true,m,q,true);l.bind("mouseenter",function(){h(document).unbind("mousemove."+e);}).bind("mouseleave",function(){h(document).bind("mousemove."+e,function(w){var t=w.pageY;if(t<p.topPos){if(o>0){var v=p.rowInfoArray[o].topPos-(p.topPos-t);if(v>0){for(var u=o-1;u>=0;u--){if(v>=p.rowInfoArray[u].topPos){o=u;break;}}}else{o=0;}l.drawMultipleSelectBox(s,o,true,false,q);}}else{if(t>p.bottomPos){if(o<k-1){var v=p.rowInfoArray[o].bottomPos+(t-p.bottomPos);if(v<p.scrollHeight){for(var u=o+1;u<k;u++){if(v<p.rowInfoArray[u].bottomPos){o=u;break;}}}else{o=k-1;}l.drawMultipleSelectBox(s,o,true,false,q);}}}});}).bind("mouseover",function(u){var t=h(u.target);if(this==t.parent()[0]){o=t.getMultipleSelectBoxRowIndex();l.drawMultipleSelectBox(s,o,true,false,q,true);}});if(h.browser.msie){h(document).bind("mouseleave."+e,function(){h(this).one("mousemove."+e,function(t){if(!t.button){a();}});});}if(j.onSelectStart){l.trigger("onSelectStart",[s]);}return false;});}return l;}h(document).bind("mouseup."+e,function(){a();});})(jQuery);
@@ -0,0 +1,446 @@
1
+ /*!
2
+ * jQuery Multiple Select Box Plugin 0.5.1
3
+ *
4
+ * http://plugins.jquery.com/project/jquerymultipleselectbox
5
+ * http://code.google.com/p/jquerymultipleselectbox/
6
+ *
7
+ * Apache License 2.0
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * @author dreamltf
11
+ * @date 2011/03/06
12
+ *
13
+ * Depends: jquery.js
14
+ */
15
+ (function($) {
16
+ var PLUGIN_NAMESPACE = "MultipleSelectBox";
17
+ var PLUGIN_STYLE_DISABLED = "disabled";
18
+ var PLUGIN_STYLE_SELECTED = "selected";
19
+ var PLUGIN_STYLE_SELECTING = "selecting";
20
+ var defaultOptions = {
21
+ maxLimit : -1,
22
+ valueRendererArray : null,
23
+ isMouseEventEnabled : true,
24
+ isKeyEventEnabled : true,
25
+ /* callback function */
26
+ onSelectStart : null,
27
+ onSelectEnd : null,
28
+ onSelectChange : null
29
+ };
30
+
31
+ /**
32
+ * Public Method
33
+ */
34
+ $.extend($.fn, {
35
+ /**
36
+ * Public : MultipleSelectBox
37
+ *
38
+ * @param options
39
+ * Object
40
+ * @return jQuery
41
+ */
42
+ multipleSelectBox : function(options) {
43
+ options = $.extend({}, defaultOptions, options);
44
+ return this.each(function() {
45
+ var $container = $(this);
46
+ /* prepare */
47
+ $container.addClass(PLUGIN_NAMESPACE).data("options", options);
48
+ /* disable text select */
49
+ $container.css("MozUserSelect", "none").bind("selectstart", function() {
50
+ return false;
51
+ });
52
+ /* destroy and recalculate */
53
+ $container.destroyMultipleSelectBox().recalculateMultipleSelectBox();
54
+ /* callback function */
55
+ if (options.onSelectStart) {
56
+ $container.bind("onSelectStart", options.onSelectStart);
57
+ }
58
+ if (options.onSelectEnd) {
59
+ $container.bind("onSelectEnd", options.onSelectEnd);
60
+ }
61
+ if (options.onSelectChange) {
62
+ $container.bind("onSelectChange", options.onSelectChange);
63
+ }
64
+ /* initialize */
65
+ initializeMultipleSelectBox($container, options);
66
+ });
67
+ },
68
+
69
+ /**
70
+ * Public : Get Cached Rows
71
+ *
72
+ * @param isReNew
73
+ * boolean
74
+ * @return jQuery
75
+ */
76
+ getMultipleSelectBoxCachedRows : function(isReNew) {
77
+ return this.pushStack($.map(this, function(container) {
78
+ var $container = $(container);
79
+ var $rows = $container.data("rows");
80
+ if (isReNew || !$rows) {
81
+ /* cache rows if necessary */
82
+ $rows = $container.children("li");
83
+ $container.data("rows", $rows);
84
+ }
85
+ return $rows.get();
86
+ }));
87
+ },
88
+
89
+ /**
90
+ * Public : Get Row Index
91
+ *
92
+ * @return int
93
+ */
94
+ getMultipleSelectBoxRowIndex : function() {
95
+ return this.data("index");
96
+ },
97
+
98
+ /**
99
+ * Public : Get Options
100
+ *
101
+ * @return Object
102
+ */
103
+ getMultipleSelectBoxOptions : function() {
104
+ return this.data("options");
105
+ },
106
+
107
+ /**
108
+ * Public : Draw Range
109
+ *
110
+ * @param startIndex
111
+ * int
112
+ * @param currentIndex
113
+ * int
114
+ * @param isGetPositionByCache
115
+ * boolean
116
+ * @param isSelectionOpposite
117
+ * boolean
118
+ * @param isSelectionRetained
119
+ * boolean
120
+ * @param isScrollBarFrozen
121
+ * boolean
122
+ * @return jQuery
123
+ */
124
+ drawMultipleSelectBox : function(startIndex, currentIndex, isGetPositionByCache, isSelectionOpposite, isSelectionRetained, isScrollBarFrozen) {
125
+ return this.each(function() {
126
+ var $container = $(this);
127
+ var $rows = $container.getMultipleSelectBoxCachedRows();
128
+ var options = $container.getMultipleSelectBoxOptions();
129
+ /* recalculate position or not */
130
+ if (!isGetPositionByCache) {
131
+ $container.recalculateMultipleSelectBox(true, true);
132
+ }
133
+ var containerInfo = $container.data("info");
134
+ var isReversed = startIndex > currentIndex;
135
+ /* remove invalid or duplicated request */
136
+ if (startIndex < 0 || currentIndex < 0 || options.maxLimit == 0 || $rows.eq(startIndex).hasClass(PLUGIN_STYLE_DISABLED)) {
137
+ return this;
138
+ }
139
+ var minIndex = Math.min(startIndex, currentIndex);
140
+ var maxIndex = Math.max(startIndex, currentIndex);
141
+ /* prepare unselecting/selecting array */
142
+ var unselectingArray = [];
143
+ var selectingArray = [];
144
+ var selectedCount = 0;
145
+ $rows.each(function(index) {
146
+ var $childRow = $(this);
147
+ $childRow.removeClass(PLUGIN_STYLE_SELECTING);
148
+ if (!$childRow.hasClass(PLUGIN_STYLE_DISABLED)) {
149
+ var isRowSelected = $childRow.hasClass(PLUGIN_STYLE_SELECTED);
150
+ if (minIndex <= index && index <= maxIndex) {
151
+ if (isRowSelected) {
152
+ if (isSelectionOpposite) {
153
+ unselectingArray.push($childRow);
154
+ } else {
155
+ selectedCount++;
156
+ }
157
+ } else {
158
+ selectingArray.push($childRow);
159
+ }
160
+ } else {
161
+ if (isRowSelected) {
162
+ if (isSelectionRetained) {
163
+ selectedCount++;
164
+ } else {
165
+ unselectingArray.push($childRow);
166
+ }
167
+ }
168
+ }
169
+ }
170
+ });
171
+ var selectingSize = selectingArray.length;
172
+ /* calculate max limit */
173
+ if (options.maxLimit > 0 && (selectingSize + selectedCount) > options.maxLimit) {
174
+ return this;
175
+ }
176
+ /* reset all style if necessary */
177
+ $rows.eq(currentIndex).addClass(PLUGIN_STYLE_SELECTING);
178
+ for ( var key in unselectingArray) {
179
+ unselectingArray[key].removeClass(PLUGIN_STYLE_SELECTED);
180
+ }
181
+ for ( var key in selectingArray) {
182
+ selectingArray[key].addClass(PLUGIN_STYLE_SELECTED);
183
+ }
184
+ /* reset scroll bar */
185
+ if (!isScrollBarFrozen) {
186
+ $container.scrollTop(isReversed ? containerInfo.rowInfoArray[currentIndex].topPos : containerInfo.rowInfoArray[currentIndex].bottomPos - containerInfo.height);
187
+ }
188
+ /* reset history */
189
+ containerInfo.lastStartIndex = startIndex;
190
+ containerInfo.lastCurrentIndex = currentIndex;
191
+ return this;
192
+ });
193
+ },
194
+
195
+ /**
196
+ * Public : Serialize MultipleSelectBox Array
197
+ *
198
+ * @return Array
199
+ */
200
+ serializeMultipleSelectBoxArray : function() {
201
+ var options = this.getMultipleSelectBoxOptions();
202
+ return $.map(this.getMultipleSelectBoxCachedRows(), function(row, index) {
203
+ var $childRow = $(row);
204
+ var resultValue = null;
205
+ /* get text if necessary */
206
+ if (!$childRow.hasClass(PLUGIN_STYLE_DISABLED) && $childRow.hasClass(PLUGIN_STYLE_SELECTED) && (options.valueRendererArray == null || (resultValue = options.valueRendererArray[index]) == null)) {
207
+ resultValue = $childRow.text();
208
+ }
209
+ return resultValue;
210
+ });
211
+ },
212
+
213
+ /**
214
+ * Public : Yield MultipleSelectBox
215
+ *
216
+ * @return jQuery
217
+ */
218
+ yieldMultipleSelectBox : function() {
219
+ $(document).unbind("mouseleave." + PLUGIN_NAMESPACE + " mousemove." + PLUGIN_NAMESPACE);
220
+ return this.unbind("mouseenter mouseleave mouseover");
221
+ },
222
+
223
+ /**
224
+ * Public : Destroy MultipleSelectBox
225
+ *
226
+ * @return jQuery
227
+ */
228
+ destroyMultipleSelectBox : function() {
229
+ /* yield event handler */
230
+ return this.yieldMultipleSelectBox().each(function() {
231
+ var $container = $(this);
232
+ /* reset event handler */
233
+ $container.unbind("mousedown onSelectStart onSelectEnd onSelectChange");
234
+ /* clear cache */
235
+ var $rows = $container.data("rows");
236
+ if ($rows) {
237
+ $rows.removeData("index");
238
+ }
239
+ $container.removeData("info").removeData("rows");
240
+ });
241
+ },
242
+
243
+ /**
244
+ * Public : Recalculate MultipleSelectBox
245
+ *
246
+ * @param isResetContainerInfo
247
+ * boolean
248
+ * @param isResetRowsInfo
249
+ * boolean
250
+ * @param isResetHistory
251
+ * boolean
252
+ * @param isResetRowCache
253
+ * boolean
254
+ * @return jQuery
255
+ */
256
+ recalculateMultipleSelectBox : function(isResetContainerInfo, isResetRowsInfo, isResetHistory, isResetRowCache) {
257
+ return this.each(function() {
258
+ var $container = $(this);
259
+ var $rows = $container.getMultipleSelectBoxCachedRows(isResetRowCache);
260
+ var containerInfo = $container.data("info");
261
+ if (!containerInfo) {
262
+ isResetContainerInfo = true;
263
+ isResetRowsInfo = true;
264
+ isResetHistory = true;
265
+ containerInfo = {};
266
+ $container.data("info", containerInfo);
267
+ }
268
+ /* reset all row's position or data */
269
+ if (isResetRowsInfo) {
270
+ var rowInfoArray = [];
271
+ var firstTopPos = -1;
272
+ $rows.each(function(index) {
273
+ var $childRow = $(this);
274
+ var childRowTopPos = $childRow.offset().top;
275
+ if (index == 0) {
276
+ firstTopPos = childRowTopPos;
277
+ }
278
+ childRowTopPos -= firstTopPos;
279
+
280
+ $childRow.data("index", index);
281
+ rowInfoArray.push({
282
+ topPos : childRowTopPos,
283
+ bottomPos : childRowTopPos + $childRow.outerHeight()
284
+ });
285
+ });
286
+ containerInfo.rowInfoArray = rowInfoArray;
287
+ }
288
+ /* reset container's position or data */
289
+ if (isResetContainerInfo) {
290
+ containerInfo.topPos = $container.offset().top;
291
+ containerInfo.bottomPos = containerInfo.topPos + $container.outerHeight();
292
+ containerInfo.height = $container.innerHeight();
293
+ containerInfo.scrollHeight = this.scrollHeight;
294
+ }
295
+ /* reset history data */
296
+ if (isResetHistory) {
297
+ containerInfo.lastStartIndex = -1;
298
+ containerInfo.lastCurrentIndex = -1;
299
+ containerInfo.prevStartIndex = -1;
300
+ containerInfo.prevCurrentIndex = -1;
301
+ }
302
+ });
303
+ }
304
+ });
305
+
306
+ /**
307
+ * Private : Validate MultipleSelectBox
308
+ *
309
+ * @return jQuery
310
+ */
311
+ function validateMultipleSelectBox() {
312
+ /* yield event handler */
313
+ return $("ul." + PLUGIN_NAMESPACE).yieldMultipleSelectBox().each(function() {
314
+ var $container = $(this);
315
+ var options = $container.getMultipleSelectBoxOptions();
316
+ var containerInfo = $container.data("info");
317
+ /* trigger callback */
318
+ if ($container.hasClass(PLUGIN_STYLE_SELECTING) && (options.onSelectEnd || options.onSelectChange)) {
319
+ var extraParameters = [ $container.serializeMultipleSelectBoxArray(), containerInfo.lastStartIndex, containerInfo.lastCurrentIndex, containerInfo.prevStartIndex, containerInfo.prevCurrentIndex ];
320
+ if (options.onSelectEnd) {
321
+ $container.trigger("onSelectEnd", extraParameters);
322
+ }
323
+ if (options.onSelectChange && (extraParameters[0] != extraParameters[2] || extraParameters[1] != extraParameters[3])) {
324
+ $container.trigger("onSelectChange", extraParameters);
325
+ }
326
+ }
327
+ /* reset style */
328
+ $container.removeClass(PLUGIN_STYLE_SELECTING);
329
+ /* reset history */
330
+ containerInfo.prevStartIndex = containerInfo.lastStartIndex;
331
+ containerInfo.prevCurrentIndex = containerInfo.lastCurrentIndex;
332
+ });
333
+ }
334
+
335
+ /**
336
+ * Private : Initialize MultipleSelectBox
337
+ *
338
+ * @param $container
339
+ * jQuery
340
+ * @param options
341
+ * Object
342
+ * @return jQuery
343
+ */
344
+ function initializeMultipleSelectBox($container, options) {
345
+ var $rows = $container.getMultipleSelectBoxCachedRows();
346
+ var rowSize = $rows.length;
347
+ /* mouse event */
348
+ if (options.isMouseEventEnabled) {
349
+ $container.bind("mousedown", function(e) {
350
+ var $startRow = $(e.target);
351
+ if (this == $startRow[0]) {
352
+ return true;
353
+ } else if (this != $startRow.parent()[0]) {
354
+ $startRow = $startRow.parents("ul." + PLUGIN_NAMESPACE + ">li").eq(0);
355
+ }
356
+ /* recalculate container and all row's position */
357
+ $container.recalculateMultipleSelectBox(true, true);
358
+ var containerInfo = $container.data("info");
359
+ var startIndex = $startRow.getMultipleSelectBoxRowIndex();
360
+ var currentIndex = startIndex;
361
+ /* prepare info for drawing */
362
+ var isSelectionOpposite = false;
363
+ var isSelectionRetained = false;
364
+ if (options.isKeyEventEnabled) {
365
+ if (e.shiftKey) {
366
+ startIndex = containerInfo.lastStartIndex;
367
+ } else if (e.ctrlKey) {
368
+ isSelectionOpposite = true;
369
+ isSelectionRetained = true;
370
+ }
371
+ }
372
+ /* reset all style */
373
+ $container.addClass(PLUGIN_STYLE_SELECTING);
374
+ $container.drawMultipleSelectBox(startIndex, currentIndex, true, isSelectionOpposite, isSelectionRetained, true);
375
+ /* listening */
376
+ $container.bind("mouseenter", function() {
377
+ $(document).unbind("mousemove." + PLUGIN_NAMESPACE);
378
+ }).bind("mouseleave", function() {
379
+ $(document).bind("mousemove." + PLUGIN_NAMESPACE, function(e1) {
380
+ var mouseY = e1.pageY;
381
+ if (mouseY < containerInfo.topPos) {
382
+ if (currentIndex > 0) {
383
+ var targetPos = containerInfo.rowInfoArray[currentIndex].topPos - (containerInfo.topPos - mouseY);
384
+ if (targetPos > 0) {
385
+ for ( var i = currentIndex - 1; i >= 0; i--) {
386
+ if (targetPos >= containerInfo.rowInfoArray[i].topPos) {
387
+ currentIndex = i;
388
+ break;
389
+ }
390
+ }
391
+ } else {
392
+ currentIndex = 0;
393
+ }
394
+ $container.drawMultipleSelectBox(startIndex, currentIndex, true, false, isSelectionRetained);
395
+ }
396
+ } else if (mouseY > containerInfo.bottomPos) {
397
+ if (currentIndex < rowSize - 1) {
398
+ var targetPos = containerInfo.rowInfoArray[currentIndex].bottomPos + (mouseY - containerInfo.bottomPos);
399
+ if (targetPos < containerInfo.scrollHeight) {
400
+ for ( var i = currentIndex + 1; i < rowSize; i++) {
401
+ if (targetPos < containerInfo.rowInfoArray[i].bottomPos) {
402
+ currentIndex = i;
403
+ break;
404
+ }
405
+ }
406
+ } else {
407
+ currentIndex = rowSize - 1;
408
+ }
409
+ $container.drawMultipleSelectBox(startIndex, currentIndex, true, false, isSelectionRetained);
410
+ }
411
+ }
412
+ });
413
+ }).bind("mouseover", function(e1) {
414
+ var $childTarget = $(e1.target);
415
+ if (this == $childTarget.parent()[0]) {
416
+ currentIndex = $childTarget.getMultipleSelectBoxRowIndex();
417
+ $container.drawMultipleSelectBox(startIndex, currentIndex, true, false, isSelectionRetained, true);
418
+ }
419
+ });
420
+ /* IE hacked for mouse event */
421
+ if ($.browser.msie) {
422
+ $(document).bind("mouseleave." + PLUGIN_NAMESPACE, function() {
423
+ $(this).one("mousemove." + PLUGIN_NAMESPACE, function(e1) {
424
+ if (!e1.button) {
425
+ validateMultipleSelectBox();
426
+ }
427
+ });
428
+ });
429
+ }
430
+ /* trigger callback */
431
+ if (options.onSelectStart) {
432
+ $container.trigger("onSelectStart", [ startIndex ]);
433
+ }
434
+ return false;
435
+ });
436
+ }
437
+ return $container;
438
+ }
439
+
440
+ /**
441
+ * Event Control
442
+ */
443
+ $(document).bind("mouseup." + PLUGIN_NAMESPACE, function() {
444
+ validateMultipleSelectBox();
445
+ });
446
+ })(jQuery);