function getSubjectPreferenceChangerString(cid){
	var changerString="<select id=\""+subjectPreferenceChangerId+cid+"\" class=\"subjectPreferenceChanger\"><option value=\"0.0\"></option><option value=\"9.0\">肯定要选</option><option value=\"7.0\">十分想选</option><option value=\"5.0\">比较想选</option><option value=\"3.0\">一般般</option><option value=\"1.0\">这个可以不选</option></select>";
	
	return changerString;
}

function getCoursePreferenceChangerString(cid){
	var changerString="<select id=\""+coursePreferenceChangerId+cid+"\" class=\"coursePreferenceChanger\"><option value=\"0.0\"></option><option value=\"9.0\">肯定要选</option><option value=\"7.0\">十分想选</option><option value=\"5.0\">比较想选</option><option value=\"3.0\">一般般</option><option value=\"1.0\">这个可以不选</option></select>";
	
	return changerString;
}

function showCurric(json){
	
	clearCourseTimeTable();
	$("#curricResult").html("您未选择课程");
	
	clearEnroll();
	
	var include=json.include;
	if(include!=""){
		
		var currics=include.split(itemSplit);
		var sortSid=new Array();
		
		for(index in currics){
			var curric=currics[index];
			
			var values=curric.split(valueSplit);
			
			var sid=parseInt(values[0]);
			var cid=parseInt(values[1]);
			
			sortSid[getSubject(sid)["id"]]=cid;
		}
		
		sortSid=sortArrayByKey(sortSid);
		
		var credit=0.0;
		
		var curricResult="<table id=\"resultList\" class=\"tight\">";
		curricResult+="<tr><th width=\"27px\">代号</th>";
		curricResult+="<th width=\"55px\">课程编号</th>";
		curricResult+="<th width=\"100px\">课程名称</th>";
		curricResult+="<th width=\"27px\">学分</th>";
		curricResult+="<th width=\"55px\">教师编号</th>";
		curricResult+="<th width=\"70px\">教师姓名</th>";
		curricResult+="<th width=\"60px\">教师偏好</th>";
		curricResult+="<th width=\"60px\">课程偏好</th></tr>";
		
		var charIndex=0;
		for(index in sortSid){
			
			var cid=sortSid[index];
			
			var course=getCourse(cid);
			
			var subject=getSubject(course.sid);
			
			var char=curricIndexChar[charIndex];
			
			addEnroll(course);
			
			credit+=subject.credit;
			
			curricResult+="<tr id=\""+resultListId+cid+"\">";
			
			curricResult+="<td>"+char+"</td>";
			curricResult+="<td>"+subject.id+"</td>";
			curricResult+="<td>"+subject.name+"</td>";
			curricResult+="<td>"+subject.credit+"</td>";
			curricResult+="<td>"+course.id+"</td>";
			curricResult+="<td>"+course.name+"</td>";
			curricResult+="<td>"+getCoursePreferenceChangerString(cid)+"</td>";
			curricResult+="<td>"+getSubjectPreferenceChangerString(cid)+"</td>";
			
			curricResult+="</tr>";
			
			var times=course["times"];

			for(grid in times){
				
				var cell=$("#"+timeTableId+grid);
				
				var content=cell.attr("value");
				
				if(content!=""){
					content+=itemSplit;
				}
				
				content+=char;
				
				cell.attr("value",content);
			}
			
			charIndex++;
			
		}
		
		curricResult+="<tr><td colspan=\"8\" style=\"\">已选学分: <b>"+credit+"</b></td></tr>";
		
		var exclude=json.exclude;
		if(exclude!=""){
			var excludeCid=new Array();
			
			var excludes=exclude.split(itemSplit);
			
			for(index in excludes){
				var cid=parseInt(excludes[index]);
				var course=getCourse(cid);
				var subject=getSubject(course.sid);
				excludeCid[subject.id+""+course.id]=cid;
			}
			
			excludeCid=sortArrayByKey(excludeCid);
			
			curricResult+="<tr><td colspan=\"8\" style=\"color: #FF0000; text-align: center\">冲突课程</td></tr>";
			
			for(index in excludeCid){
				var cid=excludeCid[index];
				var course=getCourse(cid);
				var subject=getSubject(course.sid);
				
				curricResult+="<tr id=\""+resultListId+cid+"\">";
			
				curricResult+="<td>"+""+"</td>";
				curricResult+="<td>"+subject.id+"</td>";
				curricResult+="<td>"+subject.name+"</td>";
				curricResult+="<td>"+subject.credit+"</td>";
				curricResult+="<td>"+course.id+"</td>";
				curricResult+="<td>"+course.name+"</td>";
				curricResult+="<td>"+getCoursePreferenceChangerString(cid)+"</td>";
				curricResult+="<td>"+getSubjectPreferenceChangerString(cid)+"</td>";
				
				curricResult+="</tr>";
			}
		}
		
		
		curricResult+="</table>";
		
		$("#curricResult").html(curricResult);
		
		readyCurricResultAction();
		
		if($treeListTabSelectedIndex!="includedListTab"){
			$("#treeListPanel").idTabs("includedList");
		}
		
		$("#infoPanel").idTabs("curricResult");
		$("#timePanel").idTabs("timeTable");
		
	}
	
	
}

