function popupMenu(level, item, closeFunc) {
	closePopups(level);
	activePopups[level] = item;
	if (document.getElementById('Everything')) {
		document.getElementById('Everything').className = 'nr-hide-selects';
	}
	item.style.display = 'block';
    document.onclick = closeFunc ? closeFunc : function() {closePopups(0)};
}
function closePopups(level) {
	for (var i = 0; i < activePopups.length; i++) {
		if (activePopups[i] != null) {
			activePopups[i].style.display = (i < level) ? 'block' : 'none';
		}
	}
	if (document.getElementById('Everything')) {
		document.getElementById('Everything').className = '';
	}
}
var activePopups = new Array();

function openTab(tabId, paneId) {
	var pelem = document.getElementById(paneId);
	if (pelem.style.visibility == 'visible') {
		closeTab();
		return;
	}

	closeTab();
	activeTab = tabId;
	activePane = paneId;
	pelem.style.visibility = 'visible';
	pelem.style.position = 'static';
	
	if (document.getElementById(tabId + 'Cell')) {document.getElementById(tabId + 'Cell').className = 'nr-active';}
	
	if (document.getElementById('OpenTab')) {document.getElementById('OpenTab').value = tabId;}
	if (document.getElementById('OpenTabPane')) {document.getElementById('OpenTabPane').value = paneId;}
}
function closeTab() {
	if (activePane) {
		var pelem = document.getElementById(activePane);
		pelem.style.visibility = 'hidden';
		pelem.style.position = 'absolute';
		if (document.getElementById(activeTab + 'Cell')) {document.getElementById(activeTab + 'Cell').className = '';}
	}
	activeTab = null;
	activePane = null;
	if (document.getElementById('OpenTab')) {document.getElementById('OpenTab').value = "";}
	if (document.getElementById('OpenTabPane')) {document.getElementById('OpenTabPane').value = "";}
}
function openDefaultTab() {
	var tabInp = document.getElementById('OpenTab');
	var paneInp = document.getElementById('OpenTabPane');
	if (tabInp && tabInp.value != null && tabInp.value != "" &&	paneInp && paneInp.value != null && paneInp.value != "") 
	{
		openTab(tabInp.value, paneInp.value);
	}
}
var activeTab = null;
var activePane = null;

