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   
35   
36   
37     function getConferenceName(node){
38         if (getClass(node)== 'Conference'){
39             return node.title;
40         }
41         return node.conference.title;
42     }
43     
44   function isRoot(node){
45       if (! ('parent' in node) ||
46          (node.parent === null)){
47           return true;
48       }
49       return false;
50   }
51   
52   
53   
54        
55     function getTitle(item){
56         return item.title;
57     }
58     
59     function getBranchSize(item){
60         return item.branchSize;
61     }
62     
63     
64      function getDescription(item){
65         return item.description;
66     }
67        function getUpVotes(item){
68         return item.upVotes;
69     }
70        function getDownVotes(item){
71         return item.downVotes;
72     }
73     
74     function getClass(slide){
75         return slide.class;
76     }
77     
78     
79    
80    function addChildArray (item,index){
81        item.children = [];
82    }
83    
84    function getKey(item,array){
85        return item.id;
86    }
87     function getClass(item,array){
88        return item.class;
89    }
90    
  

Move Commands For Destkopt

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

addDescription

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

addList

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

camera

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

childFunctions

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

first

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

hasChildren

268    function hasChildren(node){
269        if (node.children.length > 0){
270            return true;
271        }
272        return false;
273        
274    }
  

hover

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

initialize

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

loadContent

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

moveTo

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

positions

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

renderSearchButton

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

showsearch

729     function showSearch(){}
  

traverse

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

ChildFunctions

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

SlideUpOrDown

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

createSlides

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

renderSlides

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

renderVerticalSlide

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

clickNode

874     function clickNode(webPageName){
875        var key = webPageName.key;
876         homeNode=tree.getNodeByKey(key);
877        popSlides(homeNode);
878    }
879    
880     window.addEventListener('popstate', function(event) {
881   clickNode(event.state);
882     
883   });
  

get

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

getHorizontalAndVerticalSlides

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

getPage

1043    function getPage(){
1044        handle = '';
1045        var result = $('#' + homeNode.key + "-page" ).html();
1046        handle = 'lozinski';
1047        return result;
1048    }
  

hasChildren

1049     
1050    function hasChildren(homeNode){
1051      
1052       if (homeNode.hasOwnProperty ('children') &&
1053            (homeNode.children !== null) &&
1054           (homeNode.children.length > 0)){
1055               return true;
1056           }
1057        return false;    
1058    }
1059        
  

initialize

1060   var landingPage = null;
1061   var isLoaded = false;
1062   
1063   var  parameters =    {
1064          extensions: ["filter"],
1065    quicksearch: true,
1066   
1067    filter: {
1068    autoApply: true,  // Re-apply last filter if lazy data is loaded
1069    counter: true,  // Show a badge with number of matching child nodes near parent icons
1070    fuzzy: false,  // Match single characters in order, e.g. 'fb' will match 'FooBar'
1071    hideExpandedCounter: true,  // Hide counter badge, when parent is expanded
1072    highlight: true,  // Highlight matches by wrapping inside &lt;mark&gt; tags
1073    mode: "hide",  // Grayout unmatched nodes (pass "hide" to remove unmatched node instead)
1074    autoExpand: true,
1075    leavesOnly:false
1076    },
1077   
1078   
1079    treeInit: function(ctx){
1080                this._superApply(ctx);
1081            },
1082    
1083          init:  function(arg1,arg2) {
1084                tree=  arg2.tree;
1085     homeNode=arg2.tree.getNodeByKey(webPageName);
1086     tree.homeNode=homeNode;
1087     landingPage = homeNode;
1088     root=arg2.tree.getRootNode().children[0];
1089     saveCurrentURLAndSearch();
1090         displaySlide(homeNode);
1091         isLoaded = true;
1092          },
1093     
1094           source: $.ajax({
1095               url: mobileJson,
1096               dataType: "json"
1097            }),
1098            
1099            
1100             click: function(event, data) {
1101                  var aNode = data.node;
1102                   searchClick(aNode);
1103            return false;
1104            
1105            },
1106    };
1107    
1108   $("#tree").fancytree(parameters);
1109   
  

initializeslides

1110   function pleaseLoadContent (anchorLink, index, slideAnchor, slideIndex){
1111       loadContent ();
1112   }
1113   function smallLoadContent (anchorLink, index, slideAnchor, slideIndex){
1114       loadContent ();
1115   }
1116   
1117   function reloadSection(anchorLink, index){
1118       if (mayLoad){
1119           mayLoad = false;
1120           reload();
1121       }
1122   }
1123   
1124   function reloadSlide(anchorLink, index, slideAnchor, slideIndex){
1125       if (mayLoad){
1126           mayLoad = false;
1127           reload();
1128       }
1129   }
1130   
1131   var fullPageArguments=     {
1132      verticalCentered: false,
1133      //CHROME
1134    scrollOverflow:true,
1135    scrollBar: false,
1136    loopHorizontal: false,
1137    touchSensitivity: 10,
1138           afterResize: resizeVideos, 
1139    css3:false, //JQUERY UI required by Fancytree breaks it
1140         afterRender:pleaseLoadContent,
1141     afterLoad: reloadSection, 
1142     afterSlideLoad: reloadSlide,
1143     onLeave:  leaveSection,
1144       onSlideLeave:  leaveSlide
1145   
1146    };
  

leave

1147   
1148   var mayLoad=false;
1149   
1150    //OLD VERSIONS
1151   function leaveSection (index,nextIndex,direction){
1152           if (! allowScrolling){
1153           return false;
1154       }
1155       mayLoad= true;
1156       homeNode = verticalSlides [nextIndex-1];
1157       saveCurrentURL();
1158       return true;
1159   }
1160   
1161   
1162   function leaveSlide(anchorLink, index, slideIndex, direction, nextSlideIndex){
1163       if (! allowScrolling){
1164           return false;
1165       }
1166       mayLoad= true;
1167       homeNode = horizontalSlides [nextSlideIndex];
1168        saveCurrentURL();
1169   
1170       return true;
1171   
1172   }
1173   
1174   
1175   
1176   function popSlides(aNode){
1177        setSlides(aNode);
1178        reload();
1179   }
1180   
1181   function displaySlideNamed(key){
1182       displaySlide(tree.getNodeByKey(key));
1183       saveCurrentURL();
1184   } 
1185   
1186   function displaySlide(aNode){
1187       homeNode = aNode;
1188        setSlides(aNode);
1189        reload();
1190   }
  

moveMoveCommands

1191   function buildFullPage(){
1192             $('#fullpage').fullpage(fullPageArguments);
1193   }
1194   
1195   function moveDown(){
1196       setDownSlides();
1197       restartFullPage();
1198       reloadCore();
1199       $.fn.fullpage.moveSectionDown();
1200   }
1201   
1202    function moveUp(){
1203        setUpSlides();
1204      restartFullPage();
1205       reloadCore();
1206       $.fn.fullpage.moveSectionUp();
1207        
1208   
1209    }
1210   
1211   
1212   
1213   function moveToLast(numberOfSiblings){
1214        return;
1215   }
1216   
1217   function moveToFirst(){
1218   return 
1219       
1220   }
1221   
1222   function moveRight(){
1223       setRightSlides();
1224      restartFullPage();
1225       reloadCore();
1226       $.fn.fullpage.moveSlideRight();
1227   
1228   }
1229   
1230   function moveLeft(){
1231        setLeftSlides();
1232      restartFullPage();
1233       reloadCore();
1234       $.fn.fullpage.moveSlideLeft();
1235        
1236   }
  

moveToMobile

1237   function MoveTo(){
1238       
1239   }
  

pinchToZoom

