jQuery=jQuery;

function getCourseKeyString(course){
	return course.courseNumber +'_'+ course.subject.code;
}
function getCourseFromKeyString(courseKeyString){
	var keyArray=courseKeyString.split("_");
	return {
		subject: {code: keyArray[1]},
		courseNumber: keyArray[0]
	};
}
function encodeHtml(text){
	return text.replace(/</g, "&lt;").replace(/>/g, "&gt;");
}
function Logger(logLevel){
	this.logLevel=logLevel;
	if(logLevel < 3){
		jQuery(document).ready(function(){
			var debuggerHtml='<div style="margin-top:15px;border:1px solid #999;border-bottom: 0px;background-color:white;">'+
								'<div style="padding:5px 5px 5px 5px; border-bottom:1px solid #999">Debugger</div>'+
								'<div id="logData"></div>'+
							 '</div>';
			jQuery("#debugger").html(debuggerHtml);
		});
	}
}
Logger.prototype = {
	logLevel:null,
	
	trace: function(message){
		if(this.logLevel < 1){
			this.logMessage(message);
		}
	},
	debug: function(message){
		if(this.logLevel < 2){
			this.logMessage(message);
		}
	},
	info: function(message){
		if(this.logLevel < 3){
			this.logMessage(message);
		}
	},	
	logMessage: function(message){
		if(message === ""){
			message="(empty)";
		}
		jQuery("#logData").append('<div style="padding:5px 5px 5px 5px; border-bottom:1px solid #999">'+message+'</div>');

	}
};

var logger = new Logger(4);

function DeleteDialog(dialogTitle,dialogText,yesCallback){
	jQuery("#dialogsContainer").html('<div id="dialog">'+dialogText+'</div>');
	jQuery("#dialog").dialog({ 
	    modal: true, 
	    resizable: false,
	    draggable: false,
	    title: dialogTitle,
	    overlay: { 
	        opacity: 0.5, 
	        background: "black" 
	    },
	    buttons: { 
	        "Yes": function() {
	        	var dialog=this;
	        	jQuery(dialog).dialog("close");
				yesCallback();
	        }, 
	        "No": function() {
	            jQuery(this).dialog("close"); 
	        } 
	    } 
	});
}

function LoadingContainer(serverConfig,containerQuery){
	this.containerQuery=containerQuery;
	var loadingHtml='<div class="loadingContainer">';
	loadingHtml+=		'<img src="'+serverConfig.basePath+'/htdocs/CoursesNew/resources/images/Loading.gif"></img>';
	loadingHtml+=		'<div>Loading...</div>';
	loadingHtml+=	'</div>';
	containerQuery.html(loadingHtml);
}
LoadingContainer.prototype={
	/*containerQuery: null,
	finish: function(content){
		var self=this;
		self.continerQuery.html(content);
	}	*/
}


function enableLoadingBar(enabled){
	var continerQuery = jQuery(".fixedLoadingContainer");
	if(enabled){
		continerQuery.css("display","block");
	}else{
		continerQuery.css("display","none");
	}
}

function ExpanderButton(expandButtonQuery, expandingRegionQuery){
	this.expandButtonQuery=expandButtonQuery;
	this.expandingRegionQuery=expandingRegionQuery;
	this.addExpanderButtonClickListener();
	this.collapse();
}
ExpanderButton.prototype={
	expandButtonQuery: null,
	expandingRegionQuery: null,
	isExpanded: null,
	addExpanderButtonClickListener: function(){
		var self=this;
		self.expandButtonQuery.click(function(){
			if(self.isExpanded){
				self.collapse();
			}else{
				self.expand();
			}
		});
	},
	expand: function(){
		var self=this;
		self.isExpanded=true;
		self.expandButtonQuery.removeClass("collapsedButton");
		self.expandButtonQuery.addClass("expandedButton");
		
		self.expandingRegionQuery.removeClass("collapsedRegion");
		self.expandingRegionQuery.addClass("expandedRegion");		
	},	
	collapse: function(){
		var self=this;
		self.isExpanded=false;
		self.expandButtonQuery.removeClass("expandedButton");
		self.expandButtonQuery.addClass("collapsedButton");

		self.expandingRegionQuery.removeClass("expandedRegion");
		self.expandingRegionQuery.addClass("collapsedRegion");		
	}
	
};

function ServerConfig(showPagePath,basePath,jsonServicePath,fragmentServicePath,netId,authentHash){
	this.showPagePath=showPagePath;
	this.basePath=basePath;
	this.jsonServicePath=jsonServicePath;
	this.fragmentServicePath=fragmentServicePath;
	this.netId=netId;
	this.authentHash=authentHash;
}
ServerConfig.prototype={
	showPagePath: null,
	basePath: null,
	jsonServicePath: null,
	fragmentServicePath: null,
	netId: null,
	authentHash: null
}

