All The Javascript So it is searchable.

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    
  

traverse

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

ChildFunctions

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

SlideUpOrDown

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

createSlides

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

renderSlides

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

renderVerticalSlide

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

clickNode

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

get

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

getHorizontalAndVerticalSlides

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

getPage

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

hasChildren

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

initialize

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

initializeslides

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

leave

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

loadContent

1175   function errorF( jqXHR, textStatus, errorThrown ){
1176       console.log ("AJAX ERROR", jqXHR, textStatus, errorThrown );
1177            $.fn.fullpage.reBuild();
1178   
1179   }
1180   
1181   
1182   //after slide load
1183   function loadContent(){
1184       if (homeNode === undefined){
1185           return;
1186       }
1187       var url = "/" + getKey(homeNode) + "/content";
1188       divName = "#" + getKey(homeNode) + "-content";
1189         $.ajax({url: url, cache: false, 
1190         //error: errorF,
1191         success: function(result){
1192           $(divName).html(result);
1193           resizeVideos(0,0,"body");
1194        localRebuild();
1195       }
1196         });
1197       
1198   }
1199    
1200   
1201      
  

moveMoveCommands

1202   function buildFullPage(){
1203             $('#fullpage').fullpage(fullPageArguments);
1204   }
1205   
1206   function moveDown(){
1207       setDownSlides();
1208       restartFullPage();
1209       reloadCore();
1210       $.fn.fullpage.moveSectionDown();
1211   }
1212   
1213    function moveUp(){
1214        setUpSlides();
1215      restartFullPage();
1216       reloadCore();
1217       $.fn.fullpage.moveSectionUp();
1218        
1219   
1220    }
1221   
1222   
1223   
1224   function moveToLast(numberOfSiblings){
1225        return;
1226   }
1227   
1228   function moveToFirst(){
1229   return ;
1230       
1231   }
1232   
1233   function moveRight(){
1234       setRightSlides();
1235      restartFullPage();
1236       reloadCore();
1237       $.fn.fullpage.moveSlideRight();
1238   
1239   }
1240   
1241   function moveLeft(){
1242        setLeftSlides();
1243      restartFullPage();
1244       reloadCore();
1245       $.fn.fullpage.moveSlideLeft();
1246        
1247   }
  

moveToMobile

1248   function MoveTo(){
1249       
1250   }
  

pinchToZoom

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

reload

1288   var fullPage = false;
1289   var newSlides;
1290   function reload(){
1291      
1292       setChildIndex();
1293        //setSlides(homeNode);
1294        setAndReload();
1295   }     
1296   
1297   function loadOneSlide(){
1298       
1299       verticalSlides=[homeNode];
1300       horizontalSlides=[homeNode];
1301       setAndReload();
1302   }
1303   
1304   function setAndReload(){ 
1305          setSingleSlide();
1306          reloadCore();
1307           destroyFullPage();
1308          }
1309          
1310   function reloadCore(){       
1311          replaceFullPage();
1312          destroyFullPage();
1313          restartFullPage();
1314   }        
1315   
1316   
1317       
1318   function replaceFullPage(){   
1319            document.title=pageTitle(homeNode);
1320        $('#fullpage div').addClass("old");
1321        newSlides = renderVerticalSlides(homeNode);
1322        $(".old").remove();
1323        $('#fullpage').append(newSlides);
1324   }
1325   
1326   function destroyFullPage(){
1327         if (fullPage){
1328          $.fn.fullpage.destroy('all');   
1329        }
1330   }     
1331   
1332   function restartFullPage(){
1333        fullPage = true;
1334        $('#fullpage').fullpage(fullPageArguments);
1335   }
1336   
  

MyFilter

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

applyFilter

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

branchSize

1477     var branchSize;
1478    function getBranchSize(node){
1479       if (node.match || node.unmatchedParent){
1480           return node.subMatchCount;
1481       }
1482       else {
1483           branchSize=node.data.branchSize;
1484           branchSize = parseInt(branchSize);
1485           branchSize = branchSize.toString();
1486           return branchSize;
1487           
1488       }
1489   }
1490   
  

collapseChildren

1491    function collapseChildren(node){
1492       var index;
1493       var item;
1494       var children=node.children;
1495       if((node.isFolder())&&node.hasChildren()){
1496           node.setExpanded(false, {noAnimation: true, noEvents: true, scrollIntoView: false});
1497           for (index=0;index<children.length;index++){
1498               item=children[index]
1499               if (item.isExpanded()){
1500                   collapseChildren(item); 
1501               }
1502           }
1503       }
1504   }
  

gui-functions

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

search.js

1587         var callbackCount=0;
1588   var count;
1589   var currentSearchString="";
1590   var oldSearchString="";
1591   
1592   function cleanUp(){
1593        var rootNode=$("#tree").fancytree("getTree").getRootNode();
1594           rootNode.render(true);
1595           $("button#btnResetSearch").attr("disabled", false);
1596        $("span#matches").text("(" + count + " matches)");
1597        $.fn.fullpage.reBuild();
1598   
1599   }
1600   
1601   function reSearch(filterFunction){
1602        var value=$("input[name=search]").val();
1603        if (currentSearchString!=value){
1604             $("input[name=search]").trigger("keyup");
1605   
1606           }
1607        else{
1608   
1609               cleanUp();
1610           }
1611   $.fn.fullpage.reBuild();
1612   
1613    }
1614     
1615   
1616    
1617     
  

setScrolling

1618      function setScrolling(){
1619       if (homeNode.data.class == 'Chat'){
1620         $.fn.fullpage.setAutoScrolling(false);
1621         $.fn.fullpage.setFitToSection(false);
1622       }
1623       else{
1624            $.fn.fullpage.setAutoScrolling(true);
1625            $.fn.fullpage.setFitToSection(true);  
1626   
1627       }
1628   }
1629   
  

ViewCount

1630    function getViewCount(aNode){
1631       if (isMobile){
1632           return aNode.data.viewCount;
1633       }
1634       return aNode.viewCount;
1635   }
1636   
1637   function score (aNode){
1638         var upVotes, downVotes, viewCount, ratio;
1639         upVotes=Number(getUpVotes(aNode));
1640         downVotes= Number(getDownVotes(aNode));
1641         viewCount=Number(getViewCount(aNode));
1642         ratio = (upVotes - (5 * downVotes))/viewCount;
1643         ratio = ratio * 10000;
1644         return ratio;
1645   }
  

Arrows