1240   var allowScrolling = true;
1241   /*
1242   $(document).ready(function() { 
1243   
1244       var scale = 1.0; // initial-scale
1245       var r = 0.10;
1246       var oldScale = scale;
1247   
1248       $(document).bind('gesturechange',function(event){
1249           allowScrolling = false;
1250           $.fn.fullpage.destroy();
1251            var height = viewport.height;
1252            var halfHeight = height / 2.0;
1253            var  offsetTop = vewport.offsetTop;
1254             var oldHeight = halfHeight + offsetTop;
1255           
1256           var newScale = event.originalEvent.scale;
1257           if(newScale  > 1) scale = scale <2 ?  newScale : 2 
1258           else scale = scale > 0.5 ? newScale : 0.5 
1259   
1260         
1261            var ratio = newScale /oldScale; 
1262            var newHeight = (oldHeight * ratio) -height;
1263            viewport.offsetTop = newHeight;       
1264           $('meta[name=viewport]').attr('content', 'width=device-width, minimum-scale='+ scale.toFixed(2) +', maximum-scale='+ scale.toFixed(2) +', user-scalable=yes'); // 
1265           setTimeout(pleaseAllowScrolling,300);
1266                $.fn.fullpage.reBuild();
1267                
1268           oldScale = newScale;
1269   
1270       });
1271   });
1272   
1273   function pleaseAllowScrolling(){
1274        allowScrolling = true;
1275   }
1276   */
  

reload

1277   var fullPage = false;
1278   var newSlides;
1279   function reload(){
1280      
1281       setChildIndex();
1282        //setSlides(homeNode);
1283        setAndReload();
1284   }     
1285   
1286   function loadOneSlide(){
1287       
1288       verticalSlides=[homeNode];
1289       horizontalSlides=[homeNode];
1290       setAndReload();
1291   }
1292   
1293   function setAndReload(){ 
1294          setSingleSlide();
1295          reloadCore();
1296           destroyFullPage();
1297          }
1298          
1299   function reloadCore(){       
1300          replaceFullPage();
1301          destroyFullPage();
1302          restartFullPage();
1303   }        
1304   
1305   
1306       
1307   function replaceFullPage(){   
1308            document.title=pageTitle(homeNode);
1309        $('#fullpage div').addClass("old");
1310        newSlides = renderVerticalSlides(homeNode);
1311        $(".old").remove();
1312        $('#fullpage').append(newSlides);
1313   }
1314   
1315   function destroyFullPage(){
1316         if (fullPage){
1317          $.fn.fullpage.destroy('all');   
1318        }
1319   }     
1320   
1321   function restartFullPage(){
1322        fullPage = true;
1323        $('#fullpage').fullpage(fullPageArguments);
1324   }
1325   
  

MyFilter

1326    //THS FUNCTION IS A HOOK SO THAT EVERYONE CAN GENERATE THE APPROAPRIATE
1327   //STRING TO SEARCH IN THEIR APPLICATION
1328   function getStringToSearch(node){
1329            var searchString = node.data.title+' '+node.data.description + '';
1330            if (node.data.class == 'Video'){
1331               searchString += tree.getNodeByKey(node.data.conference).title; 
1332            }
1333            return searchString;
1334       }
1335       
1336       
1337   // THIS IS THE FUNCTION WHICH RETURNS TRUE IF ALL THE WORDS ARE FOUND IN THE STRING
1338   //FALSE OTHERWISE
1339   function MyFilter(node,regexpArray){ 
1340       
1341      
1342       var j;
1343       var stringToSearch=getStringToSearch(node);
1344       var result=true;
1345       for (j in regexpArray){
1346            if (!(regexpArray[j].test(stringToSearch))){
1347                result=false;
1348            }
1349       }
1350    
1351       return result;
1352   }
1353   
1354   function formattedTitle(node,coreTitle){
1355     return  "&bull; <a title=\""+node.data.description  +  "\"><b>"+ coreTitle +"</b></a>";
1356       
1357   }  
1358   
1359   
  

applyFilter

1360    //SETS A SHORT TITLE, NO DESCRIPTION, FOR BREADCRUMB NODES
1361   function setShortTitle(node){
1362                            node.title=node.data.title;
1363                            //"<a><b>"+node.data.title +"</b></a>"+
1364                     //" ("+getBranchSize(node)+")";
1365           }
1366           
1367    
1368   $.ui.fancytree._FancytreeClass.prototype._applyFilterImpl = function(filter, branchMode, opts){
1369   
1370       //FIRST DEFINE AND SET SOME VARIABLES   
1371    var leavesOnly,
1372        match, 
1373        re, 
1374        searchString=filter,
1375    filterOpts = this.options.filter,
1376    hideMode = filterOpts.mode === "hide",
1377    regexpArray=getRegxpArray(filter);
1378    re2 = new RegExp(filter, "gi");
1379    tree.enableFilter=true;
1380   
1381   
1382    //SET SOME MORE VARIABLES
1383       count=0;
1384    opts = opts || {};
1385    lavesOnly = !!opts.leavesOnly && !branchMode;
1386   
1387    //NOW CREATE THE FUNCTION TO SEARCH A SINGLE NODE
1388    filter = function(node){
1389            var coreTitle;
1390        var res = MyFilter(node,regexpArray);
1391        if (res){
1392             node.title=formattedTitle(node,node.data.title);
1393             setTitle(node);
1394            }
1395   
1396    // DONT DO THIS IF MULTIPLE SEARCH TERMS    (regexpArray.length>1)
1397    if( res && filterOpts.highlight && (regexpArray.length<2)) {
1398         coreTitle=node.data.title.replace(re2, function(s){
1399    return "<mark>" + s + "</mark>";
1400    });
1401    node.titleWithHighlight = formattedTitle(node,coreTitle);
1402   
1403     } else {
1404      delete node.titleWithHighlight;
1405    }
1406   
1407    return res;
1408    };
1409   
1410   
1411    this.enableFilter = true;
1412    this.lastFilterArgs = arguments;
1413   
1414    this.$div.addClass("fancytree-ext-filter");
1415    if( hideMode ){
1416    this.$div.addClass("fancytree-ext-filter-hide");
1417    } else {
1418    this.$div.addClass("fancytree-ext-filter-dimm");
1419    }
1420   
1421    this.visit(function(node){
1422        node.title = node.data.title + node.match;
1423    delete node.match;
1424    delete node.titleWithHighlight;
1425    node.subMatchCount = 0;
1426    });
1427   
1428    // SEACH THE TREE 
1429    //Adjust node.hide, .match, and .subMatchCount properties
1430    
1431      callVisit(this,function(node){
1432        
1433    if (filter(node)) {
1434    count++;
1435    node.match = true;
1436    node.visitParents(function(p){
1437        //MAKE THE UNMATCHED PARENTS LOOK GOOD
1438       if (!(p.match)){
1439               p.match=true;
1440               p.titleWithHighlight="<span style=\"color:#888;\" >"+p.data.title+"</span>";
1441        }
1442        
1443         if ('subMatchCount' in p) {  
1444              p.subMatchCount += 1;
1445              }
1446             else { 
1447                p.subMatchCount=1;
1448             }
1449         
1450    //if( opts.autoExpand && !p.expanded ) {
1451   
1452    p.setExpanded(true, {noAnimation: true, noEvents: true, scrollIntoView: false});
1453    p._filterAutoExpanded = true;
1454   
1455    });
1456   
1457    }
1458   
1459    });
1460   
1461   
1462   };
1463   
1464   
1465   
  

branchSize

1466     var branchSize;
1467    function getBranchSize(node){
1468       if (node.match || node.unmatchedParent){
1469           return node.subMatchCount;
1470       }
1471       else {
1472           branchSize=node.data.branchSize;
1473           branchSize = parseInt(branchSize);
1474           branchSize = branchSize.toString();
1475           return branchSize;
1476           
1477       }
1478   }
1479   
  

