WRA				= (typeof(WRA) == 'object') ? WRA : {};

/////////////////////////////////////////
// WRA.PageEdit

WRA.PageEdit =
{
	m_JumpTimerId : 0,
	m_Handler : null,
	m_PageName : '',
	m_PageIndex : 0,
	m_Params : null,
	m_Control : null
};

WRA.PageEdit.onKeyPress = function(event, handler, page_name, params)
{
	var keyCode = event.keyCode ? event.keyCode : event.which;
	if(keyCode != 13)	// VK_ENTER
		return;

	var srcElement = event.srcElement ? event.srcElement : event.target;
	var page_index = this.getJumpPage(srcElement);
	if(page_index < 0)
		return;
		
	this.unscheduleJump();
	this.doJump(handler, page_name, page_index, params, srcElement);
}

WRA.PageEdit.onKeyUp = function(event, handler, page_name, params)
{
	var srcElement = event.srcElement ? event.srcElement : event.target;
	this.scheduleJump(srcElement, handler, page_name, params);
}

WRA.PageEdit.scheduleJump = function(srcElement, handler, page_name, params)
{
	this.unscheduleJump();
	
	var page_index = this.getJumpPage(srcElement);
	if(page_index < 0)
		return;

	this.setJumpInfo(handler, page_name, page_index, params, srcElement);
	this.m_JumpTimerId = window.setTimeout('WRA.PageEdit.autoJump()', 1500);
}

WRA.PageEdit.autoJump = function()
{
	this.m_JumpTimerId = 0;
	this.doJump(this.m_Handler, this.m_PageName, this.m_PageIndex, this.m_Params, this.m_Control);
	this.clearJumpInfo();
}

WRA.PageEdit.unscheduleJump = function()
{
	if(this.m_JumpTimerId)
	{
		window.clearTimeout(this.m_JumpTimerId);
		this.m_JumpTimerId = 0;
		this.clearJumpInfo();
	}
}

WRA.PageEdit.doJump = function(handler, page_name, page_index, params, control)
{
	control.blur();
	params[page_name] = page_index;
	handler(params);
}

WRA.PageEdit.getJumpPage = function(srcElement)
{
	var page = parseInt(srcElement.value);
	if(isNaN(page) || (page <= 0))
		return -1;

	var page_size = parseInt(srcElement.getAttribute('page_size'));
	if(isNaN(page_size))
		return -1;
		
	var start = (page - 1) * page_size;
	
	var count = parseInt(srcElement.getAttribute('result_count'));
	if(!isNaN(count) && (count <= start))
		return -1;

	var page_start = parseInt(srcElement.getAttribute('page_start'));
	if(!isNaN(page_start) && (page_start == start))
		return -1;
	
	return start;
}

WRA.PageEdit.setJumpInfo = function(handler, page_name, page_index, params, control)
{
	this.m_Handler = handler;
	this.m_PageName = page_name;
	this.m_PageIndex = page_index;
	this.m_Params = params;
	this.m_Control = control;
}

WRA.PageEdit.clearJumpInfo = function()
{
	this.setJumpInfo(null, '', 0, null, null);
}

/////////////////////////////////////////
// WRA.DateTime

WRA.DateTime =
{
	Weekdays		: {
						Short : ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
						Long  : ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
					  },
	Months			: {
						Short : ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
						Long  : ['January', 'February', 'March', 'April', 'May', 'Jun', 'July', 'August', 'September', 'October', 'November', 'December']
					  },
	Indicators		: {
						Lower : { AM : 'am', PM : 'pm' },
						Upper : { AM : 'AM', PM : 'PM' }
					  },
	Locale			: 'en'
}

WRA.DateTime.getHour12 = function(hour)
{
	if(0 == hour)
		hour = 12;
	else if(12 < hour)
		hour -= 12;
	return hour;
}

WRA.DateTime.pad = function(time)
{
	return (time < 10) ? ('0' + time) : time;
}