1646   function oneArrow(direction,x,y,visible, onClick){
1647       var result=''+
1648       '<i style="font-size: 1em; position:relative;' +
1649       'top:' + y + 'em;'+
1650       'left:' + x + 'em;'+
1651       'opacity:';
1652       if (visible){
1653           result +='1.0';
1654       }
1655       else{
1656           result += '0.5';
1657       }
1658       result +=
1659       ';" ' +
1660       'class="fa fa-arrow-circle-' + direction +
1661       '"'+
1662       'onClick="' + onClick + '"' + 
1663       '></i>';
1664       return result;
1665   }
1666   
1667   function addArrows(slide){
1668       if (isMobile){
1669           return arrowsMobile(slide);
1670       }
1671       else{
1672           return arrowsDesktop(slide);
1673       }
1674   }
1675   
1676   function addArrows(slide){
1677       if (isMobile){
1678           return arrowsMobile(slide);
1679       }
1680       else{
1681           return arrowsDesktop(slide);
1682       }
1683   }
1684   function arrowsDesktop(slide){
1685     var result = "" +
1686   '<div style = "z-index: 3; font-size: 3em; letter-spacing: 0px;'+
1687   'position:absolute;  right:0px; top:0">' +
1688   arrows(slide)+
1689   '</div>';  
1690   return result;
1691   }
1692   
1693   function arrowsMobile(slide){
1694     if (! isMobile){
1695         return "";
1696     }
1697     var result = "" +
1698   '<div style = "z-index: 1; font-size: 3em; letter-spacing: 0px;position:fixed;' +
1699   ' right: 0em; top:50vh">' +
1700   arrows(slide)+
1701   '</div>';  
1702   return result;
1703   }
1704   
1705   function arrows(slide){
1706     
1707       
1708   var result = "" +
1709   
1710   oneArrow('left',0,1,canGoLeft(slide),'goLeft()') +
1711   oneArrow('up',0,0,canGoUp(slide),'goUp()') +
1712   oneArrow('right',0,1,canGoRight(slide),'goRight()') +
1713   oneArrow('down',-1.72,2,canGoDown(slide),'goDown()') ;
1714   
1715   return result;
1716   }
  

arrowKeys

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

arrows

1823    function footer(item,index){
1824        var result = "";
1825                        
1826        if (hasChildren(item)){
1827            result += " &uarr; ";
1828        }
1829           if (isRoot(item) !== null){
1830            result += " &darr; ";
1831        }
1832           if (index > 0){
1833            result += " &rarr; ";
1834        }
1835           if (! isRoot(item)){
1836            result += " &larr; ";
1837        }
1838        return result;
1839    }
  

breadcrumbs

1840    function breadcrumbs(node,index){
1841         var width = $( window ).width();
1842        var result="";
1843        var offset;
1844        var items=parents(node);
1845        var length = items.length;
1846        var step;
1847        result+= "<div style = \"text-align:left; \">";
1848       for (step = 0; step < length; step++) {
1849           item=items[step];
1850           result += '<div style = "margin-left:' + (step * 1).toString() + 'em">' +
1851            getTitle(item).link('/' + getKey(item)) ;
1852            if (width > 500){
1853                result +=  ' &nbsp;(' + getBranchSize(item) + ')' ;
1854            }
1855            result +=  '</div>';
1856           }
1857        result += "</div>";
1858        return result;
1859    }
1860    
  

generateTwitter

1861    function getHashTag(node){
1862       if (isMobile) {
1863           return node.data.hashTag;
1864       }
1865       else {
1866           return node.hashTag;
1867       }
1868   }
1869    function renderTweetForm(node){
1870        if (node != homeNode){
1871            return "";
1872        }
1873        var url =  'https://PythonLinks.info/'+ getKey(node) ;
1874       result = "";
1875       result += '<div class="form-group" style = "padding: 20px;">' ;
1876       
1877       result += '<form id="messageForm"  action="https://twitter.com/share" method="get">' +
1878        '<label for="comment">Comment on Twitter about:</label><br>' +
1879       '<input type="hidden" name="source" value="tweetbutton"> ' +
1880       '<textarea id="tweet" name= "text"  rows="5"' +
1881       'class="form-control">' + node.title + '\n' +
1882        url  + 
1883       ' via @PythonLinks ' +
1884        getHashTag(node) + ' '  +
1885        '</textarea>' +
1886       '<button type="submit"  formtarget="_blank" class="btn btn-primary">Tweet</button> &nbsp;' +
1887        '<span id="charactersRemaining"></span>' +
1888        '</form>' ;
1889        
1890       result += '</div>' ;
1891       
1892       return result;
1893   }
1894   
1895   function commentType(node){
1896       if (getClass(node) == 'Conference'){
1897           return 'If you are kind enough to say what you thought about this conference,' + 
1898           'your comments will show up here.';
1899       }
1900           if (getClass(node) == 'Video'){
1901               return 'If you are kind enough to review this video after you watch it,' +
1902               'your review on twitter will be posted here';
1903           }
1904       if (getClass(node) == 'Category'){
1905           return 'If you are kind enough to give me your professional advice on the organization '+
1906           'of this category, I will either make the changes, or post your ocmment here';
1907       }
1908       return '';
1909   
1910   }
1911   
1912   function renderTweet(tweetId){
1913       var result = '<blockquote class="twitter-tweet" data-lang="en"><p lang="en"' +
1914        'dir="ltr">&quot;Data Science Without Borders&quot; is the overall best '+
1915       '<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;' +
1916       ' The Best of 710 Python Conference Videos (@PythonLinks) ' +
1917       '<a href="https://twitter.com/PythonLinks/status/1048163192080404480?ref_src=twsrc%5Etfw">'+
1918       'October 5, 2018</a></blockquote>' +
1919       '<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>';
1920        return result;
1921   }
1922    /*
1923   function notUsed(){
1924     if ('showHashTag' in node){
1925         result +='<a href="https://twitter.com/search?q=' + 
1926         node.hashTag +
1927         '">See the comments on twitter.</a>';
1928     }
1929     else{
1930         result += "<p>If you would be so kind as to post the "+
1931         "first comment on this page, I will go ahead and add a link to the unique hashtag "+
1932         "timeline on Twitter</p>";
1933     }
1934   }
1935     */
1936   
1937   var el;                                                    
1938   
1939   function countCharacters(e) {                                    
1940     var textEntered, countRemaining, counter;          
1941     textEntered = document.getElementById('tweet').value;  
1942     counter = (280 - (textEntered.length));
1943     countRemaining = document.getElementById('charactersRemaining'); 
1944            countRemaining.textContent = ""; 
1945   
1946       if (counter < 20){
1947           countRemaining.textContent = counter.toString() + 
1948           ' Characters Remaining';
1949       }
1950   
1951   }
1952   
1953   function postRender(){
1954       el = document.getElementById('tweet');                   
1955   el.addEventListener('keyup', countCharacters, false);
1956   countCharacters();
1957   }
1958   
  

buttonFunctions

1959    
1960   function editProfile(){
1961       window.location.href = "/person/" + userId + "/editPrincipal";
1962   }
1963   
1964   
1965   function editProfile(){
1966       window.location.href = "/person/" + userId + "/editPrincipal";
1967   }
1968   
1969    function changeView(){
1970           showBest = ! showBest;
1971   
1972        var label = "Best View";
1973        if (showBest){
1974            label = "List View";
1975        }
1976      
1977       $("#viewButton").html(label);
1978       var result = generateLeadersOrContentCore(homeNode);
1979       $("#bestContent" + '-' + getKey(homeNode)).html(result);
1980            localRebuild();   
1981   
1982       }
  

renderButtons

