//
// Set defaults for jQuery plugins etc
//
if (typeof jQuery != 'undefined') { if ($.datepicker) { $.datepicker.setDefaults({ dateFormat: 'd M yy', duration: 'fast' }); } }

// Establish namespace
function cms() { }
function local() { }
function crm() { }

cms.LinkRenderId = 1;
cms.DisableDynamicOverlay = false;

cms.FckToolbarSet = null;

cms.BeforeUnload = function () {
	cms.__isUnloading = true;
};
cms.__isUnloading = false;
window.onbeforeunload = cms.BeforeUnload;

cms.OpenFckEditor = function (strId, bHasMerge) {
	var f = new FCKeditor(strId);
	f.BasePath = cms.RootPath + '/inc/ckedit/';
	f.Config.SkinPath = f.BasePath + 'editor/skins/famfamfamAluminum/';
	f.Config.CustomConfigurationsPath = cms.RootPath + '/inc/ck.config.js';
	f.Config.ToolbarCanCollapse = false;
	f.Config.LinkBrowser = false;
	if (bHasMerge == true) {
		f.ToolbarSet = 'MinimalMerge';
	} else if (cms.FckToolbarSet != null) {
		f.ToolbarSet = cms.FckToolbarSet;
	} else {
		f.ToolbarSet = 'Minimal';
	}
	var ta = $('#' + strId);
	f.Width = ta.width();  //450;
	f.Height = ta.height();  //550;
	f.ReplaceTextarea();
	ta[0].fck = f;
};

cms.ClickOnce = function (oBtn) {
	setTimeout(function () { $(oBtn).attr('disabled', 'disabled'); }, 100);
	if (cms.LinkRenderId == 10) {
		$(oBtn).after('<span>Please wait...</span>');
	} else {
		$('body').css('cursor', 'wait');
	}
};

cms.PositionErrors = function() {
    var d = $('.cms-field-error-wrap');
    var ie6 = $.browser.msie && $.browser.version < 7;
    d.each(function() {
        var tx = $(this);
        if (this._errorPositioned != 1) {
            var tgtId = this.id.substring(0, this.id.length - 6);
            var tgt = $('#' + tgtId.replace('.', '\\.'));
            var pos = tgt.position();
            var pDiffTgt = cms.GetPositionDiff(tgt);
            var pDiffTx = cms.GetPositionDiff(tx);
            tx.css('top', pos.top + pDiffTgt.top - pDiffTx.top);
            tx.css('left', pos.left + pDiffTgt.left - pDiffTx.left + tgt.outerWidth() - 9);
            this._errorPositioned = 1;
            if (ie6) {
                // IE6 doesn't support hover selector, we have to use javascript to show/hide the error text
                tx.hover(
                    function() { $(this).find('.cms-field-error-inner').css('display', 'block'); },
                    function() { $(this).find('.cms-field-error-inner').css('display', 'none'); }
                );
            }
        }
    });
};

cms.SetFormAnchor = function(o, anchor) {
    var form = $(o).closest('form');
    if (form.length > 0) {
        var tgt = form.data('originalTarget');
        if (tgt) {
        } else {
            tgt = form.attr('action');
            form.data('originalTarget', tgt);
        }
        tgt = tgt + '#' + anchor;
        form.attr('action', tgt);
    }
}

cms.GetPositionDiff = function(o) {
	var oPos = o.position();
	var oOff = o.offset();
	return { top: oOff.top - oPos.top, left: oOff.left - oPos.left };
};

cms.ToggleGroup = function(strId, lFilterRef, sRegionTag) {
	var t = $('#' + strId + '-outer');
	if (t.hasClass('cms-cgroup-open')) {
		// Open; close it
		t.addClass('cms-cgroup-closed');
		t.removeClass('cms-cgroup-open');
		$('#' + strId + '-inner').hide();
		$('#' + strId + '-toggleStore').attr('value', '0');
	} else {
		// Closed; open it
		t.addClass('cms-cgroup-open');
		t.removeClass('cms-cgroup-closed');
		$('#' + strId + '-inner').show();
		$('#' + strId + '-toggleStore').attr('value', '1');
	}
	if (cms.EditBlock) { cms.EditBlock.AutoSync(t); }
	return false;
};

cms.HandleRowReorder = function(table, row) {
    cms.HandleReorder(table);
};
cms.HandleReorder = function(sortable) {
    // Build table of inputs
    var inputTable = [];
    $(sortable).find('input.cms-table-reorder-single').each(function() {    // was also [type=hidden]
        var itemTop = parseInt($(this).parent().offset().top, 10);
        inputTable.push({ itemTop: itemTop, element: this });
    });
    // Sort table
    inputTable.sort(function(a, b) {
        if (a === null) { a = { itemTop: -9999, element: null }; }
        if (b === null) { b = { itemTop: 99999999, element: null }; }
        return a.itemTop - b.itemTop;
    });
    // Traverse
    for (var i = 0; i < inputTable.length; i++)
    { $(inputTable[i].element).attr('value', i + 1); }
};

cms.HandleBlockReorder = function(event, ui) {
    cms.HandleReorder(ui.item.closest('.cms-block-reorder'));
};

cms.BookmarkLink = function(l) {
    var url = l.href;
    var title = l.title;

    if (window.sidebar) { // Mozilla Firefox Bookmark  
        window.sidebar.addPanel(title, url, "");
    } else if (window.external) { // IE Favorite  
        window.external.AddFavorite(url, title);
    } else if (window.opera) { // Opera 7+  
        return false; // do nothing - the rel="sidebar" should do the trick  
    } else { // for Safari, Konq etc - browsers who do not support bookmarking scripts (that i could find anyway)  
        alert('Unfortunately, this browser does not support the requested action, please bookmark this page manually.');
    }
    return false;
};

cms.ColourPickerOptions = function(originalValue) {
    return {
        onChange: function(hsb, hex, rgb) {
            var el = $(this.data('colorpicker').el);
            el.find('.cms-colpkr-inner').css('background-color', '#' + hex);
            el.find('input').val(hex);
        },
        onSubmit: function(hsb, hex, rgb, el) {
            $(el).find('input').val(hex).ColorPickerHide();
        },
        onBeforeShow: function() {
            //var t = $(this);
            //t.ColorPickerSetColor(t.find('input').val());
        },
        color: '#' + originalValue
    };
};

cms.ColourPickerMasterOptions = function(groupTag) {
    return {
        onChange: function(hsb, hex, rgb) {
            var groupTag = $(this).closest('.cms-colpkr-master')[0]._groupTag;
            var el = $(cms.ColourPickerGroupActive[groupTag]);
            el.find('.cms-colpkr-inner').css('background-color', '#' + hex);
            el.find('input').val(hex);
        },
        onSubmit: function(hsb, hex, rgb, el) {
            var groupTag = $(el).closest('.cms-colpkr-master')[0]._groupTag;
            el = $(cms.ColourPickerGroupActive[groupTag]);
            $(el).find('input').val(hex).ColorPickerHide();
        },
        onBeforeShow: function() {
            //var t = $(this);
            //t.ColorPickerSetColor(t.find('input').val());
        },
        color: '#' + cms.GetColourPickerGroupValue(groupTag),
        flat: true
    };
};

cms.GetColourPickerGroupValue = function(groupTag) {
    var active = $('.cms-colpkr-group-' + groupTag + '.cms-colpkr-active');
    if (active.length > 0) {
        return $(active[0]).find('input').val();
    } else {
        var all = $('.cms-colpkr-group-' + groupTag);
        if (all.length > 0) {
            var first = $(all[0]);
            cms.ColourPickerGroupActive[groupTag] = all[0];
            return first.addClass('cms-colpkr-active').find('input').val();
        }
    }
};

cms.ColourPickerGroupActive = {};

cms.ColourPickerGroup = function(groupTag) {
    $('.cms-colpkr-group-' + groupTag).each(function() { this._groupTag = groupTag; }).click(cms.ColourPickerGroupClick);
    $('.cms-colpkr-group-' + groupTag + '-master').each(function() { this._groupTag = groupTag; });
};

cms.ColourPickerGroupClick = function() {
    var all = $('.cms-colpkr-group-' + this._groupTag);
    all.removeClass('cms-colpkr-active');
    $(this).addClass('cms-colpkr-active');
    cms.ColourPickerGroupActive[this._groupTag] = this;
    $('.cms-colpkr-group-' + this._groupTag + '-master').ColorPickerSetColor($(this).find('input').val());
};

cms.GlobalReset = function() {
    $.get(cms.RootPath + '/wf.ashx?f=reset&t=0', null, function(data, textStatus) {
        if (data == 'OK') {
            cms.DisplayMessage('Reset executed successfully.', 1000);
        } else {
            alert('Reset may have failed to execute.');
        }
    });
    return false;
};

cms.UnescapeHtml = function(s) {
    return s.replace(/&amp;/g, '&').replace(/&quot;/g, '"');
};

cms.GadgetBar = function() { };

cms.GadgetBar.locked = 0;
cms.GadgetBar.open = 0;
cms.GadgetBar.over = 0;
cms.GadgetBar.closeTimer = 0;

cms.GadgetBar.ToggleClick = function(l) {
    //$('#cms-hdrtool').toggle('drop', { direction: 'left' }, 250);
    if (cms.GadgetBar.locked == 1) {
        l.className = '';
        cms.GadgetBar.locked = 0;
        cms.SetParameter('GadgetBar.Locked', 0);
    } else {
        l.className = 'locked';
        cms.GadgetBar.locked = 1;
        cms.SetParameter('GadgetBar.Locked', 1);
    }
    return false;
};
cms.GadgetBar.ToggleMouseOver = function(l) {
    if (cms.GadgetBar.open != 1) {
        cms.GadgetBar.open = 1;
        $('#cms-hdrtool').show('drop', { direction: 'left' }, 250);
    }
    cms.GadgetBar.over = 1;
    return false;
};
cms.GadgetBar.MouseOut = function(l) {
    cms.GadgetBar.over = 0;
    cms.GadgetBar.closeTimer = setTimeout(function() {
        if (cms.GadgetBar.over != 1 && cms.GadgetBar.open == 1 && cms.GadgetBar.locked != 1) {
            $('#cms-hdrtool').hide('drop', { direction: 'left' }, 500);
            cms.GadgetBar.open = 0;
        }
    }, 250);
    return false;
};
cms.GadgetBar.MouseOver = function() {
    cms.GadgetBar.over = 1;
    if (cms.GadgetBar.closeTimer > 0) {
        clearTimeout(cms.GadgetBar.closeTimer);
        cms.GadgetBar.closeTimer = 0;
    }
};

