<?php
/*
* LimeSurvey
* Copyright (C) 2007 The LimeSurvey Project Team / Carsten Schmitz
* All rights reserved.
* License: GNU/GPL License v2 or later, see LICENSE.php
* LimeSurvey is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
* 
* $Id: results.php 7699 2009-09-30 22:28:50Z c_schmitz $
*/


include_once("login_check.php");


// Todo: This is a dead script. Either use it or trash it.
//OK: Here's how it works so far!

/*include this file in a php script

* The two "overall" functions are:
*   - giveMeRawDataFromFieldNames($surveyid, $gid, $qid, $fieldarray, responsestyle)
*     $surveyid = the survey id number
*     $gid = the group id for the question you want results for
*     $qid = the question id for the question you want results for
*     $fieldarray = a keyed array containing the fieldnames as key, and the value for of that fieldname that you want matches to
*        -ie: array ("1X2X34"=>"FL", "1X2X35"=>"Cork")
*     $responsestyle should be "full" - the alternative (which would just be the codes) is not yet coded
*
*     This function will return a multi-level array. The first level is a numbered array with an
*     entry for every individual response. Within that array will be a further array, with an entry
*     for every possible answer to that question. Then, within each of those arrays will be
*     the question title, and the answer to that question for that record.
*
*     As an example, a single answer type question (like a List, or Yes/No)
*     will look like this:
*     Array
*     (
*       [0]=> Array
*           (
*              [4X6X22] => Array
*                       (
*                          [0] => What is your Employment Type?
*                          [1] => Ongoing
*                       )
*           )
*       [1]=> Array
* 			..... and so forth for each record in the responses table
*
*     A multiple answer type question, such as "Multiple Choice" will look like this:
*     Array
*     (
*       [0]=> Array
*           (
*             [2X2X7C] => Array
*                       (
*                          [0] => Choose your favourite foods [Cheese]
*                          [1] => Yes
*                       )
*             [2X2X7I] => Array
*                       (
*                          [0] => Choose your favourite foods [Ice Cream]
*                          [1] =>
*                       )
*           )
*
*   - makeSummaryFromRawData($results)
*     Feed this function the "raw results" string generated by the "giveMeRawDataFromFieldNames"
*     function and you'll be returned an array containing a summary/count of results
*     for every possible answer within that question.
*
*     An example result for a single option question (ie: List or Yes/No) is:
*
*     Array
*     (
*         [4X6X22] => Array
*             (
*                 [question] => What is your Employment Type?
*                 [summary] => Array
*                     (
*                         [Ongoing] => 429
*                         [Fixed Term] => 61
*                         [None] => 4
*                         [Agency / Temp] => 4
*                         [Casual] => 1
*                     )
*
*             )
*     )
*
*     An example result for a multiple answer type question is:
*     Array
*     (
*         [2X2X7G] => Array
*             (
*                 [question] => Which of the following issues do you want addressed in negotiations for the next Enterprise Bargaining Agreement? [Accrual of Time In Lieu / Flex Time]
*                 [summary] => Array
*                     (
*                         [Yes] => 10
*                         [None] => 3
*                     )
*
*             )
*
*         [2X2X7K] => Array
*             (
*                 [question] => Which of the following issues do you want addressed in negotiations for the next Enterprise Bargaining Agreement? [Allowances / Reimbursement of Expenses]
*                 [summary] => Array
*                     (
*                         [Yes] => 5
*                         [None] => 8
*                     )
*
*             )
*     )
*
*/

//THIS BIT IS JUST FOR DEBUGGING
if (!empty($_GET['debug'])) {
	//    $table = "survey_4";
	//	//$questionfields[]="4X6X22";
	//	//$questionfields[]="4X6X23";
	//	$limitby=array("4X6X22"=>"A",
	//				   "4X6X23"=>"B");
	//	$sql = buildSqlFromFieldnamesArray($limitby);
	//	$questionfields=buildQuestionFields("4", "7", "29");
	//	if (!empty($questionfields)) {
	//		$results = returnQuestionResults($table, $questionfields, $sql);
	//		echo "TOTAL RESULTS: ".count($results);
	//		echo "<pre>";
	//		print_r($results);
	//		echo "</pre>";
	//	}
	$surveyid=$_GET['sid'];
	$gid=$_GET['gid'];
	$qid=$_GET['qid'];
	//$results = giveMeRawDataFromFieldNames("4", "6", "22", array(), "full");
	//$results = giveMeRawDataFromFieldNames("2", "2", "7", array(), "full");
	//$results = giveMeRawDataFromFieldNames("8", "18", "66", array(), "full");
	//$results = giveMeRawDataFromFieldNames("29", "89", "559", array(), "full");
	$results = giveMeRawDataFromFieldNames($surveyid, $gid, $qid, array(), "full");

	$summary = makeSummaryFromRawData($results);
	foreach ($results as $result) { foreach ($result as $answer) {echo $answer[1];} }
	echo "<pre>";
	print_r($results);
	echo "</pre>";
	//
	//	foreach ($summary as $sum) {
	//		echo "<table width='400' align='center' border='1'>\n";
	//		echo "<tr><td colspan='2' align='center' bgcolor='silver'>".$sum['question']."</td></tr>\n";
	//		foreach ($sum['summary'] as $key=>$val) {
	//			echo "<tr><td align='right' valign='top'><strong>$key</strong></td><td>$val</td></tr>\n";
	//		}
	//		echo "</table><br />";
	//	}
}

