{"id":70402,"date":"2025-11-05T03:01:00","date_gmt":"2025-11-04T17:01:00","guid":{"rendered":"https:\/\/www.rjmprogramming.com.au\/ITblog\/?p=70402"},"modified":"2025-11-05T06:15:19","modified_gmt":"2025-11-04T20:15:19","slug":"youtube-api-caller-radio-play-playlist-songname-search-list-dropdown-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/youtube-api-caller-radio-play-playlist-songname-search-list-dropdown-tutorial\/","title":{"rendered":"YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media_songname_list_dropdown.gif\" title=\"YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial<\/p><\/div>\n<p>Around here, regarding web application work, we really like dropdown (ie. HTML <a target=\"_blank\" href='http:\/\/www.w3schools.com\/tags\/tag_select.asp' title='HTML select tag information from w3schools' rel=\"noopener\"><i>select<\/i><\/a> element) work because a lot of information can be &#8230;<\/p>\n<ul>\n<li>stored<\/li>\n<li>displayed (often taking up minimal webpage space)<\/li>\n<li>it&#8217;s <i>option<\/i> subelements can have an <i>event<\/i> life of their own, or be part of the <i>select<\/i> element <i>event<\/i> whole picture<\/li>\n<li>dropdown multiple selection mode (as with today&#8217;s work) can &#8230;\n<ol>\n<li>still support your single choice scenario<\/li>\n<li>we&#8217;ve coded today&#8217;s dropdown to support, as applicable, ordered single click choices &#8230; versus &#8230;<\/li>\n<li>can allow for control key (sets of choices not necessarily adjacent) and shift key (blocks of choices)<\/li>\n<li>can respond (as with today&#8217;s dropdown) to preset selections established at creation via dropdown (ie. select) innerHTML option subelement <i>selected<\/i> attribute setting<\/li>\n<\/ol>\n<\/li>\n<li>dropdown events <i>onmousedown<\/i> and <i>ontouchdown<\/i> (as for  today&#8217;s dropdown) and <i>onclick<\/i> can be harnessed ahead of an <i>onchange<\/i> event <font size=1>&#8230; and in today&#8217;s case can help unset any preset option subelement <i>selected<\/i> attribute setting(s)<\/font><\/li>\n<\/ul>\n<p>Just so flexible!  Subelement option CSS styling can be less friendly, but even so, often background colouring is possible, and we do a bit of that with the work from yesterday&#8217;s <a target=\"_blank\" title='YouTube API Caller Radio Play Playlist Songname Search List Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/youtube-api-caller-radio-play-playlist-songname-search-list-tutorial\/' rel=\"noopener\">YouTube API Caller Radio Play Playlist Songname Search List Tutorial<\/a> and today&#8217;s better &#8220;shored up&#8221; work you can see a bit of below (where your starting point might be that we &#8220;wrap&#8221; this particular Javascript prompt window through the Javascript <i>overprompt<\/i> function below) &#8230;<\/p>\n<p><code><br \/>\n  var outplist='', kaconto=null, kacontoarr=[], rconeis=155, gconeis=255, bconeis=255;<br \/>\n  <br \/>\n  function overprompt(blb, defvl) {<br \/>\n   var tdsare=[], itdone=false, itds=0, baeis='', ivb=0, lastpassesmustard=true;<br \/>\n   var oklast=['A','E','I','M','Q','U','Y','c','g','k','o','s','w','0','4','8'];<br \/>\n   outplist=prompt(blb, defvl);<br \/>\n   if (outplist) {<br \/>\n   \/\/alert(1);<br \/>\n     var outparrs=outplist.trim().split(',');<br \/>\n   \/\/alert(11);<br \/>\n     if (eval('' + outparrs.length) &gt; 1) {<br \/>\n     if (eval('' + outparrs[0].length) &gt; 0) {<br \/>\n       if (oklast.indexOf(outparrs[0].slice(-1)) == -1) { lastpassesmustard=false; }<br \/>\n     }<br \/>\n    if ((outparrs[0] + baeis).replace(\/\\ \\ \\ $\/g,'') != (outparrs[0] + baeis)) {<br \/>\n    baeis='&domatters=&20%20%20';<br \/>\n    outparrs[0]=outparrs[0].replace(\/\\ \\ \\ $\/g,'');<br \/>\n    } else if ((outparrs[0] + baeis).replace(\/\\ \\ $\/g,'') != (outparrs[0] + baeis)) {<br \/>\n    baeis='&domatters=&20%20';<br \/>\n    outparrs[0]=outparrs[0].replace(\/\\ \\ $\/g,'');<br \/>\n    } else if ((outparrs[0] + baeis).replace(\/\\ $\/g,'') != (outparrs[0] + baeis)) {<br \/>\n    baeis='&domatters=&20';<br \/>\n    outparrs[0]=outparrs[0].replace(\/\\ $\/g,'');<br \/>\n    } else {<br \/>\n    baeis='';<br \/>\n    }<br \/>\n   \/\/alert(111);<br \/>\n       if (eval('' + outparrs[0].length) != 11 || !lastpassesmustard || encodeURIComponent(outparrs[0]) != outparrs[0]) {<br \/>\n   \/\/alert(1111);<br \/>\n   tdsare=document.getElementsByTagName('td');<br \/>\n   for (itds=0; itds&lt;tdsare.length; itds++) {<br \/>\n   \/\/alert(tdsare[itds].innerHTML);<br \/>\n   if (!itdone && tdsare[itds].innerHTML == '' && ('' + tdsare[itds].id) != 'td0001') {<br \/>\n     itdone=true;<br \/>\n     \/\/alert('here ' + outplist.trim().replace(\/\\,\/g,'|!!|'));<br \/>\n     \/\/tdsare[itds].innerHTML='&lt;iframe onload=karlook(this); style=\"width:100%;height:100%;\" id=karsearch name=karsearch src=\"\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=++++++++++++' + encodeURIComponent(outplist.trim().replace(\/\\,\/g,'|!!|')) + '&minimize=y&youtube_duration=&email=&emoji=on&clickcheck=y\"&gt;&lt;\/iframe&gt;';<br \/>\n     tdsare[itds].innerHTML='&lt;iframe onload=karlook(this); style=\"width:100%;height:80%;\" id=karsearch name=karsearch src=\"\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=++++++++++++' + encodeURIComponent(outparrs[0]) + baeis + '&minimize=y&youtube_duration=&email=&emoji=on&clickcheck=y\"&gt;&lt;\/iframe&gt;';<br \/>\n     tdsare[itds].scrollIntoView();<br \/>\n     \/\/alert('there ' + outplist.trim().replace(\/\\,\/g,'|!!|'));<br \/>\n     baeis='';<br \/>\n     kacontoarr=[];<br \/>\n     for (ivb=1; ivb&lt;outparrs.length; ivb++) {<br \/>\n     kacontoarr.push(null);<br \/>\n     }<br \/>\n     for (ivb=1; ivb&lt;outparrs.length; ivb++) {<br \/>\n     tdsare[eval(itds + ivb)].innerHTML='&lt;iframe onload=karlookagain(this,' + eval(-1 + ivb) + '); style=\"width:100%;height:80%;visibility:hidden;\" id=karsearch' + ivb + ' src=\"\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=++++++++++++' + encodeURIComponent(outparrs[ivb]) + '&minimize=y&youtube_duration=&email=&emoji=on&clickcheck=y\"&gt;&lt;\/iframe&gt;';<br \/>\n     }<br \/>\n     return '';<br \/>\n   }<br \/>\n   }<br \/>\n       }<br \/>\n     }<br \/>\n   }<br \/>\n   return outplist;<br \/>\n  }<br \/>\n<br \/>\n  function karlook(iois) {<br \/>\n    var aconto=null;<br \/>\n    aconto = (iois.contentWindow || iois.contentDocument);<br \/>\n    if (aconto != null) {<br \/>\n       if (aconto.document) { aconto = aconto.document; }<br \/>\n       if (aconto.body != null) {<br \/>\n          if (outplist.indexOf(',') != -1) {<br \/>\n          kaconto=aconto;<br \/>\n          setTimeout(function(){ kaconto.getElementById('ajaxs').style.cursor='progress'; }, 3000);<br \/>\n          setTimeout(postkarlook, 7000);<br \/>\n          } else if (navigator.userAgent.match(\/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile\/i)) {<br \/>\n          kaconto=aconto;<br \/>\n          setTimeout(mpostkarlook, 7000);<br \/>\n          }<br \/>\n       }<br \/>\n    }<br \/>\n  }<br \/>\n   <br \/>\n  function karlookagain(iois,idxn) {<br \/>\n    var aconto=null;<br \/>\n    aconto = (iois.contentWindow || iois.contentDocument);<br \/>\n    if (aconto != null) {<br \/>\n       if (aconto.document) { aconto = aconto.document; }<br \/>\n       if (aconto.body != null) {<br \/>\n          if (eval('' + kacontoarr.length) &gt; eval('' + idxn)) {<br \/>\n          kacontoarr[eval('' + idxn)]=aconto;<br \/>\n          } else {<br \/>\n          kacontoarr.push(aconto);<br \/>\n          }<br \/>\n       }<br \/>\n    }<br \/>\n  }<br \/>\n  <br \/>\n  function mpostkarlook() {<br \/>\n    if (kaconto.getElementById('ajaxs')) {<br \/>\n        var kbuts=kaconto.getElementsByTagName('input');<br \/>\n        for (var lbuts=0; lbuts&lt;kbuts.length; lbuts++) {<br \/>\n          if (('' + kbuts[lbuts].type) == 'button') {<br \/>\n            if (('' + kbuts[lbuts].value).indexOf('Radio') == 0) {<br \/>\n                kbuts[lbuts].value=kbuts[lbuts].value.replace('Radio', String.fromCharCode(10) + 'Radio');<br \/>\n            }<br \/>\n          }<br \/>\n        }<br \/>\n    } else {<br \/>\n      setTimeout(mpostkarlook, 5000);<br \/>\n    }<br \/>\n  }<br \/>\n  <br \/>\n  function postkarlook() {<br \/>\n    var selectedones='', oktogo=true, hihi=0;<br \/>\n    if (kaconto.getElementById('ajaxs')) {<br \/>\n      \/\/alert(kaconto.getElementById('ajaxs').innerHTML);<br \/>\n      for (hihi=0; hihi&lt;kacontoarr.length; hihi++) {<br \/>\n      if (!kacontoarr[hihi]) {<br \/>\n      oktogo=false;<br \/>\n      \/\/alert('hihi=' + hihi + ' NOT okay');<br \/>\n      } else if (!kacontoarr[hihi].getElementById('ajaxs')) {<br \/>\n      oktogo=false;<br \/>\n      \/\/alert('hihi=' + hihi + ' not okay');<br \/>\n      }<br \/>\n      }<br \/>\n      if (!oktogo) {<br \/>\n      setTimeout(postkarlook, 5000);<br \/>\n      } else if (kaconto.getElementById('ajaxs').innerHTML.indexOf('... and then ...') == -1) {<br \/>\n      kaconto.getElementById('ajaxs').style.cursor='pointer';<br \/>\n      var otherps=baeisf();<br \/>\n      if (otherps != '' || navigator.userAgent.match(\/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile\/i)) {<br \/>\n        var kbuts=kaconto.getElementsByTagName('input');<br \/>\n        for (var lbuts=0; lbuts&lt;kbuts.length; lbuts++) {<br \/>\n          if (('' + kbuts[lbuts].type) == 'button') {<br \/>\n            if (('' + kbuts[lbuts].value).indexOf('Radio') == 0) {<br \/>\n              var wasvl=kbuts[lbuts].value;<br \/>\n              if (otherps == '   ') {<br \/>\n                kbuts[lbuts].value=kbuts[lbuts].value.replace('Radio', 'Ordered ' + String.fromCharCode(10) + 'Audio ' + String.fromCharCode(10) + 'Radio');<br \/>\n              } else if (otherps == '  ') {<br \/>\n                kbuts[lbuts].value=kbuts[lbuts].value.replace('Radio', 'Audio ' + String.fromCharCode(10) + 'Radio');<br \/>\n              } else if (otherps == ' ') {<br \/>\n                kbuts[lbuts].value=kbuts[lbuts].value.replace('Radio', 'Ordered ' + String.fromCharCode(10) + 'Radio');<br \/>\n              } else {<br \/>\n                kbuts[lbuts].value=kbuts[lbuts].value.replace('Radio', String.fromCharCode(10) + 'Radio');<br \/>\n              }<br \/>\n            }<br \/>\n          }<br \/>\n        }<br \/>\n      }<br \/>\n      selectedones=(kaconto.getElementById('ajaxs').innerHTML.split(kaconto.getElementById('ajaxs').innerHTML.split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;')[1].split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;').replace('&gt;', ' class=uptop selected&gt;');<br \/>\n      for (hihi=0; hihi&lt;kacontoarr.length; hihi++) {<br \/>\n      if (rconeis == gconeis && rconeis == bconeis) {<br \/>\n        bconeis-=7;<br \/>\n        if (bconeis &lt; 0) { bconeis+=255;  }<br \/>\n      } else if (rconeis == gconeis) {<br \/>\n        gconeis-=7;<br \/>\n        if (gconeis &lt; 0) { gconeis+=255;  }<br \/>\n      } else {<br \/>\n        rconeis-=7;<br \/>\n        if (rconeis &lt; 0) { rconeis+=255;  }<br \/>\n      }<br \/>\n      selectedones+=((kacontoarr[hihi].getElementById('ajaxs').innerHTML.split(kacontoarr[hihi].getElementById('ajaxs').innerHTML.split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;')[1].split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;').replace('&gt;', ' class=uptop selected&gt;')).replace(\/option\\ onclick\\=\/g, 'option style=background-color:rgb(' + rconeis + ',' + gconeis + ',' + bconeis + '); onclick=');<br \/>\n      kaconto.getElementById('ajaxs').innerHTML+='&lt;option value=\"\"&gt;... and then ...&lt;\/option&gt;';<br \/>\n      kaconto.getElementById('ajaxs').innerHTML+=kacontoarr[hihi].getElementById('ajaxs').innerHTML.split(kacontoarr[hihi].getElementById('ajaxs').innerHTML.split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;')[1].replace(\/option\\ onclick\\=\/g, 'option style=background-color:rgb(' + rconeis + ',' + gconeis + ',' + bconeis + '); onclick=');<br \/>\n      \/\/alert(kacontoarr[hihi].getElementById('ajaxs').innerHTML);<br \/>\n      }<br \/>\n      \/\/alert(selectedones);<br \/>\n      kaconto.getElementById('ajaxs').innerHTML=kaconto.getElementById('ajaxs').innerHTML.replace(kaconto.getElementById('ajaxs').innerHTML.split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;', kaconto.getElementById('ajaxs').innerHTML.split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;' + selectedones + (selectedones != '' ? '&lt;option id=optclk value=\"\"&gt;____ Selection above available (resettable via click here) as you click\/tap button at right ____&lt;\/option&gt;' : ''));<br \/>\n      if (selectedones != '') {<br \/>\n      kaconto.getElementById('ajaxs').onmousedown=function(event){ if (event.target.parentNode.outerHTML.split('&gt;')[0].indexOf(' data-flagged=') == -1) { event.target.parentNode.setAttribute('data-flagged','y'); event.target.parentNode.innerHTML=event.target.parentNode.innerHTML.replace(\/\\ selected\/g, ' ').replace('____ Selection above available (resettable via click here) as you click\/tap button at right ____','____ Please select choices in usual multiple choice dropdown ways ____');   }  };<br \/>\n      kaconto.getElementById('ajaxs').ontouchdown=function(event){ if (event.target.parentNode.outerHTML.split('&gt;')[0].indexOf(' data-flagged=') == -1) { event.target.parentNode.setAttribute('data-flagged','y'); event.target.parentNode.innerHTML=event.target.parentNode.innerHTML.replace(\/\\ selected\/g, ' ').replace('____ Selection above available (resettable via click here) as you click\/tap button at right ____','____ Please select choices in usual multiple choice dropdown ways ____');   }  };<br \/>\n      }<br \/>\n      }<br \/>\n    }<br \/>\n  }<br \/>\n  <br \/>\n  function baeisf() {<br \/>\n    var outarrp=outplist.split(',');<br \/>\n    if (eval('' + outarrp.length) &gt; 1) {<br \/>\n      return outarrp[0].replace(outarrp[0].trim(), '');<br \/>\n    }<br \/>\n    return '';<br \/>\n  }<br \/>\n<\/code> <\/p>\n<p>And so, today &#8230;<\/p>\n<ul>\n<li>we add onto the default <i>random<\/i> ordering mode of Radio Play via YouTube search comma separated list, <font color=blue>the further choices<\/font> <i>ordered<\/i> or <i>audio<\/i> or <i>audio ordered<\/i>, as per the relevant Javascript prompt blurb that is now going &#8230;<br \/>\n<blockquote><p>\nEnter YouTube 11 character code video (comma separated) or audio stream only of video (semicolon) list to Radio Play (and add ! to start in shuffle mode and\/or # for the order you enter and\/or &#038; for whole list) &#8230; or a YouTube Search String basis for playlist via a Radio&#x1F4FB;? button to activate, later. <font color=blue>Comma separateds can be search ideas &#8230; egs. Tragedy,Boogie Wonderland,Down Among the Dead Men &#8230; random &#8230; Tragedy&nbsp;,Imagine,Breezin &#8230; ordered &#8230; Tragedy&nbsp;&nbsp;,Pina Colada Song,Fast Car &#8230; audio &#8230; Tragedy&nbsp;&nbsp;&nbsp;,Galveston,Angel of the Morning &#8230; audio ordered.<\/font> Double click on this cell for playlist redefinitions.\n<\/p><\/blockquote>\n<\/li>\n<li>started allowing for dropdown events <i>onmousedown<\/i> and <i>ontouchdown<\/i> be able to reset the preset choices we programmatically select for the user should they be happy <font size=1>(but our motivation for this event work was the potential to run into a YouTube video that gives the error &#8230;<br \/>\n<blockquote><p>\nThis video requires payment to watch YouTube\n<\/p><\/blockquote>\n<p>)<\/font><\/li>\n<\/ul>\n<p>Codewise, this involved &#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\/HTMLCSS\/karaoke_youtube_api.html---------------------------------------------------------------------------------------------------GETME\" rel=\"noopener\">a changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html---------------------------------------------------------------------------------------------------GETME\" rel=\"noopener\">karaoke_youtube_api.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm\" rel=\"noopener\">inhouse YouTube video interfacer<\/a> &#8220;parent level&#8221; helper to &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html--------------------------------------GETME\" rel=\"noopener\">a changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html--------------------------------------GETME\" rel=\"noopener\">swipe_media.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html\" rel=\"noopener\">Tabular Single Row Media Gallery<\/a> web application &#8230; at that &#8220;grandparent level&#8221;<\/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\/youtube-api-caller-radio-play-playlist-songname-search-list-dropdown-tutorial\/' rel=\"noopener\">YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial<\/a>.<\/p-->\n<!--hr--><\/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='#d70402' onclick='var dv=document.getElementById(\"d70402\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/dropdown\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d70402' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Around here, regarding web application work, we really like dropdown (ie. HTML select element) work because a lot of information can be &#8230; stored displayed (often taking up minimal webpage space) it&#8217;s option subelements can have an event life of &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/youtube-api-caller-radio-play-playlist-songname-search-list-dropdown-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":[2,12,14,29,37],"tags":[52,5275,2535,5306,83,84,88,1885,103,113,5307,1703,177,181,1580,210,2531,4191,5281,5279,2335,252,253,5278,257,2442,281,283,2127,1654,305,307,1606,2380,2310,327,341,1816,354,359,367,2091,1549,380,385,1605,5301,386,5287,400,2678,1664,3081,513,520,3406,557,3961,564,576,587,590,599,4063,614,617,3695,620,2072,652,5280,673,1560,1807,705,710,2415,2205,3870,760,2732,2122,1616,802,830,2010,3987,2337,1919,3267,2723,875,884,2273,2076,894,5304,932,2858,950,2362,4321,1898,967,997,1915,3274,5305,5298,5299,1063,1069,1893,3310,5303,1866,3169,1125,1126,1133,1168,1173,5302,2228,2311,2001,1238,1581,1254,5276,1675,5277,1282,2167,3325,1292,1319,1345,1891,3575,1721,1369,2485,1404,2099,1418,1425,1583,1452,1622,2455,3098,4799,1493,2017],"class_list":["post-70402","post","type-post","status-publish","format-standard","hentry","category-ajax","category-elearning","category-event-driven-programming","category-operating-system","category-tutorials","tag-absolute-url","tag-after","tag-alphabetic","tag-alphabetical","tag-animated-gif","tag-animation-2","tag-api","tag-argument","tag-array","tag-audio","tag-authority","tag-breadcrumbs","tag-cache","tag-call","tag-cell","tag-class","tag-comma-separated-values","tag-compilation","tag-completion","tag-condition","tag-conditional","tag-connection","tag-console","tag-console-warn","tag-content","tag-contenteditable","tag-css","tag-csv","tag-cursor","tag-data-uri","tag-debug","tag-debugging","tag-decodeuricomponent","tag-delay","tag-details","tag-did-you-know","tag-display","tag-document-title","tag-dom","tag-double-click","tag-dropdown","tag-duration","tag-element","tag-email","tag-emoji","tag-encodeuricomponent","tag-encrypt","tag-encryption","tag-error-414","tag-event","tag-genre","tag-global","tag-global-variable","tag-google","tag-google-chrome","tag-hands-free","tag-hashtag","tag-hashtagging","tag-hierarchy","tag-html","tag-iframe","tag-image","tag-img","tag-instance","tag-integration","tag-interactive","tag-interfacing","tag-internationalization","tag-itinerary","tag-javascript","tag-jump","tag-keyboard","tag-language","tag-link","tag-links","tag-list","tag-localstorage","tag-loop","tag-looping","tag-media","tag-mimetype","tag-moderation","tag-modularization","tag-module","tag-navigation","tag-object-oriented-programming","tag-oncontextmenu","tag-onkeypress","tag-onmousedown","tag-ontouchdown","tag-ontouchmove","tag-oop","tag-opera","tag-option","tag-order","tag-overlay","tag-persistence","tag-php","tag-plan","tag-platform","tag-play","tag-play-button","tag-playlist","tag-popup","tag-programming","tag-progress","tag-recall","tag-recalling","tag-remember","tag-remembering","tag-reveal","tag-right-click","tag-schedule","tag-scheduling","tag-scope","tag-select","tag-sessionstorage","tag-setinterval","tag-settimeout","tag-share","tag-software-integration","tag-sort","tag-sppech-to-text","tag-standing-order","tag-summary","tag-tab","tag-table","tag-table-cell","tag-text","tag-text-cursor","tag-textbox","tag-textual-cursor","tag-timer","tag-title","tag-toggle","tag-top","tag-tutorial","tag-url","tag-user","tag-user-input","tag-variable","tag-video","tag-visibility","tag-web-browser","tag-web-inspector","tag-webpage","tag-whitespace","tag-window","tag-word","tag-words","tag-wrap","tag-wrapper","tag-wrapping","tag-youtube","tag-youtube-api"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/70402"}],"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=70402"}],"version-history":[{"count":9,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/70402\/revisions"}],"predecessor-version":[{"id":70412,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/70402\/revisions\/70412"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=70402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=70402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=70402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}