1983   function renderServerOptions(node){
1984       var url ="https://";
1985       debugger;
1986       if (isMobile) {
1987           url += 'desktop.';
1988           url+=domain;
1989           url += '/';
1990           url += getKey (node);
1991           return lili("" +
1992           '<a href="' + url + '">Desktop</a>');
1993       }
1994        if (! isMobile) {
1995            url += domain.slice(8);
1996               url += '/';
1997        url += getKey (node);
1998           return lili("" +
1999           '<a href="' + url + '">Mobile</a>');
2000       }
2001       
2002   }
2003   
2004   function lili(arg){
2005       return '<li>' + arg + '</li>';
2006   }
2007   
2008    function renderProfileOption(){
2009       if (isAuthenticated){
2010              return lili('<a onclick="editProfile()">Profile</a>');
2011       }
2012       else 
2013       {return "";}
2014   }
2015   
2016   
2017   
2018   function renderSubscribeOption(item){
2019      if ( ! isAuthenticated){
2020              return lili('<a href="./register/user">Get Updates</a>');
2021    }
2022    return '';
2023   }
2024   
2025     
2026     function renderViewOption(item){
2027         if (getClass(item) == "Video"){
2028             return "";
2029         }
2030     var label = "List View";
2031     if (showBest === false){
2032         label = "Best View";
2033     }
2034     var stuff = ' <a  id="viewButton" ' +
2035     "onclick=\"changeView()\" " +
2036     ">"+ label+ "</a>" ;
2037     return lili (stuff);
2038    }
2039    
2040    
2041    
2042    
2043    function renderChatButton(item){
2044        if (getClass(item)=="Video"){
2045            return "<button  onclick=\"goToChat('" +
2046         getKey(item)+ 
2047          "')\" type=\”submit\” class=\”btn btn-primary\”>Chat</button> " ;
2048         }
2049         return "";
2050    }
2051    
2052    
2053     function renderRegisterButton(item){
2054            return "<button  onclick=goToRegister(\"" +
2055         getKey(item) + 
2056          "\")  type=\”submit\” class=\”btn btn-primary\”>Register</button> " ;
2057    }
2058    
2059    
2060     function renderLoginOption(item){
2061            if ( ! isAuthenticated){    
2062                return lili( '<a  href = "./register/web">Login</a> ') ;
2063            }
2064      else {
2065                return "";
2066            }
2067    }
  

renderSearchButton

2068    function renderSearchOption(item){
2069     return  lili ('<a onclick="showSearch()"> Search</a>') ;
2070    }
  

renderthumbs

2071     function getVoteDivName(item,divName){
2072         return  getKey(item) + "-" + divName;
2073     }
2074     
2075      function renderVoteButton(item,thumb,functionName,votes,divName){
2076        if (getClass(item)!="Video"){
2077                  return "";
2078        }
2079            return "<button  onclick=" + functionName +"('" +
2080         getKey(item)+ 
2081          "')  type=\”submit\” class=\”btn btn-primary\”>" + 
2082           "<span style=\"font-size=3em\"" +
2083          "id =\""+ getVoteDivName(item,divName) + "\">" +
2084          votes + "</span>" + thumb + "</button>" ;
2085        
2086    }
2087   
2088     function renderThumbs(slide){
2089        if (getClass(slide) != "Video"){
2090                  return "";
2091     }
2092     
2093    
2094           return   renderVoteButton(slide," 👍 ","upVote", getUpVotes(item),"upVotes") +
2095             renderVoteButton(slide," 👎 ","downVote", getDownVotes (item), "downVotes");
2096           
2097   }
2098   
2099            
2100     
2101     
2102    
  

threeMenuButtons

2103    function visible(){
2104        if ( ((userId == 'lozinski') || (handle == "ChristopherLozinski"))){
2105            return true;
2106        }
2107        else{return false;}
2108    }
2109    
2110     function editMenu(slide){
2111        if (! visible())
2112        {
2113            return '';
2114        }
2115      
2116        var result ="" +   
2117        ' <span class="dropdown">' +
2118         '<button class="btn btn-primary dropdown-toggle"'+
2119           'type="button"data-toggle="dropdown">Editor'+
2120          '<span class="caret"></span></button>' ;
2121        result +=       '<ul class="dropdown-menu dropdown-menu-right">' +
2122       lili("<a href=\"/" + getKey(homeNode) + "/ckedit\">Ck Edit</a> ") +
2123       lili("<a href=\"/" + getKey(homeNode) + "/aceedit\">Ace Edit</a> ") ;
2124       if (getClass(slide) == 'Category'){
2125         result +='' + 
2126         lili("<a href=\"/" + getKey(homeNode) + "/addCategory\">Add Category</a> ") +
2127         lili("<a href=\"/" + getKey(homeNode) + "/addConference\">Add Conference</a> ") ;
2128         }
2129       if (getClass(slide) != 'Vudeo'){
2130         result +='' + 
2131               lili("<a href=\"/" + getKey(homeNode) + "/addVideo\">Add Video</a> ") ;
2132       }
2133          if (getClass(slide) == 'Video'){
2134       result+= lili("<a href=\"/" + getKey(homeNode) + "/starttime\">Edit Start Time</a>") ;
2135       //lili("<a href=\"/" + getKey(homeNode) + "/addComment\">Add Comment</a> ") ;
2136       } 
2137              if (getClass(slide) != 'Video'){
2138       result+= lili("<a href=\"/" + getKey(homeNode) + '/manage">Manage</a>') ;
2139   }
2140      
2141       result += "</ul>  </span> ";
2142   return result;
2143   }
2144   
2145   
2146    function manageMenu(slide){
2147        if (userId != 'lozinski'){
2148            return '';
2149        }
2150      
2151        var result ="" +   
2152        ' <span class="dropdown">' +
2153         '<button class="btn btn-primary dropdown-toggle"'+
2154           'type="button"data-toggle="dropdown">Manage'+
2155          '<span class="caret"></span></button>' ;
2156        result +=       '<ul class="dropdown-menu dropdown-menu-right">' ;
2157       if (getClass(slide) == 'Category'){
2158         result +='' + 
2159         lili("<a href=\"/" + getKey(homeNode) + '/manage2">Manage2</a> ') +
2160         lili('<a href=\"' +'/Products/Root/AllJavascript/search">Scripts</a> ') +
2161         lili("<a href=\"/" + getKey(homeNode) + '/addPlayList">Add PlayList</a> ') +
2162         lili("<a href=\"/" + getKey(homeNode) + '/addChannel">Add Channel</a> ') +
2163         lili("<a href=\"/" + getKey(homeNode) + '/addPyVideo">Add PyVideo</a> ') +
2164         lili("<a href=\"/" + getKey(homeNode) + '/editors">Editors</a> ') +
2165         lili("<a href=\"/" + getKey(homeNode) + '/cachedContent">CachedContent</a> ') ;
2166       }
2167       if (getClass(slide) == 'Video'){ 
2168        result+=   lili( " <a href=\"/" + getKey(homeNode) + "/move\">Move</a>") ;
2169       }
2170      
2171       result += "</ul>  </span> ";
2172   return result;
2173   }
2174   
2175   
2176    function userMenu(slide){
2177        var result ="" +   
2178        ' <span class="dropdown">' +
2179         '<button class="btn btn-primary dropdown-toggle"'+
2180           'type="button"data-toggle="dropdown">Menu'+
2181          '<span class="caret"></span></button>' ;
2182        result +=       '<ul class="dropdown-menu dropdown-menu-right">';
2183         result +=renderViewOption(slide) +
2184        renderSearchOption(slide) +
2185        renderSubscribeOption(slide) +
2186        renderServerOptions(slide) +
2187        //renderProfileOption (slide) +
2188        lili ('<a href ="/contact">Contact</a>')+
2189        renderLoginOption(slide) +
2190        renderSignOutOption(slide) +
2191       "</ul>  </span>" ;
2192   return result;
2193   }
  

