// $Id: ControlSupport.js 334 2007-05-22 01:25:58Z nwong $

function extractNumber(obj, decimalPlaces, allowNegative)
{
	var temp = obj.value;
	var reg0Str = '[0-9]*';

	if (decimalPlaces > 0)
       reg0Str += '\.?[0-9]{0,' + decimalPlaces + '}';
   else if (decimalPlaces < 0)
       reg0Str += '\.?[0-9]*';

	reg0Str = allowNegative ? '^-?' + reg0Str : '^' + reg0Str;
	reg0Str = reg0Str + '$';

	var reg0 = new RegExp(reg0Str);
	if (reg0.test(temp)) return true;

	var reg1Str = '[^0-9' + (decimalPlaces != 0 ? '.' : '')  + (allowNegative ? '-' : '') + ']';
	var reg1 = new RegExp(reg1Str, 'g');
	temp = temp.replace(reg1, '');

	if (allowNegative) 
	{
		// replace extra negative
		var hasNegative = temp.length > 0 && temp.charAt(0) == '-';
		var reg2 = /-/g;

		temp = temp.replace(reg2, '');
		if (hasNegative) temp = '-' + temp;
	}

	if (decimalPlaces != 0) 
	{
		var reg3 = /\./g;
        var reg3Array = reg3.exec(temp);

       if (reg3Array != null) 
       {
	        var reg3Right = temp.substring(reg3Array.index + reg3Array[0].length);
	        reg3Right = reg3Right.replace(reg3, '');
	        reg3Right = decimalPlaces > 0 ? reg3Right.substring(0, decimalPlaces) : reg3Right;
	        temp = temp.substring(0,reg3Array.index) + '.' + reg3Right;
       }
   }
	obj.value = temp;
}

function blockNonNumbers(obj, e, allowDecimal, allowNegative)
{
	var key;
	var isCtrl = false;
	var keychar;
	var reg;

	if(window.event) 
	{
		key = e.keyCode;
		isCtrl = window.event.ctrlKey;
	}
	else if(e.which) 
	{
		key = e.which;
		isCtrl = e.ctrlKey;
	}

	if (isNaN(key)) return true;

	keychar = String.fromCharCode(key);

	// check for backspace or delete, or if Ctrl was pressed
	if (key == 8 || isCtrl)
		return true;

	reg = /\d/;
	var isFirstN = allowNegative ? keychar == '-' && obj.value.indexOf('-') == -1 : false;
	var isFirstD = allowDecimal ? keychar == '.' && obj.value.indexOf('.') == -1 : false;

	return isFirstN || isFirstD || reg.test(keychar);
}

function validateEmail(obj)
{
    var email = obj.value;
	var at="@"
	var dot="."
	var lat=email.indexOf(at);
	var lstr=email.length;
	var ldot=email.indexOf(dot);
	
	if (email.indexOf(at)==-1)
		   return false

	if (email.indexOf(at)==-1 || email.indexOf(at)==0 || email.indexOf(at)==lstr)
		   return false

	if (email.indexOf(dot)==-1 || email.indexOf(dot)==0 || email.indexOf(dot)==lstr)
		    return false

    if (email.indexOf(at,(lat+1))!=-1)
		    return false

    if (email.substring(lat-1,lat)==dot || email.substring(lat+1,lat+2)==dot)
		    return false

    if (email.indexOf(dot,(lat+2))==-1)
		    return false
		
    if (email.indexOf(" ")!=-1)
		    return false
		    
    return true					
}

function isLeapYear(val)
{
  // check for leap year
    if((val%4==0 && val%100!=0) || (val%400==0))
		return true;
		
	return false;

}

function checkSelectDate(dayObj, monthObj, yearObj)
{

	var mm = monthObj.value;
	var dd = null;
	
	if (dayObj == null)
	    return true;
    else
        dd = dayObj.value;
    // return false = cancel postback
    
	switch(mm)
	{
		case '2':
			var yy = 0;
			if(yearObj!=null)
			    yy = yearObj.value;
			    
			var maxDay = 28;
			if(yy > 0)
			{
				// check if leap year
				if(isLeapYear(yy) && dd >= 29)
				{
					dayObj.value = 29;					
					return false;
				}
				else if(dd > 28)
				{
					dayObj.value = 28;
					return false;
				}
			}
			else if(dd > 28)
			{
				dayObj.value = 28;
				return false;
			}
			break;
			
		case '4':
		case '6':
		case '9':
		case '11':
			if(dd>30)
			{
			    dayObj.value = 30;	// select the greatest date
			    return false; 
			}
			break;
	}	
	return true;    // success
}