function makeSummaryFromRawData($results, $surveyid=null, $gid=null, $qid=null) {

	//echo "<pre>";print_r($results);echo "</pre>";
	if (empty($results)) {
		return array();
	}
	if (!empty($qid)) {
		$thisquestion=getQuestionInfo($qid);
	}
	$rowcodes=array_keys($results[0]);
	//	echo "<pre>";print_r($rowcodes);echo "</pre>";

	$summary = array();
	foreach ($results as $result) {
		foreach($rowcodes as $row) {
			//echo "<pre>";print_r($result);echo "</pre>";

			if (is_array($result[$row])) {
				//echo "<pre>";print_r($result);echo "</pre>";
				$summary[$row]['question']=$result[$row][0];
				switch($thisquestion['type']) {
					case "T":
					case "S":
					case "H":
					if ($result[$row][1] != "") {
						if (!isset($summary[$row]['summary'][$clang->gT("Answered")])) {
							$summary[$row]['summary'][$clang->gT("Answered")]=1;
						} else {
							$summary[$row]['summary'][$clang->gT("Answered")]++;
						}
					}
					break;
					default:
					if (!isset($summary[$row]['summary'][$result[$row][1]])) {
						$summary[$row]['summary'][$result[$row][1]]=1;
					} else {
						$summary[$row]['summary'][$result[$row][1]]++;
					}
					break;
				}
			}
			if ($thisquestion['type'] == "N") {
				ksort($summary[$row]['summary'], SORT_NUMERIC);
			}
		}
	}
	//echo "<pre>";print_r($summary);echo "</pre>";
	//fill in the blanks from answer table and sort
	if (isset($surveyid) && isset($qid) && $summary) {
		//$thissurvey=getSurveyInfo($surveyid);
		$rowcodes=array_keys($summary);
		switch($thisquestion['type']){
			case "F":
			case "H":
			$answers=getLabelSet($thisquestion['lid']);
			break;
			case "!":
			case "L":
			case "O":
			$answers=getAnswersSingle($surveyid, $gid, $qid);
			$answers[]=array("code"=>"", "answer"=>$clang->gT("No answer"));
			break;
			case "W":
			case "Z":
			case "1":
			$answers=getLabelSet($thisquestion['lid']);
			$answers[]=array("code"=>"", "answer"=>$clang->gT("No answer"));
			break;
			case "C":
			$answers[]=array("code"=>"Y", "answer"=>$clang->gT("Yes"));
			$answers[]=array("code"=>"U", "answer"=>$clang->gT("Uncertain"));
			$answers[]=array("code"=>"N", "answer"=>$clang->gT("No"));
			break;
			case "E":
			$answers[]=array("code"=>"I", "answer"=>$clang->gT("Increase"));
			$answers[]=array("code"=>"S", "answer"=>$clang->gT("Same"));
			$answers[]=array("code"=>"D", "answer"=>$clang->gT("Decrease"));
			$answers[]=array("code"=>"", "answer"=>$clang->gT("No answer"));
			break;
			case "M":
			case "P":
			$answers[]=array("code"=>"Y", "answer"=>$clang->gT("Yes"));
			$answers[]=array("code"=>"", "answer"=>$clang->gT("No answer"));
			break;
			case "Y":
			$answers[]=array("code"=>"Y", "answer"=>$clang->gT("Yes"));
			$answers[]=array("code"=>"N", "answer"=>$clang->gT("No"));
			$answers[]=array("code"=>"", "answer"=>$clang->gT("No answer"));
			break;
			case "G":
			$answers[]=array("code"=>"M", "answer"=>$clang->gT("Male"));
			$answers[]=array("code"=>"F", "answer"=>$clang->gT("Female"));
			$answers[]=array("code"=>"", "answer"=>$clang->gT("No answer"));
			break;
			case "T":
			case "S":
			case "U":
			$answers[]=array("code"=>$clang->gT("Answered"), "answer"=>$clang->gT("Answered"));
			$answers[]=array("code"=>"", "answer"=>$clang->gT("No answer"));
			break;
		} // switch

		if (isset($answers)) {
			foreach($rowcodes as $row) {
				$newarray[$row]['question']=$summary[$row]['question'];
				foreach($answers as $answer) {
					//echo "<pre>";print_r($answer);echo "</pre>";
					if (isset($summary[$row]['summary'][$answer['answer']])) {
						$newarray[$row]['summary'][$answer['answer']]=$summary[$row]['summary'][$answer['answer']];
					} else {
						$newarray[$row]['summary'][$answer['answer']]=0;
					}
				}
			}
			$summary=$newarray;
		}
	}

	//Fix the output for multiple
	if ($thisquestion['type'] == "M" || $thisquestion['type'] == "P" || $thisquestion['type'] == "^"  || $thisquestion['type'] == "1") {
		if (isset($newarray)) {unset($newarray);}
		$newarray[$thisquestion['sid']."X".$thisquestion['gid']."X".$thisquestion['qid']]['question']=$thisquestion['question'];
		foreach ($summary as $sum) {
			preg_match("/\[(.*)\]/", $sum['question'], $regs);
			$newarray[$thisquestion['sid']."X".$thisquestion['gid']."X".$thisquestion['qid']]['summary'][$regs[1]]=$sum['summary'][$clang->gT("Yes")];
		}
		$summary=$newarray;
	}
	//	echo "<pre>";print_r($summary);echo "</pre>";
	return $summary;
}

