{"id":52532,"date":"2021-06-18T03:01:33","date_gmt":"2021-06-17T17:01:33","guid":{"rendered":"http:\/\/www.rjmprogramming.com.au\/ITblog\/?p=52532"},"modified":"2021-06-17T21:00:35","modified_gmt":"2021-06-17T11:00:35","slug":"audio-and-video-creator-via-media-browsing-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/audio-and-video-creator-via-media-browsing-tutorial\/","title":{"rendered":"Audio and Video Creator via Media Browsing Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php?allowaudio=yes&#038;allowvideo=yes\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Audio and Video Creator via Media Browsing Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_audiovideo.jpg\" title=\"Audio and Video Creator via Media Browsing Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Audio and Video Creator via Media Browsing Tutorial<\/p><\/div>\n<p>A couple of days ago with <a target=_blank href='https:\/\/www.rjmprogramming.com.au\/ITblog\/textarea-to-speech-via-macos-itunes-tutorial\/' title='TextArea to Speech via macOS iTunes Tutorial'>TextArea to Speech via macOS iTunes Tutorial<\/a> we surmised &#8230;<\/p>\n<blockquote cite='https:\/\/www.rjmprogramming.com.au\/ITblog\/textarea-to-speech-via-macos-itunes-tutorial\/'><p>\nWe can feel some PHP \u201caudio functionality\u201d ideas coming on <font size=\"1\">\u2026 perhaps we  need to take a <a target=\"_blank\" title=\"Take a Bex ... and ...\" href=\"https:\/\/www.youtube.com\/watch?v=q0rsiC-C8hs\">Bex<\/a> and have a lie down<\/font>.\n<\/p><\/blockquote>\n<p> &#8230; and so today we take the first steps in our &#8220;idea set&#8221;.<\/p>\n<p>Our last mention of our Animated GIF creator PHP web application was with <a title='Animated Gif Creator Variable Slide Delays Tutorial' href='#agcvsdt'>Animated Gif Creator Variable Slide Delays Tutorial<\/a> and, today, we expand its capabilities, at this stage hidden to the user, of being able to accept &#8230;<\/p>\n<ul>\n<li>(its usual) image media (that creates Animated GIF images) &#8230; but, also, new as of today &#8230;<\/li>\n<li>audio media browsed for file(s)<\/li>\n<li>video media browsed for file(s)<\/li>\n<\/ul>\n<p> &#8230; the latter two, if the whole is the some of the parts, being able to be sequenced if the user chooses to play the first audio\/video media file first.  Another &#8220;synchronization&#8221; effort to add to our list!<\/p>\n<p><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php----------------------------GETME\" title=\"tutorial_to_animated_gif.php\">The changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php----------------------------GETME\" title=\"tutorial_to_animated_gif.php\">tutorial_to_animated_gif.php<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\" title=\"Click picture\">animated GIF creator<\/a> web application can also be a <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php?allowaudio=yes&#038;allowvideo=yes\" title=\"Click picture\">audio\/video creator<\/a> web application which calls on <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html-----------------GETME\">a changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html-----------------GETME\">client_browsing.htm<\/a> HTML\/Javascript media browsing helper.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/audio-and-video-creator-via-media-browsing-tutorial\/'Audio and Video Creator via Media Browsing Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agcvsdt'>Previous relevant <a target=_blank title='Animated Gif Creator Variable Slide Delays Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creator-variable-slide-delays-tutorial\/'>Animated Gif Creator Variable Slide Delays Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated Gif Creator Variable Slide Delays Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/animatedgif_delays.jpg\" title=\"Animated Gif Creator Variable Slide Delays Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Animated Gif Creator Variable Slide Delays Tutorial<\/p><\/div>\n<p>When thinking about the animated GIFs produced by the PHP (writes PHP) web application of the recent <a title='Animated Gif Creator Image Filters Tutorial' href='#agcift'>Animated Gif Creator Image Filters Tutorial<\/a> compared to videos &#8230; well, we can&#8217;t help you with the soundtrack, but how about that way a video can transfix us with a &#8220;lingering view&#8221; <font size=1>(notice how we don&#8217;t use the word &#8220;slide&#8221;)<\/font>?  But what if we could have a mechanism by which an animated GIF presentation could have its version of a &#8220;lingering view&#8221; &#8230;<\/p>\n<blockquote><p>\nan increased delay applied after the slide (for lingering) being currently displayed in the animated GIF\n<\/p><\/blockquote>\n<p> &#8230; being so catchy, huh?!<\/p>\n<p>We actually readied some parts of the PHP code for this when we interfaced the Inhouse Animated GIF Creator&#8217;s involvement with our Haiku web application of <a title='Haiku Multimedia via Media Record Genericization Tutorial' href='#hmmrgt'>Haiku Multimedia via Media Record Genericization Tutorial<\/a>, but must have forgotten to follow through on the idea for non-Haiku scenarios <font size=1>(those rare occasions in life?!)<\/font>.<\/p>\n<p>The recent <a title='Animated Gif Creator Image Filters Tutorial' href='#agcift'>Animated Gif Creator Image Filters Tutorial<\/a> did us a huge favour here &#8220;PHP code organization wise&#8221; when we introduced that &#8220;function ingif($php_content_of_php)&#8221; last gasp way of making amendments to that second phase PHP which goes on to create the animated GIF for you <font size=1>(that is, if you don&#8217;t ask too much of it resource wise)<\/font>.<\/p>\n<p>So now, where the first phase asks for a delay value, via a textbox, that textbox&#8217;s advice now goes along the lines of &#8230;<\/p>\n<blockquote><p>\nComma separated list noticed, with first value being default for undefined ones.  Plus and minus values do delays relative to previous delay.\n<\/p><\/blockquote>\n<p> &#8230; to work with the <font color=blue>new PHP code<\/font> within <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php--------------------------GETME\" title=\"tutorial_to_animated_gif.php\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php--------------------------GETME\" title=\"tutorial_to_animated_gif.php\">tutorial_to_animated_gif.php<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\" title=\"Click picture\">animated GIF creator<\/a> web application, as per &#8230;<\/p>\n<p>&lt;?php<br \/>\n<code><br \/>\nfunction ingif($gp) {<br \/>\n  global $foundtitle, $wtsuffix, $atext, $filteretc, $enumber, $ow, $oh, $owend, $ohend, $diffow, $diffoh<font color=blue>, $delay, $vdy<\/font>;<br \/>\n  <font color=blue>$indelay=$delay;<br \/>\n  if (isset($_GET['delay'])) { $indelay=str_replace(\" \",\"+\",urldecode($_GET['delay'])); }<br \/>\n  if (isset($_POST['delay'])) { $indelay=str_replace(\" \",\"+\",urldecode($_POST['delay'])); }<br \/>\n  if (strpos($indelay, \",\") !== false) {<br \/>\n   if (strpos($gp, (\"framed\" . \"[\" . \"]=\" . $vdy . \";\")) !== false) {<br \/>\n     $gpf=explode(\"framed\" . \"[\" . \"]=\" . $vdy . \";\", $gp)[0];<br \/>\n     $gp=str_replace($gpf . \"framed\" . \"[\" . \"]=\" . $vdy . \";\", $gpf . \"framed\" . \"[\" . \"] = \" . $vdy . \";\", $gp); \/\/, 1);<br \/>\n     $delaysare=explode(\",\", $indelay);<br \/>\n     for ($iuy=1; $iuy&lt;sizeof($delaysare); $iuy++) {<br \/>\n      if (strpos($gp, (\"framed\" . \"[\" . \"]=\" . $vdy . \";\")) !== false) {<br \/>\n       $gpf=explode(\"framed\" . \"[\" . \"]=\" . $vdy . \";\", $gp)[0];<br \/>\n       if (trim($delaysare[$iuy]) == '') {<br \/>\n       $gp=str_replace($gpf . \"framed\" . \"[\" . \"]=\" . $vdy . \";\", $gpf . \"framed\" . \"[\" . \"] = \" . $vdy . \";\", $gp); \/\/, 1);<br \/>\n       } else if (strpos($delaysare[$iuy], \"+\") !== false) {<br \/>\n       $delaysare[$iuy]='' . ($delaysare[-1 + $iuy] + substr($delaysare[$iuy],1));<br \/>\n       $gp=str_replace($gpf . \"framed\" . \"[\" . \"]=\" . $vdy . \";\", $gpf . \"framed\" . \"[\" . \"] = \" . $delaysare[$iuy] . \";\", $gp); \/\/, 1);<br \/>\n       } else if (strpos($delaysare[$iuy], \"-\") !== false) {<br \/>\n       $delaysare[$iuy]='' . ($delaysare[-1 + $iuy] - substr($delaysare[$iuy],1));<br \/>\n       $gp=str_replace($gpf . \"framed\" . \"[\" . \"]=\" . $vdy . \";\", $gpf . \"framed\" . \"[\" . \"] = \" . $delaysare[$iuy] . \";\", $gp); \/\/, 1);<br \/>\n       } else {<br \/>\n       $gp=str_replace($gpf . \"framed\" . \"[\" . \"]=\" . $vdy . \";\", $gpf . \"framed\" . \"[\" . \"] = \" . $delaysare[$iuy] . \";\", $gp); \/\/, 1);<br \/>\n       }<br \/>\n      }<br \/>\n     }<br \/>\n   }<br \/>\n  } <\/font><br \/>\n  $enbit=\"\";<br \/>\n  $outgp=$gp;<br \/>\n  \/\/<br \/>\n  \/\/ Rest of last gasp changes (of recent times) follows ...<br \/>\n  \/\/<br \/>\n}<br \/>\n<\/code><br \/>\n?&gt;<\/p>\n<p> &#8230; enabling you to refine your animated GIF aesthetics, we personally being of the belief that an animated GIF loses a lot of nuance if its delays between slides are all the same.  It can feel quite robotic at times.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creator-varibale-slide-delays-tutorial\/'>Animated Gif Creator Variable Slide Delays Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agcift'>Previous relevant <a target=_blank title='Animated Gif Creator Image Filters Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creator-image-filters-tutorial\/'>Animated Gif Creator Image Filters Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated Gif Creator Image Filters Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/my_negated_gif.jpg\" title=\"Animated Gif Creator Image Filters Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Animated Gif Creator Image Filters Tutorial<\/p><\/div>\n<p>On top of the functionality of yesterday&#8217;s <a title='Animated Gif Creator Image Dimensions Tutorial' href='#agcidt'>Animated Gif Creator Image Dimensions Tutorial<\/a> we want to offer &#8230;<\/p>\n<p><code><br \/>\nPHP GD library <a target=_blank title='PHP GD imagefilter function information' href='https:\/\/www.php.net\/manual\/en\/function.imagefilter.php'>imagefilter<\/a> functionality<br \/>\n<\/code><\/p>\n<p>Here&#8217;s our table of context for <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php-------------------------GETME\" title=\"tutorial_to_animated_gif.php\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php-------------------------GETME\" title=\"tutorial_to_animated_gif.php\">tutorial_to_animated_gif.php<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\" title=\"Click picture\">animated GIF creator<\/a> web application &#8230;<\/p>\n<table>\n<tr>\n<th>Comes into play as a recall PHP execution receives HTML form data<\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php<br \/>\n<code><br \/>\n$filteretc=\"\";<br \/>\n$fhc=\"Image\";<br \/>\nif (isset($_GET['filteretc'])) {<br \/>\n  $filteretc=str_replace(\"+\",\" \",urldecode($_GET['filteretc']));<br \/>\n  $fhc=str_replace(explode(\"IMG_\",$filteretc)[1] . '\"',explode(\"IMG_\",$filteretc)[1] . '\" selected',('&lt;select title=\"Image\" onchange=\"filteretcit(this);\" id=\"sfilteris\"&gt;&lt;option value=\"\"&gt;Image&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_EMBOSS); \"&gt;Embossed Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_NEGATE); \"&gt;Negated Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_COLORIZE, 255, 0, 0); \"&gt;Red Colourized Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_COLORIZE, 0, 255, 0); \"&gt;Green Colourized Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_COLORIZE, -127.12, -127.98, 127); \"&gt;Colourized Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_COLORIZE, 0, 0, 255);  \"&gt;Blue Colourized Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_PIXELATE, 3); \"&gt;Pixellated Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_SMOOTH, -1924.124); \"&gt;Smoothed Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_CONTRAST, -90); \"&gt;Contrasted Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_BRIGHTNESS, 98); \"&gt;Brightened Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_MEAN_REMOVAL); \"&gt;Mean Removal Image(s)&lt;\/option&gt;&lt;\/select&gt;'));<br \/>\n} else if (isset($_POST['filteretc'])) {<br \/>\n  $filteretc=str_replace(\"+\",\" \",urldecode($_POST['filteretc']));<br \/>\n  $fhc=str_replace(explode(\"IMG_\",$filteretc)[1] . '\"',explode(\"IMG_\",$filteretc)[1] . '\" selected',('&lt;select title=\"Image\" onchange=\"filteretcit(this);\" id=\"sfilteris\"&gt;&lt;option value=\"\"&gt;Image&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_EMBOSS); \"&gt;Embossed Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_NEGATE); \"&gt;Negated Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_COLORIZE, 255, 0, 0); \"&gt;Red Colourized Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_COLORIZE, 0, 255, 0); \"&gt;Green Colourized Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_COLORIZE, -127.12, -127.98, 127); \"&gt;Colourized Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_COLORIZE, 0, 0, 255);  \"&gt;Blue Colourized Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_PIXELATE, 3); \"&gt;Pixellated Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_SMOOTH, -1924.124); \"&gt;Smoothed Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_CONTRAST, -90); \"&gt;Contrasted Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_BRIGHTNESS, 98); \"&gt;Brightened Image(s)&lt;\/option&gt;&lt;option value=\" imagefilter($image, IMG_FILTER_MEAN_REMOVAL); \"&gt;Mean Removal Image(s)&lt;\/option&gt;&lt;\/select&gt;'));<br \/>\n}<br \/>\n<\/code><br \/>\n?&gt;\n<\/td>\n<\/tr>\n<tr>\n<th>Again as PHP writes out the PHP to create the animated GIF, <font color=blue>an example<\/font> &#8230; <\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\n$eachone=\" if (\\$randomizematch == '' || \\$randomizematch == \\\"\\$randomizeloopcnt\\\") {<br \/>\n<br \/>\n\\$progtext='';<br \/>\n\\$text='';<br \/>\n<br \/>\n\/\/ Open the first source image and add the text.<br \/>\n\\$image = imagecreatefromjpeg('source01.jpg');<br \/>\n\" . $setwh . \"<br \/>\n\\$text_color = imagecolorallocate(\\$image, \" . $r200 . \", \" . $g200 . \", \" . $b200 . \");<br \/>\n\\$black = imagecolorallocatealpha(\\$image, 254, 254, 254, 0);<br \/>\n<font color=blue> if (98 == 97) { \\$progtext=\\$progtext; } <\/font><br \/>\nimagestring(\\$image, 5, 5, 5,  \\$text, \\$text_color);<br \/>\nif (\\$progtext != '') {<br \/>\n  if (strpos(\\$progtext, '  ') !== false) {<br \/>\n  imagettftext(\\$image, 6, 0, (strlen(\\$text) * 12), 21, \\$text_color, realpath('DejaVuSansMono.ttf'), \\$progtext);<br \/>\n  } else if (strpos(\\$progtext, ' ') !== false) {<br \/>\n  imagettftext(\\$image, 10, 0, (strlen(\\$text) * 12), 21, \\$text_color, realpath('DejaVuSansMono.ttf'), \\$progtext);<br \/>\n  } else {<br \/>\n  imagettftext(\\$image, 20, 0, (strlen(\\$text) * 12), 21, \\$text_color, realpath('DejaVuSansMono.ttf'), \\$progtext);<br \/>\n  }<br \/>\n}<br \/>\n<br \/>\n\/\/ Generate GIF from the $image<br \/>\n\/\/ We want to put the binary GIF data into an array to be used later,<br \/>\n\/\/  so we use the output buffer.<br \/>\nob_start();<br \/>\nimagegif(\\$image);<br \/>\n\\$frames[]=ob_get_contents();<br \/>\n\\$framed[]=40; \/\/ Delay in the animation.<br \/>\nob_end_clean();<br \/>\n\/\/ And again..<br \/>\n}<br \/>\n\";<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;\n<\/td>\n<\/tr>\n<tr>\n<th>Used as PHP writes PHP <font color=blue>in this way<\/font> &#8230; <\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php<br \/>\n<code><br \/>\nfunction ingif($gp) {<br \/>\n  global $foundtitle, $wtsuffix, $atext<font color=blue>, $filteretc<\/font>;<br \/>\n  $outgp=$gp;<br \/>\n  if ($wtsuffix != ''<font color=blue> || $filteretc != ''<\/font>) {<br \/>\n<font color=blue>\/\/<\/font>$bits=explode(\"\\$image = \", $gp);<br \/>\n<font color=blue>  $bits=explode(\"if (98 == 97)\", $gp);<\/font><br \/>\n  if (sizeof($bits) &gt; 1) {<br \/>\n  $outgp=\"\";<br \/>\n  for ($ii=0; $ii&lt;(-1 + sizeof($bits)); $ii++) {<br \/>\n    $outgp.=lastcountidea($ii, (-1 + sizeof($bits)), $wtsuffix, $bits[$ii]<font color=blue> . \"\\n \" . $filteretc . \"\\n if (98 == 97)\"<\/font>);<br \/>\n  }<br \/>\n  $outgp.=$bits[-1 + sizeof($bits)];<br \/>\n  }<br \/>\n  }<br \/>\n  return $outgp;<br \/>\n}<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;\n<\/td>\n<\/tr>\n<tr>\n<th>And in order to correctly set the value of that <font color=purple>new span element (ready to host a dropdown (select) element for image filtering that replaces a hardcoded &#8220;Image&#8221; word with Image Filtering dropdown options presented for user interaction)<\/font> in a recall scenario, in this <font color=blue>PHP writes Javascript<font> code snippet change<\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\nTutorial Slideshow &lt;a style='cursor:pointer;text-decoration:none;' onclick=\\\" if (document.getElementById('slideshow').value.toLowerCase().indexOf('.htm') != -1) { window.open(document.getElementById('slideshow').value,'_blank'); } \\\"&gt;HTML&lt;\/a&gt; or <font color=purple>&lt;span id=ifilter&gt;\" . $fhc . \"&lt;\/span&gt;<\/font> &lt;input title='Please note a minus between numericals can define a URL range of image URLs and that an Audio URL or Video URL (or browsed for above) causes the resultant Animated GIF to be its background image' placeholder='Append #comment[~second line] for animated GIF watermarks (that are red if first slide has such a comment) ... {[unicode]} for some emojis and an Audio URL or Video URL (or browsed for above) causes the resultant Animated GIF to be its background image' onblur=\\\"maybemore(this.value, 'slideshow1', this);\\\" style='width:70%;' data-wh='' type='text' id='slideshow' name='slideshow' value='\" . $url . \"'&gt;&lt;\/input&gt;&lt;br&gt;&lt;br&gt;<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;\n<\/td>\n<\/tr>\n<tr>\n<th>And the PHP writes HTML new HTML form type=hidden fields that navigate up to the recalled PHP as well as the iframe element that will help gather animated GIF image slide dimensions<\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\n&lt;input name=filteretc id=filteretc value=\\\"\" . $filteretc . \"\\\" type=hidden&gt;&lt;\/input&gt;<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;\n<\/td>\n<\/tr>\n<tr>\n<th>Used by that select onchange logic&#8217;s PHP writing Javascript called (<font color=blue>and other<\/font>) functions<\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\nfunction filteretcit(oself) {<br \/>\n  var xsuffis='';<br \/>\n  if (oself.value.indexOf('imagefilter(') != -1) {<br \/>\n    document.getElementById('filteretc').value=oself.value;<br \/>\n  for (var i=0; i&lt;oself.options.length; i++) {<br \/>\n    if (oself.options[i].selected) {<br \/>\n      if (oself.options[i].value != '') {<br \/>\n        xsuffis=' ... ' + oself.options[i].innerText;<br \/>\n      }<br \/>\n    }<br \/>\n  }<br \/>\n    oself.title=oself.value + xsuffis;<br \/>\n  } else {<br \/>\n    document.getElementById('filteretc').value=oself.value;<br \/>\n    document.getElementById('filteretc').title='Image';<br \/>\n  }<br \/>\n  \/\/oself.value='';<br \/>\n}<br \/>\n<br \/>\nfunction selitize(thiswh) {<br \/>\n  if (thiswh.trim() != '') {<br \/>\n   if (document.getElementById('selwhs').outerHTML.indexOf(thiswh) == -1) {<br \/>\n     document.getElementById('selwhs').style.display='inline-block';<br \/>\n     document.getElementById('selwhs').innerHTML+='&lt;option value=\\\"' + thiswh + '\\\"&gt;' + thiswh.replace(',',' x ') + '&lt;\/option&gt;';<br \/>\n     if (document.getElementById('selwhs').outerHTML.indexOf('?') == -1) {<br \/>\n     if (thiswh.indexOf(',') != -1) {<br \/>\n     document.getElementById('fow').value=thiswh.split(',')[0];<br \/>\n     document.getElementById('foh').value=thiswh.split(',')[1];<br \/>\n     }<br \/>\n     document.getElementById('selwhs').innerHTML+='&lt;option value=\\\"?\\\"&gt;You Enter Width,Height&lt;\/option&gt;';<br \/>\n     <font color=blue>document.getElementById('ifilter').innerHTML='&lt;select title=\\\"Image\\\" onchange=filteretcit(this); id=sfilteris&gt;&lt;option value=\\\"\\\"&gt;Image&lt;\/option&gt;&lt;\/select&gt;';<br \/>\n     document.getElementById('sfilteris').innerHTML+='&lt;option value=\\\" imagefilter(\\$image, IMG_FILTER_EMBOSS); \\\"&gt;Embossed Image(s)&lt;\/option&gt;';<br \/>\n     document.getElementById('sfilteris').innerHTML+='&lt;option value=\\\" imagefilter(\\$image, IMG_FILTER_NEGATE); \\\"&gt;Negated Image(s)&lt;\/option&gt;';<br \/>\n     document.getElementById('sfilteris').innerHTML+='&lt;option value=\\\" imagefilter(\\$image, IMG_FILTER_COLORIZE, 255, 0, 0); \\\"&gt;Red Colourized Image(s)&lt;\/option&gt;';<br \/>\n     document.getElementById('sfilteris').innerHTML+='&lt;option value=\\\" imagefilter(\\$image, IMG_FILTER_COLORIZE, 0, 255, 0); \\\"&gt;Green Colourized Image(s)&lt;\/option&gt;';<br \/>\n     document.getElementById('sfilteris').innerHTML+='&lt;option value=\\\" imagefilter(\\$image, IMG_FILTER_COLORIZE, -127.12, -127.98, 127); \\\"&gt;Colourized Image(s)&lt;\/option&gt;';<br \/>\n     document.getElementById('sfilteris').innerHTML+='&lt;option value=\\\" imagefilter(\\$image, IMG_FILTER_COLORIZE, 0, 0, 255);  \\\"&gt;Blue Colourized Image(s)&lt;\/option&gt;';<br \/>\n     document.getElementById('sfilteris').innerHTML+='&lt;option value=\\\" imagefilter(\\$image, IMG_FILTER_PIXELATE, 3); \\\"&gt;Pixellated Image(s)&lt;\/option&gt;';<br \/>\n     document.getElementById('sfilteris').innerHTML+='&lt;option value=\\\" imagefilter(\\$image, IMG_FILTER_SMOOTH, -1924.124); \\\"&gt;Smoothed Image(s)&lt;\/option&gt;';<br \/>\n     document.getElementById('sfilteris').innerHTML+='&lt;option value=\\\" imagefilter(\\$image, IMG_FILTER_CONTRAST, -90); \\\"&gt;Contrasted Image(s)&lt;\/option&gt;';<br \/>\n     document.getElementById('sfilteris').innerHTML+='&lt;option value=\\\" imagefilter(\\$image, IMG_FILTER_BRIGHTNESS, 98); \\\"&gt;Brightened Image(s)&lt;\/option&gt;';<br \/>\n     document.getElementById('sfilteris').innerHTML+='&lt;option value=\\\" imagefilter(\\$image, IMG_FILTER_MEAN_REMOVAL); \\\"&gt;Mean Removal Image(s)&lt;\/option&gt;'; <\/font><br \/>\n     }<br \/>\n   }<br \/>\n  }<br \/>\n  return thiswh;<br \/>\n}<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;\n<\/td>\n<\/tr>\n<\/table>\n<p><b><i>Did you know?<\/i><\/b><\/p>\n<p>As progress, also, we&#8217;ve added to the second presentation part of your created animated GIF the &#8220;click&#8221; ability to download the animated GIF to your local device or computer.  Here on this MacBook Pro (using macOS Mojave), to further open that downloaded animated GIF did something very interesting.  Even though the downloaded file was downloaded into the Downloads folder as &#8220;my_rjm_gif.gif&#8221; as a default application to use with a &#8220;click&#8221; on it (ie. its &#8220;association&#8221; application) we were surprised it opened in <a target=_blank title='PreView (on a Mac) information from Apple' href='https:\/\/support.apple.com\/en-us\/HT201740'>Preview<\/a> (usually the preserve of all things PDF) and displayed like a PDF with all the images making up its &#8220;slides&#8221; showing as &#8220;slides&#8221; in Preview.  Cute, huh?!<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creator-image-filters-tutorial\/'>Animated Gif Creator Image Filters Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agcidt'>Previous relevant <a target=_blank title='Animated Gif Creator Image Dimensions Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creator-image-dimensions-tutorial\/'>Animated Gif Creator Image Dimensions Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated Gif Creator Image Dimensions Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/my_sized_gif.jpg\" title=\"Animated Gif Creator Image Dimensions Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Animated Gif Creator Image Dimensions Tutorial<\/p><\/div>\n<p>You can&#8217;t really claim to have a fully tailorable image creation process if you can&#8217;t allow the user to have some control over the final &#8230;<\/p>\n<p><code><br \/>\nwidth x height<br \/>\n<\/code><\/p>\n<p> &#8230; image dimensions.  As you develop webpages you will find requirements to fit images into set spaces, and that is all okay if the images suit those dimensions exactly, or proportionally.  And that is where the PHP GD library <a target=_blank title='PHP GD function imagescale information' href='https:\/\/www.php.net\/manual\/en\/function.imagescale.php'>imagescale<\/a> function can come in handy.<\/p>\n<p>So, on our quest to improve on the Animated GIF Creator web application of yesterday&#8217;s <a title='Animated Gif Creator Watermark Display Mode Tutorial' href='#agcwdmt'>Animated Gif Creator Watermark Display Mode Tutorial<\/a> there is a <font color=blue>one PHP codeline of difference<\/font> to make this animated GIF dimensions be user controllable &#8230;<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\n$eachone=\" if (\\$randomizematch == '' || \\$randomizematch == \\\"\\$randomizeloopcnt\\\") {<br \/>\n<br \/>\n\\$text='';<br \/>\n<br \/>\n\/\/ Open the first source image and add the text.<br \/>\n\\$image = imagecreatefromjpeg('source01.jpg');<br \/>\n<font color=blue>\" . $setwh . \"<\/font><br \/>\n\\$text_color = imagecolorallocate(\\$image, \" . $r200 . \", \" . $g200 . \", \" . $b200 . \");<br \/>\nimagestring(\\$image, 5, 5, 5,  \\$text, \\$text_color);<br \/>\n<br \/>\n\/\/ Generate GIF from the $image<br \/>\n\/\/ We want to put the binary GIF data into an array to be used later,<br \/>\n\/\/  so we use the output buffer.<br \/>\nob_start();<br \/>\nimagegif(\\$image);<br \/>\n\\$frames[]=ob_get_contents();<br \/>\n\\$framed[]=40; \/\/ Delay in the animation.<br \/>\nob_end_clean();<br \/>\n\/\/ And again..<br \/>\n}<br \/>\n\";<br \/>\n<\/code><br \/>\n&#8220;; &gt;<\/p>\n<p> &#8230; but am guessing you&#8217;d want some context around that, wouldn&#8217;t you, for <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php-----------------------GETME\" title=\"tutorial_to_animated_gif.php\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php-----------------------GETME\" title=\"tutorial_to_animated_gif.php\">tutorial_to_animated_gif.php<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\" title=\"Click picture\">animated GIF creator<\/a> web application?!<\/p>\n<table>\n<tr>\n<th>Comes into play as a recall PHP execution receives HTML form data<\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php<br \/>\n<code><br \/>\n$setwh=\"\";<br \/>\n$ow=-1;<br \/>\n$oh=-1;<br \/>\n$setwhd=\"none\";<br \/>\n$setwhihs=\"\";<br \/>\nif (isset($_GET['ow']) && isset($_GET['oh'])) {<br \/>\n  if (strlen(urldecode($_GET['ow'])) != 0 && strpos(urldecode($_GET['ow']), \"-\") === false) {<br \/>\n   $ow=trim(str_replace(\"+\",\" \",urldecode($_GET['ow'])));<br \/>\n   if (strlen(urldecode($_GET['oh'])) != 0 && strpos(urldecode($_GET['oh']), \"-\") === false) {<br \/>\n    $oh=trim(str_replace(\"+\",\" \",urldecode($_GET['oh'])));<br \/>\n   }<br \/>\n   $setwh=\"\\n \\$image=imagescale(\\$image, \" . $ow . \", \" . $oh . \"); \\n\";<br \/>\n   $setwhd=\"inline-block\";<br \/>\n   if (isset($_GET['fow']) && isset($_GET['foh'])) {<br \/>\n   $setwhihs=\"&lt;option value='\" . trim(str_replace(\"+\",\" \",urldecode($_GET['fow']))) . \",\" . trim(str_replace(\"+\",\" \",urldecode($_GET['foh']))) . \"'&gt;\" . trim(str_replace(\"+\",\" \",urldecode($_GET['fow']))) . \" x \" . trim(str_replace(\"+\",\" \",urldecode($_GET['foh']))) . \"&lt;\/option&gt;&lt;option value='\" . $ow . \",\" . $oh . \"' selected&gt;\" . $ow . \" x \" . $oh . \"&lt;\/option&gt;&lt;option value=?&gt;You Enter Width,Height&lt;\/option&gt;\";<br \/>\n   } else {<br \/>\n   $setwhihs=\"&lt;option value='\" . $ow . \",\" . $oh . \"' selected&gt;\" . $ow . \" x \" . $oh . \"&lt;\/option&gt;\";<br \/>\n   }<br \/>\n  } else if (strlen(urldecode($_GET['oh'])) != 0 && strpos(urldecode($_GET['oh']), \"-\") === false) {<br \/>\n   $oh=trim(str_replace(\"+\",\" \",urldecode($_GET['oh'])));<br \/>\n   $setwh=\"\\n \\$image=imagescale(\\$image, \" . $ow . \", \" . $oh . \"); \\n\";<br \/>\n   $setwhd=\"inline-block\";<br \/>\n   if (isset($_GET['fow']) && isset($_GET['foh'])) {<br \/>\n   $setwhihs=\"&lt;option value='\" . trim(str_replace(\"+\",\" \",urldecode($_GET['fow']))) . \",\" . trim(str_replace(\"+\",\" \",urldecode($_GET['foh']))) . \"'&gt;\" . trim(str_replace(\"+\",\" \",urldecode($_GET['fow']))) . \" x \" . trim(str_replace(\"+\",\" \",urldecode($_GET['foh']))) . \"&lt;\/option&gt;&lt;option value='\" . $ow . \",\" . $oh . \"' selected&gt;\" . $ow . \" x \" . $oh . \"&lt;\/option&gt;&lt;option value=?&gt;You Enter Width,Height&lt;\/option&gt;\";<br \/>\n   } else {<br \/>\n   $setwhihs=\"&lt;option value='\" . $ow . \",\" . $oh . \"' selected&gt;\" . $ow . \" x \" . $oh . \"&lt;\/option&gt;\";<br \/>\n   }<br \/>\n  }<br \/>\n} else if (isset($_POST['ow']) && isset($_POST['oh'])) {<br \/>\n  if (strlen(urldecode($_POST['ow'])) != 0 && strpos(urldecode($_POST['ow']), \"-\") === false) {<br \/>\n   $ow=trim(str_replace(\"+\",\" \",urldecode($_POST['ow'])));<br \/>\n   if (strlen(urldecode($_POST['oh'])) != 0 && strpos(urldecode($_POST['oh']), \"-\") === false) {<br \/>\n    $oh=trim(str_replace(\"+\",\" \",urldecode($_POST['oh'])));<br \/>\n   }<br \/>\n   $setwh=\"\\n \\$image=imagescale(\\$image, \" . $ow . \", \" . $oh . \"); \\n\";<br \/>\n   $setwhd=\"inline-block\";<br \/>\n   if (isset($_POST['fow']) && isset($_POST['foh'])) {<br \/>\n   $setwhihs=\"&lt;option value='\" . trim(str_replace(\"+\",\" \",urldecode($_POST['fow']))) . \",\" . trim(str_replace(\"+\",\" \",urldecode($_POST['foh']))) . \"'&gt;\" . trim(str_replace(\"+\",\" \",urldecode($_POST['fow']))) . \" x \" . trim(str_replace(\"+\",\" \",urldecode($_POST['foh']))) . \"&lt;\/option&gt;&lt;option value='\" . $ow . \",\" . $oh . \"' selected&gt;\" . $ow . \" x \" . $oh . \"&lt;\/option&gt;&lt;option value=?&gt;You Enter Width,Height&lt;\/option&gt;\";<br \/>\n   } else {<br \/>\n   $setwhihs=\"&lt;option value='\" . $ow . \",\" . $oh . \"' selected&gt;\" . $ow . \" x \" . $oh . \"&lt;\/option&gt;\";<br \/>\n   }<br \/>\n  } else if (strlen(urldecode($_POST['oh'])) != 0 && strpos(urldecode($_POST['oh']), \"-\") === false) {<br \/>\n   $oh=trim(str_replace(\"+\",\" \",urldecode($_POST['oh'])));<br \/>\n   $setwh=\"\\n \\$image=imagescale(\\$image, \" . $ow . \", \" . $oh . \"); \\n\";<br \/>\n   $setwhd=\"inline-block\";<br \/>\n   if (isset($_POST['fow']) && isset($_POST['foh'])) {<br \/>\n   $setwhihs=\"&lt;option value='\" . trim(str_replace(\"+\",\" \",urldecode($_POST['fow']))) . \",\" . trim(str_replace(\"+\",\" \",urldecode($_POST['foh']))) . \"'&gt;\" . trim(str_replace(\"+\",\" \",urldecode($_POST['fow']))) . \" x \" . trim(str_replace(\"+\",\" \",urldecode($_POST['foh']))) . \"&lt;\/option&gt;&lt;option value='\" . $ow . \",\" . $oh . \"' selected&gt;\" . $ow . \" x \" . $oh . \"&lt;\/option&gt;&lt;option value=?&gt;You Enter Width,Height&lt;\/option&gt;\";<br \/>\n   } else {<br \/>\n   $setwhihs=\"&lt;option value='\" . $ow . \",\" . $oh . \"' selected&gt;\" . $ow . \" x \" . $oh . \"&lt;\/option&gt;\";<br \/>\n   }<br \/>\n  }<br \/>\n}<br \/>\n<\/code><br \/>\n?&gt;\n<\/td>\n<\/tr>\n<tr>\n<th>Again as PHP writes out the PHP to create the animated GIF <\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\n$eachone=\" if (\\$randomizematch == '' || \\$randomizematch == \\\"\\$randomizeloopcnt\\\") {<br \/>\n<br \/>\n\\$text='';<br \/>\n<br \/>\n\/\/ Open the first source image and add the text.<br \/>\n\\$image = imagecreatefromjpeg('source01.jpg');<br \/>\n<font color=blue>\" . $setwh . \"<\/font><br \/>\n\\$text_color = imagecolorallocate(\\$image, \" . $r200 . \", \" . $g200 . \", \" . $b200 . \");<br \/>\nimagestring(\\$image, 5, 5, 5,  \\$text, \\$text_color);<br \/>\n<br \/>\n\/\/ Generate GIF from the $image<br \/>\n\/\/ We want to put the binary GIF data into an array to be used later,<br \/>\n\/\/  so we use the output buffer.<br \/>\nob_start();<br \/>\nimagegif(\\$image);<br \/>\n\\$frames[]=ob_get_contents();<br \/>\n\\$framed[]=40; \/\/ Delay in the animation.<br \/>\nob_end_clean();<br \/>\n\/\/ And again..<br \/>\n}<br \/>\n\";<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;\n<\/td>\n<\/tr>\n<tr>\n<th>And in order to correctly set the value of that <font color=purple>new dropdown (select) element<\/font> in a recall scenario, in this <font color=blue>PHP writes Javascript<font> code snippet change<\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\n&lt;h1 id='myh1' align='center'&gt;Tutorial Slideshow to Animated GIF <font color=purple>&lt;select onchange=owoh(this); style='display:<\/font><font color=blue>\" . $setwhd . \"<\/font><font color=purple>;' id=selwhs&gt;&lt;option value=''&gt;Size of First Slide (as below)&lt;\/option&gt;<\/font><font color=blue>\" . $setwhihs . \"<\/font><font color=purple>&lt;\/select&gt;<\/font>\" . $moreh1 . \" ... or ... &lt;div style='display:inline-block;width:95px;height:30px;overflow:hidden;border-top:1px solid black;border-bottom:1px solid black;border-left:2px solid yellow;border-right:1px solid yellow;'&gt;&lt;iframe id=cbi frameborder=0 style='width:173px;height:228px;margin-top:-194px;' src='..\/..\/HTMLCSS\/client_browsing.htm?d=\" . rand(0,18765432) . \"'&gt;&lt;\/iframe&gt;&lt;\/div&gt;&lt;\/h1&gt;<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;\n<\/td>\n<\/tr>\n<tr>\n<th>And the PHP writes HTML new HTML form type=hidden fields that navigate up to the recalled PHP as well as the iframe element that will help gather animated GIF image slide dimensions<\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\n&lt;input name=fow id=fow value='-1' type=hidden&gt;&lt;\/input&gt;&lt;input name=foh id=foh value='-1' type=hidden&gt;&lt;\/input&gt;<br \/>\n&lt;input name=ow id=ow value='-1' type=hidden&gt;&lt;\/input&gt;&lt;input name=oh id=oh value='-1' type=hidden&gt;&lt;\/input&gt;<br \/>\n&lt;img style='display:none;' title='slideshow' id='myimghere' src='' onerror=\\\"iready=true;\\\" onload=\\\" if (this.src.length &gt; 0) {  iwidths.push(this.width);   iheights.push(this.height);  document.getElementById(this.title).setAttribute('data-wh',selitize('' + this.width + ',' + this.height)); iready=true; } \\\"&gt;&lt;\/img&gt;<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;\n<\/td>\n<\/tr>\n<tr>\n<th>And example of <font color=blue>changed PHP<\/font> writes HTML image slide textboxes whereby a new global data attribute called &#8220;data-wh&#8221; helps out the user with their newly presented &#8220;image dimensions choice&#8221; dropdown<\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\n  $scris.=\"\\n  if (fo.id == 'slideshow') { fo.value='\" . $urlminus . \"'; } else { fo.innerHTML+=\\\"Tutorial Slideshow Image \\\" + icnt + \\\" &lt;input title='Please note a minus between numericals can define a URL range of image URLs' onblur='maybemore(this.value, this.id, this);' style='width:70%;'<font color=blue> data-wh=''<\/font> type='text' id='slideshow\\\" + icnt + \\\"' name='slideshow\\\" + icnt + \\\"' value='\" . $urlminus . \"'&gt;&lt;\/input&gt;&lt;br&gt;&lt;br&gt;&lt;div id='fdiv\\\" + icnt + \\\"'&gt;&lt;\/div&gt;\\\"; } \\n\";<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;\n<\/td>\n<\/tr>\n<tr>\n<th>Used by that iframe onload logic&#8217;s PHP writing Javascript called (and other) functions<\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\n var iwidths=[], iheights=[];<br \/>\n var iready=true;<br \/>\n<br \/>\nfunction selitize(thiswh) {<br \/>\n  if (thiswh.trim() != '') {<br \/>\n   if (document.getElementById('selwhs').outerHTML.indexOf(thiswh) == -1) {<br \/>\n     document.getElementById('selwhs').style.display='inline-block';<br \/>\n     document.getElementById('selwhs').innerHTML+='&lt;option value=\\\"' + thiswh + '\\\"&gt;' + thiswh.replace(',',' x ') + '&lt;\/option&gt;';<br \/>\n     if (document.getElementById('selwhs').outerHTML.indexOf('?') == -1) {<br \/>\n     if (thiswh.indexOf(',') != -1) {<br \/>\n     document.getElementById('fow').value=thiswh.split(',')[0];<br \/>\n     document.getElementById('foh').value=thiswh.split(',')[1];<br \/>\n     }<br \/>\n     document.getElementById('selwhs').innerHTML+='&lt;option value=\\\"?\\\"&gt;You Enter Width,Height&lt;\/option&gt;';<br \/>\n     }<br \/>\n   }<br \/>\n  }<br \/>\n  return thiswh;<br \/>\n}<br \/>\n<br \/>\nfunction owoh(thisselis) {<br \/>\n  var askwh='';<br \/>\n  if (thisselis.value.indexOf(',') != -1) {<br \/>\n    document.getElementById('ow').value='' + thisselis.value.split(',')[0];<br \/>\n    document.getElementById('oh').value='' + thisselis.value.split(',')[1];<br \/>\n  } else if (thisselis.value='?') {<br \/>\n    askwh=prompt('Please comma separate a width and height (eg. 750,1334) where a -1 for one lets it be proportional', '');<br \/>\n    if (askwh == null) { askwh=''; } else { askwh=askwh.replace(\/\\ \/g,''); }<br \/>\n    if (askwh.indexOf(',') != -1 && eval('' + askwh.split('-').length) &lt;= 2) {<br \/>\n    if (askwh.indexOf('-1,') == 0) {<br \/>\n    document.getElementById('ow').value='' + Math.round(eval('' + thisselis.outerHTML.split(' x ')[0].split('&gt;')[eval(-1 + thisselis.outerHTML.split(' x ')[0].split('&gt;').length)]) * eval('' + askwh.split(',')[1]) \/ eval('' + thisselis.outerHTML.split(',')[1].split('\\\"')[0].split(\\\"'\\\")[0]));<br \/>\n    askwh=askwh.replace('-1,', document.getElementById('ow').value + ',');<br \/>\n    document.getElementById('oh').value='' + askwh.split(',')[1];<br \/>\n    } else {<br \/>\n    document.getElementById('ow').value='' + askwh.split(',')[0];<br \/>\n    document.getElementById('oh').value='' + askwh.split(',')[1];<br \/>\n    }<br \/>\n    if (thisselis.outerHTML.indexOf(askwh) == -1) {<br \/>\n     thisselis.style.display='inline-block';<br \/>\n     thisselis.innerHTML+='&lt;option value=\\\"' + askwh + '\\\"&gt;' + askwh.replace(',',' x ') + '&lt;\/option&gt;';<br \/>\n    }<br \/>\n    } else {<br \/>\n    askwh='';<br \/>\n    document.getElementById('ow').value='-1';<br \/>\n    document.getElementById('oh').value='-1';<br \/>\n    }<br \/>\n    thisselis.value=askwh;<br \/>\n  } else {<br \/>\n    document.getElementById('ow').value='-1';<br \/>\n    document.getElementById('oh').value='-1';<br \/>\n  }<br \/>\n}<br \/>\n<br \/>\nsetTimeout(startmonitoringwh, 3000);<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;\n<\/td>\n<\/tr>\n<\/table>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creator-image-dimensions-tutorial\/'>Animated Gif Creator Image Dimensions Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agcwdmt'>Previous relevant <a target=_blank title='Animated Gif Creator Watermark Display Mode Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creator-watermark-display-mode-tutorial\/'>Animated Gif Creator Watermark Display Mode Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated Gif Creator Watermark Display Mode Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/my_green_watermarks.jpg\" title=\"Animated Gif Creator Watermark Display Mode Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Animated Gif Creator Watermark Display Mode Tutorial<\/p><\/div>\n<p>It&#8217;s not just &#8230;<\/p>\n<ul>\n<li>the watermark colour of yesterday&#8217;s <a title='Animated Gif Creator Watermark Colour Tutorial' href='#agcwct'>Animated Gif Creator Watermark Colour Tutorial<\/a> that can help with an animated GIF being more self explanatory (in a display sense) &#8230; it is today&#8217;s new &#8230;<\/li>\n<li>watermark display mode out of &#8230;\n<ol>\n<li>Title Just on First<\/li>\n<li>Title on First and Count on Others<\/li>\n<li>Title With a Count on All<\/li>\n<li>No Watermark<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<p> &#8230; that can help us know where we are up to, given the use of the middle options above, again, doing a little to &#8220;bridge&#8221; the gap between a video presentation and an animated GIF one we can create with <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php----------------------GETME\" title=\"tutorial_to_animated_gif.php\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php----------------------GETME\" title=\"tutorial_to_animated_gif.php\">tutorial_to_animated_gif.php<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\" title=\"Click picture\">animated GIF creator<\/a> web application.<\/p>\n<p>This new functionality interfaces to the online user via a new dropdown (<font color=purple>select<\/font>) element replacement for the hardcoded <font color=blue>&#8220;Title&#8221;<\/font> word of one of the headers.  More and more, we start to see the benefits of involving &#8220;option&#8221; subelements with that &#8220;select&#8221; hosting one being given IDs as you can surmise from the initial HTML (via PHP) &#8230;<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\nTutorial Slideshow <font color=purple>&lt;select style='display:inline-block;width:80px;' onchange='watermarkchange(this);' id='watermarkmode' name='watermarkmode'&gt;&lt;option id=watermarkoption value=''&gt;<\/font><font color=blue>Title<\/font><font color=purple>&lt;\/option&gt;&lt;option value=''&gt;Title Just on First&lt;\/option&gt;&lt;option value=' '&gt;Title on First and Count on Others&lt;\/option&gt;&lt;option value='  '&gt;Title With a Count on All&lt;\/option&gt;&lt;option id=optnow value=\\\"\\\\n\\\"&gt;No Watermark&lt;\/option&gt;&lt;\/select&gt;<\/font><br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<\/p>\n<p> &#8230; referencing user interface &#8220;onchange&#8221; Javascript logic &#8230;<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\nfunction watermarkchange(oselwater) {<br \/>\n var ovalis=oselwater.value<br \/>\n if (ovalis == ' ') {<br \/>\n  document.getElementById('watermarkoption').innerHTML='Title on First and Count on Others';<br \/>\n  document.getElementById('watermarkoption').value=ovalis;<br \/>\n } else if (ovalis == '  ') {<br \/>\n  document.getElementById('watermarkoption').innerHTML='Title With a Count on All';<br \/>\n  document.getElementById('watermarkoption').value=ovalis;<br \/>\n } else if (ovalis.length == 0) {<br \/>\n  document.getElementById('watermarkoption').innerHTML='Title Just on First';<br \/>\n  document.getElementById('watermarkoption').value=ovalis;<br \/>\n } else {<br \/>\n  document.getElementById('watermarkoption').innerHTML='No Watermark';<br \/>\n  document.getElementById('watermarkoption').value=ovalis;<br \/>\n }<br \/>\n}<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<\/p>\n<p> &#8230; and because this new dropdown (select) element is within an HTML form and contributes to messaging sent to recalls of the PHP, all the following PHP and Javascript snippets are interesting too &#8230;<\/p>\n<table>\n<tr>\n<th>Comes into play as a recall PHP execution receives HTML form data<\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php<br \/>\n<code><br \/>\n$foundtitle=\" \";<br \/>\n$wtsuffix=\"\";<br \/>\n$setwm=\"\";<br \/>\nif (isset($_GET['watermarkmode'])) {<br \/>\n  $wtsuffix=str_replace(\"+\",\" \",urldecode($_GET['watermarkmode']));<br \/>\n  if ($wtsuffix == '  ') {<br \/>\n   $setwm=\"\\n document.getElementById('watermarkmode').value='  '; \\n\";<br \/>\n  } else if ($wtsuffix == ' ') {<br \/>\n   $setwm=\"\\n document.getElementById('watermarkmode').value=' '; \\n\";<br \/>\n  } else if ($wtsuffix != '') {<br \/>\n   $setwm=\"\\n document.getElementById('watermarkmode').value=document.getElementById('optnow').value; \\n\";<br \/>\n  }<br \/>\n} else if (isset($_POST['watermarkmode'])) {<br \/>\n  $wtsuffix=str_replace(\"+\",\" \",urldecode($_POST['watermarkmode']));<br \/>\n  if ($wtsuffix == '  ') {<br \/>\n   $setwm=\"\\n document.getElementById('watermarkmode').value='  '; \\n\";<br \/>\n  } else if ($wtsuffix == ' ') {<br \/>\n   $setwm=\"\\n document.getElementById('watermarkmode').value=' '; \\n\";<br \/>\n  } else if ($wtsuffix != '') {<br \/>\n   $setwm=\"\\n document.getElementById('watermarkmode').value=document.getElementById('optnow').value; \\n\";<br \/>\n  }<br \/>\n}<br \/>\n<\/code><br \/>\n?&gt;\n<\/td>\n<\/tr>\n<tr>\n<th>Again as PHP writes out the PHP to create the animated GIF <\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\nfunction lastcountidea($thiscounter,$totalcount,$suffixwatermarkmode,$sofarphp) {<br \/>\n  global $foundtitle, $wtsuffix, $atext;<br \/>\n  $ft=\"\";<br \/>\n  $ourdelim=\"'\";<br \/>\n  if (strpos($sofarphp, \"\\$text=\") !== false) {<br \/>\n    $sofars=explode(\"\\$text=\", $sofarphp);<br \/>\n    $ourdelim=substr($sofars[1],0,1);<br \/>\n    $ft=explode($ourdelim,substr($sofars[1],1))[0];<br \/>\n  }<br \/>\n  if ($foundtitle == \" \") {<br \/>\n    if (strpos($sofarphp, \"\\$text=\") !== false) {<br \/>\n      $sofars=explode(\"\\$text=\", $sofarphp);<br \/>\n      $foundtitle=$ft;<br \/>\n    }<br \/>\n  }<br \/>\n  if ($suffixwatermarkmode == ' ') {<br \/>\n  if ($thiscounter == 0) {<br \/>\n    $sofarphp=str_replace_first(\"\\$text=\" . $ourdelim . $ft . $ourdelim, \"\\$text=\" . $ourdelim . $foundtitle . \" ... 1 of \" . $totalcount . $ourdelim, $sofarphp);<br \/>\n  } else {<br \/>\n    $sofarphp=str_replace_first(\"\\$text=\" . $ourdelim . $ft . $ourdelim, \"\\$text=\" . $ourdelim . \"\" . (1 + $thiscounter) . \" of \" . $totalcount . $ourdelim, $sofarphp);<br \/>\n  }<br \/>\n  } else if ($suffixwatermarkmode == '  ') {<br \/>\n  if ($thiscounter == 0) {<br \/>\n    $sofarphp=str_replace_first(\"\\$text=\" . $ourdelim . $ft . $ourdelim, \"\\$text=\" . $ourdelim . $foundtitle . \" ... 1 of \" . $totalcount . $ourdelim, $sofarphp);<br \/>\n  } else {<br \/>\n    $sofarphp=str_replace_first(\"\\$text=\" . $ourdelim . $ft . $ourdelim, \"\\$text=\" . $ourdelim . $foundtitle . \" ... \" . (1 + $thiscounter) . \" of \" . $totalcount . $ourdelim, $sofarphp);<br \/>\n  }<br \/>\n  } else if (strlen($suffixwatermarkmode) != 0) {<br \/>\n  if ($thiscounter == 0) {<br \/>\n    $sofarphp=str_replace_first(\"\\$text=\" . $ourdelim . $ft . $ourdelim, \"\\$text=\" . $ourdelim . $ourdelim, $sofarphp);<br \/>\n  } else {<br \/>\n    $sofarphp=str_replace_first(\"\\$text=\" . $ourdelim . $ft . $ourdelim, \"\\$text=\" . $ourdelim . $ourdelim, $sofarphp);<br \/>\n  }<br \/>\n  }<br \/>\n  return $sofarphp;<br \/>\n}<br \/>\n<br \/>\n<i>function ingif($gp) {<br \/>\n  global $foundtitle, $wtsuffix, $atext;<br \/>\n  $outgp=$gp;<br \/>\n  if ($wtsuffix != '') {<br \/>\n  $bits=explode(\"\\$image = \", $gp);<br \/>\n  if (sizeof($bits) > 1) {<br \/>\n  $outgp=\"\";<br \/>\n  for ($ii=0; $ii&lt;(-1 + sizeof($bits)); $ii++) {<br \/>\n    $outgp.=lastcountidea($ii, (-1 + sizeof($bits)), $wtsuffix, $bits[$ii] . \"\\$image = \");<br \/>\n  }<br \/>\n  $outgp.=$bits[-1 + sizeof($bits)];<br \/>\n  }<br \/>\n  }<br \/>\n  return $outgp;<br \/>\n}<\/i><br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<br \/>\n&lt;?php<br \/>\n<code><br \/>\n   \/\/ PHP writes PHP later, and onto that PHP can create the animated GIF data, as below ...<br \/>\n   file_put_contents(server_remote_addr() . \"_preview.php\", <i>ingif<\/i>($gifphp) . $rltsuffix . $lastbit);<br \/>\n   file_put_contents(server_remote_addr() . \".php\", <i>ingif<\/i>($gifphp) . str_replace($lastbitfrom, str_replace(\"'animegif.gif'\", \"'\" . server_remote_addr() . \".gif\" . \"'\", $lastbitto), ($rltsuffix . $lastbit)));<br \/>\n<\/code><br \/>\n?&gt;\n<\/td>\n<\/tr>\n<tr>\n<th>And in order to correctly set the value of that new dropdown (select) element in a recall scenario, in this <font color=blue>PHP writes Javascript<font> code snippet change<\/th>\n<\/tr>\n<tr>\n<td>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\nfunction dolhsh() {<font color=blue><br \/>\n  \" . $setwm . \"<br \/>\n  <\/font>if (('' + window.location.hash).replace('#','') != '') {<br \/>\n  \/\/alert(45);<br \/>\n    document.getElementById('lhsh').innerHTML=window.location.hash.substring(1);<br \/>\n    document.getElementById('dhash').innerHTML='&lt;input type=hidden name=ihash value=\\\"' + window.location.hash.substring(1) + '\\\"&gt;&lt;\/input&gt;';<br \/>\n    document.getElementById('cbi').src=document.getElementById('cbi').src + '0' + window.location.hash.replace(\/\\ \/g,'%20');<br \/>\n  \/\/alert(document.getElementById('lhsh').innerHTML);<br \/>\n    var gsu='\" . $gfn . \"';<br \/>\n  \/\/alert(gsu);<br \/>\n    document.getElementById('dgfn').innerHTML='&lt;input type=hidden name=gfn value=\\\"' + document.URL.split('tutorial_to_animated_gif.')[0] + gsu + '\\\"&gt;&lt;\/input&gt;';<br \/>\n    if (window.parent) {<br \/>\n      if (parent.document.getElementById('agifn')) {<br \/>\n       \/\/ alert(gsu);<br \/>\n        parent.document.getElementById('agifn').value=document.URL.split('tutorial_to_animated_gif.')[0] + gsu;<br \/>\n      }<br \/>\n    }<br \/>\n  } else if (parent.window) {<br \/>\n    if (parent.document.URL.indexOf('client_browsing.htm') != -1) {<br \/>\n    if (parent.document.getElementById('lhsh')) {<br \/>\n      if (parent.document.getElementById('lhsh').innerHTML != '') {<br \/>\n    document.getElementById('lhsh').innerHTML=parent.document.getElementById('lhsh').innerHTML;<br \/>\n  \/\/alert('000:' + document.getElementById('lhsh').innerHTML);<br \/>\n    document.getElementById('dhash').innerHTML='&lt;input type=hidden name=ihash value=\\\"' + parent.document.getElementById('lhsh').innerHTML + '\\\"&gt;&lt;\/input&gt;';<br \/>\n    document.getElementById('cbi').src=document.getElementById('cbi').src + '0#' + parent.document.getElementById('lhsh').innerHTML.replace(\/\\ \/g,'%20');<br \/>\n    var gsux='\" . $gfn . \"';<br \/>\n  \/\/alert(gsu);<br \/>\n    document.getElementById('dgfn').innerHTML='&lt;input type=hidden name=gfn value=\\\"' + document.URL.split('tutorial_to_animated_gif.')[0] + gsux + '\\\"&gt;&lt;\/input&gt;';<br \/>\n      }<br \/>\n    }<br \/>\n    }<br \/>\n  }<br \/>\n \/\/else {<br \/>\n    \/\/alert(65);<br \/>\n  \/\/}<br \/>\n}<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;\n<\/td>\n<\/tr>\n<\/table>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creator-watermark-display-mode-tutorial\/'>Animated Gif Creator Watermark Display Mode Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agcwct'>Previous relevant <a target=_blank title='Animated Gif Creator Watermark Colour Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creator-watermark-colour-tutorial\/'>Animated Gif Creator Watermark Colour Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated Gif Creator Watermark Colour Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/my_red_watermark.jpg\" title=\"Animated Gif Creator Watermark Colour Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Animated Gif Creator Watermark Colour Tutorial<\/p><\/div>\n<p>We&#8217;re revisiting the Animated Gif Creator web application last looked at with the recent <a title='Haiku Multimedia via Media Record Genericization Tutorial' href='#hmmrgt'>Haiku Multimedia via Media Record Genericization Tutorial<\/a> on a quest to &#8220;bridge&#8221; the gap between &#8230;<\/p>\n<ul>\n<li>video &#8230; and &#8230;.<\/li>\n<li>animated GIF<\/li>\n<\/ul>\n<p> &#8230; as presentation tools, that &#8220;bridge&#8221; being the operative word, as animated GIFs cannot match video even respecting the audio capabilities of videos, but there are things we can think of with our web application to improve it.  And today&#8217;s start of this quest is to allow for user defined watermark (ie. text) colour on that first slide.<\/p>\n<p>This control may mean that the first slide stands out enough to distinguish it enough from others to tell the user, especially on a rerun of the animated GIF presentation, that the user is at the start of the presentation.   Of course, with the video HTML element, this &#8220;we are at the start of the presentation&#8221; is pretty obvious by the look of the controls.<\/p>\n<p><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php---------------------GETME\" title=\"tutorial_to_animated_gif.php\">The changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php---------------------GETME\" title=\"tutorial_to_animated_gif.php\">tutorial_to_animated_gif.php<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\" title=\"Click picture\">animated GIF creator<\/a> uses and incorporates a new input type=color <a target=_blank title='input type=color information from w3schools' href='https:\/\/www.w3schools.com\/html\/tryit.asp?filename=tryhtml_input_color'>colour picker<\/a>.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creator-watermark-colour-tutorial\/'>Animated Gif Creator Watermark Colour Tutorial<\/a>.<\/p-->\n<hr>\n<p id='hmmrgt'>Previous relevant <a target=_blank title='Haiku Multimedia via Media Record Genericization Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/haiku-multimedia-via-media-record-genericization-tutorial\/'>Haiku Multimedia via Media Record Genericization Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Haiku Multimedia via Media Record Genericization Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/fixed_console.gif\" title=\"Haiku Multimedia via Media Record Genericization Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Haiku Multimedia via Media Record Genericization Tutorial<\/p><\/div>\n<p>Coming at yesterday&#8217;s <a title='Haiku Multimedia via Media Record Background Tutorial' href='#hmmrbt'>Haiku Multimedia via Media Record Background Tutorial<\/a> &#8230;<\/p>\n<ul>\n<li>we start to allow a comma separated list of user entered image URLs into the Background URL textbox as a possibility &#8230;<\/li>\n<li>along the way getting into some &#8220;Data-URI http error 414&#8221; problems we needed <a target=_blank title='HTML DOM console.log information' href='https:\/\/www.w3schools.com\/jsref\/met_console_log.asp'>&#8220;console.log&#8221;<\/a> to help us out debugging &#8230; hence today&#8217;s <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/fixed_console.gif\">tutorial picture<\/a> &#8230; and &#8230;<\/li>\n<li>a new genericization strategy &#8230;<\/li>\n<\/ul>\n<p> &#8230; with a familiar idea, for us, that being &#8230;<\/p>\n<blockquote><p>\nchange a <i>hardcoding<\/i> into a <i>dynamic HTML concept<\/i>\n<\/p><\/blockquote>\n<p> &#8230; that <i>dynamic HTML concept<\/i> being the most &#8220;hands on&#8221; genericization tool we could think of as far as &#8220;user control&#8221; goes.  The <i>hardcoding<\/i> is pretty obvious for this current &#8220;Haiku Creation&#8221; web application, that being &#8230;<\/p>\n<p><code><br \/>\n(the noun) \"<font color=purple>Haiku<\/font>\"<br \/>\n<\/code><\/p>\n<p> &#8230; and the <i>most &#8220;hands on&#8221; genericization tool we could think of<\/i> being a favourite of ours &#8230;<\/p>\n<p><code><br \/>\n&lt;h1&gt;<font color=blue>&lt;div<\/font> onblur=titlefix(); style=\"display:inline-block;<font color=green>border:2px solid transparent;<\/font>\" id=subjectword <font color=red>contenteditable=true<\/font> title='Can change this'&gt;<font color=purple>Haiku<\/font><font color=blue>&lt;\/div&gt;<\/font> Animated GIF Creator&lt;\/h1&gt;<br \/>\n<\/code><\/p>\n<p> &#8230; the HTML <font color=blue>div<\/font> element attribute <font color=red>contenteditable=true<\/font> &#8230; teamed up with the Javascript &#8230;<\/p>\n<p><code><br \/>\n function titlefix() {<br \/>\n   var dgebiswih=document.getElementById('subjectword').innerHTML;<br \/>\n   var dgebiswihtwo=dgebiswih;<br \/>\n   if (dgebiswihtwo == \"\") { dgebiswihtwo=\"-\"; }<br \/>\n   document.title=document.title.replace(lastword, dgebiswihtwo);<br \/>\n   document.getElementById('bag').value=document.getElementById('bag').value.replace(lastword, dgebiswihtwo);<br \/>\n   document.getElementById('bemail').value=document.getElementById('bemail').value.replace(lastword, dgebiswihtwo);<br \/>\n   document.getElementById('bsms').value=document.getElementById('bsms').value.replace(lastword, dgebiswihtwo);<br \/>\n   document.getElementById('aemail').href=document.getElementById('aemail').href.replace(encodeURIComponent(lastword), encodeURIComponent(dgebiswihtwo));<br \/>\n   prefix=prefix.replace('stitle=' + encodeURIComponent('My ' + lastword), 'stitle=' + encodeURIComponent(('My ' + dgebiswih + '`').replace('My `','').replace('`','')));<br \/>\n   lastword=dgebiswihtwo;<br \/>\n }<br \/>\n<\/code><\/p>\n<p>But why the <font color=green>border:2px solid transparent;<\/font> CSS styling?  Well, that &#8220;Haiku&#8221; hardcoding replacement could be &#8220;nothing&#8221; (ie. a blank string, effectively like an implied English &#8220;a&#8221; article to reach a web application title of &#8220;Animated GIF Creator&#8221;, and here we leave off any topic line annotations, if that swings the bargain for you).  But how to change from &#8220;nothing&#8221; back to &#8220;something&#8221;?  That <font color=green>2px transparent<\/font> border gives you a way to find your elusive &#8230;<\/p>\n<p><code><br \/>\n&lt;h1&gt;<font color=blue>&lt;div<\/font> onblur=titlefix(); style=\"display:inline-block;<font color=green>border:2px solid transparent;<\/font>\" id=subjectword <font color=red>contenteditable=true<\/font> title='Can change this'&gt;<font color=blue>&lt;\/div&gt;<\/font> Animated GIF Creator&lt;\/h1&gt;<br \/>\n<\/code><\/p>\n<p> &#8230; again.<\/p>\n<p>So, on top of yesterday&#8217;s <a title='Haiku Multimedia via Media Record Share Tutorial' href='#hmmrst'>Haiku Multimedia via Media Record Share Tutorial<\/a> we changed &#8230;<\/p>\n<ul>\n<li><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html------GETME\" title=\"haiku_animated_gif.html\">today&#8217;s changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html------GETME\">haiku_animated_gif.html<\/a>&#8216;s <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\">Haiku creation and sharing web application live run<\/a> link (we hope you try for yourself) &#8230;<\/li>\n<li>calls <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/macos_say_record.php--------------GETME\" title=\"macos_say_record.php\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php--------------GETME\" title=\"macos_say_record.php\">macos_say_record.php<\/a> &#8230; which also &#8230;<\/li>\n<li>calls the HTML\/Javascript <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html------------GETME\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html------------GETME\">client_browsing.htm<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm\">child web application<\/a> to handle this HTML input capture usage<\/li>\n<li>calling <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php--------------------GETME\" title=\"tutorial_to_animated_gif.php\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php--------------------GETME\" title=\"tutorial_to_animated_gif.php\">tutorial_to_animated_gif.php<\/a> animated GIF creator<\/li>\n<\/ul>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/haiku-multimedia-via-media-record-genericization-tutorial\/'>Haiku Multimedia via Media Record Genericization Tutorial<\/a>.<\/p-->\n<hr>\n<p id='hmmrbt'>Previous relevant <a target=_blank title='Haiku Multimedia via Media Record Background Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/haiku-multimedia-via-media-record-background-tutorial\/'>Haiku Multimedia via Media Record Background Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Haiku Multimedia via Media Record Background Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_localbackground.jpg\" title=\"Haiku Multimedia via Media Record Background Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Haiku Multimedia via Media Record Background Tutorial<\/p><\/div>\n<p>Yesterday&#8217;s <a title='Haiku Multimedia via Media Record Share Tutorial' href='#hmmrst'>Haiku Multimedia via Media Record Share Tutorial<\/a> helped with the &#8220;Haiku feel&#8221; to our Haiku Creation web application.  The thing is, though, as we found with the video and YouTube API interfacing talents of our (ostenbibly) Karaoke web application, there is good reason to envisage this Haiku Creation web application fitting the bill for other possibilities.  With that in mind, we decided to &#8230;<\/p>\n<ul>\n<li>fix the positioning of the animated GIF in the lower art of the webpage &#8230; and &#8230;<\/li>\n<li>allow the Choose File(s) local browsing functionality &#8230;\n<ol>\n<li>browse for a single image file that could be the background image behind every (could be Haiku) animated GIF &#8220;slide&#8221; &#8230; or &#8230;<\/li>\n<li>browse for multiple <font color=brown>image<\/font> files that could be sequenced background images behind corresponding (could be Haiku) animated GIF &#8220;slide&#8221; with its (could be Haiku based) textarea derived corresponding record line overlayed annotation for that &#8220;slide&#8221; &#8230; a <font color=red>pretty apt use for multiple property<\/font> &#8230;<br \/>\n<code><br \/>\n&lt;input type=file accept=\"<font color=brown>image\/*,<\/font>video\/*,audio\/*\" <font color=blue><a target=_blank title='input capture' href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Attributes\/capture#:~:text=The%20capture%20attribute%20is%20supported,of%20one%20of%20those%20types.&#038;text=The%20user%2Dfacing%20camera%20and%2For%20microphone%20should%20be%20used.'>capture<\/a><\/font> <font color=red><a target=_blank title='HTML input multiple property information from W3schools' href='https:\/\/www.w3schools.com\/tags\/att_input_multiple.asp#:~:text=The%20multiple%20attribute%20is%20a,types%3A%20email%2C%20and%20file.'>multiple<\/a><\/font>&gt;&lt;\/input&gt;<br \/>\n<\/code>\n<\/li>\n<\/ol>\n<p> &#8230; still supporting yesterday&#8217;s progress supporting audio and\/or video foreground data and email sharing\n<\/li>\n<\/ul>\n<p>As you might surmise from this, we are opening the &#8220;Haiku feel&#8221; up to lots more data than represented by a Haiku (5, 7, 5) syllable of text data arrangement.   We&#8217;ll see if the &#8220;genericization drive&#8221; continues?!<\/p>\n<p>On top of yesterday&#8217;s <a title='Haiku Multimedia via Media Record Share Tutorial' href='#hmmrst'>Haiku Multimedia via Media Record Share Tutorial<\/a> we changed &#8230;<\/p>\n<ul>\n<li><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html-----GETME\" title=\"haiku_animated_gif.html\">today&#8217;s changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html-----GETME\">haiku_animated_gif.html<\/a>&#8216;s <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\">Haiku creation and sharing web application live run<\/a> link (we hope you try for yourself) &#8230;<\/li>\n<li>calls <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/macos_say_record.php-------------GETME\" title=\"macos_say_record.php\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php-------------GETME\" title=\"macos_say_record.php\">macos_say_record.php<\/a> &#8230; which also &#8230;<\/li>\n<li>calls the HTML\/Javascript <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html-----------GETME\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html-----------GETME\">client_browsing.htm<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm\">child web application<\/a> to handle this HTML input capture usage<\/li>\n<\/ul>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/haiku-multimedia-via-media-record-background-tutorial\/'>Haiku Multimedia via Media Record Background Tutorial<\/a>.<\/p-->\n<hr>\n<p id='hmmrst'>Previous relevant <a target=_blank title='Haiku Multimedia via Media Record Share Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/haiku-multimedia-via-media-record-share-tutorial\/'>Haiku Multimedia via Media Record Share Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Haiku Multimedia via Media Record Share Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_media_share.jpg\" title=\"Haiku Multimedia via Media Record Share Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Haiku Multimedia via Media Record Share Tutorial<\/p><\/div>\n<p>Everybody is somebody&#8217;s child.  And often, in a modular I.T. woooooorrrrlllld a piece of code can be another&#8217;s child, even though they have an identity as a parent in their own right.  It was the latter role we said goodbye to (developing further, right now) with yesterday&#8217;s <a target=_blank href='https:\/\/www.rjmprogramming.com.au\/ITblog\/media-mix-play-audio-video-mix-concatention-tutorial\/' title='Media Mix Play Audio Video Mix Concatention Tutorial'>Media Mix Play Audio Video Mix Concatention Tutorial<\/a> but we found, returning to our recent Haiku web application, this &#8220;Voiceover Ideas&#8221; middle child in its &#8230;<\/p>\n<ul>\n<li>iframe &#8220;child&#8221; window (especially where all participants reside on the RJM Programming domain) &#8230;<\/li>\n<li>popup &#8220;child&#8221; window (especially where participants reside on a local web server)<\/li>\n<\/ul>\n<p> &#8230; and other &#8220;childlike&#8221; Ajax\/FormData or &#8220;navigation to via HTML form&#8221; guises may still need development to satisfy integration requirements (of the Haiku web application, in all its guises).<\/p>\n<p>So working on top of where we left off Haiku work with the recent <a title='Haiku Multimedia via Media Record Capture Tutorial' href='#hmmrct'>Haiku Multimedia via Media Record Capture Tutorial<\/a> we implemented &#8230;<\/p>\n<ul>\n<li><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html----GETME\" title=\"haiku_animated_gif.html\">today&#8217;s changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html----GETME\">haiku_animated_gif.html<\/a>&#8216;s <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\">Haiku creation and sharing web application live run<\/a> link &#8230;<\/li>\n<li>calls <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/macos_say_record.php------------GETME\" title=\"macos_say_record.php\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php------------GETME\" title=\"macos_say_record.php\">macos_say_record.php<\/a> &#8230; which also &#8230;<\/li>\n<li>and uses <a target=_blank href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/emailhtml.php-------------------GETME'>the changed<\/a> <a target=_blank href='http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/emailhtml.php-------------------GETME' title='emailhtml.php'>emailhtml.php<\/a> PHP Inline HTML Email helper<\/li>\n<\/ul>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/haiku-multimedia-via-media-record-share-tutorial\/'>Haiku Multimedia via Media Record Share Tutorial<\/a>.<\/p-->\n<hr>\n<p id='hmmrct'>Previous relevant <a target=_blank title='Haiku Multimedia via Media Record Capture Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/haiku-multimedia-via-media-record-capture-tutorial\/'>Haiku Multimedia via Media Record Capture Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Haiku Multimedia via Media Record Capture Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_media_synchronize.jpg\" title=\"Haiku Multimedia via Media Record Capture Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Haiku Multimedia via Media Record Capture Tutorial<\/p><\/div>\n<p>Let&#8217;s <font size=1>semi-<\/font>drop the &#8220;macOS&#8221; on our &#8220;media capture&#8221; functionality we&#8217;re developing currently, because over the last two days it has jumped out of this restrictive thought pattern, either through the &#8220;voiceover&#8221; idea of &#8230;<\/p>\n<ul>\n<li>non-mobile Adobe Flash Player plugin audio recording (Speech to Audio) &#8230; as well as &#8230;<\/li>\n<li>input type=file <i>capture<\/i> mobile browsing and\/or creating (iOS video) and non-mobile browsing of media with an audio (Speech to Audio) capability &#8230; on top of that original &#8230;<\/li>\n<li>macOS or Mac OS X &#8220;say&#8221; command line command Text to Audio original &#8220;voiceover&#8221; idea<\/li>\n<\/ul>\n<p> &#8230; onto yesterday&#8217;s <a title='MacOS and Other Mobile Media Record Tutorial' href='#mosommrt'>MacOS and Other Mobile Media Record Tutorial<\/a> you can join the story with, below.<\/p>\n<p>And way back at <a target=_blank title='Mac OS X Text to English Speech Primer Tutorial' href='#mosxtespt'>Mac OS X Text to English Speech Primer Tutorial<\/a> we can revisit the &#8220;synchronicity of media&#8221; ideas we are so keen about.  Our conduit idea to get us there has been a revisit of the Haiku creation work of <a target=_blank href='https:\/\/www.rjmprogramming.com.au\/ITblog\/haiku-animated-gif-creator-tutorial\/' title='Haiku Animated Gif Creator Tutorial'>Haiku Animated Gif Creator Tutorial<\/a> where we allow either a &#8230;<\/p>\n<ul>\n<li>audio data-URI &#8230; or &#8230;<\/li>\n<li>video data-URI<\/li>\n<\/ul>\n<p> &#8230; form the &#8220;foreground&#8221; for an animated GIF (Haiku wording) &#8220;background&#8221; easy to show the user creating it, and shareable via an email HTML attachment approach, on some email clients (eg. <a target=_blank title='Gmail' href='http:\/\/gmail.com'>Gmail<\/a>  webmail).<\/p>\n<p>Along the way we repurposed the &#8220;dishevelment&#8221; of yesterday into more programmatically restrictive web application functionality to come up with &#8230;<\/p>\n<ul>\n<li><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html---GETME\" title=\"haiku_animated_gif.html\">today&#8217;s changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html---GETME\">haiku_animated_gif.html<\/a>&#8216;s <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\">Haiku creation and sharing web application live run<\/a> link&#8217;s <a target=_blank title='Ajax information from Wikipedia ... thanks' href='http:\/\/en.wikipedia.org\/wiki\/Ajax_%28programming%29'>Ajax<\/a>\/<a target=_blank title='FormData object information' href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/FormData'>FormData<\/a> email sending &#8230;<br \/>\n<code><br \/>\n function waitforalatr() {   \/\/ features <a target=_blank title='Ajax information from Wikipedia ... thanks' href='http:\/\/en.wikipedia.org\/wiki\/Ajax_%28programming%29'>Ajax<\/a>\/<a target=_blank title='FormData object information' href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/FormData'>FormData<\/a> techniques to send email via inhouse PHP email helper<br \/>\n   if (document.getElementById('iurl').value == '') {<br \/>\n     setTimeout(waitforalatr, 2000);<br \/>\n   } else {<br \/>\n     alatr();<br \/>\n  altsubject='My Haiku ...';<br \/>\n  var tois=prompt('Who do you want to email to?  Optionally hashtag (#) separate your own personal subject line to the email (eg. theemail@theemailplace.com#Hello there, it is moi.)', '');<br \/>\n  if (tois == null) { tois=''; }<br \/>\n  if (tois.indexOf('@') != -1) {<br \/>\n  var alts=tois.split('#');<br \/>\n  if (alts.length &gt; 1) { altsubject=alts[1]; tois=alts[0]; }<br \/>\n  \/\/var text=document.getElementById('result').innerHTML;<br \/>\n  \/\/document.getElementById('ifem').innerHTML=\"&lt;iframe onload=checkz(this); src='\/\/www.rjmprogramming.com.au\/HTMLCSS\/emailhtml.php?to=\" + encodeURIComponent(tois) + '&subj=' + thisencodeURIComponent(altsubject) + ' ... ') + '&sliceminusten=' + encodeURIComponent(text.slice(-10)) + \"' style=width:500px;height:600px;&gt;&lt;\/iframe&gt;\";<br \/>\n<br \/>\n  var zhr = new XMLHttpRequest();<br \/>\n  var zform=new FormData();<br \/>\n  \/\/zform.append('inline', '');<br \/>\n  zform.append('to', tois);<br \/>\n  zform.append('subj', altsubject + ' ... ');<br \/>\n  zform.append('tdhuhta', '&lt;html&gt;&lt;body&gt;' + document.getElementById('bpalette').innerHTML.replace('&lt;audio ','&lt;audio loop ').replace('&lt;video ','&lt;video loop ').replace('position:absolute;','').replace('left:','margin-left:0.').replace('top:','margin-top:0.') + '&lt;\/body&gt;&lt;\/html&gt;');<br \/>\n  zhr.open('post', '\/\/www.rjmprogramming.com.au\/HTMLCSS\/emailhtml.php', true);<br \/>\n  zhr.send(zform);<br \/>\n  document.getElementById('iurl').value='';<br \/>\n  alert('Email sent with downloadable HTML attachment.');<br \/>\n  }<br \/>\n   }<br \/>\n }<br \/>\n<\/code><br \/>\n &#8230; workings &#8230;<\/li>\n<li>calls on <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/macos_say_record.php-----GETME\" title=\"macos_say_record.php\">a changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php-----GETME\" title=\"macos_say_record.php\">macos_say_record.php<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php\" title=\"Click picture\">live run<\/a> link &#8230; and also &#8230;<\/li>\n<li>calls the HTML\/Javascript <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html-----GETME\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html-----GETME\">client_browsing.htm<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm\">child web application<\/a> to handle this HTML input capture usage and interfacing to (now various) parent.window scenarios &#8230; along the way also involving &#8230;<\/li>\n<li><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php----------------GETME\" title=\"tutorial_to_animated_gif.php\">recently changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php----------------GETME\" title=\"tutorial_to_animated_gif.php\">tutorial_to_animated_gif.php<\/a> animated GIF creator &#8230; and &#8230;<\/li>\n<li>Inhouse HTML Email helper\/creator&#8217;s key interfacing code now goes &#8230;<br \/>\n&lt;?php<br \/>\n<code><br \/>\n  $smt=\"\";<br \/>\n  if (isset($_GET['sliceminusten'])) { $smt=' (' . str_replace(\" \",\"+\",urldecode($_GET['sliceminusten'])) . ')'; }<br \/>\n  $honesmt=\"Paste to lightgreen here (already copied from lightgreen there (but recopy and repaste yourself if last characters\" . $smt . \" do not match) and click yellow button to Email off this Audio player ...\";<br \/>\n  if (strlen($smt) == 13 && strpos(str_replace(\"+\",\" \",('' . urldecode($_GET['to']))),\"@\") !== false && str_replace(\"+\",\" \",('' . urldecode($_GET['subj']))) != '') {<br \/>\n  echo \"&lt;html&gt;&lt;head&gt;&lt;script type='text\/javascript'&gt;<br \/>\n   var smt=('\" . $smt . \"').substring(2).substring(0,10), smts='';<br \/>\n   function onsm() {<br \/>\n   var wpr=null;<br \/>\n   var wp=window.parent;<br \/>\n   if (wp) { wpr=parent.document.getElementById('result'); }<br \/>\n  if ((window.opener && window.opener !== window) || (wp && wpr)) {<br \/>\n  if (5 == 5) {   \/\/ window.opener.document.getElementById('result')) {<br \/>\n  document.getElementById('divplace').innerHTML='Email sent' + smts + '.';<br \/>\n  \/\/alert(window.opener.document.getElementById('result').slice(-10) + ' vs ' + smt);<br \/>\n  return true;<br \/>\n  } else {<br \/>\n  document.getElementById('divplace').innerHTML='Other green textbox not detected.';<br \/>\n  return false;<br \/>\n  }<br \/>\n  } else {<br \/>\n  document.getElementById('divplace').innerHTML='Not a popup window.';<br \/>\n  return false;<br \/>\n  }<br \/>\n   }<br \/>\n   function fixta() {<br \/>\n   if (document.getElementById('taready').value.indexOf('#') == -1 && ((document.getElementById('taready').value.indexOf('data:audio\/') == 0 || document.getElementById('taready').value.indexOf('data:video\/') == 0) || document.getElementById('taready').value == '')) {<br \/>\n   if (document.getElementById('taready').value == '' || ('          ' + document.getElementById('taready').value).slice(-10) == smt) {<br \/>\n   if (document.getElementById('taready').value != '') {<br \/>\n   var midbit=document.getElementById('taready').value.split('data:')[1].split(';')[0] + ' src=' + \\\"'\\\";<br \/>\n   document.getElementById('taready').value='&lt;body&gt;&lt;' + midbit.substring(0,5) + ' id=thisaudio controls&gt;&lt;source type=' + midbit + document.getElementById('taready').value.replace(\/\\ \/g,'+') + \\\"'\\\" + '&gt;&lt;\/source&gt;&lt;\/' + midbit.substring(0,5) + '&gt;&lt;\/body&gt;';<br \/>\n   } else {<br \/>\n   document.getElementById('taready').value='&lt;body&gt;&lt;p&gt;&lt;\/p&gt;&lt;\/body&gt;';<br \/>\n   smts=' with the subject only';<br \/>\n   }<br \/>\n   return true;<br \/>\n   } else {<br \/>\n   \/\/document.getElementById('divplace').innerHTML='Copy failed because ' + ('          ' + document.getElementById('taready').value).slice(-10) + ' paste does not match ' + smt + ' copy.';<br \/>\n   document.getElementById('divplace').innerHTML='Copy failed because paste does not match copy.';<br \/>\n   return false;<br \/>\n   }<br \/>\n   } else {<br \/>\n   document.getElementById('divplace').innerHTML='Incorrect data';<br \/>\n   return false;<br \/>\n   }<br \/>\n   }<br \/>\n   &lt;\/script&gt;&lt;\/head&gt;&lt;body onload=\\\"document.getElementById('taready').focus(); if (wpr) {  document.getElementById('status').innerHTML='Copy and Paste Done Below ...';   } \\\"&gt;&lt;h1 id=status&gt;\" . $honesmt . \"&lt;\/h1&gt;<br \/>\n  &lt;form target=ifplace onsubmit=\\\"if (fixta()) { return onsm(); } else {  return false; }\\\" action=.\/emailhtml.php method=POST&gt;<br \/>\n  &lt;input type=hidden name=inline value=''&gt;&lt;\/input&gt;<br \/>\n  To: &lt;input style=width:80%; type=text name=to value='\" . str_replace(\"+\",\" \",urldecode($_GET['to'])) . \"'&gt;&lt;\/input&gt;&lt;br&gt;<br \/>\n  Subject: &lt;input style=width:80%; type=text name=subj value='\" . str_replace(\"+\",\" \",urldecode($_GET['subj'])) . \"'&gt;&lt;\/input&gt;&lt;br&gt;<br \/>\n  &lt;textarea style=width:100%;background-color:lightgreen; cols=80 rows=10 name=tdhuhta id=taready&gt;&lt;\/textarea&gt;&lt;br&gt;&lt;br&gt;<br \/>\n  &lt;input id=sub type=submit style=background-color:yellow; value='Email'&gt;&lt;\/input&gt;&lt;\/form&gt;&lt;br&gt;<br \/>\n  &lt;iframe style=display:none; name=ifplace id=ifplace src=.\/emailhtml.php&gt;&lt;\/iframe&gt;<br \/>\n  &lt;div id=divplace&gt;&lt;\/div&gt;<br \/>\n  &lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n  } else {<br \/>\n  echo \"&lt;html&gt;&lt;body&gt;&lt;p&gt;Incorrect usage.&lt;\/p&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n  }<br \/>\n  exit;<br \/>\n<\/code><br \/>\n?&gt;\n<\/li>\n<\/ul>\n<p> &#8230; to pull all this together in that tighter way (so long <a target=_blank href='https:\/\/www.youtube.com\/watch?v=wdHvlWSi_2Q' title='?'>Colombo<\/a>) for you to try yourself.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/haiku-multimedia-via-media-record-capture-tutorial\/'>Haiku Multimedia via Media Record Capture Tutorial<\/a>.<\/p-->\n<hr>\n<p id='mosommrt'>Previous relevant <a target=_blank title='MacOS and Other Mobile Media Record Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/macos-and-other-mobile-media-record-tutorial\/'>MacOS and Other Mobile Media Record Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"MacOS and Other Mobile Media Record Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/audio_video_mobile_capture.jpg\" title=\"MacOS and Other Mobile Media Record Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">MacOS and Other Mobile Media Record Tutorial<\/p><\/div>\n<p>We&#8217;re letting a little &#8220;dishevelment&#8221; continue with today&#8217;s work on top of yesterday&#8217;s <a title='MacOS Speech to Flash Player Audio Record Tutorial' href='#mossfpart'>MacOS Speech to Flash Player Audio Record Tutorial<\/a>.<\/p>\n<p>The reason (to our mind) is that involving mobile functionality into a media web application&#8217;s sphere of influence is a big step with more than the usual time needed for testing <font size=1>&#8230; well, that&#8217;s my excuse, anyway<\/font>.   The major reason for this is that the &#8230;<\/p>\n<p><code><br \/>\n&lt;input type=file accept=\"video\/*,audio\/*\" <font color=blue><a target=_blank title='input capture' href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Attributes\/capture#:~:text=The%20capture%20attribute%20is%20supported,of%20one%20of%20those%20types.&#038;text=The%20user%2Dfacing%20camera%20and%2For%20microphone%20should%20be%20used.'>capture<\/a><\/font>&gt;&lt;\/input&gt;<br \/>\n<\/code><\/p>\n<p> &#8230; is an <font color=blue>incredible recent development<\/font> (allowing dynamic media creation, with &#8220;retake&#8221; possibilities, all because of that one &#8220;capture&#8221; property above) separating the mobile (smart device) platforms from the previous laptop media capture capabilities, and at least doubles the amount of unit testing needed to prove the code workings.<\/p>\n<p>And so, for a little while, some users will be annoyed that they see web application functionality not meant for their platform characteristics.<\/p>\n<p>Sometimes &#8220;dishevelment&#8221; can work, too, or &#8220;stewing for a day&#8221;, because it turns out a piece of functionality you thought to be impossible with a particular platform amazingly becomes possible the next day?!  Hence the adage &#8230; &#8220;mulling is amazing&#8221;!<\/p>\n<p>Code wise &#8230;<\/p>\n<ul>\n<li>calls (just like <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-audio-or-video-foreground-tutorial\/'>Animated GIF Audio or Video Foreground Tutorial<\/a> did) the HTML\/Javascript <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html----GETME\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html----GETME\">client_browsing.htm<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm\">child web application<\/a> to handle this HTML input capture usage and interfacing to (now various) parent.window scenarios &#8230;<\/li>\n<li>called by <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/macos_say_record.php----GETME\" title=\"macos_say_record.php\">a changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php----GETME\" title=\"macos_say_record.php\">macos_say_record.php<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php\" title=\"Click picture\">live run<\/a> link &#8230; that relies on our &#8230;<\/li>\n<li>Inhouse HTML Email helper\/creator&#8217;s key interfacing code now goes &#8230;<br \/>\n&lt;?php<br \/>\n<code><br \/>\n  $smt=\"\";<br \/>\n  if (isset($_GET['sliceminusten'])) { $smt=' (' . str_replace(\" \",\"+\",urldecode($_GET['sliceminusten'])) . ')'; }<br \/>\n  if (strlen($smt) == 13 && strpos(str_replace(\"+\",\" \",('' . urldecode($_GET['to']))),\"@\") !== false && str_replace(\"+\",\" \",('' . urldecode($_GET['subj']))) != '') {<br \/>\n  echo \"&lt;html&gt;&lt;head&gt;&lt;script type='text\/javascript'&gt;<br \/>\n   var smt=('\" . $smt . \"').substring(2).substring(0,10), smts='';<br \/>\n   function onsm() {<br \/>\n   var wpr=null;<br \/>\n   var wp=window.parent;<br \/>\n   if (wp) { wpr=parent.document.getElementById('result'); }<br \/>\n  if ((window.opener && window.opener !== window) || (wp && wpr)) {<br \/>\n  if (5 == 5) {   \/\/ window.opener.document.getElementById('result')) {<br \/>\n  document.getElementById('divplace').innerHTML='Email sent' + smts + '.';<br \/>\n  \/\/alert(window.opener.document.getElementById('result').slice(-10) + ' vs ' + smt);<br \/>\n  return true;<br \/>\n  } else {<br \/>\n  document.getElementById('divplace').innerHTML='Other green textbox not detected.';<br \/>\n  return false;<br \/>\n  }<br \/>\n  } else {<br \/>\n  document.getElementById('divplace').innerHTML='Not a popup window.';<br \/>\n  return false;<br \/>\n  }<br \/>\n   }<br \/>\n   function fixta() {<br \/>\n   if (document.getElementById('taready').value.indexOf('#') == -1 && ((document.getElementById('taready').value.indexOf('data:audio\/') == 0 || document.getElementById('taready').value.indexOf('data:video\/') == 0) || document.getElementById('taready').value == '')) {<br \/>\n   if (document.getElementById('taready').value == '' || ('          ' + document.getElementById('taready').value).slice(-10) == smt) {<br \/>\n   if (document.getElementById('taready').value != '') {<br \/>\n   var midbit=document.getElementById('taready').value.split('data:')[1].split(';')[0] + ' src=' + \\\"'\\\";<br \/>\n   document.getElementById('taready').value='&lt;body&gt;&lt;' + midbit.substring(0,5) + ' id=thisaudio controls loop&gt;&lt;source type=' + midbit + document.getElementById('taready').value.replace(\/\\ \/g,'+') + \\\"'\\\" + '&gt;&lt;\/source&gt;&lt;\/' + midbit.substring(0,5) + '&gt;&lt;\/body&gt;';<br \/>\n   } else {<br \/>\n   document.getElementById('taready').value='&lt;body&gt;&lt;p&gt;&lt;\/p&gt;&lt;\/body&gt;';<br \/>\n   smts=' with the subject only';<br \/>\n   }<br \/>\n   return true;<br \/>\n   } else {<br \/>\n   \/\/document.getElementById('divplace').innerHTML='Copy failed because ' + ('          ' + document.getElementById('taready').value).slice(-10) + ' paste does not match ' + smt + ' copy.';<br \/>\n   document.getElementById('divplace').innerHTML='Copy failed because paste does not match copy.';<br \/>\n   return false;<br \/>\n   }<br \/>\n   } else {<br \/>\n   document.getElementById('divplace').innerHTML='Incorrect data';<br \/>\n   return false;<br \/>\n   }<br \/>\n   }<br \/>\n   &lt;\/script&gt;&lt;\/head&gt;&lt;body onload=\\\"document.getElementById('taready').focus();\\\"&gt;&lt;h1 id=status&gt;Paste to lightgreen here (already copied from lightgreen there (but recopy and repaste yourself if last characters\" . $smt . \" do not match) and click yellow button to Email off this Audio player ...&lt;\/h1&gt;<br \/>\n  &lt;form target=ifplace onsubmit=\\\"if (fixta()) { return onsm(); } else {  return false; }\\\" action=.\/emailhtml.php method=POST&gt;<br \/>\n  &lt;input type=hidden name=inline value=''&gt;&lt;\/input&gt;<br \/>\n  To: &lt;input style=width:80%; type=text name=to value='\" . str_replace(\"+\",\" \",urldecode($_GET['to'])) . \"'&gt;&lt;\/input&gt;&lt;br&gt;<br \/>\n  Subject: &lt;input style=width:80%; type=text name=subj value='\" . str_replace(\"+\",\" \",urldecode($_GET['subj'])) . \"'&gt;&lt;\/input&gt;&lt;br&gt;<br \/>\n  &lt;textarea style=width:100%;background-color:lightgreen; cols=80 rows=10 name=tdhuhta id=taready&gt;&lt;\/textarea&gt;&lt;br&gt;&lt;br&gt;<br \/>\n  &lt;input id=sub type=submit style=background-color:yellow; value='Email'&gt;&lt;\/input&gt;&lt;\/form&gt;&lt;br&gt;<br \/>\n  &lt;iframe style=display:none; name=ifplace id=ifplace src=.\/emailhtml.php&gt;&lt;\/iframe&gt;<br \/>\n  &lt;div id=divplace&gt;&lt;\/div&gt;<br \/>\n  &lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n  } else {<br \/>\n  echo \"&lt;html&gt;&lt;body&gt;&lt;p&gt;Incorrect usage.&lt;\/p&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n  }<br \/>\n  exit;<br \/>\n<\/code><br \/>\n?&gt;\n<\/li>\n<\/ul>\n<p>Please feel free to try it out yourself, email sharing as you go.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/new-macos-speech-to-flash-player-audio-record-tutorial\/'>New MacOS Speech to Flash Player Audio Record Tutorial<\/a>.<\/p-->\n<hr>\n<p id='mossfpart'>Previous relevant <a target=_blank title='MacOS Speech to Flash Player Audio Record Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/macos-speech-to-flash-player-audio-record-tutorial\/'>MacOS Speech to Flash Player Audio Record Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"MacOS Speech to Flash Player Audio Record Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/macos_audio_nonmobile_flash.jpg\" title=\"MacOS Speech to Flash Player Audio Record Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">MacOS Speech to Flash Player Audio Record Tutorial<\/p><\/div>\n<p>Yesterday&#8217;s <a title='MacOS Text to Audio Share Tutorial' href='#mostast'>MacOS Text to Audio Share Tutorial<\/a> involved &#8230;<\/p>\n<ul>\n<li>local web server (over macOS) text to audio (via macOS say) programmatical input source for &#8220;voiceover&#8221; aims &#8230; and today, still on &#8230;<\/li>\n<li>local web server (over macOS) (user) we have speech to audio (via Adobe Flash Player plugin) input source for &#8220;voiceover&#8221; or &#8220;dictation&#8221; or &#8220;voice memo feeling&#8221; aims<\/li>\n<\/ul>\n<p> &#8230; all shareable via email.  So these are two non-mobile &#8220;voiceover&#8221; ideas, and we will present a mobile idea into the future, and thereby open a public domain worthy side to the functionality, then.  Rereading here, it just tweaked with us that we can offer this &#8220;public domain&#8221; aspect even today with <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/macos_say_record.php---GETME\" title=\"macos_say_record.php\">a changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php---GETME\" title=\"macos_say_record.php\">macos_say_record.php<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php\" title=\"Click picture\">live run<\/a> link here, and your Flash Player methodology could work as long as you realize it will be later we hide the inapplicable macOS &#8220;say&#8221; logics for &#8220;public domain&#8221; usage.<\/p>\n<p>You&#8217;ll see in these changes more interplay among &#8230;<\/p>\n<ul>\n<li>popup window child windows &#8230; and <\/li>\n<li>iframe child windows that listen out for the (next) Flash Player *.wav file creation event via a recursive &#8230; HTML &#8230;<br \/>\n&lt;?php<br \/>\n<code><br \/>\n&lt;iframe onload=checkff(this); name=checkflash id=checkflash style=display:none; src='.\/macos_say_record.php?audiosize=y'&gt;&lt;\/iframe&gt;<br \/>\n<\/code><br \/>\n?&gt;<br \/>\n &#8230;<br \/>\n&lt;?php<br \/>\n<code><br \/>\nif (isset($_GET['audiosize'])) {<br \/>\n\/\/  if (file_exists('HTTP:\/\/www.rjmprogramming.com.au\/MarkItUp\/html\/audio\/audio.wav')) {<br \/>\n    if (isset($_GET['getmecontent'])) {<br \/>\n$ch = curl_init();<br \/>\ncurl_setopt($ch, CURLOPT_URL, 'HTTP:\/\/www.rjmprogramming.com.au\/MarkItUp\/html\/audio\/audio.wav');<br \/>\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br \/>\n$output = curl_exec($ch);<br \/>\ncurl_close($ch);<br \/>\n    echo \"&lt;html&gt;&lt;body onload=\\\" parent.document.getElementById('audioname').value='audiocapture.wav'; parent.document.getElementById('daudiolater').innerHTML='&lt;audio id=thataudio controls autoplay loop&gt;&lt;source type=audio\/x-wav src=\" . \"data:audio\/x-wav;base64,\" . base64_encode($output) . \"&gt;&lt;\/source&gt;&lt;\/audio&gt;&nbsp;&lt;a style=display:inline-block;text-decoration:none;cursor:pointer; onclick=emailit(); title=Email&gt;&#128231;&lt;\/a&gt;';\\\"&gt;&lt;p&gt;\" . strlen($output) . \"&lt;\/p&gt;&lt;div&gt;data:audio\/x-wav;base64,\" . base64_encode($output) . \"&lt;\/div&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n    } else {<br \/>\n    \/\/$context = stream_context_create(array('http' =&gt; array('header'=&gt;'Connection: close\\r\\n')));<br \/>\n    \/\/$ct=file_get_contents('HTTP:\/\/www.rjmprogramming.com.au\/MarkItUp\/html\/audio\/audio.wav',false,$context);<br \/>\n    \/\/file_put_contents(\"x.x\",strlen($ct));<br \/>\n$ch = curl_init();<br \/>\ncurl_setopt($ch, CURLOPT_URL, 'HTTP:\/\/www.rjmprogramming.com.au\/MarkItUp\/html\/audio\/audio.wav');<br \/>\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br \/>\n$output = curl_exec($ch);<br \/>\ncurl_close($ch);<br \/>\n    echo \"&lt;html&gt;&lt;body&gt;&lt;p&gt;\" . strlen($output) . \"&lt;\/p&gt;&lt;div&gt;&lt;\/div&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n    }<br \/>\n\/\/  } else {<br \/>\n\/\/    echo \"&lt;html&gt;&lt;body&gt;&lt;p&gt;-1&lt;\/p&gt;&lt;div&gt;&lt;\/div&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n\/\/  }<br \/>\n  exit;<br \/>\n}<br \/>\n<\/code><br \/>\n?&gt;<br \/>\n &#8230; file_get_contents turning out to be so much slower than curl\n<\/li>\n<\/ul>\n<p>Without resorting to any passwords we tighten up the interface to the PHP email helper code at the PHP email helper code end by insisting the email only be sent if the user entry into the interim textarea &#8230;<\/p>\n<ul>\n<li>contains no &#8220;#&#8221; characters<\/li>\n<li>starts with &#8230; data:audio\/<\/li>\n<li>ends with the same 10 characters passed over to the PHP email helper code<\/li>\n<\/ul>\n<p> &#8230; as per &#8230;<\/p>\n<p>&lt;?php<br \/>\n<code><br \/>\n  $smt=\"\";<br \/>\n  if (isset($_GET['sliceminusten'])) { $smt=' (' . str_replace(\" \",\"+\",urldecode($_GET['sliceminusten'])) . ')'; }<br \/>\n  if (strlen($smt) == 13 && strpos(str_replace(\"+\",\" \",('' . urldecode($_GET['to']))),\"@\") !== false && str_replace(\"+\",\" \",('' . urldecode($_GET['subj']))) != '') {<br \/>\n  echo \"&lt;html&gt;&lt;head&gt;&lt;script type='text\/javascript'&gt;<br \/>\n   var smt=('\" . $smt . \"').substring(2).substring(0,10), smts='';<br \/>\n   function onsm() {<br \/>\n  if (window.opener && window.opener !== window) {<br \/>\n  if (5 == 5) {   \/\/ window.opener.document.getElementById('result')) {<br \/>\n  document.getElementById('divplace').innerHTML='Email sent' + smts + '.';<br \/>\n  \/\/alert(window.opener.document.getElementById('result').slice(-10) + ' vs ' + smt);<br \/>\n  return true;<br \/>\n  } else {<br \/>\n  document.getElementById('divplace').innerHTML='Other green textbox not detected.';<br \/>\n  return false;<br \/>\n  }<br \/>\n  } else {<br \/>\n  document.getElementById('divplace').innerHTML='Not a popup window.';<br \/>\n  return false;<br \/>\n  }<br \/>\n   }<br \/>\n   function fixta() {<br \/>\n   if (document.getElementById('taready').value.indexOf('#') == -1 && (document.getElementById('taready').value.indexOf('data:audio\/') == 0 || document.getElementById('taready').value == '')) {<br \/>\n   if (document.getElementById('taready').value == '' || ('          ' + document.getElementById('taready').value).slice(-10) == smt) {<br \/>\n   if (document.getElementById('taready').value != '') {<br \/>\n   var midbit=document.getElementById('taready').value.split('data:')[1].split(';')[0] + ' src=' + \\\"'\\\";<br \/>\n   document.getElementById('taready').value='&lt;body&gt;&lt;audio id=thisaudio controls loop&gt;&lt;source type=' + midbit + document.getElementById('taready').value.replace(\/\\ \/g,'+') + \\\"'\\\" + '&gt;&lt;\/source&gt;&lt;\/audio&gt;&lt;\/body&gt;';<br \/>\n   } else {<br \/>\n   document.getElementById('taready').value='&lt;body&gt;&lt;p&gt;&lt;\/p&gt;&lt;\/body&gt;';<br \/>\n   smts=' with the subject only';<br \/>\n   }<br \/>\n   return true;<br \/>\n   } else {<br \/>\n   \/\/document.getElementById('divplace').innerHTML='Copy failed because ' + ('          ' + document.getElementById('taready').value).slice(-10) + ' paste does not match ' + smt + ' copy.';<br \/>\n   document.getElementById('divplace').innerHTML='Copy failed because paste does not match copy.';<br \/>\n   return false;<br \/>\n   }<br \/>\n   } else {<br \/>\n   document.getElementById('divplace').innerHTML='Incorrect data';<br \/>\n   return false;<br \/>\n   }<br \/>\n   }<br \/>\n   &lt;\/script&gt;&lt;\/head&gt;&lt;body onload=\\\"document.getElementById('taready').focus();\\\"&gt;&lt;h1 id=status&gt;Paste to lightgreen here (already copied from lightgreen there (but recopy and repaste yourself if last characters\" . $smt . \" do not match) and click yellow button to Email off this Audio player ...&lt;\/h1&gt;<br \/>\n  &lt;form target=ifplace onsubmit=\\\"if (fixta()) { return onsm(); } else {  return false; }\\\" action=.\/emailhtml.php method=POST&gt;<br \/>\n  &lt;input type=hidden name=inline value=''&gt;&lt;\/input&gt;<br \/>\n  To: &lt;input style=width:80%; type=text name=to value='\" . str_replace(\"+\",\" \",urldecode($_GET['to'])) . \"'&gt;&lt;\/input&gt;&lt;br&gt;<br \/>\n  Subject: &lt;input style=width:80%; type=text name=subj value='\" . str_replace(\"+\",\" \",urldecode($_GET['subj'])) . \"'&gt;&lt;\/input&gt;&lt;br&gt;<br \/>\n  &lt;textarea style=width:100%;background-color:lightgreen; cols=80 rows=10 name=tdhuhta id=taready&gt;&lt;\/textarea&gt;&lt;br&gt;&lt;br&gt;<br \/>\n  &lt;input id=sub type=submit style=background-color:yellow; value='Email'&gt;&lt;\/input&gt;&lt;\/form&gt;&lt;br&gt;<br \/>\n  &lt;iframe style=display:none; name=ifplace id=ifplace src=.\/emailhtml.php&gt;&lt;\/iframe&gt;<br \/>\n  &lt;div id=divplace&gt;&lt;\/div&gt;<br \/>\n  &lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n  } else {<br \/>\n  echo \"&lt;html&gt;&lt;body&gt;&lt;p&gt;Incorrect usage.&lt;\/p&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n  }<br \/>\n  exit;<br \/>\n<\/code><br \/>\n?&gt;<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/macos-speech-to-flash-player-audio-record-tutorial\/'>MacOS Speech to Flash Player Audio Record Tutorial<\/a>.<\/p-->\n<hr>\n<p id='mostast'>Previous relevant <a target=_blank title='MacOS Text to Audio Share Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/macos-text-to-audio-share-tutorial\/'>MacOS Text to Audio Share Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"MacOS Text to Audio Share Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/share_say.jpg\" title=\"MacOS Text to Audio Share Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">MacOS Text to Audio Share Tutorial<\/p><\/div>\n<p>In order to share the audio file of yesterday&#8217;s <a title='MacOS Text to Audio Internationalization Tutorial' href='#mostait'>MacOS Text to Audio Internationalization Tutorial<\/a> we cannot use &#8230;<\/p>\n<ul>\n<li>client based &#8220;a&#8221; &#8220;mailto:&#8221; link approaches because &#8230;\n<ol>\n<li>the size of data is too large<\/li>\n<li>we need to be able to use HTML within Inline HTML Email if we are not happy leaving around RJM Programming web server audio files (which we are not)<\/li>\n<\/ol>\n<p> &#8230; and so we need to call on &#8230;<\/li>\n<li>server (public, not local) based code (ie. PHP, for us) that can email Inline HTML Email<\/li>\n<\/ul>\n<p> &#8230; and calling on that server (public, not local) based code you can choose to &#8230;<\/p>\n<ul>\n<li>involve <a target=_blank title='Another useful link' href='http:\/\/www.html5rocks.com\/en\/tutorials\/cors\/'>CORS<\/a> in an Ajax FormData call or an HTML Form method=POST &#8230; or &#8230;<\/li>\n<li>involve window.<a target=_blank title='PostMessage' href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Window\/postMessage'>PostMessage<\/a> approach (perhaps involving web server audio files that are temporary) &#8230; or, as we decided upon &#8230;<\/li>\n<li>involve popup web server &#8220;inhouse&#8221; PHP Inline HTML Email creator helper &#8230; that &#8230;\n<ul>\n<li>codes allowances for the caller situation (that situation having ensured a data-URI &#8220;copy&#8221; of the audio content in in the web browser buffer ahead of the popup window appearing, all instigated via a new &#128231; email emoji button (&amp;#128231;)) &#8230;<\/li>\n<li>sets up the PHP code &#8230;<br \/>\n&lt;?php<br \/>\n <code><br \/>\n  echo \"&lt;html&gt;&lt;head&gt;&lt;script type='text\/javascript'&gt;  function fixta() { if (document.getElementById('taready').value.indexOf('data:') == 0) { var midbit=document.getElementById('taready').value.split('data:')[1].split(';')[0] + ' src=' + \\\"'\\\"; document.getElementById('taready').value='&lt;body&gt;&lt;audio id=thisaudio controls loop&gt;&lt;source type=' + midbit + document.getElementById('taready').value.replace(\/\\ \/g,'+') + \\\"'\\\" + '&gt;&lt;\/source&gt;&lt;\/audio&gt;&lt;\/body&gt;'; }  } &lt;\/script&gt;&lt;\/head&gt;&lt;body onload=\\\"document.getElementById('taready').focus();\\\"&gt;&lt;h1 id=status&gt;Paste to lightgreen here (already copied from lightgreen there) and click yellow button to Email off ...&lt;\/h1&gt;<br \/>\n  &lt;form onsubmit='fixta(); return true;' action=.\/emailhtml.php method=POST&gt;<br \/>\n  &lt;input type=hidden name=inline value=''&gt;&lt;\/input&gt;<br \/>\n  &lt;input type=hidden name=to value='\" . str_replace(\"+\",\" \",urldecode($_GET['to'])) . \"'&gt;&lt;\/input&gt;<br \/>\n  &lt;input type=hidden name=subj value='\" . str_replace(\"+\",\" \",urldecode($_GET['subj'])) . \"'&gt;&lt;\/input&gt;<br \/>\n  &lt;textarea style=width:100%;background-color:lightgreen; cols=80 rows=10 name=tdhuhta id=taready&gt;&lt;\/textarea&gt;&lt;br&gt;<br \/>\n  &lt;input id=sub type=submit style=background-color:yellow; value='Email to \" . str_replace(\"+\",\" \",urldecode($_GET['to'])) . \" ... \" . str_replace(\"+\",\" \",urldecode($_GET['subj'])) . \"'&gt;&lt;\/input&gt;&lt;\/form&gt;<br \/>\n  &lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n  exit;<br \/>\n <\/code><br \/>\n?&gt;\n <\/li>\n<li>awaits the user clicking an interim HTML form submit button &#8230; that &#8230;<\/li>\n<li>recalls itself and really sends the Inline HTML Email containing HTML that includes an audio tag with data-URI content<\/li>\n<\/ul>\n<p> &#8230; this whole scenario only acceptable in its entirety by iOS Mail apps (but not Gmail Webmail nor macOS Mail (at least with our testing)).<\/p>\n<p>Again, given the same local web server provisions as outlined on the day before yesterday, feel free to try out <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/macos_say_record.php--GETME\" title=\"macos_say_record.php\">a changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php--GETME\" title=\"macos_say_record.php\">macos_say_record.php<\/a> macOS &#8220;say&#8221; PHP helper with better email sharing functionality.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/new-macos-text-to-audio-share-tutorial\/'>MacOS Text to Audio Share Tutorial<\/a>.<\/p-->\n<hr>\n<p id='mostait'>Previous relevant <a target=_blank title='MacOS Text to Audio Internationalization Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/macos-text-to-audio-internationalization-tutorial\/'>MacOS Text to Audio Internationalization Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"MacOS Text to Audio Internationalization Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku__say_i.jpg\" title=\"MacOS Text to Audio Internationalization Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">MacOS Text to Audio Internationalization Tutorial<\/p><\/div>\n<p>Yesterday&#8217;s <a title='MacOS Text to Audio Primer Tutorial' href='#mostapt'>MacOS Text to Audio Primer Tutorial<\/a> was very &#8220;English&#8221;, at least hereabouts.  We think it would be good to Internationalize the &#8220;say&#8221; integration with &#8220;-v&#8221; voices in other languages to choose from.<\/p>\n<p>That &#8220;Internationalization&#8221; we have <a target=_blank title='Apple' href='https:\/\/apple.com'>Apple<\/a> to thank for, because &#8220;say&#8221; documents &#8230;<\/p>\n<blockquote><p>\n$ say -v &#8216;?&#8217;<br \/>\nAlex                en_US    # Most people recognize me by my voice.<br \/>\nAlice               it_IT    # Salve, mi chiamo Alice e sono una voce italiana.<br \/>\nAlva                sv_SE    # Hej, jag heter Alva. Jag \u00e4r en svensk r\u00f6st.<br \/>\nAmelie              fr_CA    # Bonjour, je m\u2019appelle Amelie. Je suis une voix canadienne.<br \/>\nAnna                de_DE    # Hallo, ich hei\u00dfe Anna und ich bin eine deutsche Stimme.<br \/>\nCarmit              he_IL    # \u05e9\u05dc\u05d5\u05dd. \u05e7\u05d5\u05e8\u05d0\u05d9\u05dd \u05dc\u05d9 \u05db\u05e8\u05de\u05d9\u05ea, \u05d5\u05d0\u05e0\u05d9 \u05e7\u05d5\u05dc \u05d1\u05e9\u05e4\u05d4 \u05d4\u05e2\u05d1\u05e8\u05d9\u05ea.<br \/>\nClaire              nl_NL    # Hallo, mijn naam is Claire. Ik ben een Nederlandse stem.<br \/>\nDamayanti           id_ID    # Halo, nama saya Damayanti. Saya berbahasa Indonesia.<br \/>\nDaniel              en_GB    # Hello, my name is Daniel. I am a British-English voice.<br \/>\nDiego               es_AR    # Hola, me llamo Diego y soy una voz espa\u00f1ola.<br \/>\nEllen               nl_BE    # Hallo, mijn naam is Ellen. Ik ben een Belgische stem.<br \/>\nFiona               en-scotland # Hello, my name is Fiona. I am a Scottish-English voice.<br \/>\nFred                en_US    # I sure like being inside this fancy computer<br \/>\nIoana               ro_RO    # Bun\u0103, m\u0103 cheam\u0103 Ioana . Sunt o voce rom\u00e2neasc\u0103.<br \/>\nJoana               pt_PT    # Ol\u00e1, chamo-me Joana e dou voz ao portugu\u00eas falado em Portugal.<br \/>\nJorge               es_ES    # Hola, me llamo Jorge y soy una voz espa\u00f1ola.<br \/>\nJuan                es_MX    # Hola, me llamo Juan y soy una voz mexicana.<br \/>\nKanya               th_TH    # \u0e2a\u0e27\u0e31\u0e2a\u0e14\u0e35\u0e04\u0e48\u0e30 \u0e14\u0e34\u0e09\u0e31\u0e19\u0e0a\u0e37\u0e48\u0e2dKanya<br \/>\nKaren               en_AU    # Hello, my name is Karen. I am an Australian-English voice.<br \/>\nKate                en_GB    # Hello, my name is Kate. I am a British-English voice.<br \/>\nKyoko               ja_JP    # \u3053\u3093\u306b\u3061\u306f\u3001\u79c1\u306e\u540d\u524d\u306fKyoko\u3067\u3059\u3002\u65e5\u672c\u8a9e\u306e\u97f3\u58f0\u3092\u304a\u5c4a\u3051\u3057\u307e\u3059\u3002<br \/>\nLaura               sk_SK    # Ahoj. Vol\u00e1m sa Laura . Som hlas v slovenskom jazyku.<br \/>\nLekha               hi_IN    # \u0928\u092e\u0938\u094d\u0915\u093e\u0930, \u092e\u0947\u0930\u093e \u0928\u093e\u092e \u0932\u0947\u0916\u093e \u0939\u0948. \u092e\u0948\u0902 \u0939\u093f\u0928\u094d\u0926\u0940 \u092e\u0947\u0902 \u092c\u094b\u0932\u0928\u0947 \u0935\u093e\u0932\u0940 \u0906\u0935\u093e\u091c\u093c \u0939\u0942\u0901.<br \/>\nLuca                it_IT    # Salve, mi chiamo Luca e sono una voce italiana.<br \/>\nLuciana             pt_BR    # Ol\u00e1, o meu nome \u00e9 Luciana e a minha voz corresponde ao portugu\u00eas que \u00e9 falado no Brasil<br \/>\nMaged               ar_SA    # \u0645\u0631\u062d\u0628\u064b\u0627 \u0627\u0633\u0645\u064a Maged. \u0623\u0646\u0627 \u0639\u0631\u0628\u064a \u0645\u0646 \u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629.<br \/>\nMariska             hu_HU    # \u00dcdv\u00f6zl\u00f6m! Mariska vagyok. \u00c9n vagyok a magyar hang.<br \/>\nMei-Jia             zh_TW    # \u60a8\u597d\uff0c\u6211\u53eb\u7f8e\u4f73\u3002\u6211\u8aaa\u570b\u8a9e\u3002<br \/>\nMelina              el_GR    # \u0393\u03b5\u03b9\u03b1 \u03c3\u03b1\u03c2, \u03bf\u03bd\u03bf\u03bc\u03ac\u03b6\u03bf\u03bc\u03b1\u03b9 Melina. \u0395\u03af\u03bc\u03b1\u03b9 \u03bc\u03b9\u03b1 \u03b5\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ae \u03c6\u03c9\u03bd\u03ae.<br \/>\nMilena              ru_RU    # \u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 Milena. \u042f \u2013 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u0433\u043e\u043b\u043e\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<br \/>\nMoira               en_IE    # Hello, my name is Moira. I am an Irish-English voice.<br \/>\nMonica              es_ES    # Hola, me llamo Monica y soy una voz espa\u00f1ola.<br \/>\nNora                nb_NO    # Hei, jeg heter Nora. Jeg er en norsk stemme.<br \/>\nOliver              en_GB    # Hello, my name is Oliver. I am a British-English voice.<br \/>\nPaulina             es_MX    # Hola, me llamo Paulina y soy una voz mexicana.<br \/>\nSamantha            en_US    # Hello, my name is Samantha. I am an American-English voice.<br \/>\nSara                da_DK    # Hej, jeg hedder Sara. Jeg er en dansk stemme.<br \/>\nSatu                fi_FI    # Hei, minun nimeni on Satu. Olen suomalainen \u00e4\u00e4ni.<br \/>\nSerena              en_GB    # Hello, my name is Serena. I am a British-English voice.<br \/>\nSin-ji              zh_HK    # \u60a8\u597d\uff0c\u6211\u53eb Sin-ji\u3002\u6211\u8b1b\u5ee3\u6771\u8a71\u3002<br \/>\nTessa               en_ZA    # Hello, my name is Tessa. I am a South African-English voice.<br \/>\nThomas              fr_FR    # Bonjour, je m\u2019appelle Thomas. Je suis une voix fran\u00e7aise.<br \/>\nTing-Ting           zh_CN    # \u60a8\u597d\uff0c\u6211\u53ebTing-Ting\u3002\u6211\u8bb2\u4e2d\u6587\u666e\u901a\u8bdd\u3002<br \/>\nTom                 en_US    # Hello, my name is Tom. I am an American-English voice.<br \/>\nVeena               en_IN    # Hello, my name is Veena. I am an Indian-English voice.<br \/>\nVictoria            en_US    # Isn&#8217;t it nice to have a computer that will talk to you?<br \/>\nXander              nl_NL    # Hallo, mijn naam is Xander. Ik ben een Nederlandse stem.<br \/>\nYelda               tr_TR    # Merhaba, benim ad\u0131m Yelda. Ben T\u00fcrk\u00e7e bir sesim.<br \/>\nYuna                ko_KR    # \uc548\ub155\ud558\uc138\uc694. \uc81c \uc774\ub984\uc740 Yuna\uc785\ub2c8\ub2e4. \uc800\ub294 \ud55c\uad6d\uc5b4 \uc74c\uc131\uc785\ub2c8\ub2e4.<br \/>\nYuri                ru_RU    # \u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 Yuri. \u042f \u2013 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u0433\u043e\u043b\u043e\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<br \/>\nZosia               pl_PL    # Witaj. Mam na imi\u0119 Zosia, jestem g\u0142osem kobiecym dla j\u0119zyka polskiego.<br \/>\nZuzana              cs_CZ    # Dobr\u00fd den, jmenuji se Zuzana. Jsem \u010desk\u00fd hlas.\n<\/p><\/blockquote>\n<p> &#8230; to go on here, as a help for this <i>level<\/i> of &#8220;Internationalization&#8221;.   Another &#8220;level&#8221; again would be to translate the webpage and menu wording, but we&#8217;ve decided against that here today.<\/p>\n<p>So we add a language dropdown and a voice dropdown to help the user explore this Text to Audio functionality accessing a macOS or Mac OS X operating system.<\/p>\n<p>Also, today, we&#8217;ve introduced &#8220;.m4a&#8221; (audio\/mp4) as the default audio file extension to use with the file created via &#8220;say&#8221; &#8220;-o&#8221; switch for all but Safari, as this works better for &#8220;all but Safari&#8221; (abs<font size=1>olutely<\/font>).<\/p>\n<p>Given the same local web server provisions as outlined yesterday feel free to try out <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/macos_say_record.php-GETME\" title=\"macos_say_record.php\">a changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php-GETME\" title=\"macos_say_record.php\">macos_say_record.php<\/a> macOS &#8220;say&#8221; PHP helper with better Internationalization functionality, thanks in large part to the great ideas from <a target=_blank title='Useful link' href='https:\/\/stackoverflow.com\/questions\/3770513\/detect-browser-language-in-php'>this useful link<\/a>.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank href='\/\/www.rjmprogramming.com.au\/ITblog\/macos-text-to-audio-internationalization-tutorial\/'>MacOS Text to Audio Internationalization Tutorial<\/a>.<\/p-->\n<hr>\n<p id='mostapt'>Previous relevant <a target=_blank title='MacOS Text to Audio Primer Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/macos-text-to-audio-primer-tutorial\/'>MacOS Text to Audio Primer Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"MacOS Text to Audio Primer Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku__say.jpg\" title=\"MacOS Text to Audio Primer Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">MacOS Text to Audio Primer Tutorial<\/p><\/div>\n<p>The previous <a title='Mac OS X Text to English Speech Primer Tutorial' href='#mosxtespt'>Mac OS X Text to English Speech Primer Tutorial<\/a> &#8230;<\/p>\n<ul>\n<li>lauded the &#8230;<br \/>\n<blockquote cite='\/\/www.rjmprogramming.com.au\/ITblog\/mac-os-x-text-to-english-speech-primer-tutorial\/'><p>\nText to English Speech via Mac OS X&#8217;s command line <a target=_blank title='say command information from Apple' href='https:\/\/ss64.com\/osx\/say.html'><i>say<\/i><\/a> command\n<\/p><\/blockquote>\n<\/li>\n<li>and today we write some PHP (with its very useful <a target=_blank title='PHP exec() method information' href='http:\/\/php.net\/manual\/en\/function.exec.php'><i>exec<\/i><\/a> conduit to &#8220;say&#8221;) to make use of the same (macOS) &#8220;say&#8221; and its Text to Audio talents (via its &#8220;-o&#8221; switch usage)<\/li>\n<\/ul>\n<p> &#8230; and it&#8217;s at times like this we wish that the RJM Programming domain&#8217;s web server had a macOS operating system.  Alas, &#8220;say&#8221; is a macOS and Mac OS X application, but not a Linux one.<\/p>\n<p>None the less, we integrated &#8230;<\/p>\n<ul>\n<li><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html--GETME\" title=\"haiku_animated_gif.html\">today&#8217;s changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html--GETME\">haiku_animated_gif.html<\/a>&#8216;s <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\">Haiku creation and sharing web application live run<\/a> link&#8217;s workings (last talked about at <a target=_blank href='https:\/\/www.rjmprogramming.com.au\/ITblog\/haiku-animated-gif-creator-tutorial\/' title='Haiku Animated Gif Creator Tutorial'>Haiku Animated Gif Creator Tutorial<\/a>) with &#8230;<\/li>\n<li><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php_GETME\" title=\"macos_say_record.php\">macos_say_record.php<\/a> macOS &#8220;say&#8221; PHP helper<\/li>\n<\/ul>\n<p> &#8230; so that if you had a <a target=_blank title='MAMP for Apache\/PHP\/MySql on Mac OS X local web server' href='http:\/\/www.mamp.info'><i>MAMP<\/i><\/a> local Apache\/PHP\/MySql web server going, and you &#8230;<\/p>\n<ul>\n<li>downloaded <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php---------------GETME\" title=\"tutorial_to_animated_gif.php\">tutorial_to_animated_gif.php<\/a> to same MAMP subdirectory as &#8230;<\/li>\n<li>downloaded <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html--GETME\">haiku_animated_gif.html<\/a> to same MAMP place (which can be the same MAMP document root place as talked about below, in which case <i>HTTP:\/\/localhost:8888\/haiku_animated_gif.html<\/i> is what you&#8217;d type into the web browser address bar to try this for yourself on a macOS or Mac OS X system) &#8230; and &#8230;<\/li>\n<li>downloaded <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record.php_GETME\" title=\"macos_say_record.php\">macos_say_record.php<\/a> to MAMP document root (for us, equating to URL <i>HTTP:\/\/localhost:8888\/macos_say_record.php<\/i>)<\/li>\n<\/ul>\n<p> &#8230; then you would be in the position to see a Haiku creation scenario (where we used the Safari web browser) like with today&#8217;s <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku__say.jpg\" title=\"tutorial picture\">tutorial picture<\/a>, interesting, in our view, regarding the integration &#8220;tactics&#8221; &#8230;<\/p>\n<ul>\n<li>parent Haiku window opens &#8230;<\/li>\n<li>child (popup) PHP &#8220;say&#8221; helper web application &#8230; which &#8230;<\/li>\n<li>passes back to parent &#8230;<br \/>\n<code><br \/>\n    <a target=_blank title='window.opener information from W3Schools' href='https:\/\/www.w3schools.com\/jsref\/prop_win_opener.asp'>window.opener<\/a>.document.getElementById('aurl').value=document.getElementById('result').value;<br \/>\n    window.opener.atab(window.opener.document.getElementById('aurl'));<br \/>\n<\/code>\n<\/li>\n<\/ul>\n<p> &#8230; achieving functionality we often ask HTML <a target=_blank title='HTML iframe information from w3schools' href='http:\/\/www.w3schools.com\/tags\/tag_iframe.asp'>iframe<\/a> elements achieve for our code.  HTML iframe does have a role today, though.  It uses a favoured &#8220;client pre-emptive iframe&#8221; approach to determine whether we even try to open that popup window above via &#8230;<\/p>\n<ul>\n<li>HTML &#8230;<br \/>\n<code><br \/>\n&lt;div id=dif&gt;&lt;\/div&gt;<br \/>\n<\/code>\n<\/li>\n<li>Javascript &#8230;<br \/>\n<code><br \/>\n     var mampok=false, mampprefix='';<br \/>\n<br \/>\n     if (document.URL.indexOf('\/localhost') != -1) {<br \/>\n       mampprefix=\"http:\/\/localhost\" + document.URL.split('\/localhost')[1].split('\/')[0] + \"\/\";<br \/>\n       document.getElementById('dif').innerHTML=\"&lt;iframe onload='oicheck(this);' style='display:none;' src='http:\/\/localhost\" + document.URL.split('\/localhost')[1].split('\/')[0] + \"\/'&gt;&lt;\/iframe&gt;\";<br \/>\n     }<br \/>\n<br \/>\n function oicheck(iois) {<br \/>\n  mampok=false;<br \/>\n  if (iois != null) {<br \/>\n    var aconto = (iois.contentWindow || iois.contentDocument);<br \/>\n    if (aconto != null) {<br \/>\n     if (aconto.document) { aconto = aconto.document; }<br \/>\n     if (aconto.body != null) {<br \/>\n      if (aconto.body.innerHTML.toLowerCase().indexOf('&gt;not found&lt;') == -1 && aconto.body.innerHTML.toLowerCase().indexOf(\"our home page for your perusal\") == -1) { mampok=true; }<br \/>\n     }<br \/>\n    }<br \/>\n  }<br \/>\n }<br \/>\n<br \/>\n\/\/ and then later when the textarea has text and its onblur event is triggered ...<br \/>\n if (mampok) {<br \/>\n if (wois) { wois.close(); wois=null; }<br \/>\n wois=window.open(mampprefix + \"macos_say_record.php?saythis=\" + encodeURIComponent(document.getElementById('myta').value),\"_blank\",\"top=460,left=400,width=700,height=400\");<br \/>\n }<br \/>\n<\/code>\n<\/li>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/macos-text-to-audio-primer-tutorial\/'>MacOS Text to Audio Primer Tutorial<\/a>.<\/p-->\n<hr>\n<p id='mosxtespt'>Previous relevant <a target=_blank title='Mac OS X Text to English Speech Primer Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/mac-os-x-text-to-english-speech-primer-tutorial\/'>Mac OS X Text to English Speech Primer Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/audio_video.html?clickit=submitmb\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Mac OS X Text to English Speech Primer Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/say.jpg\" title=\"Mac OS X Text to English Speech Primer Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Mac OS X Text to English Speech Primer Tutorial<\/p><\/div>\n<p>We&#8217;ve got a few new ideas today &#8230;<\/p>\n<ol>\n<li>Text to English Speech via Mac OS X&#8217;s command line <a target=_blank title='say command information from Apple' href='https:\/\/ss64.com\/osx\/say.html'><i>say<\/i><\/a> command used by PHP via <a target=_blank title='PHP exec() method information' href='http:\/\/php.net\/manual\/en\/function.exec.php'><i>exec<\/i><\/a> to make <a target=_blank title='say.php' href='http:\/\/www.rjmprogramming.com.au\/PHP\/say.php_GETME'>say.php<\/a> (which is useful as a download to a Mac OS X laptop using <a target=_blank title='MAMP for Apache\/PHP\/MySql on Mac OS X local web server' href='http:\/\/www.mamp.info'>MAMP<\/a>) which, today, does not have a live run because the web server of domain <i>rjmprogramming.com.au<\/i> is a CentOS Linux server &#8230; Linux equivalent of Mac OS X&#8217;s <i>say<\/i>? &#8230; read <a target=_blank title='Useful link' href='https:\/\/github.com\/usc-isi-i2\/festival-text-to-speech-service\/blob\/master\/README.md'>here<\/a><\/li>\n<li>Trying to present this brought up the usual movie production problem with <a target=_blank title='iMovie for Mac information from Apple' href='http:\/\/www.apple.com\/au\/mac\/imovie\/'>iMovie<\/a> overlaying the audio on top of the video (though you may want to try, and you could start reading with <a target=_blank title='Semi useful link' href='http:\/\/video.stackexchange.com\/questions\/2579\/can-you-link-an-audio-track-to-a-video-track-in-imovie'>this link<\/a>) versus <a target=_blank title='QuickTime information from Apple' href='https:\/\/support.apple.com\/downloads\/quicktime'>QuickTime Player<\/a> talent to catch both audio and video tracks (and that we ended up using), but not of the &#8220;screen goings on&#8221;, alas versus <a target=_blank title='MPlayer OSX Extended information' href='http:\/\/mplayerosx.ch\/'>MPlayer OSX Extended<\/a> which can play separately but not two tracks on top and doesn&#8217;t do any reconstituting &#8230; so &#8230;<\/li>\n<li>Improved on our inhouse Video\/Audio synchronizing efforts by allowing <a target=_blank title='audio_video.html' href='http:\/\/www.rjmprogramming.com.au\/PHP\/audio_video.html---GETME'>audio_video.html<\/a> supervisor (changed in <a target=_blank title='audio_video.html' href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/audio_video.html---GETME'>this way<\/a>) be able to be called to press one of its preconceived synchronization buttons <i>onload<\/i> which we do with (the newly added) <a target=_blank title='Macbeth Act 1 Scene 1' href='http:\/\/www.rjmprogramming.com.au\/PHP\/audio_video.html?clickit=submitmb'>Macbeth Act 1 Scene 1<\/a> &#8230; in a small <a target=_blank title='Birthday of Shakespeare' href='http:\/\/www.shakespeare.org.uk\/visit-the-houses\/whats-on.html\/birthday-celebrations.html'>celebration<\/a> of the Bard &#8230; who, am thinking (in that Falstaff way), would have got a huge chuckle out of &#8220;anonymous&#8221; instead of &#8220;anon&#8221; during the Three Witches scene &#8230; we <i>had<\/i> to do something to say Happy Birthday<\/li>\n<\/ol>\n<p>Along the way we tried filming the MacBook Pro with the iPad to a <a target=_blank title='YouTube' href='http:\/\/youtube.com'>YouTube<\/a> &#8230;<\/p>\n<p><iframe loading=\"lazy\" width=\"420\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/9-Hvlz8g1Mg\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p> &#8230; but weren&#8217;t happy with the audio quality, alas (too\/two).<\/p>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d21904' onclick='var dv=document.getElementById(\"d21904\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/text-to-speech\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d21904' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d49544' onclick='var dv=document.getElementById(\"d49544\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/audio\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d49544' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d49558' onclick='var dv=document.getElementById(\"d49558\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/audio\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d49558' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d49565' onclick='var dv=document.getElementById(\"d49565\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/email\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d49565' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d49572' onclick='var dv=document.getElementById(\"d49572\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/flash\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d49572' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d49579' onclick='var dv=document.getElementById(\"d49579\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/mobile\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d49579' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d49586' onclick='var dv=document.getElementById(\"d49586\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/synchronize\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d49586' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d49654' onclick='var dv=document.getElementById(\"d49654\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/popup\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d49654' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d49674' onclick='var dv=document.getElementById(\"d49674\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/muliple\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d49674' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d49680' onclick='var dv=document.getElementById(\"d49680\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/genericization\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d49680' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d51217' onclick='var dv=document.getElementById(\"d51217\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/watermark\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d51217' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d51224' onclick='var dv=document.getElementById(\"d51224\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/dropdown\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d51224' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d51233' onclick='var dv=document.getElementById(\"d51233\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/dimensions\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d51233' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d51238' onclick='var dv=document.getElementById(\"d51238\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/filter\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d51238' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d51323' onclick='var dv=document.getElementById(\"d51323\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/slide\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d51323' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d52532' onclick='var dv=document.getElementById(\"d52532\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/sychronize\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d52532' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>A couple of days ago with TextArea to Speech via macOS iTunes Tutorial we surmised &#8230; We can feel some PHP \u201caudio functionality\u201d ideas coming on \u2026 perhaps we need to take a Bex and have a lie down. &#8230; &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/audio-and-video-creator-via-media-browsing-tutorial\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,14,37],"tags":[83,3659,1993,418,760,932,997,1895,1670,1319,1369],"class_list":["post-52532","post","type-post","status-publish","format-standard","hentry","category-elearning","category-event-driven-programming","category-tutorials","tag-animated-gif","tag-audioi","tag-browse","tag-file","tag-media","tag-php","tag-programming","tag-sequence","tag-synchronize","tag-tutorial","tag-video"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/52532"}],"collection":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/comments?post=52532"}],"version-history":[{"count":3,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/52532\/revisions"}],"predecessor-version":[{"id":52535,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/52532\/revisions\/52535"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=52532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=52532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=52532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}