<?php
/*******************************************************************************
 * 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
*******************************************************************************/
error_reporting('E_NONE'); ini_set("display_errors", false);
require_once("cb_global.php");

$project_id = getHTTPParameter("proj", "POST");
$version = getHTTPParameter("version", "POST");

//THE 3 VALID STATES
//	UNSTRANSLATED (DEFUALT)
//	FLAGGED (FLAGGED INCORRECT IN DATABASE)
//	AWAITING (TRANSLATED BUT NO RAITINGS YET)
$state = getHTTPParameter("state", "POST"); 

if(!isset($proj_post)){
	if(isset($_SESSION['project']))
		$project_id = $_SESSION['project'];
		
	if(isset($_SESSION['version']))
		$version =  $_SESSION['version'];
		
	if(isset($_SESSION['language']))
		$language =  $_SESSION['language'];
		
	if(isset($_SESSION['file']))
		$file =  $_SESSION['file'];

	if(isset($_SESSION['string']))
		$string =  $_SESSION['string'];
}

switch($state){
	case "flagged" :
	break;
	$query = "select 
				strings.value as string,
				strings.name as stringName,
				strings.non_translatable,
				translations.value as translation,
				translations.possibly_incorrect as fuzzy
			  from 
			  	strings,
			  	files
			  	left join translations on
			  		translations.language_id = '".addslashes($language)."'
			  	  and
			  		string_id = translations.string_id
			  where 
			  	strings.is_active != 0 
			  and 
			  	strings.file_id = files.file_id 
			  and 
				files.project_id = '".addslashes($project_id)."'
			  and	
				files.version = '".addslashes($version)."'
			";
	case "translated" :
	break;
	$query = "select 
				strings.value as string,
				strings.name as stringName,
				strings.non_translatable,
				translations.value as translation,
				translations.possibly_incorrect as fuzzy,
				users.username as translator
				from 
			  	strings,
			  	users,
			  	files
			  	left join translations on
			  		translations.language_id = '".addslashes($language)."'
			  	  and
			  		string_id = translations.string_id
			  where 
			  	strings.is_active != 0 
			  and 
			  	strings.file_id = files.file_id 
			  and 
				files.project_id = '".addslashes($project_id)."'
			  and	
				files.version = '".addslashes($version)."'
			  and 
			  	users.userid = translations.userid
			";
	
	case "untranslated" :
	default:
		$query = "select 
					strings.string_id as stringId,
					strings.name as stringName,
					strings.non_translatable,
					strings.value as text,
					strings.created_on as createdOn,
					translations.value as translationString,
					translations.possibly_incorrect as fuzzy,
					users.first_name as first,
					users.last_name as last
					from 
					files,
				  	strings
				  	left join translations on (
				  		translations.language_id = '".addslashes($language)."'
				  	  and
				  		translations.string_id  = strings.string_id
				  	  and 
				  	  	translations.is_active = 1
				  	)
				  	
				  	left join users on (
				  		translations.userid = users.userid
				  	)
				  where 
				  	strings.is_active = 1 
				  and 
					files.file_id = strings.file_id
				  and	
					files.version = '".addslashes($version)."'
				  and
				  	files.name = '".addslashes($file)."'
				  and 
					files.project_id = '".addslashes($project_id)."'
  				  group by strings.string_id,translations.version desc
				";
}

//print $query."<br>";

$res = mysqli_query($dbh, $query);

//print mysqli_error($dbh);

$stringids = Array();
$return = Array();
while($line = mysqli_fetch_array($res, MYSQL_ASSOC)){
    if(isset($stringids[$line['stringId']])){
 		  continue;
    }else{
    	$line['text'] = nl2br(htmlspecialchars($line['text']));
        if(isset($string) && $line['stringName'] == $string){
			$line['current'] = true;
		}
		else {
			$line['current'] = false;
		} 
    	$line['translationString'] = nl2br(htmlspecialchars($line['translationString']));
    	$line['translator'] = nl2br(htmlspecialchars($line['first']." ".$line['last']));
    	if($line['non_translatable']){
    		$line['translationString'] = "<span style='font-style: italic;'>non-translatable string";
    		$line['nontranslatable'] = true;
    	} 
		$return[] = $line;
		$stringids[$line['stringId']] = 1;
    }
}

$pagesize = 50;

if(count($return) > $pagesize and $_GET['paged'] < count($return) ){
	if(isset($_GET['paged'])){
		$return = array_slice($return,$_GET['paged'],$pagesize);
		$pg->paged = $_GET['paged']+$pagesize;
		$return[] = $pg;
	}else{
		$return = array_slice($return,0,$pagesize);
		$pg->paged = $pagesize;
		$return[] = $pg;
	}
	print json_encode($return);
}else{	
	if($_GET['paged'] < count($return) ){
		print json_encode($return);
	}else{
		print json_encode(array());
	}
}

exit();
?>