/*global window*/

function $Alert(message) {
  if(window.$Debug) { alert(message); }
}
function $AlertResource(resource) {
  if(window.$Debug) { Shared.AlertResource(resource); }
}

var Prompt = {
  Type:{YesNo:1, YesNoCancel:2},
  Option:{Yes:1, No:2, Cancel:3},
  Show:function(html, type, callback) {
    var promptContainer = document.createElement("div");
    promptContainer.className = "wl_prompt_container";

    var prompt = document.createElement("div");
    prompt.className = "wl_prompt";
    prompt.innerHTML = "<div class='wl_prompt_message_container'></div><div class='wl_prompt_option_container'></div>";
    prompt.firstChild.innerHTML = html;
    if(type === Prompt.Type.YesNo || type === Prompt.Type.YesNoCancel) {
      Shared.CreateActionElement({Tooltip:"Yes", Text:"Yes", Handler:function(e) {
        Shared.CancelEvent(e);
        document.body.removeChild(promptContainer);
        callback({Option:Prompt.Option.Yes});
      }}, prompt.lastChild);
      Shared.CreateActionElement({Tooltip:"No", Text:"No", Handler:function(e) {
        Shared.CancelEvent(e);
        document.body.removeChild(promptContainer);
        callback({Option:Prompt.Option.No});
      }}, prompt.lastChild);
    }
    if(type === Prompt.Type.YesNoCancel) {
      Shared.CreateActionElement({Tooltip:"Cancel", Text:"Cancel", Handler:function(e) {
        Shared.CancelEvent(e);
        document.body.removeChild(promptContainer);
        callback({Option:Prompt.Option.Cancel});
      }}, prompt.lastChild);
    }
    promptContainer.appendChild(prompt);

    document.body.appendChild(promptContainer);
  }
};

var Watermark = {
  Setup:function(id, watermark) {
    var blurHandler = function(e) {
      var element = Shared.GetTargetElement(e);
      if(!element.value || e.Force) {
        element.value = watermark;
        element.setAttribute("HasWatermark", "1");
      }
    };
    var focusHandler = function(e) {
      var element = Shared.GetTargetElement(e);
      if(element.getAttribute("HasWatermark")) {
        element.value = "";
        element.removeAttribute("HasWatermark");
      }
    };

    var target = Shared.GetElementById(id);

    Shared.AddHandlers(target, {blur:blurHandler, focus:focusHandler});

    blurHandler({target:target, Force:1});
  },
  HasWatermark:function(element) {
    return element.getAttribute("HasWatermark");
  }
};

function MainMenu(properties) {
  Shared.Copy(properties, this);
  this.LatestCreateDate = "";
  this.CurrentWorkspaceSortOrder = 0;

  Shared.AddHandler(Shared.GetElementById(this.NewWorkspaceId), "click", Shared.CreateDelegate(this, this.NewWorkspaceClickHandler));

  window.$LoadWorkspaces = Shared.CreateDelegate(this, function(openLastWorkspace) {
    Shared.InvokeWebService(0, 0, "../Server/Resources/WorkspaceWebService.asmx", "RetrieveAllWorkspaces", {asOf:this.LatestCreateDate}, 0, 0, 0, 0, Shared.CreateDelegate(this, function(handlerCallbackParams) {
      var mainMenuElement = Shared.GetElementById(this.MainMenuId);
      var loadingWorkspacesItemElement = Shared.GetElementById(this.LoadingWorkspacesItemId);
      if(loadingWorkspacesItemElement) { mainMenuElement.removeChild(loadingWorkspacesItemElement); }
      if(handlerCallbackParams.Succeeded) {
        var workspaces = eval(handlerCallbackParams.Result);
        var addWorkspace = this.AddWorkspace;
        var newWorkspaceItemElement = Shared.GetElementById(this.NewWorkspaceItemId);

        var existingWorkspace;
        Array.forEach(workspaces.workspaces, function(workspace) {
          existingWorkspace = document.createElement("li");
          addWorkspace(workspace, existingWorkspace);
          mainMenuElement.insertBefore(existingWorkspace, newWorkspaceItemElement);
          this.CurrentWorkspaceSortOrder = workspace.SortOrder;
        }, this);

        if(workspaces.LatestCreateDate) { this.LatestCreateDate = workspaces.LatestCreateDate; }
        if(existingWorkspace && openLastWorkspace) { window.$ToggleWorkspaceItems({target:existingWorkspace}); }
      } else {
        $AlertResource("ServerErrorMessage");
      }
    }));
  });
  window.$LoadWorkspaces();

  window.$DeleteWorkspace = Shared.CreateDelegate(this, this.DeleteWorkspace);
  window.$RenameWorkspace = Shared.CreateDelegate(this, this.RenameWorkspace);


  window.$ShowWorkspaceActions = function(e, itemType) {
    Shared.ClearTimeout(window.$WorkspaceActionsTimeoutId);
    var workspaceActions = Shared.GetElementById("workspace_actions");
    if(!workspaceActions) {
      workspaceActions = document.createElement("div");
      workspaceActions.id = "workspace_actions";
      workspaceActions.className = "wl_workspace_actions";
      workspaceActions.style.display = "none";
      workspaceActions.innerHTML = "<ul onmouseover='$DontHideWorkspaceActions(event)' onmouseout='$HideWorkspaceActions(event)'><li><a href='#DeleteWorkspace' onclick='$DeleteWorkspace(event)' title='[TODO: Localize] Delete' class='wl_workspace_action_delete'><span>[TODO: Localize] Delete</span></a></li></ul>";
      document.body.appendChild(workspaceActions);
    }

    workspaceActions.setAttribute("Guid", Shared.GetAncestor(Shared.GetTargetElement(e), function(element) { return element.tagName === "LI"; }).id);
    workspaceActions.setAttribute("ItemType", itemType);

    var targetBounds;
    if(itemType === MainMenu.ItemTypeDock) {
      targetBounds = Shared.GetBounds(Shared.GetTargetElement(e));
      workspaceActions.firstChild.style.left = "0px";
      workspaceActions.style.cssText = "left:" + (targetBounds.x + targetBounds.width) + "px;top:" + (targetBounds.y + 30) + "px;";
    } else {
      workspaceActions.firstChild.style.left = "";
      targetBounds = Shared.GetBounds(Shared.GetElementById("mainmenu"));
      var targetLocation = Shared.GetLocation(Shared.GetTargetElement(e));

      workspaceActions.style.cssText = "left:" + (targetBounds.x + targetBounds.width) + "px;top:" + targetLocation.y + "px;";
    }
  };
  window.$HideWorkspaceActions = function() {
    window.$WorkspaceActionsTimeoutId = Shared.SetTimeout(function() {
      Shared.SetVisible(Shared.GetElementById("workspace_actions"), false);
    }, 150);
  };
  window.$DontHideWorkspaceActions = function() {
    Shared.ClearTimeout(window.$WorkspaceActionsTimeoutId);
  };

  window.$ToggleWorkspaceItems = Shared.CreateDelegate(this, function(e) {
    Shared.CancelEvent(e);

    var menuItem = Shared.GetTargetElement(e);
    Shared.ClearTimeout(window.$ToggleWorkspaceItemsTimeoutId);
    window.$ToggleWorkspaceItemsTimeoutId = Shared.SetTimeout(Shared.CreateDelegate(this, function() {
      if(menuItem.tagName !== "LI") { menuItem = Shared.GetAncestor(menuItem, function(element) { return element.tagName === "LI"; }); }
      var open = Shared.GetCssClass(menuItem).indexOf("wl_menu_item_expanded") === -1;
      if(menuItem.id === this.SearchItemId && !open) { return; }

      var workspaceItemContainerIds = menuItem.getAttribute("WorkspaceItemContainerIds");
      if(workspaceItemContainerIds) { workspaceItemContainerIds = workspaceItemContainerIds.split(","); }

      if(open) {
        if(this.CurrentlyOpennedWorkspaceId) {
          var currentlyOpennedWorkspace = Shared.GetElementById(this.CurrentlyOpennedWorkspaceId);
          if(currentlyOpennedWorkspace) {
            Shared.RemoveCssClass(currentlyOpennedWorkspace, "wl_menu_item_expanded");
            var currentlyOpennedWorkspaceItemContainerIds = currentlyOpennedWorkspace.getAttribute("WorkspaceItemContainerIds");
            if(currentlyOpennedWorkspaceItemContainerIds) {
              currentlyOpennedWorkspaceItemContainerIds = currentlyOpennedWorkspaceItemContainerIds.split(",");
              Array.forEach(currentlyOpennedWorkspaceItemContainerIds, function(workspaceItemContainerId) {
                var workspaceItemContainer = Shared.GetElementById(workspaceItemContainerId);
                if(workspaceItemContainer) { Shared.SetVisible(workspaceItemContainer, false); }
              });
            }
          }
        }

        this.CurrentlyOpennedWorkspaceId = menuItem.id;
        Shared.AddCssClass(menuItem, "wl_menu_item_expanded");

        if(!workspaceItemContainerIds) {
          workspaceItemContainerIds = [];
          var workspaceItems = Shared.GetElementsByTagName(menuItem, "a");
          for(var i = 0, l = workspaceItems.length; i < l; i++) {
            var workspaceItem = workspaceItems[i];
            var workspaceItemContainerId = workspaceItem.getAttribute("ContainerId");
            if(workspaceItemContainerId) {
              window.$OpenUrl({target:workspaceItem});
              workspaceItemContainerIds.push(workspaceItemContainerId);
            }
          }
          menuItem.setAttribute("WorkspaceItemContainerIds", workspaceItemContainerIds.join());
        }
      } else {
        this.CurrentlyOpennedWorkspaceId = 0;
        Shared.RemoveCssClass(menuItem, "wl_menu_item_expanded");
      }

      if(workspaceItemContainerIds) {
        Array.forEach(workspaceItemContainerIds, function(workspaceItemContainerId) {
          var workspaceItemContainer = Shared.GetElementById(workspaceItemContainerId);
          if(workspaceItemContainer) {
            Shared.SetVisibleById(workspaceItemContainerId, open);
          } else {
            var workspaceItems2 = Shared.GetElementsByTagName(menuItem, "a");
            for(var i2 = 0, l2 = workspaceItems2.length; i2 < l2; i2++) {
              var workspaceItem2 = workspaceItems2[i2];
              if(workspaceItem2.getAttribute("ContainerId") === workspaceItemContainerId) {
                window.$OpenUrl({target:workspaceItem2});
                break;
              }
            }
          }
        });
      }

      if(!open) {
        window.$ToggleWorkspaceItems({target:Shared.GetElementById(this.SearchItemId)});
      }
    }), 200);
  });
  this.CurrentlyOpennedWorkspaceId = this.SearchItemId;
  Shared.AddHandler(Shared.GetElementById(this.SearchId), "click", window.$ToggleWorkspaceItems);

  window.$RenameWorkspaceOpenUrl = function(e) {
    Shared.CancelEvent(e);
    var target = Shared.GetTargetElement(e);
    Shared.ClearTimeout(window.$RenameWorkspaceOpenUrlTimeoutId);
    window.$RenameWorkspaceOpenUrlTimeoutId = Shared.SetTimeout(function() {
      window.$OpenUrl({target:target});
    }, 200);
  };

  var scroll = Shared.CreateDelegate(this, function(e, offset) {
    Shared.GetElementById(this.MainMenuId).parentNode.scrollTop += offset;
    window.$ScrollTimeoutId = Shared.SetTimeout(function() { scroll(0, offset); }, 20);
  });
  var offset = 5;
  Shared.AddHandler(Shared.GetElementById(this.ScrollUpId), "mouseover", function(e) { scroll(e, -offset); });
  Shared.AddHandler(Shared.GetElementById(this.ScrollDownId), "mouseover", function(e) { scroll(e, offset); });
  Array.forEach([this.ScrollUpId, this.ScrollDownId], function(id) {
    Shared.AddHandler(Shared.GetElementById(id), "mouseout", function(e) {
      Shared.ClearTimeout(window.$ScrollTimeoutId);
    });
  });
}

MainMenu.ItemTypeDock = 0;
MainMenu.ItemTypeWorkspace = 1;
MainMenu.ItemTypeWorkspaceItem = 2;
MainMenu.ItemTypeToName = ["DockItem", "Workspace", "WorkspaceItem"];

