Login

Search Javascript Folder

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

initialize

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

loadContent

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

moveTo

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

positions

589     
590    function nextItem(array,index){
591        if (index == array.length -1){
592            return array[0];
593        }
594        return array[index+1];
595    }
596    function previousItem(array,index){
597        if (index === 0){
598            return array [array.length -1];
599        }
600        return array [index-1];
601   }
602   
603   function average (angle1, angle2,radius){
604           if ((angle1 - angle2) > Math.PI){
605            
606              angle2=angle2 + 2*Math.PI;
607              //return angle1;
608              return average (angle1, angle2, radius);
609           } 
610           
611           if ((angle1 - angle2) > 1){
612              return angle1 - (0.333/radius);
613           }  
614           
615           if ((angle2 - angle1) > Math.PI){
616              
617                angle2= angle2 - 2*Math.PI;
618                return average (angle1, angle2, radius);      
619           }
620           if ((angle2 - angle1) > 1){
621              return angle1 + (0.3333/radius);
622       }
623       return (angle1 + angle2 ) /2.0;
624   }
625   
626    function calculateChildPositions (row,radius){
627        var i, item, arent, siblings, length, offset, share;
628        var angle, parentAngle,itemIndex,  delta;
629        var first, last, previous, previousAngle, next, nextAngle;
630        var j, ratio;
631        var rowLength= row.length;
632        var maxDelta = 0;
633        var minDelta = 0;
634        for (i = 0  i<rowLength;i ++ ){
635             item = row [i]; 
636             parentAngle= item.parent.angle;
637             siblings = item.parent.children;
638             length = siblings.length;
639             offset = length /2;
640             share =  item.parent.share/length;
641             item.share = share;
642             itemIndex = siblings.indexOf(item);
643             delta = (itemIndex -offset) * share 
644             angle = parentAngle + delta;
645             onePosition(item, angle, radius);
646            }
647             
648            if (radius < 2) {
649              return;
650          }
651          
652         for (i = 0  i<rowLength;i ++ ){
653                 item = row [i]; 
654                 siblings = item.parent.children;
655                 length= siblings.length;
656                 itemIndex = siblings.indexOf(item);  
657   
658                 if (itemIndex === 0){
659                     previous = previousItem (row,i);
660                     previousAngle = previous.angle;
661                     first = average (item.angle, previousAngle,radius);
662   
663                 }
664                 if (itemIndex == siblings.length -1 ){
665                     next = nextItem(row,i);
666                     nextAngle = next.angle;
667                     last = average (item.angle, nextAngle,radius); 
668                 
669   
670                     for (j=0 j< length; j++){
671                         item = siblings [j];
672                         delta = last - first;
673                         offset = length /2;
674                         ratio = (j) /length;
675                         if (length ==1){
676                             ratio = 0.5;
677                         }
678                         angle = first + (delta * ratio);
679                       onePosition(item, angle, radius);
680                     }
681                 }
682   
683         }
684   
685             
686   }
687   
688     function onePosition( item,angle,radius) {
689        item.angle = angle;
690       item.x=radius * Math.cos(angle);
691       item.y=  radius * Math.sin(angle);
692    } 
693    
694    
695    function randomPosition(item, index) {
696       item.x=Math.random () +1;
697       item.y=Math.random () +1;
698    }
699    function zeroPosition(item, index) {
700       item.x=0;
701       item.y=0;
702    }
  

renderSearchButton

703    function renderSearchOption(node){
704             if (! isMobile){
705             return "" +
706               lili('<a href="https://PythonLinks.info/search">Search</a>');
707             }
708             else{ 
709                 return lili('<a onclick ="showSearch()">Search</a>');
710           
711              }
712              
713    }
714    
  

showsearch

715     function showSearch(){}
  

traverse

716   
717    
718    function rowItems(rowArray){
719        var result = [];
720        for (var i=0  i<rowArray.length;i++){
721            result = result.concat(rowArray[i].children);
722        }
723        return result;
724    } 
  

ChildFunctions

725      
726    
727    function getChildIndex(homeNode){
728      var childIndex = 0;    
729             if (homeNode.hasOwnProperty('previousChildIndex')){
730                childIndex = homeNode.previousChildIndex;
731              }
732      return childIndex;           
733    }           
  

SlideUpOrDown

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

createSlides

785   function renderVerticalSlides(){
786       
787               var i,slide;  
788               var result = "";
789               for (i = 0  i < verticalSlides.length; i++){
790                       slide =renderVerticalSlide (verticalSlides[i],i);
791                        result += slide;
792               }
793               return result;
794               
795   }   
796   
797   function renderHorizontalSlides(){
798        
799               var j;     
800               var result = ""; 
801               for (j = 0  j < horizontalSlides.length; j++){
802                         slide =renderHorizontalSlide (horizontalSlides[j],j);
803                         result += slide;
804                       }
805               return result;            
806       
807               }
808               
809   
  

renderSlides

810    function goToChat(item){
811         
812       var href = "/" + item + "/chat";
813             window.open(href);
814   
815    }
816    
817    
818    
819   
  

renderVerticalSlide

820    function renderHorizontalSlide(slide,index){ 
821       var result = "";
822       result += "<div " +
823       " id = \"slide " + slide.key + "\" "+
824       "class=\"slide";
825       if (slide == homeNode)  {
826               result +=" active";
827           }
828   
829       result +="\">";
830       result += '<div style="width: calc(100% - 20px);"' +
831                 'id="' + slide.key + "-page" + '">';
832                 
833       result += renderSlide(slide,index);
834       result += "</div>";
835       result += "</div>";
836       return result;
837    }
838    
839    
840    function renderVerticalSlide(slide, index){
841           var result = "";
842           result += "<div class=\"section ";
843           if (slide == homeNode)  {
844               result +="active ";
845           }
846          //       result += " style=\"background-color:" +
847          //   (parents(slide).length & 1) ? '#ccc': '#fff'+ ";\"";
848           result +="\">";
849              if (slide == homeNode)  {
850               result += renderHorizontalSlides();  
851            }
852            else {
853               result += renderSlide(slide,0);
854            }
855         
856           result += "</div>";
857           return result;
858    }
859    
  

clickNode

860     function clickNode(webPageName){
861        var key = webPageName.key;
862         homeNode=tree.getNodeByKey(key);
863        popSlides(homeNode);
864    }
865    
866     window.addEventListener('popstate', function(event) {
867   clickNode(event.state);
868     
869   });
  

get

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

getHorizontalAndVerticalSlides

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

getPage

1029    function getPage(){
1030        handle = '';
1031        var result = $('#' + homeNode.key + "-page" ).html();
1032        handle = 'lozinski';
1033        return result;
1034    }
  

hasChildren

1035     
1036    function hasChildren(homeNode){
1037      
1038       if (homeNode.hasOwnProperty ('children') &&
1039            (homeNode.children !== null) &&
1040           (homeNode.children.length > 0)){
1041               return true;
1042           }
1043        return false;    
1044    }
1045        
  

initialize

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

initializeslides

1095   function pleaseLoadContent (anchorLink, index, slideAnchor, slideIndex){
1096       loadContent ();
1097   }
1098   function smallLoadContent (anchorLink, index, slideAnchor, slideIndex){
1099       loadContent ();
1100   }
1101   
1102   function reloadSection(anchorLink, index){
1103       if (mayLoad){
1104           mayLoad = false;
1105           reload();
1106       }
1107   }
1108   
1109   function reloadSlide(anchorLink, index, slideAnchor, slideIndex){
1110       if (mayLoad){
1111           mayLoad = false;
1112           reload();
1113       }
1114   }
1115   
1116   var fullPageArguments=     {
1117      verticalCentered: false,
1118      //CHROME
1119    scrollOverflow:true,
1120    scrollBar: false,
1121    loopHorizontal: false,
1122    touchSensitivity: 10,
1123           afterResize: resizeVideos, 
1124    css3:false, //JQUERY UI required by Fancytree breaks it
1125         afterRender:pleaseLoadContent,
1126     afterLoad: reloadSection, 
1127     afterSlideLoad: reloadSlide,
1128     onLeave:  leaveSection,
1129       onSlideLeave:  leaveSlide
1130   
1131    };
  

leave

1132   
1133   var mayLoad=false;
1134   
1135    //OLD VERSIONS
1136   function leaveSection (index,nextIndex,direction){
1137           if (! allowScrolling){
1138           return false;
1139       }
1140       mayLoad= true;
1141       homeNode = verticalSlides [nextIndex-1];
1142       saveCurrentURL();
1143       return true;
1144   }
1145   
1146   
1147   function leaveSlide(anchorLink, index, slideIndex, direction, nextSlideIndex){
1148       if (! allowScrolling){
1149           return false;
1150       }
1151       mayLoad= true;
1152       homeNode = horizontalSlides [nextSlideIndex];
1153        saveCurrentURL();
1154   
1155       return true;
1156   
1157   }
1158   
1159   
1160   
1161   function popSlides(aNode){
1162        setSlides(aNode);
1163        reload();
1164   }
1165   
1166   function displaySlideNamed(key){
1167       displaySlide(tree.getNodeByKey(key));
1168       saveCurrentURL();
1169   } 
1170   
1171   function displaySlide(aNode){
1172       homeNode = aNode;
1173        setSlides(aNode);
1174        reload();
1175   }
  

moveMoveCommands

1176   function buildFullPage(){
1177             $('#fullpage').fullpage(fullPageArguments);
1178   }
1179   
1180   function moveDown(){
1181       setDownSlides();
1182       restartFullPage();
1183       reloadCore();
1184       $.fn.fullpage.moveSectionDown();
1185   }
1186   
1187    function moveUp(){
1188        setUpSlides();
1189      restartFullPage();
1190       reloadCore();
1191       $.fn.fullpage.moveSectionUp();
1192        
1193   
1194    }
1195   
1196   
1197   
1198   function moveToLast(numberOfSiblings){
1199        return;
1200   }
1201   
1202   function moveToFirst(){
1203   return 
1204       
1205   }
1206   
1207   function moveRight(){
1208       setRightSlides();
1209      restartFullPage();
1210       reloadCore();
1211       $.fn.fullpage.moveSlideRight();
1212   
1213   }
1214   
1215   function moveLeft(){
1216        setLeftSlides();
1217      restartFullPage();
1218       reloadCore();
1219       $.fn.fullpage.moveSlideLeft();
1220        
1221   }
  

