/**
 *  product support application functions (for NGW)
 *  psa2.js
 *  $Revision: 1.11 $
 */
 
// Assumes Unica JS file is already loaded
// set values for Unica tags
//var NTPT_IMGSRC = "/web/fw/i/ntpagetag.gif";
//NTPT_FLDS.lc = true;
var NTPT_MAXTAGWAIT = 0.5;

var psa_deeplink_processed = false;
var psa_deeplinks = [];
var psa_clickCount = 0;

// timer for testing page rendering
var PSATimer = new Date();
var psatimer1 = PSATimer.getTime();

var products = {};
var subtree = {};

if(typeof(cdc) == "undefined") {
  var cdc = {};
}

var crumbs = [];
var locked = [-1,-1,-1,-1,-1,-1,-1,-1];
var selectednode = null;

// Product Selector Application (PSA) Namespace
cdc.psa = function(){
  // private variables
  
  // private methods
  
  // generate a link 
  function genlink(title, url, idx, type_name,task_name) {
    var s = '<li class="pslink"><a href="'+ url +'" rel="&task='+ task_name + "&nodeId=" + idx + "&type=" + type_name + "&locale=" + psa_languagecode + '" onclick="psa_setup_click(this);ntptEventTag();return cdc.mru.makeMruRequest(this)">'+ title +'</a></li>';
    return s;
  }
        
  // generate a category link
  function gentopic(node,n){
    var path=n.substring(1).split("_");
    var level = path.length;
    var i = path[path.length-1];
    var s = '<li class="';  // <a href="javascript:void(0)">'
    if(locked[level] == i) {
      s += " pslocked";
      selectednode = n;
    }
    s += '"><a href="#" onclick="cdc.psa.togglelock(\''+ "pssub" + n + '\');cdc.psa.displaynode(\''+ "pssub" + n + '\');return false" id="pssub' + n + '" class="">'+ node.title +'</a></li>';
    return s;
  }
  
  return {
    // public methods
    
    // submit a request
    jsonp_request: function(url) {
      // url += "&" +new Date().getTime().toString(); // prevent caching
      var script = document.createElement("script");
      script.setAttribute("src",url);
      script.setAttribute("type","text/javascript");
      document.body.appendChild(script);
    },
    
    loadsubtree: function(response) {
      var idx = cdc.psa.loading_id.substring(6);
      var path = idx.length === 0 ? [] : idx.split("_");
      var subtree = response.hierarchy.navData;
      tree.children[path[0]] = subtree;
      cdc.psa.displaynode(cdc.psa.loading_id);
      // continue processing deeplinks after category
      var child = path[0];
      var idstub = "pssub_"+child;
      for(var i = 1; i<psa_deeplinks.length; i++) {
        var j=0;
        while(subtree.children[j].nodeId != psa_deeplinks[i]) {
          j++;
        }
        this.togglelock(document.getElementById(idstub+"_"+j));
        this.displaynode(idstub+"_"+j);
        subtree = subtree.children[j];
        idstub += ("_"+j);
      }
      psa_deeplinks = [];
    },
    
    process_deeplink: function() {
      psa_deeplinks = [];
      var i = 0;
      var nodeId = "";
      while((nodeId=getQueryString("level"+i)) !== "") {
        //cdc.debug.log("deeplink param :"+nodeId);
        psa_deeplinks.push(nodeId);
        i++;
      }
      if(psa_deeplinks.length>0) {
        i = 0;
        while(tree.children[i].nodeId != psa_deeplinks[0]) {
          i++;
        }
        this.togglelock(document.getElementById("pssub_"+i));
        this.displaynode("pssub_"+i);
      }
    },
    
    switchtree: function(box1link) {
      cdc.psa.cancel_eoseol = true;
      if(box1link === null) {
        // product link
        box1link = document.getElementById("psbox1").getElementsByTagName("OL")[1].getElementsByTagName("LI")[0];
      }
      var lis = box1link.parentNode.parentNode.getElementsByTagName("LI");
      for(var i = 0;i<lis.length;i++) {
        lis[i].className = "";
      }
      box1link.className += "pslocked";
      // restore Add Device dialog to initial view
      var ad_form = document.getElementById("ad-form");
      var ad_fields = ad_form.getElementsByTagName("FIELDSET");
      var i = 1; //do not remove the first fieldset
      while(i < ad_fields.length) {
        ad_form.removeChild(ad_fields[i]);
      }
      jQuery("#adddevice_error").empty();
      document.getElementById("adddevice_error").style.display="none";
      jQuery("#ad-name").parent().prev().children("span").attr("class","");
      document.getElementById("ad-form").deviceName.value = cdc.local.wpx.PSA_ADDDEVICE_DEFAULT_NAME;
      document.getElementById("psa_adddevice").style.display="none";
      document.getElementById("psbox2").style.display="block";
      document.getElementById("psbox3").style.display="block";
      var t = box1link.firstChild.innerHTML;
      switch(t) {
        case cdc.local.wpx.PSA_SELECTIONS_PRODUCTS:
          tree = products;
          psa_current_mode = "prod";
          path = [];
          crumbs = [];
          break;
        case cdc.local.wpx.PSA_SELECTIONS_TECHNOLOGY:
          tree = technologies;
          psa_current_mode = "tech";
          path = [];
          crumbs = [];
          break;
        case cdc.local.wpx.PSA_SELECTIONS_MRU:
          tree = mru;
          psa_current_mode = "mru";
          path = [];
          crumbs = [];
          break;
        case cdc.local.wpx.PSA_SELECTIONS_MYDEVICES:
          tree = mydevices;
          psa_current_mode = "mydevice";
          path = [];
          crumbs = [];
          break;
        case cdc.local.wpx.PSA_SELECTIONS_EOS_EOL:
          tree = eoseol;
          psa_current_mode = "eol";
          cdc.psa.switch_to_eoseol();
          break;
      }
    },
    
    switch_to_eoseol: function() {
      if(typeof eoseol == "undefined") {
        eoseol = {};
      }
      if(typeof eoseol.children == "undefined") {
        var url = cdc.psa.service_host + cdc.psa.service_prefix +"hierarchy/eol/"+ psa_task_name +"/0/"+ psa_entitlement +"?locale="+ psa_languagecode +"&"+cdc.psa.service_environment +"&callback=?";
        document.getElementById("psbox3").innerHTML="";
        document.getElementById("psbox2").innerHTML="<img src='/web/fw/i/spinner.gif' style='margin-left:110px;margin-top:140px' />";
        cdc.psa.cancel_eoseol = false;
        jQuery.getJSON(url, function(data){cdc.psa.get_eoseol_tree(data);});
      }
      else {
        tree = eoseol;
        psa_current_mode = "eol";
        path = [];
        crumbs = [];
      }
    },
    
    // callback 
    get_eoseol_tree: function(response) {
      if(cdc.psa.cancel_eoseol === true) {
        return;
      }
      eoseol.title = cdc.local.wpx.PSA_SELECTIONS_EOS_EOL;
      eoseol.children = response.hierarchy.dataList;
      tree = eoseol;
      psa_current_mode = "eol";
      path = [];
      crumbs = [];
      crumbs.push(cdc.local.wpx.PSA_SELECTIONS_EOS_EOL);
      cdc.psa.displaynode(null);
    },
    
    clearlocks: function(start) {
      for(var i= start; i < locked.length; i++) {
        locked[i] = -1;
      }
    },
    
    togglelock: function(obj) {
      if(typeof obj == "string") {
        obj = document.getElementById(obj);
      }
      // we need to keep track of which node is locked at each level of the tree
      var idx = obj.id.substring(6);
      var path = idx.length ===0 ? [] : idx.split("_");
      var level = path.length;
      var child_to_lock = path[path.length-1];
      if(locked[level] != -1) {
        if (locked[level] != child_to_lock){
          // unlock the old category
          var re = new RegExp("_"+child_to_lock+"$");
          var locked_sibling = document.getElementById(obj.id.replace(re, "_"+locked[level]));
          locked_sibling.parentNode.className = locked_sibling.parentNode.className.replace(/pslocked/g,"");
          // lock the new one
          obj.parentNode.className += " pslocked";
          locked[level] = child_to_lock;
        }
        else {
          // unlock the current
          //          obj.parentNode.className = 
          //              obj.parentNode.className.replace(/pslocked/g,"");
          //          locked[level] = -1;
        }
      }
      else {
        // no category was locked; lock the clicked one
        obj.parentNode.className += " pslocked";
        locked[level] = child_to_lock;
      }
      // clear all locks further down the tree
      this.clearlocks(level+1);
    },
    
    displaycrumbs: function(c) {
      var str = c.join("");
      document.getElementById("psacrumbs").innerHTML=str;
    },
    
    docrumb: function(obj) {
      selectednode = null;
      // display box2
      if((obj.id == "crumb_")||(obj.id=="crumb")) {  // user clicked first breadcrumb
        this.displaynode(null);
      }
      else {
        var objid = obj.id;
        // fix breadcrumbs here
        objid = objid.replace(/_[0-9]+$/,"");
        if (objid == "crumb") { objid = "crumb_"; }
        this.displaynode(objid);
      }
      if(selectednode !== null) {
        // a category is locked, so display box3
        this.displaynode("pssub"+selectednode);
        selectednode = null;
      }
    },
    
    displaynode: function(objid) {
      if((objid === null) && (psa_current_mode == "eol") && (typeof eoseol.children == "undefined")) {
        crumbs = [];
        path=[];
        crumbs.push(cdc.local.wpx.PSA_SELECTIONS_EOS_EOL);
        cdc.psa.displaycrumbs(crumbs);
        // return;
      }
      if((objid === null) && (psa_current_mode == "adddevice")) {
        init_adddevice();
        return;
      }
      var idx = "";
      var str = "";
      var box2 = document.getElementById("psbox2");
      var box3 = document.getElementById("psbox3");
      var targetbox=box3;
      selectednode = null;
      crumbs=[];
      var path = [];
      if(objid === null) {
        //cdc.debug.log("The page just loaded in default view, or we are processing a box1 link.");
        path = [];
        targetbox = box2;
        box3.innerHTML = "";
        this.clearlocks(0);
        if((psa_current_mode == "eol") && ((eoseol === null) || (typeof eoseol.children == "undefined"))) {
          cdc.psa.switch_to_eoseol();
          crumbs = [];
          path=[];
          crumbs.push(cdc.local.wpx.PSA_SELECTIONS_EOS_EOL);
          cdc.psa.displaycrumbs(crumbs);
          return;
        }
        if(psa_current_mode == "home") {
          // nothing selected
          box2.innerHTML="";
          return;
        }
        // produce value message if needed
        var is_anonymous = (cdc.psa.user_state == "anonymous");
        var is_recognized = (cdc.psa.user_state.indexOf("recognized")>=0);
        var is_loggedIn = (cdc.psa.user_state == "loggedIn");
        var is_mru = (psa_current_mode == "mru");
        var is_mydevices = (psa_current_mode == "mydevice");
        var is_no_data = ((typeof tree.children == "undefined") || (tree.children.length === 0));
        if(is_mru) {
          crumbs = [];
          path=[];
          crumbs.push(cdc.local.wpx.PSA_SELECTIONS_MRU);
          cdc.psa.displaycrumbs(crumbs);
        }
        if(is_mydevices) {
          crumbs = [];
          path=[];
          crumbs.push(cdc.local.wpx.PSA_SELECTIONS_MYDEVICES);
          cdc.psa.displaycrumbs(crumbs);
        }
        if(is_anonymous && is_mru) {
          str += "<p>" + cdc.local.wpx.PSA_MRU_ANONYMOUS + "</p>";
          targetbox.innerHTML = str;
          if(document.getElementById("psa_mru_register_link")) {
            document.getElementById("psa_mru_register_link").href = cdc.psa.login_url+document.location.href;
          }
          return;
        }
        if(is_anonymous && is_mydevices) {
          str += "<p>" + cdc.local.wpx.PSA_MYDEVICES_ANONYMOUS + "</p>";
          targetbox.innerHTML = str;
          if(document.getElementById("psa_mydevices_register_link")) {
            document.getElementById("psa_mydevices_register_link").href = cdc.psa.login_url+document.location.href;
          }
          return;
        }
        if(is_recognized && is_mydevices) {
          str += "<p>"+cdc.local.wpx.PSA_MYDEVICES_RECOGNIZED+"</p>";
          targetbox.innerHTML = str;
          if(document.getElementById("psa_mydevices_login_link")) {
            document.getElementById("psa_mydevices_login_link").href = cdc.psa.login_url+document.location.href;
          }
          return;
        }
        if(is_recognized && is_mru && is_no_data) {
          str += "<p>"+cdc.local.wpx.PSA_MRU_ANONYMOUS+"</p>";
          targetbox.innerHTML = str;
          if(document.getElementById("psa_mru_register_link")) {
            document.getElementById("psa_mru_register_link").href = cdc.psa.login_url+document.location.href;
          }
          return;
        }
        if(is_loggedIn && is_mru && is_no_data) {
          str += "<p>"+cdc.local.wpx.PSA_MRU_NO_DATA+"</p>";
          targetbox.innerHTML = str;
          if(document.getElementById("psa_mru_select_product_link")) {
            document.getElementById("psa_mru_select_product_link").href = "javascript:cdc.psa.switchtree(null);cdc.psa.displaynode(null)";
          }
          return;
        }
        if (is_loggedIn && is_mydevices && is_no_data){
          str += "<p>"+cdc.local.wpx.PSA_MYDEVICES_NO_DATA+"</p>";
          targetbox.innerHTML = str;
          if(document.getElementById("psa_mydevices_adddevice_link")) {
            document.getElementById("psa_mydevices_adddevice_link").href = "javascript:init_adddevice(null)";
          }
          return;
        }
        // all value messages have been handled, so display mydevices/mru data
        if(is_mydevices || is_mru) {
          if(is_mydevices) {
            str += '<ol><li class="psgroup">'+ cdc.local.wpx.PSA_UPLOADED_DEVICES_HEADING;
          }
          str += "<ol>";
          for(var i=0;i<tree.children.length;i++) {
            if(typeof tree.children[i].tasks == "undefined") {
              // alert("Bad MRU data item.  Ignored.");
            }
            else {
              str += genlink(tree.children[i].name, tree.children[i].tasks[0].url, tree.children[i].itemID, tree.children[i].type, tree.children[i].tasks[0].task);
            }
          }
          str += "</ol>";
          if(is_mydevices) {
            str += "</li></ol><hr /><ol><li>";
            str += "<a href='#' onclick='init_adddevice();return false'>";
            str += cdc.local.wpx.PSA_SELECTIONS_ADDDEVICE+"</a></li></ol>";
          }
          targetbox.innerHTML = str;
          //jQuery(".pslink a").click = psa_click_handler;
          return;
        }
        // end of new logic for value messages and mydevices/mru
      }
      else {
        //cdc.debug.log("objid is not null. we are looking at a box2 link.")
        psa_clickCount++;
        // check if node is present, or if we have to call the service
        idx = objid.substring(6);
        path = idx.length === 0 ? [] : idx.split("_");  
        // first-level node, but children are not present
        if((path.length == 1) && tree.children[path[0]].children.length === 0) {
          cdc.psa.loading_tree = (tree != products)? "technologies" : "products";
          var url = cdc.psa.service_host + cdc.psa.service_prefix +"hierarchy/"+ cdc.psa.loading_tree +"/"+psa_task_name+"/0/"+psa_entitlement+"/"+ tree.children[path[0]].nodeId + "?locale="+psa_languagecode + "&"+cdc.psa.service_environment + "&callback=?";
          // cdc.psa.loading_nodeId = tree.children[path[0]].nodeId;
          cdc.psa.loading_id = objid;
          box3.innerHTML="<img src='/web/fw/i/spinner.gif' "+"style='margin-left:110px;margin-top:140px' />";
          jQuery.getJSON(url,function(data){cdc.psa.loadsubtree(data);});
          return; 
          // callback function will call displaynode() 
          // again after retrieving subtree
        }
        // if clicked in column 3 (or crumb), then shift columns left
        if(objid.indexOf("crumb") === 0) {
          targetbox = box2;
          box3.innerHTML = "";
          // clear all locks further down the tree
          var level = path.length+1;
          for(var i=level+1; i<locked.length; i++) {
            locked[i] = -1;
          }
        }
        var obj=document.getElementById(objid);
        if((typeof obj.parentNode != "undefined") && (typeof obj.parentNode.parentNode != "undefined") && (typeof obj.parentNode.parentNode.parentNode != "undefined") && (obj.parentNode.parentNode.parentNode.id == "psbox3")) {
          box2.innerHTML = box3.innerHTML;
          box3.innerHTML = "";
        }
      }
      // follow path through tree and build breadcrumb list
      var node = tree;
      var bnode = node;
      var pnode = null;
      for(var i=-1; ((bnode !== null) && (i<path.length)); i++) {
        var crumb = bnode.title;
        if(i>=0) {
          ntptAddPair("cat"+(i+1),crumb);
        }
        if((path.length !== 0) && (i != (path.length-1))) {
          // not the last crumb; create link  
          crumb = '<a id="crumb_'+path.slice(0,i+1).join("_") + '" href="javascript:void(0)" onclick="cdc.psa.docrumb(this);return false">'+ crumb +'</a>';
        }
        crumbs.push(crumb);
        pnode = bnode;
        if(path.length>0) { bnode = bnode.children[path[i+1]]; }
      }
      cdc.psa.displaycrumbs(crumbs);
      node = pnode;
      // generate the links in the next level (children of node)
      var str = "<ol>";
      if(typeof node.series_title != "undefined") {
        str += genlink(cdc.local.wpx.PSA_ALL_LINK_PREFIX+" "+node.series_title+" "+cdc.local.wpx.PSA_ALL_LINK_SUFFIX, node.series_url, node.series_nodeId,"product",psa_task_name);
      }
      if(typeof node.children != "undefined") {
        for(i = 0; i<node.children.length; i++) {
          if((node.children[i].nodeType.indexOf("category")>=0) || (node.children[i].children.length > 0)) {
            if(typeof node.children[i].url != "undefined") {
              node.children[i].series_url = node.children[i].url;
              node.children[i].series_title = node.children[i].title;
              node.children[i].series_nodeId = node.children[i].nodeId;
            }
            str += gentopic(node.children[i], (idx === "" ? idx : "_"+idx)+"_"+i);
          } 
          else {
            str+=genlink(node.children[i].title,
            node.children[i].url,
            node.children[i].nodeId,"product",psa_task_name);
          }
        }
        //special technologies legacy link
        if(targetbox.getAttribute("id") == "psbox2" && tree == technologies) {
          str+="</ol><hr/><ol><li>";
          str+="<a onclick=\"psa_setup_click(this);ntptEventTag();\" rel=\"&amp;task="+psa_task_name+"&amp;nodeId=&amp;type=product\" href=\""+cdc.local.wpx.PSA_TECH_LEGACY_URL+"\">"+cdc.local.wpx.PSA_TECH_LEGACY_LINKTEXT+"</a>";
          str+="</li>";
        }
      }
      targetbox.innerHTML = str+"</ol>";
      /* accessibility  - except when the page first loads, put focus on
      the first item in the new box
      if((typeof cdc.psa.firstDisplay == "undefined") || (cdc.psa.firstDisplay == true)) {
        cdc.psa.firstDisplay=false;
      }
      else {
        // div>ul>li>a
        targetbox.firstChild.firstChild.firstChild.focus();
      } */
    }
  };
}();

