muruca_widgets 0.1.0

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 (160) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +12 -0
  3. data/generators/colorbox/colorbox_generator.rb +21 -0
  4. data/generators/colorbox/templates/README +10 -0
  5. data/generators/colorbox/templates/_colorbox.html.erb +10 -0
  6. data/generators/colorbox/templates/colorbox/colorbox.css +62 -0
  7. data/generators/colorbox/templates/colorbox/images/border.png +0 -0
  8. data/generators/colorbox/templates/colorbox/images/controls.png +0 -0
  9. data/generators/colorbox/templates/colorbox/images/internet_explorer/borderBottomCenter.png +0 -0
  10. data/generators/colorbox/templates/colorbox/images/internet_explorer/borderBottomLeft.png +0 -0
  11. data/generators/colorbox/templates/colorbox/images/internet_explorer/borderBottomRight.png +0 -0
  12. data/generators/colorbox/templates/colorbox/images/internet_explorer/borderMiddleLeft.png +0 -0
  13. data/generators/colorbox/templates/colorbox/images/internet_explorer/borderMiddleRight.png +0 -0
  14. data/generators/colorbox/templates/colorbox/images/internet_explorer/borderTopCenter.png +0 -0
  15. data/generators/colorbox/templates/colorbox/images/internet_explorer/borderTopLeft.png +0 -0
  16. data/generators/colorbox/templates/colorbox/images/internet_explorer/borderTopRight.png +0 -0
  17. data/generators/colorbox/templates/colorbox/images/loading.gif +0 -0
  18. data/generators/colorbox/templates/colorbox/images/loading_background.png +0 -0
  19. data/generators/colorbox/templates/colorbox/images/overlay.png +0 -0
  20. data/generators/colorbox/templates/jquery-1.3.2.min.js +19 -0
  21. data/generators/colorbox/templates/jquery.colorbox.js +698 -0
  22. data/generators/generator_helpers.rb +17 -0
  23. data/generators/iip_viewer/iip_viewer_generator.rb +18 -0
  24. data/generators/iip_viewer/templates/README +8 -0
  25. data/generators/iip_viewer/templates/_iip_flash_viewer.html.erb +14 -0
  26. data/generators/iip_viewer/templates/fliipish.swf +0 -0
  27. data/generators/iip_viewer/templates/iip_flashclient.js +24 -0
  28. data/generators/iip_viewer/templates/iip_helper.rb +24 -0
  29. data/generators/iip_viewer/templates/swfobject.js +8 -0
  30. data/generators/ipod_dropdown/ipod_dropdown_generator.rb +24 -0
  31. data/generators/ipod_dropdown/templates/README +8 -0
  32. data/generators/ipod_dropdown/templates/_ipod_dropdown.html.erb +25 -0
  33. data/generators/ipod_dropdown/templates/fg.menu.js +645 -0
  34. data/generators/ipod_dropdown/templates/ipod-menu/fg.menu.css +129 -0
  35. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  36. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-bg_flat_55_fbec88_40x100.png +0 -0
  37. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
  38. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-bg_glass_85_dfeffc_1x400.png +0 -0
  39. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  40. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
  41. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
  42. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
  43. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-icons_217bc0_256x240.png +0 -0
  44. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-icons_2e83ff_256x240.png +0 -0
  45. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-icons_469bdd_256x240.png +0 -0
  46. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-icons_6da8d5_256x240.png +0 -0
  47. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-icons_cd0a0a_256x240.png +0 -0
  48. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-icons_d8e7f3_256x240.png +0 -0
  49. data/generators/ipod_dropdown/templates/ipod-menu/theme/images/ui-icons_f9bd01_256x240.png +0 -0
  50. data/generators/ipod_dropdown/templates/ipod-menu/theme/ui.accordion.css +9 -0
  51. data/generators/ipod_dropdown/templates/ipod-menu/theme/ui.all.css +2 -0
  52. data/generators/ipod_dropdown/templates/ipod-menu/theme/ui.base.css +1 -0
  53. data/generators/ipod_dropdown/templates/ipod-menu/theme/ui.core.css +37 -0
  54. data/generators/ipod_dropdown/templates/ipod-menu/theme/ui.datepicker.css +62 -0
  55. data/generators/ipod_dropdown/templates/ipod-menu/theme/ui.dialog.css +13 -0
  56. data/generators/ipod_dropdown/templates/ipod-menu/theme/ui.progressbar.css +4 -0
  57. data/generators/ipod_dropdown/templates/ipod-menu/theme/ui.resizable.css +13 -0
  58. data/generators/ipod_dropdown/templates/ipod-menu/theme/ui.slider.css +17 -0
  59. data/generators/ipod_dropdown/templates/ipod-menu/theme/ui.tabs.css +11 -0
  60. data/generators/ipod_dropdown/templates/ipod-menu/theme/ui.theme.css +247 -0
  61. data/generators/ipod_dropdown/templates/ipod_dropdown_helper.rb +52 -0
  62. data/generators/ipod_dropdown/templates/jquery-1.3.2.min.js +19 -0
  63. data/generators/simile_timeline/simile_timeline_generator.rb +24 -0
  64. data/generators/simile_timeline/templates/README +8 -0
  65. data/generators/simile_timeline/templates/_timeline.html.erb +7 -0
  66. data/generators/simile_timeline/templates/_timeline_include.html.erb +6 -0
  67. data/generators/simile_timeline/templates/timeline.js +82 -0
  68. data/generators/simile_timeline/templates/timeline_ajax/content/history.html +7 -0
  69. data/generators/simile_timeline/templates/timeline_ajax/images/bubble-arrow-point-down.png +0 -0
  70. data/generators/simile_timeline/templates/timeline_ajax/images/bubble-arrow-point-left.png +0 -0
  71. data/generators/simile_timeline/templates/timeline_ajax/images/bubble-arrow-point-right.png +0 -0
  72. data/generators/simile_timeline/templates/timeline_ajax/images/bubble-arrow-point-up.png +0 -0
  73. data/generators/simile_timeline/templates/timeline_ajax/images/bubble-bottom-left.png +0 -0
  74. data/generators/simile_timeline/templates/timeline_ajax/images/bubble-bottom-right.png +0 -0
  75. data/generators/simile_timeline/templates/timeline_ajax/images/bubble-bottom.png +0 -0
  76. data/generators/simile_timeline/templates/timeline_ajax/images/bubble-left.png +0 -0
  77. data/generators/simile_timeline/templates/timeline_ajax/images/bubble-right.png +0 -0
  78. data/generators/simile_timeline/templates/timeline_ajax/images/bubble-top-left.png +0 -0
  79. data/generators/simile_timeline/templates/timeline_ajax/images/bubble-top-right.png +0 -0
  80. data/generators/simile_timeline/templates/timeline_ajax/images/bubble-top.png +0 -0
  81. data/generators/simile_timeline/templates/timeline_ajax/images/close-button.png +0 -0
  82. data/generators/simile_timeline/templates/timeline_ajax/images/copy.png +0 -0
  83. data/generators/simile_timeline/templates/timeline_ajax/images/message-bottom-left.png +0 -0
  84. data/generators/simile_timeline/templates/timeline_ajax/images/message-bottom-right.png +0 -0
  85. data/generators/simile_timeline/templates/timeline_ajax/images/message-left.png +0 -0
  86. data/generators/simile_timeline/templates/timeline_ajax/images/message-right.png +0 -0
  87. data/generators/simile_timeline/templates/timeline_ajax/images/message-top-left.png +0 -0
  88. data/generators/simile_timeline/templates/timeline_ajax/images/message-top-right.png +0 -0
  89. data/generators/simile_timeline/templates/timeline_ajax/scripts/signal.js +43 -0
  90. data/generators/simile_timeline/templates/timeline_ajax/simile-ajax-api.js +212 -0
  91. data/generators/simile_timeline/templates/timeline_ajax/simile-ajax-bundle.js +2623 -0
  92. data/generators/simile_timeline/templates/timeline_ajax/styles/graphics-ie6.css +77 -0
  93. data/generators/simile_timeline/templates/timeline_ajax/styles/graphics.css +171 -0
  94. data/generators/simile_timeline/templates/timeline_helper.rb +36 -0
  95. data/generators/simile_timeline/templates/timeline_js/images/blue-circle.png +0 -0
  96. data/generators/simile_timeline/templates/timeline_js/images/bubble-bottom-arrow.png +0 -0
  97. data/generators/simile_timeline/templates/timeline_js/images/bubble-bottom-left.png +0 -0
  98. data/generators/simile_timeline/templates/timeline_js/images/bubble-bottom-right.png +0 -0
  99. data/generators/simile_timeline/templates/timeline_js/images/bubble-bottom.png +0 -0
  100. data/generators/simile_timeline/templates/timeline_js/images/bubble-left-arrow.png +0 -0
  101. data/generators/simile_timeline/templates/timeline_js/images/bubble-left.png +0 -0
  102. data/generators/simile_timeline/templates/timeline_js/images/bubble-right-arrow.png +0 -0
  103. data/generators/simile_timeline/templates/timeline_js/images/bubble-right.png +0 -0
  104. data/generators/simile_timeline/templates/timeline_js/images/bubble-top-arrow.png +0 -0
  105. data/generators/simile_timeline/templates/timeline_js/images/bubble-top-left.png +0 -0
  106. data/generators/simile_timeline/templates/timeline_js/images/bubble-top-right.png +0 -0
  107. data/generators/simile_timeline/templates/timeline_js/images/bubble-top.png +0 -0
  108. data/generators/simile_timeline/templates/timeline_js/images/close-button.png +0 -0
  109. data/generators/simile_timeline/templates/timeline_js/images/copyright-vertical.png +0 -0
  110. data/generators/simile_timeline/templates/timeline_js/images/copyright.png +0 -0
  111. data/generators/simile_timeline/templates/timeline_js/images/dark-blue-circle.png +0 -0
  112. data/generators/simile_timeline/templates/timeline_js/images/dark-green-circle.png +0 -0
  113. data/generators/simile_timeline/templates/timeline_js/images/dark-red-circle.png +0 -0
  114. data/generators/simile_timeline/templates/timeline_js/images/dull-blue-circle.png +0 -0
  115. data/generators/simile_timeline/templates/timeline_js/images/dull-green-circle.png +0 -0
  116. data/generators/simile_timeline/templates/timeline_js/images/dull-red-circle.png +0 -0
  117. data/generators/simile_timeline/templates/timeline_js/images/gray-circle.png +0 -0
  118. data/generators/simile_timeline/templates/timeline_js/images/green-circle.png +0 -0
  119. data/generators/simile_timeline/templates/timeline_js/images/message-bottom-left.png +0 -0
  120. data/generators/simile_timeline/templates/timeline_js/images/message-bottom-right.png +0 -0
  121. data/generators/simile_timeline/templates/timeline_js/images/message-left.png +0 -0
  122. data/generators/simile_timeline/templates/timeline_js/images/message-right.png +0 -0
  123. data/generators/simile_timeline/templates/timeline_js/images/message-top-left.png +0 -0
  124. data/generators/simile_timeline/templates/timeline_js/images/message-top-right.png +0 -0
  125. data/generators/simile_timeline/templates/timeline_js/images/progress-running.gif +0 -0
  126. data/generators/simile_timeline/templates/timeline_js/images/red-circle.png +0 -0
  127. data/generators/simile_timeline/templates/timeline_js/images/top-bubble.png +0 -0
  128. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/cs/labellers.js +30 -0
  129. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/cs/timeline.js +9 -0
  130. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/de/labellers.js +27 -0
  131. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/de/timeline.js +8 -0
  132. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/en/labellers.js +12 -0
  133. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/en/timeline.js +9 -0
  134. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/es/labellers.js +8 -0
  135. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/es/timeline.js +9 -0
  136. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/fr/labellers.js +8 -0
  137. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/fr/timeline.js +9 -0
  138. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/it/labellers.js +8 -0
  139. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/it/timeline.js +9 -0
  140. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/nl/labellers.js +11 -0
  141. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/nl/timeline.js +9 -0
  142. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/ru/labellers.js +10 -0
  143. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/ru/timeline.js +9 -0
  144. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/se/labellers.js +12 -0
  145. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/se/timeline.js +9 -0
  146. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/tr/labellers.js +8 -0
  147. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/tr/timeline.js +9 -0
  148. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/vi/labellers.js +26 -0
  149. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/vi/timeline.js +9 -0
  150. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/zh/labellers.js +27 -0
  151. data/generators/simile_timeline/templates/timeline_js/scripts/l10n/zh/timeline.js +9 -0
  152. data/generators/simile_timeline/templates/timeline_js/timeline-api.js +280 -0
  153. data/generators/simile_timeline/templates/timeline_js/timeline-bundle.css +229 -0
  154. data/generators/simile_timeline/templates/timeline_js/timeline-bundle.js +2835 -0
  155. data/lib/muruca_widgets.rb +1 -0
  156. data/lib/timeline.rb +63 -0
  157. data/lib/timeline_source.rb +211 -0
  158. data/test/muruca_widgets_test.rb +8 -0
  159. data/test/test_helper.rb +3 -0
  160. metadata +213 -0
