// older IE doesnt have getElementsByClassName....
if ('undefined' == typeof document.getElementsByClassName)
{
	document.getElementsByClassName = function(className)
	{
		var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
		var allElements = document.getElementsByTagName("*");
		var results = [];

		var element;
		for (var i = 0; (element = allElements[i]) != null; i++)
		{
			var elementClass = element.className;
			if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass))
				results.push(element);
		}

		return results;
	}
}

// ... nor does it have Array.indexOf
if (!Array.indexOf)
{
	Array.prototype.indexOf = function (obj, start)
	{
		for (var i = (start || 0); i < this.length; i++)
		{
			if (this[i] == obj)
			{
				return i;
			}
		}
		
		return -1;
	}
}

function isArray(obj)
{
	return (typeof obj != "undefined") && obj.constructor == Array;
}

function stripHtml(htmlString)
{
	var re = /(<([^>]+)>)/gi;
	return htmlString.replace(re, "");
}

function ScrollToElement(theElement)
{
	var selectedPosX = 0;
	var selectedPosY = 0;

	while(theElement != null)
	{
		selectedPosX += theElement.offsetLeft;
		selectedPosY += theElement.offsetTop;
		theElement = theElement.offsetParent;
	}

	window.scrollTo(selectedPosX,selectedPosY);
}

function getElementPosition(elem)
{
	var offsetTrail		= elem;
	var offsetLeft		= 0;
	var offsetTop		= 0;
	while (offsetTrail)
	{
		offsetLeft		+= offsetTrail.offsetLeft;
		offsetTop		+= offsetTrail.offsetTop;
		offsetTrail		 = offsetTrail.offsetParent;
	}
	offsetTop = offsetTop || 0;
	offsetLeft = offsetLeft || 0;
	return {left: offsetLeft, top: offsetTop, height: elem.offsetHeight, width: elem.offsetWidth}
}