collapseChildren

1480    function collapseChildren(node){
1481       var index;
1482       var item;
1483       var children=node.children;
1484       if((node.isFolder())&&node.hasChildren()){
1485           node.setExpanded(false, {noAnimation: true, noEvents: true, scrollIntoView: false});
1486           for (index=0;index<children.length;index++){
1487               item=children[index]
1488               if (item.isExpanded()){
1489                   collapseChildren(item); 
1490               }
1491           }
1492       }
1493   }
  

gui-functions

1494     
1495   
1496   
1497   
1498   var tree = $("#tree").fancytree("getTree");
1499   
1500    /*
1501     * Event handlers for search
1502     */
1503   var match;
1504   
1505   function searchTheTree(match,opts){
1506               oldSearchString=match;
1507               tree.clearFilter();
1508     tree.filterNodes(match, opts);
1509   }
1510   
1511       
1512   function myKeyUp(e){    
1513        if(e && e.which === $.ui.keyCode.ESCAPE ){
1514    $("button#btnResetSearch").click();
1515    return;
1516    }
1517   
1518    var match=$("input[name=search]").val();
1519               myKeyUpCore(match);
1520   }
1521   
1522   $("input[name=search]").keyup(myKeyUp);
1523   
1524   
1525   function myKeyUpCore(match){
1526    var opts={};
1527    var n;
1528       currentSearchString=match;
1529        
1530        
1531       //IF YOU JUST DELETED THE SEARCH STRING
1532       if (currentSearchString.length===0) {
1533          tree.clearFilter(); 
1534          collapseChildren(root);
1535          root.render();
1536          oldSearchString="";
1537          return;
1538       }
1539       
1540       //IF YOU JUST STARTED SEARCHING
1541       if (oldSearchString===""){
1542           oldSearchString=currentSearchString.slice(1);
1543            root.render();
1544            return;
1545           }
1546                
1547               if (callbackCount===0){
1548                   searchTheTree(match,opts);
1549           
1550               }
1551       
1552   
1553   
1554   }      
1555   
1556     function futureSearch(match,opts){
1557                        searchTheTree(match,opts);
1558                     root.render();
1559                    }
1560   
1561   
1562   
1563   
1564     
1565   $("button#btnResetSearch").click(function(e){
1566    $("input[name=search]").val("");
1567    $("span#matches").text("");
1568    tree.clearFilter();
1569    }).attr("disabled", true);
1570   
1571   
1572   
1573   
1574   
1575   
  

search.js

1576         var callbackCount=0;
1577   var count;
1578   var currentSearchString="";
1579   var oldSearchString="";
1580   
1581   function cleanUp(){
1582        var rootNode=$("#tree").fancytree("getTree").getRootNode();
1583           rootNode.render(true);
1584           $("button#btnResetSearch").attr("disabled", false);
1585        $("span#matches").text("(" + count + " matches)");
1586        $.fn.fullpage.reBuild();
1587   
1588   }
1589   
1590   function reSearch(filterFunction){
1591        var value=$("input[name=search]").val();
1592        if (currentSearchString!=value){
1593             $("input[name=search]").trigger("keyup");
1594   
1595           }
1596        else{
1597   
1598               cleanUp();
1599           }
1600   $.fn.fullpage.reBuild();
1601   
1602    }
1603     
1604   
1605    
1606     
  

setScrolling

1607      function setScrolling(){
1608       if (homeNode.data.class == 'Chat'){
1609         $.fn.fullpage.setAutoScrolling(false);
1610         $.fn.fullpage.setFitToSection(false);
1611       }
1612       else{
1613            $.fn.fullpage.setAutoScrolling(true);
1614            $.fn.fullpage.setFitToSection(true);  
1615   
1616       }
1617   }
1618   
  

ViewCount

1619    function getViewCount(aNode){
1620       if (isMobile){
1621           return aNode.data.viewCount;
1622       }
1623       return aNode.viewCount;
1624   }
1625   
1626   function score (aNode){
1627         var upVotes, downVotes, viewCount, ratio;
1628         upVotes=Number(getUpVotes(aNode));
1629         downVotes= Number(getDownVotes(aNode));
1630         viewCount=Number(getViewCount(aNode));
1631         ratio = (upVotes - (5 * downVotes))/viewCount;
1632         ratio = ratio * 10000;
1633         return ratio;
1634   }
  

Arrows

1635   function oneArrow(direction,x,y,visible, onClick){
1636       var result=''+
1637       '<i style="position:relative;' +
1638       'top:' + y + 'em;'+
1639       'left:' + x + 'em;'+
1640       'opacity:';
1641       if (visible){
1642           result +='1.0;';
1643       }
1644       else{
1645           result += '0.4;';
1646       }
1647       if (visible){
1648          result += 'color:green;';
1649       }
1650       else{
1651          result += 'color:red;';
1652       }
1653       result += '" ' 
1654       result += 'class="fa fa-arrow-circle-' + direction +
1655       '"'+
1656       'onClick="' + onClick + '"' + 
1657       '></i>';
1658       return result;
1659   }
1660   
1661   function addArrows(slide){
1662      
1663       if (isMobile){
1664              return arrowsMobile(slide);
1665       }
1666       else{
1667           return arrowsDesktop(slide);
1668       }
1669        
1670      
1671   }
1672   
1673    
1674   function arrowsDesktop(slide){
1675     var result = "" +
1676   '<div  class = "my-desktop-arrows" >' +
1677   arrows(slide)+
1678   '</div>';  
1679   return result;
1680   }
1681   
1682   //THIS IS WHERE THE 3EM FONT SIZE WAS SET
1683   function arrowsMobile(slide){
1684   
1685     var result = "" +
1686   '<div  class = "my-mobile-arrows" >' +
1687   arrows(slide)+
1688   '</div>';  
1689   return result;
1690   }
1691   
1692   function arrows(slide){
1693     
1694       
1695   var result = "" +
1696   
1697   oneArrow('left',1,1,canGoLeft(slide),'goLeft()') +
1698   oneArrow('up',1,0,canGoUp(slide),'goUp()') +
1699   oneArrow('right',1,1,canGoRight(slide),'goRight()') +
1700   oneArrow('down',-1.0,2,canGoDown(slide),'goDown()') 
1701   
1702   return result;
1703   }
  

MaybeSlideTo

1704    function maybeSlideTo(event, childName){
1705      if (isLoaded){
1706       event  = event || window.event;
1707       event.preventDefault();
1708       slideDownTo(childName);
1709       }
1710   }
1711   
1712    function maybeJumpTo(event, childName){
1713        debugger;
1714      if (isLoaded){
1715       event  = event || window.event;
1716       event.preventDefault();
1717       displaySlideNamed(childName);
1718       }
1719   }
1720    
1721   
1722   
  

MyVideoMenu

1723   //This version of Pug.jsdoesnot interpoate attributes, so here is a workaround. 
1724   function myVideoMenu(){
1725   var result = '' +
1726    `<a class="dropdown-item" href="/person/${userId}/">My Videos </a>` +
1727    
1728   ` <a class="dropdown-item" href="/person/${userId}/addUserLightningTalk">Add Lightning Talk  </a>` +
1729   `<a class="dropdown-item" href="/person/${userId}/addUserVideo">Add Conference Video</a>` +
1730   `<a class="dropdown-item" href="/person/${userId}/edit">Edit User   </a>` 
1731   return result;
1732   }
  

MyVideoMenu1

