/**
 * Controller 
 * @param model
 */
function Controller(model){
	this.model = model;
}

/**
 * Change schedule date
 */
Controller.prototype.changeDate = function(date){
	this.model.setDate(date);
	this.updateSchedule();
}

/**
 * Change schedule mode
 */
Controller.prototype.changeMode = function(mode){
	this.model.setMode(mode);
	this.updateSchedule();
}

/**
 * Change feed
 */
Controller.prototype.changeFeed = function(feedCode){
	this.model.setFeed(feedCode);
	this.updateSchedule();
}

/**
 * Show Show detail (Mostrar detalle del show)
 * @param indexOrPos index:int or {rownIndex:int, colIndex:int}
 */
Controller.prototype.selectShow = function(indexOrPos){
	
	var show;
	
	if(this.model.getMode()==Model.MODE_DAY){
		var index = indexOrPos;
		show = this.model.getScheduleDay().getShowByIndex(index);
	}else{
		var pos = indexOrPos;
		show = this.model.getScheduleWeek().getShowByPos(pos);
	}
	
	this.model.setSelectedShow(show);
	this.model.setAppState(AppStateTypes.SHOW_DETAIL_LOADING);
	
	var delegate = new ScheduleDelegate(this.model.getConfig().serviceLocator, {result:BoundMethod.create(this, this.showDetailResult), fault:BoundMethod.create(this, this.showDetailFault)});
	delegate.getShow(show.id);
}


/**
 * @private
 */
Controller.prototype.updateSchedule = function(){
	this.model.setAppState(AppStateTypes.SCHEDULE_LOADING);
	
	var delegate = new ScheduleDelegate(this.model.getConfig().serviceLocator, {result:BoundMethod.create(this, this.scheduleResult), fault:BoundMethod.create(this, this.scheduleFault)});

	if(this.model.getMode()==Model.MODE_DAY){
		delegate.getSchedule(this.model.getFeed(), this.model.getDate());
	}else{
		var dateFrom = this.model.getDate();
		var dateTo = new Date(this.model.getDate());
		dateTo.setDate(dateTo.getDate()+7);
		delegate.getSchedule(this.model.getFeed(), dateFrom, dateTo);
	}
}

/**
 * @private
 */
Controller.prototype.scheduleResult = function(data){
	var shows = (data && data.feeds && data.feeds[0] && data.feeds[0].shows) ? data.feeds[0].shows : [];
	
	if(this.model.getMode()==Model.MODE_DAY){
		this.model.getScheduleDay().setShowList(shows);
	}else{
		var from = ParseHelper.stringToDate(data.dateFrom);
		var to = ParseHelper.stringToDate(data.dateTo);
		this.model.getScheduleWeek().setWeekData(from, to, shows);
	}
	
	this.model.setAppState(AppStateTypes.SCHEDULE_SUCCESS);
}

/**
 * @private
 */
Controller.prototype.scheduleFault = function(error){
	this.model.setAppState(AppStateTypes.SCHEDULE_ERROR);
	$.log("Controller::scheduleFault error=", error);
}

/**
 * @private
 */
Controller.prototype.showDetailResult = function(data){
	this.model.setShowDetail(data);
	this.model.setAppState(AppStateTypes.SHOW_DETAIL_SUCCESS);
}

/**
 * @private
 */
Controller.prototype.showDetailFault = function(error){
	this.model.setAppState(AppStateTypes.SHOW_DETAIL_ERROR);
	$.log("Controller::showDetailFault error=", error);
}