news

2194    var news = '' ;//+
2195    //'<b>Nov 27, 2018</b> &nbsp;' +
2196    //'Here are   <a onclick="displaySlideNamed(\'tensorflow-dev-summit-2018\')">' +
2197    //'the best talks from the TensorFlow Dev Summit.</a>' ;
2198    
  

renderContetnDiv

2199    function renderContentDiv(slide){
2200        return "<div id=\"" +
2201        getKey(slide) + "-content" +
2202        '"' +
2203        "></div>"  ;
2204    }
2205    
2206    function debugIt(){
2207        var i,j;
2208        var result ="<br>" ;
2209        for (i=0; i<verticalSlides.length; i++){
2210            if (verticalIndex == i){
2211                     for (j=0; j<horizontalSlides.length; j++){
2212                  result += horizontalSlides[j].key;
2213                  result += " ";
2214                 }
2215            }
2216            else{
2217                result += verticalSlides[i].key;
2218            }
2219            result += "<br> \n";
2220        }
2221        return result;
2222    }
  

renderMore

2223    function renderFontResize(){
2224       return  '<span style = "font-size:200%">'+
2225       ' &nbsp; '+
2226       '<a onclick="resizeText(-1)">a</a>' +
2227       ' &nbsp; ' +
2228         '<a onclick="resizeText(1)">A</a>' +
2229         '</span>';
2230   }
2231    function renderExtra(){
2232       return "<br> <br> <br><br><br><br>";
2233   
2234   }
2235   function renderButtons(slide,index){
2236            var result = "" +
2237            "<center>" +
2238             renderThumbs(slide) ;
2239            result += "" +
2240            userMenu(slide) +
2241            editMenu(slide) +
2242            manageMenu(slide);
2243           result +=   renderFollowTwitter() +
2244           renderFontResize() +
2245           "</center> <br> " ;
2246           return result;
2247   }
2248   
2249   function renderFollowTwitter(){
2250       return '<a style = " padding: 20px;" target="_blank" ' +
2251       'href="https://twitter.com/intent/follow?screen_name=' +
2252       twitterId+ '">' +
2253       '<img alt="Follow to receive video recommendations"' +
2254       'target= "_blank"' +
2255       'src="https://pythonlinks.info/static/graphics/twitter-logo.png"' + 
2256       '></a> ' ;
2257   }
2258   
2259       
2260   
2261   function renderDescription (slide){
2262            return  "<p>" +
2263           getDescription(slide) + 
2264              "</p>" ;
2265   }
2266   
  

renderTitleSubTitle

2267     function getSubTitle(slide){
2268         if (getClass(slide)!='Conference'){
2269             return "";
2270         }
2271         var result = '';
2272         var conferenceName;
2273         var preamble = "Talks at " ;
2274         if (slide.key == rootName){
2275             preamble = "at ";
2276         }
2277         if (getClass(slide) == 'Category'){
2278             return '';
2279         }   
2280       
2281         conferenceName = getConferenceName(slide);//WASgetSearchedConferenceName();
2282         if (conferenceName){
2283            result += '<h3 style ="text-align:center;">' + preamble + conferenceName + '</h3>';  
2284         }
2285         return result;
2286    }
2287    
2288    function renderTitle(slide){
2289        var children = '';
2290        var offset = 0;
2291        var siblings =  getSiblings(slide); 
2292        if (siblings.length > 1){
2293           offset = siblings.indexOf(slide);
2294           children = " &nbsp;(" + (offset + 1) + "/" + 
2295                  siblings.length + ')' ;
2296         }
2297        var result = '';
2298       
2299        result +=  '<h1  style ="text-align:center;">' + 
2300                      getTitle(slide) +
2301                      children +
2302                     "</h1>" ;
2303         return result;
2304    }
2305             
  

socialMediaLinks

2306   // FUNCTION TO GENERATE SOCIAL MEDIA LINKS
2307   
2308   function socialMediaLinks(slide){
2309   
2310   
2311   var title = getTitle(slide);
2312   var encodedTitle = encodeURI(title);
2313   var description = getDescription(slide);
2314   var encodedDescription = encodeURI(description);
2315   var theURL ="https://PythonLinks.info"+ '/' + getKey(slide);
2316   var titlePlusDescription = title + ' ' + description;
2317   var encodedTitlePlusDescription = encodeURI(title + ' ' + description);
2318   var result ="";
2319   
2320   result +='<center><div>' +
2321   //FIRST THE EMAIL LINK
2322    '<a href="mailto:?subject='+ encodedTitle+ '&body=' + 
2323    encodeURI (description + ' ' + theURL) +'"' + 
2324   'class="share-btn email" title="Email">' +
2325   '<i class="fa fa-envelope"></i></a>' ;
2326   
2327   
2328   
2329   //NOW THE FACEOOK LINK
2330   result += '<a href="https://www.facebook.com/sharer/sharer.php?u=' +
2331   theURL + '&t=' + encodedTitle +'" class="share-btn facebook"' +
2332   'title="Facebook">' +
2333   '<i class="fa fa-facebook"></i></a>';
2334   
2335   //NOW TWITTER
2336   //result += '<a href="https://twitter.com/share?text=' +
2337   //encodedDescription + '&url=' + theURL +';via=PythonLinks' +  
2338   //'" class="share-btn twitter" title="Twitter">' +
2339   //'<i class="fa fa-twitter"></i></a>' ;
2340   
2341   
2342   //AND REDDIT
2343   result += '<a href="http://reddit.com/submit?url=' +
2344   theURL + '&title=' + encodedDescription + '&kind=link" class="share-btn reddit" title="reddit">'+
2345   '<i class="fa fa-reddit"></i></a>';
2346   
2347   //NOW FOR LINKED IN 
2348   result += '<a href="https://www.linkedin.com/shareArticle?url=' +
2349   theURL + '&title=' + encodedTitlePlusDescription +
2350   encodedTitlePlusDescription + 
2351   '" class="share-btn linkedin" title="LinkedIn">' +
2352   '<i class="fa fa-linkedin"></i></a>';
2353   
2354   
2355   result += '</div></center>';
2356   
2357   return result;
2358   }
  

generateLeadersCore

2359    
2360   function generateLeadersOrContentCore(slide){
2361       if (showBest){
2362           return generateLeaders(slide);
2363       }
2364       else{
2365           return generateContent(slide);
2366       }
2367   }
  

generateContents