moveToMobile

1222   function MoveTo(){
1223       
1224   }
  

pinchToZoom

1225   var allowScrolling = true;
1226   /*
1227   $(document).ready(function() { 
1228   
1229       var scale = 1.0; // initial-scale
1230       var r = 0.10;
1231       var oldScale = scale;
1232   
1233       $(document).bind('gesturechange',function(event){
1234           allowScrolling = false;
1235           $.fn.fullpage.destroy();
1236            var height = viewport.height;
1237            var halfHeight = height / 2.0;
1238            var  offsetTop = vewport.offsetTop;
1239             var oldHeight = halfHeight + offsetTop;
1240           
1241           var newScale = event.originalEvent.scale;
1242           if(newScale  > 1) scale = scale <2 ?  newScale : 2 
1243           else scale = scale > 0.5 ? newScale : 0.5 
1244   
1245         
1246            var ratio = newScale /oldScale; 
1247            var newHeight = (oldHeight * ratio) -height;
1248            viewport.offsetTop = newHeight;       
1249           $('meta[name=viewport]').attr('content', 'width=device-width, minimum-scale='+ scale.toFixed(2) +', maximum-scale='+ scale.toFixed(2) +', user-scalable=yes'); // 
1250           setTimeout(pleaseAllowScrolling,300);
1251                $.fn.fullpage.reBuild();
1252                
1253           oldScale = newScale;
1254   
1255       });
1256   });
1257   
1258   function pleaseAllowScrolling(){
1259        allowScrolling = true;
1260   }
1261   */
  

reload

1262   var fullPage = false;
1263   var newSlides;
1264   function reload(){
1265      
1266       setChildIndex();
1267        //setSlides(homeNode);
1268        setAndReload();
1269   }     
1270   
1271   function loadOneSlide(){
1272       
1273       verticalSlides=[homeNode];
1274       horizontalSlides=[homeNode];
1275       setAndReload();
1276   }
1277   
1278   function setAndReload(){ 
1279          setSingleSlide();
1280          reloadCore();
1281           destroyFullPage();
1282          }
1283          
1284   function reloadCore(){       
1285          replaceFullPage();
1286          destroyFullPage();
1287          restartFullPage();
1288   }        
1289   
1290   
1291       
1292   function replaceFullPage(){   
1293            document.title=pageTitle(homeNode);
1294        $('#fullpage div').addClass("old");
1295        newSlides = renderVerticalSlides(homeNode);
1296        $(".old").remove();
1297        $('#fullpage').append(newSlides);
1298   }
1299   
1300   function destroyFullPage(){
1301         if (fullPage){
1302          $.fn.fullpage.destroy('all');   
1303        }
1304   }     
1305   
1306   function restartFullPage(){
1307        fullPage = true;
1308        $('#fullpage').fullpage(fullPageArguments);
1309   }
1310   
  

MyFilter

1311    //THS FUNCTION IS A HOOK SO THAT EVERYONE CAN GENERATE THE APPROAPRIATE
1312   //STRING TO SEARCH IN THEIR APPLICATION
1313   function getStringToSearch(node){
1314            var searchString = node.data.title+' '+node.data.description + '';
1315            if (node.data.class == 'Video'){
1316               searchString += tree.getNodeByKey(node.data.conference).title; 
1317            }
1318            return searchString;
1319       }
1320       
1321       
1322   // THIS IS THE FUNCTION WHICH RETURNS TRUE IF ALL THE WORDS ARE FOUND IN THE STRING
1323   //FALSE OTHERWISE
1324   function MyFilter(node,regexpArray){ 
1325       
1326      
1327       var j;
1328       var stringToSearch=getStringToSearch(node);
1329       var result=true;
1330       for (j in regexpArray){
1331            if (!(regexpArray[j].test(stringToSearch))){
1332                result=false;
1333            }
1334       }
1335    
1336       return result;
1337   }
1338   
1339   function formattedTitle(node,coreTitle){
1340     return  "&bull; <a title=\""+node.data.description  +  "\"><b>"+ coreTitle +"</b></a>";
1341       
1342   }  
1343   
1344   
  

applyFilter

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

branchSize

1451     var branchSize;
1452    function getBranchSize(node){
1453       if (node.match || node.unmatchedParent){
1454           return node.subMatchCount;
1455       }
1456       else {
1457           branchSize=node.data.branchSize;
1458           branchSize = parseInt(branchSize);
1459           branchSize = branchSize.toString();
1460           return branchSize;
1461           
1462       }
1463   }
1464   
  

collapseChildren

1465    function collapseChildren(node){
1466       var index;
1467       var item;
1468       var children=node.children;
1469       if((node.isFolder())&&node.hasChildren()){
1470           node.setExpanded(false, {noAnimation: true, noEvents: true, scrollIntoView: false});
1471           for (index=0;index<children.length;index++){
1472               item=children[index]
1473               if (item.isExpanded()){
1474                   collapseChildren(item); 
1475               }
1476           }
1477       }
1478   }
  

gui-functions

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

search.js

1561         var callbackCount=0;
1562   var count;
1563   var currentSearchString="";
1564   var oldSearchString="";
1565   
1566   function cleanUp(){
1567        var rootNode=$("#tree").fancytree("getTree").getRootNode();
1568           rootNode.render(true);
1569           $("button#btnResetSearch").attr("disabled", false);
1570        $("span#matches").text("(" + count + " matches)");
1571        $.fn.fullpage.reBuild();
1572   
1573   }
1574   
1575   function reSearch(filterFunction){
1576        var value=$("input[name=search]").val();
1577        if (currentSearchString!=value){
1578             $("input[name=search]").trigger("keyup");
1579   
1580           }
1581        else{
1582   
1583               cleanUp();
1584           }
1585   $.fn.fullpage.reBuild();
1586   
1587    }
1588     
1589   
1590    
1591     
  

setScrolling

1592      function setScrolling(){
1593       if (homeNode.data.class == 'Chat'){
1594         $.fn.fullpage.setAutoScrolling(false);
1595         $.fn.fullpage.setFitToSection(false);
1596       }
1597       else{
1598            $.fn.fullpage.setAutoScrolling(true);
1599            $.fn.fullpage.setFitToSection(true);  
1600   
1601       }
1602   }
1603   
  

ViewCount

1604    function getViewCount(aNode){
1605       if (isMobile){
1606           return aNode.data.viewCount;
1607       }
1608       return aNode.viewCount;
1609   }
1610   
1611   function score (aNode){
1612         var upVotes, downVotes, viewCount, ratio;
1613         upVotes=Number(getUpVotes(aNode));
1614         downVotes= Number(getDownVotes(aNode));
1615         viewCount=Number(getViewCount(aNode));
1616         ratio = (upVotes - (5 * downVotes))/viewCount;
1617         ratio = ratio * 10000;
1618         return ratio;
1619   }
  

Arrows

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

UserVideoMenu

1689    //This version of Pug.jsdoesnot interpoate attributes, so here is a workaround. 
1690   function myVideoMenu(){
1691   var result = '' +
1692    `<a class="dropdown-item" href="/person/${userId}/">My Videos </a>` +
1693    
1694   ` <a class="dropdown-item" href="/person/${userId}/addUserLightningTalk">Add Lightning Talk  </a>` +
1695   `<a class="dropdown-item" href="/person/${userId}/addUserVideo">Add Conference Video</a>` +
1696   `<a class="dropdown-item" href="/person/${userId}/edit">Edit Profile</a>` 
1697   return result;
1698   }
  

arguments

1699    var urlParams = new URLSearchParams(window.location.search);
1700   var sortBy = 'bestWilsonScore';
1701    
1702   if (urlParams.has('sortBy') ){
1703       sortBy = urlParams.get('sortBy');
1704   }
1705   if (!(['bestWilsonScore','bestMyScore','bestMostRecent'].includes(sortBy))){
1706       sortBy='bestWIlsonScore';
1707   }
1708   
  

arrowKeys

