puffer 0.0.11 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/app/helpers/puffer_helper.rb +8 -0
- data/app/views/layouts/puffer.html.erb +5 -11
- data/lib/generators/puffer/install/install_generator.rb +2 -2
- data/lib/generators/puffer/install/templates/puffer.rb +12 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/{application.js → puffer.js} +0 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/{rails-src.js → rails.js} +0 -0
- data/lib/puffer.rb +14 -0
- data/lib/puffer/controller/mutate.rb +8 -2
- data/lib/puffer/extensions/mapper.rb +2 -2
- data/lib/puffer/inputs.rb +1 -1
- data/lib/puffer/path_set.rb +14 -7
- data/lib/puffer/resource.rb +1 -1
- data/puffer.gemspec +8 -44
- data/spec/dummy/config/initializers/puffer.rb +12 -0
- data/spec/dummy/public/puffer/javascripts/{application.js → puffer.js} +0 -0
- data/spec/dummy/public/puffer/javascripts/{rails-src.js → rails.js} +0 -0
- metadata +10 -46
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-autocompleter-src.js +0 -621
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-autocompleter.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-calendar-src.js +0 -1461
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-calendar.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-in-edit-src.js +0 -369
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-in-edit.js +0 -13
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-in-edit.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-lightbox-src.js +0 -905
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-lightbox.js +0 -24
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-lightbox.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-sortable-src.js +0 -428
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-sortable.js +0 -17
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-sortable.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-src.js +0 -5892
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-tabs-src.js +0 -1145
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-tabs.js +0 -29
- data/lib/generators/puffer/install/templates/puffer/javascripts/right-tabs.js.gz +0 -0
- data/lib/generators/puffer/install/templates/puffer/javascripts/right.js.gz +0 -0
- data/spec/dummy/config/puffer.rb +0 -0
- data/spec/dummy/public/puffer/javascripts/right-autocompleter-src.js +0 -621
- data/spec/dummy/public/puffer/javascripts/right-autocompleter.js.gz +0 -0
- data/spec/dummy/public/puffer/javascripts/right-calendar-src.js +0 -1461
- data/spec/dummy/public/puffer/javascripts/right-calendar.js.gz +0 -0
- data/spec/dummy/public/puffer/javascripts/right-in-edit-src.js +0 -369
- data/spec/dummy/public/puffer/javascripts/right-in-edit.js +0 -13
- data/spec/dummy/public/puffer/javascripts/right-in-edit.js.gz +0 -0
- data/spec/dummy/public/puffer/javascripts/right-lightbox-src.js +0 -905
- data/spec/dummy/public/puffer/javascripts/right-lightbox.js +0 -24
- data/spec/dummy/public/puffer/javascripts/right-lightbox.js.gz +0 -0
- data/spec/dummy/public/puffer/javascripts/right-sortable-src.js +0 -428
- data/spec/dummy/public/puffer/javascripts/right-sortable.js +0 -17
- data/spec/dummy/public/puffer/javascripts/right-sortable.js.gz +0 -0
- data/spec/dummy/public/puffer/javascripts/right-src.js +0 -5892
- data/spec/dummy/public/puffer/javascripts/right-tabs-src.js +0 -1145
- data/spec/dummy/public/puffer/javascripts/right-tabs.js +0 -29
- data/spec/dummy/public/puffer/javascripts/right-tabs.js.gz +0 -0
- data/spec/dummy/public/puffer/javascripts/right.js.gz +0 -0
| @@ -1,1145 +0,0 @@ | |
| 1 | 
            -
            /**
         | 
| 2 | 
            -
             * Tabs widget for RightJS (http://rightjs.org/ui/tabs)
         | 
| 3 | 
            -
             *
         | 
| 4 | 
            -
             * Copyright (C) 2009-2010 Nikolay Nemshilov
         | 
| 5 | 
            -
             */
         | 