2368     
2369        function generateContent(rootNode){
2370         if ((getClass(rootNode) === 'Video')){
2371                return "";
2372            }
2373            result ='<div style="margin:auto; max-width: 100vh;">';
2374          
2375           result += generateContentCore(rootNode) ;
2376           result +='</div>';
2377           return result;
2378        }        
2379        
2380        
2381        
2382   function tableHead(subTitle){
2383           return    "<tr>" +
2384           TD (' <a href = "https://www.evanmiller.org/how-not-to-sort-by-average-rating.html">Score</a>')+
2385                    
2386                     TD (' Votes ') +
2387                     TD(subTitle ) +
2388                     "</tr>";
2389   }     
2390   function videosInThisFolder(node){
2391       var videos=[];
2392       var video;
2393       var children = node.children;
2394       if (! hasChildren(node)){
2395           return videos;
2396       }
2397       var arrayLength = node.children.length;
2398       for (var i = 0; i < arrayLength; i++) {
2399           video=children[i];
2400           if (getClass(video) =='Video'){
2401           
2402           video.data.ratio =  score (video);        
2403           videos.push(video);
2404           }
2405       }
2406   return videos;
2407   }
2408   
2409   function childCategoriesRow (rootNode){
2410         var text = '<tr><td colspan="4">';
2411              text += renderChildCategories(rootNode);
2412              text += "</td></tr>" ;
2413         return text;
2414   }
2415              
2416              
2417           
2418       function generateContentCore(rootNode){
2419   
2420       
2421             var text='';
2422             var i;
2423             var sortedArray = videosInThisFolder(rootNode);
2424             var sortedArrayLength = sortedArray.length;
2425             if (sortedArrayLength === 0){
2426                 return renderChildCategories(rootNode);
2427             }
2428             
2429             text += renderChildCategories(rootNode);
2430             text += "<h3>Videos in this Folder</h3>";
2431             text +='<table class="table table-striped" style = "padding:20px;">';
2432             text += "<thead>";   
2433            
2434             text += tableHead("Talk Title");
2435             text += "</thead>";
2436             text += "<tbody>";          
2437             for (i = sortedArrayLength-1; i >= 0; i--) { 
2438                     item=sortedArray[i];
2439                     text += '<tr>' ;
2440                     text+= '<td align="left"> ' + 
2441                     item.data.ratio.toFixed(0) +
2442                     '% </td>';
2443                    
2444                     votes = '';
2445                     if (getUpVotes(item) >0){
2446                        votes += getUpVotes(item) + '👍 ';
2447                     }
2448                     if (getDownVotes(item) >0){
2449                        votes+= '<br>' + getDownVotes(item) + '👎 ';
2450                     }
2451                     text+= TD(' ' + votes + ' ');
2452                     
2453                     text+=TD(' ' + generateLink(item));
2454                     
2455                 
2456                     text +='</tr>'  ;
2457                     }
2458           
2459               text += "</tbody>"; 
2460              text +='</table>'   ;  
2461               //text += '</div>';   //TABLE-RESPONSIVE
2462   
2463   
2464              return text;
2465              }
2466        
2467   
2468       
  

generateLeaders

2469    
2470        function generateLeaders(rootNode){
2471         if ((getClass(rootNode) === 'Video')){
2472                return "";
2473            }
2474       
2475            
2476            // FOR THE LIST OF CHANNELS DO NOT SHOW THE BEST VIDEOS
2477            if (getKey(rootNode) == 'conferences-and-channels'){
2478                   return generateContent(rootNode);
2479            }
2480             
2481             if (getKey(rootNode) == 'devops'){
2482                   return generateContent(rootNode);
2483            }
2484       
2485          if (getKey(rootNode) == 'data-science-software'){
2486                   return generateContent(rootNode);
2487            }
2488       
2489            
2490            var result ="";
2491            var text2 =  generateLeadersCore(rootNode) ;
2492            result +=  "<center>" +  text2 + "</center> <br>";
2493         
2494            return result;
2495        }
2496        
2497        
2498                 //FIRST GENERATES A SORTED LIST OF ITEMS IN THIS BRANCH OF THE TREE
2499           //AND THEN PRINTS OUT THE SORTED HISTORY 
2500       function generateLeadersCore(rootNode){
2501             var text='';
2502             var i;
2503             var subTitle = " Best Videos Overall ";
2504             var sortedArray = generateTop10(rootNode);
2505          
2506             var sortedArrayLength = sortedArray.length;
2507             if (sortedArrayLength === 0 ){
2508                 return "";
2509                 }
2510            
2511           text +='<table class="table table-striped" style = "padding:20px;">';
2512                   
2513             text += "<tr>" +
2514                   TD (' <a href = "https://www.evanmiller.org/how-not-to-sort-by-average-rating.html">Score</a>')+
2515   
2516                     TD (' Votes ') ;
2517                     if (getKey(rootNode) != rootName){
2518                         subTitle = ' Best Videos on ' + getTitle(rootNode);
2519                     }
2520                     
2521               text+=  TD( sortedArrayLength.toString() + subTitle ) +
2522                 
2523                     
2524                     "</tr>";
2525             for (i = sortedArrayLength-1; i >= 0; i--) { 
2526                     item=sortedArray[i];
2527                     text += '<tr>' ;
2528                     text+= '<td align="left"> ' + 
2529                     item.data.ratio.toFixed(0) +
2530                     '% </td>';
2531                    
2532                     votes = '';
2533                     if (getUpVotes(item) >0){
2534                        votes += getUpVotes(item) + '👍 ';
2535                     }
2536                     if (getDownVotes(item) >0){
2537                        votes+= '<br>' + getDownVotes(item) + '👎 ';
2538                     }
2539                     text+= TD(' ' + votes + ' ');
2540                     
2541                     text+=TD(' ' + generateLink(item));
2542                     
2543                 
2544                     text +='</tr>'  ;
2545                     }
2546            
2547              text +='</table>'   ;  
2548            
2549   
2550              return text;
2551              }
2552        
2553   
2554       
  

generateTop10Array

2555    
2556       function generateTop10(rootNode){
2557           if ( (getClass(rootNode) == 'Category') 
2558           &&
2559               (! hasChildren(rootNode))
2560           ){
2561               return "";
2562           }
2563           if (rootNode.data.hasOwnProperty('best')){
2564                 return rootNode.data.best;
2565             }
2566            var item;
2567             var i;
2568             var rootNodeChildren=rootNode.children;
2569            
2570             //IF IT IS A CONFERENCE, Just show the 
2571             //Conference Videos
2572             if (getClass(rootNode)=='Conference'){
2573                  var allVideos = [];
2574                 getConferenceVideos(getKey(rootNode),root,allVideos);
2575               rootNodeChildren =  allVideos;
2576             }
2577             sortedTree=buckets.BSTree(compare);
2578             for (k=0;k<rootNodeChildren.length;k++){
2579                 var aChild = rootNodeChildren[k];
2580                 sortNodes(aChild);
2581             }
2582                 
2583             var sortedArray=sortedTree.toArray();
2584             
2585             //FOR CONFERENCES SHOW ALL THE TALKS, SORTED.
2586             if (getClass (rootNode)== 'Conference'){
2587                 return sortedArray;
2588             }
2589             
2590             //OTHERWISE RETURN THE FIRST 10 ITEMS
2591             var sortedArrayLength=sortedArray.length;
2592             var lowerBound=sortedArrayLength-10;
2593             if (lowerBound<0) lowerBound=0;
2594         
2595             
2596             var shortArray = sortedArray.slice(lowerBound);
2597             rootNode.data.best = shortArray;  
2598             return shortArray;
2599        }
2600    
2601        
2602     
2603      
  