MainMenu.prototype = {
  NewWorkspaceClickHandler:function(e) {
    Shared.CancelEvent(e);

    var mainMenu = this;
    var newWorkspaceTextHandler = function(newWorkspaceText, newWorkspaceTextParent) {
      if(newWorkspaceText) {
        Shared.SetInnerHTML(newWorkspaceTextParent, mainMenu.CreatingWorkspaceMessage);
        Shared.InvokeWebService(0, 0, "../Server/Resources/WorkspaceWebService.asmx", "CreateWorkspace", {workspaceTitle:newWorkspaceText,sortOrder:++mainMenu.CurrentWorkspaceSortOrder}, 0, 0, 0, 0, function(handlerCallbackParams) {
          if(handlerCallbackParams.Succeeded) {
            mainMenu.AddWorkspace({Guid:handlerCallbackParams.Result, Title:newWorkspaceText, Items:[]}, newWorkspaceTextParent);
            window.$ToggleWorkspaceItems({target:newWorkspaceTextParent});
          } else {
            $AlertResource("ServerErrorMessage");
            Shared.GetElementById(mainMenu.MainMenuId).removeChild(newWorkspaceTextParent);
          }
        });
      } else {
        Shared.GetElementById(mainMenu.MainMenuId).removeChild(newWorkspaceTextParent);
      }
    };
    var blurKeydownHandler = function(e) {
      mainMenu.NewWorkspaceTextBlurKeydownHandler(e, newWorkspaceTextHandler);
    };

    var newWorkspace = document.createElement("li");
    var newWorkspaceText = Shared.CreateTextElement(255, newWorkspace, "[TODO]");
    Shared.AddHandlers(newWorkspaceText, {blur:blurKeydownHandler, keydown:blurKeydownHandler});
    Shared.GetElementById(this.MainMenuId).insertBefore(newWorkspace, Shared.GetElementById(this.NewWorkspaceItemId));
    newWorkspaceText.focus();
  },
  NewWorkspaceTextBlurKeydownHandler:function(e, workspaceTextHandler) {
    if(e.type === "keydown" && e.keyCode === 13) { Shared.CancelEvent(e); }
    if(e.type === "keydown" && e.keyCode !== 13 && e.keyCode !== 27) { return; }
    var newWorkspaceText = e.target.value;
    var newWorkspaceTextParent = e.target.parentNode;
    if(e.type === "keydown" && e.keyCode === 27) { newWorkspaceText = 0; }
    workspaceTextHandler(newWorkspaceText, newWorkspaceTextParent);
  },
  AddWorkspace:function(workspace, element) {
    element.id = workspace.Guid;
    element.setAttribute("ItemType", MainMenu.ItemTypeWorkspace);
    element.setAttribute("IsWorkspace", "1");
    element.setAttribute("WorkspaceTitle", workspace.Title);
    var html = ["<a href='#' onclick='$ToggleWorkspaceItems(event)' ondblclick='$RenameWorkspace(event, 1)' onmouseover='$ShowWorkspaceActions(event, MainMenu.ItemTypeWorkspace)' onmouseout='$HideWorkspaceActions(event)'>", workspace.Title, "</a><ul class='wl_submenu'>"];
    Array.forEach(workspace.Items, function(item) {
      html.push("<li id='", item.Guid, "' x='", item.x||"", "' y='", item.y||"", "' w='", item.w||"", "' h='", item.h||"", "' min='", item.min, "' max='", item.max, "' ItemType='", MainMenu.ItemTypeWorkspaceItem, "'><a href='#' onclick='$RenameWorkspaceOpenUrl(event)' ondblclick='$RenameWorkspace(event, 1)' onmouseover='$ShowWorkspaceActions(event, MainMenu.ItemTypeWorkspaceItem)' onmouseout='$HideWorkspaceActions(event)' Url='", item.Url, "' WorkGuid='", item.WorkGuid, "' ElementGuid='", item.ElementGuid, "' ContainerId='ContainerIdFor_", item.Guid, "' DefinitionId='", item.Guid, "'>", item.Title, "</a></li>");
    });
    html.push("</ul>");
    element.innerHTML = html.join("");
  },
  DeleteWorkspace:function(e) {
    Shared.CancelEvent(e);
    window.$HideWorkspaceActions();

    var menu = Shared.GetAncestor(Shared.GetTargetElement(e), function(element) { return element.getAttribute("Guid"); });
    var guid = menu.getAttribute("Guid");
    var itemType = parseInt(menu.getAttribute("ItemType"), 10);
    var item = Shared.GetElementById(guid);

    var containers = [];
    var changedDataViews = [];
    var containerIdElements = Shared.GetElementsByTagName(item, "a");
    var recordChangedDataViews = function(name, dataView) {
      if(dataView.HasDataChanges()) {
        changedDataViews.push(dataView);
      }
    };
    for(var i = 0, l = containerIdElements.length; i < l; i++) {
      var containerId = containerIdElements[i].getAttribute("ContainerId");
      if(containerId) {
        var container = Shared.GetElementById(containerId);
        if(container) {
          containers.push(container);
          var doc = Shared.GetFrameDocument(container.$GetFrame());
          var dataView = Shared.GetDocumentWindow(doc).DataView;
          if(dataView) {
            var gridNameToDataViewMap = dataView.GridNameToDataViewMap;
            Shared.For(gridNameToDataViewMap, recordChangedDataViews);
          }
        }
      }
    }
    var changes = changedDataViews.length;

    var message = this.WorkspaceDeleteMessage[(changes ? "Unsaved" : "No") + "Changes"][MainMenu.ItemTypeToName[itemType]];
    Prompt.Show(message, Prompt.Type["YesNo" + (changes ? "Cancel" : "")], function(args) {
      if(args.Option === Prompt.Option[changes ? "Cancel" : "No"]) { return; }

      item.parentNode.removeChild(item);

      if(changes && args.Option === Prompt.Option.Yes) {
        Array.forEach(containers, function(container) { Shared.SetVisible(container, false); });

        var numberOfSaves = 0;
        Array.forEach(changedDataViews, function(dataView) {
          dataView.ActionSave({CallbackSaveResult:function(result, success) {
            numberOfSaves++;
            dataView.CallbackSaveResult(result, success);
            if(numberOfSaves === changedDataViews.length) {
              Array.forEach(containers, function(container) { container.$CloseModal(); });
            }
          }});
        });
      } else {
        Array.forEach(containers, function(container) { container.$CloseModal(); });
      }

      if(itemType === MainMenu.ItemTypeDock) {
        Shared.InvokeWebService(0, 0, "../Server/Resources/DockItemWebService.asmx", "DeleteDockItem", {dockItemGuid:guid});
      } else if(itemType === MainMenu.ItemTypeWorkspace) {
        Shared.InvokeWebService(0, 0, "../Server/Resources/WorkspaceWebService.asmx", "DeleteWorkspace", {workspaceGuid:guid});
      } else if(itemType === MainMenu.ItemTypeWorkspaceItem) {
        Shared.InvokeWebService(0, 0, "../Server/Resources/WorkspaceItemWebService.asmx", "DeleteWorkspaceItem", {workspaceItemGuid:guid});
      }
    });
  },
  RenameWorkspace:function(e, direct) {
    Shared.CancelEvent(e);
    window.$HideWorkspaceActions();
    Shared.ClearTimeout(window.$ToggleWorkspaceItemsTimeoutId);
    Shared.ClearTimeout(window.$RenameWorkspaceOpenUrlTimeoutId);

    var target = Shared.GetTargetElement(e);
    var container = direct ? target.parentNode : Shared.GetAncestor(Shared.GetTargetElement(e), function(element) { return element.getAttribute("Guid"); });
    var guid = direct ? container.id : container.getAttribute("Guid");
    var itemType = parseInt(container.getAttribute("ItemType"), 10);

    var item = Shared.GetElementById(guid);
    var oldLink = Shared.GetElementsByTagName(item, "a")[0];
    var oldText = oldLink.innerHTML;
    var newWorkspaceTextElement = Shared.CreateTextElement(255, item, "[TODO]");
    newWorkspaceTextElement.value = oldText;

    var mainMenu = this;
    var newWorkspaceTextHandler = function(newWorkspaceText, newWorkspaceTextParent) {
      if(newWorkspaceText) {
        if(itemType === MainMenu.ItemTypeDock) {
          Shared.InvokeWebService(0, 0, "../Server/Resources/DockItemWebService.asmx", "UpdateDockItemTitle", {dockItemGuid:guid, dockItemTitle:newWorkspaceText});
        } else if(itemType === MainMenu.ItemTypeWorkspace) {
          Shared.InvokeWebService(0, 0, "../Server/Resources/WorkspaceWebService.asmx", "UpdateWorkspaceTitle", {workspaceGuid:guid, workspaceTitle:newWorkspaceText});
        } else if(itemType === MainMenu.ItemTypeWorkspaceItem) {
          Shared.InvokeWebService(0, 0, "../Server/Resources/WorkspaceItemWebService.asmx", "UpdateWorkspaceItemTitle", {workspaceItemGuid:guid, workspaceItemTitle:newWorkspaceText});
        }
        oldLink.innerHTML = newWorkspaceText;
      }
      item.insertBefore(oldLink, newWorkspaceTextElement);
      item.removeChild(newWorkspaceTextElement);
    };
    var blurKeydownHandler = function(e) {
      mainMenu.NewWorkspaceTextBlurKeydownHandler(e, newWorkspaceTextHandler);
    };

    Shared.AddHandlers(newWorkspaceTextElement, {blur:blurKeydownHandler, keydown:blurKeydownHandler});

    item.insertBefore(newWorkspaceTextElement, oldLink);
    item.removeChild(oldLink);
    newWorkspaceTextElement.focus();
  }
};

function Dock(properties) {
  Shared.Copy(properties, this);
  Shared.AddHandler(Shared.GetElementById(this.OpenId), "click", Shared.CreateDelegate(this, this.OpenClickHandler));
  Shared.AddHandler(Shared.GetElementById(this.CloseId), "click", Shared.CreateDelegate(this, this.CloseClickHandler));

  Shared.InvokeWebService(0, 0, "../Server/Resources/DockItemWebService.asmx", "RetrieveAllDockItems", 0, 0, 0, 0, 0, Shared.CreateDelegate(this, function(handlerCallbackParams) {
    if(handlerCallbackParams.Succeeded) {
      var itemsHTML = [];
      var dockItems = eval(handlerCallbackParams.Result);


      var getItemCssClass = Dock.GetItemCssClass;
      Array.forEach(dockItems, function(item) {
        itemsHTML.push("<li id='", item.Guid, "' x='", item.x||"", "' y='", item.y||"", "' w='", item.w||"", "' h='", item.h||"", "' min='", item.min, "' max='", item.max, "' ItemType='", MainMenu.ItemTypeDock, "'><div class='", getItemCssClass(item.WorkGuid, item.ElementGuid, item.Url), "'></div><a href='#' onclick='$RenameWorkspaceOpenUrl(event)' ondblclick='$RenameWorkspace(event, 1)' onmouseover='$ShowWorkspaceActions(event, MainMenu.ItemTypeDock)' onmouseout='$HideWorkspaceActions(event)' Url='", item.Url, "' WorkGuid='", item.WorkGuid, "' ElementGuid='", item.ElementGuid, "' ContainerId='ContainerIdFor_", item.Guid, "' DefinitionId='", item.Guid, "'>", item.Title, "</a></li>");
      });
      var dockItemsListElement = Shared.GetElementsByTagName(Shared.GetElementById(this.DockId), "ul")[0];
      dockItemsListElement.innerHTML = itemsHTML.join("");

      var dockItemsListParentElement = dockItemsListElement.parentNode;
      Shared.AddHandler(dockItemsListParentElement, "mousedown", function(e) {
        Shared.CancelEvent(e);
        var originalX = dockItemsListParentElement.scrollLeft + e.screenX;

        var mouseMoveHandler = function(e) {
          Shared.CancelEvent(e);
          dockItemsListParentElement.scrollLeft = originalX - e.screenX;
        };
        var mouseUpHandler = function(e) {
          Shared.RemoveHandlers(document, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});
          Shared.RemoveCssClass(dockItemsListParentElement, "wl_dock_items_container_grabbed");
        };

        Shared.AddHandlers(document, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});
        Shared.AddCssClass(dockItemsListParentElement, "wl_dock_items_container_grabbed");
      });
    } else {
      $AlertResource("ServerErrorMessage");
    }
  }));
}