function AcademicPlannerService(serverConfig,analyticsTracker){
	this.serverConfig=serverConfig;
	this.analyticsTracker=analyticsTracker;
	jQuery.ajaxSetup({cache:false});
}
AcademicPlannerService.prototype={
	serverConfig: null,
	analyticsTracker: null,
	
	/* ======================= JSON services ======================== */
	
	findAllSubjects: function(termId,callback){
		var queryParams = {"termId" : termId};
		this.sendJsonRequest("findAllSubjects",queryParams,callback);
	},
	findCoursesBySubject: function(termId,subjectCode,callback){
		var queryParams = {"termId" : termId, "subjectCode" : subjectCode};
		this.sendJsonRequest("findCoursesBySubject",queryParams,callback);
	},
	getStudent: function(netId,callback){
		this.sendJsonRequest("getStudent",{},callback);
	},
	getPlan: function(planId,callback){
		var queryParams = {"planId" : planId};
		this.sendJsonRequest("getPlan",queryParams,callback);
	},
	createNewPlan: function(planName,callback){
		var queryParams = {"planName" : planName};
		this.sendJsonRequest("createNewPlan",queryParams,callback);
	},
	deletePlan: function(planId,callback){
		var queryParams = {"planId" : planId};
		this.sendJsonRequest("deletePlan",queryParams,callback);
	},
	updatePlan: function(plan, callback){
		var queryParams = {"planId" : plan.id,"planName":plan.name};
		this.sendJsonRequest("updatePlan",queryParams,callback);
	},
	deletePlannedTerm: function(plannedTermId,callback){
		var queryParams = {"plannedTermId" : plannedTermId};	
		this.sendJsonRequest("deletePlannedTerm",queryParams,callback);
	},
	addPlannedTerm: function(planId,termId,callback){
		var queryParams = {"planId" : planId,"termId":termId};
		this.sendJsonRequest("addPlannedTerm",queryParams,callback);
	},
	addComment: function(comment,href,browser,callback){
		var queryParams = {"comment" : comment,"href":escape(href), "browser":browser};		
		this.sendJsonRequest("addComment",queryParams,callback);
	},
	sendToEmail: function(planId,emailAddress,callback){
		var queryParams = {"planId" : planId,"emailAddress":emailAddress};
		this.sendJsonRequest("sendToEmail",queryParams,callback);
	},
	setDefaultPlan: function(planId,callback){
		var queryParams = {"planId" : planId};
		this.sendJsonRequest("setDefaultPlan",queryParams,callback);
	},
	sendJsonRequest: function(action,queryParams,callback){
		var self=this;
		self.analyticsTracker._trackPageview('/ajax/'+action + '/Params?');
		
		var url=self.serverConfig.jsonServicePath;
		queryParams["action"]=action;
		queryParams["netId"]=self.serverConfig.netId;
		queryParams["authentHash"]=self.serverConfig.authentHash;
		queryParams["jsoncallback"]="";
		jQuery.getJSON(url,queryParams,function(result){
			self.analyticsTracker._trackPageview('/ajax/'+action + '/Params?');
			callback(result);
		});
	},
	/* ======================= Fragment services ===================== */
	getPlannedTerm: function(plannedTermId,callback){
		var queryParams={'plannedTermId':plannedTermId};
		this.sendAjaxFragmentRequest("getPlannedTerm",queryParams,callback);
	},
	getPlannedTermSchedule: function(plannedTermId,callback){
		var queryParams={'plannedTermId':plannedTermId};
		this.sendAjaxFragmentRequest("getPlannedTermSchedule",queryParams,callback);
	},
	getAdvancedTermWarnings: function(plannedTermId,callback){
		var queryParams={'plannedTermId':plannedTermId};
		this.sendAjaxFragmentRequest("getAdvancedTermWarnings",queryParams,callback);
	},
	getPlanTotals: function(planId,callback){
		var queryParams={'planId':planId};
		this.sendAjaxFragmentRequest("getPlanTotals",queryParams,callback);
	},
	getAdvancedPlannedTerm: function(plannedTermId,callback){
		var queryParams={'plannedTermId':plannedTermId};
		this.sendAjaxFragmentRequest("getAdvancedPlannedTerm",queryParams,callback);
	},
	getPlanList: function(callback){
		this.sendAjaxFragmentRequest("getPlanList",{},callback);
	},
	addCourseToPlannedTerm: function(plannedTermId,subjectCode,courseNumber,callback){	
		var queryParams={
			'plannedTermId':plannedTermId,
			'subjectCode':subjectCode,
			'courseNumber':courseNumber};
		this.sendAjaxFragmentRequest("addCourseToPlannedTerm",queryParams,callback);
	},
	addSectionToPlannedTerm: function(plannedTermId,sectionKey,callback){
		var queryParams = {
			'plannedTermId':plannedTermId,
			'sectionKey':sectionKey };
		this.sendAjaxFragmentRequest("addSectionToPlannedTerm",queryParams,callback);
	},
	deletePlannedSection: function(plannedSectionId,plannedTermId,callback){
		var queryParams = {
			'plannedSectionId':plannedSectionId,
			'plannedTermId':plannedTermId };
		this.sendAjaxFragmentRequest("deletePlannedSection",queryParams,callback);
	},	
	findSectionsAdvanced: function(searchData,callback){		
		this.sendAjaxFragmentRequest("findSectionsAdvanced",searchData,callback);
	},
	sendAjaxFragmentRequest: function(action,queryParams,callback){
		var self=this;
		queryParams["action"] = action;
		jQuery.ajax({
			type: "POST",
			url: self.serverConfig.fragmentServicePath,
			data: queryParams,
			cache: false,
			timeout: 120000,
			success: function(completeFragment){
				self.analyticsTracker._trackPageview('/ajax/'+action + '/Params?' + queryParams);
				var reducedFragment=jQuery("div:first",completeFragment).get(0);
				callback(reducedFragment);
			}
		});
	}
};


/* =====================  Academic Planner  ========================== */