getConferenceVideos

2604    function getConferenceVideos(conferenceName,aNode,allVideos){
2605            var i;
2606            var thisNode;
2607            var children;
2608             if ((getClass(aNode) =="Video")&&
2609                (getConferenceKey(aNode)==conferenceName)){
2610                allVideos.push(aNode);
2611            }
2612            //COULD RETURN IF IT IS A VIDEO.
2613            
2614            if (! hasChildren(aNode)){
2615                return;
2616            }
2617            children=aNode.children;
2618             
2619             if (children && children.length){
2620                for (i in children){
2621                   thisNode=children[i];
2622                   getConferenceVideos(conferenceName,thisNode,allVideos);
2623                }
2624             }
2625        }
  

historyScripts

2626   function generateLink(item){
2627       return "<a onClick=\"displaySlideNamed('" + 
2628       getKey(item) + 
2629       "')\">"+ 
2630       getTitle(item)+"</a>";
2631   }
2632   
2633   function openWindow (key){
2634       window.open("/" + key);
2635   }
2636   
2637      //TO GENERATE HISTORY HAVE TO SORT ITEMS BY EDIT DATE
2638   //THIS COMPARE FUNCTION DOES THAT
2639   function compareLOG(a,b){
2640   
2641       var result = compare2(a,b);
2642       var aRatio = a.data.ratio; 
2643       var bRatio = b.data.ratio;
2644       return result;
2645   }
2646   function compare(a, b) {
2647     var aRatio = a.data.ratio; 
2648     var bRatio = b.data.ratio;
2649       
2650    if (aRatio < bRatio) {
2651       return -1;
2652    } if (aRatio > bRatio) {
2653       return 1;
2654    }
2655     //SAME Ratio, CHECK Totals
2656    if (Number(getUpVotes(a)) < Number(getUpVotes(b))) {
2657       return -1;
2658    } if (Number(getUpVotes(a)) > Number(getUpVotes(b))) {
2659       return 1;
2660    }
2661    
2662    //SAME Ratio, same upVotes, CHECK URLS
2663    if (getKey(a) < getKey(b)) {
2664       return 1;
2665    } if (getKey(a) > getKey(b)) {
2666       return -1;
2667    }
2668    
2669    // a must be equal to b
2670    
2671    return 0; 
2672   }
2673   
2674   var sortedTree;
2675   
2676   function TD(text){
2677       return '<td>' + text + '</td>';
2678   }
2679   
2680   
2681   //THIS FUNCTION ACTUALLY CREATES A BINARY TREE OF NODES SORTED BY EDIT DATE
2682   //USED TO GENERATE HISTORY
2683   function sortNodes(aNode){
2684        
2685            //IF IT IS A VIDEO
2686            if (getClass(aNode) =="Video" ){
2687                aNode.data.ratio = score(aNode);
2688                sortedTree.add(aNode);
2689                return;
2690            }
2691            //NOT A VIDEO?  CARRY ON
2692           var i;
2693            //SETS THE RATIO
2694            var children=aNode.children;
2695             
2696             if (children && children.length){
2697                for (i in children){
2698                   var thisNode=children[i];
2699                   sortNodes(thisNode);
2700                }
2701             }
2702                 
2703        }
  

score

2704   //THIS IS THE WILSON SCORE
2705    function  aScore (positiveScore, total) {
2706   
2707       if (total === 0) {
2708           return {
2709               left: 0,
2710               right: 0
2711           };
2712       }
2713   
2714       // phat is the proportion of successes
2715       // in a Bernoulli trial process
2716       const phat = positiveScore / total;
2717   
2718       // z is 1-alpha/2 percentile of a standard
2719       // normal distribution for error alpha=5%
2720       const z = 1.96;
2721   
2722       // implement the algorithm
2723       // (http://goo.gl/kgmV3g)
2724       const a = phat + z * z / (2 * total);
2725       const b = z * Math.sqrt((phat * (1 - phat) + z * z / (4 * total)) / total);
2726       const c = 1 + z * z / total;
2727   
2728       return {
2729           left: (a - b) / c,
2730           right: (a + b) / c
2731       };
2732   }
2733   
2734   
2735   function score (aNode){
2736         var upVotes, downVotes, total,wilsonScore;
2737         upVotes=Number(getUpVotes(aNode));
2738         downVotes= Number(getDownVotes(aNode));
2739         totalVotes = upVotes + downVotes;
2740        
2741         wilson =   aScore (upVotes, totalVotes);
2742         return wilson.left* 100;
2743         
2744   }
  

renderChildCategories

2745    function renderChildLink(item){
2746       return "<a onClick=\"slideDownTo('" + 
2747       getKey(item) + 
2748       "')\">"+ 
2749       getTitle(item)+"</a>" +
2750       ' (' + getBranchSize(item) + ')';
2751   }
2752   
2753   function slideDownTo(key){
2754       var nextNode=tree.getNodeByKey(key);
2755       var index = homeNode.children.indexOf(nextNode);
2756       homeNode.previousChildIndex=index;
2757       setSlides(homeNode);
2758       reload();
2759       $.fn.fullpage.moveSectionDown();
2760   
2761   } 
2762   
2763   
2764   function displayChildCategories (slide){
2765       var child;
2766       var  children = slide.children;
2767       if ((! children) || (children.length===0)){
2768           return "";
2769       }
2770       var result = "<h3>Child Categories</h3><br>";
2771       if (getKey(slide) == 'conferences-and-channels'){
2772           result = "<h3>Conferences Indexed</h3><br>";
2773       }
2774       
2775       for (var i in slide.children) {
2776           child = slide.children[i];
2777            if (getClass(child) != "Video"){
2778               result += renderChildLink(child) + "<br><br>";
2779          }
2780           
2781       }
2782       //result += "</div>";
2783       return result;
2784       
2785   }
2786   
2787   
2788   //IF ANY CHILD IS A CONFERENCE OR CATEGORY
2789   //DISPLAY THE LIST
2790   function renderChildCategories(slide){
2791       var child;
2792       if (slide.children === null){
2793           return "";
2794       }
2795           if (slide.children.length === 0){
2796           return "";
2797       }
2798       for (var i in slide.children) {
2799            child = slide.children[i];
2800          if (getClass(child) != "Video"){
2801              return  displayChildCategories(slide);
2802          }
2803       }
2804        return "";  
2805   }
2806   
  

renderSlide

