/*** * Simple JS inheritance * John Resig * * @see http://ejohn.org/blog/simple-javascript-inheritance/ ***/ (function(){ var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; this.Class = function(){}; Class.extend = function(prop) { var _super = this.prototype; initializing = true; var prototype = new this(); initializing = false; for (var name in prop) { prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn){ return function() { var tmp = this._super; this._super = _super[name]; var ret = fn.apply(this, arguments); this._super = tmp; return ret; }; })(name, prop[name]) : prop[name]; } function Class() { if ( !initializing && this.init ) this.init.apply(this, arguments); } Class.prototype = prototype; Class.constructor = Class; Class.extend = arguments.callee; return Class; }; })(); /******************************** * _ * * _____ ___ ___| |_ ___ * * | |_ -| | . | _| * * --|_|_|_|___|_|_|___|___|-- * * \ \ \ \ \ \ \ \ \ * * Msnbc.com core JavaScript * ********************************/ /*** * namespace msnbc ***/ (function() { msnbc = window.msnbc || {}; /*** * function namespace * * @param name:String period-delimited string of object to create/return, i.e. package path * @param [base_scope:Object] optional starting object to attach namespace to * * takes a string name and returns corresponding object attached to window or the base_scope parameter * @example msnbc.namespace('foods.pastas.fusilli'); * // returns window.foods.pastas.fusilli object * @example var trees = {}; * msnbc.namespace('coniferous.pine', trees); * // returns trees.coniferous.pine object in local scope ***/ msnbc.namespace = function(name, base_scope) { var parts = name.split("."); // attach object hierarchy to window if base scope not defined var curr = base_scope || window; // recursively create objects or return if already there according to the package path for (var i=0; i < parts.length; i++) { curr = (function (p, c) { p[c] = p[c]||{}; return p[c]; })(curr, parts[i]); } return curr; }; /*** * Package msnbc.core ***/ (function() { var $$ = msnbc.namespace("msnbc.core"); /*** * class msnbc.core.EventDispatcher extends Class * * basic class with foundational event messaging methods ***/ $$.EventDispatcher = Class.extend({ init: function() { this.__listeners = {}; }, /*** * method dispatchEvent * * @param msg:String name of event being dispatched * @param params:Object passed on to the listening method ***/ dispatchEvent:function(msg, scope, params){ var ls = this.__listeners[msg]; if (!ls) return; for (var i = ls.length - 1; i >= 0; i--){ if (typeof(ls[i]) == "function") { ls[i].call(this, scope, params); } } }, /*** * method addListener * * @param msg:String name of event to listen for * @param callback:Function closure that will receive event and params when dispatchEvent method is fired ***/ addListener: function(msg, callback){ if (this.__listeners[msg]==undefined) this.__listeners[msg] = []; if (typeof(callback)=="function") { this.__listeners[msg].push(callback); } }, toString: function() { return '[EventDispatcher object]'; } }); })(); /* END package msnbc.core */ /*** * Package msnbc.document ***/ (function(){ /*** * object msnbc.document * * methods and properties and data related to the page instance * INCOMPLETE INCOMPLETE INCOMPLETE ***/ var $$ = msnbc.namespace("msnbc.document"); $$.wbid = 0; $$.displaymode = 0; $$.isPreview = false; $$.cookies = {}; $$.timers = {}; $$.analytics = {}; $$.PREVIEW_PATTERN = "msnbc-wbpreview"; $$.isPreviewURL = function() { return window.location.host.indexOf($$.PREVIEW_PATTERN)!=-1; }; $$.wbid2url = function(wbid, displaymode) { //return a page url based on given wbid and current document location/work environment/etc }; $$.url2env = function(url) { // return a new full uri, including original extra parameters, but transformed given current document // work environment, etc }; })(); /* END package msnbc.document */ /*** * Package msnbc.utils ***/ (function() { var $$ = msnbc.namespace("msnbc.utils"); /*** * function getArray * * @param loc:String period-delimited path to array you want to create or access if already created * * this works like msnbc.namespace(), except that the final value is an array, not an object * msnbc.utils.getArray('trees.coniferous.pine.needles'); * // returns array at window.trees.coniferous.pine.needles ***/ $$.getArray = function(loc) { var arr = window[loc] || []; if (loc.match(/\./)) { var ns = loc.substring(0, loc.lastIndexOf('.')); var an = loc.slice(loc.lastIndexOf('.')+1); var nsobj = msnbc.namespace(ns); nsobj[an] = nsobj[an] || [] arr = nsobj[an]; // make sure it wasn't defined already as some other object type if (arr.length==undefined||typeof(arr)=='string') msnbc.warn('[msnbc.utils::getArray] already defined as non-array: ' +loc); // USE WITH $1.3 if (!jQuery.isArray(arr)) msnbc.warn('[msnbc.utils::getArray] already defined as non-array: ' +loc); } return arr; }; // TODO: support for other media subdomains? $$.makeAIMS = function(url, size){ var rx = url.match(/(http\:\/\/msnbcmedia)\d??(\.msn\.com\/)[ij](\/.*?)(\..*?)?\.jpg/i); return rx[1] + rx[2] + 'j' + rx[3] + '.' + (size||'standard') + '.jpg'; }; // TODO: finish this $$.truncate = function(str, length, useWordBoundary, useChars, endingStr){ // defaults length=length||15; useChars=useChars||true; useWordBoundary=useWordBoundary||false; endingStr=endingStr||" ..."; var rx, result; if (useChars) { if (useWordBoundary) rx = new RegExp("^.{0,"+length+"}\s"); // \b flag doesn't work, not awesome. else rx = new RegExp("^.{0,"+length+"}"); } else { // count words } result = rx.exec(str); if (result) { return result[0]+endingStr; } else { msnbc.warn("Msnbc.utils.truncate error"); } }; $$.isAboveViewport = function(selectr, offset){ var t = $(window).scrollTop(); return t >= $(selectr).offset().top + $(selectr).height() + (offset||0); }; $$.isBelowViewport = function(selectr, offset){ var b = $(window).height() + $(window).scrollTop(); return b <= $(selectr).offset().top + (-offset||0); }; $$.isInViewport = function(selectr, padding){ return !$$.isAboveViewport(selectr, padding) && !$$.isBelowViewport(selectr, padding); }; })(); /* END package msnbc.utils */ msnbc.warn = function(msg) { /*msnbc.document.isPreviewURL() || */ if (msnbc.document.VERBOSE) { alert(msg); } else if (window.console) { console.warn('msnbc: '+msg); } }; /*tiff addition*/ msnbc.print = function(msg){}; msnbc.log = function(msg){ if (window.console) { if (typeof(msg)=="string") { console.log('msnbc: '+msg); } else { console.log(msg); } } }; })(); /* END namespace msnbc */