<?php

// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

/**
 * jjg7:8/9/2004
 *
 * @package    mod
 * @subpackage lesson
 * @copyright  1999 onwards Martin Dougiamas  {@link http://moodle.com}
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or late
 **/

defined('MOODLE_INTERNAL') || die();

function removedoublecr($filename) {
// This function will adjust a file in roughly Aiken style by replacing extra newlines with <br/> tags
// so that instructors can have newlines wherever they like as long as the overall format is in Aiken

    $filearray = file($filename);
    /// Check for Macintosh OS line returns (ie file on one line), and fix
    if (preg_match("/\r/", $filearray[0]) AND !preg_match("/\n/", $filearray[0])) {
        $outfile = explode("\r", $filearray[0]);
    } else {
        $outfile = $filearray;
    }

    $outarray = array();

    foreach ($outfile as $line) {
        // remove leading and trailing whitespace
        trim($line);
        // check it's length, if 0 do not output... if it is > 0 output
        if ($line[0] == "\n" OR strlen($line)==0 ) {
            if (count($outarray) ) {
                // get the last item in the outarray
                $cur_pos = (count($outarray) - 1);
                $outarray[$cur_pos] = trim($outarray[$cur_pos])."<br/>\n";
            }
        }
        else {
            $length=strlen($line);
            if ($length==0) {
                // don't do anything
            }
            else {
                if ($line[$length-1] == "\n") {
                    $outarray[] = $line;
                }
                else {
                    $outarray[] = $line."\n";
                }
            }
        }
    }
    // output modified file to original
    if ( is_writable($filename) ) {

        if (! $handle =fopen ($filename ,'w' )) {
            echo "Cannot open file ($filename)" ;
            exit;
        }
        foreach ($outarray as $outline) {
            fwrite($handle, $outline);
        }
        fclose($handle);
    }
    else {
        // file not writeable
    }
}

// jjg7:8/9/2004
function importmodifiedaikenstyle($filename) {
// This function converts from Brusca style to Aiken
    $lines = file($filename);
    $answer_found = 0;
    $responses = 0;
    $outlines = array();
    foreach ($lines as $line) {
        // strip leading and trailing whitespace
        $line = trim($line);
        // add a space at the end, quick hack to make sure words from different lines don't run together
        $line = $line. ' ';

        // ignore lines less than 2 characters
        if (strlen($line) < 2) {
            continue;
        }


        // see if we have the answer line
        if ($line[0] =='*') {
            if ($line[0] == '*') {
                $answer_found = 1;
                $line[0]="\t";
                $line = ltrim($line);
                $answer = $line[0];
            }
        }

        $leadin = substr($line, 0,2);
        if (strpos(".A)B)C)D)E)F)G)H)I)J)a)b)c)d)e)f)g)h)i)j)A.B.C.D.E.F.G.H.I.J.a.b.c.d.e.f.g.h.i.j.", $leadin)>0) {

            // re-add newline to indicate end of previous question/response
            if (count($outlines)) {
                $cur_pos = (count($outlines) - 1);
                $outlines[$cur_pos] = $outlines[$cur_pos]."\n";
            }


            $responses = 1;
            // make character uppercase
            $line[0]=strtoupper($line[0]);

            // make entry followed by '.'
            $line[1]='.';
        }
        elseif ( ($responses AND $answer_found) OR (count($outlines)<=1) ) {
        // we have found responses and an answer and the current line is not an answer
            switch ($line[0]) {
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                case 9:

                    // re-add newline to indicate end of previous question/response
                    if (count($outlines)) {
                        $cur_pos = (count($outlines) - 1);
                        $outlines[$cur_pos] = $outlines[$cur_pos]."\n";
                    }

                    // this next ugly block is to strip out the numbers at the beginning
                    $np = 0;
                    // this probably could be done cleaner... it escapes me at the moment
                    while ($line[$np] == '0' OR $line[$np] == '1' OR $line[$np] == '2'
                            OR $line[$np] == '3' OR $line[$np] == '4'  OR $line[$np] == '5'
                            OR $line[$np] == '6'  OR $line[$np] == '7' OR $line[$np] == '8'
                            OR $line[$np] == '9' ) {
                        $np++;
                    }
                    // grab everything after '###.'
                    $line = substr($line, $np+1, strlen($line));

                    if ($responses AND $answer_found) {
                        $responses = 0;
                        $answer_found = 0;
                        $answer = strtoupper($answer);
                        $outlines[] = "ANSWER: $answer\n\n";
                    }
                    break;
            }
        }
        if (substr($line, 0, 14) == 'ANSWER CHOICES') {
            // don't output this line
        }
        else {
            $outlines[]=$line;
        }
    } // close for each line

    // re-add newline to indicate end of previous question/response
    if (count($outlines)) {
        $cur_pos = (count($outlines) - 1);
        $outlines[$cur_pos] = $outlines[$cur_pos]."\n";
    }

    // output the last answer
    $answer = strtoupper($answer);
    $outlines[] = "ANSWER: $answer\n\n";

    // output modified file to original
    if ( is_writable($filename) ) {
        if (! $handle =fopen ($filename ,'w' )) {
            echo "Cannot open file ($filename)" ;
            exit;
        }
        foreach ($outlines as $outline) {
            fwrite($handle, $outline);
        }
        fclose($handle);
        return true;
    }
    else {
        return false;
    }
}

