/*------------------------------------------------------------------------------
 * Copyright © 2006 ShareBuilder Securities Corporation.  All Rights Reserved.
 *
 * common.js
 * ShareBuilder Sbweb Common Script Library
 *
 *----------------------------------------------------------------------------*/

function ensureNamespace(ns)
{
	var ns2 = ns.split('.');
	var ns1 = ns2[0];
	if(ns1 != 'SbWeb')
		return null;
	
	var thisns = SbWeb;
	for(var i=1;i<ns.length;i++)
	{
		ns1 = ns2[i];
		if(typeof thisns[ns1] == "undefined" || thisns[ns1] == null)
			thisns[ns1] = {};
		thisns = thisns[ns1];
	}	
	return thisns;
}

if(typeof SbWeb == "undefined" || SbWeb==null)
	SbWeb = {};

if(typeof SbWeb.SbFunctions == "undefined" || SbWeb.SbFunctions==null)
	SbFunctions = new SbFunctions();

SbWeb.Functions = SbFunctions;

function SbFunctions()
{
	this.GetElementById = GetElementById;
	function GetElementById(id)
	{
		var obj;
		
		obj = document.getElementById(id);
		
		return obj;
	}
	
	this.getElementPosition = function(elem)
	{
		var offsetTrail = elem;
		var offsetLeft = 0;
		var offsetTop = 0;
		
		while (offsetTrail) {
			offsetLeft += offsetTrail.offsetLeft;
			offsetTop += offsetTrail.offsetTop;
			offsetTrail = offsetTrail.offsetParent;
		}
		
		if (navigator.userAgent.indexOf("Mac") != -1 && 
			typeof document.body.leftMargin != "undefined") {
			offsetLeft += document.body.leftMargin;
			offsetTop += document.body.topMargin;
		}
		return {left:offsetLeft, top:offsetTop};
	}
}

function JsLink()
{
    var href;
    this.href = href;
}

var IsIE = (navigator.userAgent.toString().toLowerCase().indexOf("msie") >=0) ? true : false;
  
  function AddEventHandler(obj,eventName, eventHandler)
  {
    if (IsIE) {
        obj.attachEvent(eventName,eventHandler);
    } else {
        obj.addEventListener(eventName.replace("on",""),eventHandler,false);
      } 
   }
  
   function RemoveEventHandler(obj,eventName, eventHandler)
  {
    if (IsIE) {
        obj.detachEvent(eventName,eventHandler);
    } else {
        obj.removeEventListener(eventName.replace("on",""),eventHandler,false);
      } 
   } 

function Print()
{
    window.print();
}

function FocusControl()
{
    var targetControl  = document.getElementById(controlToFocus);
    if(targetControl != null)
    {
        AttemptFocus(targetControl);
    }
}

var FocusAttemptObj;
var FocusAttempt = 0;
function AttemptFocus(obj)
{
    if (typeof(obj) == "object")
   {
       FocusAttemptObj = obj; 


        //try/catch necessary to handle cases where the element to receive focus is hidden, 
       //but another onload eventhandler to show the element has not fired yet, which in IE will throw exception
       //Retry 2x at .5 second intervals
       try { 
            obj.focus();
       } catch (ex) {
            if (FocusAttempt < 3)
            {
                window.setTimeout("AttemptFocus(FocusAttemptObj);",500);
                FocusAttempt++;  
            } 
       } 
  
    }  
}

function ShowOrHideItem(showIt, destination)
{
   
   if(typeof(destination) != "object")//if ID passed instead of object
        destination = document.getElementById(destination);  
        
    if(destination != null)
    {
        if(showIt)
            destination.className = "";
        else
            destination.className = "Hidden";
    }
}

function ToggleItemDisplayLink(source, itemName)
{
   if(typeof(source) != "object")//if ID passed instead of object
        source = document.getElementById(source);    
   
    var item = document.getElementById(itemName);
    if(item != null)
    {
        if(item.style.display == "" || item.style.display == "none")
        {
            item.className = "";
            source.className = "LinkExpand";
        }
        else
        {
            item.className = "Hidden";
            source.className = "LinkContract";
        }
    }
}

function ToggleItemDisplayCheckbox(source, destination)
{
     
     if(typeof(source) != "object")//if ID passed instead of object
        source = document.getElementById(source);    
      
     if(typeof(destination) != "object")//if ID passed instead of object
        destination = document.getElementById(destination);     
       
    var checked = source.checked;
    if(destination != null && checked != null)
    {
        if(checked)
            destination.className = "";
        else
            destination.className = "Hidden";
    }
}

function ToggleItemDisplayYesNoRadio(source, itemName)
{
    var group = new Array();

    //find the group that the item belongs to
    for(i=0; i< document.forms[0].elements.length ; i++)
    {
        if(document.forms[0].elements[i].name == source.name)
        {
        group.push(document.forms[0].elements[i]);
        }
    }
    
    for(i=0; i< group.length ; i++)
    {
        if(group[i].checked)
            HighlightSelectedItem(group[i],true);
        else
            HighlightSelectedItem(group[i],false);
    }
}

