/**
 *  product support application functions (for NGW)
 *  psa2.js
 *  $Revision: 1.5 $
 */

// 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 = new Object();
var subtree = new Object();

if (typeof(cdc) == "undefined"){
   var cdc = new Object();
   }

var crumbs = new Array();
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){
        var s = '<li class="pslink"><a href="' 
              + url + '" ' 
              + 'rel = "&task='
                    + psa_task_name + "&nodeId=" + idx
                    + "&type=" + type_name + '"'
              +' onclick="psa_setup_click(this);ntptEventTag();return cdc.mru.makeMruRequest(this)"' 
//              +' onclick="psa_setup_click(this);ntptEventTag();return false"' 
              +'>' + 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="';
            s += '">';
	    s += 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 = new Object();
       }
   if (typeof eoseol.children == "undefined"){
       var url = cdc.psa.service_host
               + cdc.psa.service_prefix
               + "hierarchy/eol/"
               + psa_task_name
               + "/0/"
               + psa_entitlement;
       url += "?callback=cdc.psa.get_eoseol_tree";
       url += "&"+cdc.psa.service_environment;

       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;
       cdc.psa.jsonp_request(url);
       }
   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 = new Array();

    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'>Uploaded Devices";
             }

          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);
               }
            }
          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("_");  
       if ((path.length == 1) && tree.children[path[0]].children.length==0){
          // first-level node, but children are not present
          var url = cdc.psa.service_host 
                  + cdc.psa.service_prefix 
                  + "hierarchy/";
          if (tree == products){
             url += "products";
             cdc.psa.loading_tree = "products";
          }else{
             url += "technologies";
             cdc.psa.loading_tree = "technologies";
             }
          url += "/"+psa_task_name+"/0/"+psa_entitlement+"/"
                + tree.children[path[0]].nodeId
                + "?callback=cdc.psa.loadsubtree";
          url += "&"+cdc.psa.service_environment;

//          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' />";
          cdc.psa.jsonp_request(url);
          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");
       }
    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");
          }
       }    
       //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":"";
       }

     // 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;i<lis.length;i++){
       lis[i].className = (lis[i].innerHTML.indexOf(cdc.local.wpx.PSA_SELECTIONS_ADDDEVICE)>=0)?"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?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+"?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 += "?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();
//      }
   }

   
