/*-------------------------------------------------------------------------
	-- File: general.js
	-- Purpose: General JavaScript functions
	-- Note:						
	--
	--  History:
			Date				By				Comments
		----------- 			----------	-------------------------------------
	-- 17 JAN 2007		S Martin	Created
	-- --------------------------------------------------------------------
*/

function popUp(URL,w,h,other) 
{
    /******************************************************************************
    DESCRIPTION: Creates a popup window and fills it with the template corresponding to the sent URL
    
    PARAMETERS:
        URL - URL of the popup window content
		w - desired popup window width in pixels
		h desired popup window height in pixels
    
    RETURNS:
        N/A 
    ******************************************************************************/

	day = new Date();
	id = day.getTime();
	color = other;
	windowWidth = w;
	windowHeight = h;
	if(windowWidth=="" || windowWidth == "undefined") windowWidth=800;
	if(windowHeight=="" || windowHeight == "undefined") windowHeight=600;

	centerWidth	= (screen.width/2)-(windowWidth/2);
	centerHeight = (screen.height/2)-(windowHeight/2);
	newURL = URL;
	
	eval("page" + id + " = window.open(newURL, '" + id + "', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width='+windowWidth+',height='+windowHeight+',left = '+centerWidth+',top = '+centerHeight);");
}

/*
//BEGIN code for link popup description functionality
//Modified from
//Pop up information box II (Mike McGrath (mike_mcgrath@lineone.net,  http://website.lineone.net/~mike_mcgrath))
//Permission granted to Dynamicdrive.com to include script in archive
//For this and 100's more DHTML scripts, visit http://dynamicdrive.com
*/

x_offset= 20;    // modify these values to ...
y_offset= 20;    // change the popup position.

var old,js_link_desc,iex = (document.all),yyy = -1000;

var ns4=document.layers
var ns6=document.getElementById&&!document.all
var ie4=document.all

//alert("ns4="+ns4+", ns6="+ns6+", ie4="+ie4);

if (ns4)
	js_link_desc=document.link_desc_div
else if (ns6)
	js_link_desc=document.getElementById("link_desc_div").style
else if (ie4)
	js_link_desc=document.all.link_desc_div.style

if(ns4)document.captureEvents(Event.MOUSEMOVE);
else
{
	js_link_desc.visibility="visible"
	js_link_desc.display="none"
}

document.onmousemove=get_mouse;

function popLink(msg,bak)
{
    /******************************************************************************
    DESCRIPTION: Creates a popup div with a message describing a link
    
    PARAMETERS:
        msg - the message to be displayed in the popup div
		bak - the background color of the popup div
    
    RETURNS:
        N/A 
    ******************************************************************************/
	var content="<div style=\"width:169px;border:1px solid midnightblue;padding:4px;background-color:"+bak+";color:midnightblue;font-size:10px;text-align:left;\">"+msg+"</div>";
	
	yyy=y_offset;
	
	if(ns4){js_link_desc.document.write(content);js_link_desc.document.close();js_link_desc.visibility="visible"}
	if(ns6){document.getElementById("link_desc_div").innerHTML=content;js_link_desc.display=''}
	if(ie4){document.all("link_desc_div").innerHTML=content;js_link_desc.display=''}
}

function get_mouse(e)
{
    /******************************************************************************
    DESCRIPTION: Gets mouse position for poitioning link popup div
    
    PARAMETERS:
        e - the current document object
    
    RETURNS:
        N/A 
    ******************************************************************************/
	var strpx=(ns6)?"px":"";
	
	var x=(ns4||ns6)?e.pageX:event.x+document.body.scrollLeft;
	js_link_desc.left=x+x_offset+strpx;
	var y=(ns4||ns6)?e.pageY:event.y+document.body.scrollTop;
	js_link_desc.top=y+yyy+strpx;
}

function popLinkKill()
{
    /******************************************************************************
    DESCRIPTION: Hides popup link div
    
    PARAMETERS:
        N/A 
    
    RETURNS:
        N/A 
    ******************************************************************************/
	yyy=-1000;
	if(ns4){js_link_desc.visibility="hidden";}
	else if (ns6||ie4)
	js_link_desc.display="none"
}
//END code for link popup description functionality


//BEGIN Support Functions
function strip(filter,str)
{
    /******************************************************************************
    DESCRIPTION: Strips strings of unwanted characters.
    
    PARAMETERS:
        str - String to be stripped
        filter - characters to remove
    
    RETURNS:
        Filtered string.
    ******************************************************************************/
    var i,curChar;
    var retStr = '';
    var len = str.length;
    
    for(i=0; i<len; i++)
    {
        curChar = str.charAt(i);
        if(filter.indexOf(curChar)<0) 
        //not in filter, keep it
        retStr += curChar;
    }

    return retStr;
}