@@ -0,0 +1,17 @@
1
+ module GeneratorHelpers
2
+
3
+ def files_in(m, dir, top_dir = '')
4
+ Dir["#{File.join(self_dir, 'templates', dir)}/*"].each do |file|
5
+
6
+ m.directory "#{top_dir}#{dir}"
7
+
8
+ if(File.directory?(file))
9
+ files_in(m, "#{dir}/#{File.basename(file)}", top_dir)
10
+ else
11
+ m.file "#{dir}/#{File.basename(file)}", "#{top_dir}#{dir}/#{File.basename(file)}"
12
+ end
13
+ end
14
+ end
15
+
16
+
17
+ end
@@ -0,0 +1,18 @@
1
+ class IipViewerGenerator < Rails::Generator::Base
2
+
3
+ def manifest
4
+ record do |m|
5
+ m.directory 'public'
6
+ m.file 'fliipish.swf', 'public/fliipish.swf'
7
+ m.directory 'public/javascripts'
8
+ m.file 'iip_flashclient.js', 'public/javascripts/iip_flashclient.js'
9
+ m.file 'swfobject.js', 'public/javascripts/swfobject.js'
10
+ m.directory 'app/helpers'
11
+ m.file 'iip_helper.rb', 'app/helpers/iip_helper.rb'
12
+ m.directory 'app/views/shared'
13
+ m.file '_iip_flash_viewer.html.erb', 'app/views/shared/_iip_flash_viewer.html.erb'
14
+ m.readme 'README'
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,8 @@
1
+
2
+ == Iip Flash viewer
3
+
4
+ The IIP viewer contains just two helpers: Use the #iip_include_tags in your
5
+ HTML <head> section to load all the necessary javascript and the use the
6
+ #iip_flash_viewer helper to insert the viewer for an IIP data record.
7
+
8
+ These helper will only work with the Talia core framework installed.
@@ -0,0 +1,14 @@
1
+ <script>
2
+ <!--
3
+
4
+ /* AS THE PAGE IS LOADED, WE LOAD THE IIP FLASH VIEWER (no front image exists) */
5
+ $(document).ready(function() {
6
+ load_iip_flashclient("<%= TaliaCore::DataTypes::IipData.iip_server_uri %>",
7
+ "<%= image_path %>", "<%= height %>", "<%= width %>", "<%= element_id %>");
8
+ });
9
+
10
+ -->
11
+ </script>
12
+
13
+ <div id="<%= element_id %>" class="<%= div_class %>">
14
+ </div>
@@ -0,0 +1,24 @@
1
+ /*
2
+ * The javascript code to insert the IIP Flash viewer into the page. This
3
+ * depens on the Prototype library
4
+ */
5
+
6
+ /*
7
+ * Parameters:
8
+ * server - URI for the IIP server
9
+ * image_path - path to the image to show
10
+ * with, height - dimension of the viewer window
11
+ * element_id - the id of html element that will receive the viewer
12
+ */
13
+ function load_iip_flashclient(server, image_path, width, height, element_id) {
14
+ // TODO: Must be changed to work in subfolder URL
15
+ var so = new SWFObject("/fliipish.swf", "flashZoomer", width, height, "9", "#e0e0e0");
16
+ so.addParam("quality", "high");
17
+ so.addParam("scale", "noscale");
18
+ so.addParam("salign", "tl");
19
+ so.addVariable("imgSrc", image_path);
20
+ so.addVariable("zoomSteps", "3");
21
+ so.addVariable("imgSrv", server);
22
+ so.write(element_id);
23
+ }
24
+
@@ -0,0 +1,24 @@
1
+ module IipHelper
2
+
3
+ # Creates the javascript tags to load all things that are required to use the IIP viewer component
4
+ def iip_include_tags
5
+ result = javascript_include_tag('swfobject')
6
+ result << javascript_include_tag('iip_flashclient')
7
+ result
8
+ end
9
+
10
+ # Inserts the IIP flash viewer into the page. This method takes an IIP data object (from which the iip request
11
+ # url will be generated), and optionally the height, width and a css class that will be attached to the
12
+ # div object of the viewer.
13
+ def iip_flash_viewer(iip_data, height = 400, width = 400, klass='iipviewer')
14
+ raise(ArgumentError, 'Must pass an iip data object here') unless(iip_data.is_a?(TaliaCore::DataTypes::IipData))
15
+ render :partial => 'shared/iip_flash_viewer', :locals => {
16
+ :image_path => iip_data.get_iip_root_file_path,
17
+ :height => height.to_s,
18
+ :width => width.to_s,
19
+ :element_id => "iip_viewer_#{rand 10E16}", # Random name so that multiple instances can be used
20
+ :div_class => klass
21
+ }
22
+ end
23
+
24
+ end
@@ -0,0 +1,8 @@
1
+ /**
2
+ * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
3
+ *
4
+ * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
5
+ * http://www.opensource.org/licenses/mit-license.php
6
+ *
7
+ */
8
+ if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;
@@ -0,0 +1,24 @@
1
+ require File.dirname(__FILE__) + '/../generator_helpers'
2
+
3
+ class IpodDropdownGenerator < Rails::Generator::Base
4
+
5
+ include GeneratorHelpers
6
+
7
+ def self_dir ; File.dirname(__FILE__) ; end
8
+
9
+ def manifest
10
+ record do |m|
11
+ m.directory 'app/views/shared'
12
+ m.file '_ipod_dropdown.html.erb', 'app/views/shared/_ipod_dropdown.html.erb'
13
+ m.directory 'app/helpers'
14
+ m.file 'ipod_dropdown_helper.rb', 'app/helpers/ipod_dropdown_helper.rb'
15
+ m.directory 'public/stylesheets'
16
+ m.directory 'public/javascripts'
17
+ files_in(m, 'ipod-menu', 'public/stylesheets/')
18
+ m.file 'fg.menu.js', 'public/javascripts/fg.menu.js'
19
+ m.file 'jquery-1.3.2.min.js', 'public/javascripts/jquery-1.3.2.min.js'
20
+ m.readme 'README'
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,8 @@
1
+
2
+ == Ipod-style dropdown menu
3
+
4
+ This creates an ipod-style hierarchical dropdown menu using the jquery ui framework. To use it,
5
+ use the #fg_menu_includes helper in your HTML <head> AND include the jquery-1.3.2.min.js javascript.
6
+
7
+ Note: This installs the needed jquery library, if you have another supported version you may
8
+ delete jquery-1.3.1.min.js from your 'public/javascripts/' directory.
@@ -0,0 +1,25 @@
1
+ <script type="text/javascript">
2
+ $(function(){
3
+ // BUTTONS
4
+ $('.fg-button').hover(
5
+ function(){ $(this).removeClass('ui-state-default').addClass('ui-state-focus'); },
6
+ function(){ $(this).removeClass('ui-state-focus').addClass('ui-state-default'); }
7
+ );
8
+
9
+
10
+ $('#class-menu').menu({
11
+ content: $('#class-menu-items').html(),
12
+ crumbDefaultText: ' '
13
+ });
14
+
15
+ });
16
+ </script>
17
+
18
+ <div id="select-container">
19
+ <a tabindex="0" href="#class-menu-items" class="fg-button fg-button-icon-right ui-widget ui-state-default ui-corner-all" id="class-menu"><span class="ui-icon ui-icon-triangle-1-s"></span><%= button_text %></a>
20
+
21
+ <div id="class-menu-items" class="hidden">
22
+ <%= tree_list(elements) { |element| item_block.call(element) } %>
23
+ </div>
24
+
25
+ </div>
@@ -0,0 +1,645 @@
1
+ /*--------------------------------------------------------------------
2
+ Scripts for creating and manipulating custom menus based on standard <ul> markup
3
+ Version: 3.0, 03.31.2009
4
+
5
+ By: Maggie Costello Wachs (maggie@filamentgroup.com) and Scott Jehl (scott@filamentgroup.com)
6
+ http://www.filamentgroup.com
7
+ * reference articles: http://www.filamentgroup.com/lab/jquery_ipod_style_drilldown_menu/
8
+
9
+ Copyright (c) 2009 Filament Group
10
+ Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
11
+ --------------------------------------------------------------------*/
12
+
13
+
14
+ var allUIMenus = [];
15
+
16
+ $.fn.menu = function(options){
17
+ var caller = this;
18
+ var options = options;
19
+ var m = new Menu(caller, options);
20
+ allUIMenus.push(m);
21
+
22
+ $(this)
23
+ .mousedown(function(){
24
+ if (!m.menuOpen) { m.showLoading(); };
25
+ })
26
+ .click(function(){
27
+ if (m.menuOpen == false) { m.showMenu(); }
28
+ else { m.kill(); };
29
+ return false;
30
+ });
31
+ };
32
+
33
+ function Menu(caller, options){
34
+ var menu = this;
35
+ var caller = $(caller);
36
+ var container = $('<div class="fg-menu-container ui-widget ui-widget-content ui-corner-all">'+options.content+'</div>');
37
+
38
+ this.menuOpen = false;
39
+ this.menuExists = false;
40
+
41
+ var options = jQuery.extend({
42
+ content: null,
43
+ width: 180, // width of menu container, must be set or passed in to calculate widths of child menus
44
+ maxHeight: 180, // max height of menu (if a drilldown: height does not include breadcrumb)
45
+ positionOpts: {
46
+ posX: 'left',
47
+ posY: 'bottom',
48
+ offsetX: 0,
49
+ offsetY: 0,
50
+ directionH: 'right',
51
+ directionV: 'down',
52
+ detectH: true, // do horizontal collision detection
53
+ detectV: true, // do vertical collision detection
54
+ linkToFront: false
55
+ },
56
+ showSpeed: 200, // show/hide speed in milliseconds
57
+ callerOnState: 'ui-state-active', // class to change the appearance of the link/button when the menu is showing
58
+ loadingState: 'ui-state-loading', // class added to the link/button while the menu is created
59
+ linkHover: 'ui-state-hover', // class for menu option hover state
60
+ linkHoverSecondary: 'li-hover', // alternate class, may be used for multi-level menus
61
+ // ----- multi-level menu defaults -----
62
+ crossSpeed: 200, // cross-fade speed for multi-level menus
63
+ crumbDefaultText: 'Choose an option:',
64
+ backLink: true, // in the ipod-style menu: instead of breadcrumbs, show only a 'back' link
65
+ backLinkText: 'Back',
66
+ flyOut: false, // multi-level menus are ipod-style by default; this parameter overrides to make a flyout instead
67
+ flyOutOnState: 'ui-state-default',
68
+ nextMenuLink: 'ui-icon-triangle-1-e', // class to style the link (specifically, a span within the link) used in the multi-level menu to show the next level
69
+ topLinkText: 'All',
70
+ nextCrumbLink: 'ui-icon-carat-1-e'
71
+ }, options);
72
+
73
+ var killAllMenus = function(){
74
+ $.each(allUIMenus, function(i){
75
+ if (allUIMenus[i].menuOpen) { allUIMenus[i].kill(); };
76
+ });
77
+ };
78
+
79
+ this.kill = function(){
80
+ caller
81
+ .removeClass(options.loadingState)
82
+ .removeClass('fg-menu-open')
83
+ .removeClass(options.callerOnState);
84
+ container.find('li').removeClass(options.linkHoverSecondary).find('a').removeClass(options.linkHover);
85
+ if (options.flyOutOnState) { container.find('li a').removeClass(options.flyOutOnState); };
86
+ if (options.callerOnState) { caller.removeClass(options.callerOnState); };
87
+ if (container.is('.fg-menu-ipod')) { menu.resetDrilldownMenu(); };
88
+ if (container.is('.fg-menu-flyout')) { menu.resetFlyoutMenu(); };
89
+ container.parent().hide();
90
+ menu.menuOpen = false;
91
+ $(document).unbind('click', killAllMenus);
92
+ $(document).unbind('keydown');
93
+ };
94
+
95
+ this.showLoading = function(){
96
+ caller.addClass(options.loadingState);
97
+ };
98
+
99
+ this.showMenu = function(){
100
+ killAllMenus();
101
+ if (!menu.menuExists) { menu.create() };
102
+ caller
103
+ .addClass('fg-menu-open')
104
+ .addClass(options.callerOnState);
105
+ container.parent().show().click(function(){ menu.kill(); return false; });
106
+ container.hide().slideDown(options.showSpeed).find('.fg-menu:eq(0)');
107
+ menu.menuOpen = true;
108
+ caller.removeClass(options.loadingState);
109
+ $(document).click(killAllMenus);
110
+
111
+ // assign key events
112
+ $(document).keydown(function(event){
113
+ var e;
114
+ if (event.which !="") { e = event.which; }
115
+ else if (event.charCode != "") { e = event.charCode; }
116
+ else if (event.keyCode != "") { e = event.keyCode; }
117
+
118
+ var menuType = ($(event.target).parents('div').is('.fg-menu-flyout')) ? 'flyout' : 'ipod' ;
119
+
120
+ switch(e) {
121
+ case 37: // left arrow
122
+ if (menuType == 'flyout') {
123
+ $(event.target).trigger('mouseout');
124
+ if ($('.'+options.flyOutOnState).size() > 0) { $('.'+options.flyOutOnState).trigger('mouseover'); };
125
+ };
126
+
127
+ if (menuType == 'ipod') {
128
+ $(event.target).trigger('mouseout');
129
+ if ($('.fg-menu-footer').find('a').size() > 0) { $('.fg-menu-footer').find('a').trigger('click'); };
130
+ if ($('.fg-menu-header').find('a').size() > 0) { $('.fg-menu-current-crumb').prev().find('a').trigger('click'); };
131
+ if ($('.fg-menu-current').prev().is('.fg-menu-indicator')) {
132
+ $('.fg-menu-current').prev().trigger('mouseover');
133
+ };
134
+ };
135
+ return false;
136
+ break;
137
+
138
+ case 38: // up arrow
139
+ if ($(event.target).is('.' + options.linkHover)) {
140
+ var prevLink = $(event.target).parent().prev().find('a:eq(0)');
141
+ if (prevLink.size() > 0) {
142
+ $(event.target).trigger('mouseout');
143
+ prevLink.trigger('mouseover');
144
+ };
145
+ }
146
+ else { container.find('a:eq(0)').trigger('mouseover'); }
147
+ return false;
148
+ break;
149
+
150
+ case 39: // right arrow
151
+ if ($(event.target).is('.fg-menu-indicator')) {
152
+ if (menuType == 'flyout') {
153
+ $(event.target).next().find('a:eq(0)').trigger('mouseover');
154
+ }
155
+ else if (menuType == 'ipod') {
156
+ $(event.target).trigger('click');
157
+ setTimeout(function(){
158
+ $(event.target).next().find('a:eq(0)').trigger('mouseover');
159
+ }, options.crossSpeed);
160
+ };
161
+ };
162
+ return false;
163
+ break;
164
+
165
+ case 40: // down arrow
166
+ if ($(event.target).is('.' + options.linkHover)) {
167
+ var nextLink = $(event.target).parent().next().find('a:eq(0)');
168
+ if (nextLink.size() > 0) {
169
+ $(event.target).trigger('mouseout');
170
+ nextLink.trigger('mouseover');
171
+ };
172
+ }
173
+ else { container.find('a:eq(0)').trigger('mouseover'); }
174
+ return false;
175
+ break;
176
+
177
+ case 27: // escape
178
+ killAllMenus();
179
+ break;
180
+
181
+ case 13: // enter
182
+ if ($(event.target).is('.fg-menu-indicator') && menuType == 'ipod') {
183
+ $(event.target).trigger('click');
184
+ setTimeout(function(){
185
+ $(event.target).next().find('a:eq(0)').trigger('mouseover');
186
+ }, options.crossSpeed);
187
+ };
188
+ break;
189
+ };
190
+ });
191
+ };
192
+
193
+ this.create = function(){
194
+ container.css({ width: options.width }).appendTo('body').find('ul:first').not('.fg-menu-breadcrumb').addClass('fg-menu');
195
+ container.find('ul, li a').addClass('ui-corner-all');
196
+
197
+ // aria roles & attributes
198
+ container.find('ul').attr('role', 'menu').eq(0).attr('aria-activedescendant','active-menuitem').attr('aria-labelledby', caller.attr('id'));
199
+ container.find('li').attr('role', 'menuitem');
200
+ container.find('li:has(ul)').attr('aria-haspopup', 'true').find('ul').attr('aria-expanded', 'false');
201
+ container.find('a').attr('tabindex', '-1');
202
+
203
+ // when there are multiple levels of hierarchy, create flyout or drilldown menu
204
+ if (container.find('ul').size() > 1) {
205
+ if (options.flyOut) { menu.flyout(container, options); }
206
+ else { menu.drilldown(container, options); }
207
+ }
208
+ else {
209
+ container.find('a').click(function(){
210
+ menu.chooseItem(this);
211
+ return false;
212
+ });
213
+ };
214
+
215
+ if (options.linkHover) {
216
+ var allLinks = container.find('.fg-menu li a');
217
+ allLinks.hover(
218
+ function(){
219
+ var menuitem = $(this);
220
+ $('.'+options.linkHover).removeClass(options.linkHover).blur().parent().removeAttr('id');
221
+ $(this).addClass(options.linkHover).focus().parent().attr('id','active-menuitem');
222
+ },
223
+ function(){
224
+ $(this).removeClass(options.linkHover).blur().parent().removeAttr('id');
225
+ }
226
+ );
227
+ };
228
+
229
+ if (options.linkHoverSecondary) {
230
+ container.find('.fg-menu li').hover(
231
+ function(){
232
+ $(this).siblings('li').removeClass(options.linkHoverSecondary);
233
+ if (options.flyOutOnState) { $(this).siblings('li').find('a').removeClass(options.flyOutOnState); }
234
+ $(this).addClass(options.linkHoverSecondary);
235
+ },
236
+ function(){ $(this).removeClass(options.linkHoverSecondary); }
237
+ );
238
+ };
239
+
240
+ menu.setPosition(container, caller, options);
241
+ menu.menuExists = true;
242
+ };
243
+
244
+ this.chooseItem = function(item){
245
+ menu.kill();
246
+ // edit this for your own custom function/callback:
247
+ // $('#menuSelection').text($(item).text());
248
+ location.href = $(item).attr('href');
249
+ };
250
+ };
251
+
252
+ Menu.prototype.flyout = function(container, options) {
253
+ var menu = this;
254
+
255
+ this.resetFlyoutMenu = function(){
256
+ var allLists = container.find('ul ul');
257
+ allLists.removeClass('ui-widget-content').hide();
258
+ };
259
+
260
+ container.addClass('fg-menu-flyout').find('li:has(ul)').each(function(){
261
+ var linkWidth = container.width();
262
+ var showTimer, hideTimer;
263
+ var allSubLists = $(this).find('ul');
264
+
265
+ allSubLists.css({ left: linkWidth, width: linkWidth }).hide();
266
+
267
+ $(this).find('a:eq(0)').addClass('fg-menu-indicator').html('<span>' + $(this).find('a:eq(0)').text() + '</span><span class="ui-icon '+options.nextMenuLink+'"></span>').hover(
268
+ function(){
269
+ clearTimeout(hideTimer);
270
+ var subList = $(this).next();
271
+ if (!fitVertical(subList, $(this).offset().top)) { subList.css({ top: 'auto', bottom: 0 }); };
272
+ if (!fitHorizontal(subList, $(this).offset().left + 100)) { subList.css({ left: 'auto', right: linkWidth, 'z-index': 999 }); };
273
+ showTimer = setTimeout(function(){
274
+ subList.addClass('ui-widget-content').show(options.showSpeed).attr('aria-expanded', 'true');
275
+ }, 300);
276
+ },
277
+ function(){
278
+ clearTimeout(showTimer);
279
+ var subList = $(this).next();
280
+ hideTimer = setTimeout(function(){
281
+ subList.removeClass('ui-widget-content').hide(options.showSpeed).attr('aria-expanded', 'false');
282
+ }, 400);
283
+ }
284
+ );
285
+
286
+ $(this).find('ul a').hover(
287
+ function(){
288
+ clearTimeout(hideTimer);
289
+ if ($(this).parents('ul').prev().is('a.fg-menu-indicator')) {
290
+ $(this).parents('ul').prev().addClass(options.flyOutOnState);
291
+ }
292
+ },
293
+ function(){
294
+ hideTimer = setTimeout(function(){
295
+ allSubLists.hide(options.showSpeed);
296
+ container.find(options.flyOutOnState).removeClass(options.flyOutOnState);
297
+ }, 500);
298
+ }
299
+ );
300
+ });
301
+
302
+ container.find('a').click(function(){
303
+ menu.chooseItem(this);
304
+ return false;
305
+ });
306
+ };
307
+
308
+
309
+ Menu.prototype.drilldown = function(container, options) {
310
+ var menu = this;
311
+ var topList = container.find('.fg-menu');
312
+ var breadcrumb = $('<ul class="fg-menu-breadcrumb ui-widget-header ui-corner-all ui-helper-clearfix"></ul>');
313
+ var crumbDefaultHeader = $('<li class="fg-menu-breadcrumb-text">'+options.crumbDefaultText+'</li>');
314
+ var firstCrumbText = (options.backLink) ? options.backLinkText : options.topLinkText;
315
+ var firstCrumbClass = (options.backLink) ? 'fg-menu-prev-list' : 'fg-menu-all-lists';
316
+ var firstCrumbLinkClass = (options.backLink) ? 'ui-state-default ui-corner-all' : '';
317
+ var firstCrumbIcon = (options.backLink) ? '<span class="ui-icon ui-icon-triangle-1-w"></span>' : '';
318
+ var firstCrumb = $('<li class="'+firstCrumbClass+'"><a href="#" class="'+firstCrumbLinkClass+'">'+firstCrumbIcon+firstCrumbText+'</a></li>');
319
+
320
+ container.addClass('fg-menu-ipod');
321
+
322
+ if (options.backLink) { breadcrumb.addClass('fg-menu-footer').appendTo(container).hide(); }
323
+ else { breadcrumb.addClass('fg-menu-header').prependTo(container); };
324
+ breadcrumb.append(crumbDefaultHeader);
325
+
326
+ var checkMenuHeight = function(el){
327
+ if (el.height() > options.maxHeight) { el.addClass('fg-menu-scroll') };
328
+ el.css({ height: options.maxHeight });
329
+ };
330
+
331
+ var resetChildMenu = function(el){ el.removeClass('fg-menu-scroll').removeClass('fg-menu-current').height('auto'); };
332
+
333
+ this.resetDrilldownMenu = function(){
334
+ $('.fg-menu-current').removeClass('fg-menu-current');
335
+ topList.animate({ left: 0 }, options.crossSpeed, function(){
336
+ $(this).find('ul').each(function(){
337
+ $(this).hide();
338
+ resetChildMenu($(this));
339
+ });
340
+ topList.addClass('fg-menu-current');
341
+ });
342
+ $('.fg-menu-all-lists').find('span').remove();
343
+ breadcrumb.empty().append(crumbDefaultHeader);
344
+ $('.fg-menu-footer').empty().hide();
345
+ checkMenuHeight(topList);
346
+ };
347
+
348
+ topList
349
+ .addClass('fg-menu-content fg-menu-current ui-widget-content ui-helper-clearfix')
350
+ .css({ width: container.width() })
351
+ .find('ul')
352
+ .css({ width: container.width(), left: container.width() })
353
+ .addClass('ui-widget-content')
354
+ .hide();
355
+ checkMenuHeight(topList);
356
+
357
+ topList.find('a').each(function(){
358
+ // if the link opens a child menu:
359
+ if ($(this).next().is('ul')) {
360
+ $(this)
361
+ .addClass('fg-menu-indicator')
362
+ .each(function(){ $(this).html('<span>' + $(this).text() + '</span><span class="ui-icon '+options.nextMenuLink+'"></span>'); })
363
+ .click(function(){ // ----- show the next menu
364
+ var nextList = $(this).next();
365
+ var parentUl = $(this).parents('ul:eq(0)');
366
+ var parentLeft = (parentUl.is('.fg-menu-content')) ? 0 : parseFloat(topList.css('left'));
367
+ var nextLeftVal = Math.round(parentLeft - parseFloat(container.width()));
368
+ var footer = $('.fg-menu-footer');
369
+
370
+ // show next menu
371
+ resetChildMenu(parentUl);
372
+ checkMenuHeight(nextList);
373
+ topList.animate({ left: nextLeftVal }, options.crossSpeed);
374
+ nextList.show().addClass('fg-menu-current').attr('aria-expanded', 'true');
375
+
376
+ var setPrevMenu = function(backlink){
377
+ var b = backlink;
378
+ var c = $('.fg-menu-current');
379
+ var prevList = c.parents('ul:eq(0)');
380
+ c.hide().attr('aria-expanded', 'false');
381
+ resetChildMenu(c);
382
+ checkMenuHeight(prevList);
383
+ prevList.addClass('fg-menu-current').attr('aria-expanded', 'true');
384
+ if (prevList.hasClass('fg-menu-content')) { b.remove(); footer.hide(); };
385
+ };
386
+
387
+ // initialize "back" link
388
+ if (options.backLink) {
389
+ if (footer.find('a').size() == 0) {
390
+ footer.show();
391
+ $('<a href="#"><span class="ui-icon ui-icon-triangle-1-w"></span> <span>Back</span></a>')
392
+ .appendTo(footer)
393
+ .click(function(){ // ----- show the previous menu
394
+ var b = $(this);
395
+ var prevLeftVal = parseFloat(topList.css('left')) + container.width();
396
+ topList.animate({ left: prevLeftVal }, options.crossSpeed, function(){
397
+ setPrevMenu(b);
398
+ });
399
+ return false;
400
+ });
401
+ }
402
+ }
403
+ // or initialize top breadcrumb
404
+ else {
405
+ if (breadcrumb.find('li').size() == 1){
406
+ breadcrumb.empty().append(firstCrumb);
407
+ firstCrumb.find('a').click(function(){
408
+ menu.resetDrilldownMenu();
409
+ return false;
410
+ });
411
+ }
412
+ $('.fg-menu-current-crumb').removeClass('fg-menu-current-crumb');
413
+ var crumbText = $(this).find('span:eq(0)').text();
414
+ var newCrumb = $('<li class="fg-menu-current-crumb"><a href="javascript://" class="fg-menu-crumb">'+crumbText+'</a></li>');
415
+ newCrumb
416
+ .appendTo(breadcrumb)
417
+ .find('a').click(function(){
418
+ if ($(this).parent().is('.fg-menu-current-crumb')){
419
+ menu.chooseItem(this);
420
+ }
421
+ else {
422
+ var newLeftVal = - ($('.fg-menu-current').parents('ul').size() - 1) * 180;
423
+ topList.animate({ left: newLeftVal }, options.crossSpeed, function(){
424
+ setPrevMenu();
425
+ });
426
+
427
+ // make this the current crumb, delete all breadcrumbs after this one, and navigate to the relevant menu
428
+ $(this).parent().addClass('fg-menu-current-crumb').find('span').remove();
429
+ $(this).parent().nextAll().remove();
430
+ };
431
+ return false;
432
+ });
433
+ newCrumb.prev().append(' <span class="ui-icon '+options.nextCrumbLink+'"></span>');
434
+ };
435
+ return false;
436
+ });
437
+ }
438
+ // if the link is a leaf node (doesn't open a child menu)
439
+ else {
440
+ $(this).click(function(){
441
+ menu.chooseItem(this);
442
+ return false;
443
+ });
444
+ };
445
+ });
446
+ };
447
+
448
+
449
+ /* Menu.prototype.setPosition parameters (defaults noted with *):
450
+ referrer = the link (or other element) used to show the overlaid object
451
+ settings = can override the defaults:
452
+ - posX/Y: where the top left corner of the object should be positioned in relation to its referrer.
453
+ X: left*, center, right
454
+ Y: top, center, bottom*
455
+ - offsetX/Y: the number of pixels to be offset from the x or y position. Can be a positive or negative number.
456
+ - directionH/V: where the entire menu should appear in relation to its referrer.
457
+ Horizontal: left*, right
458
+ Vertical: up, down*
459
+ - detectH/V: detect the viewport horizontally / vertically
460
+ - linkToFront: copy the menu link and place it on top of the menu (visual effect to make it look like it overlaps the object) */
461
+
462
+ Menu.prototype.setPosition = function(widget, caller, options) {
463
+ var el = widget;
464
+ var referrer = caller;
465
+ var dims = {
466
+ refX: referrer.offset().left,
467
+ refY: referrer.offset().top,
468
+ refW: referrer.getTotalWidth(),
469
+ refH: referrer.getTotalHeight()
470
+ };
471
+ var options = options;
472
+ var xVal, yVal;
473
+
474
+ var helper = $('<div class="positionHelper"></div>');
475
+ helper.css({ position: 'absolute', left: dims.refX, top: dims.refY, width: dims.refW, height: dims.refH });
476
+ el.wrap(helper);
477
+
478
+ // get X pos
479
+ switch(options.positionOpts.posX) {
480
+ case 'left': xVal = 0;
481
+ break;
482
+ case 'center': xVal = dims.refW / 2;
483
+ break;
484
+ case 'right': xVal = dims.refW;
485
+ break;
486
+ };
487
+
488
+ // get Y pos
489
+ switch(options.positionOpts.posY) {
490
+ case 'top': yVal = 0;
491
+ break;
492
+ case 'center': yVal = dims.refH / 2;
493
+ break;
494
+ case 'bottom': yVal = dims.refH;
495
+ break;
496
+ };
497
+
498
+ // add the offsets (zero by default)
499
+ xVal += options.positionOpts.offsetX;
500
+ yVal += options.positionOpts.offsetY;
501
+
502
+ // position the object vertically
503
+ if (options.positionOpts.directionV == 'up') {
504
+ el.css({ top: 'auto', bottom: yVal });
505
+ if (options.positionOpts.detectV && !fitVertical(el)) {
506
+ el.css({ bottom: 'auto', top: yVal });
507
+ }
508
+ }
509
+ else {
510
+ el.css({ bottom: 'auto', top: yVal });
511
+ if (options.positionOpts.detectV && !fitVertical(el)) {
512
+ el.css({ top: 'auto', bottom: yVal });
513
+ }
514
+ };
515
+
516
+ // and horizontally
517
+ if (options.positionOpts.directionH == 'left') {
518
+ el.css({ left: 'auto', right: xVal });
519
+ if (options.positionOpts.detectH && !fitHorizontal(el)) {
520
+ el.css({ right: 'auto', left: xVal });
521
+ }
522
+ }
523
+ else {
524
+ el.css({ right: 'auto', left: xVal });
525
+ if (options.positionOpts.detectH && !fitHorizontal(el)) {
526
+ el.css({ left: 'auto', right: xVal });
527
+ }
528
+ };
529
+
530
+ // if specified, clone the referring element and position it so that it appears on top of the menu
531
+ if (options.positionOpts.linkToFront) {
532
+ referrer.clone().addClass('linkClone').css({
533
+ position: 'absolute',
534
+ top: 0,
535
+ right: 'auto',
536
+ bottom: 'auto',
537
+ left: 0,
538
+ width: referrer.width(),
539
+ height: referrer.height()
540
+ }).insertAfter(el);
541
+ };
542
+ };
543
+
544
+
545
+ /* Utilities to sort and find viewport dimensions */
546
+
547
+ function sortBigToSmall(a, b) { return b - a; };
548
+
549
+ jQuery.fn.getTotalWidth = function(){
550
+ return $(this).width() + parseInt($(this).css('paddingRight')) + parseInt($(this).css('paddingLeft')) + parseInt($(this).css('borderRightWidth')) + parseInt($(this).css('borderLeftWidth'));
551
+ };
552
+
553
+ jQuery.fn.getTotalHeight = function(){
554
+ return $(this).height() + parseInt($(this).css('paddingTop')) + parseInt($(this).css('paddingBottom')) + parseInt($(this).css('borderTopWidth')) + parseInt($(this).css('borderBottomWidth'));
555
+ };
556
+
557
+ function getScrollTop(){
558
+ return self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
559
+ };
560
+
561
+ function getScrollLeft(){
562
+ return self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
563
+ };
564
+
565
+ function getWindowHeight(){
566
+ var de = document.documentElement;
567
+ return self.innerHeight || (de && de.clientHeight) || document.body.clientHeight;
568
+ };
569
+
570
+ function getWindowWidth(){
571
+ var de = document.documentElement;
572
+ return self.innerWidth || (de && de.clientWidth) || document.body.clientWidth;
573
+ };
574
+
575
+ /* Utilities to test whether an element will fit in the viewport
576
+ Parameters:
577
+ el = element to position, required
578
+ leftOffset / topOffset = optional parameter if the offset cannot be calculated (i.e., if the object is in the DOM but is set to display: 'none') */
579
+
580
+ function fitHorizontal(el, leftOffset){
581
+ var leftVal = parseInt(leftOffset) || $(el).offset().left;
582
+ return (leftVal + $(el).width() <= getWindowWidth() + getScrollLeft() && leftVal - getScrollLeft() >= 0);
583
+ };
584
+
585
+ function fitVertical(el, topOffset){
586
+ var topVal = parseInt(topOffset) || $(el).offset().top;
587
+ return (topVal + $(el).height() <= getWindowHeight() + getScrollTop() && topVal - getScrollTop() >= 0);
588
+ };
589
+
590
+ /*--------------------------------------------------------------------
591
+ * javascript method: "pxToEm"
592
+ * by:
593
+ Scott Jehl (scott@filamentgroup.com)
594
+ Maggie Wachs (maggie@filamentgroup.com)
595
+ http://www.filamentgroup.com
596
+ *
597
+ * Copyright (c) 2008 Filament Group
598
+ * Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
599
+ *
600
+ * Description: Extends the native Number and String objects with pxToEm method. pxToEm converts a pixel value to ems depending on inherited font size.
601
+ * Article: http://www.filamentgroup.com/lab/retaining_scalable_interfaces_with_pixel_to_em_conversion/
602
+ * Demo: http://www.filamentgroup.com/examples/pxToEm/
603
+ *
604
+ * Options:
605
+ scope: string or jQuery selector for font-size scoping
606
+ reverse: Boolean, true reverses the conversion to em-px
607
+ * Dependencies: jQuery library
608
+ * Usage Example: myPixelValue.pxToEm(); or myPixelValue.pxToEm({'scope':'#navigation', reverse: true});
609
+ *
610
+ * Version: 2.0, 08.01.2008
611
+ * Changelog:
612
+ * 08.02.2007 initial Version 1.0
613
+ * 08.01.2008 - fixed font-size calculation for IE
614
+ --------------------------------------------------------------------*/
615
+
616
+ Number.prototype.pxToEm = String.prototype.pxToEm = function(settings){
617
+ //set defaults
618
+ settings = jQuery.extend({
619
+ scope: 'body',
620
+ reverse: false
621
+ }, settings);
622
+
623
+ var pxVal = (this == '') ? 0 : parseFloat(this);
624
+ var scopeVal;
625
+ var getWindowWidth = function(){
626
+ var de = document.documentElement;
627
+ return self.innerWidth || (de && de.clientWidth) || document.body.clientWidth;
628
+ };
629
+
630
+ /* When a percentage-based font-size is set on the body, IE returns that percent of the window width as the font-size.
631
+ For example, if the body font-size is 62.5% and the window width is 1000px, IE will return 625px as the font-size.
632
+ When this happens, we calculate the correct body font-size (%) and multiply it by 16 (the standard browser font size)
633
+ to get an accurate em value. */
634
+
635
+ if (settings.scope == 'body' && $.browser.msie && (parseFloat($('body').css('font-size')) / getWindowWidth()).toFixed(1) > 0.0) {
636
+ var calcFontSize = function(){
637
+ return (parseFloat($('body').css('font-size'))/getWindowWidth()).toFixed(3) * 16;
638
+ };
639
+ scopeVal = calcFontSize();
640
+ }
641
+ else { scopeVal = parseFloat(jQuery(settings.scope).css("font-size")); };
642
+
643
+ var result = (settings.reverse == true) ? (pxVal * scopeVal).toFixed(2) + 'px' : (pxVal / scopeVal).toFixed(2) + 'em';
644
+ return result;
645
+ };