// Used on BuildPage:
function toggleTitle(btnId, thId, tdId, titleId, navId) {
	var btn = document.getElementById(btnId);
	var thDiv = document.getElementById(thId);
	var tdDiv = document.getElementById(tdId);
	var title = document.getElementById(titleId);
	var nav = document.getElementById(navId);
	
	if (thDiv.style.display != "none") {
		if ((nav.value == title.value) || confirm("Replace nav text (" + nav.value + ")\nwith title text (" + title.value + ")?")) {
			nav.value = "";
			btn.innerHTML = "+";
			thDiv.style.display = "none";
			tdDiv.style.display = "none";
		}
	} else {
		nav.value = title.value;
		btn.innerHTML = "-";
		thDiv.style.display = "block";
		tdDiv.style.display = "block";
	}
}
function showConfigWindow(divId, hiddenId) {
    var hidden = document.getElementById(hiddenId);
    if (hidden) hidden.value = "true";
    var div = document.getElementById(divId);
    div.className = "nr-panel-builder-body";
    var insideDiv = document.getElementById(divId + "Inside");

    if (navigator.userAgent.indexOf('MSIE 6') >= 0) {
        div.style.position = 'absolute';
        div.style.top = '0px';
        div.style.left = '0px';
        var docWidth = document.documentElement.scrollWidth;
        if (docWidth < document.documentElement.clientWidth) docWidth = document.documentElement.clientWidth;
        div.style.width = (docWidth - 300) + "px";
        var docHeight = document.documentElement.scrollHeight;
        if (docHeight < document.documentElement.clientHeight) docHeight = document.documentElement.clientHeight;
        div.style.height = (docHeight - 300) + "px";
        if (insideDiv) {
            insideDiv.style.position = "absolute";
            insideDiv.style.left = "150px";
            insideDiv.style.top = "177px";
            insideDiv.style.width = (docWidth - 300) + "px";
        }
    } else {
        // For the good browsers we still want to limit the height if it's too close to the height of the window on the whole
        if (insideDiv) {
            var docHeight = window.innerHeight;
            if (!docHeight) docHeight = document.documentElement.clientHeight;
            if (insideDiv.clientHeight > docHeight - 250) insideDiv.style.height = (docHeight - 250) + "px";
        }
    }
    nrFixEditors();
}
function hideConfigWindow(divId, hiddenId) {
    document.getElementById(hiddenId).value = "false";
    document.getElementById(divId).className = "nr-panel-builder-body-hidden";
}
function insertPanel(panelTypeId, variantId) {
	gapMovePanelIdStr = null;
	gapPanelTypeId = panelTypeId;
	gapPanelVariantId = variantId;
	if (document.singleGap) {
		document.singleGap();
	} else {
		openHint('InsertPanelHint', 120, 5);
		showGaps();
	}
}
function movePanel(panelIdStr, moveBtnId, layoutHolderId) {
	gapPanelTypeId = null;
	gapPanelVariantId = null;
	gapMovePanelIdStr = panelIdStr;
	activeMoveBtn = moveBtnId;
	document.getElementById(moveBtnId).className = "nr-active";
	if (layoutHolderId) {
		if (document.getElementById(layoutHolderId)) {
			activeMoveLayout = layoutHolderId;
			document.getElementById(layoutHolderId).className = "nr-suppress-gaps";
		}
	}
	showGaps();
}
function showGaps() {
	document.getElementById('NRContent').className = "nr-show-gaps";
	document.onclick = hideGaps;
}
function hideGaps() {
	if (activeMoveBtn != null) {
		document.getElementById(activeMoveBtn).className = "";
		activeMoveBtn = null;
	}
	if (activeMoveLayout != null) {
		document.getElementById(activeMoveLayout).className = "";
		activeMoveLayout = null;
	}
	document.getElementById('NRContent').className = "";
}
function insertIntoGap(regionId, pos, ptypeId, pvariantId, moveId, ridId, posId, formId) {
	document.getElementById(ptypeId).value = gapPanelTypeId == null ? "" : gapPanelTypeId;
	document.getElementById(pvariantId).value = gapPanelVariantId == null ? "" : gapPanelVariantId;
	document.getElementById(moveId).value = gapMovePanelIdStr == null ? "" : gapMovePanelIdStr;
	document.getElementById(ridId).value = regionId;
	document.getElementById(posId).value = pos;
	__doPostBack('DummyBtn','')
}
var activeMoveBtn = null;
var activeMoveLayout = null;
var gapPanelTypeId = null;
var gapPanelVariantId = null;
var gapMovePanelIdStr = null;


function openHint(hintId, millisPerFrame, duration) {
	var fadee = document.getElementById(hintId);
	if (!setOpacity || !fadee) return;
	setOpacity(fadee, 0);
	fadee.style.display = 'block';
	setOpacity(fadee, 0);
	var value = 0;
	var fadeIn = function() {
		value += 25;
		setOpacity(fadee, value);
		if (value >= 100) {
			if (duration > 0) setTimeout(fadeOut, duration * 1000);
		} else {
			setTimeout(fadeIn, millisPerFrame);
		}		
	}
	var fadeOut = function() {
		value -= 10;
		setOpacity(fadee, value);
		if (value > 0) {
			setTimeout(fadeOut, millisPerFrame);
		} else {
			fadee.style.display = 'none';
		}
	}
	fadeIn();
}
function closeHint(hintId, millisPerFrame) {
	var fadee = document.getElementById(hintId);
	if (!fadee) return;
	var value = 100;
	var fadeOut = function() {
		value -= 10;
		setOpacity(fadee, value);
		if (value > 0) {
			setTimeout(fadeOut, millisPerFrame);
		} else {
			fadee.style.display = 'none';
		}
	}
	fadeOut();
}
function setOpacity(obj, val) {
	if (val > 100) val = 100;
	if (val < 0) val = 0;
	if (obj && obj.style) {
		obj.style.opacity = (val * 1.0) / 100.0;
		obj.style.MozOpacity = (val * 1.0) / 100.0;
		obj.style.filter = "alpha(opacity=" + val + ")";
	}
}

