Login

Search Javascript Folder

/ RootContainer / Products / Root / AllJavascript

All The Javascript So it is searchable.
  

Get

1    
2   function slideDownTo(key){
3      var node = getNode(key);
4      dispatchOver(node);
5   } 
6    
7    function displaySlideNamed(aName){
8        pinned = null;
9        var node = getNode(aName);
10       dispatchOver(node);
11   
12    }
13    
14    function getNode(nodeName){
15         return view.graph.nodes(nodeName);
16    }
17   
18    function setRatio(node,score){
19        node.data.ratio = score;
20    }
21        
22    function getConferenceKey(slide){
23       return slide.conference.id;
24   }
25   
26    function getConference(slide){
27       return slide.conference;
28   }
29   
30   function localRebuild(){
31        return true;
32     }
33   
34     function getConferenceName(node){
35         if (getClass(node)== 'Conference'){
36             return node.title;
37         }
38         return node.conference.title;
39     }
40     
41   function isRoot(node){
42       if (! ('parent' in node) ||
43          (node.parent === null)){
44           return true;
45       }
46       return false;
47   }
48   
49   
50   
51        
52     function getTitle(item){
53         return item.title;
54     }
55     
56     function getBranchSize(item){
57         return item.branchSize;
58     }
59     
60     
61      function getDescription(item){
62         return item.description;
63     }
64        function getUpVotes(item){
65         return item.upVotes;
66     }
67        function getDownVotes(item){
68         return item.downVotes;
69     }
70     
71     function getClass(slide){
72         return slide.class;
73     }
74     
75     
76    
77    function addChildArray (item,index){
78        item.children = [];
79    }
80    
81    function getKey(item,array){
82        return item.id;
83    }
84     function getClass(item,array){
85        return item.class;
86    }
87    
  

Move Commands For Destkopt

88    function moveUp(){
89               moveTo(homeNode.parent);
90   }
91   
92   function moveDown(childIndex){
93           moveTo (homeNode.children[childIndex]);
94   }
95   
96   function moveToLast(numberOfSiblings){
97           moveTo (homeNode.parent.children[numberOfSiblings -1]);
98   }
99   
100   function moveToFirst(){
101       moveTo (homeNode.preant.children[0]); 
102   }
103   
104   function moveRight(offset){
105           moveTo (homeNode.parent.children[offset+1]); 
106   }
107   
108   function moveLeft(offset){
109        moveTo (homeNode.parent.children[offset-1]);
110   }
  

addDescription

111     
112     /*
113     function addDescription (description){
114        $('#description').remove();
115        var result =' <span id = "description" style= "position:absolute; bottom:10px;'   +
116        'z-index: -1; left: 33%; padding: 20px; ">'+
117        description + 
118        '</span>';
119    
120        $('#graph-container').append(result);
121    }
122    */
  

addList

123     function renderList(node){
124         if (node.children.length ===0){
125             return '';
126         }
127         result = '<center>';
128         result +='<b>SubCategories:</b><br>';
129         for (var i = 0  i< node.children.length; i++){
130             result +=  node.children[i].title + "<br>";
131         }
132         result += '</center>';
133         return result;
134     }
135     
136       function renderList2(node){
137         result ='<ul>';
138         for (var i = 0  i< node.children.length; i++){
139             result += "<li>" + node.children[i].title + "</li>";
140         }
141         result += "</ul>";
142         return result;
143     }
144     /*
145     function deleteNodePlusChildren(){
146              $('#NodePlusChildren').remove();
147     }
148     function renderNodePlusChildren (node){
149        var result ='<div id = "NodePlusChildren" ' +
150        'style= "position:fixed;'+
151        'bottom:' + node.children.length + 'em;  '   +
152        'left: 30%; z-index: -1;">' +
153        "<p>" + node.title + "</p>"+ 
154         renderList(node)+
155        '</div>';
156        $('#graph-container').append(result);
157    }
158    */
  

camera

159    var baseX = 0;
160    var baseY = -($('#graph-container')[0].clientWidth)/4
161   ;
162     function cameraGoToOrigin(){
163    view.cameras[0].goTo({x:baseX, y: baseY, ratio:1, angle: 1.55});
164    }
165    
166    //NOT WORKING
167    function cameraGoToNode(node){
168         view.cameras[0].goTo({x:node.x , y: node.y ,  angle:node.angle});
169        
170    }
171   
  

childFunctions

172    
173   
174   function getChildIndex(node){
175      var childIndex = 0;    
176             if ('previousChildIndex' in node){
177                childIndex = node.previousChildIndex;
178              }
179      return childIndex;
180   }
181    
182        
  

first

183     var view;
184     var homeNode;
185     var root;
186     var landingPage;
187     var lastHover = null;
188     isMobile = false;
189   
190   
191   
192   
193   
194   
195    var mySettings =  {
196          animationsTime: 500,
197        drawLabels: true,
198        drawEdgeLabels: true,
199         zoomMax : 4,
200         singleHover: false,
201       doubleClickEnabled: false,
202       enableNodeHovering: true,
203           labelSizeRatio: 0,
204       labelThreshold: 1,
205       minNodeSize: 1,
206       maxNodeSize: 4
207     };
208     
209    function myCallback(arg){
210        view  = arg;
211        var nodes = view.graph.nodes();
212        nodes.forEach(addChildArray);
213        nodes.forEach (setParent);
214        nodes.forEach(zeroPosition);
215        //nodes.forEach(setLabels);
216        //MUST BE AFTER SET PARENT
217        nodes.forEach(setConferences);
218      
219     
220    
221   
222        
223        
224        root = getNode(rootName);
225        root.x=0; 
226        root.y=0;
227        root.share = 2*Math.PI;
228        root.angle = 0;
229     
230   
231        var row = root.children;
232        var radius = 1;
233        
234        while (row.length > 0){
235            
236            calculateChildPositions(row,radius ); 
237            row = rowItems(row);
238            radius ++ 
239         }
240         cameraGoToOrigin();
241   view.bind('overNode', overNode);
242       view.bind('outNode', outNode);
243   view.bind('overNodes', overNodes);
244       view.bind('outNodes', outNodes);
245       view.bind('clickNode', clickNode);
246       
247        view.refresh();
248            
249           homeNode= getNode(homeNodeKey);
250          landingPage = homeNode;
251       dispatchOver(homeNode);
252            pinned = homeNode;
253   
254    } //END OF CALLBACK
255   
256   
257    sigma.parsers.json(deskTopJson, {
258     container: 'graph-container',
259     settings: mySettings
260   },
261     myCallback);
262    
263    
264   
  

hasChildren

265    function hasChildren(node){
266        if (node.children.length > 0){
267            return true;
268        }
269        return false;
270        
271    }
  

hover

272   var pinned = null;
273   
274   function deletePin(node){
275       delete pinned.data.pinned;
276       pinned = null;
277   }
278   
279      
280    function leavePinnedNode(){
281         var pin = pinned;
282            deletePin (pin);
283            outNodeCore(pin);
284            view.refresh();
285    }  
286    
287    function clickNode(e){
288         var node = e.data.node;
289         clickNodeCore(node);
290    }
291    
292    //was e,bide
293    function clickNodeCore (node){
294         //Clicking on Pinned Node
295        if (node == pinned){
296          deletePin(pinned);
297            node.label = node.title;
298           newHomeNode(node);
299            view.refresh();
300        }
301        // CLICKING ON A DIFFERENT NODE
302        else if (pinned){
303            leavePinnedNode();
304        }
305        else{
306            overNodeCore(node);
307            pinned = node;
308            node.data.pinned = true;
309            node.label = 'PINNED: '+ node.title;
310            view.refresh();
311        }
312        
313    }
314    
315    
316    
317    var hoverNodes= {};
318   
319    function overNode(e) {
320              if (pinned){
321               return;
322           }
323           var node = e.data.node;
324           overNodeCore(node);
325    }
326    
327   function overNodes(e){
328             if (pinned){
329               return;
330           }
331       for (var i = 0; i < e.data.nodes.length; i++){
332           var node = e.data.nodes [i];
333           overNodeCore(node);
334    }
335   }
336   
337   function deleteOldHovers(){
338            for (var key in hoverNodes){
339                var item = hoverNodes[key];
340                 hideLabel(item);
341                 if (item.conference){
342                     hideLabel(item.conference);
343                 }
344               delete hoverNodes[key];
345          }
346   }
347   var lastOverNode=null;
348   var lastOutNode = null;
349   var lastNodeEvent=null;
350   function  overNodeCore(node){
351     
352           showLabel (node);
353          if ((lastOverNode== node)&&
354              (lastNodeEvent =="overNode")){
355                  return;
356              }
357           //if (lastOverNode){
358           //hideLabel(lastOverNode);
359          //}
360           lastOverNode = node;
361           lastNodeEvent = "overNode";
362               deleteOldHovers();
363   
364           showLabel (node);
365           newHomeNode(node);
366           possiblyLoadContent(node);
367           hoverNodes [node.id]= node;
368   }
369    
370    function outNode(e){
371               if (pinned){
372               return;
373           }
374            var node = e.data.node;
375         outNodeCore(node);
376   }
377   
378   function outNodes(e){
379          if (pinned){
380               return;
381           }
382       for (var i = 0; i < e.data.nodes.length; i++){
383            var node = e.data.nodes [i];
384           outNodeCore (node);
385       }
386   }
387   
388   function outNodeCore(node){
389   
390              if ((lastOutNode== node)&&
391              (lastNodeEvent =="outNode")){
392                  return;
393              }
394              hideLabel(node);
395             view.refresh();
396           //deleteOldHovers();
397           if (node.conference){
398                     hideLabel(node.conference);
399                 }
400           lastOutNode = node;
401           lastNodeEvent = "outNode";
402      
403    }
404    
405    
  

initialize

406      
407    function setParent(item,index){
408        item.data= {};
409        var parent = item.parent;
410        if (item.id == rootName){
411            item.parent = null;
412            return;
413        }
414        parent = getNode (item.parent);
415        item.parent = parent;
416        item.parent.children.push (item);
417       view.graph.addEdge({source:parent.id, 
418                      target:item.id,
419                      label:"Hello",
420                 id:(item.id + parent.id), size: 1});
421       if (item.class == 'Conference'){
422           item.data.talks = [];
423       }
424    }
425    function setConferences(node,index){
426        if (getClass(node) == 'Video'){
427           node.conference = getNode(node.conference);
428           node.conference.data.talks.push(node);
429           /*
430           if (node.parent != node.conference){
431               view.graph.addEdge({source:node.id, 
432                         target:node.conference.id, 
433                         id:(node.id + node.conference.id), 
434                         size: 1,
435                         hidden:true
436           });
437          
438           }
439           */
440   
441       }
442   }    
443    function setLabels(item,index){
444      //  item.label = item.title;
445    }
446    
  

loadContent

447   function possiblyLoadContent(node){
448            lastHover = node;
449      setTimeout (maybeLoadContent,400,node);
450   }
451   
452   function maybeLoadContent(node){
453        if (lastHover == node){
454           addLinks(node);
455          loadRemoteContent(node);
456           return;
457       }
458   }
459   
460   var oldVideoNode=null;
461   var oldConferenceNode = null;
462   function addLinks(node){
463       //if ('talks' in node){
464       //    addConferenceLinks(node);
465       //}
466       if ('conference' in node){
467          addVideoLink (node);                    
468       }
469       view.refresh();
470   }
471    
472   function addConferenceLinks(node){
473           dropConferenceLinks (oldVideoNode);
474           oldConferenceNode = node;
475           node.data.hasConferenceLink = true;
476   
477           for (var i = 0  i < node.talks.length; i++){
478               var talk = node.talks[i];
479               var name = node.id + talk.id;
480               if (!view.graph.edges(name)){
481                  view.graph.addEdge({source:node.id, 
482                               target:talk.id, 
483                              id:name, 
484                              size: 1});
485           } 
486           }
487   } 
488   
489   function addVideoLink(node){
490           dropVideoLink (oldVideoNode);
491           oldVideoNode = node;
492           var name = node.id + node.conference.id;
493           if (!view.graph.edges(name)){
494              node.data.hasVideoLink = true;
495              //showLabel(node.conference);
496              view.graph.addEdge({source:node.id, 
497                               target:node.conference.id, 
498                              id:name, size: 1});
499           }      
500   } 
501   
502   function dropConferenceLink(conference){
503       if (! conference){
504           return;
505       }
506       if (conference.data.hasConferenceLink){
507           node.data.hasConferenceLink = false;  
508           for (var i=0; i<conference.talks.length; i++ ){
509              var name = conference.id + conference.talks[i];
510              view.graph.dropEdge(name);
511           }
512           view.refresh();
513   
514       }
515   }
516   
517   
518   function dropVideoLink(node){
519   
520       if (! node){
521           return;
522       }
523       if (node.data.hasVideoLink){
524           node.data.hasVideoLink = false;   
525           var name = node.id + node.conference.id;
526           view.graph.dropEdge(name);
527           view.refresh();
528   
529       }
530   }
531   
532   function newHomeNode (node){
533          homeNode = node;
534          showLabel(node);
535       saveCurrentURL();
536      // $("#arrows").html(arrows(node));
537       $("#text").html(renderSlide(node));
538       //postRender();
539   
540   }
541        
542            
543   
544    function errorF( jqXHR, textStatus, errorThrown ){
545       console.log ("AJAX ERROR", jqXHR, textStatus, errorThrown );
546   }
547   
548   //after slide load
549   function loadRemoteContent(node){
550       var url = "/" + getKey(node) + "/content";
551       divName = "#" + getKey(node) + "-content";
552         $.ajax({url: url, cache: false, 
553         error: errorF,
554         success: function(result){
555           $(divName).html(result);
556           resizeVideos(0,0,"#text");
557       }
558         });
559       
560   }
561    
562   
563      
  

