/*
COPYRIGHT 1995-2005 ESRI

TRADE SECRETS: ESRI PROPRIETARY AND CONFIDENTIAL
Unpublished material - all rights reserved under the
Copyright Laws of the United States.

For additional information, contact:
Environmental Systems Research Institute, Inc.
Attn: Contracts Dept
380 New York Street
Redlands, California, USA 92373

email: contracts@esri.com
*/

function EsriTask(id, mapId) {
  this.inheritsFrom(new EsriControl(id, "Task", 0, 0, 0, 0));
  this.mapId = mapId;
  this.loadedScripts = new Array();
  var self = this;
  var div = document.createElement("div");
  EsriUtils.hideElement(div);
  
  this.updateAsync = function(xml, eventSources) {
    var idTag = xml.getElementsByTagName("id").item(0);
    var id = idTag.firstChild.nodeValue;
    var isIE = EsriUtils.isIE;
    
    if (id == self.id) {
      self.mapId = xml.getElementsByTagName("map-id").item(0).firstChild.nodeValue;
      var contentTags = xml.getElementsByTagName("task-cdata-content");
      var content;
      if (isIE) content = contentTags.item(0).firstChild.nodeValue;
      else {
        content = new XMLSerializer().serializeToString(contentTags.item(0));
        content = content.substring("<task-cdata-content><![CDATA[".length, content.indexOf("]]></task-cdata-content>"));
      }
      
      if(isIE){
        div.innerHTML = '<input type="hidden"/>'+ content;  //workaround for IE NoScope element
      }else{
        div.innerHTML = content;  
      }

      var newTaskCell = null;
      var taskCells = [];
      var taskCellIds = [];

      var elems = div.getElementsByTagName("div");
      var parentNode; 
      var breakNodes = new Array();
      for (var i=0;i<elems.length;i++) {
        var elem = elems.item(i);
        if (elem.id.indexOf("EsriTaskCell_") == 0) {
          taskCellIds.push(elem.id);
          taskCells[elem.id] = elem;
          var oldElem = document.getElementById(elem.id);
          if(oldElem){
            parentNode = oldElem.parentNode;
          }else{
            breakNodes.push(elem.id);
          }  
        }
      }
      if(parentNode && breakNodes.length > 0){
        for(var j=0; j< breakNodes.length; j++){
          var divElem = document.createElement("div");
          divElem.id =breakNodes[j]; 
          parentNode.appendChild(divElem);
        }
      }
      
      elems = div.getElementsByTagName("script");
      var scriptHeader = document.getElementsByTagName("head")[0];

      for (var i=0;i<elems.length;i++) {
        var elem = elems.item(i);
        
        if(elem.src){
          if (!self.loadedScripts[elem.src]) {
            self.loadedScripts[elem.src] = true;
            var script = document.createElement("script");
            script.language = "javascript";
            script.setAttribute("type", "text/javascript");
            script.setAttribute("src", elem.src);
            scriptHeader.appendChild(script);
          }
        }
        if(elem.innerHTML){
          eval(elem.innerHTML);
        }
      }
      
      try{
        esriLoadApp();
      }catch(err){
        //firefox has delay when loading js, it may trigger a exception here, but won't hurt our tasks.        
      }
      
      for (var n=0;n<taskCellIds.length;n++) {
        var oldTaskCell = document.getElementById(taskCellIds[n]);
        EsriUtils.hideElement(oldTaskCell);
        var newTaskCell = taskCells[taskCellIds[n]];
        EsriUtils.hideElement(newTaskCell);
        var rect = EsriUtils.getElementBounds(newTaskCell);
        EsriUtils.cloneElementStyle(oldTaskCell, newTaskCell);
        oldTaskCell.parentNode.replaceChild(newTaskCell, oldTaskCell);
        EsriUtils.removeElement(oldTaskCell);
		
		var win2 = null;
        if ("taskWindowManager" in window) {
          for (var w=0;w<window.taskWindowManager.windowIds.length;w++) {
            var win = window.taskWindowManager.windows[window.taskWindowManager.windowIds[w]];
            if (win.pageElement.divId == taskCellIds[n]) {
              var winZ = -1;
              var closed = win.closed;
              if (closed) {
                winZ = win.divObject.style.zIndex;
                EsriUtils.setElementStyle(win.divObject, "z-index:-1;");
              }
              win.pageElement.divObject = newTaskCell;
              
              if (! win.fittable) {
                if (rect.width && rect.height) {
                  var dx = win.bounds.width - win.pageElement.bounds.width;
                  var dy = win.bounds.height - win.pageElement.bounds.height;
                  win.bounds.width = rect.width + dx;
                  win.bounds.height = rect.height + dy;
                }
              }
              window.taskWindowManager.loadProperties("win_" + self.id, true);
              win.update();
              win.fit();
              win2 = win;
              if (closed) {
                if (! winZ) EsriUtils.removeElementStyle(win.divObject, "z-index;");
                else EsriUtils.setElementStyle(win.divObject, "z-index:" + winZ + ";");
              }
              break;
            }
          }
        }
        EsriUtils.showElement(newTaskCell);
        
        // This was added for tasks that had delayed loading
        // in order to calculate the task size, the task
        // must first be rendered. Above the window is "fit"
        // before it is rendered.
        if (win2 != null) {
        	win2.fit();
        }  
      }
      div.innerHTML = "";

      var formId = EsriControls.maps[mapId].formId;
      if (eventSources.indexOf(self.id) != -1) {
        var formElements = document.forms[formId].elements;
        for (var i=0;i<formElements.length;i++) {
          var elementId = formElements[i].id;
          if ((elementId.indexOf(self.id + "_action_") != -1 || elementId.indexOf(self.id + "_tool_") != -1) && elementId.indexOf("button") == -1) {
            EsriUtils.removeFormElement(formId, elementId);
            EsriUtils.removeFormElement(formId, elementId + "_value");
          }
        }
      }

      var activeToolTags = xml.getElementsByTagName("active-tool");
      if (activeToolTags.length > 0) {
        var activeTool = activeToolTags.item(0).firstChild.nodeValue;
        EsriUtils.removeFormElement(formId, activeTool);
        EsriUtils.removeFormElement(formId, activeTool + "_value");
        EsriUtils.removeFormElement(formId, self.mapId);
        EsriUtils.removeFormElement(formId, self.mapId + "_mode");
        EsriUtils.removeFormElement(formId, self.mapId + "_minx");
        EsriUtils.removeFormElement(formId, self.mapId + "_miny");
        EsriUtils.removeFormElement(formId, self.mapId + "_maxx");
        EsriUtils.removeFormElement(formId, self.mapId + "_maxy");
        EsriUtils.removeFormElement(formId, self.mapId + "_coords");
        EsriUtils.removeFormElement(formId, self.mapId + "_value");
        EsriControls.maps[self.mapId].reactivateCurrentToolItem();
      }

      for (var i=0;i<self.updateListenerNames.length;i++) self.updateListeners[self.updateListenerNames[i]](self);
    }
  }

  EsriControls.tasks[id] = this;
  EsriControls.taskIds.push(id);
  EsriControls.addPostBackTagHandler("task", EsriControls.tasks[self.id].updateAsync);
}