Dock.GetItemCssClass = function(workGuid, elementGuid, url) {
  if(elementGuid === "33b70b49-9ce1-41de-a828-c829fbd55ad9") {

    var suffix = ({
      "4253FC41-60A7-4CB2-8D06-BC6856C3375F":"1",
      "83F9F959-F7AE-44B8-92FF-E1EEE53D9005":"2",
      "1F1CF4FD-6229-4610-A66C-9BCD0C847E73":"2",
      "3E954527-9546-4CBA-AF1E-F1162F92E0E5":"3",
      "9406DEE6-52C7-445D-A1B7-3EDDD241B1BD":"4",
      "DAB722B0-EE50-438C-93D9-4A35A72C44F0":"5",

      "586C7D13-7E23-448F-A251-F5AB66555BC6":"2",
      "C211237B-0796-4183-8705-E71B6A9BE04B":"1",
      "7186D34D-0747-47D4-BA72-2E2845F9F18E":"1",
      "2D88AA15-684E-44C9-9FBC-CF40725F715B":"6",
      "2CAA2F28-760B-40F0-9066-DA578401734D":"2",
      "B24742C4-90CD-4718-A080-390B793E3AEF":"3",
      "4D3FD9D3-9663-44A9-8230-6A5BDC4ED07B":"7",
      "8052EFF6-A621-4508-9938-8FB7920AB913":"7",
      "89F56EB3-C598-4DDF-8F05-A24642645ACA":"2",
      "7E56B50D-D03F-409E-9213-F70CE9FC3BA9":"2",
      "C4084187-F223-4281-9620-75990D166E9C":"8",
      "44354641-4635-4237-2D33-3043442D3434":"8",
      "30F0D533-9D78-45D4-8D84-51A28428C837":"8",
      "C0C0A52E-33A4-4C46-80C3-711530A81190":"6",
      "BA92A9D9-95E3-4D68-ABBF-DC40E5BF829F":"9",
      "F641082B-8580-4EEE-93EA-ABD7B3C6123F":"9",
      "3516EA6D-BC53-482F-838C-AF1FA75017A1":"3",
      "1A33CCD5-B295-4B43-AD7D-E073E00B0239":"3",
      "A122DEA1-1A13-4624-B90C-B569A923EC8C":"4",
      "B6BE8EDF-2ABD-9F40-B8FD-E221929635A7":"8",
      "D7FA6B22-F645-4BD4-8656-0175FABDEB43":"5",
      "39B4FD27-F704-4C73-87AC-0626C4EE07DF":"2",
      "0F6B1F73-9ECE-4CEA-8AAB-3D2008BF5CCD":"9",
      "538818A8-7302-49F4-A56A-6FDA0E327FB4":"9"

    })[Shared.GetQSVars(url).report_guid.toUpperCase()] || "";

    suffix = "report" + suffix;
  } else if(workGuid && elementGuid) {

    suffix = "tool";
  } else {

    suffix = "inventory";
  }
  return "wl_dock_item wl_dock_item_" + suffix;
};

Dock.prototype = {
  OpenClickHandler:function(e) {
    Shared.CancelEvent(e);
    var offset = {x:0, y:0};
    if((Sys.Browser.agent === Sys.Browser.InternetExplorer && Sys.Browser.version === 8) || Sys.Browser.agent === Sys.Browser.Safari) { offset = {x:2, y:2}; }
    if(Sys.Browser.agent === Sys.Browser.InternetExplorer) { offset.y -= document.documentElement.scrollTop; }
    var bounds = Shared.GetBounds(Shared.GetElementById(this.OpenId));
    Shared.GetElementById(this.DockId).style.position = "fixed";
    Shared.GetElementById(this.DockId).style.left = (bounds.x + offset.x).toString() + "px";
    Shared.GetElementById(this.DockId).style.top = (bounds.y + offset.y).toString() + "px";
    Shared.SetVisibleById(this.DockId, true);
    Shared.GetElementById(this.CloseId).focus();
  },
  CloseClickHandler:function(e) {
    Shared.CancelEvent(e);
    Shared.SetVisibleById(this.DockId, false);
  }
};

function SearchPage(properties) {
  this.Shadow = 15;
  this.NormalTop = 118;
  this.NormalLeft = 240;
  this.TopContainerZIndex = 100;
  this.ImagePath = "/umbraco/webservices/images/";
  
  Shared.Copy(properties, this);
  window.$OpenUrl = Shared.CreateDelegate(this, this.OpenUrl);
  window.$ChangeUrl = Shared.CreateDelegate(this, this.ChangeUrl);

  var arrangeWorkspaceClickHandler = Shared.CreateDelegate(this, this.ArrangeWorkspaceClickHandler);
  //Shared.AddHandler(document, "dblclick", arrangeWorkspaceClickHandler);
  //Shared.AddHandler(Shared.GetElementById(this.ArrangeWorkspaceId), "click", arrangeWorkspaceClickHandler);

  var createBackground = function(modal) {
    var background = document.createElement("div");
    background.className = "wl_modal_background";
    background.style.cssText = "width:" + Shared.GetWindowWidth() + "px;height:" + Shared.GetWindowHeight() + "px;z-index:" + modal.style.zIndex + ";";
    return background;
  };

  window.$MoveMouseDown = function(e) {
    var target = Shared.GetTargetElement(e);

    if(target.tagName in {A:1, IMG:1}) { return; }

    Shared.CancelEvent(e);
    var modal = Shared.GetAncestor(target, function(element) { return element.getAttribute("IsModal"); });
    var cover = modal.$GetCover();
    var iframe = modal.$GetFrame();
    var originalCoordinates = {x:parseInt(modal.style.left, 10) - e.screenX, y:parseInt(modal.style.top, 10) - e.screenY};


    cover.style.display = "block";



    var background = createBackground(modal);
    document.body.insertBefore(background, modal);

    var windowHandlers = {};
    var mouseMoveHandler = function(e) {
      Shared.CancelEvent(e);










      modal.style.left = (originalCoordinates.x + e.screenX) + "px";






      modal.style.top = (originalCoordinates.y + e.screenY) + "px";




      return false;
    };
    var mouseUpHandler = function(e) {
      modal.$UpdateBounds();
      cover.style.cursor = "";
      cover.style.display = "";
      background.style.cursor = "";

      document.body.removeChild(background);
      Shared.RemoveHandlers(window, windowHandlers);
      Shared.RemoveHandlers(document, windowHandlers);
      Shared.RemoveHandlers(cover, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});
      Shared.RemoveHandlers(target, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});
      Shared.RemoveHandlers(background, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});
    };
    windowHandlers.mouseout = function(e) {
      var target = Shared.GetTargetElement(e);
      if(!target || target.tagName === "HTML") {
        mouseUpHandler(e);
      }
    };

    cover.style.cursor = "move";
    background.style.cursor = "move";
    Shared.AddHandlers(window, windowHandlers);
    Shared.AddHandlers(document, windowHandlers);
    Shared.AddHandlers(cover, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});
    Shared.AddHandlers(target, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});
    Shared.AddHandlers(background, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});

    return false;
  };

  window.$ResizeMouseDown = function(e) {
    Shared.CancelEvent(e);

    var target = Shared.GetTargetElement(e);
    var resizeHeightOnly = target.getAttribute("IsModalResize");
    var modal = Shared.GetAncestor(target, function(element) { return element.getAttribute("IsModal"); });

    var cover = modal.$GetCover();
    var iframe = modal.$GetFrame();

    var originalSize = {width:parseInt(modal.style.width, 10) - e.screenX, height:parseInt(iframe.style.height, 10) - e.screenY};


    cover.style.display = "block";



    var background = createBackground(modal);
    document.body.insertBefore(background, modal);

    var windowHandlers = {};
    var mouseMoveHandler = function(e) {
      Shared.CancelEvent(e);
      iframe.style.height = (originalSize.height + e.screenY) + "px";
      if(!resizeHeightOnly) {
        modal.style.width = (originalSize.width + e.screenX) + "px";
      }
      return false;
    };
    var mouseUpHandler = function(e) {
      modal.$UpdateBounds();
      cover.style.cursor = "";
      cover.style.display = "";
      background.style.cursor = "";

      document.body.removeChild(background);
      Shared.RemoveHandlers(window, windowHandlers);
      Shared.RemoveHandlers(document, windowHandlers);
      Shared.RemoveHandlers(cover, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});
      Shared.RemoveHandlers(background, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});
    };
    windowHandlers.mouseout = function(e) {
      var target = Shared.GetTargetElement(e);
      if(!target || target.tagName === "HTML") {
        mouseUpHandler(e);
      }
    };

    var cursor = resizeHeightOnly ? "s-resize" : "se-resize";
    cover.style.cursor = cursor;
    background.style.cursor = cursor;
    Shared.AddHandlers(window, windowHandlers);
    Shared.AddHandlers(document, windowHandlers);
    Shared.AddHandlers(cover, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});
    Shared.AddHandlers(background, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});

    return false;
  };

  window.$OpenAdmin = function(e) {
    Shared.CancelEvent(e);

    var menuItems = [
      {Label:"EDS", Url:"/Scheduling/Work/Drivers/CreateConnection.aspx"},
      {Label:"Manage Users", Url:"/Users/_UserList.aspx"},
      {Label:"Your tools", Url:"/CustomTool/CustomToolBuilder.aspx"},
      {Label:"Tool assignment", Url:"/Scheduling/Work/_WorkClassElementList.aspx"},
      {Label:"Payment types", Url:"/Expenses/PaymentTypeList.aspx"},
      {Label:"Risk types", Url:"/Risk/RiskTypeList.aspx"},
      {Label:"SI types", Url:"/StrategicInitiative/StrategicInitiativeTypeList.aspx"},
      {Label:"Work types", Url:"/Scheduling/Work/WorkTypeList.aspx"},
      {Label:"Scheduled jobs", Url:"/Admin/BackgroundJobList.aspx"},
      {Label:"Manage reports", Url:"/Reports/ReportList.aspx"},
      {Label:"Global calendar", Url:"/Calendaring/GlobalCalendar.aspx"},
      {Label:"High Level Audit Log", Url:"/Reports/SingleReportDisplay.aspx?report_guid=CC277867-066B-40A0-93CB-7E48AAC38E05"},
      {Label:"Detailed Audit Log", Url:"/Reports/SingleReportDisplay.aspx?report_guid=E00A883F-8A4D-41A1-B114-ED7404C34AC9"}
    ];

    window.$OpenUrl(0, {title:"Administrator", menuItems:menuItems, defaultMenuItemIndex:1});
  };

  window.$OpenMenuItem = function(e) {
    Shared.CancelEvent(e);
    var target = Shared.GetTargetElement(e);
    var modal = Shared.GetAncestor(target, function(element) { return element.getAttribute("IsModal"); });
    var iframe = modal.$GetFrame();
    iframe.src = target.getAttribute("Url");
    iframe.title = target.innerHTML;

    var selectedMenuItem = Shared.GetAncestor(target, function(element) { return element.tagName === "LI"; });
    var menuItems = Shared.GetElementsByTagName(selectedMenuItem.parentNode, "li");
    for(var i = 0, l = menuItems.length; i < l; i++) {
      menuItems[i].removeAttribute("IsSelected");
    }
    selectedMenuItem.setAttribute("IsSelected", "1");
  };

  /*Shared.InvokeWebService(0, 0, "../Server/Resources/ResourceWebService.asmx", "GetResourceInfo", 0, 0, 0, 0, 0, Shared.CreateDelegate(this, function(handlerCallbackParams) {
    if(handlerCallbackParams.Succeeded) {
      var resourceInfo = eval(handlerCallbackParams.Result);
      if(resourceInfo.IsChatEnabled) {
        Shared.SetInnerHTML(this.ChatContainerId, "<iframe src='" + this.NormalizeUrl("/Core/Utility/ChatLoader.aspx") + "' title='[TODO: Set with localized description.]' frameborder='0' scrolling='no' ALLOWTRANSPARENCY='true'/>");
      }
    } else {
      $AlertResource("ServerErrorMessage");
    }

  }));*/
}

