<?php
  // form_creator.php
  // RJM Programming
  // October, 2019
  // Create PDF forms.



//Based on HTML2PDF by Clément Lavoillotte
//Thanks to http://www.fpdf.org/en/script/script50.php

if (is_file('MarkItUp/fpdf17/fpdf.php')) {
require('MarkItUp/fpdf17/fpdf.php');
} else {
require('../MarkItUp/fpdf17/fpdf.php');
}

const MAX_P_WIDTH = 595; //1150;
const MAX_P_HEIGHT = 842; //1650;

const MAX_L_HEIGHT = 595; //1150;
const MAX_L_WIDTH = 842; //1650;

//function hex2dec
//returns an associative array (keys: R,G,B) from a hex html code (e.g. #3FE5AA)
function hex2dec($couleur = "#000000") {
    $R = substr($couleur, 1, 2);
    $rouge = hexdec($R);
    $V = substr($couleur, 3, 2);
    $vert = hexdec($V);
    $B = substr($couleur, 5, 2);
    $bleu = hexdec($B);
    $tbl_couleur = array();
    $tbl_couleur['R']=$rouge;
    $tbl_couleur['G']=$vert;
    $tbl_couleur['B']=$bleu;
    return $tbl_couleur;
}

//conversion pixel -> millimeter in 72 dpi
function px2mm($px) {
    return $px*25.4/72;
}

function txtentities($html) {
    $trans = get_html_translation_table(HTML_ENTITIES);
    $trans = array_flip($trans);
    return strtr($html, $trans);
}
////////////////////////////////////

class PDF extends FPDF {
//variables of html parser
protected $B;
protected $I;
protected $U;
protected $HREF;
protected $fontList;
protected $issetfont;
protected $issetcolor;

function __construct($orientation='P', $unit='mm', $format='A4') {
    //Call parent constructor
    parent::__construct($orientation,$unit,$format);

    //Initialization
    $this->B=0;
    $this->I=0;
    $this->U=0;
    $this->HREF='';

    $this->tableborder=0;
    $this->tdbegin=false;
    $this->tdwidth=0;
    $this->tdheight=0;
    $this->tdalign="L";
    $this->tdbgcolor=false;

    $this->oldx=0;
    $this->oldy=0;

    $this->fontlist=array("arial","times","courier","helvetica","symbol");
    $this->issetfont=false;
    $this->issetcolor=false;
}

//////////////////////////////////////
//html parser

function WriteHTML($html) {
    $html=strip_tags($html,"<b><u><i><a><img><p><br><strong><em><font><tr><blockquote><hr><td><tr><table><sup>"); //remove all unsupported tags
    $html=str_replace("\n",'',$html); //replace carriage returns with spaces
    $html=str_replace("\t",'',$html); //replace carriage returns with spaces
    $a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE); //explode the string
    foreach($a as $i=>$e) 
    {
        if($i%2==0) 
        {
            //Text
            if($this->HREF)
                $this->PutLink($this->HREF,$e);
            elseif($this->tdbegin) {
                if(trim($e)!='' && $e!="&nbsp;") {
                    $this->Cell($this->tdwidth,$this->tdheight,$e,$this->tableborder,'',$this->tdalign,$this->tdbgcolor);
                }
                elseif($e=="&nbsp;") {
                    $this->Cell($this->tdwidth,$this->tdheight,'',$this->tableborder,'',$this->tdalign,$this->tdbgcolor);
                }
            }
            else
                $this->Write(5,stripslashes(txtentities($e)));
        }
        else
        {
            //Tag
            if($e[0]=='/')
                $this->CloseTag(strtoupper(substr($e,1)));
            else
            {
                //Extract attributes
                $a2=explode(' ',$e);
                $tag=strtoupper(array_shift($a2));
                $attr=array();
                foreach($a2 as $v)
                {
                    if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
                        $attr[strtoupper($a3[1])]=$a3[2];
                }
                $this->OpenTag($tag,$attr);
            }
        }
    }
}