function getIncludeSubjectsString(){
	var s="";
	var sFirst=true;
	for(sid in $subjects){
		var subject=getSubject(sid);
		if(subject.included){
			
			if(sFirst){
				sFirst=false;
			}else{
				s+=itemSplit;
			}
			
			s+=sid+valueSplit+subject["preference"];
		}
	}
	return s;
}

function getIncludeCoursesString(){
	var c="";
	var cFirst=true;
	for(cid in $courses){
		var course=$courses[cid];
		if(course.included){
			
			//var subject=getSubject(course.sid);
			
			//if(subject.included){		// exclude course if its subject has been excluded.
				
				if(cFirst){
					cFirst=false;
				}else{
					c+=itemSplit;
				}
				
				c+=cid+valueSplit+course["preference"];
			
			//}
		}
	}
	return c;
}

function curric(){
	
	var s=getIncludeSubjectsString();
	
	var c=getIncludeCoursesString();
	
	if(s!="" && c!=""){
		$.getJSON("servlet/SelectionReceiver",{action:"curric",subjects:s,courses:c},function(json){
			var tempSubject=currentSubjectDetail
			var tempCourse=currentCourseDetail;
			showCurric(json);
			currentSubjectDetail=tempSubject;
			currentCourseDetail=tempCourse;
		});
	}
	
}

function saveToCookie(){
	var s=getIncludeSubjectsString();
	
	var c=getIncludeCoursesString();
	
	deleteCookie("curric");
	setCookie("curric",s+partSplit+c,getExpDate(0,0,15,0));
}

function saveCurric(){
	var s=getIncludeSubjectsString();
	
	var c=getIncludeCoursesString();
	
	saveToCookie();
	
	//$.post("servlet/SelectionReceiver",{action:"save",subjects:s,courses:c,url:getRequestURL()},function(data){
	$.post("servlet/SelectionReceiver",{action:"save",subjects:s,courses:c},function(data){

		if(data==invalidUserMessage){
			/*if(confirmGotoCheckLehu()){
				gotoURL(getLehuCheckURL());
			}*/
			
			confirmGotoCheckLehu(function(){
				gotoURL(getLehuCheckURL($lehuLoginURL));
			});
			
		}else{
			alert(data);	
		}
	});
}

function loadCurric(data){
	
	if(data!=null && data!="" && data!=partSplit){
		
		$.ajaxSetup({async:false});		//sync for prefer.
		
		var curric=data.split(partSplit);
		
		var subjectsString=curric[0];
		var coursesString=curric[1];
		
		if(subjectsString!=""){
			
			var subjects=subjectsString.split(itemSplit);
			
			for(index in subjects){
				var subjectString=subjects[index];
				
				var value=subjectString.split(valueSplit);
				
				var sid=parseInt(value[0]);

				var subjectPrefer=parseFloat(value[1]);
				
				$.getJSON("servlet/SubjectDetail",{sid:sid},function(data){
					
					storeSubjectDetail(data,subjectPrefer,true);
					
				});
			}
		}
			
		if(coursesString!=""){
			
			var courses=coursesString.split(itemSplit);
	
			for(index in courses){
				var courseString=courses[index];
				
				var value=courseString.split(valueSplit);
				
				var cid=parseInt(value[0]);
				var coursePrefer=parseFloat(value[1]);
				
				$.getJSON("servlet/CourseDetail",{cid:cid},function(data){
					
					storeCourseDetail(data,coursePrefer,true);
					
				});
			}
		}
		
		$.ajaxSetup({async:true});		//restore to async.
		
	}
}

