blob: ba3919ee4d2f047cc863eab28615a5052f07b46f [file] [log] [blame]
var localJSVersion='07122007';
var MainLocalObj = {
eventHandlers:[],
data:
{
userSpecificData:false,
weatherLoc:{
locCode:'',
zip:'',
name:''
},
newsLoc:{
zip:'',
name:''
}
},
internationalUser:false,
setUserSpecificData:function(flag) { this.data.userSpecificData = flag; },
setInternationalUser:function(flag) { this.internationalUser = flag; },
setLocationZip:function(type, zip)
{
if(type=='weather' || type=='all')
{
this.data.weatherLoc.zip = zip;
}
if(type=='news' || type=='all')
{
this.data.newsLoc.zip = zip;
}
},
setLocationName:function(type, name)
{
if(type=='weather' || type=='all')
{
this.data.weatherLoc.name = name;
}
if(type=='news' || type=='all')
{
this.data.newsLoc.name = name;
}
},
setLocationLocCode:function(type, code)
{
if(type=='weather' || type=='all')
{
this.data.weatherLoc.locCode = code;
}
},
loadDefaultData:function(edition)
{
var allCookies = CNN_getCookies();
var lwpCookie = allCookies[ "lwp.weather" ] || null;
var lwpLocCode='';
var lwpZip='';
if(edition)
{
if(edition == 'cnnIntl')
{
this.internationalUser = true;
}
}
else
{
this.internationalUser = false;
}
if(lwpCookie)
{
var locationArr=unescape(lwpCookie).split('|');
var weatherLocParse = locationArr[0];
if(lwpCookie.indexOf('~')==-1)
{
weatherLocParse=lwpCookie.replace('|','~');
}
var lwpDataArr = locationArr[0].split('~');
lwpLocCode=lwpDataArr[0];
lwpZip=lwpDataArr[1];
}
if(cnnLocalStorage.contains('localData'))
{
this.data = cnnLocalStorage.get('localData');
if(lwpZip && lwpLocCode) {
this.data.weatherLoc.locCode = lwpLocCode;
this.data.weatherLoc.zip = lwpZip;
}
this.data.userSpecificData = true;
this.triggerEvent('all/update');
}
else if(lwpZip)
{
if(checkZip(lwpZip))
{
this.data.userSpecificData = true;
this.setLocationZip('all', lwpZip);
this.setLocationLocCode('all', lwpLocCode);
this.triggerEvent('all/update');
}
else
{
requestInternationalCityLookup(lwpZip,lwpLocCode,'all');
}
}
else if(!this.internationalUser)
{
var randomCityData=
[
{
name:'Welcome, NC',
zip:'27374'
},
{
name:'Cool, CA',
zip:'95614'
},
{
name:'Truth or Consequences, NM',
zip:'87901'
},
{
name:'Okay, OK',
zip:'74446'
},
{
name:'Ideal, GA',
zip:'31041'
},
{
name:'Success, MO',
zip:'65570'
},
{
name:'North, SC',
zip:'29112'
},
{
name:'Earth, TX',
zip:'79031'
},
{
name:'Odd, WV',
zip:'25902'
}
];
var randNum=Math.floor(Math.random()*randomCityData.length);
var randomObj = randomCityData[randNum];
this.setLocationZip('all', randomObj.zip);
this.setLocationName('all', randomObj.name);
this.triggerEvent('all/update');
}
this.triggerEvent('main/start');
},
save:function()
{
var expDate=new Date(1292112000000); //Sun, 12 Dec 2010 00:00:00 GMT
var newVal = this.data.weatherLoc.locCode + '~' + this.data.weatherLoc.zip;
var cookieValue = "";
if(lwpCookie)
{
var weatherCookie = '';
var locationArr=unescape(lwpCookie).split('|');
locationArr.unshift(newVal);
for (var i=0; i<locationArr.length; i++) {
if (locationArr[i] != newVal && (weatherCookie.indexOf(locationArr[i]) == -1) || i == 0) {
weatherCookie += locationArr[i];
if (i < (locationArr.length - 1)) {
weatherCookie += "|";
}
}
}
} else {
weatherCookie = newVal;
}
CNN_setCookie('lwp.weather', weatherCookie, 24*30*12, '/', document.domain);
lwpQueryStr = 'weather='+this.data.weatherLoc.zip + '.' + this.data.weatherLoc.locCode + '&celcius='+allCookies[ "default.temp.units" ];
CSIManager.getInstance().call('http:/\/svcs.cnn.com/weather/wrapper.jsp',lwpQueryStr,'cnnLWPWeather');
cnnLocalStorage.put('localData', this.data, expDate);
if(!cnnLocalStorage.save())
{
alert('unable to save data');
}
},
addEventHandler:function(event, funcObj)
{
var eventHandlerArr = this.eventHandlers[event];
if(!eventHandlerArr)
{
eventHandlerArr = new Array();
}
eventHandlerArr.push(funcObj);
this.eventHandlers[event] = eventHandlerArr;
},
triggerEvent:function(event, args1, args2, args3)
{
var eventHandlerArr = this.eventHandlers[event];
if(!eventHandlerArr)
{
eventHandlerArr = new Array();
}
for(var i=0;i<eventHandlerArr.length;i++)
{
var configObj = this.data;
if(eventHandlerArr[i])
{
var funcObj = eventHandlerArr[i];
if(args3)
{
funcObj( configObj, event, args1, args2, args3 );
}
else if(args2)
{
funcObj( configObj, event, args1, args2 );
}else if(args1)
{
funcObj( configObj, event, args1 );
}
else
{
funcObj( configObj, event );
}
}
}
}
}
var omnitureStr = "var s=s_gi(s_account);s.linkTrackVars='events,products';s.linkTrackEvents='event2';s.events='event2';s.products=';Topix:Local;;;event2=1;';void(s.tl(this,'o','Topix Local Clickthrough'));";
function localUpdateData(name, zip, code, type)
{
MainLocalObj.setLocationZip(type, zip);
MainLocalObj.setLocationName(type, name);
MainLocalObj.setLocationLocCode(type, code);
MainLocalObj.setUserSpecificData(true);
MainLocalObj.save();
MainLocalObj.triggerEvent(type+'/update');
}
function requestLocalWeather(configObj)
{
var weatherUrl='http://svcs.cnn.com/weather/getForecast';
var weatherArgs='mode=json_html&zipCode='+configObj.weatherLoc.zip;
if(configObj.weatherLoc.locCode)
{
weatherArgs+='&locCode='+configObj.weatherLoc.locCode;
}
if(MainLocalObj.internationalUser || allCookies[ "default.temp.units" ] == "true")
{
weatherArgs+='&celcius=true';
}
CSIManager.getInstance().call( weatherUrl, weatherArgs,'cnnWeatherDetailsToday', updateLocalWeather, false);
}
MainLocalObj.addEventHandler('weather/update',requestLocalWeather);
MainLocalObj.addEventHandler('all/update',requestLocalWeather);
function requestLocalNews(configObj)
{
var newsUrl='http://local.cnn.com/local/cnn/json';
if(checkZip(configObj.newsLoc.zip)){ var newsArgs='q='+configObj.newsLoc.zip; }
else{ var newsArgs='q='+urlEncode(configObj.newsLoc.name); }
CSIManager.getInstance().call( newsUrl, newsArgs,'cnnLocalNewsList', updateLocalNews, false);
}
MainLocalObj.addEventHandler('news/update',requestLocalNews);
MainLocalObj.addEventHandler('all/update',requestLocalNews);
function displayAppropriateSearchBoxes()
{
if(!MainLocalObj.data.userSpecificData)
{
Element.show('cnnGetLocalBox');
}
}
MainLocalObj.addEventHandler('main/start',displayAppropriateSearchBoxes);
function hideAppropriateSearchBoxes( type )
{
if(MainLocalObj.data.userSpecificData)
{
Element.hide('cnnGetLocalBox');
}
if(type=='all'||type=='news')
{
Element.hide('cnnCustomNewsBox');
}
if(type=='all'||type=='weather')
{
Element.hide('cnnCustomWeatherBox');
}
}
function updateLocalWeather(obj)
{
var weatherLink='http://weather.cnn.com/weather/';
if(MainLocalObj.internationalUser)
{
weatherLink='http://weather.edition.cnn.com/weather/intl/';
}
weatherLink += 'forecast.jsp?zipCode='+MainLocalObj.data.weatherLoc.zip;
if(MainLocalObj.data.weatherLoc.locCode)
{
weatherLink+='&locCode='+MainLocalObj.data.weatherLoc.locCode;
}
var locStr= MainLocalObj.data.weatherLoc.name;
var detailsToday='';
var detailsTomorrow='';
var chgStr = '';
var degScale = (MainLocalObj.internationalUser || allCookies[ "default.temp.units" ] == "true" ? 'C' : 'F');
if(obj.length>-1)
{
locStr= obj[0].location.city;
if(obj[0].location.stateOrCountry)
{
locStr+= ', '+obj[0].location.stateOrCountry;
}
}
if(MainLocalObj.data.userSpecificData)
{
chgStr = ' (<a href="javascript:changeLoc(\'weather\')">change</a>)';
}
for(var counter=0;counter<obj.length;counter++)
{
if(obj[counter] && obj[counter].forecast && obj[counter].forecast.days)
{
if(obj[counter].forecast.days.length>-1)
{
var today=obj[counter].forecast.days[0];
detailsToday+='<a class="cnnDate" href="'+weatherLink+'&iref=wxtodayicon">'
+'<img src="http://i.cdn.turner.com/cnn/.element/img/2.0/weather/03/'+today.icon+'" width="60" height="51" alt=""/></a>'
+'<br/><a class="cnnDate" href="'+weatherLink+'&iref=wxtoday"><b>Today</b></a><br/>'
+'<span class="cnnTemperature">HI '+today.high+'&deg;'+degScale+' '
+'<span class="cnnVerticalBar">|</span> LO '+today.low+'&deg;'+degScale+'</span>';
}
if(obj[counter].forecast.days.length>0)
{
var tomorrow=obj[counter].forecast.days[1];
detailsTomorrow+='<a class="cnnDate" href="'+weatherLink+'&iref=wxtomorrowicon">'
+'<img src="http://i.cdn.turner.com/cnn/.element/img/2.0/weather/03/'+tomorrow.icon+'" width="60" height="51" alt=""/></a>'
+'<br/><a class="cnnDate" href="'+weatherLink+'&iref=wxtomorrow"><b>Tomorrow</b></a><br/>'
+'<span class="cnnTemperature">HI '+tomorrow.high+'&deg;'+degScale+' '
+'<span class="cnnVerticalBar">|</span> LO '+tomorrow.low+'&deg;'+degScale+'</span>';
}
}
}
Element.update('cnnWeatherDetailsHeader','<p><span class="cnnHeaderLnk"><a href="'+weatherLink+'&iref=wxheader"><span>Weather</span> &raquo;</a></span></p>');
Element.update('cnnWeatherDetailsTomorrow',detailsTomorrow);
Element.update('cnnWeatherLocationMore','<span><b><a href="'+weatherLink+'&iref=wxcityname">'+locStr+'</a></b>'+chgStr+'</span><a href="'+weatherLink+'&iref=wxmorecities" class="cnnWeatherMoreCities">10 day forecast&nbsp;&raquo;</a><br/>');
Element.show('cnnWeatherDetails');
hideAppropriateSearchBoxes('weather');
return detailsToday;
}
function updateLocalNews(obj)
{
var ret='';
var max=4;
var chgStr = '';
var displayStr='';
if(MainLocalObj.data.userSpecificData)
{
chgStr = ' (<a href="javascript:changeLoc(\'news\')">change</a>)';
if(!MainLocalObj.internationalUser) { max = 5; }
}
for(var counter=0;counter<obj.length;counter++)
{
var resultSet=obj[counter].ResultSet;
if(parseInt(resultSet.statusCode) != 200 || resultSet.Result.length < 1)
{
ret+='<li>Sorry, we are unable to find any headlines for that location. Please try widening your search to a larger area</li>';
}
else
{
if(resultSet.country=="United States")
{
var displayStr=resultSet.city+', '+resultSet.state;
}
else
{
var displayStr=resultSet.country;
}
var result=resultSet.Result;
for(var i=0;i<result.length;i++)
{
if(i<max)
{
ret+='<li><div class="cnnLocalSource">'
+ '<a target="new" href="'+result[i].sourceurl+'" ';
if(!MainLocalObj.internationalUser)
{
ret+='onclick="'+omnitureStr+'" ';
}
ret+='><span>'+result[i].source+'</span>'
+ ' &raquo;</a></div>'
+ '<div><a target="new" href="'+result[i].link+'" ';
if(!MainLocalObj.internationalUser)
{
ret+=' onclick="'+omnitureStr+'"';
}
ret+= '>'+result[i].headline+'</a></div></li>';
}
}
}
}
var htmlStr = '<span><b>'+displayStr+'</b>'+chgStr+'</span><div class="cnnWeatherMoreCities"><b>'+'from <a target="new" href="http://www.topix.com/redir/loc=prss-cnnlogo/http://www.topix.com/"';
if(!MainLocalObj.internationalUser)
{
htmlStr += ' onclick="'+omnitureStr+'"';
}
htmlStr += '>Topix.com'+'</a></b></div><br/>';
Element.update('cnnWeatherLocation', htmlStr);
Element.show('cnnLocalNews');
hideAppropriateSearchBoxes('news');
return ret;
}
function requestInternationalCityLookup(zip, loc, type)
{
var weatherUrl='http://svcs.cnn.com/weather/getForecast';
var weatherArgs='mode=json_html&zipCode='+zip;
if(loc)
{
weatherArgs+='&locCode='+loc;
}
if(MainLocalObj.internationalUser)
{
weatherArgs+='&celcius=true';
}
CSIManager.getInstance().call( weatherUrl, weatherArgs,type, updateInternationalCityData, true);
}
function updateInternationalCityData(obj, type)
{
var locCode = '';
var zip = '';
var locationName = '';
if(obj && (obj.length>-1) && obj[0].location && obj[0].location.city)
{
locCode = obj[0].location.locCode;
locationName = obj[0].location.city;
if(obj[0].location.stateOrCountry)
{
locationName+=', '+obj[0].location.stateOrCountry;
}
zip = obj[0].location.zip;
}
if(zip && locationName)
{
MainLocalObj.setLocationZip(type, zip);
MainLocalObj.setLocationName(type, locationName);
MainLocalObj.setLocationLocCode(type, locCode);
MainLocalObj.setUserSpecificData(true);
MainLocalObj.triggerEvent(type+'/update');
}
}
function checkInput(inputMode, value)
{
//First remove any html/script tags
value = value.replace(/<[^>]*?>/g,'');
var qryArg = value.toUpperCase();
var validatorUrl='http://weather.cnn.com/weather/citySearch';
var validatorArgs='search_term='+urlEncode(qryArg)+'&mode=json_html&filter=true';
CSIManager.getInstance().call(validatorUrl, validatorArgs, urlEncode(inputMode+'|'+value), updateValidationData, true);
}
function updateValidationData(obj, idString)
{
var rawData = urlDecode(idString).split('|');
var cleanValue = trimWS(rawData[1]);
//Capitalize, buffer with spaces to match on whole words
var preparedValue = ' '+cleanValue.toUpperCase()+' ';
var locationObj = '';
if(obj.length>1) // There are multiple matches. Weed out the one we want.
{
var done=obj.length;
var exactMatch=false;
var noMatch=true;
var possibleLocations = new Array();
if(done>50) { done = 50;} // Max cap of 50
for(var i=0;i<done;i++)
{
var match=obj[i].city+', '+obj[i].stateOrCountry;
var objZip=obj[i].zip.toString();
var objLocCode=obj[i].locCode;
var preparedMatch=' '+trimWS(match.toUpperCase() )+' ';
if( ( checkZip(cleanValue) && cleanValue == objZip ) || ( preparedValue == preparedMatch ) )
{
var newLocationObj = new Object();
newLocationObj.zip = objZip;
newLocationObj.locCode = objLocCode;
newLocationObj.name = match;
possibleLocations.push(newLocationObj);
noMatch=false;
exactMatch=newLocationObj;
i=done;
}
else
{
if(preparedMatch.indexOf(preparedValue) != -1)
{
var newLocationObj = new Object();
newLocationObj.zip = objZip;
newLocationObj.locCode = objLocCode;
newLocationObj.name = match;
possibleLocations.push(newLocationObj);
noMatch=false;
}
}
}//end for loop
if(noMatch)
{
displayNoMatch(rawData[0], cleanValue);
}
else if(possibleLocations.length==1 || exactMatch)
{
if(!exactMatch)
{
exactMatch = possibleLocations[0];
}
locationObj = new Object();
locationObj.name=exactMatch.city+', '+exactMatch.stateOrCountry;
locationObj.zip=exactMatch.zip.toString();
locationObj.locCode=exactMatch.locCode;
localUpdateData(locationObj.name, locationObj.zip, locationObj.locCode, rawData[0]);
hideAppropriateSearchBoxes(rawData[0]);
}
else
{
// We have a bunch of possible locations.
displayMultipleMatches( possibleLocations, urlDecode( rawData[1] ), rawData[0]);
}
}
else if((obj.length==1) && (obj[0] && obj[0].locCode && obj[0].locCode!=''))
{
var tmpObj = obj[0];
locationObj = new Object();
locationObj.name=tmpObj.city+', '+tmpObj.stateOrCountry;
locationObj.zip=tmpObj.zip.toString();
locationObj.locCode=tmpObj.locCode;
localUpdateData(locationObj.name, locationObj.zip, locationObj.locCode, rawData[0]);
hideAppropriateSearchBoxes( rawData[0] );
}
else
{
displayNoMatch(rawData[0], cleanValue);
}
return '';
}
function displayMultipleMatches(matches, origVal, type)
{
var val = '';
var container = '';
switch(type)
{
case 'news':
val=$F('cnnCustomNewsInput');
container='cnnCustomNewsContainer';
break;
case 'weather':
val=$F('cnnCustomWeatherInput');
container = 'cnnCustomWeatherContainer';
break;
default:
val=$F('cnnGetLocalInput');
container='cnnGetLocalContainer';
}
var htmlStr = '<b>We found '+matches.length+' results for "'+origVal+'"</b>'
+'<ul id="cnnFindWeatherList" style="list-style:none">';
for(var j=0;j<matches.length;j++)
{
htmlStr+= '<li><a href="javascript:void(0)" onclick="resetSearch(\''+type+'\');'
+ 'localUpdateData(\''+matches[j].name+'\',\''+matches[j].zip
+ '\',\''+matches[j].locCode + '\',\''+type+'\');">'
+ matches[j].name+'</a></li>';
}
htmlStr+='</ul><div class="cnnPad3Top"> </div>';
if( type=='all' && MainLocalObj.internationalUser )
{
htmlStr = '<div style="height:156px;">'+htmlStr+'</div>';
}
Element.update(container, htmlStr);
}
function displayNoMatch(type,val)
{
var container='cnnGetLocalContainer';
switch(type)
{
case 'news':
container='cnnCustomNewsContainer';
break;
case 'weather':
container = 'cnnCustomWeatherContainer';
break;
default:
container='cnnGetLocalContainer';
}
var htmlStr='<b>We didn\'t find results for "'+val+'"</b>'
+'<ul id="cnnWeatherErrorList"><li style="color:#727272">Check your spelling of the city name</li>'
+'<li style="color:#727272">Make sure the U.S. ZIP code is accurate</li><li style="color:#727272">Use the '
+'<a href="http://www.usps.com" target="new" class="cnnFindWeather">USPS</a> '
+'for U.S. zip codes / city names</li></ul><div id="cnnFindWeatherSkip">'
+'<a href="javascript:void(0)" class="skip" onclick="skipThis(\''+type+'\')">'
+'skip this&nbsp;&raquo;</a></div>';
if(type == 'all' && MainLocalObj.internationalUser)
{
htmlStr = '<div style="height:156px;">'+htmlStr+'</div>';
}
else if(type=='news')
{
htmlStr+='<div class="cnnPad70Top"> </div>';
}
Element.update(container, htmlStr);
}
function skipThis(type)
{
resetSearch(type);
if(type=='news')
{
Element.show('cnnLocalNews');
Element.hide('cnnCustomNewsBox');
}
else if(type=='weather')
{
Element.show('cnnWeatherDetails');
Element.hide('cnnCustomWeatherBox');
}
}
function changeLoc(mode)
{
if(mode=='news')
{
Element.hide('cnnLocalNews');
Element.show('cnnCustomNewsBox');
}
else if(mode=='weather')
{
Element.hide('cnnWeatherDetails');
Element.show('cnnCustomWeatherBox');
}
}
function resetSearch(type)
{
var container='';
var fieldName='';
var htmlStr = '';
switch(type)
{
case 'news':
fieldName='cnnCustomNewsInput';
container='cnnCustomNewsContainer';
break;
case 'weather':
fieldName='cnnCustomWeatherInput';
container = 'cnnCustomWeatherContainer';
break;
default:
if(type == 'all' && MainLocalObj.internationalUser)
{
htmlStr = '<div class="cnnPad156Top"> </div>';
}
fieldName='cnnGetLocalInput';
container='cnnGetLocalContainer';
}
Element.update(container, htmlStr);
$(fieldName).value='Enter a U.S./Intl city or ZIP code';
}
function trimWS(str)
{
str=str.replace(/,/g,' ');
str=str.replace(/^\s*(\S+)*\s*$/,"$1");
str=str.replace(/(\s{1})\s*/g,"$1");
return str;
}
function urlEncode(str)
{
str=trimWS(str);
str=str.replace(/st\./i,'saint');
str=str.replace(/mt\./i,'mount');
str=escape(str);
return str;
}
function urlDecode(str)
{
return unescape(str);
}
function checkZip(str)
{
str=trimWS(str.toString());
var bool=(str.match(/^\d{5}$/)!=null && str!='00000'?true:false);
return bool;
}