Shared.Copy(
  {
    CloseModal:function() {
      var modal = this;
      document.body.removeChild(modal);
    },
    GetModalFrame:function() {
      var modal = this;
      return Shared.GetElementsByTagName(modal, "iframe")[0];
    },
    GetModalCover:function() {
      var modal = this;
      for(var childNodes = modal.childNodes, i = childNodes.length - 1; 0 <= i; i--) {
        var childNode = childNodes[i];
        if(childNode.getAttribute("IsCover")) {
          return childNode;
        }
      }
    },
    SetModalRestoreTo:function() {
      var modal = this;
      var iframe = modal.$GetFrame();
      modal.setAttribute("RestoreTo", modal.style.top + "," + modal.style.left + "," + (modal.style.width || modal.$GetRestoreTo().Width) + "," + iframe.style.height);
    },
    IsModalMinimized:function() {
      var modal = this;
      return Shared.ContainsCssClass(modal, "wl_modal_minimized");
    },
    GetModalRestoreTo:function() {
      var modal = this;
      var restoreTo = modal.getAttribute("RestoreTo").split(",");
      return {Top:restoreTo[0], Left:restoreTo[1], Width:restoreTo[2], Height:restoreTo[3]};
    },
    UpdateModalBounds:function() {

      var modal = this;
      modal.$SetRestoreTo();
      var definitionId = modal.getAttribute("DefinitionId");
      if(definitionId) {
        var boundsElement = Shared.GetElementById(definitionId);
        if(boundsElement) {
          var iframe = modal.$GetFrame();
          var bounds = {x:parseInt(modal.style.left, 10), y:parseInt(modal.style.top, 10), width:parseInt(modal.style.width || boundsElement.getAttribute("w"), 10), height:parseInt(iframe.style.height, 10)};
          boundsElement.setAttribute("x", bounds.x);
          boundsElement.setAttribute("y", bounds.y);
          boundsElement.setAttribute("w", bounds.width);
          boundsElement.setAttribute("h", bounds.height);

          var itemType = parseInt(boundsElement.getAttribute("ItemType"), 10);
          if(itemType === MainMenu.ItemTypeDock) {
            bounds.dockItemGuid = definitionId;
            Shared.InvokeWebService(0, 0, "../Server/Resources/DockItemWebService.asmx", "UpdateDockItemBounds", bounds);
          } else if(itemType === MainMenu.ItemTypeWorkspaceItem) {
            bounds.workspaceItemGuid = definitionId;
            Shared.InvokeWebService(0, 0, "../Server/Resources/WorkspaceItemWebService.asmx", "UpdateWorkspaceItemBounds", bounds);
          } else {
            $Alert("Type '" + itemType + "' not supported.");
          }
        }
      }
    },
    UpdateModalVisualState:function(minimized, maximized) {
      var modal = this;
      var definitionId = modal.getAttribute("DefinitionId");
      if(definitionId) {
        var boundsElement = Shared.GetElementById(definitionId);
        if(boundsElement) {
          var bounds = {minimized:!!minimized, maximized:!!maximized};
          boundsElement.setAttribute("min", minimized);
          boundsElement.setAttribute("max", maximized);

          var itemType = parseInt(boundsElement.getAttribute("ItemType"), 10);
          if(itemType === MainMenu.ItemTypeDock) {
            bounds.dockItemGuid = definitionId;
            Shared.InvokeWebService(0, 0, "../Server/Resources/DockItemWebService.asmx", "UpdateDockItemVisualState", bounds);
          } else if(itemType === MainMenu.ItemTypeWorkspaceItem) {
            bounds.workspaceItemGuid = definitionId;
            Shared.InvokeWebService(0, 0, "../Server/Resources/WorkspaceItemWebService.asmx", "UpdateWorkspaceItemVisualState", bounds);
          } else {
            $Alert("Type '" + itemType + "' not supported.");
          }
        }
      }
    }
  }, SearchPage
);

