protected void bind_all_gauges()
    {
        try
        {
            ParameterCollection _params = new ParameterCollection();
            string _query = "";
            float[] _values = { 0, 0, 0, 0 }; //containers, weight, cube (cbm), pallets

            //***************
            //21.10.2014 Paul Edwards for delivery tracking and container check which DeliveryID's are visible for this company
            //check individual contact ID iso 
            string _contactid = ((UserClass)Page.Session["user"]).UserId.ToString();
            IList<string> _deliveryids = null;
            _deliveryids = wwi_func.array_from_xml("xml\\contact_iso.xml", "contactlist/contact[id='" + _contactid + "']/deliveryids/deliveryid/value");
            if (_deliveryids.Count > 0)
            {
                //don't use sql IN(n) as linq won't parse the statement
                string _deliveries = "(DeliveryAddress==" + string.Join(" OR DeliveryAddress==", _deliveryids.Select(i => i.ToString()).ToArray()) + ")";
                _params.Add("NULL", _deliveries); //select for this company off list

            }
            else
            {
                string _companyid = ((UserClass)Page.Session["user"]).CompanyId.ToString();
                _params.Add("CompanyID", _companyid);
            }
            //****************

            string _f = "";
            if (_params.Count > 0)
            {
                foreach (Parameter p in _params)
                {
                    string _pname = p.Name.ToString();
                    string _op = "AND";
                    string[] _check = _pname.Split("_".ToCharArray());
                    _pname = _check[0].ToString();
                    _op = _check.Length > 1 ? _check[1].ToString() : _op;

                    string _a = _f != "" ? " " + _op + " " : "";
                    _f += _pname != "NULL" ? _a + "(" + _pname + "==" + p.DefaultValue.ToString() + ")" : _a + "(" + p.DefaultValue.ToString() + ")";

                }

                if (_query != "") { _query = _f + " AND " + _query; } else { _query = _f; }
            }

            //****************
            //get starting ETS and ending ETS for current date
            //convert(datetime,'28/03/2013 10:32',103)
            //if no datetimes seelcted default to 0/01/1900 so no data displayed
            DateTime? _ets1 = DateTime.Now;
            DateTime? _ets2 = DateTime.Now;
            //****************

            //important! need a key id or error=key expression is undefined
            //e.KeyExpression = "ContainerIdx";

            //10.11/2014 if necessary send to datatable then use datatable.compute method on clientname to summarise without showing
            //breakdown by delivery address
            if (!string.IsNullOrEmpty(_query))
            {
                linq.linq_aggregate_containers_udfDataContext _ct = new linq.linq_aggregate_containers_udfDataContext();
                IEnumerator<linq.aggregate_containers_by_etsResult> _in = _ct.aggregate_containers_by_ets(_ets1, _ets2).Where(_query).GetEnumerator();

                while (_in.MoveNext())
                {
                    linq.aggregate_containers_by_etsResult _c = _in.Current;
                    _values[0] += (float)_c.ContainerCount;
                    _values[1] += (float)_c.SumPackages;
                    _values[2] += (float)_c.SumWeight;
                    _values[3] += (float)_c.SumCbm;
                }

            }

            //bind aggregates to labels !guage
            this.dxGaugeContainers.Value = _values[0].ToString("N");
            this.dxGaugePallets.Value = _values[1].ToString("N");
            this.dxgaugeWeight.Value = _values[2].ToString("N");
            this.dxgaugeCbm.Value = _values[3].ToString("N");



            //for (int _ix = 0; _ix < _values.Length; _ix++)
            //{
            //this.dxguageTotals.AddGauge(DevExpress.XtraGauges.Base.GaugeType.Digital);
            //((DigitalGauge)this.dxguageTotals.Gauges[_ix]).Text = _values[_ix].ToString("N"); 
            //string _cap = "dxlblCount" + _ix.ToString();
            //ASPxLabel _lbl = (ASPxLabel)this.FindControl(_cap);
            //if (_lbl != null) { _lbl.Text = _values[_ix].ToString("N"); }
            //not being used multiple guages too messy to format
            //((DigitalGauge)this.dxguageTotals.Gauges[_ix]).Text = _values[_ix].ToString("N"); 
            //}
            //end for
        }
        catch (Exception ex)
        {
            this.dxlblErr.Text = ex.Message.ToString();
            this.dxpnlErr.Visible = true;
        }
    }
    /// <summary>
    /// this code is used with LinqServerModeDataSource_Selecting so we can run in server mode
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void linqAggregates_Selecting(object sender, DevExpress.Data.Linq.LinqServerModeDataSourceSelectEventArgs e)
    {
        ParameterCollection _params = new ParameterCollection();
        string _query = "";

        if (Page.Session["shipmentsloaded"] != null)
        {
            //***************
            //21.10.2014 Paul Edwards for delivery tracking and container check which DeliveryID's are visible for this company
            //check individual contact ID iso 
            string _contactid = ((UserClass)Page.Session["user"]).UserId.ToString();
            IList<string> _deliveryids = null;
            _deliveryids = wwi_func.array_from_xml("xml\\contact_iso.xml", "contactlist/contact[id='" + _contactid + "']/deliveryids/deliveryid/value");
            if (_deliveryids.Count > 0)
            {
                //don't use sql IN(n) as linq won't parse the statement
                string _deliveries = "(DeliveryAddress==" + string.Join(" OR DeliveryAddress==", _deliveryids.Select(i => i.ToString()).ToArray()) + ")";
                _params.Add("NULL", _deliveries); //select for this company off list

            }
            else
            {
                string _conmpanyid = ((UserClass)Page.Session["user"]).CompanyId.ToString();
                _params.Add("DeliveryAddress", _conmpanyid);
            }
            //****************

            //now rebuild query with additional parameters AFTER page is loaded
            string _f = "";
            if (_params.Count > 0)
            {
                foreach (Parameter p in _params)
                {
                    string _pname = p.Name.ToString();
                    string _op = "AND";
                    string[] _check = _pname.Split("_".ToCharArray());
                    _pname = _check[0].ToString();
                    _op = _check.Length > 1 ? _check[1].ToString() : _op;

                    string _a = _f != "" ? " " + _op + " " : "";
                    _f += _pname != "NULL" ? _a + "(" + _pname + "==" + p.DefaultValue.ToString() + ")" : _a + "(" + p.DefaultValue.ToString() + ")";

                }

                if (_query != "") { _query = _f + " AND " + _query; } else { _query = _f; }
            }

        }

        //22.10.14 Paul Edwards Session["shipmentsloaded"] allows us to init the grid with no data
        //Session["containersloaded"] is null on 1st page init when we call selecting event for grid
        //When Javascript Grid.Init is called Grid.CustomCallback event is fired which sets Session["containersloaded"] = true and allows filter query to build
        //This gives a slight delay allowing the page to load BEFORE the grid is populated for a better user experience
        
        //****************
        //get starting ETS date for deliveries from xml file (which maqes it easy to change if necessary)
        //convert(datetime,'28/03/2013 10:32',103)
        //if no datetimes seelcted default to 0/01/1900 so no data displayed
        DateTime? _ets1 = this.dxdt1.Value != null ? wwi_func.vdatetime(this.dxdt1.Value.ToString()) : new DateTime(1900, 1, 1);
        DateTime? _ets2 = this.dxdt2.Value != null ? wwi_func.vdatetime(this.dxdt2.Value.ToString()) : new DateTime(1900, 1, 1);
        if (_ets1 > _ets2) { 
            DateTime? _temp = _ets1;
            _ets1 = _ets2;
            _ets2 = _temp;
        }
        //****************

        //important! need a key id or error=key expression is undefined
        e.KeyExpression = "ContainerIdx";
        
        //10.11/2014 if necessary send to datatable then use datatable.compute method on clientname to summarise without showing
        //breakdown by delivery address
        if (!string.IsNullOrEmpty(_query))
        {
            //var _query = new linq_classesDataContext().view_orders.Where(_filter);
            //290413 using new userdefined inline table function so we can parametise with month range from current date
            //var _nquery = new linq_view_orders_udfDataContext().view_orders_by_age(1, 12).Where(_query); //c => c.CompanyID == 7
            var _nquery = new linq.linq_aggregate_containers_udfDataContext().aggregate_containers_by_ets(_ets1, _ets2).Where(_query); //c => c.CompanyID == 7
            e.QueryableSource = _nquery;

            //Int32 _count = _nquery.Count();

            //if (!String.IsNullOrEmpty(_name))
            //{
            //    append_to_query_log(_query, _name);
            //    this.gridContainer.SettingsText.Title = "Search results: " + _name;
            //}
        }
        else //default to display nothing until page is loaded 
        {
            //var _nquery = new linq_classesDataContext().view_order_2s.Where(c => c.OrderNumber == -1);
            var _nquery = new linq.linq_aggregate_containers_udfDataContext().aggregate_containers_by_ets(_ets1, _ets2).Where(c => c.ContainerIdx == 0); //c => c.CompanyID == 7
            //_count = _nquery.Count();

            e.QueryableSource = _nquery;
        }

        //this.dxgridShipments.GroupBy(this.dxgridShipments.Columns["colDeliveryAddress"], 0);  
    }