cms.GadgetBarIsOpen = function() {
	if (cms.Gadget && cms.Gadget.InitComplete == true) {
		return cms.Gadget.Collapsed == false;
	} else {
		return cms.GadgetBar.open == 1;
	}
};

cms.DialogCount = 0;
cms.DialogLink = function (iType, iObject, iAction, oLink, sStoreIntoField, sTitle, iWidth, iHeight, oOptions, jCallback, bModal, sStoreTypeInto) {
	// 0: Create div
	var overlay = $("<div/>").attr("class", "cms-dyn cms-dialog-content cms-dialog-loading").attr("id", "dlg" + cms.DialogCount++).attr("title", sTitle).prependTo("body");
	var dConfig = {
		bgiframe: true,
		modal: iAction == 2 || bModal == true,
		width: iAction == 2 ? 500 : 360,
		height: iAction == 2 ? 350 : 240
	};
	if (iWidth == -1 || iHeight == -1) {
		dConfig.width = $(window).width() * 0.8;
		dConfig.height = $(window).height() * 0.8;
	} else {
		if (iWidth > 0) { dConfig.width = iWidth; }
		if (iHeight > 0) { dConfig.height = iHeight; }
	}
	if (iAction == 2 || iObject === 0) {
		var label = 'Save';
		if (oOptions != null && oOptions['_label']) { label = oOptions['_label']; }
		dConfig.buttons = {
			'Discard': function () { $(this).dialog('close'); }
		};
		dConfig.buttons[label] = function () {
				var masterButton = $(this).find('.cms-button-master');
				var dParent = masterButton.closest('.cms-dyn');
				var oDialog = $(this);
				if (dParent.length > 0 && masterButton.length > 0) {
					cms.Dynamic.TransmitEvent(dParent, masterButton[0], function (sData, textStatus, dParent, xhr) {
						$(overlay).find("input[type=submit]").click(cms.Dynamic.ClickButton);
						$(overlay).find('.cms-button-primary').hide();
						var objectId = xhr.getResponseHeader('X-Object-Id');
						var typeId = xhr.getResponseHeader('X-Type-Id');
						var success = xhr.getResponseHeader('X-Success');
						if (success == 'true' && objectId > 0) {
							if (jCallback) { jCallback(success, typeId, objectId, xhr, oDialog); }
							if (sStoreIntoField) {
								if (sStoreIntoField == '_close_') {
									oDialog.dialog('close');
								} else {
									// Find field
									var oParent = $(oLink).closest('.cms-dyn');
									if (oParent.length === 0) { oParent = $(oLink).closest('form'); }
									if (oParent.length > 0) {
										// Iterate fields
										var fName = cms.Dynamic.SetFieldInRegion(oParent, sStoreIntoField, objectId);
										if (sStoreTypeInto != '') { cms.Dynamic.SetFieldInRegion(oParent, sStoreTypeInto, typeId); }
										if (fName !== null) {
											cms.Dynamic.TransmitByFieldName(oParent, fName);
											oDialog.dialog('close');
										}
									}
								}
							}
						}
					});
				}
			};
	} else {
		dConfig.buttons = {
			'Close': function () { $(this).dialog('close'); }
		};
	}
	$(overlay).dialog(dConfig);

	// 1: Load content into it
	iType = parseInt(iType, 10);
	iObject = parseInt(iObject, 10);
	iAction = parseInt(iAction, 10);
	var url = cms.RootPath + '/p.ashx?t=' + iType + '&d=' + iObject + '&a=' + iAction + '&uniq=' + Math.random() + '&p.lr=' + cms.LinkRenderId;
	if (oOptions !== null && oOptions !== undefined) {
		for (var k in oOptions) {
			url = url + '&' + k + '=' + encodeURIComponent(oOptions[k]);
		}
	}
	$(overlay).load(url, null, function () {
		$(overlay).removeClass('cms-dialog-loading');
		$(overlay).find("input[type=submit]").click(cms.Dynamic.ClickButton);
		$(overlay).find('.cms-button-primary').hide();
	});

	return false;
};

cms.HandleAjaxError = function (e, xhr, ajaxOptions, thrownError) {
	if (cms.__isUnloading == true) { return; }
	if (ajaxOptions.error) { return; }
	if (crm != null && crm.pendingRequest != null) {
		crm.cancelPendingRequest();
	}
	if (xhr != null) {
		var auditId = xhr.getResponseHeader('X-Audit-ID');
		if (auditId != '') {
			alert('An error occurred processing this request. (ref ' + auditId + ')');
			return;
		}
	}
	alert('An error occurred processing this request.');
};

if (typeof jQuery != 'undefined') { $(document).ajaxError(cms.HandleAjaxError); }

cms.UndoChain = [];
cms.UndoChainParent = null;

cms.Dynamic = function() { };

cms.Dynamic.TransmitByFieldName = function(oParent, fName, bCommit) {
    // Determine region tag
    var sAction = bCommit === true ? 'ModifyCommit' : 'ModifyOpen';
    var sRegion;
    if (fName[0] == '.') {
        sRegion = fName.split("-")[1];
    } else {
        sRegion = fName.split("-")[0];
    }
    var nObject = { name: '.btn-' + sRegion + '-' + sAction + '-FFFFFFFF', value: 'Dynamic' };
    cms.Dynamic.TransmitEvent(oParent, nObject, null);
};

cms.Dynamic.SetFieldInRegion = function(oRegion, sFieldName, sValue) {
	var tField = oRegion.find(':input').map(function() {
		var name = $(this).attr('name');
		if (name.substring(name.length - sFieldName.length, name.length) === sFieldName) {
			return this;
		} else {
			return null;
		}
	});
	if (tField.length > 0) {
		//alert('got target');
		//alert('target found x ' + tField.length);
		var tFallback = null;
		var tActual = null;
		for (var i = 0; i < tField.length; i++) {
			if (tField[i].name.substring(0, 4) == '.ord') {
				tFallback = tField[i];
			} else {
				tActual = tField[i];
			}
		}
		if (tActual == null && tFallback != null) { tActual = tFallback; }
		if (sFieldName != '') {
			switch (tActual.tagName) {
				case 'SELECT':
					tActual.options[0].value = sValue;
					tActual.selectedIndex = 0;
					break;
				case 'INPUT':
					tActual.value = sValue;
					break;
			}
		}
		return tActual.name;
	} else {
		//alert('no target found');
		return null;
	}
};

cms.Dynamic.ClickButton = function() {
    var t = $(this);
    // Is NoDynamic asserted? If so, exit
    if (t.hasClass('cms-button-nodyn')) { return true; }
    // Traverse parents for cms-dyn
    var dParent = t.closest('.cms-dyn');
    if (dParent.length > 0) { cms.Dynamic.TransmitEvent(dParent, this, null); }
    return false;
};
cms.Dynamic.TriggerTransmit = function (event) {
    // Traverse parents for cms-dyn
    if (event) { event.stopPropagation(); }
    cms.Dynamic.TriggerTransmitObject(this);
};
cms.Dynamic.TriggerTransmitObject = function (oElm) {
    var dParent = $(oElm).closest('.cms-dyn');
    if (dParent.length > 0) {
        // Determine region tag
        var sRegion = oElm.name.split("-")[0];
        var sAction = dParent.hasClass('cms-dyn-alwayscommit') ? 'ModifyCommit' : 'ModifyOpen';
        var nObject = { name: '.btn-' + sRegion + '-' + sAction + '-FFFFFFFF', value: 'Dynamic', region: sRegion };

        // Transmit
        cms.Dynamic.TransmitEvent(dParent, nObject, null);
    }
};
cms.Dynamic.FormTransmit = function(oElm, bSetUndoParent) {
	// Traverse parents for cms-dyn
	var dParent = $(oElm).closest('form');
	if (dParent.length > 0) {
		// Determine region tag
		var nObject = { name: '.btn--ModifyOpen-FFFFFFFF', value: 'Dynamic', region: '' };

		// Transmit
		cms.Dynamic.TransmitEvent(dParent, nObject, null, bSetUndoParent);
	}
};
cms.Dynamic.ActivateAutoReload = function(fieldId, sTargetRegion, bindEvent, sAction, iDebounce, bNoPush) {
	var t = $('#' + fieldId);
	t.bind(bindEvent, { region: sTargetRegion, action: sAction, debounce: parseInt(iDebounce, 10), noPush: bNoPush == true }, cms.Dynamic.__AutoReloadTrigger);
};
cms.Dynamic.__AutoReloadTrigger = function(event) {
	if (this._autoReloadTimeout) { clearTimeout(this._autoReloadTimeout); }
	if (event.keyCode == 27) {
		// ESC
		//th.val(t.find('.cms-oselect-otext').val());
		this.select();
	} else if (event.keyCode == 38) {
		// Up
	} else if (event.keyCode == 40) {
		// Down
	} else if (event.keyCode == 13) {
		// Enter
	} else {
		var t = this;
		this._options = event.data;
		this._autoReloadTimeout = setTimeout(function() { cms.Dynamic.__AutoReloadExec(t); }, event.data.debounce);
	}
};
cms.Dynamic.__AutoReloadExec = function(t) {
	if (cms.Dynamic.TransmitPending) { t._autoReloadTimeout = setTimeout(function() { cms.Dynamic.__AutoReloadExec(t); }, t._options.debounce); return; }
	t._autoReloadTimeout = null;
	if (t._lastReloadValue == t.value) { return; }
	var tgt = $('.cms-region-' + t._options.region);

	// Create fake button
	var nObject = { name: '.btn-' + t._options.region + '-' + t._options.action + '-FFFFFFFF', value: 'Dynamic', region: t._options.region };

	// Add current field
	if (t._options.noPush != true) {
		var xObject = [];
		xObject.push(t);
	}
	t._lastReloadValue = t.value;

	cms.Dynamic.TransmitEvent(tgt, nObject, null, false, xObject);
};