SearchPage.prototype = {
  NormalizeUrl:function(url) {
    if(url.charAt(0) === "/" && !url.toLowerCase().startsWith(this.ApplicationPath.toLowerCase())) { url = this.ApplicationPath + url; }
    return url;//Shared.AddToUrl(Shared.RemoveFromUrl(url, ["BorderDisplay", "StyleSetName"]), {BorderDisplay:"No", StyleSetName:this.StyleSetName});
  },
  ChangeUrl:function(e) {
    Shared.CancelEvent(e);
    var target = Shared.GetTargetElement(e);
    var modal = Shared.GetAncestor(target, function(element) { return element.getAttribute("IsModal"); });
    var currentHolder = Shared.GetAncestor(target, function(element) { return element.getAttribute("WorkGuid"); });
    var workGuid = currentHolder.getAttribute("WorkGuid");
    var elementGuid = currentHolder.getAttribute("ElementGuid");

    var iframe = modal.$GetFrame();
    var source = iframe.src;
    if(target.getAttribute("WorkGuid")) {
      source = source.replace(workGuid, target.getAttribute("WorkGuid"));
      workGuid = target.getAttribute("WorkGuid");
    } else if(target.getAttribute("ElementGuid")) {
      source = Shared.AddToUrl(target.getAttribute("Url"), {work_guid:workGuid});
      elementGuid = target.getAttribute("ElementGuid");
    }
    modal.$SetToolTitle(workGuid, elementGuid);
    iframe.src = this.NormalizeUrl(source);
  },
  OpenUrl:function(e, properties) {
    Shared.CancelEvent(e);

    var target = Shared.GetTargetElement(e);
    var url = target ? target.getAttribute("Url") : properties.url;
    var workGuid = target ? target.getAttribute("WorkGuid") : 0;
    var elementGuid = target ? target.getAttribute("ElementGuid") : 0;
    var containerId = target ? target.getAttribute("ContainerId") : 0;
    var definitionId = target ? target.getAttribute("DefinitionId") : 0;

    var menuHTML = "";
    var menuWidth = 0;
    var menuItemLabel = "";
    var frameContainerPadding = 15;
    if(properties && properties.menuItems) {
      var defaultMenuItem = properties.menuItems[properties.defaultMenuItemIndex];
      url = defaultMenuItem.Url;
      menuItemLabel = defaultMenuItem.Label;
      menuWidth = 150;
      menuHTML = ["<ul class='wl_modal_body_menu' style='margin-top:", frameContainerPadding, "px;width:", menuWidth, "px;'>"];
      Array.forEach(properties.menuItems, function(menuItem) {
        menuHTML.push("<li", menuItem.Url === url ? " IsSelected='1'" : "", "><a href='#", menuItem.Label, "' onclick='$OpenMenuItem(event)' Url='", this.NormalizeUrl(menuItem.Url), "'>", menuItem.Label, "</a></li>");
      }, this);
      menuHTML.push("</ul>");
      menuHTML = menuHTML.join("");
    }

    var bringToTopEventHandler = Shared.CreateDelegate(this, function(e) {
      var target = Shared.GetTargetElement(e);

      if(target.tagName === "A") { return; }

      if(!target.getAttribute("IsModal")) { target = Shared.GetAncestor(target, function(element) { return element.getAttribute("IsModal"); }); }
      if(target.style.zIndex !== this.TopContainerZIndex) {
        target.style.zIndex = ++this.TopContainerZIndex;

        var topContainer = this.TopContainer;
        if(topContainer) { Shared.RemoveCssClass(topContainer, "wl_modal_top"); }


        this.TopContainer = topContainer = target;

        Shared.AddCssClass(topContainer, "wl_modal_top");


      }
    });

    if(containerId) {
      var existingContainer = Shared.GetElementById(containerId);
      if(existingContainer) {
        bringToTopEventHandler({target:existingContainer});
        return;
      }
    }

    if(!url) {
      $Alert("[TODO: No url specified]");
      return;
    }

    url = this.NormalizeUrl(url);

    var maxTop = 10;
    var maxLeft = 5;
    var shadow = this.Shadow;
    var titleBarHeight = 35;
    var containerBottomPadding = 10;
    var frameContainerPaddingTopAndBottom = 0;

    var calculateWidthOffset = function() { return frameContainerPaddingTopAndBottom + shadow + menuWidth; };
    var calculateHeightOffset = function() { return titleBarHeight + frameContainerPaddingTopAndBottom + containerBottomPadding + shadow; };

    var maxWidth = Shared.GetWindowWidth() - (maxLeft * 2) - calculateWidthOffset();
    var maxHeight = Shared.GetWindowHeight() - (maxTop * 2) - calculateHeightOffset();

    var top = 80;//this.NormalTop;
    var left = 150;//this.NormalLeft;
    var width = Math.floor(Shared.GetWindowWidth()*.75);//1210;//Math.min(Shared.GetWindowWidth() - (left * 1.5) - frameContainerPaddingTopAndBottom - shadow, 675) - menuWidth;
    var height = Math.floor(Shared.GetWindowHeight()*.75);//Math.
    var minimized = 0;
    var maximized = 0;
    var container = document.createElement("div");

    if(containerId) { container.id = containerId; }

    if(definitionId) {
      container.setAttribute("DefinitionId", definitionId);
      var boundsElement = Shared.GetElementById(definitionId);
      if(boundsElement.getAttribute("x")) {
        top = parseInt(boundsElement.getAttribute("y"), 10);
        left = parseInt(boundsElement.getAttribute("x"), 10);
        width = parseInt(boundsElement.getAttribute("w"), 10);
        height = parseInt(boundsElement.getAttribute("h"), 10);
      }
      minimized = parseInt(boundsElement.getAttribute("min"), 10);
      maximized = parseInt(boundsElement.getAttribute("max"), 10);
    } else if(properties && properties.height && properties.width) {
      top = properties.y || ((Shared.GetWindowHeight() - properties.height) / 2);
      left = properties.x || ((Shared.GetWindowWidth() - properties.width) / 2);
      width = properties.width;
      height = properties.height;
    }

    var closeText = this.Modal.CloseText;
    var refreshText = this.Modal.RefreshText;
    var restoreText = this.Modal.RestoreText;
    var minimizeText = this.Modal.MinimizeText;
    var maximizeText = this.Modal.MaximizeText;
    var uId = new Date();
    uId = uId.getTime().toString()+"_modal";

    container.className = "wl_modal";
    container.setAttribute("IsModal", "1");
    container.setAttribute("id",uId);
    container.style.cssText = "position:fixed;top:" + top + "px;left:" + left + "px;width:" + width + "px;z-index:-1;";
    container.innerHTML =
      (Shared.IsIE() ? "<div class='wl_modal_corner wl_modal_corner_tl'></div><div class='wl_modal_corner wl_modal_corner_tr'></div>" : "") +
      "<div class='wl_modal_header' style='height:" + titleBarHeight + "px;' onmousedown='$MoveMouseDown(event)'>" +

      "<ul class='wl_modal_header_label'><li>" + this.Modal.LoadingMessage + "</li></ul>" +
      "<ul class='wl_modal_header_menu'>" +
      "<li><a class='wl_modal_header_menu_refresh' href='#ModalRefresh' title='" + refreshText + "'><span>" + refreshText + "</span></a></li>" +
      //"<li><a class='wl_modal_header_menu_minimize' href='#ModalMinimize' title='" + minimizeText + "'><span>" + minimizeText + "</span></a></li>" +
      "<li><a  class='wl_modal_header_menu_minimize' href='#ModalMinimize' style='margin-left: 0px; height: 0px;'></a></li>" +
      "<li><a class='wl_modal_header_menu_maximize' href='#ModalMaximize' title='" + maximizeText + "'><span>" + maximizeText + "</span></a></li>" +
      "<li><a class='wl_modal_header_menu_close' href='#ModalClose' title='" + closeText + "'><span>" + closeText + "</span></a></li>" +
      "</ul>" +
      "</div>" +
      menuHTML +
      "<div class='wl_modal_frame_container' style='margin-left:" + menuWidth + "px;padding:0 " + frameContainerPadding + "px;'>" +
      "<iframe src='" + url + "' style='border-width:0;height:"+ height + "px;width:100%;' frameBorder='0' title='" + menuItemLabel + "'" + (properties && properties.noscroll ? " scrolling='no'" : "") + "></iframe>" +
      "</div>" +
      "<div class='wl_modal_cover' IsCover='1'></div>" +
      (Shared.IsIE() ? "<div class='wl_modal_corner wl_modal_corner_bl'></div><div class='wl_modal_corner wl_modal_corner_br'></div>" : "") +
      "<div class='wl_modal_resize' IsModalResize='1' onmousedown='$ResizeMouseDown(event)' style='cursor:s-resize;height:" + containerBottomPadding + "px;'><div style='cursor:se-resize;float:right;height:" + containerBottomPadding + "px;width:" + containerBottomPadding + "px;'></div></div>";

    container.$GetFrame = SearchPage.GetModalFrame;
    container.$GetCover = SearchPage.GetModalCover;
    container.$CloseModal = SearchPage.CloseModal;
    container.$IsMinimized = SearchPage.IsModalMinimized;
    container.$SetRestoreTo = SearchPage.SetModalRestoreTo;
    container.$GetRestoreTo = SearchPage.GetModalRestoreTo;
    container.$UpdateBounds = SearchPage.UpdateModalBounds;
    container.$UpdateVisualState = SearchPage.UpdateModalVisualState;
    container.$CalculateWidthOffset = calculateWidthOffset;
    container.$CalculateHeightOffset = calculateHeightOffset;

    container.$SetRestoreTo();
    var cover = container.$GetCover();
    var links = Shared.GetElementsByTagName(container, "a");
    var iframe = container.$GetFrame();

    iframe.$CloseFrame = function() { container.$CloseModal(); };

    Shared.AddHandler(cover, "mousedown", bringToTopEventHandler);
    var maximizeRestoreHandler = function(e) {
      Shared.CancelEvent(e);
      if(maximizeRestoreLink.title === restoreText) {
        maximizeRestoreLink.title = maximizeText;
        Shared.GetElementsByTagName(maximizeRestoreLink, "span").innerHTML = maximizeText;
        Shared.RemoveCssClass(container, "wl_modal_minimized");
        var restoreTo = container.$GetRestoreTo();
        container.style.top = restoreTo.Top;
        container.style.left = restoreTo.Left;
        container.style.width = restoreTo.Width;
        iframe.style.height = restoreTo.Height;
        container.$UpdateVisualState(0, 0);
      } else {
        maximizeRestoreLink.title = restoreText;
        Shared.GetElementsByTagName(maximizeRestoreLink, "span").innerHTML = restoreText;
        container.$SetRestoreTo();
        container.style.top = maxTop + "px";
        container.style.left = maxLeft + "px";
        container.style.width = maxWidth + "px";
        iframe.style.height = maxHeight + "px";
        container.$UpdateVisualState(0, 1);
      }
    };
    Shared.AddHandler(iframe, "load", Shared.CreateDelegate(this, function(e) {
      if(container === this.TopContainer && !container.$IsMinimized()) {

        Shared.AddCssClass(container, "wl_modal_top");
        
        var iframeContents = $("iframe",container).contents();
        if(iframeContents.find("#sideRight").length>0) {
            document.body.removeChild(container);
        } else if(Shared.GetWindowHeight()<=768 || Shared.GetWindowWidth()<=1024) {
           maximizeRestoreHandler(e)
        } else if(iframeContents.find(".slidercontainer").length>0) {
            maximizeRestoreHandler(e)
        }
      }
    }));

    var maximizeRestoreLink = links[2];
    var minimizeHandler = Shared.CreateDelegate(this, function(e) {
      Shared.CancelEvent(e);
      maximizeRestoreLink.title = restoreText;
      Shared.GetElementsByTagName(maximizeRestoreLink, "span").innerHTML = restoreText;
      container.style.width = null;
      Shared.AddCssClass(container, "wl_modal_minimized");
      this.ArrangeMinimizedModals(); // [TODO: Inefficient on bulk opening.]
      container.$UpdateVisualState(1, 0);
    });
    
    Shared.AddHandler(links[0], "click", function(e) {
      Shared.CancelEvent(e);
      var doc = Shared.GetFrameDocument(iframe);
      Shared.GetDocumentWindow(doc).location.reload();
    });
    Shared.AddHandler(links[1], "click", minimizeHandler);
    //Shared.AddHandler(maximizeRestoreLink, "click", maximizeRestoreHandler);
    $(maximizeRestoreLink).click(maximizeRestoreHandler);
    Shared.AddHandler(links[3], "click", function(e) {
      Shared.CancelEvent(e);
      document.body.removeChild(container);
    });
    if(minimized) { minimizeHandler(0); } // [TODO: Inefficient on bulk opening.]
    if(maximized) { maximizeRestoreHandler(0); }
    container.$Restore = function() {
      if(maximizeRestoreLink.title === restoreText) {
        maximizeRestoreHandler(0);
      }
    };

    var setModalTitle = function(title1, title2) {
      var titleElement = Shared.GetElementsByTagName(container, "ul")[0];
      Shared.SetInnerHTML(titleElement, "<li>" + title1 + "</li>" + (title2 ? "<li>" + title2 + "</li>" : ""));
      if(minimized) { minimizeHandler(0); } // [TODO: Inefficient on bulk opening.]
    };
    if(properties && properties.menuItems) {
      Shared.AddHandler(iframe, "load", function(e) {
        setModalTitle(properties.title, e.target.title);
      });
    } else if(properties && properties.title) { 
      setModalTitle(properties.title);
    } else if(workGuid) {
      container.$SetToolTitle = function(workGuid, elementGuid) {
        Shared.InvokeWebService(0, 0, "../Server/Resources/WorkspaceItemWebService.asmx", "RetrieveWorkAndElementInfo", {workGuid:workGuid, elementGuid:elementGuid}, 0, 0, 0, 0, function(handlerCallbackParams) {
          if(handlerCallbackParams.Succeeded) {
            var workAndElementInfo = eval(handlerCallbackParams.Result);

            var toolTitleHTML = [workAndElementInfo.ToolTitle, "<ul class='wl_modal_header_label_menu' ElementGuid='", elementGuid, "' WorkGuid='", workGuid, "'>"];
            Array.forEach(workAndElementInfo.Tools, function(tool) {
              toolTitleHTML.push("<li><a href='#", tool.Title, "' onclick='$ChangeUrl(event)' ElementGuid='", tool.Guid, "' Url='", tool.Url, "'>", tool.Title, "</a></li>");
            });
            toolTitleHTML.push("</ul>");

            var workTitleHTML = [workAndElementInfo.WorkTitle, "<ul class='wl_modal_header_label_menu' ElementGuid='", elementGuid, "' WorkGuid='", workGuid, "'>"];
            Array.forEach(workAndElementInfo.Work, function(work, i) {
              workTitleHTML.push("<li><a href='#", work.Title, "' onclick='$ChangeUrl(event)' WorkGuid='", work.Guid, "' style='padding-left:", 20 + (i * 10), "px;'>", work.Title, "</a></li>");
            });
            workTitleHTML.push("</ul>");

            setModalTitle(toolTitleHTML.join(""), workTitleHTML.join(""));
          } else {
            $AlertResource("ServerErrorMessage");
          }
        });
      };
      container.$SetToolTitle(workGuid, elementGuid);
    } else {
      Shared.AddHandler(iframe, "load", function(e) {
        var doc = Shared.GetFrameDocument(e.target);
        var title = doc.title;
        if(title) { title = title.replace("WorkLenz - ", ""); }

        var pageTitle = doc.body.getAttribute("PageTitle");
        var pageContextTitle = doc.body.getAttribute("PageContextTitle");
        if(pageTitle && pageContextTitle) { title = pageTitle; }

        var dataView = Shared.GetDocumentWindow(doc).DataView;
        if(dataView) {
          Shared.For(dataView.GridNameToDataViewMap, function(gridName, dataView) {
            if(dataView.ShortLabel) {
              title = dataView.ShortLabel;
              return 1;
            }
          });
        }

        setModalTitle(title, pageContextTitle);
      });
    }

    if(properties) {
      Shared.Copy(properties.additionalProperties, iframe);

      if(properties.postUrl) {
        var postUrl = this.NormalizeUrl(properties.postUrl);
        var loadHandlerForPost = function(e) {
          Shared.RemoveHandler(iframe, "load", loadHandlerForPost);
          Shared.PostDocumentWithParameters(Shared.GetFrameDocument(e.target), postUrl, properties.postParameters);
        };
        Shared.AddHandler(iframe, "load", loadHandlerForPost);
      }

      if(properties.loadHandler) {
        Shared.AddHandler(iframe, "load", properties.loadHandler);
      }
    }

    bringToTopEventHandler({target:container});
    document.body.appendChild(container);
    

  },
  GetModals:function(filter) {
    var modals = [];
    var possibleModals = document.body.childNodes;
    for(var i = possibleModals.length - 1; i > 0; i--) {
      var possibleModal = possibleModals[i];
      if(possibleModal.tagName === "SCRIPT") { break; }
      if(possibleModal.getAttribute && possibleModal.getAttribute("IsModal") && filter(possibleModal)) { modals.push(possibleModal); }
    }
    modals.reverse();
    return modals;
  },
  ArrangeMinimizedModals:function() {
    var minimizedModals = this.GetModals(function(modal) { return modal.$IsMinimized(); });
    var length = minimizedModals.length;
    if(length) {
      var shadow = this.Shadow;
      var startTop = this.NormalTop;
      var startLeft = this.NormalLeft;
      var totalWidth = Shared.GetWindowWidth() - 40;
      var currentTop = startTop;
      var currentLeft = startLeft;
      var modalHeight;

      Array.forEach(minimizedModals, function(modal) {
        modalHeight = Math.min(modalHeight || 1000, Shared.GetHeight(modal)); // Hack. Sometimes Shared.GetHeight returns a number that is too big. Couldn't figure why...
      });

      Array.forEach(minimizedModals, function(modal) {
        modal.style.top = currentTop + "px";
        modal.style.left = currentLeft + "px";
        currentLeft += Shared.GetWidth(modal) + 5;
        if(totalWidth < currentLeft) {
          currentTop += modalHeight + 5;
          currentLeft = startLeft;
          modal.style.top = currentTop + "px";
          modal.style.left = currentLeft + "px";
          currentLeft += Shared.GetWidth(modal) + 5;
        }
      });

      var lastModalBounds = Shared.GetBounds(minimizedModals[length-1]);
      var topOffset = Shared.GetWindowHeight() - lastModalBounds.y - lastModalBounds.height - 30;
      Array.forEach(minimizedModals, function(modal) {
        modal.style.top = (parseInt(modal.style.top, 10) + topOffset) + "px";
      });
    }
  },
  ArrangeWorkspaceClickHandler:function(e) {
    var target = Shared.GetTargetElement(e);
    if(!(target.tagName in {HTML:1, BODY:1} || target.id === this.ArrangeWorkspaceId || target.className in {wl_search_results_cover:1, wl_search_criteria_container:1})) { return; }

    Shared.CancelEvent(e);
    var visibleModals = this.GetModals(function(modal) { return Shared.GetVisible(modal); });
    var length = visibleModals.length;
    if(length) {
      var startTop = this.NormalTop;
      var startLeft = this.NormalLeft;
      var totalWidth = Shared.GetWindowWidth() - startLeft - 40;
      var totalHeigth = Shared.GetWindowHeight() - startTop - 10;
      var numberOfColumns = length < 5 ? ([0,1,1,2,2])[length] : 3;
      var numberOfRows = Math.ceil(length / numberOfColumns);
      var width = totalWidth / numberOfColumns;
      var height = totalHeigth / numberOfRows;
      Array.forEach(visibleModals, function(modal, i) {
        modal.$Restore();
        var iframe = modal.$GetFrame();
        var row = Math.floor(i / numberOfColumns);
        var column = i % numberOfColumns;
        modal.style.top = (startTop + (row * height)) + "px";
        modal.style.left = (startLeft + (column * width)) + "px";
        modal.style.width = (width - modal.$CalculateWidthOffset() - 10) + "px";
        iframe.style.height = (height - modal.$CalculateHeightOffset()) + "px";
        modal.$UpdateBounds();
      });
    }
  }
};

var ToggleMenu = {
  Setup:function(menuId, menuItemAllId, menuItemSelected) {
    var menuItemClickHandler = function(e) {
      Shared.CancelEvent(e);
      var menuItemElement = Shared.GetTargetElement(e);

      if(menuItemElement.getAttribute("IsSelected")) { return; }

      var menuItemElements = Shared.GetElementsByTagName(Shared.GetElementById(menuId), "a");
      for(var i = 0, l = menuItemElements.length; i < l; i++) {
        menuItemElements[i].removeAttribute("IsSelected");
      }

      menuItemElement.setAttribute("IsSelected", "1");

      menuItemSelected();
    };
    var menuItemElements = Shared.GetElementsByTagName(Shared.GetElementById(menuId), "a");
    for(var i = 0, l = menuItemElements.length; i < l; i++) {
      Shared.AddHandler(menuItemElements[i], "click", menuItemClickHandler);
    }
    menuItemClickHandler({target:Shared.GetElementById(menuItemAllId)});
  },
  GetSelected:function(menuId) {
    var menuItemElements = Shared.GetElementsByTagName(Shared.GetElementById(menuId), "a");
    for(var i = 0, l = menuItemElements.length; i < l; i++) {
      if(menuItemElements[i].getAttribute("IsSelected")) {
        return menuItemElements[i];
      }
    }
  }
};

