alchemy_cms 2.0.pre2 → 2.0.pre3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. data/.gitignore +5 -1
  2. data/Gemfile +3 -0
  3. data/Rakefile +16 -14
  4. data/{alchemy.gemspec → alchemy_cms.gemspec} +1 -1
  5. data/app/models/message.rb +1 -1
  6. data/app/views/elements/_searchresult_view.html.erb +1 -1
  7. data/config/initializers/fast_gettext.rb +1 -1
  8. data/config/routes.rb +3 -0
  9. data/lib/alchemy/version.rb +1 -1
  10. data/lib/{alchemy.rb → alchemy_cms.rb} +0 -0
  11. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +2 -2
  12. data/lib/rails/templates/alchemy.rb +1 -1
  13. data/spec/alchemy_spec.rb +7 -0
  14. data/spec/config_spec.rb +7 -0
  15. data/spec/dummy/Rakefile +7 -0
  16. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  17. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  18. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  19. data/spec/dummy/config.ru +4 -0
  20. data/spec/dummy/config/alchemy/config.yml +199 -0
  21. data/spec/dummy/config/alchemy/elements.yml +91 -0
  22. data/spec/dummy/config/alchemy/page_layouts.yml +29 -0
  23. data/spec/dummy/config/application.rb +45 -0
  24. data/spec/dummy/config/boot.rb +10 -0
  25. data/spec/dummy/config/database.yml +22 -0
  26. data/spec/dummy/config/environment.rb +5 -0
  27. data/spec/dummy/config/environments/development.rb +26 -0
  28. data/spec/dummy/config/environments/production.rb +49 -0
  29. data/spec/dummy/config/environments/test.rb +35 -0
  30. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  31. data/spec/dummy/config/initializers/inflections.rb +10 -0
  32. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  33. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  34. data/spec/dummy/config/initializers/session_store.rb +8 -0
  35. data/spec/dummy/config/locales/en.yml +5 -0
  36. data/spec/dummy/config/routes.rb +58 -0
  37. data/spec/dummy/db/schema.rb +267 -0
  38. data/spec/dummy/log/production.log +0 -0
  39. data/spec/dummy/log/server.log +0 -0
  40. data/spec/dummy/public/404.html +26 -0
  41. data/spec/dummy/public/422.html +26 -0
  42. data/spec/dummy/public/500.html +26 -0
  43. data/spec/dummy/public/favicon.ico +0 -0
  44. data/spec/dummy/public/images/alchemy/ajax_loader.gif +0 -0
  45. data/spec/dummy/public/images/alchemy/alchemy-logo.png +0 -0
  46. data/spec/dummy/public/images/alchemy/flags.png +0 -0
  47. data/spec/dummy/public/images/alchemy/gui/navi-tab.png +0 -0
  48. data/spec/dummy/public/images/alchemy/gui/shading.png +0 -0
  49. data/spec/dummy/public/images/alchemy/gui/shading_90.png +0 -0
  50. data/spec/dummy/public/images/alchemy/gui/toggle.png +0 -0
  51. data/spec/dummy/public/images/alchemy/icons.png +0 -0
  52. data/spec/dummy/public/images/alchemy/jquery-sb/select_arrow.gif +0 -0
  53. data/spec/dummy/public/images/alchemy/jquery-sb/select_arrow_bg.gif +0 -0
  54. data/spec/dummy/public/images/alchemy/jquery-sb/select_arrow_bg_hover.gif +0 -0
  55. data/spec/dummy/public/images/alchemy/jquery-ui/ui-icons_666666_256x240.png +0 -0
  56. data/spec/dummy/public/images/alchemy/placeholder.png +0 -0
  57. data/spec/dummy/public/images/alchemy/swfupload/browse_button.png +0 -0
  58. data/spec/dummy/public/javascripts/alchemy/alchemy.element_editor_selector.js +88 -0
  59. data/spec/dummy/public/javascripts/alchemy/alchemy.growler.js +44 -0
  60. data/spec/dummy/public/javascripts/alchemy/alchemy.image_cropper.js +56 -0
  61. data/spec/dummy/public/javascripts/alchemy/alchemy.js +892 -0
  62. data/spec/dummy/public/javascripts/alchemy/alchemy.link_overlay.js +221 -0
  63. data/spec/dummy/public/javascripts/alchemy/alchemy.page_sorter.js +42 -0
  64. data/spec/dummy/public/javascripts/alchemy/alchemy.preview.js +145 -0
  65. data/spec/dummy/public/javascripts/alchemy/jquery-ui.js +428 -0
  66. data/spec/dummy/public/javascripts/alchemy/jquery.Jcrop.min.js +246 -0
  67. data/spec/dummy/public/javascripts/alchemy/jquery.dialogextend.min.js +8 -0
  68. data/spec/dummy/public/javascripts/alchemy/jquery.in-place-edit.js +171 -0
  69. data/spec/dummy/public/javascripts/alchemy/jquery.js +18 -0
  70. data/spec/dummy/public/javascripts/alchemy/jquery.rails.js +315 -0
  71. data/spec/dummy/public/javascripts/alchemy/jquery.sb.min.js +14 -0
  72. data/spec/dummy/public/javascripts/alchemy/jquery.scrollTo-1.4.2-min.js +11 -0
  73. data/spec/dummy/public/javascripts/alchemy/jquery.ui.nestedSortable.js +291 -0
  74. data/spec/dummy/public/javascripts/alchemy/jquery.ui.tabspaging.js +281 -0
  75. data/spec/dummy/public/javascripts/alchemy/swfupload/fileprogress.js +203 -0
  76. data/spec/dummy/public/javascripts/alchemy/swfupload/handlers.js +171 -0
  77. data/spec/dummy/public/javascripts/alchemy/swfupload/queue.js +98 -0
  78. data/spec/dummy/public/javascripts/alchemy/swfupload/swfupload.js +980 -0
  79. data/spec/dummy/public/javascripts/alchemy/swfupload/swfupload.swf +0 -0
  80. data/spec/dummy/public/javascripts/alchemy/tiny_mce/jquery.tinymce.js +1 -0
  81. data/spec/dummy/public/javascripts/alchemy/tiny_mce/langs/de.js +1 -0
  82. data/spec/dummy/public/javascripts/alchemy/tiny_mce/langs/en.js +223 -0
  83. data/spec/dummy/public/javascripts/alchemy/tiny_mce/license.txt +504 -0
  84. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/alchemy_link/editor_plugin.js +43 -0
  85. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/alchemy_link/langs/de.js +4 -0
  86. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/alchemy_link/langs/en.js +4 -0
  87. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -0
  88. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/fullscreen/fullscreen.htm +109 -0
  89. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/inlinepopups/editor_plugin.js +1 -0
  90. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css +402 -0
  91. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/inlinepopups/template.htm +387 -0
  92. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/lists/editor_plugin.js +1 -0
  93. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/editor_plugin.js +1 -0
  94. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/js/pastetext.js +36 -0
  95. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/js/pasteword.js +51 -0
  96. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/langs/de_dlg.js +1 -0
  97. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/langs/en_dlg.js +5 -0
  98. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/pastetext.htm +27 -0
  99. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/pasteword.htm +21 -0
  100. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/cell.htm +180 -0
  101. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/css/cell.css +17 -0
  102. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/css/row.css +25 -0
  103. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/css/table.css +13 -0
  104. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/editor_plugin.js +1 -0
  105. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/cell.js +319 -0
  106. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/merge_cells.js +27 -0
  107. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/row.js +237 -0
  108. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/table.js +450 -0
  109. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/langs/de_dlg.js +1 -0
  110. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/langs/en_dlg.js +75 -0
  111. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/merge_cells.htm +32 -0
  112. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/row.htm +158 -0
  113. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/table.htm +188 -0
  114. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/about.htm +52 -0
  115. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/anchor.htm +26 -0
  116. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/charmap.htm +51 -0
  117. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/color_picker.htm +74 -0
  118. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/editor_template.js +1 -0
  119. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/image.htm +80 -0
  120. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  121. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/flash.gif +0 -0
  122. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/icons.gif +0 -0
  123. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/iframe.gif +0 -0
  124. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
  125. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
  126. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
  127. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
  128. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/trans.gif +0 -0
  129. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/video.gif +0 -0
  130. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
  131. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/about.js +73 -0
  132. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/anchor.js +42 -0
  133. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/charmap.js +355 -0
  134. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/color_picker.js +329 -0
  135. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/image.js +247 -0
  136. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/link.js +153 -0
  137. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/source_editor.js +56 -0
  138. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/de.js +1 -0
  139. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/de_dlg.js +1 -0
  140. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/en.js +68 -0
  141. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/en_dlg.js +54 -0
  142. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/link.htm +57 -0
  143. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/shortcuts.htm +47 -0
  144. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/content.css +47 -0
  145. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/dialog.css +117 -0
  146. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  147. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  148. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  149. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  150. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  151. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  152. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/ui.css +214 -0
  153. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/highcontrast/content.css +23 -0
  154. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +105 -0
  155. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/highcontrast/ui.css +102 -0
  156. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/content.css +46 -0
  157. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/dialog.css +117 -0
  158. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  159. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  160. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  161. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/ui.css +217 -0
  162. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +8 -0
  163. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
  164. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/source_editor.htm +25 -0
  165. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/simple/langs/de.js +1 -0
  166. data/spec/dummy/public/javascripts/alchemy/tiny_mce/tiny_mce.js +1 -0
  167. data/spec/dummy/public/javascripts/alchemy/tiny_mce/tiny_mce_popup.js +5 -0
  168. data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/editable_selects.js +70 -0
  169. data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/form_utils.js +210 -0
  170. data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/mctabs.js +162 -0
  171. data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/validate.js +252 -0
  172. data/spec/dummy/public/javascripts/application.js +2 -0
  173. data/spec/dummy/public/javascripts/controls.js +965 -0
  174. data/spec/dummy/public/javascripts/dragdrop.js +974 -0
  175. data/spec/dummy/public/javascripts/effects.js +1123 -0
  176. data/spec/dummy/public/javascripts/prototype.js +6001 -0
  177. data/spec/dummy/public/javascripts/rails.js +191 -0
  178. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  179. data/spec/dummy/public/stylesheets/alchemy/Jcrop.gif +0 -0
  180. data/spec/dummy/public/stylesheets/alchemy/alchemy.css +3629 -0
  181. data/spec/dummy/public/stylesheets/alchemy/alchemy_tinymce_content.css +94 -0
  182. data/spec/dummy/public/stylesheets/alchemy/alchemy_tinymce_dialog.css +415 -0
  183. data/spec/dummy/public/stylesheets/alchemy/default/img/tabs.gif +0 -0
  184. data/spec/dummy/public/stylesheets/alchemy/elements.css +900 -0
  185. data/spec/dummy/public/stylesheets/alchemy/flags.css +1 -0
  186. data/spec/dummy/public/stylesheets/alchemy/ie6.css +18 -0
  187. data/spec/dummy/public/stylesheets/alchemy/jquery-ui-1.8.7.alchemy.css +2023 -0
  188. data/spec/dummy/public/stylesheets/alchemy/jquery.Jcrop.css +35 -0
  189. data/spec/dummy/public/stylesheets/alchemy/jquery.sb.css +244 -0
  190. data/spec/dummy/public/stylesheets/alchemy/standard_set.css +374 -0
  191. data/spec/dummy/script/rails +6 -0
  192. data/spec/integration/navigation_spec.rb +9 -0
  193. data/spec/integration/security_spec.rb +25 -0
  194. data/spec/spec_helper.rb +40 -0
  195. metadata +371 -8