cms.Dynamic.TransmitPending = false;
cms.Dynamic.TransmitEvent = function (dParent, oSrcObject, fCallback, bSetUndoParent, aExtraData) {
    // Get parent form
    var dForm = $(dParent).closest('form');
    if (cms.Dynamic.TransmitPending) { cms.DisplayMessage('Another operation is currently in progress. Please try again in a moment.', 1500, 'info'); return; }
    cms.Dynamic.TransmitPending = true;
    // Get first child form
    var isWrapped = 0;
    if (dForm.length === 0) {
        dForm = $(dParent).find('form:first');
        isWrapped = 1;
    }
    if (dForm.length > 0) {
        // Destination
        var dest = dForm.attr('action');
        var formId = dForm.attr('id');

        // Join dParent and dForm static members and get elements to work on
        var data;
        if (isWrapped === 0) {
            var dMerge = dParent.add('#' + formId + ' .cms-dyn-static');
            data = dMerge.find(':input');
        } else {
            data = dForm.find(':input');
        }

        // Submit FCKeditor instances
        var dTextareas = dForm.find('textarea');
        if (dTextareas.length > 0) {
            for (var idx = 0; idx < dTextareas.length; idx++) {
                if (dTextareas[idx].fck) { FCKeditorAPI.GetInstance(dTextareas[idx].id).UpdateLinkedField(); }
            }
        }

        // Check for files to upload
        var files = $('input:file', dForm).fieldValue();
        var found = false;
        for (var j = 0; j < files.length; j++) {
            if (files[j]) { found = true; }
        }

        var pos;
        var overlay;
        var nDest;
        if (found) {
            // Has file inputs and needs to use AjaxSubmit
            // Reset destination
            nDest = cms.RootPath + '/p.ashx' + dest.substr(dest.indexOf("?"), 2048) + '&if=1' + (isWrapped == 1 ? '&w=1' : '') + '&uniq=' + Math.random() + '&p.lr=' + cms.LinkRenderId;
            dForm.attr('action', nDest);
            // Push button in
            var ed = {};
            ed[oSrcObject.name] = oSrcObject.value;
            // Push additional
            if (aExtraData != null) {
                for (var i = 0; i < aExtraData.length; i++) {
                    ed[aExtraData[i].name] = aExtraData[i].value;
                }
            }
            if (cms.DisableDynamicOverlay != true) {
                // Create overlay
                overlay = $("<div/>").attr("class", "cms-dyn-overlay").prependTo("body");
                pos = dParent.offset();
                overlay.height(dParent.outerHeight()).width(dParent.outerWidth()).css('top', pos.top).css('left', pos.left);
            } else {
                overlay = null;
            }
            // Submit
            dForm.ajaxSubmit({
                dataType: 'wrap', // We use(d) script to trick jQuery form into letting us use a textarea and not executing javascript on load etc
                success: function (sData) {
                    dParent.__dResult = sData;
                },
                complete: function (xhr, sResult) {
                    cms.Dynamic.TransmitPending = false;
                    if (sResult == 'success') {
                        var sData = dParent.__dResult;
                        var untrimmed = xhr.getResponseHeader('X-Untrimmed');
                        var newMaxOrdinal = parseInt(xhr.getResponseHeader('X-Max-Temp-Ordinal'), 10);
                        var dPform = dParent.closest('form');
                        if (dPform.length === 0) {
                            dPform = $(dParent).find('form:first');
                        }
                        if (newMaxOrdinal > 0) {
                            var newOrdinalText = xhr.getResponseHeader('X-Temp-Object-List');
                            var newOrdinalList = [];
                            if (newOrdinalText !== null && newOrdinalText !== '') { newOrdinalList = newOrdinalText.split(','); }
                            var dPmeta = dPform.find('div.cms-dyn-static');
                            dPmeta.find('input[name=.meta-temp-max_ordinal]').attr('value', newMaxOrdinal);
                            for (var idx = 0; idx < newOrdinalList.length; idx++) {
                                var id = parseInt(newOrdinalList[idx], 10);
                                var data = xhr.getResponseHeader('X-Temp-Object-' + id);
                                var sign = xhr.getResponseHeader('X-Temp-Sign-' + id);
                                var tgt = dPmeta.find('input[name=.meta-temp-obj-' + id + ']');
                                if (tgt.length === 0) {
                                    $('<input/>').attr('type', 'hidden').attr('name', '.meta-temp-obj-' + id).attr('class', 'cms-dyn-meta').attr('value', data).appendTo(dPmeta);
                                    $('<input/>').attr('type', 'hidden').attr('name', '.meta-temp-sign-' + id).attr('class', 'cms-dyn-meta').attr('value', sign).appendTo(dPmeta);
                                } else {
                                    tgt.attr('value', data);
                                    dPmeta.find('input[name=.meta-temp-sign-' + id + ']').attr('value', sign);
                                }
                            }
                        }
                        var dpStatic;
                        if (untrimmed == 'true') {
                            isWrapped = 0;
                            dPform = dParent.closest('form');
                            if (dPform.length === 0) {
                                dPform = $(dParent).find('form:first');
                                isWrapped = 1;
                            }
                            overlay.fadeOut('fast');
                            if (isWrapped == 1) {
                                dpStatic = dPform.html(sData);
                            } else {
                                dpStatic = $(sData);
                                dPform.empty().replaceWith(dpStatic);
                            }
                            if (dPform[0]._editParent != null) { cms.EditBlock.WireUpInnerForm(dpStatic.parent(), $(dPform[0]._editParent)); }
                        } else {
                            var dPtable = dParent.closest('table');
                            overlay.fadeOut('fast');
                            if (isWrapped == 1) {
                                dpStatic = dParent.html(sData);
                            } else {
                                dpStatic = $(sData);
                                dParent.empty().replaceWith(dpStatic);
                            }
                            if (dPtable.length > 0) { if (dPtable.tableDnDUpdate) { dPtable.tableDnDUpdate(); } cms.HandleReorder(dPtable); }
                            else {
                                var dPblock = dpStatic.closest('.cms-block-reorder');
                                if (dPblock.length > 0) {
                                    cms.HandleReorder(dPblock);
                                }
                            }
                            if (fCallback) { fCallback(sData, 'success', dParent, xhr); }
                        }
                        var eEvent = xhr.getResponseHeader('X-Event');
                        if (eEvent) { cms.Dynamic.HandleEventReturn(eEvent, xhr, dpStatic); }
                        if (bSetUndoParent === true || cms.UndoChainParent == null || cms.UndoChainParent.length == 0) {
                            if (dpStatic.length > 0) {
                                cms.UndoChainParent = dpStatic;
                            } else if (dPform != null && dPform.length > 0) {
                                cms.UndoChainParent = dPform;
                            }
                        }
                        dParent.__dResult = null;
                        if (cms.EditBlock) { cms.EditBlock.AutoSync(dpStatic); }
                    }
                },
                extraData: ed
            });
            setTimeout(function () { dForm.attr('action', dest); }, 250);
        } else {

            // Serialise content
            data = data.filter(function () {
                return this.name && !this.disabled &&
			            (this.checked || /select|textarea/i.test(this.nodeName) ||
				            /text|hidden|password/i.test(this.type));
            })
	            .map(function (i, elem) {
	                var val = jQuery(this).val();
	                return val === null ? null :
			            jQuery.isArray(val) ?
				            jQuery.map(val, function (val, i) {
				                return { name: elem.name, value: val };
				            }) :
				            { name: elem.name, value: val };
	            }).get();

            // Add calling button
            data.push({ name: oSrcObject.name, value: oSrcObject.value });
            //alert($.param(data));
            // Push additional
            if (aExtraData != null) {
                for (var i = 0; i < aExtraData.length; i++) {
                    data.push({ name: aExtraData[i].name, value: aExtraData[i].value });
                }
            }

            if (cms.DisableDynamicOverlay != true) {
                // Create overlay
                overlay = $("<div/>").attr("class", "cms-dyn-overlay").prependTo("body");
                pos = dParent.offset();
                overlay.height(dParent.outerHeight()).width(dParent.outerWidth()).css('top', pos.top).css('left', pos.left);
            } else {
                overlay = null;
            }

            // Disable all controls
            dParent.find(':input').attr("disabled", true);

            // Perform callback
            nDest = cms.RootPath + '/p.ashx' + dest.substr(dest.indexOf("?"), 2048) + (isWrapped == 1 ? '&w=1' : '') + '&p.lr=' + cms.LinkRenderId + '&p.rand=' + Math.random();
            var xhr = $.post(nDest, $.param(data), function (sData, textStatus) {
                cms.Dynamic.TransmitPending = false;
                var untrimmed = xhr.getResponseHeader('X-Untrimmed');
                var newMaxOrdinal = parseInt(xhr.getResponseHeader('X-Max-Temp-Ordinal'), 10);
                var dPform = dParent.closest('form');
                if (dPform.length === 0) {
                    dPform = $(dParent).find('form:first');
                }
                if (newMaxOrdinal > 0) {
                    var newOrdinalText = xhr.getResponseHeader('X-Temp-Object-List');
                    var newOrdinalList = [];
                    if (newOrdinalText !== null && newOrdinalText !== '') { newOrdinalList = newOrdinalText.split(','); }
                    var dPmeta = dPform.find('div.cms-dyn-static');
                    dPmeta.find('input[name=.meta-temp-max_ordinal]').attr('value', newMaxOrdinal);
                    for (var idx = 0; idx < newOrdinalList.length; idx++) {
                        var id = parseInt(newOrdinalList[idx], 10);
                        var data = xhr.getResponseHeader('X-Temp-Object-' + id);
                        var sign = xhr.getResponseHeader('X-Temp-Sign-' + id);
                        var tgt = dPmeta.find('input[name=.meta-temp-obj-' + id + ']');
                        if (tgt.length === 0) {
                            $('<input/>').attr('type', 'hidden').attr('name', '.meta-temp-obj-' + id).attr('class', 'cms-dyn-meta').attr('value', data).appendTo(dPmeta);
                            $('<input/>').attr('type', 'hidden').attr('name', '.meta-temp-sign-' + id).attr('class', 'cms-dyn-meta').attr('value', sign).appendTo(dPmeta);
                        } else {
                            tgt.attr('value', data);
                            dPmeta.find('input[name=.meta-temp-sign-' + id + ']').attr('value', sign);
                        }
                    }
                }
                var dpStatic;
                if (untrimmed == 'true') {
                    isWrapped = 0;
                    dPform = dParent.closest('form');
                    if (dPform.length === 0) {
                        dPform = $(dParent).find('form:first');
                        isWrapped = 1;
                    }
                    if (overlay != null) { overlay.fadeOut('fast'); }
                    if (isWrapped == 1) {
                        dpStatic = dPform.html(sData);
                    } else {
                        dpStatic = $(sData);
                        dPform.empty().replaceWith(dpStatic);
                    }
                    if (dPform[0]._editParent != null) { cms.EditBlock.WireUpInnerForm(dpStatic.parent(), $(dPform[0]._editParent)); }
                } else {
                    var dPtable = dParent.closest('table');
                    if (overlay != null) { overlay.fadeOut('fast'); }
                    if (isWrapped == 1) {
                        dpStatic = dParent.html(sData);
                    } else {
                        dpStatic = $(sData);
                        dParent.empty().replaceWith(dpStatic);
                    }
                    if (dPtable.length > 0) { if (dPtable.tableDnDUpdate) { dPtable.tableDnDUpdate(); } cms.HandleReorder(dPtable); }
                    else {
                        var dPblock = dpStatic.closest('.cms-block-reorder');
                        if (dPblock.length > 0) {
                            cms.HandleReorder(dPblock);
                        }
                    }
                }
                var eEvent = xhr.getResponseHeader('X-Event');
                if (eEvent) { cms.Dynamic.HandleEventReturn(eEvent, xhr, dpStatic); }
                if (bSetUndoParent === true || cms.UndoChainParent == null || cms.UndoChainParent.length == 0) {
                    if (dpStatic.length > 0) {
                        cms.UndoChainParent = dpStatic;
                    } else if (dPform != null && dPform.length > 0) {
                        cms.UndoChainParent = dPform;
                    }
                }
                if (fCallback) { fCallback(sData, textStatus, dParent, xhr); }
                if (cms.EditBlock) { cms.EditBlock.AutoSync(dpStatic); }
            });
        }
    }
};