function reformat(str)
{
    /******************************************************************************
    DESCRIPTION: Reformats string.
    
    PARAMETERS:
        str - String to be reformatted
    
    RETURNS:
        Reformatted string.
    ******************************************************************************/
    var arg;
    var pos = 0;
    var retStr = '';
    var len = reformat.arguments.length;
    
    for(var i=1; i<len; i++)
    {
        arg = reformat.arguments[i];
        if(i%2==1)
        {
            retStr += arg;
        }else{
            retStr += str.substring(pos, pos + arg);
            pos += arg;
        }
    }
    return retStr;
}
//END Support Functions

//BEGIN Validation Rules
function notEmpty(str)
{
    /******************************************************************************
    DESCRIPTION: Validates that a string is not empty.
    
    PARAMETERS:
        str - String to be tested
    
    RETURNS:
        True if the string contains a value, otherwise false.
    ******************************************************************************/
    if(strip(" \n\r\t",str).length ==0)
        return false;
    else
        return true;
}

function  validateNumeric(str) 
{
    /******************************************************************************
    DESCRIPTION: Validates that a string contains only valid numbers.
    
    PARAMETERS:
        str - String to be tested for validity
    
    RETURNS:
        True if valid, otherwise false.
    ******************************************************************************/
    var objRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
    
    //check for numeric characters
    return objRegExp.test(str);
}

function validateInteger(str) 
{
    /************************************************
    DESCRIPTION: Validates that a string contains only
        valid integer number.
    
    PARAMETERS:
       strValue - String to be tested for validity
    
    RETURNS:
       True if valid, otherwise false.
    ******************************************************************************/
  var objRegExp  = /(^-?\d\d*$)/;

  //check for integer characters
  return objRegExp.test(str);
}


function validateYear(year)
{
    /******************************************************************************
    DESCRIPTION: Validates that a year contains four characters.
    
    PARAMETERS:
        year - String to be tested for validity
    
    RETURNS:
        True if valid, otherwise false.
    ******************************************************************************/
    if (year.length!=4)
        return false;
    else
        return true;
}

function validateFloat(str)
{
    /******************************************************************************
    DESCRIPTION: Validates that a string contains a valid number.
    
    PARAMETERS:
        str - String to be tested for validity
    
    RETURNS:
        True if valid, otherwise false.
    ******************************************************************************/
    str = strip(' \n\r\t',str);
    
    //remove leading zeros, if any
    while(str.length > 1 && str.substring(0,1) == '0')
    {
        str = str.substring(1,str.length);
    }
    
    var val = parseFloat(str);
    
    if(isNaN(val))
        return false;
    else
        return true;
}

function validateUSPhone(str)
{
    /******************************************************************************
    DESCRIPTION: Validates that a string contains a valid US phone number.
    
    PARAMETERS:
        str - String to be tested for validity
    
    RETURNS:
        True if valid, otherwise false.
    ******************************************************************************/
    var objRegExp  = /^\([1-9]\d{2}\)\s?\d{3}\-\d{4}$/;

	//A second regex for numbers in the form 1-111-111-1111
	var objRegExp2  = /^\d{1}\-\d{3}\-\d{3}\-\d{4}$/;
	
	//A SPECIAL CASE for Retina Associates MACULA numbers
	var objRegExp3  = /^\d{1}\-\d{3}\-MACULA-\d{1}$/;

	if(objRegExp.test(str) || objRegExp2.test(str) || objRegExp3.test(str))
	{
		return true;
	}else{
		return false;
	}
	
    //check for valid us phone with or without space between
    //area code
    //return objRegExp.test(str);
}

function validateSSN(value) 
{
    /******************************************************************************
    DESCRIPTION: Validates that a string contains a correctly formatted SSN.
    
    PARAMETERS:
        value - String to be tested for validity
    
    RETURNS:
        True if valid, otherwise false.
    ******************************************************************************/
    var re = /^([0-6]\d{2}|7[0-6]\d|77[0-2])([ \-]?)(\d{2})\2(\d{4})$/;
   
   if (!re.test(value)) { return false; }
   
   var temp = value;
    if (value.indexOf("-") != -1) { temp = (value.split("-")).join(""); }
    if (value.indexOf(" ") != -1) { temp = (value.split(" ")).join(""); }
    if (temp.substring(0, 3) == "000") { return false; }
    if (temp.substring(3, 5) == "00") { return false; }
    if (temp.substring(5, 9) == "0000") { return false; }
    return true;
}