2807     var showBest = true;
2808    
2809   
2810   
2811   function generateLeadersOrContent(slide){
2812        return '<div  id = "bestContent' + 
2813        '-' + getKey(slide) + '" >'+
2814             generateLeadersOrContentCore(slide) +
2815         "</div>";
2816   }
2817    var isMobile = true;
2818    function renderSlide(slide,index){ 
2819            var result = "" ;
2820             result +="<br>";
2821                result += showRedirect(slide);
2822           result += showIntroductoryVideo(slide);
2823           result += addArrows(slide);
2824   
2825   
2826                result +=  breadcrumbs(slide,index) ;
2827            
2828            result += renderTitle(slide) +
2829            "<br>" ;//+
2830           getSubTitle(slide) ;
2831       
2832         
2833           if ((getClass(slide) == 'Video')){
2834               
2835               var conference = getConference(slide);
2836               result += '<h5 style = "margin-left:50%">-'+ 
2837               '<a onClick="displaySlideNamed(' + "'" + getConferenceKey(slide) + "')" +'">'+ 
2838               getTitle(conference) +'</a></h5>';
2839           }
2840   
2841           
2842            if (isMobile){
2843              result+= "<center>";
2844            }
2845              result +=renderDescription (slide);
2846           if (isMobile){
2847   
2848               result+= "</center>";
2849           }
2850        
2851                result += renderButtons(slide,index);
2852          
2853           if ((getClass(slide) != 'Video')){
2854               //WAS renderContentDiv(slide);
2855                  result += generateLeadersOrContent(slide) ;
2856           }
2857           result += renderContentDiv(slide) ;
2858           //if (homeNode ==slide){
2859           //         result += renderTweetForm(slide);
2860           //}
2861        //if (homeNode == landingPage){
2862        //  result +=renderTwitterImage();
2863        //}
2864       result += socialMediaLinks(slide);
2865       result += renderExtra();  
2866       return result; 
2867       }
  

rootname

2868    var rootName='';  
2869    var mobileJson ='';
2870    var deskTopJson ='';
2871    var domain= window.location.hostname.toLowerCase();
2872    var searchURL = "/search";
2873    var contactURL = "/contact";
2874    var twitterId ="PythonLinks";
2875    
2876    if (domain=='pythonlinks.info'){
2877       mobileJson='https://json.PythonLinks.info/python/json';
2878       rootName ='python';
2879   }
2880   
2881   else if (domain=='desktop.pythonlinks.info'){
2882       deskTopJson= 'https://json.PythonLinks.info/python/tree.json';
2883       rootName ='python';
2884   }
2885   
2886   else if (domain=='climatevideos.info'){
2887       mobileJson='https://json.PythonLinks.info/climate-change/json';
2888       rootName='climate-change';
2889       contactURL = "/contact2";
2890       searchURL = "/search2";
2891        twitterId ="ClimateTV2";
2892   }
2893   
2894   
2895   else if (domain=='desktop.climatevideos.info'){
2896       deskTopJson='https://json.PythonLinks.info/climate-change/tree.json';
2897       rootName='climate-change';
2898       contactURL = "/contact2";
2899       searchURL = "/search2";
2900       twitterId ="ClimateTV2";
2901   }
2902   
2903   //AND NOW FOR GoLang
2904   else if (domain=='golangvideos.pl'){
2905       mobileJson='https://json.PythonLinks.info/golang/json';
2906       rootName='golang';
2907       contactURL = "/golang-contact";
2908       searchURL = "/golang-search";
2909   }
2910   
2911   
2912   else if (domain=='desktop.golangvideos.pl'){
2913       deskTopJson='https://json.PythonLinks.info/golang/tree.json';
2914       rootName='golang';
2915       contactURL = "/golang-contact";
2916       searchURL = "/golang-search";
2917   }
2918   
2919   
2920   else if (domain=='dev.pythonlinks.info'){
2921       //rootName ='python';
2922       //mobileJson='/python/json';
2923       //deskTopJson='/python/tree.json';
2924       
2925       rootName ='climate-change';
2926       mobileJson='/climate-change/json';
2927       deskTopJson='/climate-change/tree.json';
2928       searchURL = "/search2";
2929       contactURL = "/contact2";
2930   
2931   }
2932    
2933   
  

callbackVisit

2934     
2935    /** Call fn(node) for all child nodes.<br>
2936     * Stop iteration, if fn() returns false. Skip current branch, if fn() returns "skip".<br>
2937     * Return false if iteration was stopped.
2938     *
2939     * @param {function} fn the callback function.
2940     *     Return false to stop iteration, return "skip" to skip this node and
2941     *     its children only.
2942     * @param {boolean} [includeSelf=false]
2943     * @returns {boolean}
2944     */
2945     
2946   
2947     function callbackVisit(item,fn, includeSelf) {
2948    var i, 
2949        l,
2950    res = true,
2951    children = item.children;
2952    if( includeSelf === true ) {
2953    res = fn(item);
2954    if( res === false || res === "skip" ){
2955    return res;
2956    }
2957    }
2958    if(children&&(children.length>0)){
2959        callbackCount++;
2960    
2961        aFunction = function(){
2962        for(i=0, l=children.length; i<l; i++){
2963         callbackVisit(children[i],fn, true);
2964        }
2965        callbackCount--;
2966        if (callbackCount===0){
2967                   reSearch(fn);
2968                   }
2969        };   
2970        setTimeout(aFunction, 1);
2971    }
2972   
2973   
2974    
2975     }
2976   
2977   
2978     
2979            
2980            
2981    function callVisit(item,fn) {
2982    return callbackVisit(item.rootNode,fn, false);
2983    }
  

childrenFunctions

2984   
2985   function getSiblings (item){
2986       if (isRoot(item)){
2987           return [item];
2988       }
2989       return item.parent.children;
2990   }
2991       
  

parent-functions

2992    function pageTitle(node){
2993       var nodeParents= parents(node);
2994       var arrayLength = nodeParents.length;
2995       var result =[];
2996       for (var i = 0; i < arrayLength; i++) {
2997          result.push (getTitle(nodeParents[i]));
2998       }
2999        return result.join(' -> ');
3000       
3001   }
3002   
3003   //Starting with parent
3004   function reversedParents(node){
3005          var result=[];
3006        while (true){
3007            result.push(node);
3008            if (isRoot(node)){
3009                return result;
3010            }
3011            node=node.parent;
3012        }
3013   }
3014   
3015   //Starting with first ancenstor
3016   function parents(node){
3017       return reversedParents(node).reverse();
3018   }
  

pushpopstate

3019   function saveCurrentURL(){
3020      
3021       var domain= window.location.hostname;
3022       var location=getKey(homeNode);
3023   
3024       var url="https://" + domain + "/" + location;
3025   
3026       var title=getTitle(homeNode);
3027       var data={key:getKey(homeNode)};
3028    
3029    
3030   history.pushState(data, title, url);
3031       
3032   }
3033   
3034   function saveCurrentURLAndSearch(){
3035      
3036       var domain= window.location.hostname;
3037       var location=homeNode.key;
3038       var search=window.location.search;
3039   
3040       var url="https://" + domain + "/" + location;
3041       if (search){
3042           url+= search;
3043       }
3044       var title=homeNode.title;
3045       var data={key:homeNode.key};
3046    
3047    
3048   history.pushState(data, title, url);
3049       
3050   }
  