function importCurric(checkLehu){
	//$.post("servlet/ImportCurric",{url:getRequestURL()},function(data){
	$.post("servlet/ImportCurric",{},function(data){
		if(data==invalidUserMessage){
			if(checkLehu){
				/*if(confirmGotoCheckLehu()){
					saveToCookie();
					gotoURL(getLehuCheckURL());
				}*/
				
				confirmGotoCheckLehu(function(){
					saveToCookie();
					gotoURL(getLehuCheckURL($lehuLoginURL));
				});
			}
		}else{
			clearCurrentDetail();
			loadCurric(data);
			
			showIncludedSubjects();
			$("#treeListPanel").idTabs("includedList");
		}
	});
	
}

function mergeSnapToIncluded(enroll){
	for(sid in enroll){
		var cid=enroll[sid];
		getSubject(sid).included=true;
		if(getSubject(sid).preference==null){
			getSubject(sid).preference=getSubjectPreference(getSubject(sid).id);
		}
		getCourse(cid).included=true;
		if(getCourse(cid).preference==null){
			getCourse(cid).preference=5.0;
		}
	}
	refreshIncludedSubjects();
}

function replaceIncludedWithSnap(enroll){
	for(cid in $courses){
		$courses[cid].included=false;
	}
	for(sid in $subjects){
		$subjects[sid].included=false;
	}
	mergeSnapToIncluded(enroll);
}