cms.Dynamic.HandleEventReturn = function(sEvent, xhr, dParent) {
    var sActions = xhr.getResponseHeader('X-Actions');
    eval('var actions = ' + sActions);
    var event = parseInt(sEvent, 10);
    if (actions.del > 0 && actions.hist > 0) {
        var region = '';
        cms.UndoChain.push({ 'del': actions.del, 'evt': event, 'dpr': dParent });
        cms.UndoChainParent = dParent;
        cms.Dynamic.ShowEventReturnStatus();
    }
};

cms.Dynamic.ShowEventReturnStatus = function() {
	var deleteCount = 0;
	var inner = cms.GetNoticeBox('cms-evt-return');
	if (cms.UndoChain.length > 0) {
		for (var i = 0; i < cms.UndoChain.length; i++) { deleteCount += cms.UndoChain[i].del; }
		var strMsg;
		if (deleteCount == 1) { strMsg = 'You have deleted 1 item. '; } else { strMsg = 'You have deleted ' + deleteCount + ' items. '; }
		var para = $('<p />').text(strMsg);
		var fr = $('<div />').addClass('cms-info-right-links');
		var iconText = '<img src="' + cms.RootPath + '/inc/c/cpl-sicn-restore.png" alt="" />';
		if (cms.UndoChain.length == 1) {
			$('<a />').attr('href', '#').text(' Undo').prepend(iconText).addClass('cms-fbtn-link cms-fbtn-small cms-fbtn-dark').click(cms.Dynamic.UndoLast).appendTo(fr);
		} else {
			$('<a />').attr('href', '#').text(' Undo last').prepend(iconText).addClass('cms-fbtn-link cms-fbtn-small cms-fbtn-dark').click(cms.Dynamic.UndoLast).appendTo(fr);
			$('<a />').attr('href', '#').text(' Undo all').prepend(iconText).addClass('cms-fbtn-link cms-fbtn-small cms-fbtn-dark').click(cms.Dynamic.UndoAll).appendTo(fr);
		}
		$('<a />').attr('href', '#').text('Close').prepend('<img src="' + cms.RootPath + '/inc/c/cpl-sicn-cross.png" alt="" />').addClass('cms-fbtn-link cms-fbtn-small').click(cms.Dynamic.CloseEventReturn).appendTo(fr);
		inner.empty();
		fr.appendTo(inner);
		para.appendTo(inner);
	} else {
		inner.closest('.cms-info-overlay-temp').fadeOut('slow', function() { $(this).remove(); });
	}
};

cms.Dynamic.UndoLast = function() {
	var obj = cms.UndoChain.pop();
	var url = cms.RootPath + '/wf.ashx?f=hist.undo&evt=' + obj.evt;
	$.get(url, null, function(sData, sStatus, xhr) {
		if (sData == 'OK') {
			cms.Dynamic.FormTransmit(cms.UndoChainParent, true);
			cms.Dynamic.ShowEventReturnStatus();
		} else {
			var inner = cms.GetNoticeBox('cms-evt-return');
			inner.empty();
			var para = $('<p/>').text('Undo failed.').appendTo(inner);
			$('<a />').attr('href', '#').text('close').click(cms.Dynamic.CloseEventReturn).appendTo(para);
			cms.Dynamic.FormTransmit(cms.UndoChainParent, true);
		}
	});
	return false;
};

cms.Dynamic.UndoAll = function() {
    var url = cms.RootPath + '/wf.ashx?f=hist.undo';
    for (var i = 0; i < cms.UndoChain.length; i++) {
        var obj = cms.UndoChain[i];
        url = url + '&evt=' + parseInt(obj.evt, 10);
    }
    $.get(url, null, function(sData, sStatus, xhr) {
        if (sData == 'OK') {
            cms.Dynamic.FormTransmit(cms.UndoChainParent, true);
            cms.Dynamic.CloseEventReturn();
        } else {
            var inner = cms.GetNoticeBox('cms-evt-return');
            inner.empty();
            var para = $('<p/>').text('At least one undo failed.').appendTo(inner);
            $('<a />').attr('href', '#').text('close').click(cms.Dynamic.CloseEventReturn).appendTo(para);
            cms.Dynamic.FormTransmit(cms.UndoChainParent, true);
        }
    });
    return false;
};

cms.Dynamic.CloseEventReturn = function(){
	$('#cms-evt-return').closest('.cms-info-overlay-temp').fadeOut('slow', function() { $(this).remove(); });
	cms.UndoChain = [];
	return false;
};

cms.SetParameter = function(sName, sValue, bPerm) {
	var url = cms.RootPath + '/wf.ashx?f=sp';
	$.post(url, { n: sName, v: sValue, p: bPerm == true ? '1' : '' });
};

cms.FollowFirstLink = function(obj) {
	var href = $(obj).find('a:first').attr('href');
	if (href) { window.location = href; }
	return false;
};