function AcademicPlanner(serverConfig,academicPlannerService,allTerms){
	//logger.trace("AcademicPlanner(netId: "+netId+"...)");
	this.serverConfig=serverConfig;
	this.allTerms=allTerms;
	this.academicPlannerService=academicPlannerService;
	//this.planSelector=jQuery("#selectedPlan");
	this.planSelector=jQuery("#switchPlanMenu");
	this.container=jQuery("#academicPlanner");
	this.createNewPlanButton=jQuery("#createNewPlanButton");
	this.addSemesterButton=jQuery("#addSemester");
	this.expandAllButton=jQuery("#expandAllButton");
	this.collapseAllButton=jQuery("#collapseAllButton");
	this.deletePlanButton=jQuery("#deletePlanButton");
	this.sendToButton=jQuery("#sendToButton");
	this.setAsDefaultButton=jQuery("#setAsDefaultButton");
	this.renamePlanButton=jQuery("#renamePlanButton");
	this.addCreateNewPlanClickListener();
	this.addExpandAllClickListener();
	this.addCollapseAllClickListener();
	this.addDeletePlanClickListener();
	this.addSendPlanClickListener();
	this.addSetAsDefaultClickListener();
	this.addRenamePlanClickListener();
	this.refresh();
}
AcademicPlanner.prototype={
	serverConfig: null,
	allTerms: null,
	container: null,
	student: null,
	academicPlannerService: null,
	planSelector: null,
	planView:  null,
	createNewPlanButton: null,
	setAsDefaultButton: null,
	addSemesterButton: null,
	expandAllButton: null,
	collapseAllButton: null,
	deletePlanButton: null,
	sendToButton: null,
	renamePlanButton:null,
	refresh:function(){
		var self=this;	
		self.academicPlannerService.getStudent(self.serverConfig.netId,function(studentData){
			self.student = studentData;
			var selectedPlanId=self.getSelectedPlan().id;
			self.updatePlanSelector(selectedPlanId);			
			if(self.planView!==null && self.getPlanByPlanId(self.planView.plan.id)!==null){			
				self.planView.refresh();
			}else{
				self.planView = new PlanView(self.serverConfig,self,self.getSelectedPlan().id,self.academicPlannerService,self.allTerms);
				
				self.addSemesterClickListener();
			}
		});
	},
	refreshPlanSelector: function(){
		var self=this;	
		self.academicPlannerService.getStudent(self.serverConfig.netId,function(studentData){
			self.student = studentData;			
			self.updatePlanSelector(self.getSelectedPlan().id);
		});
	},
	updatePlanSelector: function(selectedPlanId){	
		var self=this;			
		/* Clear plan selection options */
		this.planSelector.html("");
		jQuery.each(self.student.planList,function(i,plan){	
			if(selectedPlanId != plan.id){
				self.planSelector.append('<li id="'+plan.id+'">'+encodeHtml(plan.name)+'</li>');
			}
		});
		self.addPlanSelectionListener();	
	},
	addPlanSelectionListener: function(){
		var self=this;
		self.planSelector.each(function(){
			jQuery("li",this).click(function(){
				var selectedPlanId=jQuery(this).attr("id");
				self.redirectToPlan(selectedPlanId);
			});	
		});
	},
	getPlanByPlanId: function(planId){
		var plan=null;
		jQuery.each(this.student.planList,function(i,planItem){
			if(planItem.id == planId){
				plan=planItem;
			}
		});
		return plan;
	},
	getSelectedPlan: function(){
		var self=this;		
		var selectedPlanId=jQuery.query.get("selectedPlanId");
		var selectedPlan=null;
		if(selectedPlanId != null){
			selectedPlan = self.getPlanByPlanId(selectedPlanId);
		}
		if(selectedPlan == null){
			selectedPlan = this.student.planList[0];
		}
		return selectedPlan;	
	},
	addCreateNewPlanClickListener: function (){
		var self=this;
		self.createNewPlanButton.click(function(){
			self.academicPlannerService.createNewPlan("Untitled Plan",function(plan){			
				self.redirectToPlan(plan.id);
			});
		});
	},
	addSetAsDefaultClickListener: function (){
		var self=this;
		self.setAsDefaultButton.click(function(){
			self.academicPlannerService.setDefaultPlan(self.planView.plan.id,function(){			
				/*self.redirectToPlan(plan.id);*/
			});
		});
	},
	addRenamePlanClickListener: function(){
		var self=this;
		self.renamePlanButton.click(function(){
			self.planView.createPlanNameField();
		});
	},
	addSemesterClickListener: function (){
		var self=this;
		self.planView.addPlannedTermSelector.change(function(){
			var termId=self.planView.addPlannedTermSelector.val();
			if(termId != NOT_SELECTED){
				self.academicPlannerService.addPlannedTerm(self.planView.plan.id,termId,function(empty){
					self.planView.refresh();
				});
			}
		});
	},
	addExpandAllClickListener: function (){
		var self=this;
		self.expandAllButton.click(function(){
			jQuery.each(self.planView.plannedTermViewList,function(i,plannedTermView){
				plannedTermView.expand();
			});
		});
	},
	addCollapseAllClickListener: function (){
		var self=this;
		self.collapseAllButton.click(function(){
			jQuery.each(self.planView.plannedTermViewList,function(i,plannedTermView){
				plannedTermView.collapse();
			});
		});
	},
	addDeletePlanClickListener: function (){
		var self=this;
		self.deletePlanButton.click(function(){
			var dialog=new DeleteDialog('Delete Plan','Are you sure you want to delete plan "'+encodeHtml(self.planView.plan.name)+'"?',function(){
				self.academicPlannerService.deletePlan(self.planView.plan.id,function(){
					self.refresh();
				});	
			});
		});
	},	
	addSendPlanClickListener: function (){
		var self=this;
		self.sendToButton.click(function(){
			jQuery("#dialogsContainer").html('<div id="dialog">Email: <input id="sendToEmailField"></input></div>');
			jQuery("#dialog").dialog({ 
			    modal: true, 
			    resizable: false,
			    draggable: false,
			    title: "Send To Email",
			    overlay: { 
			        opacity: 0.5, 
			        background: "black" 
			    },
			    buttons: { 
			        "OK": function() {
			        	var dialog=this;
			        	var emailAddress=jQuery("#sendToEmailField").val();
			        	
			        	self.academicPlannerService.sendToEmail(self.planView.plan.id,emailAddress,function(result){
			        		if(!result.emailSuccess){
			        			alert("Error: The message was not sent.");
			        		}
			        	});
			        	
			        	jQuery(dialog).dialog("close");
			        }, 
			        "Cancel": function() {
			            jQuery(this).dialog("close"); 
			        } 
			    } 
			});
		});
	},
	redirectToPlan: function(selectedPlanId){
		var self=this;
		window.location=self.serverConfig.showPagePath+"&selectedPlanId=" + selectedPlanId;
	}
};



/* =====================  Plan View  ========================== */

function PlanView(serverConfig,academicPlanner,planId,academicPlannerService,allTerms){
	this.serverConfig=serverConfig;
	this.academicPlanner=academicPlanner;
	this.allTerms=allTerms;
	this.planId=planId;
	this.academicPlannerService=academicPlannerService;
	this.planTotalsContainer=jQuery("#planTotalsContainer");
	this.plannedTermListContainer=jQuery("#plannedTermListContainer");
	this.addPlannedTermSelector=jQuery("#availableSemesters");
	this.planNameContainer=jQuery("#planNameContainer");
	this.planNameBreadCrumb=jQuery("#planNameBreadCrumb");
	this.refresh();
}
PlanView.prototype = {
	serverConfig: null,
	academicPlanner: null,
	allTerms: null,
	plannedTermListContainer: null,
	planNameContainer: null,
	planNameBreadCrumb: null,
	addPlannedTermSelector: null,
	planId: null,
	plan: null,
	academicPlannerService: null,
	planTotalsContainer:null,
	plannedTermViewList: null,
	refresh: function(){
		var self=this;	
		self.academicPlannerService.getPlan(self.planId,function(plan){
			self.plan=plan;
			self.createPlanNameTitle();
			self.plannedTermListContainer.html("");
			self.updateAddPlannedTermSelector();
			self.plannedTermViewList=new Array();
			jQuery.each(self.plan.plannedTermList,function(i,plannedTerm){
				var plannedTermView = new PlannedTermView(self.serverConfig,self,plannedTerm,self.academicPlannerService,self.plannedTermListContainer);
				self.plannedTermViewList[self.plannedTermViewList.length]=plannedTermView;				
			});
			self.updatePlanTotals();
		});
	},
	createPlanNameTitle: function(){
		var self=this;
		self.planNameContainer.html('<span id="planName" title="Click to change plan name">'+encodeHtml(self.plan.name)+'</span>');
		jQuery('#planName').click(function(){
			self.createPlanNameField();
		});
	},
	createPlanNameField: function(){
		var self=this;
		self.planNameContainer.html('<input id="planNameField" type="text" maxlength="50" value="'+encodeHtml(self.plan.name)+'"></input>');
		jQuery('#planNameField').blur(function(){
			self.plan.name = jQuery(this).val();
			self.academicPlannerService.updatePlan(self.plan, function(plan){
				self.plan=plan;
				self.createPlanNameTitle();
				self.planNameBreadCrumb.text(encodeHtml(self.plan.name));
				self.academicPlanner.refreshPlanSelector();
			});
		}).keypress(function(event){
			if (event.keyCode == 13){
            	jQuery(this).blur();
            }
		}).focus();
	},
	updatePlanTotals: function(){
		var self=this;
		var loadingContainer=new LoadingContainer(self.serverConfig,self.planTotalsContainer);
		self.academicPlannerService.getPlanTotals(self.plan.id,function(planTotalsFragment){
			self.planTotalsContainer.html(planTotalsFragment);
		});
	},
	updateAddPlannedTermSelector: function(){
		var filteredTerms=this.getTermsNotInPlan();
		if(filteredTerms.length !== 0){
			var firstOption = '<option value="'+NOT_SELECTED+'">Add a semester...</option>';
			var termOptionsArray = jQuery.map(filteredTerms,function(term,i){
				return '<option value="'+term.termId+'">'+term.year+' - '+term.semester.display+'</option>';
			});		
			this.addPlannedTermSelector.removeAttr("disabled");
			this.addPlannedTermSelector.html(firstOption+termOptionsArray.join(""));
		}else{
			this.addPlannedTermSelector.attr("disabled","disabled");
			this.addPlannedTermSelector.html('<option value='+NOT_SELECTED+'>No semesters available.</option>');
		}
	},
	getPlannedTermView: function(plannedTermId){
		var plannedTermView=null;
		jQuery.each(this.plannedTermViewList,function(i,plannedTermViewItem){
			if(plannedTermViewItem.plannedTerm.id == plannedTermId){
				plannedTermView=plannedTermViewItem;
			}
		});
		return plannedTermView;
	},
	getTermsNotInPlan: function(){
		var plannedTermList=this.plan.plannedTermList;
		var termIdsForPlan=jQuery.map(plannedTermList,function(plannedTerm,i){
			return plannedTerm.term.termId;
		});
		var filteredTermsArray=jQuery.grep(this.allTerms,function(term,i){
			return (jQuery.inArray(term.termId,termIdsForPlan) == -1);
		});
		return filteredTermsArray;
	}
};

