/* Validation highlighting. */
var cards$validationFocusInfo = { lastAction: null, ignoreActionWithin: 5000 };	// ignoreScrollWithin: milliseconds value.
var __focusableTags = ["input", "select", "textarea"];

function MsfgCards$ValidationHighlight(sender, args) {
	// Placeholder method: wait for validation highlighting to complete before playing with ensuring visibility.
	window.setTimeout("MsfgCards$ValidationHighlightInternal()", 800);
	args.isvalid = true;
}

function __First(list, fnc) {
	if (list && list.length > 0)
		return fnc(list[0]);
	return null;
}

function __ShouldIgnoreAction(actionInfo) {
	var shouldIgnore = (actionInfo.lastAction && 
			((new Date().getTime() - actionInfo.lastAction.getTime()) < actionInfo.ignoreActionWithin));
	return shouldIgnore;
}

function __ScrollIntoViewIfNecessary(element) {
	element = $(element);
	var viewportOffsets = document.viewport.getScrollOffsets();
	var viewportDimensions = document.viewport.getDimensions();
	var offset = element.cumulativeOffset();
	
	if ((offset.top < viewportOffsets.top) || (offset.top > (viewportOffsets.top + viewportDimensions.height)))
		element.scrollTo();
	
	return element;
}

function MsfgCards$ValidationHighlightInternal() {
	// Bubble or highlight validation?
	if (!__ShouldIgnoreAction(cards$validationFocusInfo)) {
		var floatValidationWindow = $("floatvalidationtest");		// ID provided by WF...
		if (floatValidationWindow) {
			// Focus on first focusable element.
			MsfgCards$FocusOnFirst(floatValidationWindow);
		} else {
			// Traverse through the DOM to avoid the mangled return order of getElementsByTagName.
			__First($$("div.msfg-validationerror"), MsfgCards$FocusOnFirst);
		}
		cards$validationFocusInfo.lastAction = new Date();
	}
}

function MsfgCards$FocusOnFirst(element) {
	var focused = false;
	element = $(element);
	if (!element) return;
	
	element.descendants().each(function(child) {
			if (__focusableTags.include(child.tagName.toLowerCase()) && !child.disabled && child.type != "hidden") {
				focused = true;
				try {
					__ScrollIntoViewIfNecessary(child).focus();
				} catch (e) {}
				throw $break;
			}
		});
	return focused;
}
/* End: validation highlighting. */

/* Start: validation error prompt */
function MsfgCards$ShowValidationError()
{
    var x = $("GenericErrorDiv");
    Page_ClientValidate();
    if(!Page_IsValid)
        x.show(); 
}
/* End: validation error prompt */

function GetRadWindow() {
	var oWindow = null;
	if (window.radWindow)
		oWindow = window.radWindow; // Will work in Moz in all cases, including clasic dialog
	else if (window.frameElement.radWindow)
		oWindow = window.frameElement.radWindow;// IE (and Moz az well)
	return oWindow;
}

function ShowRadWindow(id) {
	var oWnd = GetRadWindowManager().GetWindowByName(id);
        oWnd.Show();
}

function ActiveRadWindowDo(func) {
	var window = GetRadWindow();
	if (window && typeof func == "function") {
		func(window);
	}
}

function CloseOnReload() {
	ActiveRadWindowDo(function(radWindow) {
			radWindow.close();
		});
}

function RedirectParentPage(newUrl) {
	ActiveRadWindowDo(function(radWindow) {
			radWindow.BrowserWindow.document.location.href = newUrl;
		});
}

function showAddReviewWindow(providerId) {
	var win = GetRadWindowManager().GetWindowByName('addReview');
	var currentUrl = win.GetUrl();
	var check = /providerid\=\d+$/gi;
	if (currentUrl.match(check)) {
		currentUrl = currentUrl.replace(check, "providerid=" + providerId);
	} else {
		currentUrl += "?providerId=" + providerId;
	}
	win.setUrl(currentUrl);
	win.Show();
}

function forElement(id, doThis) {
	if (id && doThis && typeof doThis == "function") {
		var item = $(id);
		doThis(item);
	}
}

function GetQueryString(key) {
    hu = window.location.search.substring(1);
    gy = hu.split("&");
    for (i=0;i<gy.length;i++) {
        ft = gy[i].split("=");
        if (ft[0] == key) {
            return ft[1];
        }
    }
}

function $fixBlindExtender() {
	if (typeof Controls != "undefined" && typeof Controls.BlindExtenderControlBehaviour != "undefined") {
		Controls.BlindExtenderControlBehaviour.prototype._toggleBlind = function() {
			var controlExpanded = this.get_ClientState().ControlExpanded;
			var effectCancelled = false;

			if (controlExpanded) {
				effectCancelled = this._raiseOnClientCollapse();
				if (!effectCancelled) {
					Effect.BlindUp(this._controlIdToAnimate, { duration: 0.5, afterFinish: BlindAnimation_AfterCollapse, __client: this });
					// Only if we're dealing with an image...
					if (this._controlToToggleBlind && this._controlToToggleBlind.src)
						this._controlToToggleBlind.src = this._toggleContractedImagePath;
				}
			}
			else {
				effectCancelled = this._raiseOnClientExpand();
				if (!effectCancelled) {
					Effect.BlindDown(this._controlIdToAnimate, { duration: 0.5, afterFinish: BlindAnimation_AfterExpand, __client: this });
					// Only if we're dealing with an image...
					if (this._controlToToggleBlind && this._controlToToggleBlind.src)
						this._controlToToggleBlind.src = this._toggleExpandedImagePath;
				}
			}
	        
			if (!effectCancelled)
				this._setToggleState(!controlExpanded);
		}
	}
}

function Cards$SetAllAnimationExtenderExpanded(expanded) {
	var app = Sys.Application;
	if (app.get_isCreatingComponents()) {
		window.setTimeout("Cards$SetAllAnimationExtenderExpanded(" + expanded + ")", 300);
	} else {
		var components = Sys.Application.getComponents();
		for (var i = 0 ; i < components.length; i++) {
			if (Object.getType(components[i]).getName() === "Controls.BlindExtenderControlBehaviour") {
				components[i]._setToggleState(expanded);
			}
		}
	}
}

function MsfgCards$ValidateCompareCards(sender, args) {
	// Default: defer validation to the server.
	args.IsValid = true;
	
	try {
		if (sender && typeof sender.CardTypesFieldName == "string") {
			var cardTypeFields = document.getElementsByName(sender.CardTypesFieldName);
			if (cardTypeFields && cardTypeFields.length > 0) {
				var isValid = false;
				for (var i = 0, max = cardTypeFields.length; i < max && !isValid; i++) {
					if (cardTypeFields[i].checked) {
						isValid = true;
					}
				}
				args.IsValid = isValid;
			}
		}
	} catch (e) { args.IsValid = true; }
}

function Cards$AttachNamesTo(items) {
	for (var i = 0; i < items.length; i++) {
		var item = $(items[i].id);
		if (item)
			item.setAttribute("name", items[i].label);
	}
}