function makePreview(enroll){
	
	$("#dialogContent").html("");
	$("#previewTable tr td").html("");
	
	var charIndex=0;
	var credit=0.0;
	
	var snap="";
	var shareTitle="";
	var shareContent="";
	
	var previewList="<table id=\"previewList\">";
	previewList+="<tr><th width=\"30px\">代号</th>";
	previewList+="<th width=\"55px\">课程编号</th>";
	previewList+="<th width=\"100px\">课程名称</th>";
	previewList+="<th width=\"30px\">学分</th>";
	previewList+="<th width=\"55px\">教师编号</th>";
	previewList+="<th width=\"70px\">教师姓名</th>";
	
	var isFirstSnap=true;
	
	for(sid in enroll){
		
		var cid=enroll[sid];
		
		var course=getCourse(cid);
		
		var subject=getSubject(sid);
		
		var char=curricIndexChar[charIndex];
		
		credit+=subject.credit;
		
		if(isFirstSnap){
			isFirstSnap=false;
		}else{
			snap+=valueSplit;
		}
		
		snap+=subject.id+attrSplit+course.id;
		
		shareTitle+=subject.name+" ";
		shareContent+=subject.name+"("+course.name+") ";
		
		previewList+="<tr id=\""+previewListId+cid+"\">";
		
		previewList+="<td>"+char+"</td>";
		previewList+="<td>"+subject.id+"</td>";
		previewList+="<td>"+subject.name+"</td>";
		previewList+="<td>"+subject.credit+"</td>";
		previewList+="<td>"+course.id+"</td>";
		previewList+="<td>"+course.name+"</td>";
		
		previewList+="</tr>";
		
		var times=course["times"];

		for(grid in times){
			
			var cell=$("#"+previewTableId+grid);
			
			var content=cell.text();
			
			if(content!=""){
				content+=itemSplit;
			}
			
			content+=char;
			
			cell.text(content);
		}
		
		charIndex++;
		
	}
	
	previewList+="</table>";
	
	$("#dialogContent").html("<div id=\"previewPanel\"><div>");
	
	$("#previewPanel").height(document.body.clientHeight*4/5);
	
	$("#previewPanel").append(previewList);
	
	$("#previewPanel").append("<div>总计学分: "+credit+"</span>");
	
	var clone=$("#previewTable").clone(true);
	
	clone.show();
	
	$("#previewPanel").append(clone);
	
	$("#previewPanel").append("<div><br></div>");
	
	var sids=new Array();
	
	for(index in $courses){
		var cid=parseInt(index);
		var course=getCourse(cid);
		var sid=course.sid;
		
		if(!arrayHasValue(sids,sid) && course.included && hasSubject(sid)){
			sids[sids.length]=sid;
		}
	}
	
	for(index in $subjects){
		var sid=parseInt(index);
		var subject=getSubject(sid);
		
		if(!arrayHasValue(sids,sid) && subject.included){
			sids[sids.length]=sid;
		}
	}
	
	if(sids.length>0){
		
		$("#previewPanel").append("<button id=\"mergeSnapToIncluded\" "+hintKey+"=\"把本快照中的所有课程合并到您已勾选的课程中\" class=\"curricButton\" style=\"width: 120px;\">合并到已勾选课程</button>");
		$("#previewPanel").append("&nbsp;");
		$("#previewPanel").append("<button id=\"replaceIncludedWithSnap\" "+hintKey+"=\"把您所勾选的课程替换为本快照中的课程\" class=\"curricButton\" style=\"width: 120px;\">替换为已勾选课程</button>");
		
		$("#mergeSnapToIncluded").unbind("click");
		$("#replaceIncludedWithSnap").unbind("click");
		
		$("#mergeSnapToIncluded").click(function(){
			if(confirm("您确认要把本快照中的所有课程合并到您已勾选的课程中吗？")){
				mergeSnapToIncluded(enroll);
				closeDialog();
			}
		});
		
		$("#replaceIncludedWithSnap").click(function(){
			if(confirm("您确认要把您所勾选的课程替换为本快照中的课程吗？")){
				replaceIncludedWithSnap(enroll);
				closeDialog();
			}
		});
		
	}else{
		
		$("#previewPanel").append("<button id=\"mergeSnapToIncluded\" "+hintKey+"=\"使用本快照，并将其中的课程作为已勾课程\" class=\"curricButton\" style=\"width: 120px;\">使用本快照</button>");
		
		$("#mergeSnapToIncluded").unbind("click");
		$("#replaceIncludedWithSnap").unbind("click");
		
		$("#mergeSnapToIncluded").click(function(){
			if(confirm("您确认要使用本快照，并将其中的课程作为已勾课程吗？")){
				mergeSnapToIncluded(enroll);
				closeDialog();
			}
		});
		
	}
	
	$("#previewPanel").append("<div><br></div>");
	
	var snapCode=null;
	$.ajaxSetup({async:false});
	$.post("servlet/CoderServlet",{action:"ENCODE",text:snap},function(data){
		snapCode=data;
	});
	$.ajaxSetup({async:true});

	var snapURL=getRequestBase()+"?snap="+snapCode;
	
	$("#previewPanel").append("<div>本快照地址 <input id=\"snapURL\" class=\"curricTextField\" value=\""+snapURL+"\"type=\"text\" "+hintKey+"=\"您可以将此链接转发给你的同学们<br />以便让他们知道您的选课计划\" style=\"width: 300px;\" /></div>");
	
	shareTitle="【选课计划】"+shareTitle;
	
	var shareRenrenURL="http://share.renren.com/share/buttonshare.do?link="+encodeURI(snapURL)+"&title="+encodeURI(shareTitle);
	var shareKaixinURL="http://www.kaixin001.com/repaste/share.php?rtitle="+encodeURI(shareTitle)+"&rurl="+encodeURI(snapURL)+"&rcontent="+encodeURI(shareContent);
	
	$("#previewPanel").append("<div><a href=\""+shareRenrenURL+"\" target=\"_blank\"><img src=\"images/renren.png\" style=\"height: 23px;\" title=\"分享到人人网\" /></a>&nbsp;<a href=\""+shareKaixinURL+"\" target=\"_blank\"><img src=\"images/kaixin001.png\" style=\"height: 23px;\" title=\"转贴到开心网\" /></a></div>");
	
	$("#previewPanel").append("<div><a href=\"http://www.xk.shu.edu.cn/\" target=\"_blank\">上海大学选课系统</a></div>");
	
	$("#previewPanel").append("<div><a href=\""+getRequestBase()+"\" target=\"_blank\">乐乎选课助手 Curric Online</a></div>");
	
	$("#snapValue").val(snap);
}

function preview(){
	makePreview(getEnroll());
	showDialog("课程表 预览");
}

function checkSnap(snapString){
	var check=true;
		
	if(snapString==""){
		check=false;
	}else{
		
		var snaps=snapString.split(valueSplit);
		
		for(index in snaps){
			
			var snap=snaps[index];
			
			if(snap!=""){
	
				var sc=snap.split(attrSplit);
				
				if(sc.length==2){
					
				}else{
					check=false;
					break;
				}
			}
		}
	}
	
	return check;
}

