diff options
Diffstat (limited to 'public/javascripts')
| -rw-r--r-- | public/javascripts/admin.coffee | 10 | ||||
| -rw-r--r-- | public/javascripts/admin.js | 14 | ||||
| -rw-r--r-- | public/javascripts/controls.js | 965 | ||||
| -rw-r--r-- | public/javascripts/dragdrop.js | 974 | ||||
| -rw-r--r-- | public/javascripts/effects.js | 1123 | ||||
| -rw-r--r-- | public/javascripts/excanvas.min.js | 1 | ||||
| -rw-r--r-- | public/javascripts/jquery.flot.axislabels.js | 451 | ||||
| -rw-r--r-- | public/javascripts/jquery.flot.errorbars.min.js | 63 | ||||
| -rw-r--r-- | public/javascripts/jquery.flot.min.js | 29 | ||||
| -rw-r--r-- | public/javascripts/jquery_ujs.js | 393 | ||||
| -rw-r--r-- | public/javascripts/prototype.js | 6001 | ||||
| -rw-r--r-- | public/javascripts/rails.js | 202 | ||||
| -rw-r--r-- | public/javascripts/stats-graphs.js | 87 | 
13 files changed, 1024 insertions, 9289 deletions
diff --git a/public/javascripts/admin.coffee b/public/javascripts/admin.coffee deleted file mode 100644 index 59c5c0a6f..000000000 --- a/public/javascripts/admin.coffee +++ /dev/null @@ -1,10 +0,0 @@ -(($) -> -  $(document).ready(-> -    $('.locales a:first').tab('show') -  ) -  $('.toggle-hidden').live('click', -> -    $(@).parents('td').find('div:hidden').show() -    false -  ) -)(jQuery) - diff --git a/public/javascripts/admin.js b/public/javascripts/admin.js deleted file mode 100644 index 21725ded4..000000000 --- a/public/javascripts/admin.js +++ /dev/null @@ -1,14 +0,0 @@ -// Generated by CoffeeScript 1.3.1 -(function() { - -  (function($) { -    $(document).ready(function() { -      return $('.locales a:first').tab('show'); -    }); -    return $('.toggle-hidden').live('click', function() { -      $(this).parents('td').find('div:hidden').show(); -      return false; -    }); -  })(jQuery); - -}).call(this); diff --git a/public/javascripts/controls.js b/public/javascripts/controls.js deleted file mode 100644 index 7392fb664..000000000 --- a/public/javascripts/controls.js +++ /dev/null @@ -1,965 +0,0 @@ -// script.aculo.us controls.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 - -// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -//           (c) 2005-2009 Ivan Krstic (http://blogs.law.harvard.edu/ivan) -//           (c) 2005-2009 Jon Tirsen (http://www.tirsen.com) -// Contributors: -//  Richard Livsey -//  Rahul Bhargava -//  Rob Wills -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -// Autocompleter.Base handles all the autocompletion functionality -// that's independent of the data source for autocompletion. This -// includes drawing the autocompletion menu, observing keyboard -// and mouse events, and similar. -// -// Specific autocompleters need to provide, at the very least, -// a getUpdatedChoices function that will be invoked every time -// the text inside the monitored textbox changes. This method -// should get the text for which to provide autocompletion by -// invoking this.getToken(), NOT by directly accessing -// this.element.value. This is to allow incremental tokenized -// autocompletion. Specific auto-completion logic (AJAX, etc) -// belongs in getUpdatedChoices. -// -// Tokenized incremental autocompletion is enabled automatically -// when an autocompleter is instantiated with the 'tokens' option -// in the options parameter, e.g.: -// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' }); -// will incrementally autocomplete with a comma as the token. -// Additionally, ',' in the above example can be replaced with -// a token array, e.g. { tokens: [',', '\n'] } which -// enables autocompletion on multiple tokens. This is most -// useful when one of the tokens is \n (a newline), as it -// allows smart autocompletion after linebreaks. - -if(typeof Effect == 'undefined') -  throw("controls.js requires including script.aculo.us' effects.js library"); - -var Autocompleter = { }; -Autocompleter.Base = Class.create({ -  baseInitialize: function(element, update, options) { -    element          = $(element); -    this.element     = element; -    this.update      = $(update); -    this.hasFocus    = false; -    this.changed     = false; -    this.active      = false; -    this.index       = 0; -    this.entryCount  = 0; -    this.oldElementValue = this.element.value; - -    if(this.setOptions) -      this.setOptions(options); -    else -      this.options = options || { }; - -    this.options.paramName    = this.options.paramName || this.element.name; -    this.options.tokens       = this.options.tokens || []; -    this.options.frequency    = this.options.frequency || 0.4; -    this.options.minChars     = this.options.minChars || 1; -    this.options.onShow       = this.options.onShow || -      function(element, update){ -        if(!update.style.position || update.style.position=='absolute') { -          update.style.position = 'absolute'; -          Position.clone(element, update, { -            setHeight: false, -            offsetTop: element.offsetHeight -          }); -        } -        Effect.Appear(update,{duration:0.15}); -      }; -    this.options.onHide = this.options.onHide || -      function(element, update){ new Effect.Fade(update,{duration:0.15}) }; - -    if(typeof(this.options.tokens) == 'string') -      this.options.tokens = new Array(this.options.tokens); -    // Force carriage returns as token delimiters anyway -    if (!this.options.tokens.include('\n')) -      this.options.tokens.push('\n'); - -    this.observer = null; - -    this.element.setAttribute('autocomplete','off'); - -    Element.hide(this.update); - -    Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this)); -    Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this)); -  }, - -  show: function() { -    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update); -    if(!this.iefix && -      (Prototype.Browser.IE) && -      (Element.getStyle(this.update, 'position')=='absolute')) { -      new Insertion.After(this.update, -       '<iframe id="' + this.update.id + '_iefix" '+ -       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' + -       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>'); -      this.iefix = $(this.update.id+'_iefix'); -    } -    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50); -  }, - -  fixIEOverlapping: function() { -    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)}); -    this.iefix.style.zIndex = 1; -    this.update.style.zIndex = 2; -    Element.show(this.iefix); -  }, - -  hide: function() { -    this.stopIndicator(); -    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update); -    if(this.iefix) Element.hide(this.iefix); -  }, - -  startIndicator: function() { -    if(this.options.indicator) Element.show(this.options.indicator); -  }, - -  stopIndicator: function() { -    if(this.options.indicator) Element.hide(this.options.indicator); -  }, - -  onKeyPress: function(event) { -    if(this.active) -      switch(event.keyCode) { -       case Event.KEY_TAB: -       case Event.KEY_RETURN: -         this.selectEntry(); -         Event.stop(event); -       case Event.KEY_ESC: -         this.hide(); -         this.active = false; -         Event.stop(event); -         return; -       case Event.KEY_LEFT: -       case Event.KEY_RIGHT: -         return; -       case Event.KEY_UP: -         this.markPrevious(); -         this.render(); -         Event.stop(event); -         return; -       case Event.KEY_DOWN: -         this.markNext(); -         this.render(); -         Event.stop(event); -         return; -      } -     else -       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || -         (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return; - -    this.changed = true; -    this.hasFocus = true; - -    if(this.observer) clearTimeout(this.observer); -      this.observer = -        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000); -  }, - -  activate: function() { -    this.changed = false; -    this.hasFocus = true; -    this.getUpdatedChoices(); -  }, - -  onHover: function(event) { -    var element = Event.findElement(event, 'LI'); -    if(this.index != element.autocompleteIndex) -    { -        this.index = element.autocompleteIndex; -        this.render(); -    } -    Event.stop(event); -  }, - -  onClick: function(event) { -    var element = Event.findElement(event, 'LI'); -    this.index = element.autocompleteIndex; -    this.selectEntry(); -    this.hide(); -  }, - -  onBlur: function(event) { -    // needed to make click events working -    setTimeout(this.hide.bind(this), 250); -    this.hasFocus = false; -    this.active = false; -  }, - -  render: function() { -    if(this.entryCount > 0) { -      for (var i = 0; i < this.entryCount; i++) -        this.index==i ? -          Element.addClassName(this.getEntry(i),"selected") : -          Element.removeClassName(this.getEntry(i),"selected"); -      if(this.hasFocus) { -        this.show(); -        this.active = true; -      } -    } else { -      this.active = false; -      this.hide(); -    } -  }, - -  markPrevious: function() { -    if(this.index > 0) this.index--; -      else this.index = this.entryCount-1; -    this.getEntry(this.index).scrollIntoView(true); -  }, - -  markNext: function() { -    if(this.index < this.entryCount-1) this.index++; -      else this.index = 0; -    this.getEntry(this.index).scrollIntoView(false); -  }, - -  getEntry: function(index) { -    return this.update.firstChild.childNodes[index]; -  }, - -  getCurrentEntry: function() { -    return this.getEntry(this.index); -  }, - -  selectEntry: function() { -    this.active = false; -    this.updateElement(this.getCurrentEntry()); -  }, - -  updateElement: function(selectedElement) { -    if (this.options.updateElement) { -      this.options.updateElement(selectedElement); -      return; -    } -    var value = ''; -    if (this.options.select) { -      var nodes = $(selectedElement).select('.' + this.options.select) || []; -      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select); -    } else -      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal'); - -    var bounds = this.getTokenBounds(); -    if (bounds[0] != -1) { -      var newValue = this.element.value.substr(0, bounds[0]); -      var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/); -      if (whitespace) -        newValue += whitespace[0]; -      this.element.value = newValue + value + this.element.value.substr(bounds[1]); -    } else { -      this.element.value = value; -    } -    this.oldElementValue = this.element.value; -    this.element.focus(); - -    if (this.options.afterUpdateElement) -      this.options.afterUpdateElement(this.element, selectedElement); -  }, - -  updateChoices: function(choices) { -    if(!this.changed && this.hasFocus) { -      this.update.innerHTML = choices; -      Element.cleanWhitespace(this.update); -      Element.cleanWhitespace(this.update.down()); - -      if(this.update.firstChild && this.update.down().childNodes) { -        this.entryCount = -          this.update.down().childNodes.length; -        for (var i = 0; i < this.entryCount; i++) { -          var entry = this.getEntry(i); -          entry.autocompleteIndex = i; -          this.addObservers(entry); -        } -      } else { -        this.entryCount = 0; -      } - -      this.stopIndicator(); -      this.index = 0; - -      if(this.entryCount==1 && this.options.autoSelect) { -        this.selectEntry(); -        this.hide(); -      } else { -        this.render(); -      } -    } -  }, - -  addObservers: function(element) { -    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this)); -    Event.observe(element, "click", this.onClick.bindAsEventListener(this)); -  }, - -  onObserverEvent: function() { -    this.changed = false; -    this.tokenBounds = null; -    if(this.getToken().length>=this.options.minChars) { -      this.getUpdatedChoices(); -    } else { -      this.active = false; -      this.hide(); -    } -    this.oldElementValue = this.element.value; -  }, - -  getToken: function() { -    var bounds = this.getTokenBounds(); -    return this.element.value.substring(bounds[0], bounds[1]).strip(); -  }, - -  getTokenBounds: function() { -    if (null != this.tokenBounds) return this.tokenBounds; -    var value = this.element.value; -    if (value.strip().empty()) return [-1, 0]; -    var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue); -    var offset = (diff == this.oldElementValue.length ? 1 : 0); -    var prevTokenPos = -1, nextTokenPos = value.length; -    var tp; -    for (var index = 0, l = this.options.tokens.length; index < l; ++index) { -      tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1); -      if (tp > prevTokenPos) prevTokenPos = tp; -      tp = value.indexOf(this.options.tokens[index], diff + offset); -      if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp; -    } -    return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]); -  } -}); - -Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) { -  var boundary = Math.min(newS.length, oldS.length); -  for (var index = 0; index < boundary; ++index) -    if (newS[index] != oldS[index]) -      return index; -  return boundary; -}; - -Ajax.Autocompleter = Class.create(Autocompleter.Base, { -  initialize: function(element, update, url, options) { -    this.baseInitialize(element, update, options); -    this.options.asynchronous  = true; -    this.options.onComplete    = this.onComplete.bind(this); -    this.options.defaultParams = this.options.parameters || null; -    this.url                   = url; -  }, - -  getUpdatedChoices: function() { -    this.startIndicator(); - -    var entry = encodeURIComponent(this.options.paramName) + '=' + -      encodeURIComponent(this.getToken()); - -    this.options.parameters = this.options.callback ? -      this.options.callback(this.element, entry) : entry; - -    if(this.options.defaultParams) -      this.options.parameters += '&' + this.options.defaultParams; - -    new Ajax.Request(this.url, this.options); -  }, - -  onComplete: function(request) { -    this.updateChoices(request.responseText); -  } -}); - -// The local array autocompleter. Used when you'd prefer to -// inject an array of autocompletion options into the page, rather -// than sending out Ajax queries, which can be quite slow sometimes. -// -// The constructor takes four parameters. The first two are, as usual, -// the id of the monitored textbox, and id of the autocompletion menu. -// The third is the array you want to autocomplete from, and the fourth -// is the options block. -// -// Extra local autocompletion options: -// - choices - How many autocompletion choices to offer -// -// - partialSearch - If false, the autocompleter will match entered -//                    text only at the beginning of strings in the -//                    autocomplete array. Defaults to true, which will -//                    match text at the beginning of any *word* in the -//                    strings in the autocomplete array. If you want to -//                    search anywhere in the string, additionally set -//                    the option fullSearch to true (default: off). -// -// - fullSsearch - Search anywhere in autocomplete array strings. -// -// - partialChars - How many characters to enter before triggering -//                   a partial match (unlike minChars, which defines -//                   how many characters are required to do any match -//                   at all). Defaults to 2. -// -// - ignoreCase - Whether to ignore case when autocompleting. -//                 Defaults to true. -// -// It's possible to pass in a custom function as the 'selector' -// option, if you prefer to write your own autocompletion logic. -// In that case, the other options above will not apply unless -// you support them. - -Autocompleter.Local = Class.create(Autocompleter.Base, { -  initialize: function(element, update, array, options) { -    this.baseInitialize(element, update, options); -    this.options.array = array; -  }, - -  getUpdatedChoices: function() { -    this.updateChoices(this.options.selector(this)); -  }, - -  setOptions: function(options) { -    this.options = Object.extend({ -      choices: 10, -      partialSearch: true, -      partialChars: 2, -      ignoreCase: true, -      fullSearch: false, -      selector: function(instance) { -        var ret       = []; // Beginning matches -        var partial   = []; // Inside matches -        var entry     = instance.getToken(); -        var count     = 0; - -        for (var i = 0; i < instance.options.array.length && -          ret.length < instance.options.choices ; i++) { - -          var elem = instance.options.array[i]; -          var foundPos = instance.options.ignoreCase ? -            elem.toLowerCase().indexOf(entry.toLowerCase()) : -            elem.indexOf(entry); - -          while (foundPos != -1) { -            if (foundPos == 0 && elem.length != entry.length) { -              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + -                elem.substr(entry.length) + "</li>"); -              break; -            } else if (entry.length >= instance.options.partialChars && -              instance.options.partialSearch && foundPos != -1) { -              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) { -                partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" + -                  elem.substr(foundPos, entry.length) + "</strong>" + elem.substr( -                  foundPos + entry.length) + "</li>"); -                break; -              } -            } - -            foundPos = instance.options.ignoreCase ? -              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : -              elem.indexOf(entry, foundPos + 1); - -          } -        } -        if (partial.length) -          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)); -        return "<ul>" + ret.join('') + "</ul>"; -      } -    }, options || { }); -  } -}); - -// AJAX in-place editor and collection editor -// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April 2007). - -// Use this if you notice weird scrolling problems on some browsers, -// the DOM might be a bit confused when this gets called so do this -// waits 1 ms (with setTimeout) until it does the activation -Field.scrollFreeActivate = function(field) { -  setTimeout(function() { -    Field.activate(field); -  }, 1); -}; - -Ajax.InPlaceEditor = Class.create({ -  initialize: function(element, url, options) { -    this.url = url; -    this.element = element = $(element); -    this.prepareOptions(); -    this._controls = { }; -    arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!! -    Object.extend(this.options, options || { }); -    if (!this.options.formId && this.element.id) { -      this.options.formId = this.element.id + '-inplaceeditor'; -      if ($(this.options.formId)) -        this.options.formId = ''; -    } -    if (this.options.externalControl) -      this.options.externalControl = $(this.options.externalControl); -    if (!this.options.externalControl) -      this.options.externalControlOnly = false; -    this._originalBackground = this.element.getStyle('background-color') || 'transparent'; -    this.element.title = this.options.clickToEditText; -    this._boundCancelHandler = this.handleFormCancellation.bind(this); -    this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this); -    this._boundFailureHandler = this.handleAJAXFailure.bind(this); -    this._boundSubmitHandler = this.handleFormSubmission.bind(this); -    this._boundWrapperHandler = this.wrapUp.bind(this); -    this.registerListeners(); -  }, -  checkForEscapeOrReturn: function(e) { -    if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return; -    if (Event.KEY_ESC == e.keyCode) -      this.handleFormCancellation(e); -    else if (Event.KEY_RETURN == e.keyCode) -      this.handleFormSubmission(e); -  }, -  createControl: function(mode, handler, extraClasses) { -    var control = this.options[mode + 'Control']; -    var text = this.options[mode + 'Text']; -    if ('button' == control) { -      var btn = document.createElement('input'); -      btn.type = 'submit'; -      btn.value = text; -      btn.className = 'editor_' + mode + '_button'; -      if ('cancel' == mode) -        btn.onclick = this._boundCancelHandler; -      this._form.appendChild(btn); -      this._controls[mode] = btn; -    } else if ('link' == control) { -      var link = document.createElement('a'); -      link.href = '#'; -      link.appendChild(document.createTextNode(text)); -      link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler; -      link.className = 'editor_' + mode + '_link'; -      if (extraClasses) -        link.className += ' ' + extraClasses; -      this._form.appendChild(link); -      this._controls[mode] = link; -    } -  }, -  createEditField: function() { -    var text = (this.options.loadTextURL ? this.options.loadingText : this.getText()); -    var fld; -    if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) { -      fld = document.createElement('input'); -      fld.type = 'text'; -      var size = this.options.size || this.options.cols || 0; -      if (0 < size) fld.size = size; -    } else { -      fld = document.createElement('textarea'); -      fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows); -      fld.cols = this.options.cols || 40; -    } -    fld.name = this.options.paramName; -    fld.value = text; // No HTML breaks conversion anymore -    fld.className = 'editor_field'; -    if (this.options.submitOnBlur) -      fld.onblur = this._boundSubmitHandler; -    this._controls.editor = fld; -    if (this.options.loadTextURL) -      this.loadExternalText(); -    this._form.appendChild(this._controls.editor); -  }, -  createForm: function() { -    var ipe = this; -    function addText(mode, condition) { -      var text = ipe.options['text' + mode + 'Controls']; -      if (!text || condition === false) return; -      ipe._form.appendChild(document.createTextNode(text)); -    }; -    this._form = $(document.createElement('form')); -    this._form.id = this.options.formId; -    this._form.addClassName(this.options.formClassName); -    this._form.onsubmit = this._boundSubmitHandler; -    this.createEditField(); -    if ('textarea' == this._controls.editor.tagName.toLowerCase()) -      this._form.appendChild(document.createElement('br')); -    if (this.options.onFormCustomization) -      this.options.onFormCustomization(this, this._form); -    addText('Before', this.options.okControl || this.options.cancelControl); -    this.createControl('ok', this._boundSubmitHandler); -    addText('Between', this.options.okControl && this.options.cancelControl); -    this.createControl('cancel', this._boundCancelHandler, 'editor_cancel'); -    addText('After', this.options.okControl || this.options.cancelControl); -  }, -  destroy: function() { -    if (this._oldInnerHTML) -      this.element.innerHTML = this._oldInnerHTML; -    this.leaveEditMode(); -    this.unregisterListeners(); -  }, -  enterEditMode: function(e) { -    if (this._saving || this._editing) return; -    this._editing = true; -    this.triggerCallback('onEnterEditMode'); -    if (this.options.externalControl) -      this.options.externalControl.hide(); -    this.element.hide(); -    this.createForm(); -    this.element.parentNode.insertBefore(this._form, this.element); -    if (!this.options.loadTextURL) -      this.postProcessEditField(); -    if (e) Event.stop(e); -  }, -  enterHover: function(e) { -    if (this.options.hoverClassName) -      this.element.addClassName(this.options.hoverClassName); -    if (this._saving) return; -    this.triggerCallback('onEnterHover'); -  }, -  getText: function() { -    return this.element.innerHTML.unescapeHTML(); -  }, -  handleAJAXFailure: function(transport) { -    this.triggerCallback('onFailure', transport); -    if (this._oldInnerHTML) { -      this.element.innerHTML = this._oldInnerHTML; -      this._oldInnerHTML = null; -    } -  }, -  handleFormCancellation: function(e) { -    this.wrapUp(); -    if (e) Event.stop(e); -  }, -  handleFormSubmission: function(e) { -    var form = this._form; -    var value = $F(this._controls.editor); -    this.prepareSubmission(); -    var params = this.options.callback(form, value) || ''; -    if (Object.isString(params)) -      params = params.toQueryParams(); -    params.editorId = this.element.id; -    if (this.options.htmlResponse) { -      var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions); -      Object.extend(options, { -        parameters: params, -        onComplete: this._boundWrapperHandler, -        onFailure: this._boundFailureHandler -      }); -      new Ajax.Updater({ success: this.element }, this.url, options); -    } else { -      var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); -      Object.extend(options, { -        parameters: params, -        onComplete: this._boundWrapperHandler, -        onFailure: this._boundFailureHandler -      }); -      new Ajax.Request(this.url, options); -    } -    if (e) Event.stop(e); -  }, -  leaveEditMode: function() { -    this.element.removeClassName(this.options.savingClassName); -    this.removeForm(); -    this.leaveHover(); -    this.element.style.backgroundColor = this._originalBackground; -    this.element.show(); -    if (this.options.externalControl) -      this.options.externalControl.show(); -    this._saving = false; -    this._editing = false; -    this._oldInnerHTML = null; -    this.triggerCallback('onLeaveEditMode'); -  }, -  leaveHover: function(e) { -    if (this.options.hoverClassName) -      this.element.removeClassName(this.options.hoverClassName); -    if (this._saving) return; -    this.triggerCallback('onLeaveHover'); -  }, -  loadExternalText: function() { -    this._form.addClassName(this.options.loadingClassName); -    this._controls.editor.disabled = true; -    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); -    Object.extend(options, { -      parameters: 'editorId=' + encodeURIComponent(this.element.id), -      onComplete: Prototype.emptyFunction, -      onSuccess: function(transport) { -        this._form.removeClassName(this.options.loadingClassName); -        var text = transport.responseText; -        if (this.options.stripLoadedTextTags) -          text = text.stripTags(); -        this._controls.editor.value = text; -        this._controls.editor.disabled = false; -        this.postProcessEditField(); -      }.bind(this), -      onFailure: this._boundFailureHandler -    }); -    new Ajax.Request(this.options.loadTextURL, options); -  }, -  postProcessEditField: function() { -    var fpc = this.options.fieldPostCreation; -    if (fpc) -      $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate'](); -  }, -  prepareOptions: function() { -    this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions); -    Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks); -    [this._extraDefaultOptions].flatten().compact().each(function(defs) { -      Object.extend(this.options, defs); -    }.bind(this)); -  }, -  prepareSubmission: function() { -    this._saving = true; -    this.removeForm(); -    this.leaveHover(); -    this.showSaving(); -  }, -  registerListeners: function() { -    this._listeners = { }; -    var listener; -    $H(Ajax.InPlaceEditor.Listeners).each(function(pair) { -      listener = this[pair.value].bind(this); -      this._listeners[pair.key] = listener; -      if (!this.options.externalControlOnly) -        this.element.observe(pair.key, listener); -      if (this.options.externalControl) -        this.options.externalControl.observe(pair.key, listener); -    }.bind(this)); -  }, -  removeForm: function() { -    if (!this._form) return; -    this._form.remove(); -    this._form = null; -    this._controls = { }; -  }, -  showSaving: function() { -    this._oldInnerHTML = this.element.innerHTML; -    this.element.innerHTML = this.options.savingText; -    this.element.addClassName(this.options.savingClassName); -    this.element.style.backgroundColor = this._originalBackground; -    this.element.show(); -  }, -  triggerCallback: function(cbName, arg) { -    if ('function' == typeof this.options[cbName]) { -      this.options[cbName](this, arg); -    } -  }, -  unregisterListeners: function() { -    $H(this._listeners).each(function(pair) { -      if (!this.options.externalControlOnly) -        this.element.stopObserving(pair.key, pair.value); -      if (this.options.externalControl) -        this.options.externalControl.stopObserving(pair.key, pair.value); -    }.bind(this)); -  }, -  wrapUp: function(transport) { -    this.leaveEditMode(); -    // Can't use triggerCallback due to backward compatibility: requires -    // binding + direct element -    this._boundComplete(transport, this.element); -  } -}); - -Object.extend(Ajax.InPlaceEditor.prototype, { -  dispose: Ajax.InPlaceEditor.prototype.destroy -}); - -Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, { -  initialize: function($super, element, url, options) { -    this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions; -    $super(element, url, options); -  }, - -  createEditField: function() { -    var list = document.createElement('select'); -    list.name = this.options.paramName; -    list.size = 1; -    this._controls.editor = list; -    this._collection = this.options.collection || []; -    if (this.options.loadCollectionURL) -      this.loadCollection(); -    else -      this.checkForExternalText(); -    this._form.appendChild(this._controls.editor); -  }, - -  loadCollection: function() { -    this._form.addClassName(this.options.loadingClassName); -    this.showLoadingText(this.options.loadingCollectionText); -    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); -    Object.extend(options, { -      parameters: 'editorId=' + encodeURIComponent(this.element.id), -      onComplete: Prototype.emptyFunction, -      onSuccess: function(transport) { -        var js = transport.responseText.strip(); -        if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check -          throw('Server returned an invalid collection representation.'); -        this._collection = eval(js); -        this.checkForExternalText(); -      }.bind(this), -      onFailure: this.onFailure -    }); -    new Ajax.Request(this.options.loadCollectionURL, options); -  }, - -  showLoadingText: function(text) { -    this._controls.editor.disabled = true; -    var tempOption = this._controls.editor.firstChild; -    if (!tempOption) { -      tempOption = document.createElement('option'); -      tempOption.value = ''; -      this._controls.editor.appendChild(tempOption); -      tempOption.selected = true; -    } -    tempOption.update((text || '').stripScripts().stripTags()); -  }, - -  checkForExternalText: function() { -    this._text = this.getText(); -    if (this.options.loadTextURL) -      this.loadExternalText(); -    else -      this.buildOptionList(); -  }, - -  loadExternalText: function() { -    this.showLoadingText(this.options.loadingText); -    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); -    Object.extend(options, { -      parameters: 'editorId=' + encodeURIComponent(this.element.id), -      onComplete: Prototype.emptyFunction, -      onSuccess: function(transport) { -        this._text = transport.responseText.strip(); -        this.buildOptionList(); -      }.bind(this), -      onFailure: this.onFailure -    }); -    new Ajax.Request(this.options.loadTextURL, options); -  }, - -  buildOptionList: function() { -    this._form.removeClassName(this.options.loadingClassName); -    this._collection = this._collection.map(function(entry) { -      return 2 === entry.length ? entry : [entry, entry].flatten(); -    }); -    var marker = ('value' in this.options) ? this.options.value : this._text; -    var textFound = this._collection.any(function(entry) { -      return entry[0] == marker; -    }.bind(this)); -    this._controls.editor.update(''); -    var option; -    this._collection.each(function(entry, index) { -      option = document.createElement('option'); -      option.value = entry[0]; -      option.selected = textFound ? entry[0] == marker : 0 == index; -      option.appendChild(document.createTextNode(entry[1])); -      this._controls.editor.appendChild(option); -    }.bind(this)); -    this._controls.editor.disabled = false; -    Field.scrollFreeActivate(this._controls.editor); -  } -}); - -//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! **** -//**** This only  exists for a while,  in order to  let **** -//**** users adapt to  the new API.  Read up on the new **** -//**** API and convert your code to it ASAP!            **** - -Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) { -  if (!options) return; -  function fallback(name, expr) { -    if (name in options || expr === undefined) return; -    options[name] = expr; -  }; -  fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' : -    options.cancelLink == options.cancelButton == false ? false : undefined))); -  fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' : -    options.okLink == options.okButton == false ? false : undefined))); -  fallback('highlightColor', options.highlightcolor); -  fallback('highlightEndColor', options.highlightendcolor); -}; - -Object.extend(Ajax.InPlaceEditor, { -  DefaultOptions: { -    ajaxOptions: { }, -    autoRows: 3,                                // Use when multi-line w/ rows == 1 -    cancelControl: 'link',                      // 'link'|'button'|false -    cancelText: 'cancel', -    clickToEditText: 'Click to edit', -    externalControl: null,                      // id|elt -    externalControlOnly: false, -    fieldPostCreation: 'activate',              // 'activate'|'focus'|false -    formClassName: 'inplaceeditor-form', -    formId: null,                               // id|elt -    highlightColor: '#ffff99', -    highlightEndColor: '#ffffff', -    hoverClassName: '', -    htmlResponse: true, -    loadingClassName: 'inplaceeditor-loading', -    loadingText: 'Loading...', -    okControl: 'button',                        // 'link'|'button'|false -    okText: 'ok', -    paramName: 'value', -    rows: 1,                                    // If 1 and multi-line, uses autoRows -    savingClassName: 'inplaceeditor-saving', -    savingText: 'Saving...', -    size: 0, -    stripLoadedTextTags: false, -    submitOnBlur: false, -    textAfterControls: '', -    textBeforeControls: '', -    textBetweenControls: '' -  }, -  DefaultCallbacks: { -    callback: function(form) { -      return Form.serialize(form); -    }, -    onComplete: function(transport, element) { -      // For backward compatibility, this one is bound to the IPE, and passes -      // the element directly.  It was too often customized, so we don't break it. -      new Effect.Highlight(element, { -        startcolor: this.options.highlightColor, keepBackgroundImage: true }); -    }, -    onEnterEditMode: null, -    onEnterHover: function(ipe) { -      ipe.element.style.backgroundColor = ipe.options.highlightColor; -      if (ipe._effect) -        ipe._effect.cancel(); -    }, -    onFailure: function(transport, ipe) { -      alert('Error communication with the server: ' + transport.responseText.stripTags()); -    }, -    onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls. -    onLeaveEditMode: null, -    onLeaveHover: function(ipe) { -      ipe._effect = new Effect.Highlight(ipe.element, { -        startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor, -        restorecolor: ipe._originalBackground, keepBackgroundImage: true -      }); -    } -  }, -  Listeners: { -    click: 'enterEditMode', -    keydown: 'checkForEscapeOrReturn', -    mouseover: 'enterHover', -    mouseout: 'leaveHover' -  } -}); - -Ajax.InPlaceCollectionEditor.DefaultOptions = { -  loadingCollectionText: 'Loading options...' -}; - -// Delayed observer, like Form.Element.Observer, -// but waits for delay after last key input -// Ideal for live-search fields - -Form.Element.DelayedObserver = Class.create({ -  initialize: function(element, delay, callback) { -    this.delay     = delay || 0.5; -    this.element   = $(element); -    this.callback  = callback; -    this.timer     = null; -    this.lastValue = $F(this.element); -    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); -  }, -  delayedListener: function(event) { -    if(this.lastValue == $F(this.element)) return; -    if(this.timer) clearTimeout(this.timer); -    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); -    this.lastValue = $F(this.element); -  }, -  onTimerEvent: function() { -    this.timer = null; -    this.callback(this.element, $F(this.element)); -  } -});
\ No newline at end of file diff --git a/public/javascripts/dragdrop.js b/public/javascripts/dragdrop.js deleted file mode 100644 index 15c6dbca6..000000000 --- a/public/javascripts/dragdrop.js +++ /dev/null @@ -1,974 +0,0 @@ -// script.aculo.us dragdrop.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 - -// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -if(Object.isUndefined(Effect)) -  throw("dragdrop.js requires including script.aculo.us' effects.js library"); - -var Droppables = { -  drops: [], - -  remove: function(element) { -    this.drops = this.drops.reject(function(d) { return d.element==$(element) }); -  }, - -  add: function(element) { -    element = $(element); -    var options = Object.extend({ -      greedy:     true, -      hoverclass: null, -      tree:       false -    }, arguments[1] || { }); - -    // cache containers -    if(options.containment) { -      options._containers = []; -      var containment = options.containment; -      if(Object.isArray(containment)) { -        containment.each( function(c) { options._containers.push($(c)) }); -      } else { -        options._containers.push($(containment)); -      } -    } - -    if(options.accept) options.accept = [options.accept].flatten(); - -    Element.makePositioned(element); // fix IE -    options.element = element; - -    this.drops.push(options); -  }, - -  findDeepestChild: function(drops) { -    deepest = drops[0]; - -    for (i = 1; i < drops.length; ++i) -      if (Element.isParent(drops[i].element, deepest.element)) -        deepest = drops[i]; - -    return deepest; -  }, - -  isContained: function(element, drop) { -    var containmentNode; -    if(drop.tree) { -      containmentNode = element.treeNode; -    } else { -      containmentNode = element.parentNode; -    } -    return drop._containers.detect(function(c) { return containmentNode == c }); -  }, - -  isAffected: function(point, element, drop) { -    return ( -      (drop.element!=element) && -      ((!drop._containers) || -        this.isContained(element, drop)) && -      ((!drop.accept) || -        (Element.classNames(element).detect( -          function(v) { return drop.accept.include(v) } ) )) && -      Position.within(drop.element, point[0], point[1]) ); -  }, - -  deactivate: function(drop) { -    if(drop.hoverclass) -      Element.removeClassName(drop.element, drop.hoverclass); -    this.last_active = null; -  }, - -  activate: function(drop) { -    if(drop.hoverclass) -      Element.addClassName(drop.element, drop.hoverclass); -    this.last_active = drop; -  }, - -  show: function(point, element) { -    if(!this.drops.length) return; -    var drop, affected = []; - -    this.drops.each( function(drop) { -      if(Droppables.isAffected(point, element, drop)) -        affected.push(drop); -    }); - -    if(affected.length>0) -      drop = Droppables.findDeepestChild(affected); - -    if(this.last_active && this.last_active != drop) this.deactivate(this.last_active); -    if (drop) { -      Position.within(drop.element, point[0], point[1]); -      if(drop.onHover) -        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); - -      if (drop != this.last_active) Droppables.activate(drop); -    } -  }, - -  fire: function(event, element) { -    if(!this.last_active) return; -    Position.prepare(); - -    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) -      if (this.last_active.onDrop) { -        this.last_active.onDrop(element, this.last_active.element, event); -        return true; -      } -  }, - -  reset: function() { -    if(this.last_active) -      this.deactivate(this.last_active); -  } -}; - -var Draggables = { -  drags: [], -  observers: [], - -  register: function(draggable) { -    if(this.drags.length == 0) { -      this.eventMouseUp   = this.endDrag.bindAsEventListener(this); -      this.eventMouseMove = this.updateDrag.bindAsEventListener(this); -      this.eventKeypress  = this.keyPress.bindAsEventListener(this); - -      Event.observe(document, "mouseup", this.eventMouseUp); -      Event.observe(document, "mousemove", this.eventMouseMove); -      Event.observe(document, "keypress", this.eventKeypress); -    } -    this.drags.push(draggable); -  }, - -  unregister: function(draggable) { -    this.drags = this.drags.reject(function(d) { return d==draggable }); -    if(this.drags.length == 0) { -      Event.stopObserving(document, "mouseup", this.eventMouseUp); -      Event.stopObserving(document, "mousemove", this.eventMouseMove); -      Event.stopObserving(document, "keypress", this.eventKeypress); -    } -  }, - -  activate: function(draggable) { -    if(draggable.options.delay) { -      this._timeout = setTimeout(function() { -        Draggables._timeout = null; -        window.focus(); -        Draggables.activeDraggable = draggable; -      }.bind(this), draggable.options.delay); -    } else { -      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari -      this.activeDraggable = draggable; -    } -  }, - -  deactivate: function() { -    this.activeDraggable = null; -  }, - -  updateDrag: function(event) { -    if(!this.activeDraggable) return; -    var pointer = [Event.pointerX(event), Event.pointerY(event)]; -    // Mozilla-based browsers fire successive mousemove events with -    // the same coordinates, prevent needless redrawing (moz bug?) -    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; -    this._lastPointer = pointer; - -    this.activeDraggable.updateDrag(event, pointer); -  }, - -  endDrag: function(event) { -    if(this._timeout) { -      clearTimeout(this._timeout); -      this._timeout = null; -    } -    if(!this.activeDraggable) return; -    this._lastPointer = null; -    this.activeDraggable.endDrag(event); -    this.activeDraggable = null; -  }, - -  keyPress: function(event) { -    if(this.activeDraggable) -      this.activeDraggable.keyPress(event); -  }, - -  addObserver: function(observer) { -    this.observers.push(observer); -    this._cacheObserverCallbacks(); -  }, - -  removeObserver: function(element) {  // element instead of observer fixes mem leaks -    this.observers = this.observers.reject( function(o) { return o.element==element }); -    this._cacheObserverCallbacks(); -  }, - -  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag' -    if(this[eventName+'Count'] > 0) -      this.observers.each( function(o) { -        if(o[eventName]) o[eventName](eventName, draggable, event); -      }); -    if(draggable.options[eventName]) draggable.options[eventName](draggable, event); -  }, - -  _cacheObserverCallbacks: function() { -    ['onStart','onEnd','onDrag'].each( function(eventName) { -      Draggables[eventName+'Count'] = Draggables.observers.select( -        function(o) { return o[eventName]; } -      ).length; -    }); -  } -}; - -/*--------------------------------------------------------------------------*/ - -var Draggable = Class.create({ -  initialize: function(element) { -    var defaults = { -      handle: false, -      reverteffect: function(element, top_offset, left_offset) { -        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; -        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, -          queue: {scope:'_draggable', position:'end'} -        }); -      }, -      endeffect: function(element) { -        var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0; -        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, -          queue: {scope:'_draggable', position:'end'}, -          afterFinish: function(){ -            Draggable._dragging[element] = false -          } -        }); -      }, -      zindex: 1000, -      revert: false, -      quiet: false, -      scroll: false, -      scrollSensitivity: 20, -      scrollSpeed: 15, -      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] } -      delay: 0 -    }; - -    if(!arguments[1] || Object.isUndefined(arguments[1].endeffect)) -      Object.extend(defaults, { -        starteffect: function(element) { -          element._opacity = Element.getOpacity(element); -          Draggable._dragging[element] = true; -          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); -        } -      }); - -    var options = Object.extend(defaults, arguments[1] || { }); - -    this.element = $(element); - -    if(options.handle && Object.isString(options.handle)) -      this.handle = this.element.down('.'+options.handle, 0); - -    if(!this.handle) this.handle = $(options.handle); -    if(!this.handle) this.handle = this.element; - -    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { -      options.scroll = $(options.scroll); -      this._isScrollChild = Element.childOf(this.element, options.scroll); -    } - -    Element.makePositioned(this.element); // fix IE - -    this.options  = options; -    this.dragging = false; - -    this.eventMouseDown = this.initDrag.bindAsEventListener(this); -    Event.observe(this.handle, "mousedown", this.eventMouseDown); - -    Draggables.register(this); -  }, - -  destroy: function() { -    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); -    Draggables.unregister(this); -  }, - -  currentDelta: function() { -    return([ -      parseInt(Element.getStyle(this.element,'left') || '0'), -      parseInt(Element.getStyle(this.element,'top') || '0')]); -  }, - -  initDrag: function(event) { -    if(!Object.isUndefined(Draggable._dragging[this.element]) && -      Draggable._dragging[this.element]) return; -    if(Event.isLeftClick(event)) { -      // abort on form elements, fixes a Firefox issue -      var src = Event.element(event); -      if((tag_name = src.tagName.toUpperCase()) && ( -        tag_name=='INPUT' || -        tag_name=='SELECT' || -        tag_name=='OPTION' || -        tag_name=='BUTTON' || -        tag_name=='TEXTAREA')) return; - -      var pointer = [Event.pointerX(event), Event.pointerY(event)]; -      var pos     = this.element.cumulativeOffset(); -      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); - -      Draggables.activate(this); -      Event.stop(event); -    } -  }, - -  startDrag: function(event) { -    this.dragging = true; -    if(!this.delta) -      this.delta = this.currentDelta(); - -    if(this.options.zindex) { -      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); -      this.element.style.zIndex = this.options.zindex; -    } - -    if(this.options.ghosting) { -      this._clone = this.element.cloneNode(true); -      this._originallyAbsolute = (this.element.getStyle('position') == 'absolute'); -      if (!this._originallyAbsolute) -        Position.absolutize(this.element); -      this.element.parentNode.insertBefore(this._clone, this.element); -    } - -    if(this.options.scroll) { -      if (this.options.scroll == window) { -        var where = this._getWindowScroll(this.options.scroll); -        this.originalScrollLeft = where.left; -        this.originalScrollTop = where.top; -      } else { -        this.originalScrollLeft = this.options.scroll.scrollLeft; -        this.originalScrollTop = this.options.scroll.scrollTop; -      } -    } - -    Draggables.notify('onStart', this, event); - -    if(this.options.starteffect) this.options.starteffect(this.element); -  }, - -  updateDrag: function(event, pointer) { -    if(!this.dragging) this.startDrag(event); - -    if(!this.options.quiet){ -      Position.prepare(); -      Droppables.show(pointer, this.element); -    } - -    Draggables.notify('onDrag', this, event); - -    this.draw(pointer); -    if(this.options.change) this.options.change(this); - -    if(this.options.scroll) { -      this.stopScrolling(); - -      var p; -      if (this.options.scroll == window) { -        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } -      } else { -        p = Position.page(this.options.scroll); -        p[0] += this.options.scroll.scrollLeft + Position.deltaX; -        p[1] += this.options.scroll.scrollTop + Position.deltaY; -        p.push(p[0]+this.options.scroll.offsetWidth); -        p.push(p[1]+this.options.scroll.offsetHeight); -      } -      var speed = [0,0]; -      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); -      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); -      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); -      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); -      this.startScrolling(speed); -    } - -    // fix AppleWebKit rendering -    if(Prototype.Browser.WebKit) window.scrollBy(0,0); - -    Event.stop(event); -  }, - -  finishDrag: function(event, success) { -    this.dragging = false; - -    if(this.options.quiet){ -      Position.prepare(); -      var pointer = [Event.pointerX(event), Event.pointerY(event)]; -      Droppables.show(pointer, this.element); -    } - -    if(this.options.ghosting) { -      if (!this._originallyAbsolute) -        Position.relativize(this.element); -      delete this._originallyAbsolute; -      Element.remove(this._clone); -      this._clone = null; -    } - -    var dropped = false; -    if(success) { -      dropped = Droppables.fire(event, this.element); -      if (!dropped) dropped = false; -    } -    if(dropped && this.options.onDropped) this.options.onDropped(this.element); -    Draggables.notify('onEnd', this, event); - -    var revert = this.options.revert; -    if(revert && Object.isFunction(revert)) revert = revert(this.element); - -    var d = this.currentDelta(); -    if(revert && this.options.reverteffect) { -      if (dropped == 0 || revert != 'failure') -        this.options.reverteffect(this.element, -          d[1]-this.delta[1], d[0]-this.delta[0]); -    } else { -      this.delta = d; -    } - -    if(this.options.zindex) -      this.element.style.zIndex = this.originalZ; - -    if(this.options.endeffect) -      this.options.endeffect(this.element); - -    Draggables.deactivate(this); -    Droppables.reset(); -  }, - -  keyPress: function(event) { -    if(event.keyCode!=Event.KEY_ESC) return; -    this.finishDrag(event, false); -    Event.stop(event); -  }, - -  endDrag: function(event) { -    if(!this.dragging) return; -    this.stopScrolling(); -    this.finishDrag(event, true); -    Event.stop(event); -  }, - -  draw: function(point) { -    var pos = this.element.cumulativeOffset(); -    if(this.options.ghosting) { -      var r   = Position.realOffset(this.element); -      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; -    } - -    var d = this.currentDelta(); -    pos[0] -= d[0]; pos[1] -= d[1]; - -    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { -      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; -      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; -    } - -    var p = [0,1].map(function(i){ -      return (point[i]-pos[i]-this.offset[i]) -    }.bind(this)); - -    if(this.options.snap) { -      if(Object.isFunction(this.options.snap)) { -        p = this.options.snap(p[0],p[1],this); -      } else { -      if(Object.isArray(this.options.snap)) { -        p = p.map( function(v, i) { -          return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this)); -      } else { -        p = p.map( function(v) { -          return (v/this.options.snap).round()*this.options.snap }.bind(this)); -      } -    }} - -    var style = this.element.style; -    if((!this.options.constraint) || (this.options.constraint=='horizontal')) -      style.left = p[0] + "px"; -    if((!this.options.constraint) || (this.options.constraint=='vertical')) -      style.top  = p[1] + "px"; - -    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering -  }, - -  stopScrolling: function() { -    if(this.scrollInterval) { -      clearInterval(this.scrollInterval); -      this.scrollInterval = null; -      Draggables._lastScrollPointer = null; -    } -  }, - -  startScrolling: function(speed) { -    if(!(speed[0] || speed[1])) return; -    this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; -    this.lastScrolled = new Date(); -    this.scrollInterval = setInterval(this.scroll.bind(this), 10); -  }, - -  scroll: function() { -    var current = new Date(); -    var delta = current - this.lastScrolled; -    this.lastScrolled = current; -    if(this.options.scroll == window) { -      with (this._getWindowScroll(this.options.scroll)) { -        if (this.scrollSpeed[0] || this.scrollSpeed[1]) { -          var d = delta / 1000; -          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); -        } -      } -    } else { -      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; -      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000; -    } - -    Position.prepare(); -    Droppables.show(Draggables._lastPointer, this.element); -    Draggables.notify('onDrag', this); -    if (this._isScrollChild) { -      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); -      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; -      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; -      if (Draggables._lastScrollPointer[0] < 0) -        Draggables._lastScrollPointer[0] = 0; -      if (Draggables._lastScrollPointer[1] < 0) -        Draggables._lastScrollPointer[1] = 0; -      this.draw(Draggables._lastScrollPointer); -    } - -    if(this.options.change) this.options.change(this); -  }, - -  _getWindowScroll: function(w) { -    var T, L, W, H; -    with (w.document) { -      if (w.document.documentElement && documentElement.scrollTop) { -        T = documentElement.scrollTop; -        L = documentElement.scrollLeft; -      } else if (w.document.body) { -        T = body.scrollTop; -        L = body.scrollLeft; -      } -      if (w.innerWidth) { -        W = w.innerWidth; -        H = w.innerHeight; -      } else if (w.document.documentElement && documentElement.clientWidth) { -        W = documentElement.clientWidth; -        H = documentElement.clientHeight; -      } else { -        W = body.offsetWidth; -        H = body.offsetHeight; -      } -    } -    return { top: T, left: L, width: W, height: H }; -  } -}); - -Draggable._dragging = { }; - -/*--------------------------------------------------------------------------*/ - -var SortableObserver = Class.create({ -  initialize: function(element, observer) { -    this.element   = $(element); -    this.observer  = observer; -    this.lastValue = Sortable.serialize(this.element); -  }, - -  onStart: function() { -    this.lastValue = Sortable.serialize(this.element); -  }, - -  onEnd: function() { -    Sortable.unmark(); -    if(this.lastValue != Sortable.serialize(this.element)) -      this.observer(this.element) -  } -}); - -var Sortable = { -  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, - -  sortables: { }, - -  _findRootElement: function(element) { -    while (element.tagName.toUpperCase() != "BODY") { -      if(element.id && Sortable.sortables[element.id]) return element; -      element = element.parentNode; -    } -  }, - -  options: function(element) { -    element = Sortable._findRootElement($(element)); -    if(!element) return; -    return Sortable.sortables[element.id]; -  }, - -  destroy: function(element){ -    element = $(element); -    var s = Sortable.sortables[element.id]; - -    if(s) { -      Draggables.removeObserver(s.element); -      s.droppables.each(function(d){ Droppables.remove(d) }); -      s.draggables.invoke('destroy'); - -      delete Sortable.sortables[s.element.id]; -    } -  }, - -  create: function(element) { -    element = $(element); -    var options = Object.extend({ -      element:     element, -      tag:         'li',       // assumes li children, override with tag: 'tagname' -      dropOnEmpty: false, -      tree:        false, -      treeTag:     'ul', -      overlap:     'vertical', // one of 'vertical', 'horizontal' -      constraint:  'vertical', // one of 'vertical', 'horizontal', false -      containment: element,    // also takes array of elements (or id's); or false -      handle:      false,      // or a CSS class -      only:        false, -      delay:       0, -      hoverclass:  null, -      ghosting:    false, -      quiet:       false, -      scroll:      false, -      scrollSensitivity: 20, -      scrollSpeed: 15, -      format:      this.SERIALIZE_RULE, - -      // these take arrays of elements or ids and can be -      // used for better initialization performance -      elements:    false, -      handles:     false, - -      onChange:    Prototype.emptyFunction, -      onUpdate:    Prototype.emptyFunction -    }, arguments[1] || { }); - -    // clear any old sortable with same element -    this.destroy(element); - -    // build options for the draggables -    var options_for_draggable = { -      revert:      true, -      quiet:       options.quiet, -      scroll:      options.scroll, -      scrollSpeed: options.scrollSpeed, -      scrollSensitivity: options.scrollSensitivity, -      delay:       options.delay, -      ghosting:    options.ghosting, -      constraint:  options.constraint, -      handle:      options.handle }; - -    if(options.starteffect) -      options_for_draggable.starteffect = options.starteffect; - -    if(options.reverteffect) -      options_for_draggable.reverteffect = options.reverteffect; -    else -      if(options.ghosting) options_for_draggable.reverteffect = function(element) { -        element.style.top  = 0; -        element.style.left = 0; -      }; - -    if(options.endeffect) -      options_for_draggable.endeffect = options.endeffect; - -    if(options.zindex) -      options_for_draggable.zindex = options.zindex; - -    // build options for the droppables -    var options_for_droppable = { -      overlap:     options.overlap, -      containment: options.containment, -      tree:        options.tree, -      hoverclass:  options.hoverclass, -      onHover:     Sortable.onHover -    }; - -    var options_for_tree = { -      onHover:      Sortable.onEmptyHover, -      overlap:      options.overlap, -      containment:  options.containment, -      hoverclass:   options.hoverclass -    }; - -    // fix for gecko engine -    Element.cleanWhitespace(element); - -    options.draggables = []; -    options.droppables = []; - -    // drop on empty handling -    if(options.dropOnEmpty || options.tree) { -      Droppables.add(element, options_for_tree); -      options.droppables.push(element); -    } - -    (options.elements || this.findElements(element, options) || []).each( function(e,i) { -      var handle = options.handles ? $(options.handles[i]) : -        (options.handle ? $(e).select('.' + options.handle)[0] : e); -      options.draggables.push( -        new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); -      Droppables.add(e, options_for_droppable); -      if(options.tree) e.treeNode = element; -      options.droppables.push(e); -    }); - -    if(options.tree) { -      (Sortable.findTreeElements(element, options) || []).each( function(e) { -        Droppables.add(e, options_for_tree); -        e.treeNode = element; -        options.droppables.push(e); -      }); -    } - -    // keep reference -    this.sortables[element.identify()] = options; - -    // for onupdate -    Draggables.addObserver(new SortableObserver(element, options.onUpdate)); - -  }, - -  // return all suitable-for-sortable elements in a guaranteed order -  findElements: function(element, options) { -    return Element.findChildren( -      element, options.only, options.tree ? true : false, options.tag); -  }, - -  findTreeElements: function(element, options) { -    return Element.findChildren( -      element, options.only, options.tree ? true : false, options.treeTag); -  }, - -  onHover: function(element, dropon, overlap) { -    if(Element.isParent(dropon, element)) return; - -    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { -      return; -    } else if(overlap>0.5) { -      Sortable.mark(dropon, 'before'); -      if(dropon.previousSibling != element) { -        var oldParentNode = element.parentNode; -        element.style.visibility = "hidden"; // fix gecko rendering -        dropon.parentNode.insertBefore(element, dropon); -        if(dropon.parentNode!=oldParentNode) -          Sortable.options(oldParentNode).onChange(element); -        Sortable.options(dropon.parentNode).onChange(element); -      } -    } else { -      Sortable.mark(dropon, 'after'); -      var nextElement = dropon.nextSibling || null; -      if(nextElement != element) { -        var oldParentNode = element.parentNode; -        element.style.visibility = "hidden"; // fix gecko rendering -        dropon.parentNode.insertBefore(element, nextElement); -        if(dropon.parentNode!=oldParentNode) -          Sortable.options(oldParentNode).onChange(element); -        Sortable.options(dropon.parentNode).onChange(element); -      } -    } -  }, - -  onEmptyHover: function(element, dropon, overlap) { -    var oldParentNode = element.parentNode; -    var droponOptions = Sortable.options(dropon); - -    if(!Element.isParent(dropon, element)) { -      var index; - -      var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only}); -      var child = null; - -      if(children) { -        var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); - -        for (index = 0; index < children.length; index += 1) { -          if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { -            offset -= Element.offsetSize (children[index], droponOptions.overlap); -          } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { -            child = index + 1 < children.length ? children[index + 1] : null; -            break; -          } else { -            child = children[index]; -            break; -          } -        } -      } - -      dropon.insertBefore(element, child); - -      Sortable.options(oldParentNode).onChange(element); -      droponOptions.onChange(element); -    } -  }, - -  unmark: function() { -    if(Sortable._marker) Sortable._marker.hide(); -  }, - -  mark: function(dropon, position) { -    // mark on ghosting only -    var sortable = Sortable.options(dropon.parentNode); -    if(sortable && !sortable.ghosting) return; - -    if(!Sortable._marker) { -      Sortable._marker = -        ($('dropmarker') || Element.extend(document.createElement('DIV'))). -          hide().addClassName('dropmarker').setStyle({position:'absolute'}); -      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); -    } -    var offsets = dropon.cumulativeOffset(); -    Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); - -    if(position=='after') -      if(sortable.overlap == 'horizontal') -        Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'}); -      else -        Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'}); - -    Sortable._marker.show(); -  }, - -  _tree: function(element, options, parent) { -    var children = Sortable.findElements(element, options) || []; - -    for (var i = 0; i < children.length; ++i) { -      var match = children[i].id.match(options.format); - -      if (!match) continue; - -      var child = { -        id: encodeURIComponent(match ? match[1] : null), -        element: element, -        parent: parent, -        children: [], -        position: parent.children.length, -        container: $(children[i]).down(options.treeTag) -      }; - -      /* Get the element containing the children and recurse over it */ -      if (child.container) -        this._tree(child.container, options, child); - -      parent.children.push (child); -    } - -    return parent; -  }, - -  tree: function(element) { -    element = $(element); -    var sortableOptions = this.options(element); -    var options = Object.extend({ -      tag: sortableOptions.tag, -      treeTag: sortableOptions.treeTag, -      only: sortableOptions.only, -      name: element.id, -      format: sortableOptions.format -    }, arguments[1] || { }); - -    var root = { -      id: null, -      parent: null, -      children: [], -      container: element, -      position: 0 -    }; - -    return Sortable._tree(element, options, root); -  }, - -  /* Construct a [i] index for a particular node */ -  _constructIndex: function(node) { -    var index = ''; -    do { -      if (node.id) index = '[' + node.position + ']' + index; -    } while ((node = node.parent) != null); -    return index; -  }, - -  sequence: function(element) { -    element = $(element); -    var options = Object.extend(this.options(element), arguments[1] || { }); - -    return $(this.findElements(element, options) || []).map( function(item) { -      return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; -    }); -  }, - -  setSequence: function(element, new_sequence) { -    element = $(element); -    var options = Object.extend(this.options(element), arguments[2] || { }); - -    var nodeMap = { }; -    this.findElements(element, options).each( function(n) { -        if (n.id.match(options.format)) -            nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode]; -        n.parentNode.removeChild(n); -    }); - -    new_sequence.each(function(ident) { -      var n = nodeMap[ident]; -      if (n) { -        n[1].appendChild(n[0]); -        delete nodeMap[ident]; -      } -    }); -  }, - -  serialize: function(element) { -    element = $(element); -    var options = Object.extend(Sortable.options(element), arguments[1] || { }); -    var name = encodeURIComponent( -      (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); - -    if (options.tree) { -      return Sortable.tree(element, arguments[1]).children.map( function (item) { -        return [name + Sortable._constructIndex(item) + "[id]=" + -                encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); -      }).flatten().join('&'); -    } else { -      return Sortable.sequence(element, arguments[1]).map( function(item) { -        return name + "[]=" + encodeURIComponent(item); -      }).join('&'); -    } -  } -}; - -// Returns true if child is contained within element -Element.isParent = function(child, element) { -  if (!child.parentNode || child == element) return false; -  if (child.parentNode == element) return true; -  return Element.isParent(child.parentNode, element); -}; - -Element.findChildren = function(element, only, recursive, tagName) { -  if(!element.hasChildNodes()) return null; -  tagName = tagName.toUpperCase(); -  if(only) only = [only].flatten(); -  var elements = []; -  $A(element.childNodes).each( function(e) { -    if(e.tagName && e.tagName.toUpperCase()==tagName && -      (!only || (Element.classNames(e).detect(function(v) { return only.include(v) })))) -        elements.push(e); -    if(recursive) { -      var grandchildren = Element.findChildren(e, only, recursive, tagName); -      if(grandchildren) elements.push(grandchildren); -    } -  }); - -  return (elements.length>0 ? elements.flatten() : []); -}; - -Element.offsetSize = function (element, type) { -  return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')]; -};
\ No newline at end of file diff --git a/public/javascripts/effects.js b/public/javascripts/effects.js deleted file mode 100644 index c81e6c7d5..000000000 --- a/public/javascripts/effects.js +++ /dev/null @@ -1,1123 +0,0 @@ -// script.aculo.us effects.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 - -// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// Contributors: -//  Justin Palmer (http://encytemedia.com/) -//  Mark Pilgrim (http://diveintomark.org/) -//  Martin Bialasinki -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -// converts rgb() and #xxx to #xxxxxx format, -// returns self (or first argument) if not convertable -String.prototype.parseColor = function() { -  var color = '#'; -  if (this.slice(0,4) == 'rgb(') { -    var cols = this.slice(4,this.length-1).split(','); -    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); -  } else { -    if (this.slice(0,1) == '#') { -      if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); -      if (this.length==7) color = this.toLowerCase(); -    } -  } -  return (color.length==7 ? color : (arguments[0] || this)); -}; - -/*--------------------------------------------------------------------------*/ - -Element.collectTextNodes = function(element) { -  return $A($(element).childNodes).collect( function(node) { -    return (node.nodeType==3 ? node.nodeValue : -      (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); -  }).flatten().join(''); -}; - -Element.collectTextNodesIgnoreClass = function(element, className) { -  return $A($(element).childNodes).collect( function(node) { -    return (node.nodeType==3 ? node.nodeValue : -      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? -        Element.collectTextNodesIgnoreClass(node, className) : '')); -  }).flatten().join(''); -}; - -Element.setContentZoom = function(element, percent) { -  element = $(element); -  element.setStyle({fontSize: (percent/100) + 'em'}); -  if (Prototype.Browser.WebKit) window.scrollBy(0,0); -  return element; -}; - -Element.getInlineOpacity = function(element){ -  return $(element).style.opacity || ''; -}; - -Element.forceRerendering = function(element) { -  try { -    element = $(element); -    var n = document.createTextNode(' '); -    element.appendChild(n); -    element.removeChild(n); -  } catch(e) { } -}; - -/*--------------------------------------------------------------------------*/ - -var Effect = { -  _elementDoesNotExistError: { -    name: 'ElementDoesNotExistError', -    message: 'The specified DOM element does not exist, but is required for this effect to operate' -  }, -  Transitions: { -    linear: Prototype.K, -    sinoidal: function(pos) { -      return (-Math.cos(pos*Math.PI)/2) + .5; -    }, -    reverse: function(pos) { -      return 1-pos; -    }, -    flicker: function(pos) { -      var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4; -      return pos > 1 ? 1 : pos; -    }, -    wobble: function(pos) { -      return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5; -    }, -    pulse: function(pos, pulses) { -      return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5; -    }, -    spring: function(pos) { -      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); -    }, -    none: function(pos) { -      return 0; -    }, -    full: function(pos) { -      return 1; -    } -  }, -  DefaultOptions: { -    duration:   1.0,   // seconds -    fps:        100,   // 100= assume 66fps max. -    sync:       false, // true for combining -    from:       0.0, -    to:         1.0, -    delay:      0.0, -    queue:      'parallel' -  }, -  tagifyText: function(element) { -    var tagifyStyle = 'position:relative'; -    if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; - -    element = $(element); -    $A(element.childNodes).each( function(child) { -      if (child.nodeType==3) { -        child.nodeValue.toArray().each( function(character) { -          element.insertBefore( -            new Element('span', {style: tagifyStyle}).update( -              character == ' ' ? String.fromCharCode(160) : character), -              child); -        }); -        Element.remove(child); -      } -    }); -  }, -  multiple: function(element, effect) { -    var elements; -    if (((typeof element == 'object') || -        Object.isFunction(element)) && -       (element.length)) -      elements = element; -    else -      elements = $(element).childNodes; - -    var options = Object.extend({ -      speed: 0.1, -      delay: 0.0 -    }, arguments[2] || { }); -    var masterDelay = options.delay; - -    $A(elements).each( function(element, index) { -      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); -    }); -  }, -  PAIRS: { -    'slide':  ['SlideDown','SlideUp'], -    'blind':  ['BlindDown','BlindUp'], -    'appear': ['Appear','Fade'] -  }, -  toggle: function(element, effect, options) { -    element = $(element); -    effect  = (effect || 'appear').toLowerCase(); - -    return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({ -      queue: { position:'end', scope:(element.id || 'global'), limit: 1 } -    }, options || {})); -  } -}; - -Effect.DefaultOptions.transition = Effect.Transitions.sinoidal; - -/* ------------- core effects ------------- */ - -Effect.ScopedQueue = Class.create(Enumerable, { -  initialize: function() { -    this.effects  = []; -    this.interval = null; -  }, -  _each: function(iterator) { -    this.effects._each(iterator); -  }, -  add: function(effect) { -    var timestamp = new Date().getTime(); - -    var position = Object.isString(effect.options.queue) ? -      effect.options.queue : effect.options.queue.position; - -    switch(position) { -      case 'front': -        // move unstarted effects after this effect -        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { -            e.startOn  += effect.finishOn; -            e.finishOn += effect.finishOn; -          }); -        break; -      case 'with-last': -        timestamp = this.effects.pluck('startOn').max() || timestamp; -        break; -      case 'end': -        // start effect after last queued effect has finished -        timestamp = this.effects.pluck('finishOn').max() || timestamp; -        break; -    } - -    effect.startOn  += timestamp; -    effect.finishOn += timestamp; - -    if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) -      this.effects.push(effect); - -    if (!this.interval) -      this.interval = setInterval(this.loop.bind(this), 15); -  }, -  remove: function(effect) { -    this.effects = this.effects.reject(function(e) { return e==effect }); -    if (this.effects.length == 0) { -      clearInterval(this.interval); -      this.interval = null; -    } -  }, -  loop: function() { -    var timePos = new Date().getTime(); -    for(var i=0, len=this.effects.length;i<len;i++) -      this.effects[i] && this.effects[i].loop(timePos); -  } -}); - -Effect.Queues = { -  instances: $H(), -  get: function(queueName) { -    if (!Object.isString(queueName)) return queueName; - -    return this.instances.get(queueName) || -      this.instances.set(queueName, new Effect.ScopedQueue()); -  } -}; -Effect.Queue = Effect.Queues.get('global'); - -Effect.Base = Class.create({ -  position: null, -  start: function(options) { -    if (options && options.transition === false) options.transition = Effect.Transitions.linear; -    this.options      = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { }); -    this.currentFrame = 0; -    this.state        = 'idle'; -    this.startOn      = this.options.delay*1000; -    this.finishOn     = this.startOn+(this.options.duration*1000); -    this.fromToDelta  = this.options.to-this.options.from; -    this.totalTime    = this.finishOn-this.startOn; -    this.totalFrames  = this.options.fps*this.options.duration; - -    this.render = (function() { -      function dispatch(effect, eventName) { -        if (effect.options[eventName + 'Internal']) -          effect.options[eventName + 'Internal'](effect); -        if (effect.options[eventName]) -          effect.options[eventName](effect); -      } - -      return function(pos) { -        if (this.state === "idle") { -          this.state = "running"; -          dispatch(this, 'beforeSetup'); -          if (this.setup) this.setup(); -          dispatch(this, 'afterSetup'); -        } -        if (this.state === "running") { -          pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from; -          this.position = pos; -          dispatch(this, 'beforeUpdate'); -          if (this.update) this.update(pos); -          dispatch(this, 'afterUpdate'); -        } -      }; -    })(); - -    this.event('beforeStart'); -    if (!this.options.sync) -      Effect.Queues.get(Object.isString(this.options.queue) ? -        'global' : this.options.queue.scope).add(this); -  }, -  loop: function(timePos) { -    if (timePos >= this.startOn) { -      if (timePos >= this.finishOn) { -        this.render(1.0); -        this.cancel(); -        this.event('beforeFinish'); -        if (this.finish) this.finish(); -        this.event('afterFinish'); -        return; -      } -      var pos   = (timePos - this.startOn) / this.totalTime, -          frame = (pos * this.totalFrames).round(); -      if (frame > this.currentFrame) { -        this.render(pos); -        this.currentFrame = frame; -      } -    } -  }, -  cancel: function() { -    if (!this.options.sync) -      Effect.Queues.get(Object.isString(this.options.queue) ? -        'global' : this.options.queue.scope).remove(this); -    this.state = 'finished'; -  }, -  event: function(eventName) { -    if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); -    if (this.options[eventName]) this.options[eventName](this); -  }, -  inspect: function() { -    var data = $H(); -    for(property in this) -      if (!Object.isFunction(this[property])) data.set(property, this[property]); -    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>'; -  } -}); - -Effect.Parallel = Class.create(Effect.Base, { -  initialize: function(effects) { -    this.effects = effects || []; -    this.start(arguments[1]); -  }, -  update: function(position) { -    this.effects.invoke('render', position); -  }, -  finish: function(position) { -    this.effects.each( function(effect) { -      effect.render(1.0); -      effect.cancel(); -      effect.event('beforeFinish'); -      if (effect.finish) effect.finish(position); -      effect.event('afterFinish'); -    }); -  } -}); - -Effect.Tween = Class.create(Effect.Base, { -  initialize: function(object, from, to) { -    object = Object.isString(object) ? $(object) : object; -    var args = $A(arguments), method = args.last(), -      options = args.length == 5 ? args[3] : null; -    this.method = Object.isFunction(method) ? method.bind(object) : -      Object.isFunction(object[method]) ? object[method].bind(object) : -      function(value) { object[method] = value }; -    this.start(Object.extend({ from: from, to: to }, options || { })); -  }, -  update: function(position) { -    this.method(position); -  } -}); - -Effect.Event = Class.create(Effect.Base, { -  initialize: function() { -    this.start(Object.extend({ duration: 0 }, arguments[0] || { })); -  }, -  update: Prototype.emptyFunction -}); - -Effect.Opacity = Class.create(Effect.Base, { -  initialize: function(element) { -    this.element = $(element); -    if (!this.element) throw(Effect._elementDoesNotExistError); -    // make this work on IE on elements without 'layout' -    if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) -      this.element.setStyle({zoom: 1}); -    var options = Object.extend({ -      from: this.element.getOpacity() || 0.0, -      to:   1.0 -    }, arguments[1] || { }); -    this.start(options); -  }, -  update: function(position) { -    this.element.setOpacity(position); -  } -}); - -Effect.Move = Class.create(Effect.Base, { -  initialize: function(element) { -    this.element = $(element); -    if (!this.element) throw(Effect._elementDoesNotExistError); -    var options = Object.extend({ -      x:    0, -      y:    0, -      mode: 'relative' -    }, arguments[1] || { }); -    this.start(options); -  }, -  setup: function() { -    this.element.makePositioned(); -    this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); -    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0'); -    if (this.options.mode == 'absolute') { -      this.options.x = this.options.x - this.originalLeft; -      this.options.y = this.options.y - this.originalTop; -    } -  }, -  update: function(position) { -    this.element.setStyle({ -      left: (this.options.x  * position + this.originalLeft).round() + 'px', -      top:  (this.options.y  * position + this.originalTop).round()  + 'px' -    }); -  } -}); - -// for backwards compatibility -Effect.MoveBy = function(element, toTop, toLeft) { -  return new Effect.Move(element, -    Object.extend({ x: toLeft, y: toTop }, arguments[3] || { })); -}; - -Effect.Scale = Class.create(Effect.Base, { -  initialize: function(element, percent) { -    this.element = $(element); -    if (!this.element) throw(Effect._elementDoesNotExistError); -    var options = Object.extend({ -      scaleX: true, -      scaleY: true, -      scaleContent: true, -      scaleFromCenter: false, -      scaleMode: 'box',        // 'box' or 'contents' or { } with provided values -      scaleFrom: 100.0, -      scaleTo:   percent -    }, arguments[2] || { }); -    this.start(options); -  }, -  setup: function() { -    this.restoreAfterFinish = this.options.restoreAfterFinish || false; -    this.elementPositioning = this.element.getStyle('position'); - -    this.originalStyle = { }; -    ['top','left','width','height','fontSize'].each( function(k) { -      this.originalStyle[k] = this.element.style[k]; -    }.bind(this)); - -    this.originalTop  = this.element.offsetTop; -    this.originalLeft = this.element.offsetLeft; - -    var fontSize = this.element.getStyle('font-size') || '100%'; -    ['em','px','%','pt'].each( function(fontSizeType) { -      if (fontSize.indexOf(fontSizeType)>0) { -        this.fontSize     = parseFloat(fontSize); -        this.fontSizeType = fontSizeType; -      } -    }.bind(this)); - -    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; - -    this.dims = null; -    if (this.options.scaleMode=='box') -      this.dims = [this.element.offsetHeight, this.element.offsetWidth]; -    if (/^content/.test(this.options.scaleMode)) -      this.dims = [this.element.scrollHeight, this.element.scrollWidth]; -    if (!this.dims) -      this.dims = [this.options.scaleMode.originalHeight, -                   this.options.scaleMode.originalWidth]; -  }, -  update: function(position) { -    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); -    if (this.options.scaleContent && this.fontSize) -      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); -    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); -  }, -  finish: function(position) { -    if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); -  }, -  setDimensions: function(height, width) { -    var d = { }; -    if (this.options.scaleX) d.width = width.round() + 'px'; -    if (this.options.scaleY) d.height = height.round() + 'px'; -    if (this.options.scaleFromCenter) { -      var topd  = (height - this.dims[0])/2; -      var leftd = (width  - this.dims[1])/2; -      if (this.elementPositioning == 'absolute') { -        if (this.options.scaleY) d.top = this.originalTop-topd + 'px'; -        if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; -      } else { -        if (this.options.scaleY) d.top = -topd + 'px'; -        if (this.options.scaleX) d.left = -leftd + 'px'; -      } -    } -    this.element.setStyle(d); -  } -}); - -Effect.Highlight = Class.create(Effect.Base, { -  initialize: function(element) { -    this.element = $(element); -    if (!this.element) throw(Effect._elementDoesNotExistError); -    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { }); -    this.start(options); -  }, -  setup: function() { -    // Prevent executing on elements not in the layout flow -    if (this.element.getStyle('display')=='none') { this.cancel(); return; } -    // Disable background image during the effect -    this.oldStyle = { }; -    if (!this.options.keepBackgroundImage) { -      this.oldStyle.backgroundImage = this.element.getStyle('background-image'); -      this.element.setStyle({backgroundImage: 'none'}); -    } -    if (!this.options.endcolor) -      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); -    if (!this.options.restorecolor) -      this.options.restorecolor = this.element.getStyle('background-color'); -    // init color calculations -    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); -    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); -  }, -  update: function(position) { -    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ -      return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) }); -  }, -  finish: function() { -    this.element.setStyle(Object.extend(this.oldStyle, { -      backgroundColor: this.options.restorecolor -    })); -  } -}); - -Effect.ScrollTo = function(element) { -  var options = arguments[1] || { }, -  scrollOffsets = document.viewport.getScrollOffsets(), -  elementOffsets = $(element).cumulativeOffset(); - -  if (options.offset) elementOffsets[1] += options.offset; - -  return new Effect.Tween(null, -    scrollOffsets.top, -    elementOffsets[1], -    options, -    function(p){ scrollTo(scrollOffsets.left, p.round()); } -  ); -}; - -/* ------------- combination effects ------------- */ - -Effect.Fade = function(element) { -  element = $(element); -  var oldOpacity = element.getInlineOpacity(); -  var options = Object.extend({ -    from: element.getOpacity() || 1.0, -    to:   0.0, -    afterFinishInternal: function(effect) { -      if (effect.options.to!=0) return; -      effect.element.hide().setStyle({opacity: oldOpacity}); -    } -  }, arguments[1] || { }); -  return new Effect.Opacity(element,options); -}; - -Effect.Appear = function(element) { -  element = $(element); -  var options = Object.extend({ -  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), -  to:   1.0, -  // force Safari to render floated elements properly -  afterFinishInternal: function(effect) { -    effect.element.forceRerendering(); -  }, -  beforeSetup: function(effect) { -    effect.element.setOpacity(effect.options.from).show(); -  }}, arguments[1] || { }); -  return new Effect.Opacity(element,options); -}; - -Effect.Puff = function(element) { -  element = $(element); -  var oldStyle = { -    opacity: element.getInlineOpacity(), -    position: element.getStyle('position'), -    top:  element.style.top, -    left: element.style.left, -    width: element.style.width, -    height: element.style.height -  }; -  return new Effect.Parallel( -   [ new Effect.Scale(element, 200, -      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), -     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], -     Object.extend({ duration: 1.0, -      beforeSetupInternal: function(effect) { -        Position.absolutize(effect.effects[0].element); -      }, -      afterFinishInternal: function(effect) { -         effect.effects[0].element.hide().setStyle(oldStyle); } -     }, arguments[1] || { }) -   ); -}; - -Effect.BlindUp = function(element) { -  element = $(element); -  element.makeClipping(); -  return new Effect.Scale(element, 0, -    Object.extend({ scaleContent: false, -      scaleX: false, -      restoreAfterFinish: true, -      afterFinishInternal: function(effect) { -        effect.element.hide().undoClipping(); -      } -    }, arguments[1] || { }) -  ); -}; - -Effect.BlindDown = function(element) { -  element = $(element); -  var elementDimensions = element.getDimensions(); -  return new Effect.Scale(element, 100, Object.extend({ -    scaleContent: false, -    scaleX: false, -    scaleFrom: 0, -    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, -    restoreAfterFinish: true, -    afterSetup: function(effect) { -      effect.element.makeClipping().setStyle({height: '0px'}).show(); -    }, -    afterFinishInternal: function(effect) { -      effect.element.undoClipping(); -    } -  }, arguments[1] || { })); -}; - -Effect.SwitchOff = function(element) { -  element = $(element); -  var oldOpacity = element.getInlineOpacity(); -  return new Effect.Appear(element, Object.extend({ -    duration: 0.4, -    from: 0, -    transition: Effect.Transitions.flicker, -    afterFinishInternal: function(effect) { -      new Effect.Scale(effect.element, 1, { -        duration: 0.3, scaleFromCenter: true, -        scaleX: false, scaleContent: false, restoreAfterFinish: true, -        beforeSetup: function(effect) { -          effect.element.makePositioned().makeClipping(); -        }, -        afterFinishInternal: function(effect) { -          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); -        } -      }); -    } -  }, arguments[1] || { })); -}; - -Effect.DropOut = function(element) { -  element = $(element); -  var oldStyle = { -    top: element.getStyle('top'), -    left: element.getStyle('left'), -    opacity: element.getInlineOpacity() }; -  return new Effect.Parallel( -    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), -      new Effect.Opacity(element, { sync: true, to: 0.0 }) ], -    Object.extend( -      { duration: 0.5, -        beforeSetup: function(effect) { -          effect.effects[0].element.makePositioned(); -        }, -        afterFinishInternal: function(effect) { -          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); -        } -      }, arguments[1] || { })); -}; - -Effect.Shake = function(element) { -  element = $(element); -  var options = Object.extend({ -    distance: 20, -    duration: 0.5 -  }, arguments[1] || {}); -  var distance = parseFloat(options.distance); -  var split = parseFloat(options.duration) / 10.0; -  var oldStyle = { -    top: element.getStyle('top'), -    left: element.getStyle('left') }; -    return new Effect.Move(element, -      { x:  distance, y: 0, duration: split, afterFinishInternal: function(effect) { -    new Effect.Move(effect.element, -      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) { -    new Effect.Move(effect.element, -      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) { -    new Effect.Move(effect.element, -      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) { -    new Effect.Move(effect.element, -      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) { -    new Effect.Move(effect.element, -      { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) { -        effect.element.undoPositioned().setStyle(oldStyle); -  }}); }}); }}); }}); }}); }}); -}; - -Effect.SlideDown = function(element) { -  element = $(element).cleanWhitespace(); -  // SlideDown need to have the content of the element wrapped in a container element with fixed height! -  var oldInnerBottom = element.down().getStyle('bottom'); -  var elementDimensions = element.getDimensions(); -  return new Effect.Scale(element, 100, Object.extend({ -    scaleContent: false, -    scaleX: false, -    scaleFrom: window.opera ? 0 : 1, -    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, -    restoreAfterFinish: true, -    afterSetup: function(effect) { -      effect.element.makePositioned(); -      effect.element.down().makePositioned(); -      if (window.opera) effect.element.setStyle({top: ''}); -      effect.element.makeClipping().setStyle({height: '0px'}).show(); -    }, -    afterUpdateInternal: function(effect) { -      effect.element.down().setStyle({bottom: -        (effect.dims[0] - effect.element.clientHeight) + 'px' }); -    }, -    afterFinishInternal: function(effect) { -      effect.element.undoClipping().undoPositioned(); -      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } -    }, arguments[1] || { }) -  ); -}; - -Effect.SlideUp = function(element) { -  element = $(element).cleanWhitespace(); -  var oldInnerBottom = element.down().getStyle('bottom'); -  var elementDimensions = element.getDimensions(); -  return new Effect.Scale(element, window.opera ? 0 : 1, -   Object.extend({ scaleContent: false, -    scaleX: false, -    scaleMode: 'box', -    scaleFrom: 100, -    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, -    restoreAfterFinish: true, -    afterSetup: function(effect) { -      effect.element.makePositioned(); -      effect.element.down().makePositioned(); -      if (window.opera) effect.element.setStyle({top: ''}); -      effect.element.makeClipping().show(); -    }, -    afterUpdateInternal: function(effect) { -      effect.element.down().setStyle({bottom: -        (effect.dims[0] - effect.element.clientHeight) + 'px' }); -    }, -    afterFinishInternal: function(effect) { -      effect.element.hide().undoClipping().undoPositioned(); -      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); -    } -   }, arguments[1] || { }) -  ); -}; - -// Bug in opera makes the TD containing this element expand for a instance after finish -Effect.Squish = function(element) { -  return new Effect.Scale(element, window.opera ? 1 : 0, { -    restoreAfterFinish: true, -    beforeSetup: function(effect) { -      effect.element.makeClipping(); -    }, -    afterFinishInternal: function(effect) { -      effect.element.hide().undoClipping(); -    } -  }); -}; - -Effect.Grow = function(element) { -  element = $(element); -  var options = Object.extend({ -    direction: 'center', -    moveTransition: Effect.Transitions.sinoidal, -    scaleTransition: Effect.Transitions.sinoidal, -    opacityTransition: Effect.Transitions.full -  }, arguments[1] || { }); -  var oldStyle = { -    top: element.style.top, -    left: element.style.left, -    height: element.style.height, -    width: element.style.width, -    opacity: element.getInlineOpacity() }; - -  var dims = element.getDimensions(); -  var initialMoveX, initialMoveY; -  var moveX, moveY; - -  switch (options.direction) { -    case 'top-left': -      initialMoveX = initialMoveY = moveX = moveY = 0; -      break; -    case 'top-right': -      initialMoveX = dims.width; -      initialMoveY = moveY = 0; -      moveX = -dims.width; -      break; -    case 'bottom-left': -      initialMoveX = moveX = 0; -      initialMoveY = dims.height; -      moveY = -dims.height; -      break; -    case 'bottom-right': -      initialMoveX = dims.width; -      initialMoveY = dims.height; -      moveX = -dims.width; -      moveY = -dims.height; -      break; -    case 'center': -      initialMoveX = dims.width / 2; -      initialMoveY = dims.height / 2; -      moveX = -dims.width / 2; -      moveY = -dims.height / 2; -      break; -  } - -  return new Effect.Move(element, { -    x: initialMoveX, -    y: initialMoveY, -    duration: 0.01, -    beforeSetup: function(effect) { -      effect.element.hide().makeClipping().makePositioned(); -    }, -    afterFinishInternal: function(effect) { -      new Effect.Parallel( -        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), -          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), -          new Effect.Scale(effect.element, 100, { -            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, -            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) -        ], Object.extend({ -             beforeSetup: function(effect) { -               effect.effects[0].element.setStyle({height: '0px'}).show(); -             }, -             afterFinishInternal: function(effect) { -               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); -             } -           }, options) -      ); -    } -  }); -}; - -Effect.Shrink = function(element) { -  element = $(element); -  var options = Object.extend({ -    direction: 'center', -    moveTransition: Effect.Transitions.sinoidal, -    scaleTransition: Effect.Transitions.sinoidal, -    opacityTransition: Effect.Transitions.none -  }, arguments[1] || { }); -  var oldStyle = { -    top: element.style.top, -    left: element.style.left, -    height: element.style.height, -    width: element.style.width, -    opacity: element.getInlineOpacity() }; - -  var dims = element.getDimensions(); -  var moveX, moveY; - -  switch (options.direction) { -    case 'top-left': -      moveX = moveY = 0; -      break; -    case 'top-right': -      moveX = dims.width; -      moveY = 0; -      break; -    case 'bottom-left': -      moveX = 0; -      moveY = dims.height; -      break; -    case 'bottom-right': -      moveX = dims.width; -      moveY = dims.height; -      break; -    case 'center': -      moveX = dims.width / 2; -      moveY = dims.height / 2; -      break; -  } - -  return new Effect.Parallel( -    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), -      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), -      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) -    ], Object.extend({ -         beforeStartInternal: function(effect) { -           effect.effects[0].element.makePositioned().makeClipping(); -         }, -         afterFinishInternal: function(effect) { -           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } -       }, options) -  ); -}; - -Effect.Pulsate = function(element) { -  element = $(element); -  var options    = arguments[1] || { }, -    oldOpacity = element.getInlineOpacity(), -    transition = options.transition || Effect.Transitions.linear, -    reverser   = function(pos){ -      return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5); -    }; - -  return new Effect.Opacity(element, -    Object.extend(Object.extend({  duration: 2.0, from: 0, -      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } -    }, options), {transition: reverser})); -}; - -Effect.Fold = function(element) { -  element = $(element); -  var oldStyle = { -    top: element.style.top, -    left: element.style.left, -    width: element.style.width, -    height: element.style.height }; -  element.makeClipping(); -  return new Effect.Scale(element, 5, Object.extend({ -    scaleContent: false, -    scaleX: false, -    afterFinishInternal: function(effect) { -    new Effect.Scale(element, 1, { -      scaleContent: false, -      scaleY: false, -      afterFinishInternal: function(effect) { -        effect.element.hide().undoClipping().setStyle(oldStyle); -      } }); -  }}, arguments[1] || { })); -}; - -Effect.Morph = Class.create(Effect.Base, { -  initialize: function(element) { -    this.element = $(element); -    if (!this.element) throw(Effect._elementDoesNotExistError); -    var options = Object.extend({ -      style: { } -    }, arguments[1] || { }); - -    if (!Object.isString(options.style)) this.style = $H(options.style); -    else { -      if (options.style.include(':')) -        this.style = options.style.parseStyle(); -      else { -        this.element.addClassName(options.style); -        this.style = $H(this.element.getStyles()); -        this.element.removeClassName(options.style); -        var css = this.element.getStyles(); -        this.style = this.style.reject(function(style) { -          return style.value == css[style.key]; -        }); -        options.afterFinishInternal = function(effect) { -          effect.element.addClassName(effect.options.style); -          effect.transforms.each(function(transform) { -            effect.element.style[transform.style] = ''; -          }); -        }; -      } -    } -    this.start(options); -  }, - -  setup: function(){ -    function parseColor(color){ -      if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; -      color = color.parseColor(); -      return $R(0,2).map(function(i){ -        return parseInt( color.slice(i*2+1,i*2+3), 16 ); -      }); -    } -    this.transforms = this.style.map(function(pair){ -      var property = pair[0], value = pair[1], unit = null; - -      if (value.parseColor('#zzzzzz') != '#zzzzzz') { -        value = value.parseColor(); -        unit  = 'color'; -      } else if (property == 'opacity') { -        value = parseFloat(value); -        if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) -          this.element.setStyle({zoom: 1}); -      } else if (Element.CSS_LENGTH.test(value)) { -          var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); -          value = parseFloat(components[1]); -          unit = (components.length == 3) ? components[2] : null; -      } - -      var originalValue = this.element.getStyle(property); -      return { -        style: property.camelize(), -        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), -        targetValue: unit=='color' ? parseColor(value) : value, -        unit: unit -      }; -    }.bind(this)).reject(function(transform){ -      return ( -        (transform.originalValue == transform.targetValue) || -        ( -          transform.unit != 'color' && -          (isNaN(transform.originalValue) || isNaN(transform.targetValue)) -        ) -      ); -    }); -  }, -  update: function(position) { -    var style = { }, transform, i = this.transforms.length; -    while(i--) -      style[(transform = this.transforms[i]).style] = -        transform.unit=='color' ? '#'+ -          (Math.round(transform.originalValue[0]+ -            (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() + -          (Math.round(transform.originalValue[1]+ -            (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() + -          (Math.round(transform.originalValue[2]+ -            (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() : -        (transform.originalValue + -          (transform.targetValue - transform.originalValue) * position).toFixed(3) + -            (transform.unit === null ? '' : transform.unit); -    this.element.setStyle(style, true); -  } -}); - -Effect.Transform = Class.create({ -  initialize: function(tracks){ -    this.tracks  = []; -    this.options = arguments[1] || { }; -    this.addTracks(tracks); -  }, -  addTracks: function(tracks){ -    tracks.each(function(track){ -      track = $H(track); -      var data = track.values().first(); -      this.tracks.push($H({ -        ids:     track.keys().first(), -        effect:  Effect.Morph, -        options: { style: data } -      })); -    }.bind(this)); -    return this; -  }, -  play: function(){ -    return new Effect.Parallel( -      this.tracks.map(function(track){ -        var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options'); -        var elements = [$(ids) || $$(ids)].flatten(); -        return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) }); -      }).flatten(), -      this.options -    ); -  } -}); - -Element.CSS_PROPERTIES = $w( -  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + -  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + -  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + -  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + -  'fontSize fontWeight height left letterSpacing lineHeight ' + -  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ -  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + -  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + -  'right textIndent top width wordSpacing zIndex'); - -Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; - -String.__parseStyleElement = document.createElement('div'); -String.prototype.parseStyle = function(){ -  var style, styleRules = $H(); -  if (Prototype.Browser.WebKit) -    style = new Element('div',{style:this}).style; -  else { -    String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>'; -    style = String.__parseStyleElement.childNodes[0].style; -  } - -  Element.CSS_PROPERTIES.each(function(property){ -    if (style[property]) styleRules.set(property, style[property]); -  }); - -  if (Prototype.Browser.IE && this.include('opacity')) -    styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]); - -  return styleRules; -}; - -if (document.defaultView && document.defaultView.getComputedStyle) { -  Element.getStyles = function(element) { -    var css = document.defaultView.getComputedStyle($(element), null); -    return Element.CSS_PROPERTIES.inject({ }, function(styles, property) { -      styles[property] = css[property]; -      return styles; -    }); -  }; -} else { -  Element.getStyles = function(element) { -    element = $(element); -    var css = element.currentStyle, styles; -    styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) { -      results[property] = css[property]; -      return results; -    }); -    if (!styles.opacity) styles.opacity = element.getOpacity(); -    return styles; -  }; -} - -Effect.Methods = { -  morph: function(element, style) { -    element = $(element); -    new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { })); -    return element; -  }, -  visualEffect: function(element, effect, options) { -    element = $(element); -    var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1); -    new Effect[klass](element, options); -    return element; -  }, -  highlight: function(element, options) { -    element = $(element); -    new Effect.Highlight(element, options); -    return element; -  } -}; - -$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ -  'pulsate shake puff squish switchOff dropOut').each( -  function(effect) { -    Effect.Methods[effect] = function(element, options){ -      element = $(element); -      Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options); -      return element; -    }; -  } -); - -$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( -  function(f) { Effect.Methods[f] = Element[f]; } -); - -Element.addMethods(Effect.Methods);
\ No newline at end of file diff --git a/public/javascripts/excanvas.min.js b/public/javascripts/excanvas.min.js new file mode 100644 index 000000000..fcf876c74 --- /dev/null +++ b/public/javascripts/excanvas.min.js @@ -0,0 +1 @@ +if(!document.createElement("canvas").getContext){(function(){var ab=Math;var n=ab.round;var l=ab.sin;var A=ab.cos;var H=ab.abs;var N=ab.sqrt;var d=10;var f=d/2;var z=+navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];function y(){return this.context_||(this.context_=new D(this))}var t=Array.prototype.slice;function g(j,m,p){var i=t.call(arguments,2);return function(){return j.apply(m,i.concat(t.call(arguments)))}}function af(i){return String(i).replace(/&/g,"&").replace(/"/g,""")}function Y(m,j,i){if(!m.namespaces[j]){m.namespaces.add(j,i,"#default#VML")}}function R(j){Y(j,"g_vml_","urn:schemas-microsoft-com:vml");Y(j,"g_o_","urn:schemas-microsoft-com:office:office");if(!j.styleSheets.ex_canvas_){var i=j.createStyleSheet();i.owningElement.id="ex_canvas_";i.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}R(document);var e={init:function(i){var j=i||document;j.createElement("canvas");j.attachEvent("onreadystatechange",g(this.init_,this,j))},init_:function(p){var m=p.getElementsByTagName("canvas");for(var j=0;j<m.length;j++){this.initElement(m[j])}},initElement:function(j){if(!j.getContext){j.getContext=y;R(j.ownerDocument);j.innerHTML="";j.attachEvent("onpropertychange",x);j.attachEvent("onresize",W);var i=j.attributes;if(i.width&&i.width.specified){j.style.width=i.width.nodeValue+"px"}else{j.width=j.clientWidth}if(i.height&&i.height.specified){j.style.height=i.height.nodeValue+"px"}else{j.height=j.clientHeight}}return j}};function x(j){var i=j.srcElement;switch(j.propertyName){case"width":i.getContext().clearRect();i.style.width=i.attributes.width.nodeValue+"px";i.firstChild.style.width=i.clientWidth+"px";break;case"height":i.getContext().clearRect();i.style.height=i.attributes.height.nodeValue+"px";i.firstChild.style.height=i.clientHeight+"px";break}}function W(j){var i=j.srcElement;if(i.firstChild){i.firstChild.style.width=i.clientWidth+"px";i.firstChild.style.height=i.clientHeight+"px"}}e.init();var k=[];for(var ae=0;ae<16;ae++){for(var ad=0;ad<16;ad++){k[ae*16+ad]=ae.toString(16)+ad.toString(16)}}function B(){return[[1,0,0],[0,1,0],[0,0,1]]}function J(p,m){var j=B();for(var i=0;i<3;i++){for(var ah=0;ah<3;ah++){var Z=0;for(var ag=0;ag<3;ag++){Z+=p[i][ag]*m[ag][ah]}j[i][ah]=Z}}return j}function v(j,i){i.fillStyle=j.fillStyle;i.lineCap=j.lineCap;i.lineJoin=j.lineJoin;i.lineWidth=j.lineWidth;i.miterLimit=j.miterLimit;i.shadowBlur=j.shadowBlur;i.shadowColor=j.shadowColor;i.shadowOffsetX=j.shadowOffsetX;i.shadowOffsetY=j.shadowOffsetY;i.strokeStyle=j.strokeStyle;i.globalAlpha=j.globalAlpha;i.font=j.font;i.textAlign=j.textAlign;i.textBaseline=j.textBaseline;i.arcScaleX_=j.arcScaleX_;i.arcScaleY_=j.arcScaleY_;i.lineScale_=j.lineScale_}var b={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function M(j){var p=j.indexOf("(",3);var i=j.indexOf(")",p+1);var m=j.substring(p+1,i).split(",");if(m.length!=4||j.charAt(3)!="a"){m[3]=1}return m}function c(i){return parseFloat(i)/100}function r(j,m,i){return Math.min(i,Math.max(m,j))}function I(ag){var i,ai,aj,ah,ak,Z;ah=parseFloat(ag[0])/360%360;if(ah<0){ah++}ak=r(c(ag[1]),0,1);Z=r(c(ag[2]),0,1);if(ak==0){i=ai=aj=Z}else{var j=Z<0.5?Z*(1+ak):Z+ak-Z*ak;var m=2*Z-j;i=a(m,j,ah+1/3);ai=a(m,j,ah);aj=a(m,j,ah-1/3)}return"#"+k[Math.floor(i*255)]+k[Math.floor(ai*255)]+k[Math.floor(aj*255)]}function a(j,i,m){if(m<0){m++}if(m>1){m--}if(6*m<1){return j+(i-j)*6*m}else{if(2*m<1){return i}else{if(3*m<2){return j+(i-j)*(2/3-m)*6}else{return j}}}}var C={};function F(j){if(j in C){return C[j]}var ag,Z=1;j=String(j);if(j.charAt(0)=="#"){ag=j}else{if(/^rgb/.test(j)){var p=M(j);var ag="#",ah;for(var m=0;m<3;m++){if(p[m].indexOf("%")!=-1){ah=Math.floor(c(p[m])*255)}else{ah=+p[m]}ag+=k[r(ah,0,255)]}Z=+p[3]}else{if(/^hsl/.test(j)){var p=M(j);ag=I(p);Z=p[3]}else{ag=b[j]||j}}}return C[j]={color:ag,alpha:Z}}var o={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var L={};function E(i){if(L[i]){return L[i]}var p=document.createElement("div");var m=p.style;try{m.font=i}catch(j){}return L[i]={style:m.fontStyle||o.style,variant:m.fontVariant||o.variant,weight:m.fontWeight||o.weight,size:m.fontSize||o.size,family:m.fontFamily||o.family}}function u(m,j){var i={};for(var ah in m){i[ah]=m[ah]}var ag=parseFloat(j.currentStyle.fontSize),Z=parseFloat(m.size);if(typeof m.size=="number"){i.size=m.size}else{if(m.size.indexOf("px")!=-1){i.size=Z}else{if(m.size.indexOf("em")!=-1){i.size=ag*Z}else{if(m.size.indexOf("%")!=-1){i.size=(ag/100)*Z}else{if(m.size.indexOf("pt")!=-1){i.size=Z/0.75}else{i.size=ag}}}}}i.size*=0.981;return i}function ac(i){return i.style+" "+i.variant+" "+i.weight+" "+i.size+"px "+i.family}var s={butt:"flat",round:"round"};function S(i){return s[i]||"square"}function D(i){this.m_=B();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=d*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var m="width:"+i.clientWidth+"px;height:"+i.clientHeight+"px;overflow:hidden;position:absolute";var j=i.ownerDocument.createElement("div");j.style.cssText=m;i.appendChild(j);var p=j.cloneNode(false);p.style.backgroundColor="red";p.style.filter="alpha(opacity=0)";i.appendChild(p);this.element_=j;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var q=D.prototype;q.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};q.beginPath=function(){this.currentPath_=[]};q.moveTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"moveTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.lineTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"lineTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.bezierCurveTo=function(m,j,ak,aj,ai,ag){var i=V(this,ai,ag);var ah=V(this,m,j);var Z=V(this,ak,aj);K(this,ah,Z,i)};function K(i,Z,m,j){i.currentPath_.push({type:"bezierCurveTo",cp1x:Z.x,cp1y:Z.y,cp2x:m.x,cp2y:m.y,x:j.x,y:j.y});i.currentX_=j.x;i.currentY_=j.y}q.quadraticCurveTo=function(ai,m,j,i){var ah=V(this,ai,m);var ag=V(this,j,i);var aj={x:this.currentX_+2/3*(ah.x-this.currentX_),y:this.currentY_+2/3*(ah.y-this.currentY_)};var Z={x:aj.x+(ag.x-this.currentX_)/3,y:aj.y+(ag.y-this.currentY_)/3};K(this,aj,Z,ag)};q.arc=function(al,aj,ak,ag,j,m){ak*=d;var ap=m?"at":"wa";var am=al+A(ag)*ak-f;var ao=aj+l(ag)*ak-f;var i=al+A(j)*ak-f;var an=aj+l(j)*ak-f;if(am==i&&!m){am+=0.125}var Z=V(this,al,aj);var ai=V(this,am,ao);var ah=V(this,i,an);this.currentPath_.push({type:ap,x:Z.x,y:Z.y,radius:ak,xStart:ai.x,yStart:ai.y,xEnd:ah.x,yEnd:ah.y})};q.rect=function(m,j,i,p){this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath()};q.strokeRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.stroke();this.currentPath_=Z};q.fillRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.fill();this.currentPath_=Z};q.createLinearGradient=function(j,p,i,m){var Z=new U("gradient");Z.x0_=j;Z.y0_=p;Z.x1_=i;Z.y1_=m;return Z};q.createRadialGradient=function(p,ag,m,j,Z,i){var ah=new U("gradientradial");ah.x0_=p;ah.y0_=ag;ah.r0_=m;ah.x1_=j;ah.y1_=Z;ah.r1_=i;return ah};q.drawImage=function(aq,m){var aj,ah,al,ay,ao,am,at,aA;var ak=aq.runtimeStyle.width;var ap=aq.runtimeStyle.height;aq.runtimeStyle.width="auto";aq.runtimeStyle.height="auto";var ai=aq.width;var aw=aq.height;aq.runtimeStyle.width=ak;aq.runtimeStyle.height=ap;if(arguments.length==3){aj=arguments[1];ah=arguments[2];ao=am=0;at=al=ai;aA=ay=aw}else{if(arguments.length==5){aj=arguments[1];ah=arguments[2];al=arguments[3];ay=arguments[4];ao=am=0;at=ai;aA=aw}else{if(arguments.length==9){ao=arguments[1];am=arguments[2];at=arguments[3];aA=arguments[4];aj=arguments[5];ah=arguments[6];al=arguments[7];ay=arguments[8]}else{throw Error("Invalid number of arguments")}}}var az=V(this,aj,ah);var p=at/2;var j=aA/2;var ax=[];var i=10;var ag=10;ax.push(" <g_vml_:group",' coordsize="',d*i,",",d*ag,'"',' coordorigin="0,0"',' style="width:',i,"px;height:",ag,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var Z=[];Z.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",n(az.x/d),",","Dy=",n(az.y/d),"");var av=az;var au=V(this,aj+al,ah);var ar=V(this,aj,ah+ay);var an=V(this,aj+al,ah+ay);av.x=ab.max(av.x,au.x,ar.x,an.x);av.y=ab.max(av.y,au.y,ar.y,an.y);ax.push("padding:0 ",n(av.x/d),"px ",n(av.y/d),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",Z.join(""),", sizingmethod='clip');")}else{ax.push("top:",n(az.y/d),"px;left:",n(az.x/d),"px;")}ax.push(' ">','<g_vml_:image src="',aq.src,'"',' style="width:',d*al,"px;"," height:",d*ay,'px"',' cropleft="',ao/ai,'"',' croptop="',am/aw,'"',' cropright="',(ai-ao-at)/ai,'"',' cropbottom="',(aw-am-aA)/aw,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",ax.join(""))};q.stroke=function(ao){var Z=10;var ap=10;var ag=5000;var ai={x:null,y:null};var an={x:null,y:null};for(var aj=0;aj<this.currentPath_.length;aj+=ag){var am=[];var ah=false;am.push("<g_vml_:shape",' filled="',!!ao,'"',' style="position:absolute;width:',Z,"px;height:",ap,'px;"',' coordorigin="0,0"',' coordsize="',d*Z,",",d*ap,'"',' stroked="',!ao,'"',' path="');var aq=false;for(var ak=aj;ak<Math.min(aj+ag,this.currentPath_.length);ak++){if(ak%ag==0&&ak>0){am.push(" m ",n(this.currentPath_[ak-1].x),",",n(this.currentPath_[ak-1].y))}var m=this.currentPath_[ak];var al;switch(m.type){case"moveTo":al=m;am.push(" m ",n(m.x),",",n(m.y));break;case"lineTo":am.push(" l ",n(m.x),",",n(m.y));break;case"close":am.push(" x ");m=null;break;case"bezierCurveTo":am.push(" c ",n(m.cp1x),",",n(m.cp1y),",",n(m.cp2x),",",n(m.cp2y),",",n(m.x),",",n(m.y));break;case"at":case"wa":am.push(" ",m.type," ",n(m.x-this.arcScaleX_*m.radius),",",n(m.y-this.arcScaleY_*m.radius)," ",n(m.x+this.arcScaleX_*m.radius),",",n(m.y+this.arcScaleY_*m.radius)," ",n(m.xStart),",",n(m.yStart)," ",n(m.xEnd),",",n(m.yEnd));break}if(m){if(ai.x==null||m.x<ai.x){ai.x=m.x}if(an.x==null||m.x>an.x){an.x=m.x}if(ai.y==null||m.y<ai.y){ai.y=m.y}if(an.y==null||m.y>an.y){an.y=m.y}}}am.push(' ">');if(!ao){w(this,am)}else{G(this,am,ai,an)}am.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",am.join(""))}};function w(m,ag){var j=F(m.strokeStyle);var p=j.color;var Z=j.alpha*m.globalAlpha;var i=m.lineScale_*m.lineWidth;if(i<1){Z*=i}ag.push("<g_vml_:stroke",' opacity="',Z,'"',' joinstyle="',m.lineJoin,'"',' miterlimit="',m.miterLimit,'"',' endcap="',S(m.lineCap),'"',' weight="',i,'px"',' color="',p,'" />')}function G(aq,ai,aK,ar){var aj=aq.fillStyle;var aB=aq.arcScaleX_;var aA=aq.arcScaleY_;var j=ar.x-aK.x;var p=ar.y-aK.y;if(aj instanceof U){var an=0;var aF={x:0,y:0};var ax=0;var am=1;if(aj.type_=="gradient"){var al=aj.x0_/aB;var m=aj.y0_/aA;var ak=aj.x1_/aB;var aM=aj.y1_/aA;var aJ=V(aq,al,m);var aI=V(aq,ak,aM);var ag=aI.x-aJ.x;var Z=aI.y-aJ.y;an=Math.atan2(ag,Z)*180/Math.PI;if(an<0){an+=360}if(an<0.000001){an=0}}else{var aJ=V(aq,aj.x0_,aj.y0_);aF={x:(aJ.x-aK.x)/j,y:(aJ.y-aK.y)/p};j/=aB*d;p/=aA*d;var aD=ab.max(j,p);ax=2*aj.r0_/aD;am=2*aj.r1_/aD-ax}var av=aj.colors_;av.sort(function(aN,i){return aN.offset-i.offset});var ap=av.length;var au=av[0].color;var at=av[ap-1].color;var az=av[0].alpha*aq.globalAlpha;var ay=av[ap-1].alpha*aq.globalAlpha;var aE=[];for(var aH=0;aH<ap;aH++){var ao=av[aH];aE.push(ao.offset*am+ax+" "+ao.color)}ai.push('<g_vml_:fill type="',aj.type_,'"',' method="none" focus="100%"',' color="',au,'"',' color2="',at,'"',' colors="',aE.join(","),'"',' opacity="',ay,'"',' g_o_:opacity2="',az,'"',' angle="',an,'"',' focusposition="',aF.x,",",aF.y,'" />')}else{if(aj instanceof T){if(j&&p){var ah=-aK.x;var aC=-aK.y;ai.push("<g_vml_:fill",' position="',ah/j*aB*aB,",",aC/p*aA*aA,'"',' type="tile"',' src="',aj.src_,'" />')}}else{var aL=F(aq.fillStyle);var aw=aL.color;var aG=aL.alpha*aq.globalAlpha;ai.push('<g_vml_:fill color="',aw,'" opacity="',aG,'" />')}}}q.fill=function(){this.stroke(true)};q.closePath=function(){this.currentPath_.push({type:"close"})};function V(j,Z,p){var i=j.m_;return{x:d*(Z*i[0][0]+p*i[1][0]+i[2][0])-f,y:d*(Z*i[0][1]+p*i[1][1]+i[2][1])-f}}q.save=function(){var i={};v(this,i);this.aStack_.push(i);this.mStack_.push(this.m_);this.m_=J(B(),this.m_)};q.restore=function(){if(this.aStack_.length){v(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function h(i){return isFinite(i[0][0])&&isFinite(i[0][1])&&isFinite(i[1][0])&&isFinite(i[1][1])&&isFinite(i[2][0])&&isFinite(i[2][1])}function aa(j,i,p){if(!h(i)){return}j.m_=i;if(p){var Z=i[0][0]*i[1][1]-i[0][1]*i[1][0];j.lineScale_=N(H(Z))}}q.translate=function(m,j){var i=[[1,0,0],[0,1,0],[m,j,1]];aa(this,J(i,this.m_),false)};q.rotate=function(j){var p=A(j);var m=l(j);var i=[[p,m,0],[-m,p,0],[0,0,1]];aa(this,J(i,this.m_),false)};q.scale=function(m,j){this.arcScaleX_*=m;this.arcScaleY_*=j;var i=[[m,0,0],[0,j,0],[0,0,1]];aa(this,J(i,this.m_),true)};q.transform=function(Z,p,ah,ag,j,i){var m=[[Z,p,0],[ah,ag,0],[j,i,1]];aa(this,J(m,this.m_),true)};q.setTransform=function(ag,Z,ai,ah,p,j){var i=[[ag,Z,0],[ai,ah,0],[p,j,1]];aa(this,i,true)};q.drawText_=function(am,ak,aj,ap,ai){var ao=this.m_,at=1000,j=0,ar=at,ah={x:0,y:0},ag=[];var i=u(E(this.font),this.element_);var p=ac(i);var au=this.element_.currentStyle;var Z=this.textAlign.toLowerCase();switch(Z){case"left":case"center":case"right":break;case"end":Z=au.direction=="ltr"?"right":"left";break;case"start":Z=au.direction=="rtl"?"right":"left";break;default:Z="left"}switch(this.textBaseline){case"hanging":case"top":ah.y=i.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":ah.y=-i.size/2.25;break}switch(Z){case"right":j=at;ar=0.05;break;case"center":j=ar=at/2;break}var aq=V(this,ak+ah.x,aj+ah.y);ag.push('<g_vml_:line from="',-j,' 0" to="',ar,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!ai,'" stroked="',!!ai,'" style="position:absolute;width:1px;height:1px;">');if(ai){w(this,ag)}else{G(this,ag,{x:-j,y:0},{x:ar,y:i.size})}var an=ao[0][0].toFixed(3)+","+ao[1][0].toFixed(3)+","+ao[0][1].toFixed(3)+","+ao[1][1].toFixed(3)+",0,0";var al=n(aq.x/d)+","+n(aq.y/d);ag.push('<g_vml_:skew on="t" matrix="',an,'" ',' offset="',al,'" origin="',j,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',af(am),'" style="v-text-align:',Z,";font:",af(p),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",ag.join(""))};q.fillText=function(m,i,p,j){this.drawText_(m,i,p,j,false)};q.strokeText=function(m,i,p,j){this.drawText_(m,i,p,j,true)};q.measureText=function(m){if(!this.textMeasureEl_){var i='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",i);this.textMeasureEl_=this.element_.lastChild}var j=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(j.createTextNode(m));return{width:this.textMeasureEl_.offsetWidth}};q.clip=function(){};q.arcTo=function(){};q.createPattern=function(j,i){return new T(j,i)};function U(i){this.type_=i;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}U.prototype.addColorStop=function(j,i){i=F(i);this.colors_.push({offset:j,color:i.color,alpha:i.alpha})};function T(j,i){Q(j);switch(i){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=i;break;default:O("SYNTAX_ERR")}this.src_=j.src;this.width_=j.width;this.height_=j.height}function O(i){throw new P(i)}function Q(i){if(!i||i.nodeType!=1||i.tagName!="IMG"){O("TYPE_MISMATCH_ERR")}if(i.readyState!="complete"){O("INVALID_STATE_ERR")}}function P(i){this.code=this[i];this.message=i+": DOM Exception "+this.code}var X=P.prototype=new Error;X.INDEX_SIZE_ERR=1;X.DOMSTRING_SIZE_ERR=2;X.HIERARCHY_REQUEST_ERR=3;X.WRONG_DOCUMENT_ERR=4;X.INVALID_CHARACTER_ERR=5;X.NO_DATA_ALLOWED_ERR=6;X.NO_MODIFICATION_ALLOWED_ERR=7;X.NOT_FOUND_ERR=8;X.NOT_SUPPORTED_ERR=9;X.INUSE_ATTRIBUTE_ERR=10;X.INVALID_STATE_ERR=11;X.SYNTAX_ERR=12;X.INVALID_MODIFICATION_ERR=13;X.NAMESPACE_ERR=14;X.INVALID_ACCESS_ERR=15;X.VALIDATION_ERR=16;X.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=e;CanvasRenderingContext2D=D;CanvasGradient=U;CanvasPattern=T;DOMException=P})()};
\ No newline at end of file diff --git a/public/javascripts/jquery.flot.axislabels.js b/public/javascripts/jquery.flot.axislabels.js new file mode 100644 index 000000000..d75b03ba9 --- /dev/null +++ b/public/javascripts/jquery.flot.axislabels.js @@ -0,0 +1,451 @@ +/* +Axis Labels Plugin for flot. +http://github.com/markrcote/flot-axislabels + +Original code is Copyright (c) 2010 Xuan Luo. +Original code was released under the GPLv3 license by Xuan Luo, September 2010. +Original code was rereleased under the MIT license by Xuan Luo, April 2012. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +(function ($) { +    var options = { }; + +    function canvasSupported() { +        return !!document.createElement('canvas').getContext; +    } + +    function canvasTextSupported() { +        if (!canvasSupported()) { +            return false; +        } +        var dummy_canvas = document.createElement('canvas'); +        var context = dummy_canvas.getContext('2d'); +        return typeof context.fillText == 'function'; +    } + +    function css3TransitionSupported() { +        var div = document.createElement('div'); +        return typeof div.style.MozTransition != 'undefined'    // Gecko +            || typeof div.style.OTransition != 'undefined'      // Opera +            || typeof div.style.webkitTransition != 'undefined' // WebKit +            || typeof div.style.transition != 'undefined'; +    } + + +    function AxisLabel(axisName, position, padding, plot, opts) { +        this.axisName = axisName; +        this.position = position; +        this.padding = padding; +        this.plot = plot; +        this.opts = opts; +        this.width = 0; +        this.height = 0; +    } + +    AxisLabel.prototype.delete = function() { +    }; + + +    CanvasAxisLabel.prototype = new AxisLabel(); +    CanvasAxisLabel.prototype.constructor = CanvasAxisLabel; +    function CanvasAxisLabel(axisName, position, padding, plot, opts) { +        AxisLabel.prototype.constructor.call(this, axisName, position, padding, +                                             plot, opts); +    } + +    CanvasAxisLabel.prototype.calculateSize = function() { +        if (!this.opts.axisLabelFontSizePixels) +            this.opts.axisLabelFontSizePixels = 14; +        if (!this.opts.axisLabelFontFamily) +            this.opts.axisLabelFontFamily = 'sans-serif'; + +        var textWidth = this.opts.axisLabelFontSizePixels + this.padding; +        var textHeight = this.opts.axisLabelFontSizePixels + this.padding; +        if (this.position == 'left' || this.position == 'right') { +            this.width = this.opts.axisLabelFontSizePixels + this.padding; +            this.height = 0; +        } else { +            this.width = 0; +            this.height = this.opts.axisLabelFontSizePixels + this.padding; +        } +    }; + +    CanvasAxisLabel.prototype.draw = function(box) { +        var ctx = this.plot.getCanvas().getContext('2d'); +        ctx.save(); +        ctx.font = this.opts.axisLabelFontSizePixels + 'px ' + +            this.opts.axisLabelFontFamily; +        var width = ctx.measureText(this.opts.axisLabel).width; +        var height = this.opts.axisLabelFontSizePixels; +        var x, y, angle = 0; +        if (this.position == 'top') { +            x = box.left + box.width/2 - width/2; +            y = box.top + height*0.72; +        } else if (this.position == 'bottom') { +            x = box.left + box.width/2 - width/2; +            y = box.top + box.height - height*0.72; +        } else if (this.position == 'left') { +            x = box.left + height*0.72; +            y = box.height/2 + box.top + width/2; +            angle = -Math.PI/2; +        } else if (this.position == 'right') { +            x = box.left + box.width - height*0.72; +            y = box.height/2 + box.top - width/2; +            angle = Math.PI/2; +        } +        ctx.translate(x, y); +        ctx.rotate(angle); +        ctx.fillText(this.opts.axisLabel, 0, 0); +        ctx.restore(); +    }; + + +    HtmlAxisLabel.prototype = new AxisLabel(); +    HtmlAxisLabel.prototype.constructor = HtmlAxisLabel; +    function HtmlAxisLabel(axisName, position, padding, plot, opts) { +        AxisLabel.prototype.constructor.call(this, axisName, position, +                                             padding, plot, opts); +        this.elem = null; +    } + +    HtmlAxisLabel.prototype.calculateSize = function() { +        var elem = $('<div class="axisLabels" style="position:absolute;">' + +                     this.opts.axisLabel + '</div>'); +        this.plot.getPlaceholder().append(elem); +        // store height and width of label itself, for use in draw() +        this.labelWidth = elem.outerWidth(true); +        this.labelHeight = elem.outerHeight(true); +        elem.remove(); + +        this.width = this.height = 0; +        if (this.position == 'left' || this.position == 'right') { +            this.width = this.labelWidth + this.padding; +        } else { +            this.height = this.labelHeight + this.padding; +        } +    }; + +    HtmlAxisLabel.prototype.delete = function() { +        if (this.elem) { +            this.elem.remove(); +        } +    }; + +    HtmlAxisLabel.prototype.draw = function(box) { +        this.plot.getPlaceholder().find('#' + this.axisName + 'Label').remove(); +        this.elem = $('<div id="' + this.axisName + +                      'Label" " class="axisLabels" style="position:absolute;">' +                      + this.opts.axisLabel + '</div>'); +        this.plot.getPlaceholder().append(this.elem); +        if (this.position == 'top') { +            this.elem.css('left', box.left + box.width/2 - this.labelWidth/2 + +                          'px'); +            this.elem.css('top', box.top + 'px'); +        } else if (this.position == 'bottom') { +            this.elem.css('left', box.left + box.width/2 - this.labelWidth/2 + +                          'px'); +            this.elem.css('top', box.top + box.height - this.labelHeight + +                          'px'); +        } else if (this.position == 'left') { +            this.elem.css('top', box.top + box.height/2 - this.labelHeight/2 + +                          'px'); +            this.elem.css('left', box.left + 'px'); +        } else if (this.position == 'right') { +            this.elem.css('top', box.top + box.height/2 - this.labelHeight/2 + +                          'px'); +            this.elem.css('left', box.left + box.width - this.labelWidth + +                          'px'); +        } +    }; + + +    CssTransformAxisLabel.prototype = new HtmlAxisLabel(); +    CssTransformAxisLabel.prototype.constructor = CssTransformAxisLabel; +    function CssTransformAxisLabel(axisName, position, padding, plot, opts) { +        HtmlAxisLabel.prototype.constructor.call(this, axisName, position, +                                                 padding, plot, opts); +    } + +    CssTransformAxisLabel.prototype.calculateSize = function() { +        HtmlAxisLabel.prototype.calculateSize.call(this); +        this.width = this.height = 0; +        if (this.position == 'left' || this.position == 'right') { +            this.width = this.labelHeight + this.padding; +        } else { +            this.height = this.labelHeight + this.padding; +        } +    }; + +    CssTransformAxisLabel.prototype.transforms = function(degrees, x, y) { +        var stransforms = { +            '-moz-transform': '', +            '-webkit-transform': '', +            '-o-transform': '', +            '-ms-transform': '' +        }; +        if (x != 0 || y != 0) { +            var stdTranslate = ' translate(' + x + 'px, ' + y + 'px)'; +            stransforms['-moz-transform'] += stdTranslate; +            stransforms['-webkit-transform'] += stdTranslate; +            stransforms['-o-transform'] += stdTranslate; +            stransforms['-ms-transform'] += stdTranslate; +        } +        if (degrees != 0) { +            var rotation = degrees / 90; +            var stdRotate = ' rotate(' + degrees + 'deg)'; +            stransforms['-moz-transform'] += stdRotate; +            stransforms['-webkit-transform'] += stdRotate; +            stransforms['-o-transform'] += stdRotate; +            stransforms['-ms-transform'] += stdRotate; +        } +        var s = 'top: 0; left: 0; '; +        for (var prop in stransforms) { +            if (stransforms[prop]) { +                s += prop + ':' + stransforms[prop] + ';'; +            } +        } +        s += ';'; +        return s; +    }; + +    CssTransformAxisLabel.prototype.calculateOffsets = function(box) { +        var offsets = { x: 0, y: 0, degrees: 0 }; +        if (this.position == 'bottom') { +            offsets.x = box.left + box.width/2 - this.labelWidth/2; +            offsets.y = box.top + box.height - this.labelHeight; +        } else if (this.position == 'top') { +            offsets.x = box.left + box.width/2 - this.labelWidth/2; +            offsets.y = box.top; +        } else if (this.position == 'left') { +            offsets.degrees = -90; +            offsets.x = box.left - this.labelWidth/2 + this.labelHeight/2; +            offsets.y = box.height/2 + box.top; +        } else if (this.position == 'right') { +            offsets.degrees = 90; +            offsets.x = box.left + box.width - this.labelWidth/2 +                        - this.labelHeight/2; +            offsets.y = box.height/2 + box.top; +        } +        return offsets; +    }; + +    CssTransformAxisLabel.prototype.draw = function(box) { +        this.plot.getPlaceholder().find("." + this.axisName + "Label").remove(); +        var offsets = this.calculateOffsets(box); +        this.elem = $('<div class="axisLabels ' + this.axisName + +                      'Label" style="position:absolute; ' + +                      'color: ' + this.opts.color + '; ' + +                      this.transforms(offsets.degrees, offsets.x, offsets.y) + +                      '">' + this.opts.axisLabel + '</div>'); +        this.plot.getPlaceholder().append(this.elem); +    }; + + +    IeTransformAxisLabel.prototype = new CssTransformAxisLabel(); +    IeTransformAxisLabel.prototype.constructor = IeTransformAxisLabel; +    function IeTransformAxisLabel(axisName, position, padding, plot, opts) { +        CssTransformAxisLabel.prototype.constructor.call(this, axisName, +                                                         position, padding, +                                                         plot, opts); +        this.requiresResize = false; +    } + +    IeTransformAxisLabel.prototype.transforms = function(degrees, x, y) { +        // I didn't feel like learning the crazy Matrix stuff, so this uses +        // a combination of the rotation transform and CSS positioning. +        var s = ''; +        if (degrees != 0) { +            var rotation = degrees/90; +            while (rotation < 0) { +                rotation += 4; +            } +            s += ' filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=' + rotation + '); '; +            // see below +            this.requiresResize = (this.position == 'right'); +        } +        if (x != 0) { +            s += 'left: ' + x + 'px; '; +        } +        if (y != 0) { +            s += 'top: ' + y + 'px; '; +        } +        return s; +    }; + +    IeTransformAxisLabel.prototype.calculateOffsets = function(box) { +        var offsets = CssTransformAxisLabel.prototype.calculateOffsets.call( +                          this, box); +        // adjust some values to take into account differences between +        // CSS and IE rotations. +        if (this.position == 'top') { +            // FIXME: not sure why, but placing this exactly at the top causes  +            // the top axis label to flip to the bottom... +            offsets.y = box.top + 1; +        } else if (this.position == 'left') { +            offsets.x = box.left; +            offsets.y = box.height/2 + box.top - this.labelWidth/2; +        } else if (this.position == 'right') { +            offsets.x = box.left + box.width - this.labelHeight; +            offsets.y = box.height/2 + box.top - this.labelWidth/2; +        } +        return offsets; +    }; + +    IeTransformAxisLabel.prototype.draw = function(box) { +        CssTransformAxisLabel.prototype.draw.call(this, box); +        if (this.requiresResize) { +            this.elem = this.plot.getPlaceholder().find("." + this.axisName + +                                                        "Label"); +            // Since we used CSS positioning instead of transforms for +            // translating the element, and since the positioning is done +            // before any rotations, we have to reset the width and height +            // in case the browser wrapped the text (specifically for the +            // y2axis). +            this.elem.css('width', this.labelWidth); +            this.elem.css('height', this.labelHeight); +        } +    }; + + +    function init(plot) { +        // This is kind of a hack. There are no hooks in Flot between +        // the creation and measuring of the ticks (setTicks, measureTickLabels +        // in setupGrid() ) and the drawing of the ticks and plot box +        // (insertAxisLabels in setupGrid() ). +        // +        // Therefore, we use a trick where we run the draw routine twice: +        // the first time to get the tick measurements, so that we can change +        // them, and then have it draw it again. +        var secondPass = false; + +        var axisLabels = {}; +        var axisOffsetCounts = { left: 0, right: 0, top: 0, bottom: 0 }; + +        var defaultPadding = 2;  // padding between axis and tick labels +        plot.hooks.draw.push(function (plot, ctx) { +            var hasAxisLabels = false; +            if (!secondPass) { +                // MEASURE AND SET OPTIONS +                $.each(plot.getAxes(), function(axisName, axis) { +                    var opts = axis.options // Flot 0.7 +                        || plot.getOptions()[axisName]; // Flot 0.6 + +                    // Handle redraws initiated outside of this plug-in. +                    if (axisName in axisLabels) { +                        axis.labelHeight = axis.labelHeight - +                            axisLabels[axisName].height; +                        axis.labelWidth = axis.labelWidth - +                            axisLabels[axisName].width; +                        opts.labelHeight = axis.labelHeight; +                        opts.labelWidth = axis.labelWidth; +                        axisLabels[axisName].delete(); +                        delete axisLabels[axisName]; +                    } + +                    if (!opts || !opts.axisLabel || !axis.show) +                        return; + +                    hasAxisLabels = true; +                    var renderer = null; + +                    if (!opts.axisLabelUseHtml && +                        navigator.appName == 'Microsoft Internet Explorer') { +                        var ua = navigator.userAgent; +                        var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); +                        if (re.exec(ua) != null) { +                            rv = parseFloat(RegExp.$1); +                        } +                        if (rv >= 9 && !opts.axisLabelUseCanvas && !opts.axisLabelUseHtml) { +                            renderer = CssTransformAxisLabel; +                        } else if (!opts.axisLabelUseCanvas && !opts.axisLabelUseHtml) { +                            renderer = IeTransformAxisLabel; +                        } else if (opts.axisLabelUseCanvas) { +                            renderer = CanvasAxisLabel; +                        } else { +                            renderer = HtmlAxisLabel; +                        } +                    } else { +                        if (opts.axisLabelUseHtml || (!css3TransitionSupported() && !canvasTextSupported()) && !opts.axisLabelUseCanvas) { +                            renderer = HtmlAxisLabel; +                        } else if (opts.axisLabelUseCanvas || !css3TransitionSupported()) { +                            renderer = CanvasAxisLabel; +                        } else { +                            renderer = CssTransformAxisLabel; +                        } +                    } + +                    var padding = opts.axisLabelPadding === undefined ? +                                  defaultPadding : opts.axisLabelPadding; + +                    axisLabels[axisName] = new renderer(axisName, +                                                        axis.position, padding, +                                                        plot, opts); + +                    // flot interprets axis.labelHeight and .labelWidth as +                    // the height and width of the tick labels. We increase +                    // these values to make room for the axis label and +                    // padding. + +                    axisLabels[axisName].calculateSize(); + +                    // AxisLabel.height and .width are the size of the +                    // axis label and padding. +                    // Just set opts here because axis will be sorted out on +                    // the redraw. + +                    opts.labelHeight = axis.labelHeight + +                        axisLabels[axisName].height; +                    opts.labelWidth = axis.labelWidth + +                        axisLabels[axisName].width; +                }); + +                // If there are axis labels, re-draw with new label widths and +                // heights. + +                if (hasAxisLabels) { +                    secondPass = true; +                    plot.setupGrid(); +                    plot.draw(); +                } +            } else { +                secondPass = false; +                // DRAW +                $.each(plot.getAxes(), function(axisName, axis) { +                    var opts = axis.options // Flot 0.7 +                        || plot.getOptions()[axisName]; // Flot 0.6 +                    if (!opts || !opts.axisLabel || !axis.show) +                        return; + +                    axisLabels[axisName].draw(axis.box); +                }); +            } +        }); +    } + + +    $.plot.plugins.push({ +        init: init, +        options: options, +        name: 'axisLabels', +        version: '2.0b0' +    }); +})(jQuery); diff --git a/public/javascripts/jquery.flot.errorbars.min.js b/public/javascripts/jquery.flot.errorbars.min.js new file mode 100644 index 000000000..72d7e3dc7 --- /dev/null +++ b/public/javascripts/jquery.flot.errorbars.min.js @@ -0,0 +1,63 @@ +/* Flot plugin for plotting error bars. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Error bars are used to show standard deviation and other statistical +properties in a plot. + +* Created by Rui Pereira  -  rui (dot) pereira (at) gmail (dot) com + +This plugin allows you to plot error-bars over points. Set "errorbars" inside +the points series to the axis name over which there will be error values in +your data array (*even* if you do not intend to plot them later, by setting +"show: null" on xerr/yerr). + +The plugin supports these options: + +	series: { +		points: { +			errorbars: "x" or "y" or "xy", +			xerr: { +				show: null/false or true, +				asymmetric: null/false or true, +				upperCap: null or "-" or function, +				lowerCap: null or "-" or function, +				color: null or color, +				radius: null or number +			}, +			yerr: { same options as xerr } +		} +	} + +Each data point array is expected to be of the type: + +	"x"  [ x, y, xerr ] +	"y"  [ x, y, yerr ] +	"xy" [ x, y, xerr, yerr ] + +Where xerr becomes xerr_lower,xerr_upper for the asymmetric error case, and +equivalently for yerr. Eg., a datapoint for the "xy" case with symmetric +error-bars on X and asymmetric on Y would be: + +	[ x, y, xerr, yerr_lower, yerr_upper ] + +By default no end caps are drawn. Setting upperCap and/or lowerCap to "-" will +draw a small cap perpendicular to the error bar. They can also be set to a +user-defined drawing function, with (ctx, x, y, radius) as parameters, as eg. + +	function drawSemiCircle( ctx, x, y, radius ) { +		ctx.beginPath(); +		ctx.arc( x, y, radius, 0, Math.PI, false ); +		ctx.moveTo( x - radius, y ); +		ctx.lineTo( x + radius, y ); +		ctx.stroke(); +	} + +Color and radius both default to the same ones of the points series if not +set. The independent radius parameter on xerr/yerr is useful for the case when +we may want to add error-bars to a line, without showing the interconnecting +points (with radius: 0), and still showing end caps on the error-bars. +shadowSize and lineWidth are derived as well from the points series. + +*/(function(e){function n(e,t,n,r){if(!t.points.errorbars)return;var i=[{x:!0,number:!0,required:!0},{y:!0,number:!0,required:!0}],s=t.points.errorbars;if(s=="x"||s=="xy")t.points.xerr.asymmetric?(i.push({x:!0,number:!0,required:!0}),i.push({x:!0,number:!0,required:!0})):i.push({x:!0,number:!0,required:!0});if(s=="y"||s=="xy")t.points.yerr.asymmetric?(i.push({y:!0,number:!0,required:!0}),i.push({y:!0,number:!0,required:!0})):i.push({y:!0,number:!0,required:!0});r.format=i}function r(e,t){var n=e.datapoints.points,r=null,i=null,s=null,o=null,u=e.points.xerr,a=e.points.yerr,f=e.points.errorbars;f=="x"||f=="xy"?u.asymmetric?(r=n[t+2],i=n[t+3],f=="xy"&&(a.asymmetric?(s=n[t+4],o=n[t+5]):s=n[t+4])):(r=n[t+2],f=="xy"&&(a.asymmetric?(s=n[t+3],o=n[t+4]):s=n[t+3])):f=="y"&&(a.asymmetric?(s=n[t+2],o=n[t+3]):s=n[t+2]),i==null&&(i=r),o==null&&(o=s);var l=[r,i,s,o];return u.show||(l[0]=null,l[1]=null),a.show||(l[2]=null,l[3]=null),l}function i(e,t,n){var i=n.datapoints.points,o=n.datapoints.pointsize,u=[n.xaxis,n.yaxis],a=n.points.radius,f=[n.points.xerr,n.points.yerr],l=!1;if(u[0].p2c(u[0].max)<u[0].p2c(u[0].min)){l=!0;var c=f[0].lowerCap;f[0].lowerCap=f[0].upperCap,f[0].upperCap=c}var h=!1;if(u[1].p2c(u[1].min)<u[1].p2c(u[1].max)){h=!0;var c=f[1].lowerCap;f[1].lowerCap=f[1].upperCap,f[1].upperCap=c}for(var p=0;p<n.datapoints.points.length;p+=o){var d=r(n,p);for(var v=0;v<f.length;v++){var m=[u[v].min,u[v].max];if(d[v*f.length]){var g=i[p],y=i[p+1],b=[g,y][v]+d[v*f.length+1],w=[g,y][v]-d[v*f.length];if(f[v].err=="x")if(y>u[1].max||y<u[1].min||b<u[0].min||w>u[0].max)continue;if(f[v].err=="y")if(g>u[0].max||g<u[0].min||b<u[1].min||w>u[1].max)continue;var E=!0,S=!0;b>m[1]&&(E=!1,b=m[1]),w<m[0]&&(S=!1,w=m[0]);if(f[v].err=="x"&&l||f[v].err=="y"&&h){var c=w;w=b,b=c,c=S,S=E,E=c,c=m[0],m[0]=m[1],m[1]=c}g=u[0].p2c(g),y=u[1].p2c(y),b=u[v].p2c(b),w=u[v].p2c(w),m[0]=u[v].p2c(m[0]),m[1]=u[v].p2c(m[1]);var x=f[v].lineWidth?f[v].lineWidth:n.points.lineWidth,T=n.points.shadowSize!=null?n.points.shadowSize:n.shadowSize;if(x>0&&T>0){var N=T/2;t.lineWidth=N,t.strokeStyle="rgba(0,0,0,0.1)",s(t,f[v],g,y,b,w,E,S,a,N+N/2,m),t.strokeStyle="rgba(0,0,0,0.2)",s(t,f[v],g,y,b,w,E,S,a,N/2,m)}t.strokeStyle=f[v].color?f[v].color:n.color,t.lineWidth=x,s(t,f[v],g,y,b,w,E,S,a,0,m)}}}}function s(t,n,r,i,s,u,a,f,l,c,h){i+=c,s+=c,u+=c,n.err=="x"?(s>r+l?o(t,[[s,i],[Math.max(r+l,h[0]),i]]):a=!1,u<r-l?o(t,[[Math.min(r-l,h[1]),i],[u,i]]):f=!1):(s<i-l?o(t,[[r,s],[r,Math.min(i-l,h[0])]]):a=!1,u>i+l?o(t,[[r,Math.max(i+l,h[1])],[r,u]]):f=!1),l=n.radius!=null?n.radius:l,a&&(n.upperCap=="-"?n.err=="x"?o(t,[[s,i-l],[s,i+l]]):o(t,[[r-l,s],[r+l,s]]):e.isFunction(n.upperCap)&&(n.err=="x"?n.upperCap(t,s,i,l):n.upperCap(t,r,s,l))),f&&(n.lowerCap=="-"?n.err=="x"?o(t,[[u,i-l],[u,i+l]]):o(t,[[r-l,u],[r+l,u]]):e.isFunction(n.lowerCap)&&(n.err=="x"?n.lowerCap(t,u,i,l):n.lowerCap(t,r,u,l)))}function o(e,t){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(var n=1;n<t.length;n++)e.lineTo(t[n][0],t[n][1]);e.stroke()}function u(t,n){var r=t.getPlotOffset();n.save(),n.translate(r.left,r.top),e.each(t.getData(),function(e,r){r.points.errorbars&&(r.points.xerr.show||r.points.yerr.show)&&i(t,n,r)}),n.restore()}function a(e){e.hooks.processRawData.push(n),e.hooks.draw.push(u)}var t={series:{points:{errorbars:null,xerr:{err:"x",show:null,asymmetric:null,upperCap:null,lowerCap:null,color:null,radius:null},yerr:{err:"y",show:null,asymmetric:null,upperCap:null,lowerCap:null,color:null,radius:null}}}};e.plot.plugins.push({init:a,options:t,name:"errorbars",version:"1.0"})})(jQuery);
\ No newline at end of file diff --git a/public/javascripts/jquery.flot.min.js b/public/javascripts/jquery.flot.min.js new file mode 100644 index 000000000..3706512c4 --- /dev/null +++ b/public/javascripts/jquery.flot.min.js @@ -0,0 +1,29 @@ +/* Javascript plotting library for jQuery, version 0.8.1. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +*/// first an inline dependency, jquery.colorhelpers.js, we inline it here +// for convenience +/* Plugin for jQuery for working with colors. + * + * Version 1.1. + * + * Inspiration from jQuery color animation plugin by John Resig. + * + * Released under the MIT license by Ole Laursen, October 2009. + * + * Examples: + * + *   $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() + *   var c = $.color.extract($("#mydiv"), 'background-color'); + *   console.log(c.r, c.g, c.b, c.a); + *   $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" + * + * Note that .scale() and .add() return the same modified object + * instead of making a new one. + * + * V. 1.1: Fix error handling so e.g. parsing an empty string does + * produce a color rather than just crashing. + */(function(e){e.color={},e.color.make=function(t,n,r,i){var s={};return s.r=t||0,s.g=n||0,s.b=r||0,s.a=i!=null?i:1,s.add=function(e,t){for(var n=0;n<e.length;++n)s[e.charAt(n)]+=t;return s.normalize()},s.scale=function(e,t){for(var n=0;n<e.length;++n)s[e.charAt(n)]*=t;return s.normalize()},s.toString=function(){return s.a>=1?"rgb("+[s.r,s.g,s.b].join(",")+")":"rgba("+[s.r,s.g,s.b,s.a].join(",")+")"},s.normalize=function(){function e(e,t,n){return t<e?e:t>n?n:t}return s.r=e(0,parseInt(s.r),255),s.g=e(0,parseInt(s.g),255),s.b=e(0,parseInt(s.b),255),s.a=e(0,s.a,1),s},s.clone=function(){return e.color.make(s.r,s.b,s.g,s.a)},s.normalize()},e.color.extract=function(t,n){var r;do{r=t.css(n).toLowerCase();if(r!=""&&r!="transparent")break;t=t.parent()}while(!e.nodeName(t.get(0),"body"));return r=="rgba(0, 0, 0, 0)"&&(r="transparent"),e.color.parse(r)},e.color.parse=function(n){var r,i=e.color.make;if(r=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10));if(r=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10),parseFloat(r[4]));if(r=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55);if(r=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55,parseFloat(r[4]));if(r=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(n))return i(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16));if(r=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(n))return i(parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16));var s=e.trim(n).toLowerCase();return s=="transparent"?i(255,255,255,0):(r=t[s]||[0,0,0],i(r[0],r[1],r[2]))};var t={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery),function(e){function n(t,n){var r=n.children("."+t)[0];if(r==null){r=document.createElement("canvas"),r.className=t,e(r).css({direction:"ltr",position:"absolute",left:0,top:0}).appendTo(n);if(!r.getContext){if(!window.G_vmlCanvasManager)throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");r=window.G_vmlCanvasManager.initElement(r)}}this.element=r;var i=this.context=r.getContext("2d"),s=window.devicePixelRatio||1,o=i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1;this.pixelRatio=s/o,this.resize(n.width(),n.height()),this.textContainer=null,this.text={},this._textCache={}}function r(t,r,s,o){function E(e,t){t=[w].concat(t);for(var n=0;n<e.length;++n)e[n].apply(this,t)}function S(){var t={Canvas:n};for(var r=0;r<o.length;++r){var i=o[r];i.init(w,t),i.options&&e.extend(!0,a,i.options)}}function x(n){e.extend(!0,a,n),n&&n.colors&&(a.colors=n.colors),a.xaxis.color==null&&(a.xaxis.color=e.color.parse(a.grid.color).scale("a",.22).toString()),a.yaxis.color==null&&(a.yaxis.color=e.color.parse(a.grid.color).scale("a",.22).toString()),a.xaxis.tickColor==null&&(a.xaxis.tickColor=a.grid.tickColor||a.xaxis.color),a.yaxis.tickColor==null&&(a.yaxis.tickColor=a.grid.tickColor||a.yaxis.color),a.grid.borderColor==null&&(a.grid.borderColor=a.grid.color),a.grid.tickColor==null&&(a.grid.tickColor=e.color.parse(a.grid.color).scale("a",.22).toString());var r,i,s,o={style:t.css("font-style"),size:Math.round(.8*(+t.css("font-size").replace("px","")||13)),variant:t.css("font-variant"),weight:t.css("font-weight"),family:t.css("font-family")};o.lineHeight=o.size*1.15,s=a.xaxes.length||1;for(r=0;r<s;++r)i=a.xaxes[r],i&&!i.tickColor&&(i.tickColor=i.color),i=e.extend(!0,{},a.xaxis,i),a.xaxes[r]=i,i.font&&(i.font=e.extend({},o,i.font),i.font.color||(i.font.color=i.color));s=a.yaxes.length||1;for(r=0;r<s;++r)i=a.yaxes[r],i&&!i.tickColor&&(i.tickColor=i.color),i=e.extend(!0,{},a.yaxis,i),a.yaxes[r]=i,i.font&&(i.font=e.extend({},o,i.font),i.font.color||(i.font.color=i.color));a.xaxis.noTicks&&a.xaxis.ticks==null&&(a.xaxis.ticks=a.xaxis.noTicks),a.yaxis.noTicks&&a.yaxis.ticks==null&&(a.yaxis.ticks=a.yaxis.noTicks),a.x2axis&&(a.xaxes[1]=e.extend(!0,{},a.xaxis,a.x2axis),a.xaxes[1].position="top"),a.y2axis&&(a.yaxes[1]=e.extend(!0,{},a.yaxis,a.y2axis),a.yaxes[1].position="right"),a.grid.coloredAreas&&(a.grid.markings=a.grid.coloredAreas),a.grid.coloredAreasColor&&(a.grid.markingsColor=a.grid.coloredAreasColor),a.lines&&e.extend(!0,a.series.lines,a.lines),a.points&&e.extend(!0,a.series.points,a.points),a.bars&&e.extend(!0,a.series.bars,a.bars),a.shadowSize!=null&&(a.series.shadowSize=a.shadowSize),a.highlightColor!=null&&(a.series.highlightColor=a.highlightColor);for(r=0;r<a.xaxes.length;++r)O(d,r+1).options=a.xaxes[r];for(r=0;r<a.yaxes.length;++r)O(v,r+1).options=a.yaxes[r];for(var u in b)a.hooks[u]&&a.hooks[u].length&&(b[u]=b[u].concat(a.hooks[u]));E(b.processOptions,[a])}function T(e){u=N(e),M(),_()}function N(t){var n=[];for(var r=0;r<t.length;++r){var i=e.extend(!0,{},a.series);t[r].data!=null?(i.data=t[r].data,delete t[r].data,e.extend(!0,i,t[r]),t[r].data=i.data):i.data=t[r],n.push(i)}return n}function C(e,t){var n=e[t+"axis"];return typeof n=="object"&&(n=n.n),typeof n!="number"&&(n=1),n}function k(){return e.grep(d.concat(v),function(e){return e})}function L(e){var t={},n,r;for(n=0;n<d.length;++n)r=d[n],r&&r.used&&(t["x"+r.n]=r.c2p(e.left));for(n=0;n<v.length;++n)r=v[n],r&&r.used&&(t["y"+r.n]=r.c2p(e.top));return t.x1!==undefined&&(t.x=t.x1),t.y1!==undefined&&(t.y=t.y1),t}function A(e){var t={},n,r,i;for(n=0;n<d.length;++n){r=d[n];if(r&&r.used){i="x"+r.n,e[i]==null&&r.n==1&&(i="x");if(e[i]!=null){t.left=r.p2c(e[i]);break}}}for(n=0;n<v.length;++n){r=v[n];if(r&&r.used){i="y"+r.n,e[i]==null&&r.n==1&&(i="y");if(e[i]!=null){t.top=r.p2c(e[i]);break}}}return t}function O(t,n){return t[n-1]||(t[n-1]={n:n,direction:t==d?"x":"y",options:e.extend(!0,{},t==d?a.xaxis:a.yaxis)}),t[n-1]}function M(){var t=u.length,n=-1,r;for(r=0;r<u.length;++r){var i=u[r].color;i!=null&&(t--,typeof i=="number"&&i>n&&(n=i))}t<=n&&(t=n+1);var s,o=[],f=a.colors,l=f.length,c=0;for(r=0;r<t;r++)s=e.color.parse(f[r%l]||"#666"),r%l==0&&r&&(c>=0?c<.5?c=-c-.2:c=0:c=-c),o[r]=s.scale("rgb",1+c);var h=0,p;for(r=0;r<u.length;++r){p=u[r],p.color==null?(p.color=o[h].toString(),++h):typeof p.color=="number"&&(p.color=o[p.color].toString());if(p.lines.show==null){var m,g=!0;for(m in p)if(p[m]&&p[m].show){g=!1;break}g&&(p.lines.show=!0)}p.lines.zero==null&&(p.lines.zero=!!p.lines.fill),p.xaxis=O(d,C(p,"x")),p.yaxis=O(v,C(p,"y"))}}function _(){function x(e,t,n){t<e.datamin&&t!=-r&&(e.datamin=t),n>e.datamax&&n!=r&&(e.datamax=n)}var t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,r=Number.MAX_VALUE,i,s,o,a,f,l,c,h,p,d,v,m,g,y,w,S;e.each(k(),function(e,r){r.datamin=t,r.datamax=n,r.used=!1});for(i=0;i<u.length;++i)l=u[i],l.datapoints={points:[]},E(b.processRawData,[l,l.data,l.datapoints]);for(i=0;i<u.length;++i){l=u[i],w=l.data,S=l.datapoints.format;if(!S){S=[],S.push({x:!0,number:!0,required:!0}),S.push({y:!0,number:!0,required:!0});if(l.bars.show||l.lines.show&&l.lines.fill){var T=!!(l.bars.show&&l.bars.zero||l.lines.show&&l.lines.zero);S.push({y:!0,number:!0,required:!1,defaultValue:0,autoscale:T}),l.bars.horizontal&&(delete S[S.length-1].y,S[S.length-1].x=!0)}l.datapoints.format=S}if(l.datapoints.pointsize!=null)continue;l.datapoints.pointsize=S.length,h=l.datapoints.pointsize,c=l.datapoints.points;var N=l.lines.show&&l.lines.steps;l.xaxis.used=l.yaxis.used=!0;for(s=o=0;s<w.length;++s,o+=h){y=w[s];var C=y==null;if(!C)for(a=0;a<h;++a)m=y[a],g=S[a],g&&(g.number&&m!=null&&(m=+m,isNaN(m)?m=null:m==Infinity?m=r:m==-Infinity&&(m=-r)),m==null&&(g.required&&(C=!0),g.defaultValue!=null&&(m=g.defaultValue))),c[o+a]=m;if(C)for(a=0;a<h;++a)m=c[o+a],m!=null&&(g=S[a],g.autoscale&&(g.x&&x(l.xaxis,m,m),g.y&&x(l.yaxis,m,m))),c[o+a]=null;else if(N&&o>0&&c[o-h]!=null&&c[o-h]!=c[o]&&c[o-h+1]!=c[o+1]){for(a=0;a<h;++a)c[o+h+a]=c[o+a];c[o+1]=c[o-h+1],o+=h}}}for(i=0;i<u.length;++i)l=u[i],E(b.processDatapoints,[l,l.datapoints]);for(i=0;i<u.length;++i){l=u[i],c=l.datapoints.points,h=l.datapoints.pointsize,S=l.datapoints.format;var L=t,A=t,O=n,M=n;for(s=0;s<c.length;s+=h){if(c[s]==null)continue;for(a=0;a<h;++a){m=c[s+a],g=S[a];if(!g||g.autoscale===!1||m==r||m==-r)continue;g.x&&(m<L&&(L=m),m>O&&(O=m)),g.y&&(m<A&&(A=m),m>M&&(M=m))}}if(l.bars.show){var _;switch(l.bars.align){case"left":_=0;break;case"right":_=-l.bars.barWidth;break;case"center":_=-l.bars.barWidth/2;break;default:throw new Error("Invalid bar alignment: "+l.bars.align)}l.bars.horizontal?(A+=_,M+=_+l.bars.barWidth):(L+=_,O+=_+l.bars.barWidth)}x(l.xaxis,L,O),x(l.yaxis,A,M)}e.each(k(),function(e,r){r.datamin==t&&(r.datamin=null),r.datamax==n&&(r.datamax=null)})}function D(){t.css("padding",0).children(":not(.flot-base,.flot-overlay)").remove(),t.css("position")=="static"&&t.css("position","relative"),f=new n("flot-base",t),l=new n("flot-overlay",t),h=f.context,p=l.context,c=e(l.element).unbind();var r=t.data("plot");r&&(r.shutdown(),l.clear()),t.data("plot",w)}function P(){a.grid.hoverable&&(c.mousemove(at),c.bind("mouseleave",ft)),a.grid.clickable&&c.click(lt),E(b.bindEvents,[c])}function H(){ot&&clearTimeout(ot),c.unbind("mousemove",at),c.unbind("mouseleave",ft),c.unbind("click",lt),E(b.shutdown,[c])}function B(e){function t(e){return e}var n,r,i=e.options.transform||t,s=e.options.inverseTransform;e.direction=="x"?(n=e.scale=g/Math.abs(i(e.max)-i(e.min)),r=Math.min(i(e.max),i(e.min))):(n=e.scale=y/Math.abs(i(e.max)-i(e.min)),n=-n,r=Math.max(i(e.max),i(e.min))),i==t?e.p2c=function(e){return(e-r)*n}:e.p2c=function(e){return(i(e)-r)*n},s?e.c2p=function(e){return s(r+e/n)}:e.c2p=function(e){return r+e/n}}function j(e){var t=e.options,n=e.ticks||[],r=t.labelWidth||0,i=t.labelHeight||0,s=r||e.direction=="x"?Math.floor(f.width/(n.length||1)):null;legacyStyles=e.direction+"Axis "+e.direction+e.n+"Axis",layer="flot-"+e.direction+"-axis flot-"+e.direction+e.n+"-axis "+legacyStyles,font=t.font||"flot-tick-label tickLabel";for(var o=0;o<n.length;++o){var u=n[o];if(!u.label)continue;var a=f.getTextInfo(layer,u.label,font,null,s);r=Math.max(r,a.width),i=Math.max(i,a.height)}e.labelWidth=t.labelWidth||r,e.labelHeight=t.labelHeight||i}function F(t){var n=t.labelWidth,r=t.labelHeight,i=t.options.position,s=t.options.tickLength,o=a.grid.axisMargin,u=a.grid.labelMargin,l=t.direction=="x"?d:v,c,h,p=e.grep(l,function(e){return e&&e.options.position==i&&e.reserveSpace});e.inArray(t,p)==p.length-1&&(o=0);if(s==null){var g=e.grep(l,function(e){return e&&e.reserveSpace});h=e.inArray(t,g)==0,h?s="full":s=5}isNaN(+s)||(u+=+s),t.direction=="x"?(r+=u,i=="bottom"?(m.bottom+=r+o,t.box={top:f.height-m.bottom,height:r}):(t.box={top:m.top+o,height:r},m.top+=r+o)):(n+=u,i=="left"?(t.box={left:m.left+o,width:n},m.left+=n+o):(m.right+=n+o,t.box={left:f.width-m.right,width:n})),t.position=i,t.tickLength=s,t.box.padding=u,t.innermost=h}function I(e){e.direction=="x"?(e.box.left=m.left-e.labelWidth/2,e.box.width=f.width-m.left-m.right+e.labelWidth):(e.box.top=m.top-e.labelHeight/2,e.box.height=f.height-m.bottom-m.top+e.labelHeight)}function q(){var t=a.grid.minBorderMargin,n={x:0,y:0},r,i;if(t==null){t=0;for(r=0;r<u.length;++r)t=Math.max(t,2*(u[r].points.radius+u[r].points.lineWidth/2))}n.x=n.y=Math.ceil(t),e.each(k(),function(e,t){var r=t.direction;t.reserveSpace&&(n[r]=Math.ceil(Math.max(n[r],(r=="x"?t.labelWidth:t.labelHeight)/2)))}),m.left=Math.max(n.x,m.left),m.right=Math.max(n.x,m.right),m.top=Math.max(n.y,m.top),m.bottom=Math.max(n.y,m.bottom)}function R(){var t,n=k(),r=a.grid.show;for(var i in m){var s=a.grid.margin||0;m[i]=typeof s=="number"?s:s[i]||0}E(b.processOffset,[m]);for(var i in m)typeof a.grid.borderWidth=="object"?m[i]+=r?a.grid.borderWidth[i]:0:m[i]+=r?a.grid.borderWidth:0;e.each(n,function(e,t){t.show=t.options.show,t.show==null&&(t.show=t.used),t.reserveSpace=t.show||t.options.reserveSpace,U(t)});if(r){var o=e.grep(n,function(e){return e.reserveSpace});e.each(o,function(e,t){z(t),W(t),X(t,t.ticks),j(t)});for(t=o.length-1;t>=0;--t)F(o[t]);q(),e.each(o,function(e,t){I(t)})}g=f.width-m.left-m.right,y=f.height-m.bottom-m.top,e.each(n,function(e,t){B(t)}),r&&G(),it()}function U(e){var t=e.options,n=+(t.min!=null?t.min:e.datamin),r=+(t.max!=null?t.max:e.datamax),i=r-n;if(i==0){var s=r==0?1:.01;t.min==null&&(n-=s);if(t.max==null||t.min!=null)r+=s}else{var o=t.autoscaleMargin;o!=null&&(t.min==null&&(n-=i*o,n<0&&e.datamin!=null&&e.datamin>=0&&(n=0)),t.max==null&&(r+=i*o,r>0&&e.datamax!=null&&e.datamax<=0&&(r=0)))}e.min=n,e.max=r}function z(t){var n=t.options,r;typeof n.ticks=="number"&&n.ticks>0?r=n.ticks:r=.3*Math.sqrt(t.direction=="x"?f.width:f.height);var s=(t.max-t.min)/r,o=-Math.floor(Math.log(s)/Math.LN10),u=n.tickDecimals;u!=null&&o>u&&(o=u);var a=Math.pow(10,-o),l=s/a,c;l<1.5?c=1:l<3?(c=2,l>2.25&&(u==null||o+1<=u)&&(c=2.5,++o)):l<7.5?c=5:c=10,c*=a,n.minTickSize!=null&&c<n.minTickSize&&(c=n.minTickSize),t.delta=s,t.tickDecimals=Math.max(0,u!=null?u:o),t.tickSize=n.tickSize||c;if(n.mode=="time"&&!t.tickGenerator)throw new Error("Time mode requires the flot.time plugin.");t.tickGenerator||(t.tickGenerator=function(e){var t=[],n=i(e.min,e.tickSize),r=0,s=Number.NaN,o;do o=s,s=n+r*e.tickSize,t.push(s),++r;while(s<e.max&&s!=o);return t},t.tickFormatter=function(e,t){var n=t.tickDecimals?Math.pow(10,t.tickDecimals):1,r=""+Math.round(e*n)/n;if(t.tickDecimals!=null){var i=r.indexOf("."),s=i==-1?0:r.length-i-1;if(s<t.tickDecimals)return(s?r:r+".")+(""+n).substr(1,t.tickDecimals-s)}return r}),e.isFunction(n.tickFormatter)&&(t.tickFormatter=function(e,t){return""+n.tickFormatter(e,t)});if(n.alignTicksWithAxis!=null){var h=(t.direction=="x"?d:v)[n.alignTicksWithAxis-1];if(h&&h.used&&h!=t){var p=t.tickGenerator(t);p.length>0&&(n.min==null&&(t.min=Math.min(t.min,p[0])),n.max==null&&p.length>1&&(t.max=Math.max(t.max,p[p.length-1]))),t.tickGenerator=function(e){var t=[],n,r;for(r=0;r<h.ticks.length;++r)n=(h.ticks[r].v-h.min)/(h.max-h.min),n=e.min+n*(e.max-e.min),t.push(n);return t};if(!t.mode&&n.tickDecimals==null){var m=Math.max(0,-Math.floor(Math.log(t.delta)/Math.LN10)+1),g=t.tickGenerator(t);g.length>1&&/\..*0$/.test((g[1]-g[0]).toFixed(m))||(t.tickDecimals=m)}}}}function W(t){var n=t.options.ticks,r=[];n==null||typeof n=="number"&&n>0?r=t.tickGenerator(t):n&&(e.isFunction(n)?r=n(t):r=n);var i,s;t.ticks=[];for(i=0;i<r.length;++i){var o=null,u=r[i];typeof u=="object"?(s=+u[0],u.length>1&&(o=u[1])):s=+u,o==null&&(o=t.tickFormatter(s,t)),isNaN(s)||t.ticks.push({v:s,label:o})}}function X(e,t){e.options.autoscaleMargin&&t.length>0&&(e.options.min==null&&(e.min=Math.min(e.min,t[0].v)),e.options.max==null&&t.length>1&&(e.max=Math.max(e.max,t[t.length-1].v)))}function V(){f.clear(),E(b.drawBackground,[h]);var e=a.grid;e.show&&e.backgroundColor&&K(),e.show&&!e.aboveData&&Q();for(var t=0;t<u.length;++t)E(b.drawSeries,[h,u[t]]),Y(u[t]);E(b.draw,[h]),e.show&&e.aboveData&&Q(),f.render(),ht()}function J(e,t){var n,r,i,s,o=k();for(var u=0;u<o.length;++u){n=o[u];if(n.direction==t){s=t+n.n+"axis",!e[s]&&n.n==1&&(s=t+"axis");if(e[s]){r=e[s].from,i=e[s].to;break}}}e[s]||(n=t=="x"?d[0]:v[0],r=e[t+"1"],i=e[t+"2"]);if(r!=null&&i!=null&&r>i){var a=r;r=i,i=a}return{from:r,to:i,axis:n}}function K(){h.save(),h.translate(m.left,m.top),h.fillStyle=bt(a.grid.backgroundColor,y,0,"rgba(255, 255, 255, 0)"),h.fillRect(0,0,g,y),h.restore()}function Q(){var t,n,r,i;h.save(),h.translate(m.left,m.top);var s=a.grid.markings;if(s){e.isFunction(s)&&(n=w.getAxes(),n.xmin=n.xaxis.min,n.xmax=n.xaxis.max,n.ymin=n.yaxis.min,n.ymax=n.yaxis.max,s=s(n));for(t=0;t<s.length;++t){var o=s[t],u=J(o,"x"),f=J(o,"y");u.from==null&&(u.from=u.axis.min),u.to==null&&(u.to=u.axis.max),f.from==null&&(f.from=f.axis.min),f.to==null&&(f.to=f.axis.max);if(u.to<u.axis.min||u.from>u.axis.max||f.to<f.axis.min||f.from>f.axis.max)continue;u.from=Math.max(u.from,u.axis.min),u.to=Math.min(u.to,u.axis.max),f.from=Math.max(f.from,f.axis.min),f.to=Math.min(f.to,f.axis.max);if(u.from==u.to&&f.from==f.to)continue;u.from=u.axis.p2c(u.from),u.to=u.axis.p2c(u.to),f.from=f.axis.p2c(f.from),f.to=f.axis.p2c(f.to),u.from==u.to||f.from==f.to?(h.beginPath(),h.strokeStyle=o.color||a.grid.markingsColor,h.lineWidth=o.lineWidth||a.grid.markingsLineWidth,h.moveTo(u.from,f.from),h.lineTo(u.to,f.to),h.stroke()):(h.fillStyle=o.color||a.grid.markingsColor,h.fillRect(u.from,f.to,u.to-u.from,f.from-f.to))}}n=k(),r=a.grid.borderWidth;for(var l=0;l<n.length;++l){var c=n[l],p=c.box,d=c.tickLength,v,b,E,S;if(!c.show||c.ticks.length==0)continue;h.lineWidth=1,c.direction=="x"?(v=0,d=="full"?b=c.position=="top"?0:y:b=p.top-m.top+(c.position=="top"?p.height:0)):(b=0,d=="full"?v=c.position=="left"?0:g:v=p.left-m.left+(c.position=="left"?p.width:0)),c.innermost||(h.strokeStyle=c.options.color,h.beginPath(),E=S=0,c.direction=="x"?E=g+1:S=y+1,h.lineWidth==1&&(c.direction=="x"?b=Math.floor(b)+.5:v=Math.floor(v)+.5),h.moveTo(v,b),h.lineTo(v+E,b+S),h.stroke()),h.strokeStyle=c.options.tickColor,h.beginPath();for(t=0;t<c.ticks.length;++t){var x=c.ticks[t].v;E=S=0;if(isNaN(x)||x<c.min||x>c.max||d=="full"&&(typeof r=="object"&&r[c.position]>0||r>0)&&(x==c.min||x==c.max))continue;c.direction=="x"?(v=c.p2c(x),S=d=="full"?-y:d,c.position=="top"&&(S=-S)):(b=c.p2c(x),E=d=="full"?-g:d,c.position=="left"&&(E=-E)),h.lineWidth==1&&(c.direction=="x"?v=Math.floor(v)+.5:b=Math.floor(b)+.5),h.moveTo(v,b),h.lineTo(v+E,b+S)}h.stroke()}r&&(i=a.grid.borderColor,typeof r=="object"||typeof i=="object"?(typeof r!="object"&&(r={top:r,right:r,bottom:r,left:r}),typeof i!="object"&&(i={top:i,right:i,bottom:i,left:i}),r.top>0&&(h.strokeStyle=i.top,h.lineWidth=r.top,h.beginPath(),h.moveTo(0-r.left,0-r.top/2),h.lineTo(g,0-r.top/2),h.stroke()),r.right>0&&(h.strokeStyle=i.right,h.lineWidth=r.right,h.beginPath(),h.moveTo(g+r.right/2,0-r.top),h.lineTo(g+r.right/2,y),h.stroke()),r.bottom>0&&(h.strokeStyle=i.bottom,h.lineWidth=r.bottom,h.beginPath(),h.moveTo(g+r.right,y+r.bottom/2),h.lineTo(0,y+r.bottom/2),h.stroke()),r.left>0&&(h.strokeStyle=i.left,h.lineWidth=r.left,h.beginPath(),h.moveTo(0-r.left/2,y+r.bottom),h.lineTo(0-r.left/2,0),h.stroke())):(h.lineWidth=r,h.strokeStyle=a.grid.borderColor,h.strokeRect(-r/2,-r/2,g+r,y+r))),h.restore()}function G(){e.each(k(),function(e,t){if(!t.show||t.ticks.length==0)return;var n=t.box,r=t.direction+"Axis "+t.direction+t.n+"Axis",i="flot-"+t.direction+"-axis flot-"+t.direction+t.n+"-axis "+r,s=t.options.font||"flot-tick-label tickLabel",o,u,a,l,c;f.removeText(i);for(var h=0;h<t.ticks.length;++h){o=t.ticks[h];if(!o.label||o.v<t.min||o.v>t.max)continue;t.direction=="x"?(l="center",u=m.left+t.p2c(o.v),t.position=="bottom"?a=n.top+n.padding:(a=n.top+n.height-n.padding,c="bottom")):(c="middle",a=m.top+t.p2c(o.v),t.position=="left"?(u=n.left+n.width-n.padding,l="right"):u=n.left+n.padding),f.addText(i,u,a,o.label,s,null,null,l,c)}})}function Y(e){e.lines.show&&Z(e),e.bars.show&&nt(e),e.points.show&&et(e)}function Z(e){function t(e,t,n,r,i){var s=e.points,o=e.pointsize,u=null,a=null;h.beginPath();for(var f=o;f<s.length;f+=o){var l=s[f-o],c=s[f-o+1],p=s[f],d=s[f+1];if(l==null||p==null)continue;if(c<=d&&c<i.min){if(d<i.min)continue;l=(i.min-c)/(d-c)*(p-l)+l,c=i.min}else if(d<=c&&d<i.min){if(c<i.min)continue;p=(i.min-c)/(d-c)*(p-l)+l,d=i.min}if(c>=d&&c>i.max){if(d>i.max)continue;l=(i.max-c)/(d-c)*(p-l)+l,c=i.max}else if(d>=c&&d>i.max){if(c>i.max)continue;p=(i.max-c)/(d-c)*(p-l)+l,d=i.max}if(l<=p&&l<r.min){if(p<r.min)continue;c=(r.min-l)/(p-l)*(d-c)+c,l=r.min}else if(p<=l&&p<r.min){if(l<r.min)continue;d=(r.min-l)/(p-l)*(d-c)+c,p=r.min}if(l>=p&&l>r.max){if(p>r.max)continue;c=(r.max-l)/(p-l)*(d-c)+c,l=r.max}else if(p>=l&&p>r.max){if(l>r.max)continue;d=(r.max-l)/(p-l)*(d-c)+c,p=r.max}(l!=u||c!=a)&&h.moveTo(r.p2c(l)+t,i.p2c(c)+n),u=p,a=d,h.lineTo(r.p2c(p)+t,i.p2c(d)+n)}h.stroke()}function n(e,t,n){var r=e.points,i=e.pointsize,s=Math.min(Math.max(0,n.min),n.max),o=0,u,a=!1,f=1,l=0,c=0;for(;;){if(i>0&&o>r.length+i)break;o+=i;var p=r[o-i],d=r[o-i+f],v=r[o],m=r[o+f];if(a){if(i>0&&p!=null&&v==null){c=o,i=-i,f=2;continue}if(i<0&&o==l+i){h.fill(),a=!1,i=-i,f=1,o=l=c+i;continue}}if(p==null||v==null)continue;if(p<=v&&p<t.min){if(v<t.min)continue;d=(t.min-p)/(v-p)*(m-d)+d,p=t.min}else if(v<=p&&v<t.min){if(p<t.min)continue;m=(t.min-p)/(v-p)*(m-d)+d,v=t.min}if(p>=v&&p>t.max){if(v>t.max)continue;d=(t.max-p)/(v-p)*(m-d)+d,p=t.max}else if(v>=p&&v>t.max){if(p>t.max)continue;m=(t.max-p)/(v-p)*(m-d)+d,v=t.max}a||(h.beginPath(),h.moveTo(t.p2c(p),n.p2c(s)),a=!0);if(d>=n.max&&m>=n.max){h.lineTo(t.p2c(p),n.p2c(n.max)),h.lineTo(t.p2c(v),n.p2c(n.max));continue}if(d<=n.min&&m<=n.min){h.lineTo(t.p2c(p),n.p2c(n.min)),h.lineTo(t.p2c(v),n.p2c(n.min));continue}var g=p,y=v;d<=m&&d<n.min&&m>=n.min?(p=(n.min-d)/(m-d)*(v-p)+p,d=n.min):m<=d&&m<n.min&&d>=n.min&&(v=(n.min-d)/(m-d)*(v-p)+p,m=n.min),d>=m&&d>n.max&&m<=n.max?(p=(n.max-d)/(m-d)*(v-p)+p,d=n.max):m>=d&&m>n.max&&d<=n.max&&(v=(n.max-d)/(m-d)*(v-p)+p,m=n.max),p!=g&&h.lineTo(t.p2c(g),n.p2c(d)),h.lineTo(t.p2c(p),n.p2c(d)),h.lineTo(t.p2c(v),n.p2c(m)),v!=y&&(h.lineTo(t.p2c(v),n.p2c(m)),h.lineTo(t.p2c(y),n.p2c(m)))}}h.save(),h.translate(m.left,m.top),h.lineJoin="round";var r=e.lines.lineWidth,i=e.shadowSize;if(r>0&&i>0){h.lineWidth=i,h.strokeStyle="rgba(0,0,0,0.1)";var s=Math.PI/18;t(e.datapoints,Math.sin(s)*(r/2+i/2),Math.cos(s)*(r/2+i/2),e.xaxis,e.yaxis),h.lineWidth=i/2,t(e.datapoints,Math.sin(s)*(r/2+i/4),Math.cos(s)*(r/2+i/4),e.xaxis,e.yaxis)}h.lineWidth=r,h.strokeStyle=e.color;var o=rt(e.lines,e.color,0,y);o&&(h.fillStyle=o,n(e.datapoints,e.xaxis,e.yaxis)),r>0&&t(e.datapoints,0,0,e.xaxis,e.yaxis),h.restore()}function et(e){function t(e,t,n,r,i,s,o,u){var a=e.points,f=e.pointsize;for(var l=0;l<a.length;l+=f){var c=a[l],p=a[l+1];if(c==null||c<s.min||c>s.max||p<o.min||p>o.max)continue;h.beginPath(),c=s.p2c(c),p=o.p2c(p)+r,u=="circle"?h.arc(c,p,t,0,i?Math.PI:Math.PI*2,!1):u(h,c,p,t,i),h.closePath(),n&&(h.fillStyle=n,h.fill()),h.stroke()}}h.save(),h.translate(m.left,m.top);var n=e.points.lineWidth,r=e.shadowSize,i=e.points.radius,s=e.points.symbol;n==0&&(n=1e-4);if(n>0&&r>0){var o=r/2;h.lineWidth=o,h.strokeStyle="rgba(0,0,0,0.1)",t(e.datapoints,i,null,o+o/2,!0,e.xaxis,e.yaxis,s),h.strokeStyle="rgba(0,0,0,0.2)",t(e.datapoints,i,null,o/2,!0,e.xaxis,e.yaxis,s)}h.lineWidth=n,h.strokeStyle=e.color,t(e.datapoints,i,rt(e.points,e.color),0,!1,e.xaxis,e.yaxis,s),h.restore()}function tt(e,t,n,r,i,s,o,u,a,f,l,c){var h,p,d,v,m,g,y,b,w;l?(b=g=y=!0,m=!1,h=n,p=e,v=t+r,d=t+i,p<h&&(w=p,p=h,h=w,m=!0,g=!1)):(m=g=y=!0,b=!1,h=e+r,p=e+i,d=n,v=t,v<d&&(w=v,v=d,d=w,b=!0,y=!1));if(p<u.min||h>u.max||v<a.min||d>a.max)return;h<u.min&&(h=u.min,m=!1),p>u.max&&(p=u.max,g=!1),d<a.min&&(d=a.min,b=!1),v>a.max&&(v=a.max,y=!1),h=u.p2c(h),d=a.p2c(d),p=u.p2c(p),v=a.p2c(v),o&&(f.beginPath(),f.moveTo(h,d),f.lineTo(h,v),f.lineTo(p,v),f.lineTo(p,d),f.fillStyle=o(d,v),f.fill()),c>0&&(m||g||y||b)&&(f.beginPath(),f.moveTo(h,d+s),m?f.lineTo(h,v+s):f.moveTo(h,v+s),y?f.lineTo(p,v+s):f.moveTo(p,v+s),g?f.lineTo(p,d+s):f.moveTo(p,d+s),b?f.lineTo(h,d+s):f.moveTo(h,d+s),f.stroke())}function nt(e){function t(t,n,r,i,s,o,u){var a=t.points,f=t.pointsize;for(var l=0;l<a.length;l+=f){if(a[l]==null)continue;tt(a[l],a[l+1],a[l+2],n,r,i,s,o,u,h,e.bars.horizontal,e.bars.lineWidth)}}h.save(),h.translate(m.left,m.top),h.lineWidth=e.bars.lineWidth,h.strokeStyle=e.color;var n;switch(e.bars.align){case"left":n=0;break;case"right":n=-e.bars.barWidth;break;case"center":n=-e.bars.barWidth/2;break;default:throw new Error("Invalid bar alignment: "+e.bars.align)}var r=e.bars.fill?function(t,n){return rt(e.bars,e.color,t,n)}:null;t(e.datapoints,n,n+e.bars.barWidth,0,r,e.xaxis,e.yaxis),h.restore()}function rt(t,n,r,i){var s=t.fill;if(!s)return null;if(t.fillColor)return bt(t.fillColor,r,i,n);var o=e.color.parse(n);return o.a=typeof s=="number"?s:.4,o.normalize(),o.toString()}function it(){t.find(".legend").remove();if(!a.legend.show)return;var n=[],r=[],i=!1,s=a.legend.labelFormatter,o,f;for(var l=0;l<u.length;++l)o=u[l],o.label&&(f=s?s(o.label,o):o.label,f&&r.push({label:f,color:o.color}));if(a.legend.sorted)if(e.isFunction(a.legend.sorted))r.sort(a.legend.sorted);else if(a.legend.sorted=="reverse")r.reverse();else{var c=a.legend.sorted!="descending";r.sort(function(e,t){return e.label==t.label?0:e.label<t.label!=c?1:-1})}for(var l=0;l<r.length;++l){var h=r[l];l%a.legend.noColumns==0&&(i&&n.push("</tr>"),n.push("<tr>"),i=!0),n.push('<td class="legendColorBox"><div style="border:1px solid '+a.legend.labelBoxBorderColor+';padding:1px"><div style="width:4px;height:0;border:5px solid '+h.color+';overflow:hidden"></div></div></td>'+'<td class="legendLabel">'+h.label+"</td>")}i&&n.push("</tr>");if(n.length==0)return;var p='<table style="font-size:smaller;color:'+a.grid.color+'">'+n.join("")+"</table>";if(a.legend.container!=null)e(a.legend.container).html(p);else{var d="",v=a.legend.position,g=a.legend.margin;g[0]==null&&(g=[g,g]),v.charAt(0)=="n"?d+="top:"+(g[1]+m.top)+"px;":v.charAt(0)=="s"&&(d+="bottom:"+(g[1]+m.bottom)+"px;"),v.charAt(1)=="e"?d+="right:"+(g[0]+m.right)+"px;":v.charAt(1)=="w"&&(d+="left:"+(g[0]+m.left)+"px;");var y=e('<div class="legend">'+p.replace('style="','style="position:absolute;'+d+";")+"</div>").appendTo(t);if(a.legend.backgroundOpacity!=0){var b=a.legend.backgroundColor;b==null&&(b=a.grid.backgroundColor,b&&typeof b=="string"?b=e.color.parse(b):b=e.color.extract(y,"background-color"),b.a=1,b=b.toString());var w=y.children();e('<div style="position:absolute;width:'+w.width()+"px;height:"+w.height()+"px;"+d+"background-color:"+b+';"> </div>').prependTo(y).css("opacity",a.legend.backgroundOpacity)}}}function ut(e,t,n){var r=a.grid.mouseActiveRadius,i=r*r+1,s=null,o=!1,f,l,c;for(f=u.length-1;f>=0;--f){if(!n(u[f]))continue;var h=u[f],p=h.xaxis,d=h.yaxis,v=h.datapoints.points,m=p.c2p(e),g=d.c2p(t),y=r/p.scale,b=r/d.scale;c=h.datapoints.pointsize,p.options.inverseTransform&&(y=Number.MAX_VALUE),d.options.inverseTransform&&(b=Number.MAX_VALUE);if(h.lines.show||h.points.show)for(l=0;l<v.length;l+=c){var w=v[l],E=v[l+1];if(w==null)continue;if(w-m>y||w-m<-y||E-g>b||E-g<-b)continue;var S=Math.abs(p.p2c(w)-e),x=Math.abs(d.p2c(E)-t),T=S*S+x*x;T<i&&(i=T,s=[f,l/c])}if(h.bars.show&&!s){var N=h.bars.align=="left"?0:-h.bars.barWidth/2,C=N+h.bars.barWidth;for(l=0;l<v.length;l+=c){var w=v[l],E=v[l+1],k=v[l+2];if(w==null)continue;if(u[f].bars.horizontal?m<=Math.max(k,w)&&m>=Math.min(k,w)&&g>=E+N&&g<=E+C:m>=w+N&&m<=w+C&&g>=Math.min(k,E)&&g<=Math.max(k,E))s=[f,l/c]}}}return s?(f=s[0],l=s[1],c=u[f].datapoints.pointsize,{datapoint:u[f].datapoints.points.slice(l*c,(l+1)*c),dataIndex:l,series:u[f],seriesIndex:f}):null}function at(e){a.grid.hoverable&&ct("plothover",e,function(e){return e["hoverable"]!=0})}function ft(e){a.grid.hoverable&&ct("plothover",e,function(e){return!1})}function lt(e){ct("plotclick",e,function(e){return e["clickable"]!=0})}function ct(e,n,r){var i=c.offset(),s=n.pageX-i.left-m.left,o=n.pageY-i.top-m.top,u=L({left:s,top:o});u.pageX=n.pageX,u.pageY=n.pageY;var f=ut(s,o,r);f&&(f.pageX=parseInt(f.series.xaxis.p2c(f.datapoint[0])+i.left+m.left,10),f.pageY=parseInt(f.series.yaxis.p2c(f.datapoint[1])+i.top+m.top,10));if(a.grid.autoHighlight){for(var l=0;l<st.length;++l){var h=st[l];h.auto==e&&(!f||h.series!=f.series||h.point[0]!=f.datapoint[0]||h.point[1]!=f.datapoint[1])&&vt(h.series,h.point)}f&&dt(f.series,f.datapoint,e)}t.trigger(e,[u,f])}function ht(){var e=a.interaction.redrawOverlayInterval;if(e==-1){pt();return}ot||(ot=setTimeout(pt,e))}function pt(){ot=null,p.save(),l.clear(),p.translate(m.left,m.top);var e,t;for(e=0;e<st.length;++e)t=st[e],t.series.bars.show?yt(t.series,t.point):gt(t.series,t.point);p.restore(),E(b.drawOverlay,[p])}function dt(e,t,n){typeof e=="number"&&(e=u[e]);if(typeof t=="number"){var r=e.datapoints.pointsize;t=e.datapoints.points.slice(r*t,r*(t+1))}var i=mt(e,t);i==-1?(st.push({series:e,point:t,auto:n}),ht()):n||(st[i].auto=!1)}function vt(e,t){if(e==null&&t==null){st=[],ht();return}typeof e=="number"&&(e=u[e]);if(typeof t=="number"){var n=e.datapoints.pointsize;t=e.datapoints.points.slice(n*t,n*(t+1))}var r=mt(e,t);r!=-1&&(st.splice(r,1),ht())}function mt(e,t){for(var n=0;n<st.length;++n){var r=st[n];if(r.series==e&&r.point[0]==t[0]&&r.point[1]==t[1])return n}return-1}function gt(t,n){var r=n[0],i=n[1],s=t.xaxis,o=t.yaxis,u=typeof t.highlightColor=="string"?t.highlightColor:e.color.parse(t.color).scale("a",.5).toString();if(r<s.min||r>s.max||i<o.min||i>o.max)return;var a=t.points.radius+t.points.lineWidth/2;p.lineWidth=a,p.strokeStyle=u;var f=1.5*a;r=s.p2c(r),i=o.p2c(i),p.beginPath(),t.points.symbol=="circle"?p.arc(r,i,f,0,2*Math.PI,!1):t.points.symbol(p,r,i,f,!1),p.closePath(),p.stroke()}function yt(t,n){var r=typeof t.highlightColor=="string"?t.highlightColor:e.color.parse(t.color).scale("a",.5).toString(),i=r,s=t.bars.align=="left"?0:-t.bars.barWidth/2;p.lineWidth=t.bars.lineWidth,p.strokeStyle=r,tt(n[0],n[1],n[2]||0,s,s+t.bars.barWidth,0,function(){return i},t.xaxis,t.yaxis,p,t.bars.horizontal,t.bars.lineWidth)}function bt(t,n,r,i){if(typeof t=="string")return t;var s=h.createLinearGradient(0,r,0,n);for(var o=0,u=t.colors.length;o<u;++o){var a=t.colors[o];if(typeof a!="string"){var f=e.color.parse(i);a.brightness!=null&&(f=f.scale("rgb",a.brightness)),a.opacity!=null&&(f.a*=a.opacity),a=f.toString()}s.addColorStop(o/(u-1),a)}return s}var u=[],a={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:!0,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:.85,sorted:null},xaxis:{show:null,position:"bottom",mode:null,font:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null},yaxis:{autoscaleMargin:.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:!1,radius:3,lineWidth:2,fill:!0,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:!1,fillColor:null,steps:!1},bars:{show:!1,lineWidth:2,barWidth:1,fill:!0,fillColor:null,align:"left",horizontal:!1,zero:!0},shadowSize:3,highlightColor:null},grid:{show:!0,aboveData:!1,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,margin:0,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:!1,hoverable:!1,autoHighlight:!0,mouseActiveRadius:10},interaction:{redrawOverlayInterval:1e3/60},hooks:{}},f=null,l=null,c=null,h=null,p=null,d=[],v=[],m={left:0,right:0,top:0,bottom +:0},g=0,y=0,b={processOptions:[],processRawData:[],processDatapoints:[],processOffset:[],drawBackground:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},w=this;w.setData=T,w.setupGrid=R,w.draw=V,w.getPlaceholder=function(){return t},w.getCanvas=function(){return f.element},w.getPlotOffset=function(){return m},w.width=function(){return g},w.height=function(){return y},w.offset=function(){var e=c.offset();return e.left+=m.left,e.top+=m.top,e},w.getData=function(){return u},w.getAxes=function(){var t={},n;return e.each(d.concat(v),function(e,n){n&&(t[n.direction+(n.n!=1?n.n:"")+"axis"]=n)}),t},w.getXAxes=function(){return d},w.getYAxes=function(){return v},w.c2p=L,w.p2c=A,w.getOptions=function(){return a},w.highlight=dt,w.unhighlight=vt,w.triggerRedrawOverlay=ht,w.pointOffset=function(e){return{left:parseInt(d[C(e,"x")-1].p2c(+e.x)+m.left,10),top:parseInt(v[C(e,"y")-1].p2c(+e.y)+m.top,10)}},w.shutdown=H,w.resize=function(){var e=t.width(),n=t.height();f.resize(e,n),l.resize(e,n)},w.hooks=b,S(w),x(s),D(),T(r),R(),V(),P();var st=[],ot=null}function i(e,t){return t*Math.floor(e/t)}var t=Object.prototype.hasOwnProperty;n.prototype.resize=function(e,t){if(e<=0||t<=0)throw new Error("Invalid dimensions for plot, width = "+e+", height = "+t);var n=this.element,r=this.context,i=this.pixelRatio;this.width!=e&&(n.width=e*i,n.style.width=e+"px",this.width=e),this.height!=t&&(n.height=t*i,n.style.height=t+"px",this.height=t),r.restore(),r.save(),r.scale(i,i)},n.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)},n.prototype.render=function(){var e=this._textCache;for(var n in e)if(t.call(e,n)){var r=this.getTextLayer(n),i=e[n];r.hide();for(var s in i)if(t.call(i,s)){var o=i[s];for(var u in o)if(t.call(o,u)){var a=o[u].positions;for(var f=0,l;l=a[f];f++)l.active?l.rendered||(r.append(l.element),l.rendered=!0):(a.splice(f--,1),l.rendered&&l.element.detach());a.length==0&&delete o[u]}}r.show()}},n.prototype.getTextLayer=function(t){var n=this.text[t];return n==null&&(this.textContainer==null&&(this.textContainer=e("<div class='flot-text'></div>").css({position:"absolute",top:0,left:0,bottom:0,right:0,"font-size":"smaller",color:"#545454"}).insertAfter(this.element)),n=this.text[t]=e("<div></div>").addClass(t).css({position:"absolute",top:0,left:0,bottom:0,right:0}).appendTo(this.textContainer)),n},n.prototype.getTextInfo=function(t,n,r,i,s){var o,u,a,f;n=""+n,typeof r=="object"?o=r.style+" "+r.variant+" "+r.weight+" "+r.size+"px/"+r.lineHeight+"px "+r.family:o=r,u=this._textCache[t],u==null&&(u=this._textCache[t]={}),a=u[o],a==null&&(a=u[o]={}),f=a[n];if(f==null){var l=e("<div></div>").html(n).css({position:"absolute","max-width":s,top:-9999}).appendTo(this.getTextLayer(t));typeof r=="object"?l.css({font:o,color:r.color}):typeof r=="string"&&l.addClass(r),f=a[n]={width:l.outerWidth(!0),height:l.outerHeight(!0),element:l,positions:[]},l.detach()}return f},n.prototype.addText=function(e,t,n,r,i,s,o,u,a){var f=this.getTextInfo(e,r,i,s,o),l=f.positions;u=="center"?t-=f.width/2:u=="right"&&(t-=f.width),a=="middle"?n-=f.height/2:a=="bottom"&&(n-=f.height);for(var c=0,h;h=l[c];c++)if(h.x==t&&h.y==n){h.active=!0;return}h={active:!0,rendered:!1,element:l.length?f.element.clone():f.element,x:t,y:n},l.push(h),h.element.css({top:Math.round(n),left:Math.round(t),"text-align":u})},n.prototype.removeText=function(e,n,r,i,s,o){if(i==null){var u=this._textCache[e];if(u!=null)for(var a in u)if(t.call(u,a)){var f=u[a];for(var l in f)if(t.call(f,l)){var c=f[l].positions;for(var h=0,p;p=c[h];h++)p.active=!1}}}else{var c=this.getTextInfo(e,i,s,o).positions;for(var h=0,p;p=c[h];h++)p.x==n&&p.y==r&&(p.active=!1)}},e.plot=function(t,n,i){var s=new r(e(t),n,i,e.plot.plugins);return s},e.plot.version="0.8.1",e.plot.plugins=[],e.fn.plot=function(t,n){return this.each(function(){e.plot(this,t,n)})}}(jQuery);
\ No newline at end of file diff --git a/public/javascripts/jquery_ujs.js b/public/javascripts/jquery_ujs.js new file mode 100644 index 000000000..50121d6ed --- /dev/null +++ b/public/javascripts/jquery_ujs.js @@ -0,0 +1,393 @@ +(function($, undefined) { + +/** + * Unobtrusive scripting adapter for jQuery + * https://github.com/rails/jquery-ujs + * + * Requires jQuery 1.7.0 or later. + * + * Released under the MIT license + * + */ + +  // Cut down on the number of issues from people inadvertently including jquery_ujs twice +  // by detecting and raising an error when it happens. +  if ( $.rails !== undefined ) { +    $.error('jquery-ujs has already been loaded!'); +  } + +  // Shorthand to make it a little easier to call public rails functions from within rails.js +  var rails; + +  $.rails = rails = { +    // Link elements bound by jquery-ujs +    linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote], a[data-disable-with]', + +    // Button elements boud jquery-ujs +    buttonClickSelector: 'button[data-remote]', + +    // Select elements bound by jquery-ujs +    inputChangeSelector: 'select[data-remote], input[data-remote], textarea[data-remote]', + +    // Form elements bound by jquery-ujs +    formSubmitSelector: 'form', + +    // Form input elements bound by jquery-ujs +    formInputClickSelector: 'form input[type=submit], form input[type=image], form button[type=submit], form button:not([type])', + +    // Form input elements disabled during form submission +    disableSelector: 'input[data-disable-with], button[data-disable-with], textarea[data-disable-with]', + +    // Form input elements re-enabled after form submission +    enableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled', + +    // Form required input elements +    requiredInputSelector: 'input[name][required]:not([disabled]),textarea[name][required]:not([disabled])', + +    // Form file input elements +    fileInputSelector: 'input[type=file]', + +    // Link onClick disable selector with possible reenable after remote submission +    linkDisableSelector: 'a[data-disable-with]', + +    // Make sure that every Ajax request sends the CSRF token +    CSRFProtection: function(xhr) { +      var token = $('meta[name="csrf-token"]').attr('content'); +      if (token) xhr.setRequestHeader('X-CSRF-Token', token); +    }, + +    // Triggers an event on an element and returns false if the event result is false +    fire: function(obj, name, data) { +      var event = $.Event(name); +      obj.trigger(event, data); +      return event.result !== false; +    }, + +    // Default confirm dialog, may be overridden with custom confirm dialog in $.rails.confirm +    confirm: function(message) { +      return confirm(message); +    }, + +    // Default ajax function, may be overridden with custom function in $.rails.ajax +    ajax: function(options) { +      return $.ajax(options); +    }, + +    // Default way to get an element's href. May be overridden at $.rails.href. +    href: function(element) { +      return element.attr('href'); +    }, + +    // Submits "remote" forms and links with ajax +    handleRemote: function(element) { +      var method, url, data, elCrossDomain, crossDomain, withCredentials, dataType, options; + +      if (rails.fire(element, 'ajax:before')) { +        elCrossDomain = element.data('cross-domain'); +        crossDomain = elCrossDomain === undefined ? null : elCrossDomain; +        withCredentials = element.data('with-credentials') || null; +        dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType); + +        if (element.is('form')) { +          method = element.attr('method'); +          url = element.attr('action'); +          data = element.serializeArray(); +          // memoized value from clicked submit button +          var button = element.data('ujs:submit-button'); +          if (button) { +            data.push(button); +            element.data('ujs:submit-button', null); +          } +        } else if (element.is(rails.inputChangeSelector)) { +          method = element.data('method'); +          url = element.data('url'); +          data = element.serialize(); +          if (element.data('params')) data = data + "&" + element.data('params'); +        } else if (element.is(rails.buttonClickSelector)) { +          method = element.data('method') || 'get'; +          url = element.data('url'); +          data = element.serialize(); +          if (element.data('params')) data = data + "&" + element.data('params'); +        } else { +          method = element.data('method'); +          url = rails.href(element); +          data = element.data('params') || null; +        } + +        options = { +          type: method || 'GET', data: data, dataType: dataType, +          // stopping the "ajax:beforeSend" event will cancel the ajax request +          beforeSend: function(xhr, settings) { +            if (settings.dataType === undefined) { +              xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script); +            } +            return rails.fire(element, 'ajax:beforeSend', [xhr, settings]); +          }, +          success: function(data, status, xhr) { +            element.trigger('ajax:success', [data, status, xhr]); +          }, +          complete: function(xhr, status) { +            element.trigger('ajax:complete', [xhr, status]); +          }, +          error: function(xhr, status, error) { +            element.trigger('ajax:error', [xhr, status, error]); +          }, +          crossDomain: crossDomain +        }; + +        // There is no withCredentials for IE6-8 when +        // "Enable native XMLHTTP support" is disabled +        if (withCredentials) { +          options.xhrFields = { +            withCredentials: withCredentials +          }; +        } + +        // Only pass url to `ajax` options if not blank +        if (url) { options.url = url; } + +        var jqxhr = rails.ajax(options); +        element.trigger('ajax:send', jqxhr); +        return jqxhr; +      } else { +        return false; +      } +    }, + +    // Handles "data-method" on links such as: +    // <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a> +    handleMethod: function(link) { +      var href = rails.href(link), +        method = link.data('method'), +        target = link.attr('target'), +        csrf_token = $('meta[name=csrf-token]').attr('content'), +        csrf_param = $('meta[name=csrf-param]').attr('content'), +        form = $('<form method="post" action="' + href + '"></form>'), +        metadata_input = '<input name="_method" value="' + method + '" type="hidden" />'; + +      if (csrf_param !== undefined && csrf_token !== undefined) { +        metadata_input += '<input name="' + csrf_param + '" value="' + csrf_token + '" type="hidden" />'; +      } + +      if (target) { form.attr('target', target); } + +      form.hide().append(metadata_input).appendTo('body'); +      form.submit(); +    }, + +    /* Disables form elements: +      - Caches element value in 'ujs:enable-with' data store +      - Replaces element text with value of 'data-disable-with' attribute +      - Sets disabled property to true +    */ +    disableFormElements: function(form) { +      form.find(rails.disableSelector).each(function() { +        var element = $(this), method = element.is('button') ? 'html' : 'val'; +        element.data('ujs:enable-with', element[method]()); +        element[method](element.data('disable-with')); +        element.prop('disabled', true); +      }); +    }, + +    /* Re-enables disabled form elements: +      - Replaces element text with cached value from 'ujs:enable-with' data store (created in `disableFormElements`) +      - Sets disabled property to false +    */ +    enableFormElements: function(form) { +      form.find(rails.enableSelector).each(function() { +        var element = $(this), method = element.is('button') ? 'html' : 'val'; +        if (element.data('ujs:enable-with')) element[method](element.data('ujs:enable-with')); +        element.prop('disabled', false); +      }); +    }, + +   /* For 'data-confirm' attribute: +      - Fires `confirm` event +      - Shows the confirmation dialog +      - Fires the `confirm:complete` event + +      Returns `true` if no function stops the chain and user chose yes; `false` otherwise. +      Attaching a handler to the element's `confirm` event that returns a `falsy` value cancels the confirmation dialog. +      Attaching a handler to the element's `confirm:complete` event that returns a `falsy` value makes this function +      return false. The `confirm:complete` event is fired whether or not the user answered true or false to the dialog. +   */ +    allowAction: function(element) { +      var message = element.data('confirm'), +          answer = false, callback; +      if (!message) { return true; } + +      if (rails.fire(element, 'confirm')) { +        answer = rails.confirm(message); +        callback = rails.fire(element, 'confirm:complete', [answer]); +      } +      return answer && callback; +    }, + +    // Helper function which checks for blank inputs in a form that match the specified CSS selector +    blankInputs: function(form, specifiedSelector, nonBlank) { +      var inputs = $(), input, valueToCheck, +          selector = specifiedSelector || 'input,textarea', +          allInputs = form.find(selector); + +      allInputs.each(function() { +        input = $(this); +        valueToCheck = input.is('input[type=checkbox],input[type=radio]') ? input.is(':checked') : input.val(); +        // If nonBlank and valueToCheck are both truthy, or nonBlank and valueToCheck are both falsey +        if (!valueToCheck === !nonBlank) { + +          // Don't count unchecked required radio if other radio with same name is checked +          if (input.is('input[type=radio]') && allInputs.filter('input[type=radio]:checked[name="' + input.attr('name') + '"]').length) { +            return true; // Skip to next input +          } + +          inputs = inputs.add(input); +        } +      }); +      return inputs.length ? inputs : false; +    }, + +    // Helper function which checks for non-blank inputs in a form that match the specified CSS selector +    nonBlankInputs: function(form, specifiedSelector) { +      return rails.blankInputs(form, specifiedSelector, true); // true specifies nonBlank +    }, + +    // Helper function, needed to provide consistent behavior in IE +    stopEverything: function(e) { +      $(e.target).trigger('ujs:everythingStopped'); +      e.stopImmediatePropagation(); +      return false; +    }, + +    //  replace element's html with the 'data-disable-with' after storing original html +    //  and prevent clicking on it +    disableElement: function(element) { +      element.data('ujs:enable-with', element.html()); // store enabled state +      element.html(element.data('disable-with')); // set to disabled state +      element.bind('click.railsDisable', function(e) { // prevent further clicking +        return rails.stopEverything(e); +      }); +    }, + +    // restore element to its original state which was disabled by 'disableElement' above +    enableElement: function(element) { +      if (element.data('ujs:enable-with') !== undefined) { +        element.html(element.data('ujs:enable-with')); // set to old enabled state +        element.removeData('ujs:enable-with'); // clean up cache +      } +      element.unbind('click.railsDisable'); // enable element +    } + +  }; + +  if (rails.fire($(document), 'rails:attachBindings')) { + +    $.ajaxPrefilter(function(options, originalOptions, xhr){ if ( !options.crossDomain ) { rails.CSRFProtection(xhr); }}); + +    $(document).delegate(rails.linkDisableSelector, 'ajax:complete', function() { +        rails.enableElement($(this)); +    }); + +    $(document).delegate(rails.linkClickSelector, 'click.rails', function(e) { +      var link = $(this), method = link.data('method'), data = link.data('params'); +      if (!rails.allowAction(link)) return rails.stopEverything(e); + +      if (link.is(rails.linkDisableSelector)) rails.disableElement(link); + +      if (link.data('remote') !== undefined) { +        if ( (e.metaKey || e.ctrlKey) && (!method || method === 'GET') && !data ) { return true; } + +        var handleRemote = rails.handleRemote(link); +        // response from rails.handleRemote() will either be false or a deferred object promise. +        if (handleRemote === false) { +          rails.enableElement(link); +        } else { +          handleRemote.error( function() { rails.enableElement(link); } ); +        } +        return false; + +      } else if (link.data('method')) { +        rails.handleMethod(link); +        return false; +      } +    }); + +    $(document).delegate(rails.buttonClickSelector, 'click.rails', function(e) { +      var button = $(this); +      if (!rails.allowAction(button)) return rails.stopEverything(e); + +      rails.handleRemote(button); +      return false; +    }); + +    $(document).delegate(rails.inputChangeSelector, 'change.rails', function(e) { +      var link = $(this); +      if (!rails.allowAction(link)) return rails.stopEverything(e); + +      rails.handleRemote(link); +      return false; +    }); + +    $(document).delegate(rails.formSubmitSelector, 'submit.rails', function(e) { +      var form = $(this), +        remote = form.data('remote') !== undefined, +        blankRequiredInputs = rails.blankInputs(form, rails.requiredInputSelector), +        nonBlankFileInputs = rails.nonBlankInputs(form, rails.fileInputSelector); + +      if (!rails.allowAction(form)) return rails.stopEverything(e); + +      // skip other logic when required values are missing or file upload is present +      if (blankRequiredInputs && form.attr("novalidate") == undefined && rails.fire(form, 'ajax:aborted:required', [blankRequiredInputs])) { +        return rails.stopEverything(e); +      } + +      if (remote) { +        if (nonBlankFileInputs) { +          // slight timeout so that the submit button gets properly serialized +          // (make it easy for event handler to serialize form without disabled values) +          setTimeout(function(){ rails.disableFormElements(form); }, 13); +          var aborted = rails.fire(form, 'ajax:aborted:file', [nonBlankFileInputs]); + +          // re-enable form elements if event bindings return false (canceling normal form submission) +          if (!aborted) { setTimeout(function(){ rails.enableFormElements(form); }, 13); } + +          return aborted; +        } + +        rails.handleRemote(form); +        return false; + +      } else { +        // slight timeout so that the submit button gets properly serialized +        setTimeout(function(){ rails.disableFormElements(form); }, 13); +      } +    }); + +    $(document).delegate(rails.formInputClickSelector, 'click.rails', function(event) { +      var button = $(this); + +      if (!rails.allowAction(button)) return rails.stopEverything(event); + +      // register the pressed submit button +      var name = button.attr('name'), +        data = name ? {name:name, value:button.val()} : null; + +      button.closest('form').data('ujs:submit-button', data); +    }); + +    $(document).delegate(rails.formSubmitSelector, 'ajax:beforeSend.rails', function(event) { +      if (this == event.target) rails.disableFormElements($(this)); +    }); + +    $(document).delegate(rails.formSubmitSelector, 'ajax:complete.rails', function(event) { +      if (this == event.target) rails.enableFormElements($(this)); +    }); + +    $(function(){ +      // making sure that all forms have actual up-to-date token(cached forms contain old one) +      var csrf_token = $('meta[name=csrf-token]').attr('content'); +      var csrf_param = $('meta[name=csrf-param]').attr('content'); +      $('form input[name="' + csrf_param + '"]').val(csrf_token); +    }); +  } + +})( jQuery ); diff --git a/public/javascripts/prototype.js b/public/javascripts/prototype.js deleted file mode 100644 index 06249a6ae..000000000 --- a/public/javascripts/prototype.js +++ /dev/null @@ -1,6001 +0,0 @@ -/*  Prototype JavaScript framework, version 1.7_rc2 - *  (c) 2005-2010 Sam Stephenson - * - *  Prototype is freely distributable under the terms of an MIT-style license. - *  For details, see the Prototype web site: http://www.prototypejs.org/ - * - *--------------------------------------------------------------------------*/ - -var Prototype = { - -  Version: '1.7_rc2', - -  Browser: (function(){ -    var ua = navigator.userAgent; -    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; -    return { -      IE:             !!window.attachEvent && !isOpera, -      Opera:          isOpera, -      WebKit:         ua.indexOf('AppleWebKit/') > -1, -      Gecko:          ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, -      MobileSafari:   /Apple.*Mobile/.test(ua) -    } -  })(), - -  BrowserFeatures: { -    XPath: !!document.evaluate, - -    SelectorsAPI: !!document.querySelector, - -    ElementExtensions: (function() { -      var constructor = window.Element || window.HTMLElement; -      return !!(constructor && constructor.prototype); -    })(), -    SpecificElementExtensions: (function() { -      if (typeof window.HTMLDivElement !== 'undefined') -        return true; - -      var div = document.createElement('div'), -          form = document.createElement('form'), -          isSupported = false; - -      if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) { -        isSupported = true; -      } - -      div = form = null; - -      return isSupported; -    })() -  }, - -  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>', -  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, - -  emptyFunction: function() { }, - -  K: function(x) { return x } -}; - -if (Prototype.Browser.MobileSafari) -  Prototype.BrowserFeatures.SpecificElementExtensions = false; - - -var Abstract = { }; - - -var Try = { -  these: function() { -    var returnValue; - -    for (var i = 0, length = arguments.length; i < length; i++) { -      var lambda = arguments[i]; -      try { -        returnValue = lambda(); -        break; -      } catch (e) { } -    } - -    return returnValue; -  } -}; - -/* Based on Alex Arnell's inheritance implementation. */ - -var Class = (function() { - -  var IS_DONTENUM_BUGGY = (function(){ -    for (var p in { toString: 1 }) { -      if (p === 'toString') return false; -    } -    return true; -  })(); - -  function subclass() {}; -  function create() { -    var parent = null, properties = $A(arguments); -    if (Object.isFunction(properties[0])) -      parent = properties.shift(); - -    function klass() { -      this.initialize.apply(this, arguments); -    } - -    Object.extend(klass, Class.Methods); -    klass.superclass = parent; -    klass.subclasses = []; - -    if (parent) { -      subclass.prototype = parent.prototype; -      klass.prototype = new subclass; -      parent.subclasses.push(klass); -    } - -    for (var i = 0, length = properties.length; i < length; i++) -      klass.addMethods(properties[i]); - -    if (!klass.prototype.initialize) -      klass.prototype.initialize = Prototype.emptyFunction; - -    klass.prototype.constructor = klass; -    return klass; -  } - -  function addMethods(source) { -    var ancestor   = this.superclass && this.superclass.prototype, -        properties = Object.keys(source); - -    if (IS_DONTENUM_BUGGY) { -      if (source.toString != Object.prototype.toString) -        properties.push("toString"); -      if (source.valueOf != Object.prototype.valueOf) -        properties.push("valueOf"); -    } - -    for (var i = 0, length = properties.length; i < length; i++) { -      var property = properties[i], value = source[property]; -      if (ancestor && Object.isFunction(value) && -          value.argumentNames()[0] == "$super") { -        var method = value; -        value = (function(m) { -          return function() { return ancestor[m].apply(this, arguments); }; -        })(property).wrap(method); - -        value.valueOf = method.valueOf.bind(method); -        value.toString = method.toString.bind(method); -      } -      this.prototype[property] = value; -    } - -    return this; -  } - -  return { -    create: create, -    Methods: { -      addMethods: addMethods -    } -  }; -})(); -(function() { - -  var _toString = Object.prototype.toString, -      NULL_TYPE = 'Null', -      UNDEFINED_TYPE = 'Undefined', -      BOOLEAN_TYPE = 'Boolean', -      NUMBER_TYPE = 'Number', -      STRING_TYPE = 'String', -      OBJECT_TYPE = 'Object', -      BOOLEAN_CLASS = '[object Boolean]', -      NUMBER_CLASS = '[object Number]', -      STRING_CLASS = '[object String]', -      ARRAY_CLASS = '[object Array]', -      NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON && -        typeof JSON.stringify === 'function' && -        JSON.stringify(0) === '0' && -        typeof JSON.stringify(Prototype.K) === 'undefined'; - -  function Type(o) { -    switch(o) { -      case null: return NULL_TYPE; -      case (void 0): return UNDEFINED_TYPE; -    } -    var type = typeof o; -    switch(type) { -      case 'boolean': return BOOLEAN_TYPE; -      case 'number':  return NUMBER_TYPE; -      case 'string':  return STRING_TYPE; -    } -    return OBJECT_TYPE; -  } - -  function extend(destination, source) { -    for (var property in source) -      destination[property] = source[property]; -    return destination; -  } - -  function inspect(object) { -    try { -      if (isUndefined(object)) return 'undefined'; -      if (object === null) return 'null'; -      return object.inspect ? object.inspect() : String(object); -    } catch (e) { -      if (e instanceof RangeError) return '...'; -      throw e; -    } -  } - -  function toJSON(value) { -    return Str('', { '': value }, []); -  } - -  function Str(key, holder, stack) { -    var value = holder[key], -        type = typeof value; - -    if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') { -      value = value.toJSON(key); -    } - -    var _class = _toString.call(value); - -    switch (_class) { -      case NUMBER_CLASS: -      case BOOLEAN_CLASS: -      case STRING_CLASS: -        value = value.valueOf(); -    } - -    switch (value) { -      case null: return 'null'; -      case true: return 'true'; -      case false: return 'false'; -    } - -    type = typeof value; -    switch (type) { -      case 'string': -        return value.inspect(true); -      case 'number': -        return isFinite(value) ? String(value) : 'null'; -      case 'object': - -        for (var i = 0, length = stack.length; i < length; i++) { -          if (stack[i] === value) { throw new TypeError(); } -        } -        stack.push(value); - -        var partial = []; -        if (_class === ARRAY_CLASS) { -          for (var i = 0, length = value.length; i < length; i++) { -            var str = Str(i, value, stack); -            partial.push(typeof str === 'undefined' ? 'null' : str); -          } -          partial = '[' + partial.join(',') + ']'; -        } else { -          var keys = Object.keys(value); -          for (var i = 0, length = keys.length; i < length; i++) { -            var key = keys[i], str = Str(key, value, stack); -            if (typeof str !== "undefined") { -               partial.push(key.inspect(true)+ ':' + str); -             } -          } -          partial = '{' + partial.join(',') + '}'; -        } -        stack.pop(); -        return partial; -    } -  } - -  function stringify(object) { -    return JSON.stringify(object); -  } - -  function toQueryString(object) { -    return $H(object).toQueryString(); -  } - -  function toHTML(object) { -    return object && object.toHTML ? object.toHTML() : String.interpret(object); -  } - -  function keys(object) { -    if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); } -    var results = []; -    for (var property in object) { -      if (object.hasOwnProperty(property)) { -        results.push(property); -      } -    } -    return results; -  } - -  function values(object) { -    var results = []; -    for (var property in object) -      results.push(object[property]); -    return results; -  } - -  function clone(object) { -    return extend({ }, object); -  } - -  function isElement(object) { -    return !!(object && object.nodeType == 1); -  } - -  function isArray(object) { -    return _toString.call(object) === ARRAY_CLASS; -  } - -  var hasNativeIsArray = (typeof Array.isArray == 'function') -    && Array.isArray([]) && !Array.isArray({}); - -  if (hasNativeIsArray) { -    isArray = Array.isArray; -  } - -  function isHash(object) { -    return object instanceof Hash; -  } - -  function isFunction(object) { -    return typeof object === "function"; -  } - -  function isString(object) { -    return _toString.call(object) === STRING_CLASS; -  } - -  function isNumber(object) { -    return _toString.call(object) === NUMBER_CLASS; -  } - -  function isUndefined(object) { -    return typeof object === "undefined"; -  } - -  extend(Object, { -    extend:        extend, -    inspect:       inspect, -    toJSON:        NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON, -    toQueryString: toQueryString, -    toHTML:        toHTML, -    keys:          Object.keys || keys, -    values:        values, -    clone:         clone, -    isElement:     isElement, -    isArray:       isArray, -    isHash:        isHash, -    isFunction:    isFunction, -    isString:      isString, -    isNumber:      isNumber, -    isUndefined:   isUndefined -  }); -})(); -Object.extend(Function.prototype, (function() { -  var slice = Array.prototype.slice; - -  function update(array, args) { -    var arrayLength = array.length, length = args.length; -    while (length--) array[arrayLength + length] = args[length]; -    return array; -  } - -  function merge(array, args) { -    array = slice.call(array, 0); -    return update(array, args); -  } - -  function argumentNames() { -    var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] -      .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') -      .replace(/\s+/g, '').split(','); -    return names.length == 1 && !names[0] ? [] : names; -  } - -  function bind(context) { -    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; -    var __method = this, args = slice.call(arguments, 1); -    return function() { -      var a = merge(args, arguments); -      return __method.apply(context, a); -    } -  } - -  function bindAsEventListener(context) { -    var __method = this, args = slice.call(arguments, 1); -    return function(event) { -      var a = update([event || window.event], args); -      return __method.apply(context, a); -    } -  } - -  function curry() { -    if (!arguments.length) return this; -    var __method = this, args = slice.call(arguments, 0); -    return function() { -      var a = merge(args, arguments); -      return __method.apply(this, a); -    } -  } - -  function delay(timeout) { -    var __method = this, args = slice.call(arguments, 1); -    timeout = timeout * 1000; -    return window.setTimeout(function() { -      return __method.apply(__method, args); -    }, timeout); -  } - -  function defer() { -    var args = update([0.01], arguments); -    return this.delay.apply(this, args); -  } - -  function wrap(wrapper) { -    var __method = this; -    return function() { -      var a = update([__method.bind(this)], arguments); -      return wrapper.apply(this, a); -    } -  } - -  function methodize() { -    if (this._methodized) return this._methodized; -    var __method = this; -    return this._methodized = function() { -      var a = update([this], arguments); -      return __method.apply(null, a); -    }; -  } - -  return { -    argumentNames:       argumentNames, -    bind:                bind, -    bindAsEventListener: bindAsEventListener, -    curry:               curry, -    delay:               delay, -    defer:               defer, -    wrap:                wrap, -    methodize:           methodize -  } -})()); - - - -(function(proto) { - - -  function toISOString() { -    return this.getUTCFullYear() + '-' + -      (this.getUTCMonth() + 1).toPaddedString(2) + '-' + -      this.getUTCDate().toPaddedString(2) + 'T' + -      this.getUTCHours().toPaddedString(2) + ':' + -      this.getUTCMinutes().toPaddedString(2) + ':' + -      this.getUTCSeconds().toPaddedString(2) + 'Z'; -  } - - -  function toJSON() { -    return this.toISOString(); -  } - -  if (!proto.toISOString) proto.toISOString = toISOString; -  if (!proto.toJSON) proto.toJSON = toJSON; - -})(Date.prototype); - - -RegExp.prototype.match = RegExp.prototype.test; - -RegExp.escape = function(str) { -  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); -}; -var PeriodicalExecuter = Class.create({ -  initialize: function(callback, frequency) { -    this.callback = callback; -    this.frequency = frequency; -    this.currentlyExecuting = false; - -    this.registerCallback(); -  }, - -  registerCallback: function() { -    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); -  }, - -  execute: function() { -    this.callback(this); -  }, - -  stop: function() { -    if (!this.timer) return; -    clearInterval(this.timer); -    this.timer = null; -  }, - -  onTimerEvent: function() { -    if (!this.currentlyExecuting) { -      try { -        this.currentlyExecuting = true; -        this.execute(); -        this.currentlyExecuting = false; -      } catch(e) { -        this.currentlyExecuting = false; -        throw e; -      } -    } -  } -}); -Object.extend(String, { -  interpret: function(value) { -    return value == null ? '' : String(value); -  }, -  specialChar: { -    '\b': '\\b', -    '\t': '\\t', -    '\n': '\\n', -    '\f': '\\f', -    '\r': '\\r', -    '\\': '\\\\' -  } -}); - -Object.extend(String.prototype, (function() { -  var NATIVE_JSON_PARSE_SUPPORT = window.JSON && -    typeof JSON.parse === 'function' && -    JSON.parse('{"test": true}').test; - -  function prepareReplacement(replacement) { -    if (Object.isFunction(replacement)) return replacement; -    var template = new Template(replacement); -    return function(match) { return template.evaluate(match) }; -  } - -  function gsub(pattern, replacement) { -    var result = '', source = this, match; -    replacement = prepareReplacement(replacement); - -    if (Object.isString(pattern)) -      pattern = RegExp.escape(pattern); - -    if (!(pattern.length || pattern.source)) { -      replacement = replacement(''); -      return replacement + source.split('').join(replacement) + replacement; -    } - -    while (source.length > 0) { -      if (match = source.match(pattern)) { -        result += source.slice(0, match.index); -        result += String.interpret(replacement(match)); -        source  = source.slice(match.index + match[0].length); -      } else { -        result += source, source = ''; -      } -    } -    return result; -  } - -  function sub(pattern, replacement, count) { -    replacement = prepareReplacement(replacement); -    count = Object.isUndefined(count) ? 1 : count; - -    return this.gsub(pattern, function(match) { -      if (--count < 0) return match[0]; -      return replacement(match); -    }); -  } - -  function scan(pattern, iterator) { -    this.gsub(pattern, iterator); -    return String(this); -  } - -  function truncate(length, truncation) { -    length = length || 30; -    truncation = Object.isUndefined(truncation) ? '...' : truncation; -    return this.length > length ? -      this.slice(0, length - truncation.length) + truncation : String(this); -  } - -  function strip() { -    return this.replace(/^\s+/, '').replace(/\s+$/, ''); -  } - -  function stripTags() { -    return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, ''); -  } - -  function stripScripts() { -    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); -  } - -  function extractScripts() { -    var matchAll = new RegExp(Prototype.ScriptFragment, 'img'), -        matchOne = new RegExp(Prototype.ScriptFragment, 'im'); -    return (this.match(matchAll) || []).map(function(scriptTag) { -      return (scriptTag.match(matchOne) || ['', ''])[1]; -    }); -  } - -  function evalScripts() { -    return this.extractScripts().map(function(script) { return eval(script) }); -  } - -  function escapeHTML() { -    return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); -  } - -  function unescapeHTML() { -    return this.stripTags().replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&'); -  } - - -  function toQueryParams(separator) { -    var match = this.strip().match(/([^?#]*)(#.*)?$/); -    if (!match) return { }; - -    return match[1].split(separator || '&').inject({ }, function(hash, pair) { -      if ((pair = pair.split('='))[0]) { -        var key = decodeURIComponent(pair.shift()), -            value = pair.length > 1 ? pair.join('=') : pair[0]; - -        if (value != undefined) value = decodeURIComponent(value); - -        if (key in hash) { -          if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; -          hash[key].push(value); -        } -        else hash[key] = value; -      } -      return hash; -    }); -  } - -  function toArray() { -    return this.split(''); -  } - -  function succ() { -    return this.slice(0, this.length - 1) + -      String.fromCharCode(this.charCodeAt(this.length - 1) + 1); -  } - -  function times(count) { -    return count < 1 ? '' : new Array(count + 1).join(this); -  } - -  function camelize() { -    return this.replace(/-+(.)?/g, function(match, chr) { -      return chr ? chr.toUpperCase() : ''; -    }); -  } - -  function capitalize() { -    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); -  } - -  function underscore() { -    return this.replace(/::/g, '/') -               .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') -               .replace(/([a-z\d])([A-Z])/g, '$1_$2') -               .replace(/-/g, '_') -               .toLowerCase(); -  } - -  function dasherize() { -    return this.replace(/_/g, '-'); -  } - -  function inspect(useDoubleQuotes) { -    var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) { -      if (character in String.specialChar) { -        return String.specialChar[character]; -      } -      return '\\u00' + character.charCodeAt().toPaddedString(2, 16); -    }); -    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; -    return "'" + escapedString.replace(/'/g, '\\\'') + "'"; -  } - -  function unfilterJSON(filter) { -    return this.replace(filter || Prototype.JSONFilter, '$1'); -  } - -  function isJSON() { -    var str = this; -    if (str.blank()) return false; -    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'); -    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'); -    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); -    return (/^[\],:{}\s]*$/).test(str); -  } - -  function evalJSON(sanitize) { -    var json = this.unfilterJSON(), -        cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; -    if (cx.test(json)) { -      json = json.replace(cx, function (a) { -        return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); -      }); -    } -    try { -      if (!sanitize || json.isJSON()) return eval('(' + json + ')'); -    } catch (e) { } -    throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); -  } - -  function parseJSON() { -    var json = this.unfilterJSON(); -    return JSON.parse(json); -  } - -  function include(pattern) { -    return this.indexOf(pattern) > -1; -  } - -  function startsWith(pattern) { -    return this.lastIndexOf(pattern, 0) === 0; -  } - -  function endsWith(pattern) { -    var d = this.length - pattern.length; -    return d >= 0 && this.indexOf(pattern, d) === d; -  } - -  function empty() { -    return this == ''; -  } - -  function blank() { -    return /^\s*$/.test(this); -  } - -  function interpolate(object, pattern) { -    return new Template(this, pattern).evaluate(object); -  } - -  return { -    gsub:           gsub, -    sub:            sub, -    scan:           scan, -    truncate:       truncate, -    strip:          String.prototype.trim || strip, -    stripTags:      stripTags, -    stripScripts:   stripScripts, -    extractScripts: extractScripts, -    evalScripts:    evalScripts, -    escapeHTML:     escapeHTML, -    unescapeHTML:   unescapeHTML, -    toQueryParams:  toQueryParams, -    parseQuery:     toQueryParams, -    toArray:        toArray, -    succ:           succ, -    times:          times, -    camelize:       camelize, -    capitalize:     capitalize, -    underscore:     underscore, -    dasherize:      dasherize, -    inspect:        inspect, -    unfilterJSON:   unfilterJSON, -    isJSON:         isJSON, -    evalJSON:       NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON, -    include:        include, -    startsWith:     startsWith, -    endsWith:       endsWith, -    empty:          empty, -    blank:          blank, -    interpolate:    interpolate -  }; -})()); - -var Template = Class.create({ -  initialize: function(template, pattern) { -    this.template = template.toString(); -    this.pattern = pattern || Template.Pattern; -  }, - -  evaluate: function(object) { -    if (object && Object.isFunction(object.toTemplateReplacements)) -      object = object.toTemplateReplacements(); - -    return this.template.gsub(this.pattern, function(match) { -      if (object == null) return (match[1] + ''); - -      var before = match[1] || ''; -      if (before == '\\') return match[2]; - -      var ctx = object, expr = match[3], -          pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; - -      match = pattern.exec(expr); -      if (match == null) return before; - -      while (match != null) { -        var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1]; -        ctx = ctx[comp]; -        if (null == ctx || '' == match[3]) break; -        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); -        match = pattern.exec(expr); -      } - -      return before + String.interpret(ctx); -    }); -  } -}); -Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; - -var $break = { }; - -var Enumerable = (function() { -  function each(iterator, context) { -    var index = 0; -    try { -      this._each(function(value) { -        iterator.call(context, value, index++); -      }); -    } catch (e) { -      if (e != $break) throw e; -    } -    return this; -  } - -  function eachSlice(number, iterator, context) { -    var index = -number, slices = [], array = this.toArray(); -    if (number < 1) return array; -    while ((index += number) < array.length) -      slices.push(array.slice(index, index+number)); -    return slices.collect(iterator, context); -  } - -  function all(iterator, context) { -    iterator = iterator || Prototype.K; -    var result = true; -    this.each(function(value, index) { -      result = result && !!iterator.call(context, value, index); -      if (!result) throw $break; -    }); -    return result; -  } - -  function any(iterator, context) { -    iterator = iterator || Prototype.K; -    var result = false; -    this.each(function(value, index) { -      if (result = !!iterator.call(context, value, index)) -        throw $break; -    }); -    return result; -  } - -  function collect(iterator, context) { -    iterator = iterator || Prototype.K; -    var results = []; -    this.each(function(value, index) { -      results.push(iterator.call(context, value, index)); -    }); -    return results; -  } - -  function detect(iterator, context) { -    var result; -    this.each(function(value, index) { -      if (iterator.call(context, value, index)) { -        result = value; -        throw $break; -      } -    }); -    return result; -  } - -  function findAll(iterator, context) { -    var results = []; -    this.each(function(value, index) { -      if (iterator.call(context, value, index)) -        results.push(value); -    }); -    return results; -  } - -  function grep(filter, iterator, context) { -    iterator = iterator || Prototype.K; -    var results = []; - -    if (Object.isString(filter)) -      filter = new RegExp(RegExp.escape(filter)); - -    this.each(function(value, index) { -      if (filter.match(value)) -        results.push(iterator.call(context, value, index)); -    }); -    return results; -  } - -  function include(object) { -    if (Object.isFunction(this.indexOf)) -      if (this.indexOf(object) != -1) return true; - -    var found = false; -    this.each(function(value) { -      if (value == object) { -        found = true; -        throw $break; -      } -    }); -    return found; -  } - -  function inGroupsOf(number, fillWith) { -    fillWith = Object.isUndefined(fillWith) ? null : fillWith; -    return this.eachSlice(number, function(slice) { -      while(slice.length < number) slice.push(fillWith); -      return slice; -    }); -  } - -  function inject(memo, iterator, context) { -    this.each(function(value, index) { -      memo = iterator.call(context, memo, value, index); -    }); -    return memo; -  } - -  function invoke(method) { -    var args = $A(arguments).slice(1); -    return this.map(function(value) { -      return value[method].apply(value, args); -    }); -  } - -  function max(iterator, context) { -    iterator = iterator || Prototype.K; -    var result; -    this.each(function(value, index) { -      value = iterator.call(context, value, index); -      if (result == null || value >= result) -        result = value; -    }); -    return result; -  } - -  function min(iterator, context) { -    iterator = iterator || Prototype.K; -    var result; -    this.each(function(value, index) { -      value = iterator.call(context, value, index); -      if (result == null || value < result) -        result = value; -    }); -    return result; -  } - -  function partition(iterator, context) { -    iterator = iterator || Prototype.K; -    var trues = [], falses = []; -    this.each(function(value, index) { -      (iterator.call(context, value, index) ? -        trues : falses).push(value); -    }); -    return [trues, falses]; -  } - -  function pluck(property) { -    var results = []; -    this.each(function(value) { -      results.push(value[property]); -    }); -    return results; -  } - -  function reject(iterator, context) { -    var results = []; -    this.each(function(value, index) { -      if (!iterator.call(context, value, index)) -        results.push(value); -    }); -    return results; -  } - -  function sortBy(iterator, context) { -    return this.map(function(value, index) { -      return { -        value: value, -        criteria: iterator.call(context, value, index) -      }; -    }).sort(function(left, right) { -      var a = left.criteria, b = right.criteria; -      return a < b ? -1 : a > b ? 1 : 0; -    }).pluck('value'); -  } - -  function toArray() { -    return this.map(); -  } - -  function zip() { -    var iterator = Prototype.K, args = $A(arguments); -    if (Object.isFunction(args.last())) -      iterator = args.pop(); - -    var collections = [this].concat(args).map($A); -    return this.map(function(value, index) { -      return iterator(collections.pluck(index)); -    }); -  } - -  function size() { -    return this.toArray().length; -  } - -  function inspect() { -    return '#<Enumerable:' + this.toArray().inspect() + '>'; -  } - - - - - - - - - -  return { -    each:       each, -    eachSlice:  eachSlice, -    all:        all, -    every:      all, -    any:        any, -    some:       any, -    collect:    collect, -    map:        collect, -    detect:     detect, -    findAll:    findAll, -    select:     findAll, -    filter:     findAll, -    grep:       grep, -    include:    include, -    member:     include, -    inGroupsOf: inGroupsOf, -    inject:     inject, -    invoke:     invoke, -    max:        max, -    min:        min, -    partition:  partition, -    pluck:      pluck, -    reject:     reject, -    sortBy:     sortBy, -    toArray:    toArray, -    entries:    toArray, -    zip:        zip, -    size:       size, -    inspect:    inspect, -    find:       detect -  }; -})(); - -function $A(iterable) { -  if (!iterable) return []; -  if ('toArray' in Object(iterable)) return iterable.toArray(); -  var length = iterable.length || 0, results = new Array(length); -  while (length--) results[length] = iterable[length]; -  return results; -} - - -function $w(string) { -  if (!Object.isString(string)) return []; -  string = string.strip(); -  return string ? string.split(/\s+/) : []; -} - -Array.from = $A; - - -(function() { -  var arrayProto = Array.prototype, -      slice = arrayProto.slice, -      _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available - -  function each(iterator) { -    for (var i = 0, length = this.length; i < length; i++) -      iterator(this[i]); -  } -  if (!_each) _each = each; - -  function clear() { -    this.length = 0; -    return this; -  } - -  function first() { -    return this[0]; -  } - -  function last() { -    return this[this.length - 1]; -  } - -  function compact() { -    return this.select(function(value) { -      return value != null; -    }); -  } - -  function flatten() { -    return this.inject([], function(array, value) { -      if (Object.isArray(value)) -        return array.concat(value.flatten()); -      array.push(value); -      return array; -    }); -  } - -  function without() { -    var values = slice.call(arguments, 0); -    return this.select(function(value) { -      return !values.include(value); -    }); -  } - -  function reverse(inline) { -    return (inline === false ? this.toArray() : this)._reverse(); -  } - -  function uniq(sorted) { -    return this.inject([], function(array, value, index) { -      if (0 == index || (sorted ? array.last() != value : !array.include(value))) -        array.push(value); -      return array; -    }); -  } - -  function intersect(array) { -    return this.uniq().findAll(function(item) { -      return array.detect(function(value) { return item === value }); -    }); -  } - - -  function clone() { -    return slice.call(this, 0); -  } - -  function size() { -    return this.length; -  } - -  function inspect() { -    return '[' + this.map(Object.inspect).join(', ') + ']'; -  } - -  function indexOf(item, i) { -    i || (i = 0); -    var length = this.length; -    if (i < 0) i = length + i; -    for (; i < length; i++) -      if (this[i] === item) return i; -    return -1; -  } - -  function lastIndexOf(item, i) { -    i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; -    var n = this.slice(0, i).reverse().indexOf(item); -    return (n < 0) ? n : i - n - 1; -  } - -  function concat() { -    var array = slice.call(this, 0), item; -    for (var i = 0, length = arguments.length; i < length; i++) { -      item = arguments[i]; -      if (Object.isArray(item) && !('callee' in item)) { -        for (var j = 0, arrayLength = item.length; j < arrayLength; j++) -          array.push(item[j]); -      } else { -        array.push(item); -      } -    } -    return array; -  } - -  Object.extend(arrayProto, Enumerable); - -  if (!arrayProto._reverse) -    arrayProto._reverse = arrayProto.reverse; - -  Object.extend(arrayProto, { -    _each:     _each, -    clear:     clear, -    first:     first, -    last:      last, -    compact:   compact, -    flatten:   flatten, -    without:   without, -    reverse:   reverse, -    uniq:      uniq, -    intersect: intersect, -    clone:     clone, -    toArray:   clone, -    size:      size, -    inspect:   inspect -  }); - -  var CONCAT_ARGUMENTS_BUGGY = (function() { -    return [].concat(arguments)[0][0] !== 1; -  })(1,2) - -  if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat; - -  if (!arrayProto.indexOf) arrayProto.indexOf = indexOf; -  if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf; -})(); -function $H(object) { -  return new Hash(object); -}; - -var Hash = Class.create(Enumerable, (function() { -  function initialize(object) { -    this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); -  } - - -  function _each(iterator) { -    for (var key in this._object) { -      var value = this._object[key], pair = [key, value]; -      pair.key = key; -      pair.value = value; -      iterator(pair); -    } -  } - -  function set(key, value) { -    return this._object[key] = value; -  } - -  function get(key) { -    if (this._object[key] !== Object.prototype[key]) -      return this._object[key]; -  } - -  function unset(key) { -    var value = this._object[key]; -    delete this._object[key]; -    return value; -  } - -  function toObject() { -    return Object.clone(this._object); -  } - - - -  function keys() { -    return this.pluck('key'); -  } - -  function values() { -    return this.pluck('value'); -  } - -  function index(value) { -    var match = this.detect(function(pair) { -      return pair.value === value; -    }); -    return match && match.key; -  } - -  function merge(object) { -    return this.clone().update(object); -  } - -  function update(object) { -    return new Hash(object).inject(this, function(result, pair) { -      result.set(pair.key, pair.value); -      return result; -    }); -  } - -  function toQueryPair(key, value) { -    if (Object.isUndefined(value)) return key; -    return key + '=' + encodeURIComponent(String.interpret(value)); -  } - -  function toQueryString() { -    return this.inject([], function(results, pair) { -      var key = encodeURIComponent(pair.key), values = pair.value; - -      if (values && typeof values == 'object') { -        if (Object.isArray(values)) -          return results.concat(values.map(toQueryPair.curry(key))); -      } else results.push(toQueryPair(key, values)); -      return results; -    }).join('&'); -  } - -  function inspect() { -    return '#<Hash:{' + this.map(function(pair) { -      return pair.map(Object.inspect).join(': '); -    }).join(', ') + '}>'; -  } - -  function clone() { -    return new Hash(this); -  } - -  return { -    initialize:             initialize, -    _each:                  _each, -    set:                    set, -    get:                    get, -    unset:                  unset, -    toObject:               toObject, -    toTemplateReplacements: toObject, -    keys:                   keys, -    values:                 values, -    index:                  index, -    merge:                  merge, -    update:                 update, -    toQueryString:          toQueryString, -    inspect:                inspect, -    toJSON:                 toObject, -    clone:                  clone -  }; -})()); - -Hash.from = $H; -Object.extend(Number.prototype, (function() { -  function toColorPart() { -    return this.toPaddedString(2, 16); -  } - -  function succ() { -    return this + 1; -  } - -  function times(iterator, context) { -    $R(0, this, true).each(iterator, context); -    return this; -  } - -  function toPaddedString(length, radix) { -    var string = this.toString(radix || 10); -    return '0'.times(length - string.length) + string; -  } - -  function abs() { -    return Math.abs(this); -  } - -  function round() { -    return Math.round(this); -  } - -  function ceil() { -    return Math.ceil(this); -  } - -  function floor() { -    return Math.floor(this); -  } - -  return { -    toColorPart:    toColorPart, -    succ:           succ, -    times:          times, -    toPaddedString: toPaddedString, -    abs:            abs, -    round:          round, -    ceil:           ceil, -    floor:          floor -  }; -})()); - -function $R(start, end, exclusive) { -  return new ObjectRange(start, end, exclusive); -} - -var ObjectRange = Class.create(Enumerable, (function() { -  function initialize(start, end, exclusive) { -    this.start = start; -    this.end = end; -    this.exclusive = exclusive; -  } - -  function _each(iterator) { -    var value = this.start; -    while (this.include(value)) { -      iterator(value); -      value = value.succ(); -    } -  } - -  function include(value) { -    if (value < this.start) -      return false; -    if (this.exclusive) -      return value < this.end; -    return value <= this.end; -  } - -  return { -    initialize: initialize, -    _each:      _each, -    include:    include -  }; -})()); - - - -var Ajax = { -  getTransport: function() { -    return Try.these( -      function() {return new XMLHttpRequest()}, -      function() {return new ActiveXObject('Msxml2.XMLHTTP')}, -      function() {return new ActiveXObject('Microsoft.XMLHTTP')} -    ) || false; -  }, - -  activeRequestCount: 0 -}; - -Ajax.Responders = { -  responders: [], - -  _each: function(iterator) { -    this.responders._each(iterator); -  }, - -  register: function(responder) { -    if (!this.include(responder)) -      this.responders.push(responder); -  }, - -  unregister: function(responder) { -    this.responders = this.responders.without(responder); -  }, - -  dispatch: function(callback, request, transport, json) { -    this.each(function(responder) { -      if (Object.isFunction(responder[callback])) { -        try { -          responder[callback].apply(responder, [request, transport, json]); -        } catch (e) { } -      } -    }); -  } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ -  onCreate:   function() { Ajax.activeRequestCount++ }, -  onComplete: function() { Ajax.activeRequestCount-- } -}); -Ajax.Base = Class.create({ -  initialize: function(options) { -    this.options = { -      method:       'post', -      asynchronous: true, -      contentType:  'application/x-www-form-urlencoded', -      encoding:     'UTF-8', -      parameters:   '', -      evalJSON:     true, -      evalJS:       true -    }; -    Object.extend(this.options, options || { }); - -    this.options.method = this.options.method.toLowerCase(); - -    if (Object.isString(this.options.parameters)) -      this.options.parameters = this.options.parameters.toQueryParams(); -    else if (Object.isHash(this.options.parameters)) -      this.options.parameters = this.options.parameters.toObject(); -  } -}); -Ajax.Request = Class.create(Ajax.Base, { -  _complete: false, - -  initialize: function($super, url, options) { -    $super(options); -    this.transport = Ajax.getTransport(); -    this.request(url); -  }, - -  request: function(url) { -    this.url = url; -    this.method = this.options.method; -    var params = Object.clone(this.options.parameters); - -    if (!['get', 'post'].include(this.method)) { -      params['_method'] = this.method; -      this.method = 'post'; -    } - -    this.parameters = params; - -    if (params = Object.toQueryString(params)) { -      if (this.method == 'get') -        this.url += (this.url.include('?') ? '&' : '?') + params; -      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) -        params += '&_='; -    } - -    try { -      var response = new Ajax.Response(this); -      if (this.options.onCreate) this.options.onCreate(response); -      Ajax.Responders.dispatch('onCreate', this, response); - -      this.transport.open(this.method.toUpperCase(), this.url, -        this.options.asynchronous); - -      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); - -      this.transport.onreadystatechange = this.onStateChange.bind(this); -      this.setRequestHeaders(); - -      this.body = this.method == 'post' ? (this.options.postBody || params) : null; -      this.transport.send(this.body); - -      /* Force Firefox to handle ready state 4 for synchronous requests */ -      if (!this.options.asynchronous && this.transport.overrideMimeType) -        this.onStateChange(); - -    } -    catch (e) { -      this.dispatchException(e); -    } -  }, - -  onStateChange: function() { -    var readyState = this.transport.readyState; -    if (readyState > 1 && !((readyState == 4) && this._complete)) -      this.respondToReadyState(this.transport.readyState); -  }, - -  setRequestHeaders: function() { -    var headers = { -      'X-Requested-With': 'XMLHttpRequest', -      'X-Prototype-Version': Prototype.Version, -      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' -    }; - -    if (this.method == 'post') { -      headers['Content-type'] = this.options.contentType + -        (this.options.encoding ? '; charset=' + this.options.encoding : ''); - -      /* Force "Connection: close" for older Mozilla browsers to work -       * around a bug where XMLHttpRequest sends an incorrect -       * Content-length header. See Mozilla Bugzilla #246651. -       */ -      if (this.transport.overrideMimeType && -          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) -            headers['Connection'] = 'close'; -    } - -    if (typeof this.options.requestHeaders == 'object') { -      var extras = this.options.requestHeaders; - -      if (Object.isFunction(extras.push)) -        for (var i = 0, length = extras.length; i < length; i += 2) -          headers[extras[i]] = extras[i+1]; -      else -        $H(extras).each(function(pair) { headers[pair.key] = pair.value }); -    } - -    for (var name in headers) -      this.transport.setRequestHeader(name, headers[name]); -  }, - -  success: function() { -    var status = this.getStatus(); -    return !status || (status >= 200 && status < 300); -  }, - -  getStatus: function() { -    try { -      return this.transport.status || 0; -    } catch (e) { return 0 } -  }, - -  respondToReadyState: function(readyState) { -    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); - -    if (state == 'Complete') { -      try { -        this._complete = true; -        (this.options['on' + response.status] -         || this.options['on' + (this.success() ? 'Success' : 'Failure')] -         || Prototype.emptyFunction)(response, response.headerJSON); -      } catch (e) { -        this.dispatchException(e); -      } - -      var contentType = response.getHeader('Content-type'); -      if (this.options.evalJS == 'force' -          || (this.options.evalJS && this.isSameOrigin() && contentType -          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) -        this.evalResponse(); -    } - -    try { -      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); -      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); -    } catch (e) { -      this.dispatchException(e); -    } - -    if (state == 'Complete') { -      this.transport.onreadystatechange = Prototype.emptyFunction; -    } -  }, - -  isSameOrigin: function() { -    var m = this.url.match(/^\s*https?:\/\/[^\/]*/); -    return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ -      protocol: location.protocol, -      domain: document.domain, -      port: location.port ? ':' + location.port : '' -    })); -  }, - -  getHeader: function(name) { -    try { -      return this.transport.getResponseHeader(name) || null; -    } catch (e) { return null; } -  }, - -  evalResponse: function() { -    try { -      return eval((this.transport.responseText || '').unfilterJSON()); -    } catch (e) { -      this.dispatchException(e); -    } -  }, - -  dispatchException: function(exception) { -    (this.options.onException || Prototype.emptyFunction)(this, exception); -    Ajax.Responders.dispatch('onException', this, exception); -  } -}); - -Ajax.Request.Events = -  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - - - - - - - - -Ajax.Response = Class.create({ -  initialize: function(request){ -    this.request = request; -    var transport  = this.transport  = request.transport, -        readyState = this.readyState = transport.readyState; - -    if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { -      this.status       = this.getStatus(); -      this.statusText   = this.getStatusText(); -      this.responseText = String.interpret(transport.responseText); -      this.headerJSON   = this._getHeaderJSON(); -    } - -    if (readyState == 4) { -      var xml = transport.responseXML; -      this.responseXML  = Object.isUndefined(xml) ? null : xml; -      this.responseJSON = this._getResponseJSON(); -    } -  }, - -  status:      0, - -  statusText: '', - -  getStatus: Ajax.Request.prototype.getStatus, - -  getStatusText: function() { -    try { -      return this.transport.statusText || ''; -    } catch (e) { return '' } -  }, - -  getHeader: Ajax.Request.prototype.getHeader, - -  getAllHeaders: function() { -    try { -      return this.getAllResponseHeaders(); -    } catch (e) { return null } -  }, - -  getResponseHeader: function(name) { -    return this.transport.getResponseHeader(name); -  }, - -  getAllResponseHeaders: function() { -    return this.transport.getAllResponseHeaders(); -  }, - -  _getHeaderJSON: function() { -    var json = this.getHeader('X-JSON'); -    if (!json) return null; -    json = decodeURIComponent(escape(json)); -    try { -      return json.evalJSON(this.request.options.sanitizeJSON || -        !this.request.isSameOrigin()); -    } catch (e) { -      this.request.dispatchException(e); -    } -  }, - -  _getResponseJSON: function() { -    var options = this.request.options; -    if (!options.evalJSON || (options.evalJSON != 'force' && -      !(this.getHeader('Content-type') || '').include('application/json')) || -        this.responseText.blank()) -          return null; -    try { -      return this.responseText.evalJSON(options.sanitizeJSON || -        !this.request.isSameOrigin()); -    } catch (e) { -      this.request.dispatchException(e); -    } -  } -}); - -Ajax.Updater = Class.create(Ajax.Request, { -  initialize: function($super, container, url, options) { -    this.container = { -      success: (container.success || container), -      failure: (container.failure || (container.success ? null : container)) -    }; - -    options = Object.clone(options); -    var onComplete = options.onComplete; -    options.onComplete = (function(response, json) { -      this.updateContent(response.responseText); -      if (Object.isFunction(onComplete)) onComplete(response, json); -    }).bind(this); - -    $super(url, options); -  }, - -  updateContent: function(responseText) { -    var receiver = this.container[this.success() ? 'success' : 'failure'], -        options = this.options; - -    if (!options.evalScripts) responseText = responseText.stripScripts(); - -    if (receiver = $(receiver)) { -      if (options.insertion) { -        if (Object.isString(options.insertion)) { -          var insertion = { }; insertion[options.insertion] = responseText; -          receiver.insert(insertion); -        } -        else options.insertion(receiver, responseText); -      } -      else receiver.update(responseText); -    } -  } -}); - -Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { -  initialize: function($super, container, url, options) { -    $super(options); -    this.onComplete = this.options.onComplete; - -    this.frequency = (this.options.frequency || 2); -    this.decay = (this.options.decay || 1); - -    this.updater = { }; -    this.container = container; -    this.url = url; - -    this.start(); -  }, - -  start: function() { -    this.options.onComplete = this.updateComplete.bind(this); -    this.onTimerEvent(); -  }, - -  stop: function() { -    this.updater.options.onComplete = undefined; -    clearTimeout(this.timer); -    (this.onComplete || Prototype.emptyFunction).apply(this, arguments); -  }, - -  updateComplete: function(response) { -    if (this.options.decay) { -      this.decay = (response.responseText == this.lastText ? -        this.decay * this.options.decay : 1); - -      this.lastText = response.responseText; -    } -    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); -  }, - -  onTimerEvent: function() { -    this.updater = new Ajax.Updater(this.container, this.url, this.options); -  } -}); - - -function $(element) { -  if (arguments.length > 1) { -    for (var i = 0, elements = [], length = arguments.length; i < length; i++) -      elements.push($(arguments[i])); -    return elements; -  } -  if (Object.isString(element)) -    element = document.getElementById(element); -  return Element.extend(element); -} - -if (Prototype.BrowserFeatures.XPath) { -  document._getElementsByXPath = function(expression, parentElement) { -    var results = []; -    var query = document.evaluate(expression, $(parentElement) || document, -      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); -    for (var i = 0, length = query.snapshotLength; i < length; i++) -      results.push(Element.extend(query.snapshotItem(i))); -    return results; -  }; -} - -/*--------------------------------------------------------------------------*/ - -if (!Node) var Node = { }; - -if (!Node.ELEMENT_NODE) { -  Object.extend(Node, { -    ELEMENT_NODE: 1, -    ATTRIBUTE_NODE: 2, -    TEXT_NODE: 3, -    CDATA_SECTION_NODE: 4, -    ENTITY_REFERENCE_NODE: 5, -    ENTITY_NODE: 6, -    PROCESSING_INSTRUCTION_NODE: 7, -    COMMENT_NODE: 8, -    DOCUMENT_NODE: 9, -    DOCUMENT_TYPE_NODE: 10, -    DOCUMENT_FRAGMENT_NODE: 11, -    NOTATION_NODE: 12 -  }); -} - - - -(function(global) { - -  var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){ -    try { -      var el = document.createElement('<input name="x">'); -      return el.tagName.toLowerCase() === 'input' && el.name === 'x'; -    } -    catch(err) { -      return false; -    } -  })(); - -  var element = global.Element; - -  global.Element = function(tagName, attributes) { -    attributes = attributes || { }; -    tagName = tagName.toLowerCase(); -    var cache = Element.cache; -    if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) { -      tagName = '<' + tagName + ' name="' + attributes.name + '">'; -      delete attributes.name; -      return Element.writeAttribute(document.createElement(tagName), attributes); -    } -    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); -    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); -  }; - -  Object.extend(global.Element, element || { }); -  if (element) global.Element.prototype = element.prototype; - -})(this); - -Element.idCounter = 1; -Element.cache = { }; - -function purgeElement(element) { -  var uid = element._prototypeUID; -  if (uid) { -    Element.stopObserving(element); -    element._prototypeUID = void 0; -    delete Element.Storage[uid]; -  } -} - -Element.Methods = { -  visible: function(element) { -    return $(element).style.display != 'none'; -  }, - -  toggle: function(element) { -    element = $(element); -    Element[Element.visible(element) ? 'hide' : 'show'](element); -    return element; -  }, - -  hide: function(element) { -    element = $(element); -    element.style.display = 'none'; -    return element; -  }, - -  show: function(element) { -    element = $(element); -    element.style.display = ''; -    return element; -  }, - -  remove: function(element) { -    element = $(element); -    element.parentNode.removeChild(element); -    return element; -  }, - -  update: (function(){ - -    var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){ -      var el = document.createElement("select"), -          isBuggy = true; -      el.innerHTML = "<option value=\"test\">test</option>"; -      if (el.options && el.options[0]) { -        isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION"; -      } -      el = null; -      return isBuggy; -    })(); - -    var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){ -      try { -        var el = document.createElement("table"); -        if (el && el.tBodies) { -          el.innerHTML = "<tbody><tr><td>test</td></tr></tbody>"; -          var isBuggy = typeof el.tBodies[0] == "undefined"; -          el = null; -          return isBuggy; -        } -      } catch (e) { -        return true; -      } -    })(); - -    var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () { -      var s = document.createElement("script"), -          isBuggy = false; -      try { -        s.appendChild(document.createTextNode("")); -        isBuggy = !s.firstChild || -          s.firstChild && s.firstChild.nodeType !== 3; -      } catch (e) { -        isBuggy = true; -      } -      s = null; -      return isBuggy; -    })(); - -    function update(element, content) { -      element = $(element); - -      var descendants = element.getElementsByTagName('*'), -       i = descendants.length; -      while (i--) purgeElement(descendants[i]); - -      if (content && content.toElement) -        content = content.toElement(); - -      if (Object.isElement(content)) -        return element.update().insert(content); - -      content = Object.toHTML(content); - -      var tagName = element.tagName.toUpperCase(); - -      if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) { -        element.text = content; -        return element; -      } - -      if (SELECT_ELEMENT_INNERHTML_BUGGY || TABLE_ELEMENT_INNERHTML_BUGGY) { -        if (tagName in Element._insertionTranslations.tags) { -          while (element.firstChild) { -            element.removeChild(element.firstChild); -          } -          Element._getContentFromAnonymousElement(tagName, content.stripScripts()) -            .each(function(node) { -              element.appendChild(node) -            }); -        } -        else { -          element.innerHTML = content.stripScripts(); -        } -      } -      else { -        element.innerHTML = content.stripScripts(); -      } - -      content.evalScripts.bind(content).defer(); -      return element; -    } - -    return update; -  })(), - -  replace: function(element, content) { -    element = $(element); -    if (content && content.toElement) content = content.toElement(); -    else if (!Object.isElement(content)) { -      content = Object.toHTML(content); -      var range = element.ownerDocument.createRange(); -      range.selectNode(element); -      content.evalScripts.bind(content).defer(); -      content = range.createContextualFragment(content.stripScripts()); -    } -    element.parentNode.replaceChild(content, element); -    return element; -  }, - -  insert: function(element, insertions) { -    element = $(element); - -    if (Object.isString(insertions) || Object.isNumber(insertions) || -        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) -          insertions = {bottom:insertions}; - -    var content, insert, tagName, childNodes; - -    for (var position in insertions) { -      content  = insertions[position]; -      position = position.toLowerCase(); -      insert = Element._insertionTranslations[position]; - -      if (content && content.toElement) content = content.toElement(); -      if (Object.isElement(content)) { -        insert(element, content); -        continue; -      } - -      content = Object.toHTML(content); - -      tagName = ((position == 'before' || position == 'after') -        ? element.parentNode : element).tagName.toUpperCase(); - -      childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - -      if (position == 'top' || position == 'after') childNodes.reverse(); -      childNodes.each(insert.curry(element)); - -      content.evalScripts.bind(content).defer(); -    } - -    return element; -  }, - -  wrap: function(element, wrapper, attributes) { -    element = $(element); -    if (Object.isElement(wrapper)) -      $(wrapper).writeAttribute(attributes || { }); -    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); -    else wrapper = new Element('div', wrapper); -    if (element.parentNode) -      element.parentNode.replaceChild(wrapper, element); -    wrapper.appendChild(element); -    return wrapper; -  }, - -  inspect: function(element) { -    element = $(element); -    var result = '<' + element.tagName.toLowerCase(); -    $H({'id': 'id', 'className': 'class'}).each(function(pair) { -      var property = pair.first(), -          attribute = pair.last(), -          value = (element[property] || '').toString(); -      if (value) result += ' ' + attribute + '=' + value.inspect(true); -    }); -    return result + '>'; -  }, - -  recursivelyCollect: function(element, property, maximumLength) { -    element = $(element); -    maximumLength = maximumLength || -1; -    var elements = []; - -    while (element = element[property]) { -      if (element.nodeType == 1) -        elements.push(Element.extend(element)); -      if (elements.length == maximumLength) -        break; -    } - -    return elements; -  }, - -  ancestors: function(element) { -    return Element.recursivelyCollect(element, 'parentNode'); -  }, - -  descendants: function(element) { -    return Element.select(element, "*"); -  }, - -  firstDescendant: function(element) { -    element = $(element).firstChild; -    while (element && element.nodeType != 1) element = element.nextSibling; -    return $(element); -  }, - -  immediateDescendants: function(element) { -    var results = [], child = $(element).firstChild; -    while (child) { -      if (child.nodeType === 1) { -        results.push(Element.extend(child)); -      } -      child = child.nextSibling; -    } -    return results; -  }, - -  previousSiblings: function(element, maximumLength) { -    return Element.recursivelyCollect(element, 'previousSibling'); -  }, - -  nextSiblings: function(element) { -    return Element.recursivelyCollect(element, 'nextSibling'); -  }, - -  siblings: function(element) { -    element = $(element); -    return Element.previousSiblings(element).reverse() -      .concat(Element.nextSiblings(element)); -  }, - -  match: function(element, selector) { -    element = $(element); -    if (Object.isString(selector)) -      return Prototype.Selector.match(element, selector); -    return selector.match(element); -  }, - -  up: function(element, expression, index) { -    element = $(element); -    if (arguments.length == 1) return $(element.parentNode); -    var ancestors = Element.ancestors(element); -    return Object.isNumber(expression) ? ancestors[expression] : -      Prototype.Selector.find(ancestors, expression, index); -  }, - -  down: function(element, expression, index) { -    element = $(element); -    if (arguments.length == 1) return Element.firstDescendant(element); -    return Object.isNumber(expression) ? Element.descendants(element)[expression] : -      Element.select(element, expression)[index || 0]; -  }, - -  previous: function(element, expression, index) { -    element = $(element); -    if (Object.isNumber(expression)) index = expression, expression = false; -    if (!Object.isNumber(index)) index = 0; - -    if (expression) { -      return Prototype.Selector.find(element.previousSiblings(), expression, index); -    } else { -      return element.recursivelyCollect("previousSibling", index + 1)[index]; -    } -  }, - -  next: function(element, expression, index) { -    element = $(element); -    if (Object.isNumber(expression)) index = expression, expression = false; -    if (!Object.isNumber(index)) index = 0; - -    if (expression) { -      return Prototype.Selector.find(element.nextSiblings(), expression, index); -    } else { -      var maximumLength = Object.isNumber(index) ? index + 1 : 1; -      return element.recursivelyCollect("nextSibling", index + 1)[index]; -    } -  }, - - -  select: function(element) { -    element = $(element); -    var expressions = Array.prototype.slice.call(arguments, 1).join(', '); -    return Prototype.Selector.select(expressions, element); -  }, - -  adjacent: function(element) { -    element = $(element); -    var expressions = Array.prototype.slice.call(arguments, 1).join(', '); -    return Prototype.Selector.select(expressions, element.parentNode).without(element); -  }, - -  identify: function(element) { -    element = $(element); -    var id = Element.readAttribute(element, 'id'); -    if (id) return id; -    do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id)); -    Element.writeAttribute(element, 'id', id); -    return id; -  }, - -  readAttribute: function(element, name) { -    element = $(element); -    if (Prototype.Browser.IE) { -      var t = Element._attributeTranslations.read; -      if (t.values[name]) return t.values[name](element, name); -      if (t.names[name]) name = t.names[name]; -      if (name.include(':')) { -        return (!element.attributes || !element.attributes[name]) ? null : -         element.attributes[name].value; -      } -    } -    return element.getAttribute(name); -  }, - -  writeAttribute: function(element, name, value) { -    element = $(element); -    var attributes = { }, t = Element._attributeTranslations.write; - -    if (typeof name == 'object') attributes = name; -    else attributes[name] = Object.isUndefined(value) ? true : value; - -    for (var attr in attributes) { -      name = t.names[attr] || attr; -      value = attributes[attr]; -      if (t.values[attr]) name = t.values[attr](element, value); -      if (value === false || value === null) -        element.removeAttribute(name); -      else if (value === true) -        element.setAttribute(name, name); -      else element.setAttribute(name, value); -    } -    return element; -  }, - -  getHeight: function(element) { -    return Element.getDimensions(element).height; -  }, - -  getWidth: function(element) { -    return Element.getDimensions(element).width; -  }, - -  classNames: function(element) { -    return new Element.ClassNames(element); -  }, - -  hasClassName: function(element, className) { -    if (!(element = $(element))) return; -    var elementClassName = element.className; -    return (elementClassName.length > 0 && (elementClassName == className || -      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); -  }, - -  addClassName: function(element, className) { -    if (!(element = $(element))) return; -    if (!Element.hasClassName(element, className)) -      element.className += (element.className ? ' ' : '') + className; -    return element; -  }, - -  removeClassName: function(element, className) { -    if (!(element = $(element))) return; -    element.className = element.className.replace( -      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); -    return element; -  }, - -  toggleClassName: function(element, className) { -    if (!(element = $(element))) return; -    return Element[Element.hasClassName(element, className) ? -      'removeClassName' : 'addClassName'](element, className); -  }, - -  cleanWhitespace: function(element) { -    element = $(element); -    var node = element.firstChild; -    while (node) { -      var nextNode = node.nextSibling; -      if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) -        element.removeChild(node); -      node = nextNode; -    } -    return element; -  }, - -  empty: function(element) { -    return $(element).innerHTML.blank(); -  }, - -  descendantOf: function(element, ancestor) { -    element = $(element), ancestor = $(ancestor); - -    if (element.compareDocumentPosition) -      return (element.compareDocumentPosition(ancestor) & 8) === 8; - -    if (ancestor.contains) -      return ancestor.contains(element) && ancestor !== element; - -    while (element = element.parentNode) -      if (element == ancestor) return true; - -    return false; -  }, - -  scrollTo: function(element) { -    element = $(element); -    var pos = Element.cumulativeOffset(element); -    window.scrollTo(pos[0], pos[1]); -    return element; -  }, - -  getStyle: function(element, style) { -    element = $(element); -    style = style == 'float' ? 'cssFloat' : style.camelize(); -    var value = element.style[style]; -    if (!value || value == 'auto') { -      var css = document.defaultView.getComputedStyle(element, null); -      value = css ? css[style] : null; -    } -    if (style == 'opacity') return value ? parseFloat(value) : 1.0; -    return value == 'auto' ? null : value; -  }, - -  getOpacity: function(element) { -    return $(element).getStyle('opacity'); -  }, - -  setStyle: function(element, styles) { -    element = $(element); -    var elementStyle = element.style, match; -    if (Object.isString(styles)) { -      element.style.cssText += ';' + styles; -      return styles.include('opacity') ? -        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; -    } -    for (var property in styles) -      if (property == 'opacity') element.setOpacity(styles[property]); -      else -        elementStyle[(property == 'float' || property == 'cssFloat') ? -          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : -            property] = styles[property]; - -    return element; -  }, - -  setOpacity: function(element, value) { -    element = $(element); -    element.style.opacity = (value == 1 || value === '') ? '' : -      (value < 0.00001) ? 0 : value; -    return element; -  }, - -  makePositioned: function(element) { -    element = $(element); -    var pos = Element.getStyle(element, 'position'); -    if (pos == 'static' || !pos) { -      element._madePositioned = true; -      element.style.position = 'relative'; -      if (Prototype.Browser.Opera) { -        element.style.top = 0; -        element.style.left = 0; -      } -    } -    return element; -  }, - -  undoPositioned: function(element) { -    element = $(element); -    if (element._madePositioned) { -      element._madePositioned = undefined; -      element.style.position = -        element.style.top = -        element.style.left = -        element.style.bottom = -        element.style.right = ''; -    } -    return element; -  }, - -  makeClipping: function(element) { -    element = $(element); -    if (element._overflow) return element; -    element._overflow = Element.getStyle(element, 'overflow') || 'auto'; -    if (element._overflow !== 'hidden') -      element.style.overflow = 'hidden'; -    return element; -  }, - -  undoClipping: function(element) { -    element = $(element); -    if (!element._overflow) return element; -    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; -    element._overflow = null; -    return element; -  }, - -  cumulativeOffset: function(element) { -    var valueT = 0, valueL = 0; -    if (element.parentNode) { -      do { -        valueT += element.offsetTop  || 0; -        valueL += element.offsetLeft || 0; -        element = element.offsetParent; -      } while (element); -    } -    return Element._returnOffset(valueL, valueT); -  }, - -  positionedOffset: function(element) { -    var valueT = 0, valueL = 0; -    do { -      valueT += element.offsetTop  || 0; -      valueL += element.offsetLeft || 0; -      element = element.offsetParent; -      if (element) { -        if (element.tagName.toUpperCase() == 'BODY') break; -        var p = Element.getStyle(element, 'position'); -        if (p !== 'static') break; -      } -    } while (element); -    return Element._returnOffset(valueL, valueT); -  }, - -  absolutize: function(element) { -    element = $(element); -    if (Element.getStyle(element, 'position') == 'absolute') return element; - -    var offsets = Element.positionedOffset(element), -        top     = offsets[1], -        left    = offsets[0], -        width   = element.clientWidth, -        height  = element.clientHeight; - -    element._originalLeft   = left - parseFloat(element.style.left  || 0); -    element._originalTop    = top  - parseFloat(element.style.top || 0); -    element._originalWidth  = element.style.width; -    element._originalHeight = element.style.height; - -    element.style.position = 'absolute'; -    element.style.top    = top + 'px'; -    element.style.left   = left + 'px'; -    element.style.width  = width + 'px'; -    element.style.height = height + 'px'; -    return element; -  }, - -  relativize: function(element) { -    element = $(element); -    if (Element.getStyle(element, 'position') == 'relative') return element; - -    element.style.position = 'relative'; -    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0), -        left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - -    element.style.top    = top + 'px'; -    element.style.left   = left + 'px'; -    element.style.height = element._originalHeight; -    element.style.width  = element._originalWidth; -    return element; -  }, - -  cumulativeScrollOffset: function(element) { -    var valueT = 0, valueL = 0; -    do { -      valueT += element.scrollTop  || 0; -      valueL += element.scrollLeft || 0; -      element = element.parentNode; -    } while (element); -    return Element._returnOffset(valueL, valueT); -  }, - -  getOffsetParent: function(element) { -    if (element.offsetParent) return $(element.offsetParent); -    if (element == document.body) return $(element); - -    while ((element = element.parentNode) && element != document.body) -      if (Element.getStyle(element, 'position') != 'static') -        return $(element); - -    return $(document.body); -  }, - -  viewportOffset: function(forElement) { -    var valueT = 0, -        valueL = 0, -        element = forElement; - -    do { -      valueT += element.offsetTop  || 0; -      valueL += element.offsetLeft || 0; - -      if (element.offsetParent == document.body && -        Element.getStyle(element, 'position') == 'absolute') break; - -    } while (element = element.offsetParent); - -    element = forElement; -    do { -      if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) { -        valueT -= element.scrollTop  || 0; -        valueL -= element.scrollLeft || 0; -      } -    } while (element = element.parentNode); - -    return Element._returnOffset(valueL, valueT); -  }, - -  clonePosition: function(element, source) { -    var options = Object.extend({ -      setLeft:    true, -      setTop:     true, -      setWidth:   true, -      setHeight:  true, -      offsetTop:  0, -      offsetLeft: 0 -    }, arguments[2] || { }); - -    source = $(source); -    var p = Element.viewportOffset(source), delta = [0, 0], parent = null; - -    element = $(element); - -    if (Element.getStyle(element, 'position') == 'absolute') { -      parent = Element.getOffsetParent(element); -      delta = Element.viewportOffset(parent); -    } - -    if (parent == document.body) { -      delta[0] -= document.body.offsetLeft; -      delta[1] -= document.body.offsetTop; -    } - -    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px'; -    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px'; -    if (options.setWidth)  element.style.width = source.offsetWidth + 'px'; -    if (options.setHeight) element.style.height = source.offsetHeight + 'px'; -    return element; -  } -}; - -Object.extend(Element.Methods, { -  getElementsBySelector: Element.Methods.select, - -  childElements: Element.Methods.immediateDescendants -}); - -Element._attributeTranslations = { -  write: { -    names: { -      className: 'class', -      htmlFor:   'for' -    }, -    values: { } -  } -}; - -if (Prototype.Browser.Opera) { -  Element.Methods.getStyle = Element.Methods.getStyle.wrap( -    function(proceed, element, style) { -      switch (style) { -        case 'left': case 'top': case 'right': case 'bottom': -          if (proceed(element, 'position') === 'static') return null; -        case 'height': case 'width': -          if (!Element.visible(element)) return null; - -          var dim = parseInt(proceed(element, style), 10); - -          if (dim !== element['offset' + style.capitalize()]) -            return dim + 'px'; - -          var properties; -          if (style === 'height') { -            properties = ['border-top-width', 'padding-top', -             'padding-bottom', 'border-bottom-width']; -          } -          else { -            properties = ['border-left-width', 'padding-left', -             'padding-right', 'border-right-width']; -          } -          return properties.inject(dim, function(memo, property) { -            var val = proceed(element, property); -            return val === null ? memo : memo - parseInt(val, 10); -          }) + 'px'; -        default: return proceed(element, style); -      } -    } -  ); - -  Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( -    function(proceed, element, attribute) { -      if (attribute === 'title') return element.title; -      return proceed(element, attribute); -    } -  ); -} - -else if (Prototype.Browser.IE) { -  Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( -    function(proceed, element) { -      element = $(element); -      if (!element.parentNode) return $(document.body); -      var position = element.getStyle('position'); -      if (position !== 'static') return proceed(element); -      element.setStyle({ position: 'relative' }); -      var value = proceed(element); -      element.setStyle({ position: position }); -      return value; -    } -  ); - -  $w('positionedOffset viewportOffset').each(function(method) { -    Element.Methods[method] = Element.Methods[method].wrap( -      function(proceed, element) { -        element = $(element); -        if (!element.parentNode) return Element._returnOffset(0, 0); -        var position = element.getStyle('position'); -        if (position !== 'static') return proceed(element); -        var offsetParent = element.getOffsetParent(); -        if (offsetParent && offsetParent.getStyle('position') === 'fixed') -          offsetParent.setStyle({ zoom: 1 }); -        element.setStyle({ position: 'relative' }); -        var value = proceed(element); -        element.setStyle({ position: position }); -        return value; -      } -    ); -  }); - -  Element.Methods.getStyle = function(element, style) { -    element = $(element); -    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); -    var value = element.style[style]; -    if (!value && element.currentStyle) value = element.currentStyle[style]; - -    if (style == 'opacity') { -      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) -        if (value[1]) return parseFloat(value[1]) / 100; -      return 1.0; -    } - -    if (value == 'auto') { -      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) -        return element['offset' + style.capitalize()] + 'px'; -      return null; -    } -    return value; -  }; - -  Element.Methods.setOpacity = function(element, value) { -    function stripAlpha(filter){ -      return filter.replace(/alpha\([^\)]*\)/gi,''); -    } -    element = $(element); -    var currentStyle = element.currentStyle; -    if ((currentStyle && !currentStyle.hasLayout) || -      (!currentStyle && element.style.zoom == 'normal')) -        element.style.zoom = 1; - -    var filter = element.getStyle('filter'), style = element.style; -    if (value == 1 || value === '') { -      (filter = stripAlpha(filter)) ? -        style.filter = filter : style.removeAttribute('filter'); -      return element; -    } else if (value < 0.00001) value = 0; -    style.filter = stripAlpha(filter) + -      'alpha(opacity=' + (value * 100) + ')'; -    return element; -  }; - -  Element._attributeTranslations = (function(){ - -    var classProp = 'className', -        forProp = 'for', -        el = document.createElement('div'); - -    el.setAttribute(classProp, 'x'); - -    if (el.className !== 'x') { -      el.setAttribute('class', 'x'); -      if (el.className === 'x') { -        classProp = 'class'; -      } -    } -    el = null; - -    el = document.createElement('label'); -    el.setAttribute(forProp, 'x'); -    if (el.htmlFor !== 'x') { -      el.setAttribute('htmlFor', 'x'); -      if (el.htmlFor === 'x') { -        forProp = 'htmlFor'; -      } -    } -    el = null; - -    return { -      read: { -        names: { -          'class':      classProp, -          'className':  classProp, -          'for':        forProp, -          'htmlFor':    forProp -        }, -        values: { -          _getAttr: function(element, attribute) { -            return element.getAttribute(attribute); -          }, -          _getAttr2: function(element, attribute) { -            return element.getAttribute(attribute, 2); -          }, -          _getAttrNode: function(element, attribute) { -            var node = element.getAttributeNode(attribute); -            return node ? node.value : ""; -          }, -          _getEv: (function(){ - -            var el = document.createElement('div'), f; -            el.onclick = Prototype.emptyFunction; -            var value = el.getAttribute('onclick'); - -            if (String(value).indexOf('{') > -1) { -              f = function(element, attribute) { -                attribute = element.getAttribute(attribute); -                if (!attribute) return null; -                attribute = attribute.toString(); -                attribute = attribute.split('{')[1]; -                attribute = attribute.split('}')[0]; -                return attribute.strip(); -              }; -            } -            else if (value === '') { -              f = function(element, attribute) { -                attribute = element.getAttribute(attribute); -                if (!attribute) return null; -                return attribute.strip(); -              }; -            } -            el = null; -            return f; -          })(), -          _flag: function(element, attribute) { -            return $(element).hasAttribute(attribute) ? attribute : null; -          }, -          style: function(element) { -            return element.style.cssText.toLowerCase(); -          }, -          title: function(element) { -            return element.title; -          } -        } -      } -    } -  })(); - -  Element._attributeTranslations.write = { -    names: Object.extend({ -      cellpadding: 'cellPadding', -      cellspacing: 'cellSpacing' -    }, Element._attributeTranslations.read.names), -    values: { -      checked: function(element, value) { -        element.checked = !!value; -      }, - -      style: function(element, value) { -        element.style.cssText = value ? value : ''; -      } -    } -  }; - -  Element._attributeTranslations.has = {}; - -  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + -      'encType maxLength readOnly longDesc frameBorder').each(function(attr) { -    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; -    Element._attributeTranslations.has[attr.toLowerCase()] = attr; -  }); - -  (function(v) { -    Object.extend(v, { -      href:        v._getAttr2, -      src:         v._getAttr2, -      type:        v._getAttr, -      action:      v._getAttrNode, -      disabled:    v._flag, -      checked:     v._flag, -      readonly:    v._flag, -      multiple:    v._flag, -      onload:      v._getEv, -      onunload:    v._getEv, -      onclick:     v._getEv, -      ondblclick:  v._getEv, -      onmousedown: v._getEv, -      onmouseup:   v._getEv, -      onmouseover: v._getEv, -      onmousemove: v._getEv, -      onmouseout:  v._getEv, -      onfocus:     v._getEv, -      onblur:      v._getEv, -      onkeypress:  v._getEv, -      onkeydown:   v._getEv, -      onkeyup:     v._getEv, -      onsubmit:    v._getEv, -      onreset:     v._getEv, -      onselect:    v._getEv, -      onchange:    v._getEv -    }); -  })(Element._attributeTranslations.read.values); - -  if (Prototype.BrowserFeatures.ElementExtensions) { -    (function() { -      function _descendants(element) { -        var nodes = element.getElementsByTagName('*'), results = []; -        for (var i = 0, node; node = nodes[i]; i++) -          if (node.tagName !== "!") // Filter out comment nodes. -            results.push(node); -        return results; -      } - -      Element.Methods.down = function(element, expression, index) { -        element = $(element); -        if (arguments.length == 1) return element.firstDescendant(); -        return Object.isNumber(expression) ? _descendants(element)[expression] : -          Element.select(element, expression)[index || 0]; -      } -    })(); -  } - -} - -else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { -  Element.Methods.setOpacity = function(element, value) { -    element = $(element); -    element.style.opacity = (value == 1) ? 0.999999 : -      (value === '') ? '' : (value < 0.00001) ? 0 : value; -    return element; -  }; -} - -else if (Prototype.Browser.WebKit) { -  Element.Methods.setOpacity = function(element, value) { -    element = $(element); -    element.style.opacity = (value == 1 || value === '') ? '' : -      (value < 0.00001) ? 0 : value; - -    if (value == 1) -      if (element.tagName.toUpperCase() == 'IMG' && element.width) { -        element.width++; element.width--; -      } else try { -        var n = document.createTextNode(' '); -        element.appendChild(n); -        element.removeChild(n); -      } catch (e) { } - -    return element; -  }; - -  Element.Methods.cumulativeOffset = function(element) { -    var valueT = 0, valueL = 0; -    do { -      valueT += element.offsetTop  || 0; -      valueL += element.offsetLeft || 0; -      if (element.offsetParent == document.body) -        if (Element.getStyle(element, 'position') == 'absolute') break; - -      element = element.offsetParent; -    } while (element); - -    return Element._returnOffset(valueL, valueT); -  }; -} - -if ('outerHTML' in document.documentElement) { -  Element.Methods.replace = function(element, content) { -    element = $(element); - -    if (content && content.toElement) content = content.toElement(); -    if (Object.isElement(content)) { -      element.parentNode.replaceChild(content, element); -      return element; -    } - -    content = Object.toHTML(content); -    var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); - -    if (Element._insertionTranslations.tags[tagName]) { -      var nextSibling = element.next(), -          fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); -      parent.removeChild(element); -      if (nextSibling) -        fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); -      else -        fragments.each(function(node) { parent.appendChild(node) }); -    } -    else element.outerHTML = content.stripScripts(); - -    content.evalScripts.bind(content).defer(); -    return element; -  }; -} - -Element._returnOffset = function(l, t) { -  var result = [l, t]; -  result.left = l; -  result.top = t; -  return result; -}; - -Element._getContentFromAnonymousElement = function(tagName, html) { -  var div = new Element('div'), -      t = Element._insertionTranslations.tags[tagName]; -  if (t) { -    div.innerHTML = t[0] + html + t[1]; -    for (var i = t[2]; i--; ) { -      div = div.firstChild; -    } -  } -  else { -    div.innerHTML = html; -  } -  return $A(div.childNodes); -}; - -Element._insertionTranslations = { -  before: function(element, node) { -    element.parentNode.insertBefore(node, element); -  }, -  top: function(element, node) { -    element.insertBefore(node, element.firstChild); -  }, -  bottom: function(element, node) { -    element.appendChild(node); -  }, -  after: function(element, node) { -    element.parentNode.insertBefore(node, element.nextSibling); -  }, -  tags: { -    TABLE:  ['<table>',                '</table>',                   1], -    TBODY:  ['<table><tbody>',         '</tbody></table>',           2], -    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3], -    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4], -    SELECT: ['<select>',               '</select>',                  1] -  } -}; - -(function() { -  var tags = Element._insertionTranslations.tags; -  Object.extend(tags, { -    THEAD: tags.TBODY, -    TFOOT: tags.TBODY, -    TH:    tags.TD -  }); -})(); - -Element.Methods.Simulated = { -  hasAttribute: function(element, attribute) { -    attribute = Element._attributeTranslations.has[attribute] || attribute; -    var node = $(element).getAttributeNode(attribute); -    return !!(node && node.specified); -  } -}; - -Element.Methods.ByTag = { }; - -Object.extend(Element, Element.Methods); - -(function(div) { - -  if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) { -    window.HTMLElement = { }; -    window.HTMLElement.prototype = div['__proto__']; -    Prototype.BrowserFeatures.ElementExtensions = true; -  } - -  div = null; - -})(document.createElement('div')); - -Element.extend = (function() { - -  function checkDeficiency(tagName) { -    if (typeof window.Element != 'undefined') { -      var proto = window.Element.prototype; -      if (proto) { -        var id = '_' + (Math.random()+'').slice(2), -            el = document.createElement(tagName); -        proto[id] = 'x'; -        var isBuggy = (el[id] !== 'x'); -        delete proto[id]; -        el = null; -        return isBuggy; -      } -    } -    return false; -  } - -  function extendElementWith(element, methods) { -    for (var property in methods) { -      var value = methods[property]; -      if (Object.isFunction(value) && !(property in element)) -        element[property] = value.methodize(); -    } -  } - -  var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object'); - -  if (Prototype.BrowserFeatures.SpecificElementExtensions) { -    if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) { -      return function(element) { -        if (element && typeof element._extendedByPrototype == 'undefined') { -          var t = element.tagName; -          if (t && (/^(?:object|applet|embed)$/i.test(t))) { -            extendElementWith(element, Element.Methods); -            extendElementWith(element, Element.Methods.Simulated); -            extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]); -          } -        } -        return element; -      } -    } -    return Prototype.K; -  } - -  var Methods = { }, ByTag = Element.Methods.ByTag; - -  var extend = Object.extend(function(element) { -    if (!element || typeof element._extendedByPrototype != 'undefined' || -        element.nodeType != 1 || element == window) return element; - -    var methods = Object.clone(Methods), -        tagName = element.tagName.toUpperCase(); - -    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); - -    extendElementWith(element, methods); - -    element._extendedByPrototype = Prototype.emptyFunction; -    return element; - -  }, { -    refresh: function() { -      if (!Prototype.BrowserFeatures.ElementExtensions) { -        Object.extend(Methods, Element.Methods); -        Object.extend(Methods, Element.Methods.Simulated); -      } -    } -  }); - -  extend.refresh(); -  return extend; -})(); - -if (document.documentElement.hasAttribute) { -  Element.hasAttribute = function(element, attribute) { -    return element.hasAttribute(attribute); -  }; -} -else { -  Element.hasAttribute = Element.Methods.Simulated.hasAttribute; -} - -Element.addMethods = function(methods) { -  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; - -  if (!methods) { -    Object.extend(Form, Form.Methods); -    Object.extend(Form.Element, Form.Element.Methods); -    Object.extend(Element.Methods.ByTag, { -      "FORM":     Object.clone(Form.Methods), -      "INPUT":    Object.clone(Form.Element.Methods), -      "SELECT":   Object.clone(Form.Element.Methods), -      "TEXTAREA": Object.clone(Form.Element.Methods) -    }); -  } - -  if (arguments.length == 2) { -    var tagName = methods; -    methods = arguments[1]; -  } - -  if (!tagName) Object.extend(Element.Methods, methods || { }); -  else { -    if (Object.isArray(tagName)) tagName.each(extend); -    else extend(tagName); -  } - -  function extend(tagName) { -    tagName = tagName.toUpperCase(); -    if (!Element.Methods.ByTag[tagName]) -      Element.Methods.ByTag[tagName] = { }; -    Object.extend(Element.Methods.ByTag[tagName], methods); -  } - -  function copy(methods, destination, onlyIfAbsent) { -    onlyIfAbsent = onlyIfAbsent || false; -    for (var property in methods) { -      var value = methods[property]; -      if (!Object.isFunction(value)) continue; -      if (!onlyIfAbsent || !(property in destination)) -        destination[property] = value.methodize(); -    } -  } - -  function findDOMClass(tagName) { -    var klass; -    var trans = { -      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", -      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", -      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", -      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", -      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": -      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": -      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": -      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": -      "FrameSet", "IFRAME": "IFrame" -    }; -    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; -    if (window[klass]) return window[klass]; -    klass = 'HTML' + tagName + 'Element'; -    if (window[klass]) return window[klass]; -    klass = 'HTML' + tagName.capitalize() + 'Element'; -    if (window[klass]) return window[klass]; - -    var element = document.createElement(tagName), -        proto = element['__proto__'] || element.constructor.prototype; - -    element = null; -    return proto; -  } - -  var elementPrototype = window.HTMLElement ? HTMLElement.prototype : -   Element.prototype; - -  if (F.ElementExtensions) { -    copy(Element.Methods, elementPrototype); -    copy(Element.Methods.Simulated, elementPrototype, true); -  } - -  if (F.SpecificElementExtensions) { -    for (var tag in Element.Methods.ByTag) { -      var klass = findDOMClass(tag); -      if (Object.isUndefined(klass)) continue; -      copy(T[tag], klass.prototype); -    } -  } - -  Object.extend(Element, Element.Methods); -  delete Element.ByTag; - -  if (Element.extend.refresh) Element.extend.refresh(); -  Element.cache = { }; -}; - - -document.viewport = { - -  getDimensions: function() { -    return { width: this.getWidth(), height: this.getHeight() }; -  }, - -  getScrollOffsets: function() { -    return Element._returnOffset( -      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, -      window.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop); -  } -}; - -(function(viewport) { -  var B = Prototype.Browser, doc = document, element, property = {}; - -  function getRootElement() { -    if (B.WebKit && !doc.evaluate) -      return document; - -    if (B.Opera && window.parseFloat(window.opera.version()) < 9.5) -      return document.body; - -    return document.documentElement; -  } - -  function define(D) { -    if (!element) element = getRootElement(); - -    property[D] = 'client' + D; - -    viewport['get' + D] = function() { return element[property[D]] }; -    return viewport['get' + D](); -  } - -  viewport.getWidth  = define.curry('Width'); - -  viewport.getHeight = define.curry('Height'); -})(document.viewport); - - -Element.Storage = { -  UID: 1 -}; - -Element.addMethods({ -  getStorage: function(element) { -    if (!(element = $(element))) return; - -    var uid; -    if (element === window) { -      uid = 0; -    } else { -      if (typeof element._prototypeUID === "undefined") -        element._prototypeUID = Element.Storage.UID++; -      uid = element._prototypeUID; -    } - -    if (!Element.Storage[uid]) -      Element.Storage[uid] = $H(); - -    return Element.Storage[uid]; -  }, - -  store: function(element, key, value) { -    if (!(element = $(element))) return; - -    if (arguments.length === 2) { -      Element.getStorage(element).update(key); -    } else { -      Element.getStorage(element).set(key, value); -    } - -    return element; -  }, - -  retrieve: function(element, key, defaultValue) { -    if (!(element = $(element))) return; -    var hash = Element.getStorage(element), value = hash.get(key); - -    if (Object.isUndefined(value)) { -      hash.set(key, defaultValue); -      value = defaultValue; -    } - -    return value; -  }, - -  clone: function(element, deep) { -    if (!(element = $(element))) return; -    var clone = element.cloneNode(deep); -    clone._prototypeUID = void 0; -    if (deep) { -      var descendants = Element.select(clone, '*'), -          i = descendants.length; -      while (i--) { -        descendants[i]._prototypeUID = void 0; -      } -    } -    return Element.extend(clone); -  }, - -  purge: function(element) { -    if (!(element = $(element))) return; -    purgeElement(element); - -    var descendants = element.getElementsByTagName('*'), -     i = descendants.length; - -    while (i--) purgeElement(descendants[i]); - -    return null; -  } -}); - -(function() { - -  function toDecimal(pctString) { -    var match = pctString.match(/^(\d+)%?$/i); -    if (!match) return null; -    return (Number(match[1]) / 100); -  } - -  function getPixelValue(value, property) { -    if (Object.isElement(value)) { -      element = value; -      value = element.getStyle(property); -    } -    if (value === null) { -      return null; -    } - -    if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) { -      return window.parseFloat(value); -    } - -    if (/\d/.test(value) && element.runtimeStyle) { -      var style = element.style.left, rStyle = element.runtimeStyle.left; -      element.runtimeStyle.left = element.currentStyle.left; -      element.style.left = value || 0; -      value = element.style.pixelLeft; -      element.style.left = style; -      element.runtimeStyle.left = rStyle; - -      return value; -    } - -    if (value.include('%')) { -      var decimal = toDecimal(value); -      var whole; -      if (property.include('left') || property.include('right') || -       property.include('width')) { -        whole = $(element.parentNode).measure('width'); -      } else if (property.include('top') || property.include('bottom') || -       property.include('height')) { -        whole = $(element.parentNode).measure('height'); -      } - -      return whole * decimal; -    } - -    return 0; -  } - -  function toCSSPixels(number) { -    if (Object.isString(number) && number.endsWith('px')) { -      return number; -    } -    return number + 'px'; -  } - -  function isDisplayed(element) { -    var originalElement = element; -    while (element && element.parentNode) { -      var display = element.getStyle('display'); -      if (display === 'none') { -        return false; -      } -      element = $(element.parentNode); -    } -    return true; -  } - -  var hasLayout = Prototype.K; -  if ('currentStyle' in document.documentElement) { -    hasLayout = function(element) { -      if (!element.currentStyle.hasLayout) { -        element.style.zoom = 1; -      } -      return element; -    }; -  } - -  function cssNameFor(key) { -    if (key.include('border')) key = key + '-width'; -    return key.camelize(); -  } - -  Element.Layout = Class.create(Hash, { -    initialize: function($super, element, preCompute) { -      $super(); -      this.element = $(element); - -      Element.Layout.PROPERTIES.each( function(property) { -        this._set(property, null); -      }, this); - -      if (preCompute) { -        this._preComputing = true; -        this._begin(); -        Element.Layout.PROPERTIES.each( this._compute, this ); -        this._end(); -        this._preComputing = false; -      } -    }, - -    _set: function(property, value) { -      return Hash.prototype.set.call(this, property, value); -    }, - -    set: function(property, value) { -      throw "Properties of Element.Layout are read-only."; -    }, - -    get: function($super, property) { -      var value = $super(property); -      return value === null ? this._compute(property) : value; -    }, - -    _begin: function() { -      if (this._prepared) return; - -      var element = this.element; -      if (isDisplayed(element)) { -        this._prepared = true; -        return; -      } - -      var originalStyles = { -        position:   element.style.position   || '', -        width:      element.style.width      || '', -        visibility: element.style.visibility || '', -        display:    element.style.display    || '' -      }; - -      element.store('prototype_original_styles', originalStyles); - -      var position = element.getStyle('position'), -       width = element.getStyle('width'); - -      element.setStyle({ -        position:   'absolute', -        visibility: 'hidden', -        display:    'block' -      }); - -      var positionedWidth = element.getStyle('width'); - -      var newWidth; -      if (width && (positionedWidth === width)) { -        newWidth = getPixelValue(width); -      } else if (width && (position === 'absolute' || position === 'fixed')) { -        newWidth = getPixelValue(width); -      } else { -        var parent = element.parentNode, pLayout = $(parent).getLayout(); - -        newWidth = pLayout.get('width') - -         this.get('margin-left') - -         this.get('border-left') - -         this.get('padding-left') - -         this.get('padding-right') - -         this.get('border-right') - -         this.get('margin-right'); -      } - -      element.setStyle({ width: newWidth + 'px' }); - -      this._prepared = true; -    }, - -    _end: function() { -      var element = this.element; -      var originalStyles = element.retrieve('prototype_original_styles'); -      element.store('prototype_original_styles', null); -      element.setStyle(originalStyles); -      this._prepared = false; -    }, - -    _compute: function(property) { -      var COMPUTATIONS = Element.Layout.COMPUTATIONS; -      if (!(property in COMPUTATIONS)) { -        throw "Property not found."; -      } -      return this._set(property, COMPUTATIONS[property].call(this, this.element)); -    }, - -    toObject: function() { -      var args = $A(arguments); -      var keys = (args.length === 0) ? Element.Layout.PROPERTIES : -       args.join(' ').split(' '); -      var obj = {}; -      keys.each( function(key) { -        if (!Element.Layout.PROPERTIES.include(key)) return; -        var value = this.get(key); -        if (value != null) obj[key] = value; -      }, this); -      return obj; -    }, - -    toHash: function() { -      var obj = this.toObject.apply(this, arguments); -      return new Hash(obj); -    }, - -    toCSS: function() { -      var args = $A(arguments); -      var keys = (args.length === 0) ? Element.Layout.PROPERTIES : -       args.join(' ').split(' '); -      var css = {}; - -      keys.each( function(key) { -        if (!Element.Layout.PROPERTIES.include(key)) return; -        if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return; - -        var value = this.get(key); -        if (value != null) css[cssNameFor(key)] = value + 'px'; -      }, this); -      return css; -    }, - -    inspect: function() { -      return "#<Element.Layout>"; -    } -  }); - -  Object.extend(Element.Layout, { -    PROPERTIES: $w('height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height'), - -    COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'), - -    COMPUTATIONS: { -      'height': function(element) { -        if (!this._preComputing) this._begin(); - -        var bHeight = this.get('border-box-height'); -        if (bHeight <= 0) return 0; - -        var bTop = this.get('border-top'), -         bBottom = this.get('border-bottom'); - -        var pTop = this.get('padding-top'), -         pBottom = this.get('padding-bottom'); - -        if (!this._preComputing) this._end(); - -        return bHeight - bTop - bBottom - pTop - pBottom; -      }, - -      'width': function(element) { -        if (!this._preComputing) this._begin(); - -        var bWidth = this.get('border-box-width'); -        if (bWidth <= 0) return 0; - -        var bLeft = this.get('border-left'), -         bRight = this.get('border-right'); - -        var pLeft = this.get('padding-left'), -         pRight = this.get('padding-right'); - -        if (!this._preComputing) this._end(); - -        return bWidth - bLeft - bRight - pLeft - pRight; -      }, - -      'padding-box-height': function(element) { -        var height = this.get('height'), -         pTop = this.get('padding-top'), -         pBottom = this.get('padding-bottom'); - -        return height + pTop + pBottom; -      }, - -      'padding-box-width': function(element) { -        var width = this.get('width'), -         pLeft = this.get('padding-left'), -         pRight = this.get('padding-right'); - -        return width + pLeft + pRight; -      }, - -      'border-box-height': function(element) { -        return element.offsetHeight; -      }, - -      'border-box-width': function(element) { -        return element.offsetWidth; -      }, - -      'margin-box-height': function(element) { -        var bHeight = this.get('border-box-height'), -         mTop = this.get('margin-top'), -         mBottom = this.get('margin-bottom'); - -        if (bHeight <= 0) return 0; - -        return bHeight + mTop + mBottom; -      }, - -      'margin-box-width': function(element) { -        var bWidth = this.get('border-box-width'), -         mLeft = this.get('margin-left'), -         mRight = this.get('margin-right'); - -        if (bWidth <= 0) return 0; - -        return bWidth + mLeft + mRight; -      }, - -      'top': function(element) { -        var offset = element.positionedOffset(); -        return offset.top; -      }, - -      'bottom': function(element) { -        var offset = element.positionedOffset(), -         parent = element.getOffsetParent(), -         pHeight = parent.measure('height'); - -        var mHeight = this.get('border-box-height'); - -        return pHeight - mHeight - offset.top; -      }, - -      'left': function(element) { -        var offset = element.positionedOffset(); -        return offset.left; -      }, - -      'right': function(element) { -        var offset = element.positionedOffset(), -         parent = element.getOffsetParent(), -         pWidth = parent.measure('width'); - -        var mWidth = this.get('border-box-width'); - -        return pWidth - mWidth - offset.left; -      }, - -      'padding-top': function(element) { -        return getPixelValue(element, 'paddingTop'); -      }, - -      'padding-bottom': function(element) { -        return getPixelValue(element, 'paddingBottom'); -      }, - -      'padding-left': function(element) { -        return getPixelValue(element, 'paddingLeft'); -      }, - -      'padding-right': function(element) { -        return getPixelValue(element, 'paddingRight'); -      }, - -      'border-top': function(element) { -        return Object.isNumber(element.clientTop) ? element.clientTop : -         getPixelValue(element, 'borderTopWidth'); -      }, - -      'border-bottom': function(element) { -        return Object.isNumber(element.clientBottom) ? element.clientBottom : -         getPixelValue(element, 'borderBottomWidth'); -      }, - -      'border-left': function(element) { -        return Object.isNumber(element.clientLeft) ? element.clientLeft : -         getPixelValue(element, 'borderLeftWidth'); -      }, - -      'border-right': function(element) { -        return Object.isNumber(element.clientRight) ? element.clientRight : -         getPixelValue(element, 'borderRightWidth'); -      }, - -      'margin-top': function(element) { -        return getPixelValue(element, 'marginTop'); -      }, - -      'margin-bottom': function(element) { -        return getPixelValue(element, 'marginBottom'); -      }, - -      'margin-left': function(element) { -        return getPixelValue(element, 'marginLeft'); -      }, - -      'margin-right': function(element) { -        return getPixelValue(element, 'marginRight'); -      } -    } -  }); - -  if ('getBoundingClientRect' in document.documentElement) { -    Object.extend(Element.Layout.COMPUTATIONS, { -      'right': function(element) { -        var parent = hasLayout(element.getOffsetParent()); -        var rect = element.getBoundingClientRect(), -         pRect = parent.getBoundingClientRect(); - -        return (pRect.right - rect.right).round(); -      }, - -      'bottom': function(element) { -        var parent = hasLayout(element.getOffsetParent()); -        var rect = element.getBoundingClientRect(), -         pRect = parent.getBoundingClientRect(); - -        return (pRect.bottom - rect.bottom).round(); -      } -    }); -  } - -  Element.Offset = Class.create({ -    initialize: function(left, top) { -      this.left = left.round(); -      this.top  = top.round(); - -      this[0] = this.left; -      this[1] = this.top; -    }, - -    relativeTo: function(offset) { -      return new Element.Offset( -        this.left - offset.left, -        this.top  - offset.top -      ); -    }, - -    inspect: function() { -      return "#<Element.Offset left: #{left} top: #{top}>".interpolate(this); -    }, - -    toString: function() { -      return "[#{left}, #{top}]".interpolate(this); -    }, - -    toArray: function() { -      return [this.left, this.top]; -    } -  }); - -  function getLayout(element, preCompute) { -    return new Element.Layout(element, preCompute); -  } - -  function measure(element, property) { -    return $(element).getLayout().get(property); -  } - -  function getDimensions(element) { -    var layout = $(element).getLayout(); -    return { -      width:  layout.get('width'), -      height: layout.get('height') -    }; -  } - -  function getOffsetParent(element) { -    if (isDetached(element)) return $(document.body); - -    var isInline = (Element.getStyle(element, 'display') === 'inline'); -    if (!isInline && element.offsetParent) return $(element.offsetParent); -    if (element === document.body) return $(element); - -    while ((element = element.parentNode) && element !== document.body) { -      if (Element.getStyle(element, 'position') !== 'static') { -        return (element.nodeName === 'HTML') ? $(document.body) : $(element); -      } -    } - -    return $(document.body); -  } - - -  function cumulativeOffset(element) { -    var valueT = 0, valueL = 0; -    do { -      valueT += element.offsetTop  || 0; -      valueL += element.offsetLeft || 0; -      element = element.offsetParent; -    } while (element); -    return new Element.Offset(valueL, valueT); -  } - -  function positionedOffset(element) { -    var layout = element.getLayout(); - -    var valueT = 0, valueL = 0; -    do { -      valueT += element.offsetTop  || 0; -      valueL += element.offsetLeft || 0; -      element = element.offsetParent; -      if (element) { -        if (isBody(element)) break; -        var p = Element.getStyle(element, 'position'); -        if (p !== 'static') break; -      } -    } while (element); - -    valueL -= layout.get('margin-top'); -    valueT -= layout.get('margin-left'); - -    return new Element.Offset(valueL, valueT); -  } - -  function cumulativeScrollOffset(element) { -    var valueT = 0, valueL = 0; -    do { -      valueT += element.scrollTop  || 0; -      valueL += element.scrollLeft || 0; -      element = element.parentNode; -    } while (element); -    return new Element.Offset(valueL, valueT); -  } - -  function viewportOffset(forElement) { -    var valueT = 0, valueL = 0, docBody = document.body; - -    var element = forElement; -    do { -      valueT += element.offsetTop  || 0; -      valueL += element.offsetLeft || 0; -      if (element.offsetParent == docBody && -        Element.getStyle(element, 'position') == 'absolute') break; -    } while (element = element.offsetParent); - -    element = forElement; -    do { -      if (element != docBody) { -        valueT -= element.scrollTop  || 0; -        valueL -= element.scrollLeft || 0; -      } -    } while (element = element.parentNode); -    return new Element.Offset(valueL, valueT); -  } - -  function absolutize(element) { -    element = $(element); - -    if (Element.getStyle(element, 'position') === 'absolute') { -      return element; -    } - -    var offsetParent = getOffsetParent(element); -    var eOffset = element.viewportOffset(), -     pOffset = offsetParent.viewportOffset(); - -    var offset = eOffset.relativeTo(pOffset); -    var layout = element.getLayout(); - -    element.store('prototype_absolutize_original_styles', { -      left:   element.getStyle('left'), -      top:    element.getStyle('top'), -      width:  element.getStyle('width'), -      height: element.getStyle('height') -    }); - -    element.setStyle({ -      position: 'absolute', -      top:    offset.top + 'px', -      left:   offset.left + 'px', -      width:  layout.get('width') + 'px', -      height: layout.get('height') + 'px' -    }); - -    return element; -  } - -  function relativize(element) { -    element = $(element); -    if (Element.getStyle(element, 'position') === 'relative') { -      return element; -    } - -    var originalStyles = -     element.retrieve('prototype_absolutize_original_styles'); - -    if (originalStyles) element.setStyle(originalStyles); -    return element; -  } - -  Element.addMethods({ -    getLayout:              getLayout, -    measure:                measure, -    getDimensions:          getDimensions, -    getOffsetParent:        getOffsetParent, -    cumulativeOffset:       cumulativeOffset, -    positionedOffset:       positionedOffset, -    cumulativeScrollOffset: cumulativeScrollOffset, -    viewportOffset:         viewportOffset, -    absolutize:             absolutize, -    relativize:             relativize -  }); - -  function isBody(element) { -    return element.nodeName.toUpperCase() === 'BODY'; -  } - -  function isDetached(element) { -    return element !== document.body && -     !Element.descendantOf(element, document.body); -  } - -  if ('getBoundingClientRect' in document.documentElement) { -    Element.addMethods({ -      viewportOffset: function(element) { -        element = $(element); -        if (isDetached(element)) return new Element.Offset(0, 0); - -        var rect  = element.getBoundingClientRect(), -         docEl = document.documentElement; -        return new Element.Offset(rect.left - docEl.clientLeft, -         rect.top - docEl.clientTop); -      }, - -      positionedOffset: function(element) { -        element = $(element); -        var parent = element.getOffsetParent(); -        if (isDetached(element)) return new Element.Offset(0, 0); - -        if (element.offsetParent && -         element.offsetParent.nodeName.toUpperCase() === 'HTML') { -          return positionedOffset(element); -        } - -        var eOffset = element.viewportOffset(), -         pOffset = isBody(parent) ? viewportOffset(parent) : -          parent.viewportOffset(); -        var retOffset = eOffset.relativeTo(pOffset); - -        var layout = element.getLayout(); -        var top  = retOffset.top  - layout.get('margin-top'); -        var left = retOffset.left - layout.get('margin-left'); - -        return new Element.Offset(left, top); -      } -    }); -  } -})(); -window.$$ = function() { -  var expression = $A(arguments).join(', '); -  return Prototype.Selector.select(expression, document); -}; - -Prototype.Selector = (function() { - -  function select() { -    throw new Error('Method "Prototype.Selector.select" must be defined.'); -  } - -  function match() { -    throw new Error('Method "Prototype.Selector.match" must be defined.'); -  } - -  function find(elements, expression, index) { -    index = index || 0; -    var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i; - -    for (i = 0; i < length; i++) { -      if (match(elements[i], expression) && index == matchIndex++) { -        return Element.extend(elements[i]); -      } -    } -  } - -  function extendElements(elements) { -    for (var i = 0, length = elements.length; i < length; i++) { -      Element.extend(elements[i]); -    } -    return elements; -  } - - -  var K = Prototype.K; - -  return { -    select: select, -    match: match, -    find: find, -    extendElements: (Element.extend === K) ? K : extendElements, -    extendElement: Element.extend -  }; -})(); -Prototype._original_property = window.Sizzle; -/*! - * Sizzle CSS Selector Engine - v1.0 - *  Copyright 2009, The Dojo Foundation - *  Released under the MIT, BSD, and GPL Licenses. - *  More information: http://sizzlejs.com/ - */ -(function(){ - -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, -	done = 0, -	toString = Object.prototype.toString, -	hasDuplicate = false, -	baseHasDuplicate = true; - -[0, 0].sort(function(){ -	baseHasDuplicate = false; -	return 0; -}); - -var Sizzle = function(selector, context, results, seed) { -	results = results || []; -	var origContext = context = context || document; - -	if ( context.nodeType !== 1 && context.nodeType !== 9 ) { -		return []; -	} - -	if ( !selector || typeof selector !== "string" ) { -		return results; -	} - -	var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context), -		soFar = selector; - -	while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { -		soFar = m[3]; - -		parts.push( m[1] ); - -		if ( m[2] ) { -			extra = m[3]; -			break; -		} -	} - -	if ( parts.length > 1 && origPOS.exec( selector ) ) { -		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { -			set = posProcess( parts[0] + parts[1], context ); -		} else { -			set = Expr.relative[ parts[0] ] ? -				[ context ] : -				Sizzle( parts.shift(), context ); - -			while ( parts.length ) { -				selector = parts.shift(); - -				if ( Expr.relative[ selector ] ) -					selector += parts.shift(); - -				set = posProcess( selector, set ); -			} -		} -	} else { -		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && -				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { -			var ret = Sizzle.find( parts.shift(), context, contextXML ); -			context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; -		} - -		if ( context ) { -			var ret = seed ? -				{ expr: parts.pop(), set: makeArray(seed) } : -				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); -			set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; - -			if ( parts.length > 0 ) { -				checkSet = makeArray(set); -			} else { -				prune = false; -			} - -			while ( parts.length ) { -				var cur = parts.pop(), pop = cur; - -				if ( !Expr.relative[ cur ] ) { -					cur = ""; -				} else { -					pop = parts.pop(); -				} - -				if ( pop == null ) { -					pop = context; -				} - -				Expr.relative[ cur ]( checkSet, pop, contextXML ); -			} -		} else { -			checkSet = parts = []; -		} -	} - -	if ( !checkSet ) { -		checkSet = set; -	} - -	if ( !checkSet ) { -		throw "Syntax error, unrecognized expression: " + (cur || selector); -	} - -	if ( toString.call(checkSet) === "[object Array]" ) { -		if ( !prune ) { -			results.push.apply( results, checkSet ); -		} else if ( context && context.nodeType === 1 ) { -			for ( var i = 0; checkSet[i] != null; i++ ) { -				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { -					results.push( set[i] ); -				} -			} -		} else { -			for ( var i = 0; checkSet[i] != null; i++ ) { -				if ( checkSet[i] && checkSet[i].nodeType === 1 ) { -					results.push( set[i] ); -				} -			} -		} -	} else { -		makeArray( checkSet, results ); -	} - -	if ( extra ) { -		Sizzle( extra, origContext, results, seed ); -		Sizzle.uniqueSort( results ); -	} - -	return results; -}; - -Sizzle.uniqueSort = function(results){ -	if ( sortOrder ) { -		hasDuplicate = baseHasDuplicate; -		results.sort(sortOrder); - -		if ( hasDuplicate ) { -			for ( var i = 1; i < results.length; i++ ) { -				if ( results[i] === results[i-1] ) { -					results.splice(i--, 1); -				} -			} -		} -	} - -	return results; -}; - -Sizzle.matches = function(expr, set){ -	return Sizzle(expr, null, null, set); -}; - -Sizzle.find = function(expr, context, isXML){ -	var set, match; - -	if ( !expr ) { -		return []; -	} - -	for ( var i = 0, l = Expr.order.length; i < l; i++ ) { -		var type = Expr.order[i], match; - -		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { -			var left = match[1]; -			match.splice(1,1); - -			if ( left.substr( left.length - 1 ) !== "\\" ) { -				match[1] = (match[1] || "").replace(/\\/g, ""); -				set = Expr.find[ type ]( match, context, isXML ); -				if ( set != null ) { -					expr = expr.replace( Expr.match[ type ], "" ); -					break; -				} -			} -		} -	} - -	if ( !set ) { -		set = context.getElementsByTagName("*"); -	} - -	return {set: set, expr: expr}; -}; - -Sizzle.filter = function(expr, set, inplace, not){ -	var old = expr, result = [], curLoop = set, match, anyFound, -		isXMLFilter = set && set[0] && isXML(set[0]); - -	while ( expr && set.length ) { -		for ( var type in Expr.filter ) { -			if ( (match = Expr.match[ type ].exec( expr )) != null ) { -				var filter = Expr.filter[ type ], found, item; -				anyFound = false; - -				if ( curLoop == result ) { -					result = []; -				} - -				if ( Expr.preFilter[ type ] ) { -					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); - -					if ( !match ) { -						anyFound = found = true; -					} else if ( match === true ) { -						continue; -					} -				} - -				if ( match ) { -					for ( var i = 0; (item = curLoop[i]) != null; i++ ) { -						if ( item ) { -							found = filter( item, match, i, curLoop ); -							var pass = not ^ !!found; - -							if ( inplace && found != null ) { -								if ( pass ) { -									anyFound = true; -								} else { -									curLoop[i] = false; -								} -							} else if ( pass ) { -								result.push( item ); -								anyFound = true; -							} -						} -					} -				} - -				if ( found !== undefined ) { -					if ( !inplace ) { -						curLoop = result; -					} - -					expr = expr.replace( Expr.match[ type ], "" ); - -					if ( !anyFound ) { -						return []; -					} - -					break; -				} -			} -		} - -		if ( expr == old ) { -			if ( anyFound == null ) { -				throw "Syntax error, unrecognized expression: " + expr; -			} else { -				break; -			} -		} - -		old = expr; -	} - -	return curLoop; -}; - -var Expr = Sizzle.selectors = { -	order: [ "ID", "NAME", "TAG" ], -	match: { -		ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, -		CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, -		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, -		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, -		TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, -		CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, -		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, -		PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ -	}, -	leftMatch: {}, -	attrMap: { -		"class": "className", -		"for": "htmlFor" -	}, -	attrHandle: { -		href: function(elem){ -			return elem.getAttribute("href"); -		} -	}, -	relative: { -		"+": function(checkSet, part, isXML){ -			var isPartStr = typeof part === "string", -				isTag = isPartStr && !/\W/.test(part), -				isPartStrNotTag = isPartStr && !isTag; - -			if ( isTag && !isXML ) { -				part = part.toUpperCase(); -			} - -			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { -				if ( (elem = checkSet[i]) ) { -					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} - -					checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ? -						elem || false : -						elem === part; -				} -			} - -			if ( isPartStrNotTag ) { -				Sizzle.filter( part, checkSet, true ); -			} -		}, -		">": function(checkSet, part, isXML){ -			var isPartStr = typeof part === "string"; - -			if ( isPartStr && !/\W/.test(part) ) { -				part = isXML ? part : part.toUpperCase(); - -				for ( var i = 0, l = checkSet.length; i < l; i++ ) { -					var elem = checkSet[i]; -					if ( elem ) { -						var parent = elem.parentNode; -						checkSet[i] = parent.nodeName === part ? parent : false; -					} -				} -			} else { -				for ( var i = 0, l = checkSet.length; i < l; i++ ) { -					var elem = checkSet[i]; -					if ( elem ) { -						checkSet[i] = isPartStr ? -							elem.parentNode : -							elem.parentNode === part; -					} -				} - -				if ( isPartStr ) { -					Sizzle.filter( part, checkSet, true ); -				} -			} -		}, -		"": function(checkSet, part, isXML){ -			var doneName = done++, checkFn = dirCheck; - -			if ( !/\W/.test(part) ) { -				var nodeCheck = part = isXML ? part : part.toUpperCase(); -				checkFn = dirNodeCheck; -			} - -			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); -		}, -		"~": function(checkSet, part, isXML){ -			var doneName = done++, checkFn = dirCheck; - -			if ( typeof part === "string" && !/\W/.test(part) ) { -				var nodeCheck = part = isXML ? part : part.toUpperCase(); -				checkFn = dirNodeCheck; -			} - -			checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); -		} -	}, -	find: { -		ID: function(match, context, isXML){ -			if ( typeof context.getElementById !== "undefined" && !isXML ) { -				var m = context.getElementById(match[1]); -				return m ? [m] : []; -			} -		}, -		NAME: function(match, context, isXML){ -			if ( typeof context.getElementsByName !== "undefined" ) { -				var ret = [], results = context.getElementsByName(match[1]); - -				for ( var i = 0, l = results.length; i < l; i++ ) { -					if ( results[i].getAttribute("name") === match[1] ) { -						ret.push( results[i] ); -					} -				} - -				return ret.length === 0 ? null : ret; -			} -		}, -		TAG: function(match, context){ -			return context.getElementsByTagName(match[1]); -		} -	}, -	preFilter: { -		CLASS: function(match, curLoop, inplace, result, not, isXML){ -			match = " " + match[1].replace(/\\/g, "") + " "; - -			if ( isXML ) { -				return match; -			} - -			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { -				if ( elem ) { -					if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) { -						if ( !inplace ) -							result.push( elem ); -					} else if ( inplace ) { -						curLoop[i] = false; -					} -				} -			} - -			return false; -		}, -		ID: function(match){ -			return match[1].replace(/\\/g, ""); -		}, -		TAG: function(match, curLoop){ -			for ( var i = 0; curLoop[i] === false; i++ ){} -			return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); -		}, -		CHILD: function(match){ -			if ( match[1] == "nth" ) { -				var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( -					match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" || -					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); - -				match[2] = (test[1] + (test[2] || 1)) - 0; -				match[3] = test[3] - 0; -			} - -			match[0] = done++; - -			return match; -		}, -		ATTR: function(match, curLoop, inplace, result, not, isXML){ -			var name = match[1].replace(/\\/g, ""); - -			if ( !isXML && Expr.attrMap[name] ) { -				match[1] = Expr.attrMap[name]; -			} - -			if ( match[2] === "~=" ) { -				match[4] = " " + match[4] + " "; -			} - -			return match; -		}, -		PSEUDO: function(match, curLoop, inplace, result, not){ -			if ( match[1] === "not" ) { -				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { -					match[3] = Sizzle(match[3], null, null, curLoop); -				} else { -					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); -					if ( !inplace ) { -						result.push.apply( result, ret ); -					} -					return false; -				} -			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { -				return true; -			} - -			return match; -		}, -		POS: function(match){ -			match.unshift( true ); -			return match; -		} -	}, -	filters: { -		enabled: function(elem){ -			return elem.disabled === false && elem.type !== "hidden"; -		}, -		disabled: function(elem){ -			return elem.disabled === true; -		}, -		checked: function(elem){ -			return elem.checked === true; -		}, -		selected: function(elem){ -			elem.parentNode.selectedIndex; -			return elem.selected === true; -		}, -		parent: function(elem){ -			return !!elem.firstChild; -		}, -		empty: function(elem){ -			return !elem.firstChild; -		}, -		has: function(elem, i, match){ -			return !!Sizzle( match[3], elem ).length; -		}, -		header: function(elem){ -			return /h\d/i.test( elem.nodeName ); -		}, -		text: function(elem){ -			return "text" === elem.type; -		}, -		radio: function(elem){ -			return "radio" === elem.type; -		}, -		checkbox: function(elem){ -			return "checkbox" === elem.type; -		}, -		file: function(elem){ -			return "file" === elem.type; -		}, -		password: function(elem){ -			return "password" === elem.type; -		}, -		submit: function(elem){ -			return "submit" === elem.type; -		}, -		image: function(elem){ -			return "image" === elem.type; -		}, -		reset: function(elem){ -			return "reset" === elem.type; -		}, -		button: function(elem){ -			return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON"; -		}, -		input: function(elem){ -			return /input|select|textarea|button/i.test(elem.nodeName); -		} -	}, -	setFilters: { -		first: function(elem, i){ -			return i === 0; -		}, -		last: function(elem, i, match, array){ -			return i === array.length - 1; -		}, -		even: function(elem, i){ -			return i % 2 === 0; -		}, -		odd: function(elem, i){ -			return i % 2 === 1; -		}, -		lt: function(elem, i, match){ -			return i < match[3] - 0; -		}, -		gt: function(elem, i, match){ -			return i > match[3] - 0; -		}, -		nth: function(elem, i, match){ -			return match[3] - 0 == i; -		}, -		eq: function(elem, i, match){ -			return match[3] - 0 == i; -		} -	}, -	filter: { -		PSEUDO: function(elem, match, i, array){ -			var name = match[1], filter = Expr.filters[ name ]; - -			if ( filter ) { -				return filter( elem, i, match, array ); -			} else if ( name === "contains" ) { -				return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0; -			} else if ( name === "not" ) { -				var not = match[3]; - -				for ( var i = 0, l = not.length; i < l; i++ ) { -					if ( not[i] === elem ) { -						return false; -					} -				} - -				return true; -			} -		}, -		CHILD: function(elem, match){ -			var type = match[1], node = elem; -			switch (type) { -				case 'only': -				case 'first': -					while ( (node = node.previousSibling) )  { -						if ( node.nodeType === 1 ) return false; -					} -					if ( type == 'first') return true; -					node = elem; -				case 'last': -					while ( (node = node.nextSibling) )  { -						if ( node.nodeType === 1 ) return false; -					} -					return true; -				case 'nth': -					var first = match[2], last = match[3]; - -					if ( first == 1 && last == 0 ) { -						return true; -					} - -					var doneName = match[0], -						parent = elem.parentNode; - -					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { -						var count = 0; -						for ( node = parent.firstChild; node; node = node.nextSibling ) { -							if ( node.nodeType === 1 ) { -								node.nodeIndex = ++count; -							} -						} -						parent.sizcache = doneName; -					} - -					var diff = elem.nodeIndex - last; -					if ( first == 0 ) { -						return diff == 0; -					} else { -						return ( diff % first == 0 && diff / first >= 0 ); -					} -			} -		}, -		ID: function(elem, match){ -			return elem.nodeType === 1 && elem.getAttribute("id") === match; -		}, -		TAG: function(elem, match){ -			return (match === "*" && elem.nodeType === 1) || elem.nodeName === match; -		}, -		CLASS: function(elem, match){ -			return (" " + (elem.className || elem.getAttribute("class")) + " ") -				.indexOf( match ) > -1; -		}, -		ATTR: function(elem, match){ -			var name = match[1], -				result = Expr.attrHandle[ name ] ? -					Expr.attrHandle[ name ]( elem ) : -					elem[ name ] != null ? -						elem[ name ] : -						elem.getAttribute( name ), -				value = result + "", -				type = match[2], -				check = match[4]; - -			return result == null ? -				type === "!=" : -				type === "=" ? -				value === check : -				type === "*=" ? -				value.indexOf(check) >= 0 : -				type === "~=" ? -				(" " + value + " ").indexOf(check) >= 0 : -				!check ? -				value && result !== false : -				type === "!=" ? -				value != check : -				type === "^=" ? -				value.indexOf(check) === 0 : -				type === "$=" ? -				value.substr(value.length - check.length) === check : -				type === "|=" ? -				value === check || value.substr(0, check.length + 1) === check + "-" : -				false; -		}, -		POS: function(elem, match, i, array){ -			var name = match[2], filter = Expr.setFilters[ name ]; - -			if ( filter ) { -				return filter( elem, i, match, array ); -			} -		} -	} -}; - -var origPOS = Expr.match.POS; - -for ( var type in Expr.match ) { -	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); -	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source ); -} - -var makeArray = function(array, results) { -	array = Array.prototype.slice.call( array, 0 ); - -	if ( results ) { -		results.push.apply( results, array ); -		return results; -	} - -	return array; -}; - -try { -	Array.prototype.slice.call( document.documentElement.childNodes, 0 ); - -} catch(e){ -	makeArray = function(array, results) { -		var ret = results || []; - -		if ( toString.call(array) === "[object Array]" ) { -			Array.prototype.push.apply( ret, array ); -		} else { -			if ( typeof array.length === "number" ) { -				for ( var i = 0, l = array.length; i < l; i++ ) { -					ret.push( array[i] ); -				} -			} else { -				for ( var i = 0; array[i]; i++ ) { -					ret.push( array[i] ); -				} -			} -		} - -		return ret; -	}; -} - -var sortOrder; - -if ( document.documentElement.compareDocumentPosition ) { -	sortOrder = function( a, b ) { -		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { -			if ( a == b ) { -				hasDuplicate = true; -			} -			return 0; -		} - -		var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; -		if ( ret === 0 ) { -			hasDuplicate = true; -		} -		return ret; -	}; -} else if ( "sourceIndex" in document.documentElement ) { -	sortOrder = function( a, b ) { -		if ( !a.sourceIndex || !b.sourceIndex ) { -			if ( a == b ) { -				hasDuplicate = true; -			} -			return 0; -		} - -		var ret = a.sourceIndex - b.sourceIndex; -		if ( ret === 0 ) { -			hasDuplicate = true; -		} -		return ret; -	}; -} else if ( document.createRange ) { -	sortOrder = function( a, b ) { -		if ( !a.ownerDocument || !b.ownerDocument ) { -			if ( a == b ) { -				hasDuplicate = true; -			} -			return 0; -		} - -		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); -		aRange.setStart(a, 0); -		aRange.setEnd(a, 0); -		bRange.setStart(b, 0); -		bRange.setEnd(b, 0); -		var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); -		if ( ret === 0 ) { -			hasDuplicate = true; -		} -		return ret; -	}; -} - -(function(){ -	var form = document.createElement("div"), -		id = "script" + (new Date).getTime(); -	form.innerHTML = "<a name='" + id + "'/>"; - -	var root = document.documentElement; -	root.insertBefore( form, root.firstChild ); - -	if ( !!document.getElementById( id ) ) { -		Expr.find.ID = function(match, context, isXML){ -			if ( typeof context.getElementById !== "undefined" && !isXML ) { -				var m = context.getElementById(match[1]); -				return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; -			} -		}; - -		Expr.filter.ID = function(elem, match){ -			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); -			return elem.nodeType === 1 && node && node.nodeValue === match; -		}; -	} - -	root.removeChild( form ); -	root = form = null; // release memory in IE -})(); - -(function(){ - -	var div = document.createElement("div"); -	div.appendChild( document.createComment("") ); - -	if ( div.getElementsByTagName("*").length > 0 ) { -		Expr.find.TAG = function(match, context){ -			var results = context.getElementsByTagName(match[1]); - -			if ( match[1] === "*" ) { -				var tmp = []; - -				for ( var i = 0; results[i]; i++ ) { -					if ( results[i].nodeType === 1 ) { -						tmp.push( results[i] ); -					} -				} - -				results = tmp; -			} - -			return results; -		}; -	} - -	div.innerHTML = "<a href='#'></a>"; -	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && -			div.firstChild.getAttribute("href") !== "#" ) { -		Expr.attrHandle.href = function(elem){ -			return elem.getAttribute("href", 2); -		}; -	} - -	div = null; // release memory in IE -})(); - -if ( document.querySelectorAll ) (function(){ -	var oldSizzle = Sizzle, div = document.createElement("div"); -	div.innerHTML = "<p class='TEST'></p>"; - -	if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { -		return; -	} - -	Sizzle = function(query, context, extra, seed){ -		context = context || document; - -		if ( !seed && context.nodeType === 9 && !isXML(context) ) { -			try { -				return makeArray( context.querySelectorAll(query), extra ); -			} catch(e){} -		} - -		return oldSizzle(query, context, extra, seed); -	}; - -	for ( var prop in oldSizzle ) { -		Sizzle[ prop ] = oldSizzle[ prop ]; -	} - -	div = null; // release memory in IE -})(); - -if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){ -	var div = document.createElement("div"); -	div.innerHTML = "<div class='test e'></div><div class='test'></div>"; - -	if ( div.getElementsByClassName("e").length === 0 ) -		return; - -	div.lastChild.className = "e"; - -	if ( div.getElementsByClassName("e").length === 1 ) -		return; - -	Expr.order.splice(1, 0, "CLASS"); -	Expr.find.CLASS = function(match, context, isXML) { -		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { -			return context.getElementsByClassName(match[1]); -		} -	}; - -	div = null; // release memory in IE -})(); - -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { -	var sibDir = dir == "previousSibling" && !isXML; -	for ( var i = 0, l = checkSet.length; i < l; i++ ) { -		var elem = checkSet[i]; -		if ( elem ) { -			if ( sibDir && elem.nodeType === 1 ){ -				elem.sizcache = doneName; -				elem.sizset = i; -			} -			elem = elem[dir]; -			var match = false; - -			while ( elem ) { -				if ( elem.sizcache === doneName ) { -					match = checkSet[elem.sizset]; -					break; -				} - -				if ( elem.nodeType === 1 && !isXML ){ -					elem.sizcache = doneName; -					elem.sizset = i; -				} - -				if ( elem.nodeName === cur ) { -					match = elem; -					break; -				} - -				elem = elem[dir]; -			} - -			checkSet[i] = match; -		} -	} -} - -function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { -	var sibDir = dir == "previousSibling" && !isXML; -	for ( var i = 0, l = checkSet.length; i < l; i++ ) { -		var elem = checkSet[i]; -		if ( elem ) { -			if ( sibDir && elem.nodeType === 1 ) { -				elem.sizcache = doneName; -				elem.sizset = i; -			} -			elem = elem[dir]; -			var match = false; - -			while ( elem ) { -				if ( elem.sizcache === doneName ) { -					match = checkSet[elem.sizset]; -					break; -				} - -				if ( elem.nodeType === 1 ) { -					if ( !isXML ) { -						elem.sizcache = doneName; -						elem.sizset = i; -					} -					if ( typeof cur !== "string" ) { -						if ( elem === cur ) { -							match = true; -							break; -						} - -					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { -						match = elem; -						break; -					} -				} - -				elem = elem[dir]; -			} - -			checkSet[i] = match; -		} -	} -} - -var contains = document.compareDocumentPosition ?  function(a, b){ -	return a.compareDocumentPosition(b) & 16; -} : function(a, b){ -	return a !== b && (a.contains ? a.contains(b) : true); -}; - -var isXML = function(elem){ -	return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || -		!!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML"; -}; - -var posProcess = function(selector, context){ -	var tmpSet = [], later = "", match, -		root = context.nodeType ? [context] : context; - -	while ( (match = Expr.match.PSEUDO.exec( selector )) ) { -		later += match[0]; -		selector = selector.replace( Expr.match.PSEUDO, "" ); -	} - -	selector = Expr.relative[selector] ? selector + "*" : selector; - -	for ( var i = 0, l = root.length; i < l; i++ ) { -		Sizzle( selector, root[i], tmpSet ); -	} - -	return Sizzle.filter( later, tmpSet ); -}; - - -window.Sizzle = Sizzle; - -})(); - -;(function(engine) { -  var extendElements = Prototype.Selector.extendElements; - -  function select(selector, scope) { -    return extendElements(engine(selector, scope || document)); -  } - -  function match(element, selector) { -    return engine.matches(selector, [element]).length == 1; -  } - -  Prototype.Selector.engine = engine; -  Prototype.Selector.select = select; -  Prototype.Selector.match = match; -})(Sizzle); - -window.Sizzle = Prototype._original_property; -delete Prototype._original_property; - -var Form = { -  reset: function(form) { -    form = $(form); -    form.reset(); -    return form; -  }, - -  serializeElements: function(elements, options) { -    if (typeof options != 'object') options = { hash: !!options }; -    else if (Object.isUndefined(options.hash)) options.hash = true; -    var key, value, submitted = false, submit = options.submit; - -    var data = elements.inject({ }, function(result, element) { -      if (!element.disabled && element.name) { -        key = element.name; value = $(element).getValue(); -        if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && -            submit !== false && (!submit || key == submit) && (submitted = true)))) { -          if (key in result) { -            if (!Object.isArray(result[key])) result[key] = [result[key]]; -            result[key].push(value); -          } -          else result[key] = value; -        } -      } -      return result; -    }); - -    return options.hash ? data : Object.toQueryString(data); -  } -}; - -Form.Methods = { -  serialize: function(form, options) { -    return Form.serializeElements(Form.getElements(form), options); -  }, - -  getElements: function(form) { -    var elements = $(form).getElementsByTagName('*'), -        element, -        arr = [ ], -        serializers = Form.Element.Serializers; -    for (var i = 0; element = elements[i]; i++) { -      arr.push(element); -    } -    return arr.inject([], function(elements, child) { -      if (serializers[child.tagName.toLowerCase()]) -        elements.push(Element.extend(child)); -      return elements; -    }) -  }, - -  getInputs: function(form, typeName, name) { -    form = $(form); -    var inputs = form.getElementsByTagName('input'); - -    if (!typeName && !name) return $A(inputs).map(Element.extend); - -    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { -      var input = inputs[i]; -      if ((typeName && input.type != typeName) || (name && input.name != name)) -        continue; -      matchingInputs.push(Element.extend(input)); -    } - -    return matchingInputs; -  }, - -  disable: function(form) { -    form = $(form); -    Form.getElements(form).invoke('disable'); -    return form; -  }, - -  enable: function(form) { -    form = $(form); -    Form.getElements(form).invoke('enable'); -    return form; -  }, - -  findFirstElement: function(form) { -    var elements = $(form).getElements().findAll(function(element) { -      return 'hidden' != element.type && !element.disabled; -    }); -    var firstByIndex = elements.findAll(function(element) { -      return element.hasAttribute('tabIndex') && element.tabIndex >= 0; -    }).sortBy(function(element) { return element.tabIndex }).first(); - -    return firstByIndex ? firstByIndex : elements.find(function(element) { -      return /^(?:input|select|textarea)$/i.test(element.tagName); -    }); -  }, - -  focusFirstElement: function(form) { -    form = $(form); -    form.findFirstElement().activate(); -    return form; -  }, - -  request: function(form, options) { -    form = $(form), options = Object.clone(options || { }); - -    var params = options.parameters, action = form.readAttribute('action') || ''; -    if (action.blank()) action = window.location.href; -    options.parameters = form.serialize(true); - -    if (params) { -      if (Object.isString(params)) params = params.toQueryParams(); -      Object.extend(options.parameters, params); -    } - -    if (form.hasAttribute('method') && !options.method) -      options.method = form.method; - -    return new Ajax.Request(action, options); -  } -}; - -/*--------------------------------------------------------------------------*/ - - -Form.Element = { -  focus: function(element) { -    $(element).focus(); -    return element; -  }, - -  select: function(element) { -    $(element).select(); -    return element; -  } -}; - -Form.Element.Methods = { - -  serialize: function(element) { -    element = $(element); -    if (!element.disabled && element.name) { -      var value = element.getValue(); -      if (value != undefined) { -        var pair = { }; -        pair[element.name] = value; -        return Object.toQueryString(pair); -      } -    } -    return ''; -  }, - -  getValue: function(element) { -    element = $(element); -    var method = element.tagName.toLowerCase(); -    return Form.Element.Serializers[method](element); -  }, - -  setValue: function(element, value) { -    element = $(element); -    var method = element.tagName.toLowerCase(); -    Form.Element.Serializers[method](element, value); -    return element; -  }, - -  clear: function(element) { -    $(element).value = ''; -    return element; -  }, - -  present: function(element) { -    return $(element).value != ''; -  }, - -  activate: function(element) { -    element = $(element); -    try { -      element.focus(); -      if (element.select && (element.tagName.toLowerCase() != 'input' || -          !(/^(?:button|reset|submit)$/i.test(element.type)))) -        element.select(); -    } catch (e) { } -    return element; -  }, - -  disable: function(element) { -    element = $(element); -    element.disabled = true; -    return element; -  }, - -  enable: function(element) { -    element = $(element); -    element.disabled = false; -    return element; -  } -}; - -/*--------------------------------------------------------------------------*/ - -var Field = Form.Element; - -var $F = Form.Element.Methods.getValue; - -/*--------------------------------------------------------------------------*/ - -Form.Element.Serializers = { -  input: function(element, value) { -    switch (element.type.toLowerCase()) { -      case 'checkbox': -      case 'radio': -        return Form.Element.Serializers.inputSelector(element, value); -      default: -        return Form.Element.Serializers.textarea(element, value); -    } -  }, - -  inputSelector: function(element, value) { -    if (Object.isUndefined(value)) return element.checked ? element.value : null; -    else element.checked = !!value; -  }, - -  textarea: function(element, value) { -    if (Object.isUndefined(value)) return element.value; -    else element.value = value; -  }, - -  select: function(element, value) { -    if (Object.isUndefined(value)) -      return this[element.type == 'select-one' ? -        'selectOne' : 'selectMany'](element); -    else { -      var opt, currentValue, single = !Object.isArray(value); -      for (var i = 0, length = element.length; i < length; i++) { -        opt = element.options[i]; -        currentValue = this.optionValue(opt); -        if (single) { -          if (currentValue == value) { -            opt.selected = true; -            return; -          } -        } -        else opt.selected = value.include(currentValue); -      } -    } -  }, - -  selectOne: function(element) { -    var index = element.selectedIndex; -    return index >= 0 ? this.optionValue(element.options[index]) : null; -  }, - -  selectMany: function(element) { -    var values, length = element.length; -    if (!length) return null; - -    for (var i = 0, values = []; i < length; i++) { -      var opt = element.options[i]; -      if (opt.selected) values.push(this.optionValue(opt)); -    } -    return values; -  }, - -  optionValue: function(opt) { -    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; -  } -}; - -/*--------------------------------------------------------------------------*/ - - -Abstract.TimedObserver = Class.create(PeriodicalExecuter, { -  initialize: function($super, element, frequency, callback) { -    $super(callback, frequency); -    this.element   = $(element); -    this.lastValue = this.getValue(); -  }, - -  execute: function() { -    var value = this.getValue(); -    if (Object.isString(this.lastValue) && Object.isString(value) ? -        this.lastValue != value : String(this.lastValue) != String(value)) { -      this.callback(this.element, value); -      this.lastValue = value; -    } -  } -}); - -Form.Element.Observer = Class.create(Abstract.TimedObserver, { -  getValue: function() { -    return Form.Element.getValue(this.element); -  } -}); - -Form.Observer = Class.create(Abstract.TimedObserver, { -  getValue: function() { -    return Form.serialize(this.element); -  } -}); - -/*--------------------------------------------------------------------------*/ - -Abstract.EventObserver = Class.create({ -  initialize: function(element, callback) { -    this.element  = $(element); -    this.callback = callback; - -    this.lastValue = this.getValue(); -    if (this.element.tagName.toLowerCase() == 'form') -      this.registerFormCallbacks(); -    else -      this.registerCallback(this.element); -  }, - -  onElementEvent: function() { -    var value = this.getValue(); -    if (this.lastValue != value) { -      this.callback(this.element, value); -      this.lastValue = value; -    } -  }, - -  registerFormCallbacks: function() { -    Form.getElements(this.element).each(this.registerCallback, this); -  }, - -  registerCallback: function(element) { -    if (element.type) { -      switch (element.type.toLowerCase()) { -        case 'checkbox': -        case 'radio': -          Event.observe(element, 'click', this.onElementEvent.bind(this)); -          break; -        default: -          Event.observe(element, 'change', this.onElementEvent.bind(this)); -          break; -      } -    } -  } -}); - -Form.Element.EventObserver = Class.create(Abstract.EventObserver, { -  getValue: function() { -    return Form.Element.getValue(this.element); -  } -}); - -Form.EventObserver = Class.create(Abstract.EventObserver, { -  getValue: function() { -    return Form.serialize(this.element); -  } -}); -(function() { - -  var Event = { -    KEY_BACKSPACE: 8, -    KEY_TAB:       9, -    KEY_RETURN:   13, -    KEY_ESC:      27, -    KEY_LEFT:     37, -    KEY_UP:       38, -    KEY_RIGHT:    39, -    KEY_DOWN:     40, -    KEY_DELETE:   46, -    KEY_HOME:     36, -    KEY_END:      35, -    KEY_PAGEUP:   33, -    KEY_PAGEDOWN: 34, -    KEY_INSERT:   45, - -    cache: {} -  }; - -  var docEl = document.documentElement; -  var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl -    && 'onmouseleave' in docEl; - -  var _isButton; -  if (Prototype.Browser.IE) { -    var buttonMap = { 0: 1, 1: 4, 2: 2 }; -    _isButton = function(event, code) { -      return event.button === buttonMap[code]; -    }; -  } else if (Prototype.Browser.WebKit) { -    _isButton = function(event, code) { -      switch (code) { -        case 0: return event.which == 1 && !event.metaKey; -        case 1: return event.which == 1 && event.metaKey; -        default: return false; -      } -    }; -  } else { -    _isButton = function(event, code) { -      return event.which ? (event.which === code + 1) : (event.button === code); -    }; -  } - -  function isLeftClick(event)   { return _isButton(event, 0) } - -  function isMiddleClick(event) { return _isButton(event, 1) } - -  function isRightClick(event)  { return _isButton(event, 2) } - -  function element(event) { -    event = Event.extend(event); - -    var node = event.target, type = event.type, -     currentTarget = event.currentTarget; - -    if (currentTarget && currentTarget.tagName) { -      if (type === 'load' || type === 'error' || -        (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' -          && currentTarget.type === 'radio')) -            node = currentTarget; -    } - -    if (node.nodeType == Node.TEXT_NODE) -      node = node.parentNode; - -    return Element.extend(node); -  } - -  function findElement(event, expression) { -    var element = Event.element(event); -    if (!expression) return element; -    while (element) { -      if (Object.isElement(element) && Prototype.Selector.match(element, expression)) { -        return Element.extend(element); -      } -      element = element.parentNode; -    } -  } - -  function pointer(event) { -    return { x: pointerX(event), y: pointerY(event) }; -  } - -  function pointerX(event) { -    var docElement = document.documentElement, -     body = document.body || { scrollLeft: 0 }; - -    return event.pageX || (event.clientX + -      (docElement.scrollLeft || body.scrollLeft) - -      (docElement.clientLeft || 0)); -  } - -  function pointerY(event) { -    var docElement = document.documentElement, -     body = document.body || { scrollTop: 0 }; - -    return  event.pageY || (event.clientY + -       (docElement.scrollTop || body.scrollTop) - -       (docElement.clientTop || 0)); -  } - - -  function stop(event) { -    Event.extend(event); -    event.preventDefault(); -    event.stopPropagation(); - -    event.stopped = true; -  } - -  Event.Methods = { -    isLeftClick: isLeftClick, -    isMiddleClick: isMiddleClick, -    isRightClick: isRightClick, - -    element: element, -    findElement: findElement, - -    pointer: pointer, -    pointerX: pointerX, -    pointerY: pointerY, - -    stop: stop -  }; - - -  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { -    m[name] = Event.Methods[name].methodize(); -    return m; -  }); - -  if (Prototype.Browser.IE) { -    function _relatedTarget(event) { -      var element; -      switch (event.type) { -        case 'mouseover': element = event.fromElement; break; -        case 'mouseout':  element = event.toElement;   break; -        default: return null; -      } -      return Element.extend(element); -    } - -    Object.extend(methods, { -      stopPropagation: function() { this.cancelBubble = true }, -      preventDefault:  function() { this.returnValue = false }, -      inspect: function() { return '[object Event]' } -    }); - -    Event.extend = function(event, element) { -      if (!event) return false; -      if (event._extendedByPrototype) return event; - -      event._extendedByPrototype = Prototype.emptyFunction; -      var pointer = Event.pointer(event); - -      Object.extend(event, { -        target: event.srcElement || element, -        relatedTarget: _relatedTarget(event), -        pageX:  pointer.x, -        pageY:  pointer.y -      }); - -      return Object.extend(event, methods); -    }; -  } else { -    Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__; -    Object.extend(Event.prototype, methods); -    Event.extend = Prototype.K; -  } - -  function _createResponder(element, eventName, handler) { -    var registry = Element.retrieve(element, 'prototype_event_registry'); - -    if (Object.isUndefined(registry)) { -      CACHE.push(element); -      registry = Element.retrieve(element, 'prototype_event_registry', $H()); -    } - -    var respondersForEvent = registry.get(eventName); -    if (Object.isUndefined(respondersForEvent)) { -      respondersForEvent = []; -      registry.set(eventName, respondersForEvent); -    } - -    if (respondersForEvent.pluck('handler').include(handler)) return false; - -    var responder; -    if (eventName.include(":")) { -      responder = function(event) { -        if (Object.isUndefined(event.eventName)) -          return false; - -        if (event.eventName !== eventName) -          return false; - -        Event.extend(event, element); -        handler.call(element, event); -      }; -    } else { -      if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED && -       (eventName === "mouseenter" || eventName === "mouseleave")) { -        if (eventName === "mouseenter" || eventName === "mouseleave") { -          responder = function(event) { -            Event.extend(event, element); - -            var parent = event.relatedTarget; -            while (parent && parent !== element) { -              try { parent = parent.parentNode; } -              catch(e) { parent = element; } -            } - -            if (parent === element) return; - -            handler.call(element, event); -          }; -        } -      } else { -        responder = function(event) { -          Event.extend(event, element); -          handler.call(element, event); -        }; -      } -    } - -    responder.handler = handler; -    respondersForEvent.push(responder); -    return responder; -  } - -  function _destroyCache() { -    for (var i = 0, length = CACHE.length; i < length; i++) { -      Event.stopObserving(CACHE[i]); -      CACHE[i] = null; -    } -  } - -  var CACHE = []; - -  if (Prototype.Browser.IE) -    window.attachEvent('onunload', _destroyCache); - -  if (Prototype.Browser.WebKit) -    window.addEventListener('unload', Prototype.emptyFunction, false); - - -  var _getDOMEventName = Prototype.K, -      translations = { mouseenter: "mouseover", mouseleave: "mouseout" }; - -  if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) { -    _getDOMEventName = function(eventName) { -      return (translations[eventName] || eventName); -    }; -  } - -  function observe(element, eventName, handler) { -    element = $(element); - -    var responder = _createResponder(element, eventName, handler); - -    if (!responder) return element; - -    if (eventName.include(':')) { -      if (element.addEventListener) -        element.addEventListener("dataavailable", responder, false); -      else { -        element.attachEvent("ondataavailable", responder); -        element.attachEvent("onfilterchange", responder); -      } -    } else { -      var actualEventName = _getDOMEventName(eventName); - -      if (element.addEventListener) -        element.addEventListener(actualEventName, responder, false); -      else -        element.attachEvent("on" + actualEventName, responder); -    } - -    return element; -  } - -  function stopObserving(element, eventName, handler) { -    element = $(element); - -    var registry = Element.retrieve(element, 'prototype_event_registry'); -    if (!registry) return element; - -    if (!eventName) { -      registry.each( function(pair) { -        var eventName = pair.key; -        stopObserving(element, eventName); -      }); -      return element; -    } - -    var responders = registry.get(eventName); -    if (!responders) return element; - -    if (!handler) { -      responders.each(function(r) { -        stopObserving(element, eventName, r.handler); -      }); -      return element; -    } - -    var responder = responders.find( function(r) { return r.handler === handler; }); -    if (!responder) return element; - -    if (eventName.include(':')) { -      if (element.removeEventListener) -        element.removeEventListener("dataavailable", responder, false); -      else { -        element.detachEvent("ondataavailable", responder); -        element.detachEvent("onfilterchange",  responder); -      } -    } else { -      var actualEventName = _getDOMEventName(eventName); -      if (element.removeEventListener) -        element.removeEventListener(actualEventName, responder, false); -      else -        element.detachEvent('on' + actualEventName, responder); -    } - -    registry.set(eventName, responders.without(responder)); - -    return element; -  } - -  function fire(element, eventName, memo, bubble) { -    element = $(element); - -    if (Object.isUndefined(bubble)) -      bubble = true; - -    if (element == document && document.createEvent && !element.dispatchEvent) -      element = document.documentElement; - -    var event; -    if (document.createEvent) { -      event = document.createEvent('HTMLEvents'); -      event.initEvent('dataavailable', true, true); -    } else { -      event = document.createEventObject(); -      event.eventType = bubble ? 'ondataavailable' : 'onfilterchange'; -    } - -    event.eventName = eventName; -    event.memo = memo || { }; - -    if (document.createEvent) -      element.dispatchEvent(event); -    else -      element.fireEvent(event.eventType, event); - -    return Event.extend(event); -  } - -  Event.Handler = Class.create({ -    initialize: function(element, eventName, selector, callback) { -      this.element   = $(element); -      this.eventName = eventName; -      this.selector  = selector; -      this.callback  = callback; -      this.handler   = this.handleEvent.bind(this); -    }, - -    start: function() { -      Event.observe(this.element, this.eventName, this.handler); -      return this; -    }, - -    stop: function() { -      Event.stopObserving(this.element, this.eventName, this.handler); -      return this; -    }, - -    handleEvent: function(event) { -      var element = event.findElement(this.selector); -      if (element) this.callback.call(this.element, event, element); -    } -  }); - -  function on(element, eventName, selector, callback) { -    element = $(element); -    if (Object.isFunction(selector) && Object.isUndefined(callback)) { -      callback = selector, selector = null; -    } - -    return new Event.Handler(element, eventName, selector, callback).start(); -  } - -  Object.extend(Event, Event.Methods); - -  Object.extend(Event, { -    fire:          fire, -    observe:       observe, -    stopObserving: stopObserving, -    on:            on -  }); - -  Element.addMethods({ -    fire:          fire, - -    observe:       observe, - -    stopObserving: stopObserving, - -    on:            on -  }); - -  Object.extend(document, { -    fire:          fire.methodize(), - -    observe:       observe.methodize(), - -    stopObserving: stopObserving.methodize(), - -    on:            on.methodize(), - -    loaded:        false -  }); - -  if (window.Event) Object.extend(window.Event, Event); -  else window.Event = Event; -})(); - -(function() { -  /* Support for the DOMContentLoaded event is based on work by Dan Webb, -     Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */ - -  var timer; - -  function fireContentLoadedEvent() { -    if (document.loaded) return; -    if (timer) window.clearTimeout(timer); -    document.loaded = true; -    document.fire('dom:loaded'); -  } - -  function checkReadyState() { -    if (document.readyState === 'complete') { -      document.stopObserving('readystatechange', checkReadyState); -      fireContentLoadedEvent(); -    } -  } - -  function pollDoScroll() { -    try { document.documentElement.doScroll('left'); } -    catch(e) { -      timer = pollDoScroll.defer(); -      return; -    } -    fireContentLoadedEvent(); -  } - -  if (document.addEventListener) { -    document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false); -  } else { -    document.observe('readystatechange', checkReadyState); -    if (window == top) -      timer = pollDoScroll.defer(); -  } - -  Event.observe(window, 'load', fireContentLoadedEvent); -})(); - -Element.addMethods(); - -/*------------------------------- DEPRECATED -------------------------------*/ - -Hash.toQueryString = Object.toQueryString; - -var Toggle = { display: Element.toggle }; - -Element.Methods.childOf = Element.Methods.descendantOf; - -var Insertion = { -  Before: function(element, content) { -    return Element.insert(element, {before:content}); -  }, - -  Top: function(element, content) { -    return Element.insert(element, {top:content}); -  }, - -  Bottom: function(element, content) { -    return Element.insert(element, {bottom:content}); -  }, - -  After: function(element, content) { -    return Element.insert(element, {after:content}); -  } -}; - -var $continue = new Error('"throw $continue" is deprecated, use "return" instead'); - -var Position = { -  includeScrollOffsets: false, - -  prepare: function() { -    this.deltaX =  window.pageXOffset -                || document.documentElement.scrollLeft -                || document.body.scrollLeft -                || 0; -    this.deltaY =  window.pageYOffset -                || document.documentElement.scrollTop -                || document.body.scrollTop -                || 0; -  }, - -  within: function(element, x, y) { -    if (this.includeScrollOffsets) -      return this.withinIncludingScrolloffsets(element, x, y); -    this.xcomp = x; -    this.ycomp = y; -    this.offset = Element.cumulativeOffset(element); - -    return (y >= this.offset[1] && -            y <  this.offset[1] + element.offsetHeight && -            x >= this.offset[0] && -            x <  this.offset[0] + element.offsetWidth); -  }, - -  withinIncludingScrolloffsets: function(element, x, y) { -    var offsetcache = Element.cumulativeScrollOffset(element); - -    this.xcomp = x + offsetcache[0] - this.deltaX; -    this.ycomp = y + offsetcache[1] - this.deltaY; -    this.offset = Element.cumulativeOffset(element); - -    return (this.ycomp >= this.offset[1] && -            this.ycomp <  this.offset[1] + element.offsetHeight && -            this.xcomp >= this.offset[0] && -            this.xcomp <  this.offset[0] + element.offsetWidth); -  }, - -  overlap: function(mode, element) { -    if (!mode) return 0; -    if (mode == 'vertical') -      return ((this.offset[1] + element.offsetHeight) - this.ycomp) / -        element.offsetHeight; -    if (mode == 'horizontal') -      return ((this.offset[0] + element.offsetWidth) - this.xcomp) / -        element.offsetWidth; -  }, - - -  cumulativeOffset: Element.Methods.cumulativeOffset, - -  positionedOffset: Element.Methods.positionedOffset, - -  absolutize: function(element) { -    Position.prepare(); -    return Element.absolutize(element); -  }, - -  relativize: function(element) { -    Position.prepare(); -    return Element.relativize(element); -  }, - -  realOffset: Element.Methods.cumulativeScrollOffset, - -  offsetParent: Element.Methods.getOffsetParent, - -  page: Element.Methods.viewportOffset, - -  clone: function(source, target, options) { -    options = options || { }; -    return Element.clonePosition(target, source, options); -  } -}; - -/*--------------------------------------------------------------------------*/ - -if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ -  function iter(name) { -    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; -  } - -  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? -  function(element, className) { -    className = className.toString().strip(); -    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); -    return cond ? document._getElementsByXPath('.//*' + cond, element) : []; -  } : function(element, className) { -    className = className.toString().strip(); -    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); -    if (!classNames && !className) return elements; - -    var nodes = $(element).getElementsByTagName('*'); -    className = ' ' + className + ' '; - -    for (var i = 0, child, cn; child = nodes[i]; i++) { -      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || -          (classNames && classNames.all(function(name) { -            return !name.toString().blank() && cn.include(' ' + name + ' '); -          })))) -        elements.push(Element.extend(child)); -    } -    return elements; -  }; - -  return function(className, parentElement) { -    return $(parentElement || document.body).getElementsByClassName(className); -  }; -}(Element.Methods); - -/*--------------------------------------------------------------------------*/ - -Element.ClassNames = Class.create(); -Element.ClassNames.prototype = { -  initialize: function(element) { -    this.element = $(element); -  }, - -  _each: function(iterator) { -    this.element.className.split(/\s+/).select(function(name) { -      return name.length > 0; -    })._each(iterator); -  }, - -  set: function(className) { -    this.element.className = className; -  }, - -  add: function(classNameToAdd) { -    if (this.include(classNameToAdd)) return; -    this.set($A(this).concat(classNameToAdd).join(' ')); -  }, - -  remove: function(classNameToRemove) { -    if (!this.include(classNameToRemove)) return; -    this.set($A(this).without(classNameToRemove).join(' ')); -  }, - -  toString: function() { -    return $A(this).join(' '); -  } -}; - -Object.extend(Element.ClassNames.prototype, Enumerable); - -/*--------------------------------------------------------------------------*/ - -(function() { -  window.Selector = Class.create({ -    initialize: function(expression) { -      this.expression = expression.strip(); -    }, - -    findElements: function(rootElement) { -      return Prototype.Selector.select(this.expression, rootElement); -    }, - -    match: function(element) { -      return Prototype.Selector.match(element, this.expression); -    }, - -    toString: function() { -      return this.expression; -    }, - -    inspect: function() { -      return "#<Selector: " + this.expression + ">"; -    } -  }); - -  Object.extend(Selector, { -    matchElements: function(elements, expression) { -      var match = Prototype.Selector.match, -          results = []; - -      for (var i = 0, length = elements.length; i < length; i++) { -        var element = elements[i]; -        if (match(element, expression)) { -          results.push(Element.extend(element)); -        } -      } -      return results; -    }, - -    findElement: function(elements, expression, index) { -      index = index || 0; -      var matchIndex = 0, element; -      for (var i = 0, length = elements.length; i < length; i++) { -        element = elements[i]; -        if (Prototype.Selector.match(element, expression) && index === matchIndex++) { -          return Element.extend(element); -        } -      } -    }, - -    findChildElements: function(element, expressions) { -      var selector = expressions.toArray().join(', '); -      return Prototype.Selector.select(selector, element || document); -    } -  }); -})(); diff --git a/public/javascripts/rails.js b/public/javascripts/rails.js deleted file mode 100644 index 5cea13c15..000000000 --- a/public/javascripts/rails.js +++ /dev/null @@ -1,202 +0,0 @@ -(function() { -  Ajax.Responders.register({ -    onCreate: function(request) { -      var token = $$('meta[name=csrf-token]')[0]; -      if (token) { -        if (!request.options.requestHeaders) request.options.requestHeaders = {}; -        request.options.requestHeaders['X-CSRF-Token'] = token.readAttribute('content'); -      } -    } -  }); - -  // Technique from Juriy Zaytsev -  // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ -  function isEventSupported(eventName) { -    var el = document.createElement('div'); -    eventName = 'on' + eventName; -    var isSupported = (eventName in el); -    if (!isSupported) { -      el.setAttribute(eventName, 'return;'); -      isSupported = typeof el[eventName] == 'function'; -    } -    el = null; -    return isSupported; -  } - -  function isForm(element) { -    return Object.isElement(element) && element.nodeName.toUpperCase() == 'FORM'; -  } - -  function isInput(element) { -    if (Object.isElement(element)) { -      var name = element.nodeName.toUpperCase(); -      return name == 'INPUT' || name == 'SELECT' || name == 'TEXTAREA'; -    } -    else return false; -  } - -  var submitBubbles = isEventSupported('submit'), -      changeBubbles = isEventSupported('change'); - -  if (!submitBubbles || !changeBubbles) { -    // augment the Event.Handler class to observe custom events when needed -    Event.Handler.prototype.initialize = Event.Handler.prototype.initialize.wrap( -      function(init, element, eventName, selector, callback) { -        init(element, eventName, selector, callback); -        // is the handler being attached to an element that doesn't support this event? -        if ( (!submitBubbles && this.eventName == 'submit' && !isForm(this.element)) || -             (!changeBubbles && this.eventName == 'change' && !isInput(this.element)) ) { -          // "submit" => "emulated:submit" -          this.eventName = 'emulated:' + this.eventName; -        } -      } -    ); -  } - -  if (!submitBubbles) { -    // discover forms on the page by observing focus events which always bubble -    document.on('focusin', 'form', function(focusEvent, form) { -      // special handler for the real "submit" event (one-time operation) -      if (!form.retrieve('emulated:submit')) { -        form.on('submit', function(submitEvent) { -          var emulated = form.fire('emulated:submit', submitEvent, true); -          // if custom event received preventDefault, cancel the real one too -          if (emulated.returnValue === false) submitEvent.preventDefault(); -        }); -        form.store('emulated:submit', true); -      } -    }); -  } - -  if (!changeBubbles) { -    // discover form inputs on the page -    document.on('focusin', 'input, select, textarea', function(focusEvent, input) { -      // special handler for real "change" events -      if (!input.retrieve('emulated:change')) { -        input.on('change', function(changeEvent) { -          input.fire('emulated:change', changeEvent, true); -        }); -        input.store('emulated:change', true); -      } -    }); -  } - -  function handleRemote(element) { -    var method, url, params; - -    var event = element.fire("ajax:before"); -    if (event.stopped) return false; - -    if (element.tagName.toLowerCase() === 'form') { -      method = element.readAttribute('method') || 'post'; -      url    = element.readAttribute('action'); -      // serialize the form with respect to the submit button that was pressed -      params = element.serialize({ submit: element.retrieve('rails:submit-button') }); -      // clear the pressed submit button information -      element.store('rails:submit-button', null); -    } else { -      method = element.readAttribute('data-method') || 'get'; -      url    = element.readAttribute('href'); -      params = {}; -    } - -    new Ajax.Request(url, { -      method: method, -      parameters: params, -      evalScripts: true, - -      onCreate:   function(response) { element.fire("ajax:create",   response); }, -      onComplete: function(response) { element.fire("ajax:complete", response); }, -      onSuccess:  function(response) { element.fire("ajax:success",  response); }, -      onFailure:  function(response) { element.fire("ajax:failure",  response); } -    }); - -    element.fire("ajax:after"); -  } - -  function insertHiddenField(form, name, value) { -    form.insert(new Element('input', { type: 'hidden', name: name, value: value })); -  } - -  function handleMethod(element) { -    var method = element.readAttribute('data-method'), -        url = element.readAttribute('href'), -        csrf_param = $$('meta[name=csrf-param]')[0], -        csrf_token = $$('meta[name=csrf-token]')[0]; - -    var form = new Element('form', { method: "POST", action: url, style: "display: none;" }); -    $(element.parentNode).insert(form); - -    if (method !== 'post') { -      insertHiddenField(form, '_method', method); -    } - -    if (csrf_param) { -      insertHiddenField(form, csrf_param.readAttribute('content'), csrf_token.readAttribute('content')); -    } - -    form.submit(); -  } - -  function disableFormElements(form) { -    form.select('input[type=submit][data-disable-with]').each(function(input) { -      input.store('rails:original-value', input.getValue()); -      input.setValue(input.readAttribute('data-disable-with')).disable(); -    }); -  } - -  function enableFormElements(form) { -    form.select('input[type=submit][data-disable-with]').each(function(input) { -      input.setValue(input.retrieve('rails:original-value')).enable(); -    }); -  } - -  function allowAction(element) { -    var message = element.readAttribute('data-confirm'); -    return !message || confirm(message); -  } - -  document.on('click', 'a[data-confirm], a[data-remote], a[data-method]', function(event, link) { -    if (!allowAction(link)) { -      event.stop(); -      return false; -    } - -    if (link.readAttribute('data-remote')) { -      handleRemote(link); -      event.stop(); -    } else if (link.readAttribute('data-method')) { -      handleMethod(link); -      event.stop(); -    } -  }); - -  document.on("click", "form input[type=submit], form button[type=submit], form button:not([type])", function(event, button) { -    // register the pressed submit button -    event.findElement('form').store('rails:submit-button', button.name || false); -  }); - -  document.on("submit", function(event) { -    var form = event.findElement(); - -    if (!allowAction(form)) { -      event.stop(); -      return false; -    } - -    if (form.readAttribute('data-remote')) { -      handleRemote(form); -      event.stop(); -    } else { -      disableFormElements(form); -    } -  }); - -  document.on('ajax:create', 'form', function(event, form) { -    if (form == event.findElement()) disableFormElements(form); -  }); - -  document.on('ajax:complete', 'form', function(event, form) { -    if (form == event.findElement()) enableFormElements(form); -  }); -})(); diff --git a/public/javascripts/stats-graphs.js b/public/javascripts/stats-graphs.js new file mode 100644 index 000000000..73e19a6fc --- /dev/null +++ b/public/javascripts/stats-graphs.js @@ -0,0 +1,87 @@ +/* From http://stackoverflow.com/a/10284006/223092 */ +function zip(arrays) { +    return arrays[0].map(function(_,i){ +        return arrays.map(function(array){return array[i]}) +    }); +} + +$(document).ready(function() { +    $.each(graphs_data, function(index, graph_data) { +        var graph_id = graph_data.id, +            dataset, +            plot, +            graph_data, +            graph_div = $('#' + graph_id); + +        if (!graph_data.x_values) { +            /* Then there's no data for this graph */ +            return true; +        } + +        graph_div.css('width', '700px'); +        graph_div.css('height', '400px'); + +        dataset = [ +            {'color': 'orange', +             'bars': { +                 'show': true, +                 'barWidth': 0.5, +                 'align': 'center' +             }, +             'data': zip([graph_data.x_values, +                          graph_data.y_values]) +            } +        ] + +        if (graph_data.errorbars) { +            dataset.push({ +                'color': 'orange', +                'points': { +                    // Don't show these, just draw error bars: +                    'radius': 0, +                    'errorbars': 'y', +                    'yerr': { +                        'asymmetric': true, +                        'show': true, +                        'upperCap': "-", +                        'lowerCap': "-", +                        'radius': 5 +                    } +                }, +                'data': zip([graph_data.x_values, +                             graph_data.y_values, +                             graph_data.cis_below, +                             graph_data.cis_above]) +            }); +        } + +        options = { +            'xaxis': { +                'ticks': graph_data.x_ticks, +            }, +            'yaxis': { +                'min': 0, +                'max': graph_data.y_max +            }, +            'xaxes': [{ +                'axisLabel': graph_data.x_axis, +                'axisLabelPadding': 20, +                'axisLabelColour': 'black' +            }], +            'yaxes': [{ +                'axisLabel': graph_data.y_axis, +                'axisLabelPadding': 20, +                'axisLabelColour': 'black' +            }], +            'series': { +		'lines': { +		    'show': false +		} +	    }, +        } + +        plot = $.plot(graph_div, +                      dataset, +                      options); +    }); +});  | 
