cytoplasm 0.0.1

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 (181) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +38 -0
  4. data/app/assets/images/cytoplasm/triangle-medium-circle-1.png +0 -0
  5. data/app/assets/images/cytoplasm/triangle-medium-circle-2.png +0 -0
  6. data/app/assets/images/cytoplasm/triangle-medium-circle-3.png +0 -0
  7. data/app/assets/images/cytoplasm/triangle-medium-circle-4.png +0 -0
  8. data/app/assets/javascripts/cytoplasm/cytoAjax.js.erb +53 -0
  9. data/app/assets/javascripts/cytoplasm/cytoColorPicker.js.erb +204 -0
  10. data/app/assets/javascripts/cytoplasm/cytoRadio.js.erb +210 -0
  11. data/app/assets/javascripts/cytoplasm/cytoSelect.js.erb +414 -0
  12. data/app/assets/javascripts/cytoplasm/cytoSlider.js.erb +170 -0
  13. data/app/assets/javascripts/cytoplasm/cytoTable.js.erb +48 -0
  14. data/app/assets/javascripts/cytoplasm/cytoUpload.js.erb +200 -0
  15. data/app/assets/javascripts/cytoplasm/cytoplasm.js.erb +220 -0
  16. data/app/assets/javascripts/cytoplasm/jquery.ba-throttle-debounce.min.js +9 -0
  17. data/app/assets/javascripts/cytoplasm/jquery.color.js +663 -0
  18. data/app/assets/javascripts/cytoplasm/less-1.3.1.min.js +9 -0
  19. data/app/assets/stylesheets/cytoplasm/cytoplasm.less +113 -0
  20. data/app/controllers/cytoplasm/fonts_controller.rb +46 -0
  21. data/app/controllers/cytoplasm/settings_controller.rb +34 -0
  22. data/app/views/cytoplasm/settings/edit.html.erb +529 -0
  23. data/app/views/cytoplasm/settings/index.html.erb +18 -0
  24. data/config/routes.rb +6 -0
  25. data/lib/cytoplasm.rb +317 -0
  26. data/lib/cytoplasm/ajax.rb +34 -0
  27. data/lib/cytoplasm/railtie.rb +12 -0
  28. data/lib/cytoplasm/version.rb +3 -0
  29. data/lib/tasks/cytoplasm_tasks.rake +4 -0
  30. data/test/cytoplasm_test.rb +7 -0
  31. data/test/dummy/README.rdoc +261 -0
  32. data/test/dummy/Rakefile +7 -0
  33. data/test/dummy/app/assets/javascripts/about.js +2 -0
  34. data/test/dummy/app/assets/javascripts/application.js +15 -0
  35. data/test/dummy/app/assets/javascripts/demos.js +2 -0
  36. data/test/dummy/app/assets/javascripts/docs.js +2 -0
  37. data/test/dummy/app/assets/javascripts/downloads.js +2 -0
  38. data/test/dummy/app/assets/javascripts/home.js +2 -0
  39. data/test/dummy/app/assets/stylesheets/about.css +4 -0
  40. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  41. data/test/dummy/app/assets/stylesheets/demos.css +4 -0
  42. data/test/dummy/app/assets/stylesheets/docs.css +4 -0
  43. data/test/dummy/app/assets/stylesheets/downloads.css +4 -0
  44. data/test/dummy/app/assets/stylesheets/home.css +4 -0
  45. data/test/dummy/app/controllers/about_controller.rb +4 -0
  46. data/test/dummy/app/controllers/application_controller.rb +3 -0
  47. data/test/dummy/app/controllers/demos_controller.rb +4 -0
  48. data/test/dummy/app/controllers/docs_controller.rb +5 -0
  49. data/test/dummy/app/controllers/downloads_controller.rb +4 -0
  50. data/test/dummy/app/controllers/home_controller.rb +7 -0
  51. data/test/dummy/app/helpers/about_helper.rb +2 -0
  52. data/test/dummy/app/helpers/application_helper.rb +2 -0
  53. data/test/dummy/app/helpers/demos_helper.rb +2 -0
  54. data/test/dummy/app/helpers/docs_helper.rb +2 -0
  55. data/test/dummy/app/helpers/downloads_helper.rb +2 -0
  56. data/test/dummy/app/helpers/home_helper.rb +2 -0
  57. data/test/dummy/app/views/about/index.html.erb +2 -0
  58. data/test/dummy/app/views/demos/index.html.erb +15 -0
  59. data/test/dummy/app/views/docs/index.html.erb +15 -0
  60. data/test/dummy/app/views/downloads/index.html.erb +60 -0
  61. data/test/dummy/app/views/home/index.html.erb +74 -0
  62. data/test/dummy/app/views/layouts/application.html.erb +30 -0
  63. data/test/dummy/config.ru +4 -0
  64. data/test/dummy/config/application.rb +59 -0
  65. data/test/dummy/config/boot.rb +10 -0
  66. data/test/dummy/config/database.yml +25 -0
  67. data/test/dummy/config/environment.rb +5 -0
  68. data/test/dummy/config/environments/development.rb +37 -0
  69. data/test/dummy/config/environments/production.rb +67 -0
  70. data/test/dummy/config/environments/test.rb +37 -0
  71. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  72. data/test/dummy/config/initializers/cytoplasm.vars.yml +4 -0
  73. data/test/dummy/config/initializers/inflections.rb +15 -0
  74. data/test/dummy/config/initializers/mime_types.rb +5 -0
  75. data/test/dummy/config/initializers/secret_token.rb +7 -0
  76. data/test/dummy/config/initializers/session_store.rb +8 -0
  77. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  78. data/test/dummy/config/locales/en.yml +5 -0
  79. data/test/dummy/config/routes.rb +65 -0
  80. data/test/dummy/db/development.sqlite3 +0 -0
  81. data/test/dummy/db/test.sqlite3 +0 -0
  82. data/test/dummy/log/development.log +178434 -0
  83. data/test/dummy/log/production.log +4 -0
  84. data/test/dummy/log/test.log +43 -0
  85. data/test/dummy/public/404.html +26 -0
  86. data/test/dummy/public/422.html +26 -0
  87. data/test/dummy/public/500.html +25 -0
  88. data/test/dummy/public/cytoplasm/cytoplasm.vars.less +36 -0
  89. data/test/dummy/public/favicon.ico +0 -0
  90. data/test/dummy/script/rails +6 -0
  91. data/test/dummy/test/functional/about_controller_test.rb +9 -0
  92. data/test/dummy/test/functional/demos_controller_test.rb +9 -0
  93. data/test/dummy/test/functional/docs_controller_test.rb +7 -0
  94. data/test/dummy/test/functional/downloads_controller_test.rb +9 -0
  95. data/test/dummy/test/functional/home_controller_test.rb +9 -0
  96. data/test/dummy/test/unit/helpers/about_helper_test.rb +4 -0
  97. data/test/dummy/test/unit/helpers/demos_helper_test.rb +4 -0
  98. data/test/dummy/test/unit/helpers/docs_helper_test.rb +4 -0
  99. data/test/dummy/test/unit/helpers/downloads_helper_test.rb +4 -0
  100. data/test/dummy/test/unit/helpers/home_helper_test.rb +4 -0
  101. data/test/dummy/tmp/cache/assets/C23/A50/sprockets%2F1011830ce123d00a75be4330f2721412 +0 -0
  102. data/test/dummy/tmp/cache/assets/C2E/4E0/sprockets%2F5b29288e435665a224409e7d76530c95 +0 -0
  103. data/test/dummy/tmp/cache/assets/C75/590/sprockets%2Fc3abe8a0059292e1e3818278c0434027 +0 -0
  104. data/test/dummy/tmp/cache/assets/C77/C20/sprockets%2F165a39476f3fa731c0af49432141049c +0 -0
  105. data/test/dummy/tmp/cache/assets/C87/580/sprockets%2Fd904f7e82971fdde744127c702222195 +0 -0
  106. data/test/dummy/tmp/cache/assets/C8F/0F0/sprockets%2F369f11075c8c5f939359cb5cb0569281 +0 -0
  107. data/test/dummy/tmp/cache/assets/CA0/B40/sprockets%2F26961c657dc345435242accb433d260a +0 -0
  108. data/test/dummy/tmp/cache/assets/CA3/4B0/sprockets%2Fb78b7754bf248ba091802070be5c1630 +0 -0
  109. data/test/dummy/tmp/cache/assets/CA7/8F0/sprockets%2F901b96894219d63a767e8898f73d4ce7 +0 -0
  110. data/test/dummy/tmp/cache/assets/CAC/280/sprockets%2F408a235a236b0a3aa1302733211db5ba +0 -0
  111. data/test/dummy/tmp/cache/assets/CAE/FD0/sprockets%2F3bb22e4d409072c2278c1771893ec19e +0 -0
  112. data/test/dummy/tmp/cache/assets/CB2/AD0/sprockets%2F0c26131d87e0691ba9904e46ff5820b9 +0 -0
  113. data/test/dummy/tmp/cache/assets/CB8/330/sprockets%2F8d9120752c9f38f7a5e164395e5d0c04 +0 -0
  114. data/test/dummy/tmp/cache/assets/CBA/320/sprockets%2Fa34641007e856c6bd67567e2ac8668c4 +0 -0
  115. data/test/dummy/tmp/cache/assets/CCE/F60/sprockets%2F37d1a6c1a8d398c4404b1b00076912fd +0 -0
  116. data/test/dummy/tmp/cache/assets/CD7/990/sprockets%2F55411442048c5a69b45be06da29ee62c +0 -0
  117. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  118. data/test/dummy/tmp/cache/assets/CD8/900/sprockets%2Fc68606f026190266d8099ada290bbaa4 +0 -0
  119. data/test/dummy/tmp/cache/assets/CDF/870/sprockets%2Fb878faf942403e313a5b103e5d80488e +0 -0
  120. data/test/dummy/tmp/cache/assets/CE1/E60/sprockets%2F08ae5c39217fa93841884cfcb0037c46 +0 -0
  121. data/test/dummy/tmp/cache/assets/CE2/AE0/sprockets%2F79562f7c45761a5d0dba9361d11ae594 +0 -0
  122. data/test/dummy/tmp/cache/assets/CE3/080/sprockets%2F7d4d7689d6fa8236f0b4848c03ba1215 +0 -0
  123. data/test/dummy/tmp/cache/assets/CE4/530/sprockets%2F70521f5a32e550f6da0d76e896c7183e +0 -0
  124. data/test/dummy/tmp/cache/assets/CE5/D30/sprockets%2F8c9834a63b25a66203918a75ff56e2ac +0 -0
  125. data/test/dummy/tmp/cache/assets/CEE/7F0/sprockets%2F8b32778387c589166e26a7e5a6aa4cc3 +0 -0
  126. data/test/dummy/tmp/cache/assets/CF3/120/sprockets%2Fe2b304b015ce82a222d634e7e544b0b3 +0 -0
  127. data/test/dummy/tmp/cache/assets/CF7/ED0/sprockets%2F8061089f9dc8af8cc6353949d9b9d212 +0 -0
  128. data/test/dummy/tmp/cache/assets/CF9/7C0/sprockets%2F40fc2f3d2a468a00e463f1d313cb1683 +0 -0
  129. data/test/dummy/tmp/cache/assets/D03/6B0/sprockets%2Fd3cfc780201b87a3439e35c5236bb71a +0 -0
  130. data/test/dummy/tmp/cache/assets/D05/D40/sprockets%2F1c9faaf28d05409b88ad3113374d613c +0 -0
  131. data/test/dummy/tmp/cache/assets/D06/7A0/sprockets%2Fa46b76e739460d2691f4121ffa8a0ca0 +0 -0
  132. data/test/dummy/tmp/cache/assets/D0D/A10/sprockets%2F5c22f257a7abbc8e5720b17433657f6d +0 -0
  133. data/test/dummy/tmp/cache/assets/D0E/4A0/sprockets%2F6b27287928ba630c1b25dfa80ee18b48 +0 -0
  134. data/test/dummy/tmp/cache/assets/D0E/7D0/sprockets%2F89200785fe2710582a6c1b8d04ae7fbe +0 -0
  135. data/test/dummy/tmp/cache/assets/D12/010/sprockets%2F8067431ced3f34f1c97d34c3b4fb7049 +0 -0
  136. data/test/dummy/tmp/cache/assets/D12/1E0/sprockets%2Fba248329196c372b79d1f4c4f2a771bf +0 -0
  137. data/test/dummy/tmp/cache/assets/D14/170/sprockets%2F40a7b83bb067eea7ce2c8394e1529287 +0 -0
  138. data/test/dummy/tmp/cache/assets/D15/8E0/sprockets%2F4752afcb2967724e7e47b58b200d8ed2 +0 -0
  139. data/test/dummy/tmp/cache/assets/D15/CE0/sprockets%2Fa1310379a19df3c1796f2f67dcd5915d +0 -0
  140. data/test/dummy/tmp/cache/assets/D21/A50/sprockets%2Feb094bfe70c49891ce65c0178d88d904 +0 -0
  141. data/test/dummy/tmp/cache/assets/D2D/E60/sprockets%2F34ec37e4221a9a127bf1de1ee52951b0 +0 -0
  142. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  143. data/test/dummy/tmp/cache/assets/D47/930/sprockets%2F1a738430fd705a9dddde85a18dd29782 +0 -0
  144. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  145. data/test/dummy/tmp/cache/assets/D50/750/sprockets%2F7fbcc321810c8f493f86364fee480ed9 +0 -0
  146. data/test/dummy/tmp/cache/assets/D52/430/sprockets%2F6ada07f0c9869f9f35b05fa0988dc717 +0 -0
  147. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  148. data/test/dummy/tmp/cache/assets/D60/2A0/sprockets%2Ff1857b8a367fbae328221040cfcb2f1c +0 -0
  149. data/test/dummy/tmp/cache/assets/D65/180/sprockets%2F346621e7334bd914afc87bc6a9d1bc0a +0 -0
  150. data/test/dummy/tmp/cache/assets/D65/F10/sprockets%2F0a60d2fd5c544ea66af4d382b5e3d147 +0 -0
  151. data/test/dummy/tmp/cache/assets/D68/A20/sprockets%2F8b8272d3eaf9323f1c34114cbcbf56f3 +0 -0
  152. data/test/dummy/tmp/cache/assets/D69/0A0/sprockets%2Fe6c078d521b528e004f5dd673ddb2a6d +0 -0
  153. data/test/dummy/tmp/cache/assets/D69/0B0/sprockets%2Fb9e3ae8763ce66c2090d9413bdd400fa +0 -0
  154. data/test/dummy/tmp/cache/assets/D6E/3E0/sprockets%2F1be4cbdc9c19703c546405f087aee92d +0 -0
  155. data/test/dummy/tmp/cache/assets/D73/5F0/sprockets%2F6aee922214ffea56b31595f1a5ed8c92 +0 -0
  156. data/test/dummy/tmp/cache/assets/D78/840/sprockets%2F326ec6387a9d1b45ec2cdf7093b79f0e +0 -0
  157. data/test/dummy/tmp/cache/assets/D83/C70/sprockets%2Ff536f7a68e692747fca1d2fcd5c07f57 +0 -0
  158. data/test/dummy/tmp/cache/assets/D87/C40/sprockets%2F9dcd7a6999affe28e91e514cee079016 +0 -0
  159. data/test/dummy/tmp/cache/assets/D88/700/sprockets%2Fe13c6f31271a8ac23e63ef0a118ebe2b +0 -0
  160. data/test/dummy/tmp/cache/assets/D98/8B0/sprockets%2Fedbef6e0d0a4742346cf479f2c522eb0 +0 -0
  161. data/test/dummy/tmp/cache/assets/DA4/140/sprockets%2F24502b9d4e4eea6f709e089c0fdff30f +0 -0
  162. data/test/dummy/tmp/cache/assets/DBE/210/sprockets%2Fbedb89fd02eac0dc7aa93c820c612343 +0 -0
  163. data/test/dummy/tmp/cache/assets/DBE/950/sprockets%2F46cc27391a6badaac462d9b3aa43ec73 +0 -0
  164. data/test/dummy/tmp/cache/assets/DC7/E10/sprockets%2Fac6d2602a61a59c16ad89cbf2d2d48de +0 -0
  165. data/test/dummy/tmp/cache/assets/DC8/E80/sprockets%2F117e87cbd2939c4a9afcbbca2a3684d0 +0 -0
  166. data/test/dummy/tmp/cache/assets/DCD/AD0/sprockets%2Ffb914fa2e51ab43f0f857f0fddd8713b +0 -0
  167. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  168. data/test/dummy/tmp/cache/assets/DEB/B50/sprockets%2Fdcfb6dd7dae66f42a5a10e80a33d1b24 +0 -0
  169. data/test/dummy/tmp/cache/assets/DEC/A90/sprockets%2F3f26f0f2e3ea4a0e194b22be6c3b5cce +0 -0
  170. data/test/dummy/tmp/cache/assets/E00/880/sprockets%2Fecb876bb310c1a3e6fd534ece45c9ed9 +0 -0
  171. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  172. data/test/dummy/tmp/cache/assets/E05/E70/sprockets%2Fead5bfd3417fc5de81d3794c3e443cfe +0 -0
  173. data/test/dummy/tmp/cache/assets/E1A/970/sprockets%2Ff89b4657cfc95e2d28f6fad44c58edfb +0 -0
  174. data/test/dummy/tmp/cache/assets/E2E/720/sprockets%2Ff76ac8420ca62debb77ecbfe7d0c6d45 +0 -0
  175. data/test/dummy/tmp/cache/assets/E38/2A0/sprockets%2Fc6e8ba43cbed7d3981f70bcfeb3a69c9 +0 -0
  176. data/test/dummy/tmp/cache/assets/E69/B60/sprockets%2Ffdbf7ec615e9a92e4857cdade17f4daa +0 -0
  177. data/test/dummy/tmp/cache/assets/E71/0E0/sprockets%2Fcbbecea061be6e609adc04133b9badab +0 -0
  178. data/test/dummy/tmp/cache/assets/E8C/480/sprockets%2Fdacb331ac961cf7b7cbc69abe8fb74dd +0 -0
  179. data/test/dummy/tmp/cache/assets/E8D/B40/sprockets%2Fb862bf7fb4b4c634aeaa9dfc97babc6b +0 -0
  180. data/test/test_helper.rb +15 -0
  181. metadata +420 -0
