is changed the FIRST time from 'machine-floating'
* to 'machine-sticky', the entire
-- with the exception of the canvas inside it -- disappears
* until you lift your finger or the scrolling stops.
*
* The fix, according to http://stackoverflow.com/questions/32875046/ios-9-safari-changing-an-element-to-fixed-position-while-scrolling-wont-paint,
* is to add a "transform: translateZ(0)", or alternatively "transform: translate3d(0px,0px,0px)",
* to the machine
first. Note that before I added that, the problem also seemed to be exacerbated
* by my attempt to remove any pre-existing 'machine-floating' or 'machine-sticky' class separately, which
* is why I now have redundant replace() calls below, updating the style in one step instead of two.
*/
machine.style.transform = "translateZ(0)";
if (window.pageYOffset <= topMachine) {
if (machineSibling) machineSibling.style.paddingTop = 0;
machine.className = 'machine-floating ' + machine.className.replace(/machine-(floating|sticky) /g, '');
} else {
if (machineSibling) machineSibling.style.paddingTop = (machine.offsetHeight + 8) + 'px';
machine.className = 'machine-sticky ' + machine.className.replace(/machine-(floating|sticky) /g, '');
}
if (prevOnScroll) prevOnScroll();
}
}
};
}
/**
* commandMachine(control, fSingle, idMachine, sComponent, sCommand, sValue)
*
* Note that this script is not compiled into any of the machines, since "sticky machines" are feature of the PCjs
* website rather than of the machines. And since the machines are compiled, all their code and data is completely
* opaque to us, except for those functions explicitly exported by embed.js.
*
* So now, in addition to the functions for embedding machines on a webpage, embed.js includes a few new functions:
*
* findMachineComponent()
* processMachineScript()
*
* which uses existing Component methods to find the requested component for a specific machine, and if the
* component is found, then its 'exports' table is checked for an entry matching the specified command string, and if
* an entry is found, then the corresponding function is called with the specified data.
*
* @param {Object} control
* @param {boolean} fSingle
* @param {string} idMachine
* @param {string} sComponent
* @param {string} sCommand
* @param {string} [sValue]
* @return {boolean}
*/
function commandMachine(control, fSingle, idMachine, sComponent, sCommand, sValue)
{
if (sCommand == "script" && window.processMachineScript) {
if (window.processMachineScript(idMachine, sValue)) {
if (fSingle) control.disabled = true;
return true;
}
return false;
}
if (sComponent && window.findMachineComponent) {
var component = window.findMachineComponent(idMachine, sComponent);
if (component) {
var exports = component['exports'];
if (exports) {
var fnCommand = exports[sCommand];
if (fnCommand) {
if (fnCommand.call(component, sValue)) {
if (fSingle) control.disabled = true;
return true;
}
return false;
}
}
}
}
console.log("unimplemented: commandMachine('" + idMachine + "','" + sComponent + "','" + sCommand + "','" + sValue + "')");
return false;
}
/**
* findTop(obj)
*
* @param {Object} obj
*/
function findTop(obj)
{
var curTop = 0;
if (typeof obj.offsetParent != 'undefined' && obj.offsetParent) {
while (obj.offsetParent) {
curTop += obj.offsetTop;
obj = obj.offsetParent;
}
curTop += obj.offsetTop;
}
else if (obj.y) {
curTop += obj.y;
}
return curTop;
}