/* =====================  Plan Term View  ========================== */

var NOT_SELECTED = "notSelected";
function PlannedTermView(serverConfig,planView,plannedTerm,academicPlannerService,plannedTermListContainer){
	var self=this;
	this.serverConfig=serverConfig;
	this.plannedTerm=plannedTerm;
	this.academicPlannerService=academicPlannerService;
	this.plannedTermListContainer=plannedTermListContainer;
	this.planView=planView;
	self.createContainer();
	this.academicPlannerService.findAllSubjects(plannedTerm.term.termId,function(allSubjects){
		self.allSubjects=allSubjects;
		var loadingContainer=new LoadingContainer(self.serverConfig,self.getContainer());
		self.updateContainer();
	});
}
PlannedTermView.prototype = {
	serverConfig: null,
	planView: null,
	allSubjects: null,
	expanderButton: null,
	plannedTermListContainer: null,
	plannedTerm: null,
	isExpanded: true,
	academicPlannerService: null,
	subjectCourseControl: null,
	createContainer:function(){
		var self=this;
		self.plannedTermListContainer.append('<div id="plannedTerm-'+self.plannedTerm.id+'"></div>');
	},
	refresh: function(){		
		var self=this;					
		self.updateContainer();
		self.planView.updatePlanTotals();
	},
	updateContainer: function(){
		var self=this;
		var selectedSubjectCode = self.getSubjectSelector().val();
		this.academicPlannerService.getPlannedTerm(this.plannedTerm.id,function(plannedTermFragment){					
			self.getContainer().replaceWith(plannedTermFragment);
			/* Update advanced term links */
			self.updateEditLink();
			self.addDeletePlannedTermClickListener();
			self.updateTermSubjectSelector(selectedSubjectCode);
			self.addDeletePlannedSectionListeners();
			
			self.expanderButton = new ExpanderButton(self.getExpandButton(),self.getTable());
			self.expanderButton.expand();
			/*self.addExpandButtonClickListener();
			self.expand();*/
		});
	},
	updateEditLink: function(){		
		var self=this;	
		jQuery("#advancedTermLink-"+self.plannedTerm.id).attr("href",self.serverConfig.showPagePath + "&action=advancedTermView&plannedTermId="+self.plannedTerm.id);	
	},
	updateTermSubjectSelector: function(selectedSubjectCode){			
		var self=this;
		var subjectCourseControl = new SubjectCourseControl(
			self.academicPlannerService,
			self.getSubjectSelector(), 
			self.getCourseSelector(), 
			self.allSubjects,
			self.plannedTerm.term.termId,
			selectedSubjectCode,
			"Select a Subject...",
			"Select a Course...");
		
		self.getCourseSelector().change(function(){
			var courseKeyString=jQuery(this).val();
			var course=getCourseFromKeyString(courseKeyString);
			enableLoadingBar(true);
			self.academicPlannerService.addCourseToPlannedTerm(self.plannedTerm.id,course.subject.code,course.courseNumber,function(plannedTermFragment){
				self.refresh(); 
				enableLoadingBar(false);
			});
		});
	},
	addDeletePlannedTermClickListener: function(){
		var self=this;				
		self.getDeleteButton().click(function(){
			var dialog=new DeleteDialog('Delete Semester','Are you sure you want to delete semester "'+self.plannedTerm.term.display+'"?',function(){
				self.academicPlannerService.deletePlannedTerm(self.plannedTerm.id,function(){
					self.planView.refresh();
				});	
			});
		});
	},	
	expand: function(){
		this.expanderButton.expand();
	},	
	collapse: function(){
		this.expanderButton.collapse()
	},
	addDeletePlannedSectionListeners: function(plannedSectionId){
		var self=this;
		jQuery('#plannedTerm-'+self.plannedTerm.id+' .plannedSection').each(function(){
			var plannedSectionId=jQuery(this).attr('id').split('-')[1];
			jQuery(".delete",this).click(function(){
				enableLoadingBar(true);
				self.academicPlannerService.deletePlannedSection(plannedSectionId,self.plannedTerm.id,function(empty){
					self.refresh();
					enableLoadingBar(false);
				});
			});
		});
	},
	getContainer: function(){
		return jQuery('#plannedTerm-'+this.plannedTerm.id);
	},
	getTable: function(){
		return jQuery('#plannedTerm-'+this.plannedTerm.id + ' .table');
	},
	getSubjectSelector: function(){
		return jQuery('#plannedTerm-'+this.plannedTerm.id + ' .subjectSelector');
	},
	getCourseSelector: function (){
		return jQuery('#plannedTerm-'+this.plannedTerm.id + ' .courseSelector');
	},
	getExpandButton: function(){
		return jQuery('#plannedTerm-'+this.plannedTerm.id + ' .expanderButton');
	},
	getDeleteButton: function(){
		return jQuery('#plannedTerm-'+this.plannedTerm.id + ' .deletePlannedTermButton');
	}
};


// ======================= Subject Course Control ==============