| 6 | 
            -
            var Tabs = RightJS.Tabs = (function(document, parseInt, RightJS) {
         | 
| 7 | 
            -
            /**
         | 
| 8 | 
            -
             * This module defines the basic widgets constructor
         | 
| 9 | 
            -
             * it creates an abstract proxy with the common functionality
         | 
| 10 | 
            -
             * which then we reuse and override in the actual widgets
         | 
| 11 | 
            -
             *
         | 
| 12 | 
            -
             * Copyright (C) 2010-2011 Nikolay Nemshilov
         | 
| 13 | 
            -
             */
         | 
| 14 | 
            -
             | 
| 15 | 
            -
            /**
         | 
| 16 | 
            -
             * The tabs init-script
         | 
| 17 | 
            -
             *
         | 
| 18 | 
            -
             * Copyright (C) 2010-2011 Nikolay Nemshilov
         | 
| 19 | 
            -
             */
         | 
| 20 | 
            -
            var R  = RightJS,
         | 
| 21 | 
            -
                $  = RightJS.$,
         | 
| 22 | 
            -
                $$ = RightJS.$$,
         | 
| 23 | 
            -
                $w = RightJS.$w,
         | 
| 24 | 
            -
                $E = RightJS.$E,
         | 
| 25 | 
            -
                Fx       = RightJS.Fx,
         | 
| 26 | 
            -
                Object   = RightJS.Object,
         | 
| 27 | 
            -
                Browser  = RightJS.Browser,
         | 
| 28 | 
            -
                isArray  = RightJS.isArray,
         | 
| 29 | 
            -
                isNumber = RightJS.isNumber,
         | 
| 30 | 
            -
                Class    = RightJS.Class,
         | 
| 31 | 
            -
                Element  = RightJS.Element,
         | 
| 32 | 
            -
                Cookie   = RightJS.Cookie;
         | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
            /**
         | 
| 41 | 
            -
             * The widget units constructor
         | 
| 42 | 
            -
             *
         | 
| 43 | 
            -
             * @param String tag-name or Object methods
         | 
| 44 | 
            -
             * @param Object methods
         | 
| 45 | 
            -
             * @return Widget wrapper
         | 
| 46 | 
            -
             */
         | 
| 47 | 
            -
            function Widget(tag_name, methods) {
         | 
| 48 | 
            -
              if (!methods) {
         | 
| 49 | 
            -
                methods = tag_name;
         | 
| 50 | 
            -
                tag_name = 'DIV';
         | 
| 51 | 
            -
              }
         | 
| 52 | 
            -
             | 
| 53 | 
            -
              /**
         | 
| 54 | 
            -
               * An Abstract Widget Unit
         | 
| 55 | 
            -
               *
         | 
| 56 | 
            -
               * Copyright (C) 2010 Nikolay Nemshilov
         | 
| 57 | 
            -
               */
         | 
| 58 | 
            -
              var AbstractWidget = new RightJS.Class(RightJS.Element.Wrappers[tag_name] || RightJS.Element, {
         | 
| 59 | 
            -
                /**
         | 
| 60 | 
            -
                 * The common constructor
         | 
| 61 | 
            -
                 *
         | 
| 62 | 
            -
                 * @param Object options
         | 
| 63 | 
            -
                 * @param String optional tag name
         | 
| 64 | 
            -
                 * @return void
         | 
| 65 | 
            -
                 */
         | 
| 66 | 
            -
                initialize: function(key, options) {
         | 
| 67 | 
            -
                  this.key = key;
         | 
| 68 | 
            -
                  var args = [{'class': 'rui-' + key}];
         | 
| 69 | 
            -
             | 
| 70 | 
            -
                  // those two have different constructors
         | 
| 71 | 
            -
                  if (!(this instanceof RightJS.Input || this instanceof RightJS.Form)) {
         | 
| 72 | 
            -
                    args.unshift(tag_name);
         | 
| 73 | 
            -
                  }
         | 
| 74 | 
            -
                  this.$super.apply(this, args);
         | 
| 75 | 
            -
             | 
| 76 | 
            -
                  if (RightJS.isString(options)) {
         | 
| 77 | 
            -
                    options = RightJS.$(options);
         | 
| 78 | 
            -
                  }
         | 
| 79 | 
            -
             | 
| 80 | 
            -
                  // if the options is another element then
         | 
| 81 | 
            -
                  // try to dynamically rewrap it with our widget
         | 
| 82 | 
            -
                  if (options instanceof RightJS.Element) {
         | 
| 83 | 
            -
                    this._ = options._;
         | 
| 84 | 
            -
                    if ('$listeners' in options) {
         | 
| 85 | 
            -
                      options.$listeners = options.$listeners;
         | 
| 86 | 
            -
                    }
         | 
| 87 | 
            -
                    options = {};
         | 
| 88 | 
            -
                  }
         | 
| 89 | 
            -
                  this.setOptions(options, this);
         | 
| 90 | 
            -
             | 
| 91 | 
            -
                  return (RightJS.Wrapper.Cache[RightJS.$uid(this._)] = this);
         | 
| 92 | 
            -
                },
         | 
| 93 | 
            -
             | 
| 94 | 
            -
              // protected
         | 
| 95 | 
            -
             | 
| 96 | 
            -
                /**
         | 
| 97 | 
            -
                 * Catches the options
         | 
| 98 | 
            -
                 *
         | 
| 99 | 
            -
                 * @param Object user-options
         | 
| 100 | 
            -
                 * @param Element element with contextual options
         | 
| 101 | 
            -
                 * @return void
         | 
| 102 | 
            -
                 */
         | 
| 103 | 
            -
                setOptions: function(options, element) {
         | 
| 104 | 
            -
                  element = element || this;
         | 
| 105 | 
            -
                  RightJS.Options.setOptions.call(this,
         | 
| 106 | 
            -
                    RightJS.Object.merge(options, eval("("+(
         | 
| 107 | 
            -
                      element.get('data-'+ this.key) || '{}'
         | 
| 108 | 
            -
                    )+")"))
         | 
| 109 | 
            -
                  );
         | 
| 110 | 
            -
                  return this;
         | 
| 111 | 
            -
                }
         | 
| 112 | 
            -
              });
         | 
| 113 | 
            -
             | 
| 114 | 
            -
              /**
         | 
| 115 | 
            -
               * Creating the actual widget class
         | 
| 116 | 
            -
               *
         | 
| 117 | 
            -
               */
         | 
| 118 | 
            -
              var Klass = new RightJS.Class(AbstractWidget, methods);
         | 
| 119 | 
            -
             | 
| 120 | 
            -
              // creating the widget related shortcuts
         | 
| 121 | 
            -
              RightJS.Observer.createShortcuts(Klass.prototype, Klass.EVENTS || []);
         | 
| 122 | 
            -
             | 
| 123 | 
            -
              return Klass;
         | 
| 124 | 
            -
            }
         | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 127 | 
            -
            /**
         | 
| 128 | 
            -
             * A shared module to create textual spinners
         | 
| 129 | 
            -
             *
         | 
| 130 | 
            -
             * Copyright (C) 2010-2011 Nikolay Nemshilov
         | 
| 131 | 
            -
             */
         | 
| 132 | 
            -
            var Spinner = new RightJS.Class(RightJS.Element, {
         | 
| 133 | 
            -
              /**
         | 
| 134 | 
            -
               * Constructor
         | 
| 135 | 
            -
               *
         | 
| 136 | 
            -
               * @param Number optional spinner size (4 by default)
         | 
| 137 | 
            -
               * @return void
         | 
| 138 | 
            -
               */
         | 
| 139 | 
            -
              initialize: function(size) {
         | 
| 140 | 
            -
                this.$super('div', {'class': 'rui-spinner'});
         | 
| 141 | 
            -
                this.dots = [];
         | 
| 142 | 
            -
             | 
| 143 | 
            -
                for (var i=0; i < (size || 4); i++) {
         | 
| 144 | 
            -
                  this.dots.push(new RightJS.Element('div'));
         | 
| 145 | 
            -
                }
         | 
| 146 | 
            -
             | 
| 147 | 
            -
                this.dots[0].addClass('glowing');
         | 
| 148 | 
            -
                this.insert(this.dots);
         | 
| 149 | 
            -
                RightJS(this.shift).bind(this).periodical(300);
         | 
| 150 | 
            -
              },
         | 
| 151 | 
            -
             | 
| 152 | 
            -
              /**
         | 
| 153 | 
            -
               * Shifts the spinner elements
         | 
| 154 | 
            -
               *
         | 
| 155 | 
            -
               * @return void
         | 
| 156 | 
            -
               */
         | 
| 157 | 
            -
              shift: function() {
         | 
| 158 | 
            -
                if (this.visible()) {
         | 
| 159 | 
            -
                  var dot = this.dots.pop();
         | 
| 160 | 
            -
                  this.dots.unshift(dot);
         | 
| 161 | 
            -
                  this.insert(dot, 'top');
         | 
| 162 | 
            -
                }
         | 
| 163 | 
            -
              }
         | 
| 164 | 
            -
            });
         | 
| 165 | 
            -
             | 
| 166 | 
            -
             | 
| 167 | 
            -
            /**
         | 
| 168 | 
            -
             * The basic tabs handling engine
         | 
| 169 | 
            -
             *
         | 
| 170 | 
            -
             * Copyright (C) 2009-2011 Nikolay Nemshilov
         | 
| 171 | 
            -
             */
         | 
| 172 | 
            -
            var Tabs = new Widget('UL', {
         | 
| 173 | 
            -
              extend: {
         | 
| 174 | 
            -
                version: '2.2.0',
         | 
| 175 | 
            -
             | 
| 176 | 
            -
                EVENTS: $w('select hide load disable enable add remove move'),
         | 
| 177 | 
            -
             | 
| 178 | 
            -
                Options: {
         | 
| 179 | 
            -
                  idPrefix:       '',      // the tab-body elements id prefix
         | 
| 180 | 
            -
                  tabsElement:    null,    // the tabs list element reference, in case it's situated somewhere else
         | 
| 181 | 
            -
             | 
| 182 | 
            -
                  resizeFx:       'both',  // 'slide', 'fade', 'both' or null for no fx
         | 
| 183 | 
            -
                  resizeDuration: 400,     // the tab panels resize fx duration
         | 
| 184 | 
            -
             | 
| 185 | 
            -
                  scrollTabs:     false,   // use the tabs list scrolling
         | 
| 186 | 
            -
                  scrollDuration: 400,     // the tabs scrolling fx duration
         | 
| 187 | 
            -
             | 
| 188 | 
            -
                  selected:       null,    // the index of the currently opened tab, by default will check url, cookies or set 0
         | 
| 189 | 
            -
                  disabled:       null,    // list of disabled tab indexes
         | 
| 190 | 
            -
             | 
| 191 | 
            -
                  closable:       false,   // set true if you want a close icon on your tabs
         | 
| 192 | 
            -
             | 
| 193 | 
            -
                  loop:           false,   // put a delay in ms to make it autostart the slideshow loop
         | 
| 194 | 
            -
                  loopPause:      true,    // make the loop get paused when user hovers the tabs with mouse
         | 
| 195 | 
            -
             | 
| 196 | 
            -
                  url:            false,   // a common remote tabs url template, should have the %{id} placeholder
         | 
| 197 | 
            -
                  cache:          false,   // marker if the remote tabs should be cached
         | 
| 198 | 
            -
             | 
| 199 | 
            -
                  Xhr:            null,    // the xhr addtional options
         | 
| 200 | 
            -
                  Cookie:         null     // set the cookie options if you'd like to keep the last selected tab index in cookies
         | 
| 201 | 
            -
                },
         | 
| 202 | 
            -
             | 
| 203 | 
            -
                // scans and automatically intializes the tabs
         | 
| 204 | 
            -
                rescan: function(scope) {
         | 
| 205 | 
            -
                  $(scope || document).find('.rui-tabs,*[data-tabs]').each(function(element) {
         | 
| 206 | 
            -
                    element = element instanceof Tabs ? element : new Tabs(element);
         | 
| 207 | 
            -
                  });
         | 
| 208 | 
            -
                }
         | 
| 209 | 
            -
              },
         | 
| 210 | 
            -
             | 
| 211 | 
            -
              /**
         | 
| 212 | 
            -
               * The basic constructor
         | 
| 213 | 
            -
               *
         | 
| 214 | 
            -
               * @param element or id
         | 
| 215 | 
            -
               * @param Object options
         | 
| 216 | 
            -
               */
         | 
| 217 | 
            -
              initialize: function(element, options) {
         | 
| 218 | 
            -
                this
         | 
| 219 | 
            -
                  .$super('tabs', element)
         | 
| 220 | 
            -
                  .setOptions(options)
         | 
| 221 | 
            -
                  .addClass('rui-tabs');
         | 
| 222 | 
            -
             | 
| 223 | 
            -
                this.isHarmonica = this._.tagName === 'DL';
         | 
| 224 | 
            -
                this.isCarousel  = this.hasClass('rui-tabs-carousel');
         | 
| 225 | 
            -
                this.isSimple    = !this.isHarmonica && !this.isCarousel;
         | 
| 226 | 
            -
             | 
| 227 | 
            -
                this
         | 
| 228 | 
            -
                  .findTabs()
         | 
| 229 | 
            -
                  .initScrolls()
         | 
| 230 | 
            -
                  .findCurrent()
         | 
| 231 | 
            -
                  .setStyle('visibility:visible');
         | 
| 232 | 
            -
             | 
| 233 | 
            -
                if (this.options.disabled) {
         | 
| 234 | 
            -
                  this.disable(this.options.disabled);
         | 
| 235 | 
            -
                }
         | 
| 236 | 
            -
             | 
| 237 | 
            -
                if (this.options.loop) {
         | 
| 238 | 
            -
                  this.startLoop();
         | 
| 239 | 
            -
                }
         | 
| 240 | 
            -
              },
         | 
| 241 | 
            -
             | 
| 242 | 
            -
              /**
         | 
| 243 | 
            -
               * Shows the given tab
         | 
| 244 | 
            -
               *
         | 
| 245 | 
            -
               * @param integer tab index or a Tabs.Tab instance
         | 
| 246 | 
            -
               * @return Tabs this
         | 
| 247 | 
            -
               */
         | 
| 248 | 
            -
              select: function(tab) {
         | 
| 249 | 
            -
                return this.callTab(tab, 'select');
         | 
| 250 | 
            -
              },
         | 
| 251 | 
            -
             | 
| 252 | 
            -
              /**
         | 
| 253 | 
            -
               * Disables the given tab
         | 
| 254 | 
            -
               *
         | 
| 255 | 
            -
               * @param integer tab index or a Tabs.Tab instance or a list of them
         | 
| 256 | 
            -
               * @return Tabs this
         | 
| 257 | 
            -
               */
         | 
| 258 | 
            -
              disable: function(tab) {
         | 
| 259 | 
            -
                return this.callTab(tab, 'disable');
         | 
| 260 | 
            -
              },
         | 
| 261 | 
            -
             | 
| 262 | 
            -
              /**
         | 
| 263 | 
            -
               * Enables the given tab
         | 
| 264 | 
            -
               *
         | 
| 265 | 
            -
               * @param integer tab index or a Tabs.Tab instance or a list of them
         | 
| 266 | 
            -
               * @return Tabs this
         | 
| 267 | 
            -
               */
         | 
| 268 | 
            -
              enable: function(tab) {
         | 
| 269 | 
            -
                return this.callTab(tab, 'enable');
         | 
| 270 | 
            -
              },
         | 
| 271 | 
            -
             | 
| 272 | 
            -
              /**
         | 
| 273 | 
            -
               * Returns the reference to the currently opened tab
         | 
| 274 | 
            -
               *
         | 
| 275 | 
            -
               * @return Tab tab or undefined
         | 
| 276 | 
            -
               */
         | 
| 277 | 
            -
              current: function() {
         | 
| 278 | 
            -
                return this.tabs.first('current');
         | 
| 279 | 
            -
              },
         | 
| 280 | 
            -
             | 
| 281 | 
            -
              /**
         | 
| 282 | 
            -
               * Returns the list of enabled tabs
         | 
| 283 | 
            -
               *
         | 
| 284 | 
            -
               * @return Array of enabled tabs
         | 
| 285 | 
            -
               */
         | 
| 286 | 
            -
              enabled: function() {
         | 
| 287 | 
            -
                return this.tabs.filter('enabled');
         | 
| 288 | 
            -
              },
         | 
| 289 | 
            -
             | 
| 290 | 
            -
            // protected
         | 
| 291 | 
            -
             | 
| 292 | 
            -
              // calls the tab (or tabs) method
         | 
| 293 | 
            -
              callTab: function(tabs, method) {
         | 
| 294 | 
            -
                R(isArray(tabs) ? tabs : [tabs]).each(function(tab) {
         | 
| 295 | 
            -
                  if (isNumber(tab)) { tab = this.tabs[tab]; }
         | 
| 296 | 
            -
                  if (tab && tab instanceof Tab) {
         | 
| 297 | 
            -
                    tab[method]();
         | 
| 298 | 
            -
                  }
         | 
| 299 | 
            -
                }, this);
         | 
| 300 | 
            -
             | 
| 301 | 
            -
                return this;
         | 
| 302 | 
            -
              },
         | 
| 303 | 
            -
             | 
| 304 | 
            -
              // finds and interconnects the tabs
         | 
| 305 | 
            -
              findTabs: function() {
         | 
| 306 | 
            -
                this.tabsList = this.isHarmonica ? this :
         | 
| 307 | 
            -
                  $(this.options.tabsElement) || this.first('.rui-tabs-list') ||
         | 
| 308 | 
            -
                    (this.first('UL') || $E('UL').insertTo(this)).addClass('rui-tabs-list');
         | 
| 309 | 
            -
             | 
| 310 | 
            -
                this.tabs = R([]);
         | 
| 311 | 
            -
             | 
| 312 | 
            -
                this.tabsList.children(this.isHarmonica ? 'dt' : null).map(function(node) {
         | 
| 313 | 
            -
                  this.tabs.push(new Tab(node, this));
         | 
| 314 | 
            -
                }, this);
         | 
| 315 | 
            -
             | 
| 316 | 
            -
                // removing the whitespaces so the didn't screw with the margins
         | 
| 317 | 
            -
                for (var i=0, list = this.tabsList.get('childNodes'); i < list.length; i++) {
         | 
| 318 | 
            -
                  if (list[i].nodeType == 3) { this.tabsList._.removeChild(list[i]); }
         | 
| 319 | 
            -
                }
         | 
| 320 | 
            -
             | 
| 321 | 
            -
                return this;
         | 
| 322 | 
            -
              }
         | 
| 323 | 
            -
            });
         | 
| 324 | 
            -
             | 
| 325 | 
            -
             | 
| 326 | 
            -
            /**
         | 
| 327 | 
            -
             * A single tab handling object
         | 
| 328 | 
            -
             *
         | 
| 329 | 
            -
             * Copyright (C) 2009-2011 Nikolay Nemshilov
         | 
| 330 | 
            -
             */
         | 
| 331 | 
            -
            var Tab = Tabs.Tab = new Class(Element, {
         | 
| 332 | 
            -
              extend: {
         | 
| 333 | 
            -
                autoId: 0
         | 
| 334 | 
            -
              },
         | 
| 335 | 
            -
             | 
| 336 | 
            -
              /**
         | 
| 337 | 
            -
               * Constructor
         | 
| 338 | 
            -
               *
         | 
| 339 | 
            -
               * @param Element the tab's element
         | 
| 340 | 
            -
               * @param Tabs the main element
         | 
| 341 | 
            -
               * @return void
         | 
| 342 | 
            -
               */
         | 
| 343 | 
            -
              initialize: function(element, main) {
         | 
| 344 | 
            -
                this.$super(element._);
         | 
| 345 | 
            -
                this.addClass('rui-tabs-tab');
         | 
| 346 | 
            -
             | 
| 347 | 
            -
                this.main  = main;
         | 
| 348 | 
            -
                this.link  = this.first('a');
         | 
| 349 | 
            -
                this.id    = this.link.get('href').split('#')[1] || Tab.autoId++;
         | 
| 350 | 
            -
                this.panel = new Panel(this.findPanel(), this);
         | 
| 351 | 
            -
             | 
| 352 | 
            -
                if (this.current()) {
         | 
| 353 | 
            -
                  this.select();
         | 
| 354 | 
            -
                }
         | 
| 355 | 
            -
             | 
| 356 | 
            -
                // adding the 'close' icon onto the tab if needed
         | 
| 357 | 
            -
                if (main.options.closable) {
         | 
| 358 | 
            -
                  this.link.insert($E('div', {
         | 
| 359 | 
            -
                    'class': 'rui-tabs-tab-close-icon', 'html': '×'
         | 
| 360 | 
            -
                  }).onClick(R(this.remove).bind(this)));
         | 
| 361 | 
            -
                }
         | 
| 362 | 
            -
             | 
| 363 | 
            -
                this.onClick(this._clicked);
         | 
| 364 | 
            -
              },
         | 
| 365 | 
            -
             | 
| 366 | 
            -
              select: function() {
         | 
| 367 | 
            -
                if (this.enabled()) {
         | 
| 368 | 
            -
                  var prev_tab = this.main.current();
         | 
| 369 | 
            -
                  if (prev_tab) {
         | 
| 370 | 
            -
                    prev_tab.removeClass('rui-tabs-current').fire('hide');
         | 
| 371 | 
            -
                  }
         | 
| 372 | 
            -
             | 
| 373 | 
            -
                  this.addClass('rui-tabs-current');
         | 
| 374 | 
            -
                  this.main.scrollToTab(this);
         | 
| 375 | 
            -
                  this.panel.show();
         | 
| 376 | 
            -
                }
         | 
| 377 | 
            -
             | 
| 378 | 
            -
                return this.fire('select');
         | 
| 379 | 
            -
              },
         | 
| 380 | 
            -
             | 
| 381 | 
            -
              disable: function() {
         | 
| 382 | 
            -
                return this.addClass('rui-tabs-disabled').fire('disable');
         | 
| 383 | 
            -
              },
         | 
| 384 | 
            -
             | 
| 385 | 
            -
              enable: function() {
         | 
| 386 | 
            -
                return this.removeClass('rui-tabs-disabled').fire('enable');
         | 
| 387 | 
            -
              },
         | 
| 388 | 
            -
             | 
| 389 | 
            -
              disabled: function() {
         | 
| 390 | 
            -
                return !this.enabled();
         | 
| 391 | 
            -
              },
         | 
| 392 | 
            -
             | 
| 393 | 
            -
              enabled: function() {
         | 
| 394 | 
            -
                return !this.hasClass('rui-tabs-disabled');
         | 
| 395 | 
            -
              },
         | 
| 396 | 
            -
             | 
| 397 | 
            -
              current: function() {
         | 
| 398 | 
            -
                return this.hasClass('rui-tabs-current');
         | 
| 399 | 
            -
              },
         | 
| 400 | 
            -
             | 
| 401 | 
            -
              remove: function(event) {
         | 
| 402 | 
            -
                if (event) { event.stop(); }
         | 
| 403 | 
            -
             | 
| 404 | 
            -
                // switching to the next available sibling
         | 
| 405 | 
            -
                if (this.current()) {
         | 
| 406 | 
            -
                  var enabled = this.main.enabled();
         | 
| 407 | 
            -
                  var sibling = enabled[enabled.indexOf(this) + 1] || enabled[enabled.indexOf(this)-1];
         | 
| 408 | 
            -
             | 
| 409 | 
            -
                  if (sibling) {
         | 
| 410 | 
            -
                    sibling.select();
         | 
| 411 | 
            -
                  }
         | 
| 412 | 
            -
                }
         | 
| 413 | 
            -
             | 
| 414 | 
            -
                // removing the tab out of the list
         | 
| 415 | 
            -
                this.main.tabs.splice(this.main.tabs.indexOf(this), 1);
         | 
| 416 | 
            -
                this.panel.remove();
         | 
| 417 | 
            -
             | 
| 418 | 
            -
                return this.$super().fire('remove');
         | 
| 419 | 
            -
              },
         | 
| 420 | 
            -
             | 
| 421 | 
            -
            // protected
         | 
| 422 | 
            -
             | 
| 423 | 
            -
              // handles the clicks on the tabs
         | 
| 424 | 
            -
              _clicked: function(event) {
         | 
| 425 | 
            -
                event.stop();
         | 
| 426 | 
            -
                return this.select();
         | 
| 427 | 
            -
              },
         | 
| 428 | 
            -
             | 
| 429 | 
            -
              // searches for a panel for the tab
         | 
| 430 | 
            -
              findPanel: function() {
         | 
| 431 | 
            -
                var main = this.main, panel_id = main.options.idPrefix + this.id, panel;
         | 
| 432 | 
            -
             | 
| 433 | 
            -
                if (main.isHarmonica) {
         | 
| 434 | 
            -
                  var next = this.next();
         | 
| 435 | 
            -
                  panel = (next && next._.tagName === 'DD') ? next : $E('DD').insertTo(this, 'after');
         | 
| 436 | 
            -
                } else {
         | 
| 437 | 
            -
                  panel = $(panel_id) || $E(main._.tagName === 'UL' ? 'LI' : 'DIV').insertTo(main);
         | 
| 438 | 
            -
                }
         | 
| 439 | 
            -
             | 
| 440 | 
            -
                return panel.set('id', panel_id);
         | 
| 441 | 
            -
              },
         | 
| 442 | 
            -
             | 
| 443 | 
            -
              // returns the tab width, used for the scrolling calculations
         | 
| 444 | 
            -
              width: function() {
         | 
| 445 | 
            -
                var next = this.next();
         | 
| 446 | 
            -
             | 
| 447 | 
            -
                if (next) {
         | 
| 448 | 
            -
                  return next.position().x - this.position().x;
         | 
| 449 | 
            -
                } else {
         | 
| 450 | 
            -
                  return this.size().x + 1;
         | 
| 451 | 
            -
                }
         | 
| 452 | 
            -
              }
         | 
| 453 | 
            -
             | 
| 454 | 
            -
            });
         | 
| 455 | 
            -
             | 
| 456 | 
            -
             | 
| 457 | 
            -
            /**
         | 
| 458 | 
            -
             * The tab panels behavior logic
         | 
| 459 | 
            -
             *
         | 
| 460 | 
            -
             * Copyright (C) 2009-2011 Nikolay Nemshilov
         | 
| 461 | 
            -
             */
         | 
| 462 | 
            -
            var Panel = Tabs.Panel = new Class(Element, {
         | 
| 463 | 
            -
             | 
| 464 | 
            -
              /**
         | 
| 465 | 
            -
               * Basic constructor
         | 
| 466 | 
            -
               *
         | 
| 467 | 
            -
               * @param Element panel-element
         | 
| 468 | 
            -
               * @param Tab the tab object
         | 
| 469 | 
            -
               * @return void
         | 
| 470 | 
            -
               */
         | 
| 471 | 
            -
              initialize: function(element, tab) {
         | 
| 472 | 
            -
                this.$super(element._);
         | 
| 473 | 
            -
                this.addClass('rui-tabs-panel');
         | 
| 474 | 
            -
             | 
| 475 | 
            -
                this.tab = tab;
         | 
| 476 | 
            -
                this.id  = this.get('id');
         | 
| 477 | 
            -
              },
         | 
| 478 | 
            -
             | 
| 479 | 
            -
              // shows the panel
         | 
| 480 | 
            -
              show: function() {
         | 
| 481 | 
            -
                return this.resizing(function() {
         | 
| 482 | 
            -
                  this.tab.main.find('.rui-tabs-panel').each(function(panel) {
         | 
| 483 | 
            -
                    panel[panel === this ? 'addClass' : 'removeClass']('rui-tabs-current');
         | 
| 484 | 
            -
                  }, this);
         | 
| 485 | 
            -
                });
         | 
| 486 | 
            -
              },
         | 
| 487 | 
            -
             | 
| 488 | 
            -
              // updates the panel content
         | 
| 489 | 
            -
              update: function(content) {
         | 
| 490 | 
            -
                // don't use resize if it's some other hidden tab was loaded asynch
         | 
| 491 | 
            -
                if (this.tab.current()) {
         | 
| 492 | 
            -
                  this.resizing(function() {
         | 
| 493 | 
            -
                    Element.prototype.update.call(this, content||'');
         | 
| 494 | 
            -
                  });
         | 
| 495 | 
            -
                } else {
         | 
| 496 | 
            -
                  this.$super(content||'');
         | 
| 497 | 
            -
                }
         | 
| 498 | 
            -
             | 
| 499 | 
            -
                return this;
         | 
| 500 | 
            -
              },
         | 
| 501 | 
            -
             | 
| 502 | 
            -
              // locks the panel with a spinner locker
         | 
| 503 | 
            -
              lock: function() {
         | 
| 504 | 
            -
                this.insert(this.locker(), 'top');
         | 
| 505 | 
            -
              },
         | 
| 506 | 
            -
             | 
| 507 | 
            -
            // protected
         | 
| 508 | 
            -
             | 
| 509 | 
            -
              resizing: function(callback) {
         | 
| 510 | 
            -
                var controller = this.tab.main;
         | 
| 511 | 
            -
             | 
| 512 | 
            -
                if (controller.__working) { return this.resizing.bind(this, callback).delay(100); }
         | 
| 513 | 
            -
             | 
| 514 | 
            -
                var options    = controller.options;
         | 
| 515 | 
            -
                var prev_panel = controller.first('.rui-tabs-panel.rui-tabs-current');
         | 
| 516 | 
            -
                var this_panel = this;
         | 
| 517 | 
            -
                var swapping   = prev_panel !== this_panel;
         | 
| 518 | 
            -
                var loading    = this.first('div.rui-tabs-panel-locker');
         | 
| 519 | 
            -
             | 
| 520 | 
            -
                // sometimes it looses the parent on remote tabs
         | 
| 521 | 
            -
                if (this_panel.parent().hasClass('rui-tabs-resizer')) {
         | 
| 522 | 
            -
                  this_panel.insertTo(prev_panel.parent());
         | 
| 523 | 
            -
                }
         | 
| 524 | 
            -
             | 
| 525 | 
            -
                if (options.resizeFx && RightJS.Fx && prev_panel && (swapping || loading)) {
         | 
| 526 | 
            -
                  controller.__working = true;
         | 
| 527 | 
            -
                  var unlock = function() { controller.__working = false; };
         | 
| 528 | 
            -
             | 
| 529 | 
            -
                  // calculating the visual effects durations
         | 
| 530 | 
            -
                  var fx_name  = (options.resizeFx === 'both' && loading) ? 'slide' : options.resizeFx;
         | 
| 531 | 
            -
                  var duration = options.resizeDuration; duration = Fx.Durations[duration] || duration;
         | 
| 532 | 
            -
                  var resize_duration = fx_name === 'fade' ? 0 : fx_name === 'slide' ? duration : duration / 2;
         | 
| 533 | 
            -
                  var fade_duration   = duration - resize_duration;
         | 
| 534 | 
            -
             | 
| 535 | 
            -
                  if (fx_name !== 'slide') {
         | 
| 536 | 
            -
                    this_panel.setStyle({opacity: 0});
         | 
| 537 | 
            -
                  }
         | 
| 538 | 
            -
             | 
| 539 | 
            -
                  // saving the previous sizes
         | 
| 540 | 
            -
                  var prev_panel_height = (controller.isHarmonica && swapping) ? 0 : prev_panel.size().y;
         | 
| 541 | 
            -
             | 
| 542 | 
            -
                  // applying the changes
         | 
| 543 | 
            -
                  callback.call(this);
         | 
| 544 | 
            -
             | 
| 545 | 
            -
                  // getting the new size
         | 
| 546 | 
            -
                  var new_panel_height  = this_panel.size().y;
         | 
| 547 | 
            -
                  var fx_wrapper = null;
         | 
| 548 | 
            -
                  var hide_wrapper = null;
         | 
| 549 | 
            -
                  var prev_back = null;
         | 
| 550 | 
            -
             | 
| 551 | 
            -
                  if (fx_name !== 'fade' && prev_panel_height !== new_panel_height) {
         | 
| 552 | 
            -
                    // preserving the whole element size so it didn't jump when we are tossing the tabs around
         | 
| 553 | 
            -
                    controller._.style.height = controller.size().y + 'px';
         | 
| 554 | 
            -
             | 
| 555 | 
            -
                    // wrapping the element with an overflowed element to visualize the resize
         | 
| 556 | 
            -
                    fx_wrapper = $E('div', {
         | 
| 557 | 
            -
                      'class': 'rui-tabs-resizer',
         | 
| 558 | 
            -
                      'style': 'height: '+ prev_panel_height + 'px'
         | 
| 559 | 
            -
                    });
         | 
| 560 | 
            -
             | 
| 561 | 
            -
                    // in case of harmonica nicely hidding the previous panel
         | 
| 562 | 
            -
                    if (controller.isHarmonica && swapping) {
         | 
| 563 | 
            -
                      prev_panel.addClass('rui-tabs-current');
         | 
| 564 | 
            -
                      hide_wrapper = $E('div', {'class': 'rui-tabs-resizer'});
         | 
| 565 | 
            -
                      hide_wrapper._.style.height = prev_panel.size().y + 'px';
         | 
| 566 | 
            -
                      prev_back = function() {
         | 
| 567 | 
            -
                        hide_wrapper.replace(prev_panel.removeClass('rui-tabs-current'));
         | 
| 568 | 
            -
                      };
         | 
| 569 | 
            -
                      prev_panel.wrap(hide_wrapper);
         | 
| 570 | 
            -
             | 
| 571 | 
            -
                      fx_wrapper._.style.height = '0px';
         | 
| 572 | 
            -
                    }
         | 
| 573 | 
            -
             | 
| 574 | 
            -
                    this_panel.wrap(fx_wrapper);
         | 
| 575 | 
            -
             | 
| 576 | 
            -
                    // getting back the auto-size so we could resize it
         | 
| 577 | 
            -
                    controller._.style.height = 'auto';
         | 
| 578 | 
            -
             | 
| 579 | 
            -
                  } else {
         | 
| 580 | 
            -
                    // removing the resize duration out of the equasion
         | 
| 581 | 
            -
                    rezise_duration = 0;
         | 
| 582 | 
            -
                    duration = fade_duration;
         | 
| 583 | 
            -
                  }
         | 
| 584 | 
            -
             | 
| 585 | 
            -
                  var counter = 0;
         | 
| 586 | 
            -
                  var set_back = function() {
         | 
| 587 | 
            -
                    if (fx_wrapper) {
         | 
| 588 | 
            -
                      if (fx_name == 'both' && !counter) {
         | 
| 589 | 
            -
                        return counter ++;
         | 
| 590 | 
            -
                      }
         | 
| 591 | 
            -
             | 
| 592 | 
            -
                      fx_wrapper.replace(this_panel);
         | 
| 593 | 
            -
                    }
         | 
| 594 | 
            -
             | 
| 595 | 
            -
                    unlock();
         | 
| 596 | 
            -
                  };
         | 
| 597 | 
            -
             | 
| 598 | 
            -
                  if (hide_wrapper) {
         | 
| 599 | 
            -
                    hide_wrapper.morph({height: '0px'},
         | 
| 600 | 
            -
                      {duration: resize_duration, onFinish: prev_back});
         | 
| 601 | 
            -
                  }
         | 
| 602 | 
            -
             | 
| 603 | 
            -
                  if (fx_wrapper) {
         | 
| 604 | 
            -
                    fx_wrapper.morph({height: new_panel_height + 'px'},
         | 
| 605 | 
            -
                      {duration: resize_duration, onFinish: set_back});
         | 
| 606 | 
            -
                  }
         | 
| 607 | 
            -
             | 
| 608 | 
            -
                  if (fx_name !== 'slide') {
         | 
| 609 | 
            -
                    this_panel.morph.bind(this_panel, {opacity: 1},
         | 
| 610 | 
            -
                      {duration: fade_duration, onFinish: set_back}
         | 
| 611 | 
            -
                        ).delay(resize_duration);
         | 
| 612 | 
            -
                  }
         | 
| 613 | 
            -
             | 
| 614 | 
            -
                  if (!fx_wrapper && fx_name === 'slide') {
         | 
| 615 | 
            -
                    set_back();
         | 
| 616 | 
            -
                  }
         | 
| 617 | 
            -
             | 
| 618 | 
            -
                } else {
         | 
| 619 | 
            -
                  callback.call(this);
         | 
| 620 | 
            -
                }
         | 
| 621 | 
            -
             | 
| 622 | 
            -
                return this;
         | 
| 623 | 
            -
              },
         | 
| 624 | 
            -
             | 
| 625 | 
            -
              // builds the locker element
         | 
| 626 | 
            -
              locker: function() {
         | 
| 627 | 
            -
                return this._locker || (this._locker =
         | 
| 628 | 
            -
                  $E('div', {'class': 'rui-tabs-panel-locker'}).insert(new Spinner(5))
         | 
| 629 | 
            -
                );
         | 
| 630 | 
            -
              }
         | 
| 631 | 
            -
            });
         | 
| 632 | 
            -
             | 
| 633 | 
            -
             | 
| 634 | 
            -
            /**
         | 
| 635 | 
            -
             * Contains the tabs scrolling functionality
         | 
| 636 | 
            -
             *
         | 
| 637 | 
            -
             * NOTE: different types of tabs have different scrolling behavior
         | 
| 638 | 
            -
             *       simple tabs just scroll the tabs line without actually picking
         | 
| 639 | 
            -
             *       any tab. But the carousel tabs scrolls to the next/previous
         | 
| 640 | 
            -
             *       tabs on the list.
         | 
| 641 | 
            -
             *
         | 
| 642 | 
            -
             * Copyright (C) 2009-2010 Nikolay Nemshilov
         | 
| 643 | 
            -
             */
         | 
| 644 | 
            -
            Tabs.include({
         | 
| 645 | 
            -
              /**
         | 
| 646 | 
            -
               * Shows the next tab
         | 
| 647 | 
            -
               *
         | 
| 648 | 
            -
               * @return Tabs this
         | 
| 649 | 
            -
               */
         | 
| 650 | 
            -
              next: function() {
         | 
| 651 | 
            -
                return this.pickTab(+1);
         | 
| 652 | 
            -
              },
         | 
| 653 | 
            -
             | 
| 654 | 
            -
              /**
         | 
| 655 | 
            -
               * Shows the preveious tab
         | 
| 656 | 
            -
               *
         | 
| 657 | 
            -
               * @return Tabs this
         | 
| 658 | 
            -
               */
         | 
| 659 | 
            -
              prev: function() {
         | 
| 660 | 
            -
                return this.pickTab(-1);
         | 
| 661 | 
            -
              },
         | 
| 662 | 
            -
             | 
| 663 | 
            -
              /**
         | 
| 664 | 
            -
               * Scrolls the tabs to the left
         | 
| 665 | 
            -
               *
         | 
| 666 | 
            -
               * @return Tabs this
         | 
| 667 | 
            -
               */
         | 
| 668 | 
            -
              scrollLeft: function() {
         | 
| 669 | 
            -
                if (!this.prevButton.hasClass('rui-tabs-scroller-disabled')) {
         | 
| 670 | 
            -
                  this[this.isCarousel ? 'prev' : 'justScroll'](+0.6);
         | 
| 671 | 
            -
                }
         | 
| 672 | 
            -
                return this;
         | 
| 673 | 
            -
              },
         | 
| 674 | 
            -
             | 
| 675 | 
            -
              /**
         | 
| 676 | 
            -
               * Scrolls the tabs to the right
         | 
| 677 | 
            -
               *
         | 
| 678 | 
            -
               * @return Tabs this
         | 
| 679 | 
            -
               */
         | 
| 680 | 
            -
              scrollRight: function() {
         | 
| 681 | 
            -
                if (!this.nextButton.hasClass('rui-tabs-scroller-disabled')) {
         | 
| 682 | 
            -
                  this[this.isCarousel ? 'next' : 'justScroll'](-0.6);
         | 
| 683 | 
            -
                }
         | 
| 684 | 
            -
                return this;
         | 
| 685 | 
            -
              },
         | 
| 686 | 
            -
             | 
| 687 | 
            -
            // protected
         | 
| 688 | 
            -
             | 
| 689 | 
            -
              // overloading the init script to add the scrollbar support
         | 
| 690 | 
            -
              initScrolls: function() {
         | 
| 691 | 
            -
                if ((this.scrollable = (this.options.scrollTabs || this.isCarousel))) {
         | 
| 692 | 
            -
                  this.buildScroller();
         | 
| 693 | 
            -
                }
         | 
| 694 | 
            -
             | 
| 695 | 
            -
                return this;
         | 
| 696 | 
            -
              },
         | 
| 697 | 
            -
             | 
| 698 | 
            -
              // builds the tabs scroller block
         | 
| 699 | 
            -
              buildScroller: function() {
         | 
| 700 | 
            -
                if (!(
         | 
| 701 | 
            -
                  (this.prevButton = this.first('.rui-tabs-scroller-prev')) &&
         | 
| 702 | 
            -
                  (this.nextButton = this.first('.rui-tabs-scroller-next'))
         | 
| 703 | 
            -
                )) {
         | 
| 704 | 
            -
                  this.prevButton = $E('div', {'class': 'rui-tabs-scroller-prev', 'html': '«'});
         | 
| 705 | 
            -
                  this.nextButton = $E('div', {'class': 'rui-tabs-scroller-next', 'html': '»'});
         | 
| 706 | 
            -
             | 
| 707 | 
            -
                  // using a dummy element to insert the scroller in place of the tabs list
         | 
| 708 | 
            -
                  $E('div').insertTo(this.tabsList, 'before')
         | 
| 709 | 
            -
                    .replace(
         | 
| 710 | 
            -
                      $E('div', {'class': 'rui-tabs-scroller'}).insert([
         | 
| 711 | 
            -
                        this.prevButton, this.nextButton, this.scroller = $E('div', {
         | 
| 712 | 
            -
                          'class': 'rui-tabs-scroller-body'
         | 
| 713 | 
            -
                        }).insert(this.tabsList)
         | 
| 714 | 
            -
                      ])
         | 
| 715 | 
            -
                    ).remove();
         | 
| 716 | 
            -
                }
         | 
| 717 | 
            -
             | 
| 718 | 
            -
                this.prevButton.onClick(R(this.scrollLeft).bind(this));
         | 
| 719 | 
            -
                this.nextButton.onClick(R(this.scrollRight).bind(this));
         | 
| 720 | 
            -
              },
         | 
| 721 | 
            -
             | 
| 722 | 
            -
              // picks the next/prev non-disabled available tab
         | 
| 723 | 
            -
              pickTab: function(pos) {
         | 
| 724 | 
            -
                var current = this.current();
         | 
| 725 | 
            -
                if (current && current.enabled()) {
         | 
| 726 | 
            -
                  var enabled_tabs = this.enabled();
         | 
| 727 | 
            -
                  var tab = enabled_tabs[enabled_tabs.indexOf(current) + pos];
         | 
| 728 | 
            -
                  if (tab) { tab.select(); }
         | 
| 729 | 
            -
                }
         | 
| 730 | 
            -
              },
         | 
| 731 | 
            -
             | 
| 732 | 
            -
              // scrolls the tabs line to make the tab visible
         | 
| 733 | 
            -
              scrollToTab: function(tab) {
         | 
| 734 | 
            -
                if (this.scroller) {
         | 
| 735 | 
            -
                  // calculating the previous tabs widths
         | 
| 736 | 
            -
                  var tabs_width      = 0;
         | 
| 737 | 
            -
                  for (var i=0; i < this.tabs.length; i++) {
         | 
| 738 | 
            -
                    tabs_width += this.tabs[i].width();
         | 
| 739 | 
            -
                    if (this.tabs[i] === tab) { break; }
         | 
| 740 | 
            -
                  }
         | 
| 741 | 
            -
             | 
| 742 | 
            -
                  // calculating the scroll (the carousel tabs should be centralized)
         | 
| 743 | 
            -
                  var available_width = this.scroller.size().x;
         | 
| 744 | 
            -
                  var scroll = (this.isCarousel ? (available_width/2 + tab.width()/2) : available_width) - tabs_width;
         | 
| 745 | 
            -
             | 
| 746 | 
            -
                  // check if the tab doesn't need to be scrolled
         | 
| 747 | 
            -
                  if (!this.isCarousel) {
         | 
| 748 | 
            -
                    var current_scroll  = parseInt(this.tabsList.getStyle('left') || 0, 10);
         | 
| 749 | 
            -
             | 
| 750 | 
            -
                    if (scroll >= current_scroll && scroll < (current_scroll + available_width - tab.width())) {
         | 
| 751 | 
            -
                      scroll = current_scroll;
         | 
| 752 | 
            -
                    } else if (current_scroll > -tabs_width && current_scroll <= (tab.width() - tabs_width)) {
         | 
| 753 | 
            -
                      scroll = tab.width() - tabs_width;
         | 
| 754 | 
            -
                    }
         | 
| 755 | 
            -
                  }
         | 
| 756 | 
            -
             | 
| 757 | 
            -
                  this.scrollTo(scroll);
         | 
| 758 | 
            -
                }
         | 
| 759 | 
            -
              },
         | 
| 760 | 
            -
             | 
| 761 | 
            -
              // just scrolls the scrollable area onto the given number of scrollable area widths
         | 
| 762 | 
            -
              justScroll: function(size) {
         | 
| 763 | 
            -
                if (!this.scroller) { return this; }
         | 
| 764 | 
            -
                var current_scroll  = parseInt(this.tabsList.getStyle('left') || 0, 10);
         | 
| 765 | 
            -
                var available_width = this.scroller.size().x;
         | 
| 766 | 
            -
             | 
| 767 | 
            -
                this.scrollTo(current_scroll + available_width * size);
         | 
| 768 | 
            -
              },
         | 
| 769 | 
            -
             | 
| 770 | 
            -
              // scrolls the tabs list to the position
         | 
| 771 | 
            -
              scrollTo: function(scroll) {
         | 
| 772 | 
            -
                // checking the constraints
         | 
| 773 | 
            -
                var available_width = this.scroller.size().x;
         | 
| 774 | 
            -
                var overall_width   = this.tabs.map('width').sum();
         | 
| 775 | 
            -
             | 
| 776 | 
            -
                if (scroll < (available_width - overall_width)) {
         | 
| 777 | 
            -
                  scroll = available_width - overall_width;
         | 
| 778 | 
            -
                }
         | 
| 779 | 
            -
                if (scroll > 0) { scroll = 0; }
         | 
| 780 | 
            -
             | 
| 781 | 
            -
                // applying the scroll
         | 
| 782 | 
            -
                this.tabsList.morph({left: scroll+'px'}, {duration: this.options.scrollDuration});
         | 
| 783 | 
            -
             | 
| 784 | 
            -
                this.checkScrollButtons(overall_width, available_width, scroll);
         | 
| 785 | 
            -
              },
         | 
| 786 | 
            -
             | 
| 787 | 
            -
              // checks the scroll buttons
         | 
| 788 | 
            -
              checkScrollButtons: function(overall_width, available_width, scroll) {
         | 
| 789 | 
            -
                var has_prev = false, has_next = false;
         | 
| 790 | 
            -
             | 
| 791 | 
            -
                if (this.isCarousel) {
         | 
| 792 | 
            -
                  var enabled = this.enabled();
         | 
| 793 | 
            -
                  var current = enabled.first('current');
         | 
| 794 | 
            -
             | 
| 795 | 
            -
                  if (current) {
         | 
| 796 | 
            -
                    var index = enabled.indexOf(current);
         | 
| 797 | 
            -
             | 
| 798 | 
            -
                    has_prev = index > 0;
         | 
| 799 | 
            -
                    has_next = index < enabled.length - 1;
         | 
| 800 | 
            -
                  }
         | 
| 801 | 
            -
                } else {
         | 
| 802 | 
            -
                  has_prev = scroll !== 0;
         | 
| 803 | 
            -
                  has_next = scroll > (available_width - overall_width);
         | 
| 804 | 
            -
                }
         | 
| 805 | 
            -
             | 
| 806 | 
            -
                this.prevButton[has_prev ? 'removeClass' : 'addClass']('rui-tabs-scroller-disabled');
         | 
| 807 | 
            -
                this.nextButton[has_next ? 'removeClass' : 'addClass']('rui-tabs-scroller-disabled');
         | 
| 808 | 
            -
              }
         | 
| 809 | 
            -
             | 
| 810 | 
            -
            });
         | 
| 811 | 
            -
             | 
| 812 | 
            -
             | 
| 813 | 
            -
            /**
         | 
| 814 | 
            -
             * This module handles the current tab state saving/restoring processes
         | 
| 815 | 
            -
             *
         | 
| 816 | 
            -
             * Copyright (C) 2009-2010 Nikolay Nemshilov
         | 
| 817 | 
            -
             */
         | 
| 818 | 
            -
            function get_cookie_indexes() {
         | 
| 819 | 
            -
              return R(RightJS.Cookie ? (Cookie.get('right-tabs-indexes') || '').split(',') : []);
         | 
| 820 | 
            -
            }
         | 
| 821 | 
            -
             | 
| 822 | 
            -
            function save_tab_in_cookies(options, tabs, event) {
         | 
| 823 | 
            -
              if (RightJS.Cookie) {
         | 
| 824 | 
            -
                var indexes = get_cookie_indexes();
         | 
| 825 | 
            -
                indexes = indexes.without.apply(indexes, tabs.map('id'));
         | 
| 826 | 
            -
                indexes.push(event.target.id);
         | 
| 827 | 
            -
                Cookie.set('right-tabs-indexes', indexes.uniq().join(','), options);
         | 
| 828 | 
            -
              }
         | 
| 829 | 
            -
            }
         | 
| 830 | 
            -
             | 
| 831 | 
            -
            Tabs.include({
         | 
| 832 | 
            -
             | 
| 833 | 
            -
            // protected
         | 
| 834 | 
            -
             | 
| 835 | 
            -
              // searches and activates the current tab
         | 
| 836 | 
            -
              findCurrent: function() {
         | 
| 837 | 
            -
                var enabled = this.enabled(), current = (
         | 
| 838 | 
            -
                  this.tabs[this.options.selected] ||
         | 
| 839 | 
            -
                  this.tabs[this.urlIndex()]       ||
         | 
| 840 | 
            -
                  this.tabs[this.cookieIndex()]    ||
         | 
| 841 | 
            -
                  enabled.first('current')         ||
         | 
| 842 | 
            -
                  enabled[0]
         | 
| 843 | 
            -
                );
         | 
| 844 | 
            -
             | 
| 845 | 
            -
                if (current) {
         | 
| 846 | 
            -
                  current.select();
         | 
| 847 | 
            -
                }
         | 
| 848 | 
            -
             | 
| 849 | 
            -
                // initializing the cookies storage if set
         | 
| 850 | 
            -
                if (this.options.Cookie) {
         | 
| 851 | 
            -
                  this.onSelect(R(save_tab_in_cookies).curry(this.options.Cookie, this.tabs));
         | 
| 852 | 
            -
                }
         | 
| 853 | 
            -
             | 
| 854 | 
            -
                return this;
         | 
| 855 | 
            -
              },
         | 
| 856 | 
            -
             | 
| 857 | 
            -
              // tries to find the current tab index in the url hash
         | 
| 858 | 
            -
              urlIndex: function() {
         | 
| 859 | 
            -
                var index = -1, id = document.location.href.split('#')[1];
         | 
| 860 | 
            -
             | 
| 861 | 
            -
                if (id) {
         | 
| 862 | 
            -
                  for (var i=0; i < this.tabs.length; i++) {
         | 
| 863 | 
            -
                    if (this.tabs[i].id == id) {
         | 
| 864 | 
            -
                      index = i;
         | 
| 865 | 
            -
                      break;
         | 
| 866 | 
            -
                    }
         | 
| 867 | 
            -
                  }
         | 
| 868 | 
            -
                }
         | 
| 869 | 
            -
             | 
| 870 | 
            -
                return index;
         | 
| 871 | 
            -
              },
         | 
| 872 | 
            -
             | 
| 873 | 
            -
              // tries to find the current tab index in the cookies storage
         | 
| 874 | 
            -
              cookieIndex: function() {
         | 
| 875 | 
            -
                var index = -1;
         | 
| 876 | 
            -
             | 
| 877 | 
            -
                if (this.options.Cookie) {
         | 
| 878 | 
            -
                  var indexes = get_cookie_indexes();
         | 
| 879 | 
            -
                  for (var i=0; i < this.tabs.length; i++) {
         | 
| 880 | 
            -
                    if (indexes.include(this.tabs[i].id)) {
         | 
| 881 | 
            -
                      index = i;
         | 
| 882 | 
            -
                      break;
         | 
| 883 | 
            -
                    }
         | 
| 884 | 
            -
                  }
         | 
| 885 | 
            -
                }
         | 
| 886 | 
            -
             | 
| 887 | 
            -
                return index;
         | 
| 888 | 
            -
              }
         | 
| 889 | 
            -
             | 
| 890 | 
            -
            });
         | 
| 891 | 
            -
             | 
| 892 | 
            -
             | 
| 893 | 
            -
            /**
         | 
| 894 | 
            -
             * This module handles the tabs cration and removing processes
         | 
| 895 | 
            -
             *
         | 
| 896 | 
            -
             * Copyright (C) 2009-2010 Nikolay Nemshilov
         | 
| 897 | 
            -
             */
         | 
| 898 | 
            -
            Tabs.include({
         | 
| 899 | 
            -
              /**
         | 
| 900 | 
            -
               * Creates a new tab
         | 
| 901 | 
            -
               *
         | 
| 902 | 
            -
               * USAGE:
         | 
| 903 | 
            -
               *   With the #add method you have to specify the tab title
         | 
| 904 | 
            -
               *   optional content (possibly empty or null) and some options
         | 
| 905 | 
            -
               *   The options might have the following keys
         | 
| 906 | 
            -
               *
         | 
| 907 | 
            -
               *     * id - the tab/panel id (will use the idPrefix option for the panels)
         | 
| 908 | 
            -
               *     * url - a remote tab content address
         | 
| 909 | 
            -
               *     * position - an integer position of the tab in the stack
         | 
| 910 | 
            -
               *
         | 
| 911 | 
            -
               * @param String title
         | 
| 912 | 
            -
               * @param mixed content
         | 
| 913 | 
            -
               * @param Object options
         | 
| 914 | 
            -
               * @return Tabs this
         | 
| 915 | 
            -
               */
         | 
| 916 | 
            -
              add: function(title, content, options) {
         | 
| 917 | 
            -
                options = options || {};
         | 
| 918 | 
            -
             | 
| 919 | 
            -
                // creating the new tab element
         | 
| 920 | 
            -
                var element = $E(this.isHarmonica ? 'dt' : 'li').insert(
         | 
| 921 | 
            -
                  $E('a', {html: title, href: options.url || '#'+(options.id||'')}
         | 
| 922 | 
            -
                )).insertTo(this.tabsList);
         | 
| 923 | 
            -
             | 
| 924 | 
            -
                // creating the actual tab instance
         | 
| 925 | 
            -
                var tab = new Tab(element, this);
         | 
| 926 | 
            -
                tab.panel.update(content||'');
         | 
| 927 | 
            -
                this.tabs.push(tab);
         | 
| 928 | 
            -
                tab.fire('add');
         | 
| 929 | 
            -
             | 
| 930 | 
            -
                // moving the tab in place if asked
         | 
| 931 | 
            -
                if ('position' in options) {
         | 
| 932 | 
            -
                  this.move(tab, options.position);
         | 
| 933 | 
            -
                }
         | 
| 934 | 
            -
             | 
| 935 | 
            -
                return this;
         | 
| 936 | 
            -
              },
         | 
| 937 | 
            -
             | 
| 938 | 
            -
              /**
         | 
| 939 | 
            -
               * Moves the given tab to the given position
         | 
| 940 | 
            -
               *
         | 
| 941 | 
            -
               * NOTE if the position is not within the tabs range then it will do nothing
         | 
| 942 | 
            -
               *
         | 
| 943 | 
            -
               * @param mixed tab index or a tab instance
         | 
| 944 | 
            -
               * @param Integer position
         | 
| 945 | 
            -
               * @return Tabs this
         | 
| 946 | 
            -
               */
         | 
| 947 | 
            -
              move: function(tab, position) {
         | 
| 948 | 
            -
                tab = this.tabs[tab] || tab;
         | 
| 949 | 
            -
             | 
| 950 | 
            -
                if (this.tabs[position] && this.tabs[position] !== tab) {
         | 
| 951 | 
            -
                  // moving the tab element
         | 
| 952 | 
            -
                  this.tabs[position].insert(tab, (position === this.tabs.length-1) ? 'after' : 'before');
         | 
| 953 | 
            -
             | 
| 954 | 
            -
                  // inserting the panel after the tab if it's a harmonica
         | 
| 955 | 
            -
                  if (this.isHarmonica) {
         | 
| 956 | 
            -
                    tab.insert(tab.panel, 'after');
         | 
| 957 | 
            -
                  }
         | 
| 958 | 
            -
             | 
| 959 | 
            -
                  // moving the tab in the registry
         | 
| 960 | 
            -
                  this.tabs.splice(this.tabs.indexOf(tab), 1);
         | 
| 961 | 
            -
                  this.tabs.splice(position, 0, tab);
         | 
| 962 | 
            -
             | 
| 963 | 
            -
                  tab.fire('move', {index: position});
         | 
| 964 | 
            -
                }
         | 
| 965 | 
            -
             | 
| 966 | 
            -
                return this;
         | 
| 967 | 
            -
              },
         | 
| 968 | 
            -
             | 
| 969 | 
            -
              /**
         | 
| 970 | 
            -
               * Removes the given tab
         | 
| 971 | 
            -
               *
         | 
| 972 | 
            -
               * @param integer tab index or a Tabs.Tab instance or a list of them
         | 
| 973 | 
            -
               * @return Tabs this
         | 
| 974 | 
            -
               */
         | 
| 975 | 
            -
              remove: function(tab) {
         | 
| 976 | 
            -
                return this.callTab(tab, 'remove');
         | 
| 977 | 
            -
              }
         | 
| 978 | 
            -
             | 
| 979 | 
            -
            });
         | 
| 980 | 
            -
             | 
| 981 | 
            -
             | 
| 982 | 
            -
            /**
         | 
| 983 | 
            -
             * This module contains the remote tabs loading logic
         | 
| 984 | 
            -
             *
         | 
| 985 | 
            -
             * Copyright (C) 2009-2010 Nikolay Nemshilov
         | 
| 986 | 
            -
             */
         | 
| 987 | 
            -
            var old_select = Tab.prototype.select;
         | 
| 988 | 
            -
             | 
| 989 | 
            -
            Tab.include({
         | 
| 990 | 
            -
             | 
| 991 | 
            -
              // wrapping the original mehtod, to catch the remote requests
         | 
| 992 | 
            -
              select: function() {
         | 
| 993 | 
            -
                if (this.dogPiling(arguments)) { return this; }
         | 
| 994 | 
            -
             | 
| 995 | 
            -
                var result  = old_select.apply(this, arguments);
         | 
| 996 | 
            -
                var url     = R(this.link.get('href'));
         | 
| 997 | 
            -
                var options = this.main.options;
         | 
| 998 | 
            -
             | 
| 999 | 
            -
                // building the url
         | 
| 1000 | 
            -
                if (url.includes('#')) {
         | 
| 1001 | 
            -
                  url = options.url ? options.url.replace('%{id}', url.split('#')[1]) : null;
         | 
| 1002 | 
            -
                }
         | 
| 1003 | 
            -
             | 
| 1004 | 
            -
                // if there is an actual url and no ongoing request or a cache, starting the request
         | 
| 1005 | 
            -
                if (url && !this.request && !(options.cache || this.cache)) {
         | 
| 1006 | 
            -
                  this.panel.lock();
         | 
| 1007 | 
            -
             | 
| 1008 | 
            -
                  try { // basically that's for the development tests, so the IE browsers didn't get screwed on the test page
         | 
| 1009 | 
            -
             | 
| 1010 | 
            -
                    this.request = new RightJS.Xhr(url, Object.merge({method: 'get'}, options.Xhr))
         | 
| 1011 | 
            -
                      .onComplete(R(function(response) {
         | 
| 1012 | 
            -
                        if (this.main.__working) {
         | 
| 1013 | 
            -
                          return arguments.callee.bind(this, response).delay(100);
         | 
| 1014 | 
            -
                        }
         | 
| 1015 | 
            -
             | 
| 1016 | 
            -
                        this.panel.update(response.text);
         | 
| 1017 | 
            -
             | 
| 1018 | 
            -
                        this.request = null; // removing the request marker so it could be rerun
         | 
| 1019 | 
            -
                        if (options.cache) {
         | 
| 1020 | 
            -
                          this.cache = true;
         | 
| 1021 | 
            -
                        }
         | 
| 1022 | 
            -
             | 
| 1023 | 
            -
                        this.fire('load');
         | 
| 1024 | 
            -
                      }).bind(this)
         | 
| 1025 | 
            -
                    ).send();
         | 
| 1026 | 
            -
             | 
| 1027 | 
            -
                  } catch(e) { if (!Browser.OLD) { throw(e); } }
         | 
| 1028 | 
            -
                }
         | 
| 1029 | 
            -
             | 
| 1030 | 
            -
                return result;
         | 
| 1031 | 
            -
              },
         | 
| 1032 | 
            -
             | 
| 1033 | 
            -
            // protected
         | 
| 1034 | 
            -
             | 
| 1035 | 
            -
              dogPiling: function(args) {
         | 
| 1036 | 
            -
                if (this.main.__working) {
         | 
| 1037 | 
            -
                  if (this.main.__timeout) {
         | 
| 1038 | 
            -
                    this.main.__timeout.cancel();
         | 
| 1039 | 
            -
                  }
         | 
| 1040 | 
            -
             | 
| 1041 | 
            -
                  this.main.__timeout = R(function(args) {
         | 
| 1042 | 
            -
                    this.select.apply(this, args);
         | 
| 1043 | 
            -
                  }).bind(this, args).delay(100);
         | 
| 1044 | 
            -
             | 
| 1045 | 
            -
                  return true;
         | 
| 1046 | 
            -
                }
         | 
| 1047 | 
            -
             | 
| 1048 | 
            -
                return (this.main.__timeout = null);
         | 
| 1049 | 
            -
              }
         | 
| 1050 | 
            -
             | 
| 1051 | 
            -
            });
         | 
| 1052 | 
            -
             | 
| 1053 | 
            -
             | 
| 1054 | 
            -
            /**
         | 
| 1055 | 
            -
             * This module handles the slide-show loop feature for the Tabs
         | 
| 1056 | 
            -
             *
         | 
| 1057 | 
            -
             * Copyright (C) 2009-2010 Nikolay Nemshilov
         | 
| 1058 | 
            -
             */
         | 
| 1059 | 
            -
            Tabs.include({
         | 
| 1060 | 
            -
             | 
| 1061 | 
            -
              /**
         | 
| 1062 | 
            -
               * Starts the slideshow loop
         | 
| 1063 | 
            -
               *
         | 
| 1064 | 
            -
               * @param Number optional delay in ms
         | 
| 1065 | 
            -
               * @return Tabs this
         | 
| 1066 | 
            -
               */
         | 
| 1067 | 
            -
              startLoop: function(delay) {
         | 
| 1068 | 
            -
                if (!delay && !this.options.loop) { return this; }
         | 
| 1069 | 
            -
             | 
| 1070 | 
            -
                // attaching the loop pause feature
         | 
| 1071 | 
            -
                if (this.options.loopPause) {
         | 
| 1072 | 
            -
                  this._stopLoop  = this._stopLoop  || R(this.stopLoop).bind(this, true);
         | 
| 1073 | 
            -
                  this._startLoop = this._startLoop || R(this.startLoop).bind(this, delay);
         | 
| 1074 | 
            -
             | 
| 1075 | 
            -
                  this.forgetHovers().on({
         | 
| 1076 | 
            -
                    mouseover: this._stopLoop,
         | 
| 1077 | 
            -
                    mouseout:  this._startLoop
         | 
| 1078 | 
            -
                  });
         | 
| 1079 | 
            -
                }
         | 
| 1080 | 
            -
             | 
| 1081 | 
            -
                if (this.timer) { this.timer.stop(); }
         | 
| 1082 | 
            -
             | 
| 1083 | 
            -
                this.timer = R(function() {
         | 
| 1084 | 
            -
                  var enabled = this.enabled();
         | 
| 1085 | 
            -
                  var current = this.current();
         | 
| 1086 | 
            -
                  var next    = enabled[enabled.indexOf(current)+1];
         | 
| 1087 | 
            -
             | 
| 1088 | 
            -
                  this.select(next || enabled.first());
         | 
| 1089 | 
            -
             | 
| 1090 | 
            -
                }).bind(this).periodical(this.options.loop || delay);
         | 
| 1091 | 
            -
             | 
| 1092 | 
            -
                return this;
         | 
| 1093 | 
            -
              },
         | 
| 1094 | 
            -
             | 
| 1095 | 
            -
              /**
         | 
| 1096 | 
            -
               * Stops the slideshow loop
         | 
| 1097 | 
            -
               *
         | 
| 1098 | 
            -
               * @return Tabs this
         | 
| 1099 | 
            -
               */
         | 
| 1100 | 
            -
              stopLoop: function(event, pause) {
         | 
| 1101 | 
            -
                if (this.timer) {
         | 
| 1102 | 
            -
                  this.timer.stop();
         | 
| 1103 | 
            -
                  this.timer = null;
         | 
| 1104 | 
            -
                }
         | 
| 1105 | 
            -
                if (!pause && this._startLoop) {
         | 
| 1106 | 
            -
                  this.forgetHovers();
         | 
| 1107 | 
            -
                }
         | 
| 1108 | 
            -
              },
         | 
| 1109 | 
            -
             | 
| 1110 | 
            -
            // private
         | 
| 1111 | 
            -
              forgetHovers: function() {
         | 
| 1112 | 
            -
                return this
         | 
| 1113 | 
            -
                  .stopObserving('mouseover', this._stopLoop)
         | 
| 1114 | 
            -
                  .stopObserving('mouseout', this._startLoop);
         | 
| 1115 | 
            -
              }
         | 
| 1116 | 
            -
             | 
| 1117 | 
            -
             | 
| 1118 | 
            -
            });
         | 
| 1119 | 
            -
             | 
| 1120 | 
            -
             | 
| 1121 | 
            -
            /**
         | 
| 1122 | 
            -
             * The document level hooks for the tabs-egnine
         | 
| 1123 | 
            -
             *
         | 
| 1124 | 
            -
             * Copyright (C) 2009-2010 Nikolay Nemshilov
         | 
| 1125 | 
            -
             */
         | 
| 1126 | 
            -
            $(document).onReady(function() {
         | 
| 1127 | 
            -
              Tabs.rescan();
         | 
| 1128 | 
            -
            });
         | 
| 1129 | 
            -
            (function() {
         | 
| 1130 | 
            -
                    var style = document.createElement('style'),
         | 
| 1131 | 
            -
                        rules = document.createTextNode("div.rui-spinner,div.rui-spinner div{margin:0;padding:0;border:none;background:none;list-style:none;font-weight:normal;float:none;display:inline-block; *display:inline; *zoom:1;border-radius:.12em;-moz-border-radius:.12em;-webkit-border-radius:.12em}div.rui-spinner{text-align:center;white-space:nowrap;background:#EEE;border:1px solid #DDD;height:1.2em;padding:0 .2em}div.rui-spinner div{width:.4em;height:70%;background:#BBB;margin-left:1px}div.rui-spinner div:first-child{margin-left:0}div.rui-spinner div.glowing{background:#777}.rui-tabs,.rui-tabs-list,.rui-tabs-tab,.rui-tabs-panel,.rui-tabs-scroll-left,.rui-tabs-scroll-right,.rui-tabs-scroll-body,.rui-tabs-panel-locker,.rui-tabs-resizer{margin:0;padding:0;background:none;border:none;list-style:none;display:block;width:auto;height:auto}.rui-tabs{display:block;visibility:hidden;border-bottom:1px solid #CCC}.rui-tabs-resizer{overflow:hidden}.rui-tabs-list{display:block;position:relative;padding:0 .5em;border-bottom:1px solid #CCC;white-space:nowrap}.rui-tabs-list .rui-tabs-tab,.rui-tabs-tab *,.rui-tabs-tab *:hover{display:inline-block; *display:inline; *zoom:1;cursor:pointer;text-decoration:none;vertical-align:center}.rui-tabs-list .rui-tabs-tab{vertical-align:bottom;margin-right:.1em}.rui-tabs-tab a{outline:none;position:relative;border:1px solid #CCC;background:#DDD;color:#444;padding:.3em 1em;border-radius:.3em;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0}.rui-tabs-tab a:hover{border-color:#CCC;background:#EEE}.rui-tabs-list .rui-tabs-current a,.rui-tabs-list .rui-tabs-current a:hover{font-weight:bold;color:#000;background:#FFF;border-bottom:1px solid #FFF;border-top-width:2px;padding-top:.34em;padding-bottom:.34em;top:1px}.rui-tabs-tab a img{border:none;opacity:.6;filter:alpha(opacity=60)}.rui-tabs-tab a:hover img,.rui-tabs-list .rui-tabs-current a img{opacity:1;filter:alpha(opacity=100)}.rui-tabs-disabled a,.rui-tabs-disabled a:hover{background:#EEE;border-color:#DDD;color:#AAA;cursor:default}.rui-tabs-disabled a img,.rui-tabs-disabled a:hover img{opacity:.5;filter:alpha(opacity=50)}.rui-tabs-tab-close-icon{display:inline-block; *display:inline; *zoom:1;margin-right:-0.5em;margin-left:0.5em;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}.rui-tabs-tab-close-icon:hover{opacity:1;filter:alpha(opacity=100);color:#B00;text-shadow:#888 .15em .15em .2em}.rui-tabs-panel{display:none;position:relative;min-height:4em;padding:.5em 0}.rui-tabs-current{display:block}.rui-tabs-scroller{position:relative;padding:0 1.4em}.rui-tabs-scroller-prev,.rui-tabs-scroller-next{width:1.1em;text-align:center;background:#EEE;color:#666;cursor:pointer;border:1px solid #CCC;border-radius:.2em;-moz-border-radius:.2em;-webkit-border-radius:.2em;position:absolute;bottom:0px;left:0px;padding:0.3em 0;user-select:none;-moz-user-select:none;-webkit-user-select:none}.rui-tabs-scroller-prev:hover,.rui-tabs-scroller-next:hover{color:#000;background:#DDD;border-color:#AAA}.rui-tabs-scroller-prev:active,.rui-tabs-scroller-next:active{background:#eee;border-color:#ccc}.rui-tabs-scroller-next{left:auto;right:0px}.rui-tabs-scroller-disabled,.rui-tabs-scroller-disabled:hover{cursor:default;background:#DDD;border-color:#DDD;color:#AAA}.rui-tabs-scroller-body{overflow:hidden;width:100%;position:relative}.rui-tabs-scroller .rui-tabs-list{padding-left:0;padding-right:0;width:9999em;z-index:10}.rui-tabs-panel-locker{position:absolute;top:0px;left:0px;opacity:0.5;filter:alpha(opacity=50);background:#CCC;width:100%;height:100%;text-align:center}.rui-tabs-panel-locker .rui-spinner{position:absolute;left:44%;top:44%;background:none;border:none;height:2em}.rui-tabs-panel-locker .rui-spinner div{background:#666;width:.65em;margin-left:.15em}.rui-tabs-panel-locker .rui-spinner div.glowing{background:#000}.rui-tabs-carousel .rui-tabs-list{border:none}.rui-tabs-carousel .rui-tabs-tab a,.rui-tabs-carousel .rui-tabs-scroller .rui-tabs-scroller-prev,.rui-tabs-carousel .rui-tabs-scroller .rui-tabs-scroller-next{height:6em;line-height:6em;padding:0;border-bottom:1px solid #ccc;border-radius:.25em;-moz-border-radius:.25em;-webkit-border-radius:.25em}.rui-tabs-carousel .rui-tabs-tab{margin-right:3px}.rui-tabs-carousel .rui-tabs-tab a img{border:1px solid #CCC;vertical-align:middle;margin:.4em;padding:0;border-radius:0;-moz-border-radius:0;-webkit-border-radius:0}.rui-tabs-carousel .rui-tabs-list .rui-tabs-current a{border-width:1px;border-color:#AAA;padding:0;top:auto}.rui-tabs-carousel .rui-tabs-list .rui-tabs-current a img{border-color:#bbb}.rui-tabs-carousel .rui-tabs-panel{text-align:center}dl.rui-tabs{border:none}dt.rui-tabs-tab,dt.rui-tabs-tab a,dt.rui-tabs-tab a:hover{display:block;float:none}dt.rui-tabs-tab a,dt.rui-tabs-tab a:hover{padding:.2em 1em;border:1px solid #ccc;border-radius:.25em;-moz-border-radius:.3em;-webkit-border-radius:.3em}dl.rui-tabs dt.rui-tabs-current a{background:#EEE;border-bottom-left-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0}dl.rui-tabs dd.rui-tabs-current+dt.rui-tabs-tab a{border-top-left-radius:0;border-top-right-radius:0;-moz-border-radius-topleft:0;-moz-border-radius-topright:0;-webkit-border-top-left-radius:0;-webkit-border-top-right-radius:0}");
         | 
| 1132 | 
            -
             | 
| 1133 | 
            -
                    style.type = 'text/css';
         | 
| 1134 | 
            -
             | 
| 1135 | 
            -
                    if(style.styleSheet) {
         | 
| 1136 | 
            -
                      style.styleSheet.cssText = rules.nodeValue;
         | 
| 1137 | 
            -
                    } else {
         | 
| 1138 | 
            -
                      style.appendChild(rules);
         | 
| 1139 | 
            -
                    }
         | 
| 1140 | 
            -
             | 
| 1141 | 
            -
                    document.getElementsByTagName('head')[0].appendChild(style);
         | 
| 1142 | 
            -
                  })();
         | 
| 1143 | 
            -
             | 
| 1144 | 
            -
            return Tabs;
         | 
| 1145 | 
            -
            })(document, parseInt, RightJS);
         |