moveTo

564    var currentNode=null;
565   function moveTo(node){
566       pinned = null;
567      
568       if (currentNode){
569               dispatchOut (currentNode);
570       }
571       dispatchOver(node);
572   }
573   
574   function hideLabel(node){
575            node.label = "";
576   }
577   function dispatchOut(node){
578           var data = {};
579           data.node = currentNode;
580          view.renderers[0].dispatchEvent('outNode',data);
581   }
582   function showLabel(node){
583           node.label=node.title;
584   }
585   function dispatchOver(node){
586          view.renderers[0].dispatchEvent('overNode',{node});
587   }
  

positions

588     
589    function nextItem(array,index){
590        if (index == array.length -1){
591            return array[0];
592        }
593        return array[index+1];
594    }
595    function previousItem(array,index){
596        if (index === 0){
597            return array [array.length -1];
598        }
599        return array [index-1];
600   }
601   
602   function average (angle1, angle2,radius){
603           if ((angle1 - angle2) > Math.PI){
604            
605              angle2=angle2 + 2*Math.PI;
606              //return angle1;
607              return average (angle1, angle2, radius);
608           } 
609           
610           if ((angle1 - angle2) > 1){
611              return angle1 - (0.333/radius);
612           }  
613           
614           if ((angle2 - angle1) > Math.PI){
615              
616                angle2= angle2 - 2*Math.PI;
617                return average (angle1, angle2, radius);      
618           }
619           if ((angle2 - angle1) > 1){
620              return angle1 + (0.3333/radius);
621       }
622       return (angle1 + angle2 ) /2.0;
623   }
624   
625   
626   //Furst we sgikd uteratue iver tge cgukdreb, 
627   //tgeb iver tge oarebt arrat,  
628   // So there should be two functions called from the calling function. 
629   //But not that big a priority. 
630    function calculateChildPositions (row,radius){
631        var i, item, arent, siblings, length, offset, share;
632        var angle, parentAngle,itemIndex,  delta;
633        var first, last, previous, previousAngle, next, nextAngle;
634        var j, ratio;
635        var rowLength= row.length;
636        var maxDelta = 0;
637        var minDelta = 0;
638        for (i = 0  i<rowLength;i ++ ){
639             item = row [i]; 
640             parentAngle= item.parent.angle;
641             siblings = item.parent.children;
642             length = siblings.length;
643             offset = length /2;
644             share =  item.parent.share/length;
645             item.share = share;
646             itemIndex = siblings.indexOf(item);
647             delta = (itemIndex -offset) * share 
648             angle = parentAngle + delta;
649             onePosition(item, angle, radius);
650            }
651             
652            if (radius < 2) {
653              return;
654          }
655          
656         for (i = 0  i<rowLength;i ++ ){
657                 item = row [i]; 
658                 siblings = item.parent.children;
659                 length= siblings.length;
660                 itemIndex = siblings.indexOf(item);  
661   
662                 //IF there is nothing on the other side, 
663                 //this grabs an item from this side of the circle
664                 //so the angle is reversed. 
665                 //we need to check that the first item is before the 
666                 //current item. 
667                 //we need to check that the last item, is after the current 
668                 //item.  
669                 if (itemIndex === 0){
670                     previous = previousItem (row,i);
671                     previousAngle = previous.angle;
672                     first = average (item.angle, previousAngle,radius);
673   
674                 }
675                 if (itemIndex == siblings.length -1 ){
676                     next = nextItem(row,i);
677                     nextAngle = next.angle;
678                     last = average (item.angle, nextAngle,radius); 
679                 
680   
681                     for (j=0 j< length; j++){
682                         item = siblings [j];
683                         delta = last - first;
684                         offset = length /2;
685                         ratio = (j) /length;
686                         if (length ==1){
687                             ratio = 0.5;
688                         }
689                         angle = first + (delta * ratio);
690                       onePosition(item, angle, radius);
691                     }
692                 }
693   
694         }
695   
696             
697   }
698   
699     function onePosition( item,angle,radius) {
700        item.angle = angle;
701       item.x=radius * Math.cos(angle);
702       item.y=  radius * Math.sin(angle);
703    } 
704    
705    
706    function randomPosition(item, index) {
707       item.x=Math.random () +1;
708       item.y=Math.random () +1;
709    }
710    function zeroPosition(item, index) {
711       item.x=0;
712       item.y=0;
713    }
  

renderSearchButton

714    function renderSearchOption(node){
715             if (! isMobile){
716             return "" +
717               lili('<a href="https://PythonLinks.info/search">Search</a>');
718             }
719             else{ 
720                 return lili('<a onclick ="showSearch()">Search</a>');
721           
722              }
723              
724    }
725    
  

showsearch

726     function showSearch(){}
  

traverse

727   
728    
729    function rowItems(rowArray){
730        var result = [];
731        for (var i=0  i<rowArray.length;i++){
732            result = result.concat(rowArray[i].children);
733        }
734        return result;
735    } 
  

ChildFunctions

736      
737    
738    function getChildIndex(homeNode){
739      var childIndex = 0;    
740             if (homeNode.hasOwnProperty('previousChildIndex')){
741                childIndex = homeNode.previousChildIndex;
742              }
743      return childIndex;           
744    }           
  

SlideUpOrDown

745    
746      function hideDivLater(){
747       $.fn.fullpage.destroy('all');
748   }   
749   
750    function showSearch(){  
751        loadOneSlide();
752        $("#searchDiv").slideDown(400);
753            $("#browse").slideUp(400);
754        setTimeout(hideDivLater,400);
755        $('body').scrollTop(0);
756       if (homeNode.data.class == 'Conference'){
757            oldSearchString="asdfasdfkjhae";
758            currentSearchString="asdfasdfkjhae";
759            $("input[name=search]").val(homeNode.data.title);
760            myKeyUpCore(homeNode.data.title);
761        } 
762          setFocus();
763    }
764    
765    function setFocus (){ $("#search").focus();}
766      
767     function resetHeight(){
768        searchDiv.style.height="auto";
769   }
770    
771      function showBrowser(){
772       $("#browse").slideDown(400);
773       $("#searchDiv").slideUp(400);
774        setTimeout (resetHeight,400);
775       $('#fullpage').fullpage(fullPageArguments);
776       setTimeout(reload,1000);
777   
778        
779    }
780    
781      function searchClick(aNode){
782          var duration = 400;
783            $("#browse").slideDown(duration);
784       $("#searchDiv").slideUp(duration);
785        homeNode = aNode;
786         saveCurrentURL();
787        displaySlide(homeNode);
788        //setTimeout(reload,duration);
789    }
790    
791   
792         
793   
794         
795    
  

createSlides

796   function renderVerticalSlides(){
797       
798               var i,slide;  
799               var result = "";
800               for (i = 0  i < verticalSlides.length; i++){
801                       slide =renderVerticalSlide (verticalSlides[i],i);
802                        result += slide;
803               }
804               return result;
805               
806   }   
807   
808   function renderHorizontalSlides(){
809        
810               var j;     
811               var result = ""; 
812               for (j = 0  j < horizontalSlides.length; j++){
813                         slide =renderHorizontalSlide (horizontalSlides[j],j);
814                         result += slide;
815                       }
816               return result;            
817       
818               }
819               
820   
  

renderSlides

821    function goToChat(item){
822         
823       var href = "/" + item + "/chat";
824             window.open(href);
825   
826    }
827    
828    
829    
830   
  

renderVerticalSlide

831    function renderHorizontalSlide(slide,index){ 
832       var result = "";
833       result += "<div " +
834       " id = \"slide " + slide.key + "\" "+
835       "class=\"slide";
836       if (slide == homeNode)  {
837               result +=" active";
838           }
839   
840       result +="\">";
841       result += '<div style="width: 100%;"' +
842                 'id="' + slide.key + "-page" + '">';
843                 
844       result += renderSlide(slide,index);
845       result += "</div>";
846       result += "</div>";
847       return result;
848    }
849    
850    
851    function renderVerticalSlide(slide, index){
852           var result = "";
853           result += "<div class=\"section ";
854           if (slide == homeNode)  {
855               result +="active ";
856           }
857          //       result += " style=\"background-color:" +
858          //   (parents(slide).length & 1) ? '#ccc': '#fff'+ ";\"";
859           result +="\">";
860              if (slide == homeNode)  {
861               result += renderHorizontalSlides();  
862            }
863            else {
864               result += renderSlide(slide,0);
865            }
866         
867           result += "</div>";
868           return result;
869    }
870    
  

RenderHomePage

871     var loadedContent;
872   function renderHomePage(){
873       loadedContent = document.getElementById('loaded-content');
874       setSingleSlide();
875       document.title=pageTitle(homeNode);
876       newSlides = renderVerticalSlides(homeNode);
877      
878       document.getElementById('fullpage').innerHTML=newSlides;
879       var divName = getKey(homeNode) + "-content";
880    //debugger;
881    document.getElementById(divName).append(loadedContent)
882   }
  

clickNode

883     function clickNode(webPageName){
884        var key = webPageName.key;
885         homeNode=tree.getNodeByKey(key);
886        popSlides(homeNode);
887    }
888    
889     window.addEventListener('popstate', function(event) {
890   clickNode(event.state);
891     
892   });
  

get

893   function slideDownTo(key){
894       var nextNode=tree.getNodeByKey(key);
895       var index = homeNode.children.indexOf(nextNode);
896       homeNode.previousChildIndex=index;
897      goDown();
898   } 
899   
900    function setRatio(node,score){
901        node.data.ratio = score;
902    }
903        
904    function getConferenceKey(slide){
905       return slide.data.conference;
906   }
907   
908    function getConference(slide){
909       return getNode(slide.data.conference);
910   }
911   
912   function localRebuild(){
913          $.fn.fullpage.reBuild();
914        return true;
915     }
916   
917   
918   function getNode(key){
919          return tree.getNodeByKey(key);
920   }
921   
922     function getConferenceName(node){
923         return node.data.conference;
924     }
925     
926   function isRoot(node){
927       if (getKey(node)==rootName){
928           return true;
929       }
930       return false;
931   }
932        
933     function getTitle(item){
934         return item.data.title;
935     }
936     
937     function getBranchSize(item){
938         return item.data.branchSize;
939     }
940     
941     
942      function getDescription(item){
943         return item.data.description;
944     }
945        function getUpVotes(item){
946         return item.data.upVotes;
947     }
948        function getDownVotes(item){
949         return item.data.downVotes;
950     }
951     
952     function getClass(slide){
953         return slide.data.class;
954     }
955     
956   
957    
958    function getKey(item,array){
959        return item.key;
960    }
961     function getClass(item,array){
962        return item.data.class;
963    }
964     
  

getHorizontalAndVerticalSlides

965   var horizontalSlides, verticalSlides; 
966       var verticalIndex;
967   var horizontalIndex;
968   
969   function setSlides(aNode){
970       setSingleSlide();
971   }    
972   
973   function setSingleSlide(){
974       verticalSlides = [homeNode];
975       horizontalSlides = [homeNode];
976        verticalIndex = 0;
977       horizontalIndex = 0;
978   }
979   function setUpSlides(){
980       verticalSlides = [homeNode.parent,homeNode];
981       horizontalSlides = [homeNode];
982        verticalIndex = 1;
983       horizontalIndex = 0;
984   }
985   function setDownSlides(){
986       var childIndex = getChildIndex(homeNode);
987       verticalSlides = [homeNode,homeNode.children[childIndex]];
988       horizontalSlides = [homeNode];
989        verticalIndex = 0;
990       horizontalIndex = 0;
991   }
992   function setRightSlides(){
993       var hIndex = homeNode.parent.children.indexOf(homeNode);
994       verticalSlides = [homeNode];
995       horizontalSlides = [homeNode, homeNode.parent.children[hIndex+1]];
996        verticalIndex = 0;
997       horizontalIndex = 0;
998   }
999   function setLeftSlides(){
1000       var hIndex = homeNode.parent.children.indexOf(homeNode);
1001       verticalSlides = [homeNode];
1002       horizontalSlides = [homeNode.parent.children[hIndex-1],homeNode];
1003        verticalIndex = 0;
1004       horizontalIndex = 1;
1005   }
1006   
1007   
1008   /*
1009   THis was the old one. 
1010   function setSlides(aNode){
1011       verticalSlides = listOfVerticalSlides(aNode);
1012       horizontalSlides = listOfHorizontalSlides(aNode);
1013    
1014       verticalIndex = verticalSlides.indexOf(homeNode);
1015       horizontalIndex = horizontalSlides.indexOf(homeNode);
1016   }
1017   */
1018   
1019   function listOfVerticalSlides(homeNode){
1020       var result = [];
1021       if (homeNode.parent.parent !== null){
1022           result.push (homeNode.parent);
1023       }
1024       result.push (homeNode);
1025       
1026       if (hasChildren(homeNode)){
1027             var childIndex = getChildIndex(homeNode);
1028             var child=homeNode.children[childIndex];
1029              result.push(child);
1030       }
1031       return result;
1032    }
1033    
1034    
1035    function listOfHorizontalSlides(aNode){
1036        var children = aNode.parent.children;
1037        var index =children.indexOf(aNode);
1038        var result = [];
1039        if (index >0){
1040            result.push (children[index-1]);
1041        }
1042     
1043        result.push (aNode);
1044       
1045        if (index < children.length -1){
1046            result.push (children[index + 1]);
1047        }
1048        return result;
1049    }
1050    
1051   
  

getPage

1052    function getPage(){
1053        handle = '';
1054        var result = $('#' + homeNode.key + "-page" ).html();
1055        handle = 'lozinski';
1056        return result;
1057    }
  

