jquery.ui-all-1.5b3.js
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:262k
源码类别:

网络

开发平台:

Unix_Linux

  1. [this.ui(this.$tabs[index], this.$panels[index])], o.enable
  2. );
  3. },
  4. disable: function(index) {
  5. var self = this, o = this.options;
  6. if (index != o.selected) { // cannot disable already selected tab
  7. this.$lis.eq(index).addClass(o.disabledClass);
  8. o.disabled.push(index);
  9. o.disabled.sort();
  10. // callback
  11. $(this.element).triggerHandler('tabsdisable',
  12. [this.ui(this.$tabs[index], this.$panels[index])], o.disable
  13. );
  14. }
  15. },
  16. select: function(index) {
  17. if (typeof index == 'string')
  18. index = this.$tabs.index( this.$tabs.filter('[href$=' + index + ']')[0] );
  19. this.$tabs.eq(index).trigger(this.options.event);
  20. },
  21. load: function(index, callback) { // callback is for internal usage only
  22. var self = this, o = this.options, $a = this.$tabs.eq(index), a = $a[0],
  23. bypassCache = callback == undefined || callback === false, url = $a.data('load.tabs');
  24. callback = callback || function() {};
  25. // no remote or from cache - just finish with callback
  26. if (!url || ($.data(a, 'cache.tabs') && !bypassCache)) {
  27. callback();
  28. return;
  29. }
  30. // load remote from here on
  31. if (o.spinner) {
  32. var $span = $('span', a);
  33. $span.data('label.tabs', $span.html()).html('<em>' + o.spinner + '</em>');
  34. }
  35. var finish = function() {
  36. self.$tabs.filter('.' + o.loadingClass).each(function() {
  37. $(this).removeClass(o.loadingClass);
  38. if (o.spinner) {
  39. var $span = $('span', this);
  40. $span.html($span.data('label.tabs')).removeData('label.tabs');
  41. }
  42. });
  43. self.xhr = null;
  44. };
  45. var ajaxOptions = $.extend({}, o.ajaxOptions, {
  46. url: url,
  47. success: function(r, s) {
  48. $(a.hash).html(r);
  49. finish();
  50. if (o.cache)
  51. $.data(a, 'cache.tabs', true); // if loaded once do not load them again
  52. // callbacks
  53. $(self.element).triggerHandler('tabsload',
  54. [self.ui(self.$tabs[index], self.$panels[index])], o.load
  55. );
  56. o.ajaxOptions.success && o.ajaxOptions.success(r, s);
  57. // This callback is required because the switch has to take
  58. // place after loading has completed. Call last in order to 
  59. // fire load before show callback...
  60. callback();
  61. }
  62. });
  63. if (this.xhr) {
  64. // terminate pending requests from other tabs and restore tab label
  65. this.xhr.abort();
  66. finish();
  67. }
  68. $a.addClass(o.loadingClass);
  69. setTimeout(function() { // timeout is again required in IE, "wait" for id being restored
  70. self.xhr = $.ajax(ajaxOptions);
  71. }, 0);
  72. },
  73. url: function(index, url) {
  74. this.$tabs.eq(index).removeData('cache.tabs').data('load.tabs', url);
  75. },
  76. destroy: function() {
  77. var o = this.options;
  78. $(this.element).unbind('.tabs')
  79. .removeClass(o.navClass).removeData('tabs');
  80. this.$tabs.each(function() {
  81. var href = $.data(this, 'href.tabs');
  82. if (href)
  83. this.href = href;
  84. var $this = $(this).unbind('.tabs');
  85. $.each(['href', 'load', 'cache'], function(i, prefix) {
  86. $this.removeData(prefix + '.tabs');
  87. });
  88. });
  89. this.$lis.add(this.$panels).each(function() {
  90. if ($.data(this, 'destroy.tabs'))
  91. $(this).remove();
  92. else
  93. $(this).removeClass([o.selectedClass, o.unselectClass,
  94. o.disabledClass, o.panelClass, o.hideClass].join(' '));
  95. });
  96. }
  97. });
  98. $.ui.tabs.defaults = {
  99. // basic setup
  100. selected: 0,
  101. unselect: false,
  102. event: 'click',
  103. disabled: [],
  104. cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
  105. // TODO history: false,
  106. // Ajax
  107. spinner: 'Loading&#8230;',
  108. cache: false,
  109. idPrefix: 'ui-tabs-',
  110. ajaxOptions: {},
  111. // animations
  112. fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
  113. // templates
  114. tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>',
  115. panelTemplate: '<div></div>',
  116. // CSS classes
  117. navClass: 'ui-tabs-nav',
  118. selectedClass: 'ui-tabs-selected',
  119. unselectClass: 'ui-tabs-unselect',
  120. disabledClass: 'ui-tabs-disabled',
  121. panelClass: 'ui-tabs-panel',
  122. hideClass: 'ui-tabs-hide',
  123. loadingClass: 'ui-tabs-loading'
  124. };
  125. $.ui.tabs.getter = "length";
  126. /*
  127.  * Tabs Extensions
  128.  */
  129. /*
  130.  * Rotate
  131.  */
  132. $.extend($.ui.tabs.prototype, {
  133. rotation: null,
  134. rotate: function(ms, continuing) {
  135. continuing = continuing || false;
  136. var self = this, t = this.options.selected;
  137. function start() {
  138. self.rotation = setInterval(function() {
  139. t = ++t < self.$tabs.length ? t : 0;
  140. self.select(t);
  141. }, ms);
  142. }
  143. function stop(e) {
  144. if (!e || e.clientX) { // only in case of a true click
  145. clearInterval(self.rotation);
  146. }
  147. }
  148. // start interval
  149. if (ms) {
  150. start();
  151. if (!continuing)
  152. this.$tabs.bind(this.options.event, stop);
  153. else
  154. this.$tabs.bind(this.options.event, function() {
  155. stop();
  156. t = self.options.selected;
  157. start();
  158. });
  159. }
  160. // stop interval
  161. else {
  162. stop();
  163. this.$tabs.unbind(this.options.event, stop);
  164. }
  165. }
  166. });
  167. })(jQuery);
  168. /* jQuery UI Date Picker v3.4.3 (previously jQuery Calendar)
  169.    Written by Marc Grabanski (m@marcgrabanski.com) and Keith Wood (kbwood@virginbroadband.com.au).
  170.    Copyright (c) 2007 Marc Grabanski (http://marcgrabanski.com/code/ui-datepicker)
  171.    Dual licensed under the MIT (MIT-LICENSE.txt)
  172.    and GPL (GPL-LICENSE.txt) licenses.
  173.    Date: 09-03-2007  */
  174.    
  175. ;(function($) { // hide the namespace
  176. /* Date picker manager.
  177.    Use the singleton instance of this class, $.datepicker, to interact with the date picker.
  178.    Settings for (groups of) date pickers are maintained in an instance object
  179.    (DatepickerInstance), allowing multiple different settings on the same page. */
  180. function Datepicker() {
  181. this.debug = false; // Change this to true to start debugging
  182. this._nextId = 0; // Next ID for a date picker instance
  183. this._inst = []; // List of instances indexed by ID
  184. this._curInst = null; // The current instance in use
  185. this._disabledInputs = []; // List of date picker inputs that have been disabled
  186. this._datepickerShowing = false; // True if the popup picker is showing , false if not
  187. this._inDialog = false; // True if showing within a "dialog", false if not
  188. this.regional = []; // Available regional settings, indexed by language code
  189. this.regional[''] = { // Default regional settings
  190. clearText: 'Clear', // Display text for clear link
  191. clearStatus: 'Erase the current date', // Status text for clear link
  192. closeText: 'Close', // Display text for close link
  193. closeStatus: 'Close without change', // Status text for close link
  194. prevText: '&#x3c;Prev', // Display text for previous month link
  195. prevStatus: 'Show the previous month', // Status text for previous month link
  196. nextText: 'Next&#x3e;', // Display text for next month link
  197. nextStatus: 'Show the next month', // Status text for next month link
  198. currentText: 'Today', // Display text for current month link
  199. currentStatus: 'Show the current month', // Status text for current month link
  200. monthNames: ['January','February','March','April','May','June',
  201. 'July','August','September','October','November','December'], // Names of months for drop-down and formatting
  202. monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
  203. monthStatus: 'Show a different month', // Status text for selecting a month
  204. yearStatus: 'Show a different year', // Status text for selecting a year
  205. weekHeader: 'Wk', // Header for the week of the year column
  206. weekStatus: 'Week of the year', // Status text for the week of the year column
  207. dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
  208. dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
  209. dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
  210. dayStatus: 'Set DD as first week day', // Status text for the day of the week selection
  211. dateStatus: 'Select DD, M d', // Status text for the date selection
  212. dateFormat: 'mm/dd/yy', // See format options on parseDate
  213. firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
  214. initStatus: 'Select a date', // Initial Status text on opening
  215. isRTL: false // True if right-to-left language, false if left-to-right
  216. };
  217. this._defaults = { // Global defaults for all the date picker instances
  218. showOn: 'focus', // 'focus' for popup on focus,
  219. // 'button' for trigger button, or 'both' for either
  220. showAnim: 'show', // Name of jQuery animation for popup
  221. defaultDate: null, // Used when field is blank: actual date,
  222. // +/-number for offset from today, null for today
  223. appendText: '', // Display text following the input box, e.g. showing the format
  224. buttonText: '...', // Text for trigger button
  225. buttonImage: '', // URL for trigger button image
  226. buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
  227. closeAtTop: true, // True to have the clear/close at the top,
  228. // false to have them at the bottom
  229. mandatory: false, // True to hide the Clear link, false to include it
  230. hideIfNoPrevNext: false, // True to hide next/previous month links
  231. // if not applicable, false to just disable them
  232. changeMonth: true, // True if month can be selected directly, false if only prev/next
  233. changeYear: true, // True if year can be selected directly, false if only prev/next
  234. yearRange: '-10:+10', // Range of years to display in drop-down,
  235. // either relative to current year (-nn:+nn) or absolute (nnnn:nnnn)
  236. changeFirstDay: true, // True to click on day name to change, false to remain as set
  237. showOtherMonths: false, // True to show dates in other months, false to leave blank
  238. showWeeks: false, // True to show week of the year, false to omit
  239. calculateWeek: this.iso8601Week, // How to calculate the week of the year,
  240. // takes a Date and returns the number of the week for it
  241. shortYearCutoff: '+10', // Short year values < this are in the current century,
  242. // > this are in the previous century, 
  243. // string value starting with '+' for current year + value
  244. showStatus: false, // True to show status bar at bottom, false to not show it
  245. statusForDate: this.dateStatus, // Function to provide status text for a date -
  246. // takes date and instance as parameters, returns display text
  247. minDate: null, // The earliest selectable date, or null for no limit
  248. maxDate: null, // The latest selectable date, or null for no limit
  249. speed: 'normal', // Speed of display/closure
  250. beforeShowDay: null, // Function that takes a date and returns an array with
  251. // [0] = true if selectable, false if not,
  252. // [1] = custom CSS class name(s) or '', e.g. $.datepicker.noWeekends
  253. beforeShow: null, // Function that takes an input field and
  254. // returns a set of custom settings for the date picker
  255. onSelect: null, // Define a callback function when a date is selected
  256. onClose: null, // Define a callback function when the datepicker is closed
  257. numberOfMonths: 1, // Number of months to show at a time
  258. stepMonths: 1, // Number of months to step back/forward
  259. rangeSelect: false, // Allows for selecting a date range on one date picker
  260. rangeSeparator: ' - ' // Text between two dates in a range
  261. };
  262. $.extend(this._defaults, this.regional['']);
  263. this._datepickerDiv = $('<div id="datepicker_div"></div>');
  264. }
  265. $.extend(Datepicker.prototype, {
  266. /* Class name added to elements to indicate already configured with a date picker. */
  267. markerClassName: 'hasDatepicker',
  268. /* Debug logging (if enabled). */
  269. log: function () {
  270. if (this.debug)
  271. console.log.apply('', arguments);
  272. },
  273. /* Register a new date picker instance - with custom settings. */
  274. _register: function(inst) {
  275. var id = this._nextId++;
  276. this._inst[id] = inst;
  277. return id;
  278. },
  279. /* Retrieve a particular date picker instance based on its ID. */
  280. _getInst: function(id) {
  281. return this._inst[id] || id;
  282. },
  283. /* Override the default settings for all instances of the date picker. 
  284.    @param  settings  object - the new settings to use as defaults (anonymous object)
  285.    @return the manager object */
  286. setDefaults: function(settings) {
  287. extendRemove(this._defaults, settings || {});
  288. return this;
  289. },
  290. /* Attach the date picker to a jQuery selection.
  291.    @param  target    element - the target input field or division or span
  292.    @param  settings  object - the new settings to use for this date picker instance (anonymous) */
  293. _attachDatepicker: function(target, settings) {
  294. // check for settings on the control itself - in namespace 'date:'
  295. var inlineSettings = null;
  296. for (attrName in this._defaults) {
  297. var attrValue = target.getAttribute('date:' + attrName);
  298. if (attrValue) {
  299. inlineSettings = inlineSettings || {};
  300. try {
  301. inlineSettings[attrName] = eval(attrValue);
  302. } catch (err) {
  303. inlineSettings[attrName] = attrValue;
  304. }
  305. }
  306. }
  307. var nodeName = target.nodeName.toLowerCase();
  308. var instSettings = (inlineSettings ? 
  309. $.extend(settings || {}, inlineSettings || {}) : settings);
  310. if (nodeName == 'input') {
  311. var inst = (inst && !inlineSettings ? inst :
  312. new DatepickerInstance(instSettings, false));
  313. this._connectDatepicker(target, inst);
  314. } else if (nodeName == 'div' || nodeName == 'span') {
  315. var inst = new DatepickerInstance(instSettings, true);
  316. this._inlineDatepicker(target, inst);
  317. }
  318. },
  319. /* Detach a datepicker from its control.
  320.    @param  target    element - the target input field or division or span */
  321. _destroyDatepicker: function(target) {
  322. var nodeName = target.nodeName.toLowerCase();
  323. var calId = target._calId;
  324. target._calId = null;
  325. var $target = $(target);
  326. if (nodeName == 'input') {
  327. $target.siblings('.datepicker_append').replaceWith('').end()
  328. .siblings('.datepicker_trigger').replaceWith('').end()
  329. .removeClass(this.markerClassName)
  330. .unbind('focus', this._showDatepicker)
  331. .unbind('keydown', this._doKeyDown)
  332. .unbind('keypress', this._doKeyPress);
  333. var wrapper = $target.parents('.datepicker_wrap');
  334. if (wrapper)
  335. wrapper.replaceWith(wrapper.html());
  336. } else if (nodeName == 'div' || nodeName == 'span')
  337. $target.removeClass(this.markerClassName).empty();
  338. if ($('input[_calId=' + calId + ']').length == 0)
  339. // clean up if last for this ID
  340. this._inst[calId] = null;
  341. },
  342. /* Enable the date picker to a jQuery selection.
  343.    @param  target    element - the target input field or division or span */
  344. _enableDatepicker: function(target) {
  345. target.disabled = false;
  346. $(target).siblings('button.datepicker_trigger').each(function() { this.disabled = false; }).end()
  347. .siblings('img.datepicker_trigger').css({opacity: '1.0', cursor: ''});
  348. this._disabledInputs = $.map(this._disabledInputs,
  349. function(value) { return (value == target ? null : value); }); // delete entry
  350. },
  351. /* Disable the date picker to a jQuery selection.
  352.    @param  target    element - the target input field or division or span */
  353. _disableDatepicker: function(target) {
  354. target.disabled = true;
  355. $(target).siblings('button.datepicker_trigger').each(function() { this.disabled = true; }).end()
  356. .siblings('img.datepicker_trigger').css({opacity: '0.5', cursor: 'default'});
  357. this._disabledInputs = $.map($.datepicker._disabledInputs,
  358. function(value) { return (value == target ? null : value); }); // delete entry
  359. this._disabledInputs[$.datepicker._disabledInputs.length] = target;
  360. },
  361. /* Is the first field in a jQuery collection disabled as a datepicker?
  362.    @param  target    element - the target input field or division or span
  363.    @return boolean - true if disabled, false if enabled */
  364. _isDisabledDatepicker: function(target) {
  365. if (!target)
  366. return false;
  367. for (var i = 0; i < this._disabledInputs.length; i++) {
  368. if (this._disabledInputs[i] == target)
  369. return true;
  370. }
  371. return false;
  372. },
  373. /* Update the settings for a date picker attached to an input field or division.
  374.    @param  target  element - the target input field or division or span
  375.    @param  name    string - the name of the setting to change or
  376.                    object - the new settings to update
  377.    @param  value   any - the new value for the setting (omit if above is an object) */
  378. _changeDatepicker: function(target, name, value) {
  379. var settings = name || {};
  380. if (typeof name == 'string') {
  381. settings = {};
  382. settings[name] = value;
  383. }
  384. if (inst = this._getInst(target._calId)) {
  385. extendRemove(inst._settings, settings);
  386. this._updateDatepicker(inst);
  387. }
  388. },
  389. /* Set the dates for a jQuery selection.
  390.    @param  target   element - the target input field or division or span
  391.    @param  date     Date - the new date
  392.    @param  endDate  Date - the new end date for a range (optional) */
  393. _setDateDatepicker: function(target, date, endDate) {
  394. if (inst = this._getInst(target._calId)) {
  395. inst._setDate(date, endDate);
  396. this._updateDatepicker(inst);
  397. }
  398. },
  399. /* Get the date(s) for the first entry in a jQuery selection.
  400.    @param  target  element - the target input field or division or span
  401.    @return Date - the current date or
  402.            Date[2] - the current dates for a range */
  403. _getDateDatepicker: function(target) {
  404. var inst = this._getInst(target._calId);
  405. return (inst ? inst._getDate() : null);
  406. },
  407. /* Handle keystrokes. */
  408. _doKeyDown: function(e) {
  409. var inst = $.datepicker._getInst(this._calId);
  410. if ($.datepicker._datepickerShowing)
  411. switch (e.keyCode) {
  412. case 9:  $.datepicker._hideDatepicker(null, '');
  413. break; // hide on tab out
  414. case 13: $.datepicker._selectDay(inst, inst._selectedMonth, inst._selectedYear,
  415. $('td.datepicker_daysCellOver', inst._datepickerDiv)[0]);
  416. return false; // don't submit the form
  417. break; // select the value on enter
  418. case 27: $.datepicker._hideDatepicker(null, inst._get('speed'));
  419. break; // hide on escape
  420. case 33: $.datepicker._adjustDate(inst,
  421. (e.ctrlKey ? -1 : -inst._get('stepMonths')), (e.ctrlKey ? 'Y' : 'M'));
  422. break; // previous month/year on page up/+ ctrl
  423. case 34: $.datepicker._adjustDate(inst,
  424. (e.ctrlKey ? +1 : +inst._get('stepMonths')), (e.ctrlKey ? 'Y' : 'M'));
  425. break; // next month/year on page down/+ ctrl
  426. case 35: if (e.ctrlKey) $.datepicker._clearDate(inst);
  427. break; // clear on ctrl+end
  428. case 36: if (e.ctrlKey) $.datepicker._gotoToday(inst);
  429. break; // current on ctrl+home
  430. case 37: if (e.ctrlKey) $.datepicker._adjustDate(inst, -1, 'D');
  431. break; // -1 day on ctrl+left
  432. case 38: if (e.ctrlKey) $.datepicker._adjustDate(inst, -7, 'D');
  433. break; // -1 week on ctrl+up
  434. case 39: if (e.ctrlKey) $.datepicker._adjustDate(inst, +1, 'D');
  435. break; // +1 day on ctrl+right
  436. case 40: if (e.ctrlKey) $.datepicker._adjustDate(inst, +7, 'D');
  437. break; // +1 week on ctrl+down
  438. }
  439. else if (e.keyCode == 36 && e.ctrlKey) // display the date picker on ctrl+home
  440. $.datepicker._showDatepicker(this);
  441. },
  442. /* Filter entered characters - based on date format. */
  443. _doKeyPress: function(e) {
  444. var inst = $.datepicker._getInst(this._calId);
  445. var chars = $.datepicker._possibleChars(inst._get('dateFormat'));
  446. var chr = String.fromCharCode(e.charCode == undefined ? e.keyCode : e.charCode);
  447. return e.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
  448. },
  449. /* Attach the date picker to an input field. */
  450. _connectDatepicker: function(target, inst) {
  451. var input = $(target);
  452. if (input.is('.' + this.markerClassName))
  453. return;
  454. var appendText = inst._get('appendText');
  455. var isRTL = inst._get('isRTL');
  456. if (appendText) {
  457. if (isRTL)
  458. input.before('<span class="datepicker_append">' + appendText);
  459. else
  460. input.after('<span class="datepicker_append">' + appendText);
  461. }
  462. var showOn = inst._get('showOn');
  463. if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
  464. input.focus(this._showDatepicker);
  465. if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
  466. input.wrap('<span class="datepicker_wrap">');
  467. var buttonText = inst._get('buttonText');
  468. var buttonImage = inst._get('buttonImage');
  469. var trigger = $(inst._get('buttonImageOnly') ? 
  470. $('<img>').addClass('datepicker_trigger').attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
  471. $('<button>').addClass('datepicker_trigger').attr({ type: 'button' }).html(buttonImage != '' ? 
  472. $('<img>').attr({ src:buttonImage, alt:buttonText, title:buttonText }) : buttonText));
  473. if (isRTL)
  474. input.before(trigger);
  475. else
  476. input.after(trigger);
  477. trigger.click(function() {
  478. if ($.datepicker._datepickerShowing && $.datepicker._lastInput == target)
  479. $.datepicker._hideDatepicker();
  480. else
  481. $.datepicker._showDatepicker(target);
  482. });
  483.         }
  484. input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress)
  485. .bind("setData.datepicker", function(event, key, value) {
  486. inst._settings[key] = value;
  487. }).bind("getData.datepicker", function(event, key) {
  488. return inst._get(key);
  489. });
  490. input[0]._calId = inst._id;
  491. },
  492. /* Attach an inline date picker to a div. */
  493. _inlineDatepicker: function(target, inst) {
  494. var input = $(target);
  495. if (input.is('.' + this.markerClassName))
  496. return;
  497. input.addClass(this.markerClassName).append(inst._datepickerDiv)
  498. .bind("setData.datepicker", function(event, key, value){
  499. inst._settings[key] = value;
  500. }).bind("getData.datepicker", function(event, key){
  501. return inst._get(key);
  502. });
  503. input[0]._calId = inst._id;
  504. this._updateDatepicker(inst);
  505. },
  506. /* Tidy up after displaying the date picker. */
  507. _inlineShow: function(inst) {
  508. var numMonths = inst._getNumberOfMonths(); // fix width for dynamic number of date pickers
  509. inst._datepickerDiv.width(numMonths[1] * $('.datepicker', inst._datepickerDiv[0]).width());
  510. }, 
  511. /* Pop-up the date picker in a "dialog" box.
  512.    @param  input     element - ignored
  513.    @param  dateText  string - the initial date to display (in the current format)
  514.    @param  onSelect  function - the function(dateText) to call when a date is selected
  515.    @param  settings  object - update the dialog date picker instance's settings (anonymous object)
  516.    @param  pos       int[2] - coordinates for the dialog's position within the screen or
  517.                      event - with x/y coordinates or
  518.                      leave empty for default (screen centre)
  519.    @return the manager object */
  520. _dialogDatepicker: function(input, dateText, onSelect, settings, pos) {
  521. var inst = this._dialogInst; // internal instance
  522. if (!inst) {
  523. inst = this._dialogInst = new DatepickerInstance({}, false);
  524. this._dialogInput = $('<input type="text" size="1" style="position: absolute; top: -100px;"/>');
  525. this._dialogInput.keydown(this._doKeyDown);
  526. $('body').append(this._dialogInput);
  527. this._dialogInput[0]._calId = inst._id;
  528. }
  529. extendRemove(inst._settings, settings || {});
  530. this._dialogInput.val(dateText);
  531. this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
  532. if (!this._pos) {
  533. var browserWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
  534. var browserHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
  535. var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
  536. var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
  537. this._pos = // should use actual width/height below
  538. [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
  539. }
  540. // move input on screen for focus, but hidden behind dialog
  541. this._dialogInput.css('left', this._pos[0] + 'px').css('top', this._pos[1] + 'px');
  542. inst._settings.onSelect = onSelect;
  543. this._inDialog = true;
  544. this._datepickerDiv.addClass('datepicker_dialog');
  545. this._showDatepicker(this._dialogInput[0]);
  546. if ($.blockUI)
  547. $.blockUI(this._datepickerDiv);
  548. return this;
  549. },
  550. /* Pop-up the date picker for a given input field.
  551.    @param  input  element - the input field attached to the date picker or
  552.                   event - if triggered by focus */
  553. _showDatepicker: function(input) {
  554. input = input.target || input;
  555. if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
  556. input = $('input', input.parentNode)[0];
  557. if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
  558. return;
  559. var inst = $.datepicker._getInst(input._calId);
  560. var beforeShow = inst._get('beforeShow');
  561. extendRemove(inst._settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
  562. $.datepicker._hideDatepicker(null, '');
  563. $.datepicker._lastInput = input;
  564. inst._setDateFromField(input);
  565. if ($.datepicker._inDialog) // hide cursor
  566. input.value = '';
  567. if (!$.datepicker._pos) { // position below input
  568. $.datepicker._pos = $.datepicker._findPos(input);
  569. $.datepicker._pos[1] += input.offsetHeight; // add the height
  570. }
  571. var isFixed = false;
  572. $(input).parents().each(function() {
  573. isFixed |= $(this).css('position') == 'fixed';
  574. });
  575. if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
  576. $.datepicker._pos[0] -= document.documentElement.scrollLeft;
  577. $.datepicker._pos[1] -= document.documentElement.scrollTop;
  578. }
  579. inst._datepickerDiv.css('position', ($.datepicker._inDialog && $.blockUI ?
  580. 'static' : (isFixed ? 'fixed' : 'absolute')))
  581. .css({ left: $.datepicker._pos[0] + 'px', top: $.datepicker._pos[1] + 'px' });
  582. $.datepicker._pos = null;
  583. inst._rangeStart = null;
  584. $.datepicker._updateDatepicker(inst);
  585. if (!inst._inline) {
  586. var speed = inst._get('speed');
  587. var postProcess = function() {
  588. $.datepicker._datepickerShowing = true;
  589. $.datepicker._afterShow(inst);
  590. };
  591. var showAnim = inst._get('showAnim') || 'show';
  592. inst._datepickerDiv[showAnim](speed, postProcess);
  593. if (speed == '')
  594. postProcess();
  595. if (inst._input[0].type != 'hidden')
  596. inst._input[0].focus();
  597. $.datepicker._curInst = inst;
  598. }
  599. },
  600. /* Generate the date picker content. */
  601. _updateDatepicker: function(inst) {
  602. inst._datepickerDiv.empty().append(inst._generateDatepicker());
  603. var numMonths = inst._getNumberOfMonths();
  604. if (numMonths[0] != 1 || numMonths[1] != 1)
  605. inst._datepickerDiv.addClass('datepicker_multi');
  606. else
  607. inst._datepickerDiv.removeClass('datepicker_multi');
  608. if (inst._get('isRTL'))
  609. inst._datepickerDiv.addClass('datepicker_rtl');
  610. else
  611. inst._datepickerDiv.removeClass('datepicker_rtl');
  612. if (inst._input && inst._input[0].type != 'hidden')
  613. $(inst._input[0]).focus();
  614. },
  615. /* Tidy up after displaying the date picker. */
  616. _afterShow: function(inst) {
  617. var numMonths = inst._getNumberOfMonths(); // fix width for dynamic number of date pickers
  618. inst._datepickerDiv.width(numMonths[1] * $('.datepicker', inst._datepickerDiv[0])[0].offsetWidth);
  619. if ($.browser.msie && parseInt($.browser.version) < 7) { // fix IE < 7 select problems
  620. $('iframe.datepicker_cover').css({width: inst._datepickerDiv.width() + 4,
  621. height: inst._datepickerDiv.height() + 4});
  622. }
  623. // re-position on screen if necessary
  624. var isFixed = inst._datepickerDiv.css('position') == 'fixed';
  625. var pos = inst._input ? $.datepicker._findPos(inst._input[0]) : null;
  626. var browserWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
  627. var browserHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
  628. var scrollX = (isFixed ? 0 : document.documentElement.scrollLeft || document.body.scrollLeft);
  629. var scrollY = (isFixed ? 0 : document.documentElement.scrollTop || document.body.scrollTop);
  630. // reposition date picker horizontally if outside the browser window
  631. if ((inst._datepickerDiv.offset().left + inst._datepickerDiv.width() -
  632. (isFixed && $.browser.msie ? document.documentElement.scrollLeft : 0)) >
  633. (browserWidth + scrollX)) {
  634. inst._datepickerDiv.css('left', Math.max(scrollX,
  635. pos[0] + (inst._input ? $(inst._input[0]).width() : null) - inst._datepickerDiv.width() -
  636. (isFixed && $.browser.opera ? document.documentElement.scrollLeft : 0)) + 'px');
  637. }
  638. // reposition date picker vertically if outside the browser window
  639. if ((inst._datepickerDiv.offset().top + inst._datepickerDiv.height() -
  640. (isFixed && $.browser.msie ? document.documentElement.scrollTop : 0)) >
  641. (browserHeight + scrollY) ) {
  642. inst._datepickerDiv.css('top', Math.max(scrollY,
  643. pos[1] - (this._inDialog ? 0 : inst._datepickerDiv.height()) -
  644. (isFixed && $.browser.opera ? document.documentElement.scrollTop : 0)) + 'px');
  645. }
  646. },
  647. /* Find an object's position on the screen. */
  648. _findPos: function(obj) {
  649.         while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
  650.             obj = obj.nextSibling;
  651.         }
  652.         var position = $(obj).offset();
  653.     return [position.left, position.top];
  654. },
  655. /* Hide the date picker from view.
  656.    @param  input  element - the input field attached to the date picker
  657.    @param  speed  string - the speed at which to close the date picker */
  658. _hideDatepicker: function(input, speed) {
  659. var inst = this._curInst;
  660. if (!inst)
  661. return;
  662. var rangeSelect = inst._get('rangeSelect');
  663. if (rangeSelect && this._stayOpen) {
  664. this._selectDate(inst, inst._formatDate(
  665. inst._currentDay, inst._currentMonth, inst._currentYear));
  666. }
  667. this._stayOpen = false;
  668. if (this._datepickerShowing) {
  669. speed = (speed != null ? speed : inst._get('speed'));
  670. var showAnim = inst._get('showAnim');
  671. inst._datepickerDiv[(showAnim == 'slideDown' ? 'slideUp' :
  672. (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))](speed, function() {
  673. $.datepicker._tidyDialog(inst);
  674. });
  675. if (speed == '')
  676. this._tidyDialog(inst);
  677. var onClose = inst._get('onClose');
  678. if (onClose) {
  679. onClose.apply((inst._input ? inst._input[0] : null),
  680. [inst._getDate(), inst]);  // trigger custom callback
  681. }
  682. this._datepickerShowing = false;
  683. this._lastInput = null;
  684. inst._settings.prompt = null;
  685. if (this._inDialog) {
  686. this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
  687. if ($.blockUI) {
  688. $.unblockUI();
  689. $('body').append(this._datepickerDiv);
  690. }
  691. }
  692. this._inDialog = false;
  693. }
  694. this._curInst = null;
  695. },
  696. /* Tidy up after a dialog display. */
  697. _tidyDialog: function(inst) {
  698. inst._datepickerDiv.removeClass('datepicker_dialog').unbind('.datepicker');
  699. $('.datepicker_prompt', inst._datepickerDiv).remove();
  700. },
  701. /* Close date picker if clicked elsewhere. */
  702. _checkExternalClick: function(event) {
  703. if (!$.datepicker._curInst)
  704. return;
  705. var $target = $(event.target);
  706. if (($target.parents("#datepicker_div").length == 0) &&
  707. ($target.attr('class') != 'datepicker_trigger') &&
  708. $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI)) {
  709. $.datepicker._hideDatepicker(null, '');
  710. }
  711. },
  712. /* Adjust one of the date sub-fields. */
  713. _adjustDate: function(id, offset, period) {
  714. var inst = this._getInst(id);
  715. inst._adjustDate(offset, period);
  716. this._updateDatepicker(inst);
  717. },
  718. /* Action for current link. */
  719. _gotoToday: function(id) {
  720. var date = new Date();
  721. var inst = this._getInst(id);
  722. inst._selectedDay = date.getDate();
  723. inst._drawMonth = inst._selectedMonth = date.getMonth();
  724. inst._drawYear = inst._selectedYear = date.getFullYear();
  725. this._adjustDate(inst);
  726. },
  727. /* Action for selecting a new month/year. */
  728. _selectMonthYear: function(id, select, period) {
  729. var inst = this._getInst(id);
  730. inst._selectingMonthYear = false;
  731. inst[period == 'M' ? '_drawMonth' : '_drawYear'] =
  732. select.options[select.selectedIndex].value - 0;
  733. this._adjustDate(inst);
  734. },
  735. /* Restore input focus after not changing month/year. */
  736. _clickMonthYear: function(id) {
  737. var inst = this._getInst(id);
  738. if (inst._input && inst._selectingMonthYear && !$.browser.msie)
  739. inst._input[0].focus();
  740. inst._selectingMonthYear = !inst._selectingMonthYear;
  741. },
  742. /* Action for changing the first week day. */
  743. _changeFirstDay: function(id, day) {
  744. var inst = this._getInst(id);
  745. inst._settings.firstDay = day;
  746. this._updateDatepicker(inst);
  747. },
  748. /* Action for selecting a day. */
  749. _selectDay: function(id, month, year, td) {
  750. if ($(td).is('.datepicker_unselectable'))
  751. return;
  752. var inst = this._getInst(id);
  753. var rangeSelect = inst._get('rangeSelect');
  754. if (rangeSelect) {
  755. if (!this._stayOpen) {
  756. $('.datepicker td').removeClass('datepicker_currentDay');
  757. $(td).addClass('datepicker_currentDay');
  758. this._stayOpen = !this._stayOpen;
  759. }
  760. inst._selectedDay = inst._currentDay = $('a', td).html();
  761. inst._selectedMonth = inst._currentMonth = month;
  762. inst._selectedYear = inst._currentYear = year;
  763. this._selectDate(id, inst._formatDate(
  764. inst._currentDay, inst._currentMonth, inst._currentYear));
  765. if (this._stayOpen) {
  766. inst._endDay = inst._endMonth = inst._endYear = null;
  767. inst._rangeStart = new Date(inst._currentYear, inst._currentMonth, inst._currentDay);
  768. this._updateDatepicker(inst);
  769. }
  770. else if (rangeSelect) {
  771. inst._endDay = inst._currentDay;
  772. inst._endMonth = inst._currentMonth;
  773. inst._endYear = inst._currentYear;
  774. inst._selectedDay = inst._currentDay = inst._rangeStart.getDate();
  775. inst._selectedMonth = inst._currentMonth = inst._rangeStart.getMonth();
  776. inst._selectedYear = inst._currentYear = inst._rangeStart.getFullYear();
  777. inst._rangeStart = null;
  778. if (inst._inline)
  779. this._updateDatepicker(inst);
  780. }
  781. },
  782. /* Erase the input field and hide the date picker. */
  783. _clearDate: function(id) {
  784. var inst = this._getInst(id);
  785. if (inst._get('mandatory'))
  786. return;
  787. this._stayOpen = false;
  788. inst._endDay = inst._endMonth = inst._endYear = inst._rangeStart = null;
  789. this._selectDate(inst, '');
  790. },
  791. /* Update the input field with the selected date. */
  792. _selectDate: function(id, dateStr) {
  793. var inst = this._getInst(id);
  794. dateStr = (dateStr != null ? dateStr : inst._formatDate());
  795. if (inst._rangeStart)
  796. dateStr = inst._formatDate(inst._rangeStart) + inst._get('rangeSeparator') + dateStr;
  797. if (inst._input)
  798. inst._input.val(dateStr);
  799. var onSelect = inst._get('onSelect');
  800. if (onSelect)
  801. onSelect.apply((inst._input ? inst._input[0] : null), [dateStr, inst]);  // trigger custom callback
  802. else if (inst._input)
  803. inst._input.trigger('change'); // fire the change event
  804. if (inst._inline)
  805. this._updateDatepicker(inst);
  806. else if (!this._stayOpen) {
  807. this._hideDatepicker(null, inst._get('speed'));
  808. this._lastInput = inst._input[0];
  809. if (typeof(inst._input[0]) != 'object')
  810. inst._input[0].focus(); // restore focus
  811. this._lastInput = null;
  812. }
  813. },
  814. /* Set as beforeShowDay function to prevent selection of weekends.
  815.    @param  date  Date - the date to customise
  816.    @return [boolean, string] - is this date selectable?, what is its CSS class? */
  817. noWeekends: function(date) {
  818. var day = date.getDay();
  819. return [(day > 0 && day < 6), ''];
  820. },
  821. /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
  822.    @param  date  Date - the date to get the week for
  823.    @return  number - the number of the week within the year that contains this date */
  824. iso8601Week: function(date) {
  825. var checkDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), (date.getTimezoneOffset() / -60));
  826. var firstMon = new Date(checkDate.getFullYear(), 1 - 1, 4); // First week always contains 4 Jan
  827. var firstDay = firstMon.getDay() || 7; // Day of week: Mon = 1, ..., Sun = 7
  828. firstMon.setDate(firstMon.getDate() + 1 - firstDay); // Preceding Monday
  829. if (firstDay < 4 && checkDate < firstMon) { // Adjust first three days in year if necessary
  830. checkDate.setDate(checkDate.getDate() - 3); // Generate for previous year
  831. return $.datepicker.iso8601Week(checkDate);
  832. } else if (checkDate > new Date(checkDate.getFullYear(), 12 - 1, 28)) { // Check last three days in year
  833. firstDay = new Date(checkDate.getFullYear() + 1, 1 - 1, 4).getDay() || 7;
  834. if (firstDay > 4 && (checkDate.getDay() || 7) < firstDay - 3) { // Adjust if necessary
  835. checkDate.setDate(checkDate.getDate() + 3); // Generate for next year
  836. return $.datepicker.iso8601Week(checkDate);
  837. }
  838. }
  839. return Math.floor(((checkDate - firstMon) / 86400000) / 7) + 1; // Weeks to given date
  840. },
  841. /* Provide status text for a particular date.
  842.    @param  date  the date to get the status for
  843.    @param  inst  the current datepicker instance
  844.    @return  the status display text for this date */
  845. dateStatus: function(date, inst) {
  846. return $.datepicker.formatDate(inst._get('dateStatus'), date, inst._getFormatConfig());
  847. },
  848. /* Parse a string value into a date object.
  849.    The format can be combinations of the following:
  850.    d  - day of month (no leading zero)
  851.    dd - day of month (two digit)
  852.    D  - day name short
  853.    DD - day name long
  854.    m  - month of year (no leading zero)
  855.    mm - month of year (two digit)
  856.    M  - month name short
  857.    MM - month name long
  858.    y  - year (two digit)
  859.    yy - year (four digit)
  860.    '...' - literal text
  861.    '' - single quote
  862.    @param  format           String - the expected format of the date
  863.    @param  value            String - the date in the above format
  864.    @param  settings  Object - attributes include:
  865.                      shortYearCutoff  Number - the cutoff year for determining the century (optional)
  866.                      dayNamesShort    String[7] - abbreviated names of the days from Sunday (optional)
  867.                      dayNames         String[7] - names of the days from Sunday (optional)
  868.                      monthNamesShort  String[12] - abbreviated names of the months (optional)
  869.                      monthNames       String[12] - names of the months (optional)
  870.    @return  Date - the extracted date value or null if value is blank */
  871. parseDate: function (format, value, settings) {
  872. if (format == null || value == null)
  873. throw 'Invalid arguments';
  874. value = (typeof value == 'object' ? value.toString() : value + '');
  875. if (value == '')
  876. return null;
  877. var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
  878. var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
  879. var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
  880. var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
  881. var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
  882. var year = -1;
  883. var month = -1;
  884. var day = -1;
  885. var literal = false;
  886. // Check whether a format character is doubled
  887. var lookAhead = function(match) {
  888. var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
  889. if (matches)
  890. iFormat++;
  891. return matches;
  892. };
  893. // Extract a number from the string value
  894. var getNumber = function(match) {
  895. lookAhead(match);
  896. var size = (match == 'y' ? 4 : 2);
  897. var num = 0;
  898. while (size > 0 && iValue < value.length &&
  899. value.charAt(iValue) >= '0' && value.charAt(iValue) <= '9') {
  900. num = num * 10 + (value.charAt(iValue++) - 0);
  901. size--;
  902. }
  903. if (size == (match == 'y' ? 4 : 2))
  904. throw 'Missing number at position ' + iValue;
  905. return num;
  906. };
  907. // Extract a name from the string value and convert to an index
  908. var getName = function(match, shortNames, longNames) {
  909. var names = (lookAhead(match) ? longNames : shortNames);
  910. var size = 0;
  911. for (var j = 0; j < names.length; j++)
  912. size = Math.max(size, names[j].length);
  913. var name = '';
  914. var iInit = iValue;
  915. while (size > 0 && iValue < value.length) {
  916. name += value.charAt(iValue++);
  917. for (var i = 0; i < names.length; i++)
  918. if (name == names[i])
  919. return i + 1;
  920. size--;
  921. }
  922. throw 'Unknown name at position ' + iInit;
  923. };
  924. // Confirm that a literal character matches the string value
  925. var checkLiteral = function() {
  926. if (value.charAt(iValue) != format.charAt(iFormat))
  927. throw 'Unexpected literal at position ' + iValue;
  928. iValue++;
  929. };
  930. var iValue = 0;
  931. for (var iFormat = 0; iFormat < format.length; iFormat++) {
  932. if (literal)
  933. if (format.charAt(iFormat) == "'" && !lookAhead("'"))
  934. literal = false;
  935. else
  936. checkLiteral();
  937. else
  938. switch (format.charAt(iFormat)) {
  939. case 'd':
  940. day = getNumber('d');
  941. break;
  942. case 'D': 
  943. getName('D', dayNamesShort, dayNames);
  944. break;
  945. case 'm': 
  946. month = getNumber('m');
  947. break;
  948. case 'M':
  949. month = getName('M', monthNamesShort, monthNames); 
  950. break;
  951. case 'y':
  952. year = getNumber('y');
  953. break;
  954. case "'":
  955. if (lookAhead("'"))
  956. checkLiteral();
  957. else
  958. literal = true;
  959. break;
  960. default:
  961. checkLiteral();
  962. }
  963. }
  964. if (year < 100) {
  965. year += new Date().getFullYear() - new Date().getFullYear() % 100 +
  966. (year <= shortYearCutoff ? 0 : -100);
  967. }
  968. var date = new Date(year, month - 1, day);
  969. if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day) {
  970. throw 'Invalid date'; // E.g. 31/02/*
  971. }
  972. return date;
  973. },
  974. /* Format a date object into a string value.
  975.    The format can be combinations of the following:
  976.    d  - day of month (no leading zero)
  977.    dd - day of month (two digit)
  978.    D  - day name short
  979.    DD - day name long
  980.    m  - month of year (no leading zero)
  981.    mm - month of year (two digit)
  982.    M  - month name short
  983.    MM - month name long
  984.    y  - year (two digit)
  985.    yy - year (four digit)
  986.    '...' - literal text
  987.    '' - single quote
  988.    @param  format    String - the desired format of the date
  989.    @param  date      Date - the date value to format
  990.    @param  settings  Object - attributes include:
  991.                      dayNamesShort    String[7] - abbreviated names of the days from Sunday (optional)
  992.                      dayNames         String[7] - names of the days from Sunday (optional)
  993.                      monthNamesShort  String[12] - abbreviated names of the months (optional)
  994.                      monthNames       String[12] - names of the months (optional)
  995.    @return  String - the date in the above format */
  996. formatDate: function (format, date, settings) {
  997. if (!date)
  998. return '';
  999. var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
  1000. var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
  1001. var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
  1002. var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
  1003. // Check whether a format character is doubled
  1004. var lookAhead = function(match) {
  1005. var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
  1006. if (matches)
  1007. iFormat++;
  1008. return matches;
  1009. };
  1010. // Format a number, with leading zero if necessary
  1011. var formatNumber = function(match, value) {
  1012. return (lookAhead(match) && value < 10 ? '0' : '') + value;
  1013. };
  1014. // Format a name, short or long as requested
  1015. var formatName = function(match, value, shortNames, longNames) {
  1016. return (lookAhead(match) ? longNames[value] : shortNames[value]);
  1017. };
  1018. var output = '';
  1019. var literal = false;
  1020. if (date) {
  1021. for (var iFormat = 0; iFormat < format.length; iFormat++) {
  1022. if (literal)
  1023. if (format.charAt(iFormat) == "'" && !lookAhead("'"))
  1024. literal = false;
  1025. else
  1026. output += format.charAt(iFormat);
  1027. else
  1028. switch (format.charAt(iFormat)) {
  1029. case 'd':
  1030. output += formatNumber('d', date.getDate()); 
  1031. break;
  1032. case 'D': 
  1033. output += formatName('D', date.getDay(), dayNamesShort, dayNames);
  1034. break;
  1035. case 'm': 
  1036. output += formatNumber('m', date.getMonth() + 1); 
  1037. break;
  1038. case 'M':
  1039. output += formatName('M', date.getMonth(), monthNamesShort, monthNames); 
  1040. break;
  1041. case 'y':
  1042. output += (lookAhead('y') ? date.getFullYear() : 
  1043. (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
  1044. break;
  1045. case "'":
  1046. if (lookAhead("'"))
  1047. output += "'";
  1048. else
  1049. literal = true;
  1050. break;
  1051. default:
  1052. output += format.charAt(iFormat);
  1053. }
  1054. }
  1055. }
  1056. return output;
  1057. },
  1058. /* Extract all possible characters from the date format. */
  1059. _possibleChars: function (format) {
  1060. var chars = '';
  1061. var literal = false;
  1062. for (var iFormat = 0; iFormat < format.length; iFormat++)
  1063. if (literal)
  1064. if (format.charAt(iFormat) == "'" && !lookAhead("'"))
  1065. literal = false;
  1066. else
  1067. chars += format.charAt(iFormat);
  1068. else
  1069. switch (format.charAt(iFormat)) {
  1070. case 'd' || 'm' || 'y':
  1071. chars += '0123456789'; 
  1072. break;
  1073. case 'D' || 'M':
  1074. return null; // Accept anything
  1075. case "'":
  1076. if (lookAhead("'"))
  1077. chars += "'";
  1078. else
  1079. literal = true;
  1080. break;
  1081. default:
  1082. chars += format.charAt(iFormat);
  1083. }
  1084. return chars;
  1085. }
  1086. });
  1087. /* Individualised settings for date picker functionality applied to one or more related inputs.
  1088.    Instances are managed and manipulated through the Datepicker manager. */
  1089. function DatepickerInstance(settings, inline) {
  1090. this._id = $.datepicker._register(this);
  1091. this._selectedDay = 0; // Current date for selection
  1092. this._selectedMonth = 0; // 0-11
  1093. this._selectedYear = 0; // 4-digit year
  1094. this._drawMonth = 0; // Current month at start of datepicker
  1095. this._drawYear = 0;
  1096. this._input = null; // The attached input field
  1097. this._inline = inline; // True if showing inline, false if used in a popup
  1098. this._datepickerDiv = (!inline ? $.datepicker._datepickerDiv :
  1099. $('<div id="datepicker_div_' + this._id + '" class="datepicker_inline">'));
  1100. // customise the date picker object - uses manager defaults if not overridden
  1101. this._settings = extendRemove(settings || {}); // clone
  1102. if (inline)
  1103. this._setDate(this._getDefaultDate());
  1104. }
  1105. $.extend(DatepickerInstance.prototype, {
  1106. /* Get a setting value, defaulting if necessary. */
  1107. _get: function(name) {
  1108. return this._settings[name] !== undefined ? this._settings[name] : $.datepicker._defaults[name];
  1109. },
  1110. /* Parse existing date and initialise date picker. */
  1111. _setDateFromField: function(input) {
  1112. this._input = $(input);
  1113. var dateFormat = this._get('dateFormat');
  1114. var dates = this._input ? this._input.val().split(this._get('rangeSeparator')) : null; 
  1115. this._endDay = this._endMonth = this._endYear = null;
  1116. var date = defaultDate = this._getDefaultDate();
  1117. if (dates.length > 0) {
  1118. var settings = this._getFormatConfig();
  1119. if (dates.length > 1) {
  1120. date = $.datepicker.parseDate(dateFormat, dates[1], settings) || defaultDate;
  1121. this._endDay = date.getDate();
  1122. this._endMonth = date.getMonth();
  1123. this._endYear = date.getFullYear();
  1124. }
  1125. try {
  1126. date = $.datepicker.parseDate(dateFormat, dates[0], settings) || defaultDate;
  1127. } catch (e) {
  1128. $.datepicker.log(e);
  1129. date = defaultDate;
  1130. }
  1131. }
  1132. this._selectedDay = date.getDate();
  1133. this._drawMonth = this._selectedMonth = date.getMonth();
  1134. this._drawYear = this._selectedYear = date.getFullYear();
  1135. this._currentDay = (dates[0] ? date.getDate() : 0);
  1136. this._currentMonth = (dates[0] ? date.getMonth() : 0);
  1137. this._currentYear = (dates[0] ? date.getFullYear() : 0);
  1138. this._adjustDate();
  1139. },
  1140. /* Retrieve the default date shown on opening. */
  1141. _getDefaultDate: function() {
  1142. var date = this._determineDate('defaultDate', new Date());
  1143. var minDate = this._getMinMaxDate('min', true);
  1144. var maxDate = this._getMinMaxDate('max');
  1145. date = (minDate && date < minDate ? minDate : date);
  1146. date = (maxDate && date > maxDate ? maxDate : date);
  1147. return date;
  1148. },
  1149. /* A date may be specified as an exact value or a relative one. */
  1150. _determineDate: function(name, defaultDate) {
  1151. var offsetNumeric = function(offset) {
  1152. var date = new Date();
  1153. date.setDate(date.getDate() + offset);
  1154. return date;
  1155. };
  1156. var offsetString = function(offset, getDaysInMonth) {
  1157. var date = new Date();
  1158. var matches = /^([+-]?[0-9]+)s*(d|D|w|W|m|M|y|Y)?$/.exec(offset);
  1159. if (matches) {
  1160. var year = date.getFullYear();
  1161. var month = date.getMonth();
  1162. var day = date.getDate();
  1163. switch (matches[2] || 'd') {
  1164. case 'd' : case 'D' :
  1165. day += (matches[1] - 0); break;
  1166. case 'w' : case 'W' :
  1167. day += (matches[1] * 7); break;
  1168. case 'm' : case 'M' :
  1169. month += (matches[1] - 0); 
  1170. day = Math.min(day, getDaysInMonth(year, month));
  1171. break;
  1172. case 'y': case 'Y' :
  1173. year += (matches[1] - 0);
  1174. day = Math.min(day, getDaysInMonth(year, month));
  1175. break;
  1176. }
  1177. date = new Date(year, month, day);
  1178. }
  1179. return date;
  1180. };
  1181. var date = this._get(name);
  1182. return (date == null ? defaultDate :
  1183. (typeof date == 'string' ? offsetString(date, this._getDaysInMonth) :
  1184. (typeof date == 'number' ? offsetNumeric(date) : date)));
  1185. },
  1186. /* Set the date(s) directly. */
  1187. _setDate: function(date, endDate) {
  1188. this._selectedDay = this._currentDay = date.getDate();
  1189. this._drawMonth = this._selectedMonth = this._currentMonth = date.getMonth();
  1190. this._drawYear = this._selectedYear = this._currentYear = date.getFullYear();
  1191. if (this._get('rangeSelect')) {
  1192. if (endDate) {
  1193. this._endDay = endDate.getDate();
  1194. this._endMonth = endDate.getMonth();
  1195. this._endYear = endDate.getFullYear();
  1196. } else {
  1197. this._endDay = this._currentDay;
  1198. this._endMonth = this._currentMonth;
  1199. this._endYear = this._currentYear;
  1200. }
  1201. }
  1202. this._adjustDate();
  1203. },
  1204. /* Retrieve the date(s) directly. */
  1205. _getDate: function() {
  1206. var startDate = (!this._currentYear || (this._input && this._input.val() == '') ? null :
  1207. new Date(this._currentYear, this._currentMonth, this._currentDay));
  1208. if (this._get('rangeSelect')) {
  1209. return [startDate, (!this._endYear ? null :
  1210. new Date(this._endYear, this._endMonth, this._endDay))];
  1211. } else
  1212. return startDate;
  1213. },
  1214. /* Generate the HTML for the current state of the date picker. */
  1215. _generateDatepicker: function() {
  1216. var today = new Date();
  1217. today = new Date(today.getFullYear(), today.getMonth(), today.getDate()); // clear time
  1218. var showStatus = this._get('showStatus');
  1219. var isRTL = this._get('isRTL');
  1220. // build the date picker HTML
  1221. var clear = (this._get('mandatory') ? '' :
  1222. '<div class="datepicker_clear"><a onclick="jQuery.datepicker._clearDate(' + this._id + ');"' + 
  1223. (showStatus ? this._addStatus(this._get('clearStatus') || '&#xa0;') : '') + '>' +
  1224. this._get('clearText') + '</a></div>');
  1225. var controls = '<div class="datepicker_control">' + (isRTL ? '' : clear) +
  1226. '<div class="datepicker_close"><a onclick="jQuery.datepicker._hideDatepicker();"' +
  1227. (showStatus ? this._addStatus(this._get('closeStatus') || '&#xa0;') : '') + '>' +
  1228. this._get('closeText') + '</a></div>' + (isRTL ? clear : '')  + '</div>';
  1229. var prompt = this._get('prompt');
  1230. var closeAtTop = this._get('closeAtTop');
  1231. var hideIfNoPrevNext = this._get('hideIfNoPrevNext');
  1232. var numMonths = this._getNumberOfMonths();
  1233. var stepMonths = this._get('stepMonths');
  1234. var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
  1235. var minDate = this._getMinMaxDate('min', true);
  1236. var maxDate = this._getMinMaxDate('max');
  1237. var drawMonth = this._drawMonth;
  1238. var drawYear = this._drawYear;
  1239. if (maxDate) {
  1240. var maxDraw = new Date(maxDate.getFullYear(),
  1241. maxDate.getMonth() - numMonths[1] + 1, maxDate.getDate());
  1242. maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
  1243. while (new Date(drawYear, drawMonth, 1) > maxDraw) {
  1244. drawMonth--;
  1245. if (drawMonth < 0) {
  1246. drawMonth = 11;
  1247. drawYear--;
  1248. }
  1249. }
  1250. }
  1251. // controls and links
  1252. var prev = '<div class="datepicker_prev">' + (this._canAdjustMonth(-1, drawYear, drawMonth) ? 
  1253. '<a onclick="jQuery.datepicker._adjustDate(' + this._id + ', -' + stepMonths + ', 'M');"' +
  1254. (showStatus ? this._addStatus(this._get('prevStatus') || '&#xa0;') : '') + '>' +
  1255. this._get('prevText') + '</a>' :
  1256. (hideIfNoPrevNext ? '' : '<label>' + this._get('prevText') + '</label>')) + '</div>';
  1257. var next = '<div class="datepicker_next">' + (this._canAdjustMonth(+1, drawYear, drawMonth) ?
  1258. '<a onclick="jQuery.datepicker._adjustDate(' + this._id + ', +' + stepMonths + ', 'M');"' +
  1259. (showStatus ? this._addStatus(this._get('nextStatus') || '&#xa0;') : '') + '>' +
  1260. this._get('nextText') + '</a>' :
  1261. (hideIfNoPrevNext ? '>' : '<label>' + this._get('nextText') + '</label>')) + '</div>';
  1262. var html = (prompt ? '<div class="datepicker_prompt">' + prompt + '</div>' : '') +
  1263. (closeAtTop && !this._inline ? controls : '') +
  1264. '<div class="datepicker_links">' + (isRTL ? next : prev) +
  1265. (this._isInRange(today) ? '<div class="datepicker_current">' +
  1266. '<a onclick="jQuery.datepicker._gotoToday(' + this._id + ');"' +
  1267. (showStatus ? this._addStatus(this._get('currentStatus') || '&#xa0;') : '') + '>' +
  1268. this._get('currentText') + '</a></div>' : '') + (isRTL ? prev : next) + '</div>';
  1269. var showWeeks = this._get('showWeeks');
  1270. for (var row = 0; row < numMonths[0]; row++)
  1271. for (var col = 0; col < numMonths[1]; col++) {
  1272. var selectedDate = new Date(drawYear, drawMonth, this._selectedDay);
  1273. html += '<div class="datepicker_oneMonth' + (col == 0 ? ' datepicker_newRow' : '') + '">' +
  1274. this._generateMonthYearHeader(drawMonth, drawYear, minDate, maxDate,
  1275. selectedDate, row > 0 || col > 0) + // draw month headers
  1276. '<table class="datepicker" cellpadding="0" cellspacing="0"><thead>' + 
  1277. '<tr class="datepicker_titleRow">' +
  1278. (showWeeks ? '<td>' + this._get('weekHeader') + '</td>' : '');
  1279. var firstDay = this._get('firstDay');
  1280. var changeFirstDay = this._get('changeFirstDay');
  1281. var dayNames = this._get('dayNames');
  1282. var dayNamesShort = this._get('dayNamesShort');
  1283. var dayNamesMin = this._get('dayNamesMin');
  1284. for (var dow = 0; dow < 7; dow++) { // days of the week
  1285. var day = (dow + firstDay) % 7;
  1286. var status = this._get('dayStatus') || '&#xa0;';
  1287. status = (status.indexOf('DD') > -1 ? status.replace(/DD/, dayNames[day]) :
  1288. status.replace(/D/, dayNamesShort[day]));
  1289. html += '<td' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="datepicker_weekEndCell"' : '') + '>' +
  1290. (!changeFirstDay ? '<span' :
  1291. '<a onclick="jQuery.datepicker._changeFirstDay(' + this._id + ', ' + day + ');"') + 
  1292. (showStatus ? this._addStatus(status) : '') + ' title="' + dayNames[day] + '">' +
  1293. dayNamesMin[day] + (changeFirstDay ? '</a>' : '</span>') + '</td>';
  1294. }
  1295. html += '</tr></thead><tbody>';
  1296. var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
  1297. if (drawYear == this._selectedYear && drawMonth == this._selectedMonth) {
  1298. this._selectedDay = Math.min(this._selectedDay, daysInMonth);
  1299. }
  1300. var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
  1301. var currentDate = (!this._currentDay ? new Date(9999, 9, 9) :
  1302. new Date(this._currentYear, this._currentMonth, this._currentDay));
  1303. var endDate = this._endDay ? new Date(this._endYear, this._endMonth, this._endDay) : currentDate;
  1304. var printDate = new Date(drawYear, drawMonth, 1 - leadDays);
  1305. var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate
  1306. var beforeShowDay = this._get('beforeShowDay');
  1307. var showOtherMonths = this._get('showOtherMonths');
  1308. var calculateWeek = this._get('calculateWeek') || $.datepicker.iso8601Week;
  1309. var dateStatus = this._get('statusForDate') || $.datepicker.dateStatus;
  1310. for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
  1311. html += '<tr class="datepicker_daysRow">' +
  1312. (showWeeks ? '<td class="datepicker_weekCol">' + calculateWeek(printDate) + '</td>' : '');
  1313. for (var dow = 0; dow < 7; dow++) { // create date picker days
  1314. var daySettings = (beforeShowDay ?
  1315. beforeShowDay.apply((this._input ? this._input[0] : null), [printDate]) : [true, '']);
  1316. var otherMonth = (printDate.getMonth() != drawMonth);
  1317. var unselectable = otherMonth || !daySettings[0] ||
  1318. (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
  1319. html += '<td class="datepicker_daysCell' +
  1320. ((dow + firstDay + 6) % 7 >= 5 ? ' datepicker_weekEndCell' : '') + // highlight weekends
  1321. (otherMonth ? ' datepicker_otherMonth' : '') + // highlight days from other months
  1322. (printDate.getTime() == selectedDate.getTime() && drawMonth == this._selectedMonth ?
  1323. ' datepicker_daysCellOver' : '') + // highlight selected day
  1324. (unselectable ? ' datepicker_unselectable' : '') +  // highlight unselectable days
  1325. (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
  1326. (printDate.getTime() >= currentDate.getTime() && printDate.getTime() <= endDate.getTime() ?  // in current range
  1327. ' datepicker_currentDay' : '') + // highlight selected day
  1328. (printDate.getTime() == today.getTime() ? ' datepicker_today' : '')) + '"' + // highlight today (if different)
  1329. (unselectable ? '' : ' onmouseover="jQuery(this).addClass('datepicker_daysCellOver');' +
  1330. (!showStatus || (otherMonth && !showOtherMonths) ? '' : 'jQuery('#datepicker_status_' +
  1331. this._id + '').html('' + (dateStatus.apply((this._input ? this._input[0] : null),
  1332. [printDate, this]) || '&#xa0;') +'');') + '"' +
  1333. ' onmouseout="jQuery(this).removeClass('datepicker_daysCellOver');' +
  1334. (!showStatus || (otherMonth && !showOtherMonths) ? '' : 'jQuery('#datepicker_status_' +
  1335. this._id + '').html('&#xa0;');') + '" onclick="jQuery.datepicker._selectDay(' +
  1336. this._id + ',' + drawMonth + ',' + drawYear + ', this);"') + '>' + // actions
  1337. (otherMonth ? (showOtherMonths ? printDate.getDate() : '&#xa0;') : // display for other months
  1338. (unselectable ? printDate.getDate() : '<a>' + printDate.getDate() + '</a>')) + '</td>'; // display for this month
  1339. printDate.setDate(printDate.getDate() + 1);
  1340. }
  1341. html += '</tr>';
  1342. }
  1343. drawMonth++;
  1344. if (drawMonth > 11) {
  1345. drawMonth = 0;
  1346. drawYear++;
  1347. }
  1348. html += '</tbody></table></div>';
  1349. }
  1350. html += (showStatus ? '<div style="clear: both;"></div><div id="datepicker_status_' + this._id + 
  1351. '" class="datepicker_status">' + (this._get('initStatus') || '&#xa0;') + '</div>' : '') +
  1352. (!closeAtTop && !this._inline ? controls : '') +
  1353. '<div style="clear: both;"></div>' + 
  1354. ($.browser.msie && parseInt($.browser.version) < 7 && !this._inline ? 
  1355. '<iframe src="javascript:false;" class="datepicker_cover"></iframe>' : '');
  1356. return html;
  1357. },
  1358. /* Generate the month and year header. */
  1359. _generateMonthYearHeader: function(drawMonth, drawYear, minDate, maxDate, selectedDate, secondary) {
  1360. minDate = (this._rangeStart && minDate && selectedDate < minDate ? selectedDate : minDate);
  1361. var showStatus = this._get('showStatus');
  1362. var html = '<div class="datepicker_header">';
  1363. // month selection
  1364. var monthNames = this._get('monthNames');
  1365. if (secondary || !this._get('changeMonth'))
  1366. html += monthNames[drawMonth] + '&#xa0;';
  1367. else {
  1368. var inMinYear = (minDate && minDate.getFullYear() == drawYear);
  1369. var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
  1370. html += '<select class="datepicker_newMonth" ' +
  1371. 'onchange="jQuery.datepicker._selectMonthYear(' + this._id + ', this, 'M');" ' +
  1372. 'onclick="jQuery.datepicker._clickMonthYear(' + this._id + ');"' +
  1373. (showStatus ? this._addStatus(this._get('monthStatus') || '&#xa0;') : '') + '>';
  1374. for (var month = 0; month < 12; month++) {
  1375. if ((!inMinYear || month >= minDate.getMonth()) &&
  1376. (!inMaxYear || month <= maxDate.getMonth())) {
  1377. html += '<option value="' + month + '"' +
  1378. (month == drawMonth ? ' selected="selected"' : '') +
  1379. '>' + monthNames[month] + '</option>';
  1380. }
  1381. }
  1382. html += '</select>';
  1383. }
  1384. // year selection
  1385. if (secondary || !this._get('changeYear'))
  1386. html += drawYear;
  1387. else {
  1388. // determine range of years to display
  1389. var years = this._get('yearRange').split(':');
  1390. var year = 0;
  1391. var endYear = 0;
  1392. if (years.length != 2) {
  1393. year = drawYear - 10;
  1394. endYear = drawYear + 10;
  1395. } else if (years[0].charAt(0) == '+' || years[0].charAt(0) == '-') {
  1396. year = drawYear + parseInt(years[0], 10);
  1397. endYear = drawYear + parseInt(years[1], 10);
  1398. } else {
  1399. year = parseInt(years[0], 10);
  1400. endYear = parseInt(years[1], 10);
  1401. }
  1402. year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
  1403. endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
  1404. html += '<select class="datepicker_newYear" ' +
  1405. 'onchange="jQuery.datepicker._selectMonthYear(' + this._id + ', this, 'Y');" ' +
  1406. 'onclick="jQuery.datepicker._clickMonthYear(' + this._id + ');"' +
  1407. (showStatus ? this._addStatus(this._get('yearStatus') || '&#xa0;') : '') + '>';
  1408. for (; year <= endYear; year++) {
  1409. html += '<option value="' + year + '"' +
  1410. (year == drawYear ? ' selected="selected"' : '') +
  1411. '>' + year + '</option>';
  1412. }
  1413. html += '</select>';
  1414. }
  1415. html += '</div>'; // Close datepicker_header
  1416. return html;
  1417. },
  1418. /* Provide code to set and clear the status panel. */
  1419. _addStatus: function(text) {
  1420. return ' onmouseover="jQuery('#datepicker_status_' + this._id + '').html('' + text + '');" ' +
  1421. 'onmouseout="jQuery('#datepicker_status_' + this._id + '').html('&#xa0;');"';
  1422. },
  1423. /* Adjust one of the date sub-fields. */
  1424. _adjustDate: function(offset, period) {
  1425. var year = this._drawYear + (period == 'Y' ? offset : 0);
  1426. var month = this._drawMonth + (period == 'M' ? offset : 0);
  1427. var day = Math.min(this._selectedDay, this._getDaysInMonth(year, month)) +
  1428. (period == 'D' ? offset : 0);
  1429. var date = new Date(year, month, day);
  1430. // ensure it is within the bounds set
  1431. var minDate = this._getMinMaxDate('min', true);
  1432. var maxDate = this._getMinMaxDate('max');
  1433. date = (minDate && date < minDate ? minDate : date);
  1434. date = (maxDate && date > maxDate ? maxDate : date);
  1435. this._selectedDay = date.getDate();
  1436. this._drawMonth = this._selectedMonth = date.getMonth();
  1437. this._drawYear = this._selectedYear = date.getFullYear();
  1438. },
  1439. /* Determine the number of months to show. */
  1440. _getNumberOfMonths: function() {
  1441. var numMonths = this._get('numberOfMonths');
  1442. return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
  1443. },
  1444. /* Determine the current maximum date - ensure no time components are set - may be overridden for a range. */
  1445. _getMinMaxDate: function(minMax, checkRange) {
  1446. var date = this._determineDate(minMax + 'Date', null);
  1447. if (date) {
  1448. date.setHours(0);
  1449. date.setMinutes(0);
  1450. date.setSeconds(0);
  1451. date.setMilliseconds(0);
  1452. }
  1453. return date || (checkRange ? this._rangeStart : null);
  1454. },
  1455. /* Find the number of days in a given month. */
  1456. _getDaysInMonth: function(year, month) {
  1457. return 32 - new Date(year, month, 32).getDate();
  1458. },
  1459. /* Find the day of the week of the first of a month. */
  1460. _getFirstDayOfMonth: function(year, month) {
  1461. return new Date(year, month, 1).getDay();
  1462. },
  1463. /* Determines if we should allow a "next/prev" month display change. */
  1464. _canAdjustMonth: function(offset, curYear, curMonth) {
  1465. var numMonths = this._getNumberOfMonths();
  1466. var date = new Date(curYear, curMonth + (offset < 0 ? offset : numMonths[1]), 1);
  1467. if (offset < 0)
  1468. date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
  1469. return this._isInRange(date);
  1470. },
  1471. /* Is the given date in the accepted range? */
  1472. _isInRange: function(date) {
  1473. // during range selection, use minimum of selected date and range start
  1474. var newMinDate = (!this._rangeStart ? null :
  1475. new Date(this._selectedYear, this._selectedMonth, this._selectedDay));
  1476. newMinDate = (newMinDate && this._rangeStart < newMinDate ? this._rangeStart : newMinDate);
  1477. var minDate = newMinDate || this._getMinMaxDate('min');
  1478. var maxDate = this._getMinMaxDate('max');
  1479. return ((!minDate || date >= minDate) && (!maxDate || date <= maxDate));
  1480. },
  1481. /* Provide the configuration settings for formatting/parsing. */
  1482. _getFormatConfig: function() {
  1483. var shortYearCutoff = this._get('shortYearCutoff');
  1484. shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
  1485. new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
  1486. return {shortYearCutoff: shortYearCutoff,
  1487. dayNamesShort: this._get('dayNamesShort'), dayNames: this._get('dayNames'),
  1488. monthNamesShort: this._get('monthNamesShort'), monthNames: this._get('monthNames')};
  1489. },
  1490. /* Format the given date for display. */
  1491. _formatDate: function(day, month, year) {
  1492. if (!day) {
  1493. this._currentDay = this._selectedDay;
  1494. this._currentMonth = this._selectedMonth;
  1495. this._currentYear = this._selectedYear;
  1496. }
  1497. var date = (day ? (typeof day == 'object' ? day : new Date(year, month, day)) :
  1498. new Date(this._currentYear, this._currentMonth, this._currentDay));
  1499. return $.datepicker.formatDate(this._get('dateFormat'), date, this._getFormatConfig());
  1500. }
  1501. });
  1502. /* jQuery extend now ignores nulls! */
  1503. function extendRemove(target, props) {
  1504. $.extend(target, props);
  1505. for (var name in props)
  1506. if (props[name] == null)
  1507. target[name] = null;
  1508. return target;
  1509. };
  1510. /* Invoke the datepicker functionality.
  1511.    @param  options  String - a command, optionally followed by additional parameters or
  1512.                     Object - settings for attaching new datepicker functionality
  1513.    @return  jQuery object */
  1514. $.fn.datepicker = function(options){
  1515. var otherArgs = Array.prototype.slice.call(arguments, 1);
  1516. if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate')) {
  1517. return $.datepicker['_' + options + 'Datepicker'].apply($.datepicker, [this[0]].concat(otherArgs));
  1518. }
  1519. return this.each(function() {
  1520. typeof options == 'string' ?
  1521. $.datepicker['_' + options + 'Datepicker'].apply($.datepicker, [this].concat(otherArgs)) :
  1522. $.datepicker._attachDatepicker(this, options);
  1523. });
  1524. };
  1525. $.datepicker = new Datepicker(); // singleton instance
  1526. /* Initialise the date picker. */
  1527. $(document).ready(function() {
  1528. $(document.body).append($.datepicker._datepickerDiv)
  1529. .mousedown($.datepicker._checkExternalClick);
  1530. });
  1531. })(jQuery);;(function($) {   $.effects = $.effects || {}; //Add the 'ec' scope   $.extend($.effects, {     save: function(el, set) {       for(var i=0;i<set.length;i++) {         if(set[i] !== null) $.data(el[0], "ec.storage."+set[i], el.css(set[i]));       }     },     restore: function(el, set) {       for(var i=0;i<set.length;i++) {         if(set[i] !== null) el.css(set[i], $.data(el[0], "ec.storage."+set[i]));       }     },     setMode: function(el, mode) {       if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle       return mode;     },     getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value       // this should be a little more flexible in the future to handle a string & hash       var y, x;       switch (origin[0]) {         case 'top': y = 0; break;         case 'middle': y = 0.5; break;         case 'bottom': y = 1; break;         default: y = origin[0] / original.height;       };       switch (origin[1]) {         case 'left': x = 0; break;         case 'center': x = 0.5; break;         case 'right': x = 1; break;         default: x = origin[1] / original.width;       };       return {x: x, y: y};     },     createWrapper: function(el) {       if (el.parent().attr('id') == 'fxWrapper')         return el;       var props = {width: el.outerWidth({margin:true}), height: el.outerHeight({margin:true}), 'float': el.css('float')};       el.wrap('<div id="fxWrapper"></div>');       var wrapper = el.parent();       if (el.css('position') == 'static'){         wrapper.css({position: 'relative'});         el.css({position: 'relative'});       } else {         var top = parseInt(el.css('top'), 10); if (top.constructor != Number) top = 'auto';         var left = parseInt(el.css('left'), 10); if (left.constructor != Number) left = 'auto';         wrapper.css({ position: el.css('position'), top: top, left: left, zIndex: el.css('z-index') }).show();         el.css({position: 'relative', top:0, left:0});       }       wrapper.css(props);       return wrapper;     },     removeWrapper: function(el) {       if (el.parent().attr('id') == 'fxWrapper')         return el.parent().replaceWith(el);       return el;     },     setTransition: function(el, list, factor, val) {       val = val || {};       $.each(list,function(i, x){         unit = el.cssUnit(x);         if (unit[0] > 0) val[x] = unit[0] * factor + unit[1];       });       return val;     },     animateClass: function(value, duration, easing, callback) {       var cb = (typeof easing == "function" ? easing : (callback ? callback : null));       var ea = (typeof easing == "object" ? easing : null);       this.each(function() {         var offset = {}; var that = $(this); var oldStyleAttr = that.attr("style") || '';         if(typeof oldStyleAttr == 'object') oldStyleAttr = oldStyleAttr["cssText"]; /* Stupidly in IE, style is a object.. */         if(value.toggle) { that.hasClass(value.toggle) ? value.remove = value.toggle : value.add = value.toggle; }         //Let's get a style offset         var oldStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle));         if(value.add) that.addClass(value.add); if(value.remove) that.removeClass(value.remove);         var newStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle));         if(value.add) that.removeClass(value.add); if(value.remove) that.addClass(value.remove);         // The main function to form the object for animation         for(var n in newStyle) {           if( typeof newStyle[n] != "function" && newStyle[n] /* No functions and null properties */           && n.indexOf("Moz") == -1 && n.indexOf("length") == -1 /* No mozilla spezific render properties. */           && newStyle[n] != oldStyle[n] /* Only values that have changed are used for the animation */           && (n.match(/color/i) || (!n.match(/color/i) && !isNaN(parseInt(newStyle[n],10)))) /* Only things that can be parsed to integers or colors */           && (oldStyle.position != "static" || (oldStyle.position == "static" && !n.match(/left|top|bottom|right/))) /* No need for positions when dealing with static positions */           ) offset[n] = newStyle[n];         }         that.animate(offset, duration, ea, function() { // Animate the newly constructed offset object           // Change style attribute back to original. For stupid IE, we need to clear the damn object.           if(typeof $(this).attr("style") == 'object') { $(this).attr("style")["cssText"] = ""; $(this).attr("style")["cssText"] = oldStyleAttr; } else $(this).attr("style", oldStyleAttr);           if(value.add) $(this).addClass(value.add); if(value.remove) $(this).removeClass(value.remove);           if(cb) cb.apply(this, arguments);         });       });     }   });   //Extend the methods of jQuery   $.fn.extend({     //Save old methods     _show: $.fn.show,     _hide: $.fn.hide,     __toggle: $.fn.toggle,     _addClass: $.fn.addClass,     _removeClass: $.fn.removeClass,     _toggleClass: $.fn.toggleClass,     // New ec methods     effect: function(fx,o,speed,callback) {       return $.effects[fx] ? $.effects[fx].call(this, {method: fx, options: o || {}, duration: speed, callback: callback }) : null;     },     show: function() {       if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])))         return this._show.apply(this, arguments);       else {         var o = arguments[1] || {}; o['mode'] = 'show';         return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]);       }     },     hide: function() {       if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])))         return this._hide.apply(this, arguments);       else {         var o = arguments[1] || {}; o['mode'] = 'hide';         return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]);       }     },     toggle: function(){       if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])) || (arguments[0].constructor == Function))         return this.__toggle.apply(this, arguments);       else {         var o = arguments[1] || {}; o['mode'] = 'toggle';         return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]);       }     },     addClass: function(classNames,speed,easing,callback) {       return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);     },     removeClass: function(classNames,speed,easing,callback) {       return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);     },     toggleClass: function(classNames,speed,easing,callback) {       return speed ? $.effects.animateClass.apply(this, [{ toggle: classNames },speed,easing,callback]) : this._toggleClass(classNames);     },     morph: function(remove,add,speed,easing,callback) {       return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);     },     switchClass: function() {       this.morph.apply(this, arguments);     },     // helper functions     cssUnit: function(key) {       var style = this.css(key), val = [];       $.each( ['em','px','%','pt'], function(i, unit){         if(style.indexOf(unit) > 0)           val = [parseFloat(style), unit];       });       return val;     }   });   /*    * jQuery Color Animations    * Copyright 2007 John Resig    * Released under the MIT and GPL licenses.    */     // We override the animation for all of these color styles     jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){         jQuery.fx.step[attr] = function(fx){             if ( fx.state == 0 ) {                 fx.start = getColor( fx.elem, attr );                 fx.end = getRGB( fx.end );             }             fx.elem.style[attr] = "rgb(" + [                 Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),                 Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),                 Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)             ].join(",") + ")";         }     });     // Color Conversion functions from highlightFade     // By Blair Mitchelmore     // http://jquery.offput.ca/highlightFade/     // Parse strings looking for color tuples [255,255,255]     function getRGB(color) {         var result;         // Check if we're already dealing with an array of colors         if ( color && color.constructor == Array && color.length == 3 )             return color;         // Look for rgb(num,num,num)         if (result = /rgb(s*([0-9]{1,3})s*,s*([0-9]{1,3})s*,s*([0-9]{1,3})s*)/.exec(color))             return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])];         // Look for rgb(num%,num%,num%)         if (result = /rgb(s*([0-9]+(?:.[0-9]+)?)%s*,s*([0-9]+(?:.[0-9]+)?)%s*,s*([0-9]+(?:.[0-9]+)?)%s*)/.exec(color))             return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];         // Look for #a0b1c2         if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))             return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];         // Look for #fff         if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))             return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];         // Look for rgba(0, 0, 0, 0) == transparent in Safari 3         if (result = /rgba(0, 0, 0, 0)/.exec(color))             return colors['transparent']         // Otherwise, we're most likely dealing with a named color         return colors[jQuery.trim(color).toLowerCase()];     }     function getColor(elem, attr) {         var color;         do {             color = jQuery.curCSS(elem, attr);             // Keep going until we find an element that has color, or we hit the body             if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") )                 break;             attr = "backgroundColor";         } while ( elem = elem.parentNode );         return getRGB(color);     };     // Some named colors to work with     // From Interface by Stefan Petre     // http://interface.eyecon.ro/     var colors = {         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],         transparent: [255,255,255]     };      /*  * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/  *  * Uses the built in easing capabilities added In jQuery 1.1  * to offer multiple easing options  *  * TERMS OF USE - jQuery Easing  *   * Open source under the BSD License.   *   * Copyright Â© 2008 George McGinley Smith  * All rights reserved.  *   * Redistribution and use in source and binary forms, with or without modification,   * are permitted provided that the following conditions are met:  *   * Redistributions of source code must retain the above copyright notice, this list of   * conditions and the following disclaimer.  * Redistributions in binary form must reproduce the above copyright notice, this list   * of conditions and the following disclaimer in the documentation and/or other materials   * provided with the distribution.  *   * Neither the name of the author nor the names of contributors may be used to endorse   * or promote products derived from this software without specific prior written permission.  *   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE  *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED   * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED   * OF THE POSSIBILITY OF SUCH DAMAGE.   * */ // t: current time, b: begInnIng value, c: change In value, d: duration jQuery.easing['jswing'] = jQuery.easing['swing']; jQuery.extend( jQuery.easing, { def: 'easeOutQuad', swing: function (x, t, b, c, d) { //alert(jQuery.easing.default); return jQuery.easing[jQuery.easing.def](x, t, b, c, d); }, easeInQuad: function (x, t, b, c, d) { return c*(t/=d)*t + b; }, easeOutQuad: function (x, t, b, c, d) { return -c *(t/=d)*(t-2) + b; }, easeInOutQuad: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t + b; return -c/2 * ((--t)*(t-2) - 1) + b; }, easeInCubic: function (x, t, b, c, d) { return c*(t/=d)*t*t + b; }, easeOutCubic: function (x, t, b, c, d) { return c*((t=t/d-1)*t*t + 1) + b; }, easeInOutCubic: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t + b; return c/2*((t-=2)*t*t + 2) + b; }, easeInQuart: function (x, t, b, c, d) { return c*(t/=d)*t*t*t + b; }, easeOutQuart: function (x, t, b, c, d) { return -c * ((t=t/d-1)*t*t*t - 1) + b; }, easeInOutQuart: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t*t + b; return -c/2 * ((t-=2)*t*t*t - 2) + b; }, easeInQuint: function (x, t, b, c, d) { return c*(t/=d)*t*t*t*t + b; }, easeOutQuint: function (x, t, b, c, d) { return c*((t=t/d-1)*t*t*t*t + 1) + b; }, easeInOutQuint: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; return c/2*((t-=2)*t*t*t*t + 2) + b; }, easeInSine: function (x, t, b, c, d) { return -c * Math.cos(t/d * (Math.PI/2)) + c + b; }, easeOutSine: function (x, t, b, c, d) { return c * Math.sin(t/d * (Math.PI/2)) + b; }, easeInOutSine: function (x, t, b, c, d) { return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; }, easeInExpo: function (x, t, b, c, d) { return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; }, easeOutExpo: function (x, t, b, c, d) { return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; }, easeInOutExpo: function (x, t, b, c, d) { if (t==0) return b; if (t==d) return b+c; if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; }, easeInCirc: function (x, t, b, c, d) { return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; }, easeOutCirc: function (x, t, b, c, d) { return c * Math.sqrt(1 - (t=t/d-1)*t) + b; }, easeInOutCirc: function (x, t, b, c, d) { if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; }, easeInElastic: function (x, t, b, c, d) { var s=1.70158;var p=0;var a=c; if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3; if (a < Math.abs(c)) { a=c; var s=p/4; } else var s = p/(2*Math.PI) * Math.asin (c/a); return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; }, easeOutElastic: function (x, t, b, c, d) { var s=1.70158;var p=0;var a=c; if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3; if (a < Math.abs(c)) { a=c; var s=p/4; } else var s = p/(2*Math.PI) * Math.asin (c/a); return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; }, easeInOutElastic: function (x, t, b, c, d) { var s=1.70158;var p=0;var a=c; if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5); if (a < Math.abs(c)) { a=c; var s=p/4; } else var s = p/(2*Math.PI) * Math.asin (c/a); if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; }, easeInBack: function (x, t, b, c, d, s) { if (s == undefined) s = 1.70158; return c*(t/=d)*t*((s+1)*t - s) + b; }, easeOutBack: function (x, t, b, c, d, s) { if (s == undefined) s = 1.70158; return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; }, easeInOutBack: function (x, t, b, c, d, s) { if (s == undefined) s = 1.70158;  if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; }, easeInBounce: function (x, t, b, c, d) { return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b; }, easeOutBounce: function (x, t, b, c, d) { if ((t/=d) < (1/2.75)) { return c*(7.5625*t*t) + b; } else if (t < (2/2.75)) { return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; } else if (t < (2.5/2.75)) { return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; } else { return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; } }, easeInOutBounce: function (x, t, b, c, d) { if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b; return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b; } }); /*  *  * TERMS OF USE - EASING EQUATIONS  *   * Open source under the BSD License.   *   * Copyright Â© 2001 Robert Penner  * All rights reserved.  *   * Redistribution and use in source and binary forms, with or without modification,   * are permitted provided that the following conditions are met:  *   * Redistributions of source code must retain the above copyright notice, this list of   * conditions and the following disclaimer.  * Redistributions in binary form must reproduce the above copyright notice, this list   * of conditions and the following disclaimer in the documentation and/or other materials   * provided with the distribution.  *   * Neither the name of the author nor the names of contributors may be used to endorse   * or promote products derived from this software without specific prior written permission.  *   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE  *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED   * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED   * OF THE POSSIBILITY OF SUCH DAMAGE.   *  */ })(jQuery);;(function($) {      $.effects.blind = function(o) {     return this.queue(function() {       // Create element       var el = $(this), props = ['position','top','left'];              // Set options       var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode       var direction = o.options.direction || 'vertical'; // Default direction              // Adjust       $.effects.save(el, props); el.show(); // Save & Show       var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper       var ref = (direction == 'vertical') ? 'height' : 'width';       var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();       if(mode == 'show') wrapper.css(ref, 0); // Shift              // Animation       var animation = {};       animation[ref] = mode == 'show' ? distance : 0;             // Animate       wrapper.animate(animation, o.duration, o.options.easing, function() {         if(mode == 'hide') el.hide(); // Hide         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore         if(o.callback) o.callback.apply(this, arguments); // Callback         el.dequeue();       });            });        };    })(jQuery);;(function($) {   $.effects.bounce = function(o) {     return this.queue(function() {       // Create element       var el = $(this), props = ['position','top','left'];       // Set options       var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode       var direction = o.options.direction || 'up'; // Default direction       var distance = o.options.distance || 20; // Default distance       var times = o.options.times || 5; // Default # of times       var speed = o.duration || 250; // Default speed per bounce       if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE       // Adjust       $.effects.save(el, props); el.show(); // Save & Show       $.effects.createWrapper(el); // Create Wrapper       var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';       var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';       var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);       if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift       if (mode == 'hide') distance = distance / (times * 2);       if (mode != 'hide') times--;              // Animate       if (mode == 'show') { // Show Bounce         var animation = {opacity: 1};         animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;         el.animate(animation, speed / 2, o.options.easing);         distance = distance / 2;         times--;       };       for (var i = 0; i < times; i++) { // Bounces         var animation1 = {}, animation2 = {};         animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;         animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;         el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);         distance = (mode == 'hide') ? distance * 2 : distance / 2;       };       if (mode == 'hide') { // Last Bounce         var animation = {opacity: 0};         animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;         el.animate(animation, speed / 2, o.options.easing, function(){           el.hide(); // Hide           $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore           if(o.callback) o.callback.apply(this, arguments); // Callback         });       } else {         var animation1 = {}, animation2 = {};         animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;         animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;         el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){           $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore           if(o.callback) o.callback.apply(this, arguments); // Callback         });       };       el.queue('fx', function() { el.dequeue(); });       el.dequeue();     });        }; })(jQuery);;(function($) {
  1532.   
  1533.   $.effects.clip = function(o) {
  1534.     return this.queue(function() {
  1535.       // Create element
  1536.       var el = $(this), props = ['position','top','left','width','height'];
  1537.       
  1538.       // Set options
  1539.       var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
  1540.       var direction = o.options.direction || 'vertical'; // Default direction
  1541.       
  1542.       // Adjust
  1543.       $.effects.save(el, props); el.show(); // Save & Show
  1544.       $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
  1545.       var ref = {
  1546.         size: (direction == 'vertical') ? 'height' : 'width',
  1547.         position: (direction == 'vertical') ? 'top' : 'left'
  1548.       };
  1549.       var distance = (direction == 'vertical') ? el.height() : el.width();
  1550.       if(mode == 'show') { el.css(ref.size, 0); el.css(ref.position, distance / 2); } // Shift
  1551.       
  1552.       // Animation
  1553.       var animation = {};
  1554.       animation[ref.size] = mode == 'show' ? distance : 0;
  1555.       animation[ref.position] = mode == 'show' ? 0 : distance / 2;
  1556.         
  1557.       // Animate
  1558.       el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
  1559.         if(mode == 'hide') el.hide(); // Hide
  1560.         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
  1561.         if(o.callback) o.callback.apply(this, arguments); // Callback
  1562.         el.dequeue();
  1563.       }}); 
  1564.       
  1565.     });
  1566.     
  1567.   };
  1568.   
  1569. })(jQuery);
  1570. ;(function($) {
  1571.   
  1572.   $.effects.drop = function(o) {
  1573.     return this.queue(function() {
  1574.       // Create element
  1575.       var el = $(this), props = ['position','top','left','opacity'];
  1576.       
  1577.       // Set options
  1578.       var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
  1579.       var direction = o.options.direction || 'left'; // Default Direction
  1580.       
  1581.       // Adjust
  1582.       $.effects.save(el, props); el.show(); // Save & Show
  1583.       $.effects.createWrapper(el); // Create Wrapper
  1584.       var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
  1585.       var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
  1586.       var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
  1587.       if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
  1588.       
  1589.       // Animation
  1590.       var animation = {opacity: mode == 'show' ? 1 : 0};
  1591.       animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
  1592.       
  1593.       // Animate
  1594.       el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
  1595.         if(mode == 'hide') el.hide(); // Hide
  1596.         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
  1597.         if(o.callback) o.callback.apply(this, arguments); // Callback
  1598.         el.dequeue();
  1599.       }});
  1600.       
  1601.     });
  1602.     
  1603.   };
  1604.   
  1605. })(jQuery);
  1606. ;(function($) {
  1607.   
  1608.   $.effects.explode = function(o) {
  1609.     return this.queue(function() {
  1610. var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
  1611. var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
  1612. o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
  1613. var el = $(this).show().css('visibility', 'hidden');
  1614. var offset = el.offset();
  1615. var width = el.outerWidth();
  1616. var height = el.outerHeight();
  1617. for(var i=0;i<rows;i++) { // =
  1618. for(var j=0;j<cells;j++) { // ||
  1619. el
  1620. .clone()
  1621. .appendTo('body')
  1622. .wrap('<div></div>')
  1623. .css({
  1624. position: 'absolute',
  1625. visibility: 'visible',
  1626. left: -j*(width/cells),
  1627. top: -i*(height/rows)
  1628. })
  1629. .parent()
  1630. .addClass('ec-explode')
  1631. .css({
  1632. position: 'absolute',
  1633. overflow: 'hidden',
  1634. width: width/cells,
  1635. height: height/rows,
  1636. left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
  1637. top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
  1638. opacity: o.options.mode == 'show' ? 0 : 1
  1639. }).animate({
  1640. left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
  1641. top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
  1642. opacity: o.options.mode == 'show' ? 1 : 0
  1643. }, o.duration || 500);
  1644. }
  1645. }
  1646. // Set a timeout, to call the callback approx. when the other animations have finished
  1647. setTimeout(function() {
  1648. o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
  1649.          if(o.callback) o.callback.apply(el[0]); // Callback
  1650.          el.dequeue();
  1651.         
  1652.          $('.ec-explode').remove();
  1653. }, o.duration || 500);
  1654.       
  1655.     });
  1656.     
  1657.   };
  1658.   
  1659. })(jQuery);;(function($) {      $.effects.fold = function(o) {     return this.queue(function() {       // Create element       var el = $(this), props = ['position','top','left'];              // Set options       var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode       var size = o.options.size || 15; // Default fold size              // Adjust       $.effects.save(el, props); el.show(); // Save & Show       var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper       var ref = (mode == 'show') ? ['width', 'height'] : ['height', 'width'];       var distance = (mode == 'show') ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];       if(mode == 'show') wrapper.css({height: size, width: 0}); // Shift              // Animation       var animation1 = {}, animation2 = {};       animation1[ref[0]] = mode == 'show' ? distance[0] : size;       animation2[ref[1]] = mode == 'show' ? distance[1] : 0;              // Animate       wrapper.animate(animation1, o.duration / 2, o.options.easing)       .animate(animation2, o.duration / 2, o.options.easing, function() {         if(mode == 'hide') el.hide(); // Hide         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore         if(o.callback) o.callback.apply(this, arguments); // Callback         el.dequeue();       });            });        };    })(jQuery);;(function($) {
  1660.   
  1661.   $.effects.highlight = function(o) {
  1662.     return this.queue(function() {
  1663.       
  1664.       // Create element
  1665.       var el = $(this), props = ['backgroundImage','backgroundColor','opacity'];
  1666.       
  1667.       // Set options
  1668.       var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
  1669.       var color = o.options.color || "#ffff99"; // Default highlight color
  1670.       
  1671.       // Adjust
  1672.       $.effects.save(el, props); el.show(); // Save & Show
  1673.       el.css({backgroundImage: 'none', backgroundColor: color}); // Shift
  1674.       
  1675.       // Animation
  1676.       var animation = {backgroundColor: $.data(this, "ec.storage.backgroundColor")};
  1677.       if (mode == "hide") animation['opacity'] = 0;
  1678.       
  1679.       // Animate
  1680.       el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
  1681.         if(mode == "hide") el.hide();
  1682.         $.effects.restore(el, props);
  1683.     if (mode == "show" && jQuery.browser.msie) this.style.removeAttribute('filter'); 
  1684.         if(o.callback) o.callback.apply(this, arguments);
  1685.         el.dequeue();
  1686.       }});
  1687.       
  1688.     });
  1689.     
  1690.   };
  1691.   
  1692. })(jQuery);;(function($) {
  1693.   
  1694.   $.effects.pulsate = function(o) {
  1695.     return this.queue(function() {
  1696.       
  1697.       // Create element
  1698.       var el = $(this);
  1699.       
  1700.       // Set options
  1701.       var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
  1702.       var times = o.options.times || 5; // Default # of times
  1703.       
  1704.       // Adjust
  1705.       if (mode != 'hide') times--;
  1706.       if (el.is(':hidden')) { // Show fadeIn
  1707.         el.css('opacity', 0);
  1708.         el.show(); // Show
  1709.         el.animate({opacity: 1}, o.duration / 2, o.options.easing);
  1710.         times--;
  1711.       }
  1712.       
  1713.       // Animate
  1714.       for (var i = 0; i < times; i++) { // Pulsate
  1715.         el.animate({opacity: 0}, o.duration / 2, o.options.easing).animate({opacity: 1}, o.duration / 2, o.options.easing);
  1716.       };
  1717.       if (mode == 'hide') { // Last Pulse
  1718.         el.animate({opacity: 0}, o.duration / 2, o.options.easing, function(){
  1719.           el.hide(); // Hide
  1720.           if(o.callback) o.callback.apply(this, arguments); // Callback
  1721.         });
  1722.       } else {
  1723.         el.animate({opacity: 0}, o.duration / 2, o.options.easing).animate({opacity: 1}, o.duration / 2, o.options.easing, function(){
  1724.           if(o.callback) o.callback.apply(this, arguments); // Callback
  1725.         });
  1726.       };
  1727.       el.queue('fx', function() { el.dequeue(); });
  1728.       el.dequeue();
  1729.     });
  1730.     
  1731.   };
  1732.   
  1733. })(jQuery);;(function($) {
  1734.   
  1735.   $.effects.puff = function(o) {
  1736.   
  1737.     return this.queue(function() {
  1738.   
  1739.       // Create element
  1740.       var el = $(this);
  1741.     
  1742.       // Set options
  1743.       var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
  1744.       var percent = parseInt(o.options.percent) || 150; // Set default puff percent
  1745.       o.options.fade = true; // It's not a puff if it doesn't fade! :)
  1746.       var original = {height: el.height(), width: el.width()}; // Save original
  1747.     
  1748.       // Adjust
  1749.       var factor = percent / 100;
  1750.       el.from = (mode == 'hide') ? original : {height: original.height * factor, width: original.width * factor};
  1751.     
  1752.       // Animation
  1753.       o.options.from = el.from;
  1754.       o.options.percent = (mode == 'hide') ? percent : 100;
  1755.       o.options.mode = mode;
  1756.     
  1757.       // Animate
  1758.       el.effect('scale', o.options, o.duration, o.callback);
  1759.       el.dequeue();
  1760.     });
  1761.     
  1762.   };
  1763.   $.effects.scale = function(o) {
  1764.     
  1765.     return this.queue(function() {
  1766.     
  1767.       // Create element
  1768.       var el = $(this);
  1769.       // Set options
  1770.       var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
  1771.       var percent = parseInt(o.options.percent) || (parseInt(o.options.percent) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
  1772.       var direction = o.options.direction || 'both'; // Set default axis
  1773.       var origin = o.options.origin; // The origin of the scaling
  1774.       if (mode != 'effect') { // Set default origin and restore for show/hide
  1775.         origin = origin || ['middle','center'];
  1776.         o.options.restore = true;
  1777.       }
  1778.       var original = {height: el.height(), width: el.width()}; // Save original
  1779.       el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
  1780.     
  1781.       // Adjust
  1782.       var factor = { // Set scaling factor
  1783.         y: direction != 'horizontal' ? (percent / 100) : 1,
  1784.         x: direction != 'vertical' ? (percent / 100) : 1
  1785.       };
  1786.       el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
  1787.       if (origin) { // Calculate baseline shifts
  1788.         var baseline = $.effects.getBaseline(origin, original);
  1789.         el.from.top = (original.height - el.from.height) * baseline.y;
  1790.         el.from.left = (original.width - el.from.width) * baseline.x;
  1791.         el.to.top = (original.height - el.to.height) * baseline.y;
  1792.         el.to.left = (original.width - el.to.width) * baseline.x;
  1793.       };
  1794.       if (o.options.fade) { // Fade option to support puff
  1795.         if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
  1796.         if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
  1797.       };
  1798.     
  1799.       // Animation
  1800.       o.options.from = el.from; o.options.to = el.to;
  1801.     
  1802.       // Animate
  1803.       el.effect('size', o.options, o.duration, o.callback);
  1804.       el.dequeue();
  1805.     });
  1806.     
  1807.   };
  1808.   
  1809.   $.effects.size = function(o) {
  1810.     return this.queue(function() {
  1811.       
  1812.       // Create element
  1813.       var el = $(this), props = ['position','top','left','width','height','overflow','opacity'];
  1814.       var props1 = ['position','overflow','opacity']; // Always restore
  1815.       var props2 = ['width','height','overflow']; // Copy for children
  1816.       var cProps = ['fontSize'];
  1817.       var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
  1818.       var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
  1819.       
  1820.       // Set options
  1821.       var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
  1822.       var restore = o.options.restore || false; // Default restore
  1823.       var scale = o.options.scale || 'both'; // Default scale mode
  1824.       var original = {height: el.height(), width: el.width()}; // Save original
  1825.       el.from = o.options.from || original; // Default from state
  1826.       el.to = o.options.to || original; // Default to state
  1827.       
  1828.       // Adjust
  1829.       var factor = { // Set scaling factor
  1830.         from: {y: el.from.height / original.height, x: el.from.width / original.width},
  1831.         to: {y: el.to.height / original.height, x: el.to.width / original.width}
  1832.       };
  1833.       if (scale == 'box' || scale == 'both') { // Scale the css box
  1834.         if (factor.from.y != factor.to.y) { // Vertical props scaling
  1835.           props = props.concat(vProps);
  1836.           el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
  1837.           el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
  1838.         };
  1839.         if (factor.from.x != factor.to.x) { // Horizontal props scaling
  1840.           props = props.concat(hProps);
  1841.           el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
  1842.           el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
  1843.         };
  1844.       };
  1845.       if (scale == 'content' || scale == 'both') { // Scale the content
  1846.         if (factor.from.y != factor.to.y) { // Vertical props scaling
  1847.           props = props.concat(cProps);
  1848.           el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
  1849.           el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
  1850.         };
  1851.       };
  1852.       $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
  1853.       $.effects.createWrapper(el); // Create Wrapper
  1854.       el.css('overflow','hidden').css(el.from); // Shift
  1855.       
  1856.       // Animate
  1857.       if (scale == 'content' || scale == 'both') { // Scale the children
  1858.         vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
  1859.         hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
  1860.         props2 = props.concat(vProps).concat(hProps); // Concat
  1861.         el.find("*[width]").each(function(){
  1862.           child = $(this);
  1863.           if (restore) $.effects.save(child, props2);
  1864.           var c_original = {height: child.height(), width: child.width()}; // Save original
  1865.           child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
  1866.           child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
  1867.           if (factor.from.y != factor.to.y) { // Vertical props scaling
  1868.             child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
  1869.             child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
  1870.           };
  1871.           if (factor.from.x != factor.to.x) { // Horizontal props scaling
  1872.             child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
  1873.             child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
  1874.           };
  1875.           child.css(child.from); // Shift children
  1876.           child.animate(child.to, o.duration, o.options.easing, function(){
  1877.             if (restore) $.effects.restore(child, props2); // Restore children
  1878.           }); // Animate children
  1879.         });
  1880.       };
  1881.       
  1882.       // Animate
  1883.       el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
  1884.         if(mode == 'hide') el.hide(); // Hide
  1885.         $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
  1886.         if(o.callback) o.callback.apply(this, arguments); // Callback
  1887.         el.dequeue();
  1888.       }}); 
  1889.       
  1890.     });
  1891.   };
  1892.   
  1893. })(jQuery);;(function($) {
  1894.   
  1895.   $.effects.shake = function(o) {
  1896.     return this.queue(function() {
  1897.       // Create element
  1898.       var el = $(this), props = ['position','top','left'];
  1899.       
  1900.       // Set options
  1901.       var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
  1902.       var direction = o.options.direction || 'left'; // Default direction
  1903.       var distance = o.options.distance || 20; // Default distance
  1904.       var times = o.options.times || 3; // Default # of times
  1905.       var speed = o.duration || o.options.duration || 140; // Default speed per shake
  1906.       
  1907.       // Adjust
  1908.       $.effects.save(el, props); el.show(); // Save & Show
  1909.       $.effects.createWrapper(el); // Create Wrapper
  1910.       var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
  1911.       var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
  1912.       
  1913.       // Animation
  1914.       var animation = {}, animation1 = {}, animation2 = {};
  1915.       animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
  1916.       animation1[ref] = (motion == 'pos' ? '+=' : '-=')  + distance * 2;
  1917.       animation2[ref] = (motion == 'pos' ? '-=' : '+=')  + distance * 2;
  1918.       
  1919.       // Animate
  1920.       el.animate(animation, speed, o.options.easing);
  1921.       for (var i = 1; i < times; i++) { // Shakes
  1922.         el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
  1923.       };
  1924.       el.animate(animation1, speed, o.options.easing).
  1925.       animate(animation, speed / 2, o.options.easing, function(){ // Last shake
  1926.         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
  1927.         if(o.callback) o.callback.apply(this, arguments); // Callback
  1928.       });
  1929.       el.queue('fx', function() { el.dequeue(); });
  1930.       el.dequeue();
  1931.     });
  1932.     
  1933.   };
  1934.   
  1935. })(jQuery);
  1936. ;(function($) {
  1937.   
  1938.   $.effects.slide = function(o) {
  1939.     return this.queue(function() {
  1940.       // Create element
  1941.       var el = $(this), props = ['position','top','left'];
  1942.       
  1943.       // Set options
  1944.       var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
  1945.       var direction = o.options.direction || 'left'; // Default Direction
  1946.       
  1947.       // Adjust
  1948.       $.effects.save(el, props); el.show(); // Save & Show
  1949.       $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
  1950.       var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
  1951.       var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
  1952.       var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
  1953.       if (mode == 'show') el.css(ref, motion == 'pos' ? -distance : distance); // Shift
  1954.       
  1955.       // Animation
  1956.       var animation = {};
  1957.       animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
  1958.       
  1959.       // Animate
  1960.       el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
  1961.         if(mode == 'hide') el.hide(); // Hide
  1962.         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
  1963.         if(o.callback) o.callback.apply(this, arguments); // Callback
  1964.         el.dequeue();
  1965.       }});
  1966.       
  1967.     });
  1968.     
  1969.   };
  1970.   
  1971. })(jQuery);;(function($) {
  1972.   
  1973.   $.effects.transfer = function(o) {
  1974.     return this.queue(function() {
  1975.       // Create element
  1976.       var el = $(this);
  1977.       
  1978.       // Set options
  1979.       var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
  1980.       var target = $(o.options.to); // Find Target
  1981.       var position = el.position();
  1982.   var transfer = $('<div id="fxTransfer"></div>').appendTo(document.body)
  1983.       
  1984.       // Set target css
  1985.       transfer.addClass(o.options.className);
  1986.       transfer.css({
  1987.         top: position['top'],
  1988.         left: position['left'],
  1989.         height: el.outerHeight({margin:true}) - parseInt(transfer.css('borderTopWidth')) - parseInt(transfer.css('borderBottomWidth')),
  1990.         width: el.outerWidth({margin:true}) - parseInt(transfer.css('borderLeftWidth')) - parseInt(transfer.css('borderRightWidth')),
  1991.         position: 'absolute'
  1992.       });
  1993.       
  1994.       // Animation
  1995.       position = target.position();
  1996.       animation = {
  1997.         top: position['top'],
  1998.         left: position['left'],
  1999.         height: target.outerHeight() - parseInt(transfer.css('borderTopWidth')) - parseInt(transfer.css('borderBottomWidth')),
  2000.         width: target.outerWidth() - parseInt(transfer.css('borderLeftWidth')) - parseInt(transfer.css('borderRightWidth'))
  2001.       };
  2002.       
  2003.       // Animate
  2004.       transfer.animate(animation, o.duration, o.options.easing, function() {
  2005.         transfer.remove(); // Remove div
  2006.         if(o.callback) o.callback.apply(this, arguments); // Callback
  2007.         el.dequeue();
  2008.       }); 
  2009.       
  2010.     });
  2011.     
  2012.   };
  2013.   
  2014. })(jQuery);