function SubjectCourseControl(academicPlannerService,subjectSelector,courseSelector,allSubjects,termId,selectedSubjectCode,subjectMessage,courseMessage,selectedCourseKey){
	this.academicPlannerService=academicPlannerService;
	this.subjectSelector=subjectSelector;
	this.courseSelector=courseSelector;
	this.allSubjects=allSubjects;
	this.termId=termId;
	this.subjectMessage=subjectMessage;
	this.courseMessage=courseMessage;
	if(selectedCourseKey != null){
		//NOTE: This assumes subjects have already been populated, used by search page
		this.updateCourseSelector(selectedSubjectCode,selectedCourseKey,function(){});
	}else{
		this.updateSubjectSelector(selectedSubjectCode,function(){});	
	}
	this.addSubjectChangeListener();
}
SubjectCourseControl.prototype={
	academicPlannerService: null,
	subjectSelector: null,
	courseSelector: null,
	allSubjects: null,
	termId: null,
	subjectMessage: null,
	courseMessage: null,
	updateSubjectSelector: function(selectedSubjectCode,callback){
		var self=this;
		var subjectOptionsArray=jQuery.map(self.allSubjects,function(subject,i){
			var selected="";
			if(selectedSubjectCode == subject.code){
				selected = 'selected="selected"';
			}
			return '<option value="'+subject.code+'" '+selected+'>'+subject.displayCode+' - '+subject.displayName+'</option>';
		});
		var subjectOptions = '<option value="'+NOT_SELECTED+'">'+self.subjectMessage+'</option>'+subjectOptionsArray.join("");
		self.subjectSelector.html(subjectOptions);
		self.updateCourseSelector(self.subjectSelector.val(),"",callback);
	},
	updateCourseSelector: function(selectedSubjectCode,selectedCourseKeyString,callback){
		var self=this;
		if(selectedSubjectCode == NOT_SELECTED){
			self.disableCourseSelector();
		}else{
			self.academicPlannerService.findCoursesBySubject(self.termId,selectedSubjectCode,function(courseList){	
				var courseOptionsArray=jQuery.map(courseList,function(course,i){
					var selected="";
					if(selectedCourseKeyString == getCourseKeyString(course)){
						selected = 'selected="selected"';
					}	
					return '<option value="'+getCourseKeyString(course)+'" '+selected+'>'+course.subject.displayCode+' '+course.courseNumber+' - '+course.name+'</option>';
				});
				var courseOptions = '<option value="'+NOT_SELECTED+'">'+self.courseMessage+'</option>'+courseOptionsArray.join("");
				self.courseSelector.html(courseOptions);
				self.courseSelector.removeAttr("disabled");
				callback();
			});
		}
	},
	disableCourseSelector: function(){
		var self=this;
		var courseOptions = '<option value="'+NOT_SELECTED+'">'+self.courseMessage+'</option>';
		self.courseSelector.html(courseOptions);
		self.courseSelector.attr("disabled","disabled");
	},
	addSubjectChangeListener: function(){
		var self=this;
		self.subjectSelector.change(function(){
			var subjectCode=self.subjectSelector.val();
			self.updateCourseSelector(subjectCode,"",function(){});	
		});
	}
};

function ArrayRangeSelectBox(arrayData,minIndexRange, valueGetter, displayGetter, fromSelectQuery, toSelectQuery){
	this.arrayData=arrayData;
	this.minIndexRange=minIndexRange;
	this.valueGetter=valueGetter;
	this.displayGetter=displayGetter;
	this.fromSelectQuery=fromSelectQuery;
	this.toSelectQuery=toSelectQuery;
	this.init();
}
ArrayRangeSelectBox.prototype={
	arrayData: null,
	minIndexRange: null,
	valueGetter: null,
	displayGetter: null,
	fromSelectQuery: null,
	toSelectQuery: null,
	init: function(){	
		logger.trace("ArrayRangeSelectBox.init()");
		var self=this;		
		self.fromSelectQuery.html(self.createOptionRange(0,self.arrayData.length - self.minIndexRange));
		var initialToValue=self.valueGetter(self.arrayData[self.arrayData.length-1]);
		self.updateSelectTo(0,initialToValue);
		
		self.fromSelectQuery.change(function(){
			logger.trace("ArrayRangeSelectBox.fromSelectQuery.change()");
			var index=self.getIndexForValue(jQuery(this).val());
			var toSelectedValue=self.toSelectQuery.val();
			self.updateSelectTo(index, toSelectedValue);
		});
	},
	updateSelectTo: function(fromSelectedIndex,toSelectedValue){
		var self=this;
		self.toSelectQuery.html(self.createOptionRange(fromSelectedIndex + self.minIndexRange, self.arrayData.length, toSelectedValue));			
	},
	createOptionRange: function(fromIndex,toIndex,toSelectedValue){
		var self=this;
		var options="";
		for(var i=fromIndex; i<toIndex; i=i+1){
			options=options + self.createOption(i,toSelectedValue);
		}
		return options;
	},
	createOption: function(index,toSelectedValue){
		var optionValue=this.valueGetter(this.arrayData[index]);
		var optionDisplay=this.displayGetter(this.arrayData[index]);				
		var selectedAttr='';
		if(optionValue == toSelectedValue){
			selectedAttr='selected="selected"';
		}	
		return '<option value="'+optionValue+'" '+selectedAttr+'>'+optionDisplay+'</option>';
	},
	getIndexForValue:function(value){
		var self=this;
		var index=null;
		jQuery.each(self.arrayData,function(i,arrayItem){
			var arrayItemValue=self.valueGetter(arrayItem);
			if(arrayItemValue==value){
				index=i;
			}
		});
		return index;
	}
};



// ================================================================= 
//                       Advanced View                               
// =================================================================
function AdvancedAcademicPlanner(serverConfig,termId,academicPlannerService,plannedTermId,searchFormOptionsJson){
	logger.trace("AdvancedAcademicPlanner(plannedTermId: "+plannedTermId+" ...)");
	var self=this;
	this.serverConfig=serverConfig;
	this.academicPlannerService=academicPlannerService;
	this.plannedTermId=plannedTermId;
	this.searchFormOptionsJson=searchFormOptionsJson;
	this.advancedPlannedTermView = new AdvancedPlannedTermView(serverConfig,this,academicPlannerService,plannedTermId);
	this.advancedSearchView = new AdvancedSearchView(self.serverConfig,termId,academicPlannerService,plannedTermId,this.searchFormOptionsJson,
		function(){
			self.refresh();
		});
	this.advancedSearchView.resetForm();
}
AdvancedAcademicPlanner.prototype = {
	serverConfig: null,
	academicPlannerService: null,
	plannedTermId: null,
	searchFormOptionsJson: null,
	advancedPlannedTermView: null,
	advancedSearchView: null,
	refresh: function(){
		var self=this;
		self.advancedPlannedTermView.refresh();
	}
};


