/*****************************************
    string trim
******************************************/
function ltrim(str) {return str.replace(/^[ ]+/, '');} 
function rtrim(str) {return str.replace(/[ ]+$/, '');} 
function trim(str) {return ltrim(rtrim(str));} 

/*****************************************
    message display 
******************************************/
function clearMessage() {
    var lblMessage = document.getElementById(getClientId('lblMessage'));
    clearMessageAt(lblMessage);
}
function clearMessageAt(labelControl) {
    if (typeof(labelControl.textContent) != "undefined") // for FF
        labelControl.textContent = ' ';
    else
        labelControl.innerText = ' ';
}

function showMessageAt(labelControl, message, color) {
    if (typeof(labelControl.textContent) != "undefined") // for FF
        labelControl.textContent = message;
    else
        labelControl.innerText = message;

    labelControl.style.color = color;
}
function showErrorMessage(message) {
    var lblMessage = document.getElementById(getClientId('lblMessage'));
    showErrorMessageAt(lblMessage, message);
}
function showErrorMessageAt(labelControl, message) {
    showMessageAt(labelControl, message, 'red');
}
function showConfirmMessage(message) {
    var lblMessage = document.getElementById(getClientId('lblMessage'));
    showConfirmMessageAt(lblMessage, message);
}
function showConfirmMessageAt(labelControl, message) {
    showMessageAt(labelControl, message, 'green');
}
function showWarningMessage(message) {
    var lblMessage = document.getElementById(getClientId('lblMessage'));
    showWarningMessageAt(lblMessage, message);
}
function showWarningMessageAt(labelControl, message) {
    showMessageAt(labelControl, message, 'Maroon');
}

/******** clear input area ********/
function clearAllTextBoxes(inputArea) {
    // clear all textBox & checkBox
    var inputs = inputArea.getElementsByTagName('INPUT');
    for (var i = 0; i < inputs.length; i++)
        switch (inputs[i].type)
        {
        case 'text':
            // clear text of all textboxes
            inputs[i].value = '';
            break;
        case 'checkbox':
            // uncheck checkboxes
            inputs[i].checked = false;
            break;
        }

    // reset dropDownList to 1st item
    var ddls = inputArea.getElementsByTagName('SELECT');
    for (var i = 0; i < ddls.length; i++)
        ddls[i].selectedIndex = 0;

    // clear message area
    clearMessage();
}


/**************** pre-submit *********************
 * prohibit use from clicking submit button twice
 * give a visual hint that submit process is going on
 */
function doNonValidatingSubmit(btnSubmit) {
    prepareToSubmit(btnSubmit);
}
function doValidatingSubmit(btnSubmit) {
    if (validateAll()) {
        prepareToSubmit(btnSubmit);
        //return false;
        return true;
    } else {
        return false;
    }
}

function prepareToSubmit(submitButton) {
    var lblMessage = document.getElementById(getClientId('lblMessage'));
    prepareToSubmitAt(lblMessage, submitButton);
}
function prepareToSubmitAt(labelControl, submitButton) {
    labelControl.style.color = 'Maroon';
    // display "Please wait ..." on message label, both IE and FF
    if (typeof(labelControl.textContent) != "undefined") // for FF
        labelControl.textContent = 'Please wait ...';
    else
        labelControl.innerText = 'Please wait ...';

    submitButton.style.visibility = 'hidden';

    // display "Please wait ..." on lblSubmitButton, IE only
    if (typeof(window.event) != "undefined" &&
        window.event.srcElement.tagName == 'INPUT')
     {
        var lblSubmitButton = document.getElementById(getClientId('lblSubmitButton'));
        lblSubmitButton.innerText = 'Please wait ...';
        lblSubmitButton.style.color = 'Maroon';
    }
}

/*****************************************
    toggle
******************************************/
function collapseToggler(imgToggler){
    imgToggler.src = imgToggler.src.replace('minus.gif', 'plus.gif');
}

function doToggle(imgToggler, toggleArea) {
	if (isTogglerExpanded(imgToggler)) {         // currently expanded, collapse it
		// do not change class name (to "none"), change display style to "none" instead
		toggleArea.style.display = 'none';       // hide the specified area, 
		imgToggler.src = imgToggler.src.replace('minus.gif', 'plus.gif');   // change image icon to minu sign
	} else {
	    // show the specified area, handle both cases: class name and display style
		if (toggleArea.style.display == 'none')
    		toggleArea.style.display = '';
		if (toggleArea.className == 'none')
		    toggleArea.className = '';

        // change toggle icon to expanded
		imgToggler.src = imgToggler.src.replace('plus.gif', 'minus.gif');   // change image icon to plus sign
	}
}

function doToggleNamedArea(imgToggler, toggleAreaId) {
    var toggleArea = document.getElementById(toggleAreaId);
    doToggle(imgToggler, toggleArea);
}

function doToggleNextDiv(imgToggler) {
    var toggleArea = imgToggler.parentElement.nextSibling; // or parentNode
    doToggle(imgToggler, toggleArea);
}

function expandeToggler(imgToggler){
    imgToggler.src = imgToggler.src.replace('plus.gif', 'minus.gif');
}

function isTogglerExpanded(imgToggler) {
    return imgToggler.src.indexOf('minus.gif') >= 0;
}

function switchTogglerIcon(imgToggler) {
	if (isTogglerExpanded(imgToggler))  // currently expanded
		// change image icon to plus sign
		imgToggler.src = imgToggler.src.replace('minus.gif', 'plus.gif');
	else
	    // change image icon to minu sign
		imgToggler.src = imgToggler.src.replace('plus.gif', 'minus.gif');
}

