/**
 * Schedule widget for rendering the listing of class dates and times.
 * @extends HD.Widget
 * 
 * @param {Object} config configuration object containing configurable properties 
 * @param {HD.REO.Model} model the model object, signals model events
 * @param {HD.REO.View} view the view object, facilitates the communication of events between widgets 
 */
HD.REO.View.Schedule = function(config, model, view) {
	this.observers = [];
	this.config = config || {};
    
	if(model != null) {
		this.model = model;
		this.model.addObserver(this);
	}
	
	if(view != null) {
		this.view = view; 
	    this.view.addObserver(this);
	}
};

/**
 * Template object containing overrideable methods and properties.
 * @static
 */
HD.REO.View.Schedule.template = {
	getSchedule : function(course) {
		var date = HD.util.Date;
		var html = ['<ul>'];
		var schedule = course.schedule;
		for ( var i = 0, len = schedule.classes.length; i < len; i++) {
			var classs = schedule.classes[i];
			var startTime = classs.startTime;
			var endTime = classs.endTime;
			
			html.push([
					'<li class="hdSchedule">',
						'<span class="wkday">', classs.dayOfTheWeek, '</span>',
						'<span class="date">', classs.monthAndDay, '</span>',
						'<span class="strtTime">', classs.courseStartTime, '</span>',
						'<span> - </span>',
						'<span class="endTime">', classs.courseEndTime, '</span>',
					'</li>',
			].join(''));
		}
		html.push('</ul>');
		return html.join('');
	}
};

HD.REO.View.Schedule.prototype = {
	/**
	 * @see HD.Widget#update 
	 */
	update : function(eventName, eventData) {
		if(eventData != null && eventData.id == this.config.courseId 
				&& eventData.dealer != null && eventData.dealer.id == this.config.dealerId) {
			if(eventName == "model_GetCourseDetails_Start") {
				this.loading(true);
			} else if(eventName == "model_GetCourseDetails_Finish") {
				this.loading(false);
				this.render(eventData);
			}
		}
	},
	
	/**
	 * @see HD.Widget#setListeners 
	 */
	setListeners : function(data) {
		var parentEl = this.getParent();
		var dom = HD.util.Dom;
		
		var numOfItemsEls = dom.getByClass("hdMoreClasses", "a", parentEl);
		if(numOfItemsEls.length > 0) {
			var viewCb = this.view;
			numOfItemsEls[0].onclick = function() {
				HD.util.Analytics.track(HD.REO.analytics.getDealerClassList(HD.REO.experienceLevel, data.dealer.id));
				viewCb.notifyObservers.call(viewCb, "scheduleView_Dealer_Selected", data.dealer);
			};
		}
	},
	
	/**
	 * @see HD.Widget#getHtml 
	 */
	getHtml : function(data) {
    	var classes = HD.CSS_CLASSES;
    	var reoClasses = HD.REO.View.CSS_CLASSES;
    	
    	if(data == null || data.length < 1) {
    		alert ("ERROR: no course detail data returned");
    		return "";
    	}
    	
    	return ['<div class="', classes.WIDGET, ' ', reoClasses.DETAIL ,'">',
					'<h4>Schedule</h4>',
					HD.REO.View.Schedule.template.getSchedule(data),
    	            (data.moreClasses ? '<a href="javascript:void(0)" class="hdMoreClasses">See all upcoming class dates at this location</a>' : ''), 
				'</div>'].join('');
	}
};

HD.util.Common.extend(HD.REO.View.Schedule, [HD.Widget]);