// ======================= Advanced Planned Term View ==============
function AdvancedPlannedTermView(serverConfig,advancedAcademicPlanner,academicPlannerService,plannedTermId){
	this.serverConfig=serverConfig;
	this.advancedAcademicPlanner=advancedAcademicPlanner;
	this.academicPlannerService=academicPlannerService;
	this.plannedTermId=plannedTermId;
	this.refresh();
}
AdvancedPlannedTermView.prototype = {
	serverConfig: null,
	advancedAcademicPlanner: null,
	academicPlannerService: null,
	plannedTermId: null,
	searchResultExpanderArray: null,
	refresh: function(){
		var self=this;
		var loadingContainer=new LoadingContainer(self.serverConfig,self.getPlannedTermContainer());
		self.academicPlannerService.getAdvancedPlannedTerm(self.plannedTermId,function(advancedPlannedTermFragment){
			self.getPlannedTermContainer().html(advancedPlannedTermFragment);
			self.addDeletePlannedSectionListeners();
			self.createSearchResultExpanders();
			self.addExpandAllClickListener();
			self.addCollapseAllClickListener();
			self.addViewScheduleLink();
			self.addBackToPlanLink();
			self.addSearchForSectionClickListeners();
			self.addSearchForCrnClickListeners();
		});
		var loadingContainer1=new LoadingContainer(self.serverConfig,self.getMiniScheduleContainer());
		self.academicPlannerService.getPlannedTermSchedule(self.plannedTermId,function(miniSchedule){
			self.getMiniScheduleContainer().html(miniSchedule);
		});
		self.academicPlannerService.getAdvancedTermWarnings(self.plannedTermId,function(warningsFragment){
			self.getAdvancedTermWarningsContainer().html(warningsFragment);
		});
	},
	addDeletePlannedSectionListeners: function(){
		var self=this;
		jQuery('#advancedPlannedTermContainer .plannedSection').each(function(){
			var plannedSectionId=jQuery(this).attr('id').split('-')[1];
			jQuery(".deleteButton",this).click(function(){
				enableLoadingBar(true);
				self.academicPlannerService.deletePlannedSection(plannedSectionId,self.plannedTermId,function(empty){
					self.refresh();
					enableLoadingBar(false);
				});
			});
		});
	},
	addBackToPlanLink: function(){
		var self=this;
		jQuery(".backToPlan").each(function(){
			var planId=jQuery(this).attr('id').split('-')[1];
			jQuery(this).attr("href",self.serverConfig.showPagePath+"&selectedPlanId="+planId);
		});
	},
	addViewScheduleLink: function(){
		var self=this;
		jQuery("#printPlannedTermButton a").attr("href",self.serverConfig.showPagePath+"&action=printScheduleView&plannedTermId="+self.plannedTermId);
	},
	createSearchResultExpanders: function(){
		var self=this;
		self.searchResultExpanderArray=new Array();
		jQuery("#advancedPlannedTermContainer .tableRow").each(function(){
			var expanderButton = new ExpanderButton(jQuery(".expanderButton",this),	jQuery(".rowDetails",this));
			self.searchResultExpanderArray[self.searchResultExpanderArray.length] = expanderButton;
		});
	},
	addExpandAllClickListener: function (){
		var self=this;
		self.getExpandAllButton().click(function(){
			jQuery.each(self.searchResultExpanderArray,function(i,searchResultExpander){
				searchResultExpander.expand();
			});
		});
	},
	addCollapseAllClickListener: function (){
		var self=this;
		self.getCollapseAllButton().click(function(){
			jQuery.each(self.searchResultExpanderArray,function(i,searchResultExpander){
				searchResultExpander.collapse();
			});
		});
	},
	addSearchForSectionClickListeners: function(){
		var self=this;
		jQuery(".searchForSectionButton").click(function(){
			var courseKey=jQuery(this).attr('id');
			var subjectCode=courseKey.split('_')[1];
			
			self.advancedAcademicPlanner.advancedSearchView.resetForm();
			var subjectCourseControl=self.advancedAcademicPlanner.advancedSearchView.subjectCourseControl;
			subjectCourseControl.updateSubjectSelector(subjectCode,function(){
				subjectCourseControl.updateCourseSelector(subjectCode,courseKey,function(){
					self.advancedAcademicPlanner.advancedSearchView.performSearch();
				});
			});
		});
	},
	addSearchForCrnClickListeners: function(){
		var self=this;
		jQuery(".searchForCrnButton").click(function(){
			var crn=jQuery(this).attr("id");			
			self.advancedAcademicPlanner.advancedSearchView.resetForm();
			self.advancedAcademicPlanner.advancedSearchView.getCrnField().val(crn);
			self.advancedAcademicPlanner.advancedSearchView.performSearch();
			self.advancedAcademicPlanner.advancedSearchView.getCrnField().val("");
		});
	},
	/*getPlannedSections: function(){jQuery('#advancedPlannedTermContainer .plannedSection');},*/
	getMiniScheduleContainer: function(){return jQuery("#miniScheduleContainer");},
	getAdvancedTermWarningsContainer: function(){return jQuery("#advancedTermWarningsContainer");},
	getExpandAllButton: function(){return jQuery("#advancedPlannedTermContainer .expandAllButton");},
	getCollapseAllButton: function(){return jQuery("#advancedPlannedTermContainer .collapseAllButton");},
	getPlannedTermContainer: function(){return jQuery("#advancedPlannedTermContainer");}
};