1733     //This version of Pug.jsdoesnot interpoate attributes, so here is a workaround. 
1734   function myVideoMenu(){
1735   var result = '' +
1736    `<a class="dropdown-item" href="/person/${userId}/">My Videos </a>` +
1737    
1738   ` <a class="dropdown-item" href="/person/${userId}/addUserLightningTalk">Add Lightning Talk  </a>` +
1739   `<a class="dropdown-item" href="/person/${userId}/addUserVideo">Add Conference Video</a>` +
1740   `<a class="dropdown-item" href="/person/${userId}/edit">Edit Profile</a>` 
1741   return result;
1742   }
  

arguments

1743    var urlParams = new URLSearchParams(window.location.search);
1744   var sortBy = 'bestWilsonScore';
1745    
1746   if (urlParams.has('sortBy') ){
1747       sortBy = urlParams.get('sortBy');
1748   }
1749   if (!(['bestWilsonScore','bestMyScore','bestMostRecent'].includes(sortBy))){
1750       sortBy='bestWIlsonScore';
1751   }
1752   
  

arrowKeys

1753   function getChildIndex(aNode){
1754        var childIndex= 0  
1755        if ( 'previousChildIndex' in aNode){
1756         childIndex = homeNode.previousChildIndex;
1757         }
1758        return childIndex; 
1759   }
1760   
1761   function canGoUp(node){
1762       return !isRoot(node);
1763   }
1764   
1765   function goUp (){
1766       if (canGoUp(homeNode)){
1767           var offset = homeNode.parent.children.indexOf(homeNode);
1768           homeNode.parent.previousChildIndex = offset;
1769           moveUp();
1770       }
1771   }
1772   
1773   
1774   function canGoDown(node){
1775    return hasChildren(node);   
1776   }
1777   
1778   function goDown (){
1779       if(! canGoDown(homeNode)){
1780           return;
1781       }
1782       var childIndex=getChildIndex(homeNode);
1783       moveDown(childIndex);
1784   }
1785   
1786   function canGoRight(node){
1787       var siblings= getSiblings(node);
1788       var offset = siblings.indexOf(homeNode);
1789       var numberOfSiblings = siblings.length;
1790       return (offset < numberOfSiblings -1 )
1791   }
1792   
1793   function goRight (){
1794      var siblings = getSiblings(homeNode);
1795       var offset = siblings.indexOf(homeNode);
1796       var numberOfSiblings = siblings.length;
1797       if (canGoRight(homeNode)){
1798          homeNode.parent.previousChildIndex = offset + 1;
1799          moveRight(offset);
1800       }
1801       else {
1802           homeNode.parent.previousChildIndex = 0;
1803            moveToFirst();
1804       }
1805   }
1806   
1807   
1808   function canGoLeft(node){
1809         
1810       var siblings= getSiblings(homeNode);
1811       var offset = siblings.indexOf(homeNode);
1812       var numberOfSiblings = siblings.length;
1813       return  (offset > 0);
1814   
1815   }
1816   function goLeft (){
1817     
1818       var siblings= getSiblings(homeNode);
1819       var offset = siblings.indexOf(homeNode);
1820       var numberOfSiblings = siblings.length;
1821   
1822       if (canGoLeft(homeNode)){
1823           homeNode.parent.previousChildIndex = offset -1;
1824           moveLeft(offset);
1825       }
1826       
1827       else{
1828          homeNode.parent.previousChildIndex = numberOfSiblings -1;
1829          moveToLast(numberOfSiblings); 
1830       }
1831       
1832   }
1833   
1834   
1835   
1836      document.onkeydown = function (e) {
1837     if (e.key=="ArrowUp"){
1838         goUp();
1839         
1840     }
1841       else if (e.key=="ArrowDown"){
1842         goDown();
1843     }
1844       else if (e.key=="ArrowLeft"){
1845         goLeft();
1846     }
1847       else if (e.key=="ArrowRight"){
1848           goRight();
1849         
1850     }
1851      else if (e.key=="PageUp"){
1852         goLeft();
1853     }
1854       else if (e.key=="PageDown"){
1855           goRight();
1856         
1857     }
1858   };
  

arrows

1859    function footer(item,index){
1860        var result = "";
1861                        
1862        if (hasChildren(item)){
1863            result += " &uarr; ";
1864        }
1865           if (isRoot(item) !== null){
1866            result += " &darr; ";
1867        }
1868           if (index > 0){
1869            result += " &rarr; ";
1870        }
1871           if (! isRoot(item)){
1872            result += " &larr; ";
1873        }
1874        return result;
1875    }
  

loadContent

1876   function errorF( jqXHR, textStatus, errorThrown ){
1877       console.log ("AJAX ERROR", jqXHR, textStatus, errorThrown );
1878           // $.fn.fullpage.reBuild();
1879   
1880   }
1881   
1882   
1883   //after slide load
1884   function loadContent(){
1885     
1886       if (homeNode === undefined){
1887           return;
1888       }
1889      
1890       var url = "/" + getKey(homeNode) + "/content";
1891       divName = "#" + getKey(homeNode) + "-content";
1892         $.ajax({
1893             type: 'POST',
1894             url: url, 
1895         data: {'sortBy':sortBy},
1896         cache: false, 
1897         error: errorF,
1898         success: function(result){
1899           $(divName).html(result);
1900           resizeVideos(0,0,"body");
1901        localRebuild();
1902       }
1903         });
1904       
1905   }
1906    
1907   
1908      
  

navbar.pug

1909   nav.navbar.navbar-expand-md.navbar-dark.bg-dark
1910     button.navbar-toggler(type='button', data-toggle='collapse', data-target='#navbarsExample04', aria-controls='navbarsExample04', aria-expanded='false', aria-label='Toggle navigation')
1911       span.navbar-toggler-icon 
1912     #navbarsExample04.collapse.navbar-collapse
1913       ul.navbar-nav.mr-auto
1914         li.nav-item.dropdown
1915           a#dropdown04.nav-link.dropdown-toggle(href='https://example.com', data-toggle='dropdown', aria-haspopup='true', aria-expanded='false') Sites
1916           .dropdown-menu(aria-labelledby='dropdown04')
1917             != renderServerOptions(node)        
1918             a.dropdown-item(href='https://PythonLinks.info') Python Videos
1919             a.dropdown-item(href='https://cloud-native.pl') GoLang Videos
1920             a.dropdown-item(href='https://ForestWiki.com') ForestWiki.com
1921             a.dropdown-item(href='https://ClimateVideos.info') Climate Change
1922         if getClass(node)!='Video'       
1923           li.nav-item.dropdown
1924             a#dropdown04.nav-link.dropdown-toggle(href='https://example.com', data-toggle='dropdown', aria-haspopup='true', aria-expanded='false') View
1925             .dropdown-menu(aria-labelledby='dropdown05')
1926               a.dropdown-item(
1927                 href='#'
1928                 onClick='wilsonView()'
1929               ) WIlson Score
1930               a.dropdown-item(
1931                 href='#'
1932                 onClick ='myScoreView()'
1933               ) Votes/View
1934               a.dropdown-item(
1935                 href='#'
1936                 onClick ='mostRecentView()'
1937               ) Most Recent
1938               a.dropdown-item(
1939                 href='./json' 
1940               ) JSON
1941                a.dropdown-item(href='https://PythonLinks.info/wilson-score') Explain
1942         // IF VIDEO
1943         if getClass(node)=='Video'         
1944           li.nav-item.dropdown
1945             a#dropdown04.nav-link.dropdown-toggle(href='https://example.com', data-toggle='dropdown', aria-haspopup='true', aria-expanded='false') Vote
1946             .dropdown-menu(aria-labelledby='dropdown05')
1947               a.dropdown-item(
1948                 href='#'
1949                 onClick = 'upVote()'
1950               ) Up Vote
1951               a.dropdown-item(
1952                 href='#'
1953                 onClick = 'downVote()'
1954               ) Down Vote
1955               a.dropdown-item(href='https://PythonLinks.info/wilson-score') Explain
1956               
1957               
1958         //PER USER
1959         if isAuthenticated         
1960           li.nav-item.dropdown
1961             a#dropdown04.nav-link.dropdown-toggle(href='https://example.com', data-toggle='dropdown', aria-haspopup='true', aria-expanded='false') My Videos
1962             .dropdown-menu(aria-labelledby='dropdown05'
1963             ) !{myVideoMenu()}
1964               
1965         li.nav-item
1966           a.nav-link(
1967           href='/contact'
1968           ) Contact
1969           span.sr-only (Contact)
1970         if  ! isAuthenticated 
1971           li.nav-item
1972              a.nav-link(
1973              href='./signup'
1974              ) Sign Up
1975              span.sr-only (Subscribe)
1976           
1977         if  ! isAuthenticated 
1978            li.nav-item
1979               a.nav-link(
1980               href='./login'
1981               ) Login
1982               span.sr-only (Login) 
1983           
1984         if  isAuthenticated 
1985            li.nav-item
1986               a.nav-link(
1987               href='/logout'
1988               ) Logout
1989               span.sr-only (Logout) 
1990               
1991                       
1992      
1993          
1994            
1995               
1996       if isMobile            
1997         form.form-inline.my-2.my-md-0
1998           input.form-control(
1999             type='text'
2000             placeholder='Search'  
2001             onFocus = 'showSearch()'
2002           )           
2003       ul.navbar-nav.ml-auto
2004         li.nav-item
2005           a.nav-link(
2006             href='https://twitter.com/intent/follow?screen_name=PythonLinks'
2007             target='_blank' 
2008           )   
2009               != twitterLinkFront()
2010               img(
2011                 alt='Follow to receive video recommendations' 
2012                 style = 'height:  1.5em;'
2013                 src='https://pythonlinks.info/static/graphics/twitter-logo.png'
2014               )
2015               != twitterLinkBack()
2016         li.nav-item
2017           a.nav-link(
2018             href='#' 
2019             onclick='resizeText(-1)'  
2020           ) a
2021             span.sr-only (Make the Font Smaller)
2022         li.nav-item
2023           a.nav-link(
2024             href='#'
2025             onclick='resizeText(+1)'
2026           ) A
2027             span.sr-only (Make the Font larger)
2028        
2029           
2030             
2031            
2032   
2033   
  

