Friday, January 31, 2014

Organization Chart in Salesforce Using Google's OrgChart

I have been thinking for developing an organization chart in Salesforce.In my developer Organization I have used the Google's OrgChart Api and developed an Organization chart and I am  so glad to share with you all. Please have a look at it and give suggestions.



 <div id="OrgChart">
               <script type='text/javascript' src='https://www.google.com/jsapi'></script>
    <script type='text/javascript'>
      google.load('visualization', '1', {packages:['orgchart']});
      google.setOnLoadCallback(drawChart);
      var chart;
      var options;
      function drawChart() {
       
               options ={
                       
                        allowHtml:true,
                        allowCollapse:true,
                        animation: {         
                            duration: 1000,
                            easing: 'in'
                                    },
                       
                     };
        
        var data = new google.visualization.DataTable();

        data.addColumn('string', 'Name');
        data.addColumn('string', 'Manager');
        data.addColumn('string', 'ToolTip');
     
        var response = [{!userdata}];        
        data.addRows(response);        
        chart = new google.visualization.OrgChart(document.getElementById('chart_div'));
        chart.draw(data, options);        
        google.visualization.events.addListener(chart, 'onmouseover', barMouseOver);     
        google.visualization.events.addListener(chart, 'onmouseout', barMouseOut); 
      }
      
      function barMouseOver(e) {
           chart.setSelection([e]);   
      }   
      
      function barMouseOut(e) {
           chart.setSelection([{'row': null, 'column': null}]);   
      } 
      
      /*Zooming*/
      
      
      $(document).ready(function(){
      var disablebuttons = false;
      var currZoom = 1;
    
        
       $("#chart_div").draggable(
        {
                        containment: 'parent',
                        drag: function() {
                                console.log('the mouse is being moved in chart');
                                 disablebuttons = true;
                                 $('#resetdiv').css("opacity","1");
                                 $('#zoomindiv').css("opacity","0.4");                 
                                 $('#zoomoutdiv').css("opacity","0.4");
                                 $('#moveupdiv').css("opacity","0.4");
                                 $('#movedowndiv').css("opacity","0.4");
                                 $('#moverightdiv').css("opacity","0.4");
                                 $('#moveleftdiv').css("opacity","0.4");
                          }
        });
      
  
      
      $("#_zi_icon").click(function(){
            
           if(disablebuttons != true)
           { 
           currZoom+=0.1;
            $('#chart_div').css(
            {
                'zoom' : currZoom
            });
             $('#zoomoutdiv').css("opacity","0.7");
             $('#zoomindiv').css("opacity","1");
           }
        });
        
       
     
     $("#_zo_icon").click(function(){
          if(disablebuttons != true)
          { 
            currZoom-=0.1;
            $('#chart_div').css(
            {
               'zoom' : currZoom
            });
            $('#zoomoutdiv').css("opacity","1");
            $('#zoomindiv').css("opacity","0.7");
          }
        }); 
 
     var Margin = 0; 
      $("#_ml_icon").click(function(){
           if(disablebuttons != true)
           {                 
            Margin +=100; 
            $('#chart_div').animate({                
               'right' : Margin+'px' 
            },'slow');
            $('#moveleftdiv').css("opacity","1");
            $('#moverightdiv').css("opacity","0.7");
            }
        });  
      
      $("#_mr_icon").click(function(){

          if(disablebuttons != true)
          {                                   
           Margin -=100;             
           if(Margin >=0)
           {
                $('#chart_div').animate({
                   'right' : Margin+'px' 
                },'slow');
           }else{
               Margin = 100;
           }
           
            $('#moverightdiv').css("opacity","1");
            $('#moveleftdiv').css("opacity","0.7");
           }
        }); 
        
        var topmargin =0;
         $("#_md_icon").click(function(){
          if(disablebuttons != true)
           {                 
              topmargin +=100

                $('#chart_div').animate({
                   'top' : topmargin+'px' 
                },'slow');
           
           $('#movedowndiv').css("opacity","1");
           $('#moveupdiv').css("opacity","0.7");
           }

        }); 
        
        $("#_mu_icon").click(function(){
          if(disablebuttons != true)
           { 
              topmargin -=100
                $('#chart_div').animate({
                   'top' : topmargin+'px' 
                },'slow');           
           $('#moveupdiv').css("opacity","1");
           $('#movedowndiv').css("opacity","0.7");
           }

        }); 
     
     
        $("#_rs_icon").click(function(){
            currZoom=1;
            topmargin =0;
            Margin=0;
            window.location = "http://strickerforce-developer-edition.ap1.force.com/CloudStrikerDemos?show_div=5";
        });
              
        
        $("#zoomindiv").hover(function(){
           if(disablebuttons != true)
           {   
            $('#_zinorm').css("display","none");        
            $('#_ziover').css("display","block");            
           }
        }, function() {
            $('#_zinorm').css("display","block");        
            $('#_ziover').css("display","none");   
           }
        );             
        $("#zoomoutdiv").hover(function(){
           if(disablebuttons != true)
           {
            $('#_zonorm').css("display","none");        
            $('#_zoover').css("display","block");              
           }
        }, function() {
            $('#_zonorm').css("display","block");        
            $('#_zoover').css("display","none");       
           });
        $("#moverightdiv").hover(function(){
           if(disablebuttons != true)
           {
            $('#_mrnorm').css("display","none");        
            $('#_mrover').css("display","block");       
           }
        }, function() {
            $('#_mrnorm').css("display","block");        
            $('#_mrover').css("display","none");       
           });
        $("#moveleftdiv").hover(function(){
           if(disablebuttons != true)
           {
            $('#_mlnorm').css("display","none");        
            $('#_mlover').css("display","block");       
           }
        }, function() {
            $('#_mlnorm').css("display","block");        
            $('#_mlover').css("display","none");       
           });
        $("#moveupdiv").hover(function(){
           if(disablebuttons != true)
           {   
            $('#_munorm').css("display","none");        
            $('#_muover').css("display","block");       
           }        
        }, function() {
            $('#_munorm').css("display","block");        
            $('#_muover').css("display","none");       
           });
         $("#movedowndiv").hover(function(){
           if(disablebuttons != true)
           {  
            $('#_mdnorm').css("display","none");        
            $('#_mdover').css("display","block");       
           }        
        },function() {
            $('#_mdnorm').css("display","block");        
            $('#_mdover').css("display","none");       
           });
        
       $("#resetdiv").hover(function(){
           if(disablebuttons != true)
           { 
                $('#_rsnorm').css("display","none");        
                $('#_rsover').css("display","block");       
           }
        
        }, function() {
           if(disablebuttons != true)
           { 
            $('#_rsnorm').css("display","block");        
            $('#_rsover').css("display","none");       
           }
           });
        
        var datalength = [{!userdata}];
        if(datalength.length>0)
        {       
            $("#navdiv").css("display","block");
        }else{        
            $("#navdiv").css("display","none");
        }

      
      });
      
      
    </script>

  
  <style>
  .hoverClass{
      opacity:1;
  }
  </style>
   <!-- Adding Zoom Panel -->

    <div id="navdiv" style="position: absolute; right:10px; bottom: 10px; width: 97px; height: 64px; z-index: 20;" class="noSel;">      
        <div class="noSel controlsBg" style="position: relative; width: 100%; height: 100%; z-index: 1; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; background-color: rgb(0, 0, 0); opacity: 0.55;">
        </div>

        <div id="zoomindiv" style="position: absolute; display: block; left: 4px; top: 11px; width: 20px; height: 20px; z-index: 1;opacity: 0.7; filter: alpha(opacity=70);" class="noSel">
            <div id="_zinorm" style="position: absolute; left: 1px; top: 1px; width: 18px; height: 18px; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; display: block; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_ziover" style="position: absolute; left: 0px; top: 0px; width: 20px; height: 20px; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; display: none; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_zi_icon" style="position: absolute; left: 1px; top: 1px; width: 18px; height: 18px; background: transparent url({!URLFOR($Resource.GoogleApiResource, 'GAResources/icons.png')}) -16px -16px no-repeat;">
            </div>
        </div>
       
        <div id="zoomoutdiv" style="position: absolute; display: block; left: 4px; top: 33px; width: 20px; height: 20px; z-index: 2; opacity: 0.4;filter: alpha(opacity=70);" class="noSel">
            <div id="_zonorm" style="position: absolute; left: 1px; top: 1px; width: 18px; height: 18px; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; display: block; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_zoover" style="position: absolute; left: 0px; top: 0px; width: 20px; height: 20px; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; display: none; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_zo_icon" style="position: absolute; left: 1px; top: 1px; width: 18px; height: 18px; background: transparent url({!URLFOR($Resource.GoogleApiResource, 'GAResources/icons.png')}) -66px -16px no-repeat;">
            </div>
        </div>
        <div id="moverightdiv" style="position: absolute; display: block; left: 37px; top: 23px; width: 18px; height: 18px; z-index: 3; opacity: 0.4;filter: alpha(opacity=70);" class="noSel"> 
            <div id="_mrnorm" style="position: absolute; left: 1px; top: 1px; width: 16px; height: 16px; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; display: block; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_mrover" style="position: absolute; left: 0px; top: 0px; width: 18px; height: 18px; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; display: none; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_mr_icon" style="position: absolute; left: 1px; top: 1px; width: 16px; height: 16px; background: transparent url({!URLFOR($Resource.GoogleApiResource, 'GAResources/icons.png')}) -117px -17px no-repeat;">
            </div>
        </div>
        <div id="moveleftdiv" style="position: absolute; display: block; left: 75px; top: 23px; width: 18px; height: 18px; z-index: 4; opacity: 0.4;filter: alpha(opacity=70);" class="noSel"> 
            <div id="_mlnorm" style="position: absolute; left: 1px; top: 1px; width: 16px; height: 16px; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; display: block; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_mlover" style="position: absolute; left: 0px; top: 0px; width: 18px; height: 18px; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; display: none; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_ml_icon" style="position: absolute; left: 1px; top: 1px; width: 16px; height: 16px; background: transparent url({!URLFOR($Resource.GoogleApiResource, 'GAResources/icons.png')}) -167px -17px no-repeat;">  
            </div>
        </div>
        <div id="moveupdiv" style="position: absolute; display: block; left: 56px; top: 42px; width: 18px; height: 18px; z-index: 5; opacity: 0.4;filter: alpha(opacity=70);" class="noSel">
            <div id="_munorm" style="position: absolute; left: 1px; top: 1px; width: 16px; height: 16px; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_muover" style="position: absolute; left: 0px; top: 0px; width: 18px; height: 18px; display: none; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_mu_icon" style="position: absolute; left: 1px; top: 1px; width: 16px; height: 16px; background: transparent url({!URLFOR($Resource.GoogleApiResource, 'GAResources/icons.png')}) -217px -17px no-repeat;">
            </div>
        </div>
        <div id="movedowndiv" style="position: absolute; display: block; left: 56px; top: 4px; width: 18px; height: 18px; z-index: 6; opacity: 0.4;filter: alpha(opacity=70);" class="noSel">
            <div id="_mdnorm" style="position: absolute; left: 1px; top: 1px; width: 16px; height: 16px; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_mdover" style="position: absolute; left: 0px; top: 0px; width: 18px; height: 18px; display: none; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_md_icon" style="position: absolute; left: 1px; top: 1px; width: 16px; height: 16px; background: transparent url({!URLFOR($Resource.GoogleApiResource, 'GAResources/icons.png')}) -267px -17px no-repeat;">
            </div>
        </div>
        <div id="resetdiv" style="position: absolute; display: block; left: 56px; top: 23px; width: 18px; height: 18px; z-index: 7; opacity: 0.4;filter: alpha(opacity=70);" class="noSel">
            <div id="_rsnorm" style="position: absolute; left: 1px; top: 1px; width: 16px; height: 16px; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; display: block; background-position: initial initial; background-repeat: initial initial;">  
            </div>
            <div id="_rsover" style="position: absolute; left: 0px; top: 0px; width: 18px; height: 18px; background-color: rgb(255, 255, 255); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; display: none; background-position: initial initial; background-repeat: initial initial;">
            </div>
            <div id="_rs_icon" style="position: absolute; left: 1px; top: 1px; width: 16px; height: 16px; background: transparent url({!URLFOR($Resource.GoogleApiResource, 'GAResources/icons.png')}) -317px -17px no-repeat;">
            </div>
        </div>
</div>
    <!-- End of Zoom Panel-->
    
    
     <br/>
          <div id='chart_div' style="font-size:18px;padding:30px;background-color: white;">    
          </div> 
           
       </div>
organization-chart-in-salesforce.png