/*
    Thanks to Richard Z for his great work and inspiration!
*/         

function BarGraphSettings(width,height)
{
    this.ViewMode=0;  
    this.ViewChange=0;  //trigger- zmienil sie widok                              
    this.controlWidth=width;
    this.controlHeight=height;
    this.topMargin = 26;
    this.tipHeight = 16;
    this.bottomMargin=this.controlHeight-20 -this.topMargin;
    this.leftMargin = 10;
    this.rightMargin= 10;
    this.graphMaxHeight=this.bottomMargin-this.topMargin-this.tipHeight;
    this.graphMaxWidth = this.controlWidth-this.leftMargin-this.rightMargin;
    this.MaxGraphLevel=1000;                           
    this.columnWidth=35;
    this.barWidth=30;
    this.autoScale=1;    
    this.rotatedText=1;   
    this.captionText="Default Header";  
    this.fOutline=1; 
}

function BarGraphControl(DOMParentName)//,ControlName)//,width,height)//nazwa diva do ktorego dokuje,nazwa kontrolki
{
    this.parent = document.getElementById(DOMParentName);    
    var width = parseInt(this.parent.style.width); 
    if(isNaN(width))
        width=400;
    var height = parseInt(this.parent.style.height);
    if(isNaN(height))
        height=160;
    this.name=DOMParentName;
    this.context=DOMParentName;
    this.plugin=null;
    this.canvas=null;
    //default settings.     
    this.Settings=new BarGraphSettings(width,height);
    this.DataSource=null;                                     
    this.createSilverlightBarGraphControl();//creating silverlight object of control    
}

BarGraphControl.prototype.onLoadedBaseGraph = function(plugin,userContext,sender)
{
    this.plugin=plugin;
    this.canvas=sender;
    
    if(this.OnLoadedBase!=null) //jezeli zostala podany callback informacji o zaladowaniu
        this.OnLoadedBase();   
    
   //starting - "Please Wait For Data" title
   var targetMovie =  sender.findName('InfoRising');
   if(targetMovie!=null)
    targetMovie.begin();
}

BarGraphControl.prototype.createSilverlightBarGraphControl = function()
{ 
   Silverlight.createObject(
        "base.xaml",                      // Source property value.
        this.parent,                      // DOM reference to hosting DIV tag.
        name,             // Unique control id value.
        {                                   // Control properties.
            width:this.Settings.controlWidth.toString(),                    // Width of rectangular region of control in pixels.
            height:this.Settings.controlHeight.toString(),                   // Height of rectangular region of control in pixels.
            inplaceInstallPrompt:false,     // Determines whether to display in-place install prompt if invalid version detected.
            background:'#0d0d0d',           // Background color of control.
            isWindowless:'false',           // Determines whether to display control in Windowless mode.
            framerate:'36',                 // MaxFrameRate property value.
            version:'1.0'                   // Control version to use.
        },
        {
            onError:null,                   // OnError property value -- event handler function name.
            onLoad:Silverlight.createDelegate(this, this.onLoadedBaseGraph)
        },
        null,
        this.context);
}

BarGraphControl.prototype.OnMouseEnter= function(sender,eventArgs)
{    
    var id = sender.Name.substr(3);
    sender.findName('esg'+id).begin();
    sender.findName('bubbleText'+id).Visibility="Visible";
}

BarGraphControl.prototype.OnMouseLeave= function(sender,eventArgs)
{
    var id = sender.Name.substr(3);
    sender.findName('ess'+id).begin();
    sender.findName('bubbleText'+id).Visibility="Collapsed";   
}

BarGraphControl.prototype.OnMouseClick = function(sender, eventArgs)
{    
//    var parent= sender.getHost();
//    var segments = sender.Name.split('_');
//    var column = parseInt(segments[2]);
//  alert('CLick '
//    +this.name
//    +' column:'
//    +column+'\r\n'+'value:'
//    +this.DataSource[column][1]);    
}

BarGraphControl.prototype.ChangeView = function(NewViewMode)
{
    var tmpViewMode = this.Settings.ViewMode;
    this.Settings.ViewChange =1;
    this.Settings.ViewMode = NewViewMode;  
    var table =   this.DataSource
    this.LoadData(table);
}

BarGraphControl.prototype.GetElementValue = function(sender)
{
    if(sender != null)
    {
     var segments = sender.Name.split('_');
     var column = parseInt(segments[2]);
    return this.DataSource[column]
    }
    else return null;
}

