function TiiAolSponsorBox() {
 this.stest = "off";
 this.showBottom = true;
 this.page = 1;
 this.rv = "1.2";
 this.nt = "";
 this.render = TiiRenderSponsorBoxes;
 this.renderPopup = TiiRenderSponsorPopup;
 this.getQueryString = TiiAolSponsorGetQueryString;
 window.sponsorConfig = this;
}

function TiiAolSponsorGetQueryString() {
 var mykeys = new Array("query", "sch", "ssch", "sclient", "spch", "snum", "of", "page", "invType", "rv", "nt");
 var s = "";
 for (var i = 0; i < mykeys.length; i++) {
 s += "&" + mykeys[i] + "=" + escape(this[mykeys[i]]);
 }
 return s;
}

////// SEARCH PAGE FUNCTIONS

function TiiRenderSponsorBoxes(query) {
 this.query = unescape(query);

 tiiCreateSponsorDivs();

 tiiGetSponsoredLinks(this);
 tiiGetWebOffers(this);
}

// Set up callbacks and request data
function tiiGetSponsoredLinks(config) {
 params.stest = config.stest;
 params.squery = config.query;
 params.sch = config.sch;
 params.ssch = config.ssch;
 params.sclient = config.sclient;
 params.spch = config.spch;
 params.page = config.page;
 params.rv = config.rv;
 params.nt = config.nt;
 params.snum = "3";
 if (document.getElementById('aolSponsorBoxBottom')) {
 params.snum = "7";
 }

 params.of = "js";
 params.callback = "tiiSponsoredLinksDone";

 // This calls tiiSponsoredLinksDone(data) when it is done
 get_links();
}

function tiiGetWebOffers(config) {
 // Create JS Link
 var url = 'http://weboffer.timeinc.net/WebOffers/weboffers.js?source=weboffers_api&invocationType=' + config.invType + '&query=' + escape(config.query) + '&count=4';
 var text = '<scr' + 'ipt type="text/javascript" src="' + url + '"></scr' + 'ipt>';
 // Write to page - it will call a callback function
 document.write(text);
}

function tiiSponsoredLinksDone(sponsorData) {
 var sl1;
 var sl2;

 var topDiv = document.getElementById('aolSponsoredLinksTop');
 var bottomDiv = document.getElementById('aolSponsoredLinksBottom');

 if(sponsorData.length!=0) {
 if (topDiv != null) {
 sl1 = tiiRenderLinks(sponsorData, 1, 3);
 topDiv.appendChild(sl1);
 }

 if (sponsorConfig.showBottom) {
 if (bottomDiv != null) {
 if (sponsorData.length > 3) {
 sl2 = tiiRenderLinks(sponsorData, 4, 4);
 bottomDiv.appendChild(sl2);
 } else {
 document.getElementById('aolSponsorBoxBottom').style.display = "none";
 }
 }
 }

 } else {
 if (topDiv != null) {
 document.getElementById('aolSponsorBoxTop').style.display = "none";
 }

 if (bottomDiv != null) {
 document.getElementById('aolSponsorBoxBottom').style.display = "none";
 }
 }
}

function tiiWebOffersDone(webOffers) {
 var wo = document.getElementById("aolWebOffers");

 if (wo != null) {
 if (typeof webOffers == "object" && webOffers.length > 0) {
 wo.appendChild(document.createTextNode("See Sponsored Links For: "));

 for (var i = 0; i < webOffers.length; i++) {
 var term = webOffers[i][0];
 var termHtml = webOffers[i][1];

 sponsorConfig.query = term;
 //sponsorConfig.page = 1;
 var url = tiiSponsoredPopupUrl() + "?" + sponsorConfig.getQueryString();

 var a = tii_dom_createElement('a', new Array(
 ["href", url],
 ["target", "_blank"]
 ));
 a.innerHTML = termHtml;
 wo.appendChild(a);

 if (i < (webOffers.length -1)) {
 wo.appendChild(document.createTextNode(", "));
 }
 }
 }
 }
}

////// POPUP FUNCTIONS

function TiiRenderSponsorPopup(query) {
 this.query = query;

 tiiGetSponsoredPopup(this);
}

function tiiGetSponsoredPopup(config) {
 params.stest = config.stest;
 params.squery = config.query;
 params.sch = config.sch;
 params.ssch = config.ssch;
 params.sclient = config.sclient;
 params.spch = config.spch;
 params.page = config.page;
 params.rv = config.rv;
 params.nt = config.nt;
 params.snum = "10";
 params.of = "js";
 params.callback = "tiiSponsoredPopupDone";

 // This calls tiiSponsoredPopupDone(data) when it is done
 get_links();
}

