{"id":65471,"date":"2024-11-05T03:01:00","date_gmt":"2024-11-04T17:01:00","guid":{"rendered":"https:\/\/www.rjmprogramming.com.au\/ITblog\/?p=65471"},"modified":"2024-11-05T17:21:46","modified_gmt":"2024-11-05T07:21:46","slug":"animated-gif-slide-set-and-forget-dimensioning-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-slide-set-and-forget-dimensioning-tutorial\/","title":{"rendered":"Animated GIF Slide Set and Forget Dimensioning Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF Slide Set and Forget Dimensioning Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/set_and_forget_dimensioning.gif\" title=\"Animated GIF Slide Set and Forget Dimensioning Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF Slide Set and Forget Dimensioning Tutorial<\/p><\/div>\n<p>When you have a fairly large web application project you are coding, it&#8217;s pretty inevitable that you <a target=\"_blank\" title='?' href='https:\/\/www.google.com\/search?q=know+where+the+bodies+are+buried&#038;oq=know+where+the+&#038;gs_lcrp=EgZjaHJvbWUqBwgCEAAYgAQyBggAEEUYOTIHCAEQABiABDIHCAIQABiABDIHCAMQABiABDIHCAQQABiABDIHCAUQABiABDIHCAYQABiABDIICAcQABgWGB4yCAgIEAAYFhgeMggICRAAGBYYHtIBCDc0OTZqMGo0qAIAsAIB&#038;sourceid=chrome&#038;ie=UTF-8' rel=\"noopener\">&#8220;know where the bodies are buried&#8221;<\/a> <font size=1>(if you&#8217;ll pardon our amateur dramatics)<\/font>.  We&#8217;ve known about one for years with our inhouse Animated GIF Creator project (we last talked about at <a title='Animated GIF Slide Extraction Applied CSS Styling Tutorial' href='#agifseacssst'>Animated GIF Slide Extraction Applied CSS Styling Tutorial<\/a>), chipping away at it, but not cracking it to our satisfaction, concerning &#8230;<\/p>\n<ul>\n<li>when a user creates an animated GIF &#8230;<\/li>\n<li>derived of image slide sources of differing dimensions &#8230;<\/li>\n<li>up to today, we were allowing for this in a user selectable dropdown but not doing a good job of flagging that to the user &#8230; it occurred to us &#8230;<\/li>\n<li>today, on non-mobile, we&#8217;ll make the <a target=\"_blank\" title='HTML size attribute information from W3schools' href='https:\/\/www.w3schools.com\/tags\/att_size.asp' rel=\"noopener\"><i>size<\/i><\/a> attribute of that dropdown be the number of subelement option elements it has so that a non-mobile user can see all this happening &#8230; sorry, mobile users &#8230; and &#8230;<\/li>\n<li>append four more options, as required, namely &#8230;\n<ol>\n<li>Always Pick Maximal Dimensions<\/li>\n<li>Always Pick Minimal Dimensions<\/li>\n<li>Always Pick Maximal Width+Height<\/li>\n<li>Always Pick Minimal Width+Height<\/li>\n<\/ol>\n<p> &#8230; as a &#8220;set and forget&#8221; way a user can strategize their animated GIF output dimensioning no matter what else goes into the &#8220;slide mix&#8221;\n<\/li>\n<\/ul>\n<p>At least for non-mobile we feel that <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' rel=\"noopener\">this changed<\/a> PHP <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php--------------------------------------------------------------------------------------------GETME' rel=\"noopener\">tutorial_to_animated_gif.php<\/a> <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php' rel=\"noopener\">inhouse animated GIF creator web application<\/a> is worth retrying <font color=blue>regarding these Javascript modifications<\/font> &#8230;<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\nfunction owoh(thisselis) {<br \/>\n  var askwh='', askend=',[numSlides]', atwo=2;<br \/>\n  owvisited=true;<br \/>\n  <font color=blue>if (('' + thisselis.value).trim() == '' && ('' + thisselis.value) != '') {<br \/>\n     document.getElementById('defselwhs').innerHTML=document.getElementById('defselwhs').innerHTML.replace(' (' + document.getElementById('defselwhs').innerHTML.split(' (')[1].split(')')[0] + ')', ' (' + thisselis.innerHTML.split(' value=\\\"' + thisselis.value + '\\\"&gt;')[1].split('&lt;')[0].replace('Always ','') + thisselis.value + ')');<br \/>\n     return '';<br \/>\n  } else if (('' + thisselis.value) == '' && document.getElementById('defselwhs').innerHTML.indexOf(' (Always Pick') != -1) {<br \/>\n     document.getElementById('defselwhs').innerHTML=document.getElementById('defselwhs').innerHTML.replace(' (' + document.getElementById('defselwhs').innerHTML.split(' (')[1].split(')')[0] + ')', ' (or as below)');<br \/>\n     return '';<br \/>\n  } else if (('' + thisselis.value) == '' && document.getElementById('defselwhs').innerHTML.indexOf(' (Pick') != -1) {<br \/>\n     document.getElementById('defselwhs').innerHTML=document.getElementById('defselwhs').innerHTML.replace(' (' + document.getElementById('defselwhs').innerHTML.split(' (')[1].split(')')[0] + ')', ' (or as below)');<br \/>\n     return '';<br \/>\n  } else if (('' + thisselis.value) == '?' && document.getElementById('defselwhs').innerHTML.indexOf(' (Always Pick') != -1) {<br \/>\n     document.getElementById('defselwhs').innerHTML=document.getElementById('defselwhs').innerHTML.replace(' (' + document.getElementById('defselwhs').innerHTML.split(' (')[1].split(')')[0] + ')', ' (or as below)');<br \/>\n  } else if (('' + thisselis.value) == '?' && document.getElementById('defselwhs').innerHTML.indexOf(' (Pick') != -1) {<br \/>\n     document.getElementById('defselwhs').innerHTML=document.getElementById('defselwhs').innerHTML.replace(' (' + document.getElementById('defselwhs').innerHTML.split(' (')[1].split(')')[0] + ')', ' (or as below)');<br \/>\n  }<\/font><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    if (document.getElementById('slideshow2')) {<br \/>\n      if (document.getElementById('slideshow2').value != '') {<br \/>\n      atwo=1;<br \/>\n      while (document.getElementById('slideshow' + eval(1 + atwo)) && ('' + document.getElementById('slideshow' + eval(1 + atwo)).value) != '') {<br \/>\n        atwo++;<br \/>\n        askend=',[numSlides=' + atwo + ']';<br \/>\n      }<br \/>\n      }<br \/>\n    }<br \/>\n    askwh=prompt('Please comma separate width,height[,widthEnd,heightEnd' + askend + '] (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 (eval('' + askwh.split(',').length) &gt;= 4) {<br \/>\n    document.getElementById('owend').value='' + askwh.split(',')[2];<br \/>\n    document.getElementById('ohend').value='' + askwh.split(',')[3];<br \/>\n    \/\/alert('yes');<br \/>\n    } else {<br \/>\n    document.getElementById('owend').value='';<br \/>\n    document.getElementById('ohend').value='';<br \/>\n    \/\/alert('no');<br \/>\n    }<br \/>\n    if (eval('' + askwh.split(',').length) &gt;= 5) {<br \/>\n    document.getElementById('endnumber').value='' + askwh.split(',')[4];<br \/>\n    } else {<br \/>\n    document.getElementById('endnumber').value='';<br \/>\n    }<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    if (eval('' + askwh.split(',').length) &gt;= 4) {<br \/>\n      if (askwh.split(',')[2] == '-1') {<br \/>\n    document.getElementById('owend').value='' + Math.round(eval(document.getElementById('ow').value) * eval('' + askwh.split(',')[3]) \/ eval('' + askwh.split(',')[1]));<br \/>\n    askwh=askwh.replace(',-1', ',' + document.getElementById('owend').value);<br \/>\n      }<br \/>\n    }<br \/>\n    } else if ((askwh + '~').indexOf(',-1~') != -1 || (askwh + '~').indexOf(askwh.split(',')[0] + ',-1,') != -1) {<br \/>\n    document.getElementById('ow').value='' + askwh.split(',')[0];<br \/>\n    document.getElementById('oh').value='' + Math.round(eval('' + thisselis.outerHTML.split(' x ')[1].split('&lt;')[0]) * eval('' + askwh.split(',')[0]) \/ eval('' + thisselis.outerHTML.split(',')[0].split('&gt;')[eval(-1 + thisselis.outerHTML.split(',')[0].split('&gt;').length)]));<br \/>\n    askwh=askwh.replace(askwh.split(',')[0] + ',-1', askwh.split(',')[0] + ',' + document.getElementById('oh').value);<br \/>\n    if (eval('' + askwh.split(',').length) &gt;= 4) {<br \/>\n      if (askwh.split(',')[3] == '-1') {<br \/>\n    document.getElementById('ohend').value='' + Math.round(eval(document.getElementById('oh').value) * eval('' + askwh.split(',')[2]) \/ eval('' + askwh.split(',')[0]));<br \/>\n    askwh=askwh.replace(',-1', ',' + document.getElementById('ohend').value);<br \/>\n      }<br \/>\n    }<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 \/>\n<font color=blue>function selw() {<br \/>\n  var rework=false, ws=[], hs=[], ida=0, dimarr=[], maxis=0, minis=0, jda=0, maxwis=0, maxhis=0, minwis=0, minhis=0, cmaxis='', cminis='';<br \/>\n  if (document.getElementById('selwhs')) {<br \/>\n    if (eval('' + document.getElementById('selwhs').innerHTML.length) != selwhsl) {<br \/>\n      selwhsl=document.getElementById('selwhs').innerHTML.length;<br \/>\n      if (document.getElementById('selwhs').value.trim() == '' && document.getElementById('selwhs').value != '') {<br \/>\n         rework=true;<br \/>\n      }<br \/>\n      var ijk=eval(-1 + eval('' + document.getElementById('selwhs').innerHTML.split(' x ').length));<br \/>\n      document.title='' + ijk;<br \/>\n      if (ijk &gt;= 2 && document.getElementById('selwhs').innerHTML.indexOf('Always Pick ') == -1) {<br \/>\n         \/\/alert('yes');<br \/>\n         document.getElementById('selwhs').innerHTML+='&lt;option value=\\\"     \\\"&gt;Always Pick Maximal Dimensions&lt;\/option&gt;&lt;option value=\\\"    \\\"&gt;Always Pick Minimal Dimensions&lt;\/option&gt;&lt;option value=\\\"   \\\"&gt;Always Pick Maximum Width+Height&lt;\/option&gt;&lt;option value=\\\"  \\\"&gt;Always Pick Minimal Width+Height&lt;\/option&gt;';<br \/>\n         \/\/alert('Yes');<br \/>\n      } \/\/else if (ijk &gt; 2) {<br \/>\n         \/\/alert('huh ' + document.getElementById('selwhs').innerHTML);<br \/>\n      \/\/}<br \/>\n      if (rework) {<br \/>\n        dimarr=document.getElementById('selwhs').innerHTML.split(' x ');<br \/>\n        for (ida=1; ida&lt;dimarr.length; ida++) {<br \/>\n          ws.push(eval(dimarr[eval(-1 + ida)].split('&gt;')[eval(-1 + dimarr[eval(-1 + ida)].split('&gt;').length)]));<br \/>\n          hs.push(eval(dimarr[eval(0 + ida)].split('&lt;')[0]));<br \/>\n          jda=eval(eval(dimarr[eval(-1 + ida)].split('&gt;')[eval(-1 + dimarr[eval(-1 + ida)].split('&gt;').length)]) + eval(dimarr[eval(0 + ida)].split('&lt;')[0]));<br \/>\n          if (ida &lt;= 1) {<br \/>\n            maxis=jda;<br \/>\n            minis=jda;<br \/>\n            cmaxis='' + eval(dimarr[eval(-1 + ida)].split('&gt;')[eval(-1 + dimarr[eval(-1 + ida)].split('&gt;').length)]) + ',' + eval(dimarr[eval(0 + ida)].split('&lt;')[0]);<br \/>\n            cminis='' + eval(dimarr[eval(-1 + ida)].split('&gt;')[eval(-1 + dimarr[eval(-1 + ida)].split('&gt;').length)]) + ',' + eval(dimarr[eval(0 + ida)].split('&lt;')[0]);<br \/>\n            maxwis=ws[0];<br \/>\n            maxhis=hs[0];<br \/>\n            minwis=ws[0];<br \/>\n            minhis=hs[0];<br \/>\n          } else {<br \/>\n            if (ws[eval(-1 + ws.length)] &gt; maxwis) {<br \/>\n              maxwis=ws[eval(-1 + ws.length)];<br \/>\n            }<br \/>\n            if (ws[eval(-1 + ws.length)] &lt; minwis) {<br \/>\n              minwis=ws[eval(-1 + ws.length)];<br \/>\n            }<br \/>\n            if (hs[eval(-1 + hs.length)] &gt; maxhis) {<br \/>\n              maxhis=hs[eval(-1 + hs.length)];<br \/>\n            }<br \/>\n            if (hs[eval(-1 + hs.length)] &lt; minhis) {<br \/>\n              minhis=hs[eval(-1 + hs.length)];<br \/>\n            }<br \/>\n          }<br \/>\n          if (jda &gt; maxis) {<br \/>\n            maxis=jda;<br \/>\n            cmaxis='' + eval(dimarr[eval(-1 + ida)].split('&gt;')[eval(-1 + dimarr[eval(-1 + ida)].split('&gt;').length)]) + ',' + eval(dimarr[eval(0 + ida)].split('&lt;')[0]);<br \/>\n          }<br \/>\n          if (jda &lt; minis) {<br \/>\n            minis=jda;<br \/>\n            cminis='' + eval(dimarr[eval(-1 + ida)].split('&gt;')[eval(-1 + dimarr[eval(-1 + ida)].split('&gt;').length)]) + ',' + eval(dimarr[eval(0 + ida)].split('&lt;')[0]);<br \/>\n          }<br \/>\n        }<br \/>\n        if (document.getElementById('selwhs').value == '     ') {<br \/>\n           if (document.getElementById('selwhs').innerHTML.indexOf(' value=\\\"' + maxwis + ',' + maxhis + '\\\"') != -1) {<br \/>\n              document.getElementById('selwhs').value=maxwis + ',' + maxhis;<br \/>\n           } else {<br \/>\n              document.getElementById('selwhs').innerHTML+='&lt;option value=\\\"' + maxwis + ',' + maxhis + '\\\"&gt;' + maxwis + ' x ' + maxhis + '&lt;\/option&gt;'<br \/>\n           }<br \/>\n        }<br \/>\n        if (document.getElementById('selwhs').value == '    ') {<br \/>\n           if (document.getElementById('selwhs').innerHTML.indexOf(' value=\\\"' + minwis + ',' + minhis + '\\\"') != -1) {<br \/>\n              document.getElementById('selwhs').value=minwis + ',' + minhis;<br \/>\n           } else {<br \/>\n              document.getElementById('selwhs').innerHTML+='&lt;option value=\\\"' + minwis + ',' + minhis + '\\\"&gt;' + minwis + ' x ' + minhis + '&lt;\/option&gt;'<br \/>\n           }<br \/>\n        }<br \/>\n        if (document.getElementById('selwhs').value == '   ') {<br \/>\n              document.getElementById('selwhs').value=cmaxis;<br \/>\n        }<br \/>\n        if (document.getElementById('selwhs').value == '  ') {<br \/>\n              document.getElementById('selwhs').value=cminis;<br \/>\n        }<br \/>\n      }<br \/>\n      var ijh=eval(-1 + eval('' + document.getElementById('selwhs').innerHTML.split('&lt;\/optio').length));<br \/>\n      if (ijh &gt; 1) {<br \/>\n        document.getElementById('selwhs').style.maxWidth='300px';<br \/>\n        document.getElementById('selwhs').style.width='300px';<br \/>\n        document.getElementById('selwhs').style.backgroundColor='lightgreen';<br \/>\n      }<br \/>\n      document.getElementById('selwhs').size=ijh;<br \/>\n    }<br \/>\n  }<br \/>\n}<\/font><br \/>\n<br \/>\n<font color=blue>setInterval(selw, 1000);<\/font><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\/animated-gif-slide-set-and-forget-dimensioning-tutorial\/' rel=\"noopener\">Animated GIF Slide Set and Forget Dimensioning Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agifseacssst'>Previous relevant <a target=\"_blank\" title='Animated GIF Slide Extraction Applied CSS Styling Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-slide-extraction-applied-css-styling-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction Applied CSS Styling Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF Slide Extraction Applied CSS Styling Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of_applied_css.gif\" title=\"Animated GIF Slide Extraction Applied CSS Styling Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF Slide Extraction Applied CSS Styling Tutorial<\/p><\/div>\n<p>We dedicate today&#8217;s blog posting to the English phrase (that maybe works in other languages) &#8230;<\/p>\n<blockquote><p>\n<a target=\"_blank\" title='Same, same but different' href='https:\/\/www.google.com\/search?q=same%2C+same+but+different&#038;rlz=1C5CHFA_enAU973AU973&#038;oq=same%2C+same+but+different&#038;gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIKCAEQLhjUAhiABDIKCAIQLhjUAhiABDIHCAMQABiABDIHCAQQABiABDIHCAUQABiABDIHCAYQABiABDIHCAcQABiABDIHCAgQABiABNIBCDY2NjhqMGo3qAIAsAIA&#038;sourceid=chrome&#038;ie=UTF-8' rel=\"noopener\">Same, same but different<\/a>\n<\/p><\/blockquote>\n<p> &#8230; as it is about the pros and cons of HTML iframe integration, especially as it applies to CSS styling.  Off the top of our heads we see a Pros and Cons table looking like &#8230;<\/p>\n<table border=2>\n<tr>\n<th colspan=2 style=text-align:center;>Pros and Cons of HTML Iframe Based Web Application Software Integration<\/th>\n<\/tr>\n<tr>\n<th style=text-align:center;>Pros<\/th>\n<th style=text-align:center;>Cons<\/th>\n<\/tr>\n<tr>\n<td>Become tools<\/td>\n<td>Difficulty with styling integration especially regarding time of coding differences<\/td>\n<\/tr>\n<tr>\n<td>Become modularised<\/td>\n<td>Focus within iframe can cause problems<\/td>\n<\/tr>\n<tr>\n<td>Ability to begin again at (0,0) regarding positioning<\/td>\n<td>Hashtag navigation within iframe can cause problems<\/td>\n<\/tr>\n<tr>\n<td>Sharing the coding and execution load<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Software organizational advantages<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Can glean information off parent and vice versa<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>New chance for synchronizations<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Multitasking<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Coding language mixing<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Parent child interactions<\/td>\n<td><\/td>\n<\/tr>\n<\/table>\n<p> &#8230; and, as you can see, we are mainly fans of what it can bring to the table <font size=1>(mild chuckle, followed by a chortle)<\/font>.<\/p>\n<p>But that first Con can grate, that &#8220;Difficulty with styling integration especially regarding time of coding differences&#8221;, and today, we thought we&#8217;d &#8220;apply&#8221; to relevant <font size=1>(there was one we found we should not &#8220;apply&#8221; the thinking to)<\/font> HTML iframe &#8220;child&#8221; styling using yesterday&#8217;s <a title='Animated GIF Slide Extraction CSS Styling Tutorial' href='#agifsecssst'>Animated GIF Slide Extraction CSS Styling Tutorial<\/a>&#8216;s CSS styling idea in the &#8220;parent&#8221; (&#8220;applied&#8221; to these children).<\/p>\n<p>We used a &#8220;suck it and see&#8221; approach whereby we just, where applicable, appended the CSS &lt;style&gt;&lt;\/style&gt; styling logic of yesterday (plus a bit) to the document.body &#8220;body&#8221; innerHTML attribute of the iframe called, to see whether it felt more integrated.  And we thought it did, perhaps because that styling was one of the more generic feeling ones we can remember <font size=1>(by that we&#8217;re meaning that the selectors were often just HTML tag names rather than too much &#8220;class&#8221; or &#8220;id&#8221; aspects to those selectors)<\/font>.  Also, sometimes it won&#8217;t work because adding to the document.body innerHTML can sometimes &#8220;muck up&#8221; logic <font size=1>(but not today)<\/font>.<\/p>\n<p>And what allows for &#8220;deploying&#8221; such an idea?  Inhouse, we call what we do here <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/ITblog\/?s=client+pre-emptive+iframe' title='Client Pre-emptive Iframe techniques blog postings' rel=\"noopener\">&#8220;Client Pre-emptive Iframe&#8221;<\/a> ideas, where the relevant iframe element&#8217;s &#8220;onload&#8221; (or on rare occasions, &#8220;onerror&#8221;) events are used to add logic at a slightly later time to any HTML iframe document.body element&#8217;s &#8220;onload&#8221; logic would be applied.  This is a powerful mechanism open to you if you are dealing with same domain parent\/child URLs, <a target=\"_blank\" title='?' href='https:\/\/www.youtube.com\/watch?v=PtR4cWb4HNg' rel=\"noopener\">that is <font size=1>the case for us with this work today<\/font><\/a>.<\/p>\n<p>It&#8217;s <font color=blue>as easy to do as<\/font> (showing you one iframe &#8220;onload&#8221; function example below, and with inline CSS usage, rather than an external CSS file usage (where it would be even easier)) &#8230;<\/p>\n<p><code><br \/>\nvar paconto=null;<br \/>\n<br \/>\nfunction pcheckit(iois) {<br \/>\n   paconto = (iois.contentWindow || iois.contentDocument);<br \/>\n   if (paconto != null) {<br \/>\n   if (paconto.document) { paconto = paconto.document; }<br \/>\n   if (paconto.body != null) {<br \/>\n     setTimeout(function(){<br \/>\n         if (document.getElementById('pmyifthree')) {<br \/>\n         document.getElementById('pmyifthree').scrolling='no';<br \/>\n         }<br \/>\n         document.getElementById('myifthree').scrolling='no';<br \/>\n         <font color=blue>paconto.body.innerHTML+='&lt;st' + 'yle&gt; ' + document.head.innerHTML.split('&lt;st' + 'yle&gt;')[1].split('&lt;\/st' + 'yle&gt;')[0] + ' &lt;\/st' + 'yle&gt;';<\/font><br \/>\n         paconto.getElementsByTagName('select')[0].style.display='none';<br \/>\n         paconto.getElementById('image').style.display='none';<br \/>\n         paconto.getElementById('isub').style.display='none';<br \/>\n         paconto.getElementsByTagName('div')[0].style.opacity='0.0';<br \/>\n         paconto.getElementsByTagName('select')[1].style.display='none';<br \/>\n         paconto.getElementsByTagName('h1')[0].style.opacity='0.0';<br \/>\n         if (1 == 1) { paconto.getElementsByTagName('h4')[0].style.opacity='0.0'; }<br \/>\n         if (1 == 1) { paconto.getElementsByTagName('h3')[0].style.opacity='0.0'; }<br \/>\n     }, 12000);<br \/>\n   }<br \/>\n   }<br \/>\n}<br \/>\n<\/code><\/p>\n<p> &#8230; to make this idea come, above.  We don&#8217;t go overboard with precise integration, that is not our point.  Just a &#8230;<\/p>\n<blockquote><p>\nSame, same but different\n<\/p><\/blockquote>\n<p> &#8230; feel in <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html---------GETME\" rel=\"noopener\">the changed<\/a> tenth draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html---------GETME\" rel=\"noopener\">extract_ag_slide_huh_of.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\">Animated GIF Slide Extraction web application<\/a> (or <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application<\/a> version, or now, the  <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?speedtest=y\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application hashtag speed test<\/a> version), which you can <a href='#pifea'>try below<\/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-slide-extraction-applied-css-styling-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction Applied CSS Styling Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agifsecssst'>Previous relevant <a target=\"_blank\" title='Animated GIF Slide Extraction CSS Styling Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-slide-extraction-css-styling-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction CSS Styling Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF Slide Extraction CSS Styling Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of_css.jpg\" title=\"Animated GIF Slide Extraction CSS Styling Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF Slide Extraction CSS Styling Tutorial<\/p><\/div>\n<p>Another aesthetic plus on top of &#8230;<\/p>\n<ul>\n<li><a href='#agifseuet'>user experience<\/a> improvements &#8230; can be &#8230;<\/li>\n<li>CSS styling<\/li>\n<\/ul>\n<p> &#8230; which we flesh out more of today, further to yesterday&#8217;s <a title='Animated GIF Slide Extraction Speed Test Tutorial' href='#agifsestt'>Animated GIF Slide Extraction Speed Test Tutorial<\/a>.<\/p>\n<p>What was new to us with today&#8217;s work?  The <font color=blue>linear gradient effect (called text gradient) applied to text<\/font> was new, <a target=\"_blank\" href='https:\/\/www.scaler.com\/topics\/text-gradient-css\/' rel=\"noopener\">thanks<\/a>, in amongst &#8230;<\/p>\n<p>&lt;style&gt;<br \/>\n<code><br \/>\n#agmode { background-color: #98FB98; }<br \/>\n#agmodetwo { background-color: #AFEEEE; }<br \/>\n<br \/>\nhr {<br \/>\n  border: 5px solid green;<br \/>\n  border-radius: 5px;<br \/>\n}<br \/>\n<br \/>\nhr.one {<br \/>\n  border: 5px solid red;<br \/>\n  border-radius: 5px;<br \/>\n}<br \/>\n<br \/>\nhr.two {<br \/>\n  border: 5px solid orange;<br \/>\n  border-radius: 5px;<br \/>\n}<br \/>\n<br \/>\nhr.three {<br \/>\n  border: 5px solid green;<br \/>\n  border-radius: 5px;<br \/>\n}<br \/>\n<br \/>\nbody {<br \/>\n  background: linear-gradient(to right, rgba(173,216,230,0.5) 0%, rgba(255,255,127,0.5) 100%);<br \/>\n}<br \/>\n<br \/>\nimg {<br \/>\n  background: linear-gradient(to right, transparent 0%, transparent 100%);<br \/>\n  border-radius: 9px;<br \/>\n}<br \/>\n<br \/>\nh3 {<br \/>\n  text-shadow: -1px 1px 1px #952dff;<br \/>\n}<br \/>\n<br \/>\ninput {<br \/>\n  text-shadow: -0.4px 0.4px 0.4px #2d952d;<br \/>\n  border-radius: 200px;<br \/>\n}<br \/>\n<br \/>\ninput::placeholder {<br \/>\n  text-shadow: -1px 1px 1px #2d95ff;<br \/>\n}<br \/>\n<br \/>\nsummary {<br \/>\n  text-shadow: -1px 1px 1px #ff952d;<br \/>\n}<br \/>\n<br \/>\n<font color=blue>h1 {<br \/>\n  \/* font-size: 72px; *\/<br \/>\n  background: -webkit-linear-gradient(rgb(188, 12, 241), rgb(212, 64, 104), rgb(104, 212, 64));<br \/>\n  -webkit-background-clip: text;<br \/>\n  -webkit-text-fill-color: transparent;<br \/>\n}<\/font><br \/>\n<br \/>\niframe {<br \/>\n  border-radius: 9px;<br \/>\n}<br \/>\n<br \/>\na {<br \/>\n  border-radius: 9px;<br \/>\n}<br \/>\n<\/code><br \/>\n&lt;\/style&gt;<\/p>\n<p> &#8230; in <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html--------GETME\" rel=\"noopener\">the changed<\/a> ninth draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html--------GETME\" rel=\"noopener\">extract_ag_slide_huh_of.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\">Animated GIF Slide Extraction web application<\/a> (or <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application<\/a> version, or now, the  <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?speedtest=y\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application hashtag speed test<\/a> version), which you can <a href='#pifea'>try below<\/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\/new-animated-gif-slide-extraction-speed-test-tutorial\/' rel=\"noopener\">New Animated GIF Slide Extraction Speed Test Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agifsestt'>Previous relevant <a target=\"_blank\" title='Animated GIF Slide Extraction Speed Test Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-slide-extraction-speed-test-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction Speed Test Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?speedtest=y\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF Slide Extraction Speed Test Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of_speedtest.jpg\" title=\"Animated GIF Slide Extraction Speed Test Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF Slide Extraction Speed Test Tutorial<\/p><\/div>\n<p>Yesterday&#8217;s <a title='Animated GIF Slide Extraction User Experience Tutorial' href='#agifseuet'>Animated GIF Slide Extraction User Experience Tutorial<\/a> sparked our interest in that &#8230;<\/p>\n<ul>\n<li>we wondered whether hashtag components appended to ($_GET) address bar URLs perhaps consisting of ? and &#038; argument parts slowed things down &#8230; and after first considering some standalone arrangement &#8230;<\/li>\n<li>we realized we have quite good conditions with our current Animated GIF Extraction web application project predilections to adapt it<\/li>\n<\/ul>\n<p>Getting into the coding of this we realized we were touching on another unknown to us.  Is a hashtag call such as &#8230;<\/p>\n<p><code><br \/>\n.\/agtoslides.php?slidenumber=1&random=56476858765876&delay=400&title=%2E%2Fuser_of_ss.gif&numfillin=3#agname=%2E%2Fuser_of_ss.gif<br \/>\n<\/code> <\/p>\n<p> &#8230; to PHP going to register the hashtagging?  Well, certainly not with PHP functionality but a <font color=blue>client facing document.body onload event logic<\/font> can see it &#8230;<\/p>\n<p>&lt;?php<br \/>\n<code><br \/>\n\/\/ agtoslides.php<br \/>\n\/\/ RJM Programming<br \/>\n\/\/ May, 2024<br \/>\n\/\/ Animated GIF to a slide via ... ksh agtoslides.ksh [animatedGIFfilename] [slideNumber]<br \/>\nini_set('max_execution_time', 60000);<br \/>\n<br \/>\n$outp='';<br \/>\n$infl='';<br \/>\n$infill='';<br \/>\n$preoutp='';<br \/>\n$postoutp='';<br \/>\n<br \/>\nif (file_exists('\/tmp\/agtoslides')) {<br \/>\nif (file_exists(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh')) {<br \/>\n   if (isset($argc) && !isset($_GET['agname']) && !isset($_POST['agname'])) {<br \/>\n     $infl=str_replace('+',' ',$argv[1]);<br \/>\n     if (strpos($infl, 'data:image\/') !== false) {<br \/>\n      $infl=str_replace(' ','+',urldecode($argv[1]));<br \/>\n      file_put_contents('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_xx.' . str_replace('jpeg','jpg',explode(';',explode('\/',  $infl )[1])[0]), base64_decode(explode(';base64,',  $infl )[1] ));<br \/>\n      $infl='\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_xx.' . str_replace('jpeg','jpg',explode(';',explode('\/',  $infl )[1])[0]);<br \/>\n     } else if (!file_exists($infl) || strpos($infl, DIRECTORY_SEPARATOR) === false) {<br \/>\n      $infl=rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $infl;<br \/>\n     }<br \/>\n     if ($argc &gt; 2) {<br \/>\n      $outp=shell_exec('ksh ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh ' . $infl . ' ' . str_replace('+',' ',urldecode($argv[2]))) . ' ' . $infill;<br \/>\n     } else {<br \/>\n      $outp=shell_exec('ksh ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh ' . $infl . ' 1' . ' ' . $infill);<br \/>\n     }<br \/>\n   } else {<br \/>\n     if (isset($_GET['random']) && !isset($_GET['agname'])) {<br \/>\n      echo \"&lt;html&gt;<br \/>\n      &lt;head&gt;<br \/>\n      &lt;scrip\" . \"t type=text\/javascript&gt;<br \/>\n      var jjjxhr=null, jjjform=null, astr='', stats=0;<br \/>\n      <br \/>\n      function joneslidedu() {<br \/>\n  if (jjjxhr.readyState == 4) {<br \/>\n    if (jjjxhr.status == 200) {<br \/>\n       parent.window.opener.timingshashpush((new Date()).getTime()); \/\/     document.body.innerHTML=jjjxhr.responseText.split(jjjxhr.responseText.substring(1).split('&gt;')[0])[1].split('&lt;\/body&gt;')[0];<br \/>\n       stats=jjjxhr.status;<br \/>\n    }<br \/>\n  }<br \/>\n      }<br \/>\n<br \/>\n      <font color=blue>function ajaxit() {<br \/>\n      if (1 == 1) {<br \/>\n      parent.setstats(1);<br \/>\n      jjjform = new FormData();<br \/>\n      jjjxhr = new XMLHttpRequest();<br \/>\n      jjjform.append('agname', decodeURIComponent(('' + location.hash).split('agname=')[1].split('&')[0].split('#')[0]));<br \/>\n      jjjform.append('random', decodeURIComponent('\" . $_GET['random'] . \"'));<br \/>\n      jjjform.append('slidenumber', decodeURIComponent('\" . $_GET['slidenumber'] . \"'));<br \/>\n      jjjxhr.open('post', '.\/agtoslides.php', true);<br \/>\n      jjjxhr.onreadystatechange = joneslidedu;<br \/>\n      jjjxhr.send(jjjform);<br \/>\n      if (parent.window.opener.setstats) {<br \/>\n      parent.window.opener.setstats(1);<br \/>\n      }<br \/>\n      parent.window.opener.document.getElementById('spareagname').value=decodeURIComponent(('' + location.hash).split('agname=')[1].split('&')[0].split('#')[0]);<br \/>\n      \/\/alert(parent.window.opener.document.getElementById('sparemyform').outerHTML.length);<br \/>\n      if (eval('' + parent.window.opener.document.getElementById('sparemyform').outerHTML.length) &lt; 1000) {<br \/>\n         parent.window.opener.document.getElementById('sparemyform').method='GET';<br \/>\n      } else {<br \/>\n         parent.window.opener.document.getElementById('sparemyform').method='POST';<br \/>\n      }<br \/>\n      parent.window.opener.document.getElementById('sparemyform').action=('' + parent.document.getElementById('sparemyform').action).split('#')[0];<br \/>\n      parent.window.opener.document.getElementById('sparemysub').click();<br \/>\n      if (1 == 11) {<br \/>\n      \/\/parent.getto().document.title='yes';<br \/>\n      while (('' + parent.getto().getstats()) != '200') {<br \/>\n         if (astr == '' || eval('' + astr.length) &gt; 800) {<br \/>\n           astr=' ';<br \/>\n         } else {<br \/>\n           astr+=' ';<br \/>\n         }<br \/>\n      }<br \/>\n      }<br \/>\n      } else {<br \/>\n      jjjform = new FormData();<br \/>\n      jjjxhr = new XMLHttpRequest();<br \/>\n      jjjform.append('agname', decodeURIComponent(('' + location.hash).split('agname=')[1].split('&')[0].split('#')[0]));<br \/>\n      jjjform.append('random', decodeURIComponent('\" . $_GET['random'] . \"'));<br \/>\n      jjjform.append('slidenumber', decodeURIComponent('\" . $_GET['slidenumber'] . \"'));<br \/>\n      jjjxhr.open('post', '.\/agtoslides.php', true);<br \/>\n      jjjxhr.onreadystatechange = joneslidedu;<br \/>\n      jjjxhr.send(jjjform);<br \/>\n      while (stats != 200) {<br \/>\n         if (astr == '' || eval('' + astr.length) &gt; 800) {<br \/>\n           astr=' ';<br \/>\n         } else {<br \/>\n           astr+=' ';<br \/>\n         }<br \/>\n      }<br \/>\n      }<br \/>\n      return true;<br \/>\n      }<\/font><br \/>\n      &lt;\/scr\" . \"ipt&gt;<br \/>\n      &lt;\/head&gt;<br \/>\n      &lt;body onload='<font color=blue>return ajaxit();<\/font>' id=xbody&gt;&lt;\/body&gt;&lt;\/html&gt;<br \/>\n      \";<br \/>\n      exit;<br \/>\n     }<br \/>\n   if (isset($_GET['agname'])) {<br \/>\n     if (isset($_GET['random'])) {<br \/>\n       $infill=trim(str_replace('+',' ',urldecode($_GET['random']))) . ' tidyhere';<br \/>\n     }<br \/>\n     $infl=str_replace(' ','+',urldecode($_GET['agname']));<br \/>\n     if (strpos($infl, 'data:image\/') !== false) {<br \/>\n      $infl=str_replace(' ','+',urldecode($_GET['agname']));<br \/>\n      file_put_contents('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_xx.' . str_replace('jpeg','jpg',explode(';',explode('\/',  $infl )[1])[0]), base64_decode(explode(';base64,',  $infl )[1] ));<br \/>\n      $infl='\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_xx.' . str_replace('jpeg','jpg',explode(';',explode('\/',  $infl )[1])[0]);<br \/>\n     } else if (strpos($infl, $_SERVER['SERVER_NAME']) === false && strpos($infl, 'http') !== false) {<br \/>\n      $infl=str_replace(' ','+',urldecode($_GET['agname']));<br \/>\n      file_put_contents('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_xx.' . str_replace('jpeg','jpg',explode(';',explode('\/',  $infl )[1])[0]), file_get_contents(str_replace('https:','http:',$infl)) );<br \/>\n      $infl='\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_xx.' . str_replace('jpeg','jpg',explode(';',explode('\/',  $infl )[1])[0]);<br \/>\n     }<br \/>\n     if ((!file_exists($infl) || strpos($infl, DIRECTORY_SEPARATOR) === false) && strpos($infl, 'data:image\/') === false) {<br \/>\n      $infl=rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $infl;<br \/>\n     }<br \/>\n     if (isset($_GET['slidenumber'])) {<br \/>\n  \/\/echo 'ksh ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh ' . $infl . ' ' . str_replace('+',' ',urldecode($_GET['slidenumber']));<br \/>\n  \/\/exit;<br \/>\n  \/\/file_put_contents('xget.xxx', 'ksh ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh ' . $infl . ' ' . str_replace('+',' ',urldecode($_GET['slidenumber'])) . ' ' . $infill . ' 2&gt; ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.err');<br \/>\n      $outp=shell_exec('ksh ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh ' . $infl . ' ' . str_replace('+',' ',urldecode($_GET['slidenumber'])) . ' ' . $infill . ' 2&gt; ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.err');<br \/>\n      \/\/echo ' --- ' . $outp;<br \/>\n      \/\/exit;<br \/>\n     } else {<br \/>\n  \/\/file_put_contents('xget.zzz', 'ksh ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh ' . $infl . ' 1' . ' ' . $infill);<br \/>\n      $outp=shell_exec('ksh ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh ' . $infl . ' 1' . ' ' . $infill);<br \/>\n     }<br \/>\n   } else if (isset($_POST['agname'])) {<br \/>\n     if (isset($_POST['random'])) {<br \/>\n       $infill=trim(str_replace('+',' ',urldecode($_POST['random']))) . ' tidyhere';<br \/>\n     }<br \/>\n     $infl=str_replace(' ','+',urldecode($_POST['agname']));<br \/>\n     if (strpos($infl, 'data:image\/') !== false) {<br \/>\n      $infl=str_replace(' ','+',urldecode($_POST['agname']));<br \/>\n      file_put_contents('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_xx.' . str_replace('jpeg','jpg',explode(';',explode('\/',  $infl )[1])[0]), base64_decode(explode(';base64,',  $infl )[1] ));<br \/>\n      $infl='\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_xx.' . str_replace('jpeg','jpg',explode(';',explode('\/',  $infl )[1])[0]);<br \/>\n\/\/if (strlen($infl) != 0) {<br \/>\n\/\/file_put_contents('x.xx', $infl . ' ' . shell_exec('ls -l \/tmp\/agtoslides\/*.*'));<br \/>\n\/\/}<br \/>\n     } else if (strpos($infl, $_SERVER['SERVER_NAME']) === false && strpos($infl, 'http') !== false) {<br \/>\n      $infl=str_replace(' ','+',urldecode($_POST['agname']));<br \/>\n      file_put_contents('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_xx.' . str_replace('jpeg','jpg',explode(';',explode('\/',  $infl )[1])[0]), file_get_contents(str_replace('https:','http:',$infl)) );<br \/>\n      $infl='\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_xx.' . str_replace('jpeg','jpg',explode(';',explode('\/',  $infl )[1])[0]);<br \/>\n\/\/if (strlen($infl) != 0) {<br \/>\n\/\/file_put_contents('x.xxxx', $infl . ' ' . shell_exec('ls -l \/tmp\/agtoslides\/*.*'));<br \/>\n\/\/}<br \/>\n\/\/     } else {<br \/>\n\/\/file_put_contents('x.xxxxx', $infl . ' ' . shell_exec('ls -l \/tmp\/agtoslides\/*.*'));<br \/>\n     }<br \/>\n     if ((!file_exists($infl) || strpos($infl, DIRECTORY_SEPARATOR) === false) && strpos($infl, 'data:image\/') === false) {<br \/>\n      $infl=rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $infl;<br \/>\n\/\/if (strlen($infl) != 0) {<br \/>\n\/\/file_put_contents('x.xxx', $infl . ' ' . shell_exec('ls -l \/tmp\/agtoslides\/*.*'));<br \/>\n\/\/}<br \/>\n     }<br \/>\n     if (isset($_POST['slidenumber'])) {<br \/>\n  \/\/file_put_contents('xpost.xxx', 'ksh ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh ' . $infl . ' ' . str_replace('+',' ',urldecode($_POST['slidenumber'])) . ' ' . $infill . ' 2&gt; ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.err');<br \/>\n      $outp=shell_exec('ksh ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh ' . $infl . ' ' . str_replace('+',' ',urldecode($_POST['slidenumber'])) . ' ' . $infill);<br \/>\n     } else {<br \/>\n  \/\/file_put_contents('xpost.zzz', 'ksh ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh ' . $infl . ' 1' . ' ' . $infill);<br \/>\n      $outp=shell_exec('ksh ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh ' . $infl . ' 1' . ' ' . $infill);<br \/>\n     }<br \/>\n   } else {<br \/>\n$fp = fopen(\"php:\/\/input\", \"r\");<br \/>\n$post = \"\" . file_get_contents(\"php:\/\/input\");<br \/>\nfclose($fp);<br \/>\nif (strpos($post, \"agname=\") !== false && strpos($post, \"random=\") !== false && strpos($post, \"slidenumber=\") !== false) {<br \/>\n       $infill=explode('&', explode('random=', $post)[1])[0] . ' tidyhere';<br \/>\n       $sn=explode('&', explode('slidenumber=', $post)[1])[0];<br \/>\n       $infl=str_replace(' ','+',urldecode(explode('&', explode('agname=', $post)[1])[0]));<br \/>\n       if (strpos($infl, 'data:image\/') !== false) {<br \/>\n       file_put_contents('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_xx.' . str_replace('jpeg','jpg',explode(';',explode('\/',  $infl )[1])[0]), base64_decode(explode(';base64,',  $infl )[1] ));<br \/>\n       $infl='\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_xx.' . str_replace('jpeg','jpg',explode(';',explode('\/',  $infl )[1])[0]);<br \/>\n       }<br \/>\n\/\/file_put_contents('x.xxx', $infl . ' ' . shell_exec('ls -l \/tmp\/agtoslides\/*.*'));<br \/>\n       $outp=shell_exec('ksh ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'agtoslides.ksh ' . $infl . ' ' . $sn . ' ' . $infill);<br \/>\n}<br \/>\n   }<br \/>\n   }<br \/>\n}<br \/>\n}<br \/>\n$inn=0;<br \/>\n$ij=0;<br \/>\n$otherstuff=\"\";<br \/>\nif (isset($_GET['delay'])) {<br \/>\n   $otherstuff.='delay=' . str_replace('+',' ',urldecode($_GET['delay'])) . '&';<br \/>\n}<br \/>\nif (isset($_POST['delay'])) {<br \/>\n   $otherstuff.='delay=' . str_replace('+',' ',urldecode($_POST['delay'])) . '&';<br \/>\n}<br \/>\nif (isset($_GET['title'])) {<br \/>\n   $otherstuff.='title=' . str_replace('+',' ',urldecode($_GET['title'])) . '&';<br \/>\n}<br \/>\nif (isset($_POST['title'])) {<br \/>\n   $otherstuff.='title=' . str_replace('+',' ',urldecode($_POST['title'])) . '&';<br \/>\n}<br \/>\nif (file_exists('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')) {<br \/>\nwhile (file_exists('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')) {<br \/>\n  $ij++;<br \/>\n  $inn++;<br \/>\n}<br \/>\n}<br \/>\n$inn=0;<br \/>\nwhile (file_exists('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')) {<br \/>\n  if ($postoutp == '') {<br \/>\n    $postoutp='&lt;\/body&gt;&lt;\/html&gt;';<br \/>\n    $preoutp=\"&lt;html&gt;&lt;body onload=\\\"  parent.agslideshow('slideshow','data:image\/\" . explode('#',str_replace('jpg','jpeg',strtolower(explode('.','\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')[-1 + sizeof(explode('.','\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png'))])))[0] . ';base64,' . base64_encode(file_get_contents(explode('#','\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')[0])) . \"');  \";<br \/>\n  }<br \/>\n  if ($postoutp != '') {<br \/>\n   if ($inn &gt; 0) {<br \/>\n    $preoutp.=\" parent.agslideshow('slideshow\" . ('' . (1 + $inn)) . \"','data:image\/\" . explode('#',str_replace('jpg','jpeg',strtolower(explode('.','\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')[-1 + sizeof(explode('.','\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png'))])))[0] . ';base64,' . base64_encode(file_get_contents(explode('#','\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')[0])) . \"'); \";<br \/>\n   }<br \/>\n  }<br \/>\n  unlink('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png');<br \/>\n  $inn++;<br \/>\n}<br \/>\nif ($postoutp != '') { $preoutp.=\" parent.preagslideshow('\/PHP\/animegif\/tutorial_to_animated_gif.php?\" . $otherstuff . \"numfillin=\" . ('' . $ij) . \"');  \\\"&gt;\"; }<br \/>\n\/\/file_put_contents('x.x', $preoutp . $outp . $postoutp);<br \/>\necho $preoutp . $outp . $postoutp;<br \/>\nexit;<br \/>\n<\/code><br \/>\n?&gt;<\/p>\n<p> &#8230; we found, to our relief!  And though the synchronization is not exact, we simulate &#8220;apples for apples&#8221; via that Ajax asynchronicity timing for a hashtag call for the &#8220;window.open&#8221; window, versus the &#8220;window.opener&#8221; window non-hashtag call of that default animated GIF (like a splash page example) as you enter the web application.<\/p>\n<p>Codewise we have &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/agtoslides.php---GETME\" rel=\"noopener\">the changed<\/a> fourth draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/agtoslides.php---GETME\" rel=\"noopener\">agtoslides.php<\/a> PHP &#8230; helping out &#8230;<\/li>\n<li><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html-------GETME\" rel=\"noopener\">the changed<\/a> eighth draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html-------GETME\" rel=\"noopener\">extract_ag_slide_huh_of.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\">Animated GIF Slide Extraction web application<\/a> (or <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application<\/a> version, or now, the  <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?speedtest=y\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application hashtag speed test<\/a> version), which you can <a href='#pifea'>try below<\/a><\/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\/animated-gif-slide-extraction-speed-test-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction Speed Test Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agifseuet'>Previous relevant <a target=\"_blank\" title='Animated GIF Slide Extraction User Experience Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-slide-extraction-user-experience-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction User Experience Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF Slide Extraction User Experience Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of_ux.jpg\" title=\"Animated GIF Slide Extraction User Experience Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF Slide Extraction User Experience Tutorial<\/p><\/div>\n<p>We often equate the term <a target=\"_blank\" title='UX information from Wikipedia ... thanks' href='http:\/\/en.wikipedia.org\/wiki\/User_experience' rel=\"noopener\">&#8220;user experience&#8221;<\/a> with &#8220;niceties&#8221;, in that we often find we deal with &#8220;user experience&#8221; issues well into a project, but you can put more effort into forward design planning so that you deal with it better throughout the project.  We found with the Animated GIF Slide Extraction project of yesterday&#8217;s <a title='Animated GIF Creation Canvas Integration via Slide Extraction Tutorial' href='#agifcciset'>Animated GIF Creation Canvas Integration via Slide Extraction Tutorial<\/a> that issues that had annoyed us for several days past, but which did not stop the web application working, turned into a day where we felt that we were improving the &#8220;user experience&#8221; by &#8220;fixing annoyances&#8221; and &#8220;adding niceties&#8221;, today.  As you might imagine, this can be subjective, because just because we think an idea is an improvement does not mean every user out there will think so, and this is where time set aside for real users to try a product (ie. user acceptance testing) ahead of &#8220;going live&#8221; can be a great idea.<\/p>\n<p>Anyway, there was &#8230;<\/p>\n<ul>\n<li>an annoyance, on non-mobile, we first introduced when we integrated Animated GIF Creation in with Animated GIF Slide Extraction a couple of days ago &#8230; too much <i>cursor:progress;<\/i> usage &#8230; and in fixing we were astonished that <i>cursor:wait;<\/i> displays the same graphics &#8230; anyway, we think it helps when a cursor can help a user get used to identifying wherein the workflow they are situated at any given time &#8230;<br \/>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\n  function cursorcheck(defisidea) {<br \/>\n    if (window.parent) { if (parent.document.getElementById('cursorchoice')) {  if (parent.document.getElementById('cursorchoice').value != '') {  return parent.document.getElementById('cursorchoice').value;  } } }<br \/>\n    return defisidea;<br \/>\n  }<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<br \/>\n &#8230; looking to parent &#8230;<br \/>\n<code><br \/>\n&lt;input data-choice='' type=hidden value='help' id='cursorchoice'&gt;&lt;\/input&gt;<br \/>\n<\/code>\n<\/li>\n<li>we felt better adding <font color=purple><i>&lt;hr&gt;<\/i> horizontal rule<\/font> elements above and below the middle HTML iframe we set aside for client browsing functionality &#8230; and also &#8230;<\/li>\n<li>made that iframe <font color=blue>less wide<\/font> enabling us to place to the right of it a <font color=magenta>hashtag navigational &#8220;a&#8221; link<\/font> back up to the top &#8230;<br \/>\n<code><br \/>\n<font color=purple>&lt;hr&gt;<\/font><br \/>\n&lt;iframe onload=pcheckit(this); style='display:inline-block;width:<font color=blue>80%<\/font>;height:160px;' id=myifthree src='\/PHP\/read_exif_off_image_rotate.php#itwo'&gt;&lt;\/iframe&gt;<font color=magenta>&nbsp;&lt;a id=atotop style='display:inline-block;vertical-align:top;width:15%;text-shadow: -1px 1px 1px #952dff;' onclick=\"window.scrollTo(0,0);\" href='#mydet'&gt;&amp;#11014; Top&lt;\/a&gt;<\/font><br \/>\n<font color=purple>&lt;hr&gt;<\/font><br \/>\n<\/code><br \/>\n &#8230; and &#8230;\n<\/li>\n<li>given <font color=blue>a background<\/font> indicative of the goings on with the extracted animated GIF slide &#8230;<br \/>\n<code><br \/>\nfunction ob(tv) {<br \/>\n  if (tv == '' && intc != '') {<br \/>\n    tv=intc;<br \/>\n    document.getElementById('agname').value=intc;<br \/>\n    document.getElementById('mygimage').src=intc;<br \/>\n    <font color=blue>document.getElementById('atotop').style.backgroundImage='linear-gradient(rgba(255,255,255,0.2),rgba(255,255,255,0.2)),URL(' + intc + ')';<br \/>\n    document.getElementById('atotop').style.backgroundSize='contain';<br \/>\n    document.getElementById('atotop').style.backgroundRepeat='no-repeat';<\/font><br \/>\n    if (window.parent) {<br \/>\n     if (window.parent != window.self) {<br \/>\n    parent.document.getElementById('myta').setAttribute('data-img', document.getElementById('myta').getAttribute('data-img'));<br \/>\n    parent.document.getElementById('myta').title=document.getElementById('myta').title;<br \/>\n    parent.document.getElementById('agname').value=intc;<br \/>\n    parent.document.getElementById('mygimage').src=intc;<br \/>\n    <font color=blue>parent.document.getElementById('atotop').style.backgroundImage='linear-gradient(rgba(255,255,255,0.2),rgba(255,255,255,0.2)),URL(' + intc + ')';<br \/>\n    parent.document.getElementById('atotop').style.backgroundSize='contain';<br \/>\n    parent.document.getElementById('atotop').style.backgroundRepeat='no-repeat';<\/font><br \/>\n    parent.document.getElementById('agname').value=intc;<br \/>\n    parent.document.getElementById('mygimage').title='Finding slide ' + eval(1 + eval(eval(-1 + eval('' + gifloc.replace('%',''))) % ij)) + ' of ' + ij + ' ... please wait ...';<br \/>\n    parent.document.getElementById('mysum').innerHTML=appbut('Animated GIF Slide Extraction Display ... RJM Programming - May, 2024 ... Finding slide ' + eval(1 + eval(eval(-1 + eval('' + gifloc.replace('%',''))) % ij)) + ' of ' + ij + ' ... please wait ...');<br \/>\n    parent.document.getElementById('slidenumber').value='' + eval(1 + eval(eval(-1 + eval('' + gifloc.replace('%',''))) % ij));<br \/>\n    parent.unsetit();<br \/>\n     }<br \/>\n    }<br \/>\n    \/\/tv=gifurl;<br \/>\n    ij=0;<br \/>\n    setTimeout(function(){ intc=''; }, 27000);<br \/>\n  }<br \/>\n  if (tv.trim() != '') {<br \/>\n    if (tv.indexOf('data') != 0 && tv.indexOf('\/\/') != -1 && document.URL.indexOf('\/\/') != -1) {<br \/>\n    if (tv.split('\/\/')[1].split('\/')[0].toLowerCase().replace(\/^www\\.\/g,'') != document.URL.split('\/\/')[1].split('\/')[0].toLowerCase().replace(\/^www\\.\/g,'')) {<br \/>\n    document.getElementById('myiffour').src='\/getex.php?dodu=y&url=' + encodeURIComponent(tv); \/\/window.open('\/getex.php?dodu=y&url=' + encodeURIComponent(tv), '_blank');<br \/>\n    } else {<br \/>\n    prefetch(tv);<br \/>\n    }<br \/>\n    } else {<br \/>\n    prefetch(tv);<br \/>\n    }<br \/>\n  }<br \/>\n}<br \/>\n<\/code><br \/>\n &#8230; and &#8230;<\/li>\n<li>should the user click one (of the now two, and colour coded, as below) Animated GIF Creation action buttons now presented in our &#8220;reveal&#8221; details\/summary the scrolling <font color=blue>now lands<\/font> &#8230;<br \/>\n<code><br \/>\nfunction appittwo(iob) {<br \/>\n    if (('' + document.getElementById('agmode').getAttribute('data-mode')) != '') {<br \/>\n      document.getElementById('agmode').setAttribute('data-mode', '');<br \/>\n      document.getElementById('followthrough').value=('' + document.getElementById('agmode').getAttribute('data-mode'));<br \/>\n    } else {<br \/>\n      document.getElementById('agmode').setAttribute('data-mode', 'rcmysubmit');<br \/>\n      document.getElementById('cursorchoice').setAttribute('data-choice', 'rcmysubmit');<br \/>\n      document.getElementById('cursorchoice').value='copy';<br \/>\n      document.getElementById('followthrough').value=('' + document.getElementById('agmode').getAttribute('data-mode'));<br \/>\n      if (document.getElementById('followxthrough')) {<br \/>\n      document.getElementById('followxthrough').value=('' + document.getElementById('agmode').getAttribute('data-mode'));<br \/>\n      }<br \/>\n      document.getElementById('agmode').style.display='none';<br \/>\n      document.getElementById('agmodetwo').style.display='none';<br \/>\n      document.getElementById('agmodethree').style.display='none';<br \/>\n      <font color=blue>setTimeout(function(){  document.getElementById('myifthree').scrollIntoView();  }, 8000);<\/font> \/\/location.href='#myifthree';<br \/>\n    }<br \/>\n}<br \/>\n<br \/>\nfunction appit(iob) {<br \/>\n    if (('' + document.getElementById('agmode').getAttribute('data-mode')) != '') {<br \/>\n      document.getElementById('agmode').setAttribute('data-mode', '');<br \/>\n      document.getElementById('followthrough').value=('' + document.getElementById('agmode').getAttribute('data-mode'));<br \/>\n    } else {<br \/>\n      document.getElementById('agmode').setAttribute('data-mode', 'mysubmit');<br \/>\n      document.getElementById('cursorchoice').setAttribute('data-choice', 'mysubmit');<br \/>\n      document.getElementById('cursorchoice').value='copy';<br \/>\n      document.getElementById('followthrough').value=('' + document.getElementById('agmode').getAttribute('data-mode'));<br \/>\n      if (document.getElementById('followxthrough')) {<br \/>\n      document.getElementById('followxthrough').value=('' + document.getElementById('agmode').getAttribute('data-mode'));<br \/>\n      }<br \/>\n      document.getElementById('agmode').style.display='none';<br \/>\n      document.getElementById('agmodetwo').style.display='none';<br \/>\n      document.getElementById('agmodethree').style.display='none';<br \/>\n      <font color=blue>setTimeout(function(){  document.getElementById('myifthree').scrollIntoView();  }, 8000);<\/font> \/\/location.href='#myifthree';<br \/>\n    }<br \/>\n}<br \/>\n<\/code><br \/>\n &#8230; at the top of that middle iframe which is short enough so it and the Animated GIF Creation iframe are viewable on many platforms, those button presses created personalized animated GIFs there and then (at least on non-mobile), the user there to see that happening &#8230; where &#8230;<\/li>\n<li>the user clicking the buttons up the top or down the bottom regarding Animate GIF Creation work for the two &#8220;submit&#8221; button modes can see which one was pressed via new <font color=blue><i>border:5px dotted yellow;<\/i><\/font> styling &#8230;<br \/>\n&lt;?php<br \/>\n<code><br \/>\n<font color=blue>$indone=\"youllneverfindthis\";<br \/>\n$outdone=\"youllneverfindthis\";<\/font><br \/>\n<br \/>\nif (isset($_POST['followthrough']) || isset($_GET['followthrough'])) {<br \/>\n if (isset($_POST['followthrough'])) {<br \/>\n  if (strlen($_POST['followthrough']) &gt; 0) {<br \/>\n    <font color=blue>$indone='#' . $_POST['followthrough'] . \" { ba\";<br \/>\n    $outdone='#' . $_POST['followthrough'] . \" { border:5px dotted yellow; ba\"; <\/font><br \/>\n    if ($_POST['followthrough'] == 'overlayit') {<br \/>\n    $smallfillin=\"\\n  setTimeout(function(){ overlaythem();   }, 8000);  \\n  <font color=blue>document.getElementById('\" . $_POST['followthrough'] . \"').style.border='4px dotted pink';<\/font> \\n\";<br \/>\n    } else {<br \/>\n    $smallfillin=\"\\n  <font color=blue>document.getElementById('\" . $_POST['followthrough'] . \"').style.border='4px dotted pink';<\/font> \\n setTimeout(function(){ document.getElementById('\" . $_POST['followthrough'] . \"').click();  }, 5000); \\n\";<br \/>\n    }<br \/>\n  }<br \/>\n } else if (isset($_GET['followthrough'])) {<br \/>\n  if (strlen($_GET['followthrough']) &gt; 0) {<br \/>\n    <font color=blue>$indone='#' . $_GET['followthrough'] . \" { ba\";<br \/>\n    $outdone='#' . $_GET['followthrough'] . \" { border:5px dotted yellow; ba\";<\/font><br \/>\n    if ($_GET['followthrough'] == 'overlayit') {<br \/>\n    $smallfillin=\"\\n  setTimeout(function(){ overlaythem();   }, 8000);  \\n <font color=blue>document.getElementById('\" . $_GET['followthrough'] . \"').style.border='4px dotted pink';<\/font> \\n\";<br \/>\n    } else {<br \/>\n    $smallfillin=\"\\n  <font color=blue>document.getElementById('\" . $_GET['followthrough'] . \"').style.border='4px dotted pink';<\/font> \\n setTimeout(function(){ document.getElementById('\" . $_GET['followthrough'] . \"').click();   }, 5000); \\n\";<br \/>\n    }<br \/>\n  }<br \/>\n }<br \/>\n}<br \/>\n<\/code><br \/>\n?&gt;<br \/>\n &#8230; <font color=blue>applied<\/font> &#8230;<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\n&lt;style&gt;<br \/>\ninput[type=submit]:active {<br \/>\n   border: 5px dotted yellow;<br \/>\n}<br \/>\na { padding: 5px 5px 5px 5px; margin: 5px 5px 5px 5px; border: 1px solid red; background-color: #f0f0f0; }<br \/>\n::placeholder {<br \/>\n  font-size: 9px;<br \/>\n}<br \/>\n::-webkit-input-placeholder { \/* Chrome\/Opera\/Safari *\/<br \/>\n  font-size: 9px;<br \/>\n}<br \/>\n::-moz-placeholder { \/* Firefox 19+ *\/<br \/>\n  font-size: 9px;<br \/>\n}<br \/>\n:-ms-input-placeholder { \/* IE 10+ *\/<br \/>\n  font-size: 9px;<br \/>\n}<br \/>\n:-moz-placeholder { \/* Firefox 18- *\/<br \/>\n  font-size: 9px;<br \/>\n}<font color=blue>\" . str_replace($indone, $outdone, \"<\/font><br \/>\n#mysubmit { background-color: #98FB98; }<br \/>\n#rcmysubmit { background-color: #AFEEEE; }<br \/>\n#overlayit { background-color: #FADADD; }<br \/>\n#imsel { background-color: cyan; }<br \/>\n#jmsel { background-color: magenta; }<br \/>\n#watermarkmode { background-color: olive; }<br \/>\n#selwhs { background-color: teal;   }<br \/>\n#sfilteris { background-color: lightgreen;   } <font color=blue>\") . \"<\/font><br \/>\n&lt;\/style&gt;<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<br \/>\n to the relevant bottom button<\/li>\n<\/ul>\n<p>Codewise we have &#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\/tutorial_to_animated_gif.php-------------------------------------------------------------------------------------------GETME' rel=\"noopener\">the changed<\/a> PHP <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php-------------------------------------------------------------------------------------------GETME' rel=\"noopener\">tutorial_to_animated_gif.php<\/a> <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php' rel=\"noopener\">inhouse animated GIF creator web application<\/a> &#8230; helping out &#8230;<\/li>\n<li><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html-------GETME\" rel=\"noopener\">the changed<\/a> eighth draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html-------GETME\" rel=\"noopener\">extract_ag_slide_huh_of.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\">Animated GIF Slide Extraction web application<\/a> (or <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application<\/a> version), which you can <a href='#pifea'>try below<\/a><\/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\/animated-gif-slide-extraction-user-experience-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction User Experience Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agifcciset'>Previous relevant <a target=\"_blank\" title='Animated GIF Creation Canvas Integration via Slide Extraction Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creation-canvas-integration-via-slide-extraction-tutorial\/' rel=\"noopener\">Animated GIF Creation Canvas Integration via Slide Extraction Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF Creation Canvas Integration via Slide Extraction Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of_canvas.gif\" title=\"Animated GIF Creation Canvas Integration via Slide Extraction Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF Creation Canvas Integration via Slide Extraction Tutorial<\/p><\/div>\n<p>Thinking about yesterday&#8217;s <a title='Animated GIF Creation Data Limits via Slide Extraction Tutorial' href='#agifcdlset'>Animated GIF Creation Data Limits via Slide Extraction Tutorial<\/a>&#8216;s progress &#8230;<\/p>\n<blockquote><p>\nWhat about if the user is happy to use those filled in animated GIF slide textboxes (with delay and title) to create a user created (and downloadable) animated GIF there and then?\n<\/p><\/blockquote>\n<p>Well, we know that user could click their own presented button, but we wanted to flag it up at the parent ahead of time too, in terms of clarity in <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html------GETME\" rel=\"noopener\">the changed<\/a> seventh draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html------GETME\" rel=\"noopener\">extract_ag_slide_huh_of.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\">Animated GIF Slide Extraction web application<\/a> (or <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application<\/a> version), which you can <a href='#pifea'>try below<\/a>.<\/p>\n<p>So, what&#8217;s all this got to do with an HTML <a target=\"_blank\" title='HTML Canvas element information from w3schools' href='http:\/\/www.w3schools.com\/tags\/ref_canvas.asp' rel=\"noopener\">canvas<\/a> element <font size=1>(in case we have readers who take notice of the nuances of blog posting titles, <a target=\"_blank\" title='?' href='https:\/\/www.youtube.com\/watch?v=PtR4cWb4HNg' rel=\"noopener\">that is<\/a>)<\/font>?  Well, once you reach the stage with our inhouse Animated GIF Creator web application, where it has created your own animated GIF image, there is an &#8220;onclick&#8221; subsection of functionality that, in our new scenario, suffered from an error 404 (Bad Request) because the codeline ran as &#8230;<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\n      canvwo.push(window.open('\/HTMLCSS\/user_of_signature_signature.htm?slide=' + tid.replace(\/^slideshow1$\/g,'slideshow') + useyourwords, '_blank', 'top=' + eval(screen.height - hw) + ',left=' + eval(screen.width - hw) + ',width=' + hw + ',height=' + hw));<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<\/p>\n<p> &#8230; but got that error because var<font size=1>iable<\/font> <i>useyourwords<\/i> contains an animated GIF &#8220;first slide&#8221; data-URI (useful in that a [canvasContext].drawImage() call of it would do what <a target=\"_blank\" title='HTML canvas element drawImage() method information from Mozilla' href='https:\/\/developer.mozilla.org\/en\/docs\/Web\/API\/CanvasRenderingContext2D\/drawImage' rel=\"noopener\">&#8220;drawImage&#8221;<\/a> does with animated GIFs anyway <font size=1>(going back to <a target=\"_blank\" title='Animated GIF Slide Extraction Primer Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-slide-extraction-primer-tutorial\/' rel=\"noopener\">the original point regarding this whole thread of blog postings<\/a>)<\/font>) which caused an overshoot of data size limits on conventional ($_GET style) address bar URLs (perhaps involving ? and &#038; arguments <font size=1>(whether they be five minute or ten minute ones)<\/font>).  But regular readers will know, for a happy couple of months now, we recognize we do not always have to call into play serverside PHP and its $_POST mechanisms here, because we can also call on our life changing hashtagging (ie. #) (clientside approach for HTML\/Javascript\/CSS webpage) ideas now!  Yay!!!!!   And so, <i>it came to pass<\/i>, that &#8230; yes &#8230; <i>there was light on yonder hill<\/i> &#8230; <i>and vale<\/i> &#8230; whatever that is &#8230; as &#8220;we broke bread&#8221; &#8230; shall we say &#8230; <i>let&#8217;s<\/i> &#8230; with some <font color=blue>new hashtagging code<\/font> in <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' rel=\"noopener\">the changed<\/a> PHP <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php------------------------------------------------------------------------------------------GETME' rel=\"noopener\">tutorial_to_animated_gif.php<\/a> <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php' rel=\"noopener\">inhouse animated GIF creator web application<\/a> &#8230;<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\n      <font color=blue>if (eval('' + ('' + '\/HTMLCSS\/user_of_signature_signature.htm?slide=' + tid.replace(\/^slideshow1$\/g,'slideshow') + useyourwords).length) <= 800) {<\/font><br \/>\n      canvwo.push(window.open('\/HTMLCSS\/user_of_signature_signature.htm?slide=' + tid.replace(\/^slideshow1$\/g,'slideshow') + useyourwords, '_blank', 'top=' + eval(screen.height - hw) + ',left=' + eval(screen.width - hw) + ',width=' + hw + ',height=' + hw));<br \/>\n      <font color=blue>} else {<br \/>\n      canvwo.push(window.open('\/HTMLCSS\/user_of_signature_signature.htm?slide=' + tid.replace(\/^slideshow1$\/g,'slideshow') + useyourwords.replace('&','#'), '_blank', 'top=' + eval(screen.height - hw) + ',left=' + eval(screen.width - hw) + ',width=' + hw + ',height=' + hw));<br \/>\n      }<\/font><br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<\/p>\n<p> &#8230; as above <font color=blue>and with<\/font> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/user_of_signature_signature.html--------------------------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/user_of_signature_signature.html--------------------------GETME\" rel=\"noopener\">user_of_signature_signature.htm<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/user_of_signature_signature.htm\" rel=\"noopener\">User of Signature Signature<\/a> inhouse canvas graphic data web application &#8220;canvas hoster&#8221; &#8230;<\/p>\n<p><code><br \/>\nvar thewords=<font color=blue>(<\/font>location.search<font color=blue> + location.hash)<\/font>.split('thewords=')[1] ? decodeURIComponent(<font color=blue>(<\/font>location.search<font color=blue> + location.hash)<\/font>.split('thewords=')[1].split('&')[0]) : \"\";<br \/>\n<font color=blue>if (thewords.indexOf('data') == 0) { thewords=thewords.replace(\/\\ \/g,'+');  }<\/font><br \/>\n<\/code><\/p>\n<p> &#8230; to bring &#8220;canvas integration&#8221; <a target=\"_blank\" title='?' href='https:\/\/www.google.com\/search?sca_esv=1fa53ef552df2eb8&#038;sca_upv=1&#038;rlz=1C5CHFA_enAU973AU973&#038;sxsrf=ADLYWIJ2bcIGbZe0P6EmhmA7KTBsFSMoLg:1717460876189&#038;q=canvas+integration+mix&#038;udm=2&#038;fbs=AEQNm0CvspUPonaF8UH5s_LBD3JPX4RSeMPt9v8oIaeGMh2T2PRrsfVPlQRxSTpQ4UUI6wdh60Bm53mxaBz4ng0b7PV-YGWOXPAK2E9Fu6maaEHunFe-Lv1eJJxDdSALxR-M09Qh9CXBWYLj7NNa1XMlA5wJI97aOhuKdYGXYNGxCkZ7y6zNOduANGFikXVQ_cjECKSuFa__5qWTS5d0-Z-U5WgnRK_AMQ&#038;sa=X&#038;ved=2ahUKEwjUm8Or2MCGAxVjdmwGHVFNCxsQtKgLegQIDBAB&#038;biw=1436&#038;bih=741&#038;dpr=1' rel=\"noopener\">into the mix<\/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-creation-canvas-integration-via-slide-extraction-tutorial\/' rel=\"noopener\">Animated GIF Creation Canvas Integration via Slide Extraction Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agifcdlset'>Previous relevant <a target=\"_blank\" title='Animated GIF Creation Data Limits via Slide Extraction Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creation-data-limits-via-slide-extraction-tutorial\/' rel=\"noopener\">Animated GIF Creation Data Limits via Slide Extraction Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF Creation Data Limits via Slide Extraction Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of_manyslides.jpg\" title=\"Animated GIF Creation Data Limits via Slide Extraction Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF Creation Data Limits via Slide Extraction Tutorial<\/p><\/div>\n<p>Even PHP&#8217;s <a target=\"_blank\" title='PHP $_POST[]' href='https:\/\/www.php.net\/manual\/en\/reserved.variables.post.php' rel=\"noopener\">$_POST[]<\/a> approach to HTML form navigation data sharing has it&#8217;s limits, and that can be challenged when considering a whole set of data-URI defined animated GIF slide images.<\/p>\n<p>But, behind the scenes, when $_POST[] does not get filled out with regard to the data limits of the Apache\/PHP\/MySql (in our case) web server involved, there is still <a target=\"_blank\" title='php:\/\/input information' href='https:\/\/www.php.net\/manual\/en\/wrappers.php.php' rel=\"noopener\"><i>php:\/\/input<\/i><\/a> &#8230;<\/p>\n<blockquote cite='https:\/\/www.php.net\/manual\/en\/wrappers.php.php'><p>\nPHP provides a number of miscellaneous I\/O streams that allow access to PHP&#8217;s own input and output streams, the standard input, output and error file descriptors, in-memory and disk-backed temporary file streams, and filters that can manipulate other file resources as they are read from and written to.<br \/>\n<br \/>\nphp:\/\/stdin, php:\/\/stdout and php:\/\/stderr \u00b6<br \/>\nphp:\/\/stdin, php:\/\/stdout and php:\/\/stderr allow direct access to the corresponding input or output stream of the PHP process. The stream references a duplicate file descriptor, so if you open php:\/\/stdin and later close it, you close only your copy of the descriptor-the actual stream referenced by STDIN is unaffected. It is recommended that you simply use the constants STDIN, STDOUT and STDERR instead of manually opening streams using these wrappers.<br \/>\n<br \/>\nphp:\/\/stdin is read-only, whereas php:\/\/stdout and php:\/\/stderr are write-only.\n<\/p><\/blockquote>\n<p> &#8230; we can turn to (thanks, <a target=\"_blank\" title='Home of PHP' href='https:\/\/www.php.net\/' rel=\"noopener\">PHP<\/a>), that can save the day in a lot of these scenarios.<\/p>\n<p>The thing is, which our parent HTML and Javascript can help with, we want to be flagging the scenario where we should be checking that <i>php:\/\/input<\/i> usage might be coming into play.  Well, even for an HTML form method=POST action=[ourRelevantPHP] scenario, the PHP global <a target=\"_blank\" title=\"$_SERVER['QUERY_STRING']\" href='https:\/\/www.php.net\/manual\/en\/reserved.variables.server.php' rel=\"noopener\">$_SERVER[&#8216;QUERY_STRING&#8217;]<\/a> is honoured, shall we say (separate to any <a target=\"_blank\" title='PHP $_GET[]' href='https:\/\/www.php.net\/manual\/en\/reserved.variables.get.php' rel=\"noopener\">$_GET[]<\/a> ideas, is what we are getting at here).  So we can, at the client HTML and Javascript parent (and client) end, set a unique $_SERVER[&#8216;QUERY_STRING&#8217;] <font color=blue>condition to test for<\/font> in <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html-----GETME\" rel=\"noopener\">a changed<\/a> sixth draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html-----GETME\" rel=\"noopener\">extract_ag_slide_huh_of.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\">Animated GIF Slide Extraction web application<\/a> (or <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application<\/a> version), which you can <a href='#pifea'>try below<\/a>, nuancing yesterday&#8217;s <a title='Animated GIF Creation Interfacing via Slide Extraction Tutorial' href='#agifciset'>Animated GIF Creation Interfacing via Slide Extraction Tutorial<\/a> &#8230;<\/p>\n<p><code><br \/>\n&lt;form id=agf style=display:none; method=POST data-target=ifconto action='\/PHP\/animegif\/tutorial_to_animated_gif.php<font color=blue>?theword=numfillin<\/font>'&gt;<br \/>\n&lt;\/form&gt;<br \/>\n<\/code><\/p>\n<p> &#8230; and then, up at that <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' rel=\"noopener\">&#8220;[ourRelevantPHP]&#8221; changed<\/a> PHP <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php-----------------------------------------------------------------------------------------GETME' rel=\"noopener\">tutorial_to_animated_gif.php<\/a> <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php' rel=\"noopener\">inhouse animated GIF creator web application<\/a> we can test <font color=purple>as per<\/font> &#8230;<\/p>\n<p>&lt;?php<br \/>\n<code><br \/>\n<font color=purple>if (strpos(('' . $_SERVER['QUERY_STRING']), '=numfillin') !== false && !isset($_POST['numfillin']) && !isset($_GET['numfillin'])) {<br \/>\n $fp = fopen(\"php:\/\/input\", \"r\");<br \/>\n $post = \"\" . file_get_contents(\"php:\/\/input\");<br \/>\n fclose($fp);<br \/>\n $prefdelim='?';<br \/>\n $pairings=[];<br \/>\n \/\/file_put_contents('yes.yes', substr($post,0,300));<br \/>\n if (strpos($post, '=') !== false && strpos($post, '?') === false) {<br \/>\n   $pairings=explode('=', ('?' . $post));<br \/>\n } else if (strpos($post, '=') !== false) {<br \/>\n   $pairings=explode('=', ('' . $post));<br \/>\n }<br \/>\n if (strpos($post, '=') !== false) { \/\/ && strpos($post, '?') !== false) {<br \/>\n $post='';<br \/>\n \/\/file_put_contents('yesagain.yes', '' . sizeof($pairings));<br \/>\n   for ($ipairings=1; $ipairings&lt;sizeof($pairings); $ipairings++) {<br \/>\n      $thisval=explode('&', $pairings[$ipairings])[0];<br \/>\n      $thisname=explode($prefdelim, $pairings[-1 + $ipairings])[1];<br \/>\n      if (strpos(('~' . $thisval), '~data') !== false) {<br \/>\n        $_POST[$thisname]=$thisval;<br \/>\n      } else {<br \/>\n        $_POST[$thisname]=$thisval;<br \/>\n      }<br \/>\n      if (strpos($thisname, 'slideshow') !== false) {<br \/>\n \/\/file_put_contents('yes_yet_again.yes', '' . $thisname . ' ' . strlen($thisval));<br \/>\n      }<br \/>\n \/\/file_put_contents('yes_again.yes', '' . $thisname . ' ' . strlen($thisval));<br \/>\n      $prefdelim='&';<br \/>\n   }<br \/>\n   $pairings=[];<br \/>\n }<br \/>\n}<br \/>\n$post='';<br \/>\n<\/font><br \/>\nif (isset($_GET['numfillin'])) { $numfillin=$_GET['numfillin']; }<br \/>\nif (isset($_POST['numfillin'])) { $numfillin=$_POST['numfillin']; }<br \/>\n<br \/>\n$nonplus=' ';<br \/>\n$theplus='+';<br \/>\nif ($numfillin &gt;= 2) {<br \/>\n  if (isset($_GET['numfillin'])) {<br \/>\n    $numfillin=$_GET['numfillin'];<br \/>\n    if (isset($_GET['slideshow'])) {<br \/>\n      if (str_replace('+',' ',substr(urldecode($_GET['slideshow']),0,1)) == ' ') { $theplus=' '; $nonplus='+';  }<br \/>\n      $preurl=str_replace($nonplus,$theplus,urldecode($_GET['slideshow']));<br \/>\n    }<br \/>\n$nonplus=' ';<br \/>\n$theplus='+';<br \/>\n    if (isset($_GET['slideshow2'])) {<br \/>\n      if (str_replace('+',' ',substr(urldecode($_GET['slideshow2']),0,1)) == ' ') {  $theplus=' '; $nonplus='+';  }<br \/>\n      $bigfillin=str_replace(' value=\"\"',' value=\"' . str_replace($nonplus,$theplus,urldecode($_GET['slideshow2'])) . '\"',$twopattern);<br \/>\n    } else {<br \/>\n      $bigfillin=$twopattern;<br \/>\n    }<br \/>\n  } else if (isset($_POST['numfillin'])) {<br \/>\n    $numfillin=$_POST['numfillin'];<br \/>\n    if (isset($_POST['slideshow'])) {<br \/>\n \/\/file_put_contents('yes_slideshow_again.yes', '' . $numfillin);<br \/>\n      if (str_replace('+',' ',substr(urldecode($_POST['slideshow']),0,1)) == ' ') {  $theplus=' '; $nonplus='+';  }<br \/>\n      $preurl=str_replace($nonplus,$theplus,urldecode($_POST['slideshow']));<br \/>\n    }<br \/>\n    if (isset($_POST['slideshow2'])) {<br \/>\n \/\/file_put_contents('yes_slideshow2_again.yes', '' . $numfillin);<br \/>\n      if (str_replace('+',' ',substr(urldecode($_POST['slideshow2']),0,1)) == ' ') {  $theplus=' '; $nonplus='+';  }<br \/>\n      $bigfillin=str_replace(' value=\"\"',' value=\"' . str_replace($nonplus,$theplus,urldecode($_POST['slideshow2'])) . '\"',$twopattern);<br \/>\n    } else {<br \/>\n      $bigfillin=$twopattern;<br \/>\n    }<br \/>\n  }<br \/>\n$nonplus=' ';<br \/>\n$theplus='+';<br \/>\n  for ($ijh=3; $ijh&lt;=$numfillin; $ijh++) {<br \/>\n    $pretwopattern='&lt;div id=\"fdiv' . $ijh . '\"&gt;';<br \/>\n    if (isset($_GET['slideshow' . $ijh])) {<br \/>\n      if (str_replace('+',' ',substr(urldecode($_GET['slideshow' . $ijh]),0,1)) == ' ') {  $theplus=' '; $nonplus='+';  }<br \/>\n    $bigfillin=str_replace('&lt;div id=\"fdiv' . (-1 + $ijh) . '\"&gt;&lt;\/div&gt;', '&lt;div id=\"fdiv' . (-1 + $ijh). '\"&gt;' . $pretwopattern . str_replace(' value=\"\"',' value=\"' . str_replace($nonplus,$theplus,urldecode($_GET['slideshow' . $ijh])) . '\"',str_replace('slideshow2\"', 'slideshow' . $ijh . '\"', str_replace('&lt;div id=\"fdiv2\"', '&lt;div id=\"fdiv' . $ijh . '\"', str_replace('&gt;2&lt;', '&gt;' . $ijh . '&lt;', str_replace('ours2', 'ours' . $ijh, $twopattern))))) . $posttwopattern . '&lt;\/div&gt;', $bigfillin);<br \/>\n    } else if (isset($_POST['slideshow' . $ijh])) {<br \/>\n \/\/file_put_contents('yes_slideshow' . $ijh . '_again.yes', '' . $numfillin);<br \/>\n      if (str_replace('+',' ',substr(urldecode($_POST['slideshow' . $ijh]),0,1)) == ' ') {  $theplus=' '; $nonplus='+';  }<br \/>\n    $bigfillin=str_replace('&lt;div id=\"fdiv' . (-1 + $ijh) . '\"&gt;&lt;\/div&gt;', '&lt;div id=\"fdiv' . (-1 + $ijh). '\"&gt;' . $pretwopattern . str_replace(' value=\"\"',' value=\"' . str_replace($nonplus,$theplus,urldecode($_POST['slideshow' . $ijh])) . '\"',str_replace('slideshow2\"', 'slideshow' . $ijh . '\"', str_replace('&lt;div id=\"fdiv2\"', '&lt;div id=\"fdiv' . $ijh . '\"', str_replace('&gt;2&lt;', '&gt;' . $ijh . '&lt;', str_replace('ours2', 'ours' . $ijh, $twopattern))))) . $posttwopattern . '&lt;\/div&gt;', $bigfillin);<br \/>\n    } else {<br \/>\n    $bigfillin=str_replace('&lt;div id=\"fdiv' . (-1 + $ijh) . '\"&gt;&lt;\/div&gt;', '&lt;div id=\"fdiv' . (-1 + $ijh). '\"&gt;' . $pretwopattern . str_replace('slideshow2\"', 'slideshow' . $ijh . '\"', str_replace('&lt;div id=\"fdiv2\"', '&lt;div id=\"fdiv' . $ijh . '\"', str_replace('&gt;2&lt;', '&gt;' . $ijh . '&lt;', str_replace('ours2', 'ours' . $ijh, $twopattern)))) . $posttwopattern . '&lt;\/div&gt;', $bigfillin);<br \/>\n    }<br \/>\n$nonplus=' ';<br \/>\n$theplus='+';<br \/>\n    if ($ijh == $numfillin) {<br \/>\n      $ijh++;<br \/>\n      $bigfillin=str_replace('&lt;div id=\"fdiv' . (-1 + $ijh) . '\"&gt;&lt;\/div&gt;', '&lt;div id=\"fdiv' . (-1 + $ijh). '\"&gt;' . $pretwopattern . str_replace('slideshow2\"', 'slideshow' . $ijh . '\"', str_replace('&lt;div id=\"fdiv2\"', '&lt;div id=\"fdiv' . $ijh . '\"', str_replace('&gt;2&lt;', '&gt;' . $ijh . '&lt;', str_replace('ours2', 'ours' . $ijh, $twopattern)))) . $posttwopattern . '&lt;\/div&gt;', $bigfillin);<br \/>\n    }<br \/>\n  }<br \/>\n}<br \/>\n<\/code><br \/>\n?&gt;<\/p>\n<p> &#8230; to cater for more scenarios, we&#8217;re hoping!<\/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-creation-data-limits-via-slide-extraction-tutorial\/' rel=\"noopener\">New Animated GIF Creation Data Limits via Slide Extraction Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agifciset'>Previous relevant <a target=\"_blank\" title='Animated GIF Creation Interfacing via Slide Extraction Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-creation-interfacing-via-slide-extraction-tutorial\/' rel=\"noopener\">Animated GIF Creation Interfacing via Slide Extraction Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF Creation Interfacing via Slide Extraction Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of_interfacing.jpg\" title=\"Animated GIF Creation Interfacing via Slide Extraction Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF Creation Interfacing via Slide Extraction Tutorial<\/p><\/div>\n<p>The work of today combines &#8230;<\/p>\n<ul>\n<li>the day before yesterday&#8217;s <a title='Animated GIF Slide Extraction Reveal Tutorial' href='#agifsert'>Animated GIF Slide Extraction Reveal Tutorial<\/a> progress with our Animated GIF Slide Extractor web application &#8230; and &#8230;<\/li>\n<li>yesterday&#8217;s <a title='Animated GIF Multiple Onload Slides Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-multiple-onload-slides-tutorial\/'>Animated GIF Multiple Onload Slides Tutorial<\/a> progress with our <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\" rel=\"noopener\">Animated GIF Creator<\/a> web application as a more useful tool<\/li>\n<\/ul>\n<p> &#8230; to add the chance for a user to use what <a target=\"_blank\" title='ImageMagick software suite' href='https:\/\/www.imagemagick.org\/' rel=\"noopener\">ImageMagick<\/a> produces as an Animated GIF slide and fill this out into the textboxes of the Animated GIF Creator &#8220;child&#8221; iframe hosted incarnation &#8220;quietly&#8221; filled out probably &#8220;below the fold&#8221;, but scroll<sub>able<\/sub> to<sub>able<\/sub>.<\/p>\n<p>There are data limits to what the Animated GIF Creator can handle, but perhaps it can help a user create their own Animated GIFs, for their own purposes, via other sources.<\/p>\n<blockquote><p>\nSources for courses\n<\/p><\/blockquote>\n<p> &#8230; we&#8217;d say.  But we would say that, wouldn&#8217;t we?!<\/p>\n<p>To make this happen, amongst the &#8230;<\/p>\n<ol>\n<li>PHP &#8230; and &#8230;<\/li>\n<li>Korn Shell<\/li>\n<\/ol>\n<p> &#8230; helper components (to get to ImageMagick) we swap the &#8220;tidying up of interim files&#8221; role Korn Shell used to do, quite successfully (and still does for any interim &#8220;whole Animated GIF&#8221; files created), passing the responsibilities to the PHP to do (via passing over to the Korn Shell a new extra argument, to tell it this is the new arrangement).  And at <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/agtoslides.php--GETME\" rel=\"noopener\">the changed<\/a> third draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/agtoslides.php--GETME\" rel=\"noopener\">agtoslides.php<\/a> PHP (working with <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/agtoslides.ksh--GETME\" rel=\"noopener\">the changed<\/a> third draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/agtoslides.ksh--GETME\" rel=\"noopener\">agtoslides.ksh<\/a>), before the <font color=magenta>&#8220;outputting command line&#8221;<\/font> is executed, a whole lot of &#8220;child asks stuff of the parent&#8221; &#8220;programming talk and action&#8221; happens (and works, because our <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/ITblog\/?s=client+pre-emptive+iframe' title='Client Pre-emptive Iframe techniques blog postings' rel=\"noopener\">Client Pre-emptive Iframe<\/a> Onload Event logic looks for that iframe document&#8217;s document.body.innerHTML as the representation of the extracted slide (of the animated GIF) of interest) &#8230;<\/p>\n<p>&lt;?php<br \/>\n<code><br \/>\n$preoutp='';<br \/>\n$postoutp='';<br \/>\n<br \/>\n$inn=0;<br \/>\n$ij=0;<br \/>\n$otherstuff=\"\";<br \/>\nif (isset($_GET['delay'])) {<br \/>\n   $otherstuff.='delay=' . str_replace('+',' ',urldecode($_GET['delay'])) . '&';<br \/>\n}<br \/>\nif (isset($_POST['delay'])) {<br \/>\n   $otherstuff.='delay=' . str_replace('+',' ',urldecode($_POST['delay'])) . '&';<br \/>\n}<br \/>\nif (isset($_GET['title'])) {<br \/>\n   $otherstuff.='title=' . str_replace('+',' ',urldecode($_GET['title'])) . '&';<br \/>\n}<br \/>\nif (isset($_POST['title'])) {<br \/>\n   $otherstuff.='title=' . str_replace('+',' ',urldecode($_POST['title'])) . '&';<br \/>\n}<br \/>\nif (file_exists('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')) {<br \/>\nwhile (file_exists('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')) {<br \/>\n  $ij++;<br \/>\n  $inn++;<br \/>\n}<br \/>\n}<br \/>\n$inn=0;<br \/>\nwhile (file_exists('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')) {<br \/>\n  if ($postoutp == '') {<br \/>\n    $postoutp='&lt;\/body&gt;&lt;\/html&gt;';<br \/>\n    $preoutp=\"&lt;html&gt;&lt;body onload=\\\"  parent.agslideshow('slideshow','data:image\/\" . explode('#',str_replace('jpg','jpeg',strtolower(explode('.','\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')[-1 + sizeof(explode('.','\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png'))])))[0] . ';base64,' . base64_encode(file_get_contents(explode('#','\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')[0])) . \"');  \";<br \/>\n  }<br \/>\n  if ($postoutp != '') {<br \/>\n   if ($inn &gt; 0) {<br \/>\n    $preoutp.=\" parent.agslideshow('slideshow\" . ('' . (1 + $inn)) . \"','data:image\/\" . explode('#',str_replace('jpg','jpeg',strtolower(explode('.','\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')[-1 + sizeof(explode('.','\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png'))])))[0] . ';base64,' . base64_encode(file_get_contents(explode('#','\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png')[0])) . \"'); \";<br \/>\n   }<br \/>\n  }<br \/>\n  unlink('\/tmp\/agtoslides\/xx' . explode(' ',$infill)[0] . '_' . substr(('00000' . $inn),-5) . '.png');<br \/>\n  $inn++;<br \/>\n}<br \/>\nif ($postoutp != '') { $preoutp.=\" parent.preagslideshow('\/PHP\/animegif\/tutorial_to_animated_gif.php?\" . $otherstuff . \"numfillin=\" . ('' . $ij) . \"');  \\\"&gt;\"; }<br \/>\n\/\/file_put_contents('x.x', $preoutp . $outp . $postoutp);<br \/>\n<font color=magenta>echo<\/font> $preoutp .<font color=magenta> $outp<\/font> . $postoutp<font color=magenta>;<\/font><br \/>\nexit;<br \/>\n<\/code><br \/>\n?&gt;<\/p>\n<p> &#8230; to have the new parent Javascript functions &#8230;<\/p>\n<p><code><br \/>\nfunction preagslideshow(theurl) {<br \/>\n      if (theurl.indexOf('delay=') != -1) {<br \/>\n      if (9 == 9) {<br \/>\n      document.getElementById('agf').innerHTML+='&lt;input type=hidden name=delay value=\"' + decodeURIComponent(theurl.split('delay=')[1].split('&')[0]) + '\"&gt;&lt;\/input&gt;';<br \/>\n      } else {<br \/>\n      jjform.append('delay', decodeURIComponent(theurl.split('delay=')[1].split('&')[0]));<br \/>\n      }<br \/>\n      }<br \/>\n      if (theurl.indexOf('title=') != -1) {<br \/>\n      if (9 == 9) {<br \/>\n      document.getElementById('agf').innerHTML+='&lt;input type=hidden name=title value=\"' + decodeURIComponent(theurl.split('title=')[1].split('&')[0]) + '\"&gt;&lt;\/input&gt;';<br \/>\n      } else {<br \/>\n      jjform.append('title', decodeURIComponent(theurl.split('title=')[1].split('&')[0]));<br \/>\n      }<br \/>\n      }<br \/>\n      if (theurl.indexOf('numfillin=') != -1) {<br \/>\n      if (9 == 9) {<br \/>\n      document.getElementById('agf').innerHTML+='&lt;input type=hidden name=numfillin value=\"' + decodeURIComponent(theurl.split('numfillin=')[1].split('&')[0]) + '\"&gt;&lt;\/input&gt;';<br \/>\n      } else {<br \/>\n      jjform.append('numfillin', decodeURIComponent(theurl.split('numfillin=')[1].split('&')[0]));<br \/>\n      }<br \/>\n      }<br \/>\n      if (9 == 9) {<br \/>\n      document.getElementById('agf').innerHTML+='&lt;input type=submit style=display:none; id=mysubag value=Submit&gt;&lt;\/input&gt;';<br \/>\n      \/\/alert(document.getElementById('agf').outerHTML);<br \/>\n      document.getElementById('mysubag').click();<br \/>\n      } else {<br \/>\n      jjxhr.onreadystatechange = twoslidedu;<br \/>\n      \/\/jjxhr.responseType = \"Document\";<br \/>\n      jjxhr.open('post', theurl.split('?')[0], true);<br \/>\n      \/\/document.getElementById('ifconto').src=theurl;<br \/>\n      }<br \/>\n}<br \/>\n<br \/>\nfunction agslideshow(thename, thevalue) {<br \/>\n    if (1 == 1) {<br \/>\n    if (thename == 'slideshow') {<br \/>\n      if (9 == 9) {<br \/>\n      \/\/alert(thevalue);<br \/>\n      document.getElementById('agf').innerHTML='&lt;input type=hidden name=slideshow value=\"' + thevalue + '\"&gt;&lt;\/input&gt;';<br \/>\n      } else {<br \/>\n      jjform = new FormData();<br \/>\n      jjxhr = new XMLHttpRequest();<br \/>\n      jjform.append('slideshow', thevalue);<br \/>\n      }<br \/>\n    } else {<br \/>\n      if (9 == 9) {<br \/>\n      document.getElementById('agf').innerHTML+='&lt;input type=hidden name=' + thename + ' value=\"' + thevalue + '\"&gt;&lt;\/input&gt;';<br \/>\n      } else {<br \/>\n      jjform.append(thename, thevalue);<br \/>\n      }<br \/>\n   }<br \/>\n    } else {<br \/>\n    agconto.getElementById(thename).value=thevalue;<br \/>\n    }<br \/>\n}<br \/>\n<\/code><\/p>\n<p> &#8230; working with the new static HTML &#8230;<\/p>\n<p><code><br \/>\n&lt;form id=agf style=display:none; method=POST data-target=ifconto action='\/PHP\/animegif\/tutorial_to_animated_gif.php'&gt;<br \/>\n&lt;\/form&gt;<br \/>\n<\/code><\/p>\n<p> &#8230; be able to assist with this new Animated GIF Creator interfacing to happen for the user, should they be interested, in <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html----GETME\" rel=\"noopener\">a changed<\/a> fifth draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html----GETME\" rel=\"noopener\">extract_ag_slide_huh_of.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\">Animated GIF Slide Extraction web application<\/a> (or <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application<\/a> version), which you can <a href='#pifea'>try below<\/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-creation-interfacing-via-slide-extraction-tutorial\/' rel=\"noopener\">Animated GIF Creation Interfacing via Slide Extraction Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agifsert'>Previous relevant <a target=\"_blank\" title='Animated GIF Slide Extraction Reveal Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-slide-extraction-reveal-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction Reveal Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF Slide Extraction Reveal Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of_reveal.jpg\" title=\"Animated GIF Slide Extraction Reveal Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF Slide Extraction Reveal Tutorial<\/p><\/div>\n<p>Around here, we&#8217;re not ashamed to simplify 90% of web design issues into two categories &#8230;<\/p>\n<ol>\n<li>an &#8220;<a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/overlay\" title='WordPress overlay posts' rel=\"noopener\">overlay<\/a>&#8221; issue &#8230; or &#8230;<\/li>\n<li>a &#8220;<a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/reveal\" title='WordPress reveal posts' rel=\"noopener\">reveal<\/a>&#8221; issue<\/li>\n<\/ol>\n<p> &#8230; and today&#8217;s improvements, pitted against the progress up until yesterday&#8217;s <a title='Animated GIF Slide Extraction Absolute URL Tutorial' href='#agifseaurlt'>Animated GIF Slide Extraction Absolute URL Tutorial<\/a>, pitted these two &#8220;colossuses&#8221; <font size=1>(at least in our mind)<\/font> against each other as concept ideas towards today&#8217;s work&#8217;s solution.   Which wins?  We opted for a &#8220;reveal&#8221; solution, where the initial position is &#8220;reveal&#8221;.<\/p>\n<p>We could have &#8220;overlayed&#8221; but we went for the KISS (&#8220;keep it simple simpleton&#8221;) principle, where, what you see at the top of a webpage takes prominence for the user.  The thing is, though, in this alternate input section, we are not fussed that it stays around, hence the <a target=\"_blank\" title='HTML details tag information from w3schools' href='https:\/\/www.w3schools.com\/tags\/tag_details.asp' rel=\"noopener\">details<\/a>\/<a target=\"_blank\" title='HTML summary tag information from w3schools' href='https:\/\/www.w3schools.com\/tags\/tag_details.asp' rel=\"noopener\">summary<\/a> &#8220;reveal&#8221; way a user can make it disappear at any given point in time.<\/p>\n<p>Here&#8217;s the thing, though, a details\/summary &#8220;reveal&#8221; pairing has that &#8220;summary&#8221; innerHTML content part that can remain, no matter what, as a status informer mechanism we&#8217;re hoping helps out the &#8220;formerly obtuse&#8221; web application ways of our Animated GIF Extraction web application, in <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html---GETME\" rel=\"noopener\">a changed<\/a> fourth draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html---GETME\" rel=\"noopener\">extract_ag_slide_huh_of.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\">Animated GIF Slide Extraction web application<\/a> (or <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application<\/a> version), which you can <a href='#pifea'>try below<\/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\/new-animated-gif-slide-extraction-absolute-url-tutorial\/' rel=\"noopener\">New Animated GIF Slide Extraction Absolute URL Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agifseaurlt'>Previous relevant <a target=\"_blank\" title='Animated GIF Slide Extraction Absolute URL Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-slide-extraction-absolute-url-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction Absolute URL Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF Slide Extraction Absolute URL Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of_absolute_url.jpg\" title=\"Animated GIF Slide Extraction Absolute URL Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF Slide Extraction Absolute URL Tutorial<\/p><\/div>\n<p>The other user entry the user might do using the Animated GIF Slide Extraction web application of yesterday&#8217;s <a title='Animated GIF Slide Extraction Browsing Tutorial' href='#agifsebt'>Animated GIF Slide Extraction Browsing Tutorial<\/a> onto &#8230;<\/p>\n<ul>\n<li>relative animated GIF URL (within the address bar domain of use or an absolute URL serving similar purposes) &#8230; and yesterday&#8217;s &#8230;<\/li>\n<li>browsed for local animated GIF file of interest &#8230; is today&#8217;s &#8230;<\/li>\n<li>absolute URL pointing to a domain not the same as the address bar domain of use<\/li>\n<\/ul>\n<p>As you might guess this last option for the user may not work for a domain with very high security, but being as hotlinking images <i>makes the Internet woooorrrrllllddd go around<\/i> perhaps the user can try this underlying <a target=\"_blank\" title='PHP information from Wikipedia' href='http:\/\/en.wikipedia.org\/wiki\/Curl_%28programming_language%29' rel=\"noopener\">curl<\/a> based logic out, to see with <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html--GETME\" rel=\"noopener\">a changed<\/a> third draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html--GETME\" rel=\"noopener\">extract_ag_slide_huh_of.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\">Animated GIF Slide Extraction web application<\/a> (or <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application<\/a> version), <a href='#pifea'>try below<\/a>.<\/p>\n<p>You may have noticed in our first draft we were not concerned with two incarnations of the web application being executed at once.  Back then, one might interfere with the next if interrupted during the serverside <a target=\"_blank\" title='ImageMagick software suite' href='https:\/\/www.imagemagick.org\/' rel=\"noopener\">ImageMagick<\/a> phase of creating the png slides off the input animated GIF.  Recently, we have started using &#8230;<\/p>\n<p><code><br \/>\n<a target=\"_blank\" title='Uniquifier' href='https:\/\/www.google.com\/search?sca_esv=d65b685c4507e687&#038;sca_upv=1&#038;rlz=1C5CHFA_enAU973AU973&#038;sxsrf=ADLYWIJbA5-s9MYd_nQoIdAxMVBN6MuQ0A:1717040953061&#038;q=Define+uniquifier&#038;sa=X&#038;ved=2ahUKEwi5u8mAvLSGAxXxSmwGHaR9CNQQ1QJ6BAg8EAE&#038;biw=1436&#038;bih=741&#038;dpr=1#ip=1' rel=\"noopener\">uniquifier<\/a><br \/>\n<\/code><\/p>\n<p> &#8230; based logic (but in non-SQL realms) for that ImageMagick work.  By and large the <i>internal use only<\/i> interim file naming in this ImageMagick phase is 99.9999999% sure to be unique to your session, and so not interfering, or accidentally picking up, other sessional data.  You might want to look out for a textbox named &#8220;random&#8221;, in the code, regarding how we make that happen &#8230;<\/p>\n<p><code><br \/>\nuser@Users-Air htdocs % fgrep -n \"'random'\" extract_ag_slide_huh_of.html<br \/>\n157:      jjform.append('random', document.getElementById('random').value);<br \/>\n165:      document.getElementById('myif').src='.\/agtoslides.php?agname=' + encodeURIComponent(document.getElementById('agname').value) + '&slidenumber=' + encodeURIComponent(document.getElementById('slidenumber').value) + '&random=' + encodeURIComponent(document.getElementById('random').value);<br \/>\n167:      \/\/window.open('\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?slide=' + encodeURIComponent(document.getElementById('slidenumber').value) + '&random=' + encodeURIComponent(document.getElementById('random').value) + '#url=' + encodeURIComponent(document.getElementById('agname').value), '_blank', 'top=10,left=10,width=600,height=600');<br \/>\n173:      document.getElementById('random').value='' + Math.floor(Math.random() * 198786753);<br \/>\n293:  document.getElementById('random').value='' + Math.floor(Math.random() * 198786753);<br \/>\n376:&lt;body onload=\"document.getElementById('random').value='' + Math.floor(Math.random() * 19878675); setTimeout(askaway,8000); ob(gifurl);\"&gt;<br \/>\nuser@Users-Air htdocs %<br \/>\n<\/code><\/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-slide-extraction-absolute-url-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction Absolute URL Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agifsebt'>Previous relevant <a target=\"_blank\" title='Animated GIF Slide Extraction Browsing Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-slide-extraction-browsing-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction Browsing Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF Slide Extraction Browsing Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of_browsing.jpg\" title=\"Animated GIF Slide Extraction Browsing Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF Slide Extraction Browsing Tutorial<\/p><\/div>\n<p>As of the recent <a title='Animated GIF Slide Extraction Primer Tutorial' href='#agifsept'>Animated GIF Slide Extraction Primer Tutorial<\/a>&#8216;s progress with an Extraction of a User Nominated Animated GIF Slide web application&#8217;s &#8230;<\/p>\n<ul>\n<li>input animated GIF URL modus operandi &#8230; today we add &#8230;<\/li>\n<li>local operating system file browsing method of user animated GIF entry<\/li>\n<\/ul>\n<p> &#8230; approach to our web application&#8217;s functionality abilities in <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html-GETME\" rel=\"noopener\">a changed<\/a> second draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html-GETME\" rel=\"noopener\">extract_ag_slide_huh_of.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\">Animated GIF Slide Extraction web application<\/a> (or <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application<\/a> version) helped out, especially via PHP&#8217;s acceptance of HTML form method=POST data, by &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/agtoslides.php-GETME\" rel=\"noopener\">a changed<\/a> second draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/agtoslides.php-GETME\" rel=\"noopener\">agtoslides.php<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/Mac\/agtoslides.ksh-GETME\" rel=\"noopener\">a changed<\/a> second draft <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/agtoslides.ksh-GETME\" rel=\"noopener\">agtoslides.ksh<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/PHP\/read_exif_off_image_rotate.php------------GETME\" rel=\"noopener\">a changed<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/read_exif_off_image_rotate.php------------GETME\" rel=\"noopener\">read_exif_off_image_rotate.php<\/a><\/li>\n<li><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html---------------------------------------GETME\" rel=\"noopener\">a changed<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html---------------------------------------GETME\" rel=\"noopener\">client_browsing.htm<\/a> inhouse client browsing tool (which can also <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm\" rel=\"noopener\">sit alone<\/a>)<\/li>\n<\/ul>\n<p> &#8230; or via <a href='#pifea'>arrangements below<\/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-slide-extraction-browsing-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction Browsing Tutorial<\/a>.<\/p-->\n<hr>\n<p id='agifsept'>Previous relevant <a target=\"_blank\" title='Animated GIF Slide Extraction Primer Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-slide-extraction-primer-tutorial\/' rel=\"noopener\">Animated GIF Slide Extraction Primer Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF Slide Extraction Primer Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.jpg\" title=\"Animated GIF Slide Extraction Primer Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF Slide Extraction Primer Tutorial<\/p><\/div>\n<p>Would you believe &#8230;<\/p>\n<ul>\n<li>the extraction of an HTML video element still is not too hard using that HTML video element object as the first parameter to a [canvasContext].<a target=\"_blank\" title='HTML canvas element drawImage() method information from w3schools' href='http:\/\/www.w3schools.com\/tags\/canvas_drawimage.asp' rel=\"noopener\">drawImage<\/a> method call (as you might recall reading the recent <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/ITblog\/canvas-drawimage-first-parameter-primer-tutorial\/' title='Canvas DrawImage First Parameter Primer Tutorial' rel=\"noopener\">Canvas DrawImage First Parameter Primer Tutorial<\/a>) &#8230; whereas &#8230;<\/li>\n<li>the extraction of an HTML animated GIF image (ie. img) element still is a lot harder, regarding only the clientside Javascript side of web applications because using that animated GIF img object as that first  parameter to a [canvasContext].drawImage method call results only in the first still (or slide) of that animated GIF<\/li>\n<\/ul>\n<p>?  And so, to proceed with our &#8220;Animated GIF Slide Extraction&#8221; web application where a user can ask for the still (or slide) to be honed in on, needed us to design it so that a &#8230;<\/p>\n<ul>\n<li>an HTML and Javascript parent (clientside) <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html_GETME\" rel=\"noopener\">extract_ag_slide_huh_of.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=y\" rel=\"noopener\">Animated GIF Slide Extraction web application<\/a> (or <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html\" rel=\"noopener\">Animated GIF Slide Extraction via User Interaction web application<\/a> version) calls &#8230;<\/li>\n<li>serverside PHP <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/agtoslides.php_GETME\" rel=\"noopener\">agtoslides.php<\/a> iframe hosted child web application &#8230; calling, via <a target=\"_blank\" title='PHP shell_exec() method information' href='http:\/\/php.net\/manual\/en\/function.shell-exec.php' rel=\"noopener\">shell_exec<\/a>, a &#8230;<\/li>\n<li><a target=\"_blank\" title='Korn Shell' href='https:\/\/en.wikipedia.org\/wiki\/KornShell' rel=\"noopener\">Korn Shell<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/agtoslides.ksh_GETME\" rel=\"noopener\">agtoslides.ksh<\/a> script &#8230; facilitating call of &#8230;<\/li>\n<li><a target=\"_blank\" title='ImageMagick command line' href='http:\/\/www.imagemagick.org\/script\/command-line-tools.php' rel=\"noopener\">ImageMagick<\/a> <a target=\"_blank\" title='ImageMagick animated GIF slide extraction information' href='https:\/\/www.imagemagick.org\/discourse-server\/viewtopic.php?t=22597' rel=\"noopener\">convert command<\/a> based &#8230;<br \/>\n<code><br \/>\nconvert -coalesce [animatedGIFimageFileName] [outputPNGoutputFilespec]<br \/>\n<\/code>\n<\/li>\n<\/ul>\n<p> &#8230; looking arrangement could fulfil our requirements, so far, where the user can supply &#8230;<\/p>\n<ol>\n<li>[animatedGIFimageFileName] &#8230; and &#8230;<\/li>\n<li>slide number to extract (which can be entered as a percentage, being as our &#8220;HTML and Javascript parent (clientside) web application&#8221; logics are capable of determining an animated GIF&#8217;s &#8230;<\/p>\n<ul>\n<li><font color=purple>number of slides<\/font> (PHP extracts) &#8230; and, albeit not needed so far, with this project &#8230;<\/li>\n<li><font color=magenta>duration<\/font> of an animated GIF &#8220;run through&#8221;<\/li>\n<\/ul>\n<p>)<\/li>\n<\/ol>\n<p> &#8230; in &#8230;<\/p>\n<p><code><br \/>\n<font color=purple>var ij=0;<\/font><br \/>\n<br \/>\n\/** @param {Uint8Array} uint8 *\/<br \/>\nfunction isGifAnimated(uint8) { \/\/ thanks to https:\/\/stackoverflow.com\/questions\/69564118\/how-to-get-duration-of-gif-image-in-javascript#:~:text=Mainly%20use%20parseGIF()%20%2C%20then,duration%20of%20a%20GIF%20image.<br \/>\n  if (origgifloc == '') { origgifloc=gifloc; }<br \/>\n  pbefore='';<br \/>\n  \/\/ij=0;<br \/>\n  let duration = 0;<br \/>\n  for (let i = 0, len = uint8.length; i &lt; len; i++) {<br \/>\n    if (uint8[i] == 0x21<br \/>\n      && uint8[i + 1] == 0xF9<br \/>\n      && uint8[i + 2] == 0x04<br \/>\n      && uint8[i + 7] == 0x00)<br \/>\n    {<br \/>\n      <font color=magenta>const delay = (uint8[i + 5] &lt;&lt; 8) | (uint8[i + 4] & 0xFF);<br \/>\n      duration += delay &lt; 2 ? 10 : delay;<\/font><br \/>\n    <br \/> <br \/>\n  if (doit || gifloc.indexOf('%') != -1 || 1 == 1) {<br \/>\n    <font color=purple>ij++;<\/font><br \/>\n    doit=true;<br \/>\n    gifloc=origgifloc;<br \/>\n    pbefore='' + ('gifloc=' + gifloc + ' and duration=' + eval(duration \/ 100) + ' and ij=' + ij + ' ');<br \/>\n    if (origgifloc.indexOf('%') != -1) { gifloc='' + Math.round(eval(eval(gifloc.replace('%','')) * eval('' + ij) \/ 100.0)); }<br \/>\n    \/\/document.title='' + pbefore + ' ... ' + gifloc;<br \/>\n  }<br \/>\n    }<br \/>\n  }<br \/>\n  if (eval(<font color=magenta>duration \/ 100<\/font>) &lt;= 0.11) {<br \/>\n  return 0;<br \/>\n  }<br \/>\n  \/\/if (gifloc.indexOf('%') != -1) {<br \/>\n  \/\/  alert('' + eval(duration \/ 100) + ' vs ' + delay);<br \/>\n  \/\/  gifloc=gifloc.replace('%','');<br \/>\n  \/\/}<br \/>\n  if (1 == 5 && canextract &gt; 0) {<br \/>\n    alert('' + eval(duration \/ 100));<br \/>\n  } else {<br \/>\n<br \/>\n  var newimg=new Image();<br \/>\n  newimg.onload = function(){<br \/>\n    ih=newimg.height;<br \/>\n    iw=newimg.width;<br \/>\n    document.getElementById('dimg').style.width='' + eval(1 * newimg.width) + 'px';<br \/>\n    document.getElementById('dimg').style.height='' + eval(1 * newimg.height) + 'px';<br \/>\n    document.getElementById('dimg').style.background='linear-gradient(rgba(255,255,255,0.9),rgba(255,255,255,0.9)),url(' + gifurl + ')';<br \/>\n    \/\/document.getElementById('dimg').style.backgroundPosition='' + iw + 'px ' + ih + 'px';<br \/>\n    document.getElementById('dimg').style.backgroundPosition='0px 0px';<br \/>\n    document.getElementById('dimg').style.backgroundSize='' + newimg.width + 'px ' + newimg.height + 'px';<br \/>\n    document.getElementById('dimg').style.backgroundRepeat='no-repeat';<br \/>\n    document.getElementById('dimg').src='#';<br \/>\n    document.getElementById('dimg').src=gifurl;<br \/>\n    document.getElementById('mygimage').style.opacity='0.1';<br \/>\n  };<br \/>\n  <br \/>\n  newimg.src=gifurl;<br \/>\n  goi=document.getElementById('mygimage');<br \/>\n  goisrc=gifurl;<br \/>\n  document.getElementById('mygimage').src=gifurl;<br \/>\n  \/\/newimg.src=gifurl;<br \/>\n  setTimeout(function(){<br \/>\n      jjform = new FormData();<br \/>\n      jjxhr = new XMLHttpRequest();<br \/>\n      document.getElementById('agname').value=gifurl;<br \/>\n      document.getElementById('mygimage').title='Finding slide ' + eval(1 + eval(eval(-1 + eval('' + gifloc.replace('%',''))) % ij)) + ' of ' + ij + ' ... please wait ...';<br \/>\n      document.getElementById('slidenumber').value='' + eval(1 + eval(eval(-1 + eval('' + gifloc.replace('%',''))) % ij));<br \/>\n      jjform.append('agname', gifurl);<br \/>\n      jjform.append('slidenumber', '' + eval(1 + eval(      eval(-1 + eval('' + gifloc.replace('%','')))     % ij)));<br \/>\n      jjxhr.onreadystatechange = oneslidedu;<br \/>\n      \/\/jjxhr.responseType = \"Document\";<br \/>\n      jjxhr.open('post', '.\/agtoslides.php', true);<br \/>\n      if (1 == 1) {<br \/>\n      if (eval('' + document.getElementById('agname').value.length) &lt; 400) {<br \/>\n      \/\/document.getElementById('dimg').style.opacity='0.1';<br \/>\n      document.body.style.cursor='progress';<br \/>\n      document.getElementById('myif').src='.\/agtoslides.php?agname=' + encodeURIComponent(document.getElementById('agname').value) + '&slidenumber=' + encodeURIComponent(document.getElementById('slidenumber').value);<br \/>\n      } else {<br \/>\n      \/\/document.getElementById('dimg').style.opacity='0.1';<br \/>\n      document.body.style.cursor='progress';<br \/>\n      document.getElementById('mysub').click();<br \/>\n      }<br \/>\n      } else {<br \/>\n      jjxhr.send(jjform);<br \/>\n      }<br \/>\n  }, 5000);<br \/>\n  }<br \/>\n  return <font color=magenta>duration \/ 100<\/font>; \/\/ if 0.1 is not an animated GIF<br \/>\n}<br \/>\n<\/code><\/p>\n<p id=pifea> &#8230; and to try this out you can turn the iframe below into a user interaction one via a <a onclick=\"document.getElementById('ifea').src=document.getElementById('ifea').src.split('?')[0] + '?rand=' + Math.floor(Math.random() * 19878675);\" href=\"#ifea\">click below<\/a> &#8230;<\/p>\n<p><iframe id=ifea style=\"width:95%;height:2000px;\" src=\"https:\/\/www.rjmprogramming.com.au\/Mac\/extract_ag_slide_huh_of.html?noask=yes\"><\/iframe><\/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='#d63730' onclick='var dv=document.getElementById(\"d63730\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/animated-gif\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63730' 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='#d63746' onclick='var dv=document.getElementById(\"d63746\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/post\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63746' 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='#d63756' onclick='var dv=document.getElementById(\"d63756\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/uniquifier\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63756' 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='#d63764' onclick='var dv=document.getElementById(\"d63764\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/reveal\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63764' 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='#d63781' onclick='var dv=document.getElementById(\"d63781\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/interface\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63781' 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='#d63794' onclick='var dv=document.getElementById(\"d63794\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/data\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63794' 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='#d63809' onclick='var dv=document.getElementById(\"d63809\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/canvas\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63809' 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='#d63823' onclick='var dv=document.getElementById(\"d63823\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/cursor\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63823' 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='#d63835' onclick='var dv=document.getElementById(\"d63835\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/ajax\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63835' 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='#d63839' onclick='var dv=document.getElementById(\"d63839\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/css\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63839' 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='#d63844' onclick='var dv=document.getElementById(\"d63844\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/iframe\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63844' 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='#d65471' onclick='var dv=document.getElementById(\"d65471\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/dimension\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d65471' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>When you have a fairly large web application project you are coding, it&#8217;s pretty inevitable that you &#8220;know where the bodies are buried&#8221; (if you&#8217;ll pardon our amateur dramatics). We&#8217;ve known about one for years with our inhouse Animated GIF &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-slide-set-and-forget-dimensioning-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,112,2507,2365,354,367,2242,4979,2258,590,652,4645,932,997,4980,2272,1149,4449,1319,1891,3214,2257],"class_list":["post-65471","post","type-post","status-publish","format-standard","hentry","category-elearning","category-event-driven-programming","category-tutorials","tag-animated-gif","tag-attribute","tag-dimension","tag-dimensions","tag-dom","tag-dropdown","tag-flag","tag-flagging","tag-height","tag-image","tag-javascript","tag-mix","tag-php","tag-programming","tag-set-and-forget","tag-size","tag-slide","tag-strategy","tag-tutorial","tag-user","tag-user-interaction","tag-width"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/65471"}],"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=65471"}],"version-history":[{"count":8,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/65471\/revisions"}],"predecessor-version":[{"id":65480,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/65471\/revisions\/65480"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=65471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=65471"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=65471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}