/*******************************************************************************
/* Event Utilities
/******************************************************************************/

function registerEventHandler(oNode, strEvent, funcHandler)
{
  var funcOldHandler = (oNode[strEvent] ? oNode[strEvent] : function() {});
  oNode[strEvent] = function() { funcOldHandler(); funcHandler(); };
}

/*******************************************************************************
/* String Utilities
/******************************************************************************/

function trim(strX)
{
    return strX.replace(/^\s+|\s+$/, '');
}

/*******************************************************************************
/* Confirmation Inputs
/******************************************************************************/

function confirmationInput_blur(oInput, sDefaultText, bPassword)
{
	if (trim(oInput.value).length < 1)
		oInput.value = sDefaultText;
	oInput.style.color = (oInput.value == sDefaultText) ? '#666666' : '#000000';
	if (bPassword && (oInput.value == sDefaultText))
	{
		oNewInput = document.createElement('input');
		oNewInput.type = 'text';
		oNewInput.id = oInput.id;
		oNewInput.name = oInput.name;
		oNewInput.className = oInput.className;
		oNewInput.maxLength = oInput.maxLength;
		oNewInput.tabIndex = oInput.tabIndex;
		oNewInput.value = oInput.value;
		oNewInput.style.color = oInput.style.color;
		oNewInput.onblur = oInput.onblur;
		oNewInput.onfocus = function() { confirmationInput_focus(oNewInput, sDefaultText, bPassword); };

		oInput.parentNode.replaceChild(oNewInput, oInput);
		oInput = oNewInput;
	}
}

function confirmationInput_focus(oInput, sDefaultText, bPassword)
{
	oInput.style.color = '#000000';
	if (bPassword)
	{
		oNewInput = document.createElement('input');
		oNewInput.type = 'password';
		oNewInput.id = oInput.id;
		oNewInput.name = oInput.name;
		oNewInput.className = oInput.className;
		oNewInput.maxLength = oInput.maxLength;
		oNewInput.tabIndex = oInput.tabIndex;
		oNewInput.value = oInput.value;
		oNewInput.style.color = oInput.style.color;
		oNewInput.onblur = oInput.onblur;

		oInput.parentNode.replaceChild(oNewInput, oInput);
		oInput = oNewInput;
		oInput.focus();
	}
	if (oInput.value == sDefaultText)
		oInput.value = '';
	oInput.select();
}

function initConfirmationInput(oInput, sDefaultText, bPassword)
{
	if (trim(oInput.value).length < 1)
		oInput.value = sDefaultText;
	oInput.style.color = (oInput.value == sDefaultText) ? '#666666' : '#000000';
	if (bPassword && (oInput.value == sDefaultText))
	{
		oNewInput = document.createElement('input');
		oNewInput.type = 'text';
		oNewInput.id = oInput.id;
		oNewInput.name = oInput.name;
		oNewInput.className = oInput.className;
		oNewInput.maxLength = oInput.maxLength;
		oNewInput.tabIndex = oInput.tabIndex;
		oNewInput.value = oInput.value;
		oNewInput.style.color = oInput.style.color;
		oNewInput.onblur = function() { confirmationInput_blur(oNewInput, sDefaultText, bPassword); };
		oNewInput.onfocus = function() { confirmationInput_focus(oNewInput, sDefaultText, bPassword); };

		oInput.parentNode.replaceChild(oNewInput, oInput);
		oInput = oNewInput;
	}
}

/* Validation */

var sHighlightedLabelClass = 'invalid';
var oHighlightedLabelRegex = new RegExp('(^| )' + sHighlightedLabelClass + '(?=( |$))', 'i');

function getAssociatedLabels(oElement)
{
    var aResult = new Array();
    var aLabels = document.getElementsByTagName('label');
    for (var i = 0; i < aLabels.length; i++)
    {
        var oLabel = aLabels[i];
        if (oLabel && oLabel.htmlFor == oElement.id)
            aResult.push(oLabel);
    }
    return aResult;
}

function formatValidatedInputLabel(oLabel, bValid)
{
    if (bValid)
    {
        if (oLabel.className)
            oLabel.className = oLabel.className.replace(oHighlightedLabelRegex, '');
    }
    else
    {
        if (oLabel.className)
        {
            if (!oHighlightedLabelRegex.test(oLabel.className))
                oLabel.className += ((oLabel.className.length > 0) ? ' ' : '') + sHighlightedLabelClass;
        }
        else
            oLabel.className = sHighlightedLabelClass;
    }
}

function highlightValidatedInputLabel(oValidator)
{
    var oElement = document.getElementById(oValidator.controltovalidate);
    if (oElement)
    {
        var aOtherValidators = new Array();
        for (var i = 0; i < Page_Validators.length; i++)
        {
            if (Page_Validators[i].controltovalidate == oValidator.controltovalidate)
                aOtherValidators.push(Page_Validators[i]);
        }

        var bValid = true;
        for (var i = 0; i < aOtherValidators.length; i++)
            bValid = bValid && aOtherValidators[i].isvalid;

        var aLabels = getAssociatedLabels(oElement);
        for (var i = 0; i < aLabels.length; i++)
            formatValidatedInputLabel(aLabels[i], bValid);
    }
    /*
    if(document.all(val.controltovalidate + '_lbl')!= null ){
        // Find label through naming rule
        var lbl = document.all(val.controltovalidate + '_lbl');
        var k, value;

        // Find out all validators associated
        var vals = new Array();
        for(k=0; k < Page_Validators.length; k++){
            if(Page_Validators[k].controltovalidate == val.controltovalidate)
                vals.push(Page_Validators[k]);
        }

        //Determine if some validator fails
        value = true;
        for(k=0; k < vals.length;k++)
            value = (value && vals[k].isvalid);

        // Change label text color
        if(value){
            lbl.style.color ='black'; // normal color, black
        }else{
            lbl.style.color = 'red'; // error color, red
        }
    }
    */
}

function initializeValidation()
{
    if (typeof ValidatorUpdateDisplay == 'function')
    {
        var __funcbody = ValidatorUpdateDisplay.toString();
        __funcbody = __funcbody.substring(__funcbody.indexOf("{") + 1, __funcbody.lastIndexOf("}"));
        var newfunc = new Function("val", "highlightValidatedInputLabel(val); " + __funcbody );
        ValidatorUpdateDisplay = newfunc;
    }
}

/* MM */

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

/* Global Commands */

// Preload images for MM
registerEventHandler(window, 'onload', function() { MM_preloadImages('images/mast_index2.gif','images/mast_about2.gif','images/mast_activities2.gif','images/mast_papers2.gif','images/mast_ce2.gif','images/mast_links2.gif'); });

// Initialize custom validation display
registerEventHandler(window, 'onload', initializeValidation);
