<?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/>.
/**
 * @package    backup-convert
 * @copyright  2011 Darko Miletic <dmiletic@moodlerooms.com>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

require_once 'cc_general.php';

class page11_resurce_file extends general_cc_file {
    protected $rootns = 'xmlns';
    protected $rootname = 'html';
    protected $ccnamespaces = array('xmlns' => 'http://www.w3.org/1999/xhtml');

    protected $content = null;
    protected $title = null;
    protected $intro = null;

    public function set_content($value) {
        $this->content = $value;
    }

    public function set_title($value) {
        $this->title = $value;
    }

    public function set_intro($value) {
        $this->intro = htmlspecialchars(strip_tags($value), ENT_COMPAT, 'UTF-8', false);
    }

    protected function on_create() {
        $impl = new DOMImplementation();
        $dtd  = $impl->createDocumentType( 'html',
                                           '-//W3C//DTD XHTML 1.0 Strict//EN',
                                           'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd');
        $doc = $impl->createDocument($this->ccnamespaces[$this->rootns], null, $dtd);
        $doc->formatOutput = true;
        $doc->preserveWhiteSpace = true;
        $this->doc = $doc;
        parent::on_create();
    }

    public function on_save() {

        $rns = $this->ccnamespaces[$this->rootns];
        //Add the basic tags
        $head = $this->append_new_element_ns($this->root, $rns, 'head');
        $this->append_new_attribute_ns($head, $rns, 'profile', 'http://dublincore.org/documents/dc-html/');

        //Linking Dublin Core Metadata 1.1
        $link_dc = $this->append_new_element_ns($head, $rns, 'link');
        $this->append_new_attribute_ns($link_dc, $rns, 'rel', 'schema.DC');
        $this->append_new_attribute_ns($link_dc, $rns, 'href', 'http://purl.org/dc/elements/1.1/');
        $link_dcterms = $this->append_new_element_ns($head, $rns, 'link');
        $this->append_new_attribute_ns($link_dcterms, $rns, 'rel', 'schema.DCTERMS');
        $this->append_new_attribute_ns($link_dcterms, $rns, 'href', 'http://purl.org/dc/terms/');
        //Content type
        $meta_type = $this->append_new_element_ns($head, $rns, 'meta');
        $this->append_new_attribute_ns($meta_type, $rns, 'name'   , 'DC.type'         );
        $this->append_new_attribute_ns($meta_type, $rns, 'scheme' , 'DCTERMS.DCMIType');
        $this->append_new_attribute_ns($meta_type, $rns, 'content', 'Text'            );

        //Content description
        if (!empty($this->intro)) {
            $meta_description = $this->append_new_element_ns($head, $rns     , 'meta'          );
            $this->append_new_attribute_ns($meta_description, $rns, 'name'   , 'DC.description');
            $this->append_new_attribute_ns($meta_description, $rns, 'content', $this->intro    );
        }

        $meta = $this->append_new_element_ns($head, $rns, 'meta');
        $this->append_new_attribute_ns($meta, $rns, 'http-equiv', 'Content-type');
        $this->append_new_attribute_ns($meta, $rns, 'content', 'text/html; charset=UTF-8');
        //set the title
        $title = $this->append_new_element_ns($head, $rns, 'title', $this->title);
        $body = $this->append_new_element_ns($this->root, $rns, 'body');
        //We are unable to use DOM for embedding HTML due to numerous content errors
        //Therefore we place a dummy tag that will be later replaced with the real content
        $this->append_new_element_ns($body, $rns, 'div', '##REPLACE##');

        return true;
    }

    public function saveTo($fname) {
        $result = $this->on_save();
        if ($result) {
            $dret = str_replace('<?xml version="1.0"?>'."\n", '', $this->viewXML());
            $dret = str_replace('<div>##REPLACE##</div>', $this->content, $dret);
            $result = (file_put_contents($fname, $dret) !== false);
            if ($result) {
                $this->filename = $fname;
                $this->processPath();
            }
        }
        return $result;
    }
}