function tiiSponsoredPopupDone(sponsorData) {
 var sl;

 if(sponsorData.length != 0) {
 window.sponsorConfig.page++;
 if (typeof(__slm_nt) != "undefined") window.sponsorConfig.nt = __slm_nt;

 var url = tiiSponsoredPopupUrl() + "?" + sponsorConfig.getQueryString();

 sl = tiiRenderPopupLinks(sponsorData, 1, 10);
 document.getElementById('offers').appendChild(sl);

 // Next Link
 var a = document.createElement("a");
 a.setAttribute("href", url);
 a.innerHTML = "Next &raquo;"
 document.getElementById('prevnext').appendChild(a);

 } else {
 document.getElementById('offers').style.visibility = "hidden";

 }

}

function tiiRenderPopupLinks(sponsorData, start, count) {
 var ul = tii_dom_createElement('ul', new Array());

 var start = start - 1;
 var end = start + count - 1;

 for (var i = start; i <= end; i++) {
 if (sponsorData[i]) {
 var li = tii_dom_createElement('li', new Array());

 var hSpan = tii_dom_createElement('span', new Array(["class", "headline"]));
 var dSpan = tii_dom_createElement('span', new Array(["class", "desc"]));
 var uSpan = tii_dom_createElement('span', new Array(["class", "url"]));

 var a1 = tii_dom_createElement('a', new Array(["href", sponsorData[i].redirect_url]));
 tii_addEventHandler(a1, "mouseover", function() {window.status='Done'; return true;}, false);
 tii_addEventHandler(a1, "mouseout", function() {window.status=''; return true;}, false);
 var a2 = a1.cloneNode(false);
 var a3 = a1.cloneNode(false);
 var br1 = tii_dom_createElement('br', new Array());
 var br2 = br1.cloneNode(false);

 a1.innerHTML = sponsorData[i].title;
 var desc = " " + sponsorData[i].d1 + " " + sponsorData[i].d2;
 a2.innerHTML = tiiAolSponsorBoldTerm(sponsorConfig.query, desc);
 a3.innerHTML = sponsorData[i].url;

 hSpan.appendChild(a1);
 dSpan.appendChild(a2);
 uSpan.appendChild(a3);

 li.appendChild(hSpan);
 li.appendChild(br1);
 li.appendChild(dSpan);
 li.appendChild(br2);
 li.appendChild(uSpan);

 ul.appendChild(li);
 }
 }

 return ul;
}

////// SUPPORT FUNCTIONS

// Turns Sponsored Links into DLs
function tiiRenderLinks(sponsorData, start, count) {
 var dl = tii_dom_createElement('dl', new Array());

 var start = start - 1;
 var end = start + count - 1;

 for (var i = start; i <= end; i++) {
 if (sponsorData[i]) {
 var a1 = tii_dom_createElement('a', new Array(
 ["href", sponsorData[i].redirect_url]
 ));
 tii_addEventHandler(a1, "mouseover", function() {window.status='Done'; return true;}, false);
 tii_addEventHandler(a1, "mouseout", function() {window.status=''; return true;}, false);
 var a2 = a1.cloneNode(false);

 a1.innerHTML = sponsorData[i].title;

 var urlSpan = tii_dom_createElement('span', new Array(
 ["class", "url"]
 ));
 urlSpan.appendChild(document.createTextNode(sponsorData[i].url));

 var descSpan = tii_dom_createElement('span', new Array());
 var desc = " " + sponsorData[i].d1 + " " + sponsorData[i].d2;
 descSpan.innerHTML = tiiAolSponsorBoldTerm(sponsorConfig.query, desc);
 a2.appendChild(urlSpan);
 a2.appendChild(descSpan);

 var dt = tii_dom_createElement('dt', new Array());
 dt.appendChild(a1);

 var dd = tii_dom_createElement('dd', new Array());
 dd.appendChild(a2);

 dl.appendChild(dt);
 dl.appendChild(dd);
 }
 }

 return dl;
}

// Set up the DIVs that are to be populated by other functions on client search pages
function tiiCreateSponsorDivs() {
 var sb1 = document.getElementById('aolSponsorBoxTop');
 var sb2 = document.getElementById('aolSponsorBoxBottom');

 var sbTitle = tii_dom_createElement('div', new Array(["class", "aolTitle"]));
 var titleDiv = tii_dom_createElement('div', new Array());
 titleDiv.appendChild(document.createTextNode("Sponsored Links"));
 sbTitle.appendChild(titleDiv);
 var sb2Title = sbTitle.cloneNode(true);

 if (sb1 != null) {
 var sl1 = tii_dom_createElement('div', new Array(
 ["id", "aolSponsoredLinksTop"],
 ["class", "aolSponsorLinks"]
 ));

 var wo = tii_dom_createElement('div', new Array(
 ["id", "aolWebOffers"],
 ["class", "webResults"]
 ));

 sb1.setAttribute("class", "aolSponsoredLinks");
 sb1.className = "aolSponsoredLinks";

 sb1.appendChild(sbTitle);
 sb1.appendChild(sl1);
 sb1.appendChild(wo);
 }

 if (sb2 != null) {
 if (sponsorConfig.showBottom) {
 var sl2 = tii_dom_createElement('div', new Array(
 ["id", "aolSponsoredLinksBottom"],
 ["class", "aolSponsorLinks"]
 ));

 sb2.setAttribute("class", "aolSponsoredLinks");
 sb2.className = "aolSponsoredLinks";

 sb2.appendChild(sb2Title);
 sb2.appendChild(sl2);
 }
 }
}