hasChildren

1058     
1059    function hasChildren(homeNode){
1060      
1061       if (homeNode.hasOwnProperty ('children') &&
1062            (homeNode.children !== null) &&
1063           (homeNode.children.length > 0)){
1064               return true;
1065           }
1066        return false;    
1067    }
1068        
  

initializeslides

1069    function pleaseLoadContent (anchorLink, index, slideAnchor, slideIndex){
1070       loadContent ();
1071   }
1072   function smallLoadContent (anchorLink, index, slideAnchor, slideIndex){
1073       loadContent ();
1074   }
1075   
1076   function reloadSection(anchorLink, index){
1077       if (mayLoad){
1078           mayLoad = false;
1079           reload();
1080       }
1081   }
1082   
1083   function reloadSlide(anchorLink, index, slideAnchor, slideIndex){
1084       if (mayLoad){
1085           mayLoad = false;
1086           reload();
1087       }
1088   }
1089   
1090   var fullPageArguments=     {
1091       licenseKey: "9E99BF48-17A748C3-A72FB9F6-32A96445",
1092      verticalCentered: false,
1093      //CHROME
1094    scrollOverflow:true,
1095    scrollBar: false,
1096    loopHorizontal: false,
1097    touchSensitivity: 10,
1098           afterResize: resizeVideos, 
1099         afterRender:pleaseLoadContent,
1100     afterLoad: reloadSection, 
1101     afterSlideLoad: reloadSlide,
1102     onLeave:  leaveSection,
1103       onSlideLeave:  leaveSlide
1104   
1105    };
  

leave

1106    var mayLoad=false;
1107   
1108   function leaveSection (origin,destination,direction){
1109           if (! allowScrolling){
1110           return false;
1111       }
1112       mayLoad= true;
1113       homeNode = verticalSlides [destination.index];
1114       saveCurrentURL();
1115       return true;
1116   }
1117   
1118   
1119   function leaveSlide(section,origin,destination,direction){
1120   
1121       if (! allowScrolling){
1122           return false;
1123       }
1124       mayLoad= true;
1125       homeNode = horizontalSlides [destination.index];
1126       saveCurrentURL();
1127       return true;
1128   }
1129   
1130   
1131   function displaySlideNamed(key){
1132       displaySlide(tree.getNodeByKey(key));
1133       saveCurrentURL();
1134   } 
1135   
1136   function displaySlide(aNode){
1137       homeNode = aNode;
1138        setSlides(aNode);
1139        reload();
1140   }
  

moveMoveCommands

1141   function buildFullPage(){
1142             $('#fullpage').fullpage(fullPageArguments);
1143   }
1144   
1145   function moveDown(){
1146       setDownSlides();
1147       restartFullPage();
1148       reloadCore();
1149       $.fn.fullpage.moveSectionDown();
1150   }
1151   
1152    function moveUp(){
1153        setUpSlides();
1154      restartFullPage();
1155       reloadCore();
1156       $.fn.fullpage.moveSectionUp();
1157        
1158   
1159    }
1160   
1161   
1162   
1163   function moveToLast(numberOfSiblings){
1164        return;
1165   }
1166   
1167   function moveToFirst(){
1168   return 
1169       
1170   }
1171   
1172   function moveRight(){
1173       setRightSlides();
1174      restartFullPage();
1175       reloadCore();
1176       $.fn.fullpage.moveSlideRight();
1177   
1178   }
1179   
1180   function moveLeft(){
1181        setLeftSlides();
1182      restartFullPage();
1183       reloadCore();
1184       $.fn.fullpage.moveSlideLeft();
1185        
1186   }
  

moveToMobile

1187   function MoveTo(){
1188       
1189   }
  

pinchToZoom

1190   var allowScrolling = true;
1191   /*
1192   $(document).ready(function() { 
1193   
1194       var scale = 1.0; // initial-scale
1195       var r = 0.10;
1196       var oldScale = scale;
1197   
1198       $(document).bind('gesturechange',function(event){
1199           allowScrolling = false;
1200           $.fn.fullpage.destroy();
1201            var height = viewport.height;
1202            var halfHeight = height / 2.0;
1203            var  offsetTop = vewport.offsetTop;
1204             var oldHeight = halfHeight + offsetTop;
1205           
1206           var newScale = event.originalEvent.scale;
1207           if(newScale  > 1) scale = scale <2 ?  newScale : 2 
1208           else scale = scale > 0.5 ? newScale : 0.5 
1209   
1210         
1211            var ratio = newScale /oldScale; 
1212            var newHeight = (oldHeight * ratio) -height;
1213            viewport.offsetTop = newHeight;       
1214           $('meta[name=viewport]').attr('content', 'width=device-width, minimum-scale='+ scale.toFixed(2) +', maximum-scale='+ scale.toFixed(2) +', user-scalable=yes'); // 
1215           setTimeout(pleaseAllowScrolling,300);
1216                $.fn.fullpage.reBuild();
1217                
1218           oldScale = newScale;
1219   
1220       });
1221   });
1222   
1223   function pleaseAllowScrolling(){
1224        allowScrolling = true;
1225   }
1226   */
  

reload

1227   var fullPage = false;
1228   var newSlides;
1229   function reload(){
1230      
1231       setChildIndex();
1232        setSlides(homeNode);
1233        setAndReload();
1234   }     
1235   
1236   function loadOneSlide(){
1237       
1238       verticalSlides=[homeNode];
1239       horizontalSlides=[homeNode];
1240       setAndReload();
1241   }
1242   
1243   function setAndReload(){ 
1244          setSingleSlide();
1245          reloadCore();
1246           destroyFullPage();
1247          }
1248          
1249   function reloadCore(){       
1250          replaceFullPage();
1251          destroyFullPage();
1252          restartFullPage();
1253   }        
1254   
1255   
1256       
1257   function replaceFullPage(){   
1258            document.title=pageTitle(homeNode);
1259        $('#fullpage div').addClass("old");
1260        newSlides = renderVerticalSlides(homeNode);
1261            $(".old").remove();
1262        $('#fullpage').append(newSlides);
1263    
1264   }
1265   
1266   function destroyFullPage(){
1267         if (fullPage){
1268          $.fn.fullpage.destroy('all');   
1269        }
1270   }     
1271   
1272   function restartFullPage(){
1273        fullPage = true;
1274        $('#fullpage').fullpage(fullPageArguments);
1275   }
1276   
  

MyFilter

1277    //THS FUNCTION IS A HOOK SO THAT EVERYONE CAN GENERATE THE APPROAPRIATE
1278   //STRING TO SEARCH IN THEIR APPLICATION
1279   function getStringToSearch(node){
1280            var searchString = node.data.title+' '+node.data.description + '';
1281            if (node.data.class == 'Video'){
1282               searchString += tree.getNodeByKey(node.data.conference).title; 
1283            }
1284            return searchString;
1285       }
1286       
1287       
1288   // THIS IS THE FUNCTION WHICH RETURNS TRUE IF ALL THE WORDS ARE FOUND IN THE STRING
1289   //FALSE OTHERWISE
1290   function MyFilter(node,regexpArray){ 
1291       
1292      
1293       var j;
1294       var stringToSearch=getStringToSearch(node);
1295       var result=true;
1296       for (j in regexpArray){
1297            if (!(regexpArray[j].test(stringToSearch))){
1298                result=false;
1299            }
1300       }
1301    
1302       return result;
1303   }
1304   
1305   function formattedTitle(node,coreTitle){
1306     return  "&bull; <a title=\""+node.data.description  +  "\"><b>"+ coreTitle +"</b></a>";
1307       
1308   }  
1309   
1310   
  

applyFilter

1311    //SETS A SHORT TITLE, NO DESCRIPTION, FOR BREADCRUMB NODES
1312   function setShortTitle(node){
1313                            node.title=node.data.title;
1314                            //"<a><b>"+node.data.title +"</b></a>"+
1315                     //" ("+getBranchSize(node)+")";
1316           }
1317           
1318    
1319   $.ui.fancytree._FancytreeClass.prototype._applyFilterImpl = function(filter, branchMode, opts){
1320   
1321       //FIRST DEFINE AND SET SOME VARIABLES   
1322    var leavesOnly,
1323        match, 
1324        re, 
1325        searchString=filter,
1326    filterOpts = this.options.filter,
1327    hideMode = filterOpts.mode === "hide",
1328    regexpArray=getRegxpArray(filter);
1329    re2 = new RegExp(filter, "gi");
1330    tree.enableFilter=true;
1331   
1332   
1333    //SET SOME MORE VARIABLES
1334       count=0;
1335    opts = opts || {};
1336    lavesOnly = !!opts.leavesOnly && !branchMode;
1337   
1338    //NOW CREATE THE FUNCTION TO SEARCH A SINGLE NODE
1339    filter = function(node){
1340            var coreTitle;
1341        var res = MyFilter(node,regexpArray);
1342        if (res){
1343             node.title=formattedTitle(node,node.data.title);
1344             setTitle(node);
1345            }
1346   
1347    // DONT DO THIS IF MULTIPLE SEARCH TERMS    (regexpArray.length>1)
1348    if( res && filterOpts.highlight && (regexpArray.length<2)) {
1349         coreTitle=node.data.title.replace(re2, function(s){
1350    return "<mark>" + s + "</mark>";
1351    });
1352    node.titleWithHighlight = formattedTitle(node,coreTitle);
1353   
1354     } else {
1355      delete node.titleWithHighlight;
1356    }
1357   
1358    return res;
1359    };
1360   
1361   
1362    this.enableFilter = true;
1363    this.lastFilterArgs = arguments;
1364   
1365    this.$div.addClass("fancytree-ext-filter");
1366    if( hideMode ){
1367    this.$div.addClass("fancytree-ext-filter-hide");
1368    } else {
1369    this.$div.addClass("fancytree-ext-filter-dimm");
1370    }
1371   
1372    this.visit(function(node){
1373        node.title = node.data.title + node.match;
1374    delete node.match;
1375    delete node.titleWithHighlight;
1376    node.subMatchCount = 0;
1377    });
1378   
1379    // SEACH THE TREE 
1380    //Adjust node.hide, .match, and .subMatchCount properties
1381    
1382      callVisit(this,function(node){
1383        
1384    if (filter(node)) {
1385    count++;
1386    node.match = true;
1387    node.visitParents(function(p){
1388        //MAKE THE UNMATCHED PARENTS LOOK GOOD
1389       if (!(p.match)){
1390               p.match=true;
1391               p.titleWithHighlight="<span style=\"color:#888;\" >"+p.data.title+"</span>";
1392        }
1393        
1394         if ('subMatchCount' in p) {  
1395              p.subMatchCount += 1;
1396              }
1397             else { 
1398                p.subMatchCount=1;
1399             }
1400         
1401    //if( opts.autoExpand && !p.expanded ) {
1402   
1403    p.setExpanded(true, {noAnimation: true, noEvents: true, scrollIntoView: false});
1404    p._filterAutoExpanded = true;
1405   
1406    });
1407   
1408    }
1409   
1410    });
1411   
1412   
1413   };
1414   
1415   
1416   
  

branchSize

1417     var branchSize;
1418    function getBranchSize(node){
1419       if (node.match || node.unmatchedParent){
1420           return node.subMatchCount;
1421       }
1422       else {
1423           branchSize=node.data.branchSize;
1424           branchSize = parseInt(branchSize);
1425           branchSize = branchSize.toString();
1426           return branchSize;
1427           
1428       }
1429   }
1430   
  

collapseChildren

1431    function collapseChildren(node){
1432       var index;
1433       var item;
1434       var children=node.children;
1435       if((node.isFolder())&&node.hasChildren()){
1436           node.setExpanded(false, {noAnimation: true, noEvents: true, scrollIntoView: false});
1437           for (index=0;index<children.length;index++){
1438               item=children[index]
1439               if (item.isExpanded()){
1440                   collapseChildren(item); 
1441               }
1442           }
1443       }
1444   }
  

gui-functions

1445     
1446   
1447   
1448   
1449   var tree = $("#tree").fancytree("getTree");
1450   
1451    /*
1452     * Event handlers for search
1453     */
1454   var match;
1455   
1456   function searchTheTree(match,opts){
1457               oldSearchString=match;
1458               tree.clearFilter();
1459     tree.filterNodes(match, opts);
1460   }
1461   
1462       
1463   function myKeyUp(e){    
1464        if(e && e.which === $.ui.keyCode.ESCAPE ){
1465    $("button#btnResetSearch").click();
1466    return;
1467    }
1468   
1469    var match=$("input[name=search]").val();
1470               myKeyUpCore(match);
1471   }
1472   
1473   $("input[name=search]").keyup(myKeyUp);
1474   
1475   
1476   function myKeyUpCore(match){
1477    var opts={};
1478    var n;
1479       currentSearchString=match;
1480        
1481        
1482       //IF YOU JUST DELETED THE SEARCH STRING
1483       if (currentSearchString.length===0) {
1484          tree.clearFilter(); 
1485          collapseChildren(root);
1486          root.render();
1487          oldSearchString="";
1488          return;
1489       }
1490       
1491       //IF YOU JUST STARTED SEARCHING
1492       if (oldSearchString===""){
1493           oldSearchString=currentSearchString.slice(1);
1494            root.render();
1495            return;
1496           }
1497                
1498               if (callbackCount===0){
1499                   searchTheTree(match,opts);
1500           
1501               }
1502       
1503   
1504   
1505   }      
1506   
1507     function futureSearch(match,opts){
1508                        searchTheTree(match,opts);
1509                     root.render();
1510                    }
1511   
1512   
1513   
1514   
1515     
1516   $("button#btnResetSearch").click(function(e){
1517    $("input[name=search]").val("");
1518    $("span#matches").text("");
1519    tree.clearFilter();
1520    }).attr("disabled", true);
1521   
1522   
1523   
1524   
1525   
1526   
  

