<?php
/*
    Mike's Citrus Cordial Calculator
    A self-contained helper script for making home-made cordial.    

    Copyright (C) 2010 Michael Billington <michael.billington@gmail.com>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>
*/

$fruit_perbatch 6;
$fruit_count    4;
$fruit_short     = array("orange",    "lemon",    "lime",        "grapefruit");
$fruit_plural     = array("Oranges",    "Lemons",    "Limes",    "Grapefruit");
$fruit_singular = array("Orange",    "Lemon",    "Lime",        "Grapefruit");
$fruit_colour     = array("#F90",        "#FF3",        "#9F3",        "#FF6");
$fruit_counts     = array(0,        0,        0,        0);

// Changes while calculating batch details
$fruit_temp     = array(0,        0,        0,        0);
$fruit_batchtotal=0;
$fruit_total;

// For listing ingredients:
$batch_count    =  0;
$acid_grams    =  0;
$sugar_cups    =  0;
$water_cups    =  0;
$acid_grams_add    28;
$sugar_cups_add    =  6;
$water_cups_add    =  8;

$filename basename($_SERVER["SCRIPT_NAME"]);

// Return an integer value for a parameter, or 0 if not set.
function getParam($id) {
    if (isset(
$_GET[$id])) {
        return (int)
$_GET[$id];
    } else {
        return 
0;        
    }
}

// Generates a drop-down box for a fruit.
function citrusOption($fruit_id,$fruit_name) {
    
$fruitNo=getParam($fruit_id); // How many of this fruit do we have?
    
echo("<tr class='tr-".$fruit_id."'>\n");
    echo(
"<td class='td-".$fruit_id."'>");
    echo(
$fruit_name.":");
    echo(
"</td><td class='td-".$fruit_id."'>\n");    
    echo(
"<select name='".$fruit_id."'>\n");
    for(
$i 0$i <= 25$i += 1) {
        if(
$i==$fruitNo) {
            echo(
"<option value='".$i."' selected='true'>".$i."</option>\n");
        } else {
            echo(
"<option value='".$i."'>".$i."</option>\n");
        }
    }
    echo(
"</select>\n</td>\n</tr>");
    return 
true;
}

// Make the fruit input table
function fruitSelector() {
    global 
$fruit_count,$fruit_short,$fruit_plural;
    echo 
"<table class='fruit-table'>\n";
    for(
$i 0$i $fruit_count$i += 1) {
        
citrusOption($fruit_short[$i],$fruit_plural[$i]);
    }
    echo 
"<tr>\n<td colspan='2'>";
    echo 
"<input type='submit' value='Calculate ingredients'></td>\n</tr>\n";
    echo 
"</table>";
    return 
true;
}

// Return true if there are still any fruit left
function batch_check() {
    global 
$fruit_count,$fruit_counts,$fruit_short,$fruit_total;
    
$fruit_total=0;
    
$success=false;
    for(
$i 0$i $fruit_count$i += 1) {
        
$fruit_counts[$i]=getParam($fruit_short[$i]);;
        
$fruit_total=$fruit_total+$fruit_counts[$i];
        if(
$fruit_counts[$i]>=1) {
            
$success=true;
        }
    }
    return 
$success;
}

// Set all $fruit_temp values to 0.
function batch_clear() {
    global 
$fruit_count,$fruit_temp,$fruit_batchtotal;
    for(
$i 0$i $fruit_count$i += 1) {
        
$fruit_temp[$i]=0;
    }
    
$fruit_batchtotal=0;
}

// Print batch info and clear batch
function batch_new() {
    global 
$fruit_singular,$fruit_plural;
    global 
$fruit_count,$fruit_temp,$batch_count;
    global 
$acid_grams,$sugar_cups,$water_cups;
    global 
$acid_grams_add,$sugar_cups_add,$water_cups_add;
    
$batch_count++;
    echo 
"<table>";
    echo 
"<tr>\n<td colspan='2'>\n";
    echo 
"<strong>Batch number ".$batch_count":</strong></td>\n</tr>\n";
    
    echo 
"<tr>\n<td>\n<ul>\n";
    
// Loop through the fruit for this batch
    
for($i 0$i $fruit_count$i += 1) {
        
$no=$fruit_temp[$i];
        
// Singular and plural entries need to be treated differently
        // Null entries are < 1, so will be filtered here.
        
if($no==1) {
            echo 
"<li>";
            echo(
$no." ".$fruit_singular[$i]);
            echo 
"</li>\n";
        } elseif (
$no 1) {
            echo 
"<li>";
            echo(
$no." ".$fruit_plural[$i]);
            echo 
"</li>\n";
        }
    }
    
// Keep up the calculations for the other 3 ingredients
    
$acid_grams $acid_grams $acid_grams_add;
    
$sugar_cups $sugar_cups $sugar_cups_add;
    
$water_cups $water_cups $water_cups_add;
    echo 
"</ul>\n</td>\n<td>\n<ul>\n";
    echo 
"<li>".$acid_grams_add."g Citric acid</li>\n";
    echo 
"<li>".$acid_grams_add."g Tartaric acid</li>\n";
    echo 
"<li>".$sugar_cups_add." cups sugar</li>\n";
    echo 
"<li>".$water_cups_add." cups boiling water</li>\n";
    echo 
"</ul>\n</td>\n</tr>\n</table>\n";
    
batch_clear();
}