cms.ChangeTab = function (event, ui) {
    var tabGroup = $(ui.panel).closest('.ui-tabs');
    var tabGroupId = tabGroup[0].id;
    var tabId = ui.panel.id;
    var tabIndex = tabId.substr(tabId.indexOf('-') + 1);
    var tgt = $('#txn-tgidx_' + tabGroupId);
    if (tgt.length > 0) { tgt.attr('value', tabIndex); }
    if (cms.EditBlock) { cms.EditBlock.AutoSync(ui.panel); }

    var deferState = tabGroup.data('deferState');
    if (deferState) {
        var curState = deferState[tabIndex - 1];
        if (!curState) {
            curState = { loaded: false };
            deferState[tabIndex - 1] = curState;
            $(ui.panel).html('<div class="cms-tabdefer-loading"><div class="cms-tabdefer-loading-inner">&nbsp;</div></div>');
            var dest = $(ui.panel).closest('form').attr('action');
            var rts = /(\?|&)rts=([^&]+)(&|$)/.exec(dest)[2];
            var url = cms.RootPath + '/wf.ashx/ui.tabpanel?rts=' + rts + '&t.id=' + tabGroupId + '&t.idx=' + (tabIndex - 1) + '&p.lr=' + cms.LinkRenderId + '&p.rand=' + Math.random();
            // Get local variables
            var lvRegex = /(\?|&)(lv\.[a-zA-Z0-9_]+=[^&]+)(&|$|#)/g;
            var match = lvRegex.exec(dest);
            var target = dest;
            if (match == null) { match = lvRegex.exec(window.location.href); target = window.location.href; }
            while (match != null) {
                url = url + '&' + match[2];
                lvRegex.lastIndex--;
                match = lvRegex.exec(target);
            }
            var li = $(ui.tab).closest('li');
            var tab = $(ui.tab).addClass('cms-tabdefer-loading-tab');
            $.get(url, function (data) {
                var pnl = $(ui.panel);
                pnl.html(data);
                tab.removeClass('cms-tabdefer-loading-tab');
                li.removeClass('cms-tabdefer-deferred');
                curState.loaded = true;
                if (cms.EditBlock) { cms.EditBlock.AutoSync(ui.panel); }
                if (cms.Grid) { if (cms.Grid.WireupCallback) { cms.Grid.WireupCallback(pnl); } }
            });
        }
    }
};

cms.RefreshTab = function (link) {
    var tabGroup = $(link).closest('.ui-tabs');
    var tabGroupId = tabGroup[0].id;
    var tab = tabGroup.find('ul.ui-tabs-nav li.ui-state-active a');
    var panel = tabGroup.find('div.ui-tabs-panel').not('.ui-tabs-hide');
    var tabId = panel[0].id;
    var tabIndex = tabId.substr(tabId.indexOf('-') + 1);

    var deferState = tabGroup.data('deferState');
    if (deferState) {
        var curState = deferState[tabIndex - 1];
        if (curState && curState.loaded == true) {
            curState.loaded = false;
            var dest = tabGroup.closest('form').attr('action');
            var rts = /(\?|&)rts=([^&]+)(&|$)/.exec(dest)[2];
            var url = cms.RootPath + '/wf.ashx/ui.tabpanel?rts=' + rts + '&t.id=' + tabGroupId + '&t.idx=' + (tabIndex - 1) + '&p.lr=' + cms.LinkRenderId + '&p.rand=' + Math.random();
            // Get local variables
            var lvRegex = /(\?|&)(lv\.[a-zA-Z0-9_]+=[^&]+)(&|$|#)/g;
            var match = lvRegex.exec(dest);
            var target = dest;
            if (match == null) { match = lvRegex.exec(window.location.href); target = window.location.href; }
            while (match != null) {
                url = url + '&' + match[2];
                lvRegex.lastIndex--;
                match = lvRegex.exec(target);
            }
            var li = tab.closest('li');
            var tab = tab.addClass('cms-tabdefer-loading-tab');
            $.get(url, function (data) {
                var pnl = $(panel);
                pnl.html(data);
                tab.removeClass('cms-tabdefer-loading-tab');
                li.removeClass('cms-tabdefer-deferred');
                curState.loaded = true;
                if (cms.EditBlock) { cms.EditBlock.AutoSync(panel); }
                if (cms.Grid) { if (cms.Grid.WireupCallback) { cms.Grid.WireupCallback(pnl); } }
            });
        }
    }
    return false;
};

cms.FlatButton = function() { };
cms.FlatButton.Click = function(sName, bNoDyn, oElm, sValue, sConfirm) {
	if (sConfirm != null && sConfirm != '' && confirm(sConfirm) == false) { return false; }
	var e = $(oElm);
	var btn = e.data('FlatButton.Target');
	if (btn == null) {
		btn = $('<input type="submit" />');
		btn.attr('name', sName).attr('value', sValue);
		btn.addClass('cms-button-hidden');
		if (bNoDyn == true) { btn.addClass('cms-button-nodyn'); }
		btn.appendTo(e.parent()).click(cms.Dynamic.ClickButton);
		e.data('FlatButton.Target', btn);
	}
	btn.click();
	return false;
};
cms.FlatButton.PseudoClick = function(e) {
    if ($(e.target).is('input') == false) {
        var r = $(this).find('input:first'); r.attr('checked', r.attr('checked') == false).click();
    }
};

cms.EditBlock = function() { };
cms.EditBlock.InitComplete = 0;
cms.EditBlock.SidePadding = 16;
cms.EditBlock.ToggleMaximise = function(objLink, iType, iObject) {
	iType = parseInt(iType, 10);
	iObject = parseInt(iObject, 10);
	// Get current scrolltop
	var oldSt = $(window).scrollTop();
	// Find closest parent
	var ebParent = $(objLink).closest('.cms-eblk');
	if (ebParent.length > 0) {
		if (ebParent[0]._maximised == 1 && ebParent[0]._standin) {
			// Minimise
			if (iType > 0 && iObject != 0) { cms.SetParameter('EditBlock.' + iType + '.' + iObject + '.Max', 'false'); }
			var standin = $(ebParent[0]._standin);
			ebParent.animate({
				width: standin.width(),
				left: standin.position().left
			}, 100, null, function() {
				// Destroy standin
				standin.remove();
				// Reset positioning
				ebParent.css('position', '').css('z-index', '').css('top', '').css('left', '').css('width', '');
				ebParent.find('.cms-eblk-inner').removeClass('cms-eblk-inner-exp');
				// Reset trace stuffs
				$(objLink).removeClass('cms-eblk-maxbtn-out').attr('title', 'Expand Editor');
				ebParent[0]._maximised = 0;
				// Resync wrapper sizing
				cms.EditBlock.SyncWidth(ebParent);
				// Check vertical
				cms.EditBlock.Check();
			});
		} else {
			// Place editor
			if (iType > 0 && iObject != 0) { cms.SetParameter('EditBlock.' + iType + '.' + iObject + '.Max', 'true'); }
			var oHeight = ebParent.outerHeight();
			var oPos = ebParent.position();
			var oOffset = ebParent.offset();
			var oNewLeft = oPos.left - oOffset.left + cms.EditBlock.SidePadding + 1;
			var oWidth = ebParent.width();
			ebParent.css('position', 'absolute').css('top', oPos.top).css('left', oPos.left).width(oWidth);
			ebParent.find('.cms-eblk-inner').addClass('cms-eblk-inner-exp');
			ebParent.animate({
				width: $(window).width() - (cms.EditBlock.SidePadding * 2) - 2,
				left: oNewLeft
			}, 100, null, function() {
				// Resync wrapper sizing
				cms.EditBlock.SyncWidth(ebParent);
				ebParent[0]._standin.height(ebParent.outerHeight());
				// Check vertical
				cms.EditBlock.Check();
			});
			// Create standin
			var replacement = $('<div/>').attr('class', 'cms-eblk-replacement').height(oHeight).insertBefore(ebParent);
			$(objLink).addClass('cms-eblk-maxbtn-out').attr('title', 'Collapse Editor');

			// Set trace stuffs
			ebParent[0]._maximised = 1;
			ebParent[0]._standin = replacement;
		}
	}
	// Store initial scrolltop
	$(window).scrollTop(oldSt);
	return false;
};

cms.EditBlock.SyncWidth = function(jElem) {
    jElem.each(function() {
        var top = $(this).find('.cms-eblk-top-wrap');
        var bar;
        if (top.length > 0) { // && top[0]._topFixed == 1) {
            var topTgt = $(this).find('.cms-eblk-top');
            topTgt.width(top.width() - 24);
            bar = $(this).find('.cms-eblk-bar-bg-top');
            bar.width(top.width() + 32);
        }

        var btm = $(this).find('.cms-eblk-btm-wrap');
        if (btm.length > 0) { // && btm[0]._btmFixed == 1) {
            var btmTgt = $(this).find('.cms-eblk-btm');
            btmTgt.width(btm.width() - 24);
            bar = $('.cms-eblk-bar-bg-btm');
            bar.width(btm.width() + 32);
        }
    });
};

cms.EditBlock.SyncHeight = function(jElem) {
    jElem.each(function() {
        var top = $(this).find('.cms-eblk-top-wrap');
        var bar;
        if (top.length > 0) { // && top[0]._topFixed == 1) {
            var topTgt = $(this).find('.cms-eblk-top');
            var topOffset = (cms.GadgetBarIsOpen() ? 36 : 0);
            top.height(topTgt.outerHeight());
            bar = $(this).find('.cms-eblk-bar-bg-top');
            bar.height(topTgt.outerHeight() + topOffset);
        }
        var btm = $(this).find('.cms-eblk-btm-wrap');
        if (btm.length > 0) { // && btm[0]._btmFixed == 1) {
            var btmTgt = $(this).find('.cms-eblk-btm');
            btm.height(btmTgt.outerHeight());
            bar = $('.cms-eblk-bar-bg-btm');
            bar.height(btmTgt.outerHeight());
        }
    });
};

cms.EditBlock.Init = function() {
	if (cms.EditBlock.InitComplete == 1) { return; }
	if (crm.layout != null) {
		var topTgt = $('#l-crm-inner-north');
		if (topTgt.length > 0) {
			// CRM: Move elements, remove bg etc
			$('.cms-eblk-bar-bg').remove();
			$('.cms-eblk').each(function() {
				var top = $(this).find('.cms-eblk-top');
				top.remove().appendTo(topTgt);
				crm.innerLayout.sizePane('north', crm.innerLayout.panes.north.css('height', 'auto').outerHeight());

				var btm = $(this).find('.cms-eblk-btm');
				var btmTgt = $('#l-crm-inner-south');
				var btmSub = $('<div/>').addClass('crm-button-substitute').appendTo(btmTgt);
				btm.find('input[type=submit]').each(function() {
					var thisBtn = $(this);
					$('<input type="button" class="button" />').click(function() {
						thisBtn.click();
					}).attr('value', this.value).appendTo(btmSub);
				});
				crm.innerLayout.sizePane('south', crm.innerLayout.panes.south.css('height', 'auto').outerHeight());
			});
		} else {
			$('.cms-eblk-btm').css('display', 'block');
		}
	} else {
		$('.cms-eblk-bar-bg').hide();
		cms.EditBlock.Check();
		$(window).scroll(cms.EditBlock.Check);
		$(window).resize(cms.EditBlock.Check);
	}
	cms.EditBlock.InitComplete = 1;
};

cms.EditBlock.AutoSync = function(el) {
	cms.EditBlock.Check();
	var eParent = $(el).closest('.cms-eblk');
	if (eParent.length > 0) {
		if (eParent[0]._standin) { eParent[0]._standin.height(eParent.outerHeight()); }
		cms.EditBlock.SyncHeight(eParent);
	}
};

cms.EditBlock.Check = function() {
	var dupChildren = $('.cms-eblk .cms-eblk');
	dupChildren.removeClass('.cms-eblk').addClass('.cms-eblk-duplicate');
	dupChildren.find('.cms-eblk-top').removeClass('.cms-eblk-top');
	dupChildren.find('.cms-eblk-top-wrap').removeClass('.cms-eblk-top-wrap');
	dupChildren.find('.cms-eblk-btm').removeClass('.cms-eblk-btm');
	dupChildren.find('.cms-eblk-btm-wrap').removeClass('.cms-eblk-btm-wrap');
	$('.cms-eblk').each(function() {
		var tx = $(this);

		if (tx.hasClass('cms-eblk-premax')) {
			// Pre-maximised
			tx.removeClass('cms-eblk-premax');
			var oHeight = tx.outerHeight();
			var oPos = tx.position();
			var oOffset = tx.offset();
			var oNewLeft = oPos.left - oOffset.left + cms.EditBlock.SidePadding + 1;
			var oWidth = tx.width();
			tx.css('position', 'absolute').css('top', oPos.top).css('left', oPos.left)
                .width($(window).width() - (cms.EditBlock.SidePadding * 2) - 2)
                .css('left', oNewLeft);
			tx.find('.cms-eblk-inner').addClass('cms-eblk-inner-exp');
			// Resync wrapper sizing
			cms.EditBlock.SyncWidth(tx);

			// Create standin
			var replacement = $('<div/>').attr('class', 'cms-eblk-replacement').height(oHeight).insertBefore(tx);
			tx.find('.cms-eblk-maxbtn').addClass('cms-eblk-maxbtn-out').attr('title', 'Collapse Editor');

			// Set trace stuffs
			tx[0]._maximised = 1;
			tx[0]._standin = replacement;
			tx[0]._standin.height(tx.outerHeight());
			tx.removeClass('cms-eblk-premax');
		}

		var top = tx.find('.cms-eblk-top-wrap');
		var topTgtHeight = 0;
		var bar;
		if (top.length > 0) {
			var topTgt = $(this).find('.cms-eblk-top');
			topTgtHeight = topTgt.outerHeight();
			var topOffset = (cms.GadgetBarIsOpen() ? 36 : 0);
			if (top.offset().top < $(window).scrollTop() + topOffset) {
				if (top[0]._topFixed != 1) {
					top[0]._topFixed = 1;
					top.height(topTgt.outerHeight());
					topTgt.addClass('cms-eblk-top-fixed');
					topTgt.width(top.width() - 24);
					topTgt.css('top', 0);
					bar = $(this).find('.cms-eblk-bar-bg-top');
					bar.height(topTgt.outerHeight() + topOffset);
					bar.width(top.width() + 32);
					bar.css('position', 'fixed').css('top', 0);
					if (cms.GadgetBarIsOpen() == true) { topTgt.addClass('cms-eblk-bar-gbpad'); }
					bar.stop().fadeIn('slow');
				}
			} else {
				if (top[0]._topFixed > 0) {
					top[0]._topFixed = 0;
					topTgt.removeClass('cms-eblk-top-fixed');
					topTgt.css('top', 0);
					topTgt.removeClass('cms-eblk-bar-gbpad');
					bar = $(this).find('.cms-eblk-bar-bg-top');
					bar.height(topTgt.outerHeight());
					bar.css('position', 'absolute').css('top', top.position().top);
					bar.stop().fadeOut('slow');
				}
			}
		}

		var btm = $(this).find('.cms-eblk-btm-wrap');
		if (btm.length > 0) {
			var btmTgt = $(this).find('.cms-eblk-btm');
			if (btm.offset().top + btm.outerHeight() > $(window).height() + $(window).scrollTop()) {
				// Bottom bar is off the bottom of the screen
				if (btm[0]._btmFixed != 1) {
					btm[0]._btmFixed = 1;
					btm.height(btmTgt.outerHeight());
					btmTgt.addClass('cms-eblk-btm-fixed');
					btmTgt.removeClass('cms-eblk-top-fixed');
					btmTgt.css('top', '');
					btmTgt.width(btm.width() - 24);
					bar = $('.cms-eblk-bar-bg-btm');
					bar.height(btmTgt.outerHeight());
					bar.width(btm.width() + 32);
					bar.css('position', 'fixed').css('bottom', 0).css('top', '');
					bar.stop().fadeIn('slow');
				}
			} else if (btm.offset().top < $(window).scrollTop() + topTgtHeight) {
				if (btm[0]._btmFixed != 2) {
					btm[0]._btmFixed = 2;
					btm.height(btmTgt.outerHeight());
					btmTgt.addClass('cms-eblk-top-fixed');
					btmTgt.removeClass('cms-eblk-btm-fixed');
					btmTgt.css('top', topTgtHeight);
					btmTgt.width(btm.width() - 24);
					bar = $('.cms-eblk-bar-bg-btm');
					bar.height(btmTgt.outerHeight());
					bar.width(btm.width() + 32);
					bar.css('position', 'fixed').css('top', topTgtHeight).css('bottom', '');
					bar.stop().fadeIn('slow');
				}
			} else {
				if (btm[0]._btmFixed > 0) {
					btm[0]._btmFixed = 0;
					btmTgt.removeClass('cms-eblk-btm-fixed');
					btmTgt.removeClass('cms-eblk-top-fixed');
					btmTgt.css('bottom', '').css('top', '');
					bar = $(this).find('.cms-eblk-bar-bg-btm');
					bar.css('position', 'absolute').css('top', btm.position().top).css('bottom', '');
					bar.stop().fadeOut('slow');
				}
			}
		}
	});
};

cms.EditBlock.CloseCapture = function(oLink) {
    // Zoom back out
    var eParent = $(oLink).closest('.cms-eblk');
    cms.EditBlock.CloseCaptureDirect(eParent);
};

cms.EditBlock.CloseCaptureDirect = function(eParent, iTypeId, iObjectId, bCommit) {
    var tgt = eParent[0]._captureOverlay;
    if (tgt) {
        var src = tgt._originalSource;
        var form = tgt._form;
        clearInterval(tgt._vertSyncInterval);
        tgt.fadeIn('fast', function() { $(form).remove(); });
        eParent.find('.cms-eblk-wrap-placeholder').remove();
        eParent.find('.cms-eblk-inner').show();
        tgt.animate({
            width: src.width(),
            height: src.height(),
            top: src.position().top,
            left: src.position().left
        }, 500);
        setTimeout(function() { tgt.fadeOut('slow'); }, 200);

        if (iTypeId > 0 && iObjectId > 0) {
            setTimeout(function() {
                var fName = cms.Dynamic.SetFieldInRegion(src, eParent[0]._storeIntoField, iObjectId);
                if (fName !== null) { cms.Dynamic.TransmitByFieldName(src, fName, bCommit); }
            }, 1000);
        }
        eParent.find('.cms-eblk-additional').fadeOut('fast', function() { $(this).remove(); cms.EditBlock.Check(); cms.EditBlock.SyncHeight(eParent); });
        eParent.find('.cms-eblk-btm').find(':input').attr('disabled', '');
        cms.EditBlock.Check();
    }
    return false;
};

cms.EditBlock.Capture = function (iType, iObject, iAction, oLink, sStoreIntoField, bCommit) {
	// Find parent .cms-eblk
	var eParent = $(oLink).closest('.cms-eblk');
	// Find parent .cms-dyn
	var dParent = $(oLink).closest('.cms-dyn');

	if (eParent.length > 0 && dParent.length > 0) {
		// Fade in addition header/footer bars
		var topBar = eParent.find('.cms-eblk-top');
		if (topBar.length > 0) {
			var topBarAdditional = topBar.find('.cms-eblk-additional');
			if (topBarAdditional.length === 0) {
				topBarAdditional = $('<div />').addClass('cms-eblk-additional').appendTo(topBar);
				$('<div/>').addClass('cms-eblk-additional-cancel').click(function () { cms.EditBlock.CloseCapture(this); }).appendTo(topBarAdditional);
			}
			$('<h4/>').html('Editing Object').appendTo(topBarAdditional);
		}
		var btmBar = eParent.find('.cms-eblk-btm');
		if (btmBar.length > 0) {
			var btmBarAdditional = btmBar.find('.cms-eblk-additional');
			if (btmBarAdditional.length === 0) {
				btmBar.find(':input').attr('disabled', true);
				btmBarAdditional = $('<div />').addClass('cms-eblk-additional').prependTo(btmBar);
				btmBarAdditional.html('<p><input type="button" class="submit cms-capture-save" value="Save" /><input type="button" class="submit cms-capture-save-close" value="Save and Close" /></p>');
				btmBarAdditional.find('input.cms-capture-save').click(function () {
					eParent[0]._actualForm._closeAfterSave = 0;
					eParent[0]._actualForm.submit();
				});
				btmBarAdditional.find('input.cms-capture-save-close').click(function () {
					eParent[0]._actualForm._closeAfterSave = 1;
					eParent[0]._actualForm.submit();
				});
				eParent[0]._editSubmit = btmBarAdditional;
			}
		}
		cms.EditBlock.SyncHeight(eParent);
		// Create wrapper and blow up to full size
		var iParent = $(oLink).closest('.cms-eblk-inner');
		var ovl = $('<div/>').css('position', 'absolute').addClass('cms-dyn-overlay-flat')
			.css('top', dParent.position().top)
			.css('left', dParent.position().left)
			.height(dParent.outerHeight())
			.width(dParent.outerWidth())
		//.css('background','#f00')
			.insertAfter(dParent)
			.hide();
		var oPos = iParent.position();
		var oOffset = iParent.offset();
		ovl.fadeIn('slow');
		// In 500ms, do a 400ms transition to full size
		setTimeout(function () {
			// Do animation
			ovl.animate({
				width: iParent.outerWidth(),
				height: iParent.outerHeight(),
				left: iParent.offset().left + oPos.left - oOffset.left,
				top: iParent.offset().top + oPos.top - oOffset.top
			}, 200, null, function () {
				// Load AJAX
				var form = $('<div/>').addClass('cms-eblk-innerform').css('top', oOffset.top).css('left', oOffset.left).width(iParent.innerWidth());
				form.prependTo('body');
				form.load(cms.RootPath + '/p.ashx?t=' + iType + '&d=' + iObject + '&a=' + iAction + '&p.lr=' + cms.LinkRenderId + '&p.rand=' + Math.random(), null, function () {
					// Get description
					var xHdr = null;
					try { xHdr = form.find('.cms-eblk-top').find('h3').text(); }
					catch (e) { }
					if (xHdr !== '' && xHdr !== null) { topBar.find('.cms-eblk-additional').find('h4').text(xHdr); }
					//ovl.removeClass('cms-dialog-loading');
					ovl._form = form;
					ovl.fadeOut();
					var iPlaceHolder = $('<div />').addClass('cms-eblk-wrap-placeholder').height(form.outerHeight()).insertBefore(iParent);
					iParent.hide();
					cms.EditBlock.Check();
					ovl._vertSyncInterval = setInterval(function () {
						iPlaceHolder.height(form.outerHeight());
						if (eParent[0]._maximised != iPlaceHolder._maximised) {
							var pos = iPlaceHolder.offset();
							form.css('left', pos.left).css('width', iPlaceHolder.innerWidth());
							iPlaceHolder._maximised = eParent[0]._maximised;
						}
					}, 250);
					cms.EditBlock.WireUpInnerForm(form, eParent);
				});
				// Fade out
			});
		}, 100);
		eParent[0]._captureOverlay = ovl;
		eParent[0]._storeIntoField = sStoreIntoField;
		eParent[0]._sourceLink = oLink;
		eParent[0]._commitAfterSave = bCommit === true ? true : false;
		ovl._originalSource = dParent;
	}
	return false;
};

cms.EditBlock.TargetUniqueId = 0;

cms.EditBlock.WireUpInnerForm = function(form, eParent) {
	form.find("input[type=submit]").click(cms.Dynamic.ClickButton);
	form.find('.cms-button-primary').hide();
	form.find('.cms-eblk-bar-bg').remove();
	var realForm = form.find('form');
	var formId = form.attr('id');
	if (formId === null || formId === '') {
		formId = 'ebDyn' + (cms.EditBlock.TargetUniqueId++);
		form.attr('id', formId);
	}
	eParent[0]._actualForm = realForm;
	realForm[0]._editParent = eParent[0];
	if (realForm.length === 0) {
		alert('Warning: could not locate form to attach handlers to.');
		alert(form[0].outerHTML);
		return;
	}
	var dest = realForm.attr('action');
	realForm.attr('action', cms.RootPath + '/p.ashx' + dest.substr(dest.indexOf("?"), 2048) + '&w=1' + '&p.lr=' + cms.LinkRenderId);
	realForm.bind('submit', function() {
		// Update FCK Editors
		var dTextareas = $(this).find('textarea');
		if (dTextareas.length > 0) {
			for (var idx = 0; idx < dTextareas.length; idx++) {
				if (dTextareas[idx].fck) {
					try { FCKeditorAPI.GetInstance(dTextareas[idx].id).UpdateLinkedField(); }
					catch (e) { }
				}
			}
		}
		// Perform submit
		$(this).ajaxSubmit({
			target: '#' + formId,
			success: function() {
				// Look for a validation error count
				var success = form.find('.cms-dyn-meta-success');
				if (success.length > 0 && success.attr('value') == 'True') {
					// Succeeded. Get ID and leave
					var typeId, objectId;
					form.find('.cms-dyn-meta').each(function() {
						if (this.name == '.meta-type_id') {
							typeId = parseInt(this.value, 10);
						} else if (this.name == '.meta-object_id') {
							objectId = parseInt(this.value, 10);
						}
					});
					if (realForm._closeAfterSave == 1) {
						form.remove();
						cms.EditBlock.CloseCaptureDirect(eParent, typeId, objectId, eParent[0]._commitAfterSave);
					} else {
						// Whatever wireup is necessary goes here
						cms.EditBlock.WireUpInnerForm(form, eParent);
					}
				} else {
					// Whatever wireup is necessary goes here
					cms.EditBlock.WireUpInnerForm(form, eParent);
				}
			}
		});
		return false;
	});
};

cms.Vote = function() { };

cms.Vote.Cast = function(sPackage, oLink, cbOk, cbFailure) {
    var url = cms.RootPath + '/wf.ashx?f=vote.cast';
    $.post(url,
        { pkg: sPackage },
        function(sData, sStatus) {
            switch (sData) {
                case 'OK':
                case 'OKRepeat':
                    if (cbOk) {
                        cbOk(sData);
                    } else {
                        cms.Vote.HandleSuccess(sData, oLink);
                    }
                    break;
                default:
                    if (cbFailure) {
                        cbFailure(sData);
                    } else {
                        cms.Vote.HandleFailure(sData, oLink);
                    }
                    break;
            }
        });
    return false;
};

cms.Vote.HandleSuccess = function(sData) {
    var strMsg;
    if (sData == 'OKRepeat') {
        strMsg = 'Thanks for voting again! Your vote has been updated.';
    } else {
        strMsg = 'Thanks for voting!';
    }
    cms.DisplayMessage(strMsg);
};

cms.DisplayMessage = function(strMsg, iTimeout, sStatus) {
	if (sStatus == null || sStatus == '') { sStatus = 'ok'; }
	iTimeout = parseInt(iTimeout, 10);
	if (isNaN(iTimeout) || iTimeout <= 0) { iTimeout = 2500; }
	var outer = $('<div />').addClass('cms-info').addClass('cms-info-overlay').addClass('cms-info-overlay-temp');
	var inner = $('<div />').addClass('cms-info-inner').addClass('cms-info-' + sStatus).appendTo(outer);
	$('<p />').text(strMsg).appendTo(inner);
	outer.prependTo('body');

	setTimeout(function() {
		$('.cms-info-overlay-temp').fadeOut('slow', function() { $(this).remove(); });
	}, iTimeout);
};

cms.GetNoticeBox = function(strId) {
	var inner = $('#' + strId);
	if (inner.length == 0) {
		var outer = $('<div />').addClass('cms-info').addClass('cms-info-overlay').addClass('cms-info-overlay-temp');
		inner = $('<div />').addClass('cms-info-inner').addClass('cms-info-neutral').attr('id', strId).appendTo(outer);
		outer.prependTo('body');
	}
	return inner;
};

cms.Vote.HandleFailure = function(sData, sStatus) {
    switch (sData) {
        case 'NoCookies':
            alert('It appears you may have cookies disabled in your browser.\nPlease ensure they are enabled, then reload this page and try voting again.');
            break;
        case 'AuthFailure':
            alert('The voting link you clicked may have expired, or is otherwise invalid.\nPlease try reloading this page and voting again.');
            break;
        case 'Login':
            alert('You must be logged in in order to vote.\nPlease log in or register, then try voting again.');
            break;
        //case 'Failed':
        //case 'NoData':
        default:
            alert('Your vote was not recorded, possibly due to a temporary network issue.\nPlease try reloading this page and voting again.');
            break;
    }
};

cms.Popup = function () { };

cms.Popup.BaseOpacity = 0;
cms.Popup.ImgHoverOver = function() {
    var base = $(this);
    var tool = base.closest('.cms-img-popup-wrap').find('.cms-img-popup-tool');
    var imgImg = base.find('img.cms-img-popup-img');
    if (tool[0]._placed != 1) {
        var imgPos = base.position();
        var tBtm = imgPos.top + imgImg.outerHeight() - 30;
        tool.css('top', tBtm);
        var tRight = imgPos.left + imgImg.outerWidth() - 30;
        tool.css('left', tRight);
        tool[0]._placed = 1;
    }
    tool.fadeIn();
};
cms.Popup.ImgHoverOut = function() {
    $(this).closest('.cms-img-popup-wrap').find('.cms-img-popup-tool').fadeOut();
};
cms.Popup.Underlay = null;
cms.Popup.Active = null;
cms.Popup.Op = false;
cms.Popup.ImgClick = function() {
    cms.Popup.Op = true;
    if (cms.Popup.Active !== null) {
        if (cms.Popup.Active.closest('.cms-img-popup-wrap')[0] == $(this).closest('.cms-img-popup-wrap')[0]) { return; }
        cms.Popup.LargeImgClose(cms.Popup.Active);
    }
    $('.cms-img-popup-ctool').hide();

    var img = $(this);
    var imgImg = img.find('img.cms-img-popup-img');
    var popup = img.closest('.cms-img-popup-wrap').find('.cms-img-popup-popup');

    var offset = img.offset();
    var position = img.position();

    cms.Popup.Active = popup;

    var popupImg = popup.find('img');
    if (popupImg[0]._hasOriginalSize != 1) {
        popup.css('z-index', '-2');
        popup.css('width', 8);
        popup.css('height', 8);
        popup.show();
        popupImg[0]._hasOriginalSize = 1;
        popupImg[0]._originalWidth = popupImg.width();
        popupImg[0]._originalHeight = popupImg.height();
        popup.hide();
        popup.css('width', '');
        popup.css('height', '');
        popup.css('z-index', '');
    }
    popupImg.css('width', popupImg[0]._originalWidth);
    popupImg.css('height', popupImg[0]._originalHeight);
    var oWidth = popupImg[0]._originalWidth;
    var oHeight = popupImg[0]._originalHeight;
    // Limit to no greater than 80% of screen size
    var win = $(window);
    var xRatio = oWidth / win.width();
    var yRatio = oHeight / win.height();
    var noResetSize = false;
    if (xRatio > 0.8 || yRatio > 0.8) {
        var minRatio = Math.min(0.8 / xRatio, 0.8 / yRatio);
        oWidth = oWidth * minRatio;
        oHeight = oHeight * minRatio;
        noResetSize = true;
    }
    var top = ((win.height() - oHeight) / 2 - offset.top + position.top + $(window).scrollTop());
    var left = ((win.width() - oWidth) / 2 - offset.left + position.left);
    popup.hide();
    popup.css('width', '');
    popup.css('height', '');

    var ul = $('<div />').addClass('cms-img-popup-ul');
    ul.insertAfter(popup);
    ul.css('width', oWidth + 20);
    ul.css('height', oHeight + 20);
    ul.css('top', top - 10);
    ul.css('left', left - 10);
    cms.Popup.DeleteUnderlay(ul);

    // Set to sizing and position of image
    popup.css('top', position.top);
    popup.css('left', position.left);
    var ratio = Math.max(imgImg.width() / oWidth, imgImg.height() / oHeight);
    var newWidth = oWidth * ratio;
    var newHeight = oHeight * ratio;
    popupImg.width(newWidth);
    popupImg.height(newHeight);

    // Animate
    popup.animate({
        top: top,
        left: left,
        width: oWidth,
        height: oHeight
    }, 200);
    popupImg.animate({
        width: oWidth,
        height: oHeight
    }, 200, null, function() {
        if (noResetSize === false) { popupImg.css('width', '').css('height', ''); }
        cms.Popup.Op = false;
    });

    popup.fadeIn('fast', function() {
        ul.show();
        if (cms.Popup.Over === true) {
            popup.find('.cms-img-popup-ctool').fadeIn();
        }
    });
};
cms.Popup.ImgChangeDynamic = function(objTgt, iSmallVerId, iLargeVerId) {
    iSmallVerId = parseInt(iSmallVerId, 10);
    iLargeVerId = parseInt(iLargeVerId, 10);
    var tgt = $(objTgt);
    tgt.find('.cms-img-popup').each(function() { this._imgVersionId = null; });
    tgt.find('img.cms-img-popup-img').attr('src', cms.RootPath + '/f.ashx?v=' + iSmallVerId);
    tgt.find('.cms-img-popup-popup').each(function() {
        var classes = $(this).attr('class').split(' ');
        var clsPrefix = 'cms-img-popup-deferred';
        for (var i = 0; i < classes.length; i++) {
            var cls = classes[i];
            if (cls.substr(0, clsPrefix.length) == clsPrefix) { $(this).removeClass(cls); }
        }
        $(this).addClass('cms-img-popup-deferred').addClass('cms-img-popup-deferred-' + iLargeVerId);
    });
    tgt.find('.cms-img-popup-tool').each(function() { this._placed = 0; });
};
cms.Popup.ImgClickDynamic = function() {
    cms.Popup.Op = true;
    var img = $(this);

    if (cms.Popup.Active !== null) {
        if (cms.Popup.Active.closest('.cms-img-popup-wrap')[0] == img.closest('.cms-img-popup-wrap')[0]) { return; }
        cms.Popup.LargeImgClose(cms.Popup.Active);
    }
    $('.cms-img-popup-ctool').hide();

    var imgImg = img.find('img.cms-img-popup-img');
    var wrap = img.closest('.cms-img-popup-wrap');
    wrap.addClass('cms-img-popup-loading');
    var popup = wrap.find('.cms-img-popup-popup');

    var iVerId = parseInt(img[0]._imgVersionId, 10);
    if (iVerId == 0 || isNaN(iVerId)) {
        var classes = popup.attr('class').split(' ');
        var clsPrefix = 'cms-img-popup-deferred-';
        for (var i = 0; i < classes.length; i++) {
            var cls = classes[i];
            if (cls.substr(0, clsPrefix.length) == clsPrefix) {
                iVerId = parseInt(cls.substr(clsPrefix.length), 10);
                popup.removeClass(cls);
                popup.removeClass('cms-img-popup-deferred');
                break;
            }
        }
        img[0]._imgVersionId = iVerId;
    }

    cms.Popup.Active = popup;

    var popupImg = popup.find('img');

    var imgSrc = cms.RootPath + '/f.ashx?v=' + iVerId;
    if (popupImg.length == 0) {
        var newImg = $('<img/>')
            .attr('alt', imgImg.attr('alt'))
            .attr('title', imgImg.attr('title'))
            .load(cms.Popup.ImgLoad);
        newImg.appendTo(popup);
        newImg.attr('src', imgSrc);
    } else {
        if (popupImg.attr('src') == cms.RootPath + '/f.ashx?v=' + iVerId) {
            cms.Popup.ImgLoadComplete(popupImg[0]);
        } else {
            popupImg
                .attr('alt', imgImg.attr('alt'))
                .attr('title', imgImg.attr('title'))
                .attr('src', cms.RootPath + '/f.ashx?v=' + iVerId);
        }
    }
};
cms.Popup.ImgLoad = function() {
    var here = $(this);
    var popup = here.closest('.cms-img-popup-popup');
    popup.css('z-index', '-2');
    popup.css('width', 8);
    popup.css('height', 8);
    here.css('width', '');
    here.css('height', '');
    popup.show();
    this._hasOriginalSize = 1;
    this._originalWidth = here.width();
    this._originalHeight = here.height();
    popup.hide();
    popup.css('width', '');
    popup.css('height', '');
    popup.css('z-index', '');
    cms.Popup.ImgLoadComplete(this);
};
cms.Popup.ImgLoadComplete = function(objImg) {
    var popupImg = $(objImg);
    var popup = popupImg.closest('.cms-img-popup-popup');
    var wrap = popupImg.closest('.cms-img-popup-wrap');
    wrap.removeClass('cms-img-popup-loading');

    var smlImg = wrap.find('.cms-img-popup');
    var imgImg = smlImg.find('img');
    var offset = smlImg.offset();
    var position = smlImg.position();

    popupImg.css('width', objImg._originalWidth);
    popupImg.css('height', objImg._originalHeight);

    var oWidth = objImg._originalWidth;
    var oHeight = objImg._originalHeight;
    // Limit to no greater than 80% of screen size
    var win = $(window);
    var xRatio = oWidth / win.width();
    var yRatio = oHeight / win.height();
    var noResetSize = false;
    if (xRatio > 0.8 || yRatio > 0.8) {
        var minRatio = Math.min(0.8 / xRatio, 0.8 / yRatio);
        oWidth = oWidth * minRatio;
        oHeight = oHeight * minRatio;
        noResetSize = true;
    }
    var top = ((win.height() - oHeight) / 2 - offset.top + position.top + $(window).scrollTop());
    var left = ((win.width() - oWidth) / 2 - offset.left + position.left);
    popup.hide();
    popup.css('width', '');
    popup.css('height', '');

    var ul = $('<div />').addClass('cms-img-popup-ul');
    ul.insertAfter(popup);
    ul.css('width', oWidth + 20);
    ul.css('height', oHeight + 20);
    ul.css('top', top - 10);
    ul.css('left', left - 10);
    cms.Popup.DeleteUnderlay(ul);

    // Set to sizing and position of image
    popup.css('top', position.top);
    popup.css('left', position.left);
    var ratio = Math.max(imgImg.width() / oWidth, imgImg.height() / oHeight);
    var newWidth = oWidth * ratio;
    var newHeight = oHeight * ratio;
    popupImg.width(newWidth);
    popupImg.height(newHeight);

    // Animate
    popup.animate({
        top: top,
        left: left,
        width: oWidth,
        height: oHeight
    }, 200);
    popupImg.animate({
        width: oWidth,
        height: oHeight
    }, 200, null, function() {
        if (noResetSize === false) { popupImg.css('width', '').css('height', ''); }
        cms.Popup.Op = false;
    });

    popup.fadeIn('fast', function() {
        ul.show();
        if (cms.Popup.Over === true) {
            popup.find('.cms-img-popup-ctool').fadeIn();
        }
    });
};
cms.Popup.LargeImgClick = function() {
    cms.Popup.LargeImgClose($(this));
};
cms.Popup.DeleteUnderlay = function(newUl) {
    var ulx = cms.Popup.Underlay;
    cms.Popup.Underlay = newUl;
    if (ulx !== null) {
        ulx.fadeOut('fast', function() { $(this).remove(); });
    }
};
cms.Popup.LargeImgClose = function(popup) {
    cms.Popup.DeleteUnderlay(null);
    cms.Popup.Active = null;

    var img = popup.closest('.cms-img-popup-wrap').find('.cms-img-popup');
    var imgImg = img.find('img.cms-img-popup-img');
    popup.find('.cms-img-popup-ctool').hide();

    // Determine ratio
    var popupImg = popup.find('img');
    var ratio = Math.max(imgImg.width() / popupImg.width(), imgImg.height() / popupImg.height());
    var newWidth = popupImg.width() * ratio;
    var newHeight = popupImg.height() * ratio;
    // Animate to sizing and position of image
    var position = img.position();
    popup.animate({
        width: imgImg.width(),
        height: imgImg.height(),
        top: position.top,
        left: position.left
    }, 200);
    popupImg.animate({
        width: newWidth,
        height: newHeight
    }, 200);

    popup.closest('.cms-img-popup-popup').fadeOut('fast');
};
cms.Popup.Over = false;
cms.Popup.LargeImgHoverOver = function() {
    cms.Popup.Over = true;
    if (cms.Popup.Op === true) { return; }
    var base = $(this);
    var tool = base.closest('.cms-img-popup-wrap').find('.cms-img-popup-ctool');
    tool.fadeIn();
};
cms.Popup.LargeImgHoverOut = function() {
    cms.Popup.Over = false;
    var wrap = $(this).closest('.cms-img-popup-wrap');
    if (wrap.hasClass('cms-img-popup-loading') == false) {
        wrap.find('.cms-img-popup-ctool').fadeOut();
    }
};

cms.linkNewWindow = function(oLink) { window.open(oLink.href); return false; };

cms.OpenFilePicker = function (strId) {
	var tgtControl = $(document.getElementById(strId));
	var pDialog = $('<div/>').attr('title', 'Choose a file');
	var dConfig = {
		bgiframe: true,
		modal: true,
		width: 500,
		height: 350,
		dialogClass: 'cms-picker-loader'
	};
	pDialog.dialog(dConfig);
	var sUrl = window.parent.cms.RootPath + '/p.ashx?t=268570528&d=3&p.lr=' + cms.LinkRenderId + '&p.rand=' + Math.random();
	window.curDialogBaseUrl = sUrl;
	sUrl += '&lv.file_id=' + parseInt(tgtControl.val(), 10);
	pDialog.load(sUrl, null, function () { pDialog.closest('.ui-dialog').removeClass('cms-picker-loader'); });

	window.storeFileChoice = function (iFileId) {
		tgtControl.val(parseInt(iFileId, 10));
		pDialog.dialog('close');
		pDialog.remove();
		window.storeFileChoice = null;
	};

	return false;
};

cms.Email = function() { };
cms.Email.MergeFields = null;
cms.Email.GetMergeFields = function(fCallback) {
	if (cms.Email.MergeFields == null) {
		if ($('#cms-merge-fields').length == 0) {
			$('<script/>')
				.attr('id', 'cms-merge-fields')
				.attr('type', 'text/javascript')
				.attr('src', cms.RootPath + '/wf.ashx?f=mailout.getfields')
				.appendTo('head');
		}
	}
	return cms.Email.MergeFields;
};

cms.markAll = function(tag, oChk) {
	$('input.cms-mark-' + tag).attr('checked', oChk.checked);
};

cms.ImageCheckbox = function () { };
cms.ImageCheckbox.Enable = function () {
    $('span.cms-imgchk-wrap').not('.cms-imgchk-wrap-enabled').each(function () {
        var t = $(this);
        t.find('img').click(cms.ImageCheckbox.Click);
        t.find('input.cms-checkbox').click(cms.ImageCheckbox.ClickInput);
        t.addClass(t.find('input.cms-checkbox').is(':checked') ? 'cms-imgchk-wrap-on' : 'cms-imgchk-wrap-off');
        t.addClass('cms-imgchk-wrap-enabled');
    });
};
cms.ImageCheckbox.Click = function () {
    var wrap = $(this).closest('.cms-imgchk-wrap');
    var chk = wrap.find('input.cms-checkbox');
    if (wrap.is('.cms-imgchk-wrap-on')) {
        chk.removeAttr('checked');
        wrap.removeClass('cms-imgchk-wrap-on').addClass('cms-imgchk-wrap-off');
    } else {
        chk.attr('checked', 'checked');
        wrap.removeClass('cms-imgchk-wrap-off').addClass('cms-imgchk-wrap-on');
    }
    if (chk.is('.cms-dyn-trigger')) { cms.Dynamic.TriggerTransmitObject(chk[0]); }
};
cms.ImageCheckbox.ClickInput = function () {
	var wrap = $(this).closest('.cms-imgchk-wrap');
	if ($(this).is(':checked')) {
		wrap.removeClass('cms-imgchk-wrap-off').addClass('cms-imgchk-wrap-on');
	} else {
		wrap.removeClass('cms-imgchk-wrap-on').addClass('cms-imgchk-wrap-off');
	}
};

cms.Defer = function () { };
cms.Defer.InitDone = false;
cms.Defer.Init = function () {
	if (cms.Defer.InitDone == false) {
		$(window).resize(cms.Defer.Execute).scroll(cms.Defer.Trigger);
		cms.Defer.InitDone = true;
		cms.Defer.Trigger();
	}
};
cms.Defer.ExecuteClear = true;
cms.Defer.TriggerTimeout = null;
cms.Defer.ClearTimeout = null;
cms.Defer.Trigger = function () {
	if (cms.Defer.ExecuteClear == false) {
		if (cms.Defer.TriggerTimeout == null) { cms.Defer.TriggerTimeout = setTimeout(cms.Defer.Trigger, 250); }
	} else {
		if (cms.Defer.TriggerTimeout != null) { clearTimeout(cms.Defer.TriggerTimeout); }
		cms.Defer.TriggerTimeout = null;
		cms.Defer.Execute();
	}
};
cms.Defer.IsInView = function(elem, docViewTop, docViewBottom) {
	var e = $(elem);
    var elemTop = e.offset().top;
    var elemBottom = elemTop + e.height();

    return ((elemBottom >= docViewTop) && (elemTop <= docViewBottom));
};
cms.Defer.CloseParent = function () {
	$(this).closest('span').removeClass('cms-img-defer-placeholder');
};
cms.Defer.Execute = function () {
	cms.Defer.ExecuteClear = false;

	$('.cms-img-defer-placeholder').each(function () {
		var w = $(window);
		var docViewTop = w.scrollTop();
		var docViewBottom = docViewTop + w.height();

		if (this.childNodes.length == 0 && cms.Defer.IsInView(this, docViewTop, docViewBottom)) {
			var t = $(this);
			var v = parseInt(t.attr('data-v'), 10);
			if (v != 0) {
				$('<img/>').attr('src', cms.RootPath + '/f.ashx?v=' + v).attr('alt', '').appendTo(t).load(cms.Defer.CloseParent);
			}
		}
	});

	if (cms.Defer.ClearTimeout != null) { clearTimeout(cms.Defer.ClearTimeout); }
	cms.Defer.ClearTimeout = setTimeout(function () { cms.Defer.ExecuteClear = true; }, 250);
};