EsriTask.initTaskWindow = function(taskCellId,peId,displayName,winId,fittable, mapId, resize , winClosed){
  if(!window.taskWindowManager.windows[winId]){
    var pe = new EsriPageElement(peId);
    pe.divObject = document.getElementById(taskCellId);
    pe.divId = taskCellId;
  
    var win = new JitkWindow(winId, displayName? displayName : "" , pe);
    win.init(document.forms[EsriControls.maps[mapId].formId]);
    if (fittable) {
      win.fittable = fittable;
    }
    win.fit();
    window.taskWindowManager.addWindow(win, resize);
    
    if(winClosed){
      window.taskWindowManager.windows[winId].hide();
    }
  }
}

EsriTask.initTaskGlobals = function(form) {
  if (! window.taskWindowManager) {
    var input = document.createElement("input");
    input.type = "HIDDEN";
    input.id = input.name = "taskWinProp";
    form.appendChild(input);

    window.taskWindowManager = new EsriWindowManager("taskWindowManager", document.getElementById("taskWinProp"));
  }
}

EsriTask.initTask = function(taskId, container, windowTitle, closed) {
  var taskCellId = "EsriTaskCell_" + taskId;
  var taskCell = document.getElementById(taskCellId);

  if (! taskCell) {
    taskCell = container.appendChild(document.createElement("div"));
    taskCell.id = taskCellId;
  }

  if (windowTitle) {
    var pe = new EsriPageElement("pe_" + taskCellId);
    pe.divObject = taskCell;
    pe.divId = taskCellId;

    var win = new JitkWindow("win_" + taskCellId, windowTitle, pe);
    win.closed = closed;
    win.init(container);
    win.fittable = true;
    win.fit();
    window.taskWindowManager.addWindow(win, true);
    win.center();
  }
}

EsriTask.loadTask = function(taskId, mapId, configs) {
  if (EsriControls.tasks[taskId]) return true;

  var formId = EsriControls.maps[mapId].formId;
  var form = document.getElementById(formId);
  EsriTask.initTaskGlobals(form);

  var id, container, title, config;
  for (var i=0, il=configs.length; i<il; i++) {
    config = configs[i];
    id = taskId;
    container = config.container ? config.container : formId;
    title = config.title;

    if (i > 0) { id += (i+1); }
    EsriTask.initTask(id, document.getElementById(container), title, i > 0);
  }

  new EsriTask(taskId, mapId);

  var params = "renderTask=renderTask&formId=" + formId + "&taskId=" + taskId + "&" + EsriUtils.buildRequestParams("mapForm");
  EsriUtils.sendAjaxRequest(EsriUtils.getServerUrl("mapForm"), params, false, EsriControls.processPostBack);
};


