<?php
  // no_body.php
  // RJM Programming
  // October, 2019
  // Speech bubbles with no webpage body tag.



//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');
}

//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

  $conversers=[];
  $iconverser=0;
  $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>';
  $phpcont='';

  $one="";
  $two="";
  $three="";
  $four="";
  
  $nextone=1;
  $innards="";
  $title=" ... ";
  $emailto="";
  $aspdf="";
  $gats="Got anything to say?";
  
  foreach( $_GET as $name=>$val ) {
    if ($one == "") {
      $one=str_replace("+", " ", urldecode($val));
      if (strpos($one, "@") !== false) {
        if (strpos($one, "<") !== false) {
         $inf=explode("<", $one)[0];
         $xinf=explode("<", $one)[1];
         if ($inf != '') {
           $conversers=explode(" ", trim($inf));
         }
         $one=explode(">", $xinf)[0];
        }
        if ($one != strtoupper($one) && $one != strtolower($one)) {
        $aspdf="y";
        $emailto=strtolower($one);
        } else if (sizeof($conversers) > 0) {
        $aspdf="Y";
        $emailto=$one;
        } else {
        $emailto=$one;
        }
      } else {
        $innards.="\nform.append('infld" . $nextone . "', \"" . $val . "\");\n";
        $title.="|" . $val;
        $nextone++;
      }
    } else if ($two == "") {
      $two=str_replace("+", " ", urldecode($val));
      if (strpos($two, " ... |") !== false) {
        $one="";
        $fields=explode("|", explode("... |", $two)[1]);
        $two="";
        $gats.="  You can email to an entered email address what you have so far, and mixing the case here also outputs a PDF form of the conversation.  A pseudo email address of a form like Leo Max <Rmetcalfe15@gmail.com> would email rmetcalfe15@gmail.com HTML and PDF attachments, the PDF tabular look indicating that the conversation was between Leo and Max.  ";
        for ($ii=0; $ii<sizeof($fields); $ii++) {
          if ($one == "") {
            $one=$fields[$ii];
          } else if ($two == "") {
            $two=$fields[$ii];
          } else if ($three == "") {
            $three=$fields[$ii];
          } else if ($four == "") {
            $four=$fields[$ii];
          } else {
            $one=$two;
            $two=$three;
            $three=$four;
            $four=$fields[$ii];
          }   
          if ($aspdf != "") {
           if (sizeof($conversers) > 0) {
            $thtml=str_replace('</table>',str_replace('cell 2', $fields[$ii], str_replace('cell 1', $conversers[($iconverser % sizeof($conversers))] . ' says ...', $trow)) . '</table>', $thtml);
            $iconverser++;
           } else {
            $thtml=str_replace('</table>',str_replace('cell 2', $fields[$ii], str_replace('cell 1', $nextone, $trow)) . '</table>', $thtml);
           }
          }       
          $innards.="\nform.append('infld" . $nextone . "', \"" . $fields[$ii] . "\");\n";
          $title.="|" . $fields[$ii];
          $nextone++;
        }

 if ($aspdf != "") {
 $pdf=new PDF();
 $pdf->AddPage();
 $pdf->SetFont('Arial','',12);
 $pdf->WriteHTML($thtml);
 if (strpos($emailto, "@") !== false) {
    $phpcont=$pdf->Output('','S');
 }
 }
      } else {
        $innards.="\nform.append('infld" . $nextone . "', \"" . $val . "\");\n";
        $title.="|" . $val;
        $nextone++;
      }
    } else if ($three == "") {
      $three=str_replace("+", " ", urldecode($val));
      $innards.="\nform.append('infld" . $nextone . "', \"" . $val . "\");\n";
      $title.="|" . $val;
      $nextone++;
    } else if ($four == "") {
      $four=str_replace("+", " ", urldecode($val));
      $innards.="\nform.append('infld" . $nextone . "', \"" . $val . "\");\n";
      $title.="|" . $val;
      $nextone++;
    } else {
      $one=$two;
      $two=$three;
      $three=$four;
      $four=str_replace("+", " ", urldecode($val));
      $innards.="\nform.append('infld" . $nextone . "', \"" . $val . "\");\n";
      $title.="|" . $val;
      $nextone++;
    }
  }
  
  foreach( $_POST as $name=>$val ) {
    if ($one == "") {
      $one=str_replace("+", " ", urldecode($val));
      $innards.="\nform.append('infld" . $nextone . "', \"" . $val . "\");\n";
      $title.="|" . $val;
      $nextone++;
    } else if ($two == "") {
      $two=str_replace("+", " ", urldecode($val));
      $innards.="\nform.append('infld" . $nextone . "', \"" . $val . "\");\n";
      $title.="|" . $val;
      $nextone++;
    } else if ($three == "") {
      $three=str_replace("+", " ", urldecode($val));
      $innards.="\nform.append('infld" . $nextone . "', \"" . $val . "\");\n";
      $title.="|" . $val;
      $nextone++;
    } else if ($four == "") {
      $four=str_replace("+", " ", urldecode($val));
      $innards.="\nform.append('infld" . $nextone . "', \"" . $val . "\");\n";
      $title.="|" . $val;
      $nextone++;
    } else {
      $one=$two;
      $two=$three;
      $three=$four;
      $four=str_replace("+", " ", urldecode($val));
      $innards.="\nform.append('infld" . $nextone . "', \"" . $val . "\");\n";
      $title.="|" . $val;
      $nextone++;
    }
  }
  

  $htmlis = "
