text: /*
   *
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
   *
   *   http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing,
   * software distributed under the License is distributed on an
   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   * KIND, either express or implied.  See the License for the
   * specific language governing permissions and limitations
   * under the License.
   *
   */
  define(["dojo/dom",
          "dojo/dom-construct",
          "dojo/_base/window",
          "dijit/registry",
          "dojo/parser",
          "dojo/_base/lang",
          "dojo/_base/array",
          "dojo/_base/event",
          'dojo/_base/json',
          "dojo/query",
          'qpid/common/util',
          "dojo/text!addQueue.html",
          "qpid/common/DestinationChooser",
          "qpid/common/ContextVariablesEditor",
          "dojox/validate/us",
          "dojox/validate/web",
          "dijit/Dialog",
          "dijit/form/CheckBox",
          "dijit/form/FilteringSelect",
          "dijit/form/ValidationTextBox",
          "dijit/form/Button",
          "dijit/form/Form",
          "dojo/domReady!"],
      function (dom, construct, win, registry, parser, lang, array, event, json, query, util, template)
      {
          var hideDialog = function ()
          {
              registry.byId("addQueue")
                  .hide();
          };
  
          var requiredFields = {sorted: "sortKey"};
  
          var numericFieldNames = ["maximumMessageTtl",
                                   "minimumMessageTtl",
                                   "alertThresholdQueueDepthMessages",
                                   "alertThresholdQueueDepthBytes",
                                   "alertThresholdMessageAge",
                                   "alertThresholdMessageSize",
                                   "alertRepeatGap",
                                   "maximumDeliveryAttempts"];
  
          var addQueue = {
              _init: function ()
              {
                  var node = construct.create("div", {innerHTML: template});
                  parser.parse(node)
                      .then(lang.hitch(this, function (instances)
                      {
                          this._postParse();
                      }));
              },
              _postParse: function ()
              {
                  this.alternateBinding = registry.byId("formAddQueue.alternateBinding");
                  this.form = registry.byId("formAddQueue");
  
                  for (var i = 0; i < numericFieldNames.length; i++)
                  {
                      registry.byId("formAddQueue." + numericFieldNames[i])
                          .set("regExpGen", util.numericOrContextVarRegexp);
                  }
  
                  registry.byId("formAddQueue.maximumQueueDepthBytes")
                      .set("regExpGen", util.signedOrContextVarRegexp);
                  registry.byId("formAddQueue.maximumQueueDepthMessages")
                      .set("regExpGen", util.signedOrContextVarRegexp);
  
                  this.queueName = registry.byId("formAddQueue.name");
                  this.queueName.set("regExpGen", util.nameOrContextVarRegexp);
                  this.queueDurable = registry.byId("formAddQueue.durable");
                  this.queueType = registry.byId("formAddQueue.type");
                  this.context = registry.byId("formAddQueue.context");
                  this.overflowPolicyWidget = registry.byId("formAddQueue.overflowPolicy");
                  this.messageGroupTypeWidget = registry.byId("formAddQueue.messageGroupType");
                  this.editNodeBanner = dom.byId("addQueue.editNoteBanner");
  
  
                  registry.byId("formAddQueue.cancelButton")
                      .on("click", function (e)
                      {
                          event.stop(e);
                          hideDialog();
                      });
  
                  registry.byId("formAddQueue.saveButton")
                      .on("click", lang.hitch(this, function (e)
                      {
                          this._submit(e);
                      }));
  
                  registry.byId("formAddQueue.type")
                      .on("change", function (value)
                      {
                          query(".typeSpecificDiv")
                              .forEach(function (node, index, arr)
                              {
                                  if (node.id === "formAddQueueType:" + value)
                                  {
                                      node.style.display = "block";
                                      if (addQueue.management)
                                      {
                                          util.applyMetadataToWidgets(node, "Queue", value, addQueue.management.metadata);
                                      }
                                  }
                                  else
                                  {
                                      node.style.display = "none";
                                  }
                              });
                          for (var requiredField in requiredFields)
                          {
                              dijit.byId('formAddQueue.' + requiredFields[requiredField]).required =
                                  (requiredField == value);
                          }
                      });
              },
  
              _submit: function (e)
              {
                  event.stop(e);
                  if (this.form.validate())
                  {
                      var queueData = util.getFormWidgetValues(this.form, this.initialData);
                      var context = this.context.get("value");
                      if (context)
                      {
                          queueData["context"] = context;
                      }
                      queueData.alternateBinding = this.alternateBinding.valueAsJson();
  
                      if (this.initialData && this.initialData.id)
                      {
                          this.management.update(this.modelObj, queueData)
                              .then(hideDialog);
                      }
                      else
                      {
                          this.management.create("queue", this.modelObj, queueData)
                              .then(hideDialog);
                      }
                      return false;
                  }
                  else
                  {
                      alert('Form contains invalid data.  Please correct first');
                      return false;
                  }
              },
  
              show: function (management, modelObj, effectiveData)
              {
                  this.management = management;
                  this.modelObj = modelObj;
  
                  this.alternateBindingLoadPromise =
                      this.alternateBinding.loadData(management, effectiveData ? modelObj.parent : modelObj);
                  this.form.reset();
  
                  if (effectiveData)
                  {
                      var afterLoad = lang.hitch(this, function (data)
                      {
                          var actualData = data.actual;
                          var effectiveData = data.effective;
                          this.initialData = actualData;
                          this.effectiveData = effectiveData;
                          this.queueType.set("value", actualData.type);
                          this.queueType.set("disabled", true);
                          this.queueName.set("disabled", true);
                          this.queueDurable.set("disabled", true);
                          this.queueName.set("value", actualData.name);
                          this.context.setData(actualData.context, effectiveData.context, data.inheritedActual.context);
                          this.editNodeBanner.style.display = "block";
                          this._show();
                      });
                      util.loadData(management, modelObj, afterLoad, {depth: 1});
                  }
                  else
                  {
                      this.editNodeBanner.style.display = "none";
                      this.queueType.set("disabled", false);
                      this.queueName.set("disabled", false);
                      this.queueDurable.set("disabled", false);
                      this.initialData = {"type": "standard"};
                      this.effectiveData = {};
                      util.loadEffectiveAndInheritedActualData(management, modelObj, lang.hitch(this, function (data)
                      {
                          this.context.setData(data.actual.context, data.effective.context, data.inheritedActual.context);
                          this._show();
                      }), {depth: 1});
                  }
              },
  
              _show: function ()
              {
                  this.alternateBindingLoadPromise.then(lang.hitch(this, function ()
                  {
                      var validOverflowValues = this.management.metadata.getMetaData("Queue",
                          this.initialData.type).attributes.overflowPolicy.validValues;
                      var validOverflowValueStore = util.makeTypeStore(validOverflowValues);
                      this.overflowPolicyWidget.set("store", validOverflowValueStore);
  
                      var validGroupingValues = this.management.metadata.getMetaData("Queue",
                          this.initialData.type).attributes.messageGroupType.validValues;
                      var validGroupingValueStore = util.makeTypeStore(validGroupingValues);
                      this.messageGroupTypeWidget.set("store", validGroupingValueStore);
  
  
                      util.applyToWidgets(this.form.domNode,
                          "Queue",
                          this.initialData.type,
                          this.initialData,
                          this.management.metadata,
                          this.effectiveData
                      );
  
                      var alternate = this.initialData.alternateBinding;
                      if (alternate && alternate.destination)
                      {
                          this.alternateBinding.set("value", alternate.destination);
                      }
  
                      registry.byId("addQueue").show();
                  }));
              }
          };
  
          addQueue._init();
          return addQueue;
      });
  