function navCC(item1, item2Id)
{ 			
    var item2 = document.getElementById(item2Id);
    if(item1.value.length > 3)
	{
	    if(item2.value.length > 0)
		   item2.value = '';
        item2.focus();
	}
}

function centerProgressWindow(elem, elemWidth, elemHeight, overlayID)
{
    if(elem!=null)
    {   
        var top = getWindowScrollTop() + getWindowHeight() / 2;
        var left = getWindowScrollLeft() + getWindowWidth() / 2 ;
        var x = left - elemWidth /2;
        var y = top - elemHeight/2;
        
        elem.style.left = x;
        elem.style.top = y;
        
        var overlay = document.getElementById(overlayID);        
        if(overlay!=null)
        {
            overlay.style.left = x -2;
            overlay.style.top = y -2;
        }
    }
}

function isIE()
{
    var ie=document.all && !window.opera;
    return ie;
}

function getWindowHeight()
{
	var domclientWidth=document.documentElement && parseInt(document.documentElement.clientWidth) || 100000;
	this.standardbody=(document.compatMode=="CSS1Compat")? document.documentElement : document.body;
	return (isIE())? this.standardbody.clientHeight: window.innerHeight;
}

function getWindowWidth()
{
	var domclientWidth=document.documentElement && parseInt(document.documentElement.clientWidth) || 100000;
	this.standardbody=(document.compatMode=="CSS1Compat")? document.documentElement : document.body;
	return (isIE())? this.standardbody.clientWidth : (/Safari/i.test(navigator.userAgent))? window.innerWidth : Math.min(domclientWidth, window.innerWidth-16);
}

function getWindowScrollTop()
{
    var domclientWidth=document.documentElement && parseInt(document.documentElement.clientWidth) || 100000;
	this.standardbody=(document.compatMode=="CSS1Compat")? document.documentElement : document.body;
	
	return (isIE())? this.standardbody.scrollTop : window.pageYOffset;
}

function getWindowScrollLeft()
{
    var domclientWidth=document.documentElement && parseInt(document.documentElement.clientWidth) || 100000;
	this.standardbody=(document.compatMode=="CSS1Compat")? document.documentElement : document.body;
	return (isIE())? this.standardbody.scrollLeft : window.pageXOffset;
}

function isNumber(keyCode)
{
    if(keyCode >=48 && keyCode<= 57)
        return true;
    return false;
}

function isLetter(keyCode)
{
    if((keyCode >=65 && keyCode<= 90) || (keyCode >= 97 && keyCode <= 122))
        return true;
    return false;
}

function textBoxLengthPostback(form, elem, len, e)
{
    var key;
	var isCtrl = false;
	var keychar;
	var reg;

	if(window.event) 
	{
		key = e.keyCode;
		isCtrl = window.event.ctrlKey;
	}
	else if(e.which) 
	{
		key = e.which;
		isCtrl = e.ctrlKey;
	}


	keychar = String.fromCharCode(key);

	// check for backspace or delete, or if Ctrl was pressed
	if (!isLetter(key) && !isNumber(key) || isCtrl)
		return true;
    
    // force the textbox to do postback
    if(elem.value.length == len)
        setTimeout('__doPostBack(\'' + elem.id + '\',\'\')', 0);
}

var f1;
//Form validation section
function OnLoad()
{
	f1 = document.forms[0];
	LoadTabIndex();
	try
	{
		if(setFocus)
		{
			setTimeout("setFocus();", 200);
		}
	}
	catch(err){}
}

function IsNumericFieldEmpty(o)
{
	return (o.value.length == 0 || parseFloat(o.value) == 0.0);
}

function IsNumericValueEmpty(v)
{
	return (v.length == 0 || parseFloat(v) == 0.0);
}