function HighlightSelectedItemInGroup(item)
{
    var group = FindRadioGroupByName(item.name);
    
    for(i=0; i< group.length ; i++)
    {
        if(group[i].checked)
            HighlightSelectedItem(group[i],true);
        else
            HighlightSelectedItem(group[i],false);
    }
}

function FindRadioGroupByName(groupName)
{
    var group = new Array();

    //find the group that the item belongs to
    for(i=0; i< document.forms[0].elements.length ; i++)
    {
        if(document.forms[0].elements[i].name == groupName)
        {
        group.push(document.forms[0].elements[i]);
        }
    }
    
    return group;
}

function HighlightSelectedItem(radioItem, selected)
{
    if(radioItem != null)
    {
        var item = document.getElementById(radioItem.id+"Select");
        if(selected)
        {
            item.className = "AccountTypeSelectionItem AccountTypeItemSelected";
        }
        else
        {
            item.className = "AccountTypeSelectionItem AccountTypeItemNotSelected";
        }
    }
}

function GetDropDownItemList(keyName)
{
    switch(keyName.toLowerCase())
    {
        case 'employmentstatus':
            var array = new Array();
            array.push("0");
            array.push("1");
            return array;
        case 'stateofrecord':
            var array = new Array();
            array.push('AA');
            array.push('AE');
            array.push('AP');
            return array;
    }
}

function ToggleItemDisplayDropDownList(source, destination, trueValues)
{
    var found = false;
    
     if(typeof(source) != "object")//if ID passed instead of object
        source = document.getElementById(source);    
      
     if(typeof(destination) != "object")//if ID passed instead of object
        destination = document.getElementById(destination);   
        
    if( source != null && destination !=  null && trueValues != null)
    {
        for(i = 0; i< trueValues.length; i++)
        {
            if(source.value.toUpperCase() == trueValues[i].toUpperCase())
            {
                found = true;
                break;
            }
        }
        
        if(found)
            destination.className = "";
        else
            destination.className = "Hidden";
    }
}

function ChangeListItems(itemList, itemsToShow)
{
	var ulItems = document.getElementById(itemList);
	if(ulItems == null) return;
	
	for(i=0; i< ulItems.getElementsByTagName('LI').length; i++)
{
		var liItem = ulItems.getElementsByTagName('LI')[i];

		if(liItem.tagName == "LI")
    {
			var hide = true;
			
			for(j=0; j<itemsToShow.length; j++)
				if(i == itemsToShow[j]) hide = false;
			
			if(hide)
				liItem.className = "Hidden";
			else
				liItem.className = "";
		}
    }
}

function ToggleListItemDisplay(prefixName, showList)
{
    for(i=0; i< showList.length ; i++)
    {
        var item = document.getElementById(prefixName+showlist[i]);
        item.className = "";
        item.style.color = "Red";
    }
}


function ShowItemInGroup(containerID, selectedIndex) {
     var container = document.getElementById(containerID);
     if (container != undefined) {
       container = removeSimpleNodes(container);
        
        for (var i=0;i<container.childNodes.length;i++) {
            container.childNodes[i].style.display = (i == selectedIndex) ? "block" : "none";
       } 
     }
}

function removeSimpleNodes(nodeSet) {
    for (var i=0;i<nodeSet.childNodes.length;i++) {
        if (nodeSet.childNodes[i].nodeType != 1) //1 = complexNode
             nodeSet.removeChild(nodeSet.childNodes[i]);
    }  
  return nodeSet;  
}

function SetElementVisibility(element, visible)
{
	var cn = element.className;
	if(cn || cn.length==0)
	{
		var alreadyHidden = cn.indexOf(' Hidden')>=0;
		var cn2 = cn;
		if(visible && alreadyHidden)
			cn2=cn2.replace(' Hidden','');
		else if(!(visible || alreadyHidden))
			cn2+= ' Hidden';
		if(cn2!=cn)
			element.className = cn2;
	}
	else element.className = visible ? '':'Hidden'; 
}

function SetChecked(objID,isChecked)
{
    var obj = document.getElementById(objID);
   if (obj.checked != undefined)
    {
        obj.checked = isChecked;
    }  
}

function DisableTextBoxOnCheck(checkObj,inputObjID)
{
   if (checkObj.checked != undefined)
   {
        var inputObj = document.getElementById(inputObjID);
        if (checkObj.checked) 
        { 
            //Disable: if checked, field cannot be edited  
            inputObj.className = inputObj.className.toString() + " Disabled";
            inputObj.disabled = true;
        } 
       else
        {
            inputObj.className = inputObj.className.toString().replace(" Disabled","");
            inputObj.disabled = false;
        }
   }
}

