1 /**
  2  * @author Gillis Haasnoot <gillis.haasnoot@gmail.com>
  3  * @package Banana.Controls
  4  * @summary Date picker. using jquery ui datapicker
  5  */
  6 
  7 goog.provide('Banana.Controls.DataControls.DateTimePicker');
  8 
  9 /** @namespace Banana.Controls.DateTimePicker */
 10 namespace('Banana.Controls').DateTimePicker = Banana.Controls.DataControl.extend(
 11 /** @lends Banana.Controls.DateTimePicker.prototype */
 12 {
 13 	/**
 14 	 * Creates a date and time picker combined in one.
 15 	 * Currently the only supported time format is MM-DD-YYYY HH:MM:SS:FF 
 16 	 * 
 17 	 * @constructs
 18 	 * @extends Banana.Controls.DataControl
 19 	 */
 20 	init : function()
 21 	{
 22 		this._super();
 23 		this.addCssClass('BDateTimePicker');
 24 		this.dateCtrl = new Banana.Controls.DatePicker().addCssClass('BDateTimePickerDateControl');
 25 		this.timeCtrl = new Banana.Controls.MaskedTextBox().setMask('99:99:99').addCssClass('BDateTimePickerTimeControl');
 26 		
 27 		this.defaultTime = '00:00:00:00';
 28 		
 29 		this.resultFormat = 'date';
 30 	},
 31 	
 32 	/**
 33 	 * @override
 34 	 */
 35 	updateDisplay : function()
 36 	{
 37 		if (!this.timeCtrl.getData() && this.defaultTime)
 38 		{
 39 			this.timeCtrl.setData(this.defaultTime);
 40 		}
 41 	},
 42 	
 43 	/**
 44 	 * Set a minimum selectable date via a Banana Date object
 45 	 * @param {Banana.Util.DateTimecode} date 
 46 	 * @return {this}
 47 	 */
 48 	setMinimumDate : function(date)
 49 	{
 50 		this.dateCtrl.setMinimumDate(date);
 51 		return this;
 52 	},
 53 	
 54 	/**
 55 	 * @return {Banana.Controls.MaskedTextBox}
 56 	 */
 57 	getTimeControl : function()
 58 	{
 59 		return this.timeCtrl;
 60 	},
 61 	
 62 	/**
 63 	 * @return {Banana.Controls.DatePicker}
 64 	 */
 65 	getDateControl : function()
 66 	{
 67 		return this.dateCtrl;
 68 	},
 69 	
 70 	/**
 71 	 * @override
 72 	 */
 73 	createComponents : function()
 74 	{
 75 		this.addControl(this.dateCtrl);
 76 		this.addControl(this.timeCtrl);
 77 		
 78 		// Pass on changed events to enable validation
 79 		//dont trigger event when data is the same as previous
 80 		this.dateCtrl.bind('dataChanged',this.getProxy(function(){
 81 			
 82 			var data = this.getData();
 83 			
 84 			if (data == this.previousData) return;
 85 			
 86 			this.previousData = data;
 87 			
 88 			this.triggerEvent('dataChanged');
 89 		}));
 90 		this.timeCtrl.bind('dataChanged',this.getProxy(function()
 91 		{
 92 			var data = this.getData();
 93 			
 94 			if (data == this.previousData) return;
 95 			
 96 			this.previousData = data;
 97 			
 98 			this.triggerEvent('dataChanged');
 99 		
100 		}));
101 	},
102 	
103 	/**
104 	 * @override
105 	 */
106 	setData : function(data,ignoreEvent,ignoreDom)
107 	{
108 		this._super(data);
109 		if (data)
110 		{
111 			var parts = data.split(' ');
112 			this.dateCtrl.setData(parts[0],ignoreEvent,ignoreDom);
113 			this.timeCtrl.setData(parts[1],ignoreEvent,ignoreDom);
114 		}
115 		return this;
116 	},
117 	
118 	/**
119 	 * @param {String} type timecode or null
120 	 * @return {this} this
121 	 */
122 	setReturnType : function(type)
123 	{
124 		this.resultFormat =type;
125 		return this;
126 	},
127 	
128 	/**
129 	 * @return {String} 
130 	 */
131 	getData : function()
132 	{
133 		var datePart = this.dateCtrl.getData()
134 		var timePart = this.timeCtrl.getData();
135 		
136 		if (!datePart)
137 		{
138 			return false;
139 		}
140 		
141 		//add frame part
142 		if (timePart)
143 		{
144 			//if our time part in invalid we make zero from it
145 			if (timePart.match(/_/))
146 			{
147 				timePart = '00:00:00:00';
148 			}
149 			else
150 			{
151 				timePart+=':00';
152 			}
153 		}
154 		else
155 		{
156 			timePart = '00:00:00:00';
157 		}
158 		
159 		this.data = [datePart, timePart].join(' ');
160 	
161 		if (this.resultFormat == 'tc')
162 		{
163 			var d = new Banana.Util.DateTimecode();
164 			d.setLocalDateTime(this._super());
165 			return d.getTimecode();
166 		}
167 		
168 		return this._super();
169 	},
170 	
171 	/**
172 	 * @depricated
173 	 */
174 	setDateFormat : function(format)
175 	{
176 		this.resultFormat = format;
177 		return this;
178 	}
179 });