diff --git a/phpgwapi/inc/class.html.inc.php b/phpgwapi/inc/class.html.inc.php index 9da62d4ec3..90360ce020 100644 --- a/phpgwapi/inc/class.html.inc.php +++ b/phpgwapi/inc/class.html.inc.php @@ -1,529 +1,566 @@ * - * -------------------------------------------- * - * This program 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 2 of the License, or (at your * - * option) any later version. * - \**************************************************************************/ + /**************************************************************************\ + * eGroupWare - HTML creation class * + * http://www.eGroupWare.org * + * Written and (c) by Ralf Becker * + * -------------------------------------------- * + * This program 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 2 of the License, or (at your * + * option) any later version. * + \**************************************************************************/ - /* $Id$ */ + /* $Id$ */ - class html - { - var $user_agent,$ua_version; // 'mozilla','msie','konqueror' - var $prefered_img_title; - var $charset,$phpgwapi_js_url; + class html + { + var $user_agent,$ua_version; // 'mozilla','msie','konqueror' + var $prefered_img_title; + var $charset,$phpgwapi_js_url; - function html() - { - // should be Ok for all HTML 4 compatible browsers - if (!eregi('compatible; ([a-z_]+)[/ ]+([0-9.]+)',$_SERVER['HTTP_USER_AGENT'],$parts)) + function html() + { + // should be Ok for all HTML 4 compatible browsers + if (!eregi('compatible; ([a-z_]+)[/ ]+([0-9.]+)',$_SERVER['HTTP_USER_AGENT'],$parts)) + { + eregi('^([a-z_]+)/([0-9.]+)',$_SERVER['HTTP_USER_AGENT'],$parts); + } + list(,$this->user_agent,$this->ua_version) = $parts; + $this->user_agent = strtolower($this->user_agent); + + $this->netscape4 = $this->user_agent == 'mozilla' && $this->ua_version < 5; + $this->prefered_img_title = $this->netscape4 ? 'alt' : 'title'; + //echo "

HTTP_USER_AGENT='$_SERVER[HTTP_USER_AGENT]', UserAgent: '$this->user_agent', Version: '$this->ua_version', img_title: '$this->prefered_img_title'

\n"; + + if ($GLOBALS['phpgw']->translation) + { + $this->charset = $GLOBALS['phpgw']->translation->charset(); + } + $this->phpgwapi_js_url = $GLOBALS['phpgw_info']['server']['webserver_url'].'/phpgwapi/js'; + } + + function activate_links($content) + { + // Exclude everything which is already a link + $NotAnchor = '(?\\1 AT \\2 DOT \\3', + $content); + + // First match things beginning with http:// (or other protocols) + $Protocol = '(http|ftp|https):\/\/'; + $Domain = '([\w]+.[\w]+)'; + $Subdir = '([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?'; + $Expr = '/' . $NotAnchor . $Protocol . $Domain . $Subdir . '/i'; + + $result = preg_replace( $Expr, "$2$3", $result ); + + // Now match things beginning with www. + $NotHTTP = '(?$0", $result ); + } + + function htmlspecialchars($str) + { + // add @ by lkneschke to supress warning about unknown charset + return @htmlspecialchars($str,ENT_COMPAT,$this->charset); + } + + /*! + @function select + @abstract allows to show and select one item from an array + @param $name string with name of the submitted var which holds the key of the selected item form array + @param $key key(s) of already selected item(s) from $arr, eg. '1' or '1,2' or array with keys + @param $arr array with items to select, eg. $arr = array ( 'y' => 'yes','n' => 'no','m' => 'maybe'); + @param $no_lang if !$no_lang send items through lang() + @param $options additional options (e.g. 'width') + @param $multiple number of lines for a multiselect, default 0 = no multiselect + @returns string to set for a template or to echo into html page + */ + function select($name, $key, $arr=0,$no_lang=0,$options='',$multiple=0) + { + // should be in class common.sbox + if (!is_array($arr)) + { + $arr = array('no','yes'); + } + if ((int)$multiple > 0) + { + $options .= ' multiple size="'.(int)$multiple.'"'; + if (substr($name,-2) != '[]') { - eregi('^([a-z_]+)/([0-9.]+)',$_SERVER['HTTP_USER_AGENT'],$parts); + $name .= '[]'; } - list(,$this->user_agent,$this->ua_version) = $parts; - $this->user_agent = strtolower($this->user_agent); - - $this->netscape4 = $this->user_agent == 'mozilla' && $this->ua_version < 5; - $this->prefered_img_title = $this->netscape4 ? 'alt' : 'title'; - //echo "

HTTP_USER_AGENT='$_SERVER[HTTP_USER_AGENT]', UserAgent: '$this->user_agent', Version: '$this->ua_version', img_title: '$this->prefered_img_title'

\n"; - - if ($GLOBALS['phpgw']->translation) - { - $this->charset = $GLOBALS['phpgw']->translation->charset(); - } - $this->phpgwapi_js_url = $GLOBALS['phpgw_info']['server']['webserver_url'].'/phpgwapi/js'; - } - - function activate_links($content) - { - // Exclude everything which is already a link - $NotAnchor = '(?\\1 AT \\2 DOT \\3', - $content); - - // First match things beginning with http:// (or other protocols) - $Protocol = '(http|ftp|https):\/\/'; - $Domain = '([\w]+.[\w]+)'; - $Subdir = '([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?'; - $Expr = '/' . $NotAnchor . $Protocol . $Domain . $Subdir . '/i'; - - $result = preg_replace( $Expr, "$2$3", $result ); - - // Now match things beginning with www. - $NotHTTP = '(?$0", $result ); - } - - function htmlspecialchars($str) - { - // add @ by lkneschke to supress warning about unknown charset - return @htmlspecialchars($str,ENT_COMPAT,$this->charset); - } - - /*! - @function select - @abstract allows to show and select one item from an array - @param $name string with name of the submitted var which holds the key of the selected item form array - @param $key key(s) of already selected item(s) from $arr, eg. '1' or '1,2' or array with keys - @param $arr array with items to select, eg. $arr = array ( 'y' => 'yes','n' => 'no','m' => 'maybe'); - @param $no_lang if !$no_lang send items through lang() - @param $options additional options (e.g. 'width') - @param $multiple number of lines for a multiselect, default 0 = no multiselect - @returns string to set for a template or to echo into html page - */ - function select($name, $key, $arr=0,$no_lang=0,$options='',$multiple=0) - { - // should be in class common.sbox - if (!is_array($arr)) - { - $arr = array('no','yes'); - } - if ((int)$multiple > 0) - { - $options .= ' multiple size="'.(int)$multiple.'"'; - if (substr($name,-2) != '[]') - { - $name .= '[]'; - } - } - $out = "\n"; if (is_array($key)) { - $key = implode(',',$key); + $key = implode(',',$key); } foreach($arr as $k => $text) { - $out .= '\n"; + if("$k" == "$key" || strstr(",$key,",",$k,")) + { + $out .= ' selected="1"'; + } + $out .= ">" . ($no_lang || $text == '' ? $text : lang($text)) . "\n"; } $out .= "\n"; - return $out; - } + return $out; + } - function div($content,$options='') - { - return "
\n$content
\n"; - } + function div($content,$options='') + { + return "
\n$content
\n"; + } - function input_hidden($vars,$value='',$ignore_empty=True) - { - if (!is_array($vars)) + function input_hidden($vars,$value='',$ignore_empty=True) + { + if (!is_array($vars)) + { + $vars = array( $vars => $value ); + } + foreach($vars as $name => $value) + { + if (is_array($value)) { - $vars = array( $vars => $value ); + $value = serialize($value); } - foreach($vars as $name => $value) + if (!$ignore_empty || $value && !($name == 'filter' && $value == 'none')) // dont need to send all the empty vars { - if (is_array($value)) - { - $value = serialize($value); - } - if (!$ignore_empty || $value && !($name == 'filter' && $value == 'none')) // dont need to send all the empty vars - { - $html .= "htmlspecialchars($value)."\" />\n"; - } + $html .= "htmlspecialchars($value)."\" />\n"; } - return $html; - } + } + return $html; + } - function textarea($name,$value='',$options='' ) - { - return "\n"; - } + function textarea($name,$value='',$options='' ) + { + return "\n"; + } - /*! - @function htmlarea_avalible - @author ralfbecker - @abstract Checks if HTMLarea (or an other richtext editor) is availible for the used browser - */ - function htmlarea_availible() - { - switch($this->user_agent) + /*! + @function htmlarea_avalible + @author ralfbecker + @abstract Checks if HTMLarea (or an other richtext editor) is availible for the used browser + */ + function htmlarea_availible() + { + switch($this->user_agent) + { + case 'msie': + return $this->ua_version >= 5.5; + case 'mozilla': + return $this->ua_version >= 1.3; + default: + return False; + } + } + + /*! + @function htmlarea + @syntax htmlarea( $name,$content='',$style='width:100%; min-width:500px; height:300px;' ) + @author ralfbecker + @abstract creates a textarea inputfield for the htmlarea js-widget (returns the necessary html and js) + @param $name string name and id of the input-field + @param $content string of the htmlarea (will be run through htmlspecialchars !!!), default '' + @param $style string inline styles, eg. dimension of textarea element + @param $base_href string set a base href to get relative image-pathes working + @param $plugins string plugins to load seperated by comma's, eg 'TableOperations,ContextMenu' (htmlarea breaks when a plugin calls a nonexisiting lang file) + */ + function htmlarea($name,$content='',$style='',$base_href='',$plugins='') + { + if (!$style) $style = 'width:100%; min-width:500px; height:300px;'; + + if (!is_object($GLOBALS['phpgw']->js)) + { + $GLOBALS['phpgw']->js = CreateObject('phpgwapi.javascript'); + } + if (!strstr($GLOBALS['phpgw_info']['flags']['java_script'],'htmlarea')) + { + $GLOBALS['phpgw']->js->validate_file('htmlarea','htmlarea'); + $GLOBALS['phpgw']->js->validate_file('htmlarea','dialog'); + $lang = $GLOBALS['phpgw_info']['user']['preferences']['common']['lang']; + if ($lang == 'en') // other lang-files are utf-8 only and incomplete (crashes htmlarea as of 3.0beta) { - case 'msie': - return $this->ua_version >= 5.5; - case 'mozilla': - return $this->ua_version >= 1.3; - default: - return False; - } - } - - /*! - @function htmlarea - @syntax htmlarea( $name,$content='',$style='width:100%; min-width:500px; height:300px;' ) - @author ralfbecker - @abstract creates a textarea inputfield for the htmlarea js-widget (returns the necessary html and js) - @param $name string name and id of the input-field - @param $content string of the htmlarea (will be run through htmlspecialchars !!!), default '' - @param $style string inline styles, eg. dimension of textarea element - */ - function htmlarea($name,$content='',$style='',$base_href='') - { - if (!$style) $style = 'width:100%; min-width:500px; height:300px;'; - - if (!is_object($GLOBALS['phpgw']->js)) - { - $GLOBALS['phpgw']->js = CreateObject('phpgwapi.javascript'); - } - if (!strstr($GLOBALS['phpgw_info']['flags']['java_script'],'htmlarea')) - { - $GLOBALS['phpgw']->js->validate_file('htmlarea','htmlarea'); - $GLOBALS['phpgw']->js->validate_file('htmlarea','dialog'); - $lang = $GLOBALS['phpgw_info']['user']['preferences']['common']['lang']; - if ($lang == 'en') // other lang-files are utf-8 only and incomplete (crashes htmlarea as of 3.0beta) - { - $GLOBALS['phpgw']->js->validate_file('htmlarea',"lang/$lang"); - } - else - { - $GLOBALS['phpgw_info']['flags']['java_script'] .= - ''."\n"; - } - - $GLOBALS['phpgw_info']['flags']['java_script_thirst'] .= - ' - \n"; - - // set a base href to get relative image-pathes working - if ($base_href && $this->user_agent != 'msie') // HTMLarea does not work in IE with base href set !!! - { - $GLOBALS['phpgw_info']['flags']['java_script_thirst'] .= ''."\n"; - } - $GLOBALS['phpgw_info']['flags']['java_script'] .= - '\n"; - } - $id = str_replace(array('[',']'),array('_',''),$name); // no brakets in the id allowed by js - - $GLOBALS['phpgw']->js->set_onload("HTMLArea.replace('$id',htmlareaConfig);"); - - if (!empty($style)) $style = " style=\"$style\""; - - return "\n"; - } - - function input($name,$value='',$type='',$options='' ) - { - if ($type) - { - $type = 'type="'.$type.'"'; - } - return "htmlspecialchars($value)."\" $options />\n"; - } - - function submit_button($name,$lang,$onClick='',$no_lang=0,$options='',$image='',$app='') - { - // workaround for idots and IE button problem (wrong cursor-image) - $options .= ' style="cursor: hand;"'; - - if ($image != '') - { - $image = str_replace(array('.gif','.GIF','.png','.PNG'),'',$image); - - if (!($path = $GLOBALS['phpgw']->common->image($app,$image))) - { - $path = $image; // name may already contain absolut path - } - $image = ' src="'.$path.'"'; - } - if (!$no_lang) - { - $lang = lang($lang); - } - if (($accesskey = strstr($lang,'&')) && $accesskey[1] != ' ' && - (($pos = strpos($accesskey,';')) === False || $pos > 5)) - { - $lang_u = str_replace('&'.$accesskey[1],''.$accesskey[1].'',$lang); - $lang = str_replace('&','',$lang); - $options = 'accesskey="'.$accesskey[1].'" '.$options; + $GLOBALS['phpgw']->js->validate_file('htmlarea',"lang/$lang"); } else { - $accesskey = ''; - $lang_u = $lang; + $GLOBALS['phpgw_info']['flags']['java_script'] .= + ''."\n"; } - if ($onClick) $options .= " onclick=\"$onClick\""; - // '; - } + ($image != '' ? "prefered_img_title=\"$lang\"> " : ''). + ($image == '' || $accesskey ? $lang_u : '').''; + } - /*! - @function link - @abstract creates an absolut link + the query / get-variables - @param $url phpgw-relative link, may include query / get-vars - @parm $vars query or array ('name' => 'value', ...) with query - @example link('/index.php?menuaction=infolog.uiinfolog.get_list',array('info_id' => 123)) - @example = 'http://domain/phpgw-path/index.php?menuaction=infolog.uiinfolog.get_list&info_id=123' - @result absolut link already run through $phpgw->link - */ - function link($url,$vars='') - { + /*! + @function link + @abstract creates an absolut link + the query / get-variables + @param $url phpgw-relative link, may include query / get-vars + @parm $vars query or array ('name' => 'value', ...) with query + @example link('/index.php?menuaction=infolog.uiinfolog.get_list',array('info_id' => 123)) + @example = 'http://domain/phpgw-path/index.php?menuaction=infolog.uiinfolog.get_list&info_id=123' + @result absolut link already run through $phpgw->link + */ + function link($url,$vars='') + { //echo "

html::link(url='$url',vars='"; print_r($vars); echo "')

\n"; if (!is_array($vars)) { - parse_str($vars,$vars); + parse_str($vars,$vars); } list($url,$v) = explode('?',$url); // url may contain additional vars if ($v) { - parse_str($v,$v); - $vars += $v; + parse_str($v,$v); + $vars += $v; } return $GLOBALS['phpgw']->link($url,$vars); - } + } - function checkbox($name,$value='') - { + function checkbox($name,$value='') + { return "\n"; - } + } - function form($content,$hidden_vars,$url,$url_vars='',$name='',$options='',$method='POST') - { + function form($content,$hidden_vars,$url,$url_vars='',$name='',$options='',$method='POST') + { $html = "
link($url,$url_vars)."\" $options>\n"; - $html .= $this->input_hidden($hidden_vars); + $html .= $this->input_hidden($hidden_vars); - if ($content) - { - $html .= $content; - $html .= "
\n"; + if ($content) + { + $html .= $content; + $html .= "\n"; } return $html; - } + } - function form_1button($name,$lang,$hidden_vars,$url,$url_vars='',$form_name='',$method='POST') - { + function form_1button($name,$lang,$hidden_vars,$url,$url_vars='',$form_name='',$method='POST') + { return $this->form($this->submit_button($name,$lang),$hidden_vars,$url,$url_vars,$form_name,'',$method); - } + } - /*! - @function table - @abstracts creates table from array with rows - @discussion abstract the html stuff - @param $rows array with rows, each row is an array of the cols - @param $options options for the table-tag - @example $rows = array ( '1' => array( 1 => 'cell1', '.1' => 'colspan=3', - @example 2 => 'cell2', 3 => 'cell3', '.3' => 'width="10%"' ), - @example '.1' => 'BGCOLOR="#0000FF"' ); - @example table($rows,'WIDTH="100%"') = '
cell1cell2cell3
' - @result string with html-code of the table - */ - function table($rows,$options = '',$no_table_tr=False) - { + /*! + @function table + @abstracts creates table from array with rows + @discussion abstract the html stuff + @param $rows array with rows, each row is an array of the cols + @param $options options for the table-tag + @example $rows = array ( '1' => array( 1 => 'cell1', '.1' => 'colspan=3', + @example 2 => 'cell2', 3 => 'cell3', '.3' => 'width="10%"' ), + @example '.1' => 'BGCOLOR="#0000FF"' ); + @example table($rows,'WIDTH="100%"') = '
cell1cell2cell3
' + @result string with html-code of the table + */ + function table($rows,$options = '',$no_table_tr=False) + { $html = $no_table_tr ? '' : "\n"; - foreach($rows as $key => $row) - { - if (!is_array($row)) - { - continue; // parameter - } - $html .= $no_table_tr && $key == 1 ? '' : "\t\n"; + foreach($rows as $key => $row) + { + if (!is_array($row)) + { + continue; // parameter + } + $html .= $no_table_tr && $key == 1 ? '' : "\t\n"; - foreach($row as $key => $cell) - { - if ($key[0] == '.') - { - continue; // parameter - } - $table_pos = strpos($cell,'$cell\n"; - } - } - $html .= "\t\n"; - } - $html .= "
\n"; + foreach($row as $key => $cell) + { + if ($key[0] == '.') + { + continue; // parameter + } + $table_pos = strpos($cell,'$cell\n"; + } + } + $html .= "\t\n"; + } + $html .= "\n"; - if ($no_table_tr) - { - $html = substr($html,0,-16); - } - return $html; - } + if ($no_table_tr) + { + $html = substr($html,0,-16); + } + return $html; + } - function sbox_submit( $sbox,$no_script=0 ) - { - $html = str_replace('submit_button('send','>').''; - } - return $html; - } + function sbox_submit( $sbox,$no_script=0 ) + { + $html = str_replace('submit_button('send','>').''; + } + return $html; + } - function progressbar( $percent,$title='',$options='',$width='',$color='',$height='' ) - { - $percent = (int) $percent; - if (!$width) $width = '30px'; - if (!$height)$height= '5px'; - if (!$color) $color = '#D00000'; - $title = $title ? $this->htmlspecialchars($title) : $percent.'%'; + function progressbar( $percent,$title='',$options='',$width='',$color='',$height='' ) + { + $percent = (int) $percent; + if (!$width) $width = '30px'; + if (!$height)$height= '5px'; + if (!$color) $color = '#D00000'; + $title = $title ? $this->htmlspecialchars($title) : $percent.'%'; - if ($this->netscape4) - { - return $title; - } - return '
'."\n\t". - '
'."\n
\n"; - } + if ($this->netscape4) + { + return $title; + } + return '
'."\n\t". + '
'."\n
\n"; + } - function image( $app,$name,$title='',$options='' ) - { - $name = str_replace(array('.gif','.GIF','.png','.PNG'),'',$name); + function image( $app,$name,$title='',$options='' ) + { + $name = str_replace(array('.gif','.GIF','.png','.PNG'),'',$name); - if (!($path = $GLOBALS['phpgw']->common->image($app,$name))) - { - $path = $name; // name may already contain absolut path - } - if (!@is_readable(str_replace($GLOBALS['phpgw_info']['server']['webserver_url'],PHPGW_SERVER_ROOT,$path))) - { - // if the image-name is a percentage, use a progressbar - if (substr($name,-1) == '%' && is_numeric($percent = substr($name,0,-1))) - { - return $this->progressbar($percent,$title); - } - return $title; - } - if ($title) - { - $options .= " $this->prefered_img_title=\"".$this->htmlspecialchars($title).'"'; - } - return ""; - } + if (!($path = $GLOBALS['phpgw']->common->image($app,$name))) + { + $path = $name; // name may already contain absolut path + } + if (!@is_readable(str_replace($GLOBALS['phpgw_info']['server']['webserver_url'],PHPGW_SERVER_ROOT,$path))) + { + // if the image-name is a percentage, use a progressbar + if (substr($name,-1) == '%' && is_numeric($percent = substr($name,0,-1))) + { + return $this->progressbar($percent,$title); + } + return $title; + } + if ($title) + { + $options .= " $this->prefered_img_title=\"".$this->htmlspecialchars($title).'"'; + } + return ""; + } - function a_href( $content,$url,$vars='',$options='') - { - if (!strstr($url,'/') && count(explode('.',$url)) == 3) - { - $url = "/index.php?menuaction=$url"; - } - if (is_array($url)) - { - $vars = $url; - $url = '/index.php'; - } - return ''.$content.''; - } + function a_href( $content,$url,$vars='',$options='') + { + if (!strstr($url,'/') && count(explode('.',$url)) == 3) + { + $url = "/index.php?menuaction=$url"; + } + if (is_array($url)) + { + $vars = $url; + $url = '/index.php'; + } + return ''.$content.''; + } - function bold($content) - { - return ''.$content.''; - } + function bold($content) + { + return ''.$content.''; + } - function italic($content) - { - return ''.$content.''; - } + function italic($content) + { + return ''.$content.''; + } - function hr($width,$options='') - { - if ($width) $options .= " width=\"$width\""; - return "
\n"; - } + function hr($width,$options='') + { + if ($width) $options .= " width=\"$width\""; + return "
\n"; + } - /*! - @function formatOptions - @abstract formats option-string for most of the above functions - @param $options String (or Array) with option-values eg. '100%,,1' - @param $names String (or Array) with the option-names eg. 'WIDTH,HEIGHT,BORDER' - @example formatOptions('100%,,1','WIDTH,HEIGHT,BORDER') = ' WIDTH="100%" BORDER="1"' - @result option string - */ - function formatOptions($options,$names) - { - if (!is_array($options)) $options = explode(',',$options); - if (!is_array($names)) $names = explode(',',$names); + /*! + @function formatOptions + @abstract formats option-string for most of the above functions + @param $options String (or Array) with option-values eg. '100%,,1' + @param $names String (or Array) with the option-names eg. 'WIDTH,HEIGHT,BORDER' + @example formatOptions('100%,,1','WIDTH,HEIGHT,BORDER') = ' WIDTH="100%" BORDER="1"' + @result option string + */ + function formatOptions($options,$names) + { + if (!is_array($options)) $options = explode(',',$options); + if (!is_array($names)) $names = explode(',',$names); - foreach($options as $n => $val) - { - if ($val != '' && $names[$n] != '') - { - $html .= ' '.strtolower($names[$n]).'="'.$val.'"'; - } - } - return $html; - } + foreach($options as $n => $val) + { + if ($val != '' && $names[$n] != '') + { + $html .= ' '.strtolower($names[$n]).'="'.$val.'"'; + } + } + return $html; + } - /*! - @function themeStyles - @abstract returns simple stylesheet (incl. " : ''; - } + function style($styles) + { + return $styles ? "" : ''; + } - function label($content,$id='',$accesskey='',$options='') - { - if ($id != '') - { - $id = " for=\"$id\""; - } - if ($accesskey != '') - { - $accesskey = " accesskey=\"$accesskey\""; - } - return "$content"; - } - } + function label($content,$id='',$accesskey='',$options='') + { + if ($id != '') + { + $id = " for=\"$id\""; + } + if ($accesskey != '') + { + $accesskey = " accesskey=\"$accesskey\""; + } + return "$content"; + } + }