@@ -0,0 +1,414 @@
1
+ // CytoSelect v3.0
2
+ // By MacKinley Smith
3
+ (function($){
4
+ var defaults = {
5
+ widget:{
6
+ arrowButton:{
7
+ css:{
8
+ width:24,
9
+ height:30,
10
+ margin:0,
11
+ padding:0,
12
+ position:'absolute',
13
+ top:0,
14
+ 'border-top-left-radius':0,
15
+ 'border-bottom-left-radius':0,
16
+ 'border-left':0
17
+ },
18
+ img:{
19
+ css:{
20
+ position:'relative',
21
+ top:-1,
22
+ left:-1
23
+ },
24
+ down:'/assets/cytoplasm/triangle-medium-circle-1.png',
25
+ up:'/assets/cytoplasm/triangle-medium-circle-2.png'
26
+ }
27
+ },
28
+ valueButton:{
29
+ css:{
30
+ 'text-align':'left',
31
+ padding:5,
32
+ margin:0,
33
+ height:30,
34
+ 'white-space':'nowrap',
35
+ overflow:'hidden',
36
+ 'border-top-right-radius':0,
37
+ 'border-bottom-right-radius':0
38
+ }
39
+ },
40
+ label:{
41
+ css:{
42
+ float:'left',
43
+ font:'12px/30px <%=Cytoplasm.vars("fonts.faces.light")%>',
44
+ margin:'0px 5px'
45
+ },
46
+ html:"Label: "
47
+ },
48
+ optionsList:{
49
+ animationSpeed:300,
50
+ css:{
51
+ display:'none',
52
+ 'list-style':'none',
53
+ 'margin-top':0,
54
+ padding:'0 2px 2px',
55
+ border:'1px solid #666',
56
+ 'border-bottom-left-radius':5,
57
+ 'border-bottom-right-radius':5,
58
+ background:'#777',
59
+ position:'absolute',
60
+ right:0,
61
+ 'z-index':1000,
62
+ 'box-shadow':'inset 0px 10px 10px -10px rgba(0,0,0,0.3), 0 10px 10px -10px rgba(0,0,0,0.5)'
63
+ },
64
+ li:{
65
+ css:{
66
+ display:'block',
67
+ height:20,
68
+ font:'12px/20px <%=Cytoplasm.vars("fonts.faces.light")%>',
69
+ color:'<%=Cytoplasm.vars("colors.global.text")%>',
70
+ margin:'2px 0 0',
71
+ padding:'0 5px',
72
+ border:'1px solid #888',
73
+ 'border-radius':5,
74
+ cursor:'pointer',
75
+ overflow:'hidden',
76
+ 'text-overflow':'ellipsis',
77
+ 'white-space':'nowrap',
78
+ 'box-shadow':'inset 0px 0px 5px rgba(0,0,0,0.5)'
79
+ },
80
+ hover:function(cy,e){
81
+ $(this).css({background:'<%=Cytoplasm.vars("colors.global.accent")%>'});
82
+ },
83
+ unhover:function(cy,e){
84
+ $(this).css({background:'transparent'});
85
+ }
86
+ },
87
+ maxHeight:400,
88
+ searchTime:1000
89
+ },
90
+ wrapper:{
91
+ css:{
92
+ display:'inline-block',
93
+ padding:0,
94
+ position:'relative'
95
+ }
96
+ },
97
+ width:'auto'
98
+ },
99
+ events:{
100
+ create:function(cy){},
101
+ change:function(cy,e){},
102
+ beforeResize:function(cy){},
103
+ resize:function(cy,e){},
104
+ destroy:function(cy){}
105
+ }
106
+ };
107
+
108
+ var methods = {
109
+ init:function(options,reinit){
110
+ if (reinit==null) reinit = false;
111
+ return this.each(function(){
112
+ var $this = $(this);
113
+ if ($this.data('cytoSelect')!=null) return console.warn("You cannot reinstatiate $.cytoSelect before calling the destroy method.\nProtip: Use the refresh method to reinstantiate in one move.");
114
+ if (!$this.hasClass('cytoSelect')) $this.addClass("cytoSelect");
115
+
116
+ // Initialize settings
117
+ var settings = $.extend(true,{},defaults,options);
118
+
119
+ // Choose default value
120
+ var selected = $this.find(":selected");
121
+ var label = settings.widget.label;
122
+ if (!label) label = ($this.data('label') != undefined) ? $this.data('label') : "";
123
+
124
+ // Generate widget
125
+ settings.widget.wrapper.element = $this.wrap('<div class="cytoSelect-wrapper"></div>').parent().css(settings.widget.wrapper.css);
126
+ var tabindex = ($this.data('tabindex') != null) ? $this.data('tabindex') : $this.attr('tabindex');
127
+ settings.widget.label.element = $('<span />').addClass('cytoSelect-label').html(label).css(settings.widget.label.css).appendTo(settings.widget.wrapper.element);
128
+ settings.widget.valueButton.element = $("<button />").addClass('cytoButton cytoSelect-valueButton').attr('tabindex',tabindex).html(selected.html()).css(settings.widget.valueButton.css).appendTo(settings.widget.wrapper.element);
129
+ settings.widget.arrowButton.element = $("<button />").addClass('cytoButton cytoSelect-arrowButton').attr('tabindex',-1).css(settings.widget.arrowButton.css).appendTo(settings.widget.wrapper.element);
130
+ settings.widget.arrowButton.img.element = $("<img />").addClass('cytoSelect-arrowButtonImage').attr('src',settings.widget.arrowButton.img.down).css(settings.widget.arrowButton.img.css).appendTo(settings.widget.arrowButton.element);
131
+ settings.widget.optionsList.element = $("<ul class='cytoSelect-optionsList' />").css(settings.widget.optionsList.css).appendTo(settings.widget.wrapper.element);
132
+ $.each($this.children('option'),function(){
133
+ var li = $("<li />").attr({title:$(this).html(),'data-value':$(this).val()}).html($(this).html()).css(settings.widget.optionsList.li.css).appendTo(settings.widget.optionsList.element);
134
+ if ($(this).val() == selected.val()) li.addClass('active');
135
+ });
136
+ settings.widget.optionsList.li.elements = settings.widget.optionsList.element.children('li');
137
+ if (!settings.widget.optionsList.li.elements.length) settings.widget.valueButton.element.html("<i>This cytoSelect has no options.</i>");
138
+ $this.data('tabindex',$this.attr('tabindex')).attr('tabindex',-1).hide();
139
+
140
+ // Cosmetic Fixes
141
+ //if (/chrome/.test(navigator.userAgent.toLowerCase())) settings.widget.arrowButton.element.css({top:-1});
142
+
143
+ $this.data('cytoSelect',settings);
144
+
145
+ // Bindings
146
+ settings.widget.valueButton.element.bind({
147
+ "click.cytoSelect":function(e){
148
+ e.preventDefault();
149
+ if (settings.widget.optionsList.element.is(':visible')) methods.hideMenu.apply($this)
150
+ else methods.showMenu.apply($this);
151
+ },
152
+ "keydown.cytoSelect":function(e){
153
+ if (settings.widget.optionsList.element.is(':visible') || (e.which != 38 && e.which != 40)) return true;
154
+ e.preventDefault();
155
+ var current = settings.widget.optionsList.element.find('li.active');
156
+ $this.val(((e.which == 38) ? ((!current.is(':first-child')) ? current.prev() : current.siblings(':last-child')) : ((!current.is(':last-child')) ? current.next() : current.siblings(':first-child'))).data('value')).trigger('change.cytoSelect');
157
+ }
158
+ });
159
+ settings.widget.arrowButton.element.bind("click.cytoSelect",function(e){
160
+ e.preventDefault();
161
+ if (settings.widget.optionsList.element.is(':visible')) methods.hideMenu.apply($this)
162
+ else methods.showMenu.apply($this);
163
+ });
164
+ $this.bind("change.cytoSelect",function(e){
165
+ settings.widget.optionsList.li.elements.filter('.active').removeClass('active');
166
+ var active = settings.widget.optionsList.li.elements.filter('[data-value="'+$(this).val()+'"]').addClass('active');
167
+ settings.widget.valueButton.element.html(active.html());
168
+ settings.events.change.apply($this,[settings,e]);
169
+ });
170
+ settings.widget.optionsList.element.bind({
171
+ 'mouseout.cytoSelect':function(e){$(this).find('.active').trigger('mouseover');}
172
+ });
173
+ settings.widget.optionsList.li.elements.bind({
174
+ 'click.cytoSelect':function(e){
175
+ e.preventDefault();
176
+ $(this).siblings('.active').removeClass('active').trigger("mouseout");
177
+ $(this).addClass('active');
178
+ methods.hideMenu.apply($this);
179
+ settings.events.change.apply($this,[settings,e]);
180
+ },
181
+ 'mouseover.cytoSelect':function(e){settings.widget.optionsList.li.hover.apply($(this),[settings,e]);},
182
+ 'mouseout.cytoSelect':function(e){settings.widget.optionsList.li.unhover.apply($(this),[settings,e]);}
183
+ });
184
+ if (settings.widget.optionsList.maxHeight <= settings.widget.optionsList.element.height()) settings.widget.optionsList.element.css({'overflow-y':'scroll',height:settings.widget.optionsList.maxHeight,'border-top':'none','border-right-color':'#bbb','border-bottom':'none'});
185
+
186
+ $this.data({'cytoSelect':settings,'cytoSelect-toggled':0});
187
+ methods.resize.apply($this);
188
+ settings.events.create.apply($this,[settings]);
189
+ });
190
+ },
191
+ hideMenu:function(){
192
+ return this.each(function(){
193
+ var $this = $(this).data('cytoSelect-toggled',0);
194
+ var settings = $this.data('cytoSelect');
195
+
196
+ var active = settings.widget.optionsList.element.find('.active');
197
+
198
+ $(document).unbind(".cytoSelect-menu");
199
+ $this.val(active.data('value'));
200
+
201
+ settings.widget.optionsList.element.hide("slide",{direction:'up'},settings.widget.optionsList.animationSpeed,function(){
202
+ settings.widget.valueButton.element.html(active.html()).css({'border-bottom-left-radius':3,'box-shadow':'none'});
203
+ settings.widget.arrowButton.element.css('border-bottom-right-radius',3);
204
+ settings.widget.arrowButton.img.element.attr('src',settings.widget.arrowButton.img.down);
205
+ });
206
+ });
207
+ },
208
+ showMenu:function(){
209
+ return this.each(function(){
210
+ var $this = $(this).data('cytoSelect-toggled',1);
211
+ var settings = $this.data('cytoSelect');
212
+
213
+ var active = settings.widget.optionsList.element.find('.active');
214
+
215
+ // Skip if there aren't any list elements to show
216
+ if (!settings.widget.optionsList.li.elements.length) return false;
217
+
218
+ // Cosmetic changes
219
+ settings.widget.valueButton.element.css({'border-bottom-left-radius':0,'box-shadow':'inset 0px 0px 5px black'});
220
+ settings.widget.arrowButton.element.css('border-bottom-right-radius',0);
221
+ settings.widget.arrowButton.img.element.attr('src',settings.widget.arrowButton.img.up);
222
+
223
+ settings.widget.optionsList.element.show("slide",{direction:'up'},settings.widget.optionsList.animationSpeed,function(){
224
+ // Fix hovering states
225
+ settings.widget.optionsList.element.find('li:not(.active):hover').trigger('mouseout');
226
+ active.trigger("mouseover");
227
+
228
+ // Reset height of optionsList to fit elements
229
+ settings.widget.optionsList.element.height('auto');
230
+ // Size it down if its larger than the maxHeight settings
231
+ if (settings.widget.optionsList.element.height()>settings.widget.optionsList.maxHeight) settings.widget.optionsList.element.height(settings.widget.optionsList.maxHeight);
232
+ // If the optionsList is going offscreen, taper it to the edge of the page - 10 pixels
233
+ var windowBottom = $(window).scrollTop()+$(window).height();
234
+ var optionsBottom = settings.widget.optionsList.element.offset().top+settings.widget.optionsList.element.height();
235
+ if (optionsBottom > windowBottom) {
236
+ if (settings.widget.optionsList.element.css('overflow-y')!="scroll") settings.widget.optionsList.element.css({'overflow-y':'scroll','border-top':'none','border-right-color':'#bbb','border-bottom':'none'});
237
+ settings.widget.optionsList.element.height(windowBottom-settings.widget.optionsList.element.offset().top-10);
238
+ }
239
+
240
+ // Scroll optionsList to active li
241
+ var scrollTop = active.offset().top - settings.widget.optionsList.element.offset().top + settings.widget.optionsList.element.scrollTop();
242
+ var new_y = scrollTop - (settings.widget.optionsList.element.height()/2);
243
+ settings.widget.optionsList.element.scrollTop(new_y);
244
+
245
+ // Globalized bindings
246
+ $(document).bind({
247
+ "click.cytoSelect-menu":function(){methods.hideMenu.apply($this);},
248
+ "keydown.cytoSelect-menu":function(e){
249
+ if (e.which == 9) {
250
+ methods.hideMenu.apply($this);
251
+ return true;
252
+ }
253
+ if (e.ctrlKey || e.metaKey) return true;
254
+ e.preventDefault();
255
+ var active = settings.widget.optionsList.element.find('li.active');
256
+ if (e.which == 38) var target = (settings.widget.optionsList.li.elements.length == 1) ? settings.widget.optionsList.li.elements : ((active.prev().is('*')) ? active.prev() : active.siblings(':last-child'));
257
+ else if (e.which == 40) var target = (settings.widget.optionsList.li.elements.length == 1) ? settings.widget.optionsList.li.elements : ((active.next().is('*')) ? active.next() : active.siblings(':first-child'));
258
+ else {
259
+ // Search menu
260
+ var s = String.fromCharCode(e.which);
261
+ if (s.match(/\w/)) {
262
+ $.each(settings.widget.optionsList.li.elements,function(){
263
+ if (s == $(this).html().substr(0,1)) {
264
+ target = $(this);
265
+ return false;
266
+ }
267
+ });
268
+ } else target = active;
269
+ }
270
+ active.removeClass('active').trigger("mouseout");
271
+ target.addClass('active').trigger("mouseover");
272
+ settings.widget.valueButton.element.html(target.html());
273
+
274
+ // Handle Scrolling
275
+ var activeTop = active.offset().top - settings.widget.optionsList.element.offset().top + settings.widget.optionsList.element.scrollTop();
276
+ var activeBottom = activeTop+settings.widget.optionsList.element.height()-active.height();
277
+ var targetPos = target.offset().top - settings.widget.optionsList.element.offset().top + settings.widget.optionsList.element.scrollTop() + (settings.widget.optionsList.element.height()/2);
278
+ var new_y = targetPos - settings.widget.optionsList.element.height();
279
+ if (targetPos >= activeTop && targetPos <= activeBottom) settings.widget.optionsList.element.scrollTop(new_y);
280
+ else settings.widget.optionsList.element.animate({scrollTop:new_y},settings.widget.optionsList.animationSpeed);
281
+
282
+ // Enter key
283
+ if (e.which == 13) {
284
+ methods.hideMenu.apply($this);
285
+ settings.events.change.apply($this,[settings,e]);
286
+ }
287
+ return false;
288
+ }
289
+ });
290
+ });
291
+ });
292
+ },
293
+ destroy:function(){
294
+ return this.each(function(){
295
+ var $this = $(this);
296
+ var settings = $this.data('cytoSelect');
297
+ if (!$this.hasClass('cytoSelect') || settings==null) return console.warn("You must instanciate $.cytoSelect before calling the destroy method!");
298
+
299
+ $this.insertBefore(settings.widget.wrapper.element);
300
+ settings.widget.wrapper.element.remove();
301
+ $this.unbind('.cytoSelect').removeClass('cytoSelect').data('cytoSelect',null).data('cytoSelect-toggled',null).show();
302
+ settings.events.destroy.apply($this,[settings]);
303
+ });
304
+ },
305
+ refresh:function(){
306
+ return this.each(function(){
307
+ var $this = $(this);
308
+ var settings = $this.data('cytoSelect');
309
+ if (!$this.hasClass('cytoSelect') || settings==null) return console.warn("You must instanciate $.cytoSelect before calling the refresh method!");
310
+
311
+ methods.destroy.apply($this);
312
+ methods.init.apply($this,[settings,true]);
313
+ $this.trigger("change.cytoSelect");
314
+ });
315
+ },
316
+ resize:function(){
317
+ return this.each(function(){
318
+ var $this = $(this);
319
+ var settings = $this.data('cytoSelect');
320
+ if (!$this.hasClass('cytoSelect') || settings==null) return console.warn("You must instanciate $.cytoSelect before calling the resize method!");
321
+
322
+ var w = settings.widget.wrapper.element.css({opacity:0});
323
+ var vb = settings.widget.valueButton.element.width(0);
324
+ setTimeout(function(){
325
+ settings.events.beforeResize.apply($this,[settings]);
326
+ var parent = w.parent();
327
+ var desiredWidth = (settings.widget.width=="auto") ? parent.innerWidth() : settings.widget.width;
328
+ desiredWidth -= (parseInt(parent.css("padding-left")) + parseInt(parent.css("padding-right")));
329
+ w.width(desiredWidth);
330
+ vb.width(desiredWidth - settings.widget.arrowButton.element.outerWidth(true) - 12);
331
+ settings.widget.optionsList.element.width(desiredWidth-6).css({left:vb.position().left});
332
+ w.css({opacity:1});
333
+ settings.events.resize.apply($this,[settings]);
334
+ },1);
335
+ });
336
+ },
337
+ add:function(data){
338
+ if (typeof data == "string") try {data = $.parseJSON(data);} catch (e) {return console.warn(e);}
339
+ if (typeof data != "object") return console.warn("$.cytoSelect's add method accepts only an object or JSON string in the format of {value:html} for the first argument.");
340
+ return this.each(function(){
341
+ var $this = $(this);
342
+ var settings = $this.data('cytoSelect');
343
+ if (!$this.hasClass('cytoSelect') || settings==null) return console.warn("You must instanciate $.cytoSelect before calling the add method!");
344
+
345
+ $.each(data,function(value,html){$this.append($("<option />").val(value).attr('title',html).html(html));});
346
+ methods.refresh.apply($this);
347
+ });
348
+ },
349
+ update:function(data){
350
+ if (typeof data == "string") try {data = $.parseJSON(data);} catch (e) {return console.warn(e);}
351
+ if (typeof data != "object") return console.warn("$.cytoSelect's update method accepts only an object or JSON string in the format of {value:html} for the first argument.");
352
+ return this.each(function(){
353
+ var $this = $(this);
354
+ var settings = $this.data('cytoSelect');
355
+ if (!$this.hasClass('cytoSelect') || settings==null) return console.warn("You must instanciate $.cytoSelect before calling the update method!");
356
+
357
+ methods.clear.apply($this,[false]);
358
+ methods.add.apply($this,[data]);
359
+ });
360
+ },
361
+ clear:function(refresh){
362
+ if (refresh==null) refresh = true;
363
+ return this.each(function(){
364
+ var $this = $(this);
365
+ var settings = $this.data('cytoSelect');
366
+ if (!$this.hasClass('cytoSelect') || settings==null) return console.warn("You must instanciate $.cytoSelect before calling the clear method!");
367
+
368
+ $this.children('option').not("[value=''],[value='0']").remove();
369
+ if (refresh) methods.refresh.apply($this);
370
+ });
371
+ },
372
+ value:function(set){
373
+ if (set==null || set==undefined) set = false;
374
+ var value;
375
+ this.each(function(){
376
+ var $this = $(this);
377
+ var settings = $this.data('cytoSelect');
378
+ if (!$this.hasClass('cytoSelect') || settings==null) return console.warn("You must instantiate $.cytoSelect before you call the value method!");
379
+
380
+ if (set===false) value = $this.val();
381
+ else $this.val(set).trigger('change.cytoSelect');
382
+ });
383
+ return (value!=null) ? value : this;
384
+ },
385
+ options:function(newOptions){
386
+ if (newOptions!=null) {
387
+ return this.each(function(){
388
+ var $this = $(this);
389
+ var settings = $this.data('cytoSelect');
390
+ if (!$this.hasClass("cytoSelect") || settings==null) return console.warn("You must instanciate $.cytoSelect before you call the options method!");
391
+ $this.data('cytoSelect',$.extend(true,{},settings,newOptions));
392
+ methods.refresh.apply($this);
393
+ });
394
+ } else {
395
+ var returnVal;
396
+ this.each(function(){
397
+ var $this = $(this);
398
+ var settings = $this.data('cytoSelect');
399
+ if (!$this.hasClass("cytoSelect") || settings==null) return console.warn("You must instanciate $.cytoSelect before you call the options method!");
400
+ returnVal = settings;
401
+ });
402
+ return returnVal;
403
+ }
404
+ }
405
+ };
406
+ $.fn.cytoSelect=function(method){
407
+ if (methods[method]) return methods[method].apply(this,Array.prototype.slice.call(arguments,1));
408
+ else if (typeof method == 'object' || !method) return methods.init.apply(this,arguments);
409
+ else $.error('Method ' + method + ' does not exist on jQuery.cytoSelect!');
410
+ };
411
+
412
+ $(window).resize(function(){$('select.cytoSelect').cytoSelect("resize");});
413
+ $.Cytoplasm("ready",function(){$('select.cytoSelect').cytoSelect();});
414
+ })(jQuery);
@@ -0,0 +1,170 @@
1
+ // CytoSlider v0.5
2
+ // By MacKinley Smith
3
+ (function($){
4
+ var defaults = {
5
+ widget:{
6
+ label:{
7
+ css:{
8
+ font:'<%=Cytoplasm.vars("fonts.sizes.small")+" "+Cytoplasm.vars("fonts.faces.light")%>'
9
+ },
10
+ html:"",
11
+ readout:{
12
+ css:{},
13
+ unit:false
14
+ }
15
+ },
16
+ slider:{
17
+ css:{},
18
+ options:{
19
+ min:0,
20
+ max:100,
21
+ value:0,
22
+ slide:function(e,ui){},
23
+ change:function(e,ui){}
24
+ }
25
+ },
26
+ wrapper:{
27
+ css:{
28
+ padding:"5px 0px"
29
+ }
30
+ }
31
+ },
32
+ events:{
33
+ create:function(cy){},
34
+ change:function(cy,event){},
35
+ destroy:function(cy){}
36
+ }
37
+ };
38
+ var methods = {
39
+ init:function(options,reinit){
40
+ if (reinit==null) reinit = false;
41
+ return this.each(function(){
42
+ var $this = $(this);
43
+ if ($this.data('cytoSlider')!=null) return console.warn("You cannot reinstatiate cytoSlider before calling the destroy method.\nProtip: Use the refresh method to reinstantiate in one move.");
44
+ if (!$this.hasClass('cytoSlider')) $this.addClass("cytoSlider");
45
+
46
+ // Initialize settings
47
+ var settings;
48
+ if (!reinit) {
49
+ settings = $.extend(true,{},defaults,options);
50
+ if ($this.data('settings')!=null) settings = $.extend(true,{},settings,$this.data('settings'));
51
+ if ($this.data('label')!=null) settings.widget.label.html = $this.data('label');
52
+ if ($this.data('unit')!=null) settings.widget.label.readout.unit = $this.data('unit');
53
+ if ($this.data('min')!=null) settings.widget.slider.options.min = $this.data('min');
54
+ if ($this.data('max')!=null) settings.widget.slider.options.max = $this.data('max');
55
+ if ($this.val()!=null && $this.val()!="") settings.widget.slider.options.value = parseInt($this.val());
56
+ } else settings = options;
57
+
58
+ // Generate widget
59
+ settings.widget.wrapper.element = $this.wrap("<div></div>").parent().addClass('cytoSlider-wrapper').css(settings.widget.wrapper.css);
60
+ settings.widget.label.element = $('<label />').attr("for",$this.attr("name")).addClass('cytoSlider-label').css(settings.widget.label.css).html(settings.widget.label.html+": ").prependTo(settings.widget.wrapper.element);
61
+ settings.widget.label.readout.element = $('<span />').addClass("cytoSlider-label-readout").css(settings.widget.label.readout.css).appendTo(settings.widget.label.element);
62
+ settings.widget.slider.element = $('<div />').addClass('cytoSlider-slider').css(settings.widget.slider.css).appendTo(settings.widget.wrapper.element);
63
+
64
+ // Bindings
65
+ $this.bind("change.cytoSlider",function(e){
66
+ settings.widget.label.readout.element.html($(this).val());
67
+ settings.events.change.apply($this,[settings,e]);
68
+ });
69
+
70
+ // Set up slider
71
+ $.each(["slide","change"],function(i,v){
72
+ var orig = settings.widget.slider.options[v];
73
+ settings.widget.slider.options[v] = function(e,ui){
74
+ $this.val($(this).slider("value")+settings.widget.label.readout.unit);
75
+ orig.apply(this,arguments);
76
+ $this.trigger("change.cytoSlider");
77
+ };
78
+ });
79
+ settings.widget.slider.element.slider(settings.widget.slider.options).slider("value",settings.widget.slider.options.value);
80
+
81
+ // Save settings data to input
82
+ $this.data('cytoSlider',settings);
83
+ methods.resize.apply($this);
84
+ settings.events.create.apply($this,[settings]);
85
+ });
86
+ },
87
+ destroy:function(){
88
+ return this.each(function(){
89
+ var $this = $(this);
90
+ var settings = $this.data('cytoSlider');
91
+ if (!$this.hasClass("cytoSlider") || settings==null) return console.warn("You must instanciate $.cytoSlider before you call the destroy method!");
92
+
93
+ // Destroy widget
94
+ $this.unbind(".cytoSlider").removeClass("cytoSlider").data("cytoSlider",null).insertBefore(settings.widget.wrapper.element);
95
+ settings.widget.wrapper.element.remove();
96
+
97
+ settings.events.destroy.apply($this,[settings]);
98
+ });
99
+ },
100
+ refresh:function(){
101
+ return this.each(function(){
102
+ var $this = $(this);
103
+ var settings = $this.data('cytoSlider');
104
+ if (!$this.hasClass("cytoSlider") || settings==null) return console.warn("You must instanciate $.cytoSlider before you call the refresh method!");
105
+
106
+ // Destroy and reinit
107
+ methods.destroy.apply($this);
108
+ methods.init.apply($this,[settings,true]);
109
+ $this.trigger('change.cytoSlider');
110
+ });
111
+ },
112
+ resize:function(){
113
+ return this.each(function(){
114
+ var $this = $(this);
115
+ var settings = $this.data('cytoSlider');
116
+ if (!$this.hasClass("cytoSlider") || settings==null) return console.warn("You must instanciate $.cytoSlider before you call the resize method!");
117
+
118
+ settings.widget.wrapper.element.width(0);
119
+ setTimeout(function(){
120
+ settings.widget.wrapper.element.width("auto");
121
+ },1);
122
+ });
123
+ },
124
+ value:function(set){
125
+ if (set==null || set==undefined) set = false;
126
+ var value;
127
+ this.each(function(){
128
+ var $this = $(this);
129
+ var settings = $this.data('cytoSlider');
130
+ if (!$this.hasClass('cytoSlider') || settings==null) return console.warn("You must instantiate $.cytoSlider before you call the value method!");
131
+
132
+ if (set===false) value = $this.val();
133
+ else {
134
+ settings.widget.slider.element.slider("value",set);
135
+ $this.trigger('change.cytoSlider');
136
+ }
137
+ });
138
+ return (value!=null) ? value : this;
139
+ },
140
+ options:function(newOptions){
141
+ if (newOptions!=null) {
142
+ return this.each(function(){
143
+ var $this = $(this);
144
+ var settings = $this.data('cytoSlider');
145
+ if (!$this.hasClass("cytoSlider") || settings==null) return console.warn("You must instanciate $.cytoSlider before you call the options method!");
146
+ $this.data('cytoSlider',$.extend(true,{},settings,newOptions));
147
+ methods.refresh.apply($this);
148
+ });
149
+ } else {
150
+ var returnVal;
151
+ this.each(function(){
152
+ var $this = $(this);
153
+ var settings = $this.data('cytoSlider');
154
+ if (!$this.hasClass("cytoSlider") || settings==null) return console.warn("You must instanciate $.cytoSlider before you call the options method!");
155
+ returnVal = settings;
156
+ });
157
+ return returnVal;
158
+ }
159
+ }
160
+ };
161
+
162
+ $.fn.cytoSlider=function(method){
163
+ if (methods[method]) return methods[method].apply(this,Array.prototype.slice.call(arguments,1));
164
+ else if (typeof method == 'object' || !method) return methods.init.apply(this,arguments);
165
+ else $.error('Method ' + method + ' does not exist on $.cytoSlider!');
166
+ };
167
+
168
+ $(window).resize(function(){$('.cytoSlider').cytoSlider('resize');});
169
+ $.Cytoplasm("ready",function(){$('.cytoSlider').cytoSlider();});
170
+ })(jQuery);