/*******************************************************************************
 * Copyright (c) 2007 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Paul Colton (Aptana)- initial API and implementation
 *    Eclipse Foundation
*******************************************************************************/

YAHOO.projectManager = {
	getAjaxProject: function(selectedIn){
		
		var callback = 
		{ 
			start:function(eventType, args){ 
			},
			success: function(o) {
				var response = eval("("+o.responseText+")");
				var domNode = document.getElementById('project-area');
//				YAHOO.log(o.responseText);
				domNode.innerHTML = "";
				if(response){
					for(var i = 0; i < response.length; i++){
						var proj = new project(response[i]['project']);
						domNode.appendChild(proj.createHTML());
						if(response[i]['current']){
							YAHOO.projectManager.updateSelected(proj, domNode.scrollHeight);
						}	
					}
				
	//			domNode.innerHTML = o.responseText;
	//			YAHOO.util.Event.onAvailable("project-choices",setupSelectProjectCB);
	
				//start versions
					YAHOO.versionManager.getAjaxVersions();
				} else{
					domNode.innerHTML = "Please select a language to continue.";
				}
			},
			failure: function(o) {
				YAHOO.log('failed!');
			} 
		} 
		//start spinner
		var domNode = document.getElementById('project-area');
		YAHOO.spinable.attach(domNode);
		YAHOO.util.Connect.asyncRequest('GET', "callback/getProjects.php", callback, null); 
	},

	getSelected: function(){
//	YAHOO.log("projectManager getSelcted:"+this.selected);
		return this.selected;
	},
	
	updateSelected: function(selec, scrollto_position){
		if(this.selected){
			this.selected.unselect();
		}
		this.selected = selec;
		this.selected.selected();
		
		var domNode = document.getElementById('project-area');
		if(domNode.scrollTop == 0) {
			domNode.scrollTop = scrollto_position;
		}
	}
};




function project(projectIn){
	project.superclass.constructor.call();
	this.project = projectIn;
	this.initSelectable();
}
YAHOO.extend(project,selectable);
project.prototype.isSelected = function(){
 return (this == YAHOO.projectManager.selected);
}


project.prototype.clicked = function(e){
	YAHOO.util.Event.stopEvent(e);
	var callback = 
	{ 
		start:function(eventType, args){ 
		},
		success: function(o) {
			YAHOO.versionManager.getAjaxVersions();
		},
		failure: function(o) {
			YAHOO.log('failed!');
		} 
	} 
	YAHOO.projectManager.updateSelected(this);
	YAHOO.util.Connect.asyncRequest('POST', "callback/setCurrentProject.php", callback, "project="+this.project);	
}
project.prototype.createHTML = function(){
	this.domElem = document.createElement("li");
	this.domElem.innerHTML = this.project;
	this.addEvents();
	return this.domElem;
}
