/*
* Utilities.js
* Keynote HTML Player
*
* Responsibility: Tungwei Cheng
* Copyright (c) 2009-2013 Apple Inc. All rights reserved.
*/
var s = Class.create({
initialize: function(){}
});
function getMobileOSVersionInfo() {
var match = navigator.userAgent.match(/iPhone OS ([\d_]+)/) || navigator.userAgent.match(/iPad OS ([\d_]+)/) || navigator.userAgent.match(/CPU OS ([\d_]+)/);
var versionInfo = { major: 0, minor: 0, point: 0 };
if (match) {
var release = match[1].split('_');
versionInfo.major = parseInt(release[0]);
if (release.length > 1) {
versionInfo.minor = parseInt(release[1]);
}
if (release.length > 2) {
versionInfo.point = parseInt(release[2]);
}
}
return versionInfo;
}
function isMobileSafari() {
if (navigator.userAgent.indexOf('iPod') != -1) {
return true;
}
else if (navigator.userAgent.indexOf('iPhone') != -1) {
return true;
}
else if (navigator.userAgent.indexOf('iPad') != -1) {
return true;
}
else {
return false;
}
}
function isiPad() {
return (navigator.userAgent.indexOf('iPad') != -1);
}
function getUrlParameter(paramterName) {
paramterName = paramterName.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regExpPattern = "[\\?&]" + paramterName + "=([^]*)";
var regExp = new RegExp(regExpPattern);
var results = regExp.exec(window.location.href);
if (results == null) {
return "";
} else {
return results[1];
}
}
function setElementProperty(node, propertyName, propertyValue) {
if (browserPrefix == "ms") {
node.style[propertyName] = propertyValue;
} else {
node.style.setProperty(propertyName, propertyValue, null);
}
}
function setElementOpaque(element) {
element.style.opacity = 1;
}
function setElementTransparent(element) {
element.style.opacity = 0;
}
function setElementPosition(element, top, left, width, height) {
if (element == null) {
window.console.log("null element passed to setElementPosition " + top + ", " + left + ", " + width + ", " + height);
return;
}
element.style.top = top + "px";
element.style.left = left + "px";
element.style.width = width + "px";
element.style.height = height + "px";
}
function setElementRect(element, rect) {
if (element == null) {
return;
}
element.style.top = rect.y;
element.style.left = rect.x;
element.style.width = rect.width;
element.style.height = rect.height;
}
function centerElementInDiv (element, elementWidth, elementHeight, divWidth, divHeight) {
if (element == null) {
return;
}
var top = (divHeight - elementHeight) / 2;
var left = (divWidth - elementWidth) / 2;
setElementPosition( element, top, left, elementWidth, elementHeight );
}
function showElement(element) {
if (element == null) {
return;
}
element.style.visibility = "visible";
}
function hideElement(element) {
if (element == null) {
return;
}
element.style.visibility = "hidden";
}
function runInNextEventLoop(codeBlock) {
setTimeout(codeBlock, 100);
}
function ensureScaleFactorNotZero(scaleFactor) {
// Mobile Safari doesn't like scale values of 0, force them to be 0.01
if (scaleFactor == 0) {
return 0.000001;
} else {
return scaleFactor;
}
}
function scaleSizeWithinSize(sourceWidth, sourceHeight, destinationWidth, destinationHeight) {
var scaledSize = {};
var sourceAspectRatio = sourceWidth / sourceHeight;
var destinationAspectRatio = destinationWidth / destinationHeight;
if (sourceAspectRatio > destinationAspectRatio) {
scaledSize.width = destinationWidth;
scaledSize.height = sourceHeight * ( destinationWidth / sourceWidth );
} else if (sourceAspectRatio < destinationAspectRatio) {
scaledSize.width = sourceWidth * ( destinationHeight / sourceHeight );
scaledSize.height = destinationHeight
} else {
scaledSize.width = destinationWidth;
scaledSize.height = destinationHeight
}
return scaledSize;
}
function parseTransformMatrix(transformMatrix) {
var parsedMatrix = [1,0,0,1,0,0];
if (transformMatrix.indexOf( "matrix(" ) == 0) {
var arrayString = transformMatrix.substring(7, transformMatrix.length - 1);
parsedMatrix = arrayString.split(",");
}
return parsedMatrix;
}
function escapeTextureId(textureId) {
var escapedTextureId = textureId.replace( /\./g, "-" );
return escapedTextureId;
}
function unEscapeTextureId(textureId) {
var escapedTextureId = textureId.replace( /\-/g, "." );
return escapedTextureId;
}
var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x) {return(x<0||x>9?"":"0")+x;}
Object.extend(Date.prototype, {
// ------------------------------------------------------------------
// formatDate (date_object, format)
// Returns a date in the output format specified.
// The format string uses the same abbreviations as in getDateFromFormat()
//
// ------------------------------------------------------------------
format: function(format) {
format=format+"";
var date = this ;
var result="";
var i_format=0;
var c="";
var token="";
var y=date.getFullYear()+"";
var M=date.getMonth()+1;
var d=date.getDate();
var E=date.getDay();
var H=date.getHours();
var m=date.getMinutes();
var s=date.getSeconds();
var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
// Convert real date parts into formatted versions
var value=new Object();
if (y.length < 4) {
y=""+(y-0+1900);
}
value["y"]=""+y;
value["yyyy"]=y;
value["yy"]=y.substring(2,4);
value["M"]=M;
value["MM"]=LZ(M);
value["MMM"]=MONTH_NAMES[M-1];
value["NNN"]=MONTH_NAMES[M+11];
value["d"]=d;
value["dd"]=LZ(d);
value["E"]=DAY_NAMES[E+7];
value["EE"]=DAY_NAMES[E];
value["H"]=H;
value["HH"]=LZ(H);
if (H==0) {
value["h"]=12;
} else if (H>12) {
value["h"]=H-12;
} else {
value["h"]=H;
}
value["hh"]=LZ(value["h"]);
if (H>11) {
value["K"]=H-12;
} else {
value["K"]=H;
}
value["k"]=H+1;
value["KK"]=LZ(value["K"]);
value["kk"]=LZ(value["k"]);
if (H > 11) {
value["a"]="PM";
} else {
value["a"]="AM";
}
value["m"]=m;
value["mm"]=LZ(m);
value["s"]=s;
value["ss"]=LZ(s);
while (i_format < format.length) {
c=format.charAt(i_format);
token="";
while ((format.charAt(i_format)==c) && (i_format < format.length)) {
token += format.charAt(i_format++);
}
if (value[token] != null) {
result=result + value[token];
} else {
result=result + token;
}
}
return result;
}
});
function getHecklerElementsByTagName(xml, tagName) {
return getElementsByTagNameNS(xml, tagName, 'urn:iwork:property', 'X:');
}
function getElementsByTagNameNS(xml, tagName, ns, prefix) {
var nodes = null;
if (xml.getElementsByTagNameNS) {
nodes = xml.getElementsByTagNameNS(ns, tagName);
} else {
// IE7 Does not support getElementsByTagNameNS
// So we have to do this silly IE7 workaround and prefix the Heckler
// namespace to everything
nodes = xml.getElementsByTagName(prefix + tagName);
}
return nodes;
}