var preserveLoginFailures = 0;
var preserveLostVisible = false;
function preserveLogin(applicationPath, hintId, lostHintId) {
	if (preserveLogin[hintId]) {
		var req = null;
		if (window.XMLHttpRequest) {
			req = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			req = new ActiveXObject("Microsoft.XMLHTTP");
		}
		if (req != null && req) {
			preserveLoginFailures++;
			if (preserveLoginFailures >= 5 && !preserveLostVisible) {
				openHint(lostHintId, 60, -1);
				preserveLostVisible = true;
			}
			req.onreadystatechange = function() {
				if (req.readyState == 4) {
					if (req.status == 200 && req.responseText == "LoggedIn") {
						preserveLoginFailures = 0;
						preserveLostVisible = false;
						closeHint(lostHintId, 60);
						openHint(hintId, 60, 1);
					} else if (req.status == 200) {
						preserveLoginFailures = 5;
						if (!preserveLostVisible) {
							openHint(lostHintId, 60, -1);
							preserveLostVisible = true;
						}
					} else {
						preserveLoginFailures++;
					}
				}
			};
			req.open("GET", applicationPath + "/Core/LoginStatus.aspx", true);
			req.send(null);
		}
	}
	preserveLogin[hintId] = true;
	setTimeout(function() {preserveLogin(applicationPath, hintId, lostHintId)}, 60000);
}

