(function($){ var log = function(){}; try{ if (window['console'] && window['console']['log']) { log = window['console']['log']; log('setting up'); } } catch (x) { log = function(){}; } var cssInt = function(obj, cssAttr){ return parseInt($(obj).css(cssAttr)); }; var round = function(val){ return Math.max(1, Math.round(val)); }; var marginPaddingSum = function(elem){ var pt = cssInt(elem, 'padding-top'); var pb = cssInt(elem, 'padding-bottom'); var mt = cssInt(elem, 'margin-top'); var mb = cssInt(elem, 'margin-bottom'); return pt+pb+mt+mb; }; var fillHeight = function(parent, child){ var $child = $(child, $(parent)); var parentHeight = parseInt($(parent).height()); var newHeight = parentHeight - marginPaddingSum($child); log(parent, child, parentHeight, marginPaddingSum($child), newHeight); $child.css('height', newHeight); }; var wrapAllInClass = function(nodesToWrap, className){ var p = nodesToWrap.parent(); nodesToWrap.wrapAll($('<div/>').addClass(className)); return $('.' + className, p); }; //adjust the height of the lower panel to match the container var adjustHeight=function(parent, target, offset){ var parentHeight = parseInt(parent.height()); var newHeight = parentHeight - marginPaddingSum(target) - offset.height(); log(parent, parentHeight, offset, offset.height(), target, newHeight); target.css('height', newHeight); }; var lcars_colors = { 'orange':'#ff9900', 'purple':'#cc99cc', 'blue':'#9999ff', 'lightBlue':'#9999cc', 'red':'#cc0000', 'lightRed':'#cc6666', 'tan':'#ff9966', 'lightTan':'#ffcc99', 'pink':'#cc6699', 'white':'#ccccff' }; $.fn.lcars_cframe = function(options){ return this.each( function(){ var $this = $(this); //add borders /* * borders are handled as inner/outer frames * */ var contentFrame = wrapAllInClass($this.contents(), 'lcars-content-frame'); var borderFrame = wrapAllInClass($this.contents(), 'lcars-border-frame'); var fn = function(){ fillHeight($this, borderFrame); fillHeight(borderFrame, '.lcars-content-frame'); }; $(window).resize(fn); fn(); //add side-panel var sidePanel = $('<div class="lcars-side-panel"></div>'); borderFrame.prepend(sidePanel); borderFrame.append('<div style="clear:both;">'); }); }; $.fn.lcars_tframe = function(options){ var opts = options || {}; var defaults = { upperColor:lcars_colors.purple, lowerColor:lcars_colors.lightRed, seperatorColor:lcars_colors.blue, flairColor:lcars_colors.orange }; $.extend(opts,defaults); var drawHalfSplitter = function(ctx, height, width, colWidth, leftColor, sepColor, barColor, rightColor){ var h = {}; var w = {}; for(var i = 1; i <= 100; i++){ h[i] = round(i*(height/100)); w[i] = round(i*(width/100)); } // determine some sizes based on available space var shoulderHeight = h[45]; var shoulderLength = colWidth + w[5]; var shoulderBarHeight = h[30]; var leftBarHeight = shoulderHeight - shoulderBarHeight; var spacer = round(w[1]/2); var leftEndSepLength = spacer*3; var leftSplitterLength = w[45] - (shoulderLength+spacer+spacer+leftEndSepLength+spacer); //handle the first curved segment ctx.save(); ctx.fillStyle = leftColor; ctx.beginPath(); ctx.arc(shoulderHeight,0, shoulderHeight, Math.PI, Math.PI/2, true); ctx.lineTo(shoulderLength,shoulderHeight); ctx.lineTo(shoulderLength,shoulderBarHeight); ctx.arc(colWidth+shoulderBarHeight, 0, shoulderBarHeight, Math.PI/2, Math.PI, false); ctx.lineTo(0,0); ctx.fill(); ctx.translate(shoulderLength+spacer,0); //shift coords //straight and narrow for a bit, same color //this will shrink when colWidth is big ctx.fillRect(0, shoulderBarHeight, leftSplitterLength, leftBarHeight); ctx.translate(leftSplitterLength+spacer,0); //shift coords //small rect as a border before the midpoint ctx.fillStyle = sepColor; ctx.fillRect(0, shoulderBarHeight, leftEndSepLength, leftBarHeight); ctx.translate(leftEndSepLength+spacer,0); //shift coords //now the right side! // short red bit var rightShortRectLength = w[10]; var rightShortRectHeight = Math.round(leftBarHeight*0.6); ctx.fillStyle = rightColor; ctx.fillRect(0, shoulderBarHeight, rightShortRectLength, rightShortRectHeight); // long bit ctx.fillRect(rightShortRectLength, shoulderBarHeight, w[50], leftBarHeight); // little orange line var rightBarHeight = round(spacer/2); ctx.fillStyle = barColor; ctx.save(); ctx.translate(0, shoulderBarHeight); ctx.scale(1,-1); ctx.fillRect(0, rightBarHeight, rightShortRectLength, rightBarHeight); ctx.restore(); //little box in the center ctx.fillRect(0, shoulderBarHeight+leftBarHeight, spacer*2, rightBarHeight); ctx.restore(); }; var drawSplitter = function(canvas, colWidth){ var height = 50; var width = canvas.width(); //need to explictly set these for the canvas to know about it canvas.attr('height', height); canvas.attr('width', width); var ctx = canvas.get(0).getContext('2d'); ctx.fillStyle='#000'; ctx.fillRect(0,0,width,height); drawHalfSplitter(ctx, height, width, colWidth, opts.upperColor, opts.seperatorColor, opts.flairColor, opts.lowerColor); ctx.save(); ctx.translate(0,height); ctx.scale(1,-1); drawHalfSplitter(ctx, height, width, colWidth, opts.lowerColor, opts.seperatorColor, opts.flairColor, opts.upperColor); ctx.restore(); }; var processNav = function(panel){ var defaultWidth = round(panel.width()*.1); var rawNav = panel.children('.lcars-upper,.lcars-lower') .children('ul.lcars-nav,ol.lcars-nav'); if (rawNav.length == 0){ log('No nav for', panel); return defaultWidth; } var navWrapper = $('<div>').addClass('lcars-nav-wrapper'); panel.prepend(navWrapper); rawNav.detach(); navWrapper.append(rawNav); rawNav.css('float', 'none'); var maxWidth = Math.max(navWrapper.width(), defaultWidth); //if the nav is a link, make the button blue var currentLocation = window.location.pathname; $('li', rawNav).each(function(idx, elem){ var link = $('a', elem).get(0); if(link){ var $link = $(link); $(elem).append($link.contents()) .addClass('lcars-link-button'); var href = $link.attr('href'); var sameLocation = href == currentLocation; var color = sameLocation ? lcars_colors.orange : lcars_colors.blue; $(elem).css('background-color', color); if (!sameLocation){ $(elem).click(function(){ window.location = href; }) .addClass('lcars-clickable'); } $link.remove(); } }); panel.append('<div style="clear:both"/>'); return maxWidth; }; return this.each( function(){ var $this = $(this); var upperPanel = wrapAllInClass($this.children('.lcars-upper'), 'lcars-upper-panel'); upperPanel.css('background-color', opts.upperColor); $('h1,h2,h3,h4,h5', upperPanel) .addClass('lcars-heading') .css('color', opts.upperColor); var lowerPanel = wrapAllInClass($this.children('.lcars-lower'), 'lcars-lower-panel'); lowerPanel.css('background-color', opts.lowerColor); var upperColWidth = processNav(upperPanel); var lowerColWidth = processNav(lowerPanel); var colWidth = Math.max(upperColWidth, lowerColWidth); log('col widths', upperColWidth, lowerColWidth, colWidth); $('.lcars-nav-wrapper', $this).width(colWidth); var canvas = $('<canvas/>').addClass('lcars-swirly').attr('height', "50"); var w = $('<div/>'); w.append(canvas); lowerPanel.prepend(w); w.height(50); canvas = lowerPanel.children('canvas.lcars-swirly'); canvas = $('canvas.lcars-swirly', lowerPanel); var drawTFrame = function(){ drawSplitter(canvas, colWidth); upperPanel.children('.lcars-upper').css('margin-left', colWidth+'px'); fillHeight(upperPanel, '.lcars-upper'); lowerPanel.children('.lcars-lower').css('margin-left', colWidth+'px'); adjustHeight($this, lowerPanel, upperPanel); adjustHeight(lowerPanel, lowerPanel.children('.lcars-lower'), canvas); }; drawTFrame(); $(window).resize(drawTFrame); log('done wth tframe'); }); }; $(document).ready(function(){ $('.lcars-tframe').lcars_tframe(); $('.lcars-cframe').lcars_cframe(); }); })(jQuery);