BarGraphControl.prototype.LoadData = function(data)
{    
    var canvas = this.canvas;    
    if(canvas!=null)
    {
    var host=canvas.getHost();
    
    var nodeCount;
    if(data!=null)
        nodeCount = data.length;
    else
        nodeCount = 0;
    
    var another=false;       
    var table  = this.DataSource;//null at start     
    var ViewMode=this.Settings.ViewMode;
    var ViewChange=this.Settings.ViewChange;    
    var controlHeight=this.Settings.controlHeight;
    var controlWidth=this.Settings.controlWidth;
    var topMargin = this.Settings.topMargin;
    var tipHeight = this.Settings.tipHeight;
    var bottomMargin=this.Settings.bottomMargin;
    var leftMargin = this.Settings.leftMargin;
    var rightMargin= this.Settings.rightMargin;
    var graphMaxHeight=this.Settings.graphMaxHeight;
    var graphMaxWidth = this.Settings.graphMaxWidth;
    var MaxGraphLevel=this.Settings.MaxGraphLevel;
    var rotatedText = this.Settings.rotatedText;
    var fOutline= this.Settings.fOutline;    
    var captionText = this.Settings.captionText;
    var columnWidth=this.Settings.columnWidth;
    var barWidth=this.Settings.barWidth;
    var autoScale=this.Settings.autoScale;    

    if(table!=null) //is the same table as earlier?
    {
        if(data == null)
        {        
            canvas.children.Clear();
            var control = canvas.getHost();
            this.DataSource = data;
            var textBlock1 = GenerateTextInfoBlock(control,"Data Not Available",50,5,14);                   
            canvas.children.add(textBlock1);       
            var targetMovie =  canvas.findName('InfoRising');
            if(targetMovie!=null)
            targetMovie.begin();
            return;
        }
        else 
        if ((table.length==data.length)&&(table.length>0)&&(data.length>0))
        {
            for (m = 0; m < table.length; m++)
            {
                if( !((table[m][0]==data[m][0])&&(table[m][1]==data[m][1])&&(table[m][3]==data[m][3])))
                {                    
                    canvas.children.Clear();
                    another=true;
                    break;
                }
            }            
            //sprawdzenie czy sie viewmode zmienilo
            if((ViewChange==1) && (!another))//same table but viewmode has changed
            {              
                canvas.children.Clear();                
                this.Settings.ViewChange=0;
            }
            else if(!another)  //same table, stop loading          
                return;            
        }
        else
        {
            //alert('childrenclear - rozne dlugosci tabel:'+nameof);
            canvas.children.Clear();
            if(data !=null && data.length==0)//if table has lenght 0 or is null - print "Data Not Available"
            {                        
                var control = canvas.getHost();
                this.DataSource = data;                
                var textBlock1 = GenerateTextInfoBlock(control,"Data Not Available",50,5,14);
                canvas.children.add(textBlock1);                
                var targetMovie =  canvas.findName('InfoRising');
                if(targetMovie!=null)
                targetMovie.begin();
                return;
            }               
         }              
    }
    else if((data!=null&&data.length==0)||(data==null))
    {
        //jezeli table nie jest null
        canvas.children.Clear();
        var control = canvas.getHost();
        this.DataSource = data;
        var textBlock1 = GenerateTextInfoBlock(control,"Data Not Available",50,5,14);                   
        canvas.children.add(textBlock1);       
        var targetMovie =  canvas.findName('InfoRising');
        if(targetMovie!=null)
        targetMovie.begin();
       return;
    }
    else
    {
        canvas.children.Clear();//ale jest czyszczenie napisu z base        
    }
        
    this.DataSource = data; //przypisanie danych
    var childrencount=canvas.children.Count;    
    var control = canvas.getHost();
    
    //graph header
    var textBlock = GenerateCaptionTextBlock(control,captionText,controlWidth/2,5,12);         
    canvas.children.add(textBlock);
        
    //searching global max value for data serie
    MaxGraphLevel=0; 
    for (l = 0; l < nodeCount; ++l)
    {
        var valOfPoint=data[l][1];        
        var tValueOfpoint = parseFloat(valOfPoint);
      
        if(isNaN(tValueOfpoint))
        {
            var valuestring = valOfPoint.toString();
            valOfPoint = parseFloat(valuestring.substr(1,valuestring.length-1));            
        }
        
        if(MaxGraphLevel<= valOfPoint)
            MaxGraphLevel=valOfPoint;                
    }   
    
    //skalowanie - jezeli wlaczone przeskaluj dynamicznie szerokosci kolumn
    if(autoScale==1)
    {
        columnWidth = graphMaxWidth/nodeCount;
        barWidth = 0.8 * columnWidth;
    }
    
    for (i = 0; i < nodeCount; ++i)
    { 
        var x = leftMargin + i * columnWidth;
        var valOfPoint=data[i][1];
        
        var tValueOfpoint = parseFloat(valOfPoint);
        if(isNaN(tValueOfpoint))
        { 
            var valuestring = valOfPoint.toString();
            valOfPoint = valuestring.substr(1,valuestring.length-1);
        }   
        
        //lokalne maximum - jezeli jest podane dla serii ( przestaje sie wtedy liczyc MAXGraphLevel)
        if(data[i][5]!=null)
        {           
            MaxGraphLevel= data[i][5];
            if(MaxGraphLevel<tValueOfpoint)                            
                MaxGraphLevel=valOfPoint;             
            //alert('data :'+data[i][5]);
            //alert('max lokalny:'+MaxGraphLevel);
        }
        var valInPix = (valOfPoint*graphMaxHeight)/MaxGraphLevel;        
        var valInPixOutline = (MaxGraphLevel*graphMaxHeight)/MaxGraphLevel;
        
        if(isNaN(valInPix))
            valInPix=0;
        if(isNaN(valInPixOutline))
            valInPixOutline=0;
    
    cb=new ColorBar;        
    cb.LoadTheme(data[i][2]);
    //sprawdz czy seria dla danej kolumny nie ma specjalnego statusu (LOW/WARNING)
    if(data[i][3]==1)   //warning
        cb.Modify(0); 
    else if (data[i][3]==2) //empty
       cb.Modify(1);

    var backOpacity=' Opacity="1.0" ';
    if (!isNaN(fOutline) && fOutline==0)
        backOpacity=' Opacity="0.0" ';
        
        var x= leftMargin + i * columnWidth;
        var nx = x+(columnWidth-barWidth)/2;       
        var y = (bottomMargin - valInPixOutline );        
        var bar = GenerateBarBRect(this,i,nx,y, barWidth,valInPixOutline,cb.colorBarBackFill,backOpacity);  //generatin back bar
        canvas.children.add(bar);         
           
        y = (bottomMargin - valInPix );
        var bar = GenerateBarRect(this,i,nx,y,barWidth,valInPix,cb);       //generating main bar
        bar.addEventListener("MouseEnter",Silverlight.createDelegate(this, this.OnMouseEnter));
        bar.addEventListener("MouseLeave",Silverlight.createDelegate(this, this.OnMouseLeave));
        bar.addEventListener("MouseLeftButtonDown",Silverlight.createDelegate(this, this.OnMouseClick));        
        canvas.children.add(bar);
        
        var bubbleCaption =  '';    //napisy na osi Y
        var downCaption = '';       //os X
        
        switch (ViewMode)   //tryb wyswietlania danych
        {
            case 0: //normalne NUMBER dispenser/hopper               
                bubbleCaption = data[i][1].toString();
                downCaption = data[i][0].toString();                                
                break;            
            case 1:
                downCaption= data[i][0].toString();
                bubbleCaption= 'count: '+data[i][1].toString();
                break; 
            case 2:
                downCaption= data[i][0].toString();
                bubbleCaption= num2money( data[i][1].toString() ,'$');
                break;  
            case 3:
                downCaption= data[i][0].toString();
                bubbleCaption= num2money( data[i][1].toString() ,'EUR ');
                break; 
            case 4:
                downCaption= data[i][0].toString();
                bubbleCaption= num2money( data[i][1].toString() ,'');
                break; 
                
            case 5: //normalne $ dispenser/hopper wylicza sume
                downCaption= data[i][0].toString();
                bubbleCaption= data[i][1].toString();
                var denomstring = data[i][0].toString();
                var denomfloat = parseFloat(denomstring.substr(1,denomstring.length-1));
                var unitfloat = parseFloat(data[i][1].toString());                
                bubbleCaption = num2money((unitfloat*denomfloat).toString(),'$');
                break;   
            default:
                bubbleCaption = data[i][1].toString();
                downCaption = data[i][0].toString();
                control.ViewMode=0;                                
                break;
            break;
        }
  
        
        var strlen=bubbleCaption.length*6;
        var offsetB = x  +columnWidth/2 -strlen/2;
        //przesuwanie hinta nad slupkiem jezeli to krawedz kontrolki
        if(offsetB <leftMargin)
        {
            offsetB=leftMargin;
        }
        else if(offsetB+strlen>(controlWidth-rightMargin))
            offsetB=controlWidth-rightMargin-strlen*1.2;
        
        var textBlock = GenerateBubble(this,i,bubbleCaption,offsetB,bottomMargin - valInPix - 20,12);         
        canvas.children.add(textBlock);
            
        strlen=downCaption.length*9;
        var xoffsetXLabel = x  +columnWidth/2 -barWidth/2;
            
        var infoTop;
        var xLabel;
        var movedown=0;
        
        if(rotatedText==1)
        {
         infoTop = (bottomMargin+5)+30;
         xLabel = GenerateXLabel(this,i,downCaption,xoffsetXLabel,infoTop,9,1);
        }
        else
        {
         if(nodeCount>8&&(i%2==0))
            infoTop = (bottomMargin+5)+10;
         else
            infoTop = (bottomMargin+5);        
         xLabel = GenerateXLabel(this,i,downCaption,xoffsetXLabel,infoTop,9,0);
        }        
        canvas.children.add(xLabel);
    }  
    }
}


