var appTitle='Discussr';var VERSION_IFRAME=1;var VERSION_POPUP=2;var version=VERSION_IFRAME;var dividerSize=9;var headingSize=25;var marginSize=2;var spacing=5;var infoPaneHeight=65;var blockElement=document.getElementById('block');var authElement=document.getElementById('auth');var pageElement=document.getElementById('page');var leftColElement=document.getElementById('leftCol');var groupsPaneElement=document.getElementById('groupsPane');var groupsElement=document.getElementById('groups');var hDivider1Element=document.getElementById('hDivider1');var topicsPaneElement=document.getElementById('topicsPane');var topicsElement=document.getElementById('topics');var hDivider2Element=document.getElementById('hDivider2');var infoPaneElement=document.getElementById('infoPane');var reloadButtonElement=document.getElementById('reloadButton');var openFindButtonElement=document.getElementById('openFindButton');var catchupButtonElement=document.getElementById('catchupButton');var unsubscribeButtonElement=document.getElementById('unsubscribeButton');var clearButtonElement=document.getElementById('clearButton');var vDividerElement=document.getElementById('vDivider');var commentsPaneElement=document.getElementById('commentsPane');var commentsElement=document.getElementById('comments');var findDialogElement=document.getElementById('findDialog');var findStrElement=document.getElementById('findStr');var findResultsElement=document.getElementById('findResults');var subscribeButtonElement=document.getElementById('subscribeButton');var geometry;var hashGroup,hashGroupSaved,hashTopic,hashComment;var currentGroups;var groupsSelectElement;var findGroups;var findSelectElement;var currentTopics;var topicsSelectElement;var iframeElement;var numNewTopics;function Setup() {try {acme.flickr.Initialize('Discussr');NonIdle();var width=250;var height=200;geometry=width+'+'+height;GetVars();var geometryParts=geometry.split('x');if(acme.utils.IsNumeric(geometryParts[0])) width=+geometryParts[0];if(acme.utils.IsNumeric(geometryParts[1])) height=+geometryParts[1];SetLeftColWidth(width);SetGroupsPaneHeight(height);acme.draggable.MakeDraggableEW(vDividerElement,VDividerCallback);acme.draggable.MakeDraggableNS(hDivider1Element,HDivider1Callback);window.onresize=ResizeCallback;Disable(openFindButtonElement);Disable(catchupButtonElement);Disable(unsubscribeButtonElement);Disable(clearButtonElement);SaveHash();Show(blockElement);Show(authElement);acme.flickr.FAuth(authElement,acme.flickr.authPermIdNone,FAuthCallback);} catch(e) {acme.utils.Log('Setup: '+e);}} function SaveHash() {var hash=location.hash;if(hash.charAt(0)=='#') hash=hash.substr(1);var hashParts=hash.split('.');if(hashParts.length>=1&&hashParts[0]!='') {hashGroup=hashParts[0];if(hashParts.length>=2&&hashParts[1]!='') {hashTopic=hashParts[1];if(hashParts.length>=3&&hashParts[2]!='') hashComment=hashParts[2];else hashComment=null;} else hashTopic=hashComment=null;} else hashGroup=hashTopic=hashComment=null;} function FAuthCallback(token) {try {if(token) {Hide(blockElement);Hide(authElement);GroupsFetch();}} catch(e) {acme.utils.Log('FAuthCallback: '+e);}} function GroupsFetch() {ClearGroups();ClearTopics();ClearComments();groupsElement.innerHTML='
Fetching groups....atom
';currentGroups=null;acme.utils.HttpGet('api.cgi?method=get_groups&user_id='+encodeURIComponent(acme.flickr.AuthGetNsid())+'&auth_token='+encodeURIComponent(acme.flickr.FAuthGetToken()),GroupsOkCallback,GroupsFailCallback);SetHash(null,null,null);} function GroupsOkCallback(response) {try {var topNode=response.responseXML.documentElement;if(!RspOk(topNode)) {groupsElement.innerHTML='
'+RspMessage(topNode)+'
';return;} var groupsNode=acme.utils.FindChildNamed(topNode,'groups');if(!groupsNode) {acme.utils.Log('groups node not found');return;} currentGroups=ParseGroups(groupsNode);if(currentGroups.length==0) {groupsElement.innerHTML='
No groups added yet.
';groupsSelectElement=null;} else InitGroupsSelectElement();CheckGroupsNew();Enable(openFindButtonElement);if(hashGroup) {for(var i in groupsSelectElement.options) if(groupsSelectElement.options[i].group.id==hashGroup) {FSSetSelectedIndex(groupsSelectElement,i);break;} if(FSGetValue(groupsSelectElement)==null) {if(confirm('You are not currently subscribed to the group "'+hashGroup+'" - add it?')) {acme.utils.HttpGet('api.cgi?method=subscribe&user_id='+encodeURIComponent(acme.flickr.AuthGetNsid())+'&auth_token='+encodeURIComponent(acme.flickr.FAuthGetToken())+'&group_id='+encodeURIComponent(hashGroup),SubscribeOkCallback,SubscribeFailCallback);}} else {OpenGroup(hashGroup);hashGroupSaved=hashGroup;} hashGroup=null;}} catch(e) {acme.utils.Log('GroupsOkCallback: '+e);}} function GroupsFailCallback(response) {acme.utils.Log('get_groups.cgi failed - '+response.status+' '+response.statusText);} function CheckGroupsNew() {var gotNewGroups=false;for(var i in currentGroups) if(currentGroups[i].isNew) gotNewGroups=true;if(gotNewGroups) document.title=appTitle+' NEW';else document.title=appTitle;} function GroupsSelectChanged() {try {NonIdle();ClearTopics();ClearComments();topicsElement.innerHTML='
Fetching topics....atom
';currentTopics=null;var group=groupsSelectElement.options[groupsSelectElement.selectedIndex].group;OpenGroup(group.id);} catch(e) {acme.utils.Log('GroupsSelectChanged: '+e);}} function OpenGroup(groupId) {acme.utils.HttpGet('api.cgi?method=get_topics&user_id='+encodeURIComponent(acme.flickr.AuthGetNsid())+'&auth_token='+encodeURIComponent(acme.flickr.FAuthGetToken())+'&group_id='+encodeURIComponent(groupId),TopicsOkCallback,TopicsFailCallback);SetHash(groupId,null,null);} function TopicsOkCallback(response) {try {var topNode=response.responseXML.documentElement;if(!RspOk(topNode)) {topicsElement.innerHTML='
'+RspMessage(topNode)+'
';return;} var topicsNode=acme.utils.FindChildNamed(topNode,'topics');if(!topicsNode) {acme.utils.Log('topics node not found');return;} var groupId=topicsNode.getAttribute('groupid');currentTopics=ParseTopics(topicsNode);if(currentTopics.length==0) {topicsElement.innerHTML='
No topics found.
';topicsSelectElement=null;} else InitTopicsSelectElement(groupId);Enable(unsubscribeButtonElement);Enable(clearButtonElement);if(hashTopic) {for(var i in topicsSelectElement.options) if(topicsSelectElement.options[i].topic.id==hashTopic) {FSSetSelectedIndex(topicsSelectElement,i);break;} OpenTopic(hashGroupSaved,hashTopic,hashComment);hashGroupSaved=hashTopic=hashComment=null;}} catch(e) {acme.utils.Log('TopicsOkCallback: '+e);}} function TopicsFailCallback(response) {acme.utils.Log('get_topics.cgi failed - '+response.status+' '+response.statusText);} function Reload() {try {NonIdle();SaveHash();GroupsFetch();} catch(e) {acme.utils.Log('Reload: '+e);}} function OpenFindDialog() {try {NonIdle();acme.utils.ClearElement(findResultsElement);findSelectElement=null;Show(findDialogElement);Disable(subscribeButtonElement);findStrElement.focus();} catch(e) {acme.utils.Log('OpenFindDialog: '+e);}} function CloseFindDialog() {try {NonIdle();Hide(findDialogElement);acme.utils.ClearElement(findResultsElement);findSelectElement=null;} catch(e) {acme.utils.Log('CloseFindDialog: '+e);}} function Find() {try {NonIdle();var findStr=findStrElement.value;acme.utils.ClearElement(findResultsElement);findResultsElement.innerHTML='
Searching....atom
';findGroups=null;acme.utils.HttpGet('api.cgi?method=groups_search_info&user_id='+encodeURIComponent(acme.flickr.AuthGetNsid())+'&auth_token='+encodeURIComponent(acme.flickr.FAuthGetToken())+'&text='+encodeURIComponent(findStr),FindOkCallback,FindFailCallback);} catch(e) {acme.utils.Log('Find: '+e);}} function FindOkCallback(response) {try {var topNode=response.responseXML.documentElement;acme.utils.ClearElement(findResultsElement);if(!RspOk(topNode)) {findResultsElement.innerHTML='
'+RspMessage(topNode)+'
';return;} var groupsNode=acme.utils.FindChildNamed(topNode,'groups');if(!groupsNode.nodeName) {acme.utils.Log('groups node not found');return;} findGroups=ParseGroups(groupsNode);if(findGroups.length==0) findResultsElement.innerHTML='
No matching groups found.
';else {findSelectElement=MakeGroupsSelect(findResultsElement,findGroups);if(currentGroups!=null) for(var i in findGroups) for(var j in currentGroups) if(findGroups[i].id==currentGroups[j].id) {Disable(findGroups[i].optionElement);break;} findSelectElement.onchange=FindSelectChanged;}} catch(e) {acme.utils.Log('FindOkCallback: '+e);}} function FindFailCallback(response) {acme.utils.Log('groups_search_info.cgi failed - '+response.status+' '+response.statusText);} function FindSelectChanged() {try {NonIdle();Enable(subscribeButtonElement);} catch(e) {acme.utils.Log('FindSelectChanged: '+e);}} function Subscribe() {try {NonIdle();var option=findSelectElement.options[findSelectElement.selectedIndex];FSSetSelectedIndex(findSelectElement,-1);Disable(option);acme.utils.HttpGet('api.cgi?method=subscribe&user_id='+encodeURIComponent(acme.flickr.AuthGetNsid())+'&auth_token='+encodeURIComponent(acme.flickr.FAuthGetToken())+'&group_id='+encodeURIComponent(option.group.id),SubscribeOkCallback,SubscribeFailCallback);} catch(e) {acme.utils.Log('Subscribe: '+e);}} function SubscribeOkCallback(response) {try {var topNode=response.responseXML.documentElement;if(!RspOk(topNode)) {alert(RspMessage(topNode));return;} var subscribedNode=acme.utils.FindChildNamed(topNode,'subscribed');if(!subscribedNode) {acme.utils.Log('subscribed node not found');return;} var groupNode=acme.utils.FindChildNamed(subscribedNode,'group');if(!groupNode) {acme.utils.Log('group node not found');return;} if(!groupsSelectElement) InitGroupsSelectElement();var group=ParseGroup(groupNode);currentGroups.push(group);MakeGroupOption(groupsSelectElement,group);if(group.optionElement!=groupsSelectElement.options[0]) {groupsSelectElement.removeChild(group.optionElement);groupsSelectElement.insertBefore(group.optionElement,groupsSelectElement.options[0]);} groupsSelectElement.scrollTop=0;CheckGroupsNew();if(findGroups!=null) for(var i in findGroups) if(findGroups[i].id==group.id) Disable(findGroups[i].optionElement);if(findSelectElement!=null) FSSetSelectedIndex(findSelectElement,-1);Disable(subscribeButtonElement);} catch(e) {acme.utils.Log('SubscribeOkCallback: '+e);}} function SubscribeFailCallback(response) {acme.utils.Log('subscribe.cgi failed - '+response.status+' '+response.statusText);} function Unsubscribe() {try {NonIdle();if(!confirm('Unsubscribe from this group on Discussr?')) return;ClearTopics();ClearComments();var i=groupsSelectElement.selectedIndex;FSSetSelectedIndex(groupsSelectElement,-1);var group=groupsSelectElement.options[i].group;acme.utils.DestroyElement(groupsSelectElement.options[i]);for(var j in currentGroups) if(currentGroups[j]==group) {currentGroups.splice(j,1);break;} acme.utils.HttpGet('api.cgi?method=unsubscribe&user_id='+encodeURIComponent(acme.flickr.AuthGetNsid())+'&auth_token='+encodeURIComponent(acme.flickr.FAuthGetToken())+'&group_id='+encodeURIComponent(group.id),UnsubscribeOkCallback,UnsubscribeFailCallback);SetHash(null,null,null);} catch(e) {acme.utils.Log('Unsubscribe: '+e);}} function UnsubscribeOkCallback(response) {try {} catch(e) {acme.utils.Log('UnsubscribeOkCallback: '+e);}} function UnsubscribeFailCallback(response) {acme.utils.Log('unsubscribe.cgi failed - '+response.status+' '+response.statusText);} function Clear() {try {NonIdle();ClearTopics();ClearComments();FSSetSelectedIndex(groupsSelectElement,-1);SetHash(null,null,null);} catch(e) {acme.utils.Log('Clear: '+e);}} function CatchUp() {try {NonIdle();var group=groupsSelectElement.options[groupsSelectElement.selectedIndex].group;acme.utils.HttpGet('api.cgi?method=mark_red_all&user_id='+encodeURIComponent(acme.flickr.AuthGetNsid())+'&auth_token='+encodeURIComponent(acme.flickr.FAuthGetToken())+'&group_id='+encodeURIComponent(group.id),MarkAllOkCallback,MarkAllFailCallback);for(var i in currentTopics) MarkRed(currentTopics[i],group);} catch(e) {acme.utils.Log('CatchUp: '+e);}} function MarkAllOkCallback(response) {try {} catch(e) {acme.utils.Log('MarkAllOkCallback: '+e);}} function MarkAllFailCallback(response) {acme.utils.Log('mark_red_all.cgi failed - '+response.status+' '+response.statusText);} function ClearGroups() {acme.utils.ClearElement(groupsElement);} function ClearTopics() {acme.utils.ClearElement(topicsElement);Disable(catchupButtonElement);Disable(unsubscribeButtonElement);Disable(clearButtonElement);} function ClearComments() {acme.utils.ClearElement(commentsElement);iframeElement=null;} function ParseGroups(groupsNode) {var groups=[];var groupNode=groupsNode.firstChild;while(groupNode) {if(groupNode.nodeName=='group') groups.push(ParseGroup(groupNode));groupNode=groupNode.nextSibling;} return groups;} function ParseGroup(groupNode) {var group={};group.id=groupNode.getAttribute('id');group.name=groupNode.getAttribute('name');group.iconFarm=groupNode.getAttribute('iconfarm');group.iconServer=groupNode.getAttribute('iconserver');group.isPoolModerated=groupNode.getAttribute('ispoolmoderated');group.members=groupNode.getAttribute('members');group.privacy=groupNode.getAttribute('privacy');group.updated=+groupNode.getAttribute('updated');group.isNew=groupNode.getAttribute('new')=='yes';return group;} function InitGroupsSelectElement() {acme.utils.ClearElement(groupsElement);currentGroups.sort(SortbyReverseUpdated);groupsSelectElement=MakeGroupsSelect(groupsElement,currentGroups);groupsSelectElement.onchange=GroupsSelectChanged;} function MakeGroupsSelect(parentElement,groups) {var selectElement=FSAppend(parentElement,{style:{width:'100%',height:'100%'}});for(var i in groups) MakeGroupOption(selectElement,groups[i]);return selectElement;} function MakeGroupOption(selectElement,group) {var iconUrl;if(group.iconFarm==0&&group.iconServer==0) iconUrl='http://l.yimg.com/g/images/buddyicon.jpg';else iconUrl='http://farm'+group.iconFarm+'.static.flickr.com/'+group.iconServer+'/buddyicons/'+group.id+'.jpg';group.optionElement=FSAppendOption(selectElement,{group:group});group.newElement=acme.utils.AppendElement(group.optionElement,'img',{src:'images/new.gif',className:'new'});if(!group.isNew) Hide(group.newElement);acme.utils.AppendElement(group.optionElement,'img',{src:iconUrl,width:16,height:16,style:{verticalAlign:'middle',paddingLeft:'1px',paddingRight:'1px'}});acme.utils.AppendText(group.optionElement,group.name);} function ParseTopics(topicsNode) {var topics=[];var topicNode=topicsNode.firstChild;while(topicNode) {if(topicNode.nodeName=='topic') topics.push(ParseTopic(topicNode));topicNode=topicNode.nextSibling;} return topics;} function ParseTopic(topicNode) {var topic={};topic.id=topicNode.getAttribute('id');topic.title=topicNode.getAttribute('title');topic.updated=+topicNode.getAttribute('updated');topic.redComment=topicNode.getAttribute('redcomment');topic.lastComment=topicNode.getAttribute('lastcomment');return topic;} function InitTopicsSelectElement(groupId) {var group=null;for(var i in currentGroups) if(currentGroups[i].id==groupId) {group=currentGroups[i];break;} var gotNewTopics=false;for(var i in currentTopics) if(currentTopics[i].redComment!=currentTopics[i].lastComment) {currentTopics[i].isNew=true;gotNewTopics=true;} else currentTopics[i].isNew=false;if(gotNewTopics&&group!=null) {group.isNew=true;Show(group.newElement);CheckGroupsNew();} acme.utils.ClearElement(topicsElement);topicsSelectElement=FSAppend(topicsElement,{style:{width:'100%',height:'100%'}});numNewTopics=0;currentTopics.sort(SortbyReverseUpdated);for(var i in currentTopics) {currentTopics[i].optionElement=FSAppendOption(topicsSelectElement,{topic:currentTopics[i]});currentTopics[i].newElement=acme.utils.AppendElement(currentTopics[i].optionElement,'img',{src:'images/new.gif',className:'new'});if(currentTopics[i].isNew) ++numNewTopics;else Hide(currentTopics[i].newElement);acme.utils.AppendText(currentTopics[i].optionElement,currentTopics[i].title);} topicsSelectElement.onchange=TopicsSelectChanged;if(numNewTopics>0) Enable(catchupButtonElement);} function SortbyReverseUpdated(a,b) {return b.updated-a.updated;} function TopicsSelectChanged() {try {NonIdle();ClearComments();var group=groupsSelectElement.options[groupsSelectElement.selectedIndex].group;var topic=topicsSelectElement.options[topicsSelectElement.selectedIndex].topic;OpenTopic(group.id,topic.id,topic.redComment);acme.utils.HttpGet('api.cgi?method=mark_red&user_id='+encodeURIComponent(acme.flickr.AuthGetNsid())+'&auth_token='+encodeURIComponent(acme.flickr.FAuthGetToken())+'&topic_id='+encodeURIComponent(topic.id)+'&red_comment='+encodeURIComponent(topic.lastComment),MarkOkCallback,MarkFailCallback);MarkRed(topic,group);} catch(e) {acme.utils.Log('TopicsSelectChanged: '+e);}} function OpenTopic(groupId,topicId,commentId) {var url='show_topic.cgi?group='+encodeURIComponent(groupId)+'&topic='+encodeURIComponent(topicId);if(commentId!=null&&commentId!=''&&commentId!=0) {url+='&comment='+encodeURIComponent(commentId);SetHash(groupId,topicId,commentId);} else SetHash(groupId,topicId,null);iframeElement=acme.utils.AppendElement(commentsElement,'iframe',{src:url,security:'restricted',style:{overflow:'auto'}});SetIframeSize();} function MarkOkCallback(response) {try {} catch(e) {acme.utils.Log('MarkOkCallback: '+e);}} function MarkFailCallback(response) {acme.utils.Log('mark_red.cgi failed - '+response.status+' '+response.statusText);} function MarkRed(topic,group) {topic.redComment=topic.lastComment;topic.isNew=false;Hide(topic.newElement);--numNewTopics;if(numNewTopics==0) {group.isNew=false;Hide(group.newElement);Disable(catchupButtonElement);CheckGroupsNew();}} function RspOk(topNode) {if(topNode.nodeName!='rsp') {acme.utils.Log('rsp node not found - '+topNode.nodeName);return false;} return topNode.getAttribute('stat')=='ok';} function RspMessage(topNode) {if(topNode.nodeName!='rsp') {acme.utils.Log('rsp node not found - '+topNode.nodeName);return null;} var errNode=acme.utils.FindChildNamed(topNode,'err');if(!errNode) {acme.utils.Log('err node not found');return null;} return errNode.getAttribute('msg');} function SetHash(groupId,topicId,commentId) {if(groupId!=null&&topicId!=null&&commentId!=null) location.hash='#'+groupId+'.'+topicId+'.'+commentId;else if(groupId!=null&&topicId!=null) location.hash='#'+groupId+'.'+topicId;else if(groupId!=null) location.hash='#'+groupId;else location.hash='#';} function GetPageWidth() {return pageElement.clientWidth;} function GetPageHeight() {return pageElement.clientHeight;} function VDividerCallback(dx) {try {NonIdle();var width=GetLeftColWidth()+dx;if(width>160&&width100&&height