regexp

3051     
3052   
3053   //FUNCTION TO SPLIT A SEARCH STRING INTO W LIST OF WORDS, 
3054   // AND THEN CREATRE A LIST OF REGEXP
3055   // FROM IT.  This is needed to implement "SearchTermm1" and "SearchTerm2"
3056   
3057   
3058    function _escapeRegex(str){
3059    /*jshint regexdash:true */
3060    return (str + "").replace(/([.?*+\^\$\[\]\\(){}|-])/g, "\\$1");
3061   }
3062   
3063   
3064   //FUNCTION TO SPLIT A SEARCH STRING INTO W LIST OF WORDS, 
3065   // AND THEN CREATRE A LIST OF REGEXP
3066   // FROM IT.  This is needed to implement "SearchTermm1" and "SearchTerm2"
3067   
3068   function getRegxpArray(match) {
3069                   if (match=="all"){
3070                       return [new RegExp(".")];
3071                   }
3072                   if (match=="All"){
3073                       return [new RegExp(".")];
3074                   }
3075            var regexpArray=[]; 
3076            var i;
3077            var input;
3078            var k=0;
3079            var subStrings=match.split(/\s+/i);
3080            for (i in subStrings){
3081                if (subStrings[i]!==""){
3082                   input= _escapeRegex(subStrings[i]);
3083                   regexpArray[k]=new RegExp(input, "i");
3084                   k++;
3085                }
3086            }
3087            return regexpArray;
3088    }
3089   
  

resizeText

3090    function resizeText(multiplier) {
3091     if (document.body.style.fontSize === "") {
3092       document.body.style.fontSize = "2.0em";
3093     }
3094     document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + "em";
3095     localRebuild();
3096        
3097    }
3098   
  

scaleVideos

3099   function resizeVideos( arg1, arg2, containerQuery){
3100     //should be "body"
3101   // Find all YouTube videos
3102   var $allVideos = $("iframe[src^='https://www.youtube.com']"),
3103   
3104       // The element that is fluid width
3105       $fluidEl = $(containerQuery);
3106   
3107   // Figure out and save aspect ratio for each video
3108   $allVideos.each(function() {
3109   
3110     $(this)
3111       .data('aspectRatio', this.height / this.width)
3112       .data('width', this.width)
3113   
3114       // and remove the hard coded width/height
3115       .removeAttr('height')
3116       .removeAttr('width');
3117   
3118   });
3119   
3120   function resize () {
3121   
3122     var newWidth = $fluidEl.width();
3123     if (newWidth > 800){
3124         newWidth = 0.8 * newWidth;
3125     } 
3126     // Resize all videos according to their own aspect ratio
3127     $allVideos.each(function() {
3128   
3129       var $el = $(this);
3130       $el
3131         .width(newWidth)
3132         .height(newWidth * $el.data('aspectRatio'));
3133   
3134     });
3135     localRebuild();
3136    
3137   // Kick off one resize to fix all videos on page load
3138   }
3139   resize();
3140   }
  

setChildINdex

3141    //onSLideLeave
3142   function setChildIndex(){
3143           if (homeNode.parent!== null)
3144              homeNode.parent.previousChildIndex = getSiblings(homeNode).indexOf(homeNode);
3145   }
  

setTitle

3146    function setTitle(node){
3147        if (node.data.class == 'Video'){
3148            node.title =  score(node).toFixed(0) + '% ' 
3149            + node.data.upVotes + '👍 ' + 
3150            node.data.downVotes + '👎 '+
3151            node.title;
3152        }
3153        return true;
3154    }
  

showRedirect

3155    function showRedirect(node){
3156        if ((isMobile && (node==landingPage))) {
3157              var url = "https://" +
3158              "desktop." + domain + '/' + getKey(node);
3159              return '<center> <a href="' + url +
3160              '">Desktop Site (Beta)</a></center>';
3161        }
3162           return "";
3163    }
  

signout

3164    function renderSignOutOption(){
3165       if (isAuthenticated){
3166              return lili( '<a onclick="signOut()">Sign Out</a>');
3167       }
3168       else 
3169       {return "";}
3170   }
3171   
3172   function signOut(){
3173       window.location.href = "/" + getKey(homeNode) + "/logout2";
3174   }
  

vote

3175   function registerVoter(){
3176        window.location.href="/" + homeNode.key + "/register/voter";
3177   }
3178   
3179   
3180   function recordVotes(responseText,itemName){
3181       
3182       var result = responseText.split (" , ");
3183        document.getElementById(itemName + "-" + "upVotes").innerHTML = result [0]; 
3184         document.getElementById(itemName + "-" + "downVotes").innerHTML = result [1];
3185   }
3186   
3187   function upVote(itemName){
3188   
3189       if (isAuthenticated){
3190          var xhttp = new XMLHttpRequest();
3191          xhttp.onreadystatechange = function() {
3192              if (this.readyState == 4 && this.status == 200) {
3193                  recordVotes(this.responseText,itemName);
3194              }
3195          };
3196          var url = "/" + homeNode.key + "/upVote";
3197          xhttp.open("GET", url, true);
3198          xhttp.send();
3199          return;
3200          }
3201       registerVoter();
3202   }
3203   
3204   function downVote(itemName){
3205     
3206       if (isAuthenticated){
3207           var xhttp = new XMLHttpRequest();
3208           xhttp.onreadystatechange = function() {
3209              if (this.readyState == 4 && this.status == 200) {
3210                 recordVotes(this.responseText,itemName);
3211              }
3212           };
3213           var url = "/" + homeNode.key + "/downVote";
3214           xhttp.open("GET", url, true);
3215           xhttp.send();
3216           return;
3217        }
3218            registerVoter();
3219   
3220   }
3221   
3222   
3223   
3224   
  

twitterImage

3225      var showBest = true;
3226    
3227    function renderTwitterImage(){
3228         return '' + 
3229         '<img src="https://pythonlinks.info//static/graphics/Tweet.png" '+ 
3230         'alt="I wanted to add users tweets to my website, but Twitter'+
3231         'would then track every page that you visit.  Not good for privacy. ' +
3232         'So if you are kind enough to tweet comments, I will link to them."'+
3233          'style = "max-width:100%;" onload="localRebuild">' +
3234           '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Privacy Protecting Tweet Image';
3235   
3236        
3237    }
3238            
3239   function showIntroductoryVideo(slide){         
3240           if ((slide == landingPage)&&isMobile&& (rootName == 'python')) 
3241                {    
3242           return '<h3 style = "text-align:center;">'+
3243           '<a onClick="displaySlideNamed('+
3244           "'introductory-video')"+ '">' + 
3245           'Introductory Video</a></h3>'+
3246           '<p style="text-align:center">' + news + "</p>"; 
3247           }
3248           else {
3249          return '';
3250           }
3251   } 
3252   
3253   function generateLeadersOrContent(slide){
3254        return '<div  id = "bestContent' + 
3255        '-' + getKey(slide) + '" >'+
3256             generateLeadersOrContentCore(slide) +
3257         "</div>";
3258   }