Subversion Repositories wimsdev

Rev

Rev 9824 | Rev 11759 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.   @author: GeoGebra - Dynamic Mathematics for Everyone, http://www.geogebra.org
  3.   @license: This file is subject to the GeoGebra Non-Commercial License Agreement, see http://www.geogebra.org/license. For questions please write us at office@geogebra.org.
  4. */
  5. var ipwims = "";
  6.  
  7. function Ipwims(toto) {
  8.   return ipwims = toto;
  9. }
  10.  
  11. var isRenderGGBElementEnabled = false;
  12. var scriptLoadStarted = false;
  13. var html5AppletsToProcess = null;
  14. var ggbHTML5LoadedCodebaseIsWebSimple = false;
  15. var ggbHTML5LoadedCodebaseVersion = null;
  16. var ggbHTML5LoadedScript = null;
  17. var ggbCompiledResourcesLoadFinished = false;
  18. var ggbCompiledResourcesLoadInProgress = false;
  19. var ggbCompiledAppletsLoaded = false;
  20. var GGBApplet = function() {
  21.   'use strict';
  22.   var applet = {};
  23.   var ggbVersion = '5.0';
  24.   var parameters = {};
  25.   var views = null;
  26.   var html5NoWebSimple = false;
  27.   var html5NoWebSimpleParamExists = false;
  28.   var appletID = null;
  29.   var initComplete = false;
  30.   var html5OverwrittenCodebaseVersion = null;
  31.   var html5OverwrittenCodebase = null;
  32.   for (var i = 0; i < arguments.length; i++) {
  33.     var p = arguments[i];
  34.     if (p !== null) {
  35.       switch (typeof p) {
  36.         case 'number':
  37.           ggbVersion = p.toFixed(1);
  38.           break;
  39.         case 'string':
  40.           if (p.match(new RegExp('^[0-9]\\.[0-9]+$'))) {
  41.             ggbVersion = p
  42.           } else {
  43.             appletID = p
  44.           }
  45.           break;
  46.         case 'object':
  47.           if (typeof p.is3D !== 'undefined') {
  48.             views = p
  49.           } else {
  50.             parameters = p
  51.           }
  52.           break;
  53.         case 'boolean':
  54.           html5NoWebSimple = p;
  55.           html5NoWebSimpleParamExists = true;
  56.           break
  57.       }
  58.     }
  59.   }
  60.   if (views === null) {
  61.     views = {
  62.       is3D: false,
  63.       AV: false,
  64.       SV: false,
  65.       CV: false,
  66.       EV2: false,
  67.       CP: false,
  68.       PC: false,
  69.       DA: false,
  70.       FI: false,
  71.       PV: false,
  72.       macro: false
  73.     };
  74.     if (parameters.material_id !== undefined && !html5NoWebSimpleParamExists) {
  75.       html5NoWebSimple = true
  76.     }
  77.   }
  78.   if (appletID !== null && parameters.id === undefined) {
  79.     parameters.id = appletID
  80.   }
  81.   var jnlpFilePath = '';
  82.   var html5Codebase = '';
  83.   var javaCodebase = '';
  84.   var isOverriddenJavaCodebase = false;
  85.   var isHTML5Offline = false;
  86.   var isJavaOffline = false;
  87.   var loadedAppletType = null;
  88.   var javaCodebaseVersion = null;
  89.   var html5CodebaseVersion = null;
  90.   var html5CodebaseScript = null;
  91.   var html5CodebaseIsWebSimple = false;
  92.   var previewImagePath = null;
  93.   var previewLoadingPath = null;
  94.   var previewPlayPath = null;
  95.   var fonts_css_url = null;
  96.   var giac_js_url = null;
  97.   var jnlpBaseDir = null;
  98.   var preCompiledScriptPath = null;
  99.   var preCompiledResourcePath = null;
  100.   var preCompiledScriptVersion = null;
  101.   if (parameters.height !== undefined) {
  102.     parameters.height = Math.round(parameters.height)
  103.   }
  104.   if (parameters.width !== undefined) {
  105.     parameters.width = Math.round(parameters.width)
  106.   }
  107.   var parseVersion = function(d) {
  108.     return parseFloat(d) > 4 ? parseFloat(d) : 5
  109.   };
  110.   applet.setHTML5Codebase = function(codebase, offline) {
  111.     html5OverwrittenCodebase = codebase;
  112.     setHTML5CodebaseInternal(codebase, offline)
  113.   };
  114.   applet.setJavaCodebaseVersion = function(version) {
  115.     javaCodebaseVersion = version;
  116.     setDefaultJavaCodebaseForVersion(version)
  117.   };
  118.   applet.setHTML5CodebaseVersion = function(version, offline) {
  119.     if (version === '4.2') return;
  120.     html5OverwrittenCodebaseVersion = version;
  121.     setDefaultHTML5CodebaseForVersion(version, offline)
  122.   };
  123.   applet.getHTML5CodebaseVersion = function() {
  124.     return html5CodebaseVersion
  125.   };
  126.   applet.getParameters = function() {
  127.     return parameters
  128.   };
  129.   applet.setJavaCodebase = function(codebase, offline) {
  130.     isOverriddenJavaCodebase = true;
  131.     if (codebase.slice(-1) === '/') {
  132.       javaCodebaseVersion = codebase.slice(-4, -1)
  133.     } else {
  134.       javaCodebaseVersion = codebase.slice(-3)
  135.     }
  136.     if (offline === null) {
  137.       offline = codebase.indexOf('http') === -1
  138.     }
  139.     if (offline && jnlpBaseDir !== null) {
  140.       jnlpBaseDir = null
  141.     }
  142.     doSetJavaCodebase(codebase, offline)
  143.   };
  144.   applet.setFontsCSSURL = function(url) {
  145.     fonts_css_url = url
  146.   };
  147.   applet.setGiacJSURL = function(url) {
  148.     giac_js_url = url
  149.   };
  150.   applet.toggleAppletTypeControls = function(parentSelector) {
  151.     var currentAppletType = applet.getLoadedAppletType();
  152.     var displayJava = 'none',
  153.       displayHTML5 = 'none';
  154.     if (currentAppletType === 'java' && applet.isHTML5Installed()) {
  155.       displayHTML5 = 'inline'
  156.     } else if (currentAppletType === 'html5' && applet.isJavaInstalled()) {
  157.       displayJava = 'inline'
  158.     }
  159.     var elem = document.querySelector(parentSelector + ' .view_as_Java');
  160.     if (elem !== null) {
  161.       elem.style.display = displayJava
  162.     }
  163.     elem = document.querySelector(parentSelector + ' .view_as_separator_Java');
  164.     if (elem !== null) {
  165.       elem.style.display = displayJava
  166.     }
  167.     elem = document.querySelector(parentSelector + ' .view_as_HTML5');
  168.     if (elem !== null) {
  169.       elem.style.display = displayHTML5
  170.     }
  171.     elem = document.querySelector(parentSelector + ' .view_as_separator_HTML5');
  172.     if (elem !== null) {
  173.       elem.style.display = displayHTML5
  174.     }
  175.   };
  176.   var doSetJavaCodebase = function(codebase, offline) {
  177.     javaCodebase = codebase;
  178.     isJavaOffline = offline;
  179.     if (jnlpBaseDir === null) {
  180.       var dir = '';
  181.       if (isJavaOffline) {
  182.         var loc = window.location.pathname;
  183.         dir = loc.substring(0, loc.lastIndexOf('/')) + '/'
  184.       }
  185.       applet.setJNLPFile(dir + codebase + '/' + buildJNLPFileName(isJavaOffline))
  186.     } else {
  187.       applet.setJNLPFile(jnlpBaseDir + javaCodebaseVersion + '/' + buildJNLPFileName(isJavaOffline))
  188.     }
  189.   };
  190.   applet.setJNLPFile = function(newJnlpFilePath) {
  191.     jnlpFilePath = newJnlpFilePath
  192.   };
  193.   applet.setJNLPBaseDir = function(baseDir) {
  194.     jnlpBaseDir = baseDir;
  195.     applet.setJNLPFile(jnlpBaseDir + javaCodebaseVersion + '/' + buildJNLPFileName(isJavaOffline))
  196.   };
  197.   applet.inject = function() {
  198.     var type = 'auto';
  199.     var container_ID = parameters.id;
  200.     var container;
  201.     var noPreview = false;
  202.     for (var i = 0; i < arguments.length; i++) {
  203.       var p = arguments[i];
  204.       if (typeof p === 'string') {
  205.         p = p.toLowerCase();
  206.         if (p === 'preferjava' || p === 'preferhtml5' || p === 'java' || p === 'html5' || p === 'auto' || p === 'screenshot' || p === 'prefercompiled' || p === 'compiled') {
  207.           type = p
  208.         } else {
  209.           container_ID = arguments[i]
  210.         }
  211.       } else if (typeof p === 'boolean') {
  212.         noPreview = p
  213.       } else if (p instanceof HTMLElement) {
  214.         container = p
  215.       }
  216.     }
  217.     continueInject();
  218.  
  219.     function continueInject() {
  220.       if (!initComplete) {
  221.         setTimeout(continueInject, 200);
  222.         return
  223.       }
  224.       type = detectAppletType(type);
  225.       var appletElem = container || document.getElementById(container_ID);
  226.       applet.removeExistingApplet(appletElem, false);
  227.       if (parameters.width === undefined && appletElem.clientWidth) {
  228.         parameters.width = appletElem.clientWidth
  229.       }
  230.       if (parameters.height === undefined && appletElem.clientHeight) {
  231.         parameters.height = appletElem.clientHeight
  232.       }
  233.       if (!(parameters.width && parameters.height) && type === 'html5') {
  234.         delete parameters.width;
  235.         delete parameters.height
  236.       }
  237.       loadedAppletType = type;
  238.       if (type === 'screenshot') {
  239.         injectScreenshot(appletElem, parameters)
  240.       } else if (type === 'compiled') {
  241.         injectCompiledApplet(appletElem, parameters, true)
  242.       } else {
  243.         var playButton = false;
  244.         if (parameters.hasOwnProperty('playButton') && parameters.playButton) {
  245.           playButton = true
  246.         } else if (parameters.hasOwnProperty('playButtonAutoDecide') && parameters.playButtonAutoDecide) {
  247.           playButton = isMobileDevice()
  248.         }
  249.         if (playButton) {
  250.           injectPlayButton(appletElem, parameters, noPreview, type)
  251.         } else if (type === 'java') {
  252.           injectJavaApplet(appletElem, parameters)
  253.         } else {
  254.           injectHTML5Applet(appletElem, parameters, noPreview)
  255.         }
  256.       }
  257.     }
  258.     return
  259.   };
  260.  
  261.   function isMobileDevice() {
  262.     if (window.innerWidth <= 768 && (!parameters.hasOwnProperty('screenshotGenerator') || !parameters.screenshotGenerator)) {
  263.       return true
  264.     } else {
  265.       return false
  266.     }
  267.   }
  268.  
  269.   function getWidthHeight(appletElem, appletWidth) {
  270.     var myWidth = 0,
  271.       myHeight = 0;
  272.     if (typeof window.innerWidth === 'number') {
  273.       myWidth = window.innerWidth;
  274.       myHeight = window.innerHeight
  275.     } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
  276.       myWidth = document.documentElement.clientWidth;
  277.       myHeight = document.documentElement.clientHeight
  278.     } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
  279.       myWidth = document.body.clientWidth;
  280.       myHeight = document.body.clientHeight
  281.     }
  282.     if (appletElem) {
  283.       var rect = appletElem.getBoundingClientRect();
  284.       var border = 0;
  285.       if (rect.left > 0) {
  286.         if (rect.left <= myWidth) {
  287.           var borderLeft = rect.left;
  288.           var borderRight = myWidth <= 640 ? 10 : 30;
  289.           border = borderLeft + borderRight
  290.         }
  291.       }
  292.       if (appletWidth > 0 && appletWidth + border < myWidth) {
  293.         myWidth = appletWidth
  294.       } else {
  295.         myWidth -= border
  296.       }
  297.     }
  298.     return {
  299.       width: myWidth,
  300.       height: myHeight
  301.     }
  302.   }
  303.  
  304.   function calcScale(isScreenshoGenerator, appletElem, appletWidth) {
  305.     if (isScreenshoGenerator) {
  306.       return 1
  307.     }
  308.     var windowSize = getWidthHeight(appletElem, appletWidth);
  309.     var windowWidth = parseInt(windowSize.width);
  310.     var xscale = Math.min(1, windowWidth / parameters.width);
  311.     var yscale = Math.min(1, windowSize.height / parameters.height);
  312.     return Math.min(xscale, yscale)
  313.   }
  314.   applet.getViews = function() {
  315.     return views
  316.   };
  317.   applet.isJavaInstalled = function() {
  318.     if (typeof deployJava === 'undefined') {
  319.       if (navigator.javaEnabled()) {
  320.         if (isInternetExplorer() && getIEVersion() >= 10) {
  321.           if (window.innerWidth === screen.width && window.innerHeight === screen.height) {
  322.             return false
  323.           }
  324.         }
  325.         if (navigator.userAgent.indexOf('Android ') > -1) {
  326.           return false
  327.         }
  328.         if (!isInternetExplorer() && !pluginEnabled('java')) {
  329.           return false
  330.         }
  331.         return true
  332.       }
  333.     } else {
  334.       return deployJava.versionCheck('1.6.0+') || deployJava.versionCheck('1.4') || deployJava.versionCheck('1.5.0*')
  335.     }
  336.   };
  337.  
  338.   function pluginEnabled(name) {
  339.     var plugins = navigator.plugins,
  340.       i = plugins.length,
  341.       regExp = new RegExp(name, 'i');
  342.     while (i--) {
  343.       if (regExp.test(plugins[i].name)) {
  344.         return true
  345.       }
  346.     }
  347.     return false
  348.   }
  349.   var getTubeURL = function() {
  350.     var tubeurl,
  351.       protocol;
  352.     if (parameters.tubeurl !== undefined) {
  353.       tubeurl = parameters.tubeurl
  354.     } else if (window.location.host.indexOf('geogebratube.org') > -1 || window.location.host.indexOf('tube.geogebra.org') > -1 || window.location.host.indexOf('tube-test.geogebra.org') > -1 || window.location.host.indexOf('tube-beta.geogebra.org') > -1 || window.location.host.indexOf('geomatech-test.geogebra.org') > -1) {
  355.       tubeurl = window.location.protocol + '//' + window.location.host
  356.     } else {
  357.       if (window.location.protocol.substr(0, 4) === 'http') {
  358.         protocol = window.location.protocol
  359.       } else {
  360.         protocol = 'http:'
  361.       }
  362.       tubeurl = protocol + '//tube.geogebra.org'
  363.     }
  364.     return tubeurl
  365.   };
  366.   var fetchParametersFromTube = function(successCallback) {
  367.     var tubeurl = getTubeURL();
  368.     var api_request = {
  369.         request: {
  370.           '-api': '1.0.0',
  371.           login: {
  372.             '-type': 'cookie',
  373.             '-getuserinfo': 'false'
  374.           },
  375.           task: {
  376.             '-type': 'fetch',
  377.             fields: {
  378.               field: [{
  379.                 '-name': 'id'
  380.               }, {
  381.                 '-name': 'geogebra_format'
  382.               }, {
  383.                 '-name': 'width'
  384.               }, {
  385.                 '-name': 'height'
  386.               }, {
  387.                 '-name': 'toolbar'
  388.               }, {
  389.                 '-name': 'menubar'
  390.               }, {
  391.                 '-name': 'inputbar'
  392.               }, {
  393.                 '-name': 'reseticon'
  394.               }, {
  395.                 '-name': 'labeldrags'
  396.               }, {
  397.                 '-name': 'shiftdragzoom'
  398.               }, {
  399.                 '-name': 'rightclick'
  400.               }, {
  401.                 '-name': 'ggbbase64'
  402.               }]
  403.             },
  404.             filters: {
  405.               field: [{
  406.                 '-name': 'id',
  407.                 '#text': '' + parameters.material_id + ''
  408.               }]
  409.             },
  410.             order: {
  411.               '-by': 'id',
  412.               '-type': 'asc'
  413.             },
  414.             limit: {
  415.               '-num': '1'
  416.             }
  417.           }
  418.         }
  419.       },
  420.       success = function() {
  421.         var text = xhr.responseText;
  422.         var jsondata = JSON.parse(text);
  423.         var item = null;
  424.         for (i = 0; i < jsondata.responses.response.length; i++) {
  425.           if (jsondata.responses.response[i].item !== undefined) {
  426.             item = jsondata.responses.response[i].item
  427.           }
  428.         }
  429.         if (item === null) {
  430.           onError();
  431.           return
  432.         }
  433.         ggbVersion = item.geogebra_format;
  434.         if (parameters.ggbBase64 === undefined) {
  435.           parameters.ggbBase64 = item.ggbBase64
  436.         }
  437.         if (parameters.width === undefined) {
  438.           parameters.width = item.width
  439.         }
  440.         if (parameters.height === undefined) {
  441.           parameters.height = item.height
  442.         }
  443.         if (parameters.showToolBar === undefined) {
  444.           parameters.showToolBar = item.toolbar === 'true'
  445.         }
  446.         if (parameters.showMenuBar === undefined) {
  447.           parameters.showMenuBar = item.menubar === 'true'
  448.         }
  449.         if (parameters.showAlgebraInput === undefined) {
  450.           parameters.showAlgebraInput = item.inputbar === 'true'
  451.         }
  452.         if (parameters.showResetIcon === undefined) {
  453.           parameters.showResetIcon = item.reseticon === 'true'
  454.         }
  455.         if (parameters.enableLabelDrags === undefined) {
  456.           parameters.enableLabelDrags = item.labeldrags === 'true'
  457.         }
  458.         if (parameters.enableShiftDragZoom === undefined) {
  459.           parameters.enableShiftDragZoom = item.shiftdragzoom === 'true'
  460.         }
  461.         if (parameters.enableRightClick === undefined) {
  462.           parameters.enableRightClick = item.rightclick === 'true'
  463.         }
  464.         if (parameters.showToolBarHelp === undefined) {
  465.           parameters.showToolBarHelp = parameters.showToolBar
  466.         }
  467.         if (parseFloat(item.geogebra_format) >= 5) {
  468.           views.is3D = true
  469.         }
  470.         applet.setPreviewImage(tubeurl + '/files/material-' + item.id + '.png', tubeurl + '/images/GeoGebra_loading.png', tubeurl + '/images/applet_play.png');
  471.         successCallback()
  472.       };
  473.     var url = tubeurl + '/api/json.php';
  474.     var xhr = createCORSRequest('POST', url);
  475.     var onError = function() {
  476.       log('Error: The request for fetching material_id ' + parameters.material_id + ' from tube was not successful.')
  477.     };
  478.     if (!xhr) {
  479.       onError();
  480.       return
  481.     }
  482.     xhr.onload = success;
  483.     xhr.onerror = onError;
  484.     xhr.onprogress = function() {};
  485.     if (xhr.setRequestHeader) {
  486.       xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
  487.     }
  488.     xhr.send(JSON.stringify(api_request))
  489.   };
  490.  
  491.   function createCORSRequest(method, url) {
  492.     var xhr = new XMLHttpRequest;
  493.     if ('withCredentials' in xhr) {
  494.       xhr.open(method, url, true)
  495.     } else if (typeof XDomainRequest !== 'undefined') {
  496.       xhr = new XDomainRequest;
  497.       xhr.open(method, url)
  498.     } else {
  499.       xhr = null
  500.     }
  501.     return xhr
  502.   }
  503.   var JavaVersion = function() {
  504.     var resutl = null;
  505.     for (var i = 0, size = navigator.mimeTypes.length; i < size; i++) {
  506.       if ((resutl = navigator.mimeTypes[i].type.match(/^application\/x-java-applet;jpi-version=(.*)$/)) !== null) {
  507.         return resutl[1]
  508.       }
  509.     }
  510.     return null
  511.   };
  512.   applet.isHTML5Installed = function() {
  513.     if (isInternetExplorer()) {
  514.       if ((views.is3D || html5CodebaseScript === 'web3d.nocache.js') && getIEVersion() < 11) {
  515.         return false
  516.       } else if (getIEVersion() < 10) {
  517.         return false
  518.       }
  519.     }
  520.     return true
  521.   };
  522.   applet.isCompiledInstalled = function() {
  523.     if (isInternetExplorer()) {
  524.       if (views.is3D && getIEVersion() < 11) {
  525.         return false
  526.       } else if (getIEVersion() < 9) {
  527.         return false
  528.       }
  529.     }
  530.     return true
  531.   };
  532.   applet.getLoadedAppletType = function() {
  533.     return loadedAppletType
  534.   };
  535.   applet.setPreviewImage = function(previewFilePath, loadingFilePath, playFilePath) {
  536.     previewImagePath = previewFilePath;
  537.     previewLoadingPath = loadingFilePath;
  538.     previewPlayPath = playFilePath
  539.   };
  540.   applet.removeExistingApplet = function(appletParent, showScreenshot) {
  541.     var i;
  542.     if (typeof appletParent === 'string') {
  543.       appletParent = document.getElementById(appletParent)
  544.     }
  545.     if (loadedAppletType === 'compiled' && window[parameters.id] !== undefined) {
  546.       if (typeof window[parameters.id].stopAnimation === 'function') {
  547.         window[parameters.id].stopAnimation()
  548.       }
  549.       if (typeof window[parameters.id].remove === 'function') {
  550.         window[parameters.id].remove()
  551.       }
  552.       if (ggbApplets !== undefined) {
  553.         for (i = 0; i < ggbApplets.length; i++) {
  554.           if (ggbApplets[i] === window[parameters.id]) {
  555.             ggbApplets.splice(i, 1)
  556.           }
  557.         }
  558.       }
  559.       window[parameters.id] = undefined
  560.     }
  561.     loadedAppletType = null;
  562.     for (i = 0; i < appletParent.childNodes.length; i++) {
  563.       var tag = appletParent.childNodes[i].tagName;
  564.       if (appletParent.childNodes[i].className === 'applet_screenshot') {
  565.         if (showScreenshot) {
  566.           appletParent.childNodes[i].style.display = 'block';
  567.           loadedAppletType = 'screenshot'
  568.         } else {
  569.           appletParent.childNodes[i].style.display = 'none'
  570.         }
  571.       } else if (tag === 'APPLET' || tag === 'ARTICLE' || tag === 'DIV' || loadedAppletType === 'compiled' && (tag === 'SCRIPT' || tag === 'STYLE')) {
  572.         appletParent.removeChild(appletParent.childNodes[i]);
  573.         i--
  574.       }
  575.     }
  576.     var appName = parameters.id !== undefined ? parameters.id : 'ggbApplet';
  577.     var app = window[appName];
  578.     if (app !== undefined) {
  579.       window[appName] = null
  580.     }
  581.   };
  582.   applet.refreshHitPoints = function() {
  583.     if (parseVersion(ggbHTML5LoadedCodebaseVersion) >= 5) {
  584.       return true
  585.     }
  586.     var app = applet.getAppletObject();
  587.     if (app) {
  588.       if (typeof app.recalculateEnvironments === 'function') {
  589.         app.recalculateEnvironments();
  590.         return true
  591.       }
  592.     }
  593.     return false
  594.   };
  595.   applet.startAnimation = function() {
  596.     var app = applet.getAppletObject();
  597.     if (app) {
  598.       if (typeof app.startAnimation === 'function') {
  599.         app.startAnimation();
  600.         return true
  601.       }
  602.     }
  603.     return false
  604.   };
  605.   applet.stopAnimation = function() {
  606.     var app = applet.getAppletObject();
  607.     if (app) {
  608.       if (typeof app.stopAnimation === 'function') {
  609.         app.stopAnimation();
  610.         return true
  611.       }
  612.     }
  613.     return false
  614.   };
  615.   applet.setPreCompiledScriptPath = function(path, version) {
  616.     preCompiledScriptPath = path;
  617.     if (preCompiledResourcePath === null) {
  618.       preCompiledResourcePath = preCompiledScriptPath
  619.     }
  620.     preCompiledScriptVersion = version
  621.   };
  622.   applet.setPreCompiledResourcePath = function(path) {
  623.     preCompiledResourcePath = path
  624.   };
  625.   applet.getAppletObject = function() {
  626.     var appName = parameters.id !== undefined ? parameters.id : 'ggbApplet';
  627.     return window[appName]
  628.   };
  629.   var injectJavaApplet = function(appletElem, parameters) {
  630.     if (views.CV) {
  631.       var giac_url;
  632.       if (giac_js_url !== null) {
  633.         giac_url = giac_js_url
  634.       } else {
  635.         giac_url = javaCodebase + '/giac.js'
  636.       }
  637.       var script = document.createElement('script');
  638.       script.setAttribute('src', giac_url);
  639.       script.onload = function() {
  640.         window._GIAC_caseval = __ggb__giac.cwrap('_ZN4giac7casevalEPKc', 'string', [
  641.           'string'
  642.         ])
  643.       };
  644.       appletElem.appendChild(script);
  645.       script = document.createElement('script');
  646.       script.innerHTML = '' + '       var _GIAC_caseval = \'nD\';' + '       function _ggbCallGiac(exp) {' + '           var ret = _GIAC_caseval(exp);' + '           return ret;' + '       }';
  647.       appletElem.appendChild(script)
  648.     }
  649.     var applet = document.createElement('applet');
  650.     applet.setAttribute('name', parameters.id !== undefined ? parameters.id : 'ggbApplet');
  651.     if (parameters.height !== undefined && parameters.height > 0) {
  652.       applet.setAttribute('height', parameters.height)
  653.     }
  654.     if (parameters.width !== undefined && parameters.width > 0) {
  655.       applet.setAttribute('width', parameters.width)
  656.     }
  657.     applet.setAttribute('code', 'dummy');
  658.     appendParam(applet, 'jnlp_href', jnlpFilePath);
  659.     if (isOverriddenJavaCodebase) {
  660.       appendParam(applet, 'codebase', javaCodebase)
  661.     }
  662.     appendParam(applet, 'boxborder', 'false');
  663.     appendParam(applet, 'centerimage', 'true');
  664.     if (ggbVersion === '5.0') {
  665.       appendParam(applet, 'java_arguments', '-Xmx1024m -Djnlp.packEnabled=false')
  666.     } else {
  667.       appendParam(applet, 'java_arguments', '-Xmx1024m -Djnlp.packEnabled=true')
  668.     }
  669.     for (var key in parameters) {
  670.       if (key !== 'width' && key !== 'height') {
  671.         appendParam(applet, key, parameters[key])
  672.       }
  673.     }
  674.     appendParam(applet, 'framePossible', 'false');
  675.     if (!isJavaOffline) {
  676.       appendParam(applet, 'image', 'http://tube.geogebra.org/images/java_loading.gif')
  677.     }
  678.     appendParam(applet, 'codebase_lookup', 'false');
  679.     if (navigator.appName !== 'Microsoft Internet Explorer' || getIEVersion() > 9) {
  680.       applet.appendChild(document.createTextNode('This is a Java Applet created using GeoGebra from www.geogebra.org - it looks like you don\'t have Java installed, please go to www.java.com'))
  681.     }
  682.     applet.style.display = 'block';
  683.     appletElem.appendChild(applet);
  684.     log('GeoGebra Java applet injected. Used JNLP file = \'' + jnlpFilePath + '\'' + (isOverriddenJavaCodebase ? ' with overridden codebase \'' + javaCodebase + '\'.' : '.'), parameters)
  685.   };
  686.   var appendParam = function(applet, name, value) {
  687.     var param = document.createElement('param');
  688.     param.setAttribute('name', name);
  689.     param.setAttribute('value', value);
  690.     applet.appendChild(param)
  691.   };
  692.   var valBoolean = function(value) {
  693.     return value && value !== 'false'
  694.   };
  695.   var injectHTML5Applet = function(appletElem, parameters, noPreview) {
  696.     if (parseVersion(html5CodebaseVersion) <= 4.2) {
  697.       noPreview = true
  698.     }
  699.     var loadScript = !isRenderGGBElementEnabled && !scriptLoadStarted;
  700.     if (!isRenderGGBElementEnabled && !scriptLoadStarted || (ggbHTML5LoadedCodebaseVersion !== html5CodebaseVersion || ggbHTML5LoadedCodebaseIsWebSimple && !html5CodebaseIsWebSimple)) {
  701.       loadScript = true;
  702.       isRenderGGBElementEnabled = false;
  703.       scriptLoadStarted = false
  704.     }
  705.     var article = document.createElement('article');
  706.     var oriWidth = parameters.width;
  707.     var oriHeight = parameters.height;
  708.     if (parameters.width !== undefined) {
  709.       if (parseVersion(html5CodebaseVersion) <= 4.4) {
  710.         if (valBoolean(parameters.showToolBar)) {
  711.           parameters.height -= 7
  712.         }
  713.         if (valBoolean(parameters.showAlgebraInput)) {
  714.           parameters.height -= 37
  715.         }
  716.         if (parameters.width < 605 && valBoolean(parameters.showToolBar)) {
  717.           parameters.width = 605;
  718.           oriWidth = 605
  719.         }
  720.       } else {
  721.         var minWidth = 100;
  722.         if (valBoolean(parameters.showToolBar) || valBoolean(parameters.showMenuBar)) {
  723.           if (parameters.hasOwnProperty('customToolBar')) {
  724.             parameters.customToolbar = parameters.customToolBar
  725.           }
  726.           if (parameters.customToolbar !== undefined) {
  727.             var tbIcons = parameters.customToolbar.split('|');
  728.             minWidth = 45 * tbIcons.length + (valBoolean(parameters.showMenuBar) ? 186 : 88) + 22
  729.           } else {
  730.             minWidth = valBoolean(parameters.showMenuBar) ? 745 : 560
  731.           }
  732.         }
  733.         if (oriWidth < minWidth) {
  734.           parameters.width = minWidth;
  735.           oriWidth = minWidth
  736.         }
  737.       }
  738.     }
  739.     article.className = 'notranslate';
  740.     article.style.border = 'none';
  741.     article.style.display = 'inline-block';
  742.     for (var key in parameters) {
  743.       if (parameters.hasOwnProperty(key) && key !== 'appletOnLoad' && key !== 'scale') {
  744.         article.setAttribute('data-param-' + key, parameters[key])
  745.       }
  746.     }
  747.     var scale = getScale(parameters, appletElem);
  748.     if (!isFlexibleWorksheetEditor() && !isNaN(scale) && scale !== 1) {
  749.       article.setAttribute('data-param-scale', scale)
  750.     }
  751.     if (!noPreview && parameters.width !== undefined) {
  752.       var previewContainer = createScreenShotDiv(oriWidth, oriHeight, parameters.borderColor, false);
  753.       var previewPositioner = document.createElement('div');
  754.       previewPositioner.style.position = 'relative';
  755.       previewPositioner.style.display = 'block';
  756.       previewPositioner.style.width = scale * oriWidth + 'px';
  757.       previewPositioner.style.height = scale * oriHeight + 'px';
  758.       if (!parameters.hasOwnProperty('showSplash')) {
  759.         article.setAttribute('data-param-showSplash', 'false')
  760.       }
  761.       if (parseVersion(html5CodebaseVersion) >= 5) {
  762.         if (typeof parameters.appletOnLoad === 'function') {
  763.           var oriAppletOnload = parameters.appletOnLoad
  764.         }
  765.         parameters.appletOnLoad = function() {
  766.           var preview = appletElem.querySelector('.ggb_preview');
  767.           if (preview) {
  768.             preview.parentNode.removeChild(preview)
  769.           }
  770.           if (typeof oriAppletOnload === 'function') {
  771.             oriAppletOnload()
  772.           }
  773.         };
  774.         previewPositioner.appendChild(previewContainer);
  775.         if (scale && scale !== 1 && !isNaN(scale) && (!isFlexibleWorksheetEditor() || parameters.hasOwnProperty('scale'))) {
  776.           var scaleElem = previewPositioner;
  777.           if (appletElem.id === 'applet_container') {
  778.             scaleElem = appletElem
  779.           }
  780.           scaleElem.style.transform = 'scale(' + scale + ',' + scale + ')';
  781.           scaleElem.style.transformOrigin = '0% 0% 0px'
  782.         }
  783.       } else {
  784.         article.appendChild(previewContainer)
  785.       }
  786.       previewPositioner.appendChild(article);
  787.       appletElem.appendChild(previewPositioner)
  788.     } else {
  789.       appletElem.appendChild(article)
  790.     }
  791.  
  792.     function renderGGBElementWithParams(article, parameters) {
  793.       if (parameters && typeof parameters.appletOnLoad === 'function' && typeof renderGGBElement === 'function') {
  794.         renderGGBElement(article, parameters.appletOnLoad)
  795.       } else {
  796.         renderGGBElement(article)
  797.       }
  798.       log('GeoGebra HTML5 applet injected and rendered with previously loaded codebase.', parameters)
  799.     }
  800.  
  801.     function renderGGBElementOnTube(a, parameters) {
  802.       if (typeof renderGGBElement === 'undefined') {
  803.         if (html5AppletsToProcess === null) {
  804.           html5AppletsToProcess = []
  805.         }
  806.         html5AppletsToProcess.push({
  807.           article: a,
  808.           params: parameters
  809.         });
  810.         window.renderGGBElementReady = function() {
  811.           isRenderGGBElementEnabled = true;
  812.           if (html5AppletsToProcess !== null && html5AppletsToProcess.length) {
  813.             html5AppletsToProcess.forEach(function(obj) {
  814.               renderGGBElementWithParams(obj.article, obj.params)
  815.             });
  816.             html5AppletsToProcess = null
  817.           }
  818.         };
  819.         if (parseVersion(html5CodebaseVersion) < 5) {
  820.           a.className += ' geogebraweb'
  821.         }
  822.       } else {
  823.         renderGGBElementWithParams(a, parameters)
  824.       }
  825.     }
  826.     if (loadScript) {
  827.       scriptLoadStarted = true;
  828.       if (parseVersion(html5CodebaseVersion) >= 4.4) {
  829.         var f_c_u;
  830.         if (fonts_css_url === null) {
  831.           f_c_u = html5Codebase + 'css/fonts.css'
  832.         } else {
  833.           f_c_u = fonts_css_url
  834.         }
  835.         var fontscript1 = document.createElement('script');
  836.         fontscript1.type = 'text/javascript';
  837.         fontscript1.innerHTML = '\n' + '//<![CDATA[\n' + 'WebFontConfig = {\n' + '   loading: function() {},\n' + '   active: function() {},\n' + '   inactive: function() {},\n' + '   fontloading: function(familyName, fvd) {},\n' + '   fontactive: function(familyName, fvd) {},\n' + '   fontinactive: function(familyName, fvd) {},\n' + '   custom: {\n' + '       families: ["geogebra-sans-serif", "geogebra-serif"],\n' + '           urls: [ "' + f_c_u + '" ]\n' + '   }\n' + '};\n' + '//]]>\n' + '\n';
  838.         var fontscript2 = document.createElement('script');
  839.         fontscript2.type = 'text/javascript';
  840.         fontscript2.src = html5Codebase + 'js/webfont.js';
  841.         appletElem.appendChild(fontscript1);
  842.         appletElem.appendChild(fontscript2)
  843.       }
  844.       for (var i = 0; i < article.childNodes.length; i++) {
  845.         var tag = article.childNodes[i].tagName;
  846.         if (tag === 'TABLE') {
  847.           article.removeChild(article.childNodes[i]);
  848.           i--
  849.         }
  850.       }
  851.       if (ggbHTML5LoadedScript !== null) {
  852.         var el = document.querySelector('script[src="' + ggbHTML5LoadedScript + '"]');
  853.         if (el !== undefined) {
  854.           el.parentNode.removeChild(el)
  855.         }
  856.       }
  857.       var script = document.createElement('script');
  858.       var scriptLoaded = function() {
  859.         renderGGBElementOnTube(article, parameters)
  860.       };
  861.       log(html5Codebase);
  862.       script.src = html5Codebase + html5CodebaseScript;
  863.       script.onload = scriptLoaded;
  864.       ggbHTML5LoadedCodebaseIsWebSimple = html5CodebaseIsWebSimple;
  865.       ggbHTML5LoadedCodebaseVersion = html5CodebaseVersion;
  866.       ggbHTML5LoadedScript = script.src;
  867.       log('GeoGebra HTML5 applet injected. Codebase = \'' + html5Codebase + '\'.', parameters);
  868.       appletElem.appendChild(script)
  869.     } else {
  870.       renderGGBElementOnTube(article, parameters)
  871.     }
  872.     parameters.height = oriHeight;
  873.     parameters.width = oriWidth;
  874.     var oldOnResize = null;
  875.     if (window.onresize !== undefined && typeof window.onresize === 'function') {
  876.       oldOnResize = window.onresize
  877.     }
  878.     window.onresize = function() {
  879.       var scale = getScale(parameters, appletElem);
  880.       if (!isFlexibleWorksheetEditor() && !isNaN(scale) && scale !== 1) {
  881.         article.setAttribute('data-param-scale', scale);
  882.         if (article.hasAttribute('data-scalex')) {
  883.           article.setAttribute('data-scalex', scale)
  884.         }
  885.         if (article.hasAttribute('data-scaley')) {
  886.           article.setAttribute('data-scaley', scale)
  887.         }
  888.         scaleElem = appletElem;
  889.         if (appletElem.id !== 'applet_container') {
  890.           for (var i = 0; i < appletElem.childNodes.length; i++) {
  891.             var tag = appletElem.childNodes[i].tagName;
  892.             if (tag === 'DIV') {
  893.               scaleElem = appletElem.childNodes[i];
  894.               break
  895.             }
  896.           }
  897.         }
  898.         scaleElem.style.transform = 'scale(' + scale + ',' + scale + ')';
  899.         scaleElem.style.transformOrigin = '0% 0% 0px';
  900.         scaleElem.style.width = parameters.width * scale + 'px';
  901.         scaleElem.style.height = parameters.height * scale + 'px'
  902.       }
  903.       if (oldOnResize !== null) {
  904.         oldOnResize()
  905.       }
  906.     }
  907.   };
  908.   var injectCompiledApplet = function(appletElem, parameters, noPreview) {
  909.     var appletObjectName = parameters.id;
  910.     var scale = calcScale(parameters.screenshotGenerator, appletElem, parameters.width);
  911.     if (scale !== 1) {
  912.       parameters.scale = scale;
  913.       appletElem.style.minWidth = parameters.width * scale + 'px';
  914.       appletElem.style.minHeight = parameters.height * scale + 'px'
  915.     }
  916.     var viewContainer = document.createElement('div');
  917.     viewContainer.id = 'view-container-' + appletObjectName;
  918.     viewContainer.setAttribute('width', parameters.width);
  919.     viewContainer.setAttribute('height', parameters.height);
  920.     viewContainer.style.width = parameters.width * scale + 'px';
  921.     viewContainer.style.height = parameters.height * scale + 'px';
  922.     if (parameters.showSplash === undefined) {
  923.       parameters.showSplash = true
  924.     }
  925.     var viewImages = document.createElement('div');
  926.     viewImages.id = '__ggb__images';
  927.     if (!noPreview && previewImagePath !== null && parseVersion(html5CodebaseVersion) >= 4.4 && parameters.width !== undefined) {
  928.       var previewContainer = createScreenShotDiv(parameters.width, parameters.height, parameters.borderColor, false);
  929.       var previewPositioner = document.createElement('div');
  930.       previewPositioner.style.position = 'relative';
  931.       previewPositioner.className = 'ggb_preview_container';
  932.       previewPositioner.style.display = 'block';
  933.       previewPositioner.style.width = parameters.width * scale + 'px';
  934.       previewPositioner.style.height = parameters.height * scale + 'px';
  935.       previewPositioner.appendChild(previewContainer);
  936.       appletElem.appendChild(previewPositioner)
  937.     }
  938.     if (!ggbCompiledResourcesLoadFinished && !ggbCompiledResourcesLoadInProgress) {
  939.       var resource4 = document.createElement('script');
  940.       resource4.type = 'text/javascript';
  941.       resource4.innerHTML = '\n' + 'WebFontConfig = {\n' + '   loading: function() {},\n' + '   active: function() {},\n' + '   inactive: function() {},\n' + '   fontloading: function(familyName, fvd) {},\n' + '   fontactive: function(familyName, fvd) {' + '       if (!ggbCompiledAppletsLoaded) {' + '           ggbCompiledAppletsLoaded = true;' + '           ' + '           setTimeout(function() {' + '               ggbCompiledResourcesLoadFinished = true;' + '               ggbCompiledResourcesLoadInProgress = false;' + '               if (window.ggbApplets != undefined) {' + '                   for (var i = 0 ; i < window.ggbApplets.length ; i++) {' + '                       window.ggbApplets[i].init({scale:window.ggbApplets[i].scaleParameter, url:window.ggbApplets[i].preCompiledScriptPath+"/", ss:' + (parameters.showSplash ? 'true' : 'false') + ', sdz:' + (parameters.enableShiftDragZoom ? 'true' : 'false') + ', rc:' + (parameters.enableRightClick ? 'true' : 'false') + ', sri:' + (parameters.showResetIcon ? 'true' : 'false') + '});' + '                   }' + '               }' + '               if (typeof window.ggbCompiledAppletsOnLoad == "function") {' + '                   window.ggbCompiledAppletsOnLoad();' + '               }' + '           },1);' + '       }' + '   },\n' + '   fontinactive: function(familyName, fvd) {},\n' + '   custom: {\n' + '       families: ["geogebra-sans-serif", "geogebra-serif"],\n' + '           urls: [ "' + preCompiledResourcePath + '/fonts/fonts.css' + '" ]\n' + '   }\n' + '};\n' + '\n';
  942.       var resource5 = document.createElement('script');
  943.       resource5.type = 'text/javascript';
  944.       resource5.src = preCompiledResourcePath + '/fonts/webfont.js';
  945.       ggbCompiledResourcesLoadInProgress = true;
  946.       appletElem.appendChild(resource4);
  947.       appletElem.appendChild(resource5)
  948.     }
  949.     var appletStyle = document.createElement('style');
  950.     appletStyle.innerHTML = '\n' + '.view-frame {\n' + '    border: 1px solid black;\n' + '    display: inline-block;\n' + '}\n' + '#tip {\n' + '    background-color: yellow;\n' + '    border: 1px solid blue;\n' + '    position: absolute;\n' + '    left: -200px;\n' + '    top: 100px;\n' + '};\n';
  951.     appletElem.appendChild(appletStyle);
  952.     var script = document.createElement('script');
  953.     var scriptLoaded = function() {
  954.       window[appletObjectName].preCompiledScriptPath = preCompiledScriptPath;
  955.       window[appletObjectName].scaleParameter = parameters.scale;
  956.       if (!noPreview) {
  957.         appletElem.querySelector('.ggb_preview_container').remove()
  958.       }
  959.       appletElem.appendChild(viewContainer);
  960.       appletElem.appendChild(viewImages);
  961.       if (ggbCompiledResourcesLoadFinished) {
  962.         window[appletObjectName].init({
  963.           scale: parameters.scale,
  964.           url: preCompiledScriptPath + '/',
  965.           ss: parameters.showSplash,
  966.           sdz: parameters.enableShiftDragZoom,
  967.           rc: parameters.enableRightClick,
  968.           sri: parameters.showResetIcon
  969.         });
  970.         if (typeof window.ggbAppletOnLoad === 'function') {
  971.           window.ggbAppletOnLoad(appletElem.id)
  972.         }
  973.       }
  974.     };
  975.     var scriptFile = preCompiledScriptPath + '/applet.js' + (preCompiledScriptVersion != null && preCompiledScriptVersion != undefined ? '?v=' + preCompiledScriptVersion : '');
  976.     script.src = scriptFile;
  977.     script.onload = scriptLoaded;
  978.     log('GeoGebra precompiled applet injected. Script=' + scriptFile + '.');
  979.     appletElem.appendChild(script)
  980.   };
  981.   var injectScreenshot = function(appletElem, parameters, showPlayButton) {
  982.     var previewContainer = createScreenShotDiv(parameters.width, parameters.height, parameters.borderColor, showPlayButton);
  983.     var previewPositioner = document.createElement('div');
  984.     previewPositioner.style.position = 'relative';
  985.     previewPositioner.style.display = 'block';
  986.     previewPositioner.style.width = parameters.width + 'px';
  987.     previewPositioner.style.height = parameters.height + 'px';
  988.     previewPositioner.className = 'applet_screenshot';
  989.     previewPositioner.appendChild(previewContainer);
  990.     appletElem.appendChild(previewPositioner);
  991.     var scale = getScale(parameters, appletElem);
  992.     if (scale !== 1 && !isNaN(scale) && !isFlexibleWorksheetEditor()) {
  993.       previewPositioner.style.transform = 'scale(' + scale + ',' + scale + ')';
  994.       previewPositioner.style.transformOrigin = '0% 0% 0px';
  995.       previewPositioner.style.width = parameters.width * scale + 'px';
  996.       previewPositioner.style.height = parameters.height * scale + 'px'
  997.     }
  998.     var oldOnResize = null;
  999.     if (window.onresize !== undefined && typeof window.onresize === 'function') {
  1000.       oldOnResize = window.onresize
  1001.     }
  1002.     window.onresize = function() {
  1003.       var scale = getScale(parameters, appletElem);
  1004.       if (!isFlexibleWorksheetEditor() && !isNaN(scale) && scale !== 1) {
  1005.         previewPositioner.style.transform = 'scale(' + scale + ',' + scale + ')';
  1006.         previewPositioner.style.transformOrigin = '0% 0% 0px';
  1007.         previewPositioner.style.width = parameters.width * scale + 'px';
  1008.         previewPositioner.style.height = parameters.height * scale + 'px'
  1009.       }
  1010.       if (oldOnResize !== null) {
  1011.         oldOnResize()
  1012.       }
  1013.     }
  1014.   };
  1015.   var getScale = function(paramters, appletElem) {
  1016.     var scale = 1;
  1017.     if (parameters.hasOwnProperty('scale')) {
  1018.       scale = parseFloat(parameters.scale);
  1019.       if (isNaN(scale) || scale === null || scale === 0) {
  1020.         scale = 1
  1021.       }
  1022.     }
  1023.     var autoScale = calcScale(parameters.screenshotGenerator, appletElem, parameters.width);
  1024.     return Math.min(scale, autoScale)
  1025.   };
  1026.   var injectPlayButton = function(appletElem, parameters, noPreview, type) {
  1027.     injectScreenshot(appletElem, parameters, true);
  1028.     var play = function() {
  1029.       var elems = [];
  1030.       for (i = 0; i < appletElem.childNodes.length; i++) {
  1031.         elems.push(appletElem.childNodes[i])
  1032.       }
  1033.       if (type === 'java') {
  1034.         injectJavaApplet(appletElem, parameters)
  1035.       } else {
  1036.         injectHTML5Applet(appletElem, parameters, false)
  1037.       }
  1038.       for (i = 0; i < elems.length; i++) {
  1039.         appletElem.removeChild(elems[i])
  1040.       }
  1041.     };
  1042.     var imgs = appletElem.getElementsByTagName('img');
  1043.     for (var i = 0; i < imgs.length; i++) {
  1044.       if (imgs[i].className === 'ggb_preview_play') {
  1045.         imgs[i].addEventListener('click', play, false);
  1046.         imgs[i].addEventListener('ontouchstart', play, false)
  1047.       }
  1048.     }
  1049.     if (typeof window.ggbAppletPlayerOnload === 'function') {
  1050.       window.ggbAppletPlayerOnload(appletElem)
  1051.     }
  1052.   };
  1053.   var createScreenShotDiv = function(oriWidth, oriHeight, borderColor, showPlayButton) {
  1054.     var previewContainer = document.createElement('div');
  1055.     previewContainer.className = 'ggb_preview';
  1056.     previewContainer.style.position = 'absolute';
  1057.     previewContainer.style.zIndex = '1000001';
  1058.     previewContainer.style.width = oriWidth - 2 + 'px';
  1059.     previewContainer.style.height = oriHeight - 2 + 'px';
  1060.     previewContainer.style.top = '0px';
  1061.     previewContainer.style.left = '0px';
  1062.     previewContainer.style.overflow = 'hidden';
  1063.     previewContainer.style.backgroundColor = 'white';
  1064.     var bc = 'black';
  1065.     if (borderColor !== undefined) {
  1066.       if (borderColor === 'none') {
  1067.         bc = 'transparent'
  1068.       }
  1069.     }
  1070.     previewContainer.style.border = '1px solid ' + bc;
  1071.     var preview = document.createElement('img');
  1072.     preview.style.position = 'relative';
  1073.     preview.style.zIndex = '1000';
  1074.     preview.style.top = '-1px';
  1075.     preview.style.left = '-1px';
  1076.     if (previewImagePath !== null) {
  1077.       preview.setAttribute('src', previewImagePath)
  1078.     }
  1079.     preview.style.opacity = 0.3;
  1080.     if (previewLoadingPath !== null || previewPlayPath !== null && showPlayButton) {
  1081.       var previewOverlay = document.createElement('img');
  1082.       previewOverlay.style.position = 'absolute';
  1083.       previewOverlay.style.zIndex = '1001';
  1084.       previewOverlay.style.opacity = 1;
  1085.       var pWidth,
  1086.         pHeight;
  1087.       if (previewPlayPath !== null && showPlayButton) {
  1088.         pWidth = 80;
  1089.         pHeight = 80;
  1090.         previewOverlay.setAttribute('src', previewPlayPath);
  1091.         previewOverlay.style.cursor = 'pointer';
  1092.         previewOverlay.className = 'ggb_preview_play'
  1093.       } else {
  1094.         pWidth = 360;
  1095.         if (pWidth > oriWidth / 4 * 3) {
  1096.           pWidth = oriWidth / 4 * 3
  1097.         }
  1098.         pHeight = pWidth / 5.8;
  1099.         previewOverlay.setAttribute('src', previewLoadingPath)
  1100.       }
  1101.       var pX = (oriWidth - pWidth) / 2;
  1102.       var pY = (oriHeight - pHeight) / 2;
  1103.       previewOverlay.style.left = pX + 'px';
  1104.       previewOverlay.style.top = pY + 'px';
  1105.       previewOverlay.setAttribute('width', pWidth - 4);
  1106.       previewOverlay.setAttribute('height', pHeight - 4);
  1107.       previewContainer.appendChild(previewOverlay)
  1108.     }
  1109.     previewContainer.appendChild(preview);
  1110.     return previewContainer
  1111.   };
  1112.   var buildJNLPFileName = function(isOffline) {
  1113.     var version = parseFloat(javaCodebaseVersion);
  1114.     var filename = 'applet' + version * 10 + '_';
  1115.     if (isOffline) {
  1116.       filename += 'local'
  1117.     } else {
  1118.       filename += 'web'
  1119.     }
  1120.     if (views.is3D) {
  1121.       filename += '_3D'
  1122.     }
  1123.     filename += '.jnlp';
  1124.     return filename
  1125.   };
  1126.   var detectAppletType = function(preferredType) {
  1127.     preferredType = preferredType.toLowerCase();
  1128.     if (preferredType === 'java' || preferredType === 'html5' || preferredType === 'screenshot' || preferredType === 'compiled') {
  1129.       return preferredType
  1130.     }
  1131.     if (preferredType === 'preferjava') {
  1132.       if (applet.isJavaInstalled()) {
  1133.         return 'java'
  1134.       } else {
  1135.         return 'html5'
  1136.       }
  1137.     } else if (preferredType === 'preferhtml5') {
  1138.       if (applet.isHTML5Installed()) {
  1139.         return 'html5'
  1140.       } else {
  1141.         return 'java'
  1142.       }
  1143.     } else if (preferredType === 'prefercompiled' && preCompiledScriptPath !== null) {
  1144.       if (applet.isCompiledInstalled()) {
  1145.         return 'compiled'
  1146.       } else {
  1147.         return 'java'
  1148.       }
  1149.     } else {
  1150.       if (applet.isJavaInstalled() && !applet.isHTML5Installed()) {
  1151.         return 'java'
  1152.       } else {
  1153.         return 'html5'
  1154.       }
  1155.     }
  1156.   };
  1157.   var getIEVersion = function() {
  1158.     var a = navigator.appVersion;
  1159.     if (a.indexOf('Trident/7.0') > 0) return 11;
  1160.     else {
  1161.       return a.indexOf('MSIE') + 1 ? parseFloat(a.split('MSIE')[1]) : 999
  1162.     }
  1163.   };
  1164.   var isInternetExplorer = function() {
  1165.     return getIEVersion() != 999
  1166.   };
  1167.  
  1168.   function isFlexibleWorksheet() {
  1169.     return window.GGBT_wsf_view !== undefined || window.GGBT_wsf_edit !== undefined
  1170.   }
  1171.  
  1172.   function isFlexibleWorksheetEditor() {
  1173.     return window.GGBT_wsf_edit !== undefined
  1174.   }
  1175.   var modules = [
  1176.     'web',
  1177.     'webSimple',
  1178.     'web3d',
  1179.     'tablet',
  1180.     'tablet3d',
  1181.     'phone'
  1182.   ];
  1183.   var setDefaultHTML5CodebaseForVersion = function(version, offline) {
  1184.     html5CodebaseVersion = version;
  1185.     if (offline) {
  1186.       setHTML5CodebaseInternal(html5CodebaseVersion, true);
  1187.       return
  1188.     }
  1189.     var hasWebSimple = !html5NoWebSimple;
  1190.     if (hasWebSimple) {
  1191.       var v = parseVersion(html5CodebaseVersion);
  1192.       if (!isNaN(v) && v < 4.4) {
  1193.         hasWebSimple = false
  1194.       }
  1195.     }
  1196.     var protocol,
  1197.       codebase;
  1198.     if (window.location.protocol.substr(0, 4) === 'http') {
  1199.       protocol = window.location.protocol
  1200.     } else {
  1201.       protocol = 'http:'
  1202.     }
  1203.     var index = html5CodebaseVersion.indexOf('//');
  1204.     if (index > 0) {
  1205.       codebase = html5CodebaseVersion
  1206.     } else if (index === 0) {
  1207.       codebase = protocol + html5CodebaseVersion
  1208.     } else {
  1209.       codebase = protocol + '//' + ipwims + '/wims/scripts/js/geogebra/geogebraweb/'
  1210.         //codebase = protocol + '//web.geogebra.org/' + html5CodebaseVersion + '/'
  1211.     }
  1212.     for (var key in modules) {
  1213.       if (html5CodebaseVersion.slice(modules[key].length * -1) === modules[key] || html5CodebaseVersion.slice((modules[key].length + 1) * -1) === modules[key] + '/') {
  1214.         setHTML5CodebaseInternal(codebase, false);
  1215.         return
  1216.       }
  1217.     }
  1218.     if (!isFlexibleWorksheet() && hasWebSimple && !views.is3D && !views.AV && !views.SV && !views.CV && !views.EV2 && !views.CP && !views.PC && !views.DA && !views.FI && !views.PV && !valBoolean(parameters.showToolBar) && !valBoolean(parameters.showMenuBar) && !valBoolean(parameters.showAlgebraInput) && !valBoolean(parameters.enableRightClick)) {
  1219.       codebase += 'webSimple/'
  1220.     } else {
  1221.       var v = parseVersion(html5CodebaseVersion);
  1222.       if (views.is3D && (isNaN(v) || v >= 5) || isFlexibleWorksheetEditor()) {
  1223.         codebase += 'web3d/'
  1224.       } else {
  1225.         codebase += 'web/'
  1226.       }
  1227.     }
  1228.     setHTML5CodebaseInternal(codebase, false)
  1229.   };
  1230.   var setHTML5CodebaseInternal = function(codebase, offline) {
  1231.     if (codebase.slice(-1) !== '/') {
  1232.       codebase += '/'
  1233.     }
  1234.     html5Codebase = codebase;
  1235.     if (offline === null) {
  1236.       offline = codebase.indexOf('http') === -1
  1237.     }
  1238.     isHTML5Offline = offline;
  1239.     html5CodebaseScript = 'web.nocache.js';
  1240.     html5CodebaseIsWebSimple = false;
  1241.     var folders = html5Codebase.split('/');
  1242.     if (folders.length > 1) {
  1243.       if (!offline && folders[folders.length - 2] === 'webSimple') {
  1244.         html5CodebaseScript = 'webSimple.nocache.js';
  1245.         html5CodebaseIsWebSimple = true
  1246.       } else if (modules.indexOf(folders[folders.length - 2]) >= 0) {
  1247.         html5CodebaseScript = folders[folders.length - 2] + '.nocache.js'
  1248.       }
  1249.     }
  1250.     folders = codebase.split('/');
  1251.     html5CodebaseVersion = folders[folders.length - 3];
  1252.     if (html5CodebaseVersion.substr(0, 4) === 'test') {
  1253.       html5CodebaseVersion = html5CodebaseVersion.substr(4, 1) + '.' + html5CodebaseVersion.substr(5, 1)
  1254.     } else if (html5CodebaseVersion.substr(0, 3) === 'war' || html5CodebaseVersion.substr(0, 4) === 'beta') {
  1255.       html5CodebaseVersion = '5.0'
  1256.     }
  1257.   };
  1258.   var setDefaultJavaCodebaseForVersion = function(version) {
  1259.     if (version === 'test32') {
  1260.       javaCodebaseVersion = '3.2'
  1261.     } else if (version === 'test40') {
  1262.       javaCodebaseVersion = '4.0'
  1263.     } else if (version === 'test42') {
  1264.       javaCodebaseVersion = '4.2'
  1265.     } else if (version === 'test50') {
  1266.       javaCodebaseVersion = '5.0'
  1267.     } else if (version === 'test') {
  1268.       javaCodebaseVersion = ggbVersion
  1269.     } else {
  1270.       javaCodebaseVersion = version
  1271.     }
  1272.     if (parseVersion(javaCodebaseVersion) < 4) {
  1273.       javaCodebaseVersion = '4.0'
  1274.     }
  1275.     var protocol;
  1276.     if (window.location.protocol.substr(0, 4) === 'http') {
  1277.       protocol = window.location.protocol
  1278.     } else {
  1279.       protocol = 'http:'
  1280.     }
  1281.     var codebase = protocol + '//jars.geogebra.org/webstart/' + javaCodebaseVersion + '/';
  1282.     if (javaCodebaseVersion === '4.0' || javaCodebaseVersion === '4.2') {
  1283.       codebase += 'jnlp/'
  1284.     }
  1285.     applet.setJNLPBaseDir('http://tube.geogebra.org/webstart/');
  1286.     doSetJavaCodebase(codebase, false)
  1287.   };
  1288.   var log = function(text, parameters) {
  1289.     if (window.console && window.console.log) {
  1290.       if (!parameters || typeof parameters.showLogging === 'undefined' || parameters.showLogging && parameters.showLogging !== 'false') {
  1291.         console.log(text)
  1292.       }
  1293.     }
  1294.   };
  1295.   if (parameters.material_id !== undefined) {
  1296.     fetchParametersFromTube(continueInit)
  1297.   } else {
  1298.     continueInit()
  1299.   }
  1300.  
  1301.   function continueInit() {
  1302.     var html5Version = ggbVersion;
  1303.     if (html5OverwrittenCodebaseVersion !== null) {
  1304.       html5Version = html5OverwrittenCodebaseVersion
  1305.     } else {
  1306.       if (parseFloat(html5Version) < 5) {
  1307.         html5Version = '5.0'
  1308.       }
  1309.     }
  1310.     setDefaultHTML5CodebaseForVersion(html5Version, false);
  1311.     setDefaultJavaCodebaseForVersion(ggbVersion);
  1312.     if (html5OverwrittenCodebase !== null) {
  1313.       setHTML5CodebaseInternal(html5OverwrittenCodebase, isHTML5Offline)
  1314.     }
  1315.     initComplete = true
  1316.   }
  1317.   return applet
  1318. };
  1319.