<!doctype html>
<html>
<head>
<title>No Body - RJM Programming - October, 2019" . $title . "</title>
<style>

  html::before {
    border: 2px solid red;
    content: \"" . $one . "\";
	height: 150px;
	width: 90%;
	min-width: 100px;
	background: ivory;
	display: inline-block;
	margin: 0 auto;
	border-radius: 0px 0px 130px 0px;
	margin-top: 50px;
    margin-left: 20px;
	font-size: 60px;
	text-align: center;
  }
  
  body::before {
    border: 2px solid blue;
    content: \"" . $two . "\";
	height: 150px;
	width: 40%;
	min-width: 100px;
	background: ivory;
	display: inline-block;
	margin: 0 auto;
	border-radius: 120px 0px 130px;
	margin-top: 50px;
    margin-left: 20px;
	font-size: 60px;
	text-align: center;
  }
  
  body::after {
    border: 2px solid brown;
    content: \"" . $three . "\";
	height: 150px;
	width: 40%;
	min-width: 100px;
	background: ivory;
	display: inline-block;
	margin: 0 auto;
	border-radius: 120px 0px 130px;
	margin-top: 50px;
    margin-left: 20px;
	font-size: 60px;
	text-align: center;
  }
  
  html::after {
    border: 2px solid purple;
    content: \"" . $four . "\";
	height: 150px;
	width: 90%;
	min-width: 100px;
	background: ivory;
	display: inline-block;
	margin: 0 auto;
	border-radius: 0px 0px 0px 130px;
	margin-top: 49px;
    margin-left: 20px;
	font-size: 60px;
	text-align: center;
  } 
  
</style>

<scr" . "ipt type='text/javascript'>

  var nextone='" . $nextone . "';
  var zhr=null, form=null;
  var ezhr=null, eform=null;
  var nextsb='';
  var emailto='';
  var level=1;
  var gats='" . $gats . "';
  var aspdf='" . $aspdf . "';
  
  function showEStuff(evt) {
  if (ezhr.readyState == 4) {
    if (ezhr.status == 200) {
     if (aspdf == '') {
      alert('Emailed to " . $emailto . " this webpage contents as an HTML attachment.'); 
     } else {
      alert('Emailed to " . $emailto . " this webpage converted to PDF as attachment.'); 
     } 
    }
  }
  }
  
  function showStuff(evt) {
  if (zhr.readyState == 4) {
    if (zhr.status == 200) {
      document.title+='|' + nextsb;
      document.write(zhr.responseText);
      if (gats.indexOf('You can ') == -1) {
      gats+='  You can email to an entered email address what you have so far, and mixing the case here also outputs a PDF form of the conversation.  A pseudo email address of a form like Leo Max <Rmetcalfe15@gmail.com> would email rmetcalfe15@gmail.com HTML and PDF attachments, the PDF tabular look indicating that the conversation was between Leo and Max. ';
      }
    }
  }
  }
  
  function doemail() {
  ezhr=new XMLHttpRequest();
  eform=new FormData();
  eform.append('to', '" . $emailto . "');
  eform.append('subject', 'Speech Bubbles');
  eform.append('html', '<html><head>' + document.head.innerHTML.split('<sc' + 'ript')[0].replace(' 49px',' -400px') + '</head><!--body></body--></html>');
  ezhr.open('post', '//www.rjmprogramming.com.au/HTMLCSS/emailhtml.php', true);
  ezhr.onreadystatechange = showEStuff;
  ezhr.send(eform);
  }
  
  function donext(nextv) {
  zhr=new XMLHttpRequest();
  form=new FormData();
  " . $innards . " 
  form.append('infld' + nextone, nextv);
  zhr.open('post', document.URL.split('#')[0].split('?')[0], true);
  zhr.onreadystatechange = showStuff;
  zhr.send(form);
  }

  function andthen() {
  if (level == 1) {
  nextsb=prompt(gats, '');
  if (nextsb != null) { 
  if (nextsb.indexOf('@') != -1 && (nextsb.indexOf(' ') == -1 || nextsb.indexOf('<') != -1) && document.title.indexOf('|') != -1) { emailto=nextsb;   if (emailto.indexOf(' ') != -1 && emailto.indexOf('<') != -1 && 1 == 7) { emailto=emailto.replace(/\ /g, '_'); } level++; nextsb=''; }
  }
  } else if (level == 2) {
  emailto=prompt('Email to?   A mixing of case here also outputs a PDF form of the conversation.   A pseudo email address of a form like Leo Max <Rmetcalfe15@gmail.com> would email rmetcalfe15@gmail.com HTML and PDF attachments, the PDF tabular look indicating that the conversation was between Leo and Max. ', '');
  if (emailto == null) { emailto=''; }
  if (emailto.indexOf('@') == -1) { emailto=''; }
  if (emailto.indexOf(' ') != -1 && emailto.indexOf('<') != -1 && 1 == 7) { emailto=emailto.replace(/\ /g, '_'); }
  }
  if (nextsb == null) { level++; nextsb=''; }
  if (nextsb.trim() != '') {
  donext(nextsb); 
  } else if (level == 2) {
  if (emailto == '') { emailto=prompt('Email to?   A mixing of case here also outputs a PDF form of the conversation.   A pseudo email address of a form like Leo Max <Rmetcalfe15@gmail.com> would email rmetcalfe15@gmail.com HTML and PDF attachments, the PDF tabular look indicating that the conversation was between Leo and Max. ', ''); }
  if (emailto == null) { emailto=''; }
  if (emailto.indexOf('@') == -1) { emailto=''; }
  }
  if (emailto.indexOf('@') != -1) {
  location.href=document.URL.split('#')[0].split('?')[0] + '?to=' + encodeURIComponent(emailto) + '&rest=' + encodeURIComponent(document.title);
  }
  }
  
  function nothing() {
  }

  setTimeout(andthen, eval(nextone * 2000));
