Guest User

Untitled

a guest
Apr 2nd, 2015
425
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * CircleType 0.36
  3.  * Peter Hrynkow
  4.  * Copyright 2014, Licensed GPL & MIT
  5.  * Modified by http://stackoverflow.com/users/1913729/blex
  6. */
  7.  
  8. $.fn.circleType = function(options) {
  9.  
  10.     var self = this,
  11.         settings = {
  12.         dir: 1,
  13.         position: 'relative',
  14.     };
  15.     if (typeof($.fn.lettering) !== 'function') {
  16.         console.log('Lettering.js is required');
  17.         return;
  18.     }
  19.     return this.each(function () {
  20.    
  21.         if (options) {
  22.             $.extend(settings, options);
  23.         }
  24.         var elem = this,
  25.             delta = (180 / Math.PI),
  26.             fs = parseInt($(elem).css('font-size'), 10),
  27.             ch = parseInt($(elem).css('line-height'), 10) || fs,
  28.             letters,
  29.             center;
  30.  
  31.         // trim spaces at the beginning and at the end
  32.         elem.innerHTML = elem.innerHTML.replace(/^\s+|\s+$/g, '');
  33.  
  34.         // grab the HTML string
  35.         var temp = elem.innerHTML;
  36.        
  37.         // replace any space that is not part of a tag with a non-breakable space ( )
  38.         elem.innerHTML = elem.innerHTML.replace(/<[^<>]+>|\s/g, function(s) { return s[0] == '<' ? s : '&nbsp;'; })
  39.  
  40.         // wrap each character in a span
  41.         $(elem).lettering();
  42.  
  43.        
  44.         var inTag = false, // are we between tags? (<i>here</i>)
  45.             isTag = false, // are we inside a tag? (<here></here>)
  46.             tagNum = -1,   // how many opening tags have we met so far?
  47.             pos = 0,       // character position (excluding tags)
  48.             dom = document.createElement('div'); // temporary dom
  49.  
  50.         dom.innerHTML = temp; // clone our element in the temporary dom
  51.  
  52.         var tags = dom.children; // children of the element
  53.         // for each of them, empty it
  54.         for(var i=0, l=tags.length; i<l; i++){
  55.             tags[i].innerHTML = '';
  56.         }
  57.  
  58.         // for each character in our HTML string
  59.         for(var i=0, l= temp.length; i<l; i++){
  60.             var c = temp[i];
  61.             // if it's a '<'
  62.             if(c == '<'){
  63.                 // and if it's an opening tag
  64.                 if(!inTag){
  65.                     // increment the number of tags met
  66.                     tagNum++;
  67.                     // we're in a tag!
  68.                     inTag = true;
  69.                 }
  70.                 else{
  71.                     // otherwise we're in a closing tag
  72.                     inTag = false;
  73.                 }
  74.                 // we're on a tag (<here>)
  75.                 isTag = true;
  76.             }
  77.             // if it's a '>'
  78.             else if(c == '>'){
  79.                 // we're not <here> anymore
  80.                 isTag = false;
  81.             }
  82.             // if we're not <here>
  83.             else if(!isTag){
  84.                 // if we're <b>here</b>
  85.                 if(inTag){
  86.                     // replace the span's content with our tag
  87.                     elem.children[pos].innerHTML = tags[tagNum].outerHTML;
  88.                     // put the letter back in
  89.                     elem.children[pos].children[0].innerHTML = c;
  90.                 }
  91.                 // move forward in the spans
  92.                 pos++;
  93.             }
  94.         }
  95.  
  96.  
  97.         elem.style.position =  settings.position;
  98.  
  99.         letters = elem.getElementsByTagName('span');
  100.         center = Math.floor(letters.length / 2)
  101.                
  102.         var layout = function () {
  103.             var tw = 0,
  104.                 i,
  105.                 offset = 0,
  106.                 minRadius,
  107.                 origin,
  108.                 innerRadius,
  109.                 l, style, r, transform;
  110.                                                
  111.             for (i = 0; i < letters.length; i++) {
  112.                 tw += letters[i].offsetWidth;
  113.             }
  114.             minRadius = (tw / Math.PI) / 2 + ch;
  115.            
  116.             if (settings.fluid && !settings.fitText) {
  117.                 settings.radius = Math.max(elem.offsetWidth / 2, minRadius);
  118.             }    
  119.             else if (!settings.radius) {
  120.                 settings.radius = minRadius;
  121.             }  
  122.            
  123.             if (settings.dir === -1) {
  124.                 origin = 'center ' + (-settings.radius + ch) / fs + 'em';
  125.             } else {
  126.                 origin = 'center ' + settings.radius / fs + 'em';
  127.             }
  128.  
  129.             innerRadius = settings.radius - ch;
  130.                
  131.             for (i = 0; i < letters.length; i++) {
  132.                 l = letters[i];
  133.                 offset += l.offsetWidth / 2 / innerRadius * delta;
  134.                 l.rot = offset;                      
  135.                 offset += l.offsetWidth / 2 / innerRadius * delta;
  136.             }  
  137.             for (i = 0; i < letters.length; i++) {
  138.                 l = letters[i]
  139.                 style = l.style
  140.                 r = (-offset * settings.dir / 2) + l.rot * settings.dir            
  141.                 transform = 'rotate(' + r + 'deg)';
  142.                    
  143.                 style.position = 'absolute';
  144.                 style.left = '50%';
  145.                 style.marginLeft = -(l.offsetWidth / 2) / fs + 'em';
  146.  
  147.                 style.webkitTransform = transform;
  148.                 style.MozTransform = transform;
  149.                 style.OTransform = transform;
  150.                 style.msTransform = transform;
  151.                 style.transform = transform;
  152.  
  153.                 style.webkitTransformOrigin = origin;
  154.                 style.MozTransformOrigin = origin;
  155.                 style.OTransformOrigin = origin;
  156.                 style.msTransformOrigin = origin;
  157.                 style.transformOrigin = origin;
  158.                 if(settings.dir === -1) {
  159.                     style.bottom = 0;
  160.                 }
  161.             }
  162.            
  163.             if (settings.fitText) {
  164.                 if (typeof($.fn.fitText) !== 'function') {
  165.                     console.log('FitText.js is required when using the fitText option');
  166.                 } else {
  167.                     $(elem).fitText();
  168.                     $(window).resize(function () {
  169.                         updateHeight();
  170.                     });
  171.                 }
  172.             }    
  173.             updateHeight();
  174.            
  175.             if (typeof settings.callback === 'function') {
  176.                 // Execute our callback with the element we transformed as `this`
  177.                 settings.callback.apply(elem);
  178.             }
  179.         };
  180.        
  181.         var getBounds = function (elem) {
  182.             var docElem = document.documentElement,
  183.                 box = elem.getBoundingClientRect();
  184.             return {
  185.                 top: box.top + window.pageYOffset - docElem.clientTop,
  186.                 left: box.left + window.pageXOffset - docElem.clientLeft,
  187.                 height: box.height
  188.             };
  189.         };      
  190.        
  191.         var updateHeight = function () {
  192.             var mid = getBounds(letters[center]),
  193.                 first = getBounds(letters[0]),
  194.                 h;
  195.             if (mid.top < first.top) {
  196.                 h = first.top - mid.top + first.height;
  197.             } else {
  198.                 h = mid.top - first.top + first.height;
  199.             }
  200.             elem.style.height = h + 'px';  
  201.         }
  202.  
  203.         if (settings.fluid && !settings.fitText) {
  204.             $(window).resize(function () {
  205.                 layout();
  206.             });
  207.         }    
  208.  
  209.         if (document.readyState !== "complete") {
  210.             elem.style.visibility = 'hidden';
  211.             $(window).load(function () {
  212.                 elem.style.visibility = 'visible';
  213.                 layout();
  214.             });
  215.         } else {
  216.             layout();
  217.         }
  218.     });
  219. };
Advertisement
Add Comment
Please, Sign In to add comment