function giveMeRawDataFromFieldNames($surveyid, $gid, $qid, $fieldlimiters=array(), $output="full") {
	//Builds output data for question $surveyid$gid$qid, limiting with $fieldlimiters array
	$questionfields = buildQuestionFields($surveyid, $qid);
	$sql = buildSqlFromFieldnamesArray($fieldlimiters);
	$tablename = "survey_".$surveyid;
	$fieldmap=createFieldMap($surveyid, "full");
	//echo "<pre>"; print_r($answers); echo "</pre>";
	list($questioninfo, $results) = returnQuestionResults($surveyid, $questionfields, $sql);
	//echo "<pre>"; print_r($questioninfo); echo "</pre>";
	if (count($results) < 1) {
		return array();
	}
	foreach ($questioninfo as $qi) {
		$questiontype=$qi['type'];
	}
	//	echo "[$questiontype]<br />";
	if ($output == "full") {
		GetBaseLanguageFromSurveyID($surveyid);
		//echo "<pre>"; print_r($answers); echo "</pre>";
		switch($questiontype) {
			case "L":
			case "!":
			case "O":
			case "D":
			case "E":
			case "M":
			case "P":
			case "C":
			case "B":
			case "A":
			case "F":
			case "H":
			case "1":
			$answers = getAnswersSingle($surveyid, $gid, $qid);
			break;
			case "W":
			case "Z":
			$thisquestion=getQuestionInfo($qid);
			$answers=getLabelSet($thisquestion['lid']);
			break;
			case "Y":
			$answers[]=array("code"=>"Y", "answer"=>$clang->gT("Yes"));
			$answers[]=array("code"=>"N", "answer"=>$clang->gT("No"));
			break;
			case "G":
			$answers[]=array("code"=>"M", "answer"=>$clang->gT("Male"));
			$answers[]=array("code"=>"F", "answer"=>$clang->gT("Female"));
			break;
		} // switch
		$answers[]=array("code"=>"", "answer"=>$clang->gT("No answer"));
		$answers[]=array("code"=>"-oth-", "answer"=>$clang->gT("Other"));

		switch($questiontype) {
			case "A":
			for ($i=1; $i <= 5; $i++) {
				$values[]=array("code"=>$i, "answer"=>$i);
			}
			break;
			case "B":
			for ($i=1; $i<=10; $i++) {
				$values[]=array("code"=>$i, "answer"=>$i);
			}
			break;
			case "E":
			$values[]=array("code"=>"I", "answer"=>$clang->gT("Increase"));
			$values[]=array("code"=>"S", "answer"=>$clang->gT("Same"));
			$values[]=array("code"=>"D", "answer"=>$clang->gT("Decrease"));
			break;
			case "C":
			case "M":
			case "P":
			$values[]=array("code"=>"Y", "answer"=>$clang->gT("Yes"));
			$values[]=array("code"=>"U", "answer"=>$clang->gT("Uncertain"));
			$values[]=array("code"=>"N", "answer"=>$clang->gT("No"));
			break;
			case "F":
			case "H":
			$thisquestion=getQuestionInfo($qid);
			$values = getLabelSet($thisquestion['lid']);
			break;
		}
		$values[]=array("code"=>"", "answer"=>$clang->gT("No answer"));

		switch($questiontype) {
			case "L":
			case "!":
			case "O":
			case "Y":
			case "G":
			case "S":
			case "T":
			case "H":
			case "N":
			case "5":
			case "D":
			case "W":
			case "Z":
			//The first key needs to be expanded
			$firstkey=array_keys($results[0]);
			$firstkey=$firstkey[0];
			$questions=arraySearchByKey($firstkey, $fieldmap, "fieldname", 1);
			//echo $firstkey;
			$i=0;
			foreach($results as $result) {
				$results[$i][$firstkey]=array($questions['question'], arraySubstitute($result[$firstkey], $answers));
				$i++;
			}
			break;
			case "A":
			case "B":
			case "C":
			case "E":
			case "F":
			case "H":
			case "M":
			case "P":
			case "Q":
			case "1":
			$i=0;
			foreach($results as $result) {
				foreach($result as $key=>$val) {
					$questions=arraySearchByKey($key, $fieldmap, "fieldname", 1);
					if (substr($key, -7, 7) != "comment") {
						$code=substr($key, strlen($surveyid."X".$gid."X".$qid), strlen($key)-strlen($surveyid."X".$gid."X".$qid));
						//echo $code;
						$results[$i][$key]=array($questions['question'], arraySubstitute($val, $values));
					}
				}
				$i++;
			}
			break;
		} // switch
	}
	return $results;
}

