cytoplasm 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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);