function CheckNumericField(s, msg, blankOK)
{
	o = f1[s];
	if (IsNumericFieldEmpty(o))
	{
		if (msg) alert(msg + ' is a mandatory field');
		o.focus();
		return false;
	}
	return true;
}

function CheckTextNumericField(s, msg)
{
	o = f1[s];
	if (parseFloat(o.value) == 0.0 || isNaN(o.value))
	{
		if (msg) alert(msg);
		o.focus();
		return false;
	}
	return true;
}

function CheckddlField(s, msg)
{
	o = f1[s];
	if (o.selectedIndex == 0)
	{
		alert(msg + ' is a mandatory field');
		o.focus();
		return false;				
	}
	return true;
}

function EnableFields(fields)
{
	for (var i = 0; i < fields.length; i++) EnableField(fields[i]);
}

function DisableFields(fields)
{
	for (var i = 0; i < fields.length; i++) DisableField(fields[i]);
}

function EnableField(field)
{
	if (field.disabled)
	{
		field.disabled = false;
		field.className = '';
	}
}

function EnableFieldById(fieldId)
{
	EnableField(document.getElementById(fieldId));
}

function DisableField(field, dv)
{
    if (dv == null) dv = (field.options) ? 0 : '';
	if (field.options) field.selectedIndex = dv
	else if (field.type == "checkbox") field.checked = (dv != '')
	else field.value = dv;
	field.disabled = true;
	field.className = 'disabled';
}

function ReadOnlyField(field, YN)
{
	field.readOnly = YN;
	if (YN)
	{
		field.className = 'disabled';
	}
	else
	{
		field.className = '';
	}
}

function LeftPad(s, padchar, maxlen)
{
	var str;
	var padding = '';

	str = s.toString();
	for (var i = 0; i < maxlen - str.length; i++)
		padding = padding + padchar;
	
	return padding + s;
}

function LTrim(s) 
{ 
	return s.replace(/^\s*/, '');
} 

function RTrim(s) 
{ 
	return s.replace(/\s*$/, ''); 
} 

function Trim(s) 
{ 
	return RTrim(LTrim(s)); 
}

// Number section
function OnUpNumber(e, o, w)
{
	var legal = new RegExp('[^0-9+,\-]', 'g');
	if (o.value.search(legal) != -1)
		o.value = o.value.replace(legal, '');	
	if (o.value.length == w && KeyCodeNumeric(EventCode(e))) AutoTab(e, o);
}

function OnUpFormattedNumber(e, o, maxL)
{
	var legal = new RegExp('[^0-9+,]', 'g');
	if (o.value.search(legal) != -1)
		o.value = o.value.replace(legal, '');
	if (KeyCodeNumeric(EventCode(e))) o.value = FormatNumber(o.value, 0, ',', maxL);
}

function OnUpDecimal(e, o, w)
{
	var legal = new RegExp('[^0-9.+,]', 'g');
	if (o.value.search(legal) != -1)
		o.value = o.value.replace(legal, '');
	if (o.value.length == w) AutoTab(e, o);
}

function OnUpText(e, o)
{
	var illegal = new RegExp('[><&]', 'g');
	if (o.value.search(illegal) != -1)
		o.value = o.value.replace(illegal, '');
}

function ValidDouble(o, sign, precision, comma)
{
	var v = o.value;
	
	v = FormatNumber(v,precision, comma);
	
	//Validate sign
	if ((sign == "+") && (v < 0)){
		o.value = FormatNumber(0,precision, "");
			
	}else if ((sign == "-") && (v > 0)){
		o.value = FormatNumber(0,precision, "");
	}else{
		o.value = v;
	}
}

function ValidFormattedNumber(o, maxL)
{
	o.value = FormatNumber(o.value, 0, ',', maxL);
}

function ValidFormattedDecimal(o, maxL, precision)
{
	o.value = FormatNumber(o.value, precision, ',', maxL);
}

function UnformatNumber(num)
{
	return num.toString().replace(/\$|\,/g,'');
}

