protected void OnNext(object sender, EventArgs e)
    {
        // instantiate canvasCoord
        var canvasCoord = new CanvasCoordConverter(850, 550, PtMin, PtMax);
        // read box positions serialized as Json in field HFBoxArray
        string sValue = HFBoxArray.Value;
        var    bposJS = JsonConvert.DeserializeObject <IList <BoxPositionJS> >(sValue);

        // convert array of BoxPositionJS to BoxPositionIndexed array
        if (null != bposJS)
        {
            var listBoxPositions = new List <BoxPositionIndexed>();
            foreach (var bpjs in bposJS)
            {
                var listIndex = canvasCoord.ToBoxPositionIndexed(bpjs, DimCase);
                listBoxPositions.AddRange(listIndex);
            }
            // sort according to index
            BoxPositionIndexed.Sort(ref listBoxPositions);
            // save session wide
            BoxPositions = listBoxPositions;
            // to validation page
            Response.Redirect("ValidationWebGL.aspx");
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            CanvasCoordConverter canvasCoord = new CanvasCoordConverter(850, 550, PtMin, PtMax);

            // pallet dimensions
            var palletTopLeft     = canvasCoord.PtWorldToCanvas(new Vector2D(0.0, DimPallet.Y));
            var palletBottomRight = canvasCoord.PtWorldToCanvas(new Vector2D(DimPallet.X, 0.0));
            _palletDims.X1 = palletTopLeft.X;
            _palletDims.Y1 = palletTopLeft.Y;
            _palletDims.X2 = palletBottomRight.X;
            _palletDims.Y2 = palletBottomRight.Y;

            // generate images
            _casePixelWidth  = (int)(canvasCoord.LengthWorldToCanvas(DimCase.X));
            _casePixelHeight = (int)(canvasCoord.LengthWorldToCanvas(DimCase.Y));


            int palletPixelWidth  = (int)(canvasCoord.LengthWorldToCanvas(DimPallet.X));
            int palletPixelHeight = (int)(canvasCoord.LengthWorldToCanvas(DimPallet.Y));

            // generate box position from
            MultiCaseImageGenerator.GenerateDefaultCaseImage(DimCase, new Size(_casePixelWidth, _casePixelHeight), 1, MultiCaseImageGenerator.CaseAlignement.SHARING_LENGTH, Path.Combine(Output, "case1.png"));
            MultiCaseImageGenerator.GenerateDefaultCaseImage(DimCase, new Size(_casePixelWidth, _casePixelHeight), 2, MultiCaseImageGenerator.CaseAlignement.SHARING_LENGTH, Path.Combine(Output, "case2.png"));
            MultiCaseImageGenerator.GenerateDefaultCaseImage(DimCase, new Size(_casePixelWidth, _casePixelHeight), 3, MultiCaseImageGenerator.CaseAlignement.SHARING_LENGTH, Path.Combine(Output, "case3.png"));
            MultiCaseImageGenerator.GenerateDefaultCaseImage(DimCase, new Size(_casePixelWidth, _casePixelHeight), 4, MultiCaseImageGenerator.CaseAlignement.SHARING_LENGTH, Path.Combine(Output, "case4.png"));
            MultiCaseImageGenerator.GenerateDefaultPalletImage(DimPallet, PalletIndex == 0? "EUR" : "EUR2", new Size(palletPixelWidth, palletPixelHeight), Path.Combine(Output, "pallet.png"));

            // build reduced list of unique box positions indexed
            BoxPositionIndexed.ReduceListBoxPositionIndexed(BoxPositions, out List <BoxPositionIndexed> listBPIReduced, out Dictionary <int, int> dictIndexNumber);
            foreach (var bp in listBPIReduced)
            {
                _boxPositionsJS.Add(canvasCoord.BPosWorldToCanvas(bp, dictIndexNumber[bp.Index], DimCase));
            }
        }
    }