function Search(properties) {
  Shared.Copy(properties, this);
  Shared.AddHandler(Shared.GetElementById(this.TextId), "keyup", Shared.CreateDelegate(this, this.TextKeyUpHandler));
  Shared.AddHandler(Shared.GetElementById(this.ButtonId), "click", Shared.CreateDelegate(this, this.ButtonClickHandler));
  Shared.AddHandler(Shared.GetElementById(this.ContainerId), "click", Shared.CreateDelegate(this, this.Search));
  Shared.AddHandler(Shared.GetElementById(this.SearchWorkspaceId), "click", Shared.CreateDelegate(this, function() { Shared.GetElementById(this.TextId).focus(); }));
  Shared.AddLoadHandler(Shared.CreateDelegate(this, function() { Shared.GetElementById(this.TextId).focus(); }));

  ToggleMenu.Setup(this.AgentsId, this.AgentAllId, Shared.CreateDelegate(this, function() {
    this.LastText = null;
    this.Search();
  }));

  window.$GoToPage = Shared.CreateDelegate(this, this.GoToPage);

  var createWorkspaceOrDockItem = Shared.CreateDelegate(this, this.CreateWorkspaceOrDockItem);
  window.$StartSearchResultDrag = function(e) {
    Shared.CancelEvent(e);
    var searchResultItem = Shared.GetTargetElement(e);
    if(searchResultItem.tagName !== "LI") { searchResultItem = Shared.GetAncestor(searchResultItem, function(element) { return element.tagName === "LI"; }); }
    if(searchResultItem.getAttribute("IsLast")) { return; }

    var dragElement = document.createElement("div");
    dragElement.className = "wl_search_result_drag";
    dragElement.innerHTML = Shared.HtmlEncode(searchResultItem.getAttribute("ResultLinkText"));
    document.body.appendChild(dragElement);
    dragElement.style.left = (e.clientX + 10) + "px";
    dragElement.style.top = (e.clientY - 15) + "px";

    var mouseMoveHandler = function(e) {
      Shared.CancelEvent(e);
      dragElement.style.left = (e.clientX + 10) + "px";
      dragElement.style.top = (e.clientY - 15) + "px";
    };
    var mouseUpHandler = function(e) {
      document.body.removeChild(dragElement);
      Shared.RemoveHandlers(document, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});

      var isDock = 0;
      var workspaceId;
      var dropTarget = Shared.GetTargetElement(e);
      if(dropTarget.id === "dock_open" || dropTarget.id === "dock") {
        isDock = 1;
        workspaceId = "dock";
      } else if(dropTarget.getAttribute("IsWorkspace")) {
        workspaceId = dropTarget.id;
      } else {
        dropTarget = Shared.GetAncestor(dropTarget, function(element) { return element.getAttribute && (element.getAttribute("IsWorkspace") || element.id === "dock"); });
        if(dropTarget) {
          isDock = (dropTarget.id === "dock");
          workspaceId = dropTarget.id;
        }
      }
      if(dropTarget) {
        createWorkspaceOrDockItem(searchResultItem.getAttribute("ResultLinkUrl"), Shared.HtmlEncode(searchResultItem.getAttribute("ResultLinkText")), searchResultItem.getAttribute("WorkGuid"), searchResultItem.getAttribute("ElementGuid"), workspaceId, isDock);
      }
    };

    Shared.AddHandlers(document, {mouseup:mouseUpHandler, mousemove:mouseMoveHandler});
  };

  window.$ShowSearchResultDetails = Shared.CreateDelegate(this, function(e) {
    var searchResultItem = Shared.GetTargetElement(e);
    if(searchResultItem.tagName !== "LI") { searchResultItem = Shared.GetAncestor(searchResultItem, function(element) { return element.tagName === "LI"; }); }
    if(searchResultItem.getAttribute("IsLast")) { return; }

    window.$DontHideSearchResultDetails();
    if(searchResultItem !== window.$CurrentSearchResult) {
      if(window.$CurrentSearchResult) { Shared.RemoveCssClass(window.$CurrentSearchResult, "wl_search_result_item_hover"); }
      Shared.AddCssClass(searchResultItem, "wl_search_result_item_hover");
      window.$CurrentSearchResult = searchResultItem;

      var workGuid = searchResultItem.getAttribute("WorkGuid");
      var managerKey = searchResultItem.getAttribute("ManagerKey");
      var elementGuid = searchResultItem.getAttribute("ElementGuid");
      var primaryKeyGuid = searchResultItem.getAttribute("PrimaryKeyGuid");
      var resultLinkText = searchResultItem.getAttribute("ResultLinkText");
      var searchAgentGuid = searchResultItem.getAttribute("SearchAgentGuid");
      var detailsElement = Shared.GetElementById("search_result_details");
      var searchResultHoverSpecification = window.SearchResultHoverSpecifications.Get(managerKey, elementGuid, primaryKeyGuid);
      if(searchResultHoverSpecification) {
        if(!detailsElement) {
          detailsElement = document.createElement("div");
          detailsElement.id = "search_result_details";
          Shared.AddHandlers(detailsElement, {mouseover:window.$DontHideSearchResultDetails, mouseout:window.$HideSearchResultDetails});
          detailsElement.innerHTML = "<div class='wl_search_result_details_container'></div><div class='wl_search_result_details_arrow_container'><div class='wl_search_result_details_arrow_border'></div><div class='wl_search_result_details_arrow_body'></div></div>";
          document.body.appendChild(detailsElement);
        }

        var detailsContainerElement = Shared.GetElementsByTagName(detailsElement, "div")[0];
        detailsContainerElement.innerHTML = "<div class='wl_search_result_details_section'>" + this.LoadingMessage + "</div><div class='wl_search_result_details_section'>" + this.LoadingMessage + "</div><div class='wl_search_result_details_section'>" + this.LoadingMessage + "</div>";
        var detailsChildElements = Shared.GetElementsByTagName(detailsContainerElement, "div");
        var detailsDetailsElement = detailsChildElements[0];
        var detailsActionsElement = detailsChildElements[1];
        var detailsReportsElement = detailsChildElements[2];

        var searchResultBounds = Shared.GetBounds(searchResultItem);
        Shared.SetVisible(detailsElement, true);
        Shared.SetLocation(detailsElement, Math.floor(searchResultBounds.x + searchResultBounds.width / 2), Math.floor(searchResultBounds.y - ((Shared.GetHeight(detailsElement) - searchResultBounds.height) / 2)));

        var context = {work_guid:workGuid, manager_key:managerKey, element_guid:elementGuid, primary_key_guid:primaryKeyGuid, title:resultLinkText, plural_title:Shared.Pluralize(resultLinkText), search_agent_guid:searchAgentGuid};

        if(searchResultHoverSpecification.Actions) {
          var actionsHTML = ["<h3>Actions</h3><ul>"];
          Array.forEach(searchResultHoverSpecification.Actions, function(action) {
            actionsHTML.push("<li><a href='#", Shared.Format(action.Label, context), "' onclick='$OpenUrl(event)' Url='", Shared.Format(action.Url, context), "'", action.IsVisible ? " style='display:none;'" : "", ">", Shared.Format(action.Label, context), "</a></li>");
          });
          actionsHTML.push("</ul>");
          detailsActionsElement.innerHTML = actionsHTML.join("");
        } else {
          detailsActionsElement.innerHTML = "";
        }

        if(searchResultHoverSpecification.Reports) {
          var reportsHTML = ["<h3>Reports</h3><ul>"];
          Array.forEach(searchResultHoverSpecification.Reports, function(report) {
            if(report.Url) {
              reportsHTML.push("<li><a href='#", report.Label, "' onclick='$OpenUrl(event)' Url='", Shared.Format(report.Url, context), "'>", report.Label, "</a></li>");
            } else {
              reportsHTML.push("<li><a href='#", report.Label, "' onclick='$OpenUrl(event)' Url='/Reports/ReportInput.aspx?work_guid=", workGuid, "&ReportID=", report.Guid, "&clear_existing_parameters=true'>", report.Label, "</a></li>");
            }
          });
          reportsHTML.push("</ul>");
          detailsReportsElement.innerHTML = reportsHTML.join("");
        } else {
          detailsReportsElement.innerHTML = "";
        }

        if(searchResultHoverSpecification.Details) {
          Shared.InvokeAsyncRequest(0, "SearchResultDetailsHandler.ashx", {work_guid:workGuid, manager_key:managerKey, element_guid:elementGuid, primary_key_guid:primaryKeyGuid}, 0, 0, function(handlerCallbackParams) {
            if(handlerCallbackParams.Succeeded) {
              var data = eval(handlerCallbackParams.ResponseData);

              var actionElements = Shared.GetElementsByTagName(detailsActionsElement, "a");
              Array.forEach(searchResultHoverSpecification.Actions, function(action, i) {
                if(action.IsVisible && action.IsVisible(data)) { Shared.SetVisible(actionElements[i], true); }
              });

              var detailsHTML = ["<ul>"];
              Array.forEach(searchResultHoverSpecification.Details, function(detail) {
                if(!detail.IsVisible || detail.IsVisible(data)) {
                  if(typeof(detail.Label) === "function") {
                    detailsHTML.push("<li>", detail.Label(data), "</li>");
                  } else {
                    detailsHTML.push("<li><h3>", Shared.Format(detail.Label, context), ":</h3> ", data[detail.Key], "</li>");
                  }
                }
              });
              detailsHTML.push("</ul>");
              detailsDetailsElement.innerHTML = detailsHTML.join("");
            } else {
              $AlertResource("ServerErrorMessage");
            }
          });
        } else {
          detailsDetailsElement.innerHTML = "";
        }

        if(searchResultHoverSpecification.ParametersUrl) {
          var url = searchResultHoverSpecification.ParametersUrl;
          if(url.charAt(0) === "/" && !url.toLowerCase().startsWith(this.ApplicationPath.toLowerCase())) { url = this.ApplicationPath + url; }
          url = Shared.AddToUrl(Shared.RemoveFromUrl(url, ["StyleSetName"]), {StyleSetName:this.StyleSetName});
          //detailsDetailsElement.innerHTML = "[TODO: Preview Image Here]";
          Shared.SetVisible(detailsDetailsElement, false);
          detailsReportsElement.parentNode.removeChild(detailsReportsElement);
          detailsActionsElement.setAttribute("ReportTitle", resultLinkText);
          detailsActionsElement.setAttribute("ReportParameterContainer", "1");
          Shared.ReplaceCssClass(detailsActionsElement, 0, "wl_search_result_details_section", "wl_search_result_details_section_parameters");
          detailsActionsElement.innerHTML = "<iframe src='" + Shared.Format(url, context) + "' frameBorder='0' onload='$AddReportActions(event)'></iframe><div></div>";
        }
      } else if(detailsElement) {
        Shared.SetVisible(detailsElement, false);
      }
    }
  });
  window.$AddReportActions = function(e) {
    var target = Shared.GetTargetElement(e);
    var reportParameterContainer = Shared.GetAncestor(target, function(ancestor) { return ancestor.getAttribute("ReportParameterContainer"); });
    var reportParameters = Shared.GetElementsByTagName(reportParameterContainer, "iframe")[0];

    var targetWindow = Shared.GetDocumentWindow(Shared.GetFrameDocument(reportParameters));
    var page_Validators = targetWindow.Page_Validators;
    var inValidHiddenParameter = 0;
    if(page_Validators && page_Validators.length) {
      var isRow = function(ancestor) { return ancestor.tagName === "TR"; };
      for(var v = 0, vl = page_Validators.length; v < vl; v++) {
        var page_Validator = page_Validators[v];
        targetWindow.ValidatorValidate(page_Validator, undefined, null);
        if(!page_Validator.isvalid) {
          var containingRow = Shared.GetAncestor(page_Validator, isRow);
          if(!Shared.GetVisible(containingRow)) {
            inValidHiddenParameter = 1;
            break;
          }
        }
      }
    }

    var actionsContainer = Shared.GetElementsByTagName(reportParameterContainer, "div")[0];
    if(inValidHiddenParameter) {
      actionsContainer.innerHTML = "<a class='wl_search_result_details_section_open_report_browser' href='#OpenReportBrowser' onclick='$OpenReportBrowser(event)'>Complete Additional Required Parameters</a>";
    } else {
      var moreParametersHTML = "";
      if(targetWindow.HasHiddenParameters) {
        moreParametersHTML = "<a class='wl_search_result_details_section_more_parameters' href='#OpenReportBrowser' onclick='$OpenReportBrowser(event)'>More Parameters</a>";
      }
      actionsContainer.innerHTML = moreParametersHTML + "<a class='wl_search_result_details_section_run_report' href='#RunReport' onclick='$RunReport(event)'>Run Report</a>";
    }
  };
  window.$OpenReportBrowser = function(e) {
    Shared.CancelEvent(e);
    var target = Shared.GetTargetElement(e);
    var reportParameterContainer = Shared.GetAncestor(target, function(ancestor) { return ancestor.getAttribute("ReportParameterContainer"); });
    var reportParameters = Shared.GetElementsByTagName(reportParameterContainer, "iframe")[0];
    var form = Shared.GetFrameDocument(reportParameters).forms[0];
    var parameters = Shared.FormToMap(form);
    var loadHandler = function(e) {
      Shared.MapToForm(parameters, Shared.GetFrameDocument(e.target).forms[0]);
    };
    window.$OpenUrl(0, {url:Shared.RemoveFromUrl(form.action, ["only_parameters"]), title:reportParameterContainer.getAttribute("ReportTitle"), loadHandler:loadHandler});
  };
  window.$RunReport = Shared.CreateDelegate(this, function(e, targetFrame, postUrl) {
    Shared.CancelEvent(e);
    var target = Shared.GetTargetElement(e);
    var reportParameterContainer = Shared.GetAncestor(target, function(ancestor) { return ancestor.getAttribute && ancestor.getAttribute("ReportParameterContainer"); }) || target.parentNode;
    var reportParameters = Shared.GetElementsByTagName(reportParameterContainer, "iframe")[0];
    var form = reportParameters ? Shared.GetFrameDocument(reportParameters).forms[0] : target.form;

    var page_ClientValidate = Shared.GetDocumentWindow(form.ownerDocument).Page_ClientValidate;
    if(page_ClientValidate && !page_ClientValidate()) { return; }

    var parameters = Shared.FormToMap(form);
    parameters["__EVENTTARGET"] = "SmartMenu1$UltraWebToolbar1";
    parameters["__EVENTARGUMENT"] = "SmartMenu1$UltraWebToolbar1_Item_0:UP";
    if (!targetFrame) {
      window.$OpenUrl(0, { url: this.LoadingUrl, title: reportParameterContainer.getAttribute("ReportTitle"), postUrl: form.action, postParameters: parameters });
    } else {
      var loadHandlerForPost = function(e) {
        Shared.RemoveHandler(targetFrame, "load", loadHandlerForPost);
        Shared.PostDocumentWithParameters(Shared.GetFrameDocument(targetFrame), postUrl, parameters);
      };

      Shared.AddHandler(targetFrame, "load", loadHandlerForPost);
      targetFrame.src = this.LoadingUrl;
    }
  });
  window.$HideSearchResultDetails = function() {
    window.$SearchResultDetailsTimeoutId = Shared.SetTimeout(function() {
      Shared.SetVisible(Shared.GetElementById("search_result_details"), false);
      Shared.RemoveCssClass(window.$CurrentSearchResult, "wl_search_result_item_hover");
      window.$CurrentSearchResult = null;
    }, 150);
  };
  window.$DontHideSearchResultDetails = function() {
    Shared.ClearTimeout(window.$SearchResultDetailsTimeoutId);
  };
}

