(function() {
if (document.domain.match(/\./g).length > 1)
document.domain = document.domain.replace(/^.*\.([^\.]*)(\.co\.uk|\.com|\.de|\.it|\.uol\.com\.br)$/, "$1$2");
if (!window.$TORA) {
/**
* TORA Library: Core
*
* @author alucas Anthony_Lucas@discovery-europe.com
* @projectDescription Javascript library which supports dynamic resource resolution & loading
* @version 0.0.3
*/
/**
* TORA Library core object. This is a static class used to interact with the TORA library.
* @alias $TORA
* @type {Function}
*
* @return {OBJECT}
*/
$TORA = {};
(function() {
//##CORE DEFINITION
$TORA = function ToraCore() {
return $TORA._$public.apply(this, arguments);
};
//core config
$TORA._$config = {
BASE_PKG_LOCATION: '/resources/static/libtora/packages/',
BASE_RES_LOCATION: '/resources/static/libtora/resources/'
}
//to hold initialisation tasks
var _ON_INIT = [], _READY_LISTENERS = [];
//object to hold temporary data, will be cleared after core initialisation
var CORE_RES = {}; $TORA._$tmp = {};
//other vars
var DOC_LOADED = false;
/**
* Called when $TORA used as function object.
* Queries TORA internal registry for an object key.
* @alias $TORA._$public
* @method
*
* @return {Object}
*/
$TORA._$public = function() {
return _INTERNAL_REG(arguments[0]);
};
//#HELPER METHOD DEFINITIONS
_ON_INIT.push(function() {
/**
* Helper method to add listeners to the document's DOMContentLoaded events
* @alias $TORA.whenReady
* @memberOf $TORA
* @method
*
* @param {Object} func
*/
$TORA.whenReady = function(func) {
if (DOC_LOADED) func();
else if (func)
_READY_LISTENERS.push(func);
};
CORE_RES.common.dom.addEventListener.call(document, "DOMContentLoaded",
function() {
DOC_LOADED = true;
for (var i=0,k;(k=_READY_LISTENERS[i]);i++) k();
});
});
//#REGISTRY DEFINITION
var _INTERNAL_REG, _REG_SAFE, _OBJ_REG = { };
_ON_INIT.push(function() {
var o = CORE_RES.common.object;
_INTERNAL_REG = o.Registry(_OBJ_REG);
_INTERNAL_REG.add("DEFAULTS", o.Registry(null, true));
_REG_SAFE = {
get: function(){
return _INTERNAL_REG.lookup.apply(_INTERNAL_REG, arguments);
},
add: function() {
return _INTERNAL_REG.add.apply(_INTERNAL_REG, arguments);
}
};
registryReady();
});
function registryReady() {
$TORA.registry = function() {
return _REG_SAFE;
}
};
//#PACKAGE REGISTRY DEFINITION
var _PKG_REG, _PKG_REPO, _PKG_STRUCT = {};
_ON_INIT.push(function() {
var config = $TORA._$config,
packaging = CORE_RES.packaging;
_PKG_REG = packaging.PackageRegistry(
config['BASE_PKG_LOCATION']);
_PKG_REPO = packaging.PackageRepository(_PKG_REG, _PKG_STRUCT);
_INTERNAL_REG.extend(($TORA.packages=_PKG_STRUCT));
/**
* Add TORA package.
* @alias $TORA.addPackages
* @memberOf $TORA
* @method
* @see $TORA.packaging.PackageRepository.registerPackages
*
* @param {Object} pkgArr
*/
$TORA.addPackages = function addPackages(pkgArr) {
_PKG_REPO.registerPackages(pkgArr);
};
/**
* Initialises a package.
*
* @alias $TORA.initModule
* @memberOf $TORA
* @method
* @see $TORA.packaging.PackageRepository.insert
*
* @param {String} pkgName
* @param {Function} pkgDef
*/
$TORA.initModule = $TORA.initCoreModule =
function initModule(pkgName, pkgDef) {
return _PKG_REPO.insert(pkgName, pkgDef({
resourceLocation: config['BASE_RES_LOCATION'],
windowObject: window,
packageRoot: _PKG_REPO.getPackageRoot(),
Error: Error
}));
};
/**
* Returns a Requirement
instance. A Requirement
takes a list
* of tora feature paths and resolves them to code packages to be loaded. Allows code to be
* executed once the package requirements are satisfied. Requires either only the
* paths
argument be specified or all 3.
* @alias $TORA.Requirement
*
* @param {Object} [...] object 'initRequirements' method will be called on this object once rquirements are satisfied.
* @param {Array} featurePaths
* @param {Boolean} isUrgent Packages will be loaded as soon as possible. Usually unecessary.
* @return {Requirement}
*/
$TORA.Requirement = function() {
/**
* @constructor
* @param {Object} arg1
* @param {Object} arg2
* @param {Object} arg3
*/
function Requirement(arg1, arg2, arg3) {
var packageStatus = {}, executionQueue = [];
this._$config = {
packageStatus: packageStatus,
executionQueue: executionQueue
}
this._$config.onComplete = onCompleteCallback(this);
var now, target,
reqs = ((typeof(arg3) !== "undefined")
? (arg2target = arg1, now = arg3, arg2)
: arg1),
reqLen = (typeof(reqs) !== "string")
? reqs.length
: (reqs = [reqs], 1);
var obj = {
constructor: arguments.callee,
prototype: arguments.callee.prototype
};
if (target) {
var e;
if (e = target.initRequirements)
executionQueue.push(function(){ e() });
}
if ((reqLen)&&(reqLen > 0))
for (var i=reqLen-1,k;k=reqs[i];i--) {
packageStatus[k] = false;
this.loadFeaturePath(k,now);
}
};
//PROTOTYPED METHODS
/**
* Executes code once feature requirements are satisfied.
* @method
* @memberOf Requirement
*
* @param {Object} code
*/
Requirement.prototype.execute = function(code) {
if (this.checkStatus()) code();
else this._$config.executionQueue.push(code);
};
/**
* Gets list of packages required to satisfy feature path.
* @method
* @memberOf Requirement
*
* @param {Object} str
*/
Requirement.prototype.getRequiredPackages = $TORA.Requirement.resolve;
/**
* Requests a feature path.
* @method
* @memberOf Requirement
*
* @param {Object} pkgName
* @param {Object} now
*/
Requirement.prototype.loadFeaturePath = function(path, now) {
if (DOC_LOADED||((!now)&&(!DOC_LOADED)))
_PKG_REPO.loadFeature(path, this._$config.onComplete);
else
_PKG_REPO.loadFeature(path, this._$config.onComplete, true);
};
/**
* Checks whether requirements have been satisfied.
* @method
* @memberOf Requirement
*
* @return {Boolean}
*/
Requirement.prototype.checkStatus = function() {
var e, config = this._$config;
for (var i in (e = config.packageStatus))
if (!e[i]) return false;
var queue = config.executionQueue,
queueLen = queue.length;
config.executionQueue = [];
if (queueLen > 0)
for (var i=0,k;k=queue[i];i++)k();
return true;
};
//PRIVATE METHODS
function onCompleteCallback(context) {
var status = context._$config.packageStatus;
return function(path) {
status[path] = true;
context.checkStatus();
};
};
//CLOSE FACTORY
function getRequirement(arg1, arg2, arg3, arg4) {
return getExecutionQueue(new Requirement(arg1, arg2, arg3));
};
function getExecutionQueue(context) {
function ExecutionQueue(code){
context.execute(code);
};
ExecutionQueue.constructor = Requirement;
ExecutionQueue.instance = context;
return ExecutionQueue;
};
$TORA.Requirement = function() {
return getRequirement.apply(this, arguments);
};
$TORA.Requirement.resolve = Requirement.prototype.getRequiredPackages;
return getRequirement.apply(this, arguments);
};
/**
* Gets list of packages required to satisfy feature path.
* @method
* @memberOf Requirement
*
* @param {Object} str
* @param {Boolean} fullInfo
*/
$TORA.Requirement.resolve = function(str, fullInfo) {
return _PKG_REPO.resolveFeaturePath(str, fullInfo);
};
});
//#CORE INITIALISATION
/**
* Initialises a core TORA resource module used during initialisation.
* @alias $TORA.initCoreModule
* @memberOf $TORA
* @method
*
* @param {Object} name
* @param {Object} def
*/
$TORA.initCoreModule = function(name, def) {
_RES_LOADED[name] = def;
coreInit();
};
//PRIVATE METHODS
var _RES_LOADED = {
'common-core': false, 'packaging': false
};
function coreInit() {
var config = $TORA._$config;
//check if all resources loaded
for (var i in _RES_LOADED) if (!_RES_LOADED[i]) return;
//if so define resources and initialise
$TORA._$tmp.CORE_RES = CORE_RES;
for (var i in _RES_LOADED) {
var o = _RES_LOADED[i]({
resourceLocation: config['BASE_RES_LOCATION'],
windowObject: window,
packageRoot: CORE_RES,
Error: Error
});
for (var m in o) CORE_RES[m] = o[m];
}
runInitTasks();
};
function runInitTasks() {
for (var i=0,k;k=_ON_INIT[i];i++) k();
//cleanup
mergeCoreWithPackages();
delete $TORA._$tmp;
delete $TORA.initCoreModule;
coreInit = CORE_RES = _RES_LOADED = _ON_INIT =
runInitTasks = null;
};
function mergeCoreWithPackages() {
var pkgs = [];
for (var i in _RES_LOADED)
_PKG_REPO.insert(i, CORE_RES);
};
//##END CORE DEFINITION
})();
/**
* TORA Library: Core Resources - Common
*
* @author alucas
* @projectDescription Common package core bundle required during TORA core initialisation
* @version 0.0.3
*/
$TORA.initCoreModule("common-core", function() {
//INIT PACKAGE
var $package = {};
var $lib = {common: $package};
//INIT MODULES
var $moduleObject = ($package.object = {}),
$moduleString = ($package.string = {}),
$moduleHTML = ($package.html = {}),
$moduleDOM = ($package.dom = {}),
$moduleXHR = ($package.xhr = {});
//#OBJECT MODULE
/**
* Public Domain Code. Clones an object (deep copy).
* @alias $TORA.packages.common.object.cloneObject
*
* @param {Object} o
* @return {Object}
*/
$moduleObject.cloneObject = function cloneObject(o) {
if(typeof(o) != "object") return o;
if(o == null) return o;
var newO = new o.constructor();
for(var i in o)
newO[i] = $moduleObject.cloneObject(o[i]);
return newO;
};
/**
*
*
* @deprecated encourages performance issues
*
* Iterates over an Array
instance, Object
instance, or Array-like object
* and passes each item to a function.
*
*
Examples:
* each(array, function(index){ var value = this });
* each(object, function(prop){ var value = this });
*
* @alias $TORA.packages.common.object.each
*
* @param {Object} obj
* @param {Function} process
* @param {Boolean} arraysForward
*/
$moduleObject.each = function each(obj, process, arraysForward) {
if (obj) {
var arrLen;
if ((arrLen = obj.length)) {
if (arrLen > 0)
if (!arraysForward)
for (var i=arrLen-1;i>=0;i--) process.call(obj[i],i);
else
for (var i=0,k=arrLen;i 0) for (var i=0,k;k=obj[i];i++)
returnValue.push(k);
} else returnValue.push(obj);
} else {
if (!useValues)
for (var i in obj) returnValue.push(i);
else
for (var i in obj) returnValue.push(obj[i]);
}
}
return returnValue;
};
/**
* Merge Objects into main object.
* @alias $TORA.packages.common.object.mergeObjects
*
* @param {Object} object Required. Main object. This object will be altered.
* @param {Array} mergeArray Required. Array of objects to merge into the main object.
* @param {Object} config Optional. Advanced configuration.
* @return {Object} Main Object (object).
*/
$moduleObject.mergeObjects = function mergeObjects(object,
mergeArray, config) {
var p, merge = $moduleObject.mergeObjects;
if (config) {
var cloneFn = (!(p = config.noClone)&&(typeof(p) !== "undefined"))
? $moduleObject.cloneObject : null;
var shallow = config.shallow||false;
var clobber = config.clobber||false;
var ignoreFalse = config.ignoreFalse||false;
}
var clone = cloneFn||function(t) { return t };
$moduleObject.each(mergeArray, function() {
for (var i in this) {
if (object[i]) {
var val = object[i],
thisVal = this[i],
type = val.constructor;
switch (type) {
case Object:
if ((!shallow)&&(object[i]))
object[i] = merge(val, [thisVal], config);
else if ((!clobber)&&(ignoreFalse)
&&(thisVal == false)) {
continue;
} else { object[i] = clone(thisVal); }
break;
case Array:
object[i] = val.concat(thisVal);
break;
case String || Number || Array:
if ((clobber)||!((this[i] == false)
&&(ignoreFalse)))
object[i] = thisVal;
break;
default: continue;
}
} else {
try {
object[i] = clone(this[i]);
}
catch(err) {}
}
}
});
return object;
};
/**
* Returns a Registry
instance.
* A Registry
instance performs cascading lookups on a group of objects.
* The lookups cascade according to the order the objects were supplied.
*
*
Examples:
* var myRegistry = Registry([someDocumentElement, otherDocumentElement]);
* myRegistry("someprop"); // returns "someprop" if it exists in either document
* myRegistry("title"); // returns the title property from the first document
*
* @alias $TORA.packages.common.object.Registry
* @constructor
*
* @param {Array} objects Objects to perform lookups on.
* @param {Boolean} noLookupWrapper Removes the wrapper which enables an instance to directly act as a lookup function.
* @return {RegistryInstance}
*/
$moduleObject.Registry = function Registry(objects, noLookupWrapper) {
/**
* @constructor
*
* @param {Object} objects
*/
function Registry(objects) {
var members = [];
this._$members = members;
if (!objects) var objects = {};
if (!objects.length > 0)
members.push(objects);
else $moduleObject.each(objects, function() {
this.extend(objects);
});
this._$ready = true;
};
//PROTOTYPED METHODS
/**
* Adds a property.
* @method
* @memberOf $TORA.packages.common.object.Registry
*
* @param {Object} key
* @param {Object} value
*/
Registry.prototype.add = function(key, value) {
var returnValue, obj = this._$members[0];
if (!obj[key]) {
obj[key] = value;
returnValue = true;
} else
returnValue = false;
return returnValue;
};
/**
* Retrieve a property.
* @method
* @memberOf $TORA.packages.common.object.Registry
*
* @param {Object} prop
*/
Registry.prototype.lookup = function(prop) {
var e, members = this._$members;
for (var i=0,k;k=members[i];i++)
if ((e = k[prop]) != undefined) return e;
return undefined;
};
/**
* Extend Registry
instance.
*
* @param {Object} object
*/
Registry.prototype.extend = function(object) {
this._$members.push(object);
};
/**
* Returns registry members.
*
* @param {Array} object
*/
Registry.prototype._$getMembers = function() {
return this._$members;
};
//CLOSE FACTORY
return ($moduleObject.Registry = function (objects, noLookupWrapper) {
var returnValue, inst = new Registry(objects);
if (!noLookupWrapper) {
returnValue = function registry(prop) {
return inst.lookup(prop);
}
returnValue = $moduleObject.mergeObjects(returnValue,
[inst], { noClone: true });
} else
returnValue = inst;
return returnValue;
})(objects, noLookupWrapper);
};
/**
* Mixes type instances together.
*
*
Examples:
* function CatDog() { Mixin(this, [ new Cat(), new Dog() ]); }
* var catDog = new CatDog();
* catDog.sniffButts() && catDog.eatMice();
*
* @alias $TORA.packages.common.object.Mixin
* @constructor
*
* @param {Object} main main type instance
* @param {Array|Object} instances type instances to mix
* @return {Object} main type instance
*/
$moduleObject.Mixin = function Mixin() {
if (arguments.length > 0)
switch(arguments.length) {
case 2:
return arguments.callee.mix(arguments[0],
arguments[1]);
case 1:
return arguments[0];
default:
return arguments.callee.mix(arguments[0],
Array.prototype.slice.call(arguments)
.slice(1));
}
else
return {};
};
$moduleObject.Mixin.mix = function(target, mixins) {
var options = {noClone: true};
for (var i=mixins.length-1,k;k=mixins[i];i--) {
for (var p in k) {
var e,l;
if (!(e = target[p])) target[p] = k[p];
else if (typeof((l = k[p])) == "object") {
target[p] = $moduleObject.mergeObjects(e,
[l], options);
}
}
}
};
/**
* Returns a Config
instance. This can be used by Mixin compatible
* types to allow subtypes to plug into their configuration process.
*
* @alias $TORA.packages.common.object.Mixin
* @constructor
*
* @param {Object} main main type instance
* @param {Array|Object} instances type instances to mix
* @return {Object} main type instance
*/
$moduleObject.Config = function Config(target) {
/**
* @alias Config
* @constructor
*
* @param {Object} target
*/
function ConfigInstance(target) {
this._$targetList = [target];
this._$defaults = {};
this._$properties = {};
};
//#PROTOTYPED METHODS
//PUBLIC METHODS
/**
* @method
* @memberOf $TORA.packages.common.type.SimpleWidget
*
* @param {Object} properties
*/
ConfigInstance.prototype.update = function(properties) {
$moduleObject.mergeObjects(this._$properties, [properties]);
};
/**
* @method
* @memberOf $TORA.packages.common.type.SimpleWidget
*
* @param {Object} properties
*/
ConfigInstance.prototype.setDefaults = function(properties) {
$moduleObject.mergeObjects(this._$defaults, [properties]);
};
/**
* Called by the object which owns the instance.
* @method
* @memberOf $TORA.packages.common.type.SimpleWidget
*
* @param {Object} target
*/
ConfigInstance.prototype.prepare = function(target) {
if (target) {
var targetList = this._$targetList;
targetList.push(target);
if (target == targetList[0]) {
var config = {},
defaults = this._$defaults,
properties = this._$properties;
for (var i in defaults)
if (!properties[i])
config[i] = defaults[i];
for (var i in properties)
config[i] = properties[i];
this._$executeOnTargets("_$checkConfig", [config]);
for (var i in config)
if (!target[i]) target["_$"+i] = config[i];
this._$executeOnTargets("_$configReady");
}
}
};
//PROTECTED METHODS
/**
* @protected
* @method
* @memberOf $TORA.packages.common.type.SimpleWidget
*
* @param {Object} target
*/
ConfigInstance.prototype._$executeOnTargets = function(methodName, args) {
var args = args||[],
targetList = this._$targetList,
target = targetList[0];;
for (var i=1,k,m;(k=targetList[i]); i++) {
if ((m = k[methodName]))
m.apply(target, args);
}
if ((m = target[m])) m.apply(target, args);
};
//CLOSE FACTORY
return ($moduleObject.Config = function(target) {
return new ConfigInstance(target);
})(target);
};
//#STRING MODULE
/**
* Takes a URL and adds query parameters.
*
* @param {String} url
* @param{Object} data
* @param {Boolean} noescape Optionally disables url encoding.
* @return {String}
*/
$moduleString.buildURL = function buildURL(url, data, noescape) {
var _URL_PARTS = /([^\?]*)(\?|)([^#]*)/;
return ($moduleString.buildURL = function buildUrl(url, data, noescape) {
var params = "";
for (var i in data) {
params += i + "=" +
(!noescape ? escape(data[i]) : data[i])
+ "&";
}
var urlParts = url.match(_URL_PARTS);
var start = (urlParts[2] !== "?") ? "?" : "&";
return urlParts[1] + start
+ params.slice(0,params.length-1)
+ urlParts[3];
})(url, data, noescape);
};
/**
* Converts JSON string to object, falling back to eval in the absence
* of native support.
* @alias $TORA.packages.common.string.toObject
*
* @return {Object}
*/
$moduleString.toObject = function toObject(str) {
var finalFunction = function toObject(str) {
return eval("("+str+")");
};
return ($moduleString.toObject = function toObject(str) {
var returnValue;
try { returnValue = finalFunction(str); }
catch(e) { returnValue = null; }
return returnValue;
})(str);
};
//#DOM MODULE
/**
* Provides an HTMLElement.getElementsByClassName
interface which falls back to a native implementation when available.
* Needs to be called as a method of the element to search within. Defaults to window.
*
*
Examples:
* getElementsByClassName.call(containerElement, "...classNames");
*
* @alias $TORA.packages.common.dom.getElementsByClassName
*
* @param {String} strClassName Required. The class name to search for.
* @return {Array}
*/
$moduleDOM.getElementsByClassName =
function getElementsByClassName(strClassName) {
var arrReturnElements = [];
if (this.getElementsByClassName) {
arrReturnElements = this
.getElementsByClassName(strClassName);
if (arrReturnElements)
arrReturnElements = Array.prototype.slice.call(arrReturnElements);
else
arrReturnElements = [];
return arrReturnElements;
} else {
var strTagName = "*";
var arrElements = (strTagName == "*" && this.all)? this.all :
this.getElementsByTagName(strTagName);
if (arrElements) {
strClassName = strClassName.replace(/\-/g, "\\-");
var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
var oElement;
for(var i=0; i
Examples:
* addEventListener.call(myElement, "click", handler);
* addEventListener.call(document, "ready", handler);
*
* @alias $TORA.packages.common.dom.addEventListener
*
* @param {String} event Required. Name of DOM event.
* @param {Function} listener Required. Event listener.
* @return {Boolean} false
if unsupported browser.
*/
($moduleDOM.addEventListener = function addEventListener(event, listener) {
//CAPABILITY DETECTION
var capabilityTest = function(elem) {
if (elem.addEventListener) return 1;
else if (elem.attachEvent) return 2;
else return 0;
};
var defineListenerFunc = function(envType) {
switch(envType) {
case 1:
return function(event, handler) {
if(event == "mouseenter"){
this.addEventListener("mouseover", mouseEnter(handler), false);
} else if(event == "mouseleave"){
this.addEventListener("mouseout", mouseEnter(handler), false);
} else if ((event !== "DOMContentLoaded")
||(this.constructor !== window.constructor)) {
this.addEventListener(event, handler, false);
} else {
addDLoadedHdlr(handler);
}
};
case 2:
return function(event, handler) {
if (event !== "DOMContentLoaded") {
var elem = this;
this.attachEvent("on"+event, function() {
handler.call(elem, window.event);
});
} else {
addDLoadedHdlr(handler);
}
};
case 0:
return function(event, handler) {
if (event !== "DOMContentLoaded")
self = this;
else
self = window, event = "load";
var oldFunc = this["on" + event];
this["on" + event] = function(ev) {
if (oldFunc) oldFunc.call(self, ev);
handler.call(self, ev);
}
}
}
};
//INITIALISE
var envType = capabilityTest(window),
finalFunction = defineListenerFunc(envType);
listenDLoaded(envType);
//MOUSEENTER/LEAVE FUNCTIONS
function mouseEnter(_fn){
return function(_evt){
var relTarget = _evt.relatedTarget;
if (this === relTarget || isAChildOf(this, relTarget))
{ return; }
_fn.call(this, _evt);
}
};
function isAChildOf(_parent, _child){
if (_parent === _child) { return false; }
while (_child && _child !== _parent)
{ _child = _child.parentNode; }
return _child === _parent;
}
//DOM LOADED HANDLING
var isDLoaded = false, dLoadedHdlrs = [], ie_interval;
function addDLoadedHdlr(handler) {
if (!isDLoaded) {
dLoadedHdlrs.push(handler);
} else {
handler(isDLoaded);
}
};
function executeDHdlrs(event) {
if (ie_interval)
window.clearInterval(ie_interval);
if (!isDLoaded) {
isDLoaded = event;
if (dLoadedHdlrs.length > 0) {
for (var i=0,k;k=dLoadedHdlrs[i];i++) {
k(event);
}
dLoadedHdlrs = [];
}
}
};
function listenDLoaded(envType) {
switch(envType) {
case 1:
window.addEventListener("DOMContentLoaded",
executeDHdlrs, false);
window.addEventListener("load",
executeDHdlrs, false);
break;
case 2:
ie_interval = window.setInterval(function() {
try { document.documentElement.doScroll("left");
} catch(e) { return };
executeDHdlrs(true);
}, 100);
break;
case 0:
finalFunction.call(window, "load",
executeDHdlrs);
}
};
//CLOSE FACTORY
return ($moduleDOM.addEventListener = finalFunction)
(event, listener);
}).call(window, "fakeEvent", function(){});
/**
* Provides a cross-browser compatible method to remove dom event handlers.
* Needs to be called as a method of the element to listen to.
*
* @param {String} event Required. Name of DOM event.
* @param {Function} listener Required. Event listener.
* @return {Boolean} false
if unsupported browser.
*/
$moduleDOM.removeEventListener = function (event, listener) {
if (this.removeEventListener) { // all browsers except IE before version 9
this.removeEventListener (event, listener, false);
}
else {
if (this.detachEvent) { // IE before version 9
this.detachEvent (event, listener);
}
}
};
$moduleDOM.isElementInView = function (element, percentage) {
var viewportHeight, viewportWidth;
if(typeof window.innerHeight != 'undefined' && typeof window.innerWidth != 'undefined'){
viewportHeight = window.innerHeight;
viewportWidth = window.innerWidth;
} else {
viewportHeight = document.documentElement.clientHeight;
viewportWidth = document.documentElement.clientWidth;
}
var viewportTop, viewportLeft;
if(typeof window.pageYOffset != "undefined" && typeof window.pageXOffset != "undefined"){
viewportTop = window.pageYOffset,
viewportLeft = window.pageXOffset;
} else {
viewportTop = document.documentElement.scrollTop,
viewportLeft = document.documentElement.scrollLeft;
}
var viewportBottom = viewportTop + viewportHeight,
viewportRight = viewportLeft + viewportWidth,
elementCoords = $moduleDOM._$getElementCoordinates(element),
elementTop = elementCoords.y,
elementBottom = elementTop + element.offsetHeight,
elementLeft = elementCoords.x,
elementRight = elementLeft + element.offsetWidth,
minimumInViewThreshold = Math.ceil((element.offsetHeight * element.offsetWidth) * percentage);
var inView = ((elementTop >= viewportTop && elementTop < viewportBottom) || (elementBottom > viewportTop && elementBottom < viewportBottom) || (elementTop < viewportTop && elementBottom > viewportBottom))
&&
((elementLeft >= viewportLeft && elementLeft < viewportRight) || (elementRight > viewportLeft && elementRight < viewportRight) || (elementLeft < viewportLeft && elementRight > viewportRight));
// element is in the viewport, check if the required amount is on screen
if(inView){
var inViewHeight = (elementBottom < viewportBottom ? elementBottom : viewportBottom)
- (elementTop > viewportTop ? elementTop : viewportTop);
var inViewWidth = (elementRight < viewportRight ? elementRight : viewportRight)
- (elementLeft > viewportLeft ? elementLeft : viewportLeft);
var totalInView = inViewHeight * inViewWidth,
elementTotalSize = element.clientheight * element.clientWidth;
return totalInView >= minimumInViewThreshold;
}
return false;
}
$moduleDOM._$getElementCoordinates = function(element) {
var y = 0,
x = 0;
while(element){
y += element.offsetTop;
x += element.offsetLeft;
element = element.offsetParent;
}
return {'x': x,
'y': y};
}
//#XHR MODULE
/**
* Cross-browser XMLHttpRequest factory.
* @alias $TORA.packages.common.xhr.XMLHttpRequest
* @constructor
*
* @return {XMLHttpRequest}
*/
$moduleXHR.XMLHttpRequest = function() {
if (window.ActiveXObject) {
return ($moduleXHR.XMLHttpRequest = function() {
return new ActiveXObject("Microsoft.XMLHTTP")
})();
} else {
return ($moduleXHR.XMLHttpRequest = function() {
return new XMLHttpRequest();
})();
}
};
/**
* Makes a HTTP GET request and invokes callback
once readyState reaches 4.
* @alias $TORA.packages.common.xhr.httpGet
*
* @param {String} url
* @param {Function} callback
* @param {Boolean} isSync
*/
$moduleXHR.httpGet = function httpGet(url, callback, isSync) {
var xhr = $moduleXHR.XMLHttpRequest();
function checkStatus() {
if ((xhr.readyState == 4)&&(callback)) {
callback(xhr);
}
};
if (!isSync) {
xhr.open('GET', url, true);
xhr.onreadystatechange = checkStatus;
xhr.send(null);
} else {
xhr.open('GET', url, false);
xhr.send(null);
checkStatus();
}
};
/**
* Makes a HTTP POST request and invokes callback
once readyState reaches 4.
* @alias $TORA.packages.common.xhr.httpPost
*
* @param {String} url including query string if any
* @param {Function} callback
* @param {Boolean} isSync
*/
$moduleXHR.httpPost = function httpPost(url, callback, isSync) {
var xhr = $moduleXHR.XMLHttpRequest();
function checkStatus() {
if ((xhr.readyState == 4)&&(callback)) {
callback(xhr);
}
};
if (!isSync) {
xhr.open('POST', url, true);
xhr.onreadystatechange = checkStatus;
xhr.send(null);
} else {
xhr.open('POST', url, false);
xhr.send(null);
checkStatus();
}
};
//#RETURN PACKAGE
return $lib;
});
/**
* TORA Library: Core Resources - Packaging
*
* @author alucas
* @projectDescription Packaging package required during TORA core initialisation
* @version 0.0.3
*/
$TORA.initCoreModule("packaging", function(packageInfo) {
//INIT PACKAGE
var $package = {};
var $lib = {packaging: $package};
var $c_ = packageInfo.packageRoot.common,
$c_Obj = $c_.object,
each = $c_Obj.each,
toArray = $c_Obj.toArray,
cloneObject = $c_Obj.cloneObject,
mergeObjects = $c_Obj.mergeObjects,
Mixin = $c_Obj.Mixin;
//#PACKAGE REGISTRY DEFINITION
/**
* Returns a PackageRegistry
instance. A PackageRegistry
keeps track of
* javascript packages and allows lookups.
* @alias $TORA.packages.packaging.PackageRegistry
* @constructor
*
* @param {Object} location
* @return {PackageRegistry}
*/
$package.PackageRegistry = function PackageRegistry(location) {
/**
* @constructor
*
* @param {Object} location
*/
function PackageRegistry(location) {
this._$pkgdb = { packageInfo: {}, packageStruct: {}};
this._$config = {
baseLocation: location
}
};
//PROTOTYPED METHODS
/**
* Registers new packages
* @method
* @memberOf $TORA.packages.packaging.PackageRegistry
*
* @param {Object} packages
*/
PackageRegistry.prototype.registerPackages =
function registerPackages(packages) {
var process = processPackage(this);
this.registerPackages = function(packages) {
each(packages, process);
}
each(packages, process);
};
/**
* Resolves a package, module, and method names to packages
* @method
* @memberOf $TORA.packages.packaging.PackageRegistry
*
* @param {String} pkgName
* @param {String} modName
* @param {String} methName
* @param {Boolean} additionalInfo
*/
PackageRegistry.prototype.resolvePackages = function(pkgName, modName,
methName, additionalInfo) {
var returnValue, c, d, curPos,
pkgdb = this._$pkgdb,
pkgInfo = pkgdb.packageInfo;
if ((curPos = pkgdb.packageStruct[pkgName]))
if ((modName)&&(c = curPos[modName])) {
if ((methName)&&(d = c[methName])) curPos = d;
else if (c.ASSOC_PKG.length > 0) curPos = c;
}
if (curPos) {
var resError;
each(curPos.ASSOC_PKG, function() {
if ((!resError)&&(!pkgInfo[this]))
resError = true;
});
if (!resError)
if (additionalInfo) {
if (curPos.ASSOC_PKG.length > 0) {
returnValue = {};
each(curPos.ASSOC_PKG, function() {
returnValue[this] = cloneObject(pkgdb
.packageInfo[this]);
});
} else {
returnValue = null;
}
} else {
returnValue = Array.prototype.slice.call(curPos.ASSOC_PKG);
}
}
return returnValue||[];
};
/**
* Resolves package dependencies.
* @method
* @memberOf $TORA.packages.packaging.PackageRegistry
*
* @param {Object} pkgName
* @param {Object} additionalInfo
*/
PackageRegistry.prototype.resolveDependencies = function(pkgName,
additionalInfo) {
var deps, hasDeps, returnValue,
pkgInfo = this._$pkgdb.packageInfo;
if ((deps = pkgInfo[pkgName]))
deps = deps['depends'];
else return [];
returnValue = {};
each(deps, function() {
var e; hasDeps = true;
if ((e = pkgInfo[this]))
returnValue[this] = e;
});
return hasDeps ? returnValue : null;;
}
//PRIVATE METHODS
function processPackage(context) {
function assocStruct(pkg, obj, name) {
var t, struct = (t = obj[name]) ?
t : (obj[name] = { ASSOC_PKG: [] }),
arr = struct.ASSOC_PKG;
if (pkg != null)
if (!pkg.length) arr.push(pkg);
else struct.ASSOC_PKG = arr.concat(pkg);
return struct;
};
var baseLocation = context._$config.baseLocation;
return function() {
var name = this['direct-name'],
pkgName = this['provides-package'],
pkgFilePath = this['file-path'],
pkgDb = context._$pkgdb,
pkgInfo = pkgDb.packageInfo,
pkgStruct = pkgDb.packageStruct,
isSpecialCase = null,
modules = this['provides-modules'];
if (modules)
for (var i in modules) {
if (typeof modules[i] == "object")
isSpecialCase = true;
break;
}
if ((pkgFilePath) && ((name && pkgName) ||
(name = pkgName)) && (!pkgInfo[name])) {
var e, realNames = [name];
var finalNames = !isSpecialCase ? realNames : null;
pkgInfo[name] = this;
this['depends'] = toArray(this['depends']);
if ((pkgFilePath.charAt(0) !== "/")
&&(pkgFilePath.indexOf("http") < 0))
this['file-path'] = baseLocation + pkgFilePath;
var struct = assocStruct(finalNames, pkgStruct, pkgName);
each(modules, function(modName){
var mod = assocStruct(finalNames, struct, modName);
each(this, function() {
assocStruct(realNames, mod, this);
});
});
}
};
};
//CLOSE FACTORY
$package.PackageRegistry = function(location) {
return new PackageRegistry(location);
};
return new PackageRegistry(location);
};
//#SCRIPT RESOURCE LOADER DEFINITION
/**
* Returns a ScriptResourceLoader
instance. A ScriptResourceLoader
* loads scripts at runtime.
* @alias $TORA.packages.packaging.PackageRegistry
* @constructor
*
* @param {Object} location
* @param {String} type
* @param {String} lang
* @return {ScriptResourceLoader}
*/
$package.ScriptResourceLoader =
function ScriptResourceLoader(location, type, lang) {
//PRIVATE VARS
var scriptTemplate = document.createElement("script");
scriptTemplate.type = "text/javascript";
scriptTemplate.language = "Javascript";
//CONSTRUCTOR
/**
* @constructor
*
* @param {String} location
* @param {String} [type]
* @param {String} [lang]
*/
function ScriptResourceLoader(location, type, lang) {
this._$config = {
container: document.getElementsByTagName("head")[0],
location: location,
type: type,
lang: lang
}
};
//PROTOTYPED METHODS
/**
* Returns the target location.
* @method
* @memberOf $TORA.packages.packaging.ScriptResourceLoader
*
* @return {String}
*/
ScriptResourceLoader.prototype.getLocation = function() {
return this._$config.location;
};
/**
* Loads the target resource.
* @method
* @memberOf $TORA.packages.packaging.ScriptResourceLoader
*
* @param {Boolean} isInline
* @void
*/
ScriptResourceLoader.prototype.load = function(isInline) {
var e, config = this._$config,
script = scriptTemplate.cloneNode(false);
script.src = config.location;
if ((e = config.lang)) script.language = e;
if ((e = config.type)) script.type = e;
if (!isInline) {
var container = this._$config.container;
container.appendChild(script);
} else {
var dummy = document.createElement("div");
dummy.appendChild(script);
document.write(dummy.innerHTML);
}
};
//CLOSE FACTORY
return ($package.ScriptResourceLoader = function(location, type, lang) {
return new ScriptResourceLoader(location, type, lang);
})(location, type, lang);
};
//#PACKAGE REPOSITORY DEFINITION
/**
* Returns a PackageRepository
instance. A PackageRepository
combines
* a PackageRegistry
with the functionality of a ScriptResourceLoader
* to allow overall management of the loading, resolution, and definition of packages.
* @alias $TORA.packages.packaging.PackageRepository
* @constructor
*
* @param {PackageRegistry} registry
* @param {String} packageRoot
* @return {PackageRepository}
*/
$package.PackageRepository = function PackageRepository(registry,
packageRoot) {
/**
* @constructor
* @param {PackageRegistry} registry
*/
function PackageRepository(registry, packageRoot, defaults) {
this._$config = {
waiting: {}, packageRoot: packageRoot||{},
isRequested: {}, isLoaded: {}
}
Mixin(this, [registry]);
};
//PROTOTYPED METHODS
/**
* Resolves path string to a package and loads it.
* @method
* @memberOf $TORA.packages.packaging.PackageRepository
*
* @param {Object} str
*/
PackageRepository.prototype.loadFeature = function(str, callback, isInline) {
var self = this, e,
config = this._$config,
siteDomain = getSiteDomain();
//lookup packages
var request = this._$parseFeaturePath(str);
request.push(true);
var results = this.resolvePackages
.apply(this, request);
//load packages
for (var i in results) {
this._$loadPackages({
pkgInfo: results, request: request,
callback: callback, now: isInline,
rawRequest: str, additionalInfo: true
});
break;
}
};
PackageRepository.prototype._$loadDependencies = function(options) {
var pkgList = options.pkgInfo;
if (pkgList) {
var hasInfo = options.aditionalInfo,
callback = options.callback;
//check for dependencies
function process(name) {
var deps = self.resolveDependencies(name, true);
if ((deps)&&(hasDeps = true)) mergeObjects(
depList, [deps],
{ shallow: true });
};
var self = this, depList = {}, hasDeps;
if (hasInfo) for (var i in pkgList) process(i);
else each(pkgList, process);
//load dependencies
if (hasDeps) {
this._$loadPackages({
pkgInfo: depList, callback: callback,
now: options.now
});
} else callback();
}
};
/**
* Completes a load request.
* @private
* @method
* @memberOf $TORA.packages.packaging.PackageRepository
*
* @param {Object} options
*/
PackageRepository.prototype._$loadPackages = function(options) {
var config = this._$config,
pkgInfo = options.pkgInfo,
pkgNames = toArray(pkgInfo),
isRequested = config.isRequested,
isLoaded = config.isLoaded,
isInline = config.now,
request = options.request,
self = this;
this._$loadDependencies({
pkgInfo: pkgInfo,
additionalInfo: true,
callback: loadMain
});
function loadMain() {
if ((pkgNames) && (pkgNames.length > 0)) {
//define function to check request progress
var updateStatus, args = (args = options.rawRequest) ? [args] : null;
(updateStatus = createPackageCheck(pkgNames, isLoaded,
options.callback, args))();
//load package javascript and monitor status
each(pkgInfo, function(name) {
self._$monitorStatus(name, request, updateStatus);
if ((!isLoaded[name])&&(!isRequested[name])) {
isRequested[name] = true;
loadFile(this['file-path'], isInline);
}
}, true);
} else {
options.callback(options.rawRequest);
}
}
};
/**
* Monitors the status of a package request.
* @private
* @method
* @memberOf $TORA.packages.packaging.PackageRepository
*
* @param {Object} name
* @param {Object} request
* @param {Object} updateFn
*/
PackageRepository.prototype._$monitorStatus = function(name, request,
updateFn) {
var pkgRoot = this._$config.packageRoot,
override = ((request)&&(request[2])) ?
true : false;
this._$waitPackage(name, function(pkgName) {
if ((!request)||(verify(pkgRoot, request)))
updateFn(name, override);
});
};
/**
* Waits for a package to load.
* @private
* @method
* @memberOf $TORA.packages.packaging.PackageRepository
*
* @param {Object} name
* @param {Object} fn
*/
PackageRepository.prototype._$waitPackage = function(name, fn) {
var waiting = this._$config.waiting,
arr = waiting[name];
if (!arr)
if (typeof arr == "undefined") {
waiting[name] = arr = [];
} else {
if (arr == null) fn(name);
return;
}
arr.push(fn);
};
/**
* Breaks a feature path into its constituent parts.
* @private
* @method
* @memberOf $TORA.packages.packaging.PackageRepository
*
* @param {Object} str
*/
PackageRepository.prototype._$parseFeaturePath = function(str) {
var pathRegex = ".", methodRegex = "::";
return (PackageRepository.prototype.
_$parseFeaturePath = function(str) {
var returnValue = str.split(pathRegex),
valLen = returnValue.length-1,
method,
methodParts = returnValue[valLen]
.split(methodRegex);
if (methodParts.length > 0) {
method = methodParts[1];
returnValue[valLen] = methodParts[0];
}
while(returnValue.length < 2)
returnValue.push(null);
returnValue.push(method||null);
return returnValue;
})(str);
};
/**
* Resolves a feature path to the required packages
* @method
* @memberOf $TORA.packages.packaging.PackageRepository
*
* @param {Object} path
* @param {Object} additionalInfo
* @return {Array}
*/
PackageRepository.prototype.resolveFeaturePath = function(path,
additionalInfo) {
var returnValue = (path ? this._$parseFeaturePath(path) : []);
returnValue.push(additionalInfo||false);
returnValue = this.resolvePackages.apply(this, returnValue);
return returnValue;
};
/**
* Initialises a new package in the package root.
* @method
* @memberOf $TORA.packages.packaging.PackageRepository
*
* @param {Object} pkgName
* @param {Object} def
*/
PackageRepository.prototype.insert = function(pkgName, def) {
var config = this._$config;
mergeObjects(config.packageRoot, [def]);
executeCallbacks(this, pkgName);
config.isLoaded[pkgName] = true;
};
/**
* Returns the package root object.
* @method
* @memberOf $TORA.packages.packaging.PackageRepository
*
* @return {Object}
*/
PackageRepository.prototype.getPackageRoot = function() {
return this._$config.packageRoot;
};
//PRIVATE METHODS
function loadFile(path, isInline) {
$package.ScriptResourceLoader(getSiteDomain()+path)
.load(isInline);
}
function getSiteDomain() {
var returnValue, page;
if ((page = $TORA("PAGE")))
returnValue = "http://"+page.getSiteDomain();
else
returnValue = "";
return (getSiteDomain = function getSiteDomain() {
return returnValue;
})();
}
function createPackageCheck(pkgList, pkgStatus, readyFn, args) {
return function(pkgName, override) {
if (pkgName) pkgStatus[pkgName] = true;
if (!override) {
for (var i=pkgList.length-1,k;(k=pkgList[i]);i--)
if (!pkgStatus[k]) return;
}
readyFn.apply(this, args||[]);
};
};
function verify(pkgRoot, request) {
var returnValue,
req1 = request[1],
req2 = request[2],
cur = pkgRoot[request[0]];
if (cur) {
if (!req1) {
if (!req2||cur[req2])
returnValue = true;
} else if ((cur = cur[req1])) {
if ((req2)&&!(cur = cur[req2]))
returnValue = false;
else
returnValue = true;
} else
returnValue = false;
} else returnValue = false;
return returnValue;
};
function executeCallbacks(context, name) {
var waiting = context._$config.waiting,
list;
if ((list = waiting[name])) {
delete waiting[name];
list = list.slice();
waiting[name] = null;
each(list, function() { this(name) }, true);
}
};
//CLOSE FACTORY
$package.PackageRepository = function(registry, packageRoot) {
return new PackageRepository(registry, packageRoot);
};
return new PackageRepository(registry, packageRoot);
};
//#RETURN PACKAGE
return $lib;
});
/**
* TORA Library: Core Resources - Base Packages
*
* @author alucas Anthony_Lucas@discovery-europe.com
* @projectDescription Basic package definitions
* @version 0.0.1a
*/
$TORA.addPackages([
{
//'description': "Provides user, page, and site information.",
'file-path': "environment.js",
'provides-package': "environment"
},
/* COMMON PACKAGES */
{
//'description': "Provides common utility methods and types.",
'direct-name': "common-core",
'file-path': "common/common_core.js",
'provides-package': "common"
},
{
//'description': "Provides non-core extra utility methods and types.",
'direct-name': "common-extras",
'file-path': "common/common_extras.js",
'provides-package': "common",
'provides-modules': {
"object": [ "Iterator" ],
"type": [ "EventObject", "EventManager" ]
}
},
{
//'description': "Provides common AJAX components.",
'direct-name': "common-ajax",
'file-path': "common/common-type_ajax.js",
'depends': "common-core",
'provides-package': "common",
'provides-modules': {
"type": [
"StateMachine",
"SimpleWidget",
"DataProvider"
]
}
},
/* EXTERNAL PACKAGES */
{
//'description': "Provides a base for interaction with external sources.",
'direct-name': "external-core",
'file-path': "external/external_core.js",
'provides-package': "external",
'depends': "common-extras"
},
{
//'description': "Provides various interfaces for interaction with external sources.",
'direct-name': "external-interfaces",
'file-path': "external/external_interfaces.js",
'provides-package': "external",
'depends': "external-core"
},
{
//'description': "Provides basic advertising interfaces for site interaction.",
'direct-name': "external-advertising",
'file-path': "external/external_ads.js",
'provides-package': "external",
'provides-modules': { "advertising": [ "BasicAdvert", "USFormatAdapter" ]},
'depends': "external-core"
},
/* USER AUTHENTICATION PACKAGES */
{
'direct-name': "authentication-core",
'file-path': "/resources/ua/js/authentication.js",
'depends': "environment",
'provides-package': "authentication",
'provides-modules': { "core": true }
},
{
'direct-name': "authentication-fb",
'file-path': "/resources/ua/js/authentication-fb.js",
'depends': "authentication-core",
'provides-package': "authentication",
'provides-modules': { "fb": true }
},
/* PAGE REPORTING PACKAGES */
{
'direct-name': "reporting-core",
'file-path': "reporting/reporting_core.js",
'provides-package': "reporting"
},
{
'direct-name': "reporting-basic",
'file-path': "reporting/reporting_basic.js",
'depends': "reporting-core",
'provides-package': "reporting",
'provides-modules': {
"processors": [ "NetworkInfoProcessor", "ComscoreProcessor", "OmnitureProcessor" ],
"dispatchers": [ "ComscoreDispatcher", "OmnitureDispatcher" ]
}
},
/* PHOTO GALLERY PACKAGES */
{
'direct-name': "photogallery-core",
'file-path': "/resources/photogallery/js/photogallery_core.js",
'depends': "common-extras",
'provides-package': "photogallery",
'provides-modules': { "ui": true, "data": true }
},
{
'direct-name': "photogallery-hp",
'file-path': "/resources/photogallery/js/photogallery_hp.js",
'depends': [ "photogallery-core", "common-ajax", "ui-core", "thirdparty-addthis" ],
'provides-package': "photogallery",
'provides-modules': { "ui": [ "LightGalleryWidget" ] }
},
/* VIDEO PACKAGES */
{
'direct-name': "video",
'file-path': "/resources/video/js/video-package.js",
'depends': "common-extras",
'provides-package': "video"
},
/* INTERESTGROUPS PACKAGES */
{
'direct-name': "games-scores",
'file-path': "/resources/igroups/js/games/games-scores.js",
'depends': "common-ajax",
'provides-package': "games",
'provides-modules': { "scores": true }
},
{
'file-path': "/resources/igroups/js/shuffle/shuffle.js",
'depends': [ "common-ajax", "thirdparty-addthis" ],
'provides-package': "shuffle"
},
{
'file-path': "thirdparty/addthis/thirdparty-addthis.js",
'depends': [ "common-ajax" ],
'provides-package': "addThis"
},
/* UTILITY PACKAGES */
{
'direct-name': "content-common",
'file-path': "content-common.js",
'provides-package': "content",
'provides-modules': { "common": true }
},
{
'direct-name': "content-frames",
'file-path': "content-frames.js",
'depends': "external-interfaces",
'provides-package': "content",
'provides-modules': { "frames": true }
},
{
'direct-name': "advertising",
'file-path': "advertising.js",
'provides-package': "advertising"
},
{
// 'description': "Provides a core UI framework",
'direct-name': "ui-core",
'file-path': "ui/ui_core.js",
'provides-package': "ui",
'provides-modules': { "control": true, "animation": true }
},
{
// 'description': "Provides common UI widget types",
'direct-name': "ui-widget",
'file-path': "ui/ui-widget.js",
'depends': "common-ajax",
'provides-package': "ui",
'provides-modules': { "widget": true }
},
{
'direct-name': "external-component-core",
'file-path': "externalcomponent/external_component_core.js",
'provides-package': "external-component"
},
{
'file-path': "/resources/feedback/js/feedback.js",
'provides-package': "validation"
},
{
'file-path': "/resources/rss-feed-widget/js/rss-feed-widget-core.js",
'provides-package': "rss-feed-widget"
},
{
'file-path': "carousel/carousel-core.js",
'depends': [ "thirdparty-jquery", "jquery-hoverflow" , "jquery-touchwipe" , "mobiledetect" ],
'provides-package': "js-carousel-core"
},
{
'file-path': "carousel/carousel_large.js",
'depends': "js-carousel-core",
'provides-package': "js-carousel-large"
},
/* THIRD PARTY PACKAGES */
{
'direct-name': "thirdparty-jquery",
'file-path': "thirdparty/jquery/thirdparty-jquery.js",
'provides-package': "jquery"
},
{
'file-path': "thirdparty/jquery/thirdparty-jquery-app.js",
'depends': "thirdparty-jquery",
'provides-package': "example-jquery-app"
},
{
'file-path': "thirdparty/jquery/plugins/jquery-placeholder-0.1.js",
'depends': "thirdparty-jquery",
'provides-package': "jquery-placeholder"
},
{
'file-path': "thirdparty/jquery/plugins/jquery-selectbox.js",
'depends': "thirdparty-jquery",
'provides-package': "jquery-selectbox"
},
{
'file-path': "thirdparty/jquery/plugins/jquery-simpleImageCheck-0.4.js",
'depends': "thirdparty-jquery",
'provides-package': "jquery-simpleImageCheck"
},
{
'file-path': "thirdparty/jquery/plugins/jquery-filestyle.js",
'depends': "thirdparty-jquery",
'provides-package': "jquery-filestyle"
},
{
'file-path': "thirdparty/jquery/plugins/jquery.hoverflow.min.js",
'depends': "thirdparty-jquery",
'provides-package': "jquery-hoverflow"
},
{
'file-path': "thirdparty/jquery/plugins/jquery.touchwipe.min.js",
'depends': "thirdparty-jquery",
'provides-package': "jquery-touchwipe"
},
{
'direct-name': "thirdparty-addthis",
'file-path': "thirdparty/addthis/thirdparty-addthis.js",
'provides-package': "3rdparty.AddThis"
},
{
'direct-name': "thirdparty-omniture",
'file-path': "thirdparty/omniture/thirdparty-omniture.js",
'provides-package': "3rdparty",
'provides-modules': { "omniture": true }
},
{
'file-path': "mobiledetection/mobile-detect.js",
'provides-package': "mobiledetect"
}
]);
}
})();
if (!$TORA.configured) {
$TORA.configured = true;
(function() {
/**
* $Id$
*
* Project: DNI Javascript Site Configuration:
* Discovery Channel Brasil
* Version: 0.0.2
* Author: alucas
*
*/
//#SITE INITIALISATION
$TORA.Requirement(null, [
"environment::PageContext", "authentication"], true)(function() {
//#SET SITE DEFAULTS
//REPORTING SETTINGS
$TORA("DEFAULTS").add("NetworkInfoProcessor", {
BASE: { name: "DSC Brasil", unit: "DNI", brand: "Discovery Channel" , region: "Brazil"}
});
$TORA("DEFAULTS").add("OmnitureProcessor", {
account: "disccdnidscbrazil",
rawVars: {
s_trackDownloadLinks: true, s_trackExternalLinks: true, s_trackInlineStats: true,
s_linkDownloadFileTypes: "exe,zip,wav,mp3,mov,mpg,avi,doc,pdf,xls,jpg",
s_linkInternalFilters: "javascript:,yourdiscovery.com,discoverychannel.co.uk,tudiscovery.com,discoverychannelbrasil.com,tudiscoverykids.com,discoverykidsbrasil.com,dmax.de,discoveryisispreview2.com,discoveryisispreview.com,discoverybrasil.uol.com.br,discoverymulher.uol.com.br,discoverykidsbrasil.uol.com.br"
}
});
//INTERFACE DEFAULTS
$TORA("DEFAULTS").add("BasicInteractive", {
context: $TORA("PAGE"),
CLICK_REFRESH_LIMIT: 20,
DISABLE_AD_REFRESH: false
});
//SETUP ADVERTISING
$TORA.Requirement("advertising")(function() {
var adManager,
context = $TORA("PAGE"),
window = context.getWindow();
function createDefaultAdPositions(manager, window, classTPL) {
var grp = window.document.location.pathname,
cc = context.getCountryCode() || "",
sc = context.getProperty("siteCode") || "",
classTPL = "dni-advertising-%%POS%%-wrapper";
var lb = manager.createPosition("LEADERBOARD", {
target: classTPL.replace("%%POS%%", "leaderboard", "g"),
delayInit: true,
params: { position: "topbanner", country: cc, grouping: grp}
});
var sk = manager.createPosition("SKYSCRAPER", {
target: classTPL.replace("%%POS%%", "skyscraper", "g"),
delayInit: true,
params: { position: "skyscraper", country: cc, grouping: grp}
});
var mp = manager.createPosition("MPU", {
target: classTPL.replace("%%POS%%", "mpu", "g"),
delayInit: true,
params: { position: "mpu", country: cc, grouping: grp}
});
if (sc) {
if (lb) lb.params.domain = sc;
if (sk) sk.params.domain = sc;
if (mp) mp.params.domain = sc;
}
};
$TORA.whenReady(function() {
context.setProperty("adManager",
(adManager = $TORA("advertising").AdManager(window)));
createDefaultAdPositions(
adManager,
window,
"dni-advertising-%%pos%%-wrapper");
});
});
$TORA.Requirement(null, ["external.advertising::USFormatAdapter"], true)(function() {
$TORA("external").advertising.USFormatAdapter(window).exec();
});
//SETUP REPORTING
$TORA.Requirement([
"reporting.dispatchers::ComscoreDispatcher",
"reporting.dispatchers::OmnitureDispatcher"
])(function() {
var pageContext = $TORA("PAGE"), reporting = $TORA("reporting"),
processors = reporting.processors, dispatchers = reporting.dispatchers;
var config = {
context: pageContext,
processorList: [
processors.NetworkInfoProcessor, processors.UserInfoProcessor,
processors.OmnitureProcessor
],
dispatcherMap: {
"comscore": dispatchers.ComscoreDispatcher,
"omniture": dispatchers.OmnitureDispatcher,
"omnitureEvent": dispatchers.OmnitureEventDispatcher
}
};
var report = reporting.PageReport(config),
c;
pageContext.setProperty("pageReport", report);
pageContext.setProperty("pageReportConfig", config);
if (c = $TORA("siteCode"))
pageContext.setProperty("siteCode", c);
/*
$TORA.whenReady(function() {
if (!pageContext.getProperty("noAutoReport")) {
report.run();
report.send("comscore");
report.send("omniture");
}
});
*/
});
$TORA.whenReady(function() {
function displayBar(){
// LOAD SHUFFLE BAR IF NOT MOBILE OS
if (document.cookie.indexOf("mobile=0") != -1) {
$TORA.Requirement("shuffle::ShuffleBar")(function() {
var shufflePackage = $TORA("shuffle");
var instance = shufflePackage.ShuffleBar(document.body);
instance.load();
$TORA.registry().add("ShuffleBar", instance);
});
}
}
// IF NO ENTRY FOR MOBILE IN COOKIE - CHECK FOR MOBILE OS, ADD TO COOKIE
if (document.cookie.search(/mobile=[0-1]/) == -1 ) {
$TORA.Requirement("mobiledetect")(function() {
document.cookie = $TORA("mobiledetect").MobileDetector().isJSEnabledPhone() ? "mobile=1" : "mobile=0" ;
displayBar();
});
} else {
displayBar();
}
});
});
//END SITE INITIALISATION
if (window.$TORA) {
var sc = "DCBR";
$TORA.registry().add("siteCode", sc);
}
})();
}