dojo.provide('epages.cartridges.de_epages.calendar.widget.Datastore');
dojo.require('dijit._Widget');
dojo.require('epages.io.json');
dojo.require('epages.localize');
dojo.require('dojo.date.stamp');

dojo.declare(
	"epages.cartridges.de_epages.calendar.widget.Datastore",
	[dijit._Widget],
	{
		/**
		 * public properties
		 */

		url          :'?',
		objectId     : undefined,

		_dayLists    : undefined,
		_dateFormatsBO : undefined,
		_dateFormatsSF : undefined,

		postMixInProperties: function () {
			this.inherited('postMixInProperties',arguments);
			this._dayLists = {};
			this._dateFormatsBO = {};
			this._dateFormatsSF = {};
		},

		getDayList: function(date){
			date = epages.localize.formatDateTime(date,epages.vars.Locale.datetimeFormat);
			if(this._dayLists[date]){ 
				return this._dayLists[date];
			}
			// load data from server
			var json = new epages.io.Json;
			var result = json.loadSync(this.url, {
				'ViewAction': 'JSON-DayList',
				'ObjectID':   this.objectId,
				'StartDate':  date
			});
			if(!result.error){
				var data = result.data;
				this._dayLists[date] = data;
				return data;
			}else{ 
				return false;
			}
		},

		getDateFormats: function(request) {
			var startDate = dojo.date.stamp.toISOString(request.startDate);
			var endDate = dojo.date.stamp.toISOString(request.endDate);
			var requestKey = request.objectId
											+':'+ startDate
											+':'+ endDate
											+':'+ request.available
											+':'+request.requestedMinutes;
			if(this._dateFormatsBO[requestKey]){
				return this._dateFormatsBO[requestKey];
			}
			else {
				var me = this;
				var json = new epages.io.Json;

				var result = json.loadSync(this.url,{
					'ViewAction': 'JSON-BO-AppointmentCalendar',
					'ObjectID':   request.objectId,
					'StartDate':  startDate,
					'EndDate':    endDate,
					'Available':  request.available,
					'RequestedMinutes' : request.requestedMinutes
					//'Requested':  request.requested
				});
				if(!result.error){
					this._dateFormatsBO[requestKey] = result.data;
					return result.data;
				}
				return false;
			}
		},

		getDateFormatsSF: function(request){
			var key = request.objectId
							+':'+dojo.date.stamp.toISOString(request.startDate)
							+':'+dojo.date.stamp.toISOString(request.endDate)
							+':'+request.available
							+':'+request.requestedMinutes;
			if(this._dateFormatsSF[key]){
				var result = this._dateFormatsSF[key];
				dojo.publish(this.id+'/load',[result,dojo.date.stamp.toISOString(request.startDate)]);
			}
			else {
				var me = this;
				var json = new epages.io.Json;
				json.loadAsync(this.url,
				function(result){
					me._dateFormatsSF[key] = result.data;
					dojo.publish(me.id+'/load',[result.data,dojo.date.stamp.toISOString(request.startDate)]);
				}
				,{
					'ViewAction': 'JSON-AppointmentCalendar',
					'ObjectID':   request.objectId,
					'StartDate':  dojo.date.stamp.toISOString(request.startDate),
					'EndDate':    dojo.date.stamp.toISOString(request.endDate),
					'Available':  request.available,
					'RequestedMinutes' : request.requestedMinutes
				});
			}
		}
});