// ======================= Advanced Search View ====================
function AdvancedSearchView(serverConfig,termId,academicPlannerService,plannedTermId,searchFormOptionsJson,refresh){
	//logger.trace("AdvancedSearchView(...)");
	this.serverConfig=serverConfig;
	this.termId=termId;
	this.academicPlannerService=academicPlannerService;
	this.plannedTermId=plannedTermId;
	this.searchFormOptionsJson=searchFormOptionsJson;
	
	this.addAdvancedSearchExpanderClickListener();
	this.addSubmitClickListener();
	this.addResetClickListener();
	this.refresh=refresh;
}
AdvancedSearchView.prototype = {
	serverConfig: null,
	academicPlannerService: null,
	termId: null,
	plannedTermId: null,
	searchFormOptionsJson: null,
	refresh: null,
	searchResultExpanderArray: null,
	subjectCourseControl: null,
	searchData: null,
	addAdvancedSearchExpanderClickListener: function(){
		var expanderButton = new ExpanderButton(
			jQuery("#advancedSearchExpander"),	
			jQuery("#advancedSearchFields"));
	},
	resetForm: function(){		
		var self=this;
		self.createSubjectCourseControl();
		self.updateRangeOfHoursControl();
		self.updateRangeOfCreditsControl();
		self.updatePerspectiveControl();
		self.updateCollegesControl();
		self.updateDegreeLevelControl();
		self.updateOnlineCourseControl();
		self.updateClassSizeControl();
		
		self.getCourseTitleField().val("");
		self.getDaysOfWeekMField().attr("checked","checked");
		self.getDaysOfWeekTField().attr("checked","checked");
		self.getDaysOfWeekWField().attr("checked","checked");
		self.getDaysOfWeekHField().attr("checked","checked");
		self.getDaysOfWeekFField().attr("checked","checked");
		self.getDaysOfWeekSField().attr("checked","checked");
		self.getDaysOfWeekUField().attr("checked","checked");
		
		self.getFullCoursesField().attr("checked","checked");		
		self.getCrnField().val("");
		self.getInstructorField().val("");
		
		/*self.getClassSizeField().val();
		self.getOnlineCourseField().val();
		self.getDegreeLevelField().val();
		self.getCollegeField().val();*/
	
	},
	updateRangeOfHoursControl: function(){
		logger.trace("AdvancedSearchView.updateRangeOfHoursControl()");
		var self=this;
		new ArrayRangeSelectBox(
				self.searchFormOptionsJson.hourRangeOptions,
				1,
				function(indexedValue){ return indexedValue.index; },
				function(indexedValue){ return indexedValue.value; },
				self.getRangeOfHoursFromField(),
				self.getRangeOfHoursToField()); 
	},
	updateCodedValueControl: function(codedValueList,fieldQuery,unselectedText){
		var self=this;		
		var optionHtml='<option value="'+NOT_SELECTED+'" selected="selected">'+unselectedText+'</option>';
		jQuery.each(codedValueList,function(i,codedValue){
			optionHtml += '<option value="'+codedValue.code+'">'+codedValue.name+'</option>';
		});
		fieldQuery.html(optionHtml);
	},
	updatePerspectiveControl: function(){
		var self=this;
		self.updateCodedValueControl(self.searchFormOptionsJson.courseAttributeList,
				self.getPersepectiveField(),'');
	},
	updateCollegesControl: function(){
		var self=this;		
		self.updateCodedValueControl(self.searchFormOptionsJson.collegeList,
				self.getCollegeField(),'');
	},
	updateDegreeLevelControl: function(){
		var self=this;	
		self.updateCodedValueControl(self.searchFormOptionsJson.degreeLevelList,
				self.getDegreeLevelField(),'');	
	},	
	updateClassSizeControl: function(){
		var self=this;	
		self.updateCodedValueControl(self.searchFormOptionsJson.classSizeList,
				self.getClassSizeField(),'');	
	},
	updateOnlineCourseControl: function(){
		var self=this;	
		self.updateCodedValueControl(self.searchFormOptionsJson.bannerSessionList,
				self.getOnlineCourseField(),'');	
	},
	updateRangeOfCreditsControl: function(){
		logger.trace("AdvancedSearchView.updateRangeOfCreditsControl()");
		var self=this;
		new ArrayRangeSelectBox(
				self.searchFormOptionsJson.creditRangeOptions,
				0,
				function(indexedValue){ return indexedValue.index; },
				function(indexedValue){ return indexedValue.value; },
				self.getRangeOfCreditsFromField(),
				self.getRangeOfCreditsToField()); 
	},
	createSubjectCourseControl: function(){
		var self=this;
		self.subjectCourseControl = new SubjectCourseControl(
			self.academicPlannerService,
			self.getSubjectField(), 
			self.getCourseField(), 
			self.searchFormOptionsJson.subjectList,
			self.termId,
			"",
			"&nbsp",
			"&nbsp");
	},
	addSubmitClickListener: function(){
		var self=this;
		self.getSubmitButton().click(function(){
			self.performSearch();
		});
	},
	addResetClickListener: function(){
		var self=this;
		self.getResetButton().click(function(){
			self.resetForm();
		});
	},
	addPageChangeListeners: function(){
		var self=this;
		self.getPreviousPageButton().click(function(){
			self.searchData.page=self.searchData.page-1;
			self.performSearchRequest();
		});		
		self.getNextPageButton().click(function(){			
			self.searchData.page=self.searchData.page+1;
			self.performSearchRequest();
		});
	},
	performSearch: function(){
		var self=this;
		var loadingContainer=new LoadingContainer(self.serverConfig,self.getSearchResultsContainer());
		self.searchData=new SearchData(
			1,
			self.termId,
			self.getSubjectField().val(),
			self.getCourseField().val(),
			self.getCourseTitleField().val(),
			self.getFullCoursesField().attr("checked"),
			self.getRangeOfHoursFromField().val(),
			self.getRangeOfHoursToField().val(),
			self.getCrnField().val(),
			self.getInstructorField().val(),
			self.getClassSizeField().val(),
			self.getOnlineCourseField().val(),
			self.getPersepectiveField().val(),
			self.getDegreeLevelField().val(),
			self.getRangeOfCreditsFromField().val(),
			self.getRangeOfCreditsToField().val(),
			self.getCollegeField().val(),
			self.getDaysOfWeekMField().attr("checked"),
			self.getDaysOfWeekTField().attr("checked"),
			self.getDaysOfWeekWField().attr("checked"),
			self.getDaysOfWeekHField().attr("checked"),
			self.getDaysOfWeekFField().attr("checked"),
			self.getDaysOfWeekSField().attr("checked"),
			self.getDaysOfWeekUField().attr("checked"));
		self.performSearchRequest();
	},
	performSearchRequest: function(){
		var self=this;
		self.academicPlannerService.findSectionsAdvanced(self.searchData,
			function(searchResultsFragment){
				self.getSearchResultsContainer().html(searchResultsFragment);
				self.addSearchResultClickListeners();
				self.createSearchResultExpanders();
				self.addExpandAllClickListener();
				self.addCollapseAllClickListener();
				self.addPageChangeListeners();
		});
	},
	addSearchResultClickListeners: function(){
		var self=this;
		jQuery(".searchResultItem").click(function(){
			var sectionKey=jQuery(this).attr("id");
			enableLoadingBar(true);
			self.academicPlannerService.addSectionToPlannedTerm(self.plannedTermId,sectionKey,function(empty){
				self.refresh();
				enableLoadingBar(false);
			});
		});
	},
	createSearchResultExpanders: function(){
		var self=this;
		self.searchResultExpanderArray=new Array();
		jQuery("#searchResultsContainer .tableRow").each(function(){
			var expanderButton = new ExpanderButton(jQuery(".expanderButton",this),	jQuery(".rowDetails",this));
			self.searchResultExpanderArray[self.searchResultExpanderArray.length] = expanderButton;
		});
	},
	addExpandAllClickListener: function (){
		var self=this;
		self.getExpandAllButton().click(function(){
			jQuery.each(self.searchResultExpanderArray,function(i,searchResultExpander){
				searchResultExpander.expand();
			});
		});
	},
	addCollapseAllClickListener: function (){
		var self=this;
		self.getCollapseAllButton().click(function(){
			jQuery.each(self.searchResultExpanderArray,function(i,searchResultExpander){
				searchResultExpander.collapse();
			});
		});
	},
	
	
	
	getExpandAllButton: function(){return jQuery("#searchResultsContainer .expandAllButton");},
	getCollapseAllButton: function(){return jQuery("#searchResultsContainer .collapseAllButton");},
	
	getSearchResultsContainer: function(){return jQuery("#searchResultsContainer");},
	
	getSubjectField: function(){ return jQuery("#subjectField");},
	getCourseField: function(){ return jQuery("#courseField");},
	getCourseTitleField: function(){ return jQuery("#courseTitleField");},
	getFullCoursesField: function(){ return jQuery("#fullCoursesField");},
	getRangeOfHoursFromField: function(){ return jQuery("#rangeOfHoursFromField");},
	getRangeOfHoursToField: function(){ return jQuery("#rangeOfHoursToField");},	
	getCrnField: function(){ return jQuery("#crnField");},
	getInstructorField: function(){ return jQuery("#instructorField");},
	getClassSizeField: function(){ return jQuery("#classSizeField");},
	getOnlineCourseField: function(){ return jQuery("#onlineCourseField");},
	getPersepectiveField: function(){ return jQuery("#persepectiveField");},
	getDegreeLevelField: function(){ return jQuery("#degreeLevelField");},
	getRangeOfCreditsFromField: function(){ return jQuery("#rangeOfCreditsFromField");},
	getRangeOfCreditsToField: function(){ return jQuery("#rangeOfCreditsToField");},
	getCollegeField: function(){ return jQuery("#collegeField");},
	getSubmitButton: function(){ return jQuery("#submitButton");},
	getResetButton: function(){ return jQuery("#resetButton");},
	getPreviousPageButton: function(){ return jQuery("#prevPageButton");},
	getNextPageButton: function(){ return jQuery("#nextPageButton");},
		
	getDaysOfWeekMField: function(){ return jQuery("#daysOfWeekMField");},
	getDaysOfWeekTField: function(){ return jQuery("#daysOfWeekTField");},
	getDaysOfWeekWField: function(){ return jQuery("#daysOfWeekWField");},
	getDaysOfWeekHField: function(){ return jQuery("#daysOfWeekHField");},
	getDaysOfWeekFField: function(){ return jQuery("#daysOfWeekFField");},
	getDaysOfWeekSField: function(){ return jQuery("#daysOfWeekSField");},
	getDaysOfWeekUField: function(){ return jQuery("#daysOfWeekUField");}
	
};

