Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

initial commit

  • Loading branch information...
commit 42fd9806389be56b84b3546fd8446591eb7cf22a 1 parent dcf79bd
@kristianmandrup authored
Showing with 4,777 additions and 17 deletions.
  1. +5 −5 .gitignore
  2. +6 −9 Gemfile
  3. +16 −1 README.rdoc
  4. +2 −2 Rakefile
  5. +791 −0 assets/javascripts/dateinput/dateinput.js
  6. +39 −0 assets/javascripts/jquery.tools.min.js
  7. +155 −0 assets/javascripts/overlay/overlay.apple.js
  8. +293 −0 assets/javascripts/overlay/overlay.js
  9. +471 −0 assets/javascripts/rangeinput/rangeinput.js
  10. +96 −0 assets/javascripts/scrollable/scrollable.autoscroll.js
  11. +368 −0 assets/javascripts/scrollable/scrollable.js
  12. +134 −0 assets/javascripts/scrollable/scrollable.navigator.js
  13. +319 −0 assets/javascripts/tabs/tabs.js
  14. +191 −0 assets/javascripts/tabs/tabs.slideshow.js
  15. +224 −0 assets/javascripts/toolbox/toolbox.expose.js
  16. +301 −0 assets/javascripts/toolbox/toolbox.flashembed.js
  17. +108 −0 assets/javascripts/toolbox/toolbox.history.js
  18. +65 −0 assets/javascripts/toolbox/toolbox.mousewheel.js
  19. +154 −0 assets/javascripts/tooltip/tooltip.dynamic.js
  20. +358 −0 assets/javascripts/tooltip/tooltip.js
  21. +78 −0 assets/javascripts/tooltip/tooltip.slide.js
  22. +598 −0 assets/javascripts/validator/validator.js
  23. +5 −0 lib/jqtools-rails.rb
