<?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, MYSQLI_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();
?>