Search.prototype = {
  TextKeyUpHandler:function(e) {
    if(e.keyCode === 13) {
      this.Search();
    }
  },
  ButtonClickHandler:function() {
    this.Search();
  },
  Search:function() {
    var text = Shared.GetValueOfControl(Shared.GetElementById(this.TextId));
    if(window.$ToggleWorkspaceItems) { window.$ToggleWorkspaceItems({target:Shared.GetElementById(this.SearchWorkspaceItemId)}); }
    if(text && text !== this.LastText) {
      this.LastText = text;
      this.PageIndex = 0;
      this.ExecuteSearch();
    } else if(!text) {
      this.LastText = text;
      this.SearchResultsHandler({Succeeded:1, ResponseData:"<p id='" + this.RowCountElementID + "' " + this.RowCountAttributeName + "='0'/>"});
    }
  },
  GoToPage:function(e, pageIndex) {
    Shared.CancelEvent(e);
    this.PageIndex = pageIndex;
    this.ExecuteSearch();
  },
  ExecuteSearch:function() {
    Shared.SetInnerHTML(this.ResultsId, this.SearchingMessage);

    var agentGuids = [];
    var agentsElements = Shared.GetElementsByTagName(Shared.GetElementById(this.AgentsId), "a");
    for(var i = 0, l = agentsElements.length; i < l; i++) {
      if(agentsElements[i].getAttribute("IsSelected")) { agentGuids.push(agentsElements[i].getAttribute("Guid")); }
    }

    Shared.InvokeAsyncRequest(0, this.Url, {q:encodeURIComponent(this.LastText),p:this.PageIndex,f:"html_v2",a:agentGuids.join()}, 0, 0, Shared.CreateDelegate(this, this.SearchResultsHandler));
  },
  SearchResultsHandler:function(handlerCallbackParams) {
    if(handlerCallbackParams.Succeeded) {
      var resultsElement = Shared.GetElementById(this.ResultsId);
      Shared.SetInnerHTML(resultsElement, handlerCallbackParams.ResponseData);

      var pagerHTML = [];
      var rowCount = parseInt(Shared.GetElementById(this.RowCountElementID).getAttribute(this.RowCountAttributeName), 10);
      if(rowCount === 0) {
        if(this.LastText) {
          Shared.SetInnerHTML(resultsElement, Shared.GetFormattedResource("SearchNoResultsMessage", [Shared.HtmlEncode(this.LastText)]));
        }
      } else if (rowCount > this.RecordsPerPage) {
        var pageIndex = this.PageIndex;
        var pageCount = Math.ceil(rowCount / this.RecordsPerPage);
        var nonCurrentPagePrefix = this.PagerNonCurrentPagePrefix;

        for (var i = 0; i < pageCount; i++) {
          var pageNumber = i + 1;
          if (i === pageIndex) {
            Shared.CreateLabelHtml(pagerHTML, "wl_search_result_page wl_search_result_page_current", this.PagerCurrentPagePrefix + pageNumber, "<div></div>" + pageNumber, this.PagerCurrentPagePrefix);
          } else {
            Shared.CreateActionHtml(pagerHTML, "#" + nonCurrentPagePrefix + pageNumber, "$GoToPage(event, " + i + ")", "wl_search_result_page", nonCurrentPagePrefix + pageNumber, "<div></div>" + pageNumber, nonCurrentPagePrefix);
          }
        }
      }
      Shared.SetInnerHTML(this.PagerId, pagerHTML.join(""));

      window.$ShowAddToMenu = Shared.CreateDelegate(this, this.ShowAddToMenu);
    } else {
      Shared.SetInnerHTML(this.ResultsId, "");
      $AlertResource("ServerErrorMessage");
    }
  },
  ShowAddToMenu:function(e) {
    Shared.CancelEvent(e);

    var bounds = Shared.GetBounds(Shared.GetTargetElement(e));
    var addToMenuContainer = document.createElement("div");
    addToMenuContainer.id = "search_addtomenu";
    addToMenuContainer.className = "wl_search_result_add_to_menu";
    addToMenuContainer.style.cssText = "left:" + (bounds.x + bounds.width + 5) + "px;top:" + bounds.y + "px;";

    var addToMenu = document.createElement("ul");
    addToMenu.style.cssText = "margin:0 10px;padding:0;";

    var mainMenuItems = Shared.GetElementsByTagName(Shared.GetElementById("mainmenu"), "li");
    var mainMenuItemsPlusDock = [];
    for(var i = 0, l = mainMenuItems.length; i < l; i++) {
      var mainMenuItem = mainMenuItems[i];
      if(mainMenuItem.getAttribute("WorkspaceTitle")) {
        mainMenuItemsPlusDock.push({Id:mainMenuItem.id,Title:mainMenuItem.getAttribute("WorkspaceTitle")});
      }
    }
    mainMenuItemsPlusDock.push({Id:"dock",Title:"Dock",IsDock:1});

    var searchResult = Shared.GetAncestor(Shared.GetTargetElement(e), function(element) { return element.tagName === "LI"; });
    var addToMenuItemClickHandler = Shared.CreateDelegate(this, this.AddToMenuItemClickHandler);
    Array.forEach(mainMenuItemsPlusDock, function(mainMenuItemOrDock) {
      var addToMenuItem = document.createElement("li");

      var addToMenuItemLink = Shared.CreateActionElement({Text:mainMenuItemOrDock.Title,Handler:addToMenuItemClickHandler}, addToMenuItem);
      if(mainMenuItemOrDock.IsDock) { addToMenuItemLink.setAttribute("IsDock", "1"); }
      addToMenuItemLink.setAttribute("WorkspaceId", mainMenuItemOrDock.Id);
      addToMenuItemLink.setAttribute("WorkGuid", this.getAttribute("WorkGuid"));
      addToMenuItemLink.setAttribute("ElementGuid", this.getAttribute("ElementGuid"));
      addToMenuItemLink.setAttribute("ResultLinkUrl", this.getAttribute("ResultLinkUrl"));
      addToMenuItemLink.setAttribute("ResultLinkText", this.getAttribute("ResultLinkText"));

      addToMenu.appendChild(addToMenuItem);
    }, searchResult);

    addToMenuContainer.appendChild(addToMenu);

    var cancelLink = Shared.CreateActionElement({Text:"Cancel",Handler:function(e) {
      Shared.CancelEvent(e);
      document.body.removeChild(addToMenuContainer);
    }});
    addToMenuContainer.appendChild(cancelLink);

    document.body.appendChild(addToMenuContainer);
  },
  AddToMenuItemClickHandler:function(e) {
    Shared.CancelEvent(e);
    document.body.removeChild(Shared.GetElementById("search_addtomenu"));
    var target = e.target;
    if(target.tagName !== "A") { target = Shared.GetAncestor(target, function(element) { return element.tagName === "A"; }); }
    this.CreateWorkspaceOrDockItem(target.getAttribute("ResultLinkUrl"), Shared.HtmlEncode(target.getAttribute("ResultLinkText")), target.getAttribute("WorkGuid"), target.getAttribute("ElementGuid"), target.getAttribute("WorkspaceId"), target.getAttribute("IsDock"));
  },
  CreateWorkspaceOrDockItem:function(url, text, workGuid, elementGuid, workspaceId, isDock) {
    var mainMenuItemOrDock = Shared.GetElementById(workspaceId);
    var workspaceOrDockItems = Shared.GetElementsByTagName(mainMenuItemOrDock, "ul")[0];
    var workspaceOrDockItem = document.createElement("li");
    workspaceOrDockItem.setAttribute("ItemType", isDock ? MainMenu.ItemTypeDock : MainMenu.ItemTypeWorkspaceItem);
    workspaceOrDockItem.innerHTML = "Creating workspace item...";
    workspaceOrDockItems.appendChild(workspaceOrDockItem);

    if(isDock) {

      Shared.InvokeWebService(0, 0, "../Server/Resources/DockItemWebService.asmx", "CreateDockItem", {dockItemTitle:text,url:url,workGuid:workGuid,elementGuid:elementGuid,sortOrder:workspaceOrDockItems.childNodes.length}, 0, 0, 0, 0, function(handlerCallbackParams) {
        if(handlerCallbackParams.Succeeded) {
          workspaceOrDockItem.id = handlerCallbackParams.Result;
          workspaceOrDockItem.innerHTML = "<div class='" + Dock.GetItemCssClass(workGuid, elementGuid, url) + "'></div><a href='#' onclick='$RenameWorkspaceOpenUrl(event)' ondblclick='$RenameWorkspace(event, 1)' onmouseover='$ShowWorkspaceActions(event, MainMenu.ItemTypeDock)' onmouseout='$HideWorkspaceActions(event)' Url='" + url + "' WorkGuid='" + workGuid + "' ElementGuid='" + elementGuid + "' ContainerId='ContainerIdFor_" + workspaceOrDockItem.id + "' DefinitionId='" + workspaceOrDockItem.id + "'>" + text + "</a>";
        } else {
          $AlertResource("ServerErrorMessage");
          workspaceOrDockItems.removeChild(workspaceOrDockItem);
        }
      });
    } else {
      Shared.InvokeWebService(0, 0, "../Server/Resources/WorkspaceItemWebService.asmx", "CreateWorkspaceItem", {workspaceItemTitle:text,url:url,workGuid:workGuid,elementGuid:elementGuid,workspaceGuid:workspaceId,sortOrder:workspaceOrDockItems.childNodes.length}, 0, 0, 0, 0, function(handlerCallbackParams) {
        if(handlerCallbackParams.Succeeded) {
          workspaceOrDockItem.id = handlerCallbackParams.Result;
          workspaceOrDockItem.innerHTML = "<a href='#' onclick='$RenameWorkspaceOpenUrl(event)' ondblclick='$RenameWorkspace(event, 1)' onmouseover='$ShowWorkspaceActions(event, MainMenu.ItemTypeWorkspaceItem)' onmouseout='$HideWorkspaceActions(event)' Url='" + url + "' WorkGuid='" + workGuid + "' ElementGuid='" + elementGuid + "' ContainerId='ContainerIdFor_" + workspaceOrDockItem.id + "' DefinitionId='" + workspaceOrDockItem.id + "'>" + text + "</a>";

          var workspaceItem = Shared.GetElementsByTagName(workspaceOrDockItem, "a")[0];
          var workspaceElement = Shared.GetAncestor(workspaceOrDockItem, function(element) { return element.getAttribute("IsWorkspace"); });
          var workspaceItemContainerIds = workspaceElement.getAttribute("WorkspaceItemContainerIds");
          workspaceItemContainerIds = workspaceItemContainerIds ? workspaceItemContainerIds.split(",") : [];
          workspaceItemContainerIds.push(workspaceItem.getAttribute("ContainerId"));
          workspaceElement.setAttribute("WorkspaceItemContainerIds", workspaceItemContainerIds.join());

          if(Shared.GetCssClass(workspaceElement).indexOf("wl_menu_item_expanded") !== -1) { window.$OpenUrl({target:workspaceItem}); }
        } else {
          $AlertResource("ServerErrorMessage");
          workspaceOrDockItems.removeChild(workspaceOrDockItem);
        }
      });
    }
  }
};