function buildSqlFromFieldnamesArray($fieldnamesarray) {
	//Expects an array like this: "1x2x3"=>"FL"
	//and builds SQL "where" statement out of it (without the "WHERE" at the front)
	if (count($fieldnamesarray)) {
		foreach ($fieldnamesarray as $key=>$val) {
			if ($val == "{NULL}") {
				$sql[] = "$key IS NULL";
			} else {
				$sql[] = "$key = '$val'";
			}
		}
		if (count($sql) > 1) {
			return implode(" AND\n", $sql);
		} else {
			return $sql[0];
		}
	}
}

function buildQuestionFields($surveyid, $qid) {
	//Takes a specific question, and returns an array containing
	//all the possible fieldnames for responses to that question
	$fieldmap=createFieldMap($surveyid);
	foreach ($fieldmap as $fields) {
		if ($fields['sid'] == $surveyid && $fields['qid'] == $qid && $fields['aid'] != "comment") {
			$questionfields[]=$fields['fieldname'];
		}
	}
	if (!empty($questionfields)) {
		return $questionfields;
	} else {
		return array("id");
	}
}

function returnQuestionResults($surveyid, $questionfields, $sql=null) {
	global $connect;
	//Returns uninterpreted raw results from survey table for question(s)
	//$table = survcey table name (ie: "survey_1")
	//$questionfields should contain an array of the question fields that are being returned
	//$sql is any additional "filtering" sql code
	$details=array();
	$output=array();
	foreach($questionfields as $questionfield) {
		$detailsarray=arraySearchByKey($questionfield, createFieldMap($surveyid), "fieldname");
		foreach ($detailsarray as $dt) {
			$details[]=$dt;
		}
	}
	$table="survey_".$surveyid;

	if (count($questionfields) > 1) {
		$selects = "`".implode("`, `", $questionfields)."`";
	} else {
		$selects = "`".$questionfields[0]."`";
	}
	$query = "SELECT $selects
			  FROM $table";
	if (!empty($sql)) {
		$query .= "\nWHERE $sql";
	}
	$result = db_execute_assoc($query) or safe_diee("error getting results in returnQuestionResults<br />$query<br />".$connect->ErrorMsg());
	while($row=$result->FetchRow()) {
		$output[]=$row;
	} // while
	return array($details, $output);
}

function getAnswersSingle($surveyid, $gid, $qid) {
	global $dbprefix, $connect;
	$query = "SELECT *
			  FROM ".db_table_name("answers")."
			  WHERE qid=$qid
			  ORDER BY sortorder, answer";
	$result = db_execute_assoc($query);
	while($row = $result->FetchRow()) {
		$answer[]=array("code"=>$row['code'],
		"answer"=>$row['answer']);
	} // while
	return $answer;
}

function getLabelSet($lid) {
	global $dbprefix, $connect;
	$query = "SELECT *
			  FROM ".db_table_name("labels")."
			  WHERE lid=$lid
			  ORDER BY sortorder";
	$result = db_execute_assoc($query) or safe_die($connect->ErrorMsg());
	while($row = $result->FetchRow()) {
		if ($row['title'] <> '')
		{
			$answer[]=array("code"=>$row['code'],
			"answer"=>$row['title']);
		}
	} // while
	return $answer;
}

function arraySubstitute($value, $substitutes) {
	foreach ($substitutes as $sub) {
		if ($value == $sub['code']) {
			return $sub['answer'];
		}
	}
	return $value;
}
?>
