// #############################################################################
// ##	VUBAI CLIENTSIDE FRAMEWORK
// ##	Global Include File
// ##
// ##	$Revision: 33 $
// ##	$Author: a.barani $
// ##	$Date: 2009-10-27 01:03:51 +0100(mar, 27 ott 2009) $
// #############################################################################

// #############################################################################
// Browser detection and limitation workarounds

var userAgent = navigator.userAgent.toLowerCase();
var bIsOpera  = ((userAgent.indexOf('opera') != -1) || (typeof(window.opera) != 'undefined'));
var bIsSaf    = ((userAgent.indexOf('applewebkit') != -1) || (navigator.vendor == 'Apple Computer, Inc.'));
var bIsWebtv  = (userAgent.indexOf('webtv') != -1);
var bIsIe     = ((userAgent.indexOf('msie') != -1) && (!bIsOpera) && (!bIsSaf) && (!bIsWebtv));
var bIsIe4    = ((bIsIe) && (userAgent.indexOf('msie 4.') != -1));
var bIsMoz    = ((navigator.product == 'Gecko') && (!bIsSaf));
var bIsKon    = (userAgent.indexOf('konqueror') != -1);
var bIsNs     = ((userAgent.indexOf('compatible') == -1) && (userAgent.indexOf('mozilla') != -1) && (!bIsOpera) && (!bIsWebtv) && (!bIsSaf));
var bIsNs4    = ((bIsNs) && (parseInt(navigator.appVersion, 10) == 4));
var bIsMac    = (userAgent.indexOf('mac') != -1);

// Catch possible bugs with WebTV and other older browsers
var bIsRegexp = (window.RegExp) ? true : false;

// Help out old versions of IE that don't understand element.style.cursor = 'pointer'
var sPointerCursor = (bIsIe ? 'hand' : 'pointer');

/**
* Ritorna l'elemento HTML specificato
*
* @param	string	HTML Id
*
* @return	mixed	null se non trovato, object se trovato
*/
function fetch_element(html_id)
{
	if (document.getElementById)
	{
		return document.getElementById(html_id);
	}
	else if (document.all)
	{
		return document.all[html_id];
	}
	else if (document.layers)
	{
		return document.layers[html_id];
	}
	else
	{
		return null;
	}
}

/**
* Ritorna l'elemento in base al nome della tag HTML
*
* @param	object	Oggetto parent (eg: document)
* @param	string	Nome tag (eg: 'td')
*
* @return	array
*/
function fetch_tags(iParentObject, sTag)
{
	if (iParentObject === null)
	{
		return [];
	}
	else if (typeof iParentObject.getElementsByTagName != 'undefined')
	{
		return iParentObject.getElementsByTagName(sTag);
	}
	else if (iParentObject.all && iParentObject.all.tags)
	{
		return iParentObject.all.tags(sTag);
	}
	else
	{
		return [];
	}
}

/**
 * Gestisce gli eventi su browser differenti ed
 * evita la replicazione degli stessi su pił livelli
 * nella DOM.
 *
 * @param	event	Event object.
 * @param	array	Array of events to propagate. If the current event is in the list it will be propagated.
 * @param	boolean	Flag to prevent default behavior.
 *
 * @return	event
 */
function do_event(e, propagationArr, preventDefault)
{
	if (preventDefault == undefined) 	{ bPreventDefault = false; 		}	
	if (!e)								{ e = window.event; 			}
	if (!e) 							{ return undefined; 			}
	
	if (!e.stopPropagation) 			{ e.stopPropagation = function() { this.cancelBubble = true; } };
	if (!e.preventDefault) 				{ e.preventDefault = function() { this.returnValue = false; } };
	
	for (var i in propagationArr)
	{
		if (e.type == propagationArr[i])
		{
			e.stopPropagation();
			if (preventDefault) { e.preventDefault(); 	}
		}
	}
	
	return e;
}

/**
 * Sets an element and all its children to be 'unselectable'
 *
 * @param	object	Object to be made unselectable
 */
function set_unselectable(oObject)
{
	if (!bIsIe4 && typeof oObject.tagName != 'undefined')
	{
		if (oObject.hasChildNodes())
		{
			for (var i = 0; i < oObject.childNodes.length; i++)
			{
				set_unselectable(oObject.childNodes[i]);
			}
		}
		oObject.unselectable = 'on';
	}
}

/**
 * Sets a new image path specifing a new filename and using the old path
 *
 * @param	object	Image object to change the path to
 * @param	string	New filename
 */
function change_image_filename(object, filename)
{
	object.src = object.src.substring(0, object.src.lastIndexOf('/') + 1) + filename;
}

/**
 * Sets a cookie.
 * 
 * @param	string	sCookieName
 * @param	string	sValue
 * @param	integer	nExpireDays
 */
function set_cookie(sCookieName, sValue, nExpireDays)
{
	var oExpireDate = new Date();
	oExpireDate.setDate(oExpireDate.getDate() + nExpireDays);
	document.cookie = sCookieName + "=" + escape(sValue) + ((nExpireDays === null) ? '' : ';expires=' + oExpireDate);
}

/**
 * Retrieves a cookie value.
 * 
 * @param	string	sCookieName
 * 
 * @return	string
 */
function get_cookie(sCookieName)
{
	var c_start;
	var c_end;
	
	
	if (document.cookie.length > 0)
	{
		c_start = document.cookie.indexOf(sCookieName + "=");
		
		if (c_start != -1)
		{ 
			c_start = c_start + sCookieName.length + 1;
			c_end 	= document.cookie.indexOf(";", c_start);
			
			if (c_end == -1)
			{
				c_end = document.cookie.length;
			}
			
			return unescape(document.cookie.substring(c_start, c_end));
		}
	}
	
	return null;
}

/**
 * 
 */
function get_style(elementId, sStyleProp)
{
	if (bIsIe)
	{
		switch (sStyleProp)
		{
			//TODO: Add remaining style properties
			case 'border': 		sStyleProp = 'borderWidth'; break;
		}
	}
	
	if (typeof(elementId) == 'string') 	var oObject = fetch_element(elementId);
	else 								var oObject = elementId;
	
	if (oObject.currentStyle)
		var sComputedProp = oObject.currentStyle[sStyleProp];
	else if (window.getComputedStyle)
		var sComputedProp = document.defaultView.getComputedStyle(oObject, null).getPropertyValue(sStyleProp);
	
	return sComputedProp;
}

/**
 * Retrives the browser width
 *
 * @return	integer	Browser width
 */
function get_browser_width()
{
	if (window.innerWidth)
	{
		return window.innerWidth;
	}
	else if (document.documentElement && document.documentElement.clientWidth !== 0)
	{
		return document.documentElement.clientWidth;
	}
	else if (document.body)
	{
		return document.body.clientWidth;
	}
	
	return 0;
}
