function showHide(id)
{
	var el = document.getElementById(id);
	el.style.display = (el.style.display == 'none') ? '' : 'none';
}

function flashmsg(id)
{
	if (!id) id = 'reportarea';
	var msg = Ext.get('flashmsg');
	msg.center(Ext.get(id));
	msg.frame("ff0000", 2, {duration:1});
	msg.fadeOut({
		endOpacity:0,
		easing:'easeOut',
		duration:.5,
		remove:false,
		useDisplay:false
	});
}

function addCssClass(id, cls)
{
	var el = document.getElementById(id);
	if (!jscss('check', el, 'invalid')) jscss('add', el, cls);
}

function removeCssClass(id, cls)
{
	var el = document.getElementById(id);
	if (jscss('check', el, 'invalid')) jscss('remove', el, cls);
}

/*
 * http://www.onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html
 * 
 * a = action = swap, add, remove, check
 * o = object
 * c1 = name of first class
 * c2 = name of second class
 */
function jscss(a,o,c1,c2)
{
  switch (a){
    case 'swap':
      o.className=!jscss('check',o,c1)?o.className.replace(c2,c1): o.className.replace(c1,c2);
    break;
    case 'add':
      if(!jscss('check',o,c1)){o.className+=o.className?' '+c1:c1;}
    break;
    case 'remove':
      var rep=o.className.match(' '+c1)?' '+c1:c1;
      o.className=o.className.replace(rep,'');
    break;
    case 'check':
    default:
      return new RegExp('\\b'+c1+'\\b').test(o.className)
    break;
  }
}

// Fix for floating point precision problems
function fix_float(v)
{
	if (v == Infinity || v == NaN)
		v = 0;

	var s = String(v);

	if (s.indexOf('.999') > -1)
		v = v.toFixed(0);
	else if (s.indexOf('999') > -1)
	{
		s = s.substring(0, s.indexOf('999')+1);
		v = Number(s).toPrecision(s.length - ((v > 0 && v < 1) ? 3 : 2));
	}
	else if (s.indexOf('000') > -1)
	{
		s = s.substring(0, s.indexOf('000')+1);
		v = Number(s).toPrecision(s.length - ((v > 0 && v < 1) ? 3 : 2));
	}

	return Number(v);
}

// Renderer to show a field as non-editable, but shaded negative
function renderer_noedit(v,p)
{
	p.css = "noedit";
	return renderer_number(v);
}

// Renderer to make negative numbers red and positive number with a plus
function renderer_number(v)
{
	if(v < 0) return '<span style="color:red;">' + v + '</span>';
	if(v == 0) return 0;
	return '+' + v;
}

// Renderer to make negative numbers red and positive numbers plain
function renderer_naturalnumber(v)
{
	if(v < 0) return '<span style="color:red;">' + v + '</span>';
	if(v == 0) return 0;
	return v;
}

// Renderer to round a number to the nearest 0.5
function renderer_roundfte(v)
{
	var raw = Math.abs(v);
	var mod = ((raw * 10) % 5);

	if (mod > 0)
		raw += Number((5 - mod) / 10);

	if (v < 0)
		raw *= -1;

	return raw;
}

// Remove leading and trailing spaces from string
String.prototype.trim = function()
{
	return this.replace(/^\s*(\b.*\b|)\s*$/, '$1');
}

// Add an event handler to an object
function addEvent(obj, evType, fn, useCapture)
{
	if (obj.addEventListener)
	{
		obj.addEventListener(evType, fn, useCapture);
		return true;
	}
	else if (obj.attachEvent)
	{
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	}
	else
	{
		alert("Handler could not be attached");
	}
} 

// Remove an event handler from an object
function removeEvent(obj, evType, fn, useCapture)
{
	if (obj.removeEventListener)
	{
		obj.removeEventListener(evType, fn, useCapture);
		return true;
	}
	else if (obj.detachEvent)
	{
		var r = obj.detachEvent("on"+evType, fn);
		return r;
	}
	else
	{
		alert("Handler could not be removed");
	}
}