View
10 .gitignore
@@ -28,11 +28,11 @@ pkg
#
# For MacOS:
#
-#.DS_Store
+.DS_Store
# For TextMate
-#*.tmproj
-#tmtags
+*.tmproj
+tmtags
# For emacs:
#*~
@@ -40,10 +40,10 @@ pkg
#.\#*
# For vim:
-#*.swp
+*.swp
# For redcar:
-#.redcar
+.redcar
# For rubinius:
#*.rbc
View
15 Gemfile
@@ -1,14 +1,11 @@
-source "http://rubygems.org"
-# Add dependencies required to use your gem here.
-# Example:
-# gem "activesupport", ">= 2.3.5"
+source :rubygems
# Add dependencies to develop your gem here.
# Include everything needed to run rake, tests, features, etc.
group :development do
- gem "rspec", "~> 2.8.0"
- gem "rdoc", "~> 3.12"
- gem "bundler", "~> 1.0.0"
- gem "jeweler", "~> 1.8.3"
- gem "rcov", ">= 0"
+ gem "rspec", "~> 2.8.0"
+ gem "rdoc", "~> 3.12"
+ gem "bundler", ">= 1.0.0"
+ gem "jeweler", ">= 1.8.3"
+ gem "simplecov",">= 0.5"
end
View
17 README.rdoc
@@ -1,6 +1,21 @@
= jqtools-rails
-Description goes here.
+This gem is a Rails engine and is configured to integrate with Rails asset pipeline.
+
+Simply add to Gemfile and bundle:
+
+gem 'jqtools-rails'
+
+You can choose to use either the minified js for all the tools:
+
+//= require_tree .
+//= require jquery.tools.min
+
+Or the tools individually
+
+//= require_tree .
+//= require rangeinput/rangeinput.js
+//= require dateinput/dateinput.js
== Contributing to jqtools-rails
View
4 Rakefile
@@ -17,8 +17,8 @@ Jeweler::Tasks.new do |gem|
gem.name = "jqtools-rails"
gem.homepage = "http://github.com/kristianmandrup/jqtools-rails"
gem.license = "MIT"
- gem.summary = %Q{TODO: one-line summary of your gem}
- gem.description = %Q{TODO: longer description of your gem}
+ gem.summary = %Q{jQuery tools wrapped as a Rails 3 gem}
+ gem.description = %Q{Gem is an engine and is configured to integrate with Rails asset pipeline}
gem.email = "kmandrup@gmail.com"
gem.authors = ["Kristian Mandrup"]
# dependencies defined in Gemfile
View
791 assets/javascripts/dateinput/dateinput.js
@@ -0,0 +1,791 @@
+/**
+ * @license
+ * jQuery Tools @VERSION Dateinput - <input type="date" /> for humans
+ *
+ * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
+ *
+ * http://flowplayer.org/tools/form/dateinput/
+ *
+ * Since: Mar 2010
+ * Date: @DATE
+ */
+(function($, undefined) {
+
+ /* TODO:
+ preserve today highlighted
+ */
+
+ $.tools = $.tools || {version: '@VERSION'};
+
+ var instances = [],
+ tool,
+
+ // h=72, j=74, k=75, l=76, down=40, left=37, up=38, right=39
+ KEYS = [75, 76, 38, 39, 74, 72, 40, 37],
+ LABELS = {};
+
+ tool = $.tools.dateinput = {
+
+ conf: {
+ format: 'mm/dd/yy',
+ selectors: false,
+ yearRange: [-5, 5],
+ lang: 'en',
+ offset: [0, 0],
+ speed: 0,
+ firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+ min: undefined,
+ max: undefined,
+ trigger: 0,
+ toggle: 0,
+ editable: 0,
+
+ css: {
+
+ prefix: 'cal',
+ input: 'date',
+
+ // ids
+ root: 0,
+ head: 0,
+ title: 0,
+ prev: 0,
+ next: 0,
+ month: 0,
+ year: 0,
+ days: 0,
+
+ body: 0,
+ weeks: 0,
+ today: 0,
+ current: 0,
+
+ // classnames
+ week: 0,
+ off: 0,
+ sunday: 0,
+ focus: 0,
+ disabled: 0,
+ trigger: 0
+ }
+ },
+
+ localize: function(language, labels) {
+ $.each(labels, function(key, val) {
+ labels[key] = val.split(",");
+ });
+ LABELS[language] = labels;
+ }
+
+ };
+
+ tool.localize("en", {
+ months: 'January,February,March,April,May,June,July,August,September,October,November,December',
+ shortMonths: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec',
+ days: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',
+ shortDays: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'
+ });
+
+
+//{{{ private functions
+
+
+ // @return amount of days in certain month
+ function dayAm(year, month) {
+ return new Date(year, month + 1, 0).getDate();
+ }
+
+ function zeropad(val, len) {
+ val = '' + val;
+ len = len || 2;
+ while (val.length < len) { val = "0" + val; }
+ return val;
+ }
+
+ // thanks: http://stevenlevithan.com/assets/misc/date.format.js
+ var Re = /d{1,4}|m{1,4}|yy(?:yy)?|"[^"]*"|'[^']*'/g, tmpTag = $("<a/>");
+
+ function format(date, fmt, lang) {
+
+ var d = date.getDate(),
+ D = date.getDay(),
+ m = date.getMonth(),
+ y = date.getFullYear(),
+
+ flags = {
+ d: d,
+ dd: zeropad(d),
+ ddd: LABELS[lang].shortDays[D],
+ dddd: LABELS[lang].days[D],
+ m: m + 1,
+ mm: zeropad(m + 1),
+ mmm: LABELS[lang].shortMonths[m],
+ mmmm: LABELS[lang].months[m],
+ yy: String(y).slice(2),
+ yyyy: y
+ };
+
+ var ret = fmt.replace(Re, function ($0) {
+ return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
+ });
+
+ // a small trick to handle special characters
+ return tmpTag.html(ret).html();
+
+ }
+
+ function integer(val) {
+ return parseInt(val, 10);
+ }
+
+ function isSameDay(d1, d2) {
+ return d1.getFullYear() === d2.getFullYear() &&
+ d1.getMonth() == d2.getMonth() &&
+ d1.getDate() == d2.getDate();
+ }
+
+ function parseDate(val) {
+
+ if (val === undefined) { return; }
+ if (val.constructor == Date) { return val; }
+
+ if (typeof val == 'string') {
+
+ // rfc3339?
+ var els = val.split("-");
+ if (els.length == 3) {
+ return new Date(integer(els[0]), integer(els[1]) -1, integer(els[2]));
+ }
+
+ // invalid offset
+ if ( !(/^-?\d+$/).test(val) ) { return; }
+
+ // convert to integer
+ val = integer(val);
+ }
+
+ var date = new Date;
+ date.setDate(date.getDate() + val);
+ return date;
+ }
+
+//}}}
+
+
+ function Dateinput(input, conf) {
+
+ // variables
+ var self = this,
+ now = new Date,
+ yearNow = now.getFullYear(),
+ css = conf.css,
+ labels = LABELS[conf.lang],
+ root = $("#" + css.root),
+ title = root.find("#" + css.title),
+ trigger,
+ pm, nm,
+ currYear, currMonth, currDay,
+ value = input.attr("data-value") || conf.value || input.val(),
+ min = input.attr("min") || conf.min,
+ max = input.attr("max") || conf.max,
+ opened,
+ original;
+
+ // zero min is not undefined
+ if (min === 0) { min = "0"; }
+
+ // use sane values for value, min & max
+ value = parseDate(value) || now;
+
+ min = parseDate(min || new Date(yearNow + conf.yearRange[0], 1, 1));
+ max = parseDate(max || new Date( yearNow + conf.yearRange[1]+ 1, 1, -1));
+
+
+ // check that language exists
+ if (!labels) { throw "Dateinput: invalid language: " + conf.lang; }
+
+ // Replace built-in date input: NOTE: input.attr("type", "text") throws exception by the browser
+ if (input.attr("type") == 'date') {
+ var original = input.clone(),
+ def = original.wrap("<div/>").parent().html(),
+ clone = $(def.replace(/type/i, "type=text data-orig-type"));
+
+ if (conf.value) clone.val(conf.value); // jquery 1.6.2 val(undefined) will clear val()
+
+ input.replaceWith(clone);
+ input = clone;
+ }
+
+ input.addClass(css.input);
+
+ var fire = input.add(self);
+
+ // construct layout
+ if (!root.length) {
+
+ // root
+ root = $('<div><div><a/><div/><a/></div><div><div/><div/></div></div>')
+ .hide().css({position: 'absolute'}).attr("id", css.root);
+
+ // elements
+ root.children()
+ .eq(0).attr("id", css.head).end()
+ .eq(1).attr("id", css.body).children()
+ .eq(0).attr("id", css.days).end()
+ .eq(1).attr("id", css.weeks).end().end().end()
+ .find("a").eq(0).attr("id", css.prev).end().eq(1).attr("id", css.next);
+
+ // title
+ title = root.find("#" + css.head).find("div").attr("id", css.title);
+
+ // year & month selectors
+ if (conf.selectors) {
+ var monthSelector = $("<select/>").attr("id", css.month),
+ yearSelector = $("<select/>").attr("id", css.year);
+ title.html(monthSelector.add(yearSelector));
+ }
+
+ // day titles
+ var days = root.find("#" + css.days);
+
+ // days of the week
+ for (var d = 0; d < 7; d++) {
+ days.append($("<span/>").text(labels.shortDays[(d + conf.firstDay) % 7]));
+ }
+
+ $("body").append(root);
+ }
+
+
+ // trigger icon
+ if (conf.trigger) {
+ trigger = $("<a/>").attr("href", "#").addClass(css.trigger).click(function(e) {
+ conf.toggle ? self.toggle() : self.show();
+ return e.preventDefault();
+ }).insertAfter(input);
+ }
+
+
+ // layout elements
+ var weeks = root.find("#" + css.weeks);
+ yearSelector = root.find("#" + css.year);
+ monthSelector = root.find("#" + css.month);
+
+
+//{{{ pick
+
+ function select(date, conf, e) {
+
+ // current value
+ value = date;
+ currYear = date.getFullYear();
+ currMonth = date.getMonth();
+ currDay = date.getDate();
+
+ // focus the input after selection (doesn't work in IE)
+ if (e.type == "click" && !$.browser.msie) {
+ input.focus();
+ }
+
+ // beforChange
+ e = e || $.Event("api");
+ e.type = "beforeChange";
+
+ fire.trigger(e, [date]);
+ if (e.isDefaultPrevented()) { return; }
+
+ // formatting
+ input.val(format(date, conf.format, conf.lang));
+
+ // change
+ e.type = "change";
+ fire.trigger(e);
+
+ // store value into input
+ input.data("date", date);
+
+ self.hide(e);
+ }
+//}}}
+
+
+//{{{ onShow
+
+ function onShow(ev) {
+
+ ev.type = "onShow";
+ fire.trigger(ev);
+
+ $(document).bind("keydown.d", function(e) {
+
+ if (e.ctrlKey) { return true; }
+ var key = e.keyCode;
+
+ // backspace or delete clears the value
+ if (key == 8 || key == 46) {
+ input.val("");
+ return self.hide(e);
+ }
+
+ // esc or tab key exits
+ if (key == 27 || key == 9) { return self.hide(e); }
+
+ if ($(KEYS).index(key) >= 0) {
+
+ if (!opened) {
+ self.show(e);
+ return e.preventDefault();
+ }
+
+ var days = $("#" + css.weeks + " a"),
+ el = $("." + css.focus),
+ index = days.index(el);
+
+ el.removeClass(css.focus);
+
+ if (key == 74 || key == 40) { index += 7; }
+ else if (key == 75 || key == 38) { index -= 7; }
+ else if (key == 76 || key == 39) { index += 1; }
+ else if (key == 72 || key == 37) { index -= 1; }
+
+
+ if (index > 41) {
+ self.addMonth();
+ el = $("#" + css.weeks + " a:eq(" + (index-42) + ")");
+ } else if (index < 0) {
+ self.addMonth(-1);
+ el = $("#" + css.weeks + " a:eq(" + (index+42) + ")");
+ } else {
+ el = days.eq(index);
+ }
+
+ el.addClass(css.focus);
+ return e.preventDefault();
+
+ }
+
+ // pageUp / pageDown
+ if (key == 34) { return self.addMonth(); }
+ if (key == 33) { return self.addMonth(-1); }
+
+ // home
+ if (key == 36) { return self.today(); }
+
+ // enter
+ if (key == 13) {
+ if (!$(e.target).is("select")) {
+ $("." + css.focus).click();
+ }
+ }
+
+ return $([16, 17, 18, 9]).index(key) >= 0;
+ });
+
+
+ // click outside dateinput
+ $(document).bind("click.d", function(e) {
+ var el = e.target;
+
+ if (!$(el).parents("#" + css.root).length && el != input[0] && (!trigger || el != trigger[0])) {
+ self.hide(e);
+ }
+
+ });
+ }
+//}}}
+
+
+ $.extend(self, {
+
+
+ /**
+ * @public
+ * Show the calendar
+ */
+ show: function(e) {
+
+ if (input.attr("readonly") || input.attr("disabled") || opened) { return; }
+
+ // onBeforeShow
+ e = e || $.Event();
+ e.type = "onBeforeShow";
+ fire.trigger(e);
+ if (e.isDefaultPrevented()) { return; }
+
+ $.each(instances, function() {
+ this.hide();
+ });
+
+ opened = true;
+
+ // month selector
+ monthSelector.unbind("change").change(function() {
+ self.setValue(yearSelector.val(), $(this).val());
+ });
+
+ // year selector
+ yearSelector.unbind("change").change(function() {
+ self.setValue($(this).val(), monthSelector.val());
+ });
+
+ // prev / next month
+ pm = root.find("#" + css.prev).unbind("click").click(function(e) {
+ if (!pm.hasClass(css.disabled)) {
+ self.addMonth(-1);
+ }
+ return false;
+ });
+
+ nm = root.find("#" + css.next).unbind("click").click(function(e) {
+ if (!nm.hasClass(css.disabled)) {
+ self.addMonth();
+ }
+ return false;
+ });
+
+ // set date
+ self.setValue(value);
+
+ // show calendar
+ var pos = input.offset();
+
+ // iPad position fix
+ if (/iPad/i.test(navigator.userAgent)) {
+ pos.top -= $(window).scrollTop();
+ }
+
+ root.css({
+ top: pos.top + input.outerHeight({margins: true}) + conf.offset[0],
+ left: pos.left + conf.offset[1]
+ });
+
+ if (conf.speed) {
+ root.show(conf.speed, function() {
+ onShow(e);
+ });
+ } else {
+ root.show();
+ onShow(e);
+ }
+
+ return self;
+ },
+
+ /**
+ * @public
+ *
+ * Set the value of the dateinput
+ */
+ setValue: function(year, month, day) {
+
+ var date = integer(month) >= -1 ? new Date(integer(year), integer(month), integer(day == undefined || isNaN(day) ? 1 : day)) :
+ year || value;
+
+ if (date < min) { date = min; }
+ else if (date > max) { date = max; }
+
+ // date given as ISO string
+ if (typeof year == 'string') { date = parseDate(year); }
+
+ year = date.getFullYear();
+ month = date.getMonth();
+ day = date.getDate();
+
+
+ // roll year & month
+ if (month == -1) {
+ month = 11;
+ year--;
+ } else if (month == 12) {
+ month = 0;
+ year++;
+ }
+
+ if (!opened) {
+ select(date, conf);
+ return self;
+ }
+
+ currMonth = month;
+ currYear = year;
+ currDay = day;
+
+ // variables
+ var tmp = new Date(year, month, 1 - conf.firstDay), begin = tmp.getDay(),
+ days = dayAm(year, month),
+ prevDays = dayAm(year, month - 1),
+ week;
+
+ // selectors
+ if (conf.selectors) {
+
+ // month selector
+ monthSelector.empty();
+ $.each(labels.months, function(i, m) {
+ if (min < new Date(year, i + 1, 1) && max > new Date(year, i, 0)) {
+ monthSelector.append($("<option/>").html(m).attr("value", i));
+ }
+ });
+
+ // year selector
+ yearSelector.empty();
+ var yearNow = now.getFullYear();
+
+ for (var i = yearNow + conf.yearRange[0]; i < yearNow + conf.yearRange[1]; i++) {
+ if (min < new Date(i + 1, 0, 1) && max > new Date(i, 0, 0)) {
+ yearSelector.append($("<option/>").text(i));
+ }
+ }
+
+ monthSelector.val(month);
+ yearSelector.val(year);
+
+ // title
+ } else {
+ title.html(labels.months[month] + " " + year);
+ }
+
+ // populate weeks
+ weeks.empty();
+ pm.add(nm).removeClass(css.disabled);
+
+ // !begin === "sunday"
+ for (var j = !begin ? -7 : 0, a, num; j < (!begin ? 35 : 42); j++) {
+
+ a = $("<a/>");
+
+ if (j % 7 === 0) {
+ week = $("<div/>").addClass(css.week);
+ weeks.append(week);
+ }
+
+ if (j < begin) {
+ a.addClass(css.off);
+ num = prevDays - begin + j + 1;
+ date = new Date(year, month-1, num);
+
+ } else if (j >= begin + days) {
+ a.addClass(css.off);
+ num = j - days - begin + 1;
+ date = new Date(year, month+1, num);
+
+ } else {
+ num = j - begin + 1;
+ date = new Date(year, month, num);
+
+ // current date
+ if (isSameDay(value, date)) {
+ a.attr("id", css.current).addClass(css.focus);
+
+ // today
+ } else if (isSameDay(now, date)) {
+ a.attr("id", css.today);
+ }
+ }
+
+ // disabled
+ if (min && date < min) {
+ a.add(pm).addClass(css.disabled);
+ }
+
+ if (max && date > max) {
+ a.add(nm).addClass(css.disabled);
+ }
+
+ a.attr("href", "#" + num).text(num).data("date", date);
+
+ week.append(a);
+ }
+
+ // date picking
+ weeks.find("a").click(function(e) {
+ var el = $(this);
+ if (!el.hasClass(css.disabled)) {
+ $("#" + css.current).removeAttr("id");
+ el.attr("id", css.current);
+ select(el.data("date"), conf, e);
+ }
+ return false;
+ });
+
+ // sunday
+ if (css.sunday) {
+ weeks.find(css.week).each(function() {
+ var beg = conf.firstDay ? 7 - conf.firstDay : 0;
+ $(this).children().slice(beg, beg + 1).addClass(css.sunday);
+ });
+ }
+
+ return self;
+ },
+ //}}}
+
+ setMin: function(val, fit) {
+ min = parseDate(val);
+ if (fit && value < min) { self.setValue(min); }
+ return self;
+ },
+
+ setMax: function(val, fit) {
+ max = parseDate(val);
+ if (fit && value > max) { self.setValue(max); }
+ return self;
+ },
+
+ today: function() {
+ return self.setValue(now);
+ },
+
+ addDay: function(amount) {
+ return this.setValue(currYear, currMonth, currDay + (amount || 1));
+ },
+
+ addMonth: function(amount) {
+ var targetMonth = currMonth + (amount || 1),
+ daysInTargetMonth = dayAm(currYear, targetMonth),
+ targetDay = currDay <= daysInTargetMonth ? currDay : daysInTargetMonth;
+
+ return this.setValue(currYear, targetMonth, targetDay);
+ },
+
+ addYear: function(amount) {
+ return this.setValue(currYear + (amount || 1), currMonth, currDay);
+ },
+
+ destroy: function() {
+ input.add(document).unbind("click.d").unbind("keydown.d");
+ root.add(trigger).remove();
+ input.removeData("dateinput").removeClass(css.input);
+ if (original) { input.replaceWith(original); }
+ },
+
+ hide: function(e) {
+
+ if (opened) {
+
+ // onHide
+ e = $.Event();
+ e.type = "onHide";
+ fire.trigger(e);
+
+ // cancelled ?
+ if (e.isDefaultPrevented()) { return; }
+
+ $(document).unbind("click.d").unbind("keydown.d");
+
+ // do the hide
+ root.hide();
+ opened = false;
+ }
+
+ return self;
+ },
+
+ toggle: function(){
+ return self.isOpen() ? self.hide() : self.show();
+ },
+
+ getConf: function() {
+ return conf;
+ },
+
+ getInput: function() {
+ return input;
+ },
+
+ getCalendar: function() {
+ return root;
+ },
+
+ getValue: function(dateFormat) {
+ return dateFormat ? format(value, dateFormat, conf.lang) : value;
+ },
+
+ isOpen: function() {
+ return opened;
+ }
+
+ });
+
+ // callbacks
+ $.each(['onBeforeShow','onShow','change','onHide'], function(i, name) {
+
+ // configuration
+ if ($.isFunction(conf[name])) {
+ $(self).bind(name, conf[name]);
+ }
+
+ // API methods
+ self[name] = function(fn) {
+ if (fn) { $(self).bind(name, fn); }
+ return self;
+ };
+ });
+
+ if (!conf.editable) {
+
+ // show dateinput & assign keyboard shortcuts
+ input.bind("focus.d click.d", self.show).keydown(function(e) {
+
+ var key = e.keyCode;
+
+ // open dateinput with navigation keyw
+ if (!opened && $(KEYS).index(key) >= 0) {
+ self.show(e);
+ return e.preventDefault();
+
+ // clear value on backspace or delete
+ } else if (key == 8 || key == 46) {
+ input.val("");
+ }
+
+ // allow tab
+ return e.shiftKey || e.ctrlKey || e.altKey || key == 9 ? true : e.preventDefault();
+
+ });
+ }
+
+ // initial value
+ if (parseDate(input.val())) {
+ select(value, conf);
+ }
+
+ }
+
+ $.expr[':'].date = function(el) {
+ var type = el.getAttribute("type");
+ return type && type == 'date' || !!$(el).data("dateinput");
+ };
+
+
+ $.fn.dateinput = function(conf) {
+
+ // already instantiated
+ if (this.data("dateinput")) { return this; }
+
+ // configuration
+ conf = $.extend(true, {}, tool.conf, conf);
+
+ // CSS prefix
+ $.each(conf.css, function(key, val) {
+ if (!val && key != 'prefix') {
+ conf.css[key] = (conf.css.prefix || '') + (val || key);
+ }
+ });
+
+ var els;
+
+ this.each(function() {
+ var el = new Dateinput($(this), conf);
+ instances.push(el);
+ var input = el.getInput().data("dateinput", el);
+ els = els ? els.add(input) : input;
+ });
+
+ return els ? els : this;
+ };
+
+
+}) (jQuery);
+
+
View
39 assets/javascripts/jquery.tools.min.js
@@ -0,0 +1,39 @@
+/*!
+ * jQuery Tools v1.2.6 - The missing UI library for the Web
+ *
+ * dateinput/dateinput.js
+ * overlay/overlay.js
+ * rangeinput/rangeinput.js
+ * scrollable/scrollable.js
+ * tabs/tabs.js
+ * toolbox/toolbox.expose.js
+ * toolbox/toolbox.flashembed.js
+ * toolbox/toolbox.history.js
+ * toolbox/toolbox.mousewheel.js
+ * tooltip/tooltip.js
+ * validator/validator.js
+ *
+ * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
+ *
+ * http://flowplayer.org/tools/
+ *
+ * jquery.event.wheel.js - rev 1
+ * Copyright (c) 2008, Three Dub Media (http://threedubmedia.com)
+ * Liscensed under the MIT License (MIT-LICENSE.txt)
+ * http://www.opensource.org/licenses/mit-license.php
+ * Created: 2008-07-01 | Updated: 2008-07-14
+ *
+ * -----
+ *
+ */
+(function(a,b){a.tools=a.tools||{version:"v1.2.6"};var c=[],d,e=[75,76,38,39,74,72,40,37],f={};d=a.tools.dateinput={conf:{format:"mm/dd/yy",selectors:!1,yearRange:[-5,5],lang:"en",offset:[0,0],speed:0,firstDay:0,min:b,max:b,trigger:0,toggle:0,editable:0,css:{prefix:"cal",input:"date",root:0,head:0,title:0,prev:0,next:0,month:0,year:0,days:0,body:0,weeks:0,today:0,current:0,week:0,off:0,sunday:0,focus:0,disabled:0,trigger:0}},localize:function(b,c){a.each(c,function(a,b){c[a]=b.split(",")}),f[b]=c}},d.localize("en",{months:"January,February,March,April,May,June,July,August,September,October,November,December",shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",days:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",shortDays:"Sun,Mon,Tue,Wed,Thu,Fri,Sat"});function g(a,b){return(new Date(a,b+1,0)).getDate()}function h(a,b){a=""+a,b=b||2;while(a.length<b)a="0"+a;return a}var i=/d{1,4}|m{1,4}|yy(?:yy)?|"[^"]*"|'[^']*'/g,j=a("<a/>");function k(a,b,c){var d=a.getDate(),e=a.getDay(),g=a.getMonth(),k=a.getFullYear(),l={d:d,dd:h(d),ddd:f[c].shortDays[e],dddd:f[c].days[e],m:g+1,mm:h(g+1),mmm:f[c].shortMonths[g],mmmm:f[c].months[g],yy:String(k).slice(2),yyyy:k},m=b.replace(i,function(a){return a in l?l[a]:a.slice(1,a.length-1)});return j.html(m).html()}function l(a){return parseInt(a,10)}function m(a,b){return a.getFullYear()===b.getFullYear()&&a.getMonth()==b.getMonth()&&a.getDate()==b.getDate()}function n(a){if(a!==b){if(a.constructor==Date)return a;if(typeof a=="string"){var c=a.split("-");if(c.length==3)return new Date(l(c[0]),l(c[1])-1,l(c[2]));if(!/^-?\d+$/.test(a))return;a=l(a)}var d=new Date;d.setDate(d.getDate()+a);return d}}function o(d,h){var i=this,j=new Date,o=j.getFullYear(),p=h.css,q=f[h.lang],r=a("#"+p.root),s=r.find("#"+p.title),t,u,v,w,x,y,z=d.attr("data-value")||h.value||d.val(),A=d.attr("min")||h.min,B=d.attr("max")||h.max,C,D;A===0&&(A="0"),z=n(z)||j,A=n(A||new Date(o+h.yearRange[0],1,1)),B=n(B||new Date(o+h.yearRange[1]+1,1,-1));if(!q)throw"Dateinput: invalid language: "+h.lang;if(d.attr("type")=="date"){var D=d.clone(),E=D.wrap("<div/>").parent().html(),F=a(E.replace(/type/i,"type=text data-orig-type"));h.value&&F.val(h.value),d.replaceWith(F),d=F}d.addClass(p.input);var G=d.add(i);if(!r.length){r=a("<div><div><a/><div/><a/></div><div><div/><div/></div></div>").hide().css({position:"absolute"}).attr("id",p.root),r.children().eq(0).attr("id",p.head).end().eq(1).attr("id",p.body).children().eq(0).attr("id",p.days).end().eq(1).attr("id",p.weeks).end().end().end().find("a").eq(0).attr("id",p.prev).end().eq(1).attr("id",p.next),s=r.find("#"+p.head).find("div").attr("id",p.title);if(h.selectors){var H=a("<select/>").attr("id",p.month),I=a("<select/>").attr("id",p.year);s.html(H.add(I))}var J=r.find("#"+p.days);for(var K=0;K<7;K++)J.append(a("<span/>").text(q.shortDays[(K+h.firstDay)%7]));a("body").append(r)}h.trigger&&(t=a("<a/>").attr("href","#").addClass(p.trigger).click(function(a){h.toggle?i.toggle():i.show();return a.preventDefault()}).insertAfter(d));var L=r.find("#"+p.weeks);I=r.find("#"+p.year),H=r.find("#"+p.month);function M(b,c,e){z=b,w=b.getFullYear(),x=b.getMonth(),y=b.getDate(),e=e||a.Event("api"),e.type="beforeChange",G.trigger(e,[b]);e.isDefaultPrevented()||(d.val(k(b,c.format,c.lang)),e.type="change",G.trigger(e),d.data("date",b),i.hide(e))}function N(b){b.type="onShow",G.trigger(b),a(document).bind("keydown.d",function(b){if(b.ctrlKey)return!0;var c=b.keyCode;if(c==8){d.val("");return i.hide(b)}if(c==27||c==9)return i.hide(b);if(a(e).index(c)>=0){if(!C){i.show(b);return b.preventDefault()}var f=a("#"+p.weeks+" a"),g=a("."+p.focus),h=f.index(g);g.removeClass(p.focus);if(c==74||c==40)h+=7;else if(c==75||c==38)h-=7;else if(c==76||c==39)h+=1;else if(c==72||c==37)h-=1;h>41?(i.addMonth(),g=a("#"+p.weeks+" a:eq("+(h-42)+")")):h<0?(i.addMonth(-1),g=a("#"+p.weeks+" a:eq("+(h+42)+")")):g=f.eq(h),g.addClass(p.focus);return b.preventDefault()}if(c==34)return i.addMonth();if(c==33)return i.addMonth(-1);if(c==36)return i.today();c==13&&(a(b.target).is("select")||a("."+p.focus).click());return a([16,17,18,9]).index(c)>=0}),a(document).bind("click.d",function(b){var c=b.target;!a(c).parents("#"+p.root).length&&c!=d[0]&&(!t||c!=t[0])&&i.hide(b)})}a.extend(i,{show:function(b){if(!(d.attr("readonly")||d.attr("disabled")||C)){b=b||a.Event(),b.type="onBeforeShow",G.trigger(b);if(b.isDefaultPrevented())return;a.each(c,function(){this.hide()}),C=!0,H.unbind("change").change(function(){i.setValue(I.val(),a(this).val())}),I.unbind("change").change(function(){i.setValue(a(this).val(),H.val())}),u=r.find("#"+p.prev).unbind("click").click(function(a){u.hasClass(p.disabled)||i.addMonth(-1);return!1}),v=r.find("#"+p.next).unbind("click").click(function(a){v.hasClass(p.disabled)||i.addMonth();return!1}),i.setValue(z);var e=d.offset();/iPad/i.test(navigator.userAgent)&&(e.top-=a(window).scrollTop()),r.css({top:e.top+d.outerHeight({margins:!0})+h.offset[0],left:e.left+h.offset[1]}),h.speed?r.show(h.speed,function(){N(b)}):(r.show(),N(b));return i}},setValue:function(c,d,e){var f=l(d)>=-1?new Date(l(c),l(d),l(e==b||isNaN(e)?1:e)):c||z;f<A?f=A:f>B&&(f=B),typeof c=="string"&&(f=n(c)),c=f.getFullYear(),d=f.getMonth(),e=f.getDate(),d==-1?(d=11,c--):d==12&&(d=0,c++);if(!C){M(f,h);return i}x=d,w=c,y=e;var k=new Date(c,d,1-h.firstDay),o=k.getDay(),r=g(c,d),t=g(c,d-1),D;if(h.selectors){H.empty(),a.each(q.months,function(b,d){A<new Date(c,b+1,1)&&B>new Date(c,b,0)&&H.append(a("<option/>").html(d).attr("value",b))}),I.empty();var E=j.getFullYear();for(var F=E+h.yearRange[0];F<E+h.yearRange[1];F++)A<new Date(F+1,0,1)&&B>new Date(F,0,0)&&I.append(a("<option/>").text(F));H.val(d),I.val(c)}else s.html(q.months[d]+" "+c);L.empty(),u.add(v).removeClass(p.disabled);for(var G=o?0:-7,J,K;G<(o?42:35);G++)J=a("<a/>"),G%7===0&&(D=a("<div/>").addClass(p.week),L.append(D)),G<o?(J.addClass(p.off),K=t-o+G+1,f=new Date(c,d-1,K)):G<o+r?(K=G-o+1,f=new Date(c,d,K),m(z,f)?J.attr("id",p.current).addClass(p.focus):m(j,f)&&J.attr("id",p.today)):(J.addClass(p.off),K=G-r-o+1,f=new Date(c,d+1,K)),A&&f<A&&J.add(u).addClass(p.disabled),B&&f>B&&J.add(v).addClass(p.disabled),J.attr("href","#"+K).text(K).data("date",f),D.append(J);L.find("a").click(function(b){var c=a(this);c.hasClass(p.disabled)||(a("#"+p.current).removeAttr("id"),c.attr("id",p.current),M(c.data("date"),h,b));return!1}),p.sunday&&L.find(p.week).each(function(){var b=h.firstDay?7-h.firstDay:0;a(this).children().slice(b,b+1).addClass(p.sunday)});return i},setMin:function(a,b){A=n(a),b&&z<A&&i.setValue(A);return i},setMax:function(a,b){B=n(a),b&&z>B&&i.setValue(B);return i},today:function(){return i.setValue(j)},addDay:function(a){return this.setValue(w,x,y+(a||1))},addMonth:function(a){var b=x+(a||1),c=g(w,b),d=y<=c?y:c;return this.setValue(w,b,d)},addYear:function(a){return this.setValue(w+(a||1),x,y)},destroy:function(){d.add(document).unbind("click.d").unbind("keydown.d"),r.add(t).remove(),d.removeData("dateinput").removeClass(p.input),D&&d.replaceWith(D)},hide:function(b){if(C){b=a.Event(),b.type="onHide",G.trigger(b),a(document).unbind("click.d").unbind("keydown.d");if(b.isDefaultPrevented())return;r.hide(),C=!1}return i},toggle:function(){return i.isOpen()?i.hide():i.show()},getConf:function(){return h},getInput:function(){return d},getCalendar:function(){return r},getValue:function(a){return a?k(z,a,h.lang):z},isOpen:function(){return C}}),a.each(["onBeforeShow","onShow","change","onHide"],function(b,c){a.isFunction(h[c])&&a(i).bind(c,h[c]),i[c]=function(b){b&&a(i).bind(c,b);return i}}),h.editable||d.bind("focus.d click.d",i.show).keydown(function(b){var c=b.keyCode;if(!C&&a(e).index(c)>=0){i.show(b);return b.preventDefault()}return b.shiftKey||b.ctrlKey||b.altKey||c==9?!0:b.preventDefault()}),n(d.val())&&M(z,h)}a.expr[":"].date=function(b){var c=b.getAttribute("type");return c&&c=="date"||a(b).data("dateinput")},a.fn.dateinput=function(b){if(this.data("dateinput"))return this;b=a.extend(!0,{},d.conf,b),a.each(b.css,function(a,c){!c&&a!="prefix"&&(b.css[a]=(b.css.prefix||"")+(c||a))});var e;this.each(function(){var d=new o(a(this),b);c.push(d);var f=d.getInput().data("dateinput",d);e=e?e.add(f):f});return e?e:this}})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.6"},a.tools.overlay={addEffect:function(a,b,d){c[a]=[b,d]},conf:{close:null,closeOnClick:!0,closeOnEsc:!0,closeSpeed:"fast",effect:"default",fixed:!a.browser.msie||a.browser.version>6,left:"center",load:!1,mask:null,oneInstance:!0,speed:"normal",target:null,top:"10%"}};var b=[],c={};a.tools.overlay.addEffect("default",function(b,c){var d=this.getConf(),e=a(window);d.fixed||(b.top+=e.scrollTop(),b.left+=e.scrollLeft()),b.position=d.fixed?"fixed":"absolute",this.getOverlay().css(b).fadeIn(d.speed,c)},function(a){this.getOverlay().fadeOut(this.getConf().closeSpeed,a)});function d(d,e){var f=this,g=d.add(f),h=a(window),i,j,k,l=a.tools.expose&&(e.mask||e.expose),m=Math.random().toString().slice(10);l&&(typeof l=="string"&&(l={color:l}),l.closeOnClick=l.closeOnEsc=!1);var n=e.target||d.attr("rel");j=n?a(n):null||d;if(!j.length)throw"Could not find Overlay: "+n;d&&d.index(j)==-1&&d.click(function(a){f.load(a);return a.preventDefault()}),a.extend(f,{load:function(d){if(f.isOpened())return f;var i=c[e.effect];if(!i)throw"Overlay: cannot find effect : \""+e.effect+"\"";e.oneInstance&&a.each(b,function(){this.close(d)}),d=d||a.Event(),d.type="onBeforeLoad",g.trigger(d);if(d.isDefaultPrevented())return f;k=!0,l&&a(j).expose(l);var n=e.top,o=e.left,p=j.outerWidth({margin:!0}),q=j.outerHeight({margin:!0});typeof n=="string"&&(n=n=="center"?Math.max((h.height()-q)/2,0):parseInt(n,10)/100*h.height()),o=="center"&&(o=Math.max((h.width()-p)/2,0)),i[0].call(f,{top:n,left:o},function(){k&&(d.type="onLoad",g.trigger(d))}),l&&e.closeOnClick&&a.mask.getMask().one("click",f.close),e.closeOnClick&&a(document).bind("click."+m,function(b){a(b.target).parents(j).length||f.close(b)}),e.closeOnEsc&&a(document).bind("keydown."+m,function(a){a.keyCode==27&&f.close(a)});return f},close:function(b){if(!f.isOpened())return f;b=b||a.Event(),b.type="onBeforeClose",g.trigger(b);if(!b.isDefaultPrevented()){k=!1,c[e.effect][1].call(f,function(){b.type="onClose",g.trigger(b)}),a(document).unbind("click."+m).unbind("keydown."+m),l&&a.mask.close();return f}},getOverlay:function(){return j},getTrigger:function(){return d},getClosers:function(){return i},isOpened:function(){return k},getConf:function(){return e}}),a.each("onBeforeLoad,onStart,onLoad,onBeforeClose,onClose".split(","),function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}}),i=j.find(e.close||".close"),!i.length&&!e.close&&(i=a("<a class=\"close\"></a>"),j.prepend(i)),i.click(function(a){f.close(a)}),e.load&&f.load()}a.fn.overlay=function(c){var e=this.data("overlay");if(e)return e;a.isFunction(c)&&(c={onBeforeLoad:c}),c=a.extend(!0,{},a.tools.overlay.conf,c),this.each(function(){e=new d(a(this),c),b.push(e),a(this).data("overlay",e)});return c.api?e:this}})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.6"};var b;b=a.tools.rangeinput={conf:{min:0,max:100,step:"any",steps:0,value:0,precision:undefined,vertical:0,keyboard:!0,progress:!1,speed:100,css:{input:"range",slider:"slider",progress:"progress",handle:"handle"}}};var c,d;a.fn.drag=function(b){document.ondragstart=function(){return!1},b=a.extend({x:!0,y:!0,drag:!0},b),c=c||a(document).bind("mousedown mouseup",function(e){var f=a(e.target);if(e.type=="mousedown"&&f.data("drag")){var g=f.position(),h=e.pageX-g.left,i=e.pageY-g.top,j=!0;c.bind("mousemove.drag",function(a){var c=a.pageX-h,e=a.pageY-i,g={};b.x&&(g.left=c),b.y&&(g.top=e),j&&(f.trigger("dragStart"),j=!1),b.drag&&f.css(g),f.trigger("drag",[e,c]),d=f}),e.preventDefault()}else try{d&&d.trigger("dragEnd")}finally{c.unbind("mousemove.drag"),d=null}});return this.data("drag",!0)};function e(a,b){var c=Math.pow(10,b);return Math.round(a*c)/c}function f(a,b){var c=parseInt(a.css(b),10);if(c)return c;var d=a[0].currentStyle;return d&&d.width&&parseInt(d.width,10)}function g(a){var b=a.data("events");return b&&b.onSlide}function h(b,c){var d=this,h=c.css,i=a("<div><div/><a href='#'/></div>").data("rangeinput",d),j,k,l,m,n;b.before(i);var o=i.addClass(h.slider).find("a").addClass(h.handle),p=i.find("div").addClass(h.progress);a.each("min,max,step,value".split(","),function(a,d){var e=b.attr(d);parseFloat(e)&&(c[d]=parseFloat(e,10))});var q=c.max-c.min,r=c.step=="any"?0:c.step,s=c.precision;if(s===undefined)try{s=r.toString().split(".")[1].length}catch(t){s=0}if(b.attr("type")=="range"){var u=b.clone().wrap("<div/>").parent().html(),v=a(u.replace(/type/i,"type=text data-orig-type"));v.val(c.value),b.replaceWith(v),b=v}b.addClass(h.input);var w=a(d).add(b),x=!0;function y(a,f,g,h){g===undefined?g=f/m*q:h&&(g-=c.min),r&&(g=Math.round(g/r)*r);if(f===undefined||r)f=g*m/q;if(isNaN(g))return d;f=Math.max(0,Math.min(f,m)),g=f/m*q;if(h||!j)g+=c.min;j&&(h?f=m-f:g=c.max-g),g=e(g,s);var i=a.type=="click";if(x&&k!==undefined&&!i){a.type="onSlide",w.trigger(a,[g,f]);if(a.isDefaultPrevented())return d}var l=i?c.speed:0,t=i?function(){a.type="change",w.trigger(a,[g])}:null;j?(o.animate({top:f},l,t),c.progress&&p.animate({height:m-f+o.height()/2},l)):(o.animate({left:f},l,t),c.progress&&p.animate({width:f+o.width()/2},l)),k=g,n=f,b.val(g);return d}a.extend(d,{getValue:function(){return k},setValue:function(b,c){z();return y(c||a.Event("api"),undefined,b,!0)},getConf:function(){return c},getProgress:function(){return p},getHandle:function(){return o},getInput:function(){return b},step:function(b,e){e=e||a.Event();var f=c.step=="any"?1:c.step;d.setValue(k+f*(b||1),e)},stepUp:function(a){return d.step(a||1)},stepDown:function(a){return d.step(-a||-1)}}),a.each("onSlide,change".split(","),function(b,e){a.isFunction(c[e])&&a(d).bind(e,c[e]),d[e]=function(b){b&&a(d).bind(e,b);return d}}),o.drag({drag:!1}).bind("dragStart",function(){z(),x=g(a(d))||g(b)}).bind("drag",function(a,c,d){if(b.is(":disabled"))return!1;y(a,j?c:d)}).bind("dragEnd",function(a){a.isDefaultPrevented()||(a.type="change",w.trigger(a,[k]))}).click(function(a){return a.preventDefault()}),i.click(function(a){if(b.is(":disabled")||a.target==o[0])return a.preventDefault();z();var c=j?o.height()/2:o.width()/2;y(a,j?m-l-c+a.pageY:a.pageX-l-c)}),c.keyboard&&b.keydown(function(c){if(!b.attr("readonly")){var e=c.keyCode,f=a([75,76,38,33,39]).index(e)!=-1,g=a([74,72,40,34,37]).index(e)!=-1;if((f||g)&&!(c.shiftKey||c.altKey||c.ctrlKey)){f?d.step(e==33?10:1,c):g&&d.step(e==34?-10:-1,c);return c.preventDefault()}}}),b.blur(function(b){var c=a(this).val();c!==k&&d.setValue(c,b)}),a.extend(b[0],{stepUp:d.stepUp,stepDown:d.stepDown});function z(){j=c.vertical||f(i,"height")>f(i,"width"),j?(m=f(i,"height")-f(o,"height"),l=i.offset().top+m):(m=f(i,"width")-f(o,"width"),l=i.offset().left)}function A(){z(),d.setValue(c.value!==undefined?c.value:c.min)}A(),m||a(window).load(A)}a.expr[":"].range=function(b){var c=b.getAttribute("type");return c&&c=="range"||a(b).filter("input").data("rangeinput")},a.fn.rangeinput=function(c){if(this.data("rangeinput"))return this;c=a.extend(!0,{},b.conf,c);var d;this.each(function(){var b=new h(a(this),a.extend(!0,{},c)),e=b.getInput().data("rangeinput",b);d=d?d.add(e):e});return d?d:this}})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.6"},a.tools.scrollable={conf:{activeClass:"active",circular:!1,clonedClass:"cloned",disabledClass:"disabled",easing:"swing",initialIndex:0,item:"> *",items:".items",keyboard:!0,mousewheel:!1,next:".next",prev:".prev",size:1,speed:400,vertical:!1,touch:!0,wheelSpeed:0}};function b(a,b){var c=parseInt(a.css(b),10);if(c)return c;var d=a[0].currentStyle;return d&&d.width&&parseInt(d.width,10)}function c(b,c){var d=a(c);return d.length<2?d:b.parent().find(c)}var d;function e(b,e){var f=this,g=b.add(f),h=b.children(),i=0,j=e.vertical;d||(d=f),h.length>1&&(h=a(e.items,b)),e.size>1&&(e.circular=!1),a.extend(f,{getConf:function(){return e},getIndex:function(){return i},getSize:function(){return f.getItems().size()},getNaviButtons:function(){return n.add(o)},getRoot:function(){return b},getItemWrap:function(){return h},getItems:function(){return h.find(e.item).not("."+e.clonedClass)},move:function(a,b){return f.seekTo(i+a,b)},next:function(a){return f.move(e.size,a)},prev:function(a){return f.move(-e.size,a)},begin:function(a){return f.seekTo(0,a)},end:function(a){return f.seekTo(f.getSize()-1,a)},focus:function(){d=f;return f},addItem:function(b){b=a(b),e.circular?(h.children().last().before(b),h.children().first().replaceWith(b.clone().addClass(e.clonedClass))):(h.append(b),o.removeClass("disabled")),g.trigger("onAddItem",[b]);return f},seekTo:function(b,c,k){b.jquery||(b*=1);if(e.circular&&b===0&&i==-1&&c!==0)return f;if(!e.circular&&b<0||b>f.getSize()||b<-1)return f;var l=b;b.jquery?b=f.getItems().index(b):l=f.getItems().eq(b);var m=a.Event("onBeforeSeek");if(!k){g.trigger(m,[b,c]);if(m.isDefaultPrevented()||!l.length)return f}var n=j?{top:-l.position().top}:{left:-l.position().left};i=b,d=f,c===undefined&&(c=e.speed),h.animate(n,c,e.easing,k||function(){g.trigger("onSeek",[b])});return f}}),a.each(["onBeforeSeek","onSeek","onAddItem"],function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}});if(e.circular){var k=f.getItems().slice(-1).clone().prependTo(h),l=f.getItems().eq(1).clone().appendTo(h);k.add(l).addClass(e.clonedClass),f.onBeforeSeek(function(a,b,c){if(!a.isDefaultPrevented()){if(b==-1){f.seekTo(k,c,function(){f.end(0)});return a.preventDefault()}b==f.getSize()&&f.seekTo(l,c,function(){f.begin(0)})}});var m=b.parents().add(b).filter(function(){if(a(this).css("display")==="none")return!0});m.length?(m.show(),f.seekTo(0,0,function(){}),m.hide()):f.seekTo(0,0,function(){})}var n=c(b,e.prev).click(function(a){a.stopPropagation(),f.prev()}),o=c(b,e.next).click(function(a){a.stopPropagation(),f.next()});e.circular||(f.onBeforeSeek(function(a,b){setTimeout(function(){a.isDefaultPrevented()||(n.toggleClass(e.disabledClass,b<=0),o.toggleClass(e.disabledClass,b>=f.getSize()-1))},1)}),e.initialIndex||n.addClass(e.disabledClass)),f.getSize()<2&&n.add(o).addClass(e.disabledClass),e.mousewheel&&a.fn.mousewheel&&b.mousewheel(function(a,b){if(e.mousewheel){f.move(b<0?1:-1,e.wheelSpeed||50);return!1}});if(e.touch){var p={};h[0].ontouchstart=function(a){var b=a.touches[0];p.x=b.clientX,p.y=b.clientY},h[0].ontouchmove=function(a){if(a.touches.length==1&&!h.is(":animated")){var b=a.touches[0],c=p.x-b.clientX,d=p.y-b.clientY;f[j&&d>0||!j&&c>0?"next":"prev"](),a.preventDefault()}}}e.keyboard&&a(document).bind("keydown.scrollable",function(b){if(!(!e.keyboard||b.altKey||b.ctrlKey||b.metaKey||a(b.target).is(":input"))){if(e.keyboard!="static"&&d!=f)return;var c=b.keyCode;if(j&&(c==38||c==40)){f.move(c==38?-1:1);return b.preventDefault()}if(!j&&(c==37||c==39)){f.move(c==37?-1:1);return b.preventDefault()}}}),e.initialIndex&&f.seekTo(e.initialIndex,0,function(){})}a.fn.scrollable=function(b){var c=this.data("scrollable");if(c)return c;b=a.extend({},a.tools.scrollable.conf,b),this.each(function(){c=new e(a(this),b),a(this).data("scrollable",c)});return b.api?c:this}})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.6"},a.tools.tabs={conf:{tabs:"a",current:"current",onBeforeClick:null,onClick:null,effect:"default",initialIndex:0,event:"click",rotate:!1,slideUpSpeed:400,slideDownSpeed:400,history:!1},addEffect:function(a,c){b[a]=c}};var b={"default":function(a,b){this.getPanes().hide().eq(a).show(),b.call()},fade:function(a,b){var c=this.getConf(),d=c.fadeOutSpeed,e=this.getPanes();d?e.fadeOut(d):e.hide(),e.eq(a).fadeIn(c.fadeInSpeed,b)},slide:function(a,b){var c=this.getConf();this.getPanes().slideUp(c.slideUpSpeed),this.getPanes().eq(a).slideDown(c.slideDownSpeed,b)},ajax:function(a,b){this.getPanes().eq(0).load(this.getTabs().eq(a).attr("href"),b)}},c,d;a.tools.tabs.addEffect("horizontal",function(b,e){if(!c){var f=this.getPanes().eq(b),g=this.getCurrentPane();d||(d=this.getPanes().eq(0).width()),c=!0,f.show(),g.animate({width:0},{step:function(a){f.css("width",d-a)},complete:function(){a(this).hide(),e.call(),c=!1}}),g.length||(e.call(),c=!1)}});function e(c,d,e){var f=this,g=c.add(this),h=c.find(e.tabs),i=d.jquery?d:c.children(d),j;h.length||(h=c.children()),i.length||(i=c.parent().find(d)),i.length||(i=a(d)),a.extend(this,{click:function(c,d){var i=h.eq(c);typeof c=="string"&&c.replace("#","")&&(i=h.filter("[href*="+c.replace("#","")+"]"),c=Math.max(h.index(i),0));if(e.rotate){var k=h.length-1;if(c<0)return f.click(k,d);if(c>k)return f.click(0,d)}if(!i.length){if(j>=0)return f;c=e.initialIndex,i=h.eq(c)}if(c===j)return f;d=d||a.Event(),d.type="onBeforeClick",g.trigger(d,[c]);if(!d.isDefaultPrevented()){b[e.effect].call(f,c,function(){j=c,d.type="onClick",g.trigger(d,[c])}),h.removeClass(e.current),i.addClass(e.current);return f}},getConf:function(){return e},getTabs:function(){return h},getPanes:function(){return i},getCurrentPane:function(){return i.eq(j)},getCurrentTab:function(){return h.eq(j)},getIndex:function(){return j},next:function(){return f.click(j+1)},prev:function(){return f.click(j-1)},destroy:function(){h.unbind(e.event).removeClass(e.current),i.find("a[href^=#]").unbind("click.T");return f}}),a.each("onBeforeClick,onClick".split(","),function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}}),e.history&&a.fn.history&&(a.tools.history.init(h),e.event="history"),h.each(function(b){a(this).bind(e.event,function(a){f.click(b,a);return a.preventDefault()})}),i.find("a[href^=#]").bind("click.T",function(b){f.click(a(this).attr("href"),b)}),location.hash&&e.tabs=="a"&&c.find("[href="+location.hash+"]").length?f.click(location.hash):(e.initialIndex===0||e.initialIndex>0)&&f.click(e.initialIndex)}a.fn.tabs=function(b,c){var d=this.data("tabs");d&&(d.destroy(),this.removeData("tabs")),a.isFunction(c)&&(c={onBeforeClick:c}),c=a.extend({},a.tools.tabs.conf,c),this.each(function(){d=new e(a(this),b,c),a(this).data("tabs",d)});return c.api?d:this}})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.6"};var b;b=a.tools.expose={conf:{maskId:"exposeMask",loadSpeed:"slow",closeSpeed:"fast",closeOnClick:!0,closeOnEsc:!0,zIndex:9998,opacity:.8,startOpacity:0,color:"#fff",onLoad:null,onClose:null}};function c(){if(a.browser.msie){var b=a(document).height(),c=a(window).height();return[window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,b-c<20?c:b]}return[a(document).width(),a(document).height()]}function d(b){if(b)return b.call(a.mask)}var e,f,g,h,i;a.mask={load:function(j,k){if(g)return this;typeof j=="string"&&(j={color:j}),j=j||h,h=j=a.extend(a.extend({},b.conf),j),e=a("#"+j.maskId),e.length||(e=a("<div/>").attr("id",j.maskId),a("body").append(e));var l=c();e.css({position:"absolute",top:0,left:0,width:l[0],height:l[1],display:"none",opacity:j.startOpacity,zIndex:j.zIndex}),j.color&&e.css("backgroundColor",j.color);if(d(j.onBeforeLoad)===!1)return this;j.closeOnEsc&&a(document).bind("keydown.mask",function(b){b.keyCode==27&&a.mask.close(b)}),j.closeOnClick&&e.bind("click.mask",function(b){a.mask.close(b)}),a(window).bind("resize.mask",function(){a.mask.fit()}),k&&k.length&&(i=k.eq(0).css("zIndex"),a.each(k,function(){var b=a(this);/relative|absolute|fixed/i.test(b.css("position"))||b.css("position","relative")}),f=k.css({zIndex:Math.max(j.zIndex+1,i=="auto"?0:i)})),e.css({display:"block"}).fadeTo(j.loadSpeed,j.opacity,function(){a.mask.fit(),d(j.onLoad),g="full"}),g=!0;return this},close:function(){if(g){if(d(h.onBeforeClose)===!1)return this;e.fadeOut(h.closeSpeed,function(){d(h.onClose),f&&f.css({zIndex:i}),g=!1}),a(document).unbind("keydown.mask"),e.unbind("click.mask"),a(window).unbind("resize.mask")}return this},fit:function(){if(g){var a=c();e.css({width:a[0],height:a[1]})}},getMask:function(){return e},isLoaded:function(a){return a?g=="full":g},getConf:function(){return h},getExposed:function(){return f}},a.fn.mask=function(b){a.mask.load(b);return this},a.fn.expose=function(b){a.mask.load(b,this);return this}})(jQuery);
+(function(){var a=document.all,b="http://www.adobe.com/go/getflashplayer",c=typeof jQuery=="function",d=/(\d+)[^\d]+(\d+)[^\d]*(\d*)/,e={width:"100%",height:"100%",id:"_"+(""+Math.random()).slice(9),allowfullscreen:!0,allowscriptaccess:"always",quality:"high",version:[3,0],onFail:null,expressInstall:null,w3c:!1,cachebusting:!1};window.attachEvent&&window.attachEvent("onbeforeunload",function(){__flash_unloadHandler=function(){},__flash_savedUnloadHandler=function(){}});function f(a,b){if(b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function g(a,b){var c=[];for(var d in a)a.hasOwnProperty(d)&&(c[d]=b(a[d]));return c}window.flashembed=function(a,b,c){typeof a=="string"&&(a=document.getElementById(a.replace("#","")));if(a){typeof b=="string"&&(b={src:b});return new j(a,f(f({},e),b),c)}};var h=f(window.flashembed,{conf:e,getVersion:function(){var a,b;try{b=navigator.plugins["Shockwave Flash"].description.slice(16)}catch(c){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"),b=a&&a.GetVariable("$version")}catch(e){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),b=a&&a.GetVariable("$version")}catch(f){}}}b=d.exec(b);return b?[b[1],b[3]]:[0,0]},asString:function(a){if(a===null||a===undefined)return null;var b=typeof a;b=="object"&&a.push&&(b="array");switch(b){case"string":a=a.replace(new RegExp("([\"\\\\])","g"),"\\$1"),a=a.replace(/^\s?(\d+\.?\d*)%/,"$1pct");return"\""+a+"\"";case"array":return"["+g(a,function(a){return h.asString(a)}).join(",")+"]";case"function":return"\"function()\"";case"object":var c=[];for(var d in a)a.hasOwnProperty(d)&&c.push("\""+d+"\":"+h.asString(a[d]));return"{"+c.join(",")+"}"}return String(a).replace(/\s/g," ").replace(/\'/g,"\"")},getHTML:function(b,c){b=f({},b);var d="<object width=\""+b.width+"\" height=\""+b.height+"\" id=\""+b.id+"\" name=\""+b.id+"\"";b.cachebusting&&(b.src+=(b.src.indexOf("?")!=-1?"&":"?")+Math.random()),b.w3c||!a?d+=" data=\""+b.src+"\" type=\"application/x-shockwave-flash\"":d+=" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"",d+=">";if(b.w3c||a)d+="<param name=\"movie\" value=\""+b.src+"\" />";b.width=b.height=b.id=b.w3c=b.src=null,b.onFail=b.version=b.expressInstall=null;for(var e in b)b[e]&&(d+="<param name=\""+e+"\" value=\""+b[e]+"\" />");var g="";if(c){for(var i in c)if(c[i]){var j=c[i];g+=i+"="+encodeURIComponent(/function|object/.test(typeof j)?h.asString(j):j)+"&"}g=g.slice(0,-1),d+="<param name=\"flashvars\" value='"+g+"' />"}d+="</object>";return d},isSupported:function(a){return i[0]>a[0]||i[0]==a[0]&&i[1]>=a[1]}}),i=h.getVersion();function j(c,d,e){if(h.isSupported(d.version))c.innerHTML=h.getHTML(d,e);else if(d.expressInstall&&h.isSupported([6,65]))c.innerHTML=h.getHTML(f(d,{src:d.expressInstall}),{MMredirectURL:location.href,MMplayerType:"PlugIn",MMdoctitle:document.title});else{c.innerHTML.replace(/\s/g,"")||(c.innerHTML="<h2>Flash version "+d.version+" or greater is required</h2><h3>"+(i[0]>0?"Your version is "+i:"You have no flash plugin installed")+"</h3>"+(c.tagName=="A"?"<p>Click here to download latest version</p>":"<p>Download latest version from <a href='"+b+"'>here</a></p>"),c.tagName=="A"&&(c.onclick=function(){location.href=b}));if(d.onFail){var g=d.onFail.call(this);typeof g=="string"&&(c.innerHTML=g)}}a&&(window[d.id]=document.getElementById(d.id)),f(this,{getRoot:function(){return c},getOptions:function(){return d},getConf:function(){return e},getApi:function(){return c.firstChild}})}c&&(jQuery.tools=jQuery.tools||{version:"v1.2.6"},jQuery.tools.flashembed={conf:e},jQuery.fn.flashembed=function(a,b){return this.each(function(){jQuery(this).data("flashembed",flashembed(this,a,b))})})})();
+(function(a){var b,c,d,e;a.tools=a.tools||{version:"v1.2.6"},a.tools.history={init:function(g){e||(a.browser.msie&&a.browser.version<"8"?c||(c=a("<iframe/>").attr("src","javascript:false;").hide().get(0),a("body").prepend(c),setInterval(function(){var d=c.contentWindow.document,e=d.location.hash;b!==e&&a(window).trigger("hash",e)},100),f(location.hash||"#")):setInterval(function(){var c=location.hash;c!==b&&a(window).trigger("hash",c)},100),d=d?d.add(g):g,g.click(function(b){var d=a(this).attr("href");c&&f(d);if(d.slice(0,1)!="#"){location.href="#"+d;return b.preventDefault()}}),e=!0)}};function f(a){if(a){var b=c.contentWindow.document;b.open().close(),b.location.hash=a}}a(window).bind("hash",function(c,e){e?d.filter(function(){var b=a(this).attr("href");return b==e||b==e.replace("#","")}).trigger("history",[e]):d.eq(0).trigger("history",[e]),b=e}),a.fn.history=function(b){a.tools.history.init(this);return this.bind("history",b)}})(jQuery);
+(function(a){a.fn.mousewheel=function(a){return this[a?"bind":"trigger"]("wheel",a)},a.event.special.wheel={setup:function(){a.event.add(this,b,c,{})},teardown:function(){a.event.remove(this,b,c)}};var b=a.browser.mozilla?"DOMMouseScroll"+(a.browser.version<"1.9"?" mousemove":""):"mousewheel";function c(b){switch(b.type){case"mousemove":return a.extend(b.data,{clientX:b.clientX,clientY:b.clientY,pageX:b.pageX,pageY:b.pageY});case"DOMMouseScroll":a.extend(b,b.data),b.delta=-b.detail/3;break;case"mousewheel":b.delta=b.wheelDelta/120}b.type="wheel";return a.event.handle.call(this,b,b.delta)}})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.6"},a.tools.tooltip={conf:{effect:"toggle",fadeOutSpeed:"fast",predelay:0,delay:30,opacity:1,tip:0,fadeIE:!1,position:["top","center"],offset:[0,0],relative:!1,cancelDefault:!0,events:{def:"mouseenter,mouseleave",input:"focus,blur",widget:"focus mouseenter,blur mouseleave",tooltip:"mouseenter,mouseleave"},layout:"<div/>",tipClass:"tooltip"},addEffect:function(a,c,d){b[a]=[c,d]}};var b={toggle:[function(a){var b=this.getConf(),c=this.getTip(),d=b.opacity;d<1&&c.css({opacity:d}),c.show(),a.call()},function(a){this.getTip().hide(),a.call()}],fade:[function(b){var c=this.getConf();!a.browser.msie||c.fadeIE?this.getTip().fadeTo(c.fadeInSpeed,c.opacity,b):(this.getTip().show(),b())},function(b){var c=this.getConf();!a.browser.msie||c.fadeIE?this.getTip().fadeOut(c.fadeOutSpeed,b):(this.getTip().hide(),b())}]};function c(b,c,d){var e=d.relative?b.position().top:b.offset().top,f=d.relative?b.position().left:b.offset().left,g=d.position[0];e-=c.outerHeight()-d.offset[0],f+=b.outerWidth()+d.offset[1],/iPad/i.test(navigator.userAgent)&&(e-=a(window).scrollTop());var h=c.outerHeight()+b.outerHeight();g=="center"&&(e+=h/2),g=="bottom"&&(e+=h),g=d.position[1];var i=c.outerWidth()+b.outerWidth();g=="center"&&(f-=i/2),g=="left"&&(f-=i);return{top:e,left:f}}function d(d,e){var f=this,g=d.add(f),h,i=0,j=0,k=d.attr("title"),l=d.attr("data-tooltip"),m=b[e.effect],n,o=d.is(":input"),p=o&&d.is(":checkbox, :radio, select, :button, :submit"),q=d.attr("type"),r=e.events[q]||e.events[o?p?"widget":"input":"def"];if(!m)throw"Nonexistent effect \""+e.effect+"\"";r=r.split(/,\s*/);if(r.length!=2)throw"Tooltip: bad events configuration for "+q;d.bind(r[0],function(a){clearTimeout(i),e.predelay?j=setTimeout(function(){f.show(a)},e.predelay):f.show(a)}).bind(r[1],function(a){clearTimeout(j),e.delay?i=setTimeout(function(){f.hide(a)},e.delay):f.hide(a)}),k&&e.cancelDefault&&(d.removeAttr("title"),d.data("title",k)),a.extend(f,{show:function(b){if(!h){l?h=a(l):e.tip?h=a(e.tip).eq(0):k?h=a(e.layout).addClass(e.tipClass).appendTo(document.body).hide().append(k):(h=d.next(),h.length||(h=d.parent().next()));if(!h.length)throw"Cannot find tooltip for "+d}if(f.isShown())return f;h.stop(!0,!0);var o=c(d,h,e);e.tip&&h.html(d.data("title")),b=a.Event(),b.type="onBeforeShow",g.trigger(b,[o]);if(b.isDefaultPrevented())return f;o=c(d,h,e),h.css({position:"absolute",top:o.top,left:o.left}),n=!0,m[0].call(f,function(){b.type="onShow",n="full",g.trigger(b)});var p=e.events.tooltip.split(/,\s*/);h.data("__set")||(h.unbind(p[0]).bind(p[0],function(){clearTimeout(i),clearTimeout(j)}),p[1]&&!d.is("input:not(:checkbox, :radio), textarea")&&h.unbind(p[1]).bind(p[1],function(a){a.relatedTarget!=d[0]&&d.trigger(r[1].split(" ")[0])}),e.tip||h.data("__set",!0));return f},hide:function(c){if(!h||!f.isShown())return f;c=a.Event(),c.type="onBeforeHide",g.trigger(c);if(!c.isDefaultPrevented()){n=!1,b[e.effect][1].call(f,function(){c.type="onHide",g.trigger(c)});return f}},isShown:function(a){return a?n=="full":n},getConf:function(){return e},getTip:function(){return h},getTrigger:function(){return d}}),a.each("onHide,onBeforeShow,onShow,onBeforeHide".split(","),function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}})}a.fn.tooltip=function(b){var c=this.data("tooltip");if(c)return c;b=a.extend(!0,{},a.tools.tooltip.conf,b),typeof b.position=="string"&&(b.position=b.position.split(/,?\s/)),this.each(function(){c=new d(a(this),b),a(this).data("tooltip",c)});return b.api?c:this}})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.6"};var b=/\[type=([a-z]+)\]/,c=/^-?[0-9]*(\.[0-9]+)?$/,d=a.tools.dateinput,e=/^([a-z0-9_\.\-\+]+)@([\da-z\.\-]+)\.([a-z\.]{2,6})$/i,f=/^(https?:\/\/)?[\da-z\.\-]+\.[a-z\.]{2,6}[#&+_\?\/\w \.\-=]*$/i,g;g=a.tools.validator={conf:{grouped:!1,effect:"default",errorClass:"invalid",inputEvent:null,errorInputEvent:"keyup",formEvent:"submit",lang:"en",message:"<div/>",messageAttr:"data-message",messageClass:"error",offset:[0,0],position:"center right",singleError:!1,speed:"normal"},messages:{"*":{en:"Please correct this value"}},localize:function(b,c){a.each(c,function(a,c){g.messages[a]=g.messages[a]||{},g.messages[a][b]=c})},localizeFn:function(b,c){g.messages[b]=g.messages[b]||{},a.extend(g.messages[b],c)},fn:function(c,d,e){a.isFunction(d)?e=d:(typeof d=="string"&&(d={en:d}),this.messages[c.key||c]=d);var f=b.exec(c);f&&(c=i(f[1])),j.push([c,e])},addEffect:function(a,b,c){k[a]=[b,c]}};function h(b,c,d){var e=b.offset().top,f=b.offset().left,g=d.position.split(/,?\s+/),h=g[0],i=g[1];e-=c.outerHeight()-d.offset[0],f+=b.outerWidth()+d.offset[1],/iPad/i.test(navigator.userAgent)&&(e-=a(window).scrollTop());var j=c.outerHeight()+b.outerHeight();h=="center"&&(e+=j/2),h=="bottom"&&(e+=j);var k=b.outerWidth();i=="center"&&(f-=(k+c.outerWidth())/2),i=="left"&&(f-=k);return{top:e,left:f}}function i(a){function b(){return this.getAttribute("type")==a}b.key="[type="+a+"]";return b}var j=[],k={"default":[function(b){var c=this.getConf();a.each(b,function(b,d){var e=d.input;e.addClass(c.errorClass);var f=e.data("msg.el");f||(f=a(c.message).addClass(c.messageClass).appendTo(document.body),e.data("msg.el",f)),f.css({visibility:"hidden"}).find("p").remove(),a.each(d.messages,function(b,c){a("<p/>").html(c).appendTo(f)}),f.outerWidth()==f.parent().width()&&f.add(f.find("p")).css({display:"inline"});var g=h(e,f,c);f.css({visibility:"visible",position:"absolute",top:g.top,left:g.left}).fadeIn(c.speed)})},function(b){var c=this.getConf();b.removeClass(c.errorClass).each(function(){var b=a(this).data("msg.el");b&&b.css({visibility:"hidden"})})}]};a.each("email,url,number".split(","),function(b,c){a.expr[":"][c]=function(a){return a.getAttribute("type")===c}}),a.fn.oninvalid=function(a){return this[a?"bind":"trigger"]("OI",a)},g.fn(":email","Please enter a valid email address",function(a,b){return!b||e.test(b)}),g.fn(":url","Please enter a valid URL",function(a,b){return!b||f.test(b)}),g.fn(":number","Please enter a numeric value.",function(a,b){return c.test(b)}),g.fn("[max]","Please enter a value no larger than $1",function(a,b){if(b===""||d&&a.is(":date"))return!0;var c=a.attr("max");return parseFloat(b)<=parseFloat(c)?!0:[c]}),g.fn("[min]","Please enter a value of at least $1",function(a,b){if(b===""||d&&a.is(":date"))return!0;var c=a.attr("min");return parseFloat(b)>=parseFloat(c)?!0:[c]}),g.fn("[required]","Please complete this mandatory field.",function(a,b){if(a.is(":checkbox"))return a.is(":checked");return b}),g.fn("[pattern]",function(a){var b=new RegExp("^"+a.attr("pattern")+"$");return b.test(a.val())});function l(b,c,e){var f=this,i=c.add(f);b=b.not(":button, :image, :reset, :submit"),c.attr("novalidate","novalidate");function l(b,c,d){if(e.grouped||!b.length){var f;if(d===!1||a.isArray(d)){f=g.messages[c.key||c]||g.messages["*"],f=f[e.lang]||g.messages["*"].en;var h=f.match(/\$\d/g);h&&a.isArray(d)&&a.each(h,function(a){f=f.replace(this,d[a])})}else f=d[e.lang]||d;b.push(f)}}a.extend(f,{getConf:function(){return e},getForm:function(){return c},getInputs:function(){return b},reflow:function(){b.each(function(){var b=a(this),c=b.data("msg.el");if(c){var d=h(b,c,e);c.css({top:d.top,left:d.left})}});return f},invalidate:function(c,d){if(!d){var g=[];a.each(c,function(a,c){var d=b.filter("[name='"+a+"']");d.length&&(d.trigger("OI",[c]),g.push({input:d,messages:[c]}))}),c=g,d=a.Event()}d.type="onFail",i.trigger(d,[c]),d.isDefaultPrevented()||k[e.effect][0].call(f,c,d);return f},reset:function(c){c=c||b,c.removeClass(e.errorClass).each(function(){var b=a(this).data("msg.el");b&&(b.remove(),a(this).data("msg.el",null))}).unbind(e.errorInputEvent||"");return f},destroy:function(){c.unbind(e.formEvent+".V").unbind("reset.V"),b.unbind(e.inputEvent+".V").unbind("change.V");return f.reset()},checkValidity:function(c,g){c=c||b,c=c.not(":disabled");if(!c.length)return!0;g=g||a.Event(),g.type="onBeforeValidate",i.trigger(g,[c]);if(g.isDefaultPrevented())return g.result;var h=[];c.not(":radio:not(:checked)").each(function(){var b=[],c=a(this).data("messages",b),k=d&&c.is(":date")?"onHide.v":e.errorInputEvent+".v";c.unbind(k),a.each(j,function(){var a=this,d=a[0];if(c.filter(d).length){var h=a[1].call(f,c,c.val());if(h!==!0){g.type="onBeforeFail",i.trigger(g,[c,d]);if(g.isDefaultPrevented())return!1;var j=c.attr(e.messageAttr);if(j){b=[j];return!1}l(b,d,h)}}}),b.length&&(h.push({input:c,messages:b}),c.trigger("OI",[b]),e.errorInputEvent&&c.bind(k,function(a){f.checkValidity(c,a)}));if(e.singleError&&h.length)return!1});var m=k[e.effect];if(!m)throw"Validator: cannot find effect \""+e.effect+"\"";if(h.length){f.invalidate(h,g);return!1}m[1].call(f,c,g),g.type="onSuccess",i.trigger(g,[c]),c.unbind(e.errorInputEvent+".v");return!0}}),a.each("onBeforeValidate,onBeforeFail,onFail,onSuccess".split(","),function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}}),e.formEvent&&c.bind(e.formEvent+".V",function(a){if(!f.checkValidity(null,a))return a.preventDefault();a.target=c,a.type=e.formEvent}),c.bind("reset.V",function(){f.reset()}),b[0]&&b[0].validity&&b.each(function(){this.oninvalid=function(){return!1}}),c[0]&&(c[0].checkValidity=f.checkValidity),e.inputEvent&&b.bind(e.inputEvent+".V",function(b){f.checkValidity(a(this),b)}),b.filter(":checkbox, select").filter("[required]").bind("change.V",function(b){var c=a(this);(this.checked||c.is("select")&&a(this).val())&&k[e.effect][1].call(f,c,b)});var m=b.filter(":radio").change(function(a){f.checkValidity(m,a)});a(window).resize(function(){f.reflow()})}a.fn.validator=function(b){var c=this.data("validator");c&&(c.destroy(),this.removeData("validator")),b=a.extend(!0,{},g.conf,b);if(this.is("form"))return this.each(function(){var d=a(this);c=new l(d.find(":input"),d,b),d.data("validator",c)});c=new l(this,this.eq(0).closest("form"),b);return this.data("validator",c)}})(jQuery);
View
155 assets/javascripts/overlay/overlay.apple.js
@@ -0,0 +1,155 @@
+/**
+ * @license
+ * jQuery Tools @VERSION / Overlay Apple effect.
+ *
+ * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
+ *
+ * http://flowplayer.org/tools/overlay/apple.html
+ *
+ * Since: July 2009
+ * Date: @DATE
+ */
+(function($) {
+
+ // version number
+ var t = $.tools.overlay,
+ w = $(window);
+
+ // extend global configuragion with effect specific defaults
+ $.extend(t.conf, {
+ start: {
+ top: null,
+ left: null
+ },
+
+ fadeInSpeed: 'fast',
+ zIndex: 9999
+ });
+
+ // utility function
+ function getPosition(el) {
+ var p = el.offset();
+ return {
+ top: p.top + el.height() / 2,
+ left: p.left + el.width() / 2
+ };
+ }
+
+//{{{ load
+
+ var loadEffect = function(pos, onLoad) {
+
+ var overlay = this.getOverlay(),
+ conf = this.getConf(),
+ trigger = this.getTrigger(),
+ self = this,
+ oWidth = overlay.outerWidth({margin:true}),
+ img = overlay.data("img"),
+ position = conf.fixed ? 'fixed' : 'absolute';
+
+
+ // growing image is required.
+ if (!img) {
+ var bg = overlay.css("backgroundImage");
+
+ if (!bg) {
+ throw "background-image CSS property not set for overlay";
+ }
+
+ // url("bg.jpg") --> bg.jpg
+ bg = bg.slice(bg.indexOf("(") + 1, bg.indexOf(")")).replace(/\"/g, "");
+ overlay.css("backgroundImage", "none");
+
+ img = $('<img src="' + bg + '"/>');
+ img.css({border:0, display:'none'}).width(oWidth);
+ $('body').append(img);
+ overlay.data("img", img);
+ }
+
+ // initial top & left
+ var itop = conf.start.top || Math.round(w.height() / 2),
+ ileft = conf.start.left || Math.round(w.width() / 2);
+
+ if (trigger) {
+ var p = getPosition(trigger);
+ itop = p.top;
+ ileft = p.left;
+ }
+
+ // put overlay into final position
+ if (conf.fixed) {
+ itop -= w.scrollTop();
+ ileft -= w.scrollLeft();
+ } else {
+ pos.top += w.scrollTop();
+ pos.left += w.scrollLeft();
+ }
+
+ // initialize background image and make it visible
+ img.css({
+ position: 'absolute',
+ top: itop,
+ left: ileft,
+ width: 0,
+ zIndex: conf.zIndex
+ }).show();
+
+ pos.position = position;
+ overlay.css(pos);
+
+ // begin growing
+ img.animate({
+ top: overlay.css("top"),
+ left: overlay.css("left"),
+ width: oWidth}, conf.speed, function() {
+
+ // set close button and content over the image
+ overlay.css("zIndex", conf.zIndex + 1).fadeIn(conf.fadeInSpeed, function() {
+
+ if (self.isOpened() && !$(this).index(overlay)) {
+ onLoad.call();
+ } else {
+ overlay.hide();
+ }
+ });
+
+ }).css("position", position);
+
+ };
+//}}}
+
+
+ var closeEffect = function(onClose) {
+
+ // variables
+ var overlay = this.getOverlay().hide(),
+ conf = this.getConf(),
+ trigger = this.getTrigger(),
+ img = overlay.data("img"),
+
+ css = {
+ top: conf.start.top,
+ left: conf.start.left,
+ width: 0
+ };
+
+ // trigger position
+ if (trigger) { $.extend(css, getPosition(trigger)); }
+
+
+ // change from fixed to absolute position
+ if (conf.fixed) {
+ img.css({position: 'absolute'})
+ .animate({ top: "+=" + w.scrollTop(), left: "+=" + w.scrollLeft()}, 0);
+ }
+
+ // shrink image
+ img.animate(css, conf.closeSpeed, onClose);
+ };
+
+
+ // add overlay effect
+ t.addEffect("apple", loadEffect, closeEffect);
+
+})(jQuery);
+
View
293 assets/javascripts/overlay/overlay.js
@@ -0,0 +1,293 @@
+/**
+ * @license
+ * jQuery Tools @VERSION Overlay - Overlay base. Extend it.
+ *
+ * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
+ *
+ * http://flowplayer.org/tools/overlay/
+ *
+ * Since: March 2008
+ * Date: @DATE
+ */
+(function($) {
+
+ // static constructs
+ $.tools = $.tools || {version: '@VERSION'};
+
+ $.tools.overlay = {
+
+ addEffect: function(name, loadFn, closeFn) {
+ effects[name] = [loadFn, closeFn];
+ },
+
+ conf: {
+ close: null,
+ closeOnClick: true,
+ closeOnEsc: true,
+ closeSpeed: 'fast',
+ effect: 'default',
+
+ // since 1.2. fixed positioning not supported by IE6
+ fixed: !$.browser.msie || $.browser.version > 6,
+
+ left: 'center',
+ load: false, // 1.2
+ mask: null,
+ oneInstance: true,
+ speed: 'normal',
+ target: null, // target element to be overlayed. by default taken from [rel]
+ top: '10%'
+ }
+ };
+
+
+ var instances = [], effects = {};
+
+ // the default effect. nice and easy!
+ $.tools.overlay.addEffect('default',
+
+ /*
+ onLoad/onClose functions must be called otherwise none of the
+ user supplied callback methods won't be called
+ */
+ function(pos, onLoad) {
+
+ var conf = this.getConf(),
+ w = $(window);
+
+ if (!conf.fixed) {
+ pos.top += w.scrollTop();
+ pos.left += w.scrollLeft();
+ }
+
+ pos.position = conf.fixed ? 'fixed' : 'absolute';
+ this.getOverlay().css(pos).fadeIn(conf.speed, onLoad);
+
+ }, function(onClose) {
+ this.getOverlay().fadeOut(this.getConf().closeSpeed, onClose);
+ }
+ );
+
+
+ function Overlay(trigger, conf) {
+
+ // private variables
+ var self = this,
+ fire = trigger.add(self),
+ w = $(window),
+ closers,
+ overlay,
+ opened,
+ maskConf = $.tools.expose && (conf.mask || conf.expose),
+ uid = Math.random().toString().slice(10);
+
+
+ // mask configuration
+ if (maskConf) {
+ if (typeof maskConf == 'string') { maskConf = {color: maskConf}; }
+ maskConf.closeOnClick = maskConf.closeOnEsc = false;
+ }
+
+ // get overlay and trigger
+ var jq = conf.target || trigger.attr("rel");
+ overlay = jq ? $(jq) : null || trigger;
+
+ // overlay not found. cannot continue
+ if (!overlay.length) { throw "Could not find Overlay: " + jq; }
+
+ // trigger's click event
+ if (trigger && trigger.index(overlay) == -1) {
+ trigger.click(function(e) {
+ self.load(e);
+ return e.preventDefault();
+ });
+ }
+
+ // API methods
+ $.extend(self, {
+
+ load: function(e) {
+
+ // can be opened only once
+ if (self.isOpened()) { return self; }
+
+ // find the effect
+ var eff = effects[conf.effect];
+ if (!eff) { throw "Overlay: cannot find effect : \"" + conf.effect + "\""; }
+
+ // close other instances?
+ if (conf.oneInstance) {
+ $.each(instances, function() {
+ this.close(e);
+ });
+ }
+
+ // onBeforeLoad
+ e = e || $.Event();
+ e.type = "onBeforeLoad";
+ fire.trigger(e);
+ if (e.isDefaultPrevented()) { return self; }
+
+ // opened
+ opened = true;
+
+ // possible mask effect
+ if (maskConf) { $(overlay).expose(maskConf); }
+
+ // position & dimensions
+ var top = conf.top,
+ left = conf.left,
+ oWidth = overlay.outerWidth({margin:true}),
+ oHeight = overlay.outerHeight({margin:true});
+
+ if (typeof top == 'string') {
+ top = top == 'center' ? Math.max((w.height() - oHeight) / 2, 0) :
+ parseInt(top, 10) / 100 * w.height();
+ }
+
+ if (left == 'center') { left = Math.max((w.width() - oWidth) / 2, 0); }
+
+
+ // load effect
+ eff[0].call(self, {top: top, left: left}, function() {
+ if (opened) {
+ e.type = "onLoad";
+ fire.trigger(e);
+ }
+ });
+
+ // mask.click closes overlay
+ if (maskConf && conf.closeOnClick) {
+ $.mask.getMask().one("click", self.close);
+ }
+
+ // when window is clicked outside overlay, we close
+ if (conf.closeOnClick) {
+ $(document).bind("click." + uid, function(e) {
+ if (!$(e.target).parents(overlay).length) {
+ self.close(e);
+ }
+ });
+ }
+
+ // keyboard::escape
+ if (conf.closeOnEsc) {
+
+ // one callback is enough if multiple instances are loaded simultaneously
+ $(document).bind("keydown." + uid, function(e) {
+ if (e.keyCode == 27) {
+ self.close(e);
+ }
+ });
+ }
+
+
+ return self;
+ },
+
+ close: function(e) {
+
+ if (!self.isOpened()) { return self; }
+
+ e = e || $.Event();
+ e.type = "onBeforeClose";
+ fire.trigger(e);
+ if (e.isDefaultPrevented()) { return; }
+
+ opened = false;
+
+ // close effect
+ effects[conf.effect][1].call(self, function() {
+ e.type = "onClose";
+ fire.trigger(e);
+ });
+
+ // unbind the keyboard / clicking actions
+ $(document).unbind("click." + uid).unbind("keydown." + uid);
+
+ if (maskConf) {
+ $.mask.close();
+ }
+
+ return self;
+ },
+
+ getOverlay: function() {
+ return overlay;
+ },
+
+ getTrigger: function() {
+ return trigger;
+ },
+
+ getClosers: function() {
+ return closers;
+ },
+
+ isOpened: function() {
+ return opened;
+ },
+
+ // manipulate start, finish and speeds
+ getConf: function() {
+ return conf;
+ }
+
+ });
+
+ // callbacks
+ $.each("onBeforeLoad,onStart,onLoad,onBeforeClose,onClose".split(","), function(i, name) {
+
+ // configuration
+ if ($.isFunction(conf[name])) {
+ $(self).bind(name, conf[name]);
+ }
+
+ // API
+ self[name] = function(fn) {
+ if (fn) { $(self).bind(name, fn); }
+ return self;
+ };
+ });
+
+ // close button
+ closers = overlay.find(conf.close || ".close");
+
+ if (!closers.length && !conf.close) {
+ closers = $('<a class="close"></a>');
+ overlay.prepend(closers);
+ }
+
+ closers.click(function(e) {
+ self.close(e);
+ });
+
+ // autoload
+ if (conf.load) { self.load(); }
+
+ }
+
+ // jQuery plugin initialization
+ $.fn.overlay = function(conf) {
+
+ // already constructed --> return API
+ var el = this.data("overlay");
+ if (el) { return el; }
+
+ if ($.isFunction(conf)) {
+ conf = {onBeforeLoad: conf};
+ }
+
+ conf = $.extend(true, {}, $.tools.overlay.conf, conf);
+
+ this.each(function() {
+ el = new Overlay($(this), conf);
+ instances.push(el);
+ $(this).data("overlay", el);
+ });
+
+ return conf.api ? el: this;
+ };
+
+})(jQuery);
+
View
471 assets/javascripts/rangeinput/rangeinput.js
@@ -0,0 +1,471 @@
+/**
+ * @license
+ * jQuery Tools @VERSION Rangeinput - HTML5 <input type="range" /> for humans
+ *
+ * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
+ *
+ * http://flowplayer.org/tools/rangeinput/
+ *
+ * Since: Mar 2010
+ * Date: @DATE
+ */
+(function($) {
+
+ $.tools = $.tools || {version: '@VERSION'};
+
+ var tool;
+
+ tool = $.tools.rangeinput = {
+
+ conf: {
+ min: 0,
+ max: 100, // as defined in the standard
+ step: 'any', // granularity of the value. a non-zero float or int (or "any")
+ steps: 0,
+ value: 0,
+ precision: undefined,
+ vertical: 0,
+ keyboard: true,
+ progress: false,
+ speed: 100,
+
+ // set to null if not needed
+ css: {
+ input: 'range',
+ slider: 'slider',
+ progress: 'progress',
+ handle: 'handle'
+ }
+
+ }
+ };
+
+//{{{ fn.drag
+
+ /*
+ FULL featured drag and drop. 0.7 kb minified, 0.3 gzipped. done.
+ Who told d'n'd is rocket science? Usage:
+
+ $(".myelement").drag({y: false}).bind("drag", function(event, x, y) {
+ // do your custom thing
+ });
+
+ Configuration:
+ x: true, // enable horizontal drag
+ y: true, // enable vertical drag
+ drag: true // true = perform drag, false = only fire events
+
+ Events: dragStart, drag, dragEnd.
+ */
+ var doc, draggable;
+
+ $.fn.drag = function(conf) {
+
+ // disable IE specialities
+ document.ondragstart = function () { return false; };
+
+ conf = $.extend({x: true, y: true, drag: true}, conf);
+
+ doc = doc || $(document).bind("mousedown mouseup", function(e) {
+
+ var el = $(e.target);
+
+ // start
+ if (e.type == "mousedown" && el.data("drag")) {
+
+ var offset = el.position(),
+ x0 = e.pageX - offset.left,
+ y0 = e.pageY - offset.top,
+ start = true;
+
+ doc.bind("mousemove.drag", function(e) {
+ var x = e.pageX -x0,
+ y = e.pageY -y0,
+ props = {};
+
+ if (conf.x) { props.left = x; }
+ if (conf.y) { props.top = y; }
+
+ if (start) {
+ el.trigger("dragStart");
+ start = false;
+ }
+ if (conf.drag) { el.css(props); }
+ el.trigger("drag", [y, x]);
+ draggable = el;
+ });
+
+ e.preventDefault();
+
+ } else {
+
+ try {
+ if (draggable) {
+ draggable.trigger("dragEnd");
+ }
+ } finally {
+ doc.unbind("mousemove.drag");
+ draggable = null;
+ }
+ }
+
+ });
+
+ return this.data("drag", true);
+ };
+
+//}}}
+
+
+
+ function round(value, precision) {
+ var n = Math.pow(10, precision);
+ return Math.round(value * n) / n;
+ }
+
+ // get hidden element's width or height even though it's hidden
+ function dim(el, key) {
+ var v = parseInt(el.css(key), 10);
+ if (v) { return v; }
+ var s = el[0].currentStyle;
+ return s && s.width && parseInt(s.width, 10);
+ }
+
+ function hasEvent(el) {
+ var e = el.data("events");
+ return e && e.onSlide;
+ }
+
+ function RangeInput(input, conf) {
+
+ // private variables
+ var self = this,
+ css = conf.css,
+ root = $("<div><div/><a href='#'/></div>").data("rangeinput", self),
+ vertical,
+ value, // current value
+ origo, // handle's start point
+ len, // length of the range
+ pos; // current position of the handle
+
+ // create range
+ input.before(root);
+
+ var handle = root.addClass(css.slider).find("a").addClass(css.handle),
+ progress = root.find("div").addClass(css.progress);
+
+ // get (HTML5) attributes into configuration
+ $.each("min,max,step,value".split(","), function(i, key) {
+ var val = input.attr(key);
+ if (parseFloat(val)) {
+ conf[key] = parseFloat(val, 10);
+ }
+ });
+
+ var range = conf.max - conf.min,
+ step = conf.step == 'any' ? 0 : conf.step,
+ precision = conf.precision;
+
+ if (precision === undefined) {
+ try {
+ precision = step.toString().split(".")[1].length;
+ } catch (err) {
+ precision = 0;
+ }
+ }
+
+ // Replace built-in range input (type attribute cannot be changed)
+ if (input.attr("type") == 'range') {
+ var def = input.clone().wrap("<div/>").parent().html(),
+ clone = $(def.replace(/type/i, "type=text data-orig-type"));
+
+ clone.val(conf.value);
+ input.replaceWith(clone);
+ input = clone;
+ }
+
+ input.addClass(css.input);
+
+ var fire = $(self).add(input), fireOnSlide = true;
+
+
+ /**
+ The flesh and bone of this tool. All sliding is routed trough this.
+
+ @param evt types include: click, keydown, blur and api (setValue call)
+ @param isSetValue when called trough setValue() call (keydown, blur, api)
+
+ vertical configuration gives additional complexity.
+ */
+ function slide(evt, x, val, isSetValue) {
+
+ // calculate value based on slide position
+ if (val === undefined) {
+ val = x / len * range;
+
+ // x is calculated based on val. we need to strip off min during calculation
+ } else if (isSetValue) {
+ val -= conf.min;
+ }
+
+ // increment in steps
+ if (step) {
+ val = Math.round(val / step) * step;
+ }
+
+ // count x based on value or tweak x if stepping is done
+ if (x === undefined || step) {
+ x = val * len / range;
+ }
+
+ // crazy value?
+ if (isNaN(val)) { return self; }
+
+ // stay within range
+ x = Math.max(0, Math.min(x, len));
+ val = x / len * range;
+
+ if (isSetValue || !vertical) {
+ val += conf.min;
+ }
+
+ // in vertical ranges value rises upwards
+ if (vertical) {
+ if (isSetValue) {
+ x = len -x;
+ } else {
+ val = conf.max - val;
+ }
+ }
+
+ // precision
+ val = round(val, precision);
+
+ // onSlide
+ var isClick = evt.type == "click";
+ if (fireOnSlide && value !== undefined && !isClick) {
+ evt.type = "onSlide";
+ fire.trigger(evt, [val, x]);
+ if (evt.isDefaultPrevented()) { return self; }
+ }
+
+ // speed & callback
+ var speed = isClick ? conf.speed : 0,
+ callback = isClick ? function() {
+ evt.type = "change";
+ fire.trigger(evt, [val]);
+ } : null;
+
+ if (vertical) {
+ handle.animate({top: x}, speed, callback);
+ if (conf.progress) {
+ progress.animate({height: len - x + handle.height() / 2}, speed);
+ }
+
+ } else {
+ handle.animate({left: x}, speed, callback);
+ if (conf.progress) {
+ progress.animate({width: x + handle.width() / 2}, speed);
+ }
+ }
+
+ // store current value
+ value = val;
+ pos = x;
+
+ // se input field's value
+ input.val(val);
+
+ return self;
+ }
+
+
+ $.extend(self, {
+
+ getValue: function() {
+ return value;
+ },
+
+ setValue: function(val, e) {
+ init();
+ return slide(e || $.Event("api"), undefined, val, true);
+ },
+
+ getConf: function() {
+ return conf;
+ },
+
+ getProgress: function() {
+ return progress;
+ },
+
+ getHandle: function() {
+ return handle;
+ },
+
+ getInput: function() {
+ return input;
+ },
+
+ step: function(am, e) {
+ e = e || $.Event();
+ var step = conf.step == 'any' ? 1 : conf.step;
+ self.setValue(value + step * (am || 1), e);
+ },
+
+ // HTML5 compatible name
+ stepUp: function(am) {
+ return self.step(am || 1);
+ },
+
+ // HTML5 compatible name
+ stepDown: function(am) {
+ return self.step(-am || -1);
+ }
+
+ });
+
+ // callbacks
+ $.each("onSlide,change".split(","), function(i, name) {
+
+ // from configuration
+ if ($.isFunction(conf[name])) {
+ $(self).bind(name, conf[name]);
+ }
+
+ // API methods
+ self[name] = function(fn) {
+ if (fn) { $(self).bind(name, fn); }
+ return self;
+ };
+ });
+
+
+ // dragging
+ handle.drag({drag: false}).bind("dragStart", function() {
+
+ /* do some pre- calculations for seek() function. improves performance */
+ init();
+
+ // avoid redundant event triggering (= heavy stuff)
+ fireOnSlide = hasEvent($(self)) || hasEvent(input);
+
+
+ }).bind("drag", function(e, y, x) {
+
+ if (input.is(":disabled")) { return false; }
+ slide(e, vertical ? y : x);
+
+ }).bind("dragEnd", function(e) {
+ if (!e.isDefaultPrevented()) {
+ e.type = "change";
+ fire.trigger(e, [value]);
+ }
+
+ }).click(function(e) {
+ return e.preventDefault();
+ });
+
+ // clicking
+ root.click(function(e) {
+ if (input.is(":disabled") || e.target == handle[0]) {
+ return e.preventDefault();
+ }
+ init();
+ var fix = vertical ? handle.height() / 2 : handle.width() / 2;
+ slide(e, vertical ? len-origo-fix + e.pageY : e.pageX -origo -fix);
+ });
+
+ if (conf.keyboard) {
+
+ input.keydown(function(e) {
+
+ if (input.attr("readonly")) { return; }
+
+ var key = e.keyCode,
+ up = $([75, 76, 38, 33, 39]).index(key) != -1,
+ down = $([74, 72, 40, 34, 37]).index(key) != -1;
+
+ if ((up || down) && !(e.shiftKey || e.altKey || e.ctrlKey)) {
+
+ // UP: k=75, l=76, up=38, pageup=33, right=39
+ if (up) {
+ self.step(key == 33 ? 10 : 1, e);
+
+ // DOWN: j=74, h=72, down=40, pagedown=34, left=37
+ } else if (down) {
+ self.step(key == 34 ? -10 : -1, e);
+ }
+ return e.preventDefault();
+ }
+ });
+ }
+
+
+ input.blur(function(e) {
+ var val = $(this).val();
+ if (val !== value) {
+ self.setValue(val, e);
+ }
+ });
+
+
+ // HTML5 DOM methods
+ $.extend(input[0], { stepUp: self.stepUp, stepDown: self.stepDown});
+
+
+ // calculate all dimension related stuff
+ function init() {
+ vertical = conf.vertical || dim(root, "height") > dim(root, "width");
+
+ if (vertical) {
+ len = dim(root, "height") - dim(handle, "height");
+ origo = root.offset().top + len;
+
+ } else {
+ len = dim(root, "width") - dim(handle, "width");
+ origo = root.offset().left;
+ }
+ }
+
+ function begin() {
+ init();
+ self.setValue(conf.value !== undefined ? conf.value : conf.min);
+ }
+ begin();
+
+ // some browsers cannot get dimensions upon initialization
+ if (!len) {
+ $(window).load(begin);
+ }
+ }
+
+ $.expr[':'].range = function(el) {
+ var type = el.getAttribute("type");
+ return type && type == 'range' || !!$(el).filter("input").data("rangeinput");
+ };
+
+
+ // jQuery plugin implementation
+ $.fn.rangeinput = function(conf) {
+
+ // already installed
+ if (this.data("rangeinput")) { return this; }
+
+ // extend configuration with globals
+ conf = $.extend(true, {}, tool.conf, conf);
+
+ var els;
+
+ this.each(function() {
+ var el = new RangeInput($(this), $.extend(true, {}, conf));
+ var input = el.getInput().data("rangeinput", el);
+ els = els ? els.add(input) : input;
+ });
+
+ return els ? els : this;
+ };
+
+
+}) (jQuery);
+
View
96 assets/javascripts/scrollable/scrollable.autoscroll.js
@@ -0,0 +1,96 @@
+/**
+ * @license
+ * jQuery Tools @VERSION / Scrollable Autoscroll
+ *
+ * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
+ *
+ * http://flowplayer.org/tools/scrollable/autoscroll.html
+ *
+ * Since: September 2009
+ * Date: @DATE
+ */
+(function($) {
+
+ var t = $.tools.scrollable;
+
+ t.autoscroll = {
+
+ conf: {
+ autoplay: true,
+ interval: 3000,
+ autopause: true
+ }
+ };
+
+ // jQuery plugin implementation
+ $.fn.autoscroll = function(conf) {
+
+ if (typeof conf == 'number') {
+ conf = {interval: conf};
+ }
+
+ var opts = $.extend({}, t.autoscroll.conf, conf), ret;
+
+ this.each(function() {
+
+ var api = $(this).data("scrollable"),
+ root = api.getRoot(),
+ // interval stuff
+ timer, stopped = false;
+
+ /**
+ *
+ * Function to run autoscroll through event binding rather than setInterval
+ * Fixes this bug: http://flowplayer.org/tools/forum/25/72029
+ */
+ function scroll(){
+ timer = setTimeout(function(){
+ api.next();
+ }, opts.interval);
+ }
+
+ if (api) { ret = api; }
+
+ api.play = function() {
+
+ // do not start additional timer if already exists
+ if (timer) { return; }
+
+ stopped = false;
+
+ root.bind('onSeek', scroll);
+ scroll();
+ };
+
+ api.pause = function() {
+ timer = clearTimeout(timer); // clear any queued items immediately
+ root.unbind('onSeek', scroll);
+ };
+
+ // resume playing if not stopped
+ api.resume = function() {
+ stopped || api.play();
+ };
+
+ // when stopped - mouseover won't restart
+ api.stop = function() {
+ stopped = true;
+ api.pause();
+ };
+
+ /* when mouse enters, autoscroll stops */
+ if (opts.autopause) {
+ root.add(api.getNaviButtons()).hover(api.pause, api.resume);
+ }
+
+ if (opts.autoplay) {
+ api.play();
+ }
+
+ });
+
+ return opts.api ? ret : this;
+
+ };
+
+})(jQuery);
View
368 assets/javascripts/scrollable/scrollable.js
@@ -0,0 +1,368 @@
+/**
+ * @license
+ * jQuery Tools @VERSION Scrollable - New wave UI design
+ *
+ * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
+ *
+ * http://flowplayer.org/tools/scrollable.html
+ *
+ * Since: March 2008
+ * Date: @DATE
+ */
+(function($) {
+
+ // static constructs
+ $.tools = $.tools || {version: '@VERSION'};
+
+ $.tools.scrollable = {
+
+ conf: {
+ activeClass: 'active',
+ circular: false,
+ clonedClass: 'cloned',
+ disabledClass: 'disabled',
+ easing: 'swing',
+ initialIndex: 0,
+ item: '> *',
+ items: '.items',
+ keyboard: true,
+ mousewheel: false,
+ next: '.next',
+ prev: '.prev',
+ size: 1,
+ speed: 400,
+ vertical: false,
+ touch: true,
+ wheelSpeed: 0
+ }
+ };
+
+ // get hidden element's width or height even though it's hidden
+ function dim(el, key) {
+ var v = parseInt(el.css(key), 10);
+ if (v) { return v; }
+ var s = el[0].currentStyle;
+ return s && s.width && parseInt(s.width, 10);
+ }
+
+ function find(root, query) {
+ var el = $(query);
+ return el.length < 2 ? el : root.parent().find(query);
+ }
+
+ var current;
+
+ // constructor
+ function Scrollable(root, conf) {
+
+ // current instance
+ var self = this,
+ fire = root.add(self),
+ itemWrap = root.children(),
+ index = 0,
+ vertical = conf.vertical;
+
+ if (!current) { current = self; }
+ if (itemWrap.length > 1) { itemWrap = $(conf.items, root); }
+
+
+ // in this version circular not supported when size > 1
+ if (conf.size > 1) { conf.circular = false; }
+
+ // methods
+ $.extend(self, {
+
+ getConf: function() {
+ return conf;
+ },
+
+ getIndex: function() {
+ return index;
+ },
+
+ getSize: function() {
+ return self.getItems().size();
+ },
+
+ getNaviButtons: function() {
+ return prev.add(next);
+ },
+
+ getRoot: function() {
+ return root;
+ },
+
+ getItemWrap: function() {
+ return itemWrap;
+ },
+
+ getItems: function() {
+ return itemWrap.find(conf.item).not("." + conf.clonedClass);
+ },
+
+ move: function(offset, time) {
+ return self.seekTo(index + offset, time);
+ },
+
+ next: function(time) {
+ return self.move(conf.size, time);
+ },
+
+ prev: function(time) {
+ return self.move(-conf.size, time);
+ },
+
+ begin: function(time) {
+ return self.seekTo(0, time);
+ },
+
+ end: function(time) {
+ return self.seekTo(self.getSize() -1, time);
+ },
+
+ focus: function() {
+ current = self;
+ return self;
+ },
+
+ addItem: function(item) {
+ item = $(item);
+
+ if (!conf.circular) {
+ itemWrap.append(item);
+ next.removeClass("disabled");
+
+ } else {
+ itemWrap.children().last().before(item);
+ itemWrap.children().first().replaceWith(item.clone().addClass(conf.clonedClass));
+ }
+
+ fire.trigger("onAddItem", [item]);
+ return self;
+ },
+
+
+ /* all seeking functions depend on this */
+ seekTo: function(i, time, fn) {
+
+ // ensure numeric index
+ if (!i.jquery) { i *= 1; }
+
+ // avoid seeking from end clone to the beginning
+ if (conf.circular && i === 0 && index == -1 && time !== 0) { return self; }
+
+ // check that index is sane
+ if (!conf.circular && i < 0 || i > self.getSize() || i < -1) { return self; }
+
+ var item = i;
+
+ if (i.jquery) {
+ i = self.getItems().index(i);
+
+ } else {
+ item = self.getItems().eq(i);
+ }
+
+ // onBeforeSeek
+ var e = $.Event("onBeforeSeek");
+ if (!fn) {
+ fire.trigger(e, [i, time]);
+ if (e.isDefaultPrevented() || !item.length) { return self; }
+ }
+
+ var props = vertical ? {top: -item.position().top} : {left: -item.position().left};
+
+ index = i;
+ current = self;
+ if (time === undefined) { time = conf.speed; }
+
+ itemWrap.animate(props, time, conf.easing, fn || function() {
+ fire.trigger("onSeek", [i]);
+ });
+
+ return self;
+ }
+
+ });
+
+ // callbacks
+ $.each(['onBeforeSeek', 'onSeek', 'onAddItem'], function(i, name) {
+
+ // configuration
+ if ($.isFunction(conf[name])) {
+ $(self).bind(name, conf[name]);
+ }
+
+ self[name] = function(fn) {
+ if (fn) { $(self).bind(name, fn); }
+ return self;
+ };
+ });
+
+ // circular loop
+ if (conf.circular) {
+
+ var cloned1 = self.getItems().slice(-1).clone().prependTo(itemWrap),
+ cloned2 = self.getItems().eq(1).clone().appendTo(itemWrap);
+
+ cloned1.add(cloned2).addClass(conf.clonedClass);
+
+ self.onBeforeSeek(function(e, i, time) {
+
+ if (e.isDefaultPrevented()) { return; }
+
+ /*
+ 1. animate to the clone without event triggering
+ 2. seek to correct position with 0 speed
+ */
+ if (i == -1) {
+ self.seekTo(cloned1, time, function() {
+ self.end(0);
+ });
+ return e.preventDefault();
+
+ } else if (i == self.getSize()) {
+ self.seekTo(cloned2, time, function() {
+ self.begin(0);
+ });
+ }
+
+ });
+
+ // seek over the cloned item
+
+ // if the scrollable is hidden the calculations for seekTo position
+ // will be incorrect (eg, if the scrollable is inside an overlay).
+ // ensure the elements are shown, calculate the correct position,
+ // then re-hide the elements. This must be done synchronously to
+ // prevent the hidden elements being shown to the user.
+
+ // See: https://github.com/jquerytools/jquerytools/issues#issue/87
+
+ var hidden_parents = root.parents().add(root).filter(function () {
+ if ($(this).css('display') === 'none') {
+ return true;
+ }
+ });
+ if (hidden_parents.length) {
+ hidden_parents.show();
+ self.seekTo(0, 0, function() {});
+ hidden_parents.hide();
+ }
+ else {
+ self.seekTo(0, 0, function() {});
+ }
+
+ }
+
+ // next/prev buttons
+ var prev = find(root, conf.prev).click(function(e) { e.stopPropagation(); self.prev(); }),
+ next = find(root, conf.next).click(function(e) { e.stopPropagation(); self.next(); });
+
+ if (!conf.circular) {
+ self.onBeforeSeek(function(e, i) {
+ setTimeout(function() {
+ if (!e.isDefaultPrevented()) {
+ prev.toggleClass(conf.disabledClass, i <= 0);
+ next.toggleClass(conf.disabledClass, i >= self.getSize() -1);
+ }
+ }, 1);
+ });
+
+ if (!conf.initialIndex) {
+ prev.addClass(conf.disabledClass);
+ }
+ }
+
+ if (self.getSize() < 2) {
+ prev.add(next).addClass(conf.disabledClass);
+ }
+
+ // mousewheel support
+ if (conf.mousewheel && $.fn.mousewheel) {
+ root.mousewheel(function(e, delta) {
+ if (conf.mousewheel) {
+ self.move(delta < 0 ? 1 : -1, conf.wheelSpeed || 50);
+ return false;
+ }
+ });
+ }
+
+ // touch event
+ if (conf.touch) {
+ var touch = {};
+
+ itemWrap[0].ontouchstart = function(e) {
+ var t = e.touches[0];
+ touch.x = t.clientX;
+ touch.y = t.clientY;
+ };
+
+ itemWrap[0].ontouchmove = function(e) {
+
+ // only deal with one finger
+ if (e.touches.length == 1 && !itemWrap.is(":animated")) {
+ var t = e.touches[0],
+ deltaX = touch.x - t.clientX,
+ deltaY = touch.y - t.clientY;
+
+ self[vertical && deltaY > 0 || !vertical && deltaX > 0 ? 'next' : 'prev']();
+ e.preventDefault();
+ }
+ };
+ }
+
+ if (conf.keyboard) {
+
+ $(document).bind("keydown.scrollable", function(evt) {
+
+ // skip certain conditions
+ if (!conf.keyboard || evt.altKey || evt.ctrlKey || evt.metaKey || $(evt.target).is(":input")) {
+ return;
+ }
+
+ // does this instance have focus?
+ if (conf.keyboard != 'static' && current != self) { return; }
+
+ var key = evt.keyCode;
+
+ if (vertical && (key == 38 || key == 40)) {
+ self.move(key == 38 ? -1 : 1);
+ return evt.preventDefault();
+ }
+
+ if (!vertical && (key == 37 || key == 39)) {
+ self.move(key == 37 ? -1 : 1);
+ return evt.preventDefault();
+ }
+
+ });
+ }
+
+ // initial index
+ if (conf.initialIndex) {
+ self.seekTo(conf.initialIndex, 0, function() {});
+ }
+ }
+
+
+ // jQuery plugin implementation
+ $.fn.scrollable = function(conf) {
+
+ // already constructed --> return API
+ var el = this.data("scrollable");
+ if (el) { return el; }
+
+ conf = $.extend({}, $.tools.scrollable.conf, conf);
+
+ this.each(function() {
+ el = new Scrollable($(this), conf);
+ $(this).data("scrollable", el);
+ });
+
+ return conf.api ? el: this;
+
+ };
+
+
+})(jQuery);
View
134 assets/javascripts/scrollable/scrollable.navigator.js
@@ -0,0 +1,134 @@
+/**
+ * @license
+ * jQuery Tools @VERSION / Scrollable Navigator
+ *
+ * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
+ *
+ * http://flowplayer.org/tools/scrollable/navigator.html
+ *
+ * Since: September 2009
+ * Date: @DATE
+ */
+(function($) {
+
+ var t = $.tools.scrollable;
+
+ t.navigator = {
+
+ conf: {
+ navi: '.navi',
+ naviItem: null,
+ activeClass: 'active',
+ indexed: false,
+ idPrefix: null,
+
+ // 1.2
+ history: false
+ }
+ };
+
+ function find(root, query) {
+ var el = $(query);
+ return el.length < 2 ? el : root.parent().find(query);
+ }
+
+ // jQuery plugin implementation
+ $.fn.navigator = function(conf) {
+
+ // configuration
+ if (typeof conf == 'string') { conf = {navi: conf}; }
+ conf = $.extend({}, t.navigator.conf, conf);
+
+ var ret;
+
+ this.each(function() {
+
+ var api = $(this).data("scrollable"),
+ navi = conf.navi.jquery ? conf.navi : find(api.getRoot(), conf.navi),
+ buttons = api.getNaviButtons(),
+ cls = conf.activeClass,
+ hashed = conf.history && !!history.pushState,
+ size = api.getConf().size;
+
+