// Print total non-fruit ingredient usage
function print_totals() {
    global 
$acid_grams,$sugar_cups,$water_cups;
    global 
$batch_count;
    echo 
"<table>";
    echo 
"<tr>\n<td><strong>Totals for non-fruit ingredients:</strong></td>\n</tr>\n";
    echo 
"<tr>\n";
    echo 
"<td>\n<ul>\n";
    echo 
"<li>".$acid_grams."g Citric acid</li>\n";
    echo 
"<li>".$acid_grams."g Tartaric acid</li>\n";
    
$sugar_kilograms = ($sugar_cups 200) / 1000;
    echo 
"<li>".$sugar_cups." cups sugar (approx ".$sugar_kilograms."kg)</li>\n";
    
$water_litres = ($water_cups 4);
    echo 
"<li>".$water_cups." cups boiling water (".$water_litres."L)</li>\n";
    echo 
"</ul>\n</td>\n</tr>\n</table>\n";
}

// Select fruit for each cordial batch
function batch_generate() {
    global 
$fruit_count,$fruit_temp,$fruit_counts,$fruit_perbatch;
    global 
$fruit_batchtotal,$fruit_singular,$fruit_plural,$fruit_total;
    global 
$batch_count;
    echo 
"<hr/>";
    
batch_clear();

    
$done=false;

    
// Keep making cordial until we run out of fruit
    
while (!$done) {
        for(
$i 0$i $fruit_count$i += 1) {    
            
$select=true;
            
            
// Ignore fruits we have run out of
            
if($fruit_counts[$i]<1) {
                
$select=false;
            }
            
            
// Decide if this fruit will be included
            
if(rand(1,$fruit_total) > $fruit_counts[$i]) {
                
$select=false;
            }
            
            if(
$select) {
                
// If selected, add it all up right.
                
$fruit_temp[$i]++;
                
$fruit_counts[$i]=$fruit_counts[$i]-1;
                
$fruit_batchtotal++;
                
$fruit_total=$fruit_total-1;
            }
            
// Finish the batch when we have enough fruit!
            
if($fruit_batchtotal==$fruit_perbatch) {
                
batch_new();
            }
        }
        
$done=true;
        for(
$i 0$i $fruit_count$i += 1) {
            if(
$fruit_counts[$i]>=1) { $done=false; }
        }
    }

    if(
$batch_count==0) {
        echo 
"<p><i>You need more fruit than that for one batch</i></p>";
    }

    echo 
"<hr/>";
    
// Print leftovers if applicable
    
    
if($fruit_batchtotal!=0) {
        echo 
"<table>";
        echo 
"<tr>\n<td><strong>Fruit which will not be used</strong><br/>\n";
        echo 
"<i><small>It takes ".$fruit_perbatch;
        echo 
" fruit to make a batch</i></small>\n";
        echo 
"</td>\n</tr>\n";
        echo 
"<tr>\n<td>\n<ul>\n";
    
        for(
$i 0$i $fruit_count$i += 1) {
            
$no=$fruit_temp[$i];
            if(
$no==1) {
                echo 
"<li>";
                echo(
$no." ".$fruit_singular[$i]);
                echo 
"</li>\n";
            } elseif (
$no 1) {
                echo 
"<li>";
                echo(
$no." ".$fruit_plural[$i]);
                echo 
"</li>\n";
            }
        }
        echo 
"</ul>\n</td>\n</tr>\n";
        echo 
"</table>";
    }

    
print_totals();
}

// Stylesheet to colour the fruit.
function fruitStylesheet() {
    global 
$fruit_count,$fruit_short,$fruit_colour;
    for(
$i 0$i $fruit_count$i += 1) {
        echo 
".td-".$fruit_short[$i].", ".".".$fruit_short[$i]." {\n";
        echo 
"background-color: ".$fruit_colour[$i].";\n";
        echo 
"}\n";
    }
    return 
true;
}

function 
print_header() {
    echo 
"<html>\n<head>\n";
    echo 
"<title>Mike's Citrus Cordial Calculator</title>\n";
    echo 
"<style type='text/css'>\n";
    echo 
"body { font-family: arial,sans-serif; }\n";
    echo 
"#base { align: right; }\n";
    
fruitStylesheet();
    echo 
"</style>\n";
    echo 
"</head>\n";
    echo 
"<body>\n";
    echo 
"<h2>Mike's Citrus Cordial Calculator</h2>\n";
}

function 
print_footer() {
    global 
$filename;
    echo 
"<hr />\n";
    echo 
"<div class='base' align='right'><small>";
    echo 
"Copyright &copy; 2010 Michael Billington<br/>";
    echo 
"Click <a href='".$filename."?view=1'>here</a> ";
    echo 
"to view the source code to this script</small></div>\n";
    echo 
"</body>\n";
    echo 
"</html>";
}

function 
showCalc() {
    
print_header();

    echo 
"<form name='citrus' action='citrus.php' method='get'>\n";
    
fruitSelector();
    echo 
"</form>\n";

    if(
batch_check()) {
        
batch_generate();
    }
    
    
print_footer();
}

// Display the contents of this file.
//  Hi viewer of this file! :) *waves*
function showSource() {
    global 
$filename;
    
$source file_get_contents($filename);
    
highlight_string($source);
}

// Switch between source code view (?view=1) and standard view
switch (getParam('view')) {
    case 
1:
        
showSource();
        break;
    default:
        
showCalc();
}

?>