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.
- data/.gitignore +5 -1
- data/Gemfile +3 -0
- data/Rakefile +16 -14
- data/{alchemy.gemspec → alchemy_cms.gemspec} +1 -1
- data/app/models/message.rb +1 -1
- data/app/views/elements/_searchresult_view.html.erb +1 -1
- data/config/initializers/fast_gettext.rb +1 -1
- data/config/routes.rb +3 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/{alchemy.rb → alchemy_cms.rb} +0 -0
- data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +2 -2
- data/lib/rails/templates/alchemy.rb +1 -1
- data/spec/alchemy_spec.rb +7 -0
- data/spec/config_spec.rb +7 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/alchemy/config.yml +199 -0
- data/spec/dummy/config/alchemy/elements.yml +91 -0
- data/spec/dummy/config/alchemy/page_layouts.yml +29 -0
- data/spec/dummy/config/application.rb +45 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +22 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +26 -0
- data/spec/dummy/config/environments/production.rb +49 -0
- data/spec/dummy/config/environments/test.rb +35 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +58 -0
- data/spec/dummy/db/schema.rb +267 -0
- data/spec/dummy/log/production.log +0 -0
- data/spec/dummy/log/server.log +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/images/alchemy/ajax_loader.gif +0 -0
- data/spec/dummy/public/images/alchemy/alchemy-logo.png +0 -0
- data/spec/dummy/public/images/alchemy/flags.png +0 -0
- data/spec/dummy/public/images/alchemy/gui/navi-tab.png +0 -0
- data/spec/dummy/public/images/alchemy/gui/shading.png +0 -0
- data/spec/dummy/public/images/alchemy/gui/shading_90.png +0 -0
- data/spec/dummy/public/images/alchemy/gui/toggle.png +0 -0
- data/spec/dummy/public/images/alchemy/icons.png +0 -0
- data/spec/dummy/public/images/alchemy/jquery-sb/select_arrow.gif +0 -0
- data/spec/dummy/public/images/alchemy/jquery-sb/select_arrow_bg.gif +0 -0
- data/spec/dummy/public/images/alchemy/jquery-sb/select_arrow_bg_hover.gif +0 -0
- data/spec/dummy/public/images/alchemy/jquery-ui/ui-icons_666666_256x240.png +0 -0
- data/spec/dummy/public/images/alchemy/placeholder.png +0 -0
- data/spec/dummy/public/images/alchemy/swfupload/browse_button.png +0 -0
- data/spec/dummy/public/javascripts/alchemy/alchemy.element_editor_selector.js +88 -0
- data/spec/dummy/public/javascripts/alchemy/alchemy.growler.js +44 -0
- data/spec/dummy/public/javascripts/alchemy/alchemy.image_cropper.js +56 -0
- data/spec/dummy/public/javascripts/alchemy/alchemy.js +892 -0
- data/spec/dummy/public/javascripts/alchemy/alchemy.link_overlay.js +221 -0
- data/spec/dummy/public/javascripts/alchemy/alchemy.page_sorter.js +42 -0
- data/spec/dummy/public/javascripts/alchemy/alchemy.preview.js +145 -0
- data/spec/dummy/public/javascripts/alchemy/jquery-ui.js +428 -0
- data/spec/dummy/public/javascripts/alchemy/jquery.Jcrop.min.js +246 -0
- data/spec/dummy/public/javascripts/alchemy/jquery.dialogextend.min.js +8 -0
- data/spec/dummy/public/javascripts/alchemy/jquery.in-place-edit.js +171 -0
- data/spec/dummy/public/javascripts/alchemy/jquery.js +18 -0
- data/spec/dummy/public/javascripts/alchemy/jquery.rails.js +315 -0
- data/spec/dummy/public/javascripts/alchemy/jquery.sb.min.js +14 -0
- data/spec/dummy/public/javascripts/alchemy/jquery.scrollTo-1.4.2-min.js +11 -0
- data/spec/dummy/public/javascripts/alchemy/jquery.ui.nestedSortable.js +291 -0
- data/spec/dummy/public/javascripts/alchemy/jquery.ui.tabspaging.js +281 -0
- data/spec/dummy/public/javascripts/alchemy/swfupload/fileprogress.js +203 -0
- data/spec/dummy/public/javascripts/alchemy/swfupload/handlers.js +171 -0
- data/spec/dummy/public/javascripts/alchemy/swfupload/queue.js +98 -0
- data/spec/dummy/public/javascripts/alchemy/swfupload/swfupload.js +980 -0
- data/spec/dummy/public/javascripts/alchemy/swfupload/swfupload.swf +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/jquery.tinymce.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/langs/de.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/langs/en.js +223 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/license.txt +504 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/alchemy_link/editor_plugin.js +43 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/alchemy_link/langs/de.js +4 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/alchemy_link/langs/en.js +4 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/fullscreen/fullscreen.htm +109 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/inlinepopups/editor_plugin.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css +402 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/inlinepopups/template.htm +387 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/lists/editor_plugin.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/editor_plugin.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/js/pastetext.js +36 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/js/pasteword.js +51 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/langs/de_dlg.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/langs/en_dlg.js +5 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/pastetext.htm +27 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/pasteword.htm +21 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/cell.htm +180 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/css/cell.css +17 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/css/row.css +25 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/css/table.css +13 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/editor_plugin.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/cell.js +319 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/merge_cells.js +27 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/row.js +237 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/table.js +450 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/langs/de_dlg.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/langs/en_dlg.js +75 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/merge_cells.htm +32 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/row.htm +158 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/table.htm +188 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/about.htm +52 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/anchor.htm +26 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/charmap.htm +51 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/color_picker.htm +74 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/editor_template.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/image.htm +80 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/flash.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/icons.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/iframe.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/trans.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/video.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/about.js +73 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/anchor.js +42 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/charmap.js +355 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/color_picker.js +329 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/image.js +247 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/link.js +153 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/source_editor.js +56 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/de.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/de_dlg.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/en.js +68 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/en_dlg.js +54 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/link.htm +57 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/shortcuts.htm +47 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/content.css +47 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/dialog.css +117 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/ui.css +214 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/highcontrast/content.css +23 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +105 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/highcontrast/ui.css +102 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/content.css +46 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/dialog.css +117 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/ui.css +217 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +8 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/source_editor.htm +25 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/simple/langs/de.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/tiny_mce.js +1 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/tiny_mce_popup.js +5 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/editable_selects.js +70 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/form_utils.js +210 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/mctabs.js +162 -0
- data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/validate.js +252 -0
- data/spec/dummy/public/javascripts/application.js +2 -0
- data/spec/dummy/public/javascripts/controls.js +965 -0
- data/spec/dummy/public/javascripts/dragdrop.js +974 -0
- data/spec/dummy/public/javascripts/effects.js +1123 -0
- data/spec/dummy/public/javascripts/prototype.js +6001 -0
- data/spec/dummy/public/javascripts/rails.js +191 -0
- data/spec/dummy/public/stylesheets/.gitkeep +0 -0
- data/spec/dummy/public/stylesheets/alchemy/Jcrop.gif +0 -0
- data/spec/dummy/public/stylesheets/alchemy/alchemy.css +3629 -0
- data/spec/dummy/public/stylesheets/alchemy/alchemy_tinymce_content.css +94 -0
- data/spec/dummy/public/stylesheets/alchemy/alchemy_tinymce_dialog.css +415 -0
- data/spec/dummy/public/stylesheets/alchemy/default/img/tabs.gif +0 -0
- data/spec/dummy/public/stylesheets/alchemy/elements.css +900 -0
- data/spec/dummy/public/stylesheets/alchemy/flags.css +1 -0
- data/spec/dummy/public/stylesheets/alchemy/ie6.css +18 -0
- data/spec/dummy/public/stylesheets/alchemy/jquery-ui-1.8.7.alchemy.css +2023 -0
- data/spec/dummy/public/stylesheets/alchemy/jquery.Jcrop.css +35 -0
- data/spec/dummy/public/stylesheets/alchemy/jquery.sb.css +244 -0
- data/spec/dummy/public/stylesheets/alchemy/standard_set.css +374 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/integration/navigation_spec.rb +9 -0
- data/spec/integration/security_spec.rb +25 -0
- data/spec/spec_helper.rb +40 -0
- 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):" ";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=''> </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: '»',
|
30
|
+
prevButton: '«',
|
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);
|