search.js

1527         var callbackCount=0;
1528   var count;
1529   var currentSearchString="";
1530   var oldSearchString="";
1531   
1532   function cleanUp(){
1533        var rootNode=$("#tree").fancytree("getTree").getRootNode();
1534           rootNode.render(true);
1535           $("button#btnResetSearch").attr("disabled", false);
1536        $("span#matches").text("(" + count + " matches)");
1537        $.fn.fullpage.reBuild();
1538   
1539   }
1540   
1541   function reSearch(filterFunction){
1542        var value=$("input[name=search]").val();
1543        if (currentSearchString!=value){
1544             $("input[name=search]").trigger("keyup");
1545   
1546           }
1547        else{
1548   
1549               cleanUp();
1550           }
1551   $.fn.fullpage.reBuild();
1552   
1553    }
1554     
1555   
1556    
1557     
  

setScrolling

1558      function setScrolling(){
1559       if (homeNode.data.class == 'Chat'){
1560         $.fn.fullpage.setAutoScrolling(false);
1561         $.fn.fullpage.setFitToSection(false);
1562       }
1563       else{
1564            $.fn.fullpage.setAutoScrolling(true);
1565            $.fn.fullpage.setFitToSection(true);  
1566   
1567       }
1568   }
1569   
  

BeradCrumbsMenu

1570    
1571    function selectChanged(arg){
1572        if (arg.value===''){
1573            return;
1574        }
1575        displaySlideNamed(arg.value);
1576    }
1577   
1578   function setSelectedIndex(s, valsearch){
1579     for (i = 0; i< s.options.length; i++){ 
1580       if (s.options[i].value == valsearch){
1581       s.options[i].selected = true;
1582       break;
1583       }
1584     }
1585   }
1586   
1587   
1588    function onSelectFocus(arg,id){
1589         
1590        arg.selectedIndex = 0;
1591   }
1592   
1593    function onSelectBlur(arg, id){  
1594       setSelectedIndex(arg, arg.id.slice(7));
1595    }
1596   
1597   
1598    function selectSiblings (node,step,width,showChildren){
1599        var siblings = getSiblings(node);
1600        var id = 'select-' + getKey(node);
1601        if (showChildren){
1602            siblings = node.children;
1603            id = 'select-child-category';
1604        }
1605       
1606         result = '<div style = "margin-left:' + (step).toString() + 'em">' 
1607       result += '<select style="-webkit-appearance: none; -moz-appearance: none;  appearance:none; ';
1608       result +='width:auto; max-width: 50em; padding: 0; height:1.7em" class= "text-primary form-control" id = "' + id  + '"';
1609       result += ' onchange ="selectChanged(this)" ' 
1610       result += " onfocus =\"onSelectFocus(this,'" + id + "')\"";
1611       result += " onblur =\"onSelectBlur  (this,'" + id + "')\"";
1612       result += ' value="" ';
1613       result += ">";
1614       
1615       if (showChildren){
1616           result += '<option selected value="">Select Sub-Category or Video▼</option>';
1617       }
1618        else{
1619           result += '<option  >Jump To:</option>';
1620     
1621        }
1622       
1623      // AND NOW GENERAT OPTIONS
1624      for ( let index in siblings){
1625         
1626          item = siblings [index];
1627       
1628          result += "<option ";   
1629          
1630          if (item == node){
1631              result += " selected ";
1632          }
1633        result +=' value="'; 
1634        result += getKey(item);
1635        result +='">';
1636       
1637        result += getTitle(item);
1638         if (item == node){
1639              result += " ▼";
1640          }
1641        if (width > 500){
1642           result +=  ' &nbsp;(' + getBranchSize(item) + ')' 
1643        }
1644    
1645         result += "</option>";
1646      }
1647     result += "</select>";
1648       result +=  '</div>';
1649   
1650     return result;
1651    }
  

ViewCount

1652    function getViewCount(aNode){
1653       if (isMobile){
1654           return aNode.data.viewCount;
1655       }
1656       return aNode.viewCount;
1657   }
1658   
1659   function score (aNode){
1660         var upVotes, downVotes, viewCount, ratio;
1661         upVotes=Number(getUpVotes(aNode));
1662         downVotes= Number(getDownVotes(aNode));
1663         viewCount=Number(getViewCount(aNode));
1664         ratio = (upVotes - (5 * downVotes))/viewCount;
1665         ratio = ratio * 10000;
1666         return ratio;
1667   }
  

Arrows

1668   function oneArrow(direction,x,y,visible, onClick){
1669       var result=''+
1670       '<i style="position:fixed;' +
1671       'top: calc(50vh + ' + y + 'em);'+
1672       'right:' + x + 'em;'+
1673       'opacity:';
1674       if (visible){
1675           result +='1.0;';
1676       }
1677       else{
1678           result += '0.4;';
1679       }
1680       if (visible){
1681          result += 'color:green;';
1682       }
1683       else{
1684          result += 'color:red;';
1685       }
1686       result += '" ' 
1687       result += 'class="fa fa-arrow-circle-' + direction +
1688       '"'+
1689       'onClick="' + onClick + '"' + 
1690       '></i>';
1691       return result;
1692   }
1693   
1694   function addArrows(slide){
1695      
1696       if (isMobile){
1697              return arrowsMobile(slide);
1698       }
1699       else{
1700           return arrowsDesktop(slide);
1701       }
1702        
1703      
1704   }
1705   
1706    
1707   function arrowsDesktop(slide){
1708     var result = "" +
1709   '<div  class = "my-desktop-arrows" >' +
1710   arrows(slide)+
1711   '</div>';  
1712   return result;
1713   }
1714   
1715   //THIS IS WHERE THE 3EM FONT SIZE WAS SET
1716   function arrowsMobile(slide){
1717   
1718     var result = "" +
1719   '<div  class = "my-mobile-arrows" >' +
1720   arrows(slide)+
1721   '</div>';  
1722   return result;
1723   }
1724   
1725   function arrows(slide){
1726     
1727       
1728   var result = "" +
1729   
1730   oneArrow('left',2,1,canGoLeft(slide),'goLeft()') +
1731   oneArrow('up',1,0,canGoUp(slide),'goUp()') +
1732   oneArrow('right',0,1,canGoRight(slide),'goRight()') +
1733   oneArrow('down',1,2,canGoDown(slide),'goDown()') 
1734   
1735   return result;
1736   }
  

JumpToChat

1737   function jumpToChat(node){
1738       try{
1739           var newLocation = '/' + getKey(homeNode) + '/chat';
1740           window.location.assign(newLocation);
1741       }
1742       
1743       catch(err){
1744           return window.location.assign('/chat');
1745       }
1746   }
  

MaybeSlideTo

1747    function maybeSlideTo(event, childName){
1748      if (isLoaded){
1749       event  = event || window.event;
1750       event.preventDefault();
1751       slideDownTo(childName);
1752       }
1753   }
1754   
1755    function maybeJumpTo(event, childName){
1756        debugger;
1757      if (isLoaded){
1758       event  = event || window.event;
1759       event.preventDefault();
1760       displaySlideNamed(childName);
1761       }
1762   }
1763    
1764   
1765   
  

MyVideoMenu

1766     //This version of Pug.jsdoesnot interpoate attributes, so here is a workaround. 
1767   function myVideoMenu(){
1768   var result = '' +
1769    `<a class="dropdown-item" href="/person/${userId}/">My Videos </a>` +
1770    
1771   ` <a class="dropdown-item" href="/person/${userId}/addVideo">Add Video </a>` +
1772   `<a class="dropdown-item" href="/person/${userId}/addRSS">Add RSS Feed</a>` 
1773   return result;
1774   }
  

arguments

1775    var urlParams = new URLSearchParams(window.location.search);
1776   var sortBy = 'bestWilsonScore';
1777    
1778   if (urlParams.has('sortBy') ){
1779       sortBy = urlParams.get('sortBy');
1780   }
1781   if (!(['bestWilsonScore','bestMyScore','bestMostRecent'].includes(sortBy))){
1782       sortBy='bestWIlsonScore';
1783   }
1784   
  

arrowKeys

1785    var waiting = false;
1786   var allowUp = true; 
1787   var lastScrollTop = 0;
1788   
1789   function resetAllowUp(){ 
1790       allowUp = true;
1791   }
1792   
1793   function resetLastScrollUp(){
1794         lastScrollTop = 10;
1795   }
1796   
1797   function resetWaiting(){
1798          waiting = false;
1799   }
1800   function logit (arg){
1801          console.log (arg,' 1', document.body.scrollTop );
1802        console.log (arg,'allow UP',  allowUp );
1803        console.log (arg,' 3',  lastScrollTop);
1804        console.log (arg,' WAITING ',  waiting);
1805        console.log (arg,' HOMENODE     ',  homeNode.kry);
1806   }
1807   
1808   function maybeScrollSlideUp(){
1809         if ((document.body.scrollTop ===0 ) &&
1810         allowUp && 
1811         (lastScrollTop !== 0)  &&
1812         ! waiting){
1813         lastScrollTop = 0; 
1814         allowUp = false;
1815         waiting = true;
1816         goUp();  
1817         setTimeout(resetAllowUp , 1000);  
1818         setTimeout(resetWaiting , 1000); 
1819         return;
1820         }
1821         lastScrollTop = document.body.scrollTop;
1822   }  
1823    
1824    function maybeScrollSlideDown(){
1825        var element= document.body;    
1826        var value = element.scrollHeight - element.scrollTop - element.clientHeight;  
1827       if (value < 1) {
1828         lastScrollTop = 0;
1829         waiting = true;
1830         allowUp = false;
1831         setTimeout(resetAllowUp , 3000); 
1832         setTimeout(resetWaiting , 1000); 
1833         goDown();
1834       }
1835   }
1836   
1837   //THE FIRST ONE BREAKS EVERYTHING
1838   //document.body.addEventListener('mousewheel', maybeScrollSlideUp);
1839   //document.body.addEventListener('mousewheel', maybeScrollSlideDown);
1840   
1841   function getChildIndex(aNode){
1842        var childIndex= 0  
1843        if ( 'previousChildIndex' in aNode){
1844         childIndex = homeNode.previousChildIndex;
1845         }
1846        return childIndex; 
1847   }
1848   
1849   function canGoUp(node){
1850       return !isRoot(node);
1851   }
1852   
1853   function goUp (){
1854      
1855       if (canGoUp(homeNode)){
1856           var offset = homeNode.parent.children.indexOf(homeNode);
1857           homeNode.parent.previousChildIndex = offset;
1858           moveUp();
1859       }
1860   }
1861   
1862   function canGoDown(node){
1863    return hasChildren(node);   
1864   }
1865   
1866   function goDown (){
1867       if(! canGoDown(homeNode)){
1868           return;
1869       }
1870       var childIndex=getChildIndex(homeNode);
1871       moveDown(childIndex);
1872   }
1873   
1874   function canGoRight(node){
1875       var siblings= getSiblings(node);
1876       var offset = siblings.indexOf(homeNode);
1877       var numberOfSiblings = siblings.length;
1878       return (offset < numberOfSiblings -1 );
1879   }
1880   
1881   function goRight (){
1882      var siblings = getSiblings(homeNode);
1883       var offset = siblings.indexOf(homeNode);
1884       var numberOfSiblings = siblings.length;
1885       if (canGoRight(homeNode)){
1886          homeNode.parent.previousChildIndex = offset + 1;
1887          moveRight(offset);
1888       }
1889       else {
1890           homeNode.parent.previousChildIndex = 0;
1891            moveToFirst();
1892       }
1893   }
1894   
1895   
1896   function canGoLeft(node){
1897         
1898       var siblings= getSiblings(homeNode);
1899       var offset = siblings.indexOf(homeNode);
1900       var numberOfSiblings = siblings.length;
1901       return  (offset > 0);
1902   
1903   }
1904   function goLeft (){
1905     
1906       var siblings= getSiblings(homeNode);
1907       var offset = siblings.indexOf(homeNode);
1908       var numberOfSiblings = siblings.length;
1909   
1910       if (canGoLeft(homeNode)){
1911           homeNode.parent.previousChildIndex = offset -1;
1912           moveLeft(offset);
1913       }
1914       
1915       else{
1916          homeNode.parent.previousChildIndex = numberOfSiblings -1;
1917          moveToLast(numberOfSiblings); 
1918       }
1919       
1920   }
1921   
1922   
1923   
1924      document.onkeydown = function (e) {
1925     if (e.key=="ArrowUp"){
1926        maybeScrollSlideUp();
1927     }
1928       else if (e.key=="ArrowDown"){
1929       maybeScrollSlideDown();
1930     }
1931       else if (e.key=="ArrowLeft"){
1932         goLeft();
1933     }
1934       else if (e.key=="ArrowRight"){
1935           goRight();
1936         
1937     }
1938      else if (e.key=="PageUp"){
1939         goLeft();
1940     }
1941       else if (e.key=="PageDown"){
1942           goRight();
1943     }
1944   };
  

arrows

1945    function footer(item,index){
1946        var result = "";
1947                        
1948        if (hasChildren(item)){
1949            result += " &uarr; ";
1950        }
1951           if (isRoot(item) !== null){
1952            result += " &darr; ";
1953        }
1954           if (index > 0){
1955            result += " &rarr; ";
1956        }
1957           if (! isRoot(item)){
1958            result += " &larr; ";
1959        }
1960        return result;
1961    }
  

loadContent