@@ -0,0 +1,14 @@
1
+ /*
2
+ jQuery-SelectBox
3
+
4
+ Traditional select elements are very difficult to style by themselves,
5
+ but they are also very usable and feature rich. This plugin attempts to
6
+ recreate all selectbox functionality and appearance while adding
7
+ animation and stylability.
8
+
9
+ This product includes software developed
10
+ by RevSystems, Inc (http://www.revsystems.com/) and its contributors
11
+
12
+ Please see the accompanying LICENSE.txt for licensing information.
13
+ */
14
+ (function(e,d,g){e.fn.borderWidth=function(){return e(this).outerWidth()-e(this).innerWidth()};e.fn.paddingWidth=function(){return e(this).innerWidth()-e(this).width()};e.fn.extraWidth=function(){return e(this).outerWidth(true)-e(this).width()};e.fn.offsetFrom=function(i){var h=e(i);return{left:e(this).offset().left-h.offset().left,top:e(this).offset().top-h.offset().top}};e.fn.maxWidth=function(){var h=0;e(this).each(function(){if(e(this).width()>h){h=e(this).width()}});return h};e.fn.triggerAll=function(h,i){return e(this).each(function(){e(this).triggerHandler(h,i)})};var c=Array.prototype.slice,a=function(){return Math.floor(Math.random()*999999999)};e.proto=function(){var i=arguments[0],h=arguments[1],j=h,l={},k;opts=e.extend({elem:"elem",access:"access",init:"init",instantAccess:false},arguments[2]);if(h._super){l[opts.init]=function(){};j=h.extend(l)}e.fn[i]=function(){var m,n=arguments;e(this).each(function(){var p=e(this),q=p.data(i),o=!q;if(o){q=new j();if(h._super){q[opts.init]=h.prototype.init}q[opts.elem]=p[0];if(q[opts.init]){q[opts.init].apply(q,opts.instantAccess?[]:c.call(n,0))}p.data(i,q)}if(!o||opts.instantAccess){if(q[opts.access]){q[opts.access].apply(q,c.call(n,0))}if(n.length>0){if(e.isFunction(q[n[0]])){m=q[n[0]].apply(q,c.call(n,1))}else{if(n.length===1){if(e.getObject){m=e.getObject(n[0],q)}else{m=q[n[0]]}}else{if(e.setObject){e.setObject(n[0],n[1],q)}else{q[n[0]]=n[1]}}}}else{if(m===k){m=p.data(i)}}}});if(m===k){return e(this)}return m}};var b=function(){return false},f=function(){var q=this,U={},m=null,C=null,u=null,v=null,l=null,ac=null,W="",G=null,V=null,i=null,T,Z,n,af,s,ad,Y,M,aa,w,ae,h,ab,S,Q,L,y,z,j,X,R,J,I,P,H,O,E,B,k,N,p,A,F,x,t,r,K,D;T=function(){u=e("<div class='sb "+U.selectboxClass+" "+m.attr("class")+"' id='sb"+a()+"'></div>").attr("role","listbox").attr("aria-has-popup","true").attr("aria-labelledby",C.attr("id")?C.attr("id"):"");e("body").append(u);var ag=m.children().size()>0?U.displayFormat.call(m.find("option:selected")[0],0,0):"&nbsp;";v=e("<div class='display "+m.attr("class")+"' id='sbd"+a()+"'></div>").append(e("<div class='text'></div>").append(ag)).append(U.arrowMarkup);u.append(v);l=e("<ul class='"+U.selectboxClass+" items "+m.attr("class")+"' role='menu' id='sbdd"+a()+"'></ul>").attr("aria-hidden","true");u.append(l).attr("aria-owns",l.attr("id"));if(m.children().size()===0){l.append(Z().addClass("selected"))}else{m.children().each(function(ah){var ai,aj,ak,al;if(e(this).is("optgroup")){aj=e(this);ak=e("<li class='optgroup'>"+U.optgroupFormat.call(aj[0],ah+1)+"</li>").addClass(aj.is(":disabled")?"disabled":"").attr("aria-disabled",aj.is(":disabled")?"true":"");al=e("<ul class='items'></ul>");ak.append(al);l.append(ak);aj.children("option").each(function(){ai=Z(e(this),ah).addClass(aj.is(":disabled")?"disabled":"").attr("aria-disabled",aj.is(":disabled")?"true":"");al.append(ai)})}else{l.append(Z(e(this),ah))}})}ac=l.find("li").not(".optgroup");u.attr("aria-active-descendant",ac.filter(".selected").attr("id"));l.children(":first").addClass("first");l.children(":last").addClass("last");if(!U.fixedWidth){var o=l.find(".text, .optgroup").maxWidth()+v.extraWidth()+1;u.width(U.maxWidth?Math.min(U.maxWidth,o):o)}else{if(U.maxWidth&&u.width()>U.maxWidth){u.width(U.maxWidth)}}m.before(u).addClass("has_sb").hide().show();ae();K();l.hide();if(!m.is(":disabled")){m.bind("blur.sb",af).bind("focus.sb",n);v.mouseup(J).mouseup(S).click(b).focus(z).blur(j).hover(X,R);O().click(Q).hover(X,R);l.find(".optgroup").hover(X,R).click(b);ac.filter(".disabled").click(b);if(!e.browser.msie||e.browser.version>=9){e(d).resize(e.throttle?e.throttle(100,h):ab)}}else{u.addClass("disabled").attr("aria-disabled");v.click(function(ah){ah.preventDefault()})}u.bind("close.sb",w).bind("destroy.sb",s);m.bind("reload.sb",ad);if(e.fn.tie&&U.useTie){m.bind("domupdate.sb",Y)}};ab=function(){clearTimeout(i);i=setTimeout(h,50)};h=function(){if(u.is(".open")){ae();M(true)}};Z=function(ah,o){if(!ah){ah=e("<option value=''>&nbsp;</option>");o=0}var aj=e("<li id='sbo"+a()+"'></li>").attr("role","option").data("orig",ah[0]).data("value",ah?ah.attr("value"):"").addClass(ah.is(":selected")?"selected":"").addClass(ah.is(":disabled")?"disabled":"").attr("aria-disabled",ah.is(":disabled")?"true":""),ai=e("<div class='item'></div>"),ag=e("<div class='text'></div>").html(U.optionFormat.call(ah[0],0,o+1));return aj.append(ai.append(ag))};n=function(){t();v.triggerHandler("focus")};af=function(){if(!u.is(".open")){v.triggerHandler("blur")}};s=function(o){u.remove();m.unbind(".sb").removeClass("has_sb");e(d).unbind("resize",ab);if(!o){m.removeData("sb")}};ad=function(){var ag=u.is(".open"),o=v.is(".focused");w(true);s(true);q.init(U);if(ag){m.focus();M(true)}else{if(o){m.focus()}}};Y=function(){clearTimeout(V);V=setTimeout(ad,30)};x=function(){u.removeClass("focused");w();D()};D=function(){e(document).unbind("click",x).unbind("keyup",L).unbind("keypress",r).unbind("keydown",r).unbind("keydown",y)};A=function(){e(".sb.open."+U.selectboxClass).triggerAll("close")};t=function(){e(".sb.focused."+U.selectboxClass).not(u[0]).find(".display").blur()};F=function(){e(".sb.open."+U.selectboxClass).not(u[0]).triggerAll("close")};w=function(o){if(u.is(".open")){v.blur();ac.removeClass("hover");D();l.attr("aria-hidden","true");if(o===true){l.hide();u.removeClass("open");u.append(l)}else{l.fadeOut(U.animDuration,function(){u.removeClass("open");u.append(l)})}}};P=function(){var o=null;if(U.ddCtx==="self"){o=u}else{if(e.isFunction(U.ddCtx)){o=e(U.ddCtx.call(m[0]))}else{o=e(U.ddCtx)}}return o};H=function(){return ac.filter(".selected")};O=function(){return ac.not(".disabled")};aa=function(){l.scrollTop(l.scrollTop()+H().offsetFrom(l).top-l.height()/2+H().outerHeight(true)/2)};K=function(){if(e.browser.msie&&e.browser.version<8){e("."+U.selectboxClass+" .display").hide().show()}};M=function(ag){var o,ah=P();t();u.addClass("open");ah.append(l);o=ae();l.attr("aria-hidden","false");if(ag===true){l.show();aa()}else{if(o==="down"){l.slideDown(U.animDuration,aa)}else{l.fadeIn(U.animDuration,aa)}}m.focus()};ae=function(){var aj=P(),aq=0,ah=v.offsetFrom(aj).left,ag=0,ak="",an,o,ap,ao,ai,ar,am,al;l.removeClass("above");l.show().css({maxHeight:"none",position:"relative",visibility:"hidden"});if(!U.fixedWidth){l.width(v.outerWidth()-l.extraWidth()+1)}ap=e(d).scrollTop()+e(d).height()-v.offset().top-v.outerHeight();ao=v.offset().top-e(d).scrollTop();ai=v.offsetFrom(aj).top+v.outerHeight();ar=ap-ao+U.dropupThreshold;if(l.outerHeight()<ap){aq=U.maxHeight?U.maxHeight:ap;ag=ai;ak="down"}else{if(l.outerHeight()<ao){aq=U.maxHeight?U.maxHeight:ao;ag=v.offsetFrom(aj).top-Math.min(aq,l.outerHeight());ak="up"}else{if(ar>=0){aq=U.maxHeight?U.maxHeight:ap;ag=ai;ak="down"}else{if(ar<0){aq=U.maxHeight?U.maxHeight:ao;ag=v.offsetFrom(aj).top-Math.min(aq,l.outerHeight());ak="up"}else{aq=U.maxHeight?U.maxHeight:"none";ag=ai;ak="down"}}}}an=(""+e("body").css("margin-left")).match(/^\d+/)?e("body").css("margin-left"):0;o=(""+e("body").css("margin-top")).match(/^\d+/)?e("body").css("margin-top"):0;am=e().jquery>="1.4.2"?parseInt(an):e("body").offset().left;al=e().jquery>="1.4.2"?parseInt(o):e("body").offset().top;l.hide().css({left:ah+(aj.is("body")?am:0),maxHeight:aq,position:"absolute",top:ag+(aj.is("body")?al:0),visibility:"visible"});if(ak==="up"){l.addClass("above")}return ak};S=function(o){if(u.is(".open")){w()}else{M()}return false};E=function(){var ag=e(this),o=m.val(),ah=ag.data("value");m.find("option").each(function(){this.selected=false});e(ag.data("orig")).each(function(){this.selected=true});ac.removeClass("selected");ag.addClass("selected");u.attr("aria-active-descendant",ag.attr("id"));v.find(".text").attr("title",ag.find(".text").html());v.find(".text").html(U.displayFormat.call(ag.data("orig")));if(o!==ah){m.change()}};Q=function(o){x();m.focus();E.call(this);return false};B=function(){W=""};k=function(aj){var ai,ah,o,ag=O();for(ai=0;ai<ag.size();ai++){o=ag.eq(ai).find(".text");ah=o.children().size()==0?o.text():o.find("*").text();if(aj.length>0&&ah.toLowerCase().match("^"+aj.toLowerCase())){return ag.eq(ai)}}return null};N=function(ag){var o=k(ag);if(o!==null){E.call(o[0]);return true}return false};r=function(o){if(o.ctrlKey||o.altKey){return}if(o.which===38||o.which===40||o.which===8||o.which===32){o.preventDefault()}};p=function(aj){var ai,ah,o=H(),ag=O();for(ai=ag.index(o)+1;ai<ag.size();ai++){ah=ag.eq(ai).find(".text").text();if(ah!==""&&ah.substring(0,1).toLowerCase()===aj.toLowerCase()){E.call(ag.eq(ai)[0]);return true}}return false};y=function(ah){if(ah.altKey||ah.ctrlKey){return false}var ag=H(),o=O();switch(ah.which){case 9:w();j();break;case 35:if(ag.size()>0){ah.preventDefault();E.call(o.filter(":last")[0]);aa()}break;case 36:if(ag.size()>0){ah.preventDefault();E.call(o.filter(":first")[0]);aa()}break;case 38:if(ag.size()>0){if(o.filter(":first")[0]!==ag[0]){ah.preventDefault();E.call(o.eq(o.index(ag)-1)[0])}aa()}break;case 40:if(ag.size()>0){if(o.filter(":last")[0]!==ag[0]){ah.preventDefault();E.call(o.eq(o.index(ag)+1)[0]);aa()}}else{if(ac.size()>1){ah.preventDefault();E.call(ac.eq(0)[0])}}break;default:break}};L=function(o){if(o.altKey||o.ctrlKey){return false}if(o.which!==38&&o.which!==40){W+=String.fromCharCode(o.keyCode);if(N(W)){clearTimeout(G);G=setTimeout(B,U.acTimeout)}else{if(p(String.fromCharCode(o.keyCode))){aa();clearTimeout(G);G=setTimeout(B,U.acTimeout)}else{B();clearTimeout(G)}}}};z=function(){F();u.addClass("focused");e(document).click(x).keyup(L).keypress(r).keydown(r).keydown(y)};j=function(){u.removeClass("focused");v.removeClass("active");e(document).unbind("keyup",L).unbind("keydown",r).unbind("keypress",r).unbind("keydown",y)};X=function(){e(this).addClass("hover")};R=function(){e(this).removeClass("hover")};J=function(){v.addClass("active");e(document).bind("mouseup",I)};I=function(){v.removeClass("active");e(document).unbind("mouseup",I)};this.init=function(o){if(e.browser.msie&&e.browser.version<7){return}m=e(this.elem);if(m.attr("id")){C=e("label[for='"+m.attr("id")+"']:first")}if(!C||C.size()===0){C=m.closest("label")}if(m.hasClass("has_sb")){return}U=e.extend({acTimeout:800,animDuration:200,ddCtx:"body",dropupThreshold:150,fixedWidth:false,maxHeight:false,maxWidth:false,selectboxClass:"selectbox",useTie:false,arrowMarkup:"<div class='arrow_btn'><span class='arrow'></span></div>",displayFormat:g,optionFormat:function(ag,ai){if(e(this).size()>0){var ah=e(this).attr("label");if(ah&&ah.length>0){return ah}return e(this).text()}else{return""}},optgroupFormat:function(ag){return"<span class='label'>"+e(this).attr("label")+"</span>"}},o);U.displayFormat=U.displayFormat||U.optionFormat;T()};this.open=M;this.close=w;this.refresh=ad;this.destroy=s;this.options=function(o){U=e.extend(U,o);ad()}};e.proto("sb",f)}(jQuery,window));
@@ -0,0 +1,11 @@
1
+ /**
2
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
3
+ * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
4
+ * Dual licensed under MIT and GPL.
5
+ * Date: 5/25/2009
6
+ * @author Ariel Flesler
7
+ * @version 1.4.2
8
+ *
9
+ * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
10
+ */
11
+ ;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
@@ -0,0 +1,291 @@
1
+ /*
2
+ * jQuery UI Nested Sortable 1.2.1
3
+ *
4
+ * Copyright 2010, Manuele J Sarfatti
5
+ *
6
+ * http://mjsarfatti.com/sandbox/nestedSortable
7
+ *
8
+ * Depends:
9
+ * jquery.ui.core.js 1.8+
10
+ * jquery.ui.widget.js 1.8+
11
+ * jquery.ui.sortable.js 1.8+
12
+ */
13
+ (function($) {
14
+
15
+ $.widget("ui.nestedSortable", $.extend({}, $.ui.sortable.prototype, {
16
+
17
+ options: {
18
+ tabSize: 20,
19
+ disableNesting: 'ui-nestedSortable-no-nesting',
20
+ errorClass: 'ui-nestedSortable-error',
21
+ listType: 'ol'
22
+ },
23
+
24
+ _create: function(){
25
+ this.element.data('sortable', this.element.data('sortableTree'));
26
+ return $.ui.sortable.prototype._create.apply(this, arguments);
27
+ },
28
+
29
+ _mouseDrag: function(event) {
30
+
31
+ //Compute the helpers position
32
+ this.position = this._generatePosition(event);
33
+ this.positionAbs = this._convertPositionTo("absolute");
34
+
35
+ if (!this.lastPositionAbs) {
36
+ this.lastPositionAbs = this.positionAbs;
37
+ }
38
+
39
+ //Do scrolling
40
+ if(this.options.scroll) {
41
+ var o = this.options, scrolled = false;
42
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
43
+
44
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
45
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
46
+ else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
47
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
48
+
49
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
50
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
51
+ else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
52
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
53
+
54
+ } else {
55
+
56
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
57
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
58
+ else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
59
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
60
+
61
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
62
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
63
+ else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
64
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
65
+
66
+ }
67
+
68
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
69
+ $.ui.ddmanager.prepareOffsets(this, event);
70
+ }
71
+
72
+ //Regenerate the absolute position used for position checks
73
+ this.positionAbs = this._convertPositionTo("absolute");
74
+
75
+ //Set the helper position
76
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
77
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
78
+
79
+ //Rearrange
80
+ for (var i = this.items.length - 1; i >= 0; i--) {
81
+
82
+ //Cache variables and intersection, continue if no intersection
83
+ var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
84
+ if (!intersection) continue;
85
+
86
+ if(itemElement != this.currentItem[0] //cannot intersect with itself
87
+ && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
88
+ && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
89
+ && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
90
+ //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
91
+ ) {
92
+
93
+ this.direction = intersection == 1 ? "down" : "up";
94
+
95
+ if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
96
+ this._rearrange(event, item);
97
+ } else {
98
+ break;
99
+ }
100
+
101
+ // Clear emtpy ul's/ol's
102
+ this._clearEmpty(itemElement);
103
+
104
+ this._trigger("change", event, this._uiHash());
105
+ break;
106
+ }
107
+ }
108
+
109
+ // Get the real previous item
110
+ itemBefore = this.placeholder[0].previousSibling;
111
+ while (itemBefore != null) {
112
+ if (itemBefore.nodeType == 1 && itemBefore != this.currentItem[0]) {
113
+ break;
114
+ } else {
115
+ itemBefore = itemBefore.previousSibling;
116
+ }
117
+ }
118
+
119
+ parentItem = this.placeholder[0].parentNode.parentNode;
120
+ newList = document.createElement(o.listType);
121
+
122
+ // Make/delete nested ul's/ol's
123
+ if (parentItem != null && parentItem.nodeName == 'LI' && this.positionAbs.left < $(parentItem).offset().left) {
124
+ $(parentItem).after(this.placeholder[0]);
125
+ this._clearEmpty(parentItem);
126
+ } else if (itemBefore != null && itemBefore.nodeName == 'LI' && this.positionAbs.left > $(itemBefore).offset().left + this.options.tabSize) {
127
+ if (!($(itemBefore).hasClass(this.options.disableNesting))) {
128
+ if ($(this.placeholder[0]).hasClass(this.options.errorClass)) {
129
+ $(this.placeholder[0]).css('marginLeft', 0).removeClass(this.options.errorClass);
130
+ }
131
+ if (itemBefore.children[1] == null) {
132
+ itemBefore.appendChild(newList);
133
+ }
134
+ itemBefore.children[1].appendChild(this.placeholder[0]);
135
+ } else {
136
+ $(this.placeholder[0]).addClass(this.options.errorClass).css('marginLeft', this.options.tabSize);
137
+ }
138
+ } else if (itemBefore != null) {
139
+ if ($(this.placeholder[0]).hasClass(this.options.errorClass)) {
140
+ $(this.placeholder[0]).css('marginLeft', 0).removeClass(this.options.errorClass);
141
+ }
142
+ $(itemBefore).after(this.placeholder[0]);
143
+ } else {
144
+ if ($(this.placeholder[0]).hasClass(this.options.errorClass)) {
145
+ $(this.placeholder[0]).css('marginLeft', 0).removeClass(this.options.errorClass);
146
+ }
147
+ }
148
+
149
+ //Post events to containers
150
+ this._contactContainers(event);
151
+
152
+ //Interconnect with droppables
153
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
154
+
155
+ //Call callbacks
156
+ this._trigger('sort', event, this._uiHash());
157
+
158
+ this.lastPositionAbs = this.positionAbs;
159
+ return false;
160
+
161
+ },
162
+
163
+ serialize: function(o) {
164
+
165
+ var items = this._getItemsAsjQuery(o && o.connected);
166
+ var str = []; o = o || {};
167
+
168
+ $(items).each(function() {
169
+ var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
170
+ var pid = ($(o.item || this).parent(o.listType).parent('li').attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
171
+ if(res) str.push((o.key || res[1]+'['+(o.key && o.expression ? res[1] : res[2])+']')+'='+(pid ? (o.key && o.expression ? pid[1] : pid[2]) : 'root'));
172
+ });
173
+
174
+ if(!str.length && o.key) {
175
+ str.push(o.key + '=');
176
+ }
177
+
178
+ return str.join('&');
179
+
180
+ },
181
+
182
+ toArray: function(o) {
183
+
184
+ o = o || {};
185
+ var sDepth = o.startDepthCount || 0;
186
+ var ret = [];
187
+ var left = 2;
188
+
189
+ ret.push({"item_id": 'root', "parent_id": 'none', "depth": sDepth, "left": '1', "right": ($('li', this.element).length + 1) * 2});
190
+
191
+ $(this.element).children('li').each(function() {
192
+ left = _recursiveArray($(this), sDepth + 1, left);
193
+ });
194
+
195
+ return ret;
196
+
197
+ function _recursiveArray(item, depth, left) {
198
+
199
+ right = left + 1;
200
+
201
+ if ($(item).children(o.listType).children('li').length > 0) {
202
+ depth ++;
203
+ $(item).children(o.listType).children('li').each(function() {
204
+ right = _recursiveArray($(this), depth, right);
205
+ });
206
+ depth --;
207
+ }
208
+
209
+ id = $(item).attr('id').match(o.expression || (/(.+)[-=_](.+)/));
210
+
211
+ if (depth === sDepth + 1) pid = 'root';
212
+ else {
213
+ parentItem = $(item).parent(o.listType).parent('li').attr('id').match(o.expression || (/(.+)[-=_](.+)/));
214
+ pid = parentItem[2];
215
+ }
216
+
217
+ ret.push({"item_id": id[2], "parent_id": pid, "depth": depth, "left": left, "right": right});
218
+
219
+ return left = right + 1;
220
+ }
221
+
222
+ },
223
+
224
+ _createPlaceholder: function(that) {
225
+
226
+ var self = that || this, o = self.options;
227
+
228
+ if(!o.placeholder || o.placeholder.constructor == String) {
229
+ var className = o.placeholder;
230
+ o.placeholder = {
231
+ element: function() {
232
+
233
+ var el = $(document.createElement(self.currentItem[0].nodeName))
234
+ .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
235
+ .removeClass("ui-sortable-helper")[0];
236
+
237
+ if(!className)
238
+ el.style.visibility = "hidden";
239
+
240
+ return el;
241
+ },
242
+ update: function(container, p) {
243
+
244
+ // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
245
+ // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
246
+ if(className && !o.forcePlaceholderSize) return;
247
+
248
+ //If the element doesn't have an actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
249
+ if(!p.height() || p.css('height') == 'auto') { p.height(self.currentItem.height()); };
250
+ if(!p.width()) { p.width(self.currentItem.width()); };
251
+ }
252
+ };
253
+ }
254
+
255
+ //Create the placeholder
256
+ self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
257
+
258
+ //Append it after the actual current item
259
+ self.currentItem.after(self.placeholder);
260
+
261
+ //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
262
+ o.placeholder.update(self, self.placeholder);
263
+
264
+ },
265
+
266
+ _clear: function(event, noPropagation) {
267
+
268
+ $.ui.sortable.prototype._clear.apply(this, arguments);
269
+
270
+ // Clean last empty ul/ol
271
+ for (var i = this.items.length - 1; i >= 0; i--) {
272
+ var item = this.items[i].item[0];
273
+ this._clearEmpty(item);
274
+ }
275
+ return true;
276
+
277
+ },
278
+
279
+ _clearEmpty: function(item) {
280
+
281
+ if (item.children[1] && item.children[1].children.length == 0) {
282
+ item.removeChild(item.children[1]);
283
+ }
284
+
285
+ }
286
+
287
+ }));
288
+
289
+ $.ui.nestedSortable.prototype.options = $.extend({}, $.ui.sortable.prototype.options, $.ui.nestedSortable.prototype.options);
290
+
291
+ })(jQuery);
@@ -0,0 +1,281 @@
1
+ /*
2
+ Copyright (c) 2009, http://seyfertdesign.com/jquery/ui-tabs-paging.html
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in
12
+ all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ THE SOFTWARE.
21
+ */
22
+
23
+ (function($) {
24
+
25
+ $.extend($.ui.tabs.prototype, {
26
+ paging: function(options) {
27
+ var opts = {
28
+ tabsPerPage: 0,
29
+ nextButton: '&#187;',
30
+ prevButton: '&#171;',
31
+ follow: false,
32
+ cycle: false,
33
+ selectOnAdd: false,
34
+ followOnSelect: false
35
+ };
36
+
37
+ opts = $.extend(opts, options);
38
+
39
+ var self = this, initialized = false, currentPage,
40
+ buttonWidth, containerWidth, allTabsWidth, tabWidths,
41
+ maxPageWidth, pages, resizeTimer = null,
42
+ windowHeight = $(window).height(), windowWidth = $(window).width();
43
+
44
+ function init() {
45
+ destroy();
46
+
47
+ allTabsWidth = 0, currentPage = 0, maxPageWidth = 0, buttonWidth = 0,
48
+ pages = new Array(), tabWidths = new Array(), selectedTabWidths = new Array();
49
+
50
+ containerWidth = self.element.width();
51
+
52
+ // loops through LIs, get width of each tab when selected and unselected.
53
+ var maxDiff = 0; // the max difference between a selected and unselected tab
54
+ self.lis.each(function(i) {
55
+ if (i == self.options.selected) {
56
+ selectedTabWidths[i] = $(this).outerWidth({ margin: true });
57
+ tabWidths[i] = self.lis.eq(i).removeClass('ui-tabs-selected').outerWidth({ margin: true });
58
+ self.lis.eq(i).addClass('ui-tabs-selected');
59
+ maxDiff = Math.min(maxDiff, Math.abs(selectedTabWidths[i] - tabWidths[i]));
60
+ allTabsWidth += tabWidths[i];
61
+ } else {
62
+ tabWidths[i] = $(this).outerWidth({ margin: true });
63
+ selectedTabWidths[i] = self.lis.eq(i).addClass('ui-tabs-selected').outerWidth({ margin: true });
64
+ self.lis.eq(i).removeClass('ui-tabs-selected');
65
+ maxDiff = Math.max(maxDiff, Math.abs(selectedTabWidths[i] - tabWidths[i]));
66
+ allTabsWidth += tabWidths[i];
67
+ }
68
+ });
69
+ // fix padding issues with buttons
70
+ // TODO determine a better way to handle this
71
+ allTabsWidth += maxDiff + ($.browser.msie?4:0) + 9;
72
+
73
+ // if the width of all tables is greater than the container's width, calculate the pages
74
+ if (allTabsWidth > containerWidth) {
75
+ // create next button
76
+ li = $('<li></li>')
77
+ .addClass('ui-state-default ui-tabs-paging-next')
78
+ .append($('<a href="#"></a>')
79
+ .click(function() { page('next'); return false; })
80
+ .html(opts.nextButton));
81
+
82
+ self.lis.eq(self.length()-1).after(li);
83
+ buttonWidth = li.outerWidth({ margin: true });
84
+
85
+ // create prev button
86
+ li = $('<li></li>')
87
+ .addClass('ui-state-default ui-tabs-paging-prev')
88
+ .append($('<a href="#"></a>')
89
+ .click(function() { page('prev'); return false; })
90
+ .html(opts.prevButton));
91
+ self.lis.eq(0).before(li);
92
+ buttonWidth += li.outerWidth({ margin: true });
93
+
94
+ // TODO determine fix for padding issues to next button
95
+ buttonWidth += 19;
96
+
97
+ var pageIndex = 0, pageWidth = 0, maxTabPadding = 0;
98
+
99
+ // start calculating pageWidths
100
+ for (var i = 0; i < tabWidths.length; i++) {
101
+ // if first tab of page or selected tab's padding larger than the current max, set the maxTabPadding
102
+ if (pageWidth == 0 || selectedTabWidths[i] - tabWidths[i] > maxTabPadding)
103
+ maxTabPadding = (selectedTabWidths[i] - tabWidths[i]);
104
+
105
+ // if first tab of page, initialize pages variable for page
106
+ if (pages[pageIndex] == null) {
107
+ pages[pageIndex] = { start: i };
108
+
109
+ } else if ((i > 0 && (i % opts.tabsPerPage) == 0) || (tabWidths[i] + pageWidth + buttonWidth + 12) > containerWidth) {
110
+ if ((pageWidth + maxTabPadding) > maxPageWidth)
111
+ maxPageWidth = (pageWidth + maxTabPadding);
112
+ pageIndex++;
113
+ pages[pageIndex] = { start: i };
114
+ pageWidth = 0;
115
+ }
116
+ pages[pageIndex].end = i+1;
117
+ pageWidth += tabWidths[i];
118
+ if (i == self.options.selected) currentPage = pageIndex;
119
+ }
120
+ if ((pageWidth + maxTabPadding) > maxPageWidth)
121
+ maxPageWidth = (pageWidth + maxTabPadding);
122
+
123
+ // hide all tabs then show tabs for current page
124
+ self.lis.hide().slice(pages[currentPage].start, pages[currentPage].end).show();
125
+ if (currentPage == (pages.length - 1) && !opts.cycle)
126
+ disableButton('next');
127
+ if (currentPage == 0 && !opts.cycle)
128
+ disableButton('prev');
129
+
130
+ // calculate the right padding for the next button
131
+ buttonPadding = containerWidth - maxPageWidth - buttonWidth;
132
+ if (buttonPadding > 0)
133
+ $('.ui-tabs-paging-next', self.element).css({ paddingRight: buttonPadding + 'px' });
134
+
135
+ initialized = true;
136
+ } else {
137
+ destroy();
138
+ }
139
+
140
+ $(window).bind('resize', handleResize);
141
+ }
142
+
143
+ function page(direction) {
144
+ currentPage = currentPage + (direction == 'prev'?-1:1);
145
+
146
+ if ((direction == 'prev' && currentPage < 0 && opts.cycle) ||
147
+ (direction == 'next' && currentPage >= pages.length && !opts.cycle))
148
+ currentPage = pages.length - 1;
149
+ else if ((direction == 'prev' && currentPage < 0) ||
150
+ (direction == 'next' && currentPage >= pages.length && opts.cycle))
151
+ currentPage = 0;
152
+
153
+ var start = pages[currentPage].start;
154
+ var end = pages[currentPage].end;
155
+ self.lis.hide().slice(start, end).show();
156
+
157
+ if (direction == 'prev') {
158
+ enableButton('next');
159
+ if (opts.follow && (self.options.selected < start || self.options.selected > (end-1))) self.select(end-1);
160
+ if (!opts.cycle && start <= 0) disableButton('prev');
161
+ } else {
162
+ enableButton('prev');
163
+ if (opts.follow && (self.options.selected < start || self.options.selected > (end-1))) self.select(start);
164
+ if (!opts.cycle && end >= self.length()) disableButton('next');
165
+ }
166
+ }
167
+
168
+ function disableButton(direction) {
169
+ $('.ui-tabs-paging-'+direction, self.element).addClass('ui-tabs-paging-disabled');
170
+ }
171
+
172
+ function enableButton(direction) {
173
+ $('.ui-tabs-paging-'+direction, self.element).removeClass('ui-tabs-paging-disabled');
174
+ }
175
+
176
+ // special function defined to handle IE6 and IE7 resize issues
177
+ function handleResize() {
178
+ if (resizeTimer) clearTimeout(resizeTimer);
179
+
180
+ if (windowHeight != $(window).height() || windowWidth != $(window).width())
181
+ resizeTimer = setTimeout(reinit, 100);
182
+ }
183
+
184
+ function reinit() {
185
+ windowHeight = $(window).height();
186
+ windowWidth = $(window).width();
187
+ init();
188
+ }
189
+
190
+ function destroy() {
191
+ // remove buttons
192
+ $('.ui-tabs-paging-next', self.element).remove();
193
+ $('.ui-tabs-paging-prev', self.element).remove();
194
+
195
+ // show all tabs
196
+ self.lis.show();
197
+
198
+ initialized = false;
199
+
200
+ $(window).unbind('resize', handleResize);
201
+ }
202
+
203
+ // reconfigure "ui.tabs" add/remove events to reinit paging
204
+ var tabsAdd = self.add;
205
+ self.add = function(url, label, index) {
206
+ // remove paging buttons before adding a tab
207
+ if (initialized)
208
+ destroy();
209
+
210
+ tabsAdd.apply(this, [url, label, index]);
211
+
212
+ if (opts.selectOnAdd) {
213
+ if (index == undefined) index = this.lis.length-1;
214
+ this.select(index);
215
+ }
216
+ // re-initialize paging buttons
217
+ init();
218
+ };
219
+ var tabsRemove = self.remove;
220
+ self.remove = function(index) {
221
+ // remove paging buttons before removing a tab
222
+ if (initialized)
223
+ destroy();
224
+
225
+ tabsRemove.apply(this, [index]);
226
+
227
+ // re-initialize paging buttons
228
+ init();
229
+ };
230
+ // reconfigure "ui.tabs" select event to change pages if new tab is selected
231
+ var tabsSelect = self.select;
232
+ self.select = function(index) {
233
+ var $panel;
234
+ var $parent;
235
+ if (typeof(index) === 'string') {
236
+ $panel = $('#' + index);
237
+ $parent = $panel.parent();
238
+ // getting my index
239
+ index = $parent.children('.ui-tabs-panel').index($panel);
240
+ }
241
+ tabsSelect.apply(this, [index]);
242
+ // if paging is not initialized or it is not configured to
243
+ // change pages when a new tab is selected, then do nothing
244
+ if (!initialized || !opts.followOnSelect)
245
+ return;
246
+
247
+ // find the new page based on index of the tab selected
248
+ for (i in pages) {
249
+ var start = pages[i].start;
250
+ var end = pages[i].end;
251
+ if (index >= start && index < end) {
252
+ // if the the tab selected is not within the currentPage of tabs, then change pages
253
+ if (i != currentPage) {
254
+ self.lis.hide().slice(start, end).show();
255
+
256
+ currentPage = parseInt(i);
257
+ if (currentPage == 0) {
258
+ enableButton('next');
259
+ if (!opts.cycle && start <= 0) disableButton('prev');
260
+ } else {
261
+ enableButton('prev');
262
+ if (!opts.cycle && end >= self.length()) disableButton('next');
263
+ }
264
+ }
265
+ break;
266
+ }
267
+ }
268
+ };
269
+
270
+ // add, remove, and destroy functions specific for paging
271
+ $.extend($.ui.tabs.prototype, {
272
+ pagingDestroy: function() {
273
+ destroy();
274
+ }
275
+ });
276
+
277
+ init();
278
+ }
279
+ });
280
+
281
+ })(jQuery);