cdc.psa.cancel_eoseol = false;

cdc.psa.adddevice_data = [
 {"id":"ad-name",
  "metaclass":"",
  "caption":cdc.local.wpx.PSA_ADDDEVICE_CAPTION_NAME
 },
 {"id":"ad-category",
  "metaclass":"Category",
  "caption":cdc.local.wpx.PSA_ADDDEVICE_CAPTION_CATEGORY
 },
 {"id":"ad-subcat",
  "metaclass":"Sub-Category",
  "caption":cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SUBCATEGORY
 },
 {"id":"ad-series",
  "metaclass":"Series",
  "caption":cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SERIES
 },
 {"id":"ad-model",
  "metaclass":"Model",
  "caption":cdc.local.wpx.PSA_ADDDEVICE_CAPTION_MODEL
 },
 {"id":"ad-softwarefamily",
  "metaclass":"Software Family",
  "caption":cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SWFAMILY
 },
 {"id":"ad-softwareversionoption",
  "metaclass":"Software Version/Option",
  "caption":cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SWVERSION_OPTION
 },
 {"id":"ad-interfaces-moduletypes",
  "metaclass":"Interfaces/Modules Types",
  "caption":cdc.local.wpx.PSA_ADDDEVICE_CAPTION_INTERFACE_MODULE
 },
 {"id":"ad-interface",
  "metaclass":"Interface/Module",
  "caption":cdc.local.wpx.PSA_ADDDEVICE_CAPTION_INTERFACE
 },
 {"id":"ad-modelseries",
  "metaclass":"modelseries",
  "caption":cdc.local.wpx.PSA_ADDDEVICE_CAPTION_MODEL 
             + "/" + cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SERIES
 }
];

