<?php
/*
**	$Id$
**
**	ITools - the Internet Tools Library
**
**	Copyright (C) 1995-2003 by the ITools Authors.
**	This program is free software; you can redistribute it and/or
**	modify it under the terms of either the GNU General Public License
**	or the GNU Lesser General Public License, as published by the Free
**	Software Foundation. See http://www.gnu.org/licenses/ for details.
**
**      class it_html_page - Fairly generic HTML page Class
*/

class it_html_page
{
	/* Public read-only */
	var $title;			/* <title> of this page */
	var $doctype;			/* Document type, will be reasonably initialized */
	var $encoding;			/* If set, generate Content-Type HTTP/meta headers */

	var $url;			/* Site-relative URL of this page, without GET args */
	var $remote_host;		/* IP address of caller (can deal with most proxies) */

	/* Private */
	var $headers;			/* Header lines to output in <head> context */
	var $meta_headers = array();	/* <meta name=.. content=..> tags in <head> context */
	var $body_tags = array();	/* array of tags in <body statement */
	var $body_start = "";		/* This is output immediately after <body> */
	var $body_end = "";		/* Output immediately before </body> */
	var $head_sent = 0;		/* 1 if <head> area already sent to client */
	var $in_body = 0;		/* false=in header, true=in body */
	var $in_input_tr = 0;		/* For input_text() */



/**
 * Constructor
 * @param $tags optional array of key => value pairs: title, doctype, encoding
 */
function it_html_page($tags='')
{
	/* Set defaults */
	$this->doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">';

	/* Determine the relative URL of this page for self-reference */
	if (isset($_SERVER['SCRIPT_URL']))
		$this->url = $_SERVER['SCRIPT_URL'];
	else
	{
		list($this->url) = explode("?", $_SERVER['REQUEST_URI']);
		$this->url = substr(strrchr($this->url, "/"), 1);	/* $$$ what's this?? */
	}

	/* This is needed for POST requests to oneself */
	if ($this->url == "")
		$this->url = "./";

	/* Determine IP address of caller */
	if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && ereg('^([0-9.]{7,15})', $_SERVER['HTTP_X_FORWARDED_FOR'], $regs))
	        $this->remote_host = trim($regs[1]);
	else
        	$this->remote_host = $_SERVER['REMOTE_ADDR'];

	/* Is this a good idea? */
	$this->add_meta_header('generator', '$Id$');

	/* Override defaults with user tags */
	if (is_array($tags))
		foreach($tags as $key => $value)
			$this->$key = $value;

	if (isset($this->encoding))
	{
		$ct = 'text/html; charset='.$this->encoding;
		header('Content-Type: '.$ct);
		$this->add_header('<meta http-equiv="Content-Type" content="'.$ct.'">');
	}
}


/**
 * Set the title of the page
 */
function set_title($title)
{
	$this->title = $title;
}


/**
 * Add a line to the header area and trim it
 */
function add_header($header)
{
	$this->headers .= trim($header)."\n";
}


/**
 * Add a meta header.
 * If a header with the same name exists, overwrite it.
 */
function add_meta_header($name, $value)
{
	$this->meta_headers[strtolower($name)] = $value;
}


/**
 * Add a tag=value pair in <body context.
 * If a header with the same name exists, overwrite it.
 */
function add_body_tag($name, $value)
{
	$this->body_tags[strtolower($name)] = $value;
}


/**
 * Add a line to the body area after other lines that were added
 */
function add_body_start($html)
{
	$this->body_start .= $html;
}


/**
 * Add a line to the body end area before other lines that were added
 */
function add_body_end($html)
{
	$this->body_end = $html . $this->body_end;
}


/**
 * Write out HTML <head> section, if not already done.
 */
function head()
{
	/* This function can be called multiple times, no harm is done. */
	if (!$this->head_sent)
	{
		$lang = $this->language ? " lang='$this->language'" : "";

		if (!$GLOBALS['SENT_PREAMBLE']) /* RELOAD_MAGIC already sent <html><head> */
			echo $this->doctype, "\n<html$lang>\n<head>\n";

		# Generate title tag. If empty string, output <title></title> (html-required)
		if (isset($this->title))
			echo '<title>'.$this->title."</title>\n";

		echo $this->headers;

		while (list($name, $content) = each($this->meta_headers))
			echo "<meta name=\"$name\" content=\"$content\">\n"; 

		echo "</head>\n";
		$this->head_sent = 1;
	}
}


/**
 * Write out HTML <head> section and body start, if not already done.
 * @param ... If parameters are present, output them and call end()
 */
function body()
{
	/* Write out header part */
	$this->head();

	/* This function can be called multiple times, no harm is done. */
	if (!$this->in_body)
	{
		echo '<body';

		while (list($tag, $value) = each($this->body_tags))
			echo " $tag=\"$value\""; 

		echo ">\n".$this->body_start;
		$this->in_body = 1;

		if ($args = func_get_args())
		{
			foreach($args as $arg)
				echo $arg;
			$this->end();
		}
	}
}


/**
 * End a HTML page.
 */
function end()
{
	$this->head();

	if ($this->in_body)
	{
		echo $this->body_end."</body>\n";
		$this->in_body = 0;
	}

	echo "</html>\n";
}


} /* End class it_html_page */
?>