<?php
/**
 * This file contain a class to easily build HTML forms as well as custom
 * functions used by SpecialUserrights.php and SpecialGroups.php
 * @package MediaWiki
 */

/**
 * Class to build various forms
 *
 * @package MediaWiki
 * @author jeluf, hashar
 */
class HTMLForm {
	/** name of our form. Used as prefix for labels */
	var $mName, $mRequest;

	function HTMLForm( &$request ) {
		$this->mRequest = $request;
	}

	/**
	 * @access private
	 * @param string $name Name of the fieldset.
	 * @param string $content HTML content to put in.
	 * @return string HTML fieldset
	 */
	function fieldset( $name, $content ) {
		return "<fieldset><legend>".wfMsg($this->mName.'-'.$name)."</legend>\n" .
			$content . "\n</fieldset>\n";
	}

	/**
	 * @access private
	 * @param string $varname Name of the checkbox.
	 * @param boolean $checked Set true to check the box (default False).
	 */
	function checkbox( $varname, $checked=false ) {
		if ( $this->mRequest->wasPosted() && !is_null( $this->mRequest->getVal( $varname ) ) ) {
			$checked = $this->mRequest->getCheck( $varname );
		}
		return "<div><input type='checkbox' value=\"1\" id=\"{$varname}\" name=\"wpOp{$varname}\"" .
			( $checked ? ' checked="checked"' : '' ) .
			" /><label for=\"{$varname}\">". wfMsg( $this->mName.'-'.$varname ) .
			"</label></div>\n";
	}

	/**
	 * @access private
	 * @param string $varname Name of the textbox.
	 * @param string $value Optional value (default empty)
	 * @param integer $size Optional size of the textbox (default 20)
	 */
	function textbox( $varname, $value='', $size=20 ) {
		if ( $this->mRequest->wasPosted() ) {
			$value = $this->mRequest->getText( $varname, $value );
		}
		$value = htmlspecialchars( $value );
		return "<div><label>". wfMsg( $this->mName.'-'.$varname ) .
			"<input type='text' name=\"{$varname}\" value=\"{$value}\" size=\"{$size}\" /></label></div>\n";
	}

	/**
	 * @access private
	 * @param string $varname Name of the radiobox.
	 * @param array $fields Various fields.
	 */
	function radiobox( $varname, $fields ) {
		foreach ( $fields as $value => $checked ) {
			$s .= "<div><label><input type='radio' name=\"{$varname}\" value=\"{$value}\"" .
				( $checked ? ' checked="checked"' : '' ) . " />" . wfMsg( $this->mName.'-'.$varname.'-'.$value ) .
				"</label></div>\n";
		}
		return $this->fieldset( $this->mName.'-'.$varname, $s );
	}

	/**
	 * @access private
	 * @param string $varname Name of the textareabox.
	 * @param string $value Optional value (default empty)
	 * @param integer $size Optional size of the textarea (default 20)
	 */
	function textareabox ( $varname, $value='', $size=20 ) {
		if ( $this->mRequest->wasPosted() ) {
			$value = $this->mRequest->getText( $varname, $value );
		}
		$value = htmlspecialchars( $value );
		return '<div><label>'.wfMsg( $this->mName.'-'.$varname ).
		       "<textarea name=\"{$varname}\" rows=\"5\" cols=\"{$size}\">$value</textarea></label></div>\n";
	}

	/**
	 * @access private
	 * @param string $varname Name of the arraybox.
	 * @param integer $size Optional size of the textarea (default 20)
	 */
	function arraybox( $varname , $size=20 ) {
		$s = '';
		if ( $this->mRequest->wasPosted() ) {
			$arr = $this->mRequest->getArray( $varname );
			if ( is_array( $arr ) ) {
				foreach ( $_POST[$varname] as $index=>$element ) {
					$s .= htmlspecialchars( $element )."\n";
				}
			}
		}
		return "<div><label>".wfMsg( $this->mName.'-'.$varname ).
			"<textarea name=\"{$varname}\" rows=\"5\" cols=\"{$size}\">{$s}</textarea>\n";
	}
} // end class


// functions used by SpecialUserrights.php and SpecialGroups.php

/** Build a select with all defined groups
 * @param string $selectname Name of this element. Name of form is automaticly prefixed.
 * @param array $selected Array of element selected when posted. Only multiples will show them.
 * @param boolean $multiple A multiple elements select.
 * @param integer $size Number of elements to be shown ignored for non-multiple (default 6).
 * @param boolean $reverse If true, multiple select will hide selected elements (default false).
*/
function HTMLSelectGroups($selectname, $selectmsg, $selected=array(), $multiple=false, $size=6, $reverse=false) {
	$groups = User::getAllGroups();
	$out = htmlspecialchars( wfMsg( $selectmsg ) );

	if( $multiple ) {
		$attribs = array(
			'name'    => $selectname . '[]',
			'multiple'=> 'multiple',
			'size'    => $size );
	} else {
		$attribs = array( 'name' => $selectname );
	}
	$out .= wfElement( 'select', $attribs, null );

	foreach( $groups as $group ) {
		$attribs = array( 'value' => $group );
		if( $multiple ) {
			// for multiple will only show the things we want
			if( !in_array( $group, $selected ) xor $reverse ) {
				continue;
			}
		} else {
			if( in_array( $group, $selected ) ) {
				$attribs['selected'] = 'selected';
			}
		}
		$out .= wfElement( 'option', $attribs, User::getGroupName( $group ) ) . "\n";
	}

	$out .= "</select>\n";
	return $out;
}

/** Build a select with all existent rights
 * @param array $selected Names(?) of user rights that should be selected.
 * @return string HTML select.
 */
function HTMLSelectRights($selected='') {
	global $wgAvailableRights;
	$out = '<select name="editgroup-getrights[]" multiple="multiple">';
	$groupRights = explode(',',$selected);

	foreach($wgAvailableRights as $right) {

		// check box when right exist
		if(in_array($right, $groupRights)) { $selected = 'selected="selected" '; }
		else { $selected = ''; }

		$out .= '<option value="'.$right.'" '.$selected.'>'.$right."</option>\n";
	}
	$out .= "</select>\n";
	return $out;
}
?>