function DisableAndClearOnCheck(checkObj,inputObjID,strDisabledStatusMessage,boolClear)
{
    if (checkObj.checked != undefined)
   {
        var inputObj = document.getElementById(inputObjID);
        if (checkObj.checked) { 
            //Disable: if checked, field cannot be edited  
            inputObj.className = inputObj.className.toString() + " Disabled";
            if (boolClear) inputObj.value = "";//Clear
            inputObj.title = strDisabledStatusMessage;
            AddEventHandler(inputObj,"onfocus",DisableChange);
            AddEventHandler(inputObj,"onblur",EnableChange);
       } else {
             inputObj.className = inputObj.className.toString().replace(" Disabled","");
            inputObj.title = "";
            inputObj.disabled = false;
            
            RemoveEventHandler(inputObj,"onfocus",DisableChange);
            RemoveEventHandler(inputObj,"onblur",EnableChange);
       }
   }  
}

function DisableOnCheck(checkObj,inputObjID,strDisabledStatusMessage)
{
  DisableAndClearOnCheck(checkObj,inputObjID,strDisabledStatusMessage,false);
}

function ToggleTextOnCheck(checkObj,inputObjID,strCheckedText, strNotCheckedText)
{
    var textObj = (typeof(inputObjID) == "object") ? inputObjID : document.getElementById(inputObjID); 
    if (textObj != undefined)
   {
       var strToAssign = (checkObj.checked) ? strCheckedText : strNotCheckedText;  
       switch (textObj.nodeName.toLowerCase())
       {
            case "input":
                textObj.value = strToAssign;
            break;
            default:
                if (textObj.innerHTML != undefined)
                    textObj.innerHTML = strToAssign;
            break;
       } 
    }  
 }

function GetEventSourceObject(e)
{
  var obj;
  if (IsIE) {
    obj = window.event.srcElement;
  } else {
      obj = e.target;
      while(obj.nodeType == 3)
	    obj = obj.parentNode;
  }
   return obj;
}

function GetInnerText(e)
{
    if(IsIE)
        return e.innerText;
    else if(e.textContent != undefined)
		return e.textContent;
    else if(e.nodeType == 3)
        return e.nodeValue;
    else
    {
        var s = "";
        for(var i=0;i<e.childNodes.length;i++)
            s += GetInnerText(e.childNodes[i]);
        return s;
    }
}

function TrimEnd(text)
{
    if(text)
    {
        var i=text.length;
        while(i>=0 && text.charAt(i)<=' ')
            i--;
        return text.substring(0,i);
    }
    return text;
}

function TrimStart(text)
{
    if(text)
    {
        var i=0;
        while(i<text.length && text.charAt(i)<=' ')
            i++;
        return text.substring(i,text.length);
    }
    return text;
}

function TrimText(text)
{
    if(text)
    {
        var i=0;
        while(i<text.length && text.charAt(i)<=' ')
            i++;
        var j=text.length;
        while(j>=i && text.charAt(j)<=' ')
            j--;
        return text.substring(i,j + 1);
    }
    return text;
}

function ChangeHref(a, href)
{
    if(IsIE)
        a.href = href;
    else
        a.setAttribute("href",href);
}

var EnableChange = function EnableChange(e)
{
    e = GetEventSourceObject(e);
    e.disabled = false;
}

var DisableChange = function DisableChange(e)
{
    e = GetEventSourceObject(e);
    e.disabled = true;
}


 function getElementByPartialId(strPartialID)
 {
     var returnElement;
     var divs = getElementByPartialIdByTagName(strPartialID,"div");
     var spans = getElementByPartialIdByTagName(strPartialID,"span");
     var selects = getElementByPartialIdByTagName(strPartialID,"select");
     var inputs = getElementByPartialIdByTagName(strPartialID,"input");
     var labels = getElementByPartialIdByTagName(strPartialID,"label");
     
     var arrayTags = new Array();
     arrayTags.push(divs);
     arrayTags.push(spans);
     arrayTags.push(selects);
     arrayTags.push(inputs);
     arrayTags.push(labels);
     
     for (var i=0;i<arrayTags.length;i++)
     {
        if (arrayTags[i] != undefined)
        {
            returnElement = arrayTags[i];
            break;
        }  
     }
     
     return returnElement;
 }
  
  function getElementByPartialIdByTagName(strPartialID, tagName)
  {
        var inputs = document.getElementsByTagName(tagName);
        var returnInput; 
       
       for (var i=0;i<inputs.length;i++)
       {
            if (inputs[i].id != undefined)
            {
                if (inputs[i].id.toString().indexOf(strPartialID) >= 0)
               {
                    returnInput = inputs[i];
                    break;
               } 
            }
       } 
       
       return returnInput;
  }

// -- FormRow functions --

//Gets the div containing the form row and its label; useful for
//toggling visibility (see SetFormRowContainerVisiblity)
function GetFormRowContainer(formRow)
{
    return formRow.parentElement.parentElement;
}

//Gets the form row from the form row container
function GetFormRowFromContainer(formRowContainer)
{
    return formRowContainer.children[1].children[0];
}

//Gets the div containing the form row and its label and
//sets its visibility
function SetFormRowContainerVisibility(formRow, visible)
{
	SetElementVisibility(GetFormRowContainer(formRow),visible);
}