1962   function errorF( jqXHR, textStatus, errorThrown ){
1963       console.log ("AJAX ERROR", jqXHR, textStatus, errorThrown );
1964           // $.fn.fullpage.reBuild();
1965   
1966   }
1967   
1968   
1969   //after slide load
1970   function loadContent(){
1971     
1972       if (homeNode === undefined){
1973           return;
1974       }
1975      
1976       var url = "/" + getKey(homeNode) + "/content";
1977       divName = "#" + getKey(homeNode) + "-content";
1978         $.ajax({
1979             type: 'POST',
1980             url: url, 
1981         data: {'sortBy':sortBy},
1982         cache: false, 
1983         error: errorF,
1984         success: function(result){
1985           $(divName).html(result);
1986           resizeVideos(0,0,"body");
1987        localRebuild();
1988       }
1989         });
1990       
1991   }
1992    
1993   
1994      
  

navbar.pug

1995   nav.navbar.navbar-expand-md.navbar-dark.bg-dark
1996     button.navbar-toggler(type='button', data-toggle='collapse', data-target='#navbarsExample04', aria-controls='navbarsExample04', aria-expanded='false', aria-label='Toggle navigation')
1997       span.navbar-toggler-icon 
1998     #navbarsExample04.collapse.navbar-collapse
1999       ul.navbar-nav.mr-auto
2000         li.nav-item.dropdown
2001           a#dropdown04.nav-link.dropdown-toggle(href='https://example.com', data-toggle='dropdown', aria-haspopup='true', aria-expanded='false') Home
2002           .dropdown-menu(aria-labelledby='dropdown04')
2003             a.dropdown-item(href='https://berniesupporters.org') Progressive Politicians
2004             a.dropdown-item(href='https://stopsmog.info') Stop Smog 
2005             a.dropdown-item(href='https://ClimateActivists.info') Climate Change
2006             if (window.location.host.toLowerCase() == "pythonlinks.info" )  
2007             a.dropdown-item(href='https://PythonLinks.info') Python Videos
2008             a.dropdown-item(href='https://golangvideos.com') GoLang Videos
2009             a.dropdown-item(href='https://ForestWiki.com') Forest Chat Wiki
2010             
2011         //  //getClass(node)!='Video'         
2012         if (false)     
2013           li.nav-item.dropdown
2014             a#dropdown04.nav-link.dropdown-toggle(href='https://example.com', data-toggle='dropdown', aria-haspopup='true', aria-expanded='false') View
2015             .dropdown-menu(aria-labelledby='dropdown05')
2016               a.dropdown-item(
2017                 href='#'
2018                 onClick='wilsonView()'
2019               ) WIlson Score
2020               a.dropdown-item(
2021                 href='#'
2022                 onClick ='myScoreView()'
2023               ) Votes/View
2024               a.dropdown-item(
2025                 href='#'
2026                 onClick ='mostRecentView()'
2027               ) Most Recent
2028               a.dropdown-item(
2029                 href='./json' 
2030               ) JSON
2031                a.dropdown-item(href='https://PythonLinks.info/wilson-score') Explain
2032         // IF VIDEO
2033         if getClass(node)=='Video'         
2034           li.nav-item.dropdown
2035             a#dropdown04.nav-link.dropdown-toggle(href='https://example.com', data-toggle='dropdown', aria-haspopup='true', aria-expanded='false') Vote
2036             .dropdown-menu(aria-labelledby='dropdown05')
2037               a.dropdown-item(
2038                 href='#'
2039                 onClick = 'upVote()'
2040               ) Up Vote
2041               a.dropdown-item(
2042                 href='#'
2043                 onClick = 'downVote()'
2044               ) Down Vote
2045               a.dropdown-item(href='https://PythonLinks.info/wilson-score') Explain
2046               
2047               
2048         //PER USER
2049         if isAuthenticated         
2050           li.nav-item.dropdown
2051             a#dropdown04.nav-link.dropdown-toggle(href='https://example.com', data-toggle='dropdown', aria-haspopup='true', aria-expanded='false') My Content
2052             .dropdown-menu(aria-labelledby='dropdown05'
2053             ) !{myVideoMenu()}
2054          
2055         if (window.location.host.toLowerCase() != "rights.men" )       
2056           li.nav-item
2057             a.nav-link(
2058             onClick = 'jumpToChat()'
2059             ) Chat
2060             span.sr-only (Chat)
2061               
2062         li.nav-item
2063           a.nav-link(
2064           href='/contact'
2065           ) Contact
2066           span.sr-only (Contact)
2067         if  ! isAuthenticated 
2068           li.nav-item
2069              a.nav-link(
2070               onclick = "pleaseLogin()"
2071              ) Google Login
2072              span.sr-only (Subscribe)
2073           
2074           
2075         if  isAuthenticated 
2076            li.nav-item
2077               a.nav-link(
2078               href='/logout'
2079               ) Logout
2080               span.sr-only (Logout) 
2081               
2082                       
2083      
2084          
2085            
2086               
2087       if isMobile            
2088         form.form-inline.my-2.my-md-0
2089           input.form-control(
2090             type='text'
2091             placeholder='Search'  
2092             onFocus = 'showSearch()'
2093           )           
2094       ul.navbar-nav.ml-auto
2095         li.nav-item
2096           a.nav-link(
2097             href='https://twitter.com/intent/follow?screen_name=PythonLinks'
2098             target='_blank' 
2099           )   
2100               != twitterLinkFront()
2101               img(
2102                 alt='Follow to receive video recommendations' 
2103                 style = 'height:  1.5em;'
2104                 src='https://pythonlinks.info/static/graphics/twitter-logo.png'
2105               )
2106               != twitterLinkBack()
2107         li.nav-item
2108           a.nav-link(
2109             href='#' 
2110             onclick='resizeText(-1)'  
2111           ) a
2112             span.sr-only (Make the Font Smaller)
2113         li.nav-item
2114           a.nav-link(
2115             href='#'
2116             onclick='resizeText(+1)'
2117           ) A
2118             span.sr-only (Make the Font larger)
2119        
2120           
2121             
2122            
2123   
2124   
  

breadcrumbs

2125      function oneCrumb(item,step,width,showChildren){
2126           result = '<div style = "margin-left:' + (step + 1).toString() + 'em">' +
2127            getTitle(item).link('/' + getKey(item)) 
2128            if (width > 500){
2129                result +=  ' &nbsp;(' + getBranchSize(item) + ')' 
2130            }
2131            result +=  '</div>';
2132           return result;
2133    }
2134    
2135    
2136    function breadcrumbs(node){
2137         var width = $( window ).width();
2138        var result="";
2139        var offset;
2140        var items=parents(node);
2141       
2142        var length = items.length;
2143        var step;
2144     
2145        result+= "<div style = \"text-align:left; \">";
2146   
2147       for (step = 0; step < length; step++) {
2148           item=items[step];
2149           result += oneCrumb(item,step,width,false);
2150           }
2151         
2152        //Following lines are used in the more complex breadcrumbs Menu
2153        //result += selectSiblings(node,length -1,width,false);  
2154        //if (hasChildren(node)){
2155        //    result += selectSiblings(node,length,width, true); 
2156        //}
2157        result += "</div>";
2158        return result;
2159    }
2160    
  

generateTwitter

2161    function getHashTag(node){
2162       if (isMobile) {
2163           return node.data.hashTag;
2164       }
2165       else {
2166           return node.hashTag;
2167       }
2168   }
2169    function renderTweetForm(node){
2170        if (node != homeNode){
2171            return "";
2172        }
2173        var url =  'https://PythonLinks.info/'+ getKey(node) 
2174       result = "";
2175       result += '<div class="form-group" style = "padding: 20px;">' 
2176       
2177       result += '<form id="messageForm"  action="https://twitter.com/share" method="get">' +
2178        '<label for="comment">Comment on Twitter about:</label><br>' +
2179       '<input type="hidden" name="source" value="tweetbutton"> ' +
2180       '<textarea id="tweet" name= "text"  rows="5"' +
2181       'class="form-control">' + node.title + '\n' +
2182        url  + 
2183       ' via @PythonLinks ' +
2184        getHashTag(node) + ' '  +
2185        '</textarea>' +
2186       '<button type="submit"  formtarget="_blank" class="btn btn-primary">Tweet</button> &nbsp;' +
2187        '<span id="charactersRemaining"></span>' +
2188        '</form>' 
2189        
2190       result += '</div>' 
2191       
2192       return result;
2193   }
2194   
2195   function commentType(node){
2196       if (getClass(node) == 'Conference'){
2197           return 'If you are kind enough to say what you thought about this conference,' + 
2198           'your comments will show up here.';
2199       }
2200           if (getClass(node) == 'Video'){
2201               return 'If you are kind enough to review this video after you watch it,' +
2202               'your review on twitter will be posted here';
2203           }
2204       if (getClass(node) == 'Category'){
2205           return 'If you are kind enough to give me your professional advice on the organization '+
2206           'of this category, I will either make the changes, or post your ocmment here';
2207       }
2208       return '';
2209   
2210   }
2211   
2212   function renderTweet(tweetId){
2213       var result = '<blockquote class="twitter-tweet" data-lang="en"><p lang="en"' +
2214        'dir="ltr">&quot;Data Science Without Borders&quot; is the overall best '+
2215       '<a href="https://twitter.com/hashtag/Python?src=hash&amp;ref_src=' +tweetId +'">#Python</a> video, beating out &quot;Towards Pandas 1.0&quot; by 181 to 119 Youtube up votes. <a href="https://t.co/EXWwvk3BKG">https://t.co/EXWwvk3BKG</a></p>&mdash;' +
2216       ' The Best of 710 Python Conference Videos (@PythonLinks) ' +
2217       '<a href="https://twitter.com/PythonLinks/status/1048163192080404480?ref_src=twsrc%5Etfw">'+
2218       'October 5, 2018</a></blockquote>' +
2219       '<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>';
2220        return result;
2221   }
2222    /*
2223   function notUsed(){
2224     if ('showHashTag' in node){
2225         result +='<a href="https://twitter.com/search?q=' + 
2226         node.hashTag +
2227         '">See the comments on twitter.</a>';
2228     }
2229     else{
2230         result += "<p>If you would be so kind as to post the "+
2231         "first comment on this page, I will go ahead and add a link to the unique hashtag "+
2232         "timeline on Twitter</p>";
2233     }
2234   }
2235     */
2236   
2237   var el;                                                    
2238   
2239   function countCharacters(e) {                                    
2240     var textEntered, countRemaining, counter;          
2241     textEntered = document.getElementById('tweet').value;  
2242     counter = (280 - (textEntered.length));
2243     countRemaining = document.getElementById('charactersRemaining'); 
2244            countRemaining.textContent = ""; 
2245   
2246       if (counter < 20){
2247           countRemaining.textContent = counter.toString() + 
2248           ' Characters Remaining';
2249       }
2250   
2251   }
2252   
2253   function postRender(){
2254       el = document.getElementById('tweet');                   
2255   el.addEventListener('keyup', countCharacters, false);
2256   countCharacters();
2257   }
2258   
  

buttonFunctions

2259    
2260   function editProfile(){
2261       window.location.href = "/person/" + userId + "/editPrincipal";
2262   }
2263   
2264   
2265   function editProfile(){
2266       window.location.href = "/person/" + userId + "/editPrincipal";
2267   }
2268   
2269    function changeView(){
2270           showBest = ! showBest;
2271   
2272        var label = "Best View";
2273        if (showBest){
2274            label = "List View";
2275        }
2276      
2277       $("#viewButton").html(label);
2278       var result = generateLeadersOrContentCore(homeNode);
2279       $("#bestContent" + '-' + getKey(homeNode)).html(result);
2280            localRebuild();   
2281   
2282       }
  

renderButtons

2283   function renderServerOptions(node){
2284       var url ="https://";
2285       if (isMobile) {
2286           url += 'desktop.';
2287           url+=domain;
2288           url += '/';
2289           url += getKey (node);
2290           return '<a class="dropdown-item" href="' + url + '">Desktop (Beta)</a>';
2291       }
2292        if (! isMobile) {
2293            url += domain.slice(8);
2294               url += '/';
2295        url += getKey (node);
2296           return '<a class="dropdown-item"  href="' + url + '">Mobile</a>';
2297       }
2298       
2299   }
2300   
2301   function lili(arg){
2302       return '<li>' + arg + '</li>';
2303   }
2304   
2305    function renderProfileOption(){
2306       if (isAuthenticated){
2307              return lili('<a onclick="editProfile()">Profile</a>');
2308       }
2309       else 
2310       {return "";}
2311   }
2312   
2313   
2314   
2315   function renderSubscribeOption(item){
2316      if ( ! isAuthenticated){
2317              return lili('<a href="./register/user">Get Updates</a>');
2318    }
2319    return '';
2320   }
2321   
2322     
2323   
2324    
2325    
2326    
2327    function renderChatButton(item){
2328        if (getClass(item)=="Video"){
2329            return "<button  onclick=\"goToChat('" +
2330         getKey(item)+ 
2331          "')\" type=\”submit\” class=\”btn btn-primary\”>Chat</button> " 
2332         }
2333         return "";
2334    }
2335    
2336    
2337     function renderRegisterButton(item){
2338            return "<button  onclick=goToRegister(\"" +
2339         getKey(item) + 
2340          "\")  type=\”submit\” class=\”btn btn-primary\”>Register</button> " 
2341    }
2342    
2343    
2344     function renderLoginOption(item){
2345            if ( ! isAuthenticated){    
2346                return lili( '<a  href = "./register/web">Login</a> ') 
2347            }
2348      else {
2349                return "";
2350            }
2351    }
  

renderSearchButton

2352    function renderSearchOption(item){
2353     return  lili ('<a  class="text-primary" onclick="showSearch()"> Search</a>') 
2354    }
  

renderthumbs

