function GetDesignerSource(unique_id)
{
  return ('<!-- MicroTiles Calculator Begin --><div class="ui-helper-clearfix"><div class="table table-main"><div class="column-pre-2"><div class="column-pre-1"><div class="row"><div class="column-1"><div class="panel panel-dimensions"><h4><a href="#">Dimensions</a></h4><div class="center"><div class="fixed"><div class="table table-tiles"><div class="column-pre-2"><div class="column-pre-1"><div class="row"><div class="column-1"><div id="tile-selector__UID__" class="tile-selector"></div><div class="horizontal-slider-container"><div id="microtiles-horizontal-slider__UID__" class="microtiles-horizontal-slider"></div></div></div><div class="column-2"><div class="vertical-slider-container"><div id="microtiles-vertical-slider__UID__" class="microtiles-vertical-slider"></div></div></div></div></div></div></div><div class="row"><span>Note: The MicroTiles online calculator can be used for displays up to 32 tiles wide and high. To configure larger displays, please download the MicroTiles Designer software.<br />Select tiles to remove them from the display.</span></div><div class="table table-dimensions"><div class="column-pre-7"><div class="column-pre-6"><div class="column-pre-5"><div class="column-pre-4"><div class="column-pre-3"><div class="column-pre-2"><div class="column-pre-1"><form><div class="row"><div class="column-1"><br /></div><div class="column-2"><span>Width</span></div><div class="column-3"><br /></div><div class="column-4"><span>Height</span></div><div class="column-5"><span>Area</span></div><div class="column-6"><span>Occupied</span></div><div class="column-7"><br /></div></div><div class="row"><div class="column-1"><input type="radio" id="dimensions-quantity__UID__" class="dimensions-quantity" name="radio" checked /><label for="dimensions-quantity__UID__">Number of MicroTiles</label></div><div class="column-2"><input type="text" size="6" class="quantity-width" id="quantity-width__UID__" /></div><div class="column-3"><span>&times;</span></div><div class="column-4"><input type="text" size="6" class="quantity-height" id="quantity-height__UID__" /></div><div class="column-5"><input type="text" size="11" class="quantity-area" disabled id="quantity-area__UID__" /></div><div class="column-6"><input type="text" size="5" class="quantity-occupied" disabled id="quantity-occupied__UID__" /></div><div class="column-7"><br /></div></div><div class="row"><div class="column-1"><input type="radio" id="dimensions-physical__UID__" class="dimensions-physical" name="radio" /><label for="dimensions-physical__UID__">Physical Area</label></div><div class="column-2"><input type="text" size="6" class="physical-width" disabled id="physical-width__UID__" /></div><div class="column-3"><span>&times;</span></div><div class="column-4"><input type="text" size="6" class="physical-height" disabled id="physical-height__UID__" /></div><div class="column-5"><input type="text" size="11" class="physical-area" disabled id="physical-area__UID__" /></div><div class="column-6"><span class="unit-area">sq. feet</span></div><div class="column-7"><br /></div></div><div class="row"><div class="column-1"><input type="radio" id="dimensions-resolution__UID__" class="dimensions-resolution" name="radio" /><label for="dimensions-resolution__UID__">Native Resolution</label></div><div class="column-2"><input type="text" size="6" class="resolution-width" disabled id="resolution-width__UID__" /></div><div class="column-3"><span>&times;</span></div><div class="column-4"><input type="text" size="6" class="resolution-height" disabled id="resolution-height__UID__" /></div><div class="column-5"><input type="text" size="11" class="resolution-area" disabled id="resolution-area__UID__" /></div><div class="column-6"><input type="text" size="5" class="resolution-pitch" disabled id="resolution-pitch__UID__" /></div><div class="column-7"><span class="unit-pixel-pitch">pixel pitch (mm)</span></div></div><div class="row"><div class="column-1"><span id="maximum-resolution__UID__">Maximum Combined Source Resolution<sup>&#134;</sup></span></div><div class="column-2"><input type="text" size="6" class="content-width" disabled id="content-width__UID__" /></div><div class="column-3"><span>&times;</span></div><div class="column-4"><input type="text" size="6" class="content-height" disabled id="content-height__UID__" /></div><div class="column-5"><input type="text" size="11" class="content-area" disabled id="content-area__UID__" /></div><div class="column-6"><input type="text" size="5" class="content-pitch" disabled id="content-pitch__UID__" /></div><div class="column-7"><span class="unit-pixel-pitch">pixel pitch (mm)</span></div></div><div class="row"><div class="column-1"><span>Scaling</span></div><div class="column-2"><input type="text" size="6" class="scaling-width" disabled id="scaling-width__UID__" /></div><div class="column-3"><span>&times;</span></div><div class="column-4"><input type="text" size="6" class="scaling-height" disabled id="scaling-height__UID__" /></div><div class="column-5"><input type="text" size="11" class="scaling-area" disabled id="scaling-area__UID__" /></div><div class="column-6"><br /></div><div class="column-7"><br /></div></div></form></div></div></div></div></div></div></div></div><div id="warning__UID__" class="row"></div></div></div></div></div><div class="column-2"><div class="panel panel-weight"><h4><a href="#">Weight</a></h4><div class="center"><div class="fixed"><div class="table table-weight"><div class="column-pre-3"><div class="column-pre-2"><div class="column-pre-1"><div class="row"><div class="column-1"><label for="weight-tile__UID__">Per Tile</label></div><div class="column-2"><input class="weight-tile" size="10" id="weight-tile__UID__" disabled /></div><div class="column-3"><span class="unit-weight"></span></div></div><div class="row"><div class="column-1"><label for="weight-total__UID__">Total Canvas</label></div><div class="column-2"><input class="weight-total" size="10" id="weight-total__UID__" disabled /></div><div class="column-3"><span class="unit-weight"></span></div></div><div class="row"><div class="column-1"><br/></div><div class="column-2"><input class="weight-total-large" size="10" id="weight-total-large__UID__" disabled /></div><div class="column-3"><span class="unit-weight-large"></span></div></div></div></div></div></div></div></div></div><div id="panel-energy__UID__" class="panel panel-energy"><h4><a href="#">Energy Consumption</a></h4><div class="center"><div class="fixed"><div class="table table-energy"><div class="column-pre-3"><div class="column-pre-2"><div class="column-pre-1"><div class="row"><div class="column-1"><label for="brightness-slider__UID__">Brightness</label></div><div class="column-2"><div class="horizontal-slider-container"><div id="brightness-slider__UID__" class="brightness-slider"></div></div></div><div class="column-3"><span id="brightness-value__UID__" class="brightness-value">100</span></div></div><div class="row"><div class="column-1"><label for="energy-tile__UID__">Per Tile</label></div><div class="column-2"><input class="energy-tile" type="text" size="10" id="energy-tile__UID__" disabled /></div><div class="column-3"><span class="unit-energy">watts</span></div></div><div class="row"><div class="column-1"><label for="energy-total__UID__">Total Canvas</label></div><div class="column-2"><input class="energy-total" type="text" size="10" id="energy-total__UID__" disabled /></div><div class="column-3"><span class="unit-energy">watts</span></div></div><div class="row"><div class="column-1"><br /></div><div class="column-2"><input class="energy-total-large" type="text" size="10" id="energy-total-large__UID__" disabled /></div><div class="column-3"><span class="unit-energy-large">kW</span></div></div><div class="row"><div class="column-1"><br /></div><div class="column-2"><input class="thermal-total" type="text" size="10" id="thermal-total__UID__" disabled /></div><div class="column-3"><span class="unit-thermal">BTUs</span></div></div></div></div></div></div><div class="row"><span>Power consumption is estimated for a MicroTiles canvas with color and brightness matching enabled. Results may vary.</span></div></div></div></div><div id="panel-ecus__UID__" class="panel panel-ecus"><h4><a href="#">External Control Units</a></h4><div class="center"><div class="fixed"><div class="row"><span>The number of ECUs can be set manually or automatically determined based on a ratio.</span></div><div class="table table-ecus"><div class="column-pre-2"><div class="column-pre-1"><div class="row"><div class="column-1"><label for="ecu-count__UID__">Total ECUs</label></div><div class="column-2"><input type="text" size="8" class="ecu-count" id="ecu-count__UID__" /></div></div><div class="row"><div class="column-1"><label for="ecu-ratio__UID__">Tiles per ECU</label></div><div class="column-2"><input type="text" size="8" class="ecu-ratio" id="ecu-ratio__UID__" /></div></div></div></div></div></div></div></div><div id="panel-units__UID__" class="panel panel-units"><h4><a href="#">Units</a></h4><div class="center"><div class="fixed"><div class="row"><span>Select the unit system to be used for measurements and calculations.</span></div><div class="center"><form><div id="unit-selector__UID__" class="unit-selector"><input type="radio" name="radio" id="unit-metric-radio__UID__" class="unit-metric-radio" checked /><label for="unit-metric-radio__UID__">Metric</label><input type="radio" name="radio" id="unit-imperial-radio__UID__" class="unit-imperial-radio" /><label for="unit-imperial-radio__UID__">Imperial</label></div></form></div></div></div></div></div><!-- column-2 end --></div><!-- row end --></div></div></div><!-- table-main end --><div class="table"><div id="panel-bom__UID__" class="panel panel-bom"><h4><a href="#">Bill of Materials</a></h4><div class="center"><div class="fixed"><div class="table table-bom"><div class="column-pre-5"><div class="column-pre-4"><div class="column-pre-3"><div class="column-pre-2"><div class="column-pre-1"><div class="row"><div class="column-1"><span>Part Description</span></div><div class="column-2"><br /></div><div class="column-3"><span>SKU</span></div><div class="column-4"><span>Model</span></div><div class="column-5"><span>Quantity</span></div></div><div class="row"><div class="column-1"><input type="checkbox" id="bom-display-unit__UID__" class="bom-display-unit" checked /><label for="bom-display-unit__UID__">MICROTILES Display Unit D100</label></div><div class="column-2"><div class="info-display-unit info ui-state-highlight"><span class="ui-icon ui-icon-info"></span></div></div><div class="column-3"><span>123-001102-01</span></div><div class="column-4"><span>D100</span></div><div class="column-5"><input type="text" size="5" class="bom-display-unit-quantity" disabled id="bom-display-unit-quantity__UID__" /></div></div><div class="row" style="background-color:#EEE;"><div class="column-1"><input type="checkbox" id="bom-screen__UID__" class="bom-screen" checked /><label for="bom-screen__UID__">MICROTILES Screen S100</label></div><div class="column-2"><div class="info-screen info ui-state-highlight"><span class="ui-icon ui-icon-info"></span></div></div><div class="column-3"><span>123-102104-01</span></div><div class="column-4"><span>S100</span></div><div class="column-5"><input type="text" size="5" class="bom-screen-quantity" id="bom-screen-quantity__UID__" disabled /></div></div><div class="row"><div class="column-1"><input type="checkbox" id="bom-ecu__UID__" class="bom-ecu" checked /><label for="bom-ecu__UID__">MICROTILES ECU E100</label></div><div class="column-2"><div class="info-ecu info ui-state-highlight"><span class="ui-icon ui-icon-info"></span></div></div><div class="column-3"><span>123-101103-01</span></div><div class="column-4"><span>E100</span></div><div class="column-5"><input type="text" size="5" class="bom-ecu-quantity" id="bom-ecu-quantity__UID__" disabled /></div></div><div class="row" style="background-color:#EEE;"><div class="column-1"><input type="checkbox" id="bom-user-kit__UID__" class="bom-user-kit" checked /><label for="bom-user-kit__UID__">MICROTILES User Kit</label></div><div class="column-2"><div class="info-user-kit info ui-state-highlight"><span class="ui-icon ui-icon-info"></span></div></div><div class="column-3"><span>123-103105-01</span></div><div class="column-4"><span>N/A</span></div><div class="column-5"><input type="text" size="5" class="bom-user-kit-quantity" id="bom-user-kit-quantity__UID__" disabled /></div></div><div class="row"><div class="column-1"><input type="checkbox" id="bom-setup-kit__UID__" class="bom-setup-kit" checked /><label for="bom-setup-kit__UID__">MICROTILES Setup Kit</label></div><div class="column-2"><div class="info-setup-kit info ui-state-highlight"><span class="ui-icon ui-icon-info"></span></div></div><div class="column-3"><span>123-104106-01</span></div><div class="column-4"><span>N/A</span></div><div class="column-5"><input type="text" size="5" class="bom-setup-kit-quantity" id="bom-setup-kit-quantity__UID__" disabled /></div></div><div class="row" style="background-color:#EEE;"><div class="column-1"><input type="checkbox" id="bom-foot-ends__UID__" class="bom-foot-ends" checked /><label for="bom-foot-ends__UID__">MICROTILES Foot/Ends</label></div><div class="column-2"><div class="info-foot-ends info ui-state-highlight"><span class="ui-icon ui-icon-info"></span></div></div><div class="column-3"><span>123-105107-01</span></div><div class="column-4"><span>N/A</span></div><div class="column-5"><input type="text" size="5" class="bom-foot-ends-quantity" id="bom-foot-ends-quantity__UID__" disabled /></div></div><div class="row"><div class="column-1"><input type="checkbox" id="bom-foot-center__UID__" class="bom-foot-center" checked /><label for="bom-foot-center__UID__">MICROTILES Foot/Center 3pck</label></div><div class="column-2"><div class="info-foot-center info ui-state-highlight"><span class="ui-icon ui-icon-info"></span></div></div><div class="column-3"><span>123-106108-01</span></div><div class="column-4"><span>N/A</span></div><div class="column-5"><input type="text" size="5" class="bom-foot-center-quantity" id="bom-foot-center-quantity__UID__" disabled /></div></div><div class="row" style="background-color:#EEE;"><div class="column-1"><input type="checkbox" id="bom-mount-bracket__UID__" class="bom-mount-bracket" checked /><label for="bom-mount-bracket__UID__">MICROTILES Mount Bracket 2pck</label></div><div class="column-2"><div class="info-mount-bracket info ui-state-highlight"><span class="ui-icon ui-icon-info"></span></div></div><div class="column-3"><span>123-107109-01</span></div><div class="column-4"><span>N/A</span></div><div class="column-5"><input type="text" size="5" class="bom-mount-bracket-quantity" id="bom-mount-bracket-quantity__UID__" disabled /></div></div></div></div></div></div></div></div></div></div></div></div><div class="fixed"><span class="footnote"><sup>&#134;</sup>The Maximum Combined Source Resolution is based on the aggregate bandwidth of all ECUs in the canvas, using a 60Hz video refresh rate. The calculation is an estimate only, and does not consider cabling layout.</span></div></div><!-- MicroTiles Calculator End -->').replace(/__UID__/g, unique_id.toString());
}

