<?php
/* $Id: mSelectBox.class.php,v 1.18 2006/01/15 14:11:11 leyeti Exp $ */

// adding file revision into global array
if(function_exists("revisionInit")) revisionInit("\$Revision: 1.18 $", __FILE__);

/**
* class to build SELECT-Boxes
* for PHP 4.0 and later
*
* @param $varname (name of the field in the formular)
* @access public
* @author Marc Logemann <logemann@morelogs.de>
* @author Michael Ochtrop <ochtrop@morelogs.de>
* @author Dirk Hartmann <hartmann@morelogs.de>
* @version 1.1 2000-10-18
*
*/
class mSelectBox{
    var $valueARR;
    var $contentARR;
    var $SB_multiple = false;
    var $ctype;
    var $htype;
    var $hvalue;
	var $SB_enabled = true;

    /**
     * class-constructor
     *
     * @access public
     * @param [FieldName]
     * @param [SelectedField]
     *
     */
    function mSelectBox($varname){
	$this->varname = $varname;
	if(func_num_args()>1) $this->SelectedValue = func_get_arg(1);
    }


    /**
     * to change the name of the element
     *
     * @access public
     * @param [FieldName]
     *
     */	
    function setVarname($varname){
	$this->varname = $varname;
    }


    /**
     * methods to change the design of the SelectBox
     *
     * @access public
     *
     */
    function setMultiple($v=true){
	$this->SB_multiple = $v;
    }

	
	/**
     * methods to enable/disable the SelectBox
     *
     * @access public
     *
     */
    function setEnabled($v=true){
	$this->SB_enabled = $v;
    }
	
	
    /**
     * @param [Height]
     */
    function setHeight($height){
	$this->SB_height = $height;
    }

	/**
     * @param [Height]
     */
    function setHeightPx($height){
	$this->SB_heightPx = $height;
    }
	
	/**
     * @param [Width]
     */
    function setWidthPx($width){
	$this->SB_widthPx = $width;
    }
	
    /**
     * assigns a handler to the selectlist
     *
     * for example:
     *		setHandler("onChange","submitit()")
     *		will result in
     *		<select name="name" onChange="submitit")
     *
     * @access public
     * @param handlertype
     * @param handlervalue
     */
    function setHandler($htype, $hvalue){
	$this->htype = $htype;
	$this->hvalue = $hvalue;
    }

    /**
     * build the ValueArray of the keys from the ContentArray
     *
     * @access private
     *
     */
    function convertArrays(){
	$this->valueARR = array_keys($this->contentARR);
    }


    /**
     * methods to sort the SelectBox-Arrays
     *
     * @access public
     *
     */
    function sortbyValue(){
	ksort($this->contentARR);
	$this->convertArrays();
    }
    function sortbyContent(){
	asort($this->contentARR);
	$this->convertArrays();
    }


    /**
     * add an Option to the SelectBox-Arrays
     *  If the value exists in the array only
     *  the content will be changed, not the
     *  position.
     *
     * @access public
     * @param [value]
     * @param [option]
     * @param [position] pre / after
     *
     */
    function addOption($value,$option,$pos="after"){
	if(isset($this->contentARR[$value])){
	    $this->contentARR[$value] = $option;
	}
	else{
	    if($pos=="pre") $new_contentARR[$value] = $option;

            if (isset($this->contentARR)) {
		$contentARR = $this->contentARR;
	    } 
			
	    // if content is in the array, means, if someone called addOption oder
	    // addContent before
	    if(isset ($contentARR) && count($contentARR)>0) $valueARR = array_keys($contentARR);
 
            if (isset ($valueARR)) {
		for($a=0;$a<count($valueARR);$a++){
		    $new_contentARR[$valueARR[$a]] = $contentARR[$valueARR[$a]];
		}
	    }
	    if($pos=="after") $new_contentARR[$value] = $option;

	    $this->contentARR = $new_contentARR;
	    $this->convertArrays();
	}
    }


    /**
     * set the kind of the content
     *
     *	arr	->	array
     *	num	->	nummeric
     *	chr	->	character
     *	sql	->	sql-statement
     *	
     *
     * @access public
     *
     */
    function setContentType($type){
	$this->ctype = $type;
    }