function OpenTag($tag, $attr) {
    //Opening tag
    switch($tag){

        case 'SUP':
            if( !empty($attr['SUP']) ) {    
                //Set current font to 6pt     
                $this->SetFont('','',6);
                //Start 125cm plus width of cell to the right of left margin         
                //Superscript "1" 
                $this->Cell(2,2,$attr['SUP'],0,0,'L');
            }
            break;

        case 'TABLE': // TABLE-BEGIN
            if( !empty($attr['BORDER']) ) $this->tableborder=$attr['BORDER'];
            else $this->tableborder=0;
            break;
        case 'TR': //TR-BEGIN
            break;
        case 'TD': // TD-BEGIN
            if( !empty($attr['WIDTH']) ) $this->tdwidth=($attr['WIDTH']/4);
            else $this->tdwidth=40; // Set to your own width if you need bigger fixed cells
            if( !empty($attr['HEIGHT']) ) $this->tdheight=($attr['HEIGHT']/6);
            else $this->tdheight=6; // Set to your own height if you need bigger fixed cells
            if( !empty($attr['ALIGN']) ) {
                $align=$attr['ALIGN'];        
                if($align=='LEFT') $this->tdalign='L';
                if($align=='CENTER') $this->tdalign='C';
                if($align=='RIGHT') $this->tdalign='R';
            }
            else $this->tdalign='L'; // Set to your own
            if( !empty($attr['BGCOLOR']) ) {
                $coul=hex2dec($attr['BGCOLOR']);
                    $this->SetFillColor($coul['R'],$coul['G'],$coul['B']);
                    $this->tdbgcolor=true;
                }
            $this->tdbegin=true;
            break;

        case 'HR':
            if( !empty($attr['WIDTH']) )
                $Width = $attr['WIDTH'];
            else
                $Width = $this->w - $this->lMargin-$this->rMargin;
            $x = $this->GetX();
            $y = $this->GetY();
            $this->SetLineWidth(0.2);
            $this->Line($x,$y,$x+$Width,$y);
            $this->SetLineWidth(0.2);
            $this->Ln(1);
            break;
        case 'STRONG':
            $this->SetStyle('B',true);
            break;
        case 'EM':
            $this->SetStyle('I',true);
            break;
        case 'B':
        case 'I':
        case 'U':
            $this->SetStyle($tag,true);
            break;
        case 'A':
            $this->HREF=$attr['HREF'];
            break;
        case 'IMG':
            if(isset($attr['SRC']) && (isset($attr['WIDTH']) || isset($attr['HEIGHT']))) {
                if(!isset($attr['WIDTH']))
                    $attr['WIDTH'] = 0;
                if(!isset($attr['HEIGHT']))
                    $attr['HEIGHT'] = 0;
                $this->Image($attr['SRC'], $this->GetX(), $this->GetY(), px2mm($attr['WIDTH']), px2mm($attr['HEIGHT']));
            }
            break;
        case 'BLOCKQUOTE':
        case 'BR':
            $this->Ln(5);
            break;
        case 'P':
            $this->Ln(10);
            break;
        case 'FONT':
            if (isset($attr['COLOR']) && $attr['COLOR']!='') {
                $coul=hex2dec($attr['COLOR']);
                $this->SetTextColor($coul['R'],$coul['G'],$coul['B']);
                $this->issetcolor=true;
            }
            if (isset($attr['FACE']) && in_array(strtolower($attr['FACE']), $this->fontlist)) {
                $this->SetFont(strtolower($attr['FACE']));
                $this->issetfont=true;
            }
            if (isset($attr['FACE']) && in_array(strtolower($attr['FACE']), $this->fontlist) && isset($attr['SIZE']) && $attr['SIZE']!='') {
                $this->SetFont(strtolower($attr['FACE']),'',$attr['SIZE']);
                $this->issetfont=true;
            }
            break;
    }
}

function CloseTag($tag) {
    //Closing tag
    if($tag=='SUP') {
    }

    if($tag=='TD') { // TD-END
        $this->tdbegin=false;
        $this->tdwidth=0;
        $this->tdheight=0;
        $this->tdalign="L";
        $this->tdbgcolor=false;
    }
    if($tag=='TR') { // TR-END
        $this->Ln();
    }
    if($tag=='TABLE') { // TABLE-END
        $this->tableborder=0;
    }

    if($tag=='STRONG')
        $tag='B';
    if($tag=='EM')
        $tag='I';
    if($tag=='B' || $tag=='I' || $tag=='U')
        $this->SetStyle($tag,false);
    if($tag=='A')
        $this->HREF='';
    if($tag=='FONT'){
        if ($this->issetcolor==true) {
            $this->SetTextColor(0);
        }
        if ($this->issetfont) {
            $this->SetFont('arial');
            $this->issetfont=false;
        }
    }
}

function SetStyle($tag, $enable) {
    //Modify style and select corresponding font
    $this->$tag+=($enable ? 1 : -1);
    $style='';
    foreach(array('B','I','U') as $s) {
        if($this->$s>0)
            $style.=$s;
    }
    $this->SetFont('',$style);
}