$(document).ready(function() {
    $.fn.tooltip = function(contents) {
        var tooltip = $('<div />', {
            'class': 'tooltip',
            css: {
                'width': '17em'
            }
        });

        $('<div />', {
            'class': 'tooltip-content',
            css: {
                'background-color': '#ffffff',
                'color': '#000000',
                'width': '15em',
                'padding': '0.5em',
                'border': '6px solid #a2a2a2',
                '-moz-border-radius': '5px',
                '-webkit-border-radius': '5px',
                'border-radius': '5px'
            }
        }).appendTo(tooltip);

        $(this).hover(function() {
            tooltip.appendTo(document.body).hide();
            tooltip.find('.tooltip-content').html(contents);
            var pos = $(this).offset();
            var style = {
                'left': (pos.left),
                'top': (pos.top - (tooltip.height())),
                'position': 'absolute',
                'z-index': '1000'
            };
            tooltip.css(style);
            tooltip.show(200);
        }, function() {
            tooltip.hide(200, function() {
                $(this).remove();
            });
        });
    }

    $.fx.off = true;
    $('.mtdesigner').each(function(index, element) {
        var UID = index;
        var designer = $(element);
        designer.empty().append(GetDesignerSource(UID));

        var settings = {
            units: 'metric',
            ecus: 1,
            ecuRatio: 16,
            brightness: 100,
            canvas: {
                width: 4,
                height: 4,
                occupied: 16,
                included: []
            },
            constants: {
                tileResolutionX: 720,
                tileResolutionY: 540,
                videoRefreshRate: 60,
                blankingInterval: 0.05,
                ecuBandwidth: 165,
                contentWidthMinimum: 32,
                metric: {
                    tileWidth: 0.408,
                    tileHeight: 0.306,
                    tileWeight: 9.2,
                    tileWeightLarge: 0.0092
                },
                imperial: {
                    tileWidth: 1.33858,
                    tileHeight: 1.00393,
                    tileWeight: 20.2825281,
                    tileWeightLarge: 0.0101412641
                }
            }
        };

        for (var i = 0; i < 1024; ++i) {
            settings.canvas.included[i] = true;
        }

        designer.data('settings', settings);

        var findCached = function(e, name) {
            var cacheName = '__cache__' + name;
            var found = e.data(cacheName);
            if (!found) {
                found = e.find(name);
                e.data(cacheName, found);
            }

            return found;
        }

        var formatNumber = function(val, precision) {
            val = new Number(val);
            val = val.toFixed(precision);
            str = val.toString();
            while (str.match(/\d+\d{3}/)) {
                str = str.replace(/(\d+)(\d{3})/, '$1,$2');
            }
            return str;
        }

        var unformatNumber = function(str) {
            while (str.match(/\d+,\d{3}/)) {
                str = str.replace(/(\d+),(\d{3})(\.\d*)?/, "$1$2$3");
            }

            var val = new Number(str);
            val = val.toFixed(3).valueOf();

            return val;
        }

        var getTooltipContents = function(infoname) {
            var format = function(info) {
                var formatList = function(list) {
                    var r = '';
                    for (var i = 0; i < list.length; ++i) {
                        r += '<li>' + list[i] + '</li>';
                    }
                    return r;
                };

                var description = '<p>' + info.description + '</p>';
                var includes = '<ul>Includes:' + formatList(info.includes) + '</ul>';
                var image = '';
                if (info.image != undefined) {
                    image = '<center><img style="height:7em;" alt="' + info.image.alt + '" src="' + info.image.src + '"></img></center>';
                }

                return (image + description + includes);
            };

            switch (infoname) {
                case 'display-unit':
                    return format({
                        description: 'Each display unit includes a 1m Display Port cable.',
                        includes: [
                '1 Display Unit',
                '1 Display Port cable (1m)'
              ],
                        image: {
                            alt: 'Display Unit',
                            src: 'images/designer/screen-off.png'
                        }
                    });
                case 'screen':
                    return format({
                        description: 'Screen ordered separately to the display units.',
                        includes: [
                '1 Screen'
              ],
                        image: {
                            alt: 'Screen',
                            src: 'images/designer/screen.png'
                        }
                    });
                case 'ecu':
                    return format({
                        description: 'Each ECU includes a 3m Display Port cable, Y power cord and line cord.',
                        includes: [
                '1 ECU',
                '1 Y Power Cord',
                '1 Display Port Cable (3m)',
                '1 Line Cord'
              ],
                        image: {
                            alt: 'ECU',
                            src: 'images/designer/ecu.png'
                        }
                    });
                case 'user-kit':
                    return format({
                        description: 'Each kit includes a remote control, screen removal tool and cleaning cloth, and system documentation.',
                        includes: [
                '1 Remote Control',
                '1 Screen Removal Tool',
                '1 Cleaning Cloth',
                '1 System Document'
              ]
                    });
                case 'setup-kit':
                    return format({
                        description: 'One kit supports up to 9 tiles. Each kit includes 9 Y power cords, a line cord, roll of light seal trim, and screws for fine optimization of screen gaps.',
                        includes: [
                '9 Y Power Cords',
                '1 Line Cord',
                '1 Light Seal Trim',
                '1pck Screws'
              ]
                    });
                case 'foot-ends':
                    return format({
                        description: 'Levelling feet are recommended to help level the bottom row when building on a supporting structure. Order one end foot kit per row (includes left and right end feet).',
                        includes: [
                '1 End Foot'
              ],
                        image: {
                            alt: 'End Feet',
                            src: 'images/designer/floorbracket.png'
                        }
                    });
                case 'foot-center':
                    return format({
                        description: 'Order one center foot in between each column. Center feet shipped in quantities of 3.',
                        includes: [
                '3 Center Feet'
              ],
                        image: {
                            alt: 'End Feet',
                            src: 'images/designer/floorbracket.png'
                        }
                    });
                case 'mount-bracket':
                    return format({
                        description: 'One required for every tile above 5 high. Shipped in quantities of 2.',
                        includes: [
                '2 Mount Brackets'
              ],
                        image: {
                            alt: 'Mount Bracket',
                            src: 'images/designer/wallmount.png'
                        }
                    });
            }
        }

        var setWarning = function(message, tip) {
            var warning = findCached(designer, '#warning' + UID);
            var oldMessage = designer.data('current-warning');
            if (oldMessage != message) {
                designer.data('current-warning', message);
                warning.empty();
                if (message) {
                    warning.append('<div class="ui-widget"><div class="ui-state-error ui-corner-all" style="margin-top: 1em; padding: 0pt 0.7em;"><p><span class="ui-icon ui-icon-alert" style="float:left; margin-right:0.3em;"></span><strong>' + message + '</strong>&nbsp;' + tip + '</p></div></div>');
                }
                else {
                    warning.append('<div class="ui-widget"><div class="ui-widget-content ui-corner-all" style="margin-top: 1em; padding: 0pt 0.7em;"><p>' + tip + '</p></div></div>');
                }
            }
        }

        var updateDimensions = function() {
            var settings = designer.data('settings');
            var constants = settings.constants;
            var dimensions;
            if (settings.units == 'metric') {
                dimensions = constants.metric;
            }
            else {
                dimensions = constants.imperial;
            }

            var tileSelector = findCached(designer, '#tile-selector' + UID);

            tileSelector.data('draw')(settings.canvas.width, settings.canvas.height);

            var area = settings.canvas.width * settings.canvas.height;
            settings.canvas.occupied = 0;

            for (var y = 0; y < settings.canvas.height; ++y) {
                for (var x = 0; x < settings.canvas.width; ++x) {
                    if (settings.canvas.included[y * 32 + x]) {
                        ++settings.canvas.occupied;
                    }
                }
            }

            var warningMessage = false;
            var warningTip = 'Add external controllers to increase content resolution and reduce upscaling';

            updateWeight();
            updateBrightness();
            updateEcus();
            updateBOM();

            var physicalWidth = settings.canvas.width * dimensions.tileWidth;
            var physicalHeight = settings.canvas.height * dimensions.tileHeight;
            var physicalArea = physicalWidth * physicalHeight;

            var resolutionWidth = settings.canvas.width * constants.tileResolutionX;
            var resolutionHeight = settings.canvas.height * constants.tileResolutionY;
            var resolutionArea = constants.tileResolutionX * constants.tileResolutionY * settings.canvas.occupied;
            var resolutionPitch = (Math.sqrt((settings.canvas.width * constants.metric.tileWidth) * (settings.canvas.height * constants.metric.tileHeight)) * 1000000) / (Math.sqrt(resolutionArea * 1000000));

            var contentWidth;
            var contentHeight;

            if (settings.canvas.occupied < 5) {
                contentWidth = resolutionWidth;
                contentHeight = resolutionHeight;
            }
            else {
                contentWidth = Math.max(Math.min(settings.canvas.width * 4 * Math.sqrt((constants.ecuBandwidth * 1000000 * settings.ecus) / ((1 + constants.blankingInterval) * (constants.videoRefreshRate * settings.canvas.width * 4 * settings.canvas.height * 3))), resolutionArea), settings.canvas.width * constants.contentWidthMinimum);
                contentHeight = contentWidth * settings.canvas.height / settings.canvas.width * 0.75;
                if (contentWidth > resolutionWidth || contentHeight > resolutionHeight) {
                    contentWidth = Math.min(contentWidth, resolutionWidth);
                    contentHeight = Math.min(contentHeight, resolutionHeight);
                    warningMessage = 'The physical resolution of the tiles is the highest resolution that can be achieved.';
                    warningTip = '';
                }
            }

            var contentArea = contentWidth * contentHeight;
            var contentPitch = (constants.metric.tileWidth * 1000 * settings.canvas.width) / contentWidth;

            var scalingWidth = resolutionWidth / contentWidth;
            var scalingHeight = resolutionHeight / contentHeight;
            var scalingArea = resolutionArea / contentArea;

            if (scalingWidth > 3 || scalingHeight > 3) {
                warningMessage = 'The achievable resolution for content appears low and may not look crisp when viewed up close.';
                warningTip = 'Increase the number of ECUs to increase the maximum content resolution.';
            }

            setWarning(warningMessage, warningTip);

            findCached(designer, '#microtiles-horizontal-slider' + UID).slider('option', { value: settings.canvas.width });
            findCached(designer, '#microtiles-vertical-slider' + UID).slider('option', { value: (33 - settings.canvas.height) });

            findCached(designer, '#quantity-width' + UID).attr('value', formatNumber(settings.canvas.width, 0));
            findCached(designer, '#quantity-height' + UID).attr('value', formatNumber(settings.canvas.height, 0));
            findCached(designer, '#quantity-area' + UID).attr('value', formatNumber(area, 0));
            findCached(designer, '#quantity-occupied' + UID).attr('value', formatNumber(settings.canvas.occupied, 0));

            findCached(designer, '#physical-width' + UID).attr('value', formatNumber(physicalWidth, 3));
            findCached(designer, '#physical-height' + UID).attr('value', formatNumber(physicalHeight, 3));
            findCached(designer, '#physical-area' + UID).attr('value', formatNumber(physicalArea, 3));

            findCached(designer, '#resolution-width' + UID).attr('value', formatNumber(resolutionWidth, 0));
            findCached(designer, '#resolution-height' + UID).attr('value', formatNumber(resolutionHeight, 0));
            findCached(designer, '#resolution-area' + UID).attr('value', formatNumber(resolutionArea, 0));
            findCached(designer, '#resolution-pitch' + UID).attr('value', formatNumber(resolutionPitch, 3));

            findCached(designer, '#content-width' + UID).attr('value', formatNumber(Math.round(contentWidth), 0));
            findCached(designer, '#content-height' + UID).attr('value', formatNumber(Math.round(contentHeight), 0));
            findCached(designer, '#content-area' + UID).attr('value', formatNumber(Math.floor(contentArea), 0));
            findCached(designer, '#content-pitch' + UID).attr('value', formatNumber(contentPitch, 3));

            findCached(designer, '#scaling-width' + UID).attr('value', formatNumber(scalingWidth, 3));
            findCached(designer, '#scaling-height' + UID).attr('value', formatNumber(scalingHeight, 3));
            findCached(designer, '#scaling-area' + UID).attr('value', formatNumber(scalingArea, 3));
        }

        var updateWeight = function() {
            var settings = designer.data('settings');
            var constants = settings.constants;
            var dimensions;
            if (settings.units == 'metric') {
                dimensions = constants.metric;
            }
            else {
                dimensions = constants.imperial;
            }

            var totalWeight = settings.canvas.occupied * dimensions.tileWeight;
            var totalWeightLarge = settings.canvas.occupied * dimensions.tileWeightLarge;
            findCached(designer, '#weight-tile' + UID).attr('value', formatNumber(dimensions.tileWeight, 2));
            findCached(designer, '#weight-total' + UID).attr('value', formatNumber(totalWeight, 2));
            findCached(designer, '#weight-total-large' + UID).attr('value', formatNumber(totalWeightLarge, 2));
        }

        var updateBrightness = function() {
            var settings = designer.data('settings');
            var tileEnergy = Math.floor((0.0915 * (800 * (settings.brightness / 100)) - 3.2649) + 0.5);
            var totalEnergy = tileEnergy * settings.canvas.occupied;
            var totalEnergyLarge = totalEnergy / 1000;
            var totalBTUs = totalEnergy * 3.413;

            findCached(designer, '#energy-tile' + UID).attr('value', formatNumber(tileEnergy, 0));
            findCached(designer, '#energy-total' + UID).attr('value', formatNumber(totalEnergy, 0));
            findCached(designer, '#energy-total-large' + UID).attr('value', formatNumber(totalEnergyLarge, 2));
            findCached(designer, '#thermal-total' + UID).attr('value', formatNumber(totalBTUs, 2));
        }

        var updateEcus = function() {
            var settings = designer.data('settings');
            settings.ecus = Math.ceil(settings.canvas.occupied / settings.ecuRatio);
            findCached(designer, '#ecu-count' + UID).attr('value', formatNumber(settings.ecus, 0));
            findCached(designer, '#ecu-ratio' + UID).attr('value', formatNumber(settings.ecuRatio, 0));
        }

        var updateUnits = function() {
            var settings = designer.data('settings');
            if (settings.units == 'imperial') {
                findCached(designer, 'span.unit-area').empty().append('sq. feet');
                findCached(designer, 'span.unit-weight').empty().append('lbs');
                findCached(designer, 'span.unit-weight-large').empty().append('tons');
            }
            else {
                findCached(designer, 'span.unit-area').empty().append('m<sup>2</sup>');
                findCached(designer, 'span.unit-weight').empty().append('kg');
                findCached(designer, 'span.unit-weight-large').empty().append('tonnes');
            }

            updateDimensions();
        }

        var updateBOM = function() {
            var settings = designer.data('settings');
            var display_unit_quantity = settings.canvas.occupied;
            var screen_quantity = settings.canvas.occupied;
            var ecu_quantity = settings.ecus;
            var user_kit_quantity = settings.canvas.occupied > 0 ? 1 : 0;
            var setup_kit_quantity = Math.ceil(settings.canvas.occupied / 9);
            var foot_ends_quantity = settings.canvas.occupied > 0 ? 1 : 0;
            var foot_center_quantity = 0;
            var mount_bracket_quantity = 0;

            if (settings.canvas.height > 1) {
                var tiles = 0;
                var y = settings.canvas.height - 1;
                for (var x = 0; x < settings.canvas.width; ++x) {
                    if (settings.canvas.included[y * 32 + x]) {
                        ++tiles;
                    }
                }

                if (tiles > 1) {
                    foot_center_quantity = Math.ceil((tiles - 1) / 3);
                }
            }

            if (settings.canvas.width > 5) {
                mount_bracket_quantity = Math.ceil((settings.canvas.occupied - (5 * settings.canvas.width)) / 2);
                if (mount_bracket_quantity < 0) {
                    mount_bracket_quantity = 0;
                }
            }

            var pairs = [['#bom-display-unit', display_unit_quantity],
                   ['#bom-screen', screen_quantity],
                   ['#bom-ecu', ecu_quantity],
                   ['#bom-user-kit', user_kit_quantity],
                   ['#bom-setup-kit', setup_kit_quantity],
                   ['#bom-foot-ends', foot_ends_quantity],
                   ['#bom-foot-center', foot_center_quantity],
                   ['#bom-mount-bracket', mount_bracket_quantity]];

            for (var i = 0; i < pairs.length; ++i) {
                var cb = findCached(designer, pairs[i][0] + UID);
                var tb = findCached(designer, pairs[i][0] + '-quantity' + UID);
                var changed = (tb.data('secret-value') != formatNumber(pairs[i][1], 0));
                tb.data('secret-value', formatNumber(pairs[i][1], 0));

                if (pairs[i][1] > 0 && (changed || cb.attr('checked'))) {
                    cb.attr('checked', true);
                }
                else if (changed) {
                    cb.attr('checked', false);
                }

                if (cb.attr('checked')) {
                    tb.attr('value', formatNumber(pairs[i][1], 0));
                }
                else {
                    tb.attr('value', '');
                }
            }
        }

        var setDefaults = function() {
            updateUnits();
            updateDimensions();
        }

        var toggleTile = function(e) {
            var settings = designer.data('settings');
            var x = e.data('x');
            var y = e.data('y');
            var i = y * 32 + x;
            if (settings.canvas.included[i]) {
                settings.canvas.included[i] = false;
                e.removeClass('tile-visible');
                e.addClass('tile-hidden');
            }
            else {
                settings.canvas.included[i] = true;
                e.removeClass('tile-hidden');
                e.addClass('tile-visible');
            }

            updateDimensions();
        }

        var tileSelector = findCached(designer, '#tile-selector' + UID);

        tileSelector.data('draw', function(w, h) {
            var settings = tileSelector.data('settings');
            if (settings == null) {
                settings = { width: 0, height: 0 };
                tileSelector.data('settings', settings);
                settings = tileSelector.data('settings');
            }
            else if (settings.width == w && settings.height == h) {
                return;
            }

            w = new Number(w);
            h = new Number(h);
            settings.width = w;
            settings.height = h;
            tileSelector.empty();

            var tileSize;
            var tileWidth;
            var tileHeight;
            var xOffset;
            var yOffset;
            var tileArray;
            if (w >= h) {
                tileSize = 100 / w;
            }
            else {
                tileSize = 100 / h;
            }

            xOffset = (100 - (w * tileSize)) / 2;
            yOffset = (100 - (h * tileSize)) / 2;
            tileWidth = 100 / w;
            tileHeight = 100 / h;

            tileArray = $('<div />', {
                'class': 'tile-array',
                css: {
                    'left': (xOffset + '%'),
                    'top': (yOffset + '%'),
                    'width': ((tileSize * w) + '%'),
                    'height': ((tileSize * h) + '%')
                }
            }).appendTo(tileSelector);

            $('<img src="images/designer/Splash_Screen_05102009.png"></img>').appendTo(
        $('<div />', {
            'class': 'tile-background'
        }).appendTo(tileArray)
      );

            tileArray.click(function(e) {
                var tile = $(e.target);
                if (tile.attr('id').match(/tile-\d+-\d+-\d+/)) {
                    toggleTile(tile);
                }
            });

            for (var y = 0; y < h; ++y) {
                for (var x = 0; x < w; ++x) {
                    var tile = $('<div />', {
                        'class': 'tile tile-visible',
                        'id': ('tile-' + x + '-' + y + '-' + UID),
                        css: {
                            'width': (tileWidth + '%'),
                            'height': (tileHeight + '%'),
                            'top': ((tileHeight * y) + '%'),
                            'left': ((tileWidth * x) + '%')
                        },
                        data: {
                            'x': x,
                            'y': y
                        }
                    });

                    tile.appendTo(tileArray);

                    if (designer.data('settings').canvas.included[y * 32 + x]) {
                        tile.removeClass('tile-hidden');
                        tile.addClass('tile-visible');
                    }
                    else {
                        tile.removeClass('tile-visible');
                        tile.addClass('tile-hidden');
                    }
                }

                $('<div />', {
                    css: {
                        'clear': 'both'
                    }
                }).appendTo(tileArray);
            }

        });

        designer.find('#brightness-slider' + UID).slider({
            range: 'min',
            value: 100,
            min: 67,
            max: 100,
            step: 1,
            slide: function(e, ui) {
                findCached(designer, '#brightness-value' + UID).empty().append(ui.value);
                designer.data('settings').brightness = ui.value;
                updateBrightness();
            }
        });

        designer.find('#microtiles-horizontal-slider' + UID).slider({
            range: 'min',
            value: 4,
            min: 1,
            max: 32,
            step: 1,
            slide: function(e, ui) {
                designer.data('settings').canvas.width = ui.value;
                updateDimensions();
            }
        });

        designer.find('#microtiles-vertical-slider' + UID).slider({
            orientation: 'vertical',
            range: 'max',
            value: 4,
            min: 1,
            max: 32,
            step: 1,
            slide: function(e, ui) {
                designer.data('settings').canvas.height = 33 - ui.value;
                updateDimensions();
            }
        });

        designer.find('#quantity-width' + UID).change(function(e) {
            var settings = designer.data('settings');
            var width = (new Number($(this).val())).toFixed(0);
            if (isNaN(width)) {
                width = settings.canvas.width;
                $(this).val(settings.canvas.width);
            }
            else if (width < 1) {
                width = 1;
            }
            else if (width > 32) {
                width = 32;
            }

            settings.canvas.width = width;
            updateDimensions();
        });

        designer.find('#quantity-height' + UID).change(function(e) {
            var settings = designer.data('settings');
            var height = (new Number($(this).val())).toFixed(0);
            if (isNaN(height)) {
                height = settings.canvas.height;
            }
            else if (height < 1) {
                height = 1;
            }
            else if (height > 32) {
                height = 32;
            }

            settings.canvas.height = height;
            updateDimensions();
        });

        designer.find('#physical-width' + UID).change(function(e) {
            var settings = designer.data('settings');
            var constants = settings.constants;
            var dimensions;
            if (settings.units == 'metric') {
                dimensions = constants.metric;
            }
            else {
                dimensions = constants.imperial;
            }

            var physical_width = unformatNumber($(this).val());
            var width;
            if (isNaN(physical_width)) {
                width = settings.canvas.width;
            }
            else {
                width = Math.round(physical_width / dimensions.tileWidth);
                if (width < 1) {
                    width = 1;
                }
                else if (width > 32) {
                    width = 32;
                }
            }

            settings.canvas.width = width;
            updateDimensions();
        });

        designer.find('#physical-height' + UID).change(function(e) {
            var settings = designer.data('settings');
            var constants = settings.constants;
            var dimensions;
            if (settings.units == 'metric') {
                dimensions = constants.metric;
            }
            else {
                dimensions = constants.imperial;
            }

            var physical_height = unformatNumber($(this).val());
            var height;
            if (isNaN(physical_height)) {
                height = settings.canvas.height;
            }
            else {
                height = Math.round(physical_height / dimensions.tileHeight);
                if (height < 1) {
                    height = 1;
                }
                else if (height > 32) {
                    height = 32;
                }
            }

            settings.canvas.height = height;
            updateDimensions();
        });

        designer.find('#resolution-width' + UID).change(function(e) {
            var settings = designer.data('settings');
            var resolution_width = unformatNumber($(this).val());
            var width;
            if (isNaN(resolution_width)) {
                width = settings.canvas.width;
            }
            else {
                width = Math.floor(resolution_width / settings.constants.tileResolutionX)
                if (width < 1) {
                    width = 1;
                }
                else if (width > 32) {
                    width = 32;
                }
            }

            settings.canvas.width = width;
            updateDimensions();
        });

        designer.find('#resolution-height' + UID).change(function(e) {
            var settings = designer.data('settings');
            var resolution_height = unformatNumber($(this).val());
            var height;
            if (isNaN(resolution_height)) {
                height = settings.canvas.height;
            }
            else {
                height = Math.floor(resolution_height / settings.constants.tileResolutionY)
                if (height < 1) {
                    height = 1;
                }
                else if (height > 32) {
                    height = 32;
                }
            }

            settings.canvas.height = height;
            updateDimensions();
        });

        designer.find('#dimensions-quantity' + UID + ', #dimensions-physical' + UID + ',#dimensions-resolution' + UID).change(function(e) {
            var settings = designer.data('settings');
            if (findCached(designer, '#dimensions-quantity' + UID).attr('checked')) {
                findCached(designer, '#quantity-width' + UID + ', #quantity-height' + UID).attr('readonly', false);
                findCached(designer, '#physical-width' + UID + ', #physical-height' + UID).attr('readonly', true);
                findCached(designer, '#resolution-width' + UID + ', #resolution-height' + UID).attr('readonly', true);
            }
            else if (findCached(designer, '#dimensions-physical' + UID).attr('checked')) {
                findCached(designer, '#quantity-width' + UID + ', #quantity-height' + UID).attr('readonly', true);
                findCached(designer, '#physical-width' + UID + ', #physical-height' + UID).attr('readonly', false);
                findCached(designer, '#resolution-width' + UID + ', #resolution-height' + UID).attr('readonly', true);
            }
            else if (findCached(designer, '#dimensions-resolution' + UID).attr('checked')) {
                findCached(designer, '#quantity-width' + UID + ', #quantity-height' + UID).attr('readonly', true);
                findCached(designer, '#physical-width' + UID + ', #physical-height' + UID).attr('readonly', true);
                findCached(designer, '#resolution-width' + UID + ', #resolution-height' + UID).attr('readonly', false);
            }
        });


        designer.find('#ecu-count' + UID).change(function(e) {
            var settings = designer.data('settings');
            var ecus = (new Number($(this).val())).toFixed(0);
            if (isNaN(ecus)) {
                ecus = settings.ecus;
            }
            else if (ecus < 1) {
                if (settings.canvas.occupied < 1) {
                    ecus = 0;
                }
                else {
                    ecus = 1;
                }
            }
            else if (ecus > settings.canvas.occupied) {
                ecus = settings.canvas.occupied;
            }

            settings.ecuRatio = Math.ceil(settings.canvas.occupied / ecus);
            updateDimensions();
        });

        designer.find('#ecu-ratio' + UID).change(function(e) {
            var settings = designer.data('settings');
            var ecuRatio = (new Number($(this).val())).toFixed(0);
            if (isNaN(ecuRatio)) {
                ecuRatio = settings.ecuRatio;
            }
            else if (ecuRatio < 1) {
                ecuRatio = 1;
            }
            else if (ecuRatio > 1024) {
                ecuRatio = 1024;
            }

            settings.ecuRatio = ecuRatio;
            updateDimensions();
        });

        designer.find('#unit-selector' + UID).buttonset();

        designer.find('#unit-metric-radio' + UID + ', #unit-imperial-radio' + UID).change(function(e) {
            var settings = designer.data('settings');
            if (settings.units == 'metric') {
                settings.units = 'imperial';
            }
            else {
                settings.units = 'metric';
            }

            updateUnits();
        });

        designer.find('#bom-display-unit' + UID + ', #bom-screen' + UID + ', #bom-ecu' + UID + ', #bom-user-kit' + UID + ', #bom-setup-kit' + UID + ', #bom-foot-ends' + UID + ', #bom-foot-center' + UID + ', #bom-mount-bracket' + UID).change(function(e) {
            updateBOM();
        });

        designer.find('.panel').accordion({
            collapsible: true,
            clearStyle: true,
            autoHeight: false
        });

        designer.find('#maximum-resolution' + UID).tooltip('<p>The Maximum Combined Source Resolution is based on the aggregate bandwidth of all ECUs in the canvas, using a 60Hz video refresh rate. The calculation is an estimate only, and does not consider cabling layout.</p>');

        designer.find('#panel-bom' + UID + ' .info').each(function(i, e) {
            var infoname = $(this).attr('class').replace(/(.*)(info-)([^ ]+)(.*)/, '$3');
            var contents = getTooltipContents(infoname);
            $(e).tooltip(contents);
        });

        designer.find('#panel-bom' + UID + ' .row').each(function(i, e) {
            if (i > 1 && i % 2 == 0) {
                $(e).find('.column-1, .column-2, .column-3, .column-4, .column-5').css({ 'background-color': '#EEEEEE' });
            }
        });

        designer.find('input').each(function(i, e) {
            if ($(e).attr('disabled')) {
                $(e).attr('disabled', '');
                $(e).attr('readonly', 'readonly');
            }
        });

        setDefaults();
    });
});
