//
// Set defaults for jQuery plugins etc
//
$.datepicker.setDefaults({ dateFormat: 'd M yy', duration: 'fast' });

// Establish namespace
function cms() { }
function local() { }
function crm() { }

cms.LinkRenderId = 1;

cms.OpenFckEditor = function(strId) {
    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;
    f.ToolbarSet = 'Minimal';
    var ta = $('#' + strId);
    f.Width = ta.width();  //450;
    f.Height = ta.height();  //550;
    f.ReplaceTextarea();
    ta[0].fck = f;
};

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.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('fast');
        $('#' + strId + '-toggleStore').attr('value', '0');
    } else {
        // Closed; open it
        t.addClass('cms-cgroup-open');
        t.removeClass('cms-cgroup-closed');
        $('#' + strId + '-inner').fadeIn('fast');
        $('#' + strId + '-toggleStore').attr('value', '1');
    }
    return false;
};

cms.HandleRowReorder = function(table, row) {
    cms.HandleReorder(table);
};
cms.HandleReorder = function(sortable) {
    // Build table of inputs
    var inputTable = [];
    $(sortable).find('input[type=hidden].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;
            var 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.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) {
	// 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,
		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) {
		dConfig.buttons = {
			'Discard': function() { $(this).dialog('close'); },
			'Save': 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 (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;
};

$.ajaxSetup({ error: function() { alert('An error occurred processing this request.'); } });

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);
        tField = tField[0];
        switch (tField.tagName) {
            case 'SELECT':
                tField.options[0].value = sValue;
                tField.selectedIndex = 0;
                break;
            case 'INPUT':
                tField.value = sValue;
                break;
        }
        return tField.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() {
    // Traverse parents for cms-dyn
    var dParent = $(this).closest('.cms-dyn');
    if (dParent.length > 0) {
        // Determine region tag
        var sRegion = this.name.split("-")[0];
        var nObject = { name: '.btn-' + sRegion + '-ModifyOpen-FFFFFFFF', value: 'Dynamic' };

        // Transmit
        cms.Dynamic.TransmitEvent(dParent, nObject, null);
    }
};

cms.Dynamic.TransmitEvent = function(dParent, oSrcObject, fCallback) {
    // Get parent form
    var dForm = $(dParent).closest('form');
    // 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;
            // 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);
            // Submit
            dForm.ajaxSubmit({
                dataType: 'script', // We use 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) {
                    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;
                        if (newMaxOrdinal > 0) {
                            var newOrdinalText = xhr.getResponseHeader('X-Temp-Object-List');
                            var newOrdinalList = [];
                            if (newOrdinalText !== null && newOrdinalText !== '') { newOrdinalList = newOrdinalText.split(','); }
                            dPform = dParent.closest('form');
                            if (dPform.length === 0) {
                                dPform = $(dParent).find('form:first');
                            }
                            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);
                                }
                            }
                        }
                        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) {
                                dPform.html(sData);
                            } else {
                                dPform.replaceWith(sData);
                            }
                        } else {
                            var dPtable = dParent.closest('table');
                            overlay.fadeOut('fast');
                            if (isWrapped == 1) {
                                dParent.html(sData);
                            } else {
                                dParent.replaceWith(sData);
                            }
                            if (dPtable.length > 0) { dPtable.tableDnDUpdate(); cms.HandleReorder(dPtable); }
                            else { var dPblock = dParent.closest('.cms-block-reorder'); if (dPblock.length > 0) { cms.HandleReorder(dPblock); } }
                            if (fCallback) { fCallback(sData, 'success', dParent, xhr); }
                        }
                        dParent.__dResult = null;
                    }
                    if (cms.EditBlock) { cms.EditBlock.Check(); }
                },
                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));

            // 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);

            // 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;
            var xhr = $.post(nDest, $.param(data), function(sData, textStatus) {
                var untrimmed = xhr.getResponseHeader('X-Untrimmed');
                var newMaxOrdinal = parseInt(xhr.getResponseHeader('X-Max-Temp-Ordinal'), 10);
                var dPform;
                if (newMaxOrdinal > 0) {
                    var newOrdinalText = xhr.getResponseHeader('X-Temp-Object-List');
                    var newOrdinalList = [];
                    if (newOrdinalText !== null && newOrdinalText !== '') { newOrdinalList = newOrdinalText.split(','); }
                    dPform = dParent.closest('form');
                    if (dPform.length === 0) {
                        dPform = $(dParent).find('form:first');
                    }
                    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);
                        }
                    }
                }
                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) {
                        dPform.html(sData);
                    } else {
                        dPform.replaceWith(sData);
                    }
                } else {
                    var dPtable = dParent.closest('table');
                    overlay.fadeOut('fast');
                    if (isWrapped == 1) {
                        dParent.html(sData);
                    } else {
                        dParent.replaceWith(sData);
                    }
                    if (dPtable.length > 0) { dPtable.tableDnDUpdate(); cms.HandleReorder(dPtable); }
                    else { var dPblock = dParent.closest('.cms-block-reorder'); if (dPblock.length > 0) { cms.HandleReorder(dPblock); } }
                }
                if (fCallback) { fCallback(sData, textStatus, dParent, xhr); }
                if (cms.EditBlock) { cms.EditBlock.Check(); }
            });
        }
    }
};

cms.SetParameter = function(sName, sValue) {
    var url = cms.RootPath + '/wf.ashx?f=sp';
    $.post(url, { n: sName, v: sValue });
};

cms.FollowFirstLink = function(obj) {
    window.location = $(obj).find('a:first').attr('href');
    return false;
};

cms.ChangeTab = function(event, ui) {
    var tabGroupId = $(ui.panel).closest('.ui-tabs')[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.Check();
        var eParent = $(ui.panel).closest('.cms-eblk');
        if (eParent.length > 0) {
            if (eParent[0]._standin) { eParent[0]._standin.height(eParent.outerHeight()); }
            cms.EditBlock.SyncHeight(eParent);
        }
    }
};

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('top', '').css('left', '').css('width', '');
                // 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.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.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);
            // 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.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.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.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.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.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();
                });
            }
        }
        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, 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;
    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) {
    var 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-ok').appendTo(outer);
    $('<p />').text(strMsg).appendTo(inner);
    outer.prependTo('body');

    setTimeout(function() {
        $('.cms-info-overlay-temp').fadeOut('slow', function() { $(this).remove(); });
    }, iTimeout);
};

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.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; ;
    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;
};