WRA.DateTime.clockTime = function()
{
	var date = new Date();
	
	var weekday = this.Weekdays.Long[date.getDay()];
	var month = this.Months.Short[date.getMonth()];
	var day = date.getDate();
	var hour = date.getHours();
	var minute = date.getMinutes();
	
	var clock_time = '';
	if(this.Locale == 'fr')
	{
		clock_time = weekday + ',&nbsp;' + day + '&nbsp;' + month + '&nbsp;&nbsp;' + this.pad(hour) + ':' + this.pad(minute);
	}
	else // if(this.Locale == 'en')
	{
		var indicator = (hour < 12) ? this.Indicators.Upper.AM : this.Indicators.Upper.PM;
		hour = this.getHour12(hour);
		
		clock_time = weekday + ',&nbsp;' + month + '&nbsp;' + day + '&nbsp;&nbsp;'  + hour +          ':' + this.pad(minute) + '&nbsp;' + indicator;
	}
	
	return clock_time;
}

WRA.DateTime.updateClock = function(clock_id, permanent)
{
	var clock = document.getElementById(clock_id);
	var clock_time = this.clockTime();
	if(clock && (clock.innerHTML != clock_time))
		clock.innerHTML = clock_time;

	if(permanent)
		window.setTimeout("WRA.DateTime.updateClock('" + clock_id + "', true)", 1000);
}

WRA.DateTime.gridDate = function(date)
{
	var weekday = WRA.DateTime.Weekdays.Short[date.getDay()];
	var month = WRA.DateTime.Months.Short[date.getMonth()];
	var day = date.getDate();
	
	var grid_date = '';
	if(this.Locale == 'fr')
	{
		grid_date = weekday + ",&nbsp;" + month + "&nbsp;" + this.pad(day);
	}
	else // if(this.Locale == 'en')
	{
		grid_date = weekday + ",&nbsp;" + month + "/" + this.pad(day);
	}
	return grid_date;
}

WRA.DateTime.gridTime = function(time)
{
	var hour = Math.floor(time / 3600);
	var minute = Math.floor((time % 3600) / 60);

	var grid_time = '';
	if(this.Locale == 'fr')
	{
		grid_time = this.pad(hour) + ":" + this.pad(minute);
	}
	else // if(this.Locale == 'en')
	{
		var indicator = (hour < 12) ? WRA.DateTime.Indicators.Upper.AM : WRA.DateTime.Indicators.Upper.PM;
		hour = this.getHour12(hour);

		grid_time = this.pad(hour) + ":" + this.pad(minute) + "&nbsp;" + indicator;
	}
	return grid_time;
}

/////////////////////////////////////////
// WRA.Timeout

WRA.Timeout =
{
	m_Data  : []
}

WRA.Timeout.eval = function(source, func, args)
{
	this.clear(source);
	func.apply(func, args);
}

WRA.Timeout.delay = function(source, func, args, delay)
{
	this.clear(source);
	var data = { func : func, args : args };
	data.timer_id = window.setTimeout("WRA.Timeout.evalDelayed('" + source + "')", delay);
	this.m_Data[source] = data;
}

WRA.Timeout.evalDelayed = function(source)
{
	var data = this.m_Data[source];
	if(data)
	{
		data.func.apply(data.func, data.args);
		delete this.m_Data[source];
	}
}

WRA.Timeout.clear = function(source)
{
	var data = this.m_Data[source];
	if(data)
	{
		if(data.timer_id)
			window.clearTimeout(data.timer_id);
		delete this.m_Data[source];
	}
}

/////////////////////////////////////////
// WRA.Utils

WRA.Utils = (typeof(WRA.Utils) == 'object') ? WRA.Utils : {};

WRA.Utils.showElementById = function(id, show)
{
	var element_visible = false;
	var element = document.getElementById(id);
	if(element)
	{
		element_visible = (0 < element.offsetWidth) && (0 < element.offsetHeight);
		element.style.display = (show) ? 'block' : 'none';
	}
	return element_visible != show;
}

WRA.Utils.isElementVisible = function(element)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	return element && (0 < element.offsetWidth) && (0 < element.offsetHeight);
}

WRA.Utils.deleteElementById = function(id)
{
	this.deleteElement(document.getElementById(id));
}

WRA.Utils.deleteElement = function(element)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	if(element && element.parentNode)
		element.parentNode.removeChild(element);
}

