<?php
/*******************************************************************************
 * Copyright (c) 2008 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:
 *    Eclipse Foundation - Initial API and implementation
 *    Kit Lo (IBM) - [261739] Inconsistent use of language names
 *    Kit Lo (IBM) - [411832] Stats and Recent pages do not show Orion in project dropdown list
 *    Satoru Yoshida - [221181] Search a specific string
*******************************************************************************/
include("global.php");

InitPage("");

global $User;
global $dbh;

$pageTitle 		= "Babel - Recent Translations";
$pageKeywords 	= "";
$incfile 		= "content/en_recent_html_list.php";

$PROJECT_VERSION = getHTTPParameter("project_version");
$PROJECT_ID = "";
$VERSION	= "";

if($PROJECT_VERSION != "") {
	$items = explode("|", $PROJECT_VERSION);
	$PROJECT_ID = $items[0];
	$VERSION	= $items[1];
}
$LANGUAGE_ID= getHTTPParameter("language_id");
if($LANGUAGE_ID == "") {
	$LANGUAGE_ID = $_SESSION["language"];
}

$FUZZY		= getHTTPParameter("fuzzy");
if($FUZZY == "" || $FUZZY != 1) {
	$FUZZY = 0;
}

if($LANGUAGE_ID == "All") {
	$LANGUAGE_ID = "";
}
$LIMIT 		= getHTTPParameter("limit");
if($LIMIT == "" || $LIMIT <= 0 || $LIMIT > 20000) {
	$LIMIT = 25;
}
$LAYOUT 		= getHTTPParameter("layout");
if($LAYOUT == "list" || $LAYOUT == "table") {
	$incfile = "content/en_recent_html_" . $LAYOUT . ".php";
}
$FORMAT		= getHTTPParameter("format");
if($FORMAT == "rss") {
	$incfile 		= "content/en_recent_rss.php";
}
$s_value	= getHTTPParameter("s_value");
$s_value	= trim($s_value);
if ($s_value !== '') {
	$s_value_in_sql = $s_value . '%';
} else {
	$s_value_in_sql = '';
}
$USERID		= getHTTPParameter("userid");
$SUBMIT 	= getHTTPParameter("submit");

$sql = "SELECT DISTINCT pv_m.project_id, pv_m.version FROM project_versions AS pv_m INNER JOIN map_files as m ON pv_m.project_id = m.project_id AND pv_m.version = m.version WHERE pv_m.is_active UNION SELECT DISTINCT pv_s.project_id, pv_s.version FROM project_versions AS pv_s INNER JOIN project_source_locations as s ON pv_s.project_id = s.project_id AND pv_s.version = s.version WHERE pv_s.is_active ORDER BY project_id ASC, version DESC";
$rs_p_list = mysql_query($sql, $dbh);

$sql = "SELECT language_id, IF(locale <> '', CONCAT(CONCAT(CONCAT(name, ' ('), locale), ')'), name) as name FROM languages WHERE is_active AND iso_code != 'en' ORDER BY name";
$rs_l_list = mysql_query($sql, $dbh);

$where = " t.is_active ";

if($PROJECT_ID != "") {
	$where = addAndIfNotNull($where) . " f.project_id = ";
	$where .= returnQuotedString(sqlSanitize($PROJECT_ID, $dbh));
}
if($LANGUAGE_ID != "") {
	$where = addAndIfNotNull($where) . " t.language_id = ";
	$where .= returnQuotedString(sqlSanitize($LANGUAGE_ID, $dbh));
}
if($VERSION != "") {
	$where = addAndIfNotNull($where) . "f.version = ";
	$where .= returnQuotedString(sqlSanitize($VERSION, $dbh));
}
if($s_value_in_sql !== "") {
	$where = addAndIfNotNull($where) . "s.value like ";
	$where .= returnQuotedString(sqlSanitize($s_value_in_sql, $dbh));
}
if($USERID != "") {
	$where = addAndIfNotNull($where) . "u.userid = ";
	$where .= sqlSanitize($USERID, $dbh);
}
if($FUZZY == 1) {
	$where = addAndIfNotNull($where) . "t.possibly_incorrect = 1 ";
}

if($where != "") {
	$where = " WHERE " . $where;
}


$sql = "SELECT 
  s.name AS string_key, s.value as string_value, 
  t.value as translation,
  t.possibly_incorrect as fuzzy, 
  IF(u.last_name <> '' AND u.first_name <> '', 
  	CONCAT(CONCAT(first_name, ' '), u.last_name), 
  	IF(u.first_name <> '', u.first_name, u.last_name)) AS who,
  u.userid, 
  t.created_on, l.iso_code as language,
  f.project_id, f.version, f.name
FROM 
  translations as t 
  LEFT JOIN strings as s on s.string_id = t.string_id 
  LEFT JOIN files as f on s.file_id = f.file_id 
  LEFT JOIN users as u on u.userid = t.userid
  LEFT JOIN languages as l on l.language_id = t.language_id 
$where
ORDER BY t.created_on desc 
LIMIT $LIMIT";
$rs_p_stat = mysql_query($sql, $dbh);
global $addon;
$addon->callHook("head");
include($incfile);
$addon->callHook("footer");

?>