function FormatNumber(num, precision, comma, length) 
{
	if (!num) num = 0;	
	num = UnformatNumber(num);
	if(isNaN(num)) num = '0';
	if(isNaN(precision)) precision = 2;
	if(!comma) comma = '';
	 
	var factor = Math.pow(10, precision);
	
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*factor+0.50000000001);
	cents = LeftPad((num%factor), "0", precision);
	num = Math.floor(num/factor).toString();
	
	if (length)
	{
		if (precision > 0)
		{
			if ((num + '.' + cents).length > length)
				num = num.substring(0, length - ('.' + cents).length);	
		}
		else
		{	
			if (num.length > length)
				num = num.substring(0, length);	
		}
	}	
	
	//Add user specified delimiter after each thousands
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++){
		num = num.substring(0,num.length-(4*i+3))+ comma +
		num.substring(num.length-(4*i+3));
	}
	
	if (precision > 0) {
		return (((sign)?'':'-') + num + '.' + cents);

	}else{
		return (((sign)?'':'-')  + num);
	}
}

//Form section
function Changed(o)
{
	return (o.value != o.current);
}

function AutoTab(e, o)
{
	if (EventCode(e) != 9 && EventCode(e) != 16)
	{
		i = (getIndex(o) + 1) % f1.length;
		while (f1[i].readOnly || f1[i].disabled || f1[i].type == 'hidden') i = (i + 1) % f1.length;
		f1[i].focus();	
		if (f1[i].select) f1[i].select();
	}
}

function FocusField(o)
{
	if (!o.readOnly && !o.disabled)
	{
		o.focus();
		if (o.select) o.select();
	}
}

function getIndex(input) 
{
	var index = -1, i = 0, found = false;
	while (i < f1.length && index == -1)
		if (f1[i] == input)index = i;
		else i++;
	return index;
}

var arrTabIndex = new Array();
function LoadTabIndex()
{
	var obj = null;
	var index = null;
	var id = null;
	for (var i=0; i < f1.elements.length; i++) 
	{
		obj = f1.elements[i];

        if (obj.type != "hidden")
        {
	        index = obj.getAttribute("tabindex");
	        if (index > -1) 
	        {	
                arrTabIndex[index] = obj;
	        }
		}
	}
	
	var inputElements = document.getElementsByTagName('input');
	for (var i=inputElements.length-1; i >= 0; i--)
	{
	    if (inputElements[i].type == "image")
	    {
	        index = inputElements[i].getAttribute("tabindex");
	        if (index > -1) 
		    {	
                arrTabIndex[index] = inputElements[i];
		    }
	    }
	}
}

function DisableTab(e, o)
{
	if (o.attributes['lastKP'] != null) o.attributes['lastKP'].value = EventCode(e);
	if (EventCode(e) == 9)
	{
		if (!IsShiftKey(e))
			CancelEvent(e);
		else 
		{
			CancelEvent(e);
			o.attributes['lastKP'].value = '9shift';
		}
	}
}

function TrapTab(o)
{
	if (o.attributes['lastKP'].value == 9) 
	{
		var id = o.id.split('_');
		var i = (o.getAttribute("tabindex") + 1) % arrTabIndex.length;
		while (!arrTabIndex[i] || arrTabIndex[i].readOnly || arrTabIndex[i].disabled || arrTabIndex[i].type == 'hidden') i = (i + 1) % arrTabIndex.length;
		
		if (arrTabIndex[i].select) arrTabIndex[i].select();
		arrTabIndex[i].focus();	
	}
	else if (o.attributes['lastKP'].value == '9shift')
	{
		var id = o.id.split('_');
		var i = (o.getAttribute("tabindex") - 1) % arrTabIndex.length;
		while (!arrTabIndex[i] || arrTabIndex[i].readOnly || arrTabIndex[i].disabled || arrTabIndex[i].type == 'hidden') i = (i - 1) % arrTabIndex.length;
		
		if (arrTabIndex[i].select) arrTabIndex[i].select();
		arrTabIndex[i].focus();	
	}
}

/*
digits > 0 -- round to the specified number of decimal places
digits = 0 -- round to the nearest integer
digits < 0 -- round to the left of the decimal point
	digits = -1 -- round to the nearest ten
	digits = -2 -- round to the nearest hundred
	digits = -3 -- round to the nearest thousand
	...
*/
function roundTo(number, digits)
{
	var scale;
	
	if(digits == null) 
	{ 
		scale = 1; 
	} 
	else 
	{ 
		scale = Math.pow(10, digits); 
	}
	
	return Math.round(number * scale) / scale; 
}