breadcrumbs

2034    function oneCrumb(item,step,width,showChildren){
2035           result = '<div style = "margin-left:' + (step).toString() + 'em">' +
2036            getTitle(item).link('/' + getKey(item)) 
2037            if (width > 500){
2038                result +=  ' &nbsp;(' + getBranchSize(item) + ')' 
2039            }
2040            result +=  '</div>';
2041           return result;
2042    }
2043    
2044    
2045    function selectChanged(arg){
2046        if (arg.value===''){
2047            return;
2048        }
2049        displaySlideNamed(arg.value);
2050    }
2051    
2052    
2053    
2054   function setSelectedIndex(s, valsearch){
2055     for (i = 0; i< s.options.length; i++){ 
2056       if (s.options[i].value == valsearch){
2057       s.options[i].selected = true;
2058       break;
2059       }
2060     }
2061   }
2062   
2063    
2064    function onSelectFocus(arg,id){
2065         
2066        arg.selectedIndex = 0;
2067   }
2068   
2069    function onSelectBlur(arg, id){  
2070       setSelectedIndex(arg, arg.id.slice(7));
2071    }
2072    
2073    function selectSiblings (node,step,width,showChildren){
2074        var siblings = getSiblings(node);
2075        var id = 'select-' + getKey(node);
2076        if (showChildren){
2077            siblings = node.children;
2078            id = 'select-child-category';
2079        }
2080       
2081         result = '<div style = "margin-left:' + (step).toString() + 'em">' 
2082       result += '<select style="-webkit-appearance: none; -moz-appearance: none;  appearance:none; ';
2083       result +='width:auto; max-width: 50em; padding: 0; height:1.7em" class= "text-primary form-control" id = "' + id  + '"';
2084       result += ' onchange ="selectChanged(this)" ' 
2085       result += " onfocus =\"onSelectFocus(this,'" + id + "')\"";
2086       result += " onblur =\"onSelectBlur  (this,'" + id + "')\"";
2087       result += ' value="" ';
2088       result += ">";
2089       
2090       if (showChildren){
2091           result += '<option selected value="">Select Sub-Category or Video▼</option>';
2092       }
2093        else{
2094           result += '<option  >Jump To:</option>';
2095     
2096        }
2097       
2098      // AND NOW GENERAT OPTIONS
2099      for ( let index in siblings){
2100         
2101          item = siblings [index];
2102       
2103          result += "<option ";   
2104          
2105          if (item == node){
2106              result += " selected ";
2107          }
2108        result +=' value="'; 
2109        result += getKey(item);
2110        result +='">';
2111       
2112        result += getTitle(item);
2113         if (item == node){
2114              result += " ▼";
2115          }
2116        if (width > 500){
2117           result +=  ' &nbsp;(' + getBranchSize(item) + ')' 
2118        }
2119    
2120         result += "</option>";
2121      }
2122     result += "</select>";
2123       result +=  '</div>';
2124   
2125     return result;
2126    }
2127    
2128    function breadcrumbs(node,index){
2129         var width = $( window ).width();
2130        var result="";
2131        var offset;
2132        var items=parents(node);
2133        var length = items.length;
2134        var step;
2135        result+= "<div style = \"text-align:left; \">";
2136       for (step = 0; step < length-1; step++) {
2137           item=items[step];
2138           result += selectSiblings(item,step,width,false);
2139           }
2140        result += selectSiblings(node,length -1,width,false);  
2141        
2142        if (hasChildren(node)){
2143            result += selectSiblings(node,length,width, true); 
2144        }
2145        result += "</div>";
2146        return result;
2147    }
2148    
  

generateTwitter

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

buttonFunctions

2247    
2248   function editProfile(){
2249       window.location.href = "/person/" + userId + "/editPrincipal";
2250   }
2251   
2252   
2253   function editProfile(){
2254       window.location.href = "/person/" + userId + "/editPrincipal";
2255   }
2256   
2257    function changeView(){
2258           showBest = ! showBest;
2259   
2260        var label = "Best View";
2261        if (showBest){
2262            label = "List View";
2263        }
2264      
2265       $("#viewButton").html(label);
2266       var result = generateLeadersOrContentCore(homeNode);
2267       $("#bestContent" + '-' + getKey(homeNode)).html(result);
2268            localRebuild();   
2269   
2270       }
  

renderButtons

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

renderSearchButton

2340    function renderSearchOption(item){
2341     return  lili ('<a  class="text-primary" onclick="showSearch()"> Search</a>') 
2342    }
  

renderthumbs

2343     function getVoteDivName(item,divName){
2344         return  getKey(item) + "-" + divName;
2345     }
2346     
2347      function renderVoteButton(item,thumb,functionName,votes,divName){
2348        if (getClass(item)!="Video"){
2349                  return "";
2350        }
2351            return "<button  onclick=" + functionName +"('" +
2352         getKey(item)+ 
2353          "')  type=\”submit\” class=\”btn btn-primary\”>" + 
2354           "<span style=\"font-size=3em\"" +
2355          "id =\""+ getVoteDivName(item,divName) + "\">" +
2356          votes + "</span>" + thumb + "</button>" 
2357        
2358    }
2359   
2360     function renderThumbs(slide){
2361        if (getClass(slide) != "Video"){
2362                  return "";
2363     }
2364     
2365    
2366           return   renderVoteButton(slide," 👍 ","upVote", getUpVotes(item),"upVotes") +
2367             renderVoteButton(slide," 👎 ","downVote", getDownVotes (item), "downVotes");
2368           
2369   }
2370   
2371            
2372     
2373     
2374    
  

