/********************************************************************************
'CLASS:  InvalidMessage.js
'DATE:   Jan 01
'DESC:   Helper functions for an HTML popup window telling the user which items
'        on a page are invalid.
'USAGE:
'TODO:
'REVISION HISTORY:
'  Author   Date        Comment
'  DRM:     01/18/01    First draft
'********************************************************************************/

//Variables
//********************************************************************************
//HTML Strings to be assembled
var mainHTML;
var itemInsertionHTML;
var closeWindowHTML;
//Types
var requiredHTML;
var integerHTML;
var floatHTML;
var bitHTML;
var emailHTML;
var ssnHTML;
var phoneHTML;
var dateHTML;
var currencyHTML;
var stringHTML;
var overflowHTML;
var ipsativeHTML = "";
var miscHTML;
//Internal variables
var runningItemHTML = new Array();
var rolledUpHTML = new Array();
var rollupMessages = false;
var popupWindow;
var popupWindowProperties;
var parentCallback;
var htmlString;
var invalidElementNames = new String("*");

//Functions
//********************************************************************************
function InvalidMessage(mainHTMLString, callbackFunction){
   //initialize properties
   ParseMainString(mainHTMLString);
   parentCallback = callbackFunction;

   //define methods
   this.displayMessage = DisplayMessage;
   this.addInvalidItem = AddInvalidItem;
   this.clear = ClearMessage;
   this.closePopup = ClosePopup;
   this.writePopupHTML = WritePopupHTML;
   this.getItemId = GetItemId;
   this.getItemGroupId = GetItemGroupId;
   this.getValidationType = GetValidationType;

}

//********************************************************************************
function AddInvalidItem(elem, type, required, swapIcon){

   var tempHTML = new String;

   if (mainHTML.length > 0){
      //only add items if we have a final message to display
      
      if (invalidElementNames.indexOf("*" + elem.name + "*") < 0){
         //have we counted it already?
         if (type == 1){ //Required
            AddInvalidItemHTML(elem, requiredHTML);
         }
         else if (type == 2){ //too long!
            AddInvalidItemHTML(elem, overflowHTML);
         }
         else if (type == 3){ //misc
            AddInvalidItemHTML(elem, miscHTML);
         }
         else if (type == 4){ //ipsative
            if (ipsativeHTML.length > 0){
               AddInvalidItemHTML(elem, ipsativeHTML);
            }
            else {
               AddInvalidItemHTML(elem, miscHTML);
            }
         }
         else if (type == 11){ //VERIFY_INTEGER
            AddInvalidItemHTML(elem, integerHTML);
         }
         else if (type == 12){ //VERIFY_FLOAT
            AddInvalidItemHTML(elem, floatHTML);
         }
         else if (type == 13){ //VERIFY_BIT
            AddInvalidItemHTML(elem, bitHTML);
         }
         else if (type == 14){ //VERIFY_EMAIL
            AddInvalidItemHTML(elem, emailHTML);
         }
         else if (type == 15){ //VERIFY_SSN
            AddInvalidItemHTML(elem, ssnHTML);
         }
         else if (type == 16){ //VERIFY_PHONE
            AddInvalidItemHTML(elem, phoneHTML);
         }
         else if (type == 17){ //VERIFY_DATE
            AddInvalidItemHTML(elem, dateHTML);
         }
         else if (type == 18){ //VERIFY_CURRENCY
            AddInvalidItemHTML(elem, currencyHTML);
         }
         else if ((type == 19)||(type == 20)){ //VERIFY_STRING
            AddInvalidItemHTML(elem, stringHTML);
         }
         else{  //Unknown type; increment counter only
            runningItemHTML[runningItemHTML.length] = "";
         }
         invalidElementNames += elem.name + "*";
         
         if (swapIcon != false){
            ChangeIconInvalid(elem, required);
         }
      }
   }

}