function tiiAolSponsorBoldTerm(term, message) {
 pattern = new RegExp("(" + term + ")", "gi");
 result = message.replace(pattern, "<b>$1</b>");
 return result;
}

function tiiWebOffersPopup(url) {
 window.open(url, "weboffers", "width=640,height=640,left=8,top=8,location=no,menubar=no,resizable=no,scrolllbars=yes,status=yes,toolbar=no", false);
 return false;
}

function tiiSponsoredPopupUrl() {
 return "http://www.timeinc.net/shared/vgn/aol_sponsored_links/popup/0,29877,,00.html";
}

// ### Array Helper Functions ###

function tiiArrayContains (array, value) {
 if (array != null) {
 var al = array.length;
 for (var i = 0; i < al; i++) {
 if (array[i] == value) return true;
 }
 }
 return false;
}

// ### Key=Value; Functions ###

function tiiHashKeys(string) {
 var keys = null;
 if (string != null) {
 var hash = string.split(';');
 var hl = hash.length - 1;
 if(hl > 0){
 keys = new Array();
 for(var i = 0; i < hl; i++){
 var data = hash[i].split('=');
 keys[i] = data[0].replace(' ', '');
 }
 }
 }
 return keys;
}

function tiiHashGet(string, key) {
 var value = null;
 if (string != null) {
 var keyStart = key + '=';
 var offset = string.indexOf(keyStart);
 if (offset != -1) {
 offset += keyStart.length;
 var end = string.indexOf(';', offset);
 if (end == -1) {
 end = string.length;
 }
 value = string.substring(offset, end);
 }
 }
 return value;
}

function tiiHashSet(string, key, value) {
 var string = tiiHashDelete(string, key);
 var newValue = key + '=' + value + ';';
 if (string != null) newValue = newValue + string;
 return newValue;
}

function tiiHashDelete(string, key) {
 var oldValue = tiiHashGet(string, key);
 var newString = string;
 if (oldValue != null) {
 var search = key + '=';
 var start = string.indexOf(search);
 var offset = start + search.length;
 var end = string.indexOf(';', offset) + 1;
 if (end == -1) end = string.length;
 newString = string.slice(0,start) + string.slice(end,string.length);
 return newString;

 }
 return newString;
}

function tiiGetQueryParamValue(param) {
 var startIndex;
 var endIndex;
 var valueStart;

 var qs = document.location.search;
 var detectIndex = qs.indexOf( "?" + param + "=" );
 var detectIndex2 = qs.indexOf( "&" + param + "=" );
 var key = "&" + param + "=";
 var keylen = key.length;

 if (qs.length > 1) {
 if (detectIndex != -1) {
 startIndex = detectIndex;
 } else if (detectIndex2 != -1) {
 startIndex = detectIndex2;
 } else {
 return null;
 }

 valueStart = startIndex + keylen;

 if (qs.indexOf("&", valueStart) != -1) {
 endIndex = qs.indexOf("&", startIndex + 1)
 } else {
 endIndex = qs.length
 }

 return (qs.substring(qs.indexOf("=", startIndex) + 1, endIndex));
 }

 return null;
}

// ### Date/Time Functions ###

function tiiDateGetOffsetMinutes(minutes) { var today = new Date(); return today.getTime() + (60000) * minutes;}
function tiiDateGetOffsetHours(hours) { var today = new Date(); return today.getTime() + (3600000) * hours; }
function tiiDateGetOffsetDays(days) { var today = new Date(); return today.getTime() + (86400000) * days; }
function tiiDateGetOffsetWeeks(weeks) { var today = new Date(); return today.getTime() + (604800000) * weeks; }
function tiiDateGetOffsetMonths(months) { var today = new Date(); return today.getTime() + (259200000) * months; }
function tiiDateGetOffsetYears(years) { var today = new Date(); return today.getTime() + (31536000000) * years; }
function tii_dom_createElement (nodeName, attributes)
{
 var isopera = typeof window.opera != 'undefined';
 var isie = typeof document.all != 'undefined'
 && !isopera && navigator.vendor != 'KDE';

 var newElement;
 try
 {
 newElement = document.createElement (nodeName);
 }
 catch (error)
 {
 return null;
 }

 var attributesLength = attributes.length;
 for (var i = 0; i < attributesLength; i++)
 {
 var attribute = attributes [i] [0];
 var value = attributes [i] [1];
 newElement.setAttribute (attribute, value);
 switch (attribute)
 {
 case 'id':
 newElement.id = value;
 break;
 case 'class':
 if (isie)
 {
 newElement.setAttribute ('className', value);
 }
 newElement.className = value;
 break;
 case 'style':
 newElement.style.cssText = newElement.style.cssText + ' ' + value;
 break;
 case 'for':
 if (isie)
 {
 newElement.setAttribute ('htmlFor', value);
 }
 newElement.htmlFor = value;
 }
 }

 return newElement;
}

