var slideSpeed=50;var slideInterval=0;var currentPage=null;var currentDialog=null;var currentWidth=0;var currentHash=location.hash;var hashPrefix="#_";var pageHistory=[];var newPageCount=0;var checkTimer=null;var savedScrollPosition=null;var hasAnimationSupport=window.WebKitCSSMatrix?true:false;var itemCurrentlySelected=false;function $(e){return document.getElementById(e);}
addEventListener("load",function(event)
{var page=getSelectedPage();if(page)
showPage(page);setTimeout(checkOrientAndLocation,0);checkTimer=setInterval(checkOrientAndLocation,400);var l=readCookie('l');var p=readCookie('p');if(l)
$('loginEmail').value=l;if(p)
$('loginPassword').value=p;},false);addEventListener("click",function(event)
{var link=findParent(event.target,"a");if(link&&link.rel!='ignore')
{function unselect(){link.removeAttribute("selected");itemCurrentlySelected=false;}
function markRead(){link.className="read";}
if(link.href&&link.hash&&link.hash!="#")
{if(busyOnRPC)
{event.preventDefault();return;}
link.setAttribute("selected","true");showPage($(link.hash.substr(1)));setTimeout(unselect,500);}
else if(link==$("backButton"))
history.back();else if(link.target=="replace")
{if(busyOnRPC)
{event.preventDefault();return;}
savedScrollPosition=getTop(event.target);link.setAttribute("selected","progress");var isLoadMore=(link.className=="loadMore");if(isLoadMore)
link.innerHTML='Loading 20 more items';showPageByHref(link.href,link.rel,unselect,markRead,isLoadMore);}
else if(link==$('logoutButton'))
{deleteCookie('p');$('loginPassword').value='';history.back();}
else
return;event.preventDefault();}},true);function getTop(obj)
{var curtop=0;if(obj.offsetParent){do{curtop+=obj.offsetTop;}while(obj=obj.offsetParent);}
return curtop;}
function showPageByHref(href,rel,cb,mr,isLoadMore)
{var currentPage=getSelectedPage();switch(currentPage.id)
{case'feedList':feedListController.feedTouched(rel,cb);return;break;case'feedItemList':if(isLoadMore)
{feedListController.loadMoreTouched(rel);return;}
else
{feedListController.feedItemTouched(rel,cb);setTimeout(mr,500);}
return;break;case'removeFeedSection':var sure=confirm("Are you sure you want to remove this feed?");if(sure)
{setTimeout(cb,5);for(var i=0;i<currentPage.childNodes.length;i++)
if(currentPage.childNodes[i].childNodes[1].rel==rel)
{currentPage.removeChild(currentPage.childNodes[i]);settingsController.onRemoveFeedTouch(rel);return;}}
break;}
setTimeout(cb,2000);}
addEventListener("click",function(event)
{var div=findParent(event.target,"div");if(div&&hasClass(div,"toggle"))
{div.setAttribute("toggled",div.getAttribute("toggled")!="true");event.preventDefault();}},true);function getSelectedPage()
{for(var child=document.body.firstChild;child;child=child.nextSibling)
{if(child.nodeType==1&&child.getAttribute("selected")=="true")
return child;}}
function showPage(page,backwards)
{if(page)
{if(currentDialog)
{currentDialog.removeAttribute("selected");currentDialog=null;}
var fromPage=currentPage;currentPage=page;if(fromPage)
setTimeout(slidePages,0,fromPage,page,backwards);else
updatePage(page,fromPage);}}
function insertPages(nodes)
{var targetPage;for(var i=0;i<nodes.length;++i)
{var child=nodes[i];if(child.nodeType==1)
{if(!child.id)
child.id="__"+(++newPageCount)+"__";var clone=$(child.id);if(clone)
clone.parentNode.replaceChild(child,clone);else
document.body.appendChild(child);if(child.getAttribute("selected")=="true"||!targetPage)
targetPage=child;--i;}}
if(targetPage)
showPage(targetPage);}
function findParent(node,localName)
{while(node&&(node.nodeType!=1||node.localName.toLowerCase()!=localName))
node=node.parentNode;return node;}
function updatePage(page,fromPage)
{if(!page.id)
page.id="__"+(++newPageCount)+"__";location.href=currentHash=hashPrefix+page.id;pageHistory.push(page.id);var pageTitle=$("pageTitle");if(page.title)
pageTitle.innerHTML=page.title;var backButton=$("backButton");if(backButton)
{var prevPage=$(pageHistory[pageHistory.length-2]);if(prevPage&&!page.getAttribute("hideBackButton"))
{backButton.style.display="inline";backButton.innerHTML=prevPage.title?prevPage.title:"Back";}
else
backButton.style.display="none";}
if(page.id=='feedList')
{$('settingsButton').style.display='block';$('logoutButton').style.display='block';$('tellaFriendButton').style.display='none';}
else
{$('settingsButton').style.display='none';$('logoutButton').style.display='none';if(page.id=='feedItemList')
$('tellaFriendButton').style.display='block';else
$('tellaFriendButton').style.display='none';}
if(fromPage&&fromPage.id=='feedDetails')
scrollPage(savedScrollPosition);}
function slidePages(fromPage,toPage,backwards)
{var axis=(backwards?fromPage:toPage).getAttribute("axis");if(axis=="y")
(backwards?fromPage:toPage).style.top="100%";else
{if(backwards)
toPage.style.left="-100%";else
toPage.style.left="100%";}
toPage.setAttribute("selected","true");scrollTo(0,1);clearInterval(checkTimer);if(hasAnimationSupport)
{var toPageToLeft="0%";var fromPageToLeft="-100%";if(backwards)
fromPageToLeft="100%"
function onAnimationEnd()
{if(!hasClass(toPage,"dialog"))
fromPage.removeAttribute("selected");checkTimer=setInterval(checkOrientAndLocation,300);updatePage(toPage,fromPage);}
setupTransition(fromPage,'left','0.4s','cubic-bezier','left',fromPageToLeft);setupTransition(toPage,'left','0.4s','cubic-bezier','left',toPageToLeft,onAnimationEnd);return;}
var percent=100;slide();var timer=setInterval(slide,slideInterval);function slide()
{percent-=slideSpeed;if(percent<=0)
{percent=0;if(!hasClass(toPage,"dialog"))
fromPage.removeAttribute("selected");clearInterval(timer);checkTimer=setInterval(checkOrientAndLocation,300);updatePage(toPage,fromPage);}
if(axis=="y")
{backwards?fromPage.style.top=(100-percent)+"%":toPage.style.top=percent+"%";}
else
{fromPage.style.left=(backwards?(100-percent):(percent-100))+"%";toPage.style.left=(backwards?-percent:percent)+"%";}}}
function setupTransition(ele,property,duration,timing,propertyString,propertyValue,callBack)
{ele.style.webkitTransitionProperty=property;ele.style.webkitTransitionDuration=duration;ele.style.webkitTransitionTimingFunction=timing;ele.style[propertyString]=propertyValue;if(callBack)
ele.addEventListener('webkitTransitionEnd',callBack);var removeTransCallback=function(e){ele.style.webkitTransitionProperty='';ele.removeEventListener('webkitTransitionEnd',removeTransCallback);if(callBack)
ele.removeEventListener('webkitTransitionEnd',callBack);}
ele.addEventListener('webkitTransitionEnd',removeTransCallback);}
function scrollPage(scrollToOffset)
{startOffset=window.pageYOffset;var scrollTimer=setInterval(doScroll,20);var actStep=0;function doScroll()
{if(window.pageYOffset>=scrollToOffset||actStep==20)
{window.pageYOffset==scrollToOffset;clearInterval(scrollTimer);}
else
{var nextStep=easeInOut(startOffset,scrollToOffset,20,actStep++,0.7);scrollTo(0,nextStep);}}}
function easeInOut(minValue,maxValue,totalSteps,actualStep,powr)
{var delta=maxValue-minValue;var stepp=minValue+(Math.pow(((1/totalSteps)*actualStep),powr)*delta);return Math.ceil(stepp)}
function checkOrientAndLocation()
{if(window.innerWidth!=currentWidth)
{currentWidth=window.innerWidth;var orient=currentWidth==320?"profile":"landscape";document.body.setAttribute("orient",orient);setTimeout(scrollTo,100,0,1);}
if(location.hash!=currentHash)
{var pageId=location.hash.substr(hashPrefix.length)
showPageById(pageId);}}
function showPageById(pageId)
{var page=$(pageId);if(page)
{var index=pageHistory.indexOf(pageId);var backwards=index!=-1;if(backwards)
pageHistory.splice(index,pageHistory.length);showPage(page,backwards);}}
function hasClass(self,name)
{var re=new RegExp("(^|\\s)"+name+"($|\\s)");return re.exec(self.getAttribute("class"))!=null;}
function createCookie(name,value,days)
{if(days)
{var date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));var expires="; expires="+date.toGMTString();}
else var expires="";document.cookie=name+"="+value+expires+"; path=/";}
function readCookie(name)
{var nameEQ=name+"=";var ca=document.cookie.split(';');for(var i=0;i<ca.length;i++)
{var c=ca[i];while(c.charAt(0)==' ')c=c.substring(1,c.length);if(c.indexOf(nameEQ)==0)return c.substring(nameEQ.length,c.length);}
return null;}
function deleteCookie(cookie_name)
{var cookie_date=new Date();cookie_date.setTime(cookie_date.getTime()-1);document.cookie=cookie_name+="=; expires="+cookie_date.toGMTString();}
var loginController={onTouchLogin:function(e){var username=$('loginEmail').value;var password=$('loginPassword').value;if(!isValidEmail(username))
{alert('Please enter a valid email address');return;}
if(password.length<2)
{alert('Your password must be at least 3 characters');return;}
doPOST("/User/doLogin",loginController.onLoginCompleted,"username="+username+"&password="+password);},onLoginCompleted:function(xmlRequest){if(xmlRequest.currentTarget.status==200)
{var res=eval(xmlRequest.currentTarget.responseText);res=res[0];if(res.result)
{createCookie('l',$('loginEmail').value,666);createCookie('p',$('loginPassword').value,666);showPage($('feedList'));$('settingsButton').style.display='block';feedListController.loadFeedList();}
else
{alert(res.message);}}
else
{alert("Error fetching data: HTTP status "+xmlRequest.status);}}};var passwordController={onRequestPassword:function(e){var username=$('forgotEmail').value;if(!isValidEmail(username))
{alert('Please enter a valid email address');return;}
doPOST("/User/forgottenPassword",this.onForgotPasswordCompleted,"username="+username);},onForgotPasswordCompleted:function(xmlRequest){if(xmlRequest.currentTarget.status==200)
{var res=eval(xmlRequest.currentTarget.responseText);res=res[0];if(res.result)
{$('forgotEmail').value='';alert("Your password has been emailed to you");history.back();}
else
{alert(res.message);}}
else
{alert("Error fetching data: HTTP status "+xmlRequest.status);}}}
var registerController={onTouchSignUp:function(e){var username=$('signUpEmail').value;var password=$('signUpPassword').value;var confirmPassword=$('signUpConfirmPassword').value;if(!isValidEmail(username))
{alert('Please enter a valid email address');return;}
if(password.length<2)
{alert('Passwords must be at least 2 characters');return;}
if(password!=confirmPassword)
{alert('Your passwords do not match');return;}
doPOST("/User/addUser",registerController.onSignUpCompleted,"username="+username+"&password="+password+"&confirmPassword="+confirmPassword);},onSignUpCompleted:function(xmlRequest){if(xmlRequest.currentTarget.status==200)
{var res=eval(xmlRequest.currentTarget.responseText);res=res[0];if(res.result)
{alert('signed up');history.back();}
else
{alert(res.message);}}
else
{alert("Error fetching data: HTTP status "+xmlRequest.status);}}};function isValidEmail(email)
{var emailRegxp=new RegExp(/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})$/);return emailRegxp.test(email);}
var busyOnRPC=false;var xmlRequest=new XMLHttpRequest();var hostURL='http://'+window.location.host;function doPOST(URL,onLoadHandler,postParams,callBack)
{doGET(URL,onLoadHandler,postParams,true,callBack);}
function doGET(URL,onLoadHandler,params,isPost,callBack)
{showLoading(true);URL=hostURL+URL;xmlRequest.onload=function()
{if(callBack)
setTimeout(callBack,5);var resultObject=Object();resultObject.currentTarget=xmlRequest;showLoading(false);onLoadHandler(resultObject);}
if(isPost)
{xmlRequest.open("POST",URL);xmlRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');}
else
{xmlRequest.open("GET",URL);}
xmlRequest.setRequestHeader("Cache-Control","no-cache");xmlRequest.send(params);}
function showLoading(show)
{if($('loading'))
$('loading').style.display=(show)?'block':'none';}
function $(ele)
{return document.getElementById(ele);}
var feedListController={feedList:null,selectedFeedID:null,feedItemList:null,feedOffset:20,loadFeedList:function(){doGET("/RSS/getFeeds",feedListController.onFeedListLoaded,null);},onFeedListLoaded:function(xmlRequest){if(xmlRequest.currentTarget.status==200)
{if(!checkResponseForSession(xmlRequest.currentTarget.responseText))
return;feedListController.feedList=eval(xmlRequest.currentTarget.responseText);feedListController.displayFeedList();}
else
{alert("Error fetching data: HTTP status "+xmlRequest.status);}},displayFeedList:function(remove){var feedListDiv;if(remove)
feedListDiv=$('removeFeedSection');else
feedListDiv=$('feedList');feedListDiv.innerHTML='';for(var i=0;i<feedListController.feedList.length;i++)
{var feedID=feedListController.feedList[i].FeedID;var feedTitle=feedListController.feedList[i].FeedTitle;var feedFavicon=feedListController.feedList[i].FeedFavicon;var feedCount=feedListController.feedList[i].FeedItemCount;var feedCountDiv='<div class="feedCount">'+feedCount+'</div>';var feedLink='<a href="#" target="replace" rel="'+feedID+'">'+feedTitle+feedCountDiv+'</a>';feedListDiv.innerHTML+='<li>'+feedListController.getFaviconURL(feedFavicon)+feedLink+'</li>';}},getFaviconURL:function(feedFavicon){var imgURL;if(feedFavicon.length>5)
{imgURL=feedFavicon;}
else
{imgURL="http://ifeeder.prime31.com/media/images/rss.jpg";}
return'<img height="15" width="15" src="'+imgURL+'" />';},feedTouched:function(feedID,callBack){if(feedID)
{feedListController.selectedFeedID=feedID;doGET("/RSS/getFeedItems/"+feedID,feedListController.onFeedItemLoaded,null,null,callBack);}},onFeedItemLoaded:function(xmlRequest){if(xmlRequest.currentTarget.status==200)
{if(!checkResponseForSession(xmlRequest.currentTarget.responseText))
return;feedListController.feedOffset=20;feedListController.feedItemList=eval(xmlRequest.currentTarget.responseText);feedListController.displayFeedItems();}
else
{alert("Error fetching data: HTTP status "+xmlRequest.status);}},displayFeedItems:function(addToBottom){var feedItemListDiv=$('feedItemList');var startOffset=0;var endOffset=feedListController.feedItemList.length;if(!addToBottom)
feedItemListDiv.innerHTML='';else
{feedListController.removeLastItemFromList(feedItemListDiv);startOffset=endOffset-20;}
for(var i=startOffset;i<endOffset;i++)
{var feedItemID=feedListController.feedItemList[i].FeedItemID;var feedItemTitle=feedListController.feedItemList[i].Title;var feedItemDate=feedListController.feedItemList[i].FeedDate;var className='';if(feedListController.feedItemList[i].IsRead)
className='class="read"';var feedItemDateDiv='<div class="feedItemDate">'+feedItemDate+'</div>';var feedItemLink='<a href="#" '+className+' target="replace" rel="'+feedItemID+'">'+feedItemDateDiv+feedItemTitle+'</a>';feedItemListDiv.innerHTML+='<li>'+feedItemLink+'</li>';}
if(feedListController.feedOffset<100)
feedItemListDiv.innerHTML+='<li><a href="#" class="loadMore" target="replace" rel="'+feedListController.feedOffset+'">Load 20 More Items</li>';if(!addToBottom)
showPage($('feedItemList'));else
scrollPage(window.pageYOffset+300);},removeLastItemFromList:function(feedItemListDiv){feedItemListDiv.removeChild(feedItemListDiv.lastChild);feedItemListDiv.removeChild(feedItemListDiv.lastChild);},loadMoreTouched:function(offset){doGET("/RSS/getFeedItems/"+feedListController.selectedFeedID+"/"+offset,feedListController.onMoreFeedItemsLoaded,null);},onMoreFeedItemsLoaded:function(xmlRequest){if(xmlRequest.currentTarget.status==200)
{if(!checkResponseForSession(xmlRequest.currentTarget.responseText))
return;feedListController.feedOffset+=20;var newItems=eval(xmlRequest.currentTarget.responseText);if(newItems.length>0)
{feedListController.feedItemList=feedListController.feedItemList.concat(newItems);feedListController.displayFeedItems(true);}
else
{feedListController.removeLastItemFromList($('feedItemList'));alert('There are no more feed items for this feed');}
if(newItems.length<20)
feedListController.feedOffset=100;}
else
{alert("Error fetching data: HTTP status "+xmlRequest.status);}},feedItemTouched:function(feedItemID,callBack){if(feedItemID)
{doGET("/RSS/getFeedItemDescription/"+feedListController.selectedFeedID+"/"+feedItemID,feedListController.onFeedDescriptionLoaded,null,null,callBack);}},onFeedDescriptionLoaded:function(xmlRequest){if(xmlRequest.currentTarget.status==200)
{if(!checkResponseForSession(xmlRequest.currentTarget.responseText))
return;var feedDetail=eval(xmlRequest.currentTarget.responseText);$('feedDetailsHolder').innerHTML=feedDetail[0].FeedDescription;$('detailLinkNew').href=$('detailLink').href=feedDetail[0].FeedPermaLink;showPage($('feedDetails'));}
else
{alert("Error fetching data: HTTP status "+xmlRequest.status);}},onTouchEmailLink:function(){var encodedBody=escape('\n\nLink: '+$('detailLinkNew').href+'\n\n'+$('feedDetailsHolder').innerHTML);var subject=escape('iFeeder Link');window.location='mailto:'+$('loginEmail').value+'?subject='+subject+'&body='+encodedBody;},onTouchTellAFriend:function(){var encodedBody=escape('Check out this RSS feed reader.  You can find it at\n\nhttp://www.ifeeder.prime31.com');var subject=escape('Check out iFeeder');window.location='mailto:?subject='+subject+'&body='+encodedBody;},onLinkEmailed:function(xmlRequest){if(xmlRequest.currentTarget.status==200)
{if(!checkResponseForSession(xmlRequest.currentTarget.responseText))
return;var res=eval(xmlRequest.currentTarget.responseText);res=res[0];if(res.result)
{alert('Feed link emailed');}
else
{alert(res.message);}}
else
{alert("Error fetching data: HTTP status "+xmlRequest.status);}}};var settingsController={onAddFeedTouch:function(e){var feedURL=document.getElementById('feedURL').value;if(!isUrl(feedURL))
{alert("Please enter a valid URL");return;}
doPOST("/User/addFeed",settingsController.onAddFeedCompleted,"FeedURL="+feedURL);},onAddFeedCompleted:function(xmlRequest){if(xmlRequest.currentTarget.status==200)
{if(!checkResponseForSession(xmlRequest.currentTarget.responseText))
return;var res=eval(xmlRequest.currentTarget.responseText);res=res[0];if(res.result)
{feedListController.loadFeedList();alert("Feed successfully added");document.getElementById('feedURL').value='http://';return;}
else
{alert(res.message);}}
else
{alert("Error fetching data: HTTP status "+xmlRequest.status);}},onSetupRemoveFeed:function(e){feedListController.displayFeedList(true);showPage($('removeFeedSection'));},onRemoveFeedTouch:function(feedID){if(feedID.length==0)
{return;}
doPOST("/User/removeFeed",settingsController.onRemoveFeedCompleted,"FeedID="+feedID);},onRemoveFeedCompleted:function(xmlRequest){if(xmlRequest.currentTarget.status==200)
{if(!checkResponseForSession(xmlRequest.currentTarget.responseText))
return;var res=eval(xmlRequest.currentTarget.responseText);res=res[0];if(res.result)
{feedListController.loadFeedList();}
else
{alert(res.message);}}
else
{alert("Error fetching data: HTTP status "+xmlRequest.status);}}}
function isUrl(s)
{var regexp=/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;return regexp.test(s);}
function checkResponseForSession(res)
{if(eval(res)=='SessionExpired')
{alert('session expired');return false;}
return true;}