//Controls display of UI elements for Secondary Investor Setup
var SecondaryInvestorView = new SecondaryInvestorView();
function SecondaryInvestorView()
{
   var isExistingUser = false;
   var grpUserUIElements = "SecondaryInvestorView.existingUserUIElements,SecondaryInvestorView.notExistingUserUIElements";
   
   this.existingUserUIElements = "divExistingUsercredential"; 
   this.notExistingUserUIElements = "divNotExistingUsercredential,divName,divExistingPassword";//,divDob
   this.IsExistingUser = IsExistingUser;
   
  function IsExistingUser(value)
  {
       if (value != undefined)
            isExistingUser = value;
       
       ExistingUserChanged();
            
       return isExistingUser;
  }
  
  function ExistingUserChanged()
  {
       //update hidden input that interfaces with ascx class
       var inputContainer = document.getElementById("divIsExistingUserContainer");
       if (inputContainer != undefined) {
           var input = inputContainer.childNodes[0];
           input.value = isExistingUser;
           
            //show/hide UI elements 
            if (isExistingUser) {
                ShowGroup(grpUserUIElements,0);
           } else {
                ShowGroup(grpUserUIElements,1);
           }
       }
   }
  
  function ShowGroup(ViewSetIDs,indexToBeShown) {
         
        var groupArray = ViewSetIDs.split(",");
        for (var i=0;i<groupArray.length;i++) {
            if (i == indexToBeShown) 
                ToggleDisplay(eval(groupArray[i]), true);
            else
                ToggleDisplay(eval(groupArray[i]), false);
            
        } 
    }    
   
    function ToggleDisplay(elementIDList,boolShow) {
          if (elementIDList != undefined) {
            var elemArray = elementIDList.split(",");
            var elem;
            for (var i=0;i<elemArray.length;i++) {
                 elem = document.getElementById(elemArray[i]);
                 if (elem != undefined)
                    elem.style.display = (boolShow) ? "block" : "none";
            }
       } 
    }         
     
 }

  