function tii_dom_removeWhitespaceTextNodes (node)
{
 for (var x = 0; x < node.childNodes.length; x++)
 {
 var child = node.childNodes [x];
 if (child.nodeType == 3 && !/\S/.test (child.nodeValue))
 {
 node.removeChild (node.childNodes [x]);
 x--;
 }
 if (child.nodeType == 1)
 {
 tii_dom_removeWhitespaceTextNodes (child);
 }
 }
}
function tii_callFunctionOnWindowLoad (functionToCall)
{
 if (typeof window.addEventListener != 'undefined')
 {
 window.addEventListener ('load', functionToCall, false);
 }
 else if (typeof document.addEventListener != 'undefined')
 {
 document.addEventListener ('load', functionToCall, false);
 }
 else if (typeof window.attachEvent != 'undefined')
 {
 window.attachEvent ('onload', functionToCall);
 }
 else
 {
 var oldFunctionToCall = window.onload;
 if (typeof window.onload != 'function')
 {
 window.onload = functionToCall;
 }
 else
 {
 window.onload = function ()
 {
 oldFunctionToCall ();
 functionToCall ();
 };
 }
 }
}

function tii_callFunctionOnElementLoad (targetId, functionToCall)
{
 var myArguments = arguments;
 tii_callFunctionOnWindowLoad (function ()
 {
 window.loaded = true;
 });
 var targetElement = document.getElementById (targetId);
 if (targetElement == null && !window.loaded)
 {
 var pollingInterval = setInterval (function ()
 {
 if (window.loaded)
 {
 clearInterval (pollingInterval);
 }
 targetElement = document.getElementById (targetId);
 if (targetElement != null)
 {
 clearInterval (pollingInterval);
 var argumentsTemp = new Array ();
 var argumentsTempLength = myArguments.length - 2;
 for (var i = 0; i < argumentsTempLength; i++)
 {
 argumentsTemp [i] = myArguments [i + 2];
 }
 functionToCall.apply (this, argumentsTemp);
 }
 }, 10);
 }
}

function tii_addEventHandlerOnElementLoad (targetId, eventType, functionToCall, bubbleEventUpDOMTree)
{
 tii_callFunctionOnWindowLoad (function ()
 {
 window.loaded = true;
 });
 var targetElement = document.getElementById (targetId);
 if (targetElement == null && !window.loaded)
 {
 var pollingInterval = setInterval (function ()
 {
 if (window.loaded)
 {
 clearInterval (pollingInterval);
 }
 targetElement = document.getElementById (targetId);
 if (targetElement != null)
 {
 clearInterval (pollingInterval);
 tii_addEventHandler (targetElement, eventType, functionToCall, bubbleEventUpDOMTree);
 }
 }, 10);
 }
}

function tii_addEventHandler (targetElement, eventType, functionToCall, bubbleEventUpDOMTree)
{
 if (typeof targetElement.addEventListener != 'undefined')
 {
 targetElement.addEventListener (eventType, functionToCall, bubbleEventUpDOMTree);
 }
 else if (typeof targetElement.attachEvent != 'undefined')
 {
 targetElement.attachEvent ('on' + eventType, functionToCall);
 }
 else
 {
 eventType = 'on' + eventType;
 if (typeof targetElement [eventType] == 'function')
 {
 var oldListener = targetElement [eventType];
 targetElement [eventType] = function ()
 {
 oldListener ();
 return functionToCall ();
 }
 }
 else
 {
 targetElement [eventType] = functionToCall;
 }
 }

 return true;
}

function tii_removeEventHandler (targetElement, eventType, functionToRemove, bubbleEventUpDOMTree)
{
 if (typeof targetElement.removeEventListener != "undefined")
 {
 targetElement.removeEventListener (eventType, functionToRemove, bubbleEventUpDOMTree);
 }
 else if (typeof targetElement.detachEvent != "undefined")
 {
 targetElement.detachEvent ("on" + eventType, functionToRemove);
 }
 else
 {
 targetElement ["on" + eventType] = null;
 }

 return true;
}