//Example: On enter run the Search function
//onKeyPress="KeyPress(event, [13], 'Search()');"
function KeyPress(e, aKey, sFunc)
{
	for (var i = 0; i < aKey.length; i++)
	{
		if (EventCode(e) == aKey[i]) return(eval(sFunc));
	}
}

function KeyCodeNumeric(KeyCode)
{
	return ((KeyCode >= 48 && KeyCode <= 57) || (KeyCode >= 96 && KeyCode <= 105));
}

//Firefox / IE compatibility functions
function EventCode(e)
{
	if (window.event)
		return window.event.keyCode;
	else if (e)
		return e.which;
	else
		return null;
}

function CancelEvent(e)
{
	e = (window.event) ? window.event : e;
	if (e.returnValue) { e.returnValue = false; }
	else if (e.preventDefault) { e.preventDefault(); } 
}

function FireEvent(o, func)
{
	if (document.createEvent) 
	{
		var evObj = document.createEvent('HTMLEvents');
		evObj.initEvent(func, false, false );
		o.dispatchEvent(evObj);
	}
	else if (document.createEventObject) { o.fireEvent('on' + func); }
}

function IsShiftKey(e)
{
	return e.shiftKey;
}

function formatCurrency(anynum, showDecimal)
{
	 //returns number as string in $xxx,xxx.xx format. 
    anynum = "" + eval(anynum);  //evaluate (in case an expression sent) 
    intnum = parseInt(anynum);  //isolate integer portion 
    intnum = Math.abs(intnum); 
    intstr = "" + intnum; 
    //add comma in thousands place. 
    if (intnum >= 1000) 
    { 
		intlen = intstr.length;
		temp1 = parseInt("" + (intnum / 1000));
		temp2 = intstr.substring(intlen - 3, intlen);
		intstr = temp1 + "," + temp2;
    } 
    
    if (intnum >= 1000000)
    { 
        intlen = intstr.length;
        temp1 = parseInt("" + (intnum / 1000000));
        temp2 = intstr.substring(intlen - 7, intlen);
        intstr = temp1 + "," + temp2;
    } 

	if(showDecimal)
	{
		decnum = Math.abs(parseFloat(anynum) - parseInt(anynum)); //isolate decimal portion 
		decnum = decnum * 100; // multiply decimal portion by 100. 
		decstr = "" + Math.abs(Math.round(decnum));
		if (decstr.length > 2) {decstr = decstr.substring(0, 2);} 
		while (decstr.length < 2) {decstr = "0" + decstr;} 
		retval = intstr + "." + decstr;
    }
    else
    {
		retval = intstr;
    }
    
    if (anynum < 0) 
    { 
		retval ="(" + retval + ")";
    }
    
    return "$" + retval;
}

function OnFormKeyDown()
{
    //8 = Backspace
    if (EventCode(this.event) == 8
        && this.event.srcElement.tagName != "INPUT" 
        && this.event.srcElement.tagName != "TEXTAREA")
    {
        event.cancelBubble = true;
        event.returnValue = false;
        return false;
    }
}

function ConvertToDateFromString(val)
{
    if(val.indexOf('/')>=0)
    {
        var dArray = val.split('/');
        if(dArray.length == 3)
        {
            if(dArray[0]!='' && dArray[1]!='' && dArray[2]!='')
                return new Date(dArray[2], dArray[1], dArray[0], 0, 0, 0);
        }
    }
    return null;
}

function DateDiff(datePart, dt1, dt2)
{
    var dt = new Date();    
    dt.setTime(Math.abs(dt1.getTime() - dt2.getTime()));
    var timediff = dt.getTime();
  
    if(datePart.toUpperCase()=='D')
        return Math.floor(timediff / (1000 * 60 * 60 * 24)); 
    
    return -1;
}

function setRadioButtonFocus(id)
{
    var elem = document.getElementById(id); 
    if(elem!=null) 
    { 
        elem.focus();         
    }
}

// This must be the last line in the js file
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