</scr" . "ipt>
</head>
<!--body>
</body-->
</html>";

  if ($aspdf != "" && $emailto != "") {
 if (strpos($emailto, "@") !== false) {
                $filename="htmlattachment.pdf";
                $fns=["htmlattachment.pdf", "htmlattachment.html"];
 //header('Content-type: application/pdf'); 
                $fnc=[chunk_split(base64_encode($phpcont)), chunk_split(base64_encode(explode("<s" . "cript", $htmlis)[0] . "</head></html>"))];
                //$phpcont=$pdf->Output('S');
                $body="";
   
                $subject = "Speech Bubbles";
                $eol = PHP_EOL;
                $headers = 'From: ' . 'rmetcalfe@rjmprogramming.com.au' . $eol;
                $headers .= 'Reply-To: ' . 'rmetcalfe@rjmprogramming.com.au' . $eol;

                //$uid = md5(uniqid(time()));

                // a random hash will be necessary to send mixed content
                $separator = md5(time());

                $headers .= "MIME-Version: 1.0" . $eol;
                $headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol . $eol;
                $headers .= "Content-Transfer-Encoding: 7bit" . $eol;
                $headers .= "This is a MIME encoded message." . $eol . $eol;

                // message
                $headers .= "--" . $separator . $eol;
                $headers .= "Content-Type: text/plain; charset=\"iso-8859-1\"" . $eol;
                $headers .= "Content-Transfer-Encoding: 8bit" . $eol . $eol;

                if ($phpcont != "" || sizeof($fns) > 1) {
                if (sizeof($fns) > 1) {
                $headers .= "Please see attachments created via HTTP://www.rjmprogramming.com.au/PHP/no_body.php below:" . $eol . $eol;
                } else {
                $headers .= "Please see attachment created via HTTP://www.rjmprogramming.com.au/PHP/no_body.php below:" . $eol . $eol;
                }

                for ($ic=0; $ic<sizeof($fns); $ic++) {
                // attachment
                $headers .= "--" . $separator . $eol;
                $headers .= "Content-Type: application/octet-stream; name=\"" . $fns[$ic] . "\"" . $eol;
                $headers .= "Content-Transfer-Encoding: base64" . $eol;
                $headers .= "Content-Disposition: attachment;filename=\"" . $fns[$ic] . "\"" . $eol;
                $headers .= $fnc[$ic] . $eol . $eol;
                }
                } else {
                //$subject=str_replace("HTML Email Attachment", "Email", $subject);
    //file_put_contents("inv.inv999908", "" . str_replace("\n"," ",str_replace("<br>","\n",$body)));
                $headers .= $body . $eol . $eol;
                }

                $headers .= "--" . $separator . "--";

                mail($emailto, $subject, "", $headers);
                $emailto="";
                //exit;  
                if ($aspdf == "Y") {
 header('Content-type: application/pdf'); 
 echo $phpcont;
 exit;
                } 
 }
  
  } else if ($aspdf != "") {
 header('Content-type: application/pdf'); 
 $pdf->Output();
 exit;
  }
  
  if ($emailto != "") {
    echo str_replace("setTimeout(", "\n doemail(); \n setTimeout(", $htmlis);
  } else {
    echo $htmlis;
  }
?>