2355     function getVoteDivName(item,divName){
2356         return  getKey(item) + "-" + divName;
2357     }
2358     
2359      function renderVoteButton(item,thumb,functionName,votes,divName){
2360        if (getClass(item)!="Video"){
2361                  return "";
2362        }
2363            return "<button  onclick=" + functionName +"('" +
2364         getKey(item)+ 
2365          "')  type=\”submit\” class=\”btn btn-primary\”>" + 
2366           "<span style=\"font-size=3em\"" +
2367          "id =\""+ getVoteDivName(item,divName) + "\">" +
2368          votes + "</span>" + thumb + "</button>" 
2369        
2370    }
2371   
2372     function renderThumbs(slide){
2373        if (getClass(slide) != "Video"){
2374                  return "";
2375     }
2376     
2377    
2378           return   renderVoteButton(slide," 👍 ","upVote", getUpVotes(item),"upVotes") +
2379             renderVoteButton(slide," 👎 ","downVote", getDownVotes (item), "downVotes");
2380           
2381   }
2382   
2383            
2384     
2385     
2386    
  

threeMenuButtons

2387    function visible(){
2388        if ( (userId == 'lozinski') || 
2389          (handle == "ChristopherLozinski") || 
2390          (handle == "JustinMorgan") ||
2391          (handle=="WojtekB.")
2392          ){
2393            return true;
2394        }
2395        else{return false;}
2396    }
2397    
2398     function editMenu(slide){
2399        if (! isAuthenticated)
2400        {
2401            return '';
2402        }
2403      
2404        var result ="" +   
2405        ' <span class="dropdown">' +
2406         '<button class="btn btn-primary dropdown-toggle"'+
2407           'type="button"data-toggle="dropdown">Editor'+
2408          '<span class="caret"></span></button>' 
2409        result +=       '<ul class="dropdown-menu dropdown-menu-right">' +
2410       lili("<a href=\"/" + getKey(homeNode) + "/ckedit\">Ck Edit</a> ") +
2411       lili("<a href=\"/" + getKey(homeNode) + "/aceedit\">Ace Edit</a> ") 
2412       if ((getClass(slide) == 'Category')||
2413           (getClass(slide) == 'HomePage'))
2414       {
2415         result +='' + 
2416         lili("<a href=\"/" + getKey(homeNode) + "/addCategory\">Add Category</a> ");
2417         if (userId == 'lozinski') {
2418             result +='' +  
2419             lili("<a href=\"/" + getKey(homeNode) + "/addConference\">Add Conference</a> ") 
2420         }}
2421       if (getClass(slide) == 'Conference'){
2422         result +='' + 
2423           lili("<a href=\"/" + getKey(homeNode) + "/addVideo\">Add Video</a> "); 
2424       }
2425         if (getClass(slide) == 'Conference'){
2426         result +='' + 
2427           lili("<a href=\"/" + getKey(homeNode) + "/addLightningTalk\">Add Lightning Talk</a> "); 
2428       }
2429          if (getClass(slide) == 'Video'){
2430       result+= lili("<a href=\"/" + getKey(homeNode) + "/starttime\">Edit Start Time</a>") 
2431       //lili("<a href=\"/" + getKey(homeNode) + "/addComment\">Add Comment</a> ") 
2432       } 
2433       
2434      
2435       
2436              if (getClass(slide) != 'Video'){
2437       result+= lili("<a href=\"/" + getKey(homeNode) + '/manage">Manage</a>') 
2438   }
2439      
2440       result += "</ul>  </span> ";
2441   return result;
2442   }
2443   
2444   
2445    function manageMenu(slide){
2446        if (userId != 'lozinski'){
2447            return '';
2448        }
2449      
2450        var result ="" +   
2451        ' <span class="dropdown">' +
2452         '<button class="btn btn-primary dropdown-toggle"'+
2453           'type="button"data-toggle="dropdown">Manage'+
2454          '<span class="caret"></span></button>' 
2455        result +=       '<ul class="dropdown-menu dropdown-menu-right">' 
2456       if (getClass(slide) != 'Video'){
2457         result +='' + 
2458         lili("<a href=\"/" + getKey(homeNode) + '/manage">Manage</a> ') +
2459         lili('<a href=\"' +'/Products/Root/AllJavascript/search">Scripts</a> ') +
2460         lili("<a href=\"/" + getKey(homeNode) + '/addPlayList">Add PlayList</a> ') +
2461         lili("<a href=\"/" + getKey(homeNode) + '/addChannel">Add Channel</a> ') +
2462         lili("<a href=\"/" + getKey(homeNode) + '/addPyVideo">Add PyVideo</a> ') +
2463         lili("<a href=\"/" + getKey(homeNode) + '/editors">Editors</a> ') +
2464         lili("<a href=\"/" + getKey(homeNode) + '/cachedContent">CachedContent</a> ') 
2465       }
2466       if (getClass(slide) == 'Video'){ 
2467        result+=   lili( " <a href=\"/" + getKey(homeNode) + "/move\">Move</a>") 
2468       }
2469      
2470       result += "</ul>  </span> ";
2471   return result;
2472   }
2473   
2474   
2475    function userMenu(slide){
2476        var result ="" +   
2477        ' <span class="dropdown">' +
2478         '<button class="btn btn-primary dropdown-toggle"'+
2479           'type="button"data-toggle="dropdown">Menu'+
2480          '<span class="caret"></span></button>' 
2481        result +=       '<ul class="dropdown-menu dropdown-menu-right">';
2482         result +=renderViewOption(slide) 
2483        result += renderSearchOption(slide) +
2484        renderSubscribeOption(slide) +
2485        renderServerOptions(slide) +
2486        //renderProfileOption (slide) +
2487        lili ('<a href ="/contact">Contact</a>')+
2488        renderLoginOption(slide) +
2489        renderSignOutOption(slide) +
2490       "</ul>  </span>" 
2491   return result;
2492   }
  

whichview

2493     function changeContent(){
2494         loadContent(homeNode);
2495            saveCurrentURL();
2496    }
2497    
2498    function wilsonView(){
2499        sortBy='bestWilsonScore';
2500        changeContent();
2501    }
2502    
2503    function myScoreView(){
2504        sortBy = 'bestMyScore';
2505            changeContent();
2506    }
2507    
2508    function mostRecentView(){
2509        sortBy =  'bestMostRecent';
2510           changeContent();
2511    }
2512    
2513     function renderViewOption(item){
2514         if (getClass(item) == "Video"){
2515             return "";
2516         }
2517   
2518     var showWilson  = ' <a  class="text-primary" onclick="wilsonView()"> Best Score</a>' 
2519     var showMyScore = ' <a  class="text-primary" onclick="myScoreView()">Score/Views</a>' 
2520     var showRecent  = ' <a  class="text-primary" onclick="recentView()"> Most Recent</a>' 
2521     
2522     var result ='';
2523    
2524     if (sortBy != 'bestWilsonScore'){
2525         result+= lili(showWilson);
2526     }
2527      if (sortBy != 'bestMyScore'){
2528         result+= lili(showMyScore);
2529     }
2530     if (sortBy != 'bestMostRecent'){
2531         result+= lili(showRecent);
2532     }
2533     return result;
2534    }
2535    
  

news

2536    var news = '' //+
2537    //'<b>Nov 27, 2018</b> &nbsp;' +
2538    //'Here are   <a onclick="displaySlideNamed(\'tensorflow-dev-summit-2018\')">' +
2539    //'the best talks from the TensorFlow Dev Summit.</a>' 
2540    
  

renderContetnDiv

2541    function renderContentDiv(slide){
2542        return "<div id=\"" +
2543        getKey(slide) + "-content" +
2544        '"' +
2545        "></div>"  
2546    }
2547    
2548    function debugIt(){
2549        var i,j;
2550        var result ="<br>" 
2551        for (i=0; i<verticalSlides.length; i++){
2552            if (verticalIndex == i){
2553                     for (j=0; j<horizontalSlides.length; j++){
2554                  result += horizontalSlides[j].key;
2555                  result += " ";
2556                 }
2557            }
2558            else{
2559                result += verticalSlides[i].key;
2560            }
2561            result += "<br> \n";
2562        }
2563        return result;
2564    }
  

renderMore

2565    function renderExtra(){
2566       return "<br> <br> <br><br><br><br>";
2567   
2568   }
2569   
2570   function renderFollowTwitter(){
2571       return '<a style = " padding: 20px;" target="_blank" ' +
2572       'href="https://twitter.com/intent/follow?screen_name=' +
2573       twitterId+ '">' +
2574       '<img alt="Follow to receive video recommendations"' +
2575       'target= "_blank"' +
2576       'src="https://pythonlinks.info/static/graphics/twitter-logo.png"' + 
2577       '></a> ' 
2578   }
2579   
2580       
2581   
2582   function renderDescription (slide){
2583            var description = getDescription(slide) 
2584            if (description === ""){return ""}
2585            return  '<p style="text-align:left;">' +
2586            description +
2587              "</p>" 
2588   }
2589   
  

renderTitleSubTitle

2590     function getSubTitle(slide){
2591         if (getClass(slide)!='Conference'){
2592             return "";
2593         }
2594         var result = '';
2595         var conferenceName;
2596         var preamble = "Talks at " 
2597         if (slide.key == rootName){
2598             preamble = "at ";
2599         }
2600         if (getClass(slide) == 'Category'){
2601             return '';
2602         }   
2603       
2604         conferenceName = getConferenceName(slide);//WASgetSearchedConferenceName();
2605         if (conferenceName){
2606            result += '<h3 style ="text-align:center;">' + preamble + conferenceName + '</h3>';  
2607         }
2608         return result;
2609    }
2610    
2611    function renderTitle(slide){
2612        var result = '';
2613        if (info.banner && !info.logo) {
2614            result += `<img src="/Banner.png" style="max-height:150px;  width: auto; height: auto; max-width: 100%;  display: block; margin-left: auto; margin-right: auto;">`;
2615        }
2616        debugger;
2617        result += `<div>`;
2618           if (info.logo ) {
2619            result += `<img alt="" src="/${getKey(slide)}/Logo" style="float:left; max-width: 30%; width: auto;  height: auto; padding: 10px; ">`;
2620        }
2621        
2622        result +=  `<h1 style =" text-align:center;">  ${getTitle(slide)} </h1> <br>` 
2623         result += "</div>";
2624         return result;
2625    }
2626             
  

socialMediaLinks

2627   // FUNCTION TO GENERATE SOCIAL MEDIA LINKS
2628   
2629   function socialMediaLinks(slide){
2630   
2631   
2632   var title = getTitle(slide);
2633   var encodedTitle = encodeURI(title);
2634   var description = getDescription(slide);
2635   var encodedDescription = encodeURI(description);
2636   var theURL ="https://PythonLinks.info"+ '/' + getKey(slide);
2637   var titlePlusDescription = title + ' ' + description;
2638   var encodedTitlePlusDescription = encodeURI(title + ' ' + description);
2639   var result ="";
2640   
2641   result +='<center><div>' +
2642   //FIRST THE EMAIL LINK
2643    '<a href="mailto:?subject='+ encodedTitle+ '&body=' + 
2644    encodeURI (description + ' ' + theURL) +'"' + 
2645   'class="share-btn email" title="Email">' +
2646   '<i class="fa fa-envelope"></i></a>' 
2647   
2648   
2649   
2650   //NOW THE FACEOOK LINK
2651   result += '<a href="https://www.facebook.com/sharer/sharer.php?u=' +
2652   theURL + '&t=' + encodedTitle +'" class="share-btn facebook"' +
2653   'title="Facebook">' +
2654   '<i class="fab fa-facebook"></i></a>';
2655   
2656   //NOW TWITTER
2657   //result += '<a href="https://twitter.com/share?text=' +
2658   //encodedDescription + '&url=' + theURL +';via=PythonLinks' +  
2659   //'" class="share-btn twitter" title="Twitter">' +
2660   //'<i class="fa fa-twitter"></i></a>' 
2661   
2662   
2663   //AND REDDIT
2664   result += '<a href="http://reddit.com/submit?url=' +
2665   theURL + '&title=' + encodedDescription + '&kind=link" class="share-btn reddit" title="reddit">'+
2666   '<i class="fab fa-reddit"></i></a>';
2667   
2668   //NOW FOR LINKED IN 
2669   result += '<a href="https://www.linkedin.com/shareArticle?url=' +
2670   theURL + '&title=' + encodedTitlePlusDescription +
2671   encodedTitlePlusDescription + 
2672   '" class="share-btn linkedin" title="LinkedIn">' +
2673   '<i class="fab fa-linkedin"></i></a>';
2674   
2675   
2676   result += '</div></center>';
2677   
2678   return result;
2679   }
  

generateLeadersCore

2680    
2681   function generateLeadersOrContentCore(slide){
2682       if (showBest){
2683           return generateLeaders(slide);
2684       }
2685       else{
2686           return generateContent(slide);
2687       }
2688   }
  

generateContents