1709   function getChildIndex(aNode){
1710        var childIndex= 0  
1711        if ( 'previousChildIndex' in aNode){
1712         childIndex = homeNode.previousChildIndex;
1713         }
1714        return childIndex; 
1715   }
1716   
1717   function canGoUp(node){
1718       return !isRoot(node);
1719   }
1720   
1721   function goUp (){
1722       if (canGoUp(homeNode)){
1723           var offset = homeNode.parent.children.indexOf(homeNode);
1724           homeNode.parent.previousChildIndex = offset;
1725           moveUp();
1726       }
1727   }
1728   
1729   
1730   function canGoDown(node){
1731    return hasChildren(node);   
1732   }
1733   
1734   function goDown (){
1735       if(! canGoDown(homeNode)){
1736           return;
1737       }
1738       var childIndex=getChildIndex(homeNode);
1739       moveDown(childIndex);
1740   }
1741   
1742   function canGoRight(node){
1743       var siblings= getSiblings(node);
1744       var offset = siblings.indexOf(homeNode);
1745       var numberOfSiblings = siblings.length;
1746       return (offset < numberOfSiblings -1 )
1747   }
1748   
1749   function goRight (){
1750      var siblings = getSiblings(homeNode);
1751       var offset = siblings.indexOf(homeNode);
1752       var numberOfSiblings = siblings.length;
1753       if (canGoRight(homeNode)){
1754          homeNode.parent.previousChildIndex = offset + 1;
1755          moveRight(offset);
1756       }
1757       else {
1758           homeNode.parent.previousChildIndex = 0;
1759            moveToFirst();
1760       }
1761   }
1762   
1763   
1764   function canGoLeft(node){
1765         
1766       var siblings= getSiblings(homeNode);
1767       var offset = siblings.indexOf(homeNode);
1768       var numberOfSiblings = siblings.length;
1769       return  (offset > 0);
1770   
1771   }
1772   function goLeft (){
1773     
1774       var siblings= getSiblings(homeNode);
1775       var offset = siblings.indexOf(homeNode);
1776       var numberOfSiblings = siblings.length;
1777   
1778       if (canGoLeft(homeNode)){
1779           homeNode.parent.previousChildIndex = offset -1;
1780           moveLeft(offset);
1781       }
1782       
1783       else{
1784          homeNode.parent.previousChildIndex = numberOfSiblings -1;
1785          moveToLast(numberOfSiblings); 
1786       }
1787       
1788   }
1789   
1790   
1791   
1792      document.onkeydown = function (e) {
1793     if (e.key=="ArrowUp"){
1794         goUp();
1795         
1796     }
1797       else if (e.key=="ArrowDown"){
1798         goDown();
1799     }
1800       else if (e.key=="ArrowLeft"){
1801         goLeft();
1802     }
1803       else if (e.key=="ArrowRight"){
1804           goRight();
1805         
1806     }
1807      else if (e.key=="PageUp"){
1808         goLeft();
1809     }
1810       else if (e.key=="PageDown"){
1811           goRight();
1812         
1813     }
1814   };
  

arrows

1815    function footer(item,index){
1816        var result = "";
1817                        
1818        if (hasChildren(item)){
1819            result += " &uarr; ";
1820        }
1821           if (isRoot(item) !== null){
1822            result += " &darr; ";
1823        }
1824           if (index > 0){
1825            result += " &rarr; ";
1826        }
1827           if (! isRoot(item)){
1828            result += " &larr; ";
1829        }
1830        return result;
1831    }
  

loadContent

1832   function errorF( jqXHR, textStatus, errorThrown ){
1833       console.log ("AJAX ERROR", jqXHR, textStatus, errorThrown );
1834           // $.fn.fullpage.reBuild();
1835   
1836   }
1837   
1838   
1839   //after slide load
1840   function loadContent(){
1841     
1842       if (homeNode === undefined){
1843           return;
1844       }
1845      
1846       var url = "/" + getKey(homeNode) + "/content";
1847       divName = "#" + getKey(homeNode) + "-content";
1848       console.log("URL", url);
1849       console.log ("sortBy", sortBy);
1850         $.ajax({
1851             type: 'POST',
1852             url: url, 
1853         data: {'sortBy':sortBy},
1854         cache: false, 
1855         error: errorF,
1856         success: function(result){
1857           $(divName).html(result);
1858           resizeVideos(0,0,"body");
1859        localRebuild();
1860       }
1861         });
1862       
1863   }
1864    
1865   
1866      
  

navbar.pug

1867   nav.navbar.navbar-expand-md.navbar-dark.bg-dark
1868     button.navbar-toggler(type='button', data-toggle='collapse', data-target='#navbarsExample04', aria-controls='navbarsExample04', aria-expanded='false', aria-label='Toggle navigation')
1869       span.navbar-toggler-icon 
1870     #navbarsExample04.collapse.navbar-collapse
1871       ul.navbar-nav.mr-auto
1872         li.nav-item.dropdown
1873           a#dropdown04.nav-link.dropdown-toggle(href='https://example.com', data-toggle='dropdown', aria-haspopup='true', aria-expanded='false') Sites
1874           .dropdown-menu(aria-labelledby='dropdown04')
1875             != renderServerOptions(node)        
1876             a.dropdown-item(href='https://PythonLinks.info') Python Videos
1877             a.dropdown-item(href='https://cloud-native.pl') GoLang Videos
1878             a.dropdown-item(href='https://ForestWiki.com') ForestWiki.com
1879             a.dropdown-item(href='https://ClimateVideos.info') Climate Change
1880         if getClass(node)!='Video'       
1881           li.nav-item.dropdown
1882             a#dropdown04.nav-link.dropdown-toggle(href='https://example.com', data-toggle='dropdown', aria-haspopup='true', aria-expanded='false') View
1883             .dropdown-menu(aria-labelledby='dropdown05')
1884               a.dropdown-item(
1885                 href='#'
1886                 onClick='wilsonView()'
1887               ) WIlson Score
1888               a.dropdown-item(
1889                 href='#'
1890                 onClick ='myScoreView()'
1891               ) Votes/View
1892               a.dropdown-item(
1893                 href='#'
1894                 onClick ='mostRecentView()'
1895               ) Most Recent
1896                a.dropdown-item(href='https://PythonLinks.info/wilson-score') Explain
1897         // IF VIDEO
1898         if getClass(node)=='Video'         
1899           li.nav-item.dropdown
1900             a#dropdown04.nav-link.dropdown-toggle(href='https://example.com', data-toggle='dropdown', aria-haspopup='true', aria-expanded='false') Vote
1901             .dropdown-menu(aria-labelledby='dropdown05')
1902               a.dropdown-item(
1903                 href='#'
1904                 onClick = 'upVote()'
1905               ) Up Vote
1906               a.dropdown-item(
1907                 href='#'
1908                 onClick = 'downVote()'
1909               ) Down Vote
1910               a.dropdown-item(href='https://PythonLinks.info/wilson-score') Explain
1911               
1912               
1913         //PER USER
1914         if isAuthenticated         
1915           li.nav-item.dropdown
1916             a#dropdown04.nav-link.dropdown-toggle(href='https://example.com', data-toggle='dropdown', aria-haspopup='true', aria-expanded='false') My Videos
1917             .dropdown-menu(aria-labelledby='dropdown05'
1918             ) !{myVideoMenu()}
1919               
1920         li.nav-item
1921           a.nav-link(
1922           href='https://PythonLinks.info/contact'
1923           ) Contact
1924           span.sr-only (Contact)
1925         if  ! isAuthenticated 
1926           li.nav-item
1927              a.nav-link(
1928              href='./signup'
1929              ) Sign Up
1930              span.sr-only (Subscribe)
1931           
1932         if  ! isAuthenticated 
1933            li.nav-item
1934               a.nav-link(
1935               href='./login'
1936               ) Login
1937               span.sr-only (Login) 
1938           
1939         if  isAuthenticated 
1940            li.nav-item
1941               a.nav-link(
1942               href='/logout'
1943               ) Logout
1944               span.sr-only (Logout) 
1945               
1946                       
1947      
1948          
1949            
1950               
1951       if isMobile            
1952         form.form-inline.my-2.my-md-0
1953           input.form-control(
1954             type='text'
1955             placeholder='Search'  
1956             onFocus = 'showSearch()'
1957           )           
1958       ul.navbar-nav.ml-auto
1959         li.nav-item
1960           a.nav-link(
1961             href='https://twitter.com/intent/follow?screen_name=PythonLinks'
1962             target='_blank' 
1963           )   
1964               != twitterLinkFront()
1965               img(
1966                 alt='Follow to receive video recommendations' 
1967                 style = 'height:  1.5em;'
1968                 src='https://pythonlinks.info/static/graphics/twitter-logo.png'
1969               )
1970               != twitterLinkBack()
1971         li.nav-item
1972           a.nav-link(
1973             href='#' 
1974             onclick='resizeText(-1)'  
1975           ) a
1976             span.sr-only (Make the Font Smaller)
1977         li.nav-item
1978           a.nav-link(
1979             href='#'
1980             onclick='resizeText(+1)'
1981           ) A
1982             span.sr-only (Make the Font larger)
1983        
1984           
1985             
1986            
1987   
1988   
  

breadcrumbs

1989    function oneCrumb(item,step,width,showChildren){
1990           result = '<div style = "margin-left:' + (step).toString() + 'em">' +
1991            getTitle(item).link('/' + getKey(item)) 
1992            if (width > 500){
1993                result +=  ' &nbsp;(' + getBranchSize(item) + ')' 
1994            }
1995            result +=  '</div>';
1996           return result;
1997    }
1998    
1999    
2000    function selectChanged(arg){
2001        if (arg.value===''){
2002            return;
2003        }
2004        displaySlideNamed(arg.value);
2005    }
2006    
2007    
2008    
2009   function setSelectedIndex(s, valsearch){
2010     for (i = 0; i< s.options.length; i++){ 
2011       if (s.options[i].value == valsearch){
2012       s.options[i].selected = true;
2013       break;
2014       }
2015     }
2016   }
2017   
2018    
2019    function onSelectFocus(arg,id){
2020         
2021        arg.selectedIndex = 0;
2022   }
2023   
2024    function onSelectBlur(arg, id){  
2025       setSelectedIndex(arg, arg.id.slice(7));
2026    }
2027    
2028    function selectSiblings (node,step,width,showChildren){
2029        var siblings = getSiblings(node);
2030        var id = 'select-' + getKey(node);
2031        if (showChildren){
2032            siblings = node.children;
2033            id = 'select-child-category';
2034        }
2035       
2036         result = '<div style = "margin-left:' + (step).toString() + 'em">' 
2037       result += '<select style="-webkit-appearance: none; -moz-appearance: none;  appearance:none; ';
2038       result +='width:auto; max-width: 50em; padding: 0; height:1.7em" class= "text-primary form-control" id = "' + id  + '"';
2039       result += ' onchange ="selectChanged(this)" ' 
2040       result += " onfocus =\"onSelectFocus(this,'" + id + "')\"";
2041       result += " onblur =\"onSelectBlur  (this,'" + id + "')\"";
2042       result += ' value="" ';
2043       result += ">";
2044       
2045       if (showChildren){
2046           result += '<option selected value="">Select Sub-Category or Video▼</option>';
2047       }
2048        else{
2049           result += '<option  >Jump To:</option>';
2050     
2051        }
2052       
2053      // AND NOW GENERAT OPTIONS
2054      for ( let index in siblings){
2055         
2056          item = siblings [index];
2057       
2058          result += "<option ";   
2059          
2060          if (item == node){
2061              result += " selected ";
2062          }
2063        result +=' value="'; 
2064        result += getKey(item);
2065        result +='">';
2066       
2067        result += getTitle(item);
2068         if (item == node){
2069              result += " ▼";
2070          }
2071        if (width > 500){
2072           result +=  ' &nbsp;(' + getBranchSize(item) + ')' 
2073        }
2074    
2075         result += "</option>";
2076      }
2077     result += "</select>";
2078       result +=  '</div>';
2079   
2080     return result;
2081    }
2082    
2083    function breadcrumbs(node,index){
2084         var width = $( window ).width();
2085        var result="";
2086        var offset;
2087        var items=parents(node);
2088        var length = items.length;
2089        var step;
2090        result+= "<div style = \"text-align:left; \">";
2091       for (step = 0; step < length-1; step++) {
2092           item=items[step];
2093           result += selectSiblings(item,step,width,false);
2094           }
2095        result += selectSiblings(node,length -1,width,false);  
2096        
2097        if (hasChildren(node)){
2098            result += selectSiblings(node,length,width, true); 
2099        }
2100        result += "</div>";
2101        return result;
2102    }
2103    
  