//********************************************************************************
function ParseMainString(mainHTMLString){

   var openingPos;
   var closingPos;
   var openingTagString;
   var closingTagString;

   if (String(mainHTMLString).length > 0){
      mainHTML = ParseSubString(mainHTMLString, "<NACHO_MAIN_INVALID_MESSAGE>", "</NACHO_MAIN_INVALID_MESSAGE>");
      itemInsertionHTML = ParseSubString(mainHTMLString, "<NACHO_ITEM_HTML>", "</NACHO_ITEM_HTML>");
      closeWindowHTML = ParseSubString(mainHTMLString, "<NACHO_CLOSE_WINDOW>", "</NACHO_CLOSE_WINDOW>");
   
      requiredHTML = ParseSubString(mainHTMLString, "<NACHO_REQIURED_ITEM>", "</NACHO_REQIURED_ITEM>");
      integerHTML = ParseSubString(mainHTMLString, "<NACHO_INVALID_INTEGER>", "</NACHO_INVALID_INTEGER>");
      floatHTML = ParseSubString(mainHTMLString, "<NACHO_INVALID_FLOAT>", "</NACHO_INVALID_FLOAT>");
      bitHTML = ParseSubString(mainHTMLString, "<NACHO_INVALID_BIT>", "</NACHO_INVALID_BIT>");
      emailHTML = ParseSubString(mainHTMLString, "<NACHO_INVALID_EMAIL>", "</NACHO_INVALID_EMAIL>");
      ssnHTML = ParseSubString(mainHTMLString, "<NACHO_INVALID_SSN>", "</NACHO_INVALID_SSN>");
      phoneHTML = ParseSubString(mainHTMLString, "<NACHO_INVALID_PHONE>", "</NACHO_INVALID_PHONE>");
      dateHTML = ParseSubString(mainHTMLString, "<NACHO_INVALID_DATE>", "</NACHO_INVALID_DATE>");
      currencyHTML = ParseSubString(mainHTMLString, "<NACHO_INVALID_CURRENCY>", "</NACHO_INVALID_CURRENCY>");
      stringHTML = ParseSubString(mainHTMLString, "<NACHO_INVALID_STRING>", "</NACHO_INVALID_STRING>");
      overflowHTML = ParseSubString(mainHTMLString, "<NACHO_INVALID_OVERFLOW>", "</NACHO_INVALID_OVERFLOW>");
      ipsativeHTML = ParseSubString(mainHTMLString, "<NACHO_INVALID_IPSATIVE>", "</NACHO_INVALID_IPSATIVE>");
      miscHTML = ParseSubString(mainHTMLString, "<NACHO_INVALID_MISC>", "</NACHO_INVALID_MISC>");
      popupWindowProperties = ParseSubString(mainHTMLString, "<NACHO_POPUP_WINDOW_PROPERTIES>", "</NACHO_POPUP_WINDOW_PROPERTIES>");
   }
   else{
      //initialize main HTML to an empty String
      mainHTML = new String();
   }

}

//********************************************************************************
function ParseSubString(mainHTMLString, openingTag, closingTag){

   var openingPos;
   var closingPos;
   
   var subString = "";
   openingPos = mainHTMLString.indexOf(openingTag) + openingTag.length;
   if (openingPos >= 0){
      closingPos = mainHTMLString.indexOf(closingTag);
      if (closingPos > 0){
         subString = mainHTMLString.substring(openingPos, closingPos);
      }
   }
   
   return subString;

}

//********************************************************************************
function ReplaceNachoTag(nachoHTML, nachoTag, insertedString){

   var openingPos;
   var closingPos;
   
   var newString = new String(nachoHTML);
   openingPos = newString.indexOf(nachoTag);
   if (openingPos >= 0){
      closingPos = openingPos + nachoTag.length;
      if (closingPos < newString.length){
         newString = newString.substring(0, openingPos) + insertedString + newString.substring(closingPos);
      }
   }
   
   return newString;

}

//********************************************************************************
function AddInvalidItemHTML(elem, insertedHTML){

   var tempHTML = "";
   
   if (!rollupMessages){
      if ((String(elem.NACHO_LABEL).length > 0) && (String(elem.NACHO_LABEL) != "undefined")){
         tempHTML = ReplaceNachoTag(insertedHTML, "[NACHO_ITEM_LABEL]", "\"" + elem.NACHO_LABEL + "\"");
      }
      else{
         rollupMessages = true;
      }
   }
   
   tempHTML = ReplaceNachoTag(itemInsertionHTML, "[NACHO_ITEM_INSERTION]", tempHTML);
   
   if (tempHTML != ""){
      runningItemHTML[runningItemHTML.length] = tempHTML;
   }
   
   AddToRollup(insertedHTML);

}

//********************************************************************************
function AddToRollup(insertedHTML){

   var tempHTML = "";
   var i;
   var addString = true;
   
   if (insertedHTML != ""){
      tempHTML = ReplaceNachoTag(insertedHTML, "[NACHO_ITEM_LABEL]", "");
   
      tempHTML = ReplaceNachoTag(itemInsertionHTML, "[NACHO_ITEM_INSERTION]", tempHTML);
   
      if (rolledUpHTML.length == 0){
         rolledUpHTML[0] = tempHTML;
      }
      else{
         for (i = 0; i < rolledUpHTML.length; i++){
            if (rolledUpHTML[i] == tempHTML){
               addString = false;
               break;
            }
         }
         if (addString){
            rolledUpHTML[rolledUpHTML.length] = tempHTML;
         }
      }
   }

}