2689     
2690        function generateContent(rootNode){
2691         if ((getClass(rootNode) === 'Video')){
2692                return "";
2693            }
2694            result ='<div style="margin:auto; max-width: 100vh;">';
2695          
2696           result += generateContentCore(rootNode) 
2697           result +='</div>';
2698           return result;
2699        }        
2700        
2701        
2702        
2703   function tableHead(subTitle){
2704           return    "<tr>" +
2705           TD (' <a href = "https://www.evanmiller.org/how-not-to-sort-by-average-rating.html">Score</a>')+
2706                    
2707                     TD (' Votes ') +
2708                     TD(subTitle ) +
2709                     "</tr>";
2710   }     
2711   function videosInThisFolder(node){
2712       var videos=[];
2713       var video;
2714       var children = node.children;
2715       if (! hasChildren(node)){
2716           return videos;
2717       }
2718       var arrayLength = node.children.length;
2719       for (var i = 0; i < arrayLength; i++) {
2720           video=children[i];
2721           if (getClass(video) =='Video'){
2722           
2723           video.data.ratio =  score (video);        
2724           videos.push(video);
2725           }
2726       }
2727   return videos;
2728   }
2729   
2730   function childCategoriesRow (rootNode){
2731         var text = '<tr><td colspan="4">';
2732              text += renderChildCategories(rootNode);
2733              text += "</td></tr>" 
2734         return text;
2735   }
2736              
2737              
2738           
2739       function generateContentCore(rootNode){
2740   
2741       
2742             var text='';
2743             var i;
2744             var sortedArray = videosInThisFolder(rootNode);
2745             var sortedArrayLength = sortedArray.length;
2746             if (sortedArrayLength === 0){
2747                 return renderChildCategories(rootNode);
2748             }
2749             
2750             text += renderChildCategories(rootNode);
2751             text += "<h3>Videos in this Folder</h3>";
2752             text +='<table class="table table-striped" style = "padding:20px;">';
2753             text += "<thead>";   
2754            
2755             text += tableHead("Talk Title");
2756             text += "</thead>";
2757             text += "<tbody>";          
2758             for (i = sortedArrayLength-1; i >= 0; i--) { 
2759                     item=sortedArray[i];
2760                     text += '<tr>' 
2761                     text+= '<td align="left"> ' + 
2762                     item.data.ratio.toFixed(0) +
2763                     '% </td>';
2764                    
2765                     votes = '';
2766                     if (getUpVotes(item) >0){
2767                        votes += getUpVotes(item) + '👍 ';
2768                     }
2769                     if (getDownVotes(item) >0){
2770                        votes+= '<br>' + getDownVotes(item) + '👎 ';
2771                     }
2772                     text+= TD(' ' + votes + ' ');
2773                     
2774                     text+=TD(' ' + generateLink(item));
2775                     
2776                 
2777                     text +='</tr>'  
2778                     }
2779           
2780               text += "</tbody>"; 
2781              text +='</table>'     
2782               //text += '</div>';   //TABLE-RESPONSIVE
2783   
2784   
2785              return text;
2786              }
2787        
2788   
2789       
  

generateLeaders

2790    
2791        function generateLeaders(rootNode){
2792         if ((getClass(rootNode) === 'Video')){
2793                return "";
2794            }
2795       
2796            
2797            // FOR THE LIST OF CHANNELS DO NOT SHOW THE BEST VIDEOS
2798            if (getKey(rootNode) == 'conferences-and-channels'){
2799                   return generateContent(rootNode);
2800            }
2801             
2802             if (getKey(rootNode) == 'devops'){
2803                   return generateContent(rootNode);
2804            }
2805       
2806          if (getKey(rootNode) == 'data-science-software'){
2807                   return generateContent(rootNode);
2808            }
2809       
2810            
2811            var result ="";
2812            var text2 =  generateLeadersCore(rootNode) 
2813            result +=  "<center>" +  text2 + "</center> <br>";
2814         
2815            return result;
2816        }
2817        
2818        
2819                 //FIRST GENERATES A SORTED LIST OF ITEMS IN THIS BRANCH OF THE TREE
2820           //AND THEN PRINTS OUT THE SORTED HISTORY 
2821       function generateLeadersCore(rootNode){
2822             var text='';
2823             var i;
2824             var subTitle = " Best Videos Overall ";
2825             var sortedArray = generateTop10(rootNode);
2826          
2827             var sortedArrayLength = sortedArray.length;
2828             if (sortedArrayLength === 0 ){
2829                 return "";
2830                 }
2831            
2832           text +='<table class="table table-striped" style = "padding:20px;">';
2833                   
2834             text += "<tr>" +
2835                   TD (' <a href = "https://www.evanmiller.org/how-not-to-sort-by-average-rating.html">Score</a>')+
2836   
2837                     TD (' Votes ') 
2838                     if (getKey(rootNode) != rootName){
2839                         subTitle = ' Best Videos on ' + getTitle(rootNode);
2840                     }
2841                     
2842               text+=  TD( sortedArrayLength.toString() + subTitle ) +
2843                 
2844                     
2845                     "</tr>";
2846             for (i = sortedArrayLength-1; i >= 0; i--) { 
2847                     item=sortedArray[i];
2848                     text += '<tr>' 
2849                     text+= '<td align="left"> ' + 
2850                     item.data.ratio.toFixed(0) +
2851                     '% </td>';
2852                    
2853                     votes = '';
2854                     if (getUpVotes(item) >0){
2855                        votes += getUpVotes(item) + '👍 ';
2856                     }
2857                     if (getDownVotes(item) >0){
2858                        votes+= '<br>' + getDownVotes(item) + '👎 ';
2859                     }
2860                     text+= TD(' ' + votes + ' ');
2861                     
2862                     text+=TD(' ' + generateLink(item));
2863                     
2864                 
2865                     text +='</tr>'  
2866                     }
2867            
2868              text +='</table>'     
2869            
2870   
2871              return text;
2872              }
2873        
2874   
2875       
  

generateTop10Array

2876    
2877       function generateTop10(rootNode){
2878           if ( (getClass(rootNode) == 'Category') 
2879           &&
2880               (! hasChildren(rootNode))
2881           ){
2882               return "";
2883           }
2884           if (rootNode.data.hasOwnProperty('best')){
2885                 return rootNode.data.best;
2886             }
2887            var item;
2888             var i;
2889             var rootNodeChildren=rootNode.children;
2890            
2891             //IF IT IS A CONFERENCE, Just show the 
2892             //Conference Videos
2893             if (getClass(rootNode)=='Conference'){
2894                  var allVideos = [];
2895                 getConferenceVideos(getKey(rootNode),root,allVideos);
2896               rootNodeChildren =  allVideos;
2897             }
2898             sortedTree=buckets.BSTree(compare);
2899             for (k=0;k<rootNodeChildren.length;k++){
2900                 var aChild = rootNodeChildren[k];
2901                 sortNodes(aChild);
2902             }
2903                 
2904             var sortedArray=sortedTree.toArray();
2905             
2906             //FOR CONFERENCES SHOW ALL THE TALKS, SORTED.
2907             if (getClass (rootNode)== 'Conference'){
2908                 return sortedArray;
2909             }
2910             
2911             //OTHERWISE RETURN THE FIRST 10 ITEMS
2912             var sortedArrayLength=sortedArray.length;
2913             var lowerBound=sortedArrayLength-10;
2914             if (lowerBound<0) lowerBound=0;
2915         
2916             
2917             var shortArray = sortedArray.slice(lowerBound);
2918             rootNode.data.best = shortArray;  
2919             return shortArray;
2920        }
2921    
2922        
2923     
2924      
  

getConferenceVideos

2925    function getConferenceVideos(conferenceName,aNode,allVideos){
2926            var i;
2927            var thisNode;
2928            var children;
2929             if ((getClass(aNode) =="Video")&&
2930                (getConferenceKey(aNode)==conferenceName)){
2931                allVideos.push(aNode);
2932            }
2933            //COULD RETURN IF IT IS A VIDEO.
2934            
2935            if (! hasChildren(aNode)){
2936                return;
2937            }
2938            children=aNode.children;
2939             
2940             if (children && children.length){
2941                for (i in children){
2942                   thisNode=children[i];
2943                   getConferenceVideos(conferenceName,thisNode,allVideos);
2944                }
2945             }
2946        }
  

historyScripts

2947   function generateLink(item){
2948       return "<a onClick=\"displaySlideNamed('" + 
2949       getKey(item) + 
2950       "')\">"+ 
2951       getTitle(item)+"</a>";
2952   }
2953   
2954   function openWindow (key){
2955       window.open("/" + key);
2956   }
2957   
2958      //TO GENERATE HISTORY HAVE TO SORT ITEMS BY EDIT DATE
2959   //THIS COMPARE FUNCTION DOES THAT
2960   function compareLOG(a,b){
2961   
2962       var result = compare2(a,b);
2963       var aRatio = a.data.ratio; 
2964       var bRatio = b.data.ratio;
2965       return result;
2966   }
2967   function compare(a, b) {
2968     var aRatio = a.data.ratio; 
2969     var bRatio = b.data.ratio;
2970       
2971    if (aRatio < bRatio) {
2972       return -1;
2973    } if (aRatio > bRatio) {
2974       return 1;
2975    }
2976     //SAME Ratio, CHECK Totals
2977    if (Number(getUpVotes(a)) < Number(getUpVotes(b))) {
2978       return -1;
2979    } if (Number(getUpVotes(a)) > Number(getUpVotes(b))) {
2980       return 1;
2981    }
2982    
2983    //SAME Ratio, same upVotes, CHECK URLS
2984    if (getKey(a) < getKey(b)) {
2985       return 1;
2986    } if (getKey(a) > getKey(b)) {
2987       return -1;
2988    }
2989    
2990    // a must be equal to b
2991    
2992    return 0; 
2993   }
2994   
2995   var sortedTree;
2996   
2997   function TD(text){
2998       return '<td>' + text + '</td>';
2999   }
3000   
3001   
3002   //THIS FUNCTION ACTUALLY CREATES A BINARY TREE OF NODES SORTED BY EDIT DATE
3003   //USED TO GENERATE HISTORY
3004   function sortNodes(aNode){
3005        
3006            //IF IT IS A VIDEO
3007            if (getClass(aNode) =="Video" ){
3008                aNode.data.ratio = score(aNode);
3009                sortedTree.add(aNode);
3010                return;
3011            }
3012            //NOT A VIDEO?  CARRY ON
3013           var i;
3014            //SETS THE RATIO
3015            var children=aNode.children;
3016             
3017             if (children && children.length){
3018                for (i in children){
3019                   var thisNode=children[i];
3020                   sortNodes(thisNode);
3021                }
3022             }
3023                 
3024        }
  

score

3025   //THIS IS THE WILSON SCORE
3026    function  aScore (positiveScore, total) {
3027   
3028       if (total === 0) {
3029           return {
3030               left: 0,
3031               right: 0
3032           };
3033       }
3034   
3035       // phat is the proportion of successes
3036       // in a Bernoulli trial process
3037       const phat = positiveScore / total;
3038   
3039       // z is 1-alpha/2 percentile of a standard
3040       // normal distribution for error alpha=5%
3041       const z = 1.96;
3042   
3043       // implement the algorithm
3044       // (http://goo.gl/kgmV3g)
3045       const a = phat + z * z / (2 * total);
3046       const b = z * Math.sqrt((phat * (1 - phat) + z * z / (4 * total)) / total);
3047       const c = 1 + z * z / total;
3048   
3049       return {
3050           left: (a - b) / c,
3051           right: (a + b) / c
3052       };
3053   }
3054   
3055   
3056   function score (aNode){
3057         var upVotes, downVotes, total,wilsonScore;
3058         upVotes=Number(getUpVotes(aNode));
3059         downVotes= Number(getDownVotes(aNode));
3060         totalVotes = upVotes + downVotes;
3061        
3062         wilson =   aScore (upVotes, totalVotes);
3063         return wilson.left* 100;
3064         
3065   }
  

renderChildCategories

3066    function renderChildLink(item){
3067       return "<a onClick=\"slideDownTo('" + 
3068       getKey(item) + 
3069       "')\">"+ 
3070       getTitle(item)+"</a>" +
3071       ' (' + getBranchSize(item) + ')';
3072   }
3073   
3074   function slideDownTo(key){
3075       var nextNode=tree.getNodeByKey(key);
3076       var index = homeNode.children.indexOf(nextNode);
3077       homeNode.previousChildIndex=index;
3078       setSlides(homeNode);
3079       reload();
3080       $.fn.fullpage.moveSectionDown();
3081   
3082   } 
3083   
3084   
3085   function displayChildCategories (slide){
3086       var child;
3087       var  children = slide.children;
3088       if ((! children) || (children.length===0)){
3089           return "";
3090       }
3091       var result = "<h3>Child Categories</h3><br>";
3092       if (getKey(slide) == 'conferences-and-channels'){
3093           result = "<h3>Conferences Indexed</h3><br>";
3094       }
3095       
3096       for (var i in slide.children) {
3097           child = slide.children[i];
3098            if (getClass(child) != "Video"){
3099               result += renderChildLink(child) + "<br><br>";
3100          }
3101           
3102       }
3103       //result += "</div>";
3104       return result;
3105       
3106   }
3107   
3108   
3109   //IF ANY CHILD IS A CONFERENCE OR CATEGORY
3110   //DISPLAY THE LIST
3111   function renderChildCategories(slide){
3112       var child;
3113       if (slide.children === null){
3114           return "";
3115       }
3116           if (slide.children.length === 0){
3117           return "";
3118       }
3119       for (var i in slide.children) {
3120            child = slide.children[i];
3121          if (getClass(child) != "Video"){
3122              return  displayChildCategories(slide);
3123          }
3124       }
3125        return "";  
3126   }
3127   
  

pleaseRegister

3128     function pleaseRegister(){
3129        var key = '/';
3130        key += getKey(homeNode);
3131        key += "/register/user";
3132        window.location = key;
3133    }
3134    
3135     function pleaseLogin(){
3136        var key = '/';
3137        key += getKey(homeNode);
3138        key += "/login/user";
3139        window.location = key;
3140    }
  

renderSlide