threeMenuButtons

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

whichview

2481     function changeContent(){
2482      
2483        $('#buttons').html(renderButtons(homeNode));
2484         loadContent(homeNode);
2485            saveCurrentURL();
2486    }
2487    
2488    function wilsonView(){
2489        sortBy='bestWilsonScore';
2490        changeContent();
2491    }
2492    
2493    function myScoreView(){
2494        sortBy = 'bestMyScore';
2495            changeContent();
2496    }
2497    
2498    function mostRecentView(){
2499        sortBy =  'bestMostRecent';
2500           changeContent();
2501    }
2502    
2503     function renderViewOption(item){
2504         if (getClass(item) == "Video"){
2505             return "";
2506         }
2507   
2508     var showWilson  = ' <a  class="text-primary" onclick="wilsonView()"> Best Score</a>' 
2509     var showMyScore = ' <a  class="text-primary" onclick="myScoreView()">Score/Views</a>' 
2510     var showRecent  = ' <a  class="text-primary" onclick="recentView()"> Most Recent</a>' 
2511     
2512     var result ='';
2513    
2514     if (sortBy != 'bestWilsonScore'){
2515         result+= lili(showWilson);
2516     }
2517      if (sortBy != 'bestMyScore'){
2518         result+= lili(showMyScore);
2519     }
2520     if (sortBy != 'bestMostRecent'){
2521         result+= lili(showRecent);
2522     }
2523     return result;
2524    }
2525    
  

news

2526    var news = '' //+
2527    //'<b>Nov 27, 2018</b> &nbsp;' +
2528    //'Here are   <a onclick="displaySlideNamed(\'tensorflow-dev-summit-2018\')">' +
2529    //'the best talks from the TensorFlow Dev Summit.</a>' 
2530    
  

renderContetnDiv

2531    function renderContentDiv(slide){
2532        return "<div id=\"" +
2533        getKey(slide) + "-content" +
2534        '"' +
2535        "></div>"  
2536    }
2537    
2538    function debugIt(){
2539        var i,j;
2540        var result ="<br>" 
2541        for (i=0; i<verticalSlides.length; i++){
2542            if (verticalIndex == i){
2543                     for (j=0; j<horizontalSlides.length; j++){
2544                  result += horizontalSlides[j].key;
2545                  result += " ";
2546                 }
2547            }
2548            else{
2549                result += verticalSlides[i].key;
2550            }
2551            result += "<br> \n";
2552        }
2553        return result;
2554    }
  

renderMore

2555    function renderExtra(){
2556       return "<br> <br> <br><br><br><br>";
2557   
2558   }
2559   function renderButtons(slide,index){
2560            var result = "" +
2561            "<center>" +
2562            manageMenu(slide);
2563           result +=   "</center> <br> " 
2564           return result;
2565   }
2566   
2567   function renderFollowTwitter(){
2568       return '<a style = " padding: 20px;" target="_blank" ' +
2569       'href="https://twitter.com/intent/follow?screen_name=' +
2570       twitterId+ '">' +
2571       '<img alt="Follow to receive video recommendations"' +
2572       'target= "_blank"' +
2573       'src="https://pythonlinks.info/static/graphics/twitter-logo.png"' + 
2574       '></a> ' 
2575   }
2576   
2577       
2578   
2579   function renderDescription (slide){
2580            return  '<p style="text-align:left;">' +
2581           getDescription(slide) + 
2582              "</p>" 
2583   }
2584   
  

renderTitleSubTitle

2585     function getSubTitle(slide){
2586         if (getClass(slide)!='Conference'){
2587             return "";
2588         }
2589         var result = '';
2590         var conferenceName;
2591         var preamble = "Talks at " 
2592         if (slide.key == rootName){
2593             preamble = "at ";
2594         }
2595         if (getClass(slide) == 'Category'){
2596             return '';
2597         }   
2598       
2599         conferenceName = getConferenceName(slide);//WASgetSearchedConferenceName();
2600         if (conferenceName){
2601            result += '<h3 style ="text-align:center;">' + preamble + conferenceName + '</h3>';  
2602         }
2603         return result;
2604    }
2605    
2606    function renderTitle(slide){
2607        var result = '';
2608        result +=  '<h1 style ="text-align:center;">' + 
2609                      getTitle(slide) +
2610                     "</h1>" 
2611         return result;
2612    }
2613             
  

socialMediaLinks

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

generateLeadersCore

2667    
2668   function generateLeadersOrContentCore(slide){
2669       if (showBest){
2670           return generateLeaders(slide);
2671       }
2672       else{
2673           return generateContent(slide);
2674       }
2675   }
  

generateContents

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

generateLeaders

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

generateTop10Array

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

getConferenceVideos

2912    function getConferenceVideos(conferenceName,aNode,allVideos){
2913            var i;
2914            var thisNode;
2915            var children;
2916             if ((getClass(aNode) =="Video")&&
2917                (getConferenceKey(aNode)==conferenceName)){
2918                allVideos.push(aNode);
2919            }
2920            //COULD RETURN IF IT IS A VIDEO.
2921            
2922            if (! hasChildren(aNode)){
2923                return;
2924            }
2925            children=aNode.children;
2926             
2927             if (children && children.length){
2928                for (i in children){
2929                   thisNode=children[i];
2930                   getConferenceVideos(conferenceName,thisNode,allVideos);
2931                }
2932             }
2933        }
  

historyScripts

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

score

3012   //THIS IS THE WILSON SCORE
3013    function  aScore (positiveScore, total) {
3014   
3015       if (total === 0) {
3016           return {
3017               left: 0,
3018               right: 0
3019           };
3020       }
3021   
3022       // phat is the proportion of successes
3023       // in a Bernoulli trial process
3024       const phat = positiveScore / total;
3025   
3026       // z is 1-alpha/2 percentile of a standard
3027       // normal distribution for error alpha=5%
3028       const z = 1.96;
3029   
3030       // implement the algorithm
3031       // (http://goo.gl/kgmV3g)
3032       const a = phat + z * z / (2 * total);
3033       const b = z * Math.sqrt((phat * (1 - phat) + z * z / (4 * total)) / total);
3034       const c = 1 + z * z / total;
3035   
3036       return {
3037           left: (a - b) / c,
3038           right: (a + b) / c
3039       };
3040   }
3041   
3042   
3043   function score (aNode){
3044         var upVotes, downVotes, total,wilsonScore;
3045         upVotes=Number(getUpVotes(aNode));
3046         downVotes= Number(getDownVotes(aNode));
3047         totalVotes = upVotes + downVotes;
3048        
3049         wilson =   aScore (upVotes, totalVotes);
3050         return wilson.left* 100;
3051         
3052   }
  

renderChildCategories

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

renderSlide