function SearchData(page,termId, subjectCode, courseNumber, courseTitle,
		showFullCourses, rangeOfHoursFrom, rangeOfHoursTo, crn, instructor, classSize,
		onlineCourse, perspective, degreeLevel, rangeOfCreditsFrom, rangeOfCreditsTo,collegeField, 
		daysOfWeekM,daysOfWeekT,daysOfWeekW,daysOfWeekH,daysOfWeekF,daysOfWeekS,daysOfWeekU){
	this.page=page;
	this.termId=termId;
	this.subjectCode=subjectCode;
	this.courseNumber=courseNumber;
	this.courseTitle=courseTitle;

	this.showFullCourses=showFullCourses;
	this.rangeOfHoursFrom=rangeOfHoursFrom;
	this.rangeOfHoursTo=rangeOfHoursTo;
	this.crn=crn;
	this.instructor=instructor;
	this.classSize=classSize;

	this.onlineCourse=onlineCourse;
	this.perspective=perspective;
	this.degreeLevel=degreeLevel;
	this.rangeOfCreditsFrom=rangeOfCreditsFrom;
	this.rangeOfCreditsTo=rangeOfCreditsTo;
	this.collegeField=collegeField;
	 
	this.daysOfWeekM=daysOfWeekM;
	this.daysOfWeekT=daysOfWeekT;
	this.daysOfWeekW=daysOfWeekW;
	this.daysOfWeekH=daysOfWeekH;
	this.daysOfWeekF=daysOfWeekF;
	this.daysOfWeekS=daysOfWeekS;
	this.daysOfWeekU=daysOfWeekU;
}

SearchData.prototype={
	page:null,
	termId:null,
	subjectCode:null,
	courseNumber:null,
	courseTitle:null,

	showFullCourses:null,
	rangeOfHoursFrom:null,
	rangeOfHoursTo:null,
	crn:null,
	instructor:null,
	classSize:null,

	onlineCourse:null,
	perspective:null,
	degreeLevel:null,
	rangeOfCreditsFrom:null,
	rangeOfCreditsTo:null,
	collegeField:null,
	 
	daysOfWeekM:null,
	daysOfWeekT:null,
	daysOfWeekW:null,
	daysOfWeekH:null,
	daysOfWeekF:null,
	daysOfWeekS:null,
	daysOfWeekU:null
}

function PlanListView(academicPlannerService){
	this.academicPlannerService=academicPlannerService;
	this.serverConfig=academicPlannerService.serverConfig;
	this.createNewPlanButton=jQuery("#createNewPlanButton");
	this.planListContainer=jQuery("#planListContainer");
	this.addCreateNewPlanClickListener();	
	this.refresh();
}
PlanListView.prototype = {
	academicPlannerService: null,
	createNewPlanButton: null,
	planListContainer: null,
	serverConfig: null,
	refresh: function(){
		var self=this;
		self.academicPlannerService.getPlanList(function(fragment){
			self.planListContainer.html(fragment);
			self.addDeletePlanClickListeners();
		});
	},
	addDeletePlanClickListeners: function(){
		var self=this;
		jQuery('.plan').each(function(){
			var planId=jQuery(this).attr('id').split('-')[1];	
			var planName=jQuery(".planNameLink",this).text();
			jQuery(".delete",this).click(function(){		
				jQuery("#dialog").html('<div>Are sure you want to delete plan "'+planName+'"</div>');
				jQuery("#dialog").dialog({ 
				    modal: true, 
				    resizable: false,
				    draggable: false,
				    title: "Delete Plan",
				    overlay: { 
				        opacity: 0.5, 
				        background: "black" 
				    },
				    buttons: { 
				        "Yes": function() {
				        	var dialog=this;
				        	jQuery(dialog).dialog("close");
							enableLoadingBar(true);
							self.academicPlannerService.deletePlan(planId,function(empty){
								self.refresh();
								enableLoadingBar(false);
							});
				        }, 
				        "No": function() {
				            jQuery(this).dialog("close"); 
				        } 
				    } 
				});
			});
		});
	},
	addCreateNewPlanClickListener: function(){
		var self = this;
		self.createNewPlanButton.click(function(){
			jQuery("#dialog").html('<label>Plan Name</label><input id="planNameControl" type="text" value="Untitled Plan" maxlength="50"></input>')
			jQuery("#dialog").dialog({ 
			    modal: true, 
			    resizable: false,
			    draggable: false,
			    title: "Create New Plan",
			    overlay: { 
			        opacity: 0.5, 
			        background: "black" 
			    },
			    buttons: { 
			        "Ok": function() {
			        	var dialog=this;
			        	jQuery(dialog).dialog("close");
			        	var newPlanName=jQuery("#planNameControl").val();
						self.academicPlannerService.createNewPlan(newPlanName,function(plan){			
							self.refresh();
						});
			        }, 
			        "Cancel": function() {
			            jQuery(this).dialog("close"); 
			        } 
			    } 
			});			
		});
	}
}

function CommentView(academicPlannerService,serverConfig){
	this.academicPlannerService=academicPlannerService;
	this.serverConfig=serverConfig;
	this.commentSendButton=jQuery("#sendCommentButton");
	this.commentField=jQuery("#commentsControl");
	this.commentMessage=jQuery("#commentMessage");
	
	this.commentSendButton.attr("disabled","true");
	this.addCommentSendClickListener();
	this.addKeyPressListener();
	
}
CommentView.prototype={
	academicPlannerService: null,
	serverConfig: null,
	commentSendButton: null,
	commentField: null,
	commentMessage: null,
	addKeyPressListener: function(){
		var self=this;
		self.commentField.keypress(function(e){			
			self.commentSendButton.attr("disabled", self.commentField.val() == "" );
		});
	},
	addCommentSendClickListener: function(){
		var self=this;
		self.commentSendButton.click(function(){
			var browser="";
			if(jQuery.browser.mozilla){
				browser="mozilla";
			}
			if(jQuery.browser.msie){
				browser="msie";
			}
			if(jQuery.browser.opera){
				browser="opera";
			}
			if(jQuery.browser.safari){
				browser="safari";
			}
			browser=browser+" "+ jQuery.browser.version;
			self.academicPlannerService.addComment(self.commentField.val(),window.location , browser,function(){
				self.commentField.val("");
				self.commentSendButton.attr("disabled","true");
				self.commentMessage.text("Your comment has been received. Thank you.")
			});
		});
	}	
}











