/*
General function
This component is AspLib Component Library part
Copyright © 2002-2005 Astron Digital Ltd., ALL RIGHTS RESERVED
*/



//=== Key Constants
var SHIFT_KEY		= 16;
var BACKSPACE_KEY	= 8;
var DELETE_KEY		= 46;



//=== Browser Identifier variables
var isOpera = navigator.userAgent.indexOf("Opera") > -1; 
var isIE = (navigator.userAgent.indexOf("MSIE") > 1 && !isOpera); 
var isMoz = (navigator.userAgent.indexOf("Mozilla/5.") == 0 && !isOpera);



//=== Functions

function al_getTitle(sId, titleName)
{
	try
	{ return eval(eval(sId + "_localization") + "." + titleName); }
	catch(e)
	{ return ""; }
}



function al_getVariable(variableName)
{
	var res;
	try
	{ return eval('res=' + variableName +';'); }
	catch(e)
	{}
	return res;
}



//*****************COLOR UTILITIES***********************************/



//convert decimals to hexidecimal
function _dec2hex(decimal) 
{
	var hex;
	var hexChars = "0123456789ABCDEF";
	var a = decimal % 16;
	var b = (decimal - a)/16;
	hex = "" + hexChars.charAt(b) + hexChars.charAt(a);
	return hex;
};



//retrun hex value
function _rgb2hex(r,g,b)
{
	return "#" + _dec2hex(r) + _dec2hex(g) + _dec2hex(b);
};



//parse rgb(123, 123, 123) to #123456 for Mozilla
function al_rgb3rgb($str)
{
	var $hex = $str.toLowerCase();
	$hex = $hex.replace('rgb(', '');
	$hex = $hex.replace(')', '');
	$hex = $hex.replace(' ', '');
	var $arRGB = $hex.split(',');
	
	if (!$arRGB[0] || !$arRGB[1] || !$arRGB[2])
		return "";
	
	return _rgb2hex($arRGB[0],$arRGB[1],$arRGB[2]);
};



//convert hex value to decimal - returns an array of RGB values
function _hex2rgb(hex)
{
	hex = hex.replace('#','');
	var $arrayRGB = new Array(3);
	$arrayRGB[0] = parseInt(hex.substr(0,2), 16);
	$arrayRGB[1] = parseInt(hex.substr(2,2), 16);
	$arrayRGB[2] = parseInt(hex.substr(4,2), 16);
	return $arrayRGB;
};



//returns an array of hue, sat, and brightness values from RGB values
function _rgb2hsb(r, g, b)
{
	r = parseFloat(r);
	g = parseFloat(g);
	b = parseFloat(b);
	var hue, saturation, brightness;
	hsbvals = new Array(3);
	var cmax = (r > g) ? r : g;
	if (b > cmax) cmax = b;
	var cmin = (r < g) ? r : g;
	if (b < cmin) cmin = b;
	brightness = cmax / 255.0;
	if (cmax != 0)
	{
		saturation = (cmax - cmin) / cmax;
	}
	else
	{
		saturation = 0;
	}
	if (saturation == 0)
	{
		hue = 0;
	}
	else 
	{
		var redc = (cmax - r) / (cmax - cmin);
		var greenc = (cmax - g) / (cmax - cmin);
		var bluec = (cmax - b) / (cmax - cmin);
		if (r == cmax)
		{
			hue = bluec - greenc;
		}
		else if (g == cmax)
		{
			hue = 2.0 + redc - bluec;
		}
		else
		{
			hue = 4.0 + greenc - redc;
		}
		hue = hue / 6.0;
		if (hue < 0) hue = hue + 1.0;
	}
	
	hsbvals[0] = Math.round(hue * 360);
	hsbvals[1] = Math.round(saturation*100);
	hsbvals[2] = Math.round(brightness*100);
	return hsbvals;
};



//find RGB values from hue, sat and brightness values
function _hsb2rgb(h,s,v)
{
	var i, f, p, q, t, retval;
	h = parseFloat(h/360);
	s = parseFloat(s/100);
	v = parseFloat(v/100);
	if(h >= 1.0) h %= 1.0; 
	if(s > 1.0) s = 1.0;
	if(v > 1.0) v = 1.0;

	var tov = Math.floor(255 * v);
	if(s == 0.0)
	{
		retval = new Array(tov,tov,tov);
	}
	else
	{
		h *= 6.0;
		i = Math.floor(h);
		f = h - i;
		p = Math.floor(tov * (1.0 - s));
		q = Math.floor(tov * (1.0 - (s * f)));
		t = Math.floor(tov * (1.0 - (s * (1.0  - f))));
		if(i == 0) retval = new Array(tov,t,p);
		if(i == 1) retval = new Array(q,tov,p);
		if(i == 2) retval = new Array(p,tov,t);
		if(i == 3) retval = new Array(p,q,tov);
		if(i == 4) retval = new Array(t,p,tov);
		if(i == 5) retval = new Array(tov,p,q);

	}

	return retval;
};