    /**
     * set the value-fields of SQL-Statement
     *  if you want to take only one field from DB as value
     *  then its okay if you give these one Parameter,
     *  but if you take more then one, add a seperator on
     *  the first position
     * 
     * @access public
     *
     */
    function setSQLvalue($a){
	$num = func_num_args();
	if($num>1){
	    $this->sqlvaldev = $a;
	    for($a=1;$a<$num;$a++){
		$this->sqlval[$a-1] = func_get_arg($a);
	    }
	}
	else{
	    $this->sqlvaldev = "";
	    $this->sqlval[0] = $a;
	}
    }

    /**
     * set the content-fields of SQL-Statement
     *  the same like setSQLvalues();
     *
     * @access public
     *
     */
    function setSQLcontent($a){
	$num = func_num_args();
	if($num>1){
	    $this->sqloptdev = $a;
	    for($a=1;$a<$num;$a++)
		{
		    $this->sqlopt[$a-1] = func_get_arg($a);
		}
	}
	else{
	    $this->sqloptdev = "";
	    $this->sqlopt[0] = $a;
	}
    }


    /**
     * this method fills the Arrays for the SelectBox by detecting the kind of content
     *
     * how to use
     *	in a string followed by Arguments devided by blanks
     *
     *	spez:	arr (only an array) without any Arguments
     *
     *	spez:	"<num1> <num2>"
     *		"0 21"	-> from "00" to "21"
     *		"9 1"	-> from "9" downto "1"
     *
     *	spez:	"<char1> <char2>"
     *		"chr A C"	-> from "A" to "Z"
     *		"chr #90 #65"	-> from "Z" to "A"
     *		"chr #65 C"	-> from "A" to "C"
     *
     *	spez:	"<ValueField> <ContentField> <SQL for DB>"
     *		"id nachname select * from kundenstamm"
     *			-> all names of the table kundenstamm with the id of the entry as the value
     *
     * @access public
     * @param $ctype
     * @param $cont
     *
     */
    function addContent($cont){
	global $conn;
	if(!is_array($cont)){
	    $beg = strtok($cont," ");
	    $end = strtok(" ");
	    $aschar = false;
	}
	switch(strtoupper($this->ctype)){
	case "ARR":
	    $this->contentARR = $cont;
	    break;
	case "CHR":
	    $aschar = true;
	    if($beg[0]=="#"){ $beg = substr($beg,1); }else{ $beg = ord($beg[0]); }
	    if($end[0]=="#"){ $end = substr($end,1); }else{ $end = ord($end[0]); }			
	case "NUM":
	    if($beg<$end){
		$lr = "up";
		$sz = strlen($end);
	    }
	    else{
		$lr = "down";
		$sz = strlen($beg);
	    }
	    $a = $beg;
	    while( ($lr=="up" && $a<=$end) || ($lr=="down" && $a>=$end) ){
		$akt = sprintf("%0".$sz."d",$a);
		if($aschar==true){
		    $akt = chr($akt);
		}
		$this->contentARR[$akt] = $akt;
		if($lr=="up"){
		    $a+= 1;
		}
		else{
		    $a-= 1;
		}
	    }
	    break;
	case "SQL":
	    $sql = $cont;
	    if(!$res = $conn->Execute($sql)) exit(showSQLerror($sql, $conn->ErrorMsg(), __LINE__, __FILE__));
	    $num = $res->RowCount();
	    if($num>0){
		while($arr = $res->FetchRow()){
		    $val = "";
		    for($a=0;$a<count($this->sqlval);$a++){
			$val.= $arr[$this->sqlval[$a]];
			if($a<count($this->sqlval)-1) $val.= $this->sqlvaldev;
		    }
		    $opt = "";
		    for($a=0;$a<count($this->sqlopt);$a++){
			$opt.= $arr[$this->sqlopt[$a]];
			if($a<count($this->sqlopt)-1) $opt.= $this->sqloptdev;
		    }
		    $this->contentARR[$val] = $opt;
		}
	    }
	    else{
		$this->contentARR[] = "NoEntryInTable";
	    }
	    break;
	default:
	    die("Define a Type before!!!");
	}
	$this->convertArrays();
    }


