<?php
/*******************************************************************************
 * Copyright (c) 2013-5 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:
*    Christopher Guindon (Eclipse Foundation)- initial API and implementation
*******************************************************************************/

	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");
	$App = new App();
	$Nav = new Nav();
	$Menu = new Menu();
	include("_projectCommon.php");

	#
	# Begin: page-specific settings.  Change these. 
	$pageTitle 		= "Eclipse mirror sites";
	$pageKeywords	= "eclipse,download,mirror";
	$pageAuthor		= "Eclipse Foundation, Inc.";
	# End: page-specific settings
	#

	require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection_rw.class.php";
    require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/mirrors/mirror.class.php");
	
	$_status = $App->getHTTPParameter('status');

	$error = 0;

	if($_status == "") {
		$_status = "new";
	}

	$dbc = new DBConnectionRW();
	$dbh = $dbc->connect();

	$App = new App();
	$Mirror = new Mirror();

	if($_status == "save") {
		
		$MIR_REQ = $_COOKIE['MIR_REQ'];
		if($MIR_REQ == "") {

			$valid = true;
			$errorfield = "";
 			$alnumspace = "^[][a-zA-Z0-9 .'&,_-]+$";

 			# validate incoming
			if (!eregi($alnumspace, $_POST['organization'])) {
				$errorfield .= " Organization";
				$valid = false;
			}
			if (!eregi('^[a-zA-Z]{2}$', $_POST['ccode'])) {
				$errorfield .= " Country";
				$valid = false;
			}
			if (!eregi($alnumspace, $_POST['contact'])) {
				$errorfield .= " Contact";
				$valid = false;
			}

			if (!eregi("^(http|https):\/\/", $_POST['http_browserlink']) && $_POST['http_browserlink'] != "") {
				$errorfield .= " HTTP URL";
				$valid = false;
			}
			if (!eregi('^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z.]{2,5}$', $_POST['email'])) {
				$errorfield .= " E-mail address";
				$valid = false;
			}
			
			if(!$Mirror->isValidPublicIP($_POST['update_ip_allow'])) {
				$errorfield .= " IP Address";
				$valid = false;
			}

			if($valid) {
				$sql = "
	        		INSERT INTO mirrors (
	        			organization,
	        			ccode,
	        			update_ip_allow,
	        			email,
	        			date_enabled,
	        			create_status,
	        			contact)
	        		VALUES (
	        			" . $App->returnQuotedString($_POST['organization']) . ",
	        			" . $App->returnQuotedString($_POST['ccode']) . ",
	        			" . $App->returnQuotedString($_POST['update_ip_allow']) . ",
	        			" . $App->returnQuotedString($_POST['email']) . ",
	        			NOW(),
	        			" . $App->returnQuotedString("approve") . ",
	        			" . $App->returnQuotedString($_POST['contact']) . ")
				";
				mysql_query($sql, $dbh);
				$mirror_id = mysql_insert_id();

				# add protocols.
				if($_POST["http_browserlink"] != "") {
					$sql = "
			        		INSERT INTO mirror_protocols (
			        			mirror_id,
			        			protocol,
			        			base_path)
			        		VALUES (
			        			" . $mirror_id . ",
			        			" . $App->returnQuotedString("http") . ",
			        			" . $App->returnQuotedString($_POST['http_browserlink']) . ")
					";
					mysql_query($sql, $dbh);

					$drop_list = $_POST["drop_id"];
					foreach (split(",", $drop_list) as $drop) {
						$sql = "
				        		INSERT INTO mirror_drops (
				        			mirror_id,
				        			drop_id,
				        			protocol)
				        		VALUES (
				        			" . $mirror_id . ",
				        			" . $App->returnQuotedString("EclipseFull") . ",
				        			" . $App->returnQuotedString("http") . ")";
						mysql_query($sql,$dbh);
					}
				}
				# Place cookie on browser to avoid having multiple submissions
				setcookie("MIR_REQ", "1");
			}
			else {
				$error = 2;
			}
		}
		else {
			$error = 1;
		}
	}
	else {
		$sql = "SELECT
					DRP.drop_id,
					DRP.project_id,
					DRP.description,
					IFNULL((
						SELECT 
							disk_space 
						FROM project_disk_space_usage AS DSK 
						WHERE DSK.project_id = DRP.project_id AND DSK.is_quota=1
						)
						,DRP.size) AS size,
					DRP.size_unit,
					DRP.is_default_selection,
					PRJ.level,
					PRJ.sort_order
				FROM drops AS DRP
					LEFT JOIN projects as PRJ ON PRJ.project_id = DRP.project_ID
				ORDER BY DRP.sort_order
		";
		
		$rs = mysql_query($sql, $dbh);
		
		$sql = "SELECT
					ccode, 
					en_description
				FROM SYS_countries
				ORDER BY en_description
		";
		
		$rs_country = mysql_query($sql, $dbh);
	}

	
	# Place your html content in a file called content/en_pagename.php
	include("content/en_" . $App->getScriptName());

	$dbc->disconnect();
	$dbc = null;

	# Generate the web page
	$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>