function permissionTab(permMgrId, tabId, permsId, impliedPerms, partSentence, description, sentenceDiv, descDiv, availListId, explicitListId, grantBtnId, revokeBtnId, allGroups) {
	var permMgr = document.getElementById(permMgrId);
	if (permMgr.selectedTab) {
		var selectedTab = document.getElementById(permMgr.selectedTab);
		if (selectedTab) selectedTab.className = 'nr-tab-unselected';
	}
	permMgr.selectedTab = tabId;
	permMgr.permsId = permsId;
	permMgr.impliedPerms = impliedPerms;
	permMgr.availListId = availListId;
	permMgr.explicitListId = explicitListId;
	permMgr.grantBtnId = grantBtnId;
	permMgr.revokeBtnId = revokeBtnId;
	permMgr.allGroups = allGroups;
	if (!permMgr.initialPerms) permMgr.initialPerms = document.getElementById(permsId).value;
	document.getElementById(tabId).className = 'nr-tab-selected';
	document.getElementById(sentenceDiv).innerHTML = 'Groups that can ' + partSentence;
	document.getElementById(descDiv).innerHTML = description;

	document.getElementById(permMgr.grantBtnId).disabled = true;
	document.getElementById(permMgr.revokeBtnId).disabled = true;

	refreshPerms(permMgrId);
}
function refreshPerms(permMgrId) {
	var permMgr = document.getElementById(permMgrId);
	var availList = document.getElementById(permMgr.availListId);
	var explicitList = document.getElementById(permMgr.explicitListId);
	var groupArr = permMgr.allGroups.split(",");
	var permsVal = document.getElementById(permMgr.permsId).value;

	while (availList.options.length > 0) availList.remove(0);
	while (explicitList.options.length > 0) explicitList.remove(0);
	var loggedInHas = groupHasPerm(permMgrId, loggedInGroupId);
	for (var i = 0; i < groupArr.length; i++) {
		var groupId = groupArr[i];
		if (groupId && (!loggedInHas || groupId == loggedInGroupId || groupId == notLoggedInGroupId)) {
			var opt = document.createElement("option");
			var has = groupHasPerm(permMgrId, groupId);
			if (has) {
				explicitList.options.add(opt);
				if (permsVal.indexOf(',' + groupId + ',') < 0) {
					opt.style.backgroundColor = "#e3e3e3";
					opt.style.color = "#555555";
				}
			} else {
				availList.options.add(opt);
			}
			opt.text = groupNames[groupId];
			opt.value = groupId;
			if (revokableGroups.indexOf(',' + groupId + ',') < 0) {
				opt.style.color = "#6e8cdd";
				if (has && permMgr.initialPerms.indexOf(',' + groupId + ',') < 0 &&
					permMgr.impliedPerms.indexOf(',' + groupId + ',') < 0) {
					opt.text = '*' + opt.text;
				}
			}
		}
	}
}
function groupHasPerm(permMgrId, groupId) {
	var permMgr = document.getElementById(permMgrId);
	var permsVal = document.getElementById(permMgr.permsId).value;
	return (permsVal.indexOf(',' + groupId + ',') >= 0 ||
			permMgr.impliedPerms.indexOf(',' + groupId + ',') >= 0);
}
function permissionAvailSelect(permMgrId) {
	var permMgr = document.getElementById(permMgrId);
	var availList = document.getElementById(permMgr.availListId);
	var explicitList = document.getElementById(permMgr.explicitListId);
	var grantBtn = document.getElementById(permMgr.grantBtnId);
	var revokeBtn = document.getElementById(permMgr.revokeBtnId);
	if (availList.selectedIndex != -1) {
		explicitList.selectedIndex = -1;
		grantBtn.disabled = false;
		revokeBtn.disabled = true;
	} else {
		grantBtn.disabled = true;
	}
}
function permissionExplicitSelect(permMgrId) {
	var permMgr = document.getElementById(permMgrId);
	var availList = document.getElementById(permMgr.availListId);
	var explicitList = document.getElementById(permMgr.explicitListId);
	var grantBtn = document.getElementById(permMgr.grantBtnId);
	var revokeBtn = document.getElementById(permMgr.revokeBtnId);
	for (var i = 0; i < explicitList.options.length; i++) {
		var opt = explicitList.options[i];
		if (permMgr.impliedPerms.indexOf(',' + opt.value + ',') >= 0 ||
			(permMgr.initialPerms.indexOf(',' + opt.value + ',') >= 0 &&
			 revokableGroups.indexOf(',' + opt.value + ',') < 0)) opt.selected = false;
	}
	if (explicitList.selectedIndex != -1) {
		availList.selectedIndex = -1;
		revokeBtn.disabled = false;
		grantBtn.disabled = true;
	} else {
		revokeBtn.disabled = true;
	}
}
function permissionGrant(permMgrId) {
	var permMgr = document.getElementById(permMgrId);
	var availList = document.getElementById(permMgr.availListId);
	var explicitList = document.getElementById(permMgr.explicitListId);
	var grantBtn = document.getElementById(permMgr.grantBtnId);
	var revokeBtn = document.getElementById(permMgr.revokeBtnId);
	var perms = document.getElementById(permMgr.permsId);
	var groupArr = permMgr.allGroups.split(",");
	var didAny = false;
	var didLoggedIn = false;
	var didNotLoggedIn = false;
	for (var i = 0; i < availList.options.length; i++) {
		var opt = availList.options[i];
		if (opt.selected &&
			(revokableGroups.indexOf(',' + opt.value + ',') >= 0 ||
			 confirm('You do not have sufficient privileges to revoke permissions from ' + opt.text + '.\nIf you grant this permission, you will be unable to revoke it later.\nAre you sure you want to grant this permission to ' + opt.text + '?'))) {
			perms.value += opt.value + ',';
			var insPos = 0;
			for (var j = 0; j < groupArr.length && groupArr[j] != opt.value; j++) {
				if (groupArr[j] && groupHasPerm(permMgrId, groupArr[j])) insPos++;
			}
			availList.remove(i);
			explicitList.options.add(opt, insPos);
			if (revokableGroups.indexOf(',' + opt.value + ',') < 0) {
				opt.text = '*' + opt.text;
			}
			i--;
			didAny = true;
			if (opt.value == loggedInGroupId) didLoggedIn = true;
			if (opt.value == notLoggedInGroupId) didNotLoggedIn = true;
		} else {
			opt.selected = false;
		}
	}
	grantBtn.disabled = true;
	revokeBtn.disabled = !didAny;
	if (didLoggedIn) loggedInPermChanged(permMgrId, explicitList, didNotLoggedIn);
}
function permissionRevoke(permMgrId) {
	var permMgr = document.getElementById(permMgrId);
	var availList = document.getElementById(permMgr.availListId);
	var explicitList = document.getElementById(permMgr.explicitListId);
	var grantBtn = document.getElementById(permMgr.grantBtnId);
	var revokeBtn = document.getElementById(permMgr.revokeBtnId);
	var perms = document.getElementById(permMgr.permsId);
	var groupArr = permMgr.allGroups.split(",");
	var didAny = false;
	var didLoggedIn = false;
	var didNotLoggedIn = false;
	for (var i = 0; i < explicitList.options.length; i++) {
		var opt = explicitList.options[i];
		if (opt.selected &&
			permMgr.impliedPerms.indexOf(',' + opt.value + ',') < 0 &&
			(permMgr.initialPerms.indexOf(',' + opt.value + ',') < 0 ||
			 revokableGroups.indexOf(',' + opt.value + ',') >= 0)) {
			perms.value = perms.value.replace(',' + opt.value + ',', ',');
			var insPos = 0;
			for (var j = 0; j < groupArr.length && groupArr[j] != opt.value; j++) {
				if (groupArr[j] && !groupHasPerm(permMgrId, groupArr[j])) insPos++;
			}
			explicitList.remove(i);
			availList.options.add(opt, insPos);
			if (revokableGroups.indexOf(',' + opt.value + ',') < 0) {
				opt.text = opt.text.substring(1);
			}
			i--;
			didAny = true;
			if (opt.value == loggedInGroupId) didLoggedIn = true;
			if (opt.value == notLoggedInGroupId) didNotLoggedIn = true;
		} else {
			opt.selected = false;
		}
	}
	revokeBtn.disabled = true;
	grantBtn.disabled = !didAny;
	if (didLoggedIn) loggedInPermChanged(permMgrId, availList, didNotLoggedIn);
}
function loggedInPermChanged(permMgrId, list, didNotLoggedIn) {
	refreshPerms(permMgrId);
	for (var i = 0; i < list.options.length; i++) {
		var opt = list.options[i];
		if (opt.value == loggedInGroupId ||
			(opt.value == notLoggedInGroupId && didNotLoggedIn)) {
			opt.selected = true;
		}
	}
}