3141       var showBest = true;
3142    
3143      function renderConference (slide){
3144           try {    
3145               var conference = getConference(slide);
3146               result = '<h5 class="text-primary" style = "margin-left:50%">-'+ 
3147               '<a onClick="displaySlideNamed(' + "'" + getConferenceKey(slide) + "')" +'">'+ 
3148               getTitle(conference) +'</a></h5>';
3149               return result;
3150           }
3151           catch(err){
3152               return "";
3153           }
3154       }
3155   
3156   function generateLeadersOrContent(slide){
3157        return '<div  id = "bestContent' + 
3158        '-' + getKey(slide) + '" >'+
3159             generateLeadersOrContentCore(slide) +
3160         "</div>";
3161   }
3162    var isMobile = true;
3163    function renderSlide(slide,index){ 
3164            var result = "" 
3165             
3166             result += template(
3167                 {'showSearch':showSearch,
3168                  'node':slide,
3169                  'upVote':upVote,
3170                  'getKey':getKey,
3171                  'downVote': downVote,
3172                  'getClass': getClass,
3173                  'renderServerOptions': renderServerOptions,
3174                  'isAuthenticated': isAuthenticated, 
3175                  'twitterLinkFront': twitterLinkFront,
3176                  'twitterLinkBack': twitterLinkBack, 
3177                  'twitterId': twitterId
3178             });
3179     
3180           result += addArrows(slide);
3181   
3182          
3183           result +=  breadcrumbs(slide) 
3184           result +='<div style = "margin: 20px">';
3185           
3186           result += renderTitle(slide) 
3187           
3188           //getSubTitle(slide) 
3189       
3190          if ((getClass(slide) == 'Video')){
3191               result += renderConference(slide)
3192           }
3193          
3194           
3195            if (isMobile){
3196              result+= "<center>";
3197            }
3198              result +=renderDescription (slide);
3199           if (isMobile){
3200   
3201               result+= "</center>";
3202           }
3203           result += renderContentDiv(slide) 
3204        
3205        
3206       result += socialMediaLinks(slide);
3207       result += renderExtra();  
3208       result += '</div>';
3209       return result; 
3210       }
  

rootname

3211    var rootName='';  
3212    var mobileJson ='';
3213    var deskTopJson ='';
3214    var domain= window.location.hostname.toLowerCase();
3215    var contactURL = "/contact";
3216    var twitterId ="PythonLinks";
3217     rootName = info.parents[0];
3218    mobileJson = "https://" + window.domain +"/" + rootName + "/json"; 
3219   
3220   
3221   if (domain=='desktop.pythonlinks.info'){
3222       deskTopJson= 'https://json.PythonLinks.info/python/tree.json';
3223   }
3224   else if (domain=='climateactivists.info'){
3225       twitterId ="PollDrivers";
3226   }
3227   
3228   else if (domain=='berniesupporters.org'){
3229      twitterId ="PollDrivers";
3230   }
3231   
3232   else if (domain=='ents.climateactivists.info'){
3233        twitterId ="PollDrivers";
3234   }
3235   
3236   else if (domain=='stopsmog.info'){
3237    twitterId ="PollDrivers";
3238   }
3239   
3240   else if (domain=='rights.men'){
3241       twitterId ="men_are_human";
3242   }
3243   else if (domain=='mensgroups.info'){
3244       twitterId ="men_are_human";
3245   }
3246   
3247   else if (domain=='dev.pythonlinks.info'){
3248       deskTopJson='/python/tree.json';
3249    }
3250    
3251   
  

callbackVisit

3252     
3253    /** Call fn(node) for all child nodes.<br>
3254     * Stop iteration, if fn() returns false. Skip current branch, if fn() returns "skip".<br>
3255     * Return false if iteration was stopped.
3256     *
3257     * @param {function} fn the callback function.
3258     *     Return false to stop iteration, return "skip" to skip this node and
3259     *     its children only.
3260     * @param {boolean} [includeSelf=false]
3261     * @returns {boolean}
3262     */
3263     
3264   
3265     function callbackVisit(item,fn, includeSelf) {
3266    var i, 
3267        l,
3268    res = true,
3269    children = item.children;
3270    if( includeSelf === true ) {
3271    res = fn(item);
3272    if( res === false || res === "skip" ){
3273    return res;
3274    }
3275    }
3276    if(children&&(children.length>0)){
3277        callbackCount++;
3278    
3279        aFunction = function(){
3280        for(i=0, l=children.length; i<l; i++){
3281         callbackVisit(children[i],fn, true);
3282        }
3283        callbackCount--;
3284        if (callbackCount===0){
3285                   reSearch(fn);
3286                   }
3287        };   
3288        setTimeout(aFunction, 1);
3289    }
3290   
3291   
3292    
3293     }
3294   
3295   
3296     
3297            
3298            
3299    function callVisit(item,fn) {
3300    return callbackVisit(item.rootNode,fn, false);
3301    }
  

childrenFunctions

3302   
3303   function getSiblings (item){
3304       if (isRoot(item)){
3305           return [item];
3306       }
3307       return item.parent.children;
3308   }
3309       
  

parent-functions

3310    function pageTitle(node){
3311       var nodeParents= parents(node);
3312       var arrayLength = nodeParents.length;
3313       var result =[];
3314       for (var i = 0; i < arrayLength; i++) {
3315          result.push (getTitle(nodeParents[i]));
3316       }
3317        return result.join(' -> ');
3318       
3319   }
3320   
3321   //Starting with parent
3322   function reversedParents(node){
3323          var result=[];
3324        while (true){
3325            result.push(node);
3326            if (isRoot(node)){
3327                return result;
3328            }
3329            node=node.parent;
3330        }
3331   }
3332   
3333   //Starting with first ancenstor
3334   function parents(node){
3335       return reversedParents(node).reverse();
3336   }
  

pushpopstate

3337   function addSortBy(){
3338       if (sortBy == 'bestWilsonScore'){
3339           return "";
3340       }
3341       return '?sortBy=' + sortBy;
3342   }
3343   function saveCurrentURL(){
3344      
3345       var domain= window.location.hostname;
3346       var location=getKey(homeNode);
3347   
3348       var url="https://" + domain + "/" + location + addSortBy();
3349       
3350   
3351       var title=getTitle(homeNode);
3352       var data={key:getKey(homeNode)};
3353    
3354    
3355   history.pushState(data, title, url);
3356       
3357   }
3358   
3359   function saveCurrentURLAndSearch(){
3360      
3361       var domain= window.location.hostname;
3362       var location=homeNode.key;
3363       var search=window.location.search;
3364   
3365       var url="https://" + domain + "/" + location;
3366       if (search){
3367           url+= search;
3368       }
3369       var title=homeNode.title;
3370       var data={key:homeNode.key};
3371    
3372    
3373   history.pushState(data, title, url);
3374       
3375   }
  

regexp

3376     
3377   
3378   //FUNCTION TO SPLIT A SEARCH STRING INTO W LIST OF WORDS, 
3379   // AND THEN CREATRE A LIST OF REGEXP
3380   // FROM IT.  This is needed to implement "SearchTermm1" and "SearchTerm2"
3381   
3382   
3383    function _escapeRegex(str){
3384    /*jshint regexdash:true */
3385    return (str + "").replace(/([.?*+\^\$\[\]\\(){}|-])/g, "\\$1");
3386   }
3387   
3388   
3389   //FUNCTION TO SPLIT A SEARCH STRING INTO W LIST OF WORDS, 
3390   // AND THEN CREATRE A LIST OF REGEXP
3391   // FROM IT.  This is needed to implement "SearchTermm1" and "SearchTerm2"
3392   
3393   function getRegxpArray(match) {
3394                   if (match=="all"){
3395                       return [new RegExp(".")];
3396                   }
3397                   if (match=="All"){
3398                       return [new RegExp(".")];
3399                   }
3400            var regexpArray=[]; 
3401            var i;
3402            var input;
3403            var k=0;
3404            var subStrings=match.split(/\s+/i);
3405            for (i in subStrings){
3406                if (subStrings[i]!==""){
3407                   input= _escapeRegex(subStrings[i]);
3408                   regexpArray[k]=new RegExp(input, "i");
3409                   k++;
3410                }
3411            }
3412            return regexpArray;
3413    }
3414   
  

resizeText

3415    function resizeText(multiplier) {
3416     if (document.body.style.fontSize === "") {
3417       document.body.style.fontSize = "2.0em";
3418     }
3419     document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + "em";
3420     localRebuild();
3421        
3422    }
3423   
  

scaleVideos

3424   function resizeVideos( arg1, arg2, containerQuery){
3425     //should be "body"
3426   // Find all YouTube videos
3427   var $allVideos = $("iframe[src^='https://www.youtube.com']"),
3428   
3429       // The element that is fluid width
3430       $fluidEl = $(containerQuery);
3431   
3432   // Figure out and save aspect ratio for each video
3433   $allVideos.each(function() {
3434   
3435     $(this)
3436       .data('aspectRatio', this.height / this.width)
3437       .data('width', this.width)
3438   
3439       // and remove the hard coded width/height
3440       .removeAttr('height')
3441       .removeAttr('width');
3442   
3443   });
3444   
3445   function resize () {
3446   
3447     var newWidth = $fluidEl.width();
3448     if (newWidth > 800){
3449         newWidth = 0.8 * newWidth;
3450     } 
3451     // Resize all videos according to their own aspect ratio
3452     $allVideos.each(function() {
3453   
3454       var $el = $(this);
3455       $el
3456         .width(newWidth)
3457         .height(newWidth * $el.data('aspectRatio'));
3458   
3459     });
3460     localRebuild();
3461    
3462   // Kick off one resize to fix all videos on page load
3463   }
3464   resize();
3465   }
  

setChildINdex

3466    //onSLideLeave
3467   function setChildIndex(){
3468           if (homeNode.parent!== null)
3469              homeNode.parent.previousChildIndex = getSiblings(homeNode).indexOf(homeNode);
3470   }
  

setTitle

3471    function setTitle(node){
3472        if (node.data.class == 'Video'){
3473            node.title =  score(node).toFixed(0) + '% ' 
3474            + node.data.upVotes + '👍 ' + 
3475            node.data.downVotes + '👎 '+
3476            node.title;
3477        }
3478        return true;
3479    }
  

showRedirect

3480    function showRedirect(node){
3481        if ((isMobile && (node==landingPage))) {
3482              var url = "https://" +
3483              "desktop." + domain + '/' + getKey(node);
3484              return '<center> <a href="' + url +
3485              '">Desktop Site (Beta)</a></center>';
3486        }
3487           return "";
3488    }
  

signout

3489    function renderSignOutOption(){
3490       if (isAuthenticated){
3491              return lili( '<a class="text-primary" onclick="signOut()">Sign Out</a>');
3492       }
3493       else 
3494       {return "";}
3495   }
3496   
3497   function signOut(){
3498       window.location.href = "/" + getKey(homeNode) + "/logout2";
3499   }
  

vote

3500   function registerVoter(){
3501        window.location.href="/" + homeNode.key + "/signup";
3502   }
3503   //"/register/voter"
3504   
3505   
3506   function recordVotes(responseText,itemName){
3507       var result = responseText.split (" , ");
3508        document.getElementById(itemName + "-" + "upVotes").innerHTML = result [0]; 
3509         document.getElementById(itemName + "-" + "downVotes").innerHTML = result [1];
3510   }
3511   
3512   function upVote(){
3513       var itemName = getKey(homeNode);
3514   
3515       if (isAuthenticated){
3516          var xhttp = new XMLHttpRequest();
3517          xhttp.onreadystatechange = function() {
3518              if (this.readyState == 4 && this.status == 200) {
3519                  recordVotes(this.responseText,itemName);
3520              }
3521          };
3522          var url = "/" + homeNode.key + "/upVote";
3523          xhttp.open("GET", url, true);
3524          xhttp.send();
3525          return;
3526          }
3527       registerVoter();
3528   }
3529   
3530   function downVote(){
3531         var itemName = getKey(homeNode);
3532   
3533       if (isAuthenticated){
3534           var xhttp = new XMLHttpRequest();
3535           xhttp.onreadystatechange = function() {
3536              if (this.readyState == 4 && this.status == 200) {
3537                 recordVotes(this.responseText,itemName);
3538              }
3539           };
3540           var url = "/" + homeNode.key + "/downVote";
3541           xhttp.open("GET", url, true);
3542           xhttp.send();
3543           return;
3544        }
3545            registerVoter();
3546   
3547   }
3548   
3549   
3550   
3551   
  

twitterImage

3552      var showBest = true;
3553    
3554    function renderTwitterImage(){
3555         return '' + 
3556         '<img src="https://pythonlinks.info//static/graphics/Tweet.png" '+ 
3557         'alt="I wanted to add users tweets to my website, but Twitter'+
3558         'would then track every page that you visit.  Not good for privacy. ' +
3559         'So if you are kind enough to tweet comments, I will link to them."'+
3560          'style = "max-width:100%;" onload="localRebuild">' +
3561           '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Privacy Protecting Tweet Image';
3562   
3563        
3564    }
3565            
3566   function showIntroductoryVideo(slide){         
3567           if ((slide == landingPage)&&isMobile&& (rootName == 'python')) 
3568                {    
3569           return '<h3 style = "text-align:center;">'+
3570           '<a onClick="displaySlideNamed('+
3571           "'introductory-video')"+ '">' + 
3572           'Introductory Video</a></h3>'+
3573           '<p style="text-align:center">' + news + "</p>"; 
3574           }
3575           else {
3576          return '';
3577           }
3578   } 
3579   
3580   function generateLeadersOrContent(slide){
3581        return '<div  id = "bestContent' + 
3582        '-' + getKey(slide) + '" >'+
3583             generateLeadersOrContentCore(slide) +
3584         "</div>";
3585   }
  

twitterlink

3586   function twitterLinkFront(){
3587       var result ="";
3588       var base = 'https://twitter.com/intent/follow?screen_name=';
3589       result +=  '<a href="' + base +
3590       twitterId +
3591       '">' 
3592       return result;
3593   }
3594   function twitterLinkBack(){
3595       return  '</a>';
3596   }
3597