var BigTextWizard = { LINE_HEIGHT_STYLE_ID: 'bigtext-wizard-lineheight-styleinjection', CUSTOM_STYLE_ID: 'bigtext-wizard-styleinjection', DEFAULT_TEXT: '', loadedFonts: {}, fontUrls: { 'LeagueGothicRegular': 'css/league-gothic/stylesheet.css', 'Droid Sans': 'http://fonts.googleapis.com/css?family=Droid+Sans', 'Yanone Kaffeesatz': 'http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz', 'Molengo': 'http://fonts.googleapis.com/css?family=Molengo', 'Droid Sans Mono': 'http://fonts.googleapis.com/css?family=Droid+Sans+Mono', 'Arvo': 'http://fonts.googleapis.com/css?family=Arvo:regular,bold', 'Arimo': 'http://fonts.googleapis.com/css?family=Arimo', 'Puritan': 'http://fonts.googleapis.com/css?family=Puritan', 'IM Fell English': 'http://fonts.googleapis.com/css?family=IM+Fell+English' }, clear: function(ignoreFocus) { var cleared = $('
').html(BigTextWizard.DEFAULT_TEXT); $('#bigtext').empty().append(cleared); BigTextWizard._init(); cleared.trigger('focus'); }, _init: function() { var $bt = $('#bigtext'); $bt.bigtext(); BigTextWizard.initializeLineHeights(); BigTextWizard.initEditable.call($bt.find('> div')); }, init: function() { var fontFamily = $('#font').val(); if(BigTextWizard.loadedFonts[fontFamily]) { BigTextWizard._init(); } else { BigTextWizard.loadFont(fontFamily, BigTextWizard._init); } }, initEditable: function() { return this.attr({ contenteditable: true, spellcheck: false }) .unbind('keypress keyup, blur') .bind('keypress', function(event) { var $t = $(this); if(event.which == 13) { var element; if(!event.shiftKey) { element = $t.nextAll().eq(0); if(!element.length) { element = BigTextWizard.initEditable.call($('
')).appendTo($t.parent()); } } else { element = $t.prevAll().eq(0); } // IE8 wasn't letting focus here without a timeout. if($.browser.msie && $.browser.version <= 8) { window.setTimeout(function() { element.trigger('focus'); }, 100); } else { element.trigger('focus'); } return false; } }).bind('keyup', $.throttle(250, function() { var $t = $(this); if($t.text() && $t.text() != BigTextWizard.DEFAULT_TEXT) { $t.parent().removeClass('blurred'); } $t.parent().bigtext(); })).bind('blur', function() { var $t = $(this); if(!$.trim($t.text()) && $t.siblings().length > 0) { $t.remove(); } BigTextWizard.initializeLineHeights(); }); }, generateStyleTag: function(id, css) { return $('
').attr('id', id).html(''); }, transform3dEvent: function() { BigTextWizard.rotate3d.call($('#bigtext'), $('#3d-x-slider').is(':checked') ? 1 : 0, $('#3d-y-slider').is(':checked') ? 1 : 0, $('#3d-z-slider').is(':checked') ? 1 : 0, $('#3d-angle-slider').slider('value') + 'deg'); }, rotate3d: function(x, y, z, angle) { // front: -90 < x, y < 90 this.css('-webkit-transform', 'rotate3d(' + x + ',' + y + ',' + z + ',' + angle + ')'); }, translate: function(x, y, z) { var existingTransform = this.css('-webkit-transform') || ''; //rotate3d(0, 0, 0, 0deg)'; this.css('-webkit-transform', (existingTransform ? existingTransform + ' ' : '') + 'translate3d(' + (x ? x + 'px' : '0') + ',' + (y ? y + 'px' : '0') + ',' + (z ? z + 'px' : '0') + ')'); }, resetTransform: function() { $('#bigtext').css('-webkit-transform', ''); }, loadFont: function(fontFamily, callback) { WebFont.load({ custom: { families: [fontFamily], urls : [BigTextWizard.fontUrls[fontFamily]] }, active: function() { BigTextWizard.loadedFonts[fontFamily] = true; callback(); } }); }, setCustomStyle: function() { var fontFace = $('#font').val(); $('#' + BigTextWizard.CUSTOM_STYLE_ID).remove(); BigTextWizard.generateStyleTag(BigTextWizard.CUSTOM_STYLE_ID, [$('#customStyle').val(), (fontFace ? '\n.bigtext { font-family: \'' + fontFace + '\'; }' : '')]) .appendTo('head'); }, setHtml: function() { function clean(html) { return (html || '').replace(//g, '>'); } var fontFace = $('#font').val(); $('#code').html(clean([ '', '', '', '', (fontFace ? '' : ''), '', '', '', '
', $('#bigtext').html(), '
', '', ''].join('\n'))); }, setLineHeightCss: function() { $('#' + BigTextWizard.LINE_HEIGHT_STYLE_ID).remove(); BigTextWizard.generateStyleTag(BigTextWizard.LINE_HEIGHT_STYLE_ID, $.makeArray($('#lineHeightSliders').find('> div').map(function(n) { var lineHeight = $(this).slider('value'); return lineHeight !== 1 ? '.bigtext > .' + BigText.LINE_CLASS_PREFIX + (n+1) + ' { line-height: ' + lineHeight + 'em; }' : null; }))).appendTo('head'); }, initializeLineHeights: function() { var $sliders = $('#lineHeightSliders'), $lines = $('#bigtext > div'); if($lines.length < 2) { $sliders.html('Add another line!'); return; } else if($lines.length == $sliders.find('> div.ui-slider').length - 1) { return; } $sliders.empty(); $lines.each(function(lineNumber) { if(!lineNumber) { return; } $('
').appendTo($sliders).slider({ min: 0, max: 2, step: .05, value: 1, orientation: 'vertical', range: 'min', animate: true }).bind('slidechange', function() { BigTextWizard.setLineHeightCss(); }); }); } }; $('#widthSlider').slider({ min: 260, max: 1024, range: 'min', value: 430 }).bind('slidechange', function() { var value = $(this).slider('value'); $('#posterWidth').html(value); $('#bigtext').width(value).find('div').each(function() { $(this).removeAttr('style').removeAttr('class'); }); BigTextWizard.init(); }); $('#customStyle').bind('change', function() { BigTextWizard.setCustomStyle(); BigTextWizard.init(); }); $('#clear').button().bind('click', BigTextWizard.clear); $('#refresh').button().bind('click', BigTextWizard.init); $('#font').bind('change', function() { BigTextWizard.setCustomStyle(); BigTextWizard.init(); }); $('#tabs').tabs(); $('#3d-angle-slider').slider({ min: -70, max: 70, range: 'min', value: 0, step: 1 }).bind('slidechange', function() { var deg = $(this).slider('value') ; $('#3d-angle-value').html(deg + ' degree' + (deg != 1 ? 's' : '')); BigTextWizard.transform3dEvent(); }); $('#3d-animate-slider').bind('change', function() { $('#bigtext').toggleClass('animate3d'); }); $('#tabs-3d .dimension-slider').bind('change', BigTextWizard.transform3dEvent); $('#reset-3d').button().bind('click', function() { $('#3d-angle-slider').slider('value', 0); }); $('#random-3d').button().bind('click', function() { if(Math.round(Math.random())) { $('#3d-x-slider').attr('checked', 'checked'); } else { $('#3d-x-slider').removeAttr('checked'); } if(Math.round(Math.random())) { $('#3d-y-slider').attr('checked', 'checked'); } else { $('#3d-y-slider').removeAttr('checked'); } if(Math.round(Math.random())) { $('#3d-z-slider').attr('checked', 'checked'); } else { $('#3d-z-slider').removeAttr('checked'); } // Setting the value triggers slidechange, which triggers transform3dEvent $('#3d-angle-slider').slider('value', Math.round(Math.random()*180) - 90); }); $('#translate-buttons button').button().bind('click', function() { var id = $(this).attr('id'), AMOUNT = 200, x = 0, y = 0, z = 0; switch(id) { case 'translate-x-minus': x = -1*AMOUNT; break; case 'translate-x-plus': x = AMOUNT; break; case 'translate-y-minus': y = -1*AMOUNT; break; case 'translate-y-plus': y = AMOUNT; break; case 'translate-z-minus': z = -1*AMOUNT; break; case 'translate-z-plus': z = AMOUNT; break; } BigTextWizard.translate.call($('#bigtext'), x, y, z); }); $(window).bind('click', function(event) { if(!$(event.target).closest('#toolbar').length) { $('#bigtext > div').eq(0).trigger('focus'); } }).bind('load', function() { BigTextWizard.setCustomStyle(); BigTextWizard.init(); $('#3d-animate-slider').trigger('click').trigger('change'); }).bind('keydown', function(event) { // Keyboard shortcuts if(event.ctrlKey && event.altKey) { var $bigtext = $('#bigtext'); switch(event.which) { case 90: // z BigTextWizard.clear(); return false; case 67: // c $('body').toggleClass('bigtextWizardWhite').toggleClass('bigtextWizardBlack'); return false; case 88: // x $('#random-3d').trigger('click'); return false; case 37: // left arrow BigTextWizard.rotate3d.call($bigtext, 0, 0, 1, '-90deg'); return false; case 39: // right arrow BigTextWizard.rotate3d.call($bigtext, 0, 0, 1, '90deg'); return false; case 82: // r $('#reset-3d').trigger('click'); return false; case 32: // space case 13: // enter $bigtext.removeClass('fadeIn').addClass('fadeOut'); //.find('> div').eq(0).trigger('focus'); window.setTimeout(function() { if(event.which == 32) { $('#random-3d').trigger('click'); } BigTextWizard.clear(); $bigtext.removeClass('fadeOut').addClass('fadeIn'); }, 200); return false; } } });