//class designed to handle client side state changes, such as showing/hiding of UI elements 
var ClientViewManager = new ClientViewManager();
    AddEventHandler(window,"onload",ClientViewManager.RestoreViewState);
    
  function ClientViewManager() 
  {
    var ViewSet = new Array();
    var ViewTrigger = new Array(); 
    var ViewSetState = new Array();  
   
     this.RestoreViewState = RestoreViewState;
     this.RestoreViewsByTrigger = RestoreViewsByTrigger;
     this.RestoreViewsOnClick = RestoreViewsOnClick;  
     this.ChangeView = ChangeView; 
    
    function ChangeView(ViewSetID, ViewIDToShow) {
           var group = ViewSet[IndexOfKey(ViewSet, ViewSetID)];
          if (group != undefined)
          { 
               var switchGroup =  group[1].toString().split(",");
               
               var members;
                for (var i=0;i<switchGroup.length;i++)
               {
                    members = GetGroupMembers(switchGroup[i]);
                    if (switchGroup[i] == ViewIDToShow)
                    {
                        SetDisplayForGroup(members,"inline");
                    } else  { 
                        SetDisplayForGroup(members,"none");
                     } 
                        
               }
            SaveViewState(ViewSetID, ViewIDToShow);
       } else {
            if (ViewIDToShow == "") {
                //case: only 1 view in viewset, the empty ViewID to show signifies hiding defined view
                var hideMembers = GetGroupMembers(ViewSetID);
                SetDisplayForGroup(hideMembers,"none");
            } 
       }
    } 
   
    function IsViewHidden(ViewSetID, ViewID)
    {
       var isViewHidden = false;
        var group = ViewSet[IndexOfKey(ViewSet, ViewSetID)];
          if (group != undefined)
          { 
               var switchGroup =  group[1].toString().split(",");
               
               var members;
                for (var i=0;i<switchGroup.length;i++)
               {
                    members = GetGroupMembers(switchGroup[i]);
                    if (IsAnyMemberHidden(members))
                    {
                        isViewHidden = true;
                        break; 
                    } 
               }
           }
          return  isViewHidden;
    }     
   
    function IsAnyMemberHidden(nodeList)
    {
       var isHidden = false; 
        for (var i=0;i<nodeList.length;i++)
        {
            if (IsMemberOfSpecificClass(nodeList[i],"Hidden"))
            {
                isHidden=true;
                break; 
            }
        }  
       return isHidden;
    }   
    
   
   function RestoreViewState()
   {
     GetViewSets(); 
     RestoreViewsByTrigger();
     RestoreTriggerActions();
   }
  
  function GetViewSets()
  {
       var sets = GetGroupMembers("ViewSet");
       var ViewSetID, ViewID;
       for (var i=0;i<sets.length;i++)
       {
            ViewSetID = GetViewIDFromClassName(sets[i].className,"ViewSet");
            ViewID = GetViewIDFromClassName(sets[i].className,"ViewTrigger");
            if (ViewID != undefined) {
                var OnSelectIndex = ViewID.indexOf("OnSelectValue");
                if (OnSelectIndex >= 0) {
                    ViewID = ViewID.substring(0,OnSelectIndex);
                 } 
            }  else {
                ViewID = GetViewIDFromClassName(sets[i].className,"View");     
            }
            
            if (ViewID != undefined) 
            {
            
                if (IndexOfKey(ViewSet,"ViewSet" +ViewSetID) == undefined) {
                    ViewSet.push(new Array("ViewSet" +ViewSetID,"View"+ViewID));
                     
                } else {
                    if (!IsDefinedView("View" + ViewID)) {
                      var currentViewSet = ViewSet[IndexOfKey(ViewSet,"ViewSet" +ViewSetID)]; 
                      var existingViews = new Array();
                      if (currentViewSet != undefined) {
                        existingViews.push(currentViewSet.pop());
                        existingViews.push("View"+ViewID);
                       
                        currentViewSet.push(existingViews);
                      } 
                      
                      }
                }
            }
       }
     }
  
  function RestoreViewsOnClick(e)
  {
     var eventObj = GetEventSourceObject(e);
     var ViewID = "View" + GetViewIDFromClassName(eventObj.className,"ViewTrigger");
     var viewSetID = GetSetID(ViewID);
        //toggle view
        if(IsViewHidden(viewSetID,ViewID)) 
        {
            ChangeView(GetSetID(ViewID),ViewID);
            
            if (IsMemberOfSpecificClass(eventObj,"ButtonExpand"))
                ReplaceClass(eventObj,"ButtonExpand","ButtonCollapse"); 
            
        } else {
            ChangeView(GetSetID(ViewID),""); 
             if (IsMemberOfSpecificClass(eventObj,"ButtonCollapse"))
                ReplaceClass(eventObj,"ButtonCollapse","ButtonExpand"); 
         } 
  }
  
  
  function RestoreViewsByTrigger()
  {
        ViewTrigger = GetGroupMembers("ViewTrigger");
        var childMembers = new Array();
       GetChildNodeMembers(ViewTrigger, GetSetID(ViewID),childMembers);
       
       if (childMembers.length > 0) {
              ViewTrigger = ViewTrigger.concat(childMembers);
        }
    
       var ViewID;
       for (var i=0;i<ViewTrigger.length;i++) 
       {
            ViewID = "View" + ViewTrigger[i].className;
            switch (ViewTrigger[i].nodeName.toString().toLowerCase())
            {
               case "input":
                        if (ViewTrigger[i].checked) {
                            ChangeView(GetSetID(ViewID),ViewID);
                        } else {
                           var group = ViewSet[IndexOfKey(ViewSet, GetSetID(ViewID))];
                           if (group.length >= 2)
                           { 
                                var views = group[1];//[0] is the ViewSet array, Views are contained in the next array 
                                if (typeof(group[1]) == "string")
                                    views = group[1].split(",");
                                
                                //if there are no other views in the set, assume this view should be hidden 
                                if (views.length < 2)
                                {
                                    ChangeView(GetSetID(ViewID),"");
                                } else {
                                   //show next view in viewSet 
                                    if (ViewTrigger[i].type == "checkbox")
                                        ChangeView(GetSetID(ViewID),group[1][1]);
                                        
                                }
                            }
                        }  
                break;
                case "select":
                    ApplySelectConditions(ViewTrigger[i], ViewID);
                break;   
            }
            
       }
  }
  
  function ApplySelectConditions(select, ViewID)
  {
       var strCondition;
       var conditions = select.className.toString().split("Equals");
       var OnSelectValueIndex = ViewID.indexOf("OnSelectValue");
       var ParsedViewID = ViewID.substring(0,OnSelectValueIndex);
       var conditionValue;
       var conditionMet = false;
       for (var i=0;i<conditions.length;i++) 
       {
            conditionValue = conditions[i].replace("Or","");
            if (select.options[select.selectedIndex].value == conditionValue)
            {
                conditionMet = true; 
                ChangeView(GetSetID(ParsedViewID),ParsedViewID);
                break; 
            }
       }
       if (!conditionMet) ChangeView(GetSetID(ParsedViewID),"");
  }
  
  function RestoreTriggerActions()
  {
        for (var i=0;i<ViewTrigger.length;i++)
       {
            ViewID = GetViewIDFromClassName(ViewTrigger[i].className,"ViewTrigger");
            switch(ViewTrigger[i].nodeName.toString().toLowerCase())
            {
                case "a":
                case "span": 
                    if (ViewTrigger[i].disabled == false)//must explicity not attach event handler in IE if element is disabled
                        AddEventHandler(ViewTrigger[i],"onclick",ClientViewManager.RestoreViewsOnClick);
                break; 
               case "input": 
                    if (ViewTrigger[i].disabled == false)//must explicity not attach event handler in IE if element is disabled
                        AddEventHandler(ViewTrigger[i],"onclick",ClientViewManager.RestoreViewsByTrigger);
               break;
               case "select": 
                    AddEventHandler(ViewTrigger[i],"onchange",ClientViewManager.RestoreViewsByTrigger);
               break;  
            }
       } 
  }
  
  function ParseID(id)
  {
    var idArray = id.toString().split("_");
    return idArray.pop();
  }
  
  function GetViewIDFromClassName(className, prefix)
  {
   var ViewID, prefixIndex; 
    var classNameArray = className.toString().split(" ");
    for (var i=0;i<classNameArray.length;i++)
    {
       prefixIndex = classNameArray[i].toString().indexOf(prefix); 
        if (prefixIndex >=0) 
             ViewID = classNameArray[i].toString().replace(prefix,"");
    }  
   
    return ViewID;    
  }
  
  function RestoreView (ViewID)
  {
     SetID = GetSetID(ViewID);
     ChangeView(SetID,ViewID); 
     RestoreInputElements(ViewID);
  }
  
  function RestoreInputElements(ViewID)
  {
    
      var ViewTriggerID = "ViewTrigger" + ViewID.replace("View","");
      var members = GetGroupMembers(ViewTriggerID);
      var childMembers = new Array();
       GetChildNodeMembers(members, GetSetID(ViewID),childMembers);
       if (childMembers.length > 0)
              members = members.concat(childMembers);
             
     
      var input;
      for (var i=0;i<members.length;i++)
     {
       if (members[i].nodeName.toString().toLowerCase() == "input")
       {
            input = members[i];
            if (input.type == "radio" | input.type == "checkbox")
            {
                input.checked = true;
            }
       } 
     } 
  }
  
  //ASP.NET may assign the key className to a parent element (e.g. <span>) 
  //of the actual target element (e.g.  <input>), so must check for ChildNodes that
  //may be the actual Trigger or View member
  function GetChildNodeMembers(arrayMembers, ViewSetID, refArray)
  {
     for (var i=0;i<arrayMembers.length;i++)
     {
        if (arrayMembers[i].childNodes != undefined)
       {
            GetChildInputs(arrayMembers[i], refArray);
       } 
     }
  }

  function GetChildInputs(inputArray, refArray)
  {
   
    for (var i=0;i<inputArray.childNodes.length;i++)
    {
       
        var className = GetViewIDFromClassName(inputArray.className,"ViewTrigger");
        if (inputArray.childNodes[i].nodeName != undefined)
          
            switch (inputArray.childNodes[i].nodeName.toString().toLowerCase()) {
                    
                     case "input":
                     case "select": 
                            inputArray.childNodes[i].className = className;
                         refArray.push(inputArray.childNodes[i]);
                    break;
                    
         }
    }
    
  }
  
  function GetSetID(ViewID) 
  {
   var SetID; 
    var views;
    for (var i=0;i<ViewSet.length;i++)
    {
       
       if (ViewSet[i].toString().indexOf(ViewID) >= 0)
       {
            SetID = ViewSet[i][0];
            break;
       } 
    }  
   
    return SetID;  
  }   
  
  function IsDefinedView(ViewID)
  {
    var IsDefined = false; 
   var FlatViewSet =  ViewSet.toString().split(",");
    for (var i=0;i<FlatViewSet.length;i++)
       {
            if (FlatViewSet[i] == ViewID) 
            {
                IsDefined = true;
               break; 
            }
       }
        return IsDefined;
  }
  
    function SaveViewState(ViewSetID, ViewID)
    {
        //currently "saved" through state of input objects, e.g. RadioButton Yes is checked, 
       //then RestoreViewsByTrigger() will show/hide dependent elements associated with the selected RadioButton
    }
     
     function GetInputByPartialID(strPartialID)
     {
        var inputs = document.getElementsByTagName("input");
       var returnInput; 
       
       for (var i=0;i<inputs.length;i++)
       {
            if (inputs[i].id != undefined)
            {
                if (inputs[i].id.toString().indexOf(strPartialID) >= 0)
               {
                    returnInput = inputs[i];
                    break;
               } 
            }
       } 
       
       return returnInput;
     }
   
  function GetOneViewPerViewSet(ViewSetID, ViewID)
  {
        var returnHash = currentHash = (location.hash);
            if(currentHash != "") {
                currentHash = currentHash.replace("#","");
                var hashArray =  currentHash.split(",");    
               
                var IsInSet = false;
                for (var i=0;i<hashArray.length;i++) 
                {
                    if (hashArray[i] != "") {
                        if (IsInSameViewSet(ViewSetID,hashArray[i])) 
                        {
                            IsInSet = true; 
                            hashArray.splice(i,1,ViewID);
                        }
                    }
                } 
               if (!IsInSet)  
                hashArray.push(ViewID);
                 returnHash =  "#" + hashArray.toString();
            }  else {
                returnHash = "#" + ViewID;
            }
       return returnHash; 
  }      
   
  
    function IsInSameViewSet(ViewSetID,ViewID)
   {
       var IsInSet = false;
       
       var group = ViewSet[IndexOfKey(ViewSet, ViewSetID)];
       if (group != undefined) {
           var flatArray = group.toString().split(",");
           for (var i=0;i<flatArray.length;i++)
           {
                if (flatArray[i] == ViewID) IsInSet = true;
           }
       }
       return IsInSet;
  }    
   
   
    function SetDisplayForGroup(arrayGroup, value)
   {
       var element; 
       var setStyleDisplay = true;
        for (var i=0;i<arrayGroup.length;i++)
       {
               element = arrayGroup[i];
               switch (element.nodeName.toString().toLowerCase())
               {
                    //the default visible state is inline, not block; certain elements, such as TR, need block by default
                    case "tr":
                        if (value == "inline") value = "block";
                    break;
                    case "li":
                      //setting style.display manually in Mozilla strips list-type-style (bug)
                       setStyleDisplay = false;
                    break;
               }
               
               if (value == "inline" || value == "block")
                    RemoveClass(element,"Hidden");
                
                if (value == "none")
                   element.className = element.className.toString() + " Hidden";
                  
               
               if (setStyleDisplay)
               {
                    element.style.display = value; 
                }
       } 
  
  }    
  
   function IsAlreadyMember(array, obj)
  {
     var isMember = false;
     for (var i=0;i<array.length;i++)
     {
        if (array[i].id == obj.id) {
             isMember = true;
            break; 
           } 
     }
     
     return isMember;
  }
   
  
  } 
  
    function GetGroupMembers(ViewSetID) 
    {
       var members = new Array(); 
       var definedMemberElementsList = "input,div,span,a,tr,li";
       var definedMemberElementsArray = definedMemberElementsList.split(",");
       
       for (var i=0;i<definedMemberElementsArray.length;i++)
       {
            BuildMemberList(members,document.getElementsByTagName(definedMemberElementsArray[i]),ViewSetID);
       } 
       return members;
    }    
  
    function ClassNameEventRegistration(signatureName,eventName, eventHandler)
    {
        this.Signature = signatureName;
        this.Event = eventName;
        this.EventHandler = eventHandler;  
    }
   
   function AddEventHandlerToMembers(memberArray, eventName, eventHandler)
   {
        for (var i=0;i<memberArray.length;i++)
        {
            AddEventHandler(memberArray[i],eventName,eventHandler);
        }
   }  
  
    function IndexOfKey(arrayObj, key)
   {
        var index;
       for (var i=0;i<arrayObj.length;i++)
       {
            if (arrayObj[i][0] == key) index = i;
       }
       
       return index; 
  }  
  
  
  function BuildMemberList(arrayMember, arrayObj, ViewSetID)
   {
         for (var i=0;i<arrayObj.length;i++)
       {
            if (IsMemberOf(arrayObj[i],ViewSetID)) {
                   arrayMember.push(arrayObj[i]);
            } 
       }
    }    
   
  function BuildMemberListBySpecificClass(arrayMember, arrayObj, ViewSetID)
   {
         for (var i=0;i<arrayObj.length;i++)
       {
            if (IsMemberOfSpecificClass(arrayObj[i],ViewSetID)) {
                   arrayMember.push(arrayObj[i]);
            } 
       }
    }      
  
  
   function IsMemberOfSpecificClass(obj, className)
   {
       var isMember = false;
       if (obj.className != undefined) {
            var classNameArray = obj.className.toString().split(" ");
            for (var i=0;i<classNameArray.length;i++)
            {
                if (classNameArray[i].toLowerCase() == className.toLowerCase()) 
               {
                    isMember = true; 
                    break;
               }
            }
       }  
        
       return isMember; 
    }
   
   
    function IsMemberOf(obj, className)
   {
        var isMember = false;
       
       if (obj.className != undefined && className != undefined) {
            if (obj.className.toString().toLowerCase().indexOf(className.toLowerCase()) >= 0) isMember = true; 
       }  
        
       return isMember; 
  
    }    
    
   
  function GetMemberListByNode(childNodes, nodeName)
  {
       var arrayMember = new Array();
       for (var i=0;i<childNodes.length;i++)
       {
            if (childNodes[i].nodeName == nodeName) {
                   arrayMember.push(childNodes[i]);
            } 
       }
       return arrayMember;
  }  
  
  
  function AddClass(obj, className)
  {
       var initalClasses = (obj.className != undefined) ? obj.className.toString() : "";
       obj.className = initalClasses + " " + className;
  }
  
  function RemoveClass(obj, className)
  {
       ReplaceClass(obj, className, "");
  }
  
    function ReplaceClass(obj, className, replacementName)
  {
         if (obj.className != undefined) {
            var classNameArray = obj.className.toString().split(" ");
            for (var i=0;i<classNameArray.length;i++)
            {
                if (classNameArray[i].toLowerCase() == className.toLowerCase()) 
               {
                    classNameArray[i] = replacementName;
               }
            }
            var reClassName = classNameArray.toString().replace(/,/g," ");
            obj.className = reClassName;
       }  
  }
  
  function GetChildIndex(childObj)
  {
       var index;
       var parentChildren = removeSimpleNodes(childObj.parentNode);
       for (var i=0;i<parentChildren.childNodes.length;i++)
       {
            if (parentChildren.childNodes[i] == childObj)
            {
                index = i;
            }
       }
       return index; 
  }
  
   var TabOrderManager = new TabOrderManager();
        AddEventHandler(window,"onload",TabOrderManager.Init);
  
  function TabOrderManager()
  {
       var anchors;
        this.Init = function Init()
       {
            anchors = document.getElementsByTagName("a");
            TabOrderManager.DisableTabbing(anchors);
       } 
       
         this.DisableTabbing = function DisableTabbing(htmlCollection)
       {
            for (var i=0;i<htmlCollection.length;i++)
            {
                if (htmlCollection[i].tabIndex != undefined)
               { 
                    htmlCollection[i].tabIndex = -1;         
                }
            }
       }
  }
  
  var Utilities = new Utilities();
    AddEventHandler(window,"onload",Utilities.Init);
  function Utilities()
  {
      this.Init = Init;
     
      var Style = new Style();
      this.Style = Style;
     
     
      var Validation = new Validation();
        this.Validation = Validation; 
     
     function Validation()
     {
        this.Init = Init;
        this.Replace =  Replace;
        
       //to add new RegEx command linked to css class name, just define and variables and add to RegExClassCommand array
        var OnlyCharsClassName = "OnlyChars";
        var OnlyDigitsClassName = "OnlyDigits"; 
        var RegExCharOnly = /[^A-Z\s-\.\/\\]/i;//allow spaces, dashes, periods, slashes
        var RegExDigitOnly = /[^0-9]/i; 
       
        var RegExClassCommand = new Array();
         RegExClassCommand.push(new NameValueCollection(OnlyCharsClassName,RegExCharOnly));
         RegExClassCommand.push(new NameValueCollection(OnlyDigitsClassName,RegExDigitOnly)); 
       
        function NameValueCollection(name, value)
       {
            this.Name = name;
            this.Value = value;
       }  
        
        function Init()
            {
               //Assign EventHandlers to objects that require it
               var ClassNameEvents = new Array(); 
               
               for (var i=0;i<RegExClassCommand.length;i++)
               {
                    ClassNameEvents.push(new ClassNameEventRegistration(RegExClassCommand[i].Name,"onkeyup",Utilities.Validation.Replace));
                     //onkeypress needed if user holds down key
                    ClassNameEvents.push(new ClassNameEventRegistration(RegExClassCommand[i].Name,"onkeypress",Utilities.Validation.Replace));
               }
               
               var classMembers;
               for (var i=0;i<ClassNameEvents.length;i++)
               {
                    classMembers = GetGroupMembers(ClassNameEvents[i].Signature);
                    AddEventHandlerToMembers(classMembers,ClassNameEvents[i].Event,ClassNameEvents[i].EventHandler);
               }
            }   
            
            function Replace(e)
            {
                  var eventObj = GetEventSourceObject(e);
                  var regEx;
                 for (var i=0;i<RegExClassCommand.length;i++)
                 {
                        if (IsMemberOf(eventObj,RegExClassCommand[i].Name))
                            regEx = RegExClassCommand[i].Value;
                 }

                    var strValue;
                    if (eventObj.value != null)
                    {
                        strValue = eventObj.value;
                        eventObj.value = strValue.replace(regEx,"");
                     } 
            }
     }  
      
     function Init()
     {
        Style.Init();
        Validation.Init();   
     } 
        
      function Style()
       {
             this.Init = Init; 
             
             this.UpperCase = UpperCase;
             var UpperCaseClassName = "UpperCase"; 
             
             this.ClearOnLoad =  ClearOnLoad;
            var ClearOnLoadClassName = "ClearOnLoad"; 
            
             function Init()
            {
               //Assign EventHandlers to objects that require it
               var ClassNameEvents = new Array();
               
               if (!IsIE) //do not register for IE, as CSS is sufficient for uppercasing
                    ClassNameEvents.push(new ClassNameEventRegistration(UpperCaseClassName,"onkeyup",Utilities.Style.UpperCase));
            
               var classMembers;
               for (var i=0;i<ClassNameEvents.length;i++)
               {
                    classMembers = GetGroupMembers(ClassNameEvents[i].Signature);
                    AddEventHandlerToMembers(classMembers,ClassNameEvents[i].Event,ClassNameEvents[i].EventHandler);
               }
               
                //Run other window.onload event-initiated application of DHTML by classname
                ClearOnLoad();
            }  
            
             function UpperCase(e)   
               {
                    var eventObj = GetEventSourceObject(e);
                    var strValue;
                    if (eventObj.value != null)
                    {
                       strValue = eventObj.value;
                        eventObj.value = strValue.toUpperCase();
                     } 
              }
             
              function ClearOnLoad()
             {
                var ClearMembers = GetGroupMembers(ClearOnLoadClassName);
               
                 for (var i=0;i<ClearMembers.length;i++)
                 {
                    if (ClearMembers[i].value != null)
                         ClearMembers[i].value = "";
                 }
            
             }        
       }
  }
function encodeValue(textField)
{
  var symbol=document.getElementById(textField)
  var test = symbol.value;
  test = test.replace(/[^-\s.$A-Za-z0-9]/g, " ");
  if (test != symbol.value) {
      testArray = test.split(' ');
      if (testArray.length > 1) {
          newTest = '';
          for (i = 0; i < testArray.length; i++) {
              if (testArray[i].length > 0) {
                  if (newTest == '')
                      newTest = testArray[i];
                  else
                      newTest = newTest + ' ' + testArray[i];
              }
          }
          symbol.value = newTest;
      }
      else
          symbol.value = test;
  }
  return true;
}