public JsonPosition()
 {
     Children = new JsonPositions();
 }
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.ContentType = "application/json";

            // If level if system-wide, execute this block. Also, move the data to the real place, please

            JsonPositions rootPositions = new JsonPositions();

            _customCookieClass = "LocalPosition" + Request["Cookie"];                                 // may be null and that's ok

            PositionLevel level = (PositionLevel)Enum.Parse(typeof(PositionLevel), Request["Level"]); // may throw on invalid param but so what, that's what should happen anyway

            if (level == PositionLevel.SystemWide)
            {
                Tree <Position> systemPositions = Positions.ForSystem().Tree;

                if (CurrentAuthority.HasSystemAccess())
                {
                    _assignable = true;
                }

                Response.Output.WriteLine(RecursePositionTree(systemPositions.RootNodes));
                Response.End();
                return;
            }

            else if (level == PositionLevel.OrganizationStrategic)
            {
                // If this level does not exist yet for this org, create a starting point

                Positions orgStrategicPositions =
                    Positions.ForOrganization(CurrentOrganization).AtLevel(PositionLevel.OrganizationStrategic);

                if (orgStrategicPositions.Count == 0)
                {
                    throw new InvalidOperationException("Positions are not initialized or are missing.");
                }

                if (CurrentAuthority.HasAccess(new Access(CurrentOrganization, AccessAspect.Administration)))
                {
                    _assignable = true;
                }

                Response.Output.WriteLine(RecursePositionTree(orgStrategicPositions.Tree.RootNodes));
            }

            else if (level == PositionLevel.OrganizationExecutive)
            {
                Positions orgExecutivePositions =
                    Positions.ForOrganization(CurrentOrganization).AtLevel(PositionLevel.OrganizationExecutive);

                if (orgExecutivePositions.Count == 0)
                {
                    throw new InvalidOperationException("Positions are not initialized or are missing.");
                }

                if (CurrentAuthority.HasAccess(new Access(CurrentOrganization, AccessAspect.Administration)) ||
                    CurrentAuthority.HasAccess(new Access(CurrentOrganization, Geography.Root, AccessAspect.Administration)))
                {
                    _assignable = true;
                }

                Response.Output.WriteLine(RecursePositionTree(orgExecutivePositions.Tree.RootNodes));
            }

            else if (level == PositionLevel.GeographyDefault)
            {
                Positions positions =
                    Positions.ForOrganization(CurrentOrganization).AtLevel(PositionLevel.GeographyDefault);

                if (positions.Count == 0)
                {
                    throw new InvalidOperationException("Positions are not initialized or are missing.");
                }
                _displayAssignments = false;                                              // Suppresses assignment lookup, which would fail for default positions

                Response.Output.WriteLine(RecursePositionTree(positions.Tree.RootNodes)); // TODO: turn off assignability!
            }

            else if (level == PositionLevel.Geography)
            {
                _geographyId = Convert.ToInt32(Request["GeographyId"]);
                Geography geography = Geography.FromIdentity(_geographyId);

                if (CurrentAuthority.HasAccess(new Access(CurrentOrganization, AccessAspect.Administration)))
                {
                    _assignable = true;
                }

                Tree <Position> positions = Positions.ForOrganizationGeography(CurrentOrganization, geography);
                Response.Output.WriteLine(RecursePositionTree(positions.RootNodes));
            }
        }