function trim(str, chars)
{
	return ltrim(rtrim(str, chars), chars);
}
function ltrim(str, chars)
{
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
function rtrim(str, chars)
{
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function jscss(a, o, c1, c2)
{
	if("string" == typeof o)
		o = document.getElementById(o);

	switch (a)
	{
		case 'swap':
			var c = o.className;
			if(c)
			{
				if(c==c1)
					c=c2;
				else
					c = c.replace(new RegExp('\\b'+c1+'\\b'), c2).replace('  ',' ');
			}
			else
				c=c2;
			
			o.className = c;
			break;

		case 'check':
			return o.className==c1 || (new RegExp('\\b'+c1+'\\b').test(o.className));
			break;

		case 'add':
			if(!jscss('check',o,c1))
			{
				o.className+=o.className ? ' '+c1 : c1;
			}
			break;

		case 'remove':
			jscss('swap', o, c1, '');
			break;
	}
}
function _cv_ShowElement(elem, shown)
{
	if(false!=shown)
		shown=true;

	jscss('swap', elem, shown?'HiddenElement':'ShownElement', shown?'ShownElement':'HiddenElement');
}
function _cv_HideElement(elem, hidden)
{
	if(false!=hidden)
		hidden = true;

	_cv_ShowElement(elem, !hidden);
}






// general validation helpers
function CV_Validation_GetNewValidationResult(isValid, fnGetElementPosition, fnFocusElement)
{
	return {"isValid": (true==isValid)?true:false, "GetElementPosition": fnGetElementPosition||null, "FocusElement": fnFocusElement||null};
}
var ___cv_Validation_Invalids = new Array();
var ___cv_Validation_IsValid = true;
function CV_Validation_ClearValidationResults()
{
	___cv_Validation_Invalids = new Array();
	___cv_Validation_IsValid = true;
}
function CV_Validation_AddValidationResult(vR)
{
	if(null!=vR && vR.isValid == false)
	{
		___cv_Validation_Invalids.push(vR);
		___cv_Validation_IsValid = ___cv_Validation_IsValid && vR.isValid;
	}
}
function CV_Validation_CheckIsValid()
{
	window.setTimeout("_CV_Validation_GotoFirstInvalid()", 0);
	return ___cv_Validation_IsValid;
}
function _CV_Validation_GotoFirstInvalid()
{
	if(___cv_Validation_IsValid)
		return;

	// figure out the top invalid field
	var topmostInvalid = ___cv_Validation_Invalids[0];
	var elPos = topmostInvalid.GetElementPosition();
	for(var i=1; i<___cv_Validation_Invalids.length; i++)
	{
		// sort them by top
		var inv = ___cv_Validation_Invalids[i];
		var pos = inv.GetElementPosition();
		if(pos.top < elPos.top)
		{
			topmostInvalid = inv;
			elPos = pos;
		}
	}
	
	// scroll to the first invalid field
	window.scrollTo(elPos.left, elPos.top)
	
	// focus it
	if(null!=topmostInvalid.FocusElement)
		topmostInvalid.FocusElement();
}



// DevXpress validation
function CV_Validation_ValidateDXEditorsInContainerById_MultiVG(containerId, validationGroup, validateInvisibleEditors)
{
	var container = document.getElementById(containerId);
	return CV_Validation_ValidateDXEditorsInContainer_MultiVG(container, validationGroup, validateInvisibleEditors);
}

function CV_Validation_ValidateDXEditorsInContainer_MultiVG(container, validationGroup, validateInvisibleEditors)
{
	var validationResult = _aspxProcessEditorsInContainer(container, _aspxValidateProcessingProc, _CV_Validation_aspxValidateChoiceCondition_MultiVG, validationGroup, validateInvisibleEditors);
	if (_aspxIsExistsType(typeof aspxGetGlobalEvents))
	{
		if (typeof validateInvisibleEditors == "undefined")
		{
			validateInvisibleEditors = false;
		}
		
		if (typeof validationGroup == "undefined")
		{
			validationGroup = null;
		}
		
		validationResult.isValid = aspxGetGlobalEvents().OnValidationCompleted(container, validationGroup, validateInvisibleEditors, validationResult.isValid, validationResult.firstInvalid, validationResult.firstVisibleInvalid);
	}

	if(validationResult && !validationResult.isValid && validationResult.firstInvalid!=null)
	{
		var elPos = getElementPosition(validationResult.firstInvalid.GetMainElement());
		var VR = CV_Validation_GetNewValidationResult(	false,
														function(){return elPos;},
														function(){validationResult.firstInvalid.SetFocus();}
														);
		return VR;
	}

	return CV_Validation_GetNewValidationResult(true);
}

function _CV_Validation_aspxValidateChoiceCondition_MultiVG(edit, validationGroup)
{
	return (_aspxClearChoiceCondition(edit, validationGroup) || _CV_Validation_aspxClearChoiceCondition_MultiVG(edit, validationGroup)) &&  edit.customValidationEnabled;
}

function _CV_Validation_aspxClearChoiceCondition_MultiVG(edit, validationGroupAry)
{
	return !_aspxIsExists(validationGroupAry) || (isArray(validationGroupAry) && validationGroupAry.indexOf(edit.validationGroup) >= 0);
}


// MS validation helpers

// validates MS validators in a validation group
function ValidateMSValidatorsWithGroupID(valGroup)
{
	if ('undefined' == typeof Page_Validators)
		return true;

	var isValid = true;
	for (var i = 0; i < Page_Validators.length; i++)
	{
		var val = Page_Validators[i];
		ValidatorValidate(val, valGroup);
		if (true != val.isvalid)
			isValid = false;
	}
	return isValid;
}

// for CV validation methods
function CV_Validation_ValidateMSValidators_MultiVG(validationGroupsAry)
{
	if ('undefined' == typeof Page_Validators)
		return CV_Validation_GetNewValidationResult(true);

	var vFn;
	if(isArray(validationGroupsAry))
		vFn = _CV_Validation_ValidateMS_MultiVG;
	else
		vFn = _CV_Validation_ValidateMS_SingleVG;

	var isValid = true;
	var firstInvalidValidator = null;
	for (var i = 0; i < Page_Validators.length; i++)
	{
		var val = Page_Validators[i];
		
		// if the validator belongs to one of our groups
		if(!vFn(validationGroupsAry, val))
		{
			isValid = false;
			if(null==firstInvalidValidator)
				firstInvalidValidator = val;
		}
	}

	var vR = CV_Validation_GetNewValidationResult(isValid);
	if(!isValid)
	{
		var el = document.getElementById(firstInvalidValidator.controltovalidate) || firstInvalidValidator;
		var elPos = getElementPosition(el);
		vR.GetElementPosition = function(){return elPos;};
		vR.FocusElement = function(){el.focus();};
	}
	return vR;
}
function _CV_Validation_ValidateMS_SingleVG(validationGroup, validator)
{
	ValidatorValidate(validator, validationGroup);
	return val.isvalid;
}
function _CV_Validation_ValidateMS_MultiVG(validationGroupsAry, validator)
{
	for(var i=0; i<validationGroupsAry.length; i++)
	{
		ValidatorValidate(validator, validationGroupsAry[i]);
		if(!validator.isvalid)
			return false;
	}
	
	return true;
}






function createCookie(name, value, days)
{
	if (days)
	{
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else
		var expires = "";

	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ')
			c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0)
			return c.substring(nameEQ.length,c.length);
	}

	return null;
}

function eraseCookie(name)
{
	createCookie(name,"",-1);
}