3115     var showBest = true;
3116    
3117   
3118   
3119   function generateLeadersOrContent(slide){
3120        return '<div  id = "bestContent' + 
3121        '-' + getKey(slide) + '" >'+
3122             generateLeadersOrContentCore(slide) +
3123         "</div>";
3124   }
3125    var isMobile = true;
3126    function renderSlide(slide,index){ 
3127            var result = "" 
3128             
3129             result += template(
3130                 {'showSearch':showSearch,
3131                  'node':slide,
3132                  'upVote':upVote,
3133                  'downVote': downVote,
3134                  'getClass': getClass,
3135                  'renderServerOptions': renderServerOptions,
3136                  'isAuthenticated': isAuthenticated, 
3137                  'twitterLinkFront': twitterLinkFront,
3138                  'twitterLinkBack': twitterLinkBack, 
3139                  'twitterId': twitterId
3140             });
3141     
3142           result += addArrows(slide);
3143   
3144          
3145   
3146           result +=  breadcrumbs(slide,index) 
3147           result +='<div style = "margin: 20px">';
3148           
3149           result += renderTitle(slide) +
3150            "<br>" //+
3151           getSubTitle(slide) 
3152       
3153         
3154           if ((getClass(slide) == 'Video')){
3155               
3156               var conference = getConference(slide);
3157               result += '<h5 class="text-primary" style = "margin-left:50%">-'+ 
3158               '<a onClick="displaySlideNamed(' + "'" + getConferenceKey(slide) + "')" +'">'+ 
3159               getTitle(conference) +'</a></h5>';
3160           }
3161   
3162           
3163            if (isMobile){
3164              result+= "<center>";
3165            }
3166              result +=renderDescription (slide);
3167           if (isMobile){
3168   
3169               result+= "</center>";
3170           }
3171         result += '<div id="buttons">';
3172               result += renderButtons(slide,index);
3173          result +='</div>';
3174           result += renderContentDiv(slide) 
3175        
3176        
3177       result += socialMediaLinks(slide);
3178       result += renderExtra();  
3179       result += '</div>';
3180       return result; 
3181       }
  

rootname

3182    var rootName='';  
3183    var mobileJson ='';
3184    var deskTopJson ='';
3185    var domain= window.location.hostname.toLowerCase();
3186    var searchURL = "/search";
3187    var contactURL = "/contact";
3188    var twitterId ="men_are_human ";
3189    
3190    if (domain=='pythonlinks.info'){
3191       mobileJson='https://json.PythonLinks.info/python/json';
3192       rootName ='python';
3193       twitterId ="PythonLinks";
3194   }
3195   
3196   else if (domain=='desktop.pythonlinks.info'){
3197       deskTopJson= 'https://json.PythonLinks.info/python/tree.json';
3198       rootName ='python';
3199       twitterId ="PythonLinks";
3200   }
3201   
3202   else if (domain=='climatevideos.info'){
3203       mobileJson='https://json.PythonLinks.info/climate-change/json';
3204       rootName='climate-change';
3205       contactURL = "/contact2";
3206       searchURL = "/search2";
3207        twitterId ="ChangeClimate";
3208   }
3209   
3210   
3211   else if (domain=='desktop.climatevideos.info'){
3212       deskTopJson='https://json.PythonLinks.info/climate-change/tree.json';
3213       rootName='climate-change';
3214       contactURL = "/contact2";
3215       searchURL = "/search2";
3216        twitterId ="ChangeClimate";
3217   }
3218   
3219   
3220   else if (domain=='forestwiki.com'){
3221       mobileJson='/forestwiki/json';
3222       rootName='forestwiki';
3223       contactURL = "/golang-contact";
3224       searchURL = "/golang-search";
3225       twitterId ="forestwiki";
3226   }
3227   
3228   
3229   else if (domain=='cloud-native.pl'){
3230       mobileJson='/golang/json';
3231       rootName='golang';
3232       contactURL = "/golang-contact";
3233       searchURL = "/golang-search";
3234       twitterId ="PythonLinks";
3235   }
3236   else if (domain=='rights.men'){
3237       mobileJson='/mens-rights/json';
3238       rootName='mens-rights';
3239       contactURL = "/mens-contact";
3240       searchURL = "/mens-search";
3241       twitterId ="men_are_human";
3242   }
3243   
3244   else if (domain=='desktop.cloud-native.com'){
3245       deskTopJson='https://json.PythonLinks.info/golang/tree.json';
3246       rootName='golang';
3247       contactURL = "/golang-contact";
3248       searchURL = "/golang-search";
3249       twitterId ="PythonLinks";
3250   }
3251   
3252   
3253   
3254   else if (domain=='desktop.forestwiki.com'){
3255       deskTopJson='https://json.PythonLinks.info/forestwiki/tree.json';
3256       rootName='forestwiki';
3257       contactURL = "/golang-contact";
3258       searchURL = "/golang-search";
3259       twitterId ="forestwiki";
3260   }
3261   
3262   
3263   else if (domain=='dev.pythonlinks.info'){
3264       rootName ='python';
3265       mobileJson='/python/json';
3266       deskTopJson='/python/tree.json';
3267       var twitterId ="PythonLinks";   
3268       //rootName ='climate-change';
3269       //mobileJson='/climate-change/json';
3270       //deskTopJson='/climate-change/tree.json';
3271       //searchURL = "/search2";
3272       //contactURL = "/contact2";
3273   
3274   }
3275    
3276   
  

callbackVisit

3277     
3278    /** Call fn(node) for all child nodes.<br>
3279     * Stop iteration, if fn() returns false. Skip current branch, if fn() returns "skip".<br>
3280     * Return false if iteration was stopped.
3281     *
3282     * @param {function} fn the callback function.
3283     *     Return false to stop iteration, return "skip" to skip this node and
3284     *     its children only.
3285     * @param {boolean} [includeSelf=false]
3286     * @returns {boolean}
3287     */
3288     
3289   
3290     function callbackVisit(item,fn, includeSelf) {
3291    var i, 
3292        l,
3293    res = true,
3294    children = item.children;
3295    if( includeSelf === true ) {
3296    res = fn(item);
3297    if( res === false || res === "skip" ){
3298    return res;
3299    }
3300    }
3301    if(children&&(children.length>0)){
3302        callbackCount++;
3303    
3304        aFunction = function(){
3305        for(i=0, l=children.length; i<l; i++){
3306         callbackVisit(children[i],fn, true);
3307        }
3308        callbackCount--;
3309        if (callbackCount===0){
3310                   reSearch(fn);
3311                   }
3312        };   
3313        setTimeout(aFunction, 1);
3314    }
3315   
3316   
3317    
3318     }
3319   
3320   
3321     
3322            
3323            
3324    function callVisit(item,fn) {
3325    return callbackVisit(item.rootNode,fn, false);
3326    }
  

childrenFunctions

3327   
3328   function getSiblings (item){
3329       if (isRoot(item)){
3330           return [item];
3331       }
3332       return item.parent.children;
3333   }
3334       
  

parent-functions

3335    function pageTitle(node){
3336       var nodeParents= parents(node);
3337       var arrayLength = nodeParents.length;
3338       var result =[];
3339       for (var i = 0; i < arrayLength; i++) {
3340          result.push (getTitle(nodeParents[i]));
3341       }
3342        return result.join(' -> ');
3343       
3344   }
3345   
3346   //Starting with parent
3347   function reversedParents(node){
3348          var result=[];
3349        while (true){
3350            result.push(node);
3351            if (isRoot(node)){
3352                return result;
3353            }
3354            node=node.parent;
3355        }
3356   }
3357   
3358   //Starting with first ancenstor
3359   function parents(node){
3360       return reversedParents(node).reverse();
3361   }
  

pushpopstate

3362   function addSortBy(){
3363       return '?sortBy=' + sortBy;
3364   }
3365   function saveCurrentURL(){
3366      
3367       var domain= window.location.hostname;
3368       var location=getKey(homeNode);
3369   
3370       var url="https://" + domain + "/" + location + addSortBy();
3371       
3372   
3373       var title=getTitle(homeNode);
3374       var data={key:getKey(homeNode)};
3375    
3376    
3377   history.pushState(data, title, url);
3378       
3379   }
3380   
3381   function saveCurrentURLAndSearch(){
3382      
3383       var domain= window.location.hostname;
3384       var location=homeNode.key;
3385       var search=window.location.search;
3386   
3387       var url="https://" + domain + "/" + location;
3388       if (search){
3389           url+= search;
3390       }
3391       var title=homeNode.title;
3392       var data={key:homeNode.key};
3393    
3394    
3395   history.pushState(data, title, url);
3396       
3397   }
  