function validateZip(str)
{
    /******************************************************************************
    DESCRIPTION: Validates that a string contains a valid zip code.
    
    PARAMETERS:
        str - String to be tested for validity
    
    RETURNS:
        True if valid, otherwise false.
    ******************************************************************************/
    var objRegExp  = /(^\d{5}$)|(^\d{5}-\d{4}$)/;

  //check for valid US Zipcode
  return objRegExp.test(str);
}

function validateDate(str)
{
    /******************************************************************************
    DESCRIPTION: Validates that a  datestring is in mm/dd/yyyy format.
    
    PARAMETERS:
        str - String to be tested for validity
    
    RETURNS:
        True if valid, otherwise false.
    ******************************************************************************/
    var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
    
    if(!objRegExp.test(str))
    {
        return false; //doesn't match pattern, bad date
    }else{
        var strSeparator = str.substring(str.length-5,str.length-4) //find date separator
        var arrDate = str.split(strSeparator); //split date into month, day, year

        var oDate = new Date();
        
        oDate.setMonth(eval(arrDate[0]-1));
        oDate.setDate(arrDate[1]);
        oDate.setFullYear(arrDate[2]);

        // Validate whether the date itself is a valid calendar date.
        if ((arrDate[2] != oDate.getFullYear()) || (eval(arrDate[0]-1) != oDate.getMonth()))
        {
            return false;
        }else{
            return true;
        }
    }
    
}

function validateShortDate(str)
{
    /******************************************************************************
    DESCRIPTION: Validates that a  datestring is in mm/yyyy format.
    
    PARAMETERS:
        str - String to be tested for validity
    
    RETURNS:
        True if valid, otherwise false.
    ******************************************************************************/
    var objRegExp = /^\d{1,2}(\-|\/|\.)\d{4}$/;
    
    if(!objRegExp.test(str))
    {
        return false; //doesn't match pattern, bad date
    }else{
        var strSeparator = str.substring(str.length-5,str.length-4) //find date separator
        var arrDate = str.split(strSeparator); //split date into month,  year

        var oDate = new Date();
        
        oDate.setMonth(eval(arrDate[0]-1));
        oDate.setDate(1);
        oDate.setFullYear(arrDate[1]);

        // Validate whether the date itself is a valid calendar date.
        if ((arrDate[1] != oDate.getFullYear()) || (eval(arrDate[0]-1) != oDate.getMonth()))
        {
            return false;
        }else{
            return true;
        }
    }
    
}


function validateEMail(str)
{
    /******************************************************************************
    DESCRIPTION: Validates that a string contains a valid email address format.
    
    PARAMETERS:
        str - String to be tested for validity
    
    RETURNS:
        True if valid, otherwise false.
    ******************************************************************************/
    var objRegExp  = /^.+@.+\..{2,3}$/;
    
    //check for valid email
    return objRegExp.test(str);
}

function validateRadio(radioArray)
{
    /******************************************************************************
    DESCRIPTION: Validates that a choice has been made in a radio button array.
    
    PARAMETERS:
        radioArray - radioArray to be tested for validity
    
    RETURNS:
        True if a choice has been made, otherwise false.
    ******************************************************************************/
    for(i=0; i<radioArray.length; i++)
    {
        if(radioArray[i].checked) return radioArray[i].value;
    }
    return false;
}

function validateDropdown(dropdown) 
{
    /******************************************************************************
    DESCRIPTION: Validates that a choice has been made in a dropdown list.
    
    PARAMETERS:
        dropdown - dropdown to be tested for validity
    
    RETURNS:
        True if a choice has been made, otherwise false.
    ******************************************************************************/
    if (dropdown.selectedIndex==0) 
    {
        return false;
    }else{
        return true;
    }
} 
//END Validation Rules
   
//BEGIN Formatting functions
function formatPhone(str)
{
    /******************************************************************************
    DESCRIPTION: Reformats string to US phone format (nnn) nnn-nnnn.
    
    PARAMETERS:
        str - String to be reformatted
    
    RETURNS:
        Reformatted string.
    ******************************************************************************/
    str = strip("*() -./_\n\r\t\\",str);
    
    if(str.length==10)
        return reformat(str,"(",3,") ",3,"-",4);
    if(str.length==7)
        return reformat(str,"",3,"-",4);
}