function openNestedEditPage(url) {
    document.getElementById('NestedEditPageIframe').src = url;
    document.getElementById('NestedEditPageHolder').style.display = "block";
}
function nestedPageSaved() {
    document.getElementById('NestedEditPageHolder').style.display = "none";    
    document.getElementById('NestedEditPageIframe').src = 'javascript:""';
    __doPostBack(getNestedPostBackId(), '');
}

/*
	Please note: the following function are not specific to BuildPage or editing in general and
	should be considered for move to a new common.js file that is loaded on every page.
	----------------------------------------------------------------------------------
*/
	function addLoadEvent(func){
		var oldonload = window.onload;
		if (typeof window.onload != 'function'){
			window.onload = func;
		} 
		else{
			window.onload = function(){
			oldonload();
			func();
			}
		}
	}
	
	function deleteCookie(name){
		var tmp = "";
		var dt = new Date();
		tmp += name + "=;";
		tmp += " expires=" + new Date(dt.setMonth(dt.getMonth() - 1)).toGMTString();
		document.cookie = tmp;
	}
	
	function setCookie(name, value){
		deleteCookie(name);
		var tmp = "";
		var dt = new Date();
		tmp += name + "=" + value + ";";
		tmp += " expires=" + new Date(dt.setMonth(dt.getMonth() + 1)).toGMTString();
		document.cookie = tmp;
	}
	
	function getCookie(name){
		var str = "";
		if (document.cookie){
		var ary = document.cookie.split(";");
		for (var i=0; i < ary.length; i++){
			var ary2 = ary[i].split("=");
			if (name == ary2[0]){
				if (ary2.length < 2)
					str = "";
				else
					str = unescape(ary2[1]);
				}
			}
		}
		return str;
	}

var editorFixFuncs = [];

function nrRegisterEditorFix(func) {
  editorFixFuncs[editorFixFuncs.length] = func;
}
function nrFixEditors() {
  for (var i = 0; i < editorFixFuncs.length; i++) {
    editorFixFuncs[i]();
  }
}

function cmsSetKeyboardShortcut(key, buttonId) {
    // We need to track the handlers and unbind them specifically
    if (cmsSetKeyboardShortcut[key]) {
        $(document).unbind('keydown', key, cmsSetKeyboardShortcut[key]);
    }

    var handler = function(ev) {
        var elem = document.getElementById(buttonId);
        if (!elem) return;
        if (ev)  ev.preventDefault();
        
        setTimeout(function() {
            if (elem.click) {
                elem.click();
            } else if (elem.href) {
                var evt = document.createEvent('MouseEvents');
                evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                if (elem.dispatchEvent(evt)) {
                    window.location = elem.href;
                }
            }
        }, 1);
        return false;
    };
    cmsSetKeyboardShortcut[key] = handler;
    $(document).bind('keydown', key, handler);
}