var CalendarView = jQuery.Class.create({
	init: function(){
		this.calendarType = '';
	},

	initActions: function() {
		$j('.addEventBtn').bind('click', {parent:this}, function(e) {e.data.parent.showQuickAddDlg(e)})
		this.quickDlg = new CalendarDlg(this);
		$j(this.quickDlg).bind("activityQuickSave", {parent: this},
			function(e, id, data, oldType) {
				if(id!="") {

					e.data.parent.updateActivity(id, data, oldType);
				} else {
					e.data.parent.createActivity(data);
				}
		});
		this.viewWindow = new ActivityView();
		$j(this.mainTbody).bind('click', {parent: this},
			function(e) {
				e.data.parent.showViewWindow(e);
				e.data.parent.initAction(e); // delete or edit
			}
		);
	},

	showViewWindow: function(e) {
		var element = e.target;
		if(!$j(element).hasClass('actTitle')) {
			return;
		} else {
			var eventId = this.getActivityId(element); // activity
			this.viewWindow.show(eventId, this.data[this.dictById[eventId]].type);
		}
	},

	initAction: function(e) {
		var element = e.target;
		if($j(element).hasClass('delEventBtn')) {
			var id = this.getActivityId(element);
			this.initRemoveDialog(id);
		}
		if($j(element).hasClass('editEventBtn')) {
			var id = this.getActivityId(element);
			this.initEditDialog(id);
		}
	},

	initRemoveDialog: function(id) {
		var eventData = clone(this.data[this.dictById[id]]);
		var confirmDlg = $j("#confirmDlg");
		confirmDlg.html('Do you really want to remove event &#171;'+eventData.eventdescription+'&#187;?');
		var parent = this;
		confirmDlg.dialog({title: 'Delete event',
			buttons: {
				'Yes': function() {parent.runRemoveQuery(eventData, confirmDlg)},
				'No': function() {confirmDlg.dialog( 'destroy' );}
			},
			open: function() {
				//console.log('open', this);
				var btnNo = $j(this.parentNode).find('.ui-dialog-buttonpane button:eq(1)');
				var btnYes = $j(this.parentNode).find('.ui-dialog-buttonpane button:eq(0)');
				btnNo.focus();
				btnNo.addClass('ui-state-focus');
				btnYes.removeClass('ui-state-focus');
				//$(this).parents('.ui-dialog-buttonpane button:eq(0)').focus();
   			},
			close: function(event, ui) {
				confirmDlg.dialog( 'destroy' );
			}
		});
		return;

	},

	initEditDialog: function(id) {
		var eventData = clone(this.data[this.dictById[id]]);
		//console.log('eventData', eventData);
		this.quickDlg.show(eventData);
	},

	runRemoveQuery: function(eventData, confirmDlg) {
		var parent = this;
		$j.ajax({
				url: '/admin/panel/calendar/deleteEvent',
				type: "POST",
				data: {id:eventData.series_id, type: eventData.type},
				dataType: "json",
				success: function(jsonData, textStatus) {
					confirmDlg.dialog( 'destroy' );
					if(jsonData.success) {
						parent.removeClientSideEvents(eventData);
					} else {
						alert('Activity is not saved!');
					}

				},
				error: function (XMLHttpRequest, textStatus, errorThrown) {
					confirmDlg.dialog( 'destroy' );
					alert('Activity is not saved! Wrong server responce.');
				}
			}
		);
	},

	removeClientSideEvents: function(eventData) {
		var seriesId  = eventData.series_id;
		for(var j=0; j < this.data.length; j++) {
			if(this.data[j].series_id==seriesId) {
				var tmpId = this.data[j].itemid;
				$j('#item_'+tmpId).remove();
				this.data[j] = null;
			}
		}
		var newData = new Array();
		var newDictById = {};
		j = 0 ;
		for(var i=0; i < this.data.length; i++) {
			if(this.data[i]!=null) {
				newData.push(this.data[i]);
				newDictById[this.data[i].itemid] = j;
				j++;
			}
		}
		this.data = newData;
		this.dictById = newDictById;
	},

	getActivityId: function(element) {
		var attempt = 0;
		while(!$j(element).hasClass('activity')) {
			element = element.parentNode;
			attempt++;
			if(attempt>25) {
				console.error('Can not find activity div', element);
				return null;
			}
		}
		return $j(element).attr('id').split('_')[1];
	},

	createActivity: function(data) {
		this.submitEventData('create', data);
	},

	updateActivity: function(id, data, oldType) {

		data.series_id = id;
		data.old_type = oldType;
		this.submitEventData('update', data);
	},

	submitEventData: function(action, data) {
		var tmpData = $j.evalJSON($j.toJSON(data))

		var parent = this;

		if (action=='update') {
			var url = '/admin/panel/calendar/updateEvent/'+this.calendarType;
		} else { //create
			delete tmpData.series_id;
			var url = '/admin/panel/calendar/createEvent';
		}
		delete tmpData.id;
		var jsonString = $j.toJSON(tmpData);

		$j.ajax({
				url: url,
				type: "POST",
				data: "data="+jsonString,
				dataType: "json",
				success: function(jsonData, textStatus) {
					if(jsonData.success) {
						data.savedData = jsonData.data;
						if (action=='update') {
							parent.removeClientSideEvents(data);
						}
						if(data.maincalendar=="1") {
							parent.createActivityDiv(data);
						}
						//alert('Item saved. Click ok to refresh');
						window.location.href=window.location.href;
					} else {
						alert('Activity is not saved!');
					}
				},
				error: function (XMLHttpRequest, textStatus, errorThrown) {
					alert('Activity is not saved! Wrong server responce.');
				}
			}
		);
	},

	addToData: function(data, eventDate, index) {
		tmpData = clone(data);
		delete tmpData.savedData;
		if(typeof(index)!='undefined') {
			tmpData.itemid = data.savedData.ids[index];
			tmpData.series_id = data.savedData.series_id;
		} else {
			tmpData.itemid = tmpData.series_id = data.savedData.id;
		}
		tmpData.eventdate = dateToStr(eventDate);
		if((tmpData.type=='daily') || (tmpData.type=='weekly')) {
			tmpData.aid = data.savedData.series_id;
		} else {
			tmpData.aid = tmpData.itemid;
		}
		this.data.push(tmpData);
		this.dictById[tmpData.itemid] = this.data.length -1;
	}
});


function strToDate (strDate) {
	var dateSpited = strDate.split('-');
	return new Date(dateSpited[0], parseInt(dateSpited[1], 10) - 1,  parseInt(dateSpited[2], 10));
}

function dateToStr (tmpDate) {
	var tmpMonth = tmpDate.getMonth();
	var strTmpMonth = tmpMonth+1;
	var strTmpDay = tmpDate.getDate();
	if(strTmpMonth<10) {
		strTmpMonth = '0' + strTmpMonth;
	}
	if(strTmpDay<10) {
		strTmpDay = '0' + strTmpDay;
	}
	return tmpDate.getFullYear()+'-'+strTmpMonth+'-'+strTmpDay;
}

function clone(obj){
    if(obj == null || typeof(obj) != 'object')
        return obj;
    var temp = new obj.constructor(); // changed (twice)
    for(var key in obj)
        temp[key] = clone(obj[key]);
    return temp;
}