function formatSSN(str)
{
    /******************************************************************************
    DESCRIPTION: Reformats string to SSN format nnn-nn-nnnn.
    
    PARAMETERS:
        str - String to be reformatted
    
    RETURNS:
        Reformatted string.
    ******************************************************************************/
    str = strip(" -.\n\r\t",str);
    
    return reformat(str,"",3,"-",2,"-",4);
}

function formatZip(str)
{
    /******************************************************************************
    DESCRIPTION: Reformats string to US zip code format nnnnn (with optional +4 -nnnn).
    
    PARAMETERS:
        str - String to be reformatted
    
    RETURNS:
        Reformatted string.
    ******************************************************************************/
    str = strip("- \n\r\t",str);
    
    if(str.length==5)
        return str;
    if(str.length==9)
        return reformat(str,"",5,"-",4);
}


function formatDate(str,style)
{
    /******************************************************************************
    DESCRIPTION: Reformats string to date format based on style argument.
    
    PARAMETERS:
        str - String to be reformatted
        style - string mask for format style
    
    RETURNS:
        Reformatted string.
    ******************************************************************************/
    var dateVar = new Date(str);
    var year = dateVar.getYear();
    
    if(year<10)
        year += 2000;
    if(year<100)
        year += 1900;
        
    switch(style)
    {
        case "MM/DD/YY":
            return (dateVar.getMonth() + 1) + "/" + 
            dateVar.getDate() + "/" + year;
            break;
        case "DD/MM/YY":
            return dateVar.getDate() + "/" + 
            (dateVar.getMonth() + 1) + "/" + year;
            break;
        case "Month Day, Year":
            return getMonthName(dateVar) + " " + 
            dateVar.getDate() + ", " + year;
            break;
        case "Day, Month Day, Year":
            return getDayName(dateVar) + ", " + 
            getMonthName(dateVar) + " " + 
            dateVar.getDate() + ", " + year;
            break;
        default:
            return (dateVar.getMonth() + 1) + "/" + 
            dateVar.getDate() + "/" + year;
            break;
    }
}
//End Formatting Functions
  
//BEGIN other functions

/*
function removeAllOptions(selectbox)
{
    /******************************************************************************
    DESCRIPTION: Empties all options from a select box (dropdown list).
    
    PARAMETERS:
        selectbox - selectbox to be emptied
    
    RETURNS:
        N/A.
    ******************************************************************************/
/*
    var i;
    for(i=selectbox.options.length-1;i>=0;i--)
    {
        selectbox.remove(i);
    }
}    
*/

function getRadioValue(radioArray)
{
    /******************************************************************************
    DESCRIPTION: Gets selected value from a radio button array.
    
    PARAMETERS:
        radioArray - radioArray to be searched for a value
    
    RETURNS:
        Selected value string or empty string if no result
    ******************************************************************************/
    var i
    for (i = 0; i < radioArray.length; i++)
    {
       if (radioArray[i].checked) return radioArray[i].value
   }
    return ""
}

function getDisplayStyle(whichLayer)
{
    /******************************************************************************
    DESCRIPTION: Gets selected layer display style (i.e. 'block' or 'none').
    
    PARAMETERS:
        whichLayer - layer to be examined
    
    RETURNS:
        Display style value string 
    ******************************************************************************/
    
    if (document.getElementById)
    {
        var style2 = document.getElementById(whichLayer).style;
    }
    else if (document.all)
    {
        var style2 = document.all[whichLayer].style;
    }
    else if (document.layers)
    {
        var style2 = document.layers[whichLayer].style;
    }
    
    return style2;
}

function toggleLayer(whichLayer)
{
    /******************************************************************************
    DESCRIPTION: Toggles layer display style (i.e. hides if visible, shows if hidden).
    
    PARAMETERS:
        whichLayer - layer to be toggled
    
    RETURNS:
        N/A 
    ******************************************************************************/
    var style2 = getDisplayStyle(whichLayer);
    style2.display = style2.display=='block'? "none":"block";
}

function togglePlusMinus(whichLayer)
{
    /******************************************************************************
    DESCRIPTION: Toggles layer display HTML for anchor +- button (used for expanding submenus).
    
    PARAMETERS:
        whichLayer - layer (or html entity) to be toggled
    
    RETURNS:
        N/A 
    ******************************************************************************/
 
   if (document.getElementById)
    {
        var html2 = document.getElementById(whichLayer);
    }
    else if (document.all)
    {
        var html2 = document.all[whichLayer];
    }
    else if (document.layers)
    {
        var html2 = document.layers[whichLayer];
    }

   html2.innerHTML = html2.innerHTML == '[+]'? "[-]":"[+]";

}