generateTwitter

2104    function getHashTag(node){
2105       if (isMobile) {
2106           return node.data.hashTag;
2107       }
2108       else {
2109           return node.hashTag;
2110       }
2111   }
2112    function renderTweetForm(node){
2113        if (node != homeNode){
2114            return "";
2115        }
2116        var url =  'https://PythonLinks.info/'+ getKey(node) 
2117       result = "";
2118       result += '<div class="form-group" style = "padding: 20px;">' 
2119       
2120       result += '<form id="messageForm"  action="https://twitter.com/share" method="get">' +
2121        '<label for="comment">Comment on Twitter about:</label><br>' +
2122       '<input type="hidden" name="source" value="tweetbutton"> ' +
2123       '<textarea id="tweet" name= "text"  rows="5"' +
2124       'class="form-control">' + node.title + '\n' +
2125        url  + 
2126       ' via @PythonLinks ' +
2127        getHashTag(node) + ' '  +
2128        '</textarea>' +
2129       '<button type="submit"  formtarget="_blank" class="btn btn-primary">Tweet</button> &nbsp;' +
2130        '<span id="charactersRemaining"></span>' +
2131        '</form>' 
2132        
2133       result += '</div>' 
2134       
2135       return result;
2136   }
2137   
2138   function commentType(node){
2139       if (getClass(node) == 'Conference'){
2140           return 'If you are kind enough to say what you thought about this conference,' + 
2141           'your comments will show up here.';
2142       }
2143           if (getClass(node) == 'Video'){
2144               return 'If you are kind enough to review this video after you watch it,' +
2145               'your review on twitter will be posted here';
2146           }
2147       if (getClass(node) == 'Category'){
2148           return 'If you are kind enough to give me your professional advice on the organization '+
2149           'of this category, I will either make the changes, or post your ocmment here';
2150       }
2151       return '';
2152   
2153   }
2154   
2155   function renderTweet(tweetId){
2156       var result = '<blockquote class="twitter-tweet" data-lang="en"><p lang="en"' +
2157        'dir="ltr">&quot;Data Science Without Borders&quot; is the overall best '+
2158       '<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;' +
2159       ' The Best of 710 Python Conference Videos (@PythonLinks) ' +
2160       '<a href="https://twitter.com/PythonLinks/status/1048163192080404480?ref_src=twsrc%5Etfw">'+
2161       'October 5, 2018</a></blockquote>' +
2162       '<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>';
2163        return result;
2164   }
2165    /*
2166   function notUsed(){
2167     if ('showHashTag' in node){
2168         result +='<a href="https://twitter.com/search?q=' + 
2169         node.hashTag +
2170         '">See the comments on twitter.</a>';
2171     }
2172     else{
2173         result += "<p>If you would be so kind as to post the "+
2174         "first comment on this page, I will go ahead and add a link to the unique hashtag "+
2175         "timeline on Twitter</p>";
2176     }
2177   }
2178     */
2179   
2180   var el;                                                    
2181   
2182   function countCharacters(e) {                                    
2183     var textEntered, countRemaining, counter;          
2184     textEntered = document.getElementById('tweet').value;  
2185     counter = (280 - (textEntered.length));
2186     countRemaining = document.getElementById('charactersRemaining'); 
2187            countRemaining.textContent = ""; 
2188   
2189       if (counter < 20){
2190           countRemaining.textContent = counter.toString() + 
2191           ' Characters Remaining';
2192       }
2193   
2194   }
2195   
2196   function postRender(){
2197       el = document.getElementById('tweet');                   
2198   el.addEventListener('keyup', countCharacters, false);
2199   countCharacters();
2200   }
2201   
  

buttonFunctions

2202    
2203   function editProfile(){
2204       window.location.href = "/person/" + userId + "/editPrincipal";
2205   }
2206   
2207   
2208   function editProfile(){
2209       window.location.href = "/person/" + userId + "/editPrincipal";
2210   }
2211   
2212    function changeView(){
2213           showBest = ! showBest;
2214   
2215        var label = "Best View";
2216        if (showBest){
2217            label = "List View";
2218        }
2219      
2220       $("#viewButton").html(label);
2221       var result = generateLeadersOrContentCore(homeNode);
2222       $("#bestContent" + '-' + getKey(homeNode)).html(result);
2223            localRebuild();   
2224   
2225       }
  

renderButtons

2226   function renderServerOptions(node){
2227       var url ="https://";
2228       if (isMobile) {
2229           url += 'desktop.';
2230           url+=domain;
2231           url += '/';
2232           url += getKey (node);
2233           return '<a class="dropdown-item" href="' + url + '">Desktop (Beta)</a>';
2234       }
2235        if (! isMobile) {
2236            url += domain.slice(8);
2237               url += '/';
2238        url += getKey (node);
2239           return '<a class="dropdown-item"  href="' + url + '">Mobile</a>';
2240       }
2241       
2242   }
2243   
2244   function lili(arg){
2245       return '<li>' + arg + '</li>';
2246   }
2247   
2248    function renderProfileOption(){
2249       if (isAuthenticated){
2250              return lili('<a onclick="editProfile()">Profile</a>');
2251       }
2252       else 
2253       {return "";}
2254   }
2255   
2256   
2257   
2258   function renderSubscribeOption(item){
2259      if ( ! isAuthenticated){
2260              return lili('<a href="./register/user">Get Updates</a>');
2261    }
2262    return '';
2263   }
2264   
2265     
2266   
2267    
2268    
2269    
2270    function renderChatButton(item){
2271        if (getClass(item)=="Video"){
2272            return "<button  onclick=\"goToChat('" +
2273         getKey(item)+ 
2274          "')\" type=\”submit\” class=\”btn btn-primary\”>Chat</button> " 
2275         }
2276         return "";
2277    }
2278    
2279    
2280     function renderRegisterButton(item){
2281            return "<button  onclick=goToRegister(\"" +
2282         getKey(item) + 
2283          "\")  type=\”submit\” class=\”btn btn-primary\”>Register</button> " 
2284    }
2285    
2286    
2287     function renderLoginOption(item){
2288            if ( ! isAuthenticated){    
2289                return lili( '<a  href = "./register/web">Login</a> ') 
2290            }
2291      else {
2292                return "";
2293            }
2294    }
  

renderSearchButton

2295    function renderSearchOption(item){
2296     return  lili ('<a  class="text-primary" onclick="showSearch()"> Search</a>') 
2297    }
  

renderthumbs

2298     function getVoteDivName(item,divName){
2299         return  getKey(item) + "-" + divName;
2300     }
2301     
2302      function renderVoteButton(item,thumb,functionName,votes,divName){
2303        if (getClass(item)!="Video"){
2304                  return "";
2305        }
2306            return "<button  onclick=" + functionName +"('" +
2307         getKey(item)+ 
2308          "')  type=\”submit\” class=\”btn btn-primary\”>" + 
2309           "<span style=\"font-size=3em\"" +
2310          "id =\""+ getVoteDivName(item,divName) + "\">" +
2311          votes + "</span>" + thumb + "</button>" 
2312        
2313    }
2314   
2315     function renderThumbs(slide){
2316        if (getClass(slide) != "Video"){
2317                  return "";
2318     }
2319     
2320    
2321           return   renderVoteButton(slide," 👍 ","upVote", getUpVotes(item),"upVotes") +
2322             renderVoteButton(slide," 👎 ","downVote", getDownVotes (item), "downVotes");
2323           
2324   }
2325   
2326            
2327     
2328     
2329    
  

threeMenuButtons