/* -----------------------
 Unica
--------------------------*/
function psa_setup_click(anchor){
  ntptAddPair("ev","ngw");
  ntptAddPair("basepageUrl",window.location.href);
  ntptAddPair("basepageTitle",document.title);
  if (anchor != null){
     ntptAddPair("linkUrl",anchor.href);
     ntptAddPair("linkText",anchor.innerHTML);
     }
  ntptAddPair("clickCount",psa_clickCount);
  ntptAddPair("entitlement",psa_entitlement);

  if (psa_task_name == "default"){
     ntptAddPair("task","product");
  }else{
     ntptAddPair("task",psa_task_name);
     }
  ntptAddPair("sitearea","supportPSA");
  if (psa_current_mode == "mydevice"){
     ntptAddPair("action","Mashup_Click");
  }else{
     ntptAddPair("action","dclick");
     }
  //rename the mode
  var unicamode = "";
  switch (psa_current_mode){
        case "home": case "adddevice": 
           break;
        case "tech":
           unicamode = "Technology";
  	    break;
        case "prod":
           unicamode = "Product";
  	   break;
        case "mru":
  	   unicamode = "MRU";
  	   break;
        case "mydevice":
  	   unicamode = "MyDevice";
  	   break;
        case "eol":
           unicamode = "EOL-EOS";
           break;
    }
  ntptAddPair("tab",unicamode);

  if (cdc.psa.user_state == "loggedIn"){
     ntptAddPair("loggedIn","Yes");
     ntptAddPair("status","loggedIn");
     }
  else {
     ntptAddPair("loggedIn","No");
     if (cdc.psa.user_state.indexOf("recognized")>=0){
        ntptAddPair("status","Recognized");
        }
     else {
        ntptAddPair("status","Anonymous");
        }
     }

  if (psa_current_mode == "mru" || psa_current_mode == "mydevice"){
     if (typeof anchor.rel != "undefined"){
        if (anchor.rel.indexOf("type=Product")>=0){
           ntptAddPair("product",anchor.innerHTML);
//alert(anchor.innerHTML);
           }
        if (anchor.rel.indexOf("type=Device")>=0){
           var s = anchor.rel.substring(anchor.rel.indexOf("nodeId"));
           s = s.substring(7,s.indexOf("&"));
           ntptAddPair("product",s);
//alert(s);
           }
        }
     }
  }

