OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2013 Google Inc. All Rights Reserved. |
| 3 * |
| 4 * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 * you may not use this file except in compliance with the License. |
| 6 * You may obtain a copy of the License at |
| 7 * |
| 8 * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 * |
| 10 * Unless required by applicable law or agreed to in writing, software |
| 11 * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 * See the License for the specific language governing permissions and |
| 14 * limitations under the License. |
| 15 */ |
| 16 "use strict"; |
| 17 |
| 18 // TryItDisplay creates and represents the input and output display. |
| 19 function TryItDisplay(containerElement) { |
| 20 this.iframe = new Iframe(); |
| 21 this.create(containerElement); |
| 22 } |
| 23 |
| 24 // Function that creates the input and output for the TryItYourself object. |
| 25 TryItDisplay.prototype.create = function(containerElement) { |
| 26 var heading = document.createElement("div"); |
| 27 heading.setAttribute("class", "heading"); |
| 28 heading.setAttribute("id", "heading") |
| 29 heading.innerHTML = "TRY IT YOURSELF"; |
| 30 containerElement.appendChild(heading); |
| 31 |
| 32 var button = document.createElement("button"); |
| 33 button.onclick = function(me) { return function() { me.update(); }; }(this); |
| 34 button.setAttribute("id", "update"); |
| 35 button.innerHTML = "Update"; |
| 36 heading.appendChild(button); |
| 37 |
| 38 var code = document.createElement("div"); |
| 39 code.setAttribute("class", "code"); |
| 40 code.setAttribute("id", "allCode"); |
| 41 containerElement.appendChild(code); |
| 42 |
| 43 var display = document.createElement("div"); |
| 44 display.setAttribute("class", "display"); |
| 45 containerElement.appendChild(display); |
| 46 display.appendChild(this.iframe.getDom()); |
| 47 |
| 48 var htmlHeader = document.createElement("div"); |
| 49 htmlHeader.setAttribute("class", "label"); |
| 50 htmlHeader.setAttribute("id", "htmlLabel") |
| 51 htmlHeader.innerHTML = "HTML Code"; |
| 52 code.appendChild(htmlHeader); |
| 53 |
| 54 var htmlCode = document.createElement("textarea"); |
| 55 htmlCode.setAttribute("id", "htmlCode"); |
| 56 htmlCode.setAttribute("class", "code"); |
| 57 code.appendChild(htmlCode); |
| 58 |
| 59 var cssHeader = document.createElement("div"); |
| 60 cssHeader.setAttribute("class", "label"); |
| 61 cssHeader.setAttribute("id", "cssLabel") |
| 62 cssHeader.innerHTML = "CSS Style"; |
| 63 code.appendChild(cssHeader); |
| 64 |
| 65 var cssCode = document.createElement("textarea"); |
| 66 cssCode.setAttribute("id", "cssCode"); |
| 67 cssCode.setAttribute("class", "code"); |
| 68 code.appendChild(cssCode); |
| 69 |
| 70 var jsHeader = document.createElement("div"); |
| 71 jsHeader.setAttribute("class", "label"); |
| 72 jsHeader.setAttribute("id", "jsLabel") |
| 73 jsHeader.innerHTML = "Javascript"; |
| 74 code.appendChild(jsHeader); |
| 75 |
| 76 var jsCode = document.createElement("textarea"); |
| 77 jsCode.setAttribute("id", "jsCode"); |
| 78 jsCode.setAttribute("class", "code"); |
| 79 code.appendChild(jsCode); |
| 80 |
| 81 var heading = document.createElement("div"); |
| 82 heading.setAttribute("class", "heading fail"); |
| 83 heading.setAttribute("id", "passOrFail") |
| 84 heading.innerHTML = "YOU PASSED!"; |
| 85 containerElement.appendChild(heading); |
| 86 } |
| 87 |
| 88 TryItDisplay.prototype.setDefaultHtml = function(newHtml) { |
| 89 document.getElementById('htmlCode').innerHTML = newHtml ? newHtml : ""; |
| 90 } |
| 91 |
| 92 TryItDisplay.prototype.setDefaultCss = function(newCss) { |
| 93 document.getElementById('cssCode').innerHTML = newCss ? newCss : ""; |
| 94 } |
| 95 |
| 96 TryItDisplay.prototype.setDefaultJs = function(newJs) { |
| 97 document.getElementById('jsCode').innerHTML = newJs ? newJs : ""; |
| 98 } |
| 99 |
| 100 TryItDisplay.prototype.addCheck = function(object, property, time) { |
| 101 this.iframe.checks.push("check(" |
| 102 + object + ", " + property + ", " + time + ", 'default');"); |
| 103 } |
| 104 |
| 105 // Set the default end time for the animation clock. |
| 106 // Note: this will be overwritten if the user creates an animation longer than |
| 107 // the time set here. |
| 108 TryItDisplay.prototype.setTime = function(newTime) { |
| 109 this.iframe.time = newTime; |
| 110 } |
| 111 |
| 112 // Update takes the information currently in the HTML, CSS, and JS input boxes |
| 113 // and displays it in the iframe. |
| 114 TryItDisplay.prototype.update = function() { |
| 115 // Reload the iframe by resetting the source. |
| 116 document.getElementById("display").src = document.getElementById("display").sr
c; |
| 117 document.getElementById("display").onload = function(me) { |
| 118 return function() { |
| 119 me.addCssHtml(); |
| 120 me.addAnimScript(); |
| 121 }; |
| 122 }(this); |
| 123 } |
| 124 |
| 125 // Add the CSS and HTML into the iframe. |
| 126 TryItDisplay.prototype.addCssHtml = function() { |
| 127 var iframeDoc = this.iframe.doc.contentDocument; |
| 128 var htmlVal = document.getElementById("htmlCode").value; |
| 129 var cssVal = document.getElementById('cssCode').value |
| 130 +"\n" +"#dummy { display: none; }"; |
| 131 iframeDoc.getElementsByTagName("body")[0].innerHTML = htmlVal; |
| 132 iframeDoc.getElementsByTagName("style")[0].innerHTML = cssVal; |
| 133 |
| 134 // dummDiv allows the animation time to display properly the first time |
| 135 // the page loads. |
| 136 var dummyDiv = document.createElement("div"); |
| 137 dummyDiv.setAttribute("id", "dummy"); |
| 138 dummyDiv.setAttribute("class", "test"); |
| 139 iframeDoc.getElementsByTagName("body")[0].appendChild(dummyDiv); |
| 140 } |
| 141 |
| 142 // Add the Javascript value to the iframe. |
| 143 TryItDisplay.prototype.addAnimScript = function() { |
| 144 var scriptElement = document.createElement('script'); |
| 145 var jsVal = this.getJsVal(); |
| 146 var iframeDoc = this.iframe.doc.contentDocument; |
| 147 |
| 148 var scriptDivs = iframeDoc.getElementsByTagName('script'); |
| 149 scriptElement.innerHTML = jsVal; |
| 150 par = iframeDoc.getElementsByTagName('body')[0]; |
| 151 par.appendChild(scriptElement); |
| 152 } |
| 153 |
| 154 // Get the user provided Javascript value, and append additional information |
| 155 // to run the tests properly. |
| 156 TryItDisplay.prototype.getJsVal = function() { |
| 157 var iframeDoc = this.iframe.doc.contentDocument; |
| 158 // The animation added to the javascript input allows the animation time to |
| 159 // display even when the user does not input an animation. |
| 160 var jsVal = "setupTutorialTests(); \n" |
| 161 + document.getElementById('jsCode').value + "\n" |
| 162 + "new Animation(document.getElementById('dummy'), {left: '100px'}, " |
| 163 + this.iframe.time + ");"; |
| 164 |
| 165 for (var i = 0; i < this.iframe.checks.length; i++) { |
| 166 jsVal += "\n" + this.iframe.checks[i]; |
| 167 } |
| 168 jsVal += " \nrunTests();"; |
| 169 return jsVal; |
| 170 } |
| 171 |
| 172 // Function to call once the user passes the tutorial. |
| 173 TryItDisplay.pass = function() { |
| 174 document.getElementById("passOrFail").className = "heading pass"; |
| 175 } |
| 176 |
| 177 // Function to call if the user fails the tutorial. |
| 178 TryItDisplay.fail = function() { |
| 179 document.getElementById("passOrFail").className = "heading fail"; |
| 180 } |
| 181 |
| 182 // Constructor for the Iframe object. |
| 183 function Iframe() { |
| 184 this.doc = document.createElement('iframe'); |
| 185 // Checks will store all the tests done on the animations in the iframe. |
| 186 // Developers can add to it using the addCheck function. |
| 187 this.checks = []; |
| 188 // Time stores the defualt animation time. It controls how long the hidden |
| 189 // animation runs and therefore the default animation timer. |
| 190 this.time = 5; |
| 191 |
| 192 this.pass = false; |
| 193 |
| 194 this.doc.setAttribute('id', 'display'); |
| 195 this.doc.setAttribute('class', 'display'); |
| 196 this.doc.setAttribute('src', 'iframe-contents.html'); |
| 197 } |
| 198 |
| 199 Iframe.prototype.getDom = function() { |
| 200 return this.doc; |
| 201 } |
| 202 |
| 203 // Make the solution box toggleable. |
| 204 var toggleSolution = function() { |
| 205 var element = document.getElementById('toggleText'); |
| 206 var elementStyle = getComputedStyle(element, null); |
| 207 var label = document.getElementById('hideLabel'); |
| 208 |
| 209 if (elementStyle.display === 'none') { |
| 210 element.style.display = 'block'; |
| 211 label.innerHTML = 'Hide Solution'; |
| 212 } else if (elementStyle.display === 'block') { |
| 213 element.style.display = 'none'; |
| 214 label.innerHTML = 'Show Solution'; |
| 215 } |
| 216 } |
OLD | NEW |