﻿var currentObjectId = null;
var restorePartitionId = null;
var restoreFirstGroupId = null;
var restoreSecondGroupId = null;
var restoreEntity = null;

function processPartition(partitionId, entity) {
  if (currentObjectId == null) {
    var linkElement = elementById(partitionId);
    var partitionElement = linkElement.parentNode;
    var parentElement = partitionElement.parentNode;
    var nextElement = partitionElement.nextSibling;

    if (nextElement.getAttribute != null && nextElement.getAttribute('state') == 'expanded') {
      setElementClassAttribute(partitionElement, 'partition expander');
      parentElement.removeChild(nextElement);
      MyMallWebService.ResetExpandedPartition(); // control
    }

    else {
      setElementClassAttribute(partitionElement, 'partition collapser');
      showProgress(partitionId, true);
      MyMallWebService.GetPartitionHtml(partitionId, entity, getPartitionHtmlSucceededCallback);
      currentObjectId = partitionId;
    }
  }
}

function getPartitionHtmlSucceededCallback(result) {
  var linkElement = elementById(currentObjectId);
  var partitionElement = linkElement.parentNode;
  var parentElement = partitionElement.parentNode;
  var groupsElement = document.createElement('div');

  groupsElement.innerHTML = result;
  groupsElement.setAttribute('state', 'expanded');
  insertAfter(parentElement, groupsElement, partitionElement);
  currentObjectId = null;
  hideProgress();

  if (!isRestored())
    setTimeout('restoreNodes();', 1);
}

function processNode(groupId, level, entity) {
  if (currentObjectId == null) {
    var linkElement = elementById(groupId);
    var parentElement = linkElement.parentNode;
    var nextElement = linkElement.nextSibling.nextSibling;

    if (linkElement.getAttribute('state') == 'expanded') {
      linkElement.setAttribute('state', 'collapsed');
      parentElement.removeChild(
        nextElement
      );
      
      if (level == 1)
        MyMallWebService.ResetExpandedFirstGroup();
        
      else if (level == 2)
        MyMallWebService.ResetExpandedSecondGroup();
    }

    else {
      showProgress(groupId, true);
      MyMallWebService.GetCatalogueHtml(groupId, level, entity, getCatalogueHtmlSucceededCallback);
      currentObjectId = groupId;
    }
  }
}

function getCatalogueHtmlSucceededCallback(result) {
  var linkElement = elementById(currentObjectId);
  var parentElement = linkElement.parentNode;
  var groupsElement = document.createElement('div');
  
  linkElement.setAttribute('state', 'expanded');
  groupsElement.innerHTML = result;
  insertAfter(parentElement, groupsElement, linkElement.nextSibling);
  currentObjectId = null;
  hideProgress();

  if (!isRestored())
    setTimeout('restoreNodes();', 1);
}

function restoreNodes(partitionId, firstGroupId, secondGroupId, entity) {
  if (restorePartitionId == null && restoreFirstGroupId == null && restoreSecondGroupId == null) {
    restorePartitionId = partitionId == '00000000-0000-0000-0000-000000000000' ? null : partitionId;
    restoreFirstGroupId = firstGroupId == '00000000-0000-0000-0000-000000000000' ? null : firstGroupId;
    restoreSecondGroupId = secondGroupId == '00000000-0000-0000-0000-000000000000' ? null : secondGroupId;
    restoreEntity = entity;
    
    if (!isRestored())
      setTimeout('restoreNodes();', 1);
  }

  else {
    if (restorePartitionId != null) {
      var restoredId = restorePartitionId;

      restorePartitionId = null;
      processPartition(restoredId, restoreEntity);
    }

    else if (restoreFirstGroupId != null) {
      var restoredId = restoreFirstGroupId;

      restoreFirstGroupId = null;
      processNode(restoredId, 1, restoreEntity);
    }

    else if (restoreSecondGroupId != null) {
      var restoredId = restoreSecondGroupId;

      restoreSecondGroupId = null;
      processNode(restoredId, 2, restoreEntity);
    }
  }
}

function isRestored() {
  return restorePartitionId == null && restoreFirstGroupId == null && restoreSecondGroupId == null;
}