function viewSnap(){
	
	var string=$("#snapValue").val();
	
	if(checkSnap(string)){
		
		$(".dialogFoil").show();
		
		$("#dialogContent").html("");
		
		$.getJSON("servlet/ViewSnap.do",{snap:string,timestamp:new Date()},function(snaps){
						
			if(snaps[0]==overFrequentlyMessage){
				
				$("#dialogContent").html("<div id=\"confirmPanel\" style=\"padding: 10px;\"></div>");
	
				$("#confirmPanel").append("<div style=\"color: #FF0000; line-height: 16px;\">您的请求过于频繁，请稍后再试！</div>");
				
				$("#confirmPanel").append("<div><br></div>");
				
				$("#confirmPanel").append("<button align=\"center\"><input id=\"confirmCheckLehuButton\" class=\"curricButton\" style=\"width: 40px;\">确定</button></div>");
				
				$("#confirmCheckLehuButton").unbind("click");
				
				$("#confirmCheckLehuButton").click(closeDialog);
				
				showDialog("警告");
	
			}else{
			
				var snapArray=new Array();
				
				for(index in snaps){
					var snap=snaps[index];
					var subject=snap.subject;
					var course=snap.course;
					
					snapArray[subject.sid]=course.cid;
					
					if(!hasSubject(subject.sid)){
						addSubjects(subject);
					}
					
					if(!hasCourse(course.cid)){
						course.times=getTimeTableMap(course.times);
						addCourses(course);
					}
				}
				
				makePreview(snapArray);
				showDialog("课程表 快照");
				
			}
		});
		
	}else{
		alert("不正确的Curric快照格式");
	}
	
}

function autoViewSnap(){
	/*var map=getParametersMap(getRequestURL());
	var snap=map["snap"];*/
	
	if(typeof(autoSnap)!='undefined' && autoSnap!=null){
		$("#snapValue").val(autoSnap);
		viewSnap();
	}
}

function autoImportCurric(){
	if(getRequestURL().indexOf("g=")!=-1){
		loadCurric(getCookie("curric"));
		importCurric(false);
	}else{
		deleteCookie("curric");
		autoViewSnap();
	}
}

function readyCurricResultAction(){
	$("#resultList tr td select").unbind();
	
	$("#resultList tr td select.coursePreferenceChanger").each(function(){
		var cid=parseInt($(this).attr("id").split(coursePreferenceChangerId)[1]);
		var course=getCourse(cid);
		$("#"+$(this).attr("id")+" option").each(function(){
			if(parseFloat($(this).attr("value"))==Math.floor(course["preference"])){
				$(this).attr("selected",true);
			}else{
				$(this).removeAttr("selected");
			}
		});
		$(this).change(function(){
			setCoursePreference($(this),cid);
		});
	});
	
	$("#resultList tr td select.subjectPreferenceChanger").each(function(){
		var cid=parseInt($(this).attr("id").split(subjectPreferenceChangerId)[1]);
		var course=getCourse(cid);
		var subject=getSubject(course.sid);
		$("#"+$(this).attr("id")+" option").each(function(){
			if(parseFloat($(this).attr("value"))==Math.floor(subject["preference"])){
				$(this).attr("selected",true);
			}else{
				$(this).removeAttr("selected");
			}
		});
		$(this).change(function(){
			setSubjectPreference($(this),course.sid);
			
			$("#resultList tr td select.subjectPreferenceChanger").each(function(){
				var tid=parseInt($(this).attr("id").split(subjectPreferenceChangerId)[1]);
				if(getCourse(tid).sid==course.sid){
					$("#"+$(this).attr("id")+" option").each(function(){
						if(parseFloat($(this).attr("value"))==Math.floor(subject["preference"])){
							$(this).attr("selected",true);
						}else{
							$(this).removeAttr("selected");
						}
					});
				}
			});
		});
	});
	
	$("#resultList tr").unbind();
	$("#resultList tr").mouseover(function(){
		var trid=$(this).attr("id");
		if(trid!=""){
			$(this).addClass("mouseOver");
			var cid=parseInt(trid.split(resultListId)[1]);
			var course=getCourse(cid);
			
			for(grid in course.times){
				$("#"+timeTableId+grid).addClass("focus");
			}
			
		}		
	}).mouseout(function(){
		$(".timeTable tr td input").removeClass("focus");
		
		var trid=$(this).attr("id");
		if(trid!=""){
			$(this).removeClass("mouseOver");
		}
	});
}

function readyCurricPanelAction(){
	
	$("#previewTable").hide();
	
	$("button.curricButton").click(function(){
		
		var action=this.id;
		
		//Non-security actions
		if(action=="preview"){
			preview();
		}else{
			//Security actions
			if(verifyCurric()){
				
				if(action=="curric"){
					curric();
				}else if(action=="save"){
					saveCurric();
				}else if(action=="import"){
					importCurric(true);
				}else if(action=="viewSnap"){
					viewSnap();
				}	
			}
		}
	});
	
	$("#snapValue, #snapURL").live("click",function(){
		this.select();
	});
	
	autoImportCurric();
}
