<?php

################################### Easy Form Process Class ################################
# easyFormProc v1.1.0
# Author : Nazly Ahmed
# Email : me@nazly.net
# Blog : http://www.nazly.net
# Start Date : 4th August 2005
# Last updated Date : 13th December 2006
# Manual : http://www.nazly.net/easyformproc
############################################################################################

include("functions.validation.inc.php");

class 
easyFormProc{
    var 
$elements;
    var 
$elTypes;
    var 
$hasFileUpload;
    var 
$submitBtnName;
    var 
$errMsg;
    
    function 
easyFormProc(){
        
$this -> elements = array();
        
$this -> elementDisHTML = array();
        
$this -> elTypes = array("Text","TextArea","Password","Hidden","Select","Radio","Check","File");
        
$this -> hasFileUpload false;
        
$this -> submitBtnName "submit";
        
$this -> errMsg = array();
    }
    
    function 
setElement($name,$data){
        if(!isset(
$this -> elements[$name])){
            
$this -> elements[$name] = $data;
        }
        else{
            die(
"ERROR : Element <b>$name</b> already set");
        }
    }
    
    function 
setElementValue($name,$value){    
        if(isset(
$this -> elements[$name])){
            
$this -> elements[$name]["value"] = $value;
        }
        else{
            die(
"ERROR : Element <b>$name</b> doesn't exist");
        }
    }    
    
    function 
doValidation($validate,$value,$errMsg,$params){
        if(
$validate !== false){
            if(
$params !== false){
                if(!
$validate($value,$params)){
                    
$this -> errMsg[] = $errMsg;
                }
            }
            else{
                if(!
$validate($value)){
                    
$this -> errMsg[] = $errMsg;
                }
            }
        }
    }
    
    function 
setTextElement($name,$value "",$maxLength 255,$size 24,$style "",$validate false,$errMsg "",$params false){        
        
$this -> setElement($name,array("type" => 0,"validate" => $validate,"value" => $value,
                                        
"style" => $style,"size" => $size,"maxlength" => $maxLength,
                                        
"error" => $errMsg,"params" => $params));
    }
    
    function 
setTextAreaElement($name,$value "",$cols 24,$numLines 8,$style "",$validate false,$errMsg "",$params false){
        
$this -> setElement($name,array("type" => 1,"validate" => $validate,"value" => $value,
                                        
"cols" => $cols,"rows" => $numLines,"style" => $style,
                                        
"error" => $errMsg,"params" => $params));                            
    }
    
    function 
setPasswordElement($name,$value "",$maxLength 255,$size 24,$style "",$showDefault=false,$validate false,$errMsg ""){
        
$this -> setElement($name,array("type" => 2,"validate" => $validate,"value" => $value,
                                        
"size" => $size,"style" => $style,"maxlength" => $maxLength,
                                        
"default"=>$showDefault,"error" => $errMsg));    
    }
    
    function 
setHiddenElement($name,$value ""){
        
$this -> setElement($name,array("type" => 3,"value" => $value));    
    }
    
    function 
setSelectElement($name,$value = array(),$selected "",$style "",$height 1,$mulSelect false,$validate false,$errMsg "",$params false){        
        if(!
is_array($value))die("ERROR : <b>$name</b> values should be an associative array");
        if(
$mulSelect && (!is_array($selected)))die("ERROR : <b>$name</b> selected values should be an array");
        
$this -> setElement($name,array("type" => 4,"validate" => $validate,"value" => $selected,
                                        
"keys" => $value,"height" => $height,"style" => $style,                                    
                                        
"multiple" => $mulSelect,"error" => $errMsg,"params" => $params));
    }
    
    function 
setRadioElement($name,$value = array(),$checked "",$style "",$validate false,$errMsg "",$params false){
        if(!
is_array($value))die("ERROR : <b>$name</b> values should be an associative array");            
        
$this -> setElement($name,array("type" => 5,"keys" => $value,"validate" => $validate,                        
                                        
"value" => $checked,"style" => $style,"error" => $errMsg,"params" => $params));    
    }
    
    function 
setCheckElement($name,$value = array(),$checked = array(),$style "",$validate false,$errMsg "",$params false){        
        if(!
is_array($value))die("ERROR : <b>$name</b> values should be an associative array");
        if(!
is_array($checked))die("ERROR : <b>$name</b> checked values should be an array");
        
$this -> setElement($name,array("type" => 6,"validate" => $validate,"value" => $checked,
                                        
"keys" => $value,"style" => $style,"error" => $errMsg,"params" => $params));                    
    }
    
    function 
setFileElement($name,$style "",$validate false,$errMsg="",$maxSize 100,$imgMimeTypes = array()){                                                        
        
$this -> setElement($name,array("type" => 7,"validate" => $validate,"value" => "",
                                        
"style" => $style,"error" => $errMsg,"maxsize" => $maxSize,
                                        
"mimetypes" => $imgMimeTypes));
        
$this -> hasFileUpload true;                                                                
    }    
    
    function 
processText($name){
        if(
$this -> isPosted()){
            if(isset(
$_POST[$name]))$this -> setElementValue($name,$this -> stripSlashesInVals(trim($_POST[$name])));
            
$this -> doValidation($this -> elements[$name]["validate"],$this -> elements[$name]["value"],$this -> elements[$name]["error"],$this -> elements[$name]["params"]);
        }                
        return 
"<input name=\"$name\" type=\"text\" class=\"".$this -> elements[$name]["style"]."\" value=\"".htmlentities($this -> elements[$name]["value"],ENT_QUOTES)."\" size=\"".$this -> elements[$name]["size"]."\" maxlength=\"".$this -> elements[$name]["maxlength"]."\">\n";    
    }
    
    function 
processTextArea($name){
        if(
$this -> isPosted()){
            if(isset(
$_POST[$name]))$this -> setElementValue($name,$this -> stripSlashesInVals(trim($_POST[$name])));
            
$this -> doValidation($this -> elements[$name]["validate"],$this -> elements[$name]["value"],$this -> elements[$name]["error"],$this -> elements[$name]["params"]);
        }
        return 
"<textarea name=\"$name\" cols=\"".$this -> elements[$name]["cols"]."\" class=\"".$this -> elements[$name]["style"]."\" rows=\"".$this -> elements[$name]["rows"]."\">".htmlentities($this -> elements[$name]["value"],ENT_QUOTES)."</textarea>\n";
    }
    
    function 
processPassword($name){
        if(
$this -> isPosted()){
            if(isset(
$_POST[$name]))$this -> setElementValue($name,$this -> stripSlashesInVals(trim($_POST[$name])));
            if(
$this -> elements[$name]["validate"] === true){
                if(!
valNonEmpty($this -> elements[$name]["value"])){
                    
$this -> errMsg[] = $this -> elements[$name]["error"];
                }
            }
            elseif(
$this -> elements[$name]["validate"] !== false){
                if(!
$this -> valComparison($name,$this -> elements[$name]["validate"])){
                    
$this -> errMsg[] = $this -> elements[$name]["error"];
                }
            }
        }
        
$str "<input name=\"$name\" type=\"password\" class=\"".$this -> elements[$name]["style"]."\" size=\"".$this -> elements[$name]["size"]."\" maxlength=\"".$this -> elements[$name]["maxlength"]."\"";
        
$str .= ($this -> elements[$name]["default"])?" value=\"".htmlentities($this -> elements[$name]["value"],ENT_QUOTES)."\">":" value=\"\">\n";
        return 
$str;
    }
    
    function 
processHidden($name){
        if(
$this -> isPosted()){
            if(isset(
$_POST[$name]))$this -> setElementValue($name,$this -> stripSlashesInVals(trim($_POST[$name])));
        }
        return 
"<input name=\"$name\" type=\"hidden\" value=\"".htmlentities($this -> elements[$name]["value"],ENT_QUOTES)."\">\n";
    }
    
    function 
processSelect($name){
        if(
$this -> isPosted()){
            if(isset(
$_POST[$name]))$this -> setElementValue($name,$_POST[$name]);
            
$this -> doValidation($this -> elements[$name]["validate"],$this -> elements[$name]["value"],$this -> elements[$name]["error"],$this -> elements[$name]["params"]);
        }
        
$str "<select class=\"".$this -> elements[$name]["style"]."\"";
        
$str .= ($this -> elements[$name]["height"]>1)?" size=\"".$this -> elements[$name]["height"]."\"":"";
        
$str .= ($this -> elements[$name]["multiple"])?" name=\"{$name}[]\" multiple":" name=\"$name\"";
        
$str .= ">\n";
        foreach(
$this -> elements[$name]["keys"] as $key => $val){
            if(
$this -> elements[$name]["multiple"]){
                if(
in_array($key,$this -> elements[$name]["value"]))$str .= "<option value=\"$key\" selected>".htmlentities($val,ENT_QUOTES)."</option>\n";
                else 
$str .= "<option value=\"$key\">".htmlentities($val,ENT_QUOTES)."</option>\n";
            }
            else{
                if(
$this -> elements[$name]["value"] == $key)$str .= "<option value=\"$key\" selected>".htmlentities($val,ENT_QUOTES)."</option>\n";
                else 
$str .= "<option value=\"$key\">".htmlentities($val,ENT_QUOTES)."</option>\n";
            }
        }
        
$str .= "</select>";
        return 
$str;
    }
    
    function 
processRadio($name){
        if(
$this -> isPosted()){
            if(isset(
$_POST[$name]))$this -> setElementValue($name,$_POST[$name]);
            
$this -> doValidation($this -> elements[$name]["validate"],$this -> elements[$name]["value"],$this -> elements[$name]["error"],$this -> elements[$name]["params"]);
        }
        foreach(
$this -> elements[$name]["keys"] as $key => $val){            
            if(
$this -> elements[$name]["value"] == $key)$str[$key] = "<table><tr align=\"left\" valign=\"middle\"><td><input type=\"radio\" value=\"$key\" name=\"$name\" checked></td><td><span class=\"".$this -> elements[$name]["style"]."\">".htmlentities($val,ENT_QUOTES)."</span></td></tr></table>\n";
            else 
$str[$key] = "<table><tr align=\"left\" valign=\"middle\"><td><input type=\"radio\" value=\"$key\" name=\"$name\"></td><td><span class=\"".$this -> elements[$name]["style"]."\">".htmlentities($val,ENT_QUOTES)."</span></td></tr></table>\n";            
        }
        return 
$str;
    }
    
    function 
processCheck($name){
        if(
$this -> isPosted()){
            
$newArr=array();
            if(isset(
$_POST[$name])){                
                foreach(
$_POST[$name] as $key=>$val){
                    
$newArr[]=$key;
                }
            }
            
$this -> setElementValue($name,$newArr);
            
$this -> doValidation($this -> elements[$name]["validate"],$this -> elements[$name]["value"],$this -> elements[$name]["error"],$this -> elements[$name]["params"]);
        }
        foreach(
$this -> elements[$name]["keys"] as $key => $val){
            if(
in_array($key,$this -> elements[$name]["value"]))$str[$key] = "<table><tr align=\"left\" valign=\"middle\"><td><input type=\"checkbox\" value=\"1\" name=\"{$name}[$key]\" checked></td><td><span class=\"".$this -> elements[$name]["style"]."\">".htmlentities($val,ENT_QUOTES)."</span></td></tr></table>\n";
            else 
$str[$key] = "<table><tr align=\"left\" valign=\"middle\"><td><input type=\"checkbox\" value=\"1\" name=\"{$name}[$key]\"></td><td><span class=\"".$this -> elements[$name]["style"]."\">".htmlentities($val,ENT_QUOTES)."</span></td></tr></table>\n";            
        }
        return 
$str;
    }
    
    function 
processFile($name){
        if(
$this -> isPosted()){            
            
$this -> setElementValue($name,$_FILES[$name]);
            
$retArr $this -> uploadFile($this -> elements[$name]["value"],$this -> elements[$name]["maxsize"],$this -> elements[$name]["mimetypes"],$this -> elements[$name]["validate"]);
            if(
$retArr["errMsg"]){
                
$this -> errMsg[] = $this -> elements[$name]["error"]." : ".$retArr["errMsg"];
            }
        }
        
$str "<input name=\"$name\" type=\"file\" class=\"".$this -> elements[$name]["style"]."\">\n";
        return 
$str;
    }
    
    function 
genSubmit($value "",$style ""){                
        
$str "<input type=\"submit\" name=\"".$this -> submitBtnName."\" value=\"$value\" class=\"$style\">";                                                
        return 
$str;                                
        
    }    
    
    function 
genForm($overWriteDefAction ""){
        
$str["start"] = ($overWriteDefAction)?"<form action=\"".$overWriteDefAction."\" method=\"post\"":"<form action=\"".$_SERVER["PHP_SELF"]."\" method=\"post\"";
        if(
$this -> hasFileUpload)$str["start"] .= " enctype=\"multipart/form-data\"";
        
$str["start"] .= ">\n\n";    
        
$str["end"] = "</form>\n";            
        return 
$str;                                
    }
    
    function 
isPosted(){        
        if(isset(
$_POST[$this -> submitBtnName])){
            return 
true;
        }
        return 
false;
    }
    
    function 
processForm($subValue,$style "",$subName "submit"$overWriteDefAction ""){
        
$this -> submitBtnName $subName;        
        
$str["form"] = $this -> genForm($overWriteDefAction);            
        
$str["submit"] = $this -> genSubmit($subValue,$style);                
        foreach(
$this -> elements as $elName => $elVals){
            
$callFun "process".$this -> elTypes[$elVals["type"]];            
            
$this -> elementDisHTML[$elName] = $this -> $callFun($elName);
        }        
        return 
$str;
    }
    
    function 
getDisElementHTML(){
        
$newArr = array();
        foreach(
$this -> elementDisHTML as $key => $val){            
            
$newArr[$key] = $this -> elementDisHTML[$key];            
        }
        return 
$newArr;
    }
    
    function 
getPostedElementValues(){
        
$newArr = array();
        if(
$this -> isPosted() && (!count($this -> errMsg))){
            foreach(
$this -> elementDisHTML as $key => $val){            
                
$newArr[$key] = $this -> elements[$key]["value"];            
            }
        }
        return 
$newArr;
    }
    
    function 
getBrowserSafePostedElementValues(){
        
$newArr = array();
        if(
$this -> isPosted() && (!count($this -> errMsg))){
            foreach(
$this -> elementDisHTML as $key => $val){            
                if(
is_array($this -> elements[$key]["value"])){
                    
$newArr[$key] = $this -> elements[$key]["value"];            
                }
                else{
                    
$newArr[$key] = htmlentities($this -> elements[$key]["value"],ENT_QUOTES);            
                }                
            }
        }
        return 
$newArr;
    }    
    
    function 
getErrorMsg($errStr "",$style ""){
        
$str "";
        
$strArr = array();
        foreach(
$this -> errMsg as $key => $val){
            
$strArr[] = "<li>$val</li>";
        }
        if(
count($strArr)){
            if(
$errStr)$str .= "<span class=\"$style\">$errStr\n";    
            
$str .= "<ul>";
            
$str .= implode("\n",$strArr);
            
$str .= "</ul></span>";
        }
        return 
$str;
    }
    
    function 
valComparison($elementName,$comElementName){
        if(
$this -> elements[$elementName]["value"] === $this -> elements[$comElementName]["value"])return true;
        return 
false;
    }
    
    function 
uploadFile($fileFld$maxSize$imgMimeTypes$nullCheck){
            
$errFun "";        
               
$fileName $fileFld["name"];
            
$fileSize ceil($fileFld["size"]/1024);
            
$fileTmpName $fileFld["tmp_name"];
            
$fileError $fileFld["error"];
        
$fileType $fileFld["type"];                
            if(
$fileError != && $fileError != 4){
                    
$errFun "Unknown";                
               }
            elseif(
$fileError != 4){
                   if(
$fileSize || $fileSize $maxSize){
                
$errFun "Max File Size allowed is ".$maxSize."K";
            }
            else{                                
                if(!
in_array($fileTypearray_keys($imgMimeTypes))){                
                    
$errFun "Only ".implode(", "$imgMimeTypes)." files are allowed.";            
                }
            }            
            }
        elseif(
$nullCheck && $fileError == 4){
            
$errFun "Select file..";
        }                
            return array(
"errMsg" => $errFun"fileName" => $fileName"fileTmpName" => $fileTmpName"fileContType" => $fileType);
    }
    
    function 
stripSlashesInVals($str){
        if(
get_magic_quotes_gpc()){
            return 
stripslashes($str);
        }
        return 
$str;
    }
}
?>