/*******************************************
http://blstj.msn.com/br/gbl/js/2/core.js
Link given for gtl template broken.
Snagged from msn directory: http://specials.msn.com/alphabet.aspx
********************************************/
Function.prototype.addMethod = function(name, func) {
if(!this.prototype[name]) {
this.prototype[name] = func;
}
return this;
};
Function.addMethod("as", function(ns, isSingleton) {
var chain = (ns ? ns.split('.') : []); if(chain.length > 0) {
var base = window; for(var ndx = 0; ndx < chain.length - 1; ++ndx) {
var token = chain[ndx]; if(token) {
if(!base[token]) {
base[token] = {
}; }
base = base[token]; }
}
base[chain.last()] = (isSingleton ? new this() : this); }
return this; }
);
Function.addMethod("ns", function(ns) {
this.as(ns, 1); }
);
String.addMethod("trim", function() {
return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/,"$1");});
String.addMethod("collapse", function() {
return this.replace(/\s+/g,' ').trim();});
String.addMethod("wrap", function(delim) {
var close, delims = {
"(" : ")", "{" : "}", "[" : "]", "<" : ">", "«" : "»", "‹" : "›", "“" : "”", "‘" : "’"}; if(delims[delim]) {
close = delims[delim]; }
else {
var m = (/^<(\w+)(\s+\w+\s*=\s*"[^"]*")*\s*>$/).exec(delim);if(m) {close="";}} return delim+this+(close?close:delim);});
String.addMethod("format", function() {
var fmt = this; for(var ndx = 0; ndx < arguments.length; ++ndx) {
fmt = fmt.replace(new RegExp('\\{' + ndx + '\\}', "g"), arguments[ndx]); }
return fmt; }
);
Array.addMethod("last", function() {
return(this.length > 0 ? this[this.length - 1] : void(0)); }
);
Array.addMethod("remove", function(obj) {
for(var ndx = this.length - 1; ndx >= 0; --ndx) {
if(this[ndx] === obj) {
this.splice(ndx, 1); }
}
return this; }
);
Array.addMethod("contains", function(obj) {
for(var ndx = 0; ndx < this.length; ++ndx) {
if(this[ndx] === obj) {
return 1; }
}
return 0; }
);
Array.addMethod("push", function(obj) {
this[this.length] = obj; return this.length; }
);
Array.addMethod("shift", function() {
return this.splice(0, 1)[0]; }
);
Array.addMethod("splice", function(start, delCount) {
var delta; var addCount = arguments.length - 2; if(start > this.length) {
start = this.length; }
if(start + delCount > this.length) {
delCount = this.length - start; }
var deleted = []; for(var ndx = 0; ndx < delCount; ++ndx) {
deleted.push(this[start + ndx]); }
if(addCount > delCount) {
delta = addCount - delCount; for(ndx = this.length + delta - 1; ndx >= start + delta; --ndx) {
this[ndx] = this[ndx - delta]; }
}
else if(addCount < delCount) {
delta = delCount - addCount; for(ndx = start + addCount; ndx < this.length - delta; ++ndx) {
this[ndx] = this[ndx + delta]; }
for(; ndx < this.length - 1; ++ndx) {
delete this[ndx]; }
this.length -= delta; }
for(ndx = 0; ndx < addCount; ++ndx) {
this[start + ndx] = arguments[2 + ndx]; }
return deleted; }
);
(function() {
var dom = this; Function.addMethod("hook", function(element, eventName) {
if(element) {
var isSafari = checkSafari(); if(!isSafari && element.addEventListener) {
element.addEventListener(eventName, this, false); }
else if(!isSafari && element.attachEvent) {
element.attachEvent('on' + eventName, this); }
else {
var handlers = element["x" + eventName]; if(handlers && handlers.constructor == Array) {
if(handlers.contains(this)) {
handlers = null; }
else {
handlers.push(this); }
}
else {
handlers = element["x" + eventName] = [this]; }
if(handlers) {
element['on' + eventName] = function(ev) {
var returnValue = true; ev = dom.Event(ev); for(var ndx = 0; ndx < handlers.length; ++ndx) {
var handlerReturn = handlers[ndx](ev); if(typeof handlerReturn != "undefined" &&!handlerReturn) {
returnValue = false; }
}
return returnValue; }; element = null; }
}
}
return this; }
); Function.addMethod("unhook", function(element, eventName) {
if(element) {
var isSafari = checkSafari(); if(!isSafari && element.removeEventListener) {
element.removeEventListener(eventName, this, false); }
else if(!isSafari && element.detachEvent) {
element.detachEvent('on' + eventName, this); }
else {
var arr = element["x" + eventName]; if(arr && arr.constructor == Array) {
arr.remove(this); }
else {
element["on" + eventName] = null; }
}
}
return this; }
); dom.CancelEvent = function(ev) {
ev = dom.Event(ev); if(ev) {
ev.cancelBubble = true; if(ev.stopPropagation) {
ev.stopPropagation(); }
ev.returnValue = false; if(ev.preventDefault) {
ev.preventDefault(); }
}
return false; }; dom.Event = function(ev) {
return(ev ? ev : window.event); }; dom.Target = function(ev) {
ev = dom.Event(ev); var target = (ev.target ? ev.target : ev.srcElement); if(target && target.nodeType != 1) {
target = dom.ParentElem(target); }
return target; }; dom.InnerText = function(el) {
var text = ''; for(var ndx = 0; ndx < el.childNodes.length; ndx++) {
var child = el.childNodes[ndx]; if(child.nodeType == 1) {
text += dom.InnerText(child); }
else if(child.nodeType == 3) {
text += child.data; }
}
return text; }; dom.NextElem = function(element, tagName) {
var nextElement = element.nextSibling; while(nextElement && (nextElement.nodeType != 1 || (tagName && nextElement.nodeName != tagName))) {
nextElement = nextElement.nextSibling; }
return nextElement; }; dom.PrevElem = function(element, tagName) {
var prevElement = element.previousSibling; while(prevElement && (prevElement.nodeType != 1 || (tagName && prevElement.nodeName != tagName))) {
prevElement = prevElement.previousSibling; }
return prevElement; }; dom.ParentElem = function(element, tagName) {
var parentNode = element.parentNode; while(parentNode && (parentNode.nodeType != 1 || (tagName && parentNode.nodeName != tagName))) {
parentNode = parentNode.parentNode; }
return parentNode; }; dom.ChildElem = function(parentNode, tagName, immediate) {
var element = null, childNode; for(var ndx = 0; !element && ndx < parentNode.childNodes.length; ++ndx) {
childNode = parentNode.childNodes[ndx]; if(childNode.nodeType == 1) {
if(!tagName || childNode.nodeName == tagName) {
element = childNode; }
}
}
if(!immediate) {
for(ndx = 0; !element && ndx < parentNode.childNodes.length; ++ndx) {
childNode = parentNode.childNodes[ndx]; if(childNode.nodeType == 1) {
element = dom.ChildElem(childNode, tagName); }
}
}
return element; }; dom.ForEach = function(func, parent, tagName) {
for(var ndx = 0; ndx < parent.childNodes.length; ++ndx) {
var child = parent.childNodes[ndx]; if(child.nodeType == 1 && (!tagName || child.nodeName == tagName)) {
if(func(child)) {
break; }
}
}
}; dom.ChildCount = function(element, nodeName) {
var count = 0; var ndx, child; for(ndx = 0; ndx < element.childNodes.length; ++ndx) {
child = element.childNodes[ndx]; count += (child.nodeType == 1 && (!nodeName || child.nodeName == nodeName) ? 1 : 0); }
return count; }
dom.AddClass = function(element, className) {
var originalValue = element.className; if(originalValue) {
var originalClasses = originalValue.collapse().split(' '); var newClasses = className.collapse().split(' '); for(var ndx = 0; ndx < newClasses.length; ++ndx) {
var newClass = newClasses[ndx]; if(!originalClasses.contains(newClass)) {
element.className += ' ' + newClass; }
}
}
else {
element.className = className; }
return element.className; }; dom.DelClass = function(element, className) {
var originalValue = element.className; if(originalValue) {
var classes = originalValue.collapse().split(' '); var oldClasses = className.collapse().split(' '); for(var ndx = 0; ndx < oldClasses.length; ++ndx) {
classes.remove(oldClasses[ndx]); }
var newValue = classes.join(' '); if(newValue != originalValue) {
element.className = newValue; }
}
return element.className; }; dom.HasClass = function(element, className) {
return element.className.collapse().split(' ').contains(className); }; dom.Updated = function() {
if(dom.Access && typeof dom.Access.Updated == 'function') {
dom.Access.Updated(); }
}; function checkSafari() {
return(navigator.userAgent.indexOf("Safari") >= 0); }
}
).ns("Msn.DOM");
(function() {
var bind = this; var allBindings = []; Function.addMethod("bind", function(sel, args) {
var elements; switch(typeof sel) {
case'object':elements = (sel.nodeType == 1 || sel.nodeType == 9) ? [sel] : (sel.length ? sel : null); break; case'string':elements = bind.Select(sel); break; }
if(elements) {
for(var ndx = 0; ndx < elements.length; ++ndx) {
var element = elements[ndx]; var binding = new this(element, args); if(element.bindings) {
element.bindings.push(binding); }
else {
element.bindings = [binding]; }
allBindings.push(binding); }
}
return this; }
); bind.Unbind = function(element, recurse) {
var ndx; if(element.bindings && element.bindings.length) {
for(ndx = 0; ndx < element.bindings.length; ++ndx) {
var binding = element.bindings[ndx]; if(binding && typeof binding.dispose == 'function') {
binding.dispose(); }
allBindings.remove(binding); }
element.bindings = null; }
if(recurse) {
for(ndx = 0; ndx < element.childNodes.length; ++ndx) {
var child = element.childNodes[ndx]; if(child.nodeType == 1) {
bind.Unbind(child, recurse); }
}
}
}; bind.Select = function(cssSelector) {
function getIdentifier() {
var identifier = null; if(cssSelector) {
if(cssSelector.charAt(pos) == '*') {
identifier = '*'; }
else {
while(pos < cssSelector.length) {
var ch = cssSelector.charAt(pos); if(('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('0' <= ch && ch <= '9') || ch == '-') {
identifier = (identifier ? identifier + ch : ch); ++pos; }
else {
break; }
}
}
}
return identifier; }
function skipSpace() {
while(pos < cssSelector.length && cssSelector.charAt(pos) == ' ') {
++pos; }
}
function getCombinator() {
var combinator = null; skipSpace(); switch(cssSelector.charAt(pos)) {
case'+':case'>':combinator = cssSelector.charAt(pos); ++pos; skipSpace(); break; }
return combinator; }
function getHashOrClass() {
++pos; return getIdentifier(); }
function getSimpleSelector() {
var selector = null; var element = getIdentifier(); if(element !== null) {
selector = new SimpSelector(element); }
while(cssSelector && pos < cssSelector.length) {
var ch = cssSelector.charAt(pos); if(ch == '#') {
if(!selector) {
selector = new SimpSelector(); }
selector.setID(getHashOrClass()); }
else if(ch == '.') {
if(!selector) {
selector = new SimpSelector(); }
selector.addClass(getHashOrClass()); }
else {
break; }
}
return selector; }
function getSelectors() {
var selectors = []; var simpleSelector = getSimpleSelector(); if(simpleSelector) {
selectors.push(simpleSelector); while(pos < cssSelector.length) {
var combinator = getCombinator(); simpleSelector = getSimpleSelector(); if(simpleSelector) {
if(combinator) {
simpleSelector.setComb(combinator); }
selectors.push(simpleSelector); }
else {
break; }
}
}
return selectors; }
function SimpSelector(element) {
var simp = this; var id = ''; var combinator = null; var classes = null; simp.setID = function(idValue) {
id = idValue; }; simp.setComb = function(comb) {
combinator = comb; }; simp.addClass = function(className) {
if(classes) {
classes.push(className); }
else {
classes = [className]; }
}; simp.getNodes = function(parent) {
var ndx, node, nextElement, nodeList = []; if(id) {
switch(combinator) {
case'>':for(ndx = 0; ndx < parent.childNodes.length; ++ndx) {
if(parent.childNodes[ndx].nodeType == 1 && parent.childNodes[ndx].id == id) {
node = parent.childNodes[ndx]; break; }
}
break; case'+':nextElement = getNextElement(parent); if(nextElement && nextElement.id == id) {
node = nextElement; }
break; default : node = parent.getElementById(id); break; }
if(node && (!element || element == '*' || element.toLowerCase() == node.nodeName.toLowerCase()) && checkClasses(node)) {
nodeList.push(node); }
}
else if(element && element != '*') {
switch(combinator) {
case'>':for(ndx = 0; ndx < parent.childNodes.length; ++ndx) {
node = parent.childNodes[ndx]; if(node.nodeType == 1 && node.nodeName.toLowerCase() == element && checkClasses(node)) {
nodeList.push(node); }
}
break; case'+':nextElement = getNextElement(parent); if(nextElement && nextElement.nodeName.toLowerCase() == element && checkClasses(nextElement)) {
nodeList.push(nextElement); }
break; default : var elements = parent.getElementsByTagName(element); for(ndx = 0; ndx < elements.length; ++ndx) {
if(checkClasses(elements[ndx])) {
nodeList.push(elements[ndx]); }
}
break; }
}
else {
switch(combinator) {
case'>':for(ndx = 0; ndx < parent.childNodes.length; ++ndx) {
node = parent.childNodes[ndx]; if(node.nodeType == 1 && checkClasses(node)) {
nodeList.push(node); }
}
break; case'+':nextElement = getNextElement(parent); if(nextElement && checkClasses(nextElement)) {
nodeList.push(nextElement); }
break; default : checkNodeClasses(parent, nodeList); break; }
}
return nodeList; }; function checkNodeClasses(parent, nodes) {
for(var ndx = 0; ndx < parent.childNodes.length; ++ndx) {
var node = parent.childNodes[ndx]; if(node.nodeType == 1) {
if(checkClasses(node)) {
nodes.push(node); }
checkNodeClasses(node, nodes); }
}
}
function checkClasses(element) {
var okay = 1; if(classes) {
var className = element.className; if(className) {
var classNames = className.collapse().split(' '); for(var ndx = 0; ndx < classes.length; ++ndx) {
if(!classNames.contains(classes[ndx])) {
okay = 0; break; }
}
}
else {
okay = 0; }
}
return okay; }
}
function applySelector(elements, simpleSelector) {
var matchedElements = []; for(var ndx = 0; ndx < elements.length; ++ndx) {
matchedElements = matchedElements.concat(simpleSelector.getNodes(elements[ndx])); }
return matchedElements; }
var pos = 0; var sels = getSelectors(); var elements = [document]; for(var ndx = 0; ndx < sels.length && elements.length > 0; ++ndx) {
elements = applySelector(elements, sels[ndx]); }
return elements; }; function getNextElement(element) {
var nextElement = element.nextSibling; while(nextElement && nextElement.nodeType != 1) {
nextElement = nextElement.nextSibling; }
return nextElement; }
(function() {
bind.Unbind(document, 1); allBindings = []; }
).hook(window, "unload"); }
).ns("Msn.Bind");
(function(el, args) {
if(!args) {
args = {
}; }
var dom = Msn.DOM; var d = document; var w = window; var elMoreDIV = d.getElementById("more"); elMoreDIV.style.display = "none"; var elMoreUL = d.getElementById("xnav"); var elMoreLI = d.createElement("li"); var elMoreA = d.createElement("a"); elMoreA.href = "#"; elMoreA.className = "expand"; elMoreA.innerHTML = argWithDefault(args.more, "more"); elMoreLI.appendChild(elMoreA); elMoreUL.appendChild(elMoreLI); toggle.hook(elMoreA, "click"); function toggle(ev) {
var state = elMoreDIV.style.display; var expand; if(state == "block") {
state = "none"; expand = "expand"; elMoreLI.className = ""; }
else {
state = "block"; expand = "collapse"; elMoreLI.className = "last"; }
elMoreDIV.style.display = state; elMoreA.className = expand; ev = dom.Event(ev); return dom.CancelEvent(ev); }
this.dispose = function() {
el = null; elMoreDIV = null; elMoreUL = null; elMoreLI = null; elMoreA = null; }; function argWithDefault(arg, def) {
return(typeof arg != "undefined" ? arg : def)}
}
).as("Msn.Header");
(function(el, args) {
if(!args) {
args = {
}; }
var dom = Msn.DOM; var d = document; var w = window; var searchParam = argWithDefault(args.searchParam, ""); var searchParams = argWithDefault(args.searchParams, ""); var searchText = argWithDefault(args.searchSite, ""); var searchUrl = argWithDefault(args.searchUrl, ""); var searchWeb = argWithDefault(args.searchWeb, ""); if(searchText !== "") {
var elSiteSearch = d.getElementById("sitesearch"); var elSiteInput = d.createElement("input"); elSiteInput.className = "button"; elSiteInput.id = "site"; elSiteInput.name = "site"; elSiteInput.type = "submit"; elSiteInput.value = searchText; elSiteSearch.appendChild(elSiteInput); var elWebInput = d.getElementById("web"); elWebInput.value = searchWeb; doSiteSearch.hook(elSiteInput, "click"); var elSearchText = d.getElementById("q"); doEnter.hook(elSearchText, "keypress"); }
function doEnter(ev) {
if(ev.keyCode == 13) {
doSiteSearch(null); ev = dom.Event(ev); return dom.CancelEvent(ev); }
}
function doSiteSearch(ev) {
if(ev !== null) {
if(dom.Target(ev).id != "site")return; }
var term = encodeURIComponent(d.getElementById("q").value); var url = searchUrl + "?" + searchParam + "=" + term; if(searchParams) {
url = url + "&" + searchParams.replace("&amp;", "&"); }
window.top.location.href = url; ev = dom.Event(ev); return dom.CancelEvent(ev); }
this.dispose = function() {
el = null; }; function argWithDefault(arg, def) {
return(typeof arg != "undefined" ? arg : def)}
}
).as("Msn.SiteSearch");