// Get the target element from any given event
function getEventTarget(e)
{
	var targ = null;

	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;

	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;

	return targ;
}

function userKey (e)
{
	var code;
	if (!e) var e = window.event;
	if (e.keyCode) code = e.keyCode;
	else if (e.which) code = e.which;
	return code;
}

function calcScreenCenter()
{
	var s = new Array();
	s['width'] = screen.width;
	s['height'] = screen.height;
	return s;
}

function getViewportSize()
{
	var w = 0;
	var h = 0;
	//IE
	if(!window.innerWidth)
	{
		//strict mode
		if(!(document.documentElement.clientWidth == 0))
		{
			w = document.documentElement.clientWidth;
			h = document.documentElement.clientHeight;
		}
		//quirks mode
		else
		{
			w = document.body.clientWidth;
			h = document.body.clientHeight;
		}
	}
	//w3c
	else
	{
		w = window.innerWidth;
		h = window.innerHeight;
	}
	return {width:w,height:h};
}

function getViewportCenter()
{
	var hWnd = (arguments[0] != null) ? arguments[0] : {width:0,height:0};
	var _x = 0;
	var _y = 0;
	var offsetX = 0;
	var offsetY = 0;
	//IE
	if(!window.pageYOffset)
	{
		//strict mode
		if(!(document.documentElement.scrollTop == 0))
		{
			offsetY = document.documentElement.scrollTop;
			offsetX = document.documentElement.scrollLeft;
		}
		//quirks mode
		else
		{
			offsetY = document.body.scrollTop;
			offsetX = document.body.scrollLeft;
		}
	}
	//w3c
	else
	{
		offsetX = window.pageXOffset;
		offsetY = window.pageYOffset;
	}
	_x = ((getViewportSize().width-hWnd.width)/2)+offsetX;
	_y = ((getViewportSize().height-hWnd.height)/2)+offsetY;
	return{x:_x,y:_y};
}

function loadCalendar(path, id)
{
	centerPopup(path + 'calendar.php?id=' + id, 'calendar', 150, 200, false);
}

function centerPopup(url, windowName, width, height, scrollable)
{
	var s = calcScreenCenter();
	var t = (s['height'] / 2) - (height / 2);
	var l = (s['width'] / 2) - (width / 2);

	scrollable = (scrollable) ? ',scrollbars=yes' : ',scrollbars=no';
	var myWin = window.open(url, windowName, 'width=' + width + ',height=' + height + ',top=' + t + ',left=' + l + ',toolbar=no,status=yes,resizable=yes' + scrollable);
}

function maximizePopup(url, windowName)
{
	var h = screen.height-150;
	var w = screen.width-50;
	var s = calcScreenCenter();
	var t = (s['height'] / 2) - (h / 2);
	var l = (s['width'] / 2) - (w / 2);
	var myWin = window.open(url, windowName, 'width=' + w + ',height=' + h + ',top=' + t + ',left=' + l + ',toolbar=no,status=yes,resizable=yes,scrollbars=yes');
}

function centerLayer(oLayer, width, height)
{
	var point = getViewportCenter();
	oLayer.style.position = 'absolute';
	oLayer.style.display = '';
	oLayer.style.left = (point.x - (width/2))+"px";
	oLayer.style.top = (point.y - (height/2))+"px";
}

function getUrlArg (theArgName)
{
	var sArgs = location.search.slice(1).split('&');
	var r = '';
	for (var i = 0; i < sArgs.length; i++)
	{
		if (sArgs[i].slice(0,sArgs[i].indexOf('=')) == theArgName)
		{
			r = sArgs[i].slice(sArgs[i].indexOf('=')+1);
			break;
		}
	}
	return (r.length > 0 ? unescape(r).split(',') : '')
}

function showHelp(url)
{
	centerPopup(url, 'EchelonContextHelp', 450, 550, true);
}

function getRadioOptionById(frm, htmlId)
{
	var id = -1;

	for (var i=0; i<frm.elements.length; i++)
	{
		if (frm.elements[i].name == htmlId && frm.elements[i].checked)
			id = frm.elements[i].value;
	}

	return id;
}