////////////////////////////////////////////////////////////////////////



function al_setLinkOnObject(object)
{
	eval("al_Link_" + object.type + object.id.replace(/:/g, "_") + "= object");
}



function al_getLinkOnObject(type, id)
{
	return eval("al_Link_" + type + id.replace(/:/g, "_"));
}



function al_Control_UpdateOldValue(controlID)
{
	var ctrl = document.getElementById(controlID);
	ctrl.setAttribute("oldvalue", ctrl.getAttribute("savevalue"));
	ctrl.setAttribute("savevalue", ctrl.value);
}



function al_Control_GetAttribute(controlID, attributeName)
{
	var control = document.getElementById(controlID);
	if (control != null)
	{
		return control.getAttribute(attributeName);
	}
	else
	{
		return null;
	}
}



function al_Control_RunScript(obj, eventObject, scriptAttributeName, params)
{
	var onchangescript = obj.getAttribute(scriptAttributeName);
	
	if (onchangescript !=null) 
	{
		var ap_f;
		eval('ap_f = function (event, params){' + onchangescript + '}');
		if (ap_f(eventObject, params) == false) return false;
	}
}



function al_getTwoDigits (i)
{
	if (i.toString().length < 2) 
		i = "0" + i;
	return i;
}



function al_getSpan(txtStyle, text, canSelected)
{
	return "<span style=\"" + txtStyle + "\"" +
		(canSelected ? ">" : "unselectable=\"on\">") + text + "</span>";
}



function al_formAttr(name, value) 
{
	if (value == null || value == "") return "";
	return ' ' + name + '="' + value + '"';
}



function al_IsStringEmpty(str)
{
	if (str == null || str == "") return true;
	return false;
}



function al_IfNull(str, value)
{
	if (str == null && value == null) return "";
	if (str == null) return value;
	return str;
}



function al_IfEmpty(str, value)
{
	if (al_IsStringEmpty(str) && al_IsStringEmpty(value)) return "";
	if (al_IsStringEmpty(str)) return value;
	return str;
}



//function to retrieve value of 'propName'-property of 'ctrl', if the control 
//does not have a property 'propName' then it is created and assigned value -'defaultValue'
function al_CheckAndAssignProp(ctrl, propName, defaultValue)
{
	if(al_IsStringEmpty(ctrl.getAttribute(propName)))
		ctrl.setAttribute(propName, defaultValue);
	else
		defaultValue = ctrl.getAttribute(propName);
		
	return defaultValue;
}



function al_setSelectedInDDown(oSelect, value)
{
	oSelect.selectedIndex = 0;
	for (var i=0; i< oSelect.length; i++)
	{
		if (oSelect[i].value.toLowerCase() == value.toLowerCase())
		{
			oSelect.selectedIndex = i;
			return;
		}
	}
}



function al_resetCursor(textRange)
{
	textRange.select();
	textRange.moveEnd("character", 1);
	textRange.moveStart("character", 1);
	textRange.collapse(false);
}



function al_GetKeyCode(evt)
{
	if(isMoz)
		return evt.charCode;
	return evt.keyCode;
}



function al_GE(id)
{
	return document.getElementById(id);
}



function al_GetParentElement(el)
{
	if (el == null)
		return null;
		
	var parent = null;
	
	if (isIE)
		parent = el.parentElement;
	else
		parent = el.parentNode;
		
	return parent;
}



function al_CancelEvent(evt)
{
	evt.cancelBubble = true;
	evt.returnValue = false;
}



function al_encodeString($s)
{
	$s = $s.replace (/&/g, "&amp;");
	$s = $s.replace (/>/g, "&gt;");
	$s = $s.replace(/"/g,"&quot;");
	$s = $s.replace (/</g, "&lt;");
	$s = $s.replace (/'/g, "&#39;");
	
	return $s;
}



function al_SetSelectedInDDown(oSelect, value)
{
	oSelect.selectedIndex = 0;
	for (var i=0; i< oSelect.length; i++)
	{
		if (oSelect[i].value.toLowerCase() == value.toLowerCase())
		{
			oSelect.selectedIndex = i;
			return;
		}
	}
}



function al_parseFloat($value)
{
	$value = String($value).replace(",", ".");
	return parseFloat($value);
}



function al_addEvent($obj, $eventName, $function)
{
	if (isIE)
		$obj.attachEvent('on' + $eventName, $function);
	else
		$obj.addEventListener($eventName, $function, true);
}


// === Math

function al_Math_round($val, $precision)
{
	var $mul = Math.pow(10, $precision);	
	return Math.round(al_parseFloat($val) * $mul) / $mul;
}