function WorkforwardCenter(properties) {
  Shared.Copy(properties, this);

  var ToHTMLSafeString = function(s) {
    // TODO: Make this a regular expression replace? Should we just write the string to an array escaping as we go?
    return s.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\n/g, "<br/>");
  };

  window.$Respond = function(e, approve) {
    Shared.CancelEvent(e);
    var target = Shared.GetTargetElement(e);
    var approveElement = Shared.GetAncestor(target, function(element) { return element.getAttribute("Guid"); });
    Shared.InvokeWebService(0, 0, "../Server/Resources/WorkforwardCenterWebService.asmx", approve ? "Approve" : "Reject", {notificationApprovalParticipantGuid:approveElement.getAttribute("Guid")}, 0, 0, 0, 0, function(handlerCallbackParams) {
      if(!handlerCallbackParams.Succeeded) {
        $AlertResource("ServerErrorMessage");
      }
    });

    var now = new Date();
    approveElement.className = "wl_wfc_post_approved";
    approveElement.innerHTML = [approve ? "Approved" : "Rejected", " on ", now.localeFormat("MM/dd/yyyy"), " at ", now.localeFormat("hh:mm tt"), "."].join("");
  };

  window.$Useful = function(e, useful) {
    Shared.CancelEvent(e);
    var target = Shared.GetTargetElement(e);
    var ratingElement = Shared.GetAncestor(target, function(element) { return element.getAttribute("Guid"); });
    Shared.InvokeWebService(0, 0, "../Server/Resources/WorkforwardCenterWebService.asmx", "Useful", {notificationMessageGuid:ratingElement.getAttribute("Guid"), useful:!!useful}, 0, 0, 0, 0, function(handlerCallbackParams) {
      if(!handlerCallbackParams.Succeeded) {
        $AlertResource("ServerErrorMessage");
      }
    });

    ratingElement.setAttribute("useful", useful);
  };

  var addPostAsHTML = function(post, html, timestampFormat) {
    var now = new Date();
    var timestamp = Date.parseInvariant(post.timestamp, timestampFormat);
    var secondsDifference = (now.getTime() - timestamp.getTime()) / 1000;
    if(secondsDifference <= 60) {
      timestamp = "1 minute ago";
    } else {
      var minutesDifference = secondsDifference / 60;
      if(minutesDifference < 60) {
        timestamp = Math.round(minutesDifference) + " minutes ago";
      } else {
        if(now.format("d") === timestamp.format("d")) {
          timestamp = Math.round(minutesDifference / 60) + " hours ago";
        } else {
          if(now.format("yyMM") === timestamp.format("yyMM") && now.getDate() === timestamp.getDate() + 1) {
            timestamp = "Yesterday " + timestamp.format("hh:mmtt");
          } else {
            now.setDate(now.getDate() - now.getDay());
            if(now.format("yyMMdd") <= timestamp.format("yyMMdd")) {
              timestamp = timestamp.format("ddd hh:mmtt");
            } else {
              timestamp = timestamp.format("MMM d, yyyy");
            }
          }
        }
      }
    }

    html.push("<span class='wl_wfc_post_timestamp'>", timestamp, "</span>");
    if(post.notification_type_syscode === "MESSAGE") {
      var message = ToHTMLSafeString(post.message);
      html.push("<a href='#' onclick='$Alert(\"[TODO: Needed for the demos?]\")' class='wl_wfc_post_creator' title='", post.creator_email,"'>", post.creator, "</a><div class='wl_wfc_post_message'>", message, "</div>");
    } else if(post.notification_type_syscode === "NOTIFICATION") {
      html.push("<div class='wl_wfc_post_subject'>", ToHTMLSafeString(post.subject), "</div><div class='wl_wfc_post_message'>This is ", post.notification_approval_participant_guid ? "an approval request " : "a notification", " regarding ");
      if(post.item_title) { html.push(ToHTMLSafeString(post.item_title), " in the ", post.element_title, " tool for "); }
      html.push(post.work_class_title, ": ", ToHTMLSafeString(post.work_title), ". This notification was created by ", post.creator, ".</div>");
      if(post.change_message) { html.push("<p/>", ToHTMLSafeString(post.change_message)); }
      if(post.message) { html.push("<p/>Comments:<br/>", ToHTMLSafeString(post.message)); }
      if(post.notification_approval_participant_guid) {
        if(post.approval_response_timestamp) {
          var approvalResponseTimestamp = Date.parseInvariant(post.approval_response_timestamp, timestampFormat);
          html.push("<div class='wl_wfc_post_approved'>", post.is_approved ? "Approved" : "Rejected", " on ", approvalResponseTimestamp.localeFormat("MM/dd/yyyy"), " at ", approvalResponseTimestamp.localeFormat("hh:mm tt"), ".</div>");
        } else {
          html.push("<div class='wl_wfc_post_approval' Guid='", post.notification_approval_participant_guid, "'><a href='#Approve' onclick='$Respond(event,1)' class='wl_wfc_post_approve' title='Approve'>Approve</a><a href='#Reject' onclick='$Respond(event,0)' class='wl_wfc_post_reject' title='Reject'>Reject</a></div>");
        }
      }
    } else if(post.notification_type_syscode === "RECOMMENDATION") {
      html.push("<div class='wl_wfc_post_context'>", post.work_class_title, ": ", ToHTMLSafeString(post.work_title), "</div>");
      Array.forEach(post.collaborate, function(collaborate) {
        html.push("<div><a href='#' onclick='$Alert(\"[TODO: Needed for the demos?]\")' class='wl_wfc_post_collaborator' title='", collaborate.email,"'>", collaborate.first_name, " ", collaborate.last_name, "</a> ");
        if(collaborate.type === "BEFORE") {
          html.push("will be starting the ", collaborate.work_title, " ", collaborate.work_class_title.toLocaleLowerCase(), " as ", collaborate.role, " in the near future.");
        } else if(collaborate.type === "DURING") {
          html.push("is currently working on the ", collaborate.work_title, " ", collaborate.work_class_title.toLocaleLowerCase(), " as ", collaborate.role, ".");
        } else if(collaborate.type === "AFTER") {
          html.push("has recently completed the ", collaborate.work_title, " ", collaborate.work_class_title.toLocaleLowerCase(), " as ", collaborate.role, ".");
        }
        html.push("</div>");
      });
      html.push("<div class='wl_wfc_post_rating' Guid='", post.notification_message_guid, "' useful='", post.is_useful, "'><a href='#Thumbs Up' onclick='$Useful(event,1)' class='wl_wfc_post_thumbs_up' title='Thumbs Up'>Thumbs Up</a><a href='#Thumbs Down' onclick='$Useful(event,0)' class='wl_wfc_post_thumbs_down' title='Thumbs Down'>Thumbs Down</a></div>");
    }
  };

  var handlePostsRefresh = Shared.CreateDelegate(this, function(handlerCallbackParams) {
    if(handlerCallbackParams.Succeeded) {
      var html = [];
      var posts = eval(handlerCallbackParams.Result);
      if(posts.last_timestamp) { this.LastTimestampRetrieved = posts.last_timestamp; }
      Array.forEach(posts.posts, function(post) {
        html.push("<li>");
        addPostAsHTML(post, html, posts.timestamp_format);
        html.push("</li>");
      });
      Shared.GetElementById(this.PostsId).innerHTML = html.join("");
    } else {
      $AlertResource("ServerErrorMessage");
    }
  });

  var handlePostsChanges = Shared.CreateDelegate(this, function(handlerCallbackParams) {
    if(handlerCallbackParams.Succeeded) {
      var html = [];
      var posts = eval(handlerCallbackParams.Result);
      if(posts.last_timestamp) { this.LastTimestampRetrieved = posts.last_timestamp; }
      var postsElement = Shared.GetElementById(this.PostsId);
      var insertBeforePostElement = postsElement.firstChild;
      Array.forEach(posts.posts, function(post) {
        html.length = 0;
        addPostAsHTML(post, html, posts.timestamp_format);
        var postElement = document.createElement("li");
        postElement.innerHTML = html.join("");
        if(insertBeforePostElement) {
          postsElement.insertBefore(postElement, insertBeforePostElement);
        } else {
          postsElement.appendChild(postElement);
          insertBeforePostElement = postElement;
        }
      });
    } else {
      $AlertResource("ServerErrorMessage");
    }
  });

  var isBodyVisible = Shared.CreateDelegate(this, function() {
    return Shared.ContainsCssClass(this.Id, "wl_wfc_expanded");
  });

  var retrieveAllPosts = Shared.CreateDelegate(this, function(handler, onlyChanges) {
    Shared.ClearTimeout(this.RetrieveAllPostChangesTimeoutId);
    var localRetrieveAllPosts = function() { retrieveAllPosts(handlePostsChanges, 1); };
    if(isBodyVisible()) {
      var filterElement = Shared.GetElementById(this.FilterId);
      var args = {filter:Watermark.HasWatermark(filterElement) ? "" : filterElement.value, notificationType:ToggleMenu.GetSelected(this.FilterOptionsId).getAttribute("Option"), asOf:onlyChanges ? this.LastTimestampRetrieved || "" : ""};
      Shared.InvokeWebService(0, 0, "../Server/Resources/WorkforwardCenterWebService.asmx", "RetrieveAllPosts", args, 0, 0, 0, 0, Shared.CreateDelegate(this, function(handlerCallbackParams) {
        handler(handlerCallbackParams);
        this.RetrieveAllPostChangesTimeoutId = Shared.SetTimeout(localRetrieveAllPosts, 1000);
      }));
    } else {
      this.RetrieveAllPostChangesTimeoutId = Shared.SetTimeout(localRetrieveAllPosts, 1000);
    }
  });

  var resizeHandler = Shared.CreateDelegate(this, function() {
    if(isBodyVisible()) {
      var offsets = [0, 10];
      var windowHeight = Shared.GetWindowHeight();
      Array.forEach([this.BodyId, this.PostsContainerId], function(id, i) {
        var element = Shared.GetElementById(id);
        var elementBounds = Shared.GetBounds(element);
        element.style.height = (windowHeight - elementBounds.y - offsets[i]) + "px";
      });
    }
  });
  Shared.AddResizeHandler(resizeHandler);

  Shared.AddHandler(Shared.GetElementById(this.HeadId), "click", Shared.CreateDelegate(this, function(e) {
    Shared.CancelEvent(e);
    var visible = Shared.ToggleCssClass(this.Id, "wl_wfc_expanded");
    if(visible) {
      resizeHandler();
      Shared.GetElementById(this.FilterId).focus();
    }
  }));

  ToggleMenu.Setup(this.FilterOptionsId, this.FilterOptionAllId, function() {
    retrieveAllPosts(handlePostsRefresh);
  });

  Shared.AddHandler(Shared.GetElementById(this.MessageId), "keyup", Shared.CreateDelegate(this, function(e) {
    Shared[(Shared.GetTargetElement(e).value ? "Add" : "Remove") + "CssClass"](Shared.GetElementById(this.MessageSectionId), "wl_wfc_message_display");
  }));

  Shared.AddHandler(Shared.GetElementById(this.MessageAddLinkId), "click", function(e) {
    Shared.CancelEvent(e);
    $Alert("[TODO: Needed for the demos?]");
  });
  var clearMessage = Shared.CreateDelegate(this, function(e) {
    Shared.CancelEvent(e);
    Shared.GetElementById(this.MessageId).value = "";
    Shared.RemoveCssClass(Shared.GetElementById(this.MessageSectionId), "wl_wfc_message_display");
    Shared.GetElementById(this.MessageId).focus();
  });
  Shared.AddHandler(Shared.GetElementById(this.MessageClearId), "click", clearMessage);
  Shared.AddHandler(Shared.GetElementById(this.MessagePostId), "click", Shared.CreateDelegate(this, function(e) {
    Shared.InvokeWebService(0, 0, "../Server/Resources/WorkforwardCenterWebService.asmx", "CreateMessage", {message:Shared.GetElementById(this.MessageId).value, resourceTags:"", workTags:""}, 0, 0, 0, 0, function(handlerCallbackParams) {
      if(!handlerCallbackParams.Succeeded) {
        $AlertResource("ServerErrorMessage");
      }
    });
    clearMessage(e);
  }));

  Watermark.Setup(this.FilterId, this.FilterWatermark);
  Watermark.Setup(this.MessageId, this.MessageWatermark);
  Watermark.Setup(this.MessageTagsId, this.MessageTagsWatermark);

  retrieveAllPosts(handlePostsRefresh);
}