2330    function visible(){
2331        if ( (userId == 'lozinski') || 
2332          (handle == "ChristopherLozinski") || 
2333          (handle == "JustinMorgan") ||
2334          (handle=="WojtekB.")
2335          ){
2336            return true;
2337        }
2338        else{return false;}
2339    }
2340    
2341     function editMenu(slide){
2342        if (! isAuthenticated)
2343        {
2344            return '';
2345        }
2346      
2347        var result ="" +   
2348        ' <span class="dropdown">' +
2349         '<button class="btn btn-primary dropdown-toggle"'+
2350           'type="button"data-toggle="dropdown">Editor'+
2351          '<span class="caret"></span></button>' 
2352        result +=       '<ul class="dropdown-menu dropdown-menu-right">' +
2353       lili("<a href=\"/" + getKey(homeNode) + "/ckedit\">Ck Edit</a> ") +
2354       lili("<a href=\"/" + getKey(homeNode) + "/aceedit\">Ace Edit</a> ") 
2355       if ((getClass(slide) == 'Category')||
2356           (getClass(slide) == 'HomePage'))
2357       {
2358         result +='' + 
2359         lili("<a href=\"/" + getKey(homeNode) + "/addCategory\">Add Category</a> ");
2360         if (userId == 'lozinski') {
2361             result +='' +  
2362             lili("<a href=\"/" + getKey(homeNode) + "/addConference\">Add Conference</a> ") 
2363         }}
2364       if (getClass(slide) == 'Conference'){
2365         result +='' + 
2366           lili("<a href=\"/" + getKey(homeNode) + "/addVideo\">Add Video</a> "); 
2367       }
2368         if (getClass(slide) == 'Conference'){
2369         result +='' + 
2370           lili("<a href=\"/" + getKey(homeNode) + "/addLightningTalk\">Add Lightning Talk</a> "); 
2371       }
2372          if (getClass(slide) == 'Video'){
2373       result+= lili("<a href=\"/" + getKey(homeNode) + "/starttime\">Edit Start Time</a>") 
2374       //lili("<a href=\"/" + getKey(homeNode) + "/addComment\">Add Comment</a> ") 
2375       } 
2376       
2377      
2378       
2379              if (getClass(slide) != 'Video'){
2380       result+= lili("<a href=\"/" + getKey(homeNode) + '/manage">Manage</a>') 
2381   }
2382      
2383       result += "</ul>  </span> ";
2384   return result;
2385   }
2386   
2387   
2388    function manageMenu(slide){
2389        if (userId != 'lozinski'){
2390            return '';
2391        }
2392      
2393        var result ="" +   
2394        ' <span class="dropdown">' +
2395         '<button class="btn btn-primary dropdown-toggle"'+
2396           'type="button"data-toggle="dropdown">Manage'+
2397          '<span class="caret"></span></button>' 
2398        result +=       '<ul class="dropdown-menu dropdown-menu-right">' 
2399       if (getClass(slide) != 'Video'){
2400         result +='' + 
2401         lili("<a href=\"/" + getKey(homeNode) + '/manage">Manage</a> ') +
2402          lili("<a href=\"/" + getKey(homeNode) + '/manage2">Manage2</a> ') +
2403         lili('<a href=\"' +'/Products/Root/AllJavascript/search">Scripts</a> ') +
2404         lili("<a href=\"/" + getKey(homeNode) + '/addPlayList">Add PlayList</a> ') +
2405         lili("<a href=\"/" + getKey(homeNode) + '/addChannel">Add Channel</a> ') +
2406         lili("<a href=\"/" + getKey(homeNode) + '/addPyVideo">Add PyVideo</a> ') +
2407         lili("<a href=\"/" + getKey(homeNode) + '/editors">Editors</a> ') +
2408         lili("<a href=\"/" + getKey(homeNode) + '/cachedContent">CachedContent</a> ') 
2409       }
2410       if (getClass(slide) == 'Video'){ 
2411        result+=   lili( " <a href=\"/" + getKey(homeNode) + "/move\">Move</a>") 
2412       }
2413      
2414       result += "</ul>  </span> ";
2415   return result;
2416   }
2417   
2418   
2419    function userMenu(slide){
2420        var result ="" +   
2421        ' <span class="dropdown">' +
2422         '<button class="btn btn-primary dropdown-toggle"'+
2423           'type="button"data-toggle="dropdown">Menu'+
2424          '<span class="caret"></span></button>' 
2425        result +=       '<ul class="dropdown-menu dropdown-menu-right">';
2426         result +=renderViewOption(slide) 
2427        result += renderSearchOption(slide) +
2428        renderSubscribeOption(slide) +
2429        renderServerOptions(slide) +
2430        //renderProfileOption (slide) +
2431        lili ('<a href ="/contact">Contact</a>')+
2432        renderLoginOption(slide) +
2433        renderSignOutOption(slide) +
2434       "</ul>  </span>" 
2435   return result;
2436   }
  

whichview

2437     function changeContent(){
2438      
2439        $('#buttons').html(renderButtons(homeNode));
2440         loadContent(homeNode);
2441            saveCurrentURL();
2442    }
2443    
2444    function wilsonView(){
2445        sortBy='bestWilsonScore';
2446        changeContent();
2447    }
2448    
2449    function myScoreView(){
2450        sortBy = 'bestMyScore';
2451            changeContent();
2452    }
2453    
2454    function mostRecentView(){
2455        sortBy =  'bestMostRecent';
2456           changeContent();
2457    }
2458    
2459     function renderViewOption(item){
2460         if (getClass(item) == "Video"){
2461             return "";
2462         }
2463   
2464     var showWilson  = ' <a  class="text-primary" onclick="wilsonView()"> Best Score</a>' 
2465     var showMyScore = ' <a  class="text-primary" onclick="myScoreView()">Score/Views</a>' 
2466     var showRecent  = ' <a  class="text-primary" onclick="recentView()"> Most Recent</a>' 
2467     
2468     var result ='';
2469    
2470     if (sortBy != 'bestWilsonScore'){
2471         result+= lili(showWilson);
2472     }
2473      if (sortBy != 'bestMyScore'){
2474         result+= lili(showMyScore);
2475     }
2476     if (sortBy != 'bestMostRecent'){
2477         result+= lili(showRecent);
2478     }
2479     return result;
2480    }
2481    
  

news

2482    var news = '' //+
2483    //'<b>Nov 27, 2018</b> &nbsp;' +
2484    //'Here are   <a onclick="displaySlideNamed(\'tensorflow-dev-summit-2018\')">' +
2485    //'the best talks from the TensorFlow Dev Summit.</a>' 
2486    
  

renderContetnDiv

2487    function renderContentDiv(slide){
2488        return "<div id=\"" +
2489        getKey(slide) + "-content" +
2490        '"' +
2491        "></div>"  
2492    }
2493    
2494    function debugIt(){
2495        var i,j;
2496        var result ="<br>" 
2497        for (i=0; i<verticalSlides.length; i++){
2498            if (verticalIndex == i){
2499                     for (j=0; j<horizontalSlides.length; j++){
2500                  result += horizontalSlides[j].key;
2501                  result += " ";
2502                 }
2503            }
2504            else{
2505                result += verticalSlides[i].key;
2506            }
2507            result += "<br> \n";
2508        }
2509        return result;
2510    }
  

renderMore

2511    function renderExtra(){
2512       return "<br> <br> <br><br><br><br>";
2513   
2514   }
2515   function renderButtons(slide,index){
2516            var result = "" +
2517            "<center>" +
2518            editMenu(slide) +
2519            manageMenu(slide);
2520           result +=   "</center> <br> " 
2521           return result;
2522   }
2523   
2524   function renderFollowTwitter(){
2525       return '<a style = " padding: 20px;" target="_blank" ' +
2526       'href="https://twitter.com/intent/follow?screen_name=' +
2527       twitterId+ '">' +
2528       '<img alt="Follow to receive video recommendations"' +
2529       'target= "_blank"' +
2530       'src="https://pythonlinks.info/static/graphics/twitter-logo.png"' + 
2531       '></a> ' 
2532   }
2533   
2534       
2535   
2536   function renderDescription (slide){
2537            return  '<p style="text-align:left;">' +
2538           getDescription(slide) + 
2539              "</p>" 
2540   }
2541   
  

renderTitleSubTitle

2542     function getSubTitle(slide){
2543         if (getClass(slide)!='Conference'){
2544             return "";
2545         }
2546         var result = '';
2547         var conferenceName;
2548         var preamble = "Talks at " 
2549         if (slide.key == rootName){
2550             preamble = "at ";
2551         }
2552         if (getClass(slide) == 'Category'){
2553             return '';
2554         }   
2555       
2556         conferenceName = getConferenceName(slide);//WASgetSearchedConferenceName();
2557         if (conferenceName){
2558            result += '<h3 style ="text-align:center;">' + preamble + conferenceName + '</h3>';  
2559         }
2560         return result;
2561    }
2562    
2563    function renderTitle(slide){
2564        var children = '';
2565        var offset = 0;
2566        var siblings =  getSiblings(slide); 
2567        if (siblings.length > 1){
2568           offset = siblings.indexOf(slide);
2569           children = " &nbsp;(" + (offset + 1) + "/" + 
2570                  siblings.length + ')' 
2571         }
2572        var result = '';
2573       
2574        result +=  '<h1  style ="text-align:center;">' + 
2575                      getTitle(slide) +
2576                      children +
2577                     "</h1>" 
2578         return result;
2579    }
2580             
  

socialMediaLinks

2581   // FUNCTION TO GENERATE SOCIAL MEDIA LINKS
2582   
2583   function socialMediaLinks(slide){
2584   
2585   
2586   var title = getTitle(slide);
2587   var encodedTitle = encodeURI(title);
2588   var description = getDescription(slide);
2589   var encodedDescription = encodeURI(description);
2590   var theURL ="https://PythonLinks.info"+ '/' + getKey(slide);
2591   var titlePlusDescription = title + ' ' + description;
2592   var encodedTitlePlusDescription = encodeURI(title + ' ' + description);
2593   var result ="";
2594   
2595   result +='<center><div>' +
2596   //FIRST THE EMAIL LINK
2597    '<a href="mailto:?subject='+ encodedTitle+ '&body=' + 
2598    encodeURI (description + ' ' + theURL) +'"' + 
2599   'class="share-btn email" title="Email">' +
2600   '<i class="fa fa-envelope"></i></a>' 
2601   
2602   
2603   
2604   //NOW THE FACEOOK LINK
2605   result += '<a href="https://www.facebook.com/sharer/sharer.php?u=' +
2606   theURL + '&t=' + encodedTitle +'" class="share-btn facebook"' +
2607   'title="Facebook">' +
2608   '<i class="fab fa-facebook"></i></a>';
2609   
2610   //NOW TWITTER
2611   //result += '<a href="https://twitter.com/share?text=' +
2612   //encodedDescription + '&url=' + theURL +';via=PythonLinks' +  
2613   //'" class="share-btn twitter" title="Twitter">' +
2614   //'<i class="fa fa-twitter"></i></a>' 
2615   
2616   
2617   //AND REDDIT
2618   result += '<a href="http://reddit.com/submit?url=' +
2619   theURL + '&title=' + encodedDescription + '&kind=link" class="share-btn reddit" title="reddit">'+
2620   '<i class="fab fa-reddit"></i></a>';
2621   
2622   //NOW FOR LINKED IN 
2623   result += '<a href="https://www.linkedin.com/shareArticle?url=' +
2624   theURL + '&title=' + encodedTitlePlusDescription +
2625   encodedTitlePlusDescription + 
2626   '" class="share-btn linkedin" title="LinkedIn">' +
2627   '<i class="fab fa-linkedin"></i></a>';
2628   
2629   
2630   result += '</div></center>';
2631   
2632   return result;
2633   }
  

