// 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;
	}
}

// Array Remove - By John Resig (MIT Licensed)
// http://ejohn.org/blog/javascript-array-remove/
Array.prototype.remove = function(from, to)
{
	var rest = this.slice((to || from) + 1 || this.length);
	this.length = from < 0 ? this.length + from : from;
	return this.push.apply(this, rest);
}

// CV Helpers
var __cv_gottenElems = new Object();
function cv_GetElementById(elemId, noCache, doc)
{
	doc = doc || document;
	if(noCache||false)
		return doc.getElementById(elemId);
	
	var arr = __cv_gottenElems[doc] || new Array();
	var elem = arr[elemId];
	if(!elem)
	{
		elem = doc.getElementById(elemId);
		arr[elemId] = elem;
	}
	
	__cv_gottenElems[doc] = arr;
	
	return elem;
}

function isArray(obj)
{
	return (typeof obj != "undefined") && obj.constructor == Array;
}

function parseJson(data)
{
if (typeof (JSON) !== 'undefined' && typeof (JSON.parse) === 'function')
	return JSON.parse(data);
else
	return eval('(' + data + ')');
}

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 = cv_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 CheckListBoxSelection(lstBox, maxSel, oldSelection)
{
	if("string" == typeof lstBox)
		lstBox = document.getElementById(lstBox);
	
	if(!maxSel)
		maxSel = 0;
	
	var len = lstBox.length;
	if(maxSel>0)
	{
		var numSel = 0;
		var newSel = new Array();
		var oldSel = oldSelection || lstBox.__cv_oldSelection;
		for (var i = 0; i < len; i++)
		{
			var itm = lstBox.options[i];
			if (itm.selected)
			{
			    newSel.push(i);
				++numSel;
			}
		}
		
		if(numSel==0 || numSel > maxSel)
		{
			ReturnListBoxSelection(oldSel, newSel, lstBox);
			return [false, null];
		}
		
		lstBox.__cv_oldSelection = newSel;
		return [true, newSel];
	}
	
	for (var i = 0; i < len; i++)
	{
		var itm = lstBox.options[i];
		if (itm.selected)
			return true;
	}
	return false;
}
function ReturnListBoxSelection(oldSel, newSel, lstBox)
{
	var nlen = newSel.length;
	var olen = oldSel.length;
	for(var i=0; i<nlen; i++)
	{
		lstBox.options[newSel[i]].selected = false;
	}
	for(var i=0; i<olen; i++)
	{
		lstBox.options[oldSel[i]].selected = 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);
}



// ViewListing methods
function GetSwitchLanguageFn(s,e, isEn, LitId_en, LitId_fr, eloq)
{
	// set initial texts
	var lng = isEn ? eloq.en : eloq.fr;
	s.SetText(lng.SwitchLang);
	pnlListingInfo.SetHeaderText(lng.HeaderText);

	var isEnglish = isEn;
	var eloquence = eloq;
	var need_lit_en = true;
	var need_lit_fr = true;
	var lit_en = null;
	var lit_fr = null;
	return function(sender, eventArgs)
	{
		isEnglish = !isEnglish;

		if(need_lit_en)
		{
			need_lit_en = false;
			lit_en = cv_GetElementById(LitId_en);
		}
		if(need_lit_fr)
		{
			need_lit_fr = false;
			lit_fr = cv_GetElementById(LitId_fr);
		}
		
		var lng = isEnglish ? eloquence.en : eloquence.fr;
		sender.SetText(lng.SwitchLang);
		pnlListingInfo.SetHeaderText(lng.HeaderText);
		
		var s = 'ShownElement';
		var h = 'HiddenElement';

		if(isEnglish)
		{
			jscss('swap', lit_en, h, s);
			jscss('swap', lit_fr, s, h);
		}
		else
		{
			jscss('swap', lit_en, s, h);
			jscss('swap', lit_fr, h, s);
		}

		lblOrgnameEn.SetClientVisible(isEnglish);
		lblOrgnameFr.SetClientVisible(!isEnglish);
		lblListingTitleEn.SetClientVisible(isEnglish);
		lblListingTitleFr.SetClientVisible(!isEnglish);
		pnlDescriptionEn.SetClientVisible(isEnglish);
		pnlDescriptionFr.SetClientVisible(!isEnglish);
		
		// update the isEnglishFlag - used when determining
		// the language for the print version of the listing			
		isEnglishFlag = isEnglish;
	};
}



