<?php
/*******************************************************************************
 * Copyright (c) 2006 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:
 *    Denis Roy (Eclipse Foundation)- initial API and implementation
 *    Nathan Gervais (Eclipse Foundation) - Expanded new fields being added
 *******************************************************************************/
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/drops/drop.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/projects/project.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/smartconnection.class.php");
//require_once("/home/data/httpd/eclipse-php-classes/system/dbconnection.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");

class ProjectList {

	#*****************************************************************************
	#
	# projectList.class.php
	#
	# Author: 	Denis Roy
	# Date:		2004-11-16
	#
	# Description: Functions and modules related Lists of projects
	#
	# HISTORY:
	#
	#*****************************************************************************

	var $list = array();
	
	
	function getList() {
		return $this->$list;
	}
	function setList($_list) {
		$this->list = $_list;
	}


    function add($_project) {
            $this->list[count($this->list)] = $_project;
    }


    function getCount() {
            return count($this->list);
    }

    function getItemAt($_pos) {
            if($_pos < $this->getCount()) {
                    return $this->list[$_pos];
            }
    }

	function selectProjectList($_project_id, $_name, $_level, $_parent_project_id, $_description, $_order_by, $_is_project = 0) {
		
		$App = new App();
	    $WHERE = " PRJ.is_active = 1";
	
	    if($_project_id != "") {
	            $WHERE = $App->addAndIfNotNull($WHERE);
	            $WHERE .= " PRJ.project_id = " . $App->returnQuotedString($_project_id);
	    }
	    if($_name != "") {
	            $WHERE = $App->addAndIfNotNull($WHERE);
	            $WHERE .= " PRJ.name LIKE " . $App->returnQuotedString("%" . $_name . "%");
	
	    }
	    if($_level > 0) {
	            $WHERE = $App->addAndIfNotNull($WHERE);
	            $WHERE .= " PRJ.level = " . $_level;
	    }
	    if($_parent_project_id != "") {
	            $WHERE = $App->addAndIfNotNull($WHERE);
	            $WHERE .= " PRJ.parent_project_id = " . $App->returnQuotedString($_parent_project_id);
	    }
	    if($_description != "") {
	            $WHERE = $App->addAndIfNotNull($WHERE);
	            $WHERE .= " PRJ.description LIKE " . $App->returnQuotedString("%" . $_description . "%");
	
	    }
	    if ($_is_project != 0)
	    {
	    		$WHERE = $App->addAndIfNotNull($WHERE);
	    		$WHERE .= " PRJ.is_project = " . $_is_project;	
	    }
	
	    if($WHERE != "") {
	            $WHERE = " WHERE " . $WHERE;
	    }
	
	    if($_order_by == "") {
	            $_order_by = "PRJ.name";
	    }
	
	    $_order_by = " ORDER BY " . $_order_by;
	
	
	    $dbc = new DBConnection();
	    $dbh = $dbc->connect();
	
	    $sql = "SELECT 
					PRJ.project_id,
					PRJ.name,
					PRJ.level,
					PRJ.parent_project_id,
					PRJ.description,
					PRJ.url_download,
					PRJ.url_index,
					PRJ.is_topframe,
					PRJ.sort_order,
					PRJ.is_active,
					PRJ.url_newsgroup,
					PRJ.url_mailinglist,
					PRJ.url_wiki,
					PRJ.url_docs,
					PRJ.is_project
	        	FROM
					projects AS PRJ "
				. $WHERE
				. $_order_by;
# echo $sql;	
	    $result = mysql_query($sql, $dbh);

	    while($myrow = mysql_fetch_array($result))
	    {
	    		
	            $Project 	= new Project();
	            $Project->setProjectID		($myrow["project_id"]);
	            $Project->setName			($myrow["name"]);
	            $Project->setLevel			($myrow["level"]);
	            $Project->setParentProjectID($myrow["parent_project_id"]);
	            $Project->setDescription	($myrow["description"]);
	    		$Project->setUrlDownload	($myrow["url_download"]);
	    		$Project->setUrlIndex		($myrow["url_index"]);
				$Project->setIsTopframe		($myrow["is_topframe"]);
				$Project->setSortOrder		($myrow["sort_order"]);
				$Project->setIsActive		($myrow["is_active"]);
				$Project->setUrlNewsgroup  ($myrow["url_newsgroup"]);
				$Project->setUrlMailingList($myrow["url_mailinglist"]);
				$Project->setUrlWiki  		($myrow["url_wiki"]);
				$Project->setUrlDocs  		($myrow["url_docs"]);
				$Project->setIsProject		($myrow["is_project"]);				
	            $this->add($Project);
	    }
	    
	    	
	    $dbc->disconnect();
	    $dbh 	= null;
	    $dbc 	= null;
	    $result = null;
	    $myrow	= null;
	}
}
?>