generateLeadersCore

2634    
2635   function generateLeadersOrContentCore(slide){
2636       if (showBest){
2637           return generateLeaders(slide);
2638       }
2639       else{
2640           return generateContent(slide);
2641       }
2642   }
  

generateContents

2643     
2644        function generateContent(rootNode){
2645         if ((getClass(rootNode) === 'Video')){
2646                return "";
2647            }
2648            result ='<div style="margin:auto; max-width: 100vh;">';
2649          
2650           result += generateContentCore(rootNode) 
2651           result +='</div>';
2652           return result;
2653        }        
2654        
2655        
2656        
2657   function tableHead(subTitle){
2658           return    "<tr>" +
2659           TD (' <a href = "https://www.evanmiller.org/how-not-to-sort-by-average-rating.html">Score</a>')+
2660                    
2661                     TD (' Votes ') +
2662                     TD(subTitle ) +
2663                     "</tr>";
2664   }     
2665   function videosInThisFolder(node){
2666       var videos=[];
2667       var video;
2668       var children = node.children;
2669       if (! hasChildren(node)){
2670           return videos;
2671       }
2672       var arrayLength = node.children.length;
2673       for (var i = 0; i < arrayLength; i++) {
2674           video=children[i];
2675           if (getClass(video) =='Video'){
2676           
2677           video.data.ratio =  score (video);        
2678           videos.push(video);
2679           }
2680       }
2681   return videos;
2682   }
2683   
2684   function childCategoriesRow (rootNode){
2685         var text = '<tr><td colspan="4">';
2686              text += renderChildCategories(rootNode);
2687              text += "</td></tr>" 
2688         return text;
2689   }
2690              
2691              
2692           
2693       function generateContentCore(rootNode){
2694   
2695       
2696             var text='';
2697             var i;
2698             var sortedArray = videosInThisFolder(rootNode);
2699             var sortedArrayLength = sortedArray.length;
2700             if (sortedArrayLength === 0){
2701                 return renderChildCategories(rootNode);
2702             }
2703             
2704             text += renderChildCategories(rootNode);
2705             text += "<h3>Videos in this Folder</h3>";
2706             text +='<table class="table table-striped" style = "padding:20px;">';
2707             text += "<thead>";   
2708            
2709             text += tableHead("Talk Title");
2710             text += "</thead>";
2711             text += "<tbody>";          
2712             for (i = sortedArrayLength-1; i >= 0; i--) { 
2713                     item=sortedArray[i];
2714                     text += '<tr>' 
2715                     text+= '<td align="left"> ' + 
2716                     item.data.ratio.toFixed(0) +
2717                     '% </td>';
2718                    
2719                     votes = '';
2720                     if (getUpVotes(item) >0){
2721                        votes += getUpVotes(item) + '👍 ';
2722                     }
2723                     if (getDownVotes(item) >0){
2724                        votes+= '<br>' + getDownVotes(item) + '👎 ';
2725                     }
2726                     text+= TD(' ' + votes + ' ');
2727                     
2728                     text+=TD(' ' + generateLink(item));
2729                     
2730                 
2731                     text +='</tr>'  
2732                     }
2733           
2734               text += "</tbody>"; 
2735              text +='</table>'     
2736               //text += '</div>';   //TABLE-RESPONSIVE
2737   
2738   
2739              return text;
2740              }
2741        
2742   
2743       
  

generateLeaders

2744    
2745        function generateLeaders(rootNode){
2746         if ((getClass(rootNode) === 'Video')){
2747                return "";
2748            }
2749       
2750            
2751            // FOR THE LIST OF CHANNELS DO NOT SHOW THE BEST VIDEOS
2752            if (getKey(rootNode) == 'conferences-and-channels'){
2753                   return generateContent(rootNode);
2754            }
2755             
2756             if (getKey(rootNode) == 'devops'){
2757                   return generateContent(rootNode);
2758            }
2759       
2760          if (getKey(rootNode) == 'data-science-software'){
2761                   return generateContent(rootNode);
2762            }
2763       
2764            
2765            var result ="";
2766            var text2 =  generateLeadersCore(rootNode) 
2767            result +=  "<center>" +  text2 + "</center> <br>";
2768         
2769            return result;
2770        }
2771        
2772        
2773                 //FIRST GENERATES A SORTED LIST OF ITEMS IN THIS BRANCH OF THE TREE
2774           //AND THEN PRINTS OUT THE SORTED HISTORY 
2775       function generateLeadersCore(rootNode){
2776             var text='';
2777             var i;
2778             var subTitle = " Best Videos Overall ";
2779             var sortedArray = generateTop10(rootNode);
2780          
2781             var sortedArrayLength = sortedArray.length;
2782             if (sortedArrayLength === 0 ){
2783                 return "";
2784                 }
2785            
2786           text +='<table class="table table-striped" style = "padding:20px;">';
2787                   
2788             text += "<tr>" +
2789                   TD (' <a href = "https://www.evanmiller.org/how-not-to-sort-by-average-rating.html">Score</a>')+
2790   
2791                     TD (' Votes ') 
2792                     if (getKey(rootNode) != rootName){
2793                         subTitle = ' Best Videos on ' + getTitle(rootNode);
2794                     }
2795                     
2796               text+=  TD( sortedArrayLength.toString() + subTitle ) +
2797                 
2798                     
2799                     "</tr>";
2800             for (i = sortedArrayLength-1; i >= 0; i--) { 
2801                     item=sortedArray[i];
2802                     text += '<tr>' 
2803                     text+= '<td align="left"> ' + 
2804                     item.data.ratio.toFixed(0) +
2805                     '% </td>';
2806                    
2807                     votes = '';
2808                     if (getUpVotes(item) >0){
2809                        votes += getUpVotes(item) + '👍 ';
2810                     }
2811                     if (getDownVotes(item) >0){
2812                        votes+= '<br>' + getDownVotes(item) + '👎 ';
2813                     }
2814                     text+= TD(' ' + votes + ' ');
2815                     
2816                     text+=TD(' ' + generateLink(item));
2817                     
2818                 
2819                     text +='</tr>'  
2820                     }
2821            
2822              text +='</table>'     
2823            
2824   
2825              return text;
2826              }
2827        
2828   
2829       
  

generateTop10Array

2830    
2831       function generateTop10(rootNode){
2832           if ( (getClass(rootNode) == 'Category') 
2833           &&
2834               (! hasChildren(rootNode))
2835           ){
2836               return "";
2837           }
2838           if (rootNode.data.hasOwnProperty('best')){
2839                 return rootNode.data.best;
2840             }
2841            var item;
2842             var i;
2843             var rootNodeChildren=rootNode.children;
2844            
2845             //IF IT IS A CONFERENCE, Just show the 
2846             //Conference Videos
2847             if (getClass(rootNode)=='Conference'){
2848                  var allVideos = [];
2849                 getConferenceVideos(getKey(rootNode),root,allVideos);
2850               rootNodeChildren =  allVideos;
2851             }
2852             sortedTree=buckets.BSTree(compare);
2853             for (k=0;k<rootNodeChildren.length;k++){
2854                 var aChild = rootNodeChildren[k];
2855                 sortNodes(aChild);
2856             }
2857                 
2858             var sortedArray=sortedTree.toArray();
2859             
2860             //FOR CONFERENCES SHOW ALL THE TALKS, SORTED.
2861             if (getClass (rootNode)== 'Conference'){
2862                 return sortedArray;
2863             }
2864             
2865             //OTHERWISE RETURN THE FIRST 10 ITEMS
2866             var sortedArrayLength=sortedArray.length;
2867             var lowerBound=sortedArrayLength-10;
2868             if (lowerBound<0) lowerBound=0;
2869         
2870             
2871             var shortArray = sortedArray.slice(lowerBound);
2872             rootNode.data.best = shortArray;  
2873             return shortArray;
2874        }
2875    
2876        
2877     
2878      
  

getConferenceVideos

2879    function getConferenceVideos(conferenceName,aNode,allVideos){
2880            var i;
2881            var thisNode;
2882            var children;
2883             if ((getClass(aNode) =="Video")&&
2884                (getConferenceKey(aNode)==conferenceName)){
2885                allVideos.push(aNode);
2886            }
2887            //COULD RETURN IF IT IS A VIDEO.
2888            
2889            if (! hasChildren(aNode)){
2890                return;
2891            }
2892            children=aNode.children;
2893             
2894             if (children && children.length){
2895                for (i in children){
2896                   thisNode=children[i];
2897                   getConferenceVideos(conferenceName,thisNode,allVideos);
2898                }
2899             }
2900        }
  

historyScripts

