summaryrefslogtreecommitdiff
path: root/app/lib/grappelli/media/js/grappelli.timepicker.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/lib/grappelli/media/js/grappelli.timepicker.js')
-rw-r--r--app/lib/grappelli/media/js/grappelli.timepicker.js171
1 files changed, 171 insertions, 0 deletions
diff --git a/app/lib/grappelli/media/js/grappelli.timepicker.js b/app/lib/grappelli/media/js/grappelli.timepicker.js
new file mode 100644
index 0000000..05bedcc
--- /dev/null
+++ b/app/lib/grappelli/media/js/grappelli.timepicker.js
@@ -0,0 +1,171 @@
+/**
+ * this is grappellis timepicker.
+ * works pretty similar to ui.datepicker:
+ * - adds a button to the element
+ * - creates a node (div) at the bottom called ui-timepicker
+ * - element.onClick fills the ui-timepicker node with the time_list (all times you can select)
+ */
+
+(function( $ ) {
+$.widget("ui.timepicker", {
+ // default options
+ options: {
+ // template for the container of the timepicker
+ template: '<div id="ui-timepicker" class="module" style="position: absolute; display: none;"></div>',
+ // selector to get the ui-timepicker once it's added to the dom
+ timepicker_selector: "#ui-timepicker",
+ // needed offset of the container from the element
+ offset: {
+ top: 0
+ },
+ // if time_list wasn't sent when calling the timepicker we use this
+ default_time_list: [
+ 'now',
+ '00:00',
+ '01:00',
+ '02:00',
+ '03:00',
+ '04:00',
+ '05:00',
+ '06:00',
+ '07:00',
+ '08:00',
+ '09:00',
+ '10:00',
+ '11:00',
+ '12:00',
+ '13:00',
+ '14:00',
+ '15:00',
+ '16:00',
+ '17:00',
+ '18:00',
+ '19:00',
+ '20:00',
+ '21:00',
+ '22:00',
+ '23:00'
+ ],
+ // leave this empty!!!
+ // NOTE: you can't set a default for time_list because if you call:
+ // $("node").timepicker({time_list: ["01:00", "02:00"]})
+ // ui.widget will extend/merge the options.time_list whith the one you sent.
+ time_list: []
+ },
+
+ /**
+ * init timepicker for a specific element
+ */
+ _create: function() {
+ // for the events
+ var self = this;
+
+ // to close timpicker if you click somewhere in the document
+ $(document).mousedown(function(evt) {
+ if (self.timepicker.is(":visible")) {
+ var $target = $(evt.target);
+ if ($target[0].id != self.timepicker[0].id && $target.parents(self.options.timepicker_selector).length == 0 && !$target.hasClass('hasTimepicker') && !$target.hasClass('ui-timepicker-trigger')) {
+ self.timepicker.hide();
+ }
+ }
+ });
+
+ // get/create timepicker's container
+ if ($(this.options.timepicker_selector).size() == 0) {
+ $(this.options.template).appendTo('body');
+ }
+ this.timepicker = $(this.options.timepicker_selector);
+ this.timepicker.hide();
+
+ // modify the element and create the button
+ this.element.addClass("hasTimepicker");
+ this.button = $('<button type="button" class="ui-timepicker-trigger"></button>');
+ this.element.after(this.button);
+
+ // disable button if element is disabled
+ if (this.element.attr("disabled")) {
+ this.button.attr("disabled", true);
+ }
+ // register event
+ else {
+ this.button.click(function() {
+ self._toggleTimepicker();
+ });
+ }
+ },
+
+ /**
+ * called when button is clicked
+ */
+ _toggleTimepicker: function() {
+ if (this.timepicker.is(":visible")) {
+ this.timepicker.hide();
+ } else {
+ this.element.focus();
+ this._generateTimepickerContents();
+ this._showTimepicker();
+ }
+ },
+
+ /**
+ * fills timepicker with time_list of element and shows it.
+ *
+ * called by _toggleTimepicker
+ */
+ _generateTimepickerContents: function() {
+ var self = this,
+ template_str = "<ul>";
+
+ // there is no time_list for this instance so use the default one
+ if (this.options.time_list.length == 0) {
+ this.options.time_list = this.options.default_time_list;
+ }
+
+ for (var i = 0; i < this.options.time_list.length; i++) {
+ if (this.options.time_list[i] == "now") {
+ var now = new Date(),
+ hours = now.getHours(),
+ minutes = now.getMinutes();
+
+ hours = ((hours < 10) ? "0" + hours : hours);
+ minutes = ((minutes < 10) ? "0" + minutes : minutes);
+
+ template_str += '<li class="ui-state-active row">' + hours + ":" + minutes + '</li>';
+ } else {
+ template_str += '<li class="ui-state-default row">' + this.options.time_list[i] + '</li>';
+ }
+ }
+ template_str += "</ul>";
+
+ // fill timepicker container
+ this.timepicker.html(template_str);
+
+ // click handler for items (times) in timepicker
+ this.timepicker.find('li').click(function() {
+ // remove active class from all items
+ $(this).parent().children('li').removeClass("ui-state-active");
+ // mark clicked item as active
+ $(this).addClass("ui-state-active");
+
+ // set the new value and hide the timepicker
+ self.element.val($(this).html());
+ self.timepicker.hide();
+ });
+ },
+
+ /**
+ * sets offset and shows timepicker containter
+ */
+ _showTimepicker: function() {
+ this.timepicker_offset = this.element.offset();
+ this.timepicker_offset.top += this.element.outerHeight() + this.options.offset.top;
+ this.timepicker.css(this.timepicker_offset);
+ this.timepicker.show();
+ },
+
+ destroy: function() {
+ $.Widget.prototype.destroy.apply(this, arguments); // default destroy
+ // now do other stuff particular to this widget
+ }
+});
+})(django.jQuery); \ No newline at end of file