    /**
     * clear the SelectBox-Arrays and set the new content
     *
     * @access public
     *
     */
    function setContent($cont){
	$this->contentARR = "";
	$this->valueARR = "";
	$this->addContent($cont);
    }


    /**
     * this the Method to get the output the SelectBox
     *
     * @access public
     * @return html-construct of the SelectBox
     *
     */
    function draw(){
	if(func_num_args()>0){
	    $this->SelectedValues = func_get_arg(0);
		if (!is_array($this->SelectedValues)) {
		    $this->SelectedValues = array($this->SelectedValues);			
		}
	}
	$extra = (func_num_args()>1) ? " ".func_get_arg(1): '';

	$strg = "\n<SELECT NAME=\"".$this->varname;
	if($this->SB_multiple==true) $strg.= "[]\" multiple";
	else $strg .= "\"";
	if($this->SB_enabled==false) $strg.= " disabled";
	$style="";
	if(isset($this->SB_heightPx) || isset($this->SB_widthPx)){
		$style.=" STYLE=\"";
		if(isset($this->SB_heightPx)){
		$style.="height:".$this->SB_heightPx."px;";
		}
		if(isset($this->SB_widthPx)){
		$style.="width:".$this->SB_widthPx."px;";
		}
		$style.="\" ";
	}
	$strg.=$style;
	
	if(isset($this->SB_height)) $strg.= " SIZE=\"".$this->SB_height."\"";
	
	if(isset($this->htype) and isset($this->hvalue)) $strg .= " ". $this->htype . "=\"" . $this->hvalue. "\"";
	$strg.= $extra.">\n";
	for($a=0;$a<count($this->valueARR);$a++){
	    $strg.= "<OPTION";
	    $strg.= " VALUE=\"".$this->valueARR[$a]."\"";

	    if( isset($this->SelectedValues) && in_array($this->valueARR[$a],$this->SelectedValues) ){
		$strg.= " selected";
	    }
	    $strg.= " >";
	    $strg.= $this->contentARR[$this->valueARR[$a]];
	    $strg.= "</OPTION>\n";
	}
	$strg.= "</SELECT>\n";
	return $strg;
    }



    /**
     * some pre-defined Methods of SelectBoxes
     *
     * @access public
     *
     */
    function getSB_Day($aktDay=0, $emptyfirst=true){
	$this->SB_multiple = false;
	$this->setContentType("num");
	$this->setContent("1 31");
	if($emptyfirst) $this->addOption("","", "pre");
	return $this->draw($aktDay);
    }
    
    function getSB_Month($aktMonth=0, $emptyfirst=true){
	$this->SB_multiple = false;
	$this->setContentType("num");
	$this->setContent("1 12");
	if($emptyfirst) $this->addOption("","", "pre");
	return $this->draw($aktMonth);
    }
	
    // ==============================================
    // optionaler 3. Parameter ist ausgewaehltes Jahr
    // ==============================================
    function getSB_Year($von,$bis, $aktYear=0, $emptyfirst=true){
	$this->SB_multiple = false;
	$this->setContentType("num");
	$this->setContent($von." ".$bis);
	if($emptyfirst) $this->addOption("","", "pre");
	
	return $this->draw($aktYear);
    }
    
    function getSB_Title($aktTitle=""){
	$this->SB_multiple = false;

	// we use keys for value (pre-defined like mr, mrs)
	$arr["mr"] = Lang::getLanguageString("mr");
	$arr["mrs"] = Lang::getLanguageString("mrs");
	$arr["ms"] = Lang::getLanguageString("ms");
	$arr["miss"] = Lang::getLanguageString("miss");
	$arr["dr"] = Lang::getLanguageString("dr");
	$arr["sir"] = Lang::getLanguageString("sir");
	$arr["lady"] = Lang::getLanguageString("lady");
	$arr["family"] = Lang::getLanguageString("family");

	$this->setContentType("arr");
	$this->setContent($arr);
	return $this->draw($aktTitle);
    }
    
    function getSB_CCard($aktCard=""){
	$this->SB_multiple = false;

	/*	Schlüsselwerte als Zahlen, oder so wie hier?	*/
	$arr["v"] = "VISA";
	$arr["m"] = "MasterCard";

	$this->setContentType("arr");
	$this->setContent($arr);
	return $this->draw($aktCard);
    }
}

?>