2901   function generateLink(item){
2902       return "<a onClick=\"displaySlideNamed('" + 
2903       getKey(item) + 
2904       "')\">"+ 
2905       getTitle(item)+"</a>";
2906   }
2907   
2908   function openWindow (key){
2909       window.open("/" + key);
2910   }
2911   
2912      //TO GENERATE HISTORY HAVE TO SORT ITEMS BY EDIT DATE
2913   //THIS COMPARE FUNCTION DOES THAT
2914   function compareLOG(a,b){
2915   
2916       var result = compare2(a,b);
2917       var aRatio = a.data.ratio; 
2918       var bRatio = b.data.ratio;
2919       return result;
2920   }
2921   function compare(a, b) {
2922     var aRatio = a.data.ratio; 
2923     var bRatio = b.data.ratio;
2924       
2925    if (aRatio < bRatio) {
2926       return -1;
2927    } if (aRatio > bRatio) {
2928       return 1;
2929    }
2930     //SAME Ratio, CHECK Totals
2931    if (Number(getUpVotes(a)) < Number(getUpVotes(b))) {
2932       return -1;
2933    } if (Number(getUpVotes(a)) > Number(getUpVotes(b))) {
2934       return 1;
2935    }
2936    
2937    //SAME Ratio, same upVotes, CHECK URLS
2938    if (getKey(a) < getKey(b)) {
2939       return 1;
2940    } if (getKey(a) > getKey(b)) {
2941       return -1;
2942    }
2943    
2944    // a must be equal to b
2945    
2946    return 0; 
2947   }
2948   
2949   var sortedTree;
2950   
2951   function TD(text){
2952       return '<td>' + text + '</td>';
2953   }
2954   
2955   
2956   //THIS FUNCTION ACTUALLY CREATES A BINARY TREE OF NODES SORTED BY EDIT DATE
2957   //USED TO GENERATE HISTORY
2958   function sortNodes(aNode){
2959        
2960            //IF IT IS A VIDEO
2961            if (getClass(aNode) =="Video" ){
2962                aNode.data.ratio = score(aNode);
2963                sortedTree.add(aNode);
2964                return;
2965            }
2966            //NOT A VIDEO?  CARRY ON
2967           var i;
2968            //SETS THE RATIO
2969            var children=aNode.children;
2970             
2971             if (children && children.length){
2972                for (i in children){
2973                   var thisNode=children[i];
2974                   sortNodes(thisNode);
2975                }
2976             }
2977                 
2978        }
  

score

2979   //THIS IS THE WILSON SCORE
2980    function  aScore (positiveScore, total) {
2981   
2982       if (total === 0) {
2983           return {
2984               left: 0,
2985               right: 0
2986           };
2987       }
2988   
2989       // phat is the proportion of successes
2990       // in a Bernoulli trial process
2991       const phat = positiveScore / total;
2992   
2993       // z is 1-alpha/2 percentile of a standard
2994       // normal distribution for error alpha=5%
2995       const z = 1.96;
2996   
2997       // implement the algorithm
2998       // (http://goo.gl/kgmV3g)
2999       const a = phat + z * z / (2 * total);
3000       const b = z * Math.sqrt((phat * (1 - phat) + z * z / (4 * total)) / total);
3001       const c = 1 + z * z / total;
3002   
3003       return {
3004           left: (a - b) / c,
3005           right: (a + b) / c
3006       };
3007   }
3008   
3009   
3010   function score (aNode){
3011         var upVotes, downVotes, total,wilsonScore;
3012         upVotes=Number(getUpVotes(aNode));
3013         downVotes= Number(getDownVotes(aNode));
3014         totalVotes = upVotes + downVotes;
3015        
3016         wilson =   aScore (upVotes, totalVotes);
3017         return wilson.left* 100;
3018         
3019   }
  

renderChildCategories

3020    function renderChildLink(item){
3021       return "<a onClick=\"slideDownTo('" + 
3022       getKey(item) + 
3023       "')\">"+ 
3024       getTitle(item)+"</a>" +
3025       ' (' + getBranchSize(item) + ')';
3026   }
3027   
3028   function slideDownTo(key){
3029       var nextNode=tree.getNodeByKey(key);
3030       var index = homeNode.children.indexOf(nextNode);
3031       homeNode.previousChildIndex=index;
3032       setSlides(homeNode);
3033       reload();
3034       $.fn.fullpage.moveSectionDown();
3035   
3036   } 
3037   
3038   
3039   function displayChildCategories (slide){
3040       var child;
3041       var  children = slide.children;
3042       if ((! children) || (children.length===0)){
3043           return "";
3044       }
3045       var result = "<h3>Child Categories</h3><br>";
3046       if (getKey(slide) == 'conferences-and-channels'){
3047           result = "<h3>Conferences Indexed</h3><br>";
3048       }
3049       
3050       for (var i in slide.children) {
3051           child = slide.children[i];
3052            if (getClass(child) != "Video"){
3053               result += renderChildLink(child) + "<br><br>";
3054          }
3055           
3056       }
3057       //result += "</div>";
3058       return result;
3059       
3060   }
3061   
3062   
3063   //IF ANY CHILD IS A CONFERENCE OR CATEGORY
3064   //DISPLAY THE LIST
3065   function renderChildCategories(slide){
3066       var child;
3067       if (slide.children === null){
3068           return "";
3069       }
3070           if (slide.children.length === 0){
3071           return "";
3072       }
3073       for (var i in slide.children) {
3074            child = slide.children[i];
3075          if (getClass(child) != "Video"){
3076              return  displayChildCategories(slide);
3077          }
3078       }
3079        return "";  
3080   }
3081   
  

renderSlide

3082     var showBest = true;
3083    
3084   
3085   
3086   function generateLeadersOrContent(slide){
3087        return '<div  id = "bestContent' + 
3088        '-' + getKey(slide) + '" >'+
3089             generateLeadersOrContentCore(slide) +
3090         "</div>";
3091   }
3092    var isMobile = true;
3093    function renderSlide(slide,index){ 
3094            var result = "" 
3095             
3096             result += template(
3097                 {'showSearch':showSearch,
3098                  'node':slide,
3099                  'upVote':upVote,
3100                  'downVote': downVote,
3101                  'getClass': getClass,
3102                  'renderServerOptions': renderServerOptions,
3103                  'isAuthenticated': isAuthenticated, 
3104                  'twitterLinkFront': twitterLinkFront,
3105                  'twitterLinkBack': twitterLinkBack, 
3106                   'myVideoMenu': myVideoMenu,
3107                  'userId': userId,
3108                  'twitterId': twitterId
3109             });
3110     
3111           result += addArrows(slide);
3112   
3113           result +='<div style = "padding-left: 20px">';
3114   
3115                result +=  breadcrumbs(slide,index) 
3116            
3117            result += renderTitle(slide) +
3118            "<br>" //+
3119           getSubTitle(slide) 
3120       
3121         
3122           if ((getClass(slide) == 'Video')){
3123               
3124               var conference = getConference(slide);
3125               result += '<h5 class="text-primary" style = "margin-left:50%">-'+ 
3126               '<a onClick="displaySlideNamed(' + "'" + getConferenceKey(slide) + "')" +'">'+ 
3127               getTitle(conference) +'</a></h5>';
3128           }
3129   
3130           
3131            if (isMobile){
3132              result+= "<center>";
3133            }
3134              result +=renderDescription (slide);
3135           if (isMobile){
3136   
3137               result+= "</center>";
3138           }
3139         result += '<div id="buttons">';
3140               result += renderButtons(slide,index);
3141          result +='</div>';
3142           result += renderContentDiv(slide) 
3143        
3144        
3145       result += socialMediaLinks(slide);
3146       result += renderExtra();  
3147       result += '</div>';
3148       return result; 
3149       }
  

rootname

3150    var rootName='';  
3151    var mobileJson ='';
3152    var deskTopJson ='';
3153    var domain= window.location.hostname.toLowerCase();
3154    var searchURL = "/search";
3155    var contactURL = "/contact";
3156    var twitterId ="PythonLinks";
3157    
3158    if (domain=='pythonlinks.info'){
3159       mobileJson='https://json.PythonLinks.info/python/json';
3160       rootName ='python';
3161       twitterId ="PythonLinks";
3162   }
3163   
3164   else if (domain=='desktop.pythonlinks.info'){
3165       deskTopJson= 'https://json.PythonLinks.info/python/tree.json';
3166       rootName ='python';
3167       twitterId ="PythonLinks";
3168   }
3169   
3170   else if (domain=='climatevideos.info'){
3171       debugger;
3172       mobileJson='https://json.PythonLinks.info/climate-change/json';
3173       rootName='climate-change';
3174       contactURL = "/contact2";
3175       searchURL = "/search2";
3176        twitterId ="ChangeClimate";
3177   }
3178   
3179   
3180   else if (domain=='desktop.climatevideos.info'){
3181       deskTopJson='https://json.PythonLinks.info/climate-change/tree.json';
3182       rootName='climate-change';
3183       contactURL = "/contact2";
3184       searchURL = "/search2";
3185        twitterId ="ChangeClimate";
3186   }
3187   
3188   
3189   else if (domain=='forestwiki.com'){
3190       mobileJson='/forestwiki/json';
3191       rootName='forestwiki';
3192       contactURL = "/golang-contact";
3193       searchURL = "/golang-search";
3194       twitterId ="forestwiki";
3195   }
3196   
3197   
3198   else if (domain=='cloud-native.pl'){
3199       mobileJson='/golang/json';
3200       rootName='golang';
3201       contactURL = "/golang-contact";
3202       searchURL = "/golang-search";
3203       twitterId ="PythonLinks";
3204   }
3205   
3206   else if (domain=='desktop.cloud-native.com'){
3207       deskTopJson='https://json.PythonLinks.info/golang/tree.json';
3208       rootName='golang';
3209       contactURL = "/golang-contact";
3210       searchURL = "/golang-search";
3211       twitterId ="PythonLinks";
3212   }
3213   
3214   
3215   
3216   else if (domain=='desktop.forestwiki.com'){
3217       deskTopJson='https://json.PythonLinks.info/forestwiki/tree.json';
3218       rootName='forestwiki';
3219       contactURL = "/golang-contact";
3220       searchURL = "/golang-search";
3221       twitterId ="forestwiki";
3222   }
3223   
3224   
3225   else if (domain=='dev.pythonlinks.info'){
3226       rootName ='python';
3227       mobileJson='/python/json';
3228       deskTopJson='/python/tree.json';
3229       var twitterId ="PythonLinks";   
3230       //rootName ='climate-change';
3231       //mobileJson='/climate-change/json';
3232       //deskTopJson='/climate-change/tree.json';
3233       //searchURL = "/search2";
3234       //contactURL = "/contact2";
3235   
3236   }
3237    
3238   
  

