///
/*
* Jssor.Utils 14.0
* http://www.jssor.com/
*
* TERMS OF USE - Jssor.Utils
*
* Copyright 2014 Jssor
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
//$JssorPoint$
var $JssorPoint$;
(function () {
$JssorPoint$ = function (x, y) {
// Properties
this.x = typeof (x) == "number" ? x : 0;
this.y = typeof (y) == "number" ? y : 0;
};
// Methods
var SDPointPrototype = $JssorPoint$.prototype;
SDPointPrototype.$Plus = function (point) {
return new $JssorPoint$(this.x + point.x, this.y + point.y);
};
SDPointPrototype.$Minus = function (point) {
return new $JssorPoint$(this.x - point.x, this.y - point.y);
};
SDPointPrototype.$Times = function (factor) {
return new $JssorPoint$(this.x * factor, this.y * factor);
};
SDPointPrototype.$Divide = function (factor) {
return new $JssorPoint$(this.x / factor, this.y / factor);
};
SDPointPrototype.$Negate = function () {
return new $JssorPoint$(-this.x, -this.y);
};
SDPointPrototype.$DistanceTo = function (point) {
return Math.sqrt(Math.pow(this.x - point.x, 2) +
Math.pow(this.y - point.y, 2));
};
SDPointPrototype.$Apply = function (func) {
return new $JssorPoint$(func(this.x), func(this.y));
};
SDPointPrototype.$Equals = function (point) {
return (point instanceof $JssorPoint$) &&
(this.x === point.x) && (this.y === point.y);
};
SDPointPrototype.$ToString = function () {
return "(" + this.x + "," + this.y + ")";
};
})();
//$JssorEasing$
var $JssorEasing$ = window.$JssorEasing$ = {
$EaseLinear: function (t) {
return t;
},
$EaseGoBack: function (t) {
return 1 - Math.abs((t *= 2) - 1);
},
$EaseSwing: function (t) {
return -Math.cos(t * Math.PI) / 2 + .5;
},
$EaseInQuad: function (t) {
return t * t;
},
$EaseOutQuad: function (t) {
return -t * (t - 2);
},
$EaseInOutQuad: function (t) {
return (t *= 2) < 1 ? 1 / 2 * t * t : -1 / 2 * (--t * (t - 2) - 1);
},
$EaseInCubic: function (t) {
return t * t * t;
},
$EaseOutCubic: function (t) {
return (t -= 1) * t * t + 1;
},
$EaseInOutCubic: function (t) {
return (t *= 2) < 1 ? 1 / 2 * t * t * t : 1 / 2 * ((t -= 2) * t * t + 2);
},
$EaseInQuart: function (t) {
return t * t * t * t;
},
$EaseOutQuart: function (t) {
return -((t -= 1) * t * t * t - 1);
},
$EaseInOutQuart: function (t) {
return (t *= 2) < 1 ? 1 / 2 * t * t * t * t : -1 / 2 * ((t -= 2) * t * t * t - 2);
},
$EaseInQuint: function (t) {
return t * t * t * t * t;
},
$EaseOutQuint: function (t) {
return (t -= 1) * t * t * t * t + 1;
},
$EaseInOutQuint: function (t) {
return (t *= 2) < 1 ? 1 / 2 * t * t * t * t * t : 1 / 2 * ((t -= 2) * t * t * t * t + 2);
},
$EaseInSine: function (t) {
return 1 - Math.cos(t * Math.PI / 2)
},
$EaseOutSine: function (t) {
return Math.sin(t * Math.PI / 2);
},
$EaseInOutSine: function (t) {
return -1 / 2 * (Math.cos(Math.PI * t) - 1);
},
$EaseInExpo: function (t) {
return t == 0 ? 0 : Math.pow(2, 10 * (t - 1));
},
$EaseOutExpo: function (t) {
return t == 1 ? 1 : -Math.pow(2, -10 * t) + 1;
},
$EaseInOutExpo: function (t) {
return t == 0 || t == 1 ? t : (t *= 2) < 1 ? 1 / 2 * Math.pow(2, 10 * (t - 1)) : 1 / 2 * (-Math.pow(2, -10 * --t) + 2);
},
$EaseInCirc: function (t) {
return -(Math.sqrt(1 - t * t) - 1);
},
$EaseOutCirc: function (t) {
return Math.sqrt(1 - (t -= 1) * t);
},
$EaseInOutCirc: function (t) {
return (t *= 2) < 1 ? -1 / 2 * (Math.sqrt(1 - t * t) - 1) : 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1);
},
$EaseInElastic: function (t) {
if (!t || t == 1)
return t;
var p = .3, s = .075;
return -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * 2 * Math.PI / p));
},
$EaseOutElastic: function (t) {
if (!t || t == 1)
return t;
var p = .3, s = .075;
return Math.pow(2, -10 * t) * Math.sin((t - s) * 2 * Math.PI / p) + 1;
},
$EaseInOutElastic: function (t) {
if (!t || t == 1)
return t;
var p = .45, s = .1125;
return (t *= 2) < 1 ? -.5 * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * 2 * Math.PI / p) : Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * 2 * Math.PI / p) * .5 + 1;
},
$EaseInBack: function (t) {
var s = 1.70158;
return t * t * ((s + 1) * t - s);
},
$EaseOutBack: function (t) {
var s = 1.70158;
return (t -= 1) * t * ((s + 1) * t + s) + 1;
},
$EaseInOutBack: function (t) {
var s = 1.70158;
return (t *= 2) < 1 ? 1 / 2 * t * t * (((s *= 1.525) + 1) * t - s) : 1 / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);
},
$EaseInBounce: function (t) {
return 1 - $JssorEasing$.$EaseOutBounce(1 - t)
},
$EaseOutBounce: function (t) {
return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;
},
$EaseInOutBounce: function (t) {
return t < 1 / 2 ? $JssorEasing$.$EaseInBounce(t * 2) * .5 : $JssorEasing$.$EaseOutBounce(t * 2 - 1) * .5 + .5;
},
$EaseInWave: function (t) {
return 1 - Math.cos(t * Math.PI * 2)
},
$EaseOutWave: function (t) {
return Math.sin(t * Math.PI * 2);
},
$EaseOutJump: function (t) {
return 1 - (((t *= 2) < 1) ? (t = 1 - t) * t * t : (t -= 1) * t * t);
},
$EaseInJump: function (t) {
return ((t *= 2) < 1) ? t * t * t : (t = 2 - t) * t * t;
}
};
var $JssorDirection$ = window.$JssorDirection$ = {
$TO_LEFT: 0x0001,
$TO_RIGHT: 0x0002,
$TO_TOP: 0x0004,
$TO_BOTTOM: 0x0008,
$HORIZONTAL: 0x0003,
$VERTICAL: 0x000C,
$LEFTRIGHT: 0x0003,
$TOPBOTOM: 0x000C,
$TOPLEFT: 0x0005,
$TOPRIGHT: 0x0006,
$BOTTOMLEFT: 0x0009,
$BOTTOMRIGHT: 0x000A,
$AROUND: 0x000F,
$GetDirectionHorizontal: function (direction) {
return direction & 0x0003;
},
$GetDirectionVertical: function (direction) {
return direction & 0x000C;
},
$ChessHorizontal: function (direction) {
return (~direction & 0x0003) + (direction & 0x000C);
},
$ChessVertical: function (direction) {
return (~direction & 0x000C) + (direction & 0x0003);
},
$IsToLeft: function (direction) {
return (direction & 0x0003) == 0x0001;
},
$IsToRight: function (direction) {
return (direction & 0x0003) == 0x0002;
},
$IsToTop: function (direction) {
return (direction & 0x000C) == 0x0004;
},
$IsToBottom: function (direction) {
return (direction & 0x000C) == 0x0008;
},
$IsHorizontal: function (direction) {
return (direction & 0x0003) > 0;
},
$IsVertical: function (direction) {
return (direction & 0x000C) > 0;
}
};
var $JssorKeyCode$ = {
$BACKSPACE: 8,
$COMMA: 188,
$DELETE: 46,
$DOWN: 40,
$END: 35,
$ENTER: 13,
$ESCAPE: 27,
$HOME: 36,
$LEFT: 37,
$NUMPAD_ADD: 107,
$NUMPAD_DECIMAL: 110,
$NUMPAD_DIVIDE: 111,
$NUMPAD_ENTER: 108,
$NUMPAD_MULTIPLY: 106,
$NUMPAD_SUBTRACT: 109,
$PAGE_DOWN: 34,
$PAGE_UP: 33,
$PERIOD: 190,
$RIGHT: 39,
$SPACE: 32,
$TAB: 9,
$UP: 38
};
var $JssorAlignment$ = {
$TopLeft: 0x11,
$TopCenter: 0x12,
$TopRight: 0x14,
$MiddleLeft: 0x21,
$MiddleCenter: 0x22,
$MiddleRight: 0x24,
$BottomLeft: 0x41,
$BottomCenter: 0x42,
$BottomRight: 0x44,
$IsTop: function (aligment) {
return aligment & 0x10 > 0;
},
$IsMiddle: function (alignment) {
return alignment & 0x20 > 0;
},
$IsBottom: function (alignment) {
return alignment & 0x40 > 0;
},
$IsLeft: function (alignment) {
return alignment & 0x01 > 0;
},
$IsCenter: function (alignment) {
return alignment & 0x02 > 0;
},
$IsRight: function (alignment) {
return alignment & 0x04 > 0;
}
};
var $JssorMatrix$;
var $JssorBrowser$ = {
$UNKNOWN: 0,
$IE: 1,
$FIREFOX: 2,
$SAFARI: 3,
$CHROME: 4,
$OPERA: 5
};
var $ROWSER_UNKNOWN$ = 0;
var $ROWSER_IE$ = 1;
var $ROWSER_FIREFOX$ = 2;
var $ROWSER_SAFARI$ = 3;
var $ROWSER_CHROME$ = 4;
var $ROWSER_OPERA$ = 5;
var $JssorAnimator$;
// $JssorUtils$ is a static class, so make it singleton instance
var $JssorUtils$ = window.$JssorUtils$ = new function () {
// Fields
var self = this;
var arrActiveX = ["Msxml2.XMLHTTP", "Msxml3.XMLHTTP", "Microsoft.XMLHTTP"];
var supportedImageFormats = {
"bmp": false,
"jpeg": true,
"jpg": true,
"png": true,
"tif": false,
"wdp": false
};
var browser = $JssorBrowser$.$UNKNOWN;
var browserRuntimeVersion = 0;
var browserEngineVersion = 0;
var browserJavascriptVersion = 0;
var webkitVersion = 0;
var app = navigator.appName;
var ver = navigator.appVersion;
var ua = navigator.userAgent;
var urlParams = {};
function DetectBrowser() {
if (!browser) {
if (app == "Microsoft Internet Explorer" &&
!!window.attachEvent && !!window.ActiveXObject) {
var ieOffset = ua.indexOf("MSIE");
browser = $JssorBrowser$.$IE;
browserEngineVersion = parseFloat(ua.substring(ieOffset + 5, ua.indexOf(";", ieOffset)));
//check IE javascript version
/*@cc_on
browserJavascriptVersion = @_jscript_version;
@*/
// update: for intranet sites and compat view list sites, IE sends
// an IE7 User-Agent to the server to be interoperable, and even if
// the page requests a later IE version, IE will still report the
// IE7 UA to JS. we should be robust to self.
//var docMode = document.documentMode;
//if (typeof docMode !== "undefined") {
// browserRuntimeVersion = docMode;
//}
browserRuntimeVersion = document.documentMode || browserEngineVersion;
}
else if (app == "Netscape" && !!window.addEventListener) {
var ffOffset = ua.indexOf("Firefox");
var saOffset = ua.indexOf("Safari");
var chOffset = ua.indexOf("Chrome");
var webkitOffset = ua.indexOf("AppleWebKit");
if (ffOffset >= 0) {
browser = $JssorBrowser$.$FIREFOX;
browserRuntimeVersion = parseFloat(ua.substring(ffOffset + 8));
}
else if (saOffset >= 0) {
var slash = ua.substring(0, saOffset).lastIndexOf("/");
browser = (chOffset >= 0) ? $JssorBrowser$.$CHROME : $JssorBrowser$.$SAFARI;
browserRuntimeVersion = parseFloat(ua.substring(slash + 1, saOffset));
}
if (webkitOffset >= 0)
webkitVersion = parseFloat(ua.substring(webkitOffset + 12));
}
else {
var match = /(opera)(?:.*version|)[ \/]([\w.]+)/i.exec(ua);
if (match) {
browser = $JssorBrowser$.$OPERA;
browserRuntimeVersion = parseFloat(match[2]);
}
}
}
}
function IsBrowserIE() {
DetectBrowser();
return browser == $ROWSER_IE$;
}
function IsBrowserIeQuirks() {
return IsBrowserIE() && (browserRuntimeVersion < 6 || document.compatMode == "BackCompat"); //Composite to "CSS1Compat"
}
function IsBrowserFireFox() {
DetectBrowser();
return browser == $ROWSER_FIREFOX$;
}
function IsBrowserSafari() {
DetectBrowser();
return browser == $ROWSER_SAFARI$;
}
function IsBrowserChrome() {
DetectBrowser();
return browser == $ROWSER_CHROME$;
}
function IsBrowserOpera() {
DetectBrowser();
return browser == $ROWSER_OPERA$;
}
function IsBrowserBadTransform() {
return IsBrowserSafari() && (webkitVersion > 534) && (webkitVersion < 535);
}
function IsBrowserSafeHWA() {
return IsBrowserSafari() && (webkitVersion < 535);
}
function IsBrowserIe9Earlier() {
//IE 8- and chrome 1 won't fade well
return IsBrowserIE() && browserRuntimeVersion < 9; // || (IsBrowserChrome() && browserRuntimeVersion < 2);
}
var _TransformProperty;
function GetTransformProperty(elmt) {
if (!_TransformProperty) {
// Note that in some versions of IE9 it is critical that
// msTransform appear in this list before MozTransform
each(['transform', 'WebkitTransform', 'msTransform', 'MozTransform', 'OTransform'], function (property) {
if (!self.$IsUndefined(elmt.style[property])) {
_TransformProperty = property;
return true;
}
});
_TransformProperty = _TransformProperty || "transform";
}
return _TransformProperty;
}
// Constructor
{
//Ignore urlParams
// // Url parameters
// var query = window.location.search.substring(1); // ignore '?'
// var parts = query.split('&');
// for (var i = 0; i < parts.length; i++) {
// var part = parts[i];
// var sep = part.indexOf('=');
// if (sep > 0) {
// urlParams[part.substring(0, sep)] =
// decodeURIComponent(part.substring(sep + 1));
// }
// }
// Browser behaviors
}
// Helpers
function getOffsetParent(elmt, isFixed) {
// IE and Opera "fixed" position elements don't have offset parents.
// regardless, if it's fixed, its offset parent is the body.
if (isFixed && elmt != document.body) {
return document.body;
} else {
return elmt.offsetParent;
}
}
function toString(obj) {
return Object.prototype.toString.call(obj);
}
// [[Class]] -> type pairs
var class2type;
function each(object, callback) {
if (toString(object) == "[object Array]") {
for (var i = 0; i < object.length; i++) {
if (callback(object[i], i, object)) {
break;
}
}
} else {
for (var name in object) {
if (callback(object[name], name, object)) {
break;
}
}
}
}
function GetClass2Type() {
if (!class2type) {
class2type = {};
each(["Boolean", "Number", "String", "Function", "Array", "Date", "RegExp", "Object"], function (name) {
class2type["[object " + name + "]"] = name.toLowerCase();
});
}
return class2type;
}
function type(obj) {
return obj == null ? String(obj) : GetClass2Type()[toString(obj)] || "object";
}
function isPlainObject(obj) {
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if (!obj || type(obj) !== "object" || obj.nodeType || self.$IsWindow(obj)) {
return false;
}
var hasOwn = Object.prototype.hasOwnProperty;
try {
// Not own constructor property must be Object
if (obj.constructor &&
!hasOwn.call(obj, "constructor") &&
!hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
return false;
}
} catch (e) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
var key;
for (key in obj) { }
return key === undefined || hasOwn.call(obj, key);
}
function Delay(code, delay) {
setTimeout(code, delay || 0);
}
function RemoveByReg(str, reg) {
var m = reg.exec(str);
if (m) {
var header = str.substr(0, m.index);
var tailer = str.substr(m.lastIndex + 1, str.length - (m.lastIndex + 1));
str = header + tailer;
}
return str;
}
function BuildNewCss(oldCss, removeRegs, replaceValue) {
var css = (!oldCss || oldCss == "inherit") ? "" : oldCss;
each(removeRegs, function (removeReg) {
var m = removeReg.exec(css);
if (m) {
var header = css.substr(0, m.index);
var tailer = css.substr(m.lastIndex + 1, css.length - (m.lastIndex + 1));
css = header + tailer;
}
});
css = replaceValue + (css.indexOf(" ") != 0 ? " " : "") + css;
return css;
}
function SetStyleFilterIE(elmt, value) {
if (browserRuntimeVersion < 9) {
elmt.style.filter = value;
}
}
function SetStyleMatrixIE(elmt, matrix, offset) {
//matrix is not for ie9+ running in ie8- mode
if (browserJavascriptVersion < 9) {
var oldFilterValue = elmt.style.filter;
var matrixReg = new RegExp(/[\s]*progid:DXImageTransform\.Microsoft\.Matrix\([^\)]*\)/g);
var matrixValue = matrix ? "progid:DXImageTransform.Microsoft.Matrix(" + "M11=" + matrix[0][0] + ", M12=" + matrix[0][1] + ", M21=" + matrix[1][0] + ", M22=" + matrix[1][1] + ", SizingMethod='auto expand')" : "";
var newFilterValue = BuildNewCss(oldFilterValue, [matrixReg], matrixValue);
SetStyleFilterIE(elmt, newFilterValue);
self.$SetStyleMarginTop(elmt, offset.y);
self.$SetStyleMarginLeft(elmt, offset.x);
}
}
// Methods
self.$IsBrowserIE = IsBrowserIE;
self.$IsBrowserIeQuirks = IsBrowserIeQuirks;
self.$IsBrowserFireFox = IsBrowserFireFox;
self.$IsBrowserSafari = IsBrowserSafari;
self.$IsBrowserChrome = IsBrowserChrome;
self.$IsBrowserOpera = IsBrowserOpera;
self.$IsBrowserBadTransform = IsBrowserBadTransform;
self.$IsBrowserSafeHWA = IsBrowserSafeHWA;
self.$IsBrowserIe9Earlier = IsBrowserIe9Earlier;
self.$GetBrowserVersion = function () {
return browserRuntimeVersion;
};
self.$GetBrowserEngineVersion = function () {
return browserEngineVersion || browserRuntimeVersion;
};
self.$GetWebKitVersion = function () {
return webkitVersion;
};
self.$Delay = Delay;
self.$GetElement = function (elmt) {
if (self.$IsString(elmt)) {
elmt = document.getElementById(elmt);
}
return elmt;
};
self.$GetElementPosition = function (elmt) {
elmt = self.$GetElement(elmt);
var result = new $JssorPoint$();
// technique from:
// http://www.quirksmode.org/js/findpos.html
// with special check for "fixed" elements.
while (elmt) {
result.x += elmt.offsetLeft;
result.y += elmt.offsetTop;
var isFixed = self.$GetElementStyle(elmt).position == "fixed";
if (isFixed) {
result = result.$Plus(self.$GetPageScroll(window));
}
elmt = getOffsetParent(elmt, isFixed);
}
return result;
};
self.$GetElementSize = function (elmt) {
elmt = self.$GetElement(elmt);
return new $JssorPoint$(elmt.clientWidth, elmt.clientHeight);
};
self.$GetElementStyle = function (elmt) {
elmt = self.$GetElement(elmt);
if (elmt.currentStyle) {
return elmt.currentStyle;
} else if (window.getComputedStyle) {
return window.getComputedStyle(elmt, "");
} else {
$JssorDebug$.$Fail("Unknown elmt style, no known technique.");
}
};
self.$GetEvent = function (event) {
return event ? event : window.event;
};
self.$GetEventSrcElement = function (event) {
event = self.$GetEvent(event);
return event.target || event.srcElement || document;
};
self.$GetEventDstElement = function (event) {
event = self.$GetEvent(event);
return event.relatedTarget || event.toElement;
};
self.$GetMousePosition = function (event) {
event = self.$GetEvent(event);
var result = new $JssorPoint$();
// technique from:
// http://www.quirksmode.org/js/events_properties.html
if (event.type == "DOMMouseScroll" &&
IsBrowserFireFox() && browserRuntimeVersion < 3) {
// hack for FF2 which reports incorrect position for mouse scroll
result.x = event.screenX;
result.y = event.screenY;
} else if (typeof (event.pageX) == "number") {
result.x = event.pageX;
result.y = event.pageY;
} else if (typeof (event.clientX) == "number") {
result.x = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
result.y = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
} else {
$JssorDebug$.$Fail("Unknown event mouse position, no known technique.");
}
return result;
};
self.$GetMouseScroll = function (event) {
event = self.$GetEvent(event);
var delta = 0; // default value
// technique from:
// http://blog.paranoidferret.com/index.php/2007/10/31/javascript-tutorial-the-scroll-wheel/
if (typeof (event.wheelDelta) == "number") {
delta = event.wheelDelta;
} else if (typeof (event.detail) == "number") {
delta = event.detail * -1;
} else {
$JssorDebug$.$Fail("Unknown event mouse scroll, no known technique.");
}
// normalize value to [-1, 1]
return delta ? delta / Math.abs(delta) : 0;
};
self.$GetPageScroll = function (window) {
var result = new $JssorPoint$();
var docElmt = window.document.documentElement || {};
var body = window.document.body || {};
// technique from:
// http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
if (typeof (window.pageXOffset) == "number") {
// most browsers
result.x = window.pageXOffset;
result.y = window.pageYOffset;
} else if (body.scrollLeft || body.scrollTop) {
// W3C spec, IE6+ in quirks mode
result.x = body.scrollLeft;
result.y = body.scrollTop;
} else if (docElmt.scrollLeft || docElmt.scrollTop) {
// IE6+ in standards mode
result.x = docElmt.scrollLeft;
result.y = docElmt.scrollTop;
}
// note: we specifically aren't testing for typeof here, because IE sets
// the appropriate variables undefined instead of 0 under certain
// conditions. self means we also shouldn't fail if none of the three
// cases are hit; we'll just assume the page scroll is 0.
return result;
};
self.$GetWindowSize = function (window) {
var result = new $JssorPoint$();
// technique from:
// http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
// important: i originally cleaned up the second and third IE checks to
// check if the typeof was number. but self fails for quirks mode,
// because docElmt.clientWidth is indeed a number, but it's incorrectly
// zero. so no longer checking typeof is number for those cases.
//if (typeof (window.innerWidth) == 'number') {
// // non-IE browsers
// result.x = window.innerWidth;
// result.y = window.innerHeight;
//}
//else {
//jQuery way to get window size, but support ie quirks mode
var checkElement = (IsBrowserIeQuirks() ? window.document.body : window.document.documentElement);
//$JssorDebug$.$Execute(function () {
// if (!checkElement || (!checkElement.clientWidth && !checkElement.clientHeight))
// $JssorDebug$.$Fail("Unknown window size, no known technique.");
//});
result.x = checkElement.clientWidth;
result.y = checkElement.clientHeight;
//}
return result;
};
//self.$ImageFormatSupported = function (ext) {
// var ext = ext ? ext : "";
// return !!supportedImageFormats[ext.toLowerCase()];
//};
//self.$MakeCenteredNode = function (elmt) {
// elmt = $JssorUtils$.$GetElement(elmt);
// var div = self.$MakeNeutralElement("div");
// var html = [];
// // technique for vertically centering (in IE!!!) from:
// // http://www.jakpsatweb.cz/css/css-vertical-center-solution.html
// // with explicit neutralizing of styles added by me.
// html.push('
');
// // the text-align:left guards against incorrect centering in IE
// html.push('
');
// div.innerHTML = html.join('');
// div = div.firstChild;
// // now add the elmt as a child to the inner-most div
// var innerDiv = div;
// var innerDivs = div.getElementsByTagName("div");
// while (innerDivs.length > 0) {
// innerDiv = innerDivs[0];
// innerDivs = innerDiv.getElementsByTagName("div");
// }
// innerDiv.appendChild(elmt);
// return div;
//};
//self.$MakeNeutralElement = function (tagName) {
// var elmt = self.$CreateElement(tagName);
// var style = elmt.style;
// // TODO reset neutral elmt's style in a better way
// style.background = "transparent none";
// style.border = "none";
// style.margin = "0px";
// style.padding = "0px";
// style.position = "static";
// return elmt;
//};
//self.$MakeTransparentImage = function (src) {
// var img = self.$MakeNeutralElement("img");
// var elmt = null;
// if (IsBrowserIE() && browserRuntimeVersion < 7) {
// elmt = self.$MakeNeutralElement("span");
// elmt.style.display = "inline-block";
// // to size span correctly, load image and get natural size,
// // but don't override any user-set CSS values
// img.onload = function () {
// elmt.style.width = elmt.style.width || img.width + "px";
// elmt.style.height = elmt.style.height || img.height + "px";
// img.onload = null;
// img = null; // to prevent memory leaks in IE
// };
// img.src = src;
// elmt.style.filter =
// "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" +
// src + "', sizingMethod='scale')";
// } else {
// elmt = img;
// elmt.src = src;
// }
// return elmt;
//};
//self.$MakeAjaxRequest = function (url, callback) {
// var async = typeof (callback) == "function";
// var req = null;
// if (async) {
// var actual = callback;
// var callback = function () {
// Delay($JssorUtils$.$CreateCallback(null, actual, req), 1);
// };
// }
// if (window.ActiveXObject) {
// for (var i = 0; i < arrActiveX.length; i++) {
// try {
// req = new ActiveXObject(arrActiveX[i]);
// break;
// } catch (e) {
// continue;
// }
// }
// } else if (window.XMLHttpRequest) {
// req = new XMLHttpRequest();
// }
// if (!req) {
// $JssorDebug$.$Fail("Browser doesn't support XMLHttpRequest.");
// }
// if (async) {
// req.onreadystatechange = function () {
// if (req.readyState == 4) {
// // prevent memory leaks by breaking circular reference now
// req.onreadystatechange = new Function();
// callback();
// }
// };
// }
// try {
// req.open("GET", url, async);
// req.send(null);
// } catch (e) {
// $JssorDebug$.$Log(e.name + " while making AJAX request: " + e.message);
// req.onreadystatechange = null;
// req = null;
// if (async) {
// callback();
// }
// }
// return async ? null : req;
//};
//self.$ParseXml = function (string) {
// var xmlDoc = null;
// if (window.ActiveXObject) {
// try {
// xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
// xmlDoc.async = false;
// xmlDoc.loadXML(string);
// } catch (e) {
// $JssorDebug$.$Log(e.name + " while parsing XML (ActiveX): " + e.message);
// }
// } else if (window.DOMParser) {
// try {
// var parser = new DOMParser();
// xmlDoc = parser.parseFromString(string, "text/xml");
// } catch (e) {
// $JssorDebug$.$Log(e.name + " while parsing XML (DOMParser): " + e.message);
// }
// } else {
// $JssorDebug$.$Fail("Browser doesn't support XML DOM.");
// }
// return xmlDoc;
//};
//self.$GetUrlParameter = function (key) {
// var value = urlParams[key];
// return value ? value : null;
//};
self.$GetStyleOpacity = function (elmt) {
if (IsBrowserIE() && browserEngineVersion < 9) {
var match = /opacity=([^)]*)/.exec(elmt.style.filter || "");
return match ? (parseFloat(match[1]) / 100) : 1;
}
else
return parseFloat(elmt.style.opacity || "1");
};
self.$SetStyleOpacity = self.$setElementOpacity = function (elmt, opacity, ie9EarlierForce) {
if (IsBrowserIE() && browserEngineVersion < 9) {
//var filterName = "filter"; // browserEngineVersion < 8 ? "filter" : "-ms-filter";
var finalFilter = elmt.style.filter || "";
// for CSS filter browsers (IE), remove alpha filter if it's unnecessary.
// update: doing self always since IE9 beta seems to have broken the
// behavior if we rely on the programmatic filters collection.
var alphaReg = new RegExp(/[\s]*alpha\([^\)]*\)/g);
// important: note the lazy star! self protects against
// multiple filters; we don't want to delete the other ones.
// update: also trimming extra whitespace around filter.
var ieOpacity = Math.round(100 * opacity);
var alphaFilter = "";
if (ieOpacity < 100 || ie9EarlierForce) {
alphaFilter = "alpha(opacity=" + ieOpacity + ") ";
//elmt.style["-ms-filter"] = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + ieOpacity + ") ";
}
var newFilterValue = BuildNewCss(finalFilter, [alphaReg], alphaFilter);
SetStyleFilterIE(elmt, newFilterValue);
}
//if (!IsBrowserIE() || browserEngineVersion >= 9)
else {
elmt.style.opacity = opacity == 1 ? "" : Math.round(opacity * 100) / 100;
}
};
function SetStyleTransformInternal(elmt, transform) {
var rotate = transform.$Rotate || 0;
var scale = transform.$Scale || 1;
if (IsBrowserIe9Earlier()) {
var matrix = self.$CreateMatrix(rotate / 180 * Math.PI, scale, scale);
SetStyleMatrixIE(elmt, (!rotate && scale == 1) ? null : matrix, self.$GetMatrixOffset(matrix, transform.$OriginalWidth, transform.$OriginalHeight));
}
else {
//rotate(15deg) scale(.5) translateZ(0)
var transformProperty = GetTransformProperty(elmt);
if (transformProperty) {
var transformValue = "rotate(" + rotate % 360 + "deg) scale(" + scale + ")";
if ($JssorUtils$.$IsBrowserChrome() && webkitVersion > 535)
transformValue += " perspective(2000px)";
elmt.style[transformProperty] = transformValue;
}
}
}
self.$SetStyleTransform = function (elmt, transform) {
if (IsBrowserBadTransform()) {
Delay(self.$CreateCallback(null, SetStyleTransformInternal, elmt, transform));
}
else {
SetStyleTransformInternal(elmt, transform);
}
};
self.$SetStyleTransformOrigin = function (elmt, transformOrigin) {
var transformProperty = GetTransformProperty(elmt);
if (transformProperty)
elmt.style[transformProperty + "Origin"] = transformOrigin;
};
self.$SetStyleScale = function (elmt, scale) {
if (IsBrowserIE() && browserEngineVersion < 9 || (browserEngineVersion < 10 && IsBrowserIeQuirks())) {
elmt.style.zoom = (scale == 1) ? "" : scale;
}
else {
var transformProperty = GetTransformProperty(elmt);
if (transformProperty) {
//rotate(15deg) scale(.5)
var transformValue = "scale(" + scale + ")";
var oldTransformValue = elmt.style[transformProperty];
var scaleReg = new RegExp(/[\s]*scale\(.*?\)/g);
var newTransformValue = BuildNewCss(oldTransformValue, [scaleReg], transformValue);
elmt.style[transformProperty] = newTransformValue;
}
}
};
self.$EnableHWA = function (elmt) {
if (!elmt.style[GetTransformProperty(elmt)] || elmt.style[GetTransformProperty(elmt)] == "none")
elmt.style[GetTransformProperty(elmt)] = "perspective(2000px)";
};
self.$DisableHWA = function (elmt) {
//if (force || elmt.style[GetTransformProperty(elmt)] == "perspective(2000px)")
elmt.style[GetTransformProperty(elmt)] = "none";
};
self.$GetStyleFloat = function (elmt) {
return IsBrowserIE() ? elmt.style.styleFloat : elmt.style.cssFloat;
};
self.$SetStyleFloat = function (elmt, float) {
if (IsBrowserIE())
elmt.style.styleFloat = float;
else
elmt.style.cssFloat = float;
};
var ie8OffsetWidth = 0;
var ie8OffsetHeight = 0;
var ie8WindowResizeCallbackHandlers;
//var ie8LastVerticalScrollbar;
//var toggleInfo = "";
function Ie8WindowResizeFilter(window) {
var trigger = true;
var checkElement = (IsBrowserIeQuirks() ? window.document.body : window.document.documentElement);
if (checkElement) {
//check vertical bar
//var hasVerticalBar = checkElement.scrollHeight > checkElement.clientHeight;
//var verticalBarToggle = hasVerticalBar != ie8LastVerticalScrollbar;
//ie8LastVerticalScrollbar = hasVerticalBar;
var widthChange = checkElement.offsetWidth - ie8OffsetWidth;
var heightChange = checkElement.offsetHeight - ie8OffsetHeight;
if (widthChange || heightChange) {
ie8OffsetWidth += widthChange;
ie8OffsetHeight += heightChange;
}
else
trigger = false;
}
trigger && each(ie8WindowResizeCallbackHandlers, function (handler) {
handler();
});
}
self.$OnWindowResize = function (window, handler) {
if (IsBrowserIE() && browserEngineVersion < 9) {
if (!ie8WindowResizeCallbackHandlers) {
ie8WindowResizeCallbackHandlers = [handler];
handler = self.$CreateCallback(null, Ie8WindowResizeFilter, window);
}
else {
ie8WindowResizeCallbackHandlers.push(handler);
return;
}
}
self.$AddEvent(window, "resize", handler);
};
self.$AddEvent = function (elmt, eventName, handler, useCapture) {
elmt = self.$GetElement(elmt);
// technique from:
// http://blog.paranoidferret.com/index.php/2007/08/10/javascript-working-with-events/
if (elmt.addEventListener) {
if (eventName == "mousewheel") {
elmt.addEventListener("DOMMouseScroll", handler, useCapture);
}
// we are still going to add the mousewheel -- not a mistake!
// self is for opera, since it uses onmousewheel but needs addEventListener.
elmt.addEventListener(eventName, handler, useCapture);
}
else if (elmt.attachEvent) {
elmt.attachEvent("on" + eventName, handler);
if (useCapture && elmt.setCapture) {
elmt.setCapture();
}
}
$JssorDebug$.$Execute(function () {
if (!elmt.addEventListener && !elmt.attachEvent) {
$JssorDebug$.$Fail("Unable to attach event handler, no known technique.");
}
});
};
self.$RemoveEvent = function (elmt, eventName, handler, useCapture) {
elmt = self.$GetElement(elmt);
// technique from:
// http://blog.paranoidferret.com/index.php/2007/08/10/javascript-working-with-events/
if (elmt.removeEventListener) {
if (eventName == "mousewheel") {
elmt.removeEventListener("DOMMouseScroll", handler, useCapture);
}
// we are still going to remove the mousewheel -- not a mistake!
// self is for opera, since it uses onmousewheel but needs removeEventListener.
elmt.removeEventListener(eventName, handler, useCapture);
}
else if (elmt.detachEvent) {
elmt.detachEvent("on" + eventName, handler);
if (useCapture && elmt.releaseCapture) {
elmt.releaseCapture();
}
}
$JssorDebug$.$Execute(function () {
if (!elmt.removeEventListener && !elmt.detachEvent) {
$JssorDebug$.$Fail("Unable to detach event handler, no known technique.");
}
});
};
self.$FireEvent = function (elmt, eventName) {
//var document = elmt.document;
$JssorDebug$.$Execute(function () {
if (!document.createEvent && !document.createEventObject) {
$JssorDebug$.$Fail("Unable to fire event, no known technique.");
}
if (!elmt.dispatchEvent && !elmt.fireEvent) {
$JssorDebug$.$Fail("Unable to fire event, no known technique.");
}
});
var evento;
if (document.createEvent) {
evento = document.createEvent("HTMLEvents");
evento.initEvent(eventName, false, false);
elmt.dispatchEvent(evento);
}
else {
var ieEventName = "on" + eventName;
evento = document.createEventObject();
//event.eventType = ieEventName;
//event.eventName = ieEventName;
elmt.fireEvent(ieEventName, evento);
}
};
self.$AddEventBrowserMouseUp = function (handler, userCapture) {
self.$AddEvent((IsBrowserIe9Earlier()) ? document : window, "mouseup", handler, userCapture);
};
self.$RemoveEventBrowserMouseUp = function (handler, userCapture) {
self.$RemoveEvent((IsBrowserIe9Earlier()) ? document : window, "mouseup", handler, userCapture);
};
self.$AddEventBrowserMouseDown = function (handler, userCapture) {
self.$AddEvent((IsBrowserIe9Earlier()) ? document : window, "mousedown", handler, userCapture);
};
self.$RemoveEventBrowserMouseDown = function (handler, userCapture) {
self.$RemoveEvent((IsBrowserIe9Earlier()) ? document : window, "mousedown", handler, userCapture);
};
self.$CancelEvent = function (event) {
event = self.$GetEvent(event);
// technique from:
// http://blog.paranoidferret.com/index.php/2007/08/10/javascript-working-with-events/
if (event.preventDefault) {
event.preventDefault(); // W3C for preventing default
}
event.cancel = true; // legacy for preventing default
event.returnValue = false; // IE for preventing default
};
self.$StopEvent = function (event) {
event = self.$GetEvent(event);
// technique from:
// http://blog.paranoidferret.com/index.php/2007/08/10/javascript-working-with-events/
if (event.stopPropagation) {
event.stopPropagation(); // W3C for stopping propagation
}
event.cancelBubble = true; // IE for stopping propagation
};
self.$CreateCallback = function (object, method) {
// create callback args
var initialArgs = [];
for (var i = 2; i < arguments.length; i++) {
initialArgs.push(arguments[i]);
}
// create closure to apply method
var callback = function () {
// concatenate new args, but make a copy of initialArgs first
var args = initialArgs.concat([]);
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
return method.apply(object, args);
};
$JssorDebug$.$LiveStamp(callback, "callback_" + ($JssorUtils$.$GetNow() & 11111111));
return callback;
};
var _Freeer;
self.$FreeElement = function (elmt) {
if (!_Freeer)
_Freeer = self.$CreateDivElement();
if (elmt) {
$JssorUtils$.$AppendChild(_Freeer, elmt);
$JssorUtils$.$ClearInnerHtml(_Freeer);
}
};
self.$SetInnerText = function (elmt, text) {
var textNode = document.createTextNode(text);
self.$ClearInnerHtml(elmt);
elmt.appendChild(textNode);
};
self.$GetInnerText = function (elmt) {
return elmt.textContent || elmt.innerText;
};
self.$GetInnerHtml = function (elmt) {
return elmt.innerHTML;
};
self.$SetInnerHtml = function (elmt, html) {
elmt.innerHTML = html;
};
self.$ClearInnerHtml = function (elmt) {
elmt.innerHTML = "";
};
self.$EncodeHtml = function (text) {
var div = self.$CreateDivElement();
self.$SetInnerText(div, text);
return self.$GetInnerHtml(div);
};
self.$DecodeHtml = function (html) {
var div = self.$CreateDivElement();
self.$SetInnerHtml(div, html);
return self.$GetInnerText(div);
};
self.$SelectElement = function (elmt) {
var userSelection;
if (window.getSelection) {
//W3C default
userSelection = window.getSelection();
}
var theRange = null;
if (document.createRange) {
theRange = document.createRange();
theRange.selectNode(elmt);
}
else {
theRange = document.body.createTextRange();
theRange.moveToElementText(elmt);
theRange.select();
}
//set user selection
if (userSelection)
userSelection.addRange(theRange);
};
self.$DeselectElements = function () {
if (document.selection) {
document.selection.empty();
} else if (window.getSelection) {
window.getSelection().removeAllRanges();
}
};
self.$GetChildren = function (elmt) {
var children = [];
for (var tmpEl = elmt.firstChild; tmpEl; tmpEl = tmpEl.nextSibling) {
if (tmpEl.nodeType == 1) {
children.push(tmpEl);
}
}
return children;
};
function FindFirstChildByAttribute(elmt, attrValue, attrName, deep) {
if (!attrName)
attrName = "u";
for (elmt = elmt ? elmt.firstChild : null; elmt; elmt = elmt.nextSibling) {
if (elmt.nodeType == 1) {
if (elmt.getAttribute(attrName) == attrValue)
return elmt;
if (deep) {
var childRet = FindFirstChildByAttribute(elmt, attrValue, attrName, deep);
if (childRet)
return childRet;
}
}
}
}
self.$FindFirstChildByAttribute = FindFirstChildByAttribute;
function FindChildrenByAttribute(elmt, attrValue, attrName, deep) {
if (!attrName)
attrName = "u";
var ret = [];
for (elmt = elmt ? elmt.firstChild : null; elmt; elmt = elmt.nextSibling) {
if (elmt.nodeType == 1) {
if (elmt.getAttribute(attrName) == attrValue)
ret.push(elmt);
if (deep) {
var childRet = FindChildrenByAttribute(elmt, attrValue, attrName, deep);
if (childRet.length)
ret = ret.concat(childRet);
}
}
}
return ret;
}
self.$FindChildrenByAttribute = FindChildrenByAttribute;
function FindFirstChildByTag(elmt, tagName, deep) {
for (elmt = elmt ? elmt.firstChild : null; elmt; elmt = elmt.nextSibling) {
if (elmt.nodeType == 1) {
if (elmt.tagName == tagName)
return elmt;
if (deep) {
var childRet = FindFirstChildByTag(elmt, tagName, deep);
if (childRet)
return childRet;
}
}
}
}
self.$FindFirstChildByTag = FindFirstChildByTag;
function FindChildrenByTag(elmt, tagName, deep) {
var ret = [];
for (elmt = elmt ? elmt.firstChild : null; elmt; elmt = elmt.nextSibling) {
if (elmt.nodeType == 1) {
if (!tagName || elmt.tagName == tagName)
ret.push(elmt);
if (deep) {
var childRet = FindChildrenByTag(elmt, tagName, true);
if (childRet.length)
ret = ret.concat(childRet);
}
}
}
return ret;
}
self.$FindChildrenByTag = FindChildrenByTag;
self.$GetElementsByTagName = function (elmt, tagName) {
return elmt.getElementsByTagName(tagName);
};
self.$Extend = function (target) {
for (var i = 1; i < arguments.length; i++) {
var options = arguments[i];
// Only deal with non-null/undefined values
if (options) {
// Extend the base object
for (var name in options) {
target[name] = options[name];
}
}
}
// Return the modified object
return target;
};
self.$Unextend = function (target, options) {
$JssorDebug$.$Assert(options);
var unextended = {};
// Extend the base object
for (var name in target) {
if (target[name] != options[name]) {
unextended[name] = target[name];
}
}
// Return the modified object
return unextended;
};
self.$IsUndefined = function (obj) {
return type(obj) == "undefined";
};
self.$IsFunction = function (obj) {
return type(obj) == "function";
};
self.$IsArray = Array.isArray || function (obj) {
return type(obj) == "array";
};
self.$IsString = function (obj) {
return type(obj) == "string";
};
self.$IsNumeric = function (obj) {
return !isNaN(parseFloat(obj)) && isFinite(obj);
};
self.$IsWindow = function (obj) {
return obj != null && obj == obj.window;
};
self.$Type = type;
// args is for internal usage only
self.$Each = each;
self.$IsPlainObject = isPlainObject;
self.$CreateDivElement = function (doc) {
return self.$CreateElement("DIV", doc);
};
self.$CreateSpanElement = function (doc) {
return self.$CreateElement("SPAN", doc);
};
self.$CreateElement = function (tagName, doc) {
doc = doc || document;
return doc.createElement(tagName);
};
self.$EmptyFunction = function () { };
self.$GetAttribute = function (elmt, name) {
return elmt.getAttribute(name);
};
self.$SetAttribute = function (elmt, name, value) {
elmt.setAttribute(name, value);
};
self.$GetClassName = function (elmt) {
return elmt.className;
};
self.$SetClassName = function (elmt, className) {
elmt.className = className ? className : "";
};
self.$GetStyleCursor = function (elmt) {
return elmt.style.cursor;
};
self.$SetStyleCursor = function (elmt, cursor) {
elmt.style.cursor = cursor;
};
self.$GetStyleDisplay = function (elmt) {
return elmt.style.display;
};
self.$SetStyleDisplay = function (elmt, display) {
elmt.style.display = display || "";
};
self.$GetStyleOverflow = function (elmt) {
return elmt.style.overflow;
};
self.$SetStyleOverflow = function (elmt, overflow) {
elmt.style.overflow = overflow;
};
self.$GetStyleOverflowX = function (elmt) {
return elmt.style.overflowX;
};
self.$SetStyleOverflowX = function (elmt, overflow) {
elmt.style.overflowX = overflow;
};
self.$GetStyleOverflowY = function (elmt) {
return elmt.style.overflowY;
};
self.$SetStyleOverflowY = function (elmt, overflow) {
elmt.style.overflowY = overflow;
};
self.$GetParentNode = function (elmt) {
return elmt.parentNode;
};
self.$HideElement = function (elmt) {
self.$SetStyleDisplay(elmt, "none");
};
self.$HideElements = function (elmts) {
for (var i = 0; i < elmts.length; i++) {
self.$HideElement(elmts[i]);
}
};
self.$ShowElement = function (elmt, show) {
self.$SetStyleDisplay(elmt, show == false ? "none" : "");
};
self.$ShowElements = function (elmts) {
for (var i = 0; i < elmts.length; i++) {
self.$ShowElement(elmts[i]);
}
};
self.$GetStylePosition = function (elmt) {
return elmt.style.position;
};
self.$SetStylePosition = function (elmt, position) {
elmt.style.position = position;
};
self.$GetStyleTop = function (elmt) {
return parseInt(elmt.style.top, 10);
};
self.$SetStyleTop = function (elmt, top) {
elmt.style.top = top + "px";
};
self.$GetStyleRight = function (elmt) {
return parseInt(elmt.style.right, 10);
};
self.$SetStyleRight = function (elmt, right) {
elmt.style.right = right + "px";
};
self.$GetStyleBottom = function (elmt) {
return parseInt(elmt.style.bottom, 10);
};
self.$SetStyleBottom = function (elmt, bottom) {
elmt.style.bottom = bottom + "px";
};
self.$GetStyleLeft = function (elmt) {
return parseInt(elmt.style.left, 10);
};
self.$SetStyleLeft = function (elmt, left) {
elmt.style.left = left + "px";
};
self.$GetStyleWidth = function (elmt) {
return parseInt(elmt.style.width, 10);
};
self.$SetStyleWidth = function (elmt, width) {
elmt.style.width = Math.max(width, 0) + "px";
};
self.$GetStyleHeight = function (elmt) {
return parseInt(elmt.style.height, 10);
};
self.$SetStyleHeight = function (elmt, height) {
elmt.style.height = Math.max(height, 0) + "px";
};
self.$GetStyleCssText = function (elmt) {
return elmt.style.cssText;
};
self.$SetStyleCssText = function (elmt, cssText) {
elmt.style.cssText = cssText;
};
self.$RemoveAttribute = function (elmt, attrbuteName) {
elmt.removeAttribute(attrbuteName);
};
self.$GetBorderWidth = function (elmt) {
return parseInt(elmt.style.borderWidth, 10);
};
self.$SetBorderWdith = function (elmt, width) {
elmt.style.width = width + "px";
};
self.$GetStyleMarginLeft = function (elmt) {
return parseInt(elmt.style.marginLeft, 10) || 0;
};
self.$SetStyleMarginLeft = function (elmt, marginLeft) {
elmt.style.marginLeft = marginLeft + "px";
};
self.$GetStyleMarginTop = function (elmt) {
return parseInt(elmt.style.marginTop, 10) || 0;
};
self.$SetStyleMarginTop = function (elmt, marginTop) {
elmt.style.marginTop = marginTop + "px";
};
self.$GetStyleMarginBottom = function (elmt) {
return parseInt(elmt.style.marginBottom, 10) || 0;
};
self.$SetStyleMarginBottom = function (elmt, marginBottom) {
elmt.style.marginBottom = marginBottom + "px";
};
self.$GetStyleMarginRight = function (elmt) {
return parseInt(elmt.style.marginRight, 10) || 0;
};
self.$SetStyleMarginRight = function (elmt, marginRight) {
elmt.style.marginRight = marginRight + "px";
};
self.$GetStyleBorder = function (elmt) {
return elmt.style.border;
};
self.$SetStyleBorder = function (elmt, border) {
elmt.style.border = border;
};
self.$GetStyleBorderWidth = function (elmt) {
return parseInt(elmt.style.borderWidth);
};
self.$SetStyleBorderWidth = function (elmt, borderWidth) {
elmt.style.borderWidth = borderWidth + "px";
};
self.$GetStyleBorderStyle = function (elmt) {
return elmt.style.borderStyle;
};
self.$SetStyleBorderStyle = function (elmt, borderStyle) {
elmt.style.borderStyle = borderStyle;
};
self.$GetStyleBorderColor = function (elmt) {
return elmt.style.borderColor;
};
self.$SetStyleBorderColor = function (elmt, borderColor) {
elmt.style.borderColor = borderColor;
};
self.$GetStyleVibility = function (elmt) {
return elmt.style.vibility;
};
self.$SetStyleVisibility = function (elmt, visibility) {
elmt.style.visibility = visibility;
};
self.$GetStyleZIndex = function (elmt) {
return parseInt(elmt.style.zIndex) || 0;
};
self.$SetStyleZIndex = function (elmt, zIndex) {
elmt.style.zIndex = Math.ceil(zIndex);
};
self.$GetStyleBackgroundColor = function (elmt) {
return elmt.style.backgroundColor;
};
self.$SetStyleBackgroundColor = function (elmt, backgroundColor) {
elmt.style.backgroundColor = backgroundColor;
};
self.$GetStyleColor = function (elmt) {
return elmt.style.color;
};
self.$SetStyleColor = function (elmt, color) {
elmt.style.color = color;
};
self.$GetStyleBackgroundImage = function (elmt) {
return elmt.style.backgroundImage;
};
self.$SetStyleBackgroundImage = function (elmt, backgroundImage) {
elmt.style.backgroundImage = backgroundImage;
};
self.$CanClearClip = function () {
//return !IsBrowserIE() || browserEngineVersion > 9 || (browserRuntimeVersion > 7 && !IsBrowserIeQuirks());
return IsBrowserIE() && browserRuntimeVersion < 10;
};
self.$SetStyleClip = function (elmt, clip) {
if (clip) {
elmt.style.clip = "rect(" + Math.round(clip.$Top) + "px " + Math.round(clip.$Right) + "px " + Math.round(clip.$Bottom) + "px " + Math.round(clip.$Left) + "px)";
}
else {
var cssText = self.$GetStyleCssText(elmt);
var clipRegs = [
new RegExp(/[\s]*clip: rect\(.*?\)[;]?/i),
new RegExp(/[\s]*cliptop: .*?[;]?/i),
new RegExp(/[\s]*clipright: .*?[;]?/i),
new RegExp(/[\s]*clipbottom: .*?[;]?/i),
new RegExp(/[\s]*clipleft: .*?[;]?/i)
];
var newCssText = BuildNewCss(cssText, clipRegs, "");
$JssorUtils$.$SetStyleCssText(elmt, newCssText);
}
};
self.$GetStyleZoom = function (elmt) {
return elmt.style.zoom;
};
self.$SetStyleZoom = function (elmt, zoom) {
return elmt.style.zoom = zoom;
};
self.$SetStyleClear = function (elmt, clear) {
elmt.style.clear = clear;
};
self.$GetNow = function () {
return new Date().getTime();
};
self.$AppendChild = function (elmt, child) {
elmt.appendChild(child);
};
self.$AppendChildren = function (elmt, children) {
each(children, function (child) {
self.$AppendChild(elmt, child);
});
};
self.$InsertBefore = function (elmt, child, refObject) {
elmt.insertBefore(child, refObject);
};
self.$InsertAdjacentHtml = function (elmt, where, text) {
elmt.insertAdjacentHTML(where, text);
};
self.$RemoveChild = function (elmt, child) {
elmt.removeChild(child);
};
self.$RemoveChildren = function (elmt, children) {
each(children, function (child) {
self.$RemoveChild(elmt, child);
});
};
self.$ClearChildren = function (elmt) {
self.$RemoveChildren(elmt, self.$GetChildren(elmt));
};
self.$ParseInt = function (str, radix) {
return parseInt(str, radix || 10);
};
self.$ParseFloat = function (str) {
return parseFloat(str);
};
self.$IsChild = function (elmtA, elmtB) {
var body = document.body;
while (elmtB && elmtA != elmtB && body != elmtB) {
try {
elmtB = elmtB.parentNode;
} catch (e) {
// Firefox sometimes fires events for XUL elements, which throws
// a "permission denied" error. so this is not a child.
return false;
}
}
return elmtA == elmtB;
};
self.$ToLowerCase = function (value) {
if (value)
value = value.toLowerCase();
return value;
};
self.$CloneNode = function (elmt, deep) {
return elmt.cloneNode(deep);
};
function LoadImageCallback(callback, image, abort) {
//$JssorDebug$.$Execute(function () {
// Delay(self.$CreateCallback(null, function () {
// callback && callback(image, abort);
// }), 10000);
//});
image.onload = null;
image.abort = null;
if (callback)
callback(image, abort);
}
self.$LoadImage = function (src, callback) {
if (self.$IsBrowserOpera() && browserRuntimeVersion < 11.6 || !src) {
LoadImageCallback(callback, null);
}
else {
var image = new Image();
image.onload = self.$CreateCallback(null, LoadImageCallback, callback, image);
image.onabort = self.$CreateCallback(null, LoadImageCallback, callback, image, true);
image.src = src;
}
};
self.$LoadImages = function (imageElmts, mainImageElmt, callback) {
var _ImageLoading = imageElmts.length + 1;
function LoadImageCompleteEventHandler(image, abort) {
_ImageLoading--;
if (mainImageElmt && image && image.src == mainImageElmt.src)
mainImageElmt = image;
!_ImageLoading && callback && callback(mainImageElmt);
}
$JssorUtils$.$Each(imageElmts, function (imageElmt) {
$JssorUtils$.$LoadImage(imageElmt.src, LoadImageCompleteEventHandler);
});
LoadImageCompleteEventHandler();
};
self.$BuildElement = function (template, tagName, replacer, createCopy) {
if (createCopy)
template = $JssorUtils$.$CloneNode(template, true);
var templateHolders = $JssorUtils$.$GetElementsByTagName(template, tagName);
for (var j = templateHolders.length - 1; j > -1; j--) {
var templateHolder = templateHolders[j];
var replaceItem = $JssorUtils$.$CloneNode(replacer, true);
$JssorUtils$.$SetClassName(replaceItem, $JssorUtils$.$GetClassName(templateHolder));
$JssorUtils$.$SetStyleCssText(replaceItem, $JssorUtils$.$GetStyleCssText(templateHolder));
var thumbnailPlaceHolderParent = $JssorUtils$.$GetParentNode(templateHolder);
$JssorUtils$.$InsertBefore(thumbnailPlaceHolderParent, replaceItem, templateHolder);
$JssorUtils$.$RemoveChild(thumbnailPlaceHolderParent, templateHolder);
}
return template;
};
var _MouseDownButtons;
var _MouseOverButtons = [];
function JssorButtonEx(elmt) {
var _Self = this;
var _OriginClassName;
var _IsMouseDown; //class name 'dn'
var _IsActive; //class name 'av'
function Highlight() {
var className = _OriginClassName;
if (_IsMouseDown) {
className += 'dn';
}
else if (_IsActive) {
className += "av";
}
$JssorUtils$.$SetClassName(elmt, className);
}
function OnMouseDown(event) {
_MouseDownButtons.push(_Self);
_IsMouseDown = true;
Highlight();
}
_Self.$MouseUp = function () {
///
/// Internal member function, do not use it.
///
///
_IsMouseDown = false;
Highlight();
};
_Self.$Activate = function (activate) {
_IsActive = activate;
Highlight();
};
//JssorButtonEx Constructor
{
elmt = self.$GetElement(elmt);
if (!_MouseDownButtons) {
self.$AddEventBrowserMouseUp(function () {
var oldMouseDownButtons = _MouseDownButtons;
_MouseDownButtons = [];
each(oldMouseDownButtons, function (button) {
button.$MouseUp();
});
});
_MouseDownButtons = [];
}
_OriginClassName = self.$GetClassName(elmt);
$JssorUtils$.$AddEvent(elmt, "mousedown", OnMouseDown);
}
}
self.$Buttonize = function (elmt) {
return new JssorButtonEx(elmt);
};
var StyleGetter = {
$Opacity: self.$GetStyleOpacity,
$Top: self.$GetStyleTop,
$Left: self.$GetStyleLeft,
$Width: self.$GetStyleWidth,
$Height: self.$GetStyleHeight,
$Position: self.$GetStylePosition,
$Display: self.$GetStyleDisplay,
$ZIndex: self.$GetStyleZIndex
};
//For Compression Only
var _StyleSetterReserved = {
$Opacity: self.$SetStyleOpacity,
$Top: self.$SetStyleTop,
$Left: self.$SetStyleLeft,
$Width: self.$SetStyleWidth,
$Height: self.$SetStyleHeight,
$Display: self.$SetStyleDisplay,
$Clip: self.$SetStyleClip,
$MarginLeft: self.$SetStyleMarginLeft,
$MarginTop: self.$SetStyleMarginTop,
$Transform: self.$SetStyleTransform,
$Position: self.$SetStylePosition,
$ZIndex: self.$SetStyleZIndex
};
function GetStyleSetter() {
return _StyleSetterReserved;
}
function GetStyleSetterEx() {
GetStyleSetter();
_StyleSetterReserved.$Transform = _StyleSetterReserved.$Transform;
return _StyleSetterReserved;
}
self.$GetStyleSetter = GetStyleSetter;
self.$GetStyleSetterEx = GetStyleSetterEx;
self.$GetStyles = function (elmt, originStyles) {
GetStyleSetter();
var styles = {};
each(originStyles, function (value, key) {
if (StyleGetter[key]) {
styles[key] = StyleGetter[key](elmt);
}
});
return styles;
};
self.$SetStyles = function (elmt, styles) {
var styleSetter = GetStyleSetter();
each(styles, function (value, key) {
styleSetter[key] && styleSetter[key](elmt, value);
});
};
self.$SetStylesEx = function (elmt, styles) {
GetStyleSetterEx();
self.$SetStyles(elmt, styles);
};
$JssorMatrix$ = new function () {
var _This = this;
function Multiply(ma, mb) {
var acs = ma[0].length;
var rows = ma.length;
var cols = mb[0].length;
var matrix = [];
for (var r = 0; r < rows; r++) {
var row = matrix[r] = [];
for (var c = 0; c < cols; c++) {
var unitValue = 0;
for (var ac = 0; ac < acs; ac++) {
unitValue += ma[r][ac] * mb[ac][c];
}
row[c] = unitValue;
}
}
return matrix;
}
_This.$ScaleX = function (matrix, sx) {
return _This.$ScaleXY(matrix, sx, 0);
};
_This.$ScaleY = function (matrix, sy) {
return _This.$ScaleXY(matrix, 0, sy);
};
_This.$ScaleXY = function (matrix, sx, sy) {
return Multiply(matrix, [[sx, 0], [0, sy]]);
};
_This.$TransformPoint = function (matrix, p) {
var pMatrix = Multiply(matrix, [[p.x], [p.y]]);
return new $JssorPoint$(pMatrix[0][0], pMatrix[1][0]);
};
};
self.$CreateMatrix = function (alpha, scaleX, scaleY) {
var cos = Math.cos(alpha);
var sin = Math.sin(alpha);
//var r11 = cos;
//var r21 = sin;
//var r12 = -sin;
//var r22 = cos;
//var m11 = cos * scaleX;
//var m12 = -sin * scaleY;
//var m21 = sin * scaleX;
//var m22 = cos * scaleY;
return [[cos * scaleX, -sin * scaleY], [sin * scaleX, cos * scaleY]];
};
self.$GetMatrixOffset = function (matrix, width, height) {
var p1 = $JssorMatrix$.$TransformPoint(matrix, new $JssorPoint$(-width / 2, -height / 2));
var p2 = $JssorMatrix$.$TransformPoint(matrix, new $JssorPoint$(width / 2, -height / 2));
var p3 = $JssorMatrix$.$TransformPoint(matrix, new $JssorPoint$(width / 2, height / 2));
var p4 = $JssorMatrix$.$TransformPoint(matrix, new $JssorPoint$(-width / 2, height / 2));
return new $JssorPoint$(Math.min(p1.x, p2.x, p3.x, p4.x) + width / 2, Math.min(p1.y, p2.y, p3.y, p4.y) + height / 2);
};
};
$JssorAnimator$ = function (delay, duration, options, elmt, fromStyles, toStyles) {
delay = delay || 0;
var _This = this;
var _AutoPlay;
var _Hiden;
var _CombineMode;
var _PlayToPosition;
var _PlayDirection;
var _NoStop;
var _TimeStampLastFrame = 0;
var _SubEasings;
var _SubRounds;
var _SubDurings;
var _Callback;
var _Position_Current = 0;
var _Position_Display = 0;
var _Hooked;
var _Position_InnerBegin = delay;
var _Position_InnerEnd = delay + duration;
var _Position_OuterBegin;
var _Position_OuterEnd;
var _LoopLength;
var _NestedAnimators = [];
var _StyleSetter;
function GetPositionRange(position, begin, end) {
var range = 0;
if (position < begin)
range = -1;
else if (position > end)
range = 1;
return range;
}
function GetInnerPositionRange(position) {
return GetPositionRange(position, _Position_InnerBegin, _Position_InnerEnd);
}
function GetOuterPositionRange(position) {
return GetPositionRange(position, _Position_OuterBegin, _Position_OuterEnd);
}
function Shift(offset) {
_Position_OuterBegin += offset;
_Position_OuterEnd += offset;
_Position_InnerBegin += offset;
_Position_InnerEnd += offset;
_Position_Current += offset;
_Position_Display += offset;
$JssorUtils$.$Each(_NestedAnimators, function (animator) {
animator, animator.$Shift(offset);
});
}
function Locate(position, relative) {
var offset = position - _Position_OuterBegin + delay * relative;
Shift(offset);
//$JssorDebug$.$Execute(function () {
// _This.$Position_InnerBegin = _Position_InnerBegin;
// _This.$Position_InnerEnd = _Position_InnerEnd;
// _This.$Position_OuterBegin = _Position_OuterBegin;
// _This.$Position_OuterEnd = _Position_OuterEnd;
//});
return _Position_OuterEnd;
}
function GoToPosition(positionOuter, force) {
var trimedPositionOuter = positionOuter;
if (_LoopLength && (trimedPositionOuter >= _Position_OuterEnd || trimedPositionOuter <= _Position_OuterBegin)) {
trimedPositionOuter = ((trimedPositionOuter - _Position_OuterBegin) % _LoopLength + _LoopLength) % _LoopLength + _Position_OuterBegin;
}
if (!_Hooked || _NoStop || force || _Position_Current != trimedPositionOuter) {
var positionToDisplay = Math.min(trimedPositionOuter, _Position_OuterEnd);
positionToDisplay = Math.max(positionToDisplay, _Position_OuterBegin);
if (!_Hooked || _NoStop || force || positionToDisplay != _Position_Display) {
if (toStyles) {
var interPosition = (positionToDisplay - _Position_InnerBegin) / duration;
if (options.$Optimize && $JssorUtils$.$IsBrowserChrome())
interPosition = Math.round(interPosition * duration / 16) / duration * 16;
if (options.$Reverse)
interPosition = 1 - interPosition;
var currentStyles = {};
for (var key in toStyles) {
var round = _SubRounds[key] || 1;
var during = _SubDurings[key] || [0, 1];
var propertyInterPosition = (interPosition - during[0]) / during[1];
propertyInterPosition = Math.min(Math.max(propertyInterPosition, 0), 1);
propertyInterPosition = propertyInterPosition * round;
var floorPosition = Math.floor(propertyInterPosition);
if (propertyInterPosition != floorPosition)
propertyInterPosition -= floorPosition;
var easing = _SubEasings[key] || _SubEasings.$Default;
var easingValue = easing(propertyInterPosition);
var currentPropertyValue;
var value = fromStyles[key];
var toValue = toStyles[key];
if ($JssorUtils$.$IsNumeric(toValue)) {
currentPropertyValue = value + (toValue - value) * easingValue;
}
else {
currentPropertyValue = $JssorUtils$.$Extend({ $Offset: {} }, fromStyles[key]);
$JssorUtils$.$Each(toValue.$Offset, function (rectX, n) {
var offsetValue = rectX * easingValue;
currentPropertyValue.$Offset[n] = offsetValue;
currentPropertyValue[n] += offsetValue;
});
}
currentStyles[key] = currentPropertyValue;
}
if (fromStyles.$Zoom) {
currentStyles.$Transform = { $Rotate: currentStyles.$Rotate || 0, $Scale: currentStyles.$Zoom, $OriginalWidth: options.$OriginalWidth, $OriginalHeight: options.$OriginalHeight };
}
if (toStyles.$Clip && options.$Move) {
var styleFrameNClipOffset = currentStyles.$Clip.$Offset;
var offsetY = (styleFrameNClipOffset.$Top || 0) + (styleFrameNClipOffset.$Bottom || 0);
var offsetX = (styleFrameNClipOffset.$Left || 0) + (styleFrameNClipOffset.$Right || 0);
currentStyles.$Left = (currentStyles.$Left || 0) + offsetX;
currentStyles.$Top = (currentStyles.$Top || 0) + offsetY;
currentStyles.$Clip.$Left -= offsetX;
currentStyles.$Clip.$Right -= offsetX;
currentStyles.$Clip.$Top -= offsetY;
currentStyles.$Clip.$Bottom -= offsetY;
}
if (currentStyles.$Clip && $JssorUtils$.$CanClearClip() && !currentStyles.$Clip.$Top && !currentStyles.$Clip.$Left && (currentStyles.$Clip.$Right == options.$OriginalWidth) && (currentStyles.$Clip.$Bottom == options.$OriginalHeight))
currentStyles.$Clip = null;
$JssorUtils$.$Each(currentStyles, function (value, key) {
_StyleSetter[key] && _StyleSetter[key](elmt, value);
});
}
_This.$OnInnerOffsetChange(_Position_Display - _Position_InnerBegin, positionToDisplay - _Position_InnerBegin);
}
_Position_Display = positionToDisplay;
$JssorUtils$.$Each(_NestedAnimators, function (animator, i) {
var nestedAnimator = positionOuter < _Position_Current ? _NestedAnimators[_NestedAnimators.length - i - 1] : animator;
nestedAnimator.$GoToPosition(positionOuter, force);
});
var positionOld = _Position_Current;
var positionNew = positionOuter;
_Position_Current = trimedPositionOuter;
_Hooked = true;
_This.$OnPositionChange(positionOld, positionNew);
}
}
function Join(animator, combineMode) {
///
/// Combine another animator as nested animator
///
///
/// An instance of $JssorAnimator$
///
///
/// 0: parallel - place the animator parallel to this animator.
/// 1: chain - chain the animator at the _Position_InnerEnd of this animator.
///
$JssorDebug$.$Execute(function () {
if (combineMode !== 0 && combineMode !== 1)
$JssorDebug$.$Fail("Argument out of range, the value of 'combineMode' should be either 0 or 1.");
});
if (combineMode)
animator.$Locate(_Position_OuterEnd, 1);
_Position_OuterEnd = Math.max(_Position_OuterEnd, animator.$GetPosition_OuterEnd());
_NestedAnimators.push(animator);
}
function PlayFrame() {
if (_AutoPlay) {
var now = $JssorUtils$.$GetNow();
var timeOffset = Math.min(now - _TimeStampLastFrame, $JssorUtils$.$IsBrowserOpera() ? 80 : 20);
var timePosition = _Position_Current + timeOffset * _PlayDirection;
_TimeStampLastFrame = now;
if (timePosition * _PlayDirection >= _PlayToPosition * _PlayDirection)
timePosition = _PlayToPosition;
GoToPosition(timePosition);
if (!_NoStop && timePosition * _PlayDirection >= _PlayToPosition * _PlayDirection) {
Stop(_Callback);
}
else {
$JssorUtils$.$Delay(PlayFrame, options.$Interval);
}
}
}
function PlayToPosition(toPosition, callback, noStop) {
if (!_AutoPlay) {
_AutoPlay = true;
_NoStop = noStop
_Callback = callback;
toPosition = Math.max(toPosition, _Position_OuterBegin);
toPosition = Math.min(toPosition, _Position_OuterEnd);
_PlayToPosition = toPosition;
_PlayDirection = _PlayToPosition < _Position_Current ? -1 : 1;
_This.$OnStart();
_TimeStampLastFrame = $JssorUtils$.$GetNow();
PlayFrame();
}
}
function Stop(callback) {
if (_AutoPlay) {
_NoStop = _AutoPlay = _Callback = false;
_This.$OnStop();
if (callback)
callback();
}
}
_This.$Play = function (positionLength, callback, noStop) {
PlayToPosition(positionLength ? _Position_Current + positionLength : _Position_OuterEnd, callback, noStop);
};
_This.$PlayToPosition = function (position, callback, noStop) {
PlayToPosition(position, callback, noStop);
};
_This.$PlayToBegin = function (callback, noStop) {
PlayToPosition(_Position_OuterBegin, callback, noStop);
};
_This.$PlayToEnd = function (callback, noStop) {
PlayToPosition(_Position_OuterEnd, callback, noStop);
};
_This.$Stop = function () {
Stop();
};
_This.$Continue = function (toPosition) {
PlayToPosition(toPosition);
};
_This.$GetPosition = function () {
return _Position_Current;
};
_This.$GetPlayToPosition = function () {
return _PlayToPosition;
};
_This.$GetPosition_Display = function () {
return _Position_Display;
};
_This.$GoToPosition = GoToPosition;
_This.$GoToBegin = function () {
GoToPosition(_Position_OuterBegin, true);
};
_This.$GoToEnd = function () {
GoToPosition(_Position_OuterEnd, true);
};
_This.$Move = function (offset) {
GoToPosition(_Position_Current + offset);
};
_This.$CombineMode = function () {
return _CombineMode;
};
_This.$GetDuration = function () {
return duration;
};
_This.$IsPlaying = function () {
return _AutoPlay;
};
_This.$IsOnTheWay = function () {
return _Position_Current > _Position_InnerBegin && _Position_Current <= _Position_InnerEnd;
};
_This.$SetLoopLength = function (length) {
_LoopLength = length;
};
_This.$Locate = Locate;
_This.$Shift = Shift;
_This.$Join = Join;
_This.$Combine = function (animator) {
///
/// Combine another animator parallel to this animator
///
///
/// An instance of $JssorAnimator$
///
Join(animator, 0);
};
_This.$Chain = function (animator) {
///
/// Chain another animator at the _Position_InnerEnd of this animator
///
///
/// An instance of $JssorAnimator$
///
Join(animator, 1);
};
_This.$GetPosition_InnerBegin = function () {
///
/// Internal member function, do not use it.
///
///
///
return _Position_InnerBegin;
};
_This.$GetPosition_InnerEnd = function () {
///
/// Internal member function, do not use it.
///
///
///
return _Position_InnerEnd;
};
_This.$GetPosition_OuterBegin = function () {
///
/// Internal member function, do not use it.
///
///
///
return _Position_OuterBegin;
};
_This.$GetPosition_OuterEnd = function () {
///
/// Internal member function, do not use it.
///
///
///
return _Position_OuterEnd;
};
_This.$OnPositionChange = $JssorUtils$.$EmptyFunction;
_This.$OnStart = $JssorUtils$.$EmptyFunction;
_This.$OnStop = $JssorUtils$.$EmptyFunction;
_This.$OnInnerOffsetChange = $JssorUtils$.$EmptyFunction;
_This.$Version = $JssorUtils$.$GetNow();
//Constructor` 1
{
options = $JssorUtils$.$Extend({
$Interval: 15
}, options);
//Sodo statement, for developement time intellisence only
$JssorDebug$.$Execute(function () {
options = $JssorUtils$.$Extend({
$LoopLength: undefined,
$Setter: undefined,
$Easing: undefined
}, options);
});
_LoopLength = options.$LoopLength;
_StyleSetter = $JssorUtils$.$Extend({}, $JssorUtils$.$GetStyleSetter(), options.$Setter);
_Position_OuterBegin = _Position_InnerBegin = delay;
_Position_OuterEnd = _Position_InnerEnd = delay + duration;
var _SubRounds = options.$Round || {};
var _SubDurings = options.$During || {};
_SubEasings = $JssorUtils$.$Extend({ $Default: $JssorUtils$.$IsFunction(options.$Easing) && options.$Easing || $JssorEasing$.$EaseSwing }, options.$Easing);
}
};
function $JssorPlayerClass$() {
var _SelfPlayer = this;
var _PlayerControllers = [];
function PlayerController(playerElement) {
var _SelfPlayerController = this;
var _PlayerInstance;
var _PlayerInstantces = [];
function OnPlayerInstanceDataAvailable(event) {
var srcElement = $JssorUtils$.$GetEventSrcElement(event);
_PlayerInstance = srcElement.pInstance;
$JssorUtils$.$RemoveEvent(srcElement, "dataavailable", OnPlayerInstanceDataAvailable);
$JssorUtils$.$Each(_PlayerInstantces, function (playerInstance) {
if (playerInstance != _PlayerInstance) {
playerInstance.$Remove();
}
});
playerElement.pTagName = _PlayerInstance.tagName;
_PlayerInstantces = null;
}
function HandlePlayerInstance(playerInstanceElement) {
var playerHandler;
if (!playerInstanceElement.pInstance) {
var playerHandlerAttribute = $JssorUtils$.$GetAttribute(playerInstanceElement, "pHandler");
if ($JssorPlayer$[playerHandlerAttribute]) {
$JssorUtils$.$AddEvent(playerInstanceElement, "dataavailable", OnPlayerInstanceDataAvailable);
playerHandler = new $JssorPlayer$[playerHandlerAttribute](playerElement, playerInstanceElement);
_PlayerInstantces.push(playerHandler);
$JssorDebug$.$Execute(function () {
if ($JssorUtils$.$Type(playerHandler.$Remove) != "function") {
$JssorDebug$.$Fail("'pRemove' interface not implemented for player handler '" + playerHandlerAttribute + "'.");
}
});
}
}
return playerHandler;
}
_SelfPlayerController.$InitPlayerController = function () {
if (!playerElement.pInstance && !HandlePlayerInstance(playerElement)) {
var playerInstanceElements = $JssorUtils$.$GetChildren(playerElement);
$JssorUtils$.$Each(playerInstanceElements, function (playerInstanceElement) {
HandlePlayerInstance(playerInstanceElement);
});
}
};
}
_SelfPlayer.$EVT_SWITCH = 21;
_SelfPlayer.$FetchPlayers = function (elmt) {
elmt = elmt || document.body;
var playerElements = $JssorUtils$.$FindChildrenByAttribute(elmt, "player", null, true);
$JssorUtils$.$Each(playerElements, function (playerElement) {
if (!_PlayerControllers[playerElement.pId]) {
playerElement.pId = _PlayerControllers.length;
_PlayerControllers.push(new PlayerController(playerElement));
}
var playerController = _PlayerControllers[playerElement.pId];
playerController.$InitPlayerController();
});
};
}