//********************************************************************************
function DisplayMessage(){

   var i;
   
   htmlString = new String();

   if ((mainHTML.length > 0) && (runningItemHTML.length > 0)){
      htmlString = ReplaceNachoTag(mainHTML, "[NACHO_INVALID_ITEM_COUNT]", runningItemHTML.length);
      if (closeWindowHTML.length > 0){
         htmlString = ReplaceNachoTag(htmlString, "[NACHO_CLOSE_WINDOW_INSERTION]", closeWindowHTML.link("javascript: self.close()"));
      }
      if (!rollupMessages){
         for (i = 0; i < runningItemHTML.length; i++){
            if (runningItemHTML[i].length > 0){
               htmlString = ReplaceNachoTag(htmlString, "[NACHO_ITEMS]", String(runningItemHTML[i]) + "[NACHO_ITEMS]");
            }
         }
      }
      else{
         for (i = 0; i < rolledUpHTML.length; i++){
            if (rolledUpHTML[i].length > 0){
               htmlString = ReplaceNachoTag(htmlString, "[NACHO_ITEMS]", String(rolledUpHTML[i]) + "[NACHO_ITEMS]");
            }
         }         
      }
      //strip out any remaining item insertions
      htmlString = ReplaceNachoTag(htmlString, "[NACHO_ITEMS]", "");
      
      SetImageBases();
      
   	ClosePopup();
      
      if (parentCallback != null){
         parentCallback();
      }
   	popupWindow = window.open("javascript: opener.message.writePopupHTML\(\)", "invalidMessage", popupWindowProperties);
   	
   	return true;
   }
   else {
      return false;
   }

}

//********************************************************************************
function ClearMessage(){
   ClearRunningItemHTML();
   invalidElementNames = new String("*");
   ResetIcons();
}

//********************************************************************************
function ClearRunningItemHTML(){
   runningItemHTML = new Array();
}

//********************************************************************************
function ResetIcons(){
   var validationType;
   var itemId;
   var itemGroupId;
   var imageName;
   var i;
   
   for (i = 0; i < document.images.length; i++){
      if (document.images[i].name.indexOf("VI") == 0){
         imageName = document.images[i].name;
         
         validationType = GetValidationType(imageName);
         
         //Set all icons back to their valid types   
         if ((validationType == 1)||(validationType == 2))
            validationType = 1;
         else
            validationType = 3;
      
         //find item & itemgroup ids
         itemId = GetItemId(imageName);
         itemGroupId = GetItemGroupId(imageName);

         SwapIcon(itemId, itemGroupId, validationType);
      }
   }
}

//********************************************************************************
function ClosePopup(){
	if (popupWindow != null){
		//close window to clear
		if (!popupWindow.closed){
		   popupWindow.close();
		}
	}
}

//********************************************************************************
function WritePopupHTML(){
	return htmlString;
}

//********************************************************************************
function ChangeIconInvalid(elem, required){
   var validationType;
   var itemId;
   var itemGroupId;
   
   if (required == 1)
      validationType = 2;
   else
      validationType = 4;
      
   //find item & itemgroup ids
   itemId = GetItemId(elem.name);
   itemGroupId = GetItemGroupId(elem.name);

   SwapIcon(itemId, itemGroupId, validationType);
}

//********************************************************************************
function SwapIcon(itemId, itemGroupId, validationType){
   var imageSrc = new String();
   var iconName = new String();
   var i;
   var iconIndex = -1;
   
   if (validationType == 1){
      if (valid_required != null)
         imageSrc = valid_required.src;
   }
   else if (validationType == 2){
      if (not_valid_required != null)
         imageSrc = not_valid_required.src;
   }
   else if (validationType == 3){
      if (valid_not_required != null)
         imageSrc = valid_not_required.src;
   }
   else if (validationType == 4){
      if (not_valid_not_required != null)
         imageSrc = not_valid_not_required.src;
   }
   
   iconName = "VI" + itemGroupId + "::" + itemId;
   
   for (i = 0; i < document.images.length; i++){
      if (document.images[i].name.indexOf(iconName) >= 0){
         iconIndex = i;
         break;
      }
   }
   if (iconIndex >= 0){
      if (imageSrc != ""){
         document.images[iconIndex].src = imageSrc;
      }
   }

}

//********************************************************************************
function GetItemId(elemName){
   var itemId = 0;
   var position;
   
	position = String(elemName).indexOf("::");
	if (position >= 0){
	   itemId = parseInt(String(elemName).substring(position + 2));
	}
	
	return itemId;
}

//********************************************************************************
function GetItemGroupId(elemName){
   var itemGroupId = 0;
   var position;
   
	position = String(elemName).indexOf("::");
	if (position >= 0){
	   itemGroupId = parseInt(String(elemName).substring(2, position));
	}
	
	return itemGroupId;
}

//********************************************************************************
function GetValidationType(elemName){
   var validationType = 0;
   var position;
   
	position = String(elemName).indexOf("::T::");
	if (position >= 0){
	   validationType = parseInt(String(elemName).substring(position + 5));
	}
	
	return validationType;
}

//********************************************************************************
function SetImageBases(){
   var urlBase = new String();
   var position = 0;
   
   position = window.location.href.lastIndexOf("\/");
   urlBase = window.location.href.substring(0, position + 1);
   
	position = htmlString.indexOf("SRC");
	
	while (position >= 0){
	   position = htmlString.indexOf("\"", position);
	   if (position >= 0){
	      if (htmlString.substring(position + 1, position + 2) == "\/"){
	         htmlString = htmlString.substring(0, position + 2) + urlBase + htmlString.substring(position + 1)
	      }
	      else {
	         htmlString = htmlString.substring(0, position + 1) + urlBase + htmlString.substring(position + 1)
	      }
	      
	      position = htmlString.indexOf("SRC", position);
	   }
	   else {
	      position = -1;
	   }
	}
	
}