callbackVisit

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

childrenFunctions

3289   
3290   function getSiblings (item){
3291       if (isRoot(item)){
3292           return [item];
3293       }
3294       return item.parent.children;
3295   }
3296       
  

parent-functions

3297    function pageTitle(node){
3298       var nodeParents= parents(node);
3299       var arrayLength = nodeParents.length;
3300       var result =[];
3301       for (var i = 0; i < arrayLength; i++) {
3302          result.push (getTitle(nodeParents[i]));
3303       }
3304        return result.join(' -> ');
3305       
3306   }
3307   
3308   //Starting with parent
3309   function reversedParents(node){
3310          var result=[];
3311        while (true){
3312            result.push(node);
3313            if (isRoot(node)){
3314                return result;
3315            }
3316            node=node.parent;
3317        }
3318   }
3319   
3320   //Starting with first ancenstor
3321   function parents(node){
3322       return reversedParents(node).reverse();
3323   }
  

pushpopstate

3324   function addSortBy(){
3325       return '?sortBy=' + sortBy;
3326   }
3327   function saveCurrentURL(){
3328      
3329       var domain= window.location.hostname;
3330       var location=getKey(homeNode);
3331   
3332       var url="https://" + domain + "/" + location + addSortBy();
3333       
3334   
3335       var title=getTitle(homeNode);
3336       var data={key:getKey(homeNode)};
3337    
3338    
3339   history.pushState(data, title, url);
3340       
3341   }
3342   
3343   function saveCurrentURLAndSearch(){
3344      
3345       var domain= window.location.hostname;
3346       var location=homeNode.key;
3347       var search=window.location.search;
3348   
3349       var url="https://" + domain + "/" + location;
3350       if (search){
3351           url+= search;
3352       }
3353       var title=homeNode.title;
3354       var data={key:homeNode.key};
3355    
3356    
3357   history.pushState(data, title, url);
3358       
3359   }
  

regexp

3360     
3361   
3362   //FUNCTION TO SPLIT A SEARCH STRING INTO W LIST OF WORDS, 
3363   // AND THEN CREATRE A LIST OF REGEXP
3364   // FROM IT.  This is needed to implement "SearchTermm1" and "SearchTerm2"
3365   
3366   
3367    function _escapeRegex(str){
3368    /*jshint regexdash:true */
3369    return (str + "").replace(/([.?*+\^\$\[\]\\(){}|-])/g, "\\$1");
3370   }
3371   
3372   
3373   //FUNCTION TO SPLIT A SEARCH STRING INTO W LIST OF WORDS, 
3374   // AND THEN CREATRE A LIST OF REGEXP
3375   // FROM IT.  This is needed to implement "SearchTermm1" and "SearchTerm2"
3376   
3377   function getRegxpArray(match) {
3378                   if (match=="all"){
3379                       return [new RegExp(".")];
3380                   }
3381                   if (match=="All"){
3382                       return [new RegExp(".")];
3383                   }
3384            var regexpArray=[]; 
3385            var i;
3386            var input;
3387            var k=0;
3388            var subStrings=match.split(/\s+/i);
3389            for (i in subStrings){
3390                if (subStrings[i]!==""){
3391                   input= _escapeRegex(subStrings[i]);
3392                   regexpArray[k]=new RegExp(input, "i");
3393                   k++;
3394                }
3395            }
3396            return regexpArray;
3397    }
3398   
  

resizeText

3399    function resizeText(multiplier) {
3400     if (document.body.style.fontSize === "") {
3401       document.body.style.fontSize = "2.0em";
3402     }
3403     document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + "em";
3404     localRebuild();
3405        
3406    }
3407   
  

scaleVideos

3408   function resizeVideos( arg1, arg2, containerQuery){
3409     //should be "body"
3410   // Find all YouTube videos
3411   var $allVideos = $("iframe[src^='https://www.youtube.com']"),
3412   
3413       // The element that is fluid width
3414       $fluidEl = $(containerQuery);
3415   
3416   // Figure out and save aspect ratio for each video
3417   $allVideos.each(function() {
3418   
3419     $(this)
3420       .data('aspectRatio', this.height / this.width)
3421       .data('width', this.width)
3422   
3423       // and remove the hard coded width/height
3424       .removeAttr('height')
3425       .removeAttr('width');
3426   
3427   });
3428   
3429   function resize () {
3430   
3431     var newWidth = $fluidEl.width();
3432     if (newWidth > 800){
3433         newWidth = 0.8 * newWidth;
3434     } 
3435     // Resize all videos according to their own aspect ratio
3436     $allVideos.each(function() {
3437   
3438       var $el = $(this);
3439       $el
3440         .width(newWidth)
3441         .height(newWidth * $el.data('aspectRatio'));
3442   
3443     });
3444     localRebuild();
3445    
3446   // Kick off one resize to fix all videos on page load
3447   }
3448   resize();
3449   }
  

setChildINdex

3450    //onSLideLeave
3451   function setChildIndex(){
3452           if (homeNode.parent!== null)
3453              homeNode.parent.previousChildIndex = getSiblings(homeNode).indexOf(homeNode);
3454   }
  

setTitle

3455    function setTitle(node){
3456        if (node.data.class == 'Video'){
3457            node.title =  score(node).toFixed(0) + '% ' 
3458            + node.data.upVotes + '👍 ' + 
3459            node.data.downVotes + '👎 '+
3460            node.title;
3461        }
3462        return true;
3463    }
  

showRedirect

3464    function showRedirect(node){
3465        if ((isMobile && (node==landingPage))) {
3466              var url = "https://" +
3467              "desktop." + domain + '/' + getKey(node);
3468              return '<center> <a href="' + url +
3469              '">Desktop Site (Beta)</a></center>';
3470        }
3471           return "";
3472    }
  

signout

3473    function renderSignOutOption(){
3474       if (isAuthenticated){
3475              return lili( '<a class="text-primary" onclick="signOut()">Sign Out</a>');
3476       }
3477       else 
3478       {return "";}
3479   }
3480   
3481   function signOut(){
3482       window.location.href = "/" + getKey(homeNode) + "/logout2";
3483   }
  

vote

3484   function registerVoter(){
3485        window.location.href="/" + homeNode.key + "/register/voter";
3486   }
3487   
3488   
3489   function recordVotes(responseText,itemName){
3490       
3491       var result = responseText.split (" , ");
3492        document.getElementById(itemName + "-" + "upVotes").innerHTML = result [0]; 
3493         document.getElementById(itemName + "-" + "downVotes").innerHTML = result [1];
3494   }
3495   
3496   function upVote(){
3497       var itemName = getKey(homeNode);
3498   
3499       if (isAuthenticated){
3500          var xhttp = new XMLHttpRequest();
3501          xhttp.onreadystatechange = function() {
3502              if (this.readyState == 4 && this.status == 200) {
3503                  recordVotes(this.responseText,itemName);
3504              }
3505          };
3506          var url = "/" + homeNode.key + "/upVote";
3507          xhttp.open("GET", url, true);
3508          xhttp.send();
3509          return;
3510          }
3511       registerVoter();
3512   }
3513   
3514   function downVote(){
3515         var itemName = getKey(homeNode);
3516   
3517       if (isAuthenticated){
3518           var xhttp = new XMLHttpRequest();
3519           xhttp.onreadystatechange = function() {
3520              if (this.readyState == 4 && this.status == 200) {
3521                 recordVotes(this.responseText,itemName);
3522              }
3523           };
3524           var url = "/" + homeNode.key + "/downVote";
3525           xhttp.open("GET", url, true);
3526           xhttp.send();
3527           return;
3528        }
3529            registerVoter();
3530   
3531   }
3532   
3533   
3534   
3535   
  

twitterImage

3536      var showBest = true;
3537    
3538    function renderTwitterImage(){
3539         return '' + 
3540         '<img src="https://pythonlinks.info//static/graphics/Tweet.png" '+ 
3541         'alt="I wanted to add users tweets to my website, but Twitter'+
3542         'would then track every page that you visit.  Not good for privacy. ' +
3543         'So if you are kind enough to tweet comments, I will link to them."'+
3544          'style = "max-width:100%;" onload="localRebuild">' +
3545           '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Privacy Protecting Tweet Image';
3546   
3547        
3548    }
3549            
3550   function showIntroductoryVideo(slide){         
3551           if ((slide == landingPage)&&isMobile&& (rootName == 'python')) 
3552                {    
3553           return '<h3 style = "text-align:center;">'+
3554           '<a onClick="displaySlideNamed('+
3555           "'introductory-video')"+ '">' + 
3556           'Introductory Video</a></h3>'+
3557           '<p style="text-align:center">' + news + "</p>"; 
3558           }
3559           else {
3560          return '';
3561           }
3562   } 
3563   
3564   function generateLeadersOrContent(slide){
3565        return '<div  id = "bestContent' + 
3566        '-' + getKey(slide) + '" >'+
3567             generateLeadersOrContentCore(slide) +
3568         "</div>";
3569   }
  

twitterlink

3570   function twitterLinkFront(){
3571       var result ="";
3572       var base = 'https://twitter.com/intent/follow?screen_name=';
3573       result +=  '<a href="' + base +
3574       twitterId +
3575       '">' 
3576       return result;
3577   }
3578   function twitterLinkBack(){
3579       return  '</a>';
3580   }
3581