function psa_click_handler(){
  psa_setup_click(this);
  ntptEventTag();
  return cdc.mru.makeMruRequest(this);
  }

/* -----------------------
Add Device
--------------------------*/

function validate_adddevice(addform){
  var error = false;
  var error_msg = "";

  // trim the device name
  addform.deviceName.value = addform.deviceName.value.replace(/^\s+|\s+$/g, '');

  if ((addform.deviceName.value=="")
      || (addform.deviceName.value==cdc.local.wpx.PSA_ADDDEVICE_DEFAULT_NAME)){
     error_msg = cdc.local.wpx.PSA_ADDDEVICE_ERROR_PROMPT;
     error = true;
  } 
  else if (addform.deviceName.value.match(/[\<\>\'\\\;\"\+\&\%]/)) {
     error_msg = cdc.local.wpx.PSA_ADDDEVICE_INVALID_CHARACTER_MESSAGE;
     error = true;
  }
  else {
     for (var i=0; (error == false) && (i<mydevices.children.length); i++){
//     alert("compare this|"+addform.deviceName.value.toLowerCase()"+| to|"+mydevices.children[i].name.toLowerCase()+"|");
        if (addform.deviceName.value.toLowerCase() 
              == mydevices.children[i].name.toLowerCase()){
           error_msg=cdc.local.wpx.PSA_ADDDEVICE_DUPLICATE_NAME_ERROR;
           error = true;
        }
     }
  }
  if (error == true) {
     jQuery("#ad-name").parent().prev().children("span").attr("class","cl-error");
     var error_div = document.getElementById("adddevice_error");
     error_div.style.display="block";
     error_div.innerHTML=error_msg;
     return false;
     }
  disable_submit();
  psa_setup_click(null);
  ntptEventTag("action=Mash_Click");
  return true;
  }


function psa_get_adddevice_label(metaclass_list){
  var str = "";
  for (var i=0;i<metaclass_list.length;i++){
    if (i>0){
       str+=" ";
       str+=cdc.local.wpx.PSA_ADDDEVICE_CAPTION_BRIDGE;
       str+=" ";
    }
    switch (metaclass_list[i]){
      case "Category": 
         str += cdc.local.wpx.PSA_ADDDEVICE_CAPTION_CATEGORY;
         str = str.replace("undefined",metaclass_list[i]);
         break;
      case "Sub-Category": 
         str += cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SUBCATEGORY;
         str = str.replace("undefined",metaclass_list[i]);
         break;
      case "Series": 
         str += cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SERIES;
         str = str.replace("undefined",metaclass_list[i]);
         break;
      case "Model": 
         str += cdc.local.wpx.PSA_ADDDEVICE_CAPTION_MODEL;
         str = str.replace("undefined",metaclass_list[i]);
         break;
      case "Software Family": 
         str += cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SWFAMILY;
         str = str.replace("undefined",metaclass_list[i]);
         break;
      case "Software Version/Option": 
         str += cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SWVERSION_OPTION;
         str = str.replace("undefined",metaclass_list[i]);
         break;
      case "Interface/Module": 
         str += cdc.local.wpx.PSA_ADDDEVICE_CAPTION_INTERFACE;
         str = str.replace("undefined",metaclass_list[i]);
         break;
      case "Interfaces/Modules Types": 
         str += cdc.local.wpx.PSA_ADDDEVICE_CAPTION_INTERFACE_MODULE;
         str = str.replace("undefined",metaclass_list[i]);
         break;
      default: 
         str += metaclass_list[i];
         break;
      }
   }
   return str;
 }
          
/*
Rollback to current dropdown and also adjust level counter.
*/
function rollback_adddevice(obj){
  // starting at separator, work backward, removing fieldsets
  // until reaching the current one.
  while (obj.tagName != "FIELDSET"){
     obj = obj.parentNode;
     }
  var del = document.getElementById("adddevice_separator").previousSibling;
  while (del != obj){
     var tmp = del;
     del = del.previousSibling;
     tmp.parentNode.removeChild(tmp);
     }
  var first_option = obj.getElementsByTagName("OPTION")[1].value;
  var level = first_option.split("@")[0].substring(6);
  cdc.psa.adddevice_level = level;
  var optgrp = obj.getElementsByTagName("optgroup");
  if (optgrp.length > 0) {
     if (optgrp[0].childNodes[0].value.indexOf("~level") != -1) {
        cdc.psa.adddevice_level++;
     }	
  }
  disable_submit();
 
  // now disable any SELECTs while the service is being called.
  disable_selects();
  
  }

/*
Highlights the 'Add Device' link and initializes add device box appropriately.
*/
function init_adddevice() {
  cdc.psa.cancel_eoseol = true;
  var ad_obj = document.getElementById("psa_adddevice");
  var box1 = document.getElementById("psbox1");
  var box2 = document.getElementById("psbox2");
  var box3 = document.getElementById("psbox3");
  if(ad_obj.style.display == "block") {
    // dialog is already open; clicking this should have no effect
    return;
  }
  if((cdc.psa.user_state == "anonymous") || (cdc.psa.user_state.indexOf("recognized") >= 0)) {
    // display value message and return
    var lis = box1.getElementsByTagName("LI");
    for(var i = 0;i<lis.length;i++) {
      //lis[i].className = (lis[i].innerHTML.indexOf(cdc.local.wpx.PSA_SELECTIONS_ADDDEVICE)>=0) ? "pslocked" : "";
      lis[i].className = ( lis[i].getElementsByTagName("A")[0].href.indexOf("mode=adddevice") > 0 ) ? "pslocked" : "";
    }
    // display breadcrumb
    cdc.psa.clearlocks(0);
    crumbs = [];
    path=[];
    crumbs.push(cdc.local.wpx.PSA_SELECTIONS_ADDDEVICE);
    cdc.psa.displaycrumbs(crumbs);
    // display value message
    var str = "";
    if(cdc.psa.user_state == "anonymous") {
      str = "<p>"+cdc.local.wpx.PSA_ADDDEVICE_ANONYMOUS+"</p>";
    }
    else {
      str = "<p>"+cdc.local.wpx.PSA_ADDDEVICE_RECOGNIZED+"</p>";
    }
    box3.innerHTML = "";
    box2.innerHTML = str;
    if(document.getElementById("psa_adddevice_register_link")) {
      document.getElementById("psa_adddevice_register_link").href = cdc.psa.login_url+document.location.href;
    }
    return;
  }
  
  ad_obj.style.display = "block";
  psa_current_mode = "adddevice";
  box2.style.display = "none";
  box3.style.display = "none";
  disable_submit();
  var lis = box1.getElementsByTagName("LI");
  for(var i = 0, linkHref, curLi; i<lis.length; i++) {
    curLi = lis[i];
    linkHref = lis[i].getElementsByTagName("A")[0].href;
    //console.log("cdc.local.wpx.PSA_SELECTIONS_ADDDEVICE: %o\nlis[%o]: %o\nlinkHref: %o", cdc.local.wpx.PSA_SELECTIONS_ADDDEVICE, i, curLi, linkHref);
    //curLi.className = ( curLi.innerHTML.indexOf(cdc.local.wpx.PSA_SELECTIONS_ADDDEVICE) >= 0 ) ? "pslocked" : "";
    curLi.className = ( linkHref.indexOf("mode=adddevice") > -1 ) ? 'pslocked' : '';
  }
  cdc.psa.nodeId = "268437593";
  cdc.psa.adddevice_level = 0;
  document.getElementById("ad-form").action = devices_post_url;
  cdc.psa.software_flag = "false";
  // display breadcrumb
  cdc.psa.clearlocks(0);
  crumbs = [];
  path=[];
  crumbs.push(cdc.local.wpx.PSA_SELECTIONS_ADDDEVICE);
  cdc.psa.displaycrumbs(crumbs);
  //document.getElementById("ad-form").deviceName.focus();
  next_adddevice(null);
}

/*
Creates the next add device dropdown
param form_element: current select element; null if none exist yet
*/
function next_adddevice(form_element) {
  var levels = 2;
  var url=cdc.psa.adddevice_service_host+cdc.psa.adddevice_service_prefix+'/service/';
  //check to be sure the user hasn't selected an invalid option
  var sels = document.getElementById("ad-form").getElementsByTagName("SELECT");
  if(sels.length > 0 && sels[sels.length-1].selectedIndex === 0) {
    return;
  }
  if(form_element !== null && form_element.tagName == "SELECT") {
    var selected_option = form_element.options[form_element.selectedIndex];
    //if the user has selected a software item, there may be no need for another service call
    if((selected_option.parentNode.tagName == "OPTGROUP") && (selected_option.parentNode.id == "software_group")) {
      //make sure the right SW tree is currently captured
      var pnodeid = selected_option.id;
      if(pnodeid != cdc.psa.nodeId) {
        cdc.psa.nodeId = selected_option.id;
        url += pnodeid;
        url += "/true/2?locale=" + psa_languagecode + "&callback=?";
        jQuery.getJSON(url,function(data){ update_software_tree(data,pnodeid); });
      }
      else {
        add_software_fields(form_element);
      }
      return;
    }
    //save selected node for reference
    cdc.psa.nodeId = form_element.options[form_element.selectedIndex].value;
    cdc.psa.nodeId = cdc.psa.nodeId.substring(cdc.psa.nodeId.indexOf("nodeId=")+7);
    if (cdc.psa.nodeId.indexOf("nodeId")>=0) { // sending subsubcategory
    cdc.psa.nodeId = cdc.psa.nodeId.substring(cdc.psa.nodeId.indexOf("nodeId=")+7);
    }
    cdc.psa.software_flag = form_element.options[form_element.selectedIndex].className.indexOf("Y")>=0?"true":"false";
  }
  //need a service call to retrieve new data and construct dropdown
  url += (cdc.psa.nodeId + "/");  // {mdf_id}
  if(form_element === null) {
    cdc.psa.software_flag = "false";
    url += "false/";
  }
  else {
    url += (cdc.psa.software_flag=="true")?"true/":"";
  }
  url += levels+"?locale=" + psa_languagecode + "&callback=?";
  var currentnode = cdc.psa.nodeId;
  if (cdc.psa.software_flag=="true") {
    jQuery.getJSON(url,function(data){ update_addsoftware(data,currentnode); });
  }
  else {
    jQuery.getJSON(url,function(data){ update_adddevice(data,currentnode);});
  }
}

function update_software_tree(response,callnodeid) {
  if (callnodeid != cdc.psa.nodeId) { return; }
  cdc.psa.response = response;
  // find currently selected element
  var selArray = document.getElementById("ad-form").getElementsByTagName("SELECT");     
  var sel = selArray[selArray.length-1];
  add_software_fields(sel);
}

function update_addsoftware(response,callnodeid) {
  //alert("update_addsoftware called on node: "+callnodeid);
  if(callnodeid != cdc.psa.nodeId) {return;}
  enable_selects();
  cdc.psa.response = response;
  str = '<div><span><label for="software_component">'+cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SOFTWARETYPE+':</label></span></div>';
  // create a select field
  str += '<span><select id="software_component" name="category" onchange="rollback_adddevice(this);add_software_fields(this)">';
  str += '<option value="">'+cdc.local.wpx.PSA_ADDDEVICE_DEFAULT_SELECTION+'</option>';
  cdc.psa.adddevice_level++;
  var list = response.Add_Device_Response.software_list;
  for(var i=0;i<list.length;i++) {
    str += '<option value="level='+cdc.psa.adddevice_level+'@metaclass=software_name'+'@nodeId='+list[i].software_name+'">'+list[i].software_name+'</option>';
  }
  str += "</select></span>";
  // add the new field to the form
  var separator = document.getElementById("adddevice_separator");
  var field = document.createElement("FIELDSET");
  field.innerHTML=str;
  cdc.psa.current_addfield = "ad_software";
  document.getElementById("ad-form").insertBefore(field,separator);
  //field.childNodes[1].focus();
}

function add_software_fields(elem) {
  enable_selects();
  //check to be sure the user hasn't selected an invalid option
  var sels = document.getElementById("ad-form").getElementsByTagName("SELECT");
  if(sels[sels.length-1].selectedIndex === 0) {return;}
  var sw = cdc.psa.response.Add_Device_Response.software_list[elem.selectedIndex-1];
  if(sw.software_type == "IOS") {
    var str = '<div><span><label for="sw1">'+cdc.local.wpx.PSA_ADDDEVICE_CAPTION_RELEASEVERSION+':</label></span></div>';
    str += '<span><select name="category" id="sw1" onchange="rollback_software_version(this); next_version(this)">';
    str += '<option value="">   </option>';
    cdc.psa.adddevice_level++;
    for(var i=0;i<sw.versions.length;i++) {
      str += '<option value="level='+cdc.psa.adddevice_level+'@metaclass='+sw.swt_metaclass+'@nodeId='+sw.versions[i]+'">'+sw.versions[i]+'</option>';
    }
    str += "</select>";
    str += '<b>(</b><select disabled="true" name="category" title="'+cdc.local.wpx.PSA_ADDDEVICE_CAPTION_RELEASEVERSION+' 2"  id="sw2" onchange="rollback_software_version(this); next_version(this)">';
    str += '<option value="">   </option>';
    str += "</select><b>)</b>";
    str += '<select disabled="true" name="category" title="'+cdc.local.wpx.PSA_ADDDEVICE_CAPTION_RELEASEVERSION+' 3" id="sw3" onchange="next_version(this)">';
    str += '<option value="">   </option>';
    str += "</select></span>";
  }
  else {
    var str = '<div><span><label for="rv">'+cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SOFTWAREVERSION+':</label></span></div>';
    str += '<span><select name="category" id="rv" onchange="next_version(this)">';
    str += '<option value="">'+cdc.local.wpx.PSA_ADDDEVICE_DEFAULT_SELECTION+'</option>';
    cdc.psa.adddevice_level++;
    for(var i=0;i<sw.versions.length;i++) {
      str += '<option value="level='+cdc.psa.adddevice_level+'@metaclass='+sw.swt_metaclass+'@nodeId='+sw.versions[i]+'">'+sw.versions[i]+'</option>';
    }
    str += "</select></span>";
  }
  // add the new field to the form
  var separator = document.getElementById("adddevice_separator");
  var field = document.createElement("FIELDSET");
  field.innerHTML=str;
  cdc.psa.current_addfield = "ad_software";
  document.getElementById("ad-form").insertBefore(field,separator);
}

/*
Clear out appropriate software version dropdowns 
and reset the level counter.
*/
function rollback_software_version(elem) {
  disable_submit();
  var first_option = elem.getElementsByTagName("OPTION")[1].value;
  var level = first_option.split("@")[0].substring(6);
  cdc.psa.adddevice_level = level;
  jQuery("#sw3").empty();
  jQuery("#sw3").append('<option value="">   </option>');
  jQuery("#sw3").attr("disabled","true");
  if(elem.id == "sw1") {
    jQuery("#sw2").empty();
    jQuery("#sw2").append('<option value="">   </option>');
    jQuery("#sw2").attr("disabled","true");
  }
  if (elem.id == "rv") {
    jQuery("#rv").parent().parent().next("input").remove();
  }
  else {
    jQuery("#sw1").parent().parent().next("input").remove();  
  }
  if (elem.selectedIndex === 0) {
    return;
  }
  else {
  	disable_selects();
  }
}

/*
Onchange handler for three Release Version dropdowns or one Software Version dropdown
for Release Version:
 For first two dropdowns, make an ajax call to populate the next dropdown
 For third dropdown, capture new metaclass param and enable submit.
For Software Version:
 Catpure new metaclass param and enable submit.
*/
function next_version(elem) {
  //check to be sure the user hasn't selected an invalid option
  if(elem.selectedIndex === 0) {return;}
  var url=cdc.psa.adddevice_service_host+cdc.psa.adddevice_service_prefix+'/release/';
  url += cdc.psa.nodeId;  // {mdf_id} 
  // software dropdowns are represented two different says
  var sc = document.getElementById("software_component");
  if(sc === null || sc === "") {
    sc = document.getElementById("software_group").parentNode;
  }
  var sc_value = sc.options[sc.selectedIndex].value;
  url += '/' + sc_value.substring(sc_value.indexOf("nodeId")+7);
  //append versions to url
  if(elem.id=="rv") {
    var rv = document.getElementById("rv");
    var rv_value = rv.options[rv.selectedIndex].text;
    url += '/' + rv_value + '/0/0';
  }
  else {
    var sw1 = document.getElementById("sw1");
    var sw1_value = sw1.options[sw1.selectedIndex].value;
    url += '/' + sw1_value.substring(sw1_value.indexOf("nodeId")+7);
  }
  if(elem.id =="sw2" || elem.id=="sw3") {
    var sw2 = document.getElementById("sw2");
    var sw2_value = sw2.options[sw2.selectedIndex].value;
    url += '/' + sw2_value.substring(sw2_value.indexOf("nodeId")+7);
  }
  if(elem.id=="sw3") {
    var sw3_value = elem.options[elem.selectedIndex].text;
    url += '/'+sw3_value;
  }
  url += "?locale=" + psa_languagecode + "&callback=?";
  var currentnode = cdc.psa.nodeId;
  // also want to pass in the values from:
  // cdc.psa.swtype
  // cdc.psa.swversion1
  // cdc.psa.swversion2
  // cdc.psa.swversion3
  // create a params object that contains all of this
  if(elem.id=="sw3" || elem.id=="rv") {
    jQuery.getJSON(url,function(data){add_software_metaclass(data,currentnode);});  
  }
  else {
    jQuery.getJSON(url,function(data){update_softwareversion(data,currentnode);});
  }
}

/*
Only called when there are multiple software version dropdown (i.e. software is IOS)
Creates the next software version dropdown.
*/
function update_softwareversion(response,callnodeid) {
  if (callnodeid != cdc.psa.nodeId) {return;}
  enable_selects();
  var next_select = null;
  if(response.Release_components_Response.swt_metaclass == "Maintenance_Version") {
    next_select = document.getElementById("sw2");
  }
  else {
    next_select = document.getElementById("sw3");
  }
  next_select.disabled = false;
  var opt = null;
  if(response.Release_components_Response.versions.length === 0) {
    opt = document.createElement("OPTION");
    opt.value="";
    next_select.name = "ignore";
    next_select.appendChild(opt);    
    opt.text = "M";
  }
  else {
    cdc.psa.adddevice_level++;
    for(var i = 0; i<response.Release_components_Response.versions.length; i++) {
      opt = document.createElement("OPTION");
      opt.value = "level="+cdc.psa.adddevice_level+"@metaclass="+ response.Release_components_Response.swt_metaclass +"@nodeId="+response.Release_components_Response.versions[i];
      next_select.appendChild(opt);    
      opt.text = response.Release_components_Response.versions[i];
    }
  }
}

/*
Creates a hidden input to save the mdf concept for IOS software and enables submit.
<input type="hidden" name="category" value=""/>
Watch out for cases where input element is already created. This should only occur if 
the user rechooses the Train Version (third release version dropdown).
*/
function add_software_metaclass(data,currentnode) {
  if (currentnode != cdc.psa.nodeId) {
  	return; 
  }
  var iosValue = "@metaclass=" + data.Release_components_Response.metaclass + "@nodeId=" + data.Release_components_Response.mdf_concept;
  var i = jQuery("#adddevice_separator").prev("input");
  if (i.length == 1) {
  //alert("I found an existing hidden param. Value: " +i.val()+"\nNew value: "+iosValue);
    iosValue = "level="+cdc.psa.adddevice_level+iosValue;
    i.val(iosValue);
  }
  else {
    var iosParam = document.createElement("input");
    iosParam.name = "category";
    iosParam.type = "hidden";
    cdc.psa.adddevice_level++;
    iosValue = "level="+cdc.psa.adddevice_level+iosValue;  
    iosParam.value = iosValue;
    document.getElementById("ad-form").insertBefore(iosParam,document.getElementById("adddevice_separator"));
  }
  enable_submit();
}

function enable_selects(){
  var sels = document.getElementById("ad-form").getElementsByTagName("SELECT");
  for (var i = 0; i<sels.length; i++){
    if (sels[i].id != "sw3"){
      sels[i].disabled = false;
    }
  }
}

function disable_selects() {
  var sels = document.getElementById("ad-form").getElementsByTagName("SELECT");
  //check to be sure the user hasn't selected an invalid option
  if(sels[sels.length-1].selectedIndex === 0) {return;}
  for(var i = 0; i<sels.length; i++) {
    if(sels[i].id != "sw2" && sels[i].id != "sw3") {
      sels[i].disabled = true;
    }
  }
}

function enable_submit(elem) {
  //make sure user did not select an invalid option
  if(elem.selectedIndex === 0) {
    disable_submit();
  }
  else {
    enable_submit();
  }
}

function enable_submit() {
  document.getElementById("adddevice_submit").disabled = false;
}

function disable_submit() {
  document.getElementById("adddevice_submit").disabled = true;
}

function update_adddevice(response,callnodeId) {
  //alert("calling update_adddevice for node: "+callnodeId);
  if (callnodeId != cdc.psa.nodeId) {return;}
  //cdc.debug.log("Entering update_adddevice callback. my level counter is: "+cdc.psa.adddevice_level);
  cdc.psa.response = response;
  if(psa_current_mode != "adddevice") {
    // user has chosen another box1 link 
    return;
  }
  if(typeof response.Add_Device_Response == "undefined") {
    alert("Service did not return valid response.");
    return;
  }
  if(response.Add_Device_Response.error_code == "errCode_appln_exception") {
    alert("Add Device Service is unavailable: "+ response.Add_Device_Response.error_code);
    return;
  }
  var ad_obj = document.getElementById("psa_adddevice");
  var separator = document.getElementById("adddevice_separator");
  var str = "";
  if(ad_obj.style.display != "block") {
    ad_obj.style.display = "block";
    document.getElementById("psbox2").style.display = "none";
    document.getElementById("psbox3").style.display = "none";
    crumbs = [];
    path=[];
    crumbs.push(cdc.local.wpx.PSA_SELECTIONS_ADDDEVICE);
    cdc.psa.displaycrumbs(crumbs);
    disable_submit();
  }
  enable_selects();
  // current fields
  var fields = document.getElementById("ad-form").getElementsByTagName("FIELDSET");
  var next_idx = fields.length;
  var metaclass = response.Add_Device_Response.children[0].metaclass;
  var i=0;
  if(next_idx > 0) {
    for(i=0; i<cdc.psa.adddevice_data.length; i++) {
      if(metaclass == cdc.psa.adddevice_data[i].metaclass) {
        break;
      }
    }
  }
  if(i>=cdc.psa.adddevice_data.length) {
    data_elem.id = "ad-unknown";
    data_elem.metaclass = metaclass;
    data_elem.caption = metaclass;
  }
  else {
    data_elem = cdc.psa.adddevice_data[i];
  }
  if(data_elem.id == "ad-category" && document.getElementById("ad-category") !== null) {
    return;
  }
  var topics = response.Add_Device_Response.children;
  var list = [];
  if(typeof response.Add_Device_Response.software_list != "undefined") {
    // we have a software list in with the MDF data
    list = response.Add_Device_Response.software_list;
  }
  cdc.psa.software_flag = "false";
  str = '<div><span><label for="'+ data_elem.id +'">'+psa_get_adddevice_label(response.Add_Device_Response.metaclass_list)+':</label></span></div>';
  // create a select field
  str += '<span><select name="category" id="'+data_elem.id+'" onchange="rollback_adddevice(this);next_adddevice(this)">';
  str += '<option value="">'+cdc.local.wpx.PSA_ADDDEVICE_DEFAULT_SELECTION+'</option>';
  cdc.psa.adddevice_level++;
  var processed_subsubcategory = false;
  //cdc.debug.log("my add device level counter is at: "+cdc.psa.adddevice_level);
  if(list.length > 0) {
    // find previous selected value
    var sel = document.getElementById("ad-form").getElementsByTagName("SELECT");
    var devname = "";
    var parentnodeid = "";
    if(sel.length > 0) {
      devname = sel[sel.length-1].options[sel[sel.length-1].selectedIndex].innerHTML;
      parentnodeid = sel[sel.length-1].options[sel[sel.length-1].selectedIndex].value;
      parentnodeid = parentnodeid.substring(parentnodeid.indexOf("nodeId=")+7);
    }
    str += '<optgroup id="software_group" label="'+ devname+" "+cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SOFTWARETYPE+ '">';
    var select_caption = "<label for=\""+data_elem.id+"\">"+devname+" "+cdc.local.wpx.PSA_ADDDEVICE_CAPTION_SOFTWARETYPE;
    for(var i=0; i<list.length; i++) {
      str += '<option value="level='+cdc.psa.adddevice_level+'@metaclass=software_name'+'@nodeId='+list[i].software_name+'" id="'+parentnodeid+'">'+list[i].software_name+'</option>';
    }
    str += '</optgroup>';
    str += '<optgroup label="'+psa_get_adddevice_label([topics[0].metaclass])+" "+cdc.local.wpx.PSA_ADDDEVICE_FOR_SOFTWARE_CAPTION+'">';
    select_caption += " "+cdc.local.wpx.PSA_ADDDEVICE_CAPTION_BRIDGE+" "+ psa_get_adddevice_label([topics[0].metaclass])+" "+cdc.local.wpx.PSA_ADDDEVICE_FOR_SOFTWARE_CAPTION+"</label>";
    str=str.replace(/^<div><span>.*:/,"<div><span>"+select_caption+":");
  }
  for(var i=0;i<topics.length;i++) {
    if((topics[i].metaclass == "Sub-Category") && (topics[i].children[0].metaclass == "Sub-SubCategory")) {
      str += '<optgroup label="'+topics[i].mdf_concept+'">';
    }
    else {
      str += '<option class="adddevice-software-'+ topics[i].leaf_node_flag+'" '+'value="level='+cdc.psa.adddevice_level+'@metaclass='+topics[i].metaclass+'@nodeId='+topics[i].mdf_id+'">'+topics[i].mdf_concept+'</option>';
    }
    if(topics[i].leaf_node_flag == "Y") {
      // cdc.psa.software_flag = "true";
    }
    if(topics[i].metaclass == "Sub-Category") {
      for(var j=0;j<topics[i].children.length;j++) {
        if(topics[i].children[j].metaclass == "Sub-SubCategory") {
          doublelevel = true;
          processed_subsubcategory = true;
          str += '<option class="adddevice-software-'+ topics[i].children[j].leaf_node_flag+'" '+'value="level='+cdc.psa.adddevice_level+'@metaclass='+topics[i].metaclass+'@nodeId='+topics[i].mdf_id+'~level='+(cdc.psa.adddevice_level+1)+'@metaclass='+topics[i].children[j].metaclass+'@nodeId='+topics[i].children[j].mdf_id+'">&nbsp;&nbsp;'+topics[i].children[j].mdf_concept+'</option>';
          if(topics[i].children[j].leaf_node_flag == "Y") {
            cdc.psa.software_flag = "true";
          }           
        }
      }
      if(processed_subsubcategory === true) {
        str += '</optgroup>';
      }
    }
  }
  if(list.length > 0) {
    str += '</optgroup>';
  }
  str += '</select></span>';
  if(processed_subsubcategory === true) {
    cdc.psa.adddevice_level++;
    //cdc.debug.log("i am upping the level. now at: "+cdc.psa.adddevice_level);
  }
  // add the new field to the form
  var field = document.createElement("FIELDSET");
  field.innerHTML=str;
  cdc.psa.current_addfield = data_elem.id;
  document.getElementById("ad-form").insertBefore(field,separator);
  //field.childNodes[1].focus();
  //cdc.debug.log("Exiting update_adddevice callback. Level counter is at: "+cdc.psa.adddevice_level);
}

function getQueryString(key, default_)
{
  if (default_==null) default_="";
  key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
  var qs = regex.exec(window.location.href);
  if(qs == null)
    return default_;
  else
    return qs[1];
} 

function psa_exit() {
  // just for breakpoint
  if(typeof console != "undefined" && typeof console.trace == "function") {
    console.trace();
    var i=0;
  }
  return true;
}

function psa_init() {
  switch (psa_current_mode){
    case "home":
      tree = null;
      break;
    case "tech":
      tree = technologies;
      break;
    case "prod":
      tree = products;
      break;
    case "mru":
      tree = mru;
      break;
    case "mydevice":
      tree = mydevices;
      break;
    case "eol":
      tree = eoseol;
      break;
    case "adddevice":
      tree = null;
      break;
  }
  if ((typeof cdc.psa.adddevice_service_host == "undefined") || (cdc.psa.adddevice_service_host == "null")) {
    cdc.psa.adddevice_service_host = "http://tools-dev.cisco.com";
  }
  if ((typeof cdc.psa.adddevice_service_prefix == "undefined") || (cdc.psa.adddevice_service_prefix == "null")) {
    cdc.psa.adddevice_service_prefix = "/support/cwsx/prodsel/pub/adddeviceservice";
  }
  //window.onunload = psa_exit;
  
  cdc.psa.displaynode(null);
  cdc.psa.process_deeplink();
  // cdc.psa.monitor = false;
  // if (typeof psa_init_monitor == "function"){
  // psa_init_monitor();
  // }
}