WRA.Utils.selectedOption = function(select)
{
	if(typeof(select) == 'string')
		select = document.getElementById(select);
	if(!select || !select.options)
		return null;
	
	var index = select.selectedIndex;
	var options = select.options;
	return ((0 <= index) && (index < options.length)) ? options[index] : null;
}

WRA.Utils.selectOption = function(select, value)
{
	if(typeof(select) == 'string')
		select = document.getElementById(select);
	if(!select || !select.options)
		return null;
	
	var options = select.options;
	for(var index = 0; index < options.length; index++)
	{
		if(options[index].value == value)
		{
			select.selectedIndex = index;
			return options[index];
		}
	}
	return null;
}

WRA.Utils.checkCB = function(checkbox, value)
{
	if(typeof(checkbox) == 'string')
		checkbox = document.getElementById(checkbox);
	if(!checkbox)
		return;

	if(1 < arguments.length)
		checkbox.checked = value ? true : false;
	else
		value = checkbox.checked;
	return value;
}

WRA.Utils.controlValue = function(control)
{
	if(typeof(control) == 'string')
		control = document.getElementById(control);
	if(!control)
		return '';
		
	switch(control.tagName.toLowerCase())
	{
		case 'select':
			var selectedOption = this.selectedOption(control);
			return selectedOption ? selectedOption.value : '';
			
		case 'input':
			switch(control.type.toLowerCase())
			{
				case 'checkbox':
					return control.checked ? '1' : '0';

				case 'text':
				case 'password':
					return control.value;
			}
			break;
	}
	
	return '';
}

WRA.Utils.setElementInnerHtml = function(element, html)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	if(element)
		element.innerHTML = html;
}

WRA.Utils.copyElementInnerHtml = function(target, source)
{
	if(typeof(target) == 'string')
		target = document.getElementById(target);
	if(typeof(source) == 'string')
		source = document.getElementById(source);
	if(target && source)
		target.innerHTML = source.innerHTML;
}

WRA.Utils.setElementClassName = function(element, name)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	if(element)
		element.className = name;
}

WRA.Utils.setElementVisibility = function(element, visible)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	if(element)
		element.style.visibility = visible ? 'visible' : 'hidden';
}

WRA.Utils.setElementInlineDisplay = function(element, visible)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	if(element)
		element.style.display = visible ? 'inline' : 'none';
}

WRA.Utils.setElementBlockDisplay = function(element, visible)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	if(element)
		element.style.display = visible ? 'block' : 'none';
}

WRA.Utils.focusElement = function(element)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	if(element && element.focus)
		element.focus();
}

WRA.Utils.selectElement = function(element)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	if(element && element.select)
		element.select();
}

WRA.Utils.getElementAttrib = function(element, attrib)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	return (element && element.getAttribute) ? element.getAttribute(attrib) : '';
}

WRA.Utils.setElementAttrib = function(element, attrib, value)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	if(element)
	{
		if((typeof(value) != "undefined") && element.setAttribute)
			element.setAttribute(attrib, value);
		else if((typeof(value) == "undefined") && element.removeAttribute)
			element.removeAttribute(attrib);
	}
}

WRA.Utils.elementHeight = function(element, height)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	if(!element)
		return 0;

	if(arguments.length <= 1)
		return element.offsetHeight;
	if(typeof(height) == 'number')
		element.style.height = Math.max(height, 0) + 'px';
	else if(typeof(height) == 'string')
		element.style.height = height;
	
	return height;
}

WRA.Utils.elementWidth = function(element, width)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	if(!element)
		return 0;

	if(arguments.length <= 1)
		return element.offsetWidth;
	if(typeof(width) == 'number')
		element.style.width = Math.max(width, 0) + 'px';
	else if(typeof(width) == 'string')
		element.style.width = width;
	
	return width;
}

WRA.Utils.elementScrollTop = function(element, top)
{
	if(typeof(element) == 'string')
		element = document.getElementById(element);
	if(!element)
		return 0;

	if(arguments.length <= 1)
		return element.scrollTop;
	else
		element.scrollTop = top;
	
	return top;
}

WRA.Utils.docScrollY = function()
{
	if(window.scrollY)
		return window.scrollY; // Mozilla
	else if(document.body.parentNode && document.body.parentNode.scrollTop)
		return document.body.parentNode.scrollTop; // IE
	return 0;
}