regexp

3398     
3399   
3400   //FUNCTION TO SPLIT A SEARCH STRING INTO W LIST OF WORDS, 
3401   // AND THEN CREATRE A LIST OF REGEXP
3402   // FROM IT.  This is needed to implement "SearchTermm1" and "SearchTerm2"
3403   
3404   
3405    function _escapeRegex(str){
3406    /*jshint regexdash:true */
3407    return (str + "").replace(/([.?*+\^\$\[\]\\(){}|-])/g, "\\$1");
3408   }
3409   
3410   
3411   //FUNCTION TO SPLIT A SEARCH STRING INTO W LIST OF WORDS, 
3412   // AND THEN CREATRE A LIST OF REGEXP
3413   // FROM IT.  This is needed to implement "SearchTermm1" and "SearchTerm2"
3414   
3415   function getRegxpArray(match) {
3416                   if (match=="all"){
3417                       return [new RegExp(".")];
3418                   }
3419                   if (match=="All"){
3420                       return [new RegExp(".")];
3421                   }
3422            var regexpArray=[]; 
3423            var i;
3424            var input;
3425            var k=0;
3426            var subStrings=match.split(/\s+/i);
3427            for (i in subStrings){
3428                if (subStrings[i]!==""){
3429                   input= _escapeRegex(subStrings[i]);
3430                   regexpArray[k]=new RegExp(input, "i");
3431                   k++;
3432                }
3433            }
3434            return regexpArray;
3435    }
3436   
  

resizeText

3437    function resizeText(multiplier) {
3438     if (document.body.style.fontSize === "") {
3439       document.body.style.fontSize = "2.0em";
3440     }
3441     document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + "em";
3442     localRebuild();
3443        
3444    }
3445   
  

scaleVideos

3446   function resizeVideos( arg1, arg2, containerQuery){
3447     //should be "body"
3448   // Find all YouTube videos
3449   var $allVideos = $("iframe[src^='https://www.youtube.com']"),
3450   
3451       // The element that is fluid width
3452       $fluidEl = $(containerQuery);
3453   
3454   // Figure out and save aspect ratio for each video
3455   $allVideos.each(function() {
3456   
3457     $(this)
3458       .data('aspectRatio', this.height / this.width)
3459       .data('width', this.width)
3460   
3461       // and remove the hard coded width/height
3462       .removeAttr('height')
3463       .removeAttr('width');
3464   
3465   });
3466   
3467   function resize () {
3468   
3469     var newWidth = $fluidEl.width();
3470     if (newWidth > 800){
3471         newWidth = 0.8 * newWidth;
3472     } 
3473     // Resize all videos according to their own aspect ratio
3474     $allVideos.each(function() {
3475   
3476       var $el = $(this);
3477       $el
3478         .width(newWidth)
3479         .height(newWidth * $el.data('aspectRatio'));
3480   
3481     });
3482     localRebuild();
3483    
3484   // Kick off one resize to fix all videos on page load
3485   }
3486   resize();
3487   }
  

setChildINdex

3488    //onSLideLeave
3489   function setChildIndex(){
3490           if (homeNode.parent!== null)
3491              homeNode.parent.previousChildIndex = getSiblings(homeNode).indexOf(homeNode);
3492   }
  

setTitle

3493    function setTitle(node){
3494        if (node.data.class == 'Video'){
3495            node.title =  score(node).toFixed(0) + '% ' 
3496            + node.data.upVotes + '👍 ' + 
3497            node.data.downVotes + '👎 '+
3498            node.title;
3499        }
3500        return true;
3501    }
  

showRedirect

3502    function showRedirect(node){
3503        if ((isMobile && (node==landingPage))) {
3504              var url = "https://" +
3505              "desktop." + domain + '/' + getKey(node);
3506              return '<center> <a href="' + url +
3507              '">Desktop Site (Beta)</a></center>';
3508        }
3509           return "";
3510    }
  

signout

3511    function renderSignOutOption(){
3512       if (isAuthenticated){
3513              return lili( '<a class="text-primary" onclick="signOut()">Sign Out</a>');
3514       }
3515       else 
3516       {return "";}
3517   }
3518   
3519   function signOut(){
3520       window.location.href = "/" + getKey(homeNode) + "/logout2";
3521   }
  

vote

3522   function registerVoter(){
3523        window.location.href="/" + homeNode.key + "/signup";
3524   }
3525   //"/register/voter"
3526   
3527   
3528   function recordVotes(responseText,itemName){
3529       var result = responseText.split (" , ");
3530        document.getElementById(itemName + "-" + "upVotes").innerHTML = result [0]; 
3531         document.getElementById(itemName + "-" + "downVotes").innerHTML = result [1];
3532   }
3533   
3534   function upVote(){
3535       var itemName = getKey(homeNode);
3536   
3537       if (isAuthenticated){
3538          var xhttp = new XMLHttpRequest();
3539          xhttp.onreadystatechange = function() {
3540              if (this.readyState == 4 && this.status == 200) {
3541                  recordVotes(this.responseText,itemName);
3542              }
3543          };
3544          var url = "/" + homeNode.key + "/upVote";
3545          xhttp.open("GET", url, true);
3546          xhttp.send();
3547          return;
3548          }
3549       registerVoter();
3550   }
3551   
3552   function downVote(){
3553         var itemName = getKey(homeNode);
3554   
3555       if (isAuthenticated){
3556           var xhttp = new XMLHttpRequest();
3557           xhttp.onreadystatechange = function() {
3558              if (this.readyState == 4 && this.status == 200) {
3559                 recordVotes(this.responseText,itemName);
3560              }
3561           };
3562           var url = "/" + homeNode.key + "/downVote";
3563           xhttp.open("GET", url, true);
3564           xhttp.send();
3565           return;
3566        }
3567            registerVoter();
3568   
3569   }
3570   
3571   
3572   
3573   
  

twitterImage

3574      var showBest = true;
3575    
3576    function renderTwitterImage(){
3577         return '' + 
3578         '<img src="https://pythonlinks.info//static/graphics/Tweet.png" '+ 
3579         'alt="I wanted to add users tweets to my website, but Twitter'+
3580         'would then track every page that you visit.  Not good for privacy. ' +
3581         'So if you are kind enough to tweet comments, I will link to them."'+
3582          'style = "max-width:100%;" onload="localRebuild">' +
3583           '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Privacy Protecting Tweet Image';
3584   
3585        
3586    }
3587            
3588   function showIntroductoryVideo(slide){         
3589           if ((slide == landingPage)&&isMobile&& (rootName == 'python')) 
3590                {    
3591           return '<h3 style = "text-align:center;">'+
3592           '<a onClick="displaySlideNamed('+
3593           "'introductory-video')"+ '">' + 
3594           'Introductory Video</a></h3>'+
3595           '<p style="text-align:center">' + news + "</p>"; 
3596           }
3597           else {
3598          return '';
3599           }
3600   } 
3601   
3602   function generateLeadersOrContent(slide){
3603        return '<div  id = "bestContent' + 
3604        '-' + getKey(slide) + '" >'+
3605             generateLeadersOrContentCore(slide) +
3606         "</div>";
3607   }
  

twitterlink

3608   function twitterLinkFront(){
3609       var result ="";
3610       var base = 'https://twitter.com/intent/follow?screen_name=';
3611       result +=  '<a href="' + base +
3612       twitterId +
3613       '">' 
3614       return result;
3615   }
3616   function twitterLinkBack(){
3617       return  '</a>';
3618   }
3619