function PutLink($URL, $txt) {
    //Put a hyperlink
    $this->SetTextColor(0,0,255);
    $this->SetStyle('U',true);
    $this->Write(5,$txt,$URL);
    $this->SetStyle('U',false);
    $this->SetTextColor(0);
}

} //end of class

  function addtotable($imgurl) {
    global $thtml, $pdf, $mw, $mh;
    $prefix="";
    if (strpos(("~" . strtolower($imgurl)), "~http") === false) {
    if (!file_exists($prefix . $imgurl)) {
      if (isset($_GET['rp'])) {
        if (file_exists(str_replace('+',' ',urldecode($_GET['rp'])) . $imgurl)) {
          $prefix=str_replace('+',' ',urldecode($_GET['rp']));
        } else if (file_exists("../" . str_replace('+',' ',urldecode($_GET['rp'])) . $imgurl)) {
          $prefix="../" . str_replace('+',' ',urldecode($_GET['rp']));
        }
      } else if (isset($_POST['rp'])) {
        if (file_exists(str_replace('+',' ',urldecode($_POST['rp'])) . $imgurl)) {
          $prefix=str_replace('+',' ',urldecode($_POST['rp']));
        } else if (file_exists("../" . str_replace('+',' ',urldecode($_POST['rp'])) . $imgurl)) {
          $prefix="../" . str_replace('+',' ',urldecode($_POST['rp']));
        }
      } else if (file_exists("../" . $imgurl)) {
        $prefix="../";
      }
    }
    }
    list($width, $height, $type, $attr) = getimagesize($prefix . $imgurl);
    if (!$pdf) { if ($width >= $height) {  $pdf=new PDF('L'); $mw=MAX_L_WIDTH;  $mh=MAX_L_HEIGHT;  } else {  $pdf=new PDF('P');   $mw=MAX_P_WIDTH;  $mh=MAX_P_HEIGHT;   }  }
    if ($mw < $width && $mh >= $height) { $width=0; } else if ($mw >= $width && $mh < $height) {  $height=0; } else if ($mw < $width && $mh < $height) { $width=-$mw;  $height=-$mh;   }
    if ($thtml == "") {
      $pdf->AddPage();
      $pdf->SetFont('Arial','',12);
      if ($width == 0) {
      //echo "h";
      //exit;
      $thtml.='<img height="' . $height . '" src="' . $prefix . $imgurl . '"></img>';
      } else if ($height == 0) {
      //echo "w";
      //exit;
      $thtml.='<img width="' . $width . '" src="' . $prefix . $imgurl . '"></img>';
      } else if ($height < 0 && $width < 0) {
      //echo "hw";
      //exit;
      $thtml.='<img height="' . $height . '" width="' . $width . '" src="' . $prefix . $imgurl . '"></img>';
      } else {
      //echo "table " . $width . " vs " . $mw . " and " . $height . " vs " . $mh;
      //exit;
      $thtml.='<table border="1" width="' . $width . '" height="' . $height . '"><tr><td width="' . $width . '" height="' . $height . '"><img width="' . $width . '" height="' . $height . '" src="' . $prefix . $imgurl . '"></img></td></tr></table>';
      }
      $pdf->WriteHTML($thtml);   // $thtml is some HTML table code collected earlier on
      $thtml=' ';
    } else {
      $pdf->AddPage();
      $pdf->SetFont('Arial','',12);
      if ($width == 0) {
      $thtml.='<img height="' . $height . '" src="' . $prefix . $imgurl . '"></img>';
      } else if ($height == 0) {
      $thtml.='<img width="' . $width . '" src="' . $prefix . $imgurl . '"></img>';
      } else if ($height < 0 && $width < 0) {
      $thtml.='<img height="' . $height . '" width="' . $width . '" src="' . $prefix . $imgurl . '"></img>';
      } else {
      $thtml='<br><br><table border="1" width="' . $width . '" height="' . $height . '"><tr><td width="' . $width . '" height="' . $height . '"><img width="' . $width . '" height="' . $height . '" src="' . $prefix . $imgurl . '"></img></td></tr></table>';
      }
      $pdf->WriteHTML($thtml);   // $thtml is some HTML table code collected earlier on
      $thtml=' ';
    }
  }

  $pdf=null;
  $trow='<tr><td width="200" height="30">cell 1</td><td width="200" height="30" bgcolor="#D0D0FF">cell 2</td></tr>';
  $thtml='<table border="1"></table>';
  $mw=MAX_P_WIDTH;
  $mh=MAX_P_HEIGHT;
  
  if (isset($_POST['formtable'])) {
    $thtml=str_replace('+', ' ', urldecode($_POST['formtable']));
  } else if (isset($_GET['formtable'])) {
    $thtml=str_replace('+', ' ', urldecode($_GET['formtable']));
  } else if (isset($_POST['slideshowlist'])) {
    $thtml='';
    $slideshowlist=explode(",", str_replace('+', ' ', urldecode($_POST['slideshowlist'])));
    for ($ii=0; $ii<sizeof($slideshowlist); $ii++) {
     if ($slideshowlist[$ii] != "") { addtotable($slideshowlist[$ii]); }
    }
  } else if (isset($_GET['slideshowlist'])) {
    $thtml='';
    $slideshowlist=explode(",", str_replace('+', ' ', urldecode($_GET['slideshowlist'])));
    for ($ii=0; $ii<sizeof($slideshowlist); $ii++) {
     if ($slideshowlist[$ii] != "") { addtotable($slideshowlist[$ii]); }
    }
  } else {
    $thtml='<table border="1" height="400"><tr><td width="200" height="400">cell 1</td><td width="200" height="400" bgcolor="#D0D0FF"><img width="200" height="200" src="./one.jpg"></img></td></tr></table>';
    $otherbuttons='<input onclick="woit();" style="background-color:lightblue;" value="Preview HTML Rendering" type=button></input>&nbsp;<input onclick="emailit();" style="background-color:lightblue;" value="Email HTML Inline" type=button></input>&nbsp;';
    $ebutton='<form target=iemail data-target=_blank method=POST data-method=GET action=../HTMLCSS/emailhtml.php style=display:none;><input type=hidden id=eto name=eto value=""></input><input type=hidden id=esubject name=esubject value="Email HTML Inline"></input><textarea style=display:none; id=ebody name=ebody value=""></textarea><input type=hidden name=inline value=""></input><input type=submit id=esubmit style=display:none; value=Email></input></form><iframe name=iemail id=iemail style=display:none; src=></iframe>&nbsp;';
    $thtml.='<br><br><table border="1" height="400"><tr><td width="200" height="400">cell 1</td><td width="200" height="400" bgcolor="#D0D0FF"><img width="200" height="200" src="./one.jpg"></img></td></tr></table>';
    $jscr="<sc" . "ript type='text/javascript'>
      var wo=null;
      var url=document.URL.split('#')[0].split('?')[0];

 function relative_to_absolute(inth) {
    var huhs, posthuhs, ii, m, delimis=\" \";
    var uubits=url.split(\"?\");

    if (url == \"\") return inth;

    if (uubits[0].indexOf(\"/\") != -1) {
      var uuubits=uubits[0].split(\"/\");
      if (uuubits[eval(uuubits.length - 1)] != \"\") {
        if (uuubits[eval(uuubits.length - 1)].indexOf(\".\") != -1) {
          uubits[0] = uubits[0].replace(\"/\" + uuubits[eval(uuubits.length - 1)], \"/\");
        } else {
          uubits[0] += \"/\";
        }
      }
    }

    var uudirname=uubits[0];
    var outth = inth;
    var ideas = new Array(\" action='\", ' action=\"', \" Action='\", ' Action=\"', \" ACTION='\", ' ACTION=\"', \" action=\", \" Action=\", \" ACTION=\", \" href='\", ' href=\"', \" Href='\", ' Href=\"', \" HREF='\", ' HREF=\"', \" href=\", \" Href=\", \" HREF=\", \" src='\", ' src=\"', \" Src='\", ' Src=\"', \" SRC='\", ' SRC=\"', \" src=\", \" Src=\", \" SRC=\");

    if (uudirname != \"\" && url != \"\") {
     for (m=0; m<ideas.length; m++) {
      huhs = inth.split(ideas[m]);
      if (huhs.length > 1) {
        for (ii=eval(huhs.length - 1); ii>=1; ii--) {
          delimis=ideas[m].substring(eval(ideas[m].length - 1), eval(ideas[m].length));
          if (delimis == \"=\") delimis=\" \";
          posthuhs=huhs[ii].trim().replace(\">\",\" \").replace(/mailto:/g, \"http:\").replace(/javascript:none;/g, \"http:\").split(delimis);
          if (posthuhs[0].length > 0) {
          if (posthuhs[0].substring(0,1) == \"#\" || posthuhs[0].substring(0,4).toLowerCase().replace(/file/g, \"http\").toLowerCase() == \"http\") {
              outth = outth;
          } else if (posthuhs[0].substring(0,1) != \"/\" && posthuhs[0].substring(0,1) != \"'\" && posthuhs[0].substring(0,1) != '\"') {
              while (outth.indexOf(posthuhs[0]) != -1) {
                outth=outth.replace(posthuhs[0], \"youwill-never-ever-findthis\");
              }
              outth=outth.replace(/youwill-never-ever-findthis/g, uudirname + posthuhs[0]).replace(/\/\.\//g, '/');
          } else if (posthuhs[0].substring(1,2) != \"/\" && posthuhs[0].substring(0,1) != \"'\" && posthuhs[0].substring(0,1) != '\"') {
              while (outth.indexOf(posthuhs[0]) != -1) {
                outth=outth.replace(posthuhs[0], \"youwill-never-ever-findthis\");
              }
              outth=outth.replace(/youwill-never-ever-findthis/g, uudirname.substring(0, eval(uudirname.length - 1)) + posthuhs[0]).replace(/\/\.\//g, '/');
          }
          }
        }
      }
     }
    }

    return outth.replace(/\/\.\//g, '/');
 }

      function woit() {
         if (wo) { wo.close(); wo=null; }
         wo=window.open('','_blank','top=50,left=50,width=500,height=500');
         document.getElementById('formtable').innerHTML=relative_to_absolute(document.getElementById('formtable').value.replace(/\</g,'&lt;').replace(/\>/g,'&gt;'));        
         document.getElementById('formtable').value=document.getElementById('formtable').innerHTML.replace(/\&lt\;/g,'<').replace(/\&gt\;/g,'>');
         wo.document.write('<body><table><tr><td>' + relative_to_absolute(document.getElementById('formtable').value) + '</td><td> ... is the look of ...</td><td><form method=POST action=' + document.URL.split('#')[0].split('?')[0] + '>' + document.getElementById('formtable').outerHTML + '<br><br><input id=bsubmit style=\"background-color:yellow;\" value=\"HTML Above to PDF\" type=submit></input></form></td></tr></table><input style=\"position:absolute;top:-200px;left:-200px;\" value=\"\" type=\"text\"></input></body>');
      }

      function emailit() {
         var tois=prompt('Email to?', '');
         if (tois == null) { tois='';}
         if (tois.indexOf('@') != -1) {
         document.getElementById('formtable').innerHTML=relative_to_absolute(document.getElementById('formtable').value.replace(/\</g,'&lt;').replace(/\>/g,'&gt;'));        
         document.getElementById('formtable').value=document.getElementById('formtable').innerHTML.replace(/\&lt\;/g,'<').replace(/\&gt\;/g,'>');
         document.getElementById('eto').value=tois;
         document.getElementById('ebody').value=('<body><table><tr><td>' + relative_to_absolute(document.getElementById('formtable').value) + '</td><td> ... <a target=_blank title=\"Created via ...\" href=\"' + document.URL.split('#')[0].split('?')[0] + '\" >is the look of</a> ...</td><td><form method=POST action=' + document.URL.split('#')[0].split('?')[0] + '>' + document.getElementById('formtable').outerHTML + '<br><br><input id=bsubmit style=\"background-color:yellow;\" value=\"HTML Above to PDF\" type=submit></input></form></td></tr></table><input style=\"position:absolute;top:-200px;left:-200px;\" value=\"\" type=\"text\"></input></body>');
         document.getElementById('esubmit').click();
         alert('Email sent to ' + tois);
         //document.getElementById('bsubmit').click();
         }
      }
    </scr" . "ipt>
    ";
    echo '<!doctype html><html><head>' . $jscr . '</head><body style="background-color:lightgreen;"><h1>PDF Slideshow and Form Creation Helper</h1><h3>RJM Programming - October, 2019</h3><h4>Thanks to <a target=_blank title=Fpdf href="http://www.fpdf.org/">Fpdf</a></h4><form method=POST action=./form_creator.php><textarea style="background-color:pink;width:90%;" name=formtable id=formtable rows=20>' . $thtml . '</textarea><br><br>' . $otherbuttons . '<br><br><input id=bsubmit style="background-color:yellow;" value="HTML Above to PDF" type=submit></input></form>' . $ebutton . '<input style="position:absolute;top:-200px;left:-200px;" value="" type="text"></input></body></html>';
    exit;
  }

  
  foreach( $_GET as $name=>$val ) {
  }
  
  foreach( $_POST as $name=>$val ) {
  }
  
 if (!$pdf) {
  $pdf=new PDF();
 }
 if ($pdf && trim($thtml) != "") {
  $pdf->AddPage();
  $pdf->SetFont('Arial','',12);
  $pdf->WriteHTML($thtml);   // $thtml is some HTML table code collected earlier on
 }
 if ($pdf) {
  header('Content-type: application/pdf'); 
  $pdf->Output();
 }
 exit;

?>