function showHideHelp(anchor, toggleAreaId) {
    var toggleArea = document.getElementById(toggleAreaId);
    
    if (typeof(anchor.textContent) != "undefined"){ // for FF
	    if (anchor.textContent.search('Show') != -1) {  // invisible
	        // show help
		    if (toggleArea.className == 'none')   // do not touch class name if it is not 'none'
		        toggleArea.className = '';
    		
		    toggleArea.style.display = '';
		    anchor.textContent = anchor.textContent.replace(/Show/, 'Hide');
	    } else {
	        // hide help
		    toggleArea.style.display = 'none';
		    anchor.textContent = anchor.textContent.replace(/Hide/, 'Show');
	    }
    } else { // for IE
	    if (anchor.innerText.search('Show') != -1) {  // invisible
	        // show help
		    if (toggleArea.className == 'none')   // do not touch class name if it is not 'none'
		        toggleArea.className = '';
    		
		    toggleArea.style.display = '';
		    anchor.innerText = anchor.innerText.replace(/Show/, 'Hide');
	    } else {
	        // hide help
		    toggleArea.style.display = 'none';
		    anchor.innerText = anchor.innerText.replace(/Hide/, 'Show');
	    }
    }
}

function showAreaHideAnchor(anchor, showAreaId) {
    var showArea = document.getElementById(showAreaId);
    // show all
    showArea.style.display = '';
    if (showArea.className == 'none')   // do not touch class name if it is not 'none'
        showArea.className = '';

    // hide anchor   		
    anchor.style.display = 'none';
}    

/*****************************************
    screen position
******************************************/
function getAbsoluteLeftPosition(control) {
    var left = control.offsetLeft;

    while (control = control.offsetParent) {
        left += control.offsetLeft;
    }

    return left + (isIE() ? window.screenLeft : window.screenX);
}
    
function getAbsoluteTopPosition(control) {
    var top = control.offsetTop;

    while (control = control.offsetParent) {
        top += control.offsetTop;
    }

    return top + (isIE() ? window.screenTop : window.screenY);
}

function getMasterAbsoluteLeft() {
    var master = document.getElementById("master");

    return getAbsoluteLeftPosition(master);
}

function getMasterAbsoluteTop() {
    var master = document.getElementById("master");

    return getAbsoluteTopPosition(master);
}

/****************************
   date & time picker
*****************************/
function doDatePickup(controlId) {
    clearMessage();

    var controlClientId = getClientId(controlId);
    var control = document.getElementById(controlClientId);

    var width = 310;
    var height = 210;

    var heightAdjustment = isIE() ? 1.4 : 1;
    
    var left = getAbsoluteLeftPosition(control);
    var top = getAbsoluteTopPosition(control) - height * heightAdjustment;

    // "DateControlClientId" should match server side    
    var url = 'DatePicker.aspx?' + 
        'DateControlClientId=' + controlClientId +
        '&' +
        'SelectedDate=' + control.value
        ;
    var windowTitle = 'calendar';
    var windowPosition = 'width=' + width + ',height=' + height + ',left=' + left + ',top=' + top + 
        ',titlebar=no,toolbar=no,status=no';
    
    window.open(url, windowTitle, windowPosition);
}

function doTimePickup(controlId) {
    clearMessage();

    var controlClientId = getClientId(controlId);
    var control = document.getElementById(controlClientId);

    var width = 320;
    var height = 140;

    var heightAdjustment = isIE() ? 1.5 : 0.9;
    
    var left = getAbsoluteLeftPosition(control);
    var top = getAbsoluteTopPosition(control) - height * heightAdjustment;

    // "TimeControlClientId" should match server side    
    var url = 'TimePicker.aspx?' + 
        'TimeControlClientId=' + controlClientId +
        '&' +
        'SelectedTime=' + control.value
        ;
    var windowTitle = 'clock';
    var windowPosition = 'width=' + width + ',height=' + height + ',left=' + left + ',top=' + top + 
        ',titlebar=no,toolbar=no,status=no';
    
    window.open(url, windowTitle, windowPosition);
}

/*****************************************
    misc
******************************************/
function changeColor(theColor) {
    window.event.srcElement.style.color = theColor;
}

function countCharacters(textbox, labelId, maxLimit)
{
    var lblCharCount = document.getElementById(labelId);
    var message;
    
    var left = maxLimit - textbox.value.length;
    
    if (left < 0)
    {
		textbox.value = textbox.value.substr(0, maxLimit);
		message = "(no more)";
	}
	else 
	{
		message = "(" + left + " character" + (left > 1 ? "s" : "") + " left)";
	}
			
	if (isIE())
		lblCharCount.innerText = message;
	else
		lblCharCount.textContent = message;
}

function hideArea(areaId) {
    theArea = document.getElementById(areaId);
	theArea.style.display = 'none';
}

function isIE() {
    return navigator.appName == "Microsoft Internet Explorer";
}

function isNotIE() {
    return navigator.appName != "Microsoft Internet Explorer";
}


function showArea(areaId) {
    theArea = document.getElementById(areaId);
    theArea.style.display = '';
    if (theArea.className == 'none')   // do not touch class name if it is not 'none'
        theArea.className = '';
}

function showAreaAt(anchor, deltaX, deltaY, areaId) {
    theArea = document.getElementById(areaId);
    theArea.style.display = '';
    if (theArea.className == 'none')   // do not touch class name if it is not 'none'
        theArea.className = '';

    //find the absolute position of the anchor
    // for IE only; for FF page is not centered
    if (typeof(anchor.textContent) == "undefined") {
        var curleft = curtop = 0;
        
        do {
            curleft += anchor.offsetLeft;
            curtop += anchor.offsetTop;
        } while (anchor = anchor.offsetParent);
        
        theArea.style.top = curtop - deltaY;
        theArea.style.left = curleft - deltaX;
    }
}
