// namespace window.semantic = { handler: {} }; // Allow for console.log to not break IE if (typeof window.console == "undefined" || typeof window.console.log == "undefined") { window.console = { log : function() {}, info : function(){}, warn : function(){} }; } if(typeof window.console.group == 'undefined' || typeof window.console.groupEnd == 'undefined' || typeof window.console.groupCollapsed == 'undefined') { window.console.group = function(){}; window.console.groupEnd = function(){}; window.console.groupCollapsed = function(){}; } if(typeof window.console.markTimeline == 'undefined') { window.console.markTimeline = function(){}; } window.console.clear = function(){}; // ready event semantic.ready = function() { // selector cache var $sortableTables = $('.sortable.table'), $sticky = $('.ui.sticky'), $themeDropdown = $('.theme.dropdown'), $ui = $('.ui').not('.hover, .down'), $swap = $('.theme.menu .item'), $menu = $('#menu'), $hideMenu = $('#menu .hide.item'), $sortTable = $('.sortable.table'), $demo = $('.demo'), $container = $('.main.container'), $allHeaders = $('.main.container > h2, .main.container > .tab > h2, .main.container > .tab > .examples h2'), $sectionHeaders = $container.children('h2'), $followMenu = $container.find('.following.menu'), $sectionExample = $container.find('.example'), $exampleHeaders = $sectionExample.children('h4'), $footer = $('.page > .footer'), $menuPopup = $('.ui.main.menu .popup.item'), $pageDropdown = $('.ui.main.menu .page.dropdown'), $pageTabMenu = $('.tab.header.segment .tabular.menu'), $pageTabs = $('.tab.header.segment .menu .item'), $languageDropdown = $('.language.dropdown'), $languageModal = $('.language.modal'), $downloadDropdown = $('.download.buttons .dropdown'), $helpPopup = $('.header .help.icon'), $example = $('.example'), $shownExample = $example.filter('.shown'), $overview = $('.overview.button'), //$developer = $('.header .developer.item'), //$designer = $('.header .designer.item'), $sidebarButton = $('.fixed.launch.button'), $code = $('div.code').not('.existing'), $existingCode = $('.existing.code'), languageDropdownUsed = false, requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { setTimeout(callback, 0); }, // alias handler ; // event handlers handler = { createIcon: function() { $example .each(function(){ $('') .addClass('icon code') .insertAfter( $(this).children(':first-child') ) ; }) ; }, createWaypoints: function() { $sectionHeaders .visibility({ once: false, offset: 70, onTopVisible: handler.activate.accordion, onTopPassed: handler.activate.section, onBottomPassed: handler.activate.section, onTopPassedReverse: handler.activate.previous }) ; $sectionExample .visibility({ once: false, offset: 70, onTopPassed: handler.activate.example, onBottomPassedReverse: handler.activate.example }) ; $footer .visibility({ once: false, onTopVisible: function() { var $title = $followMenu.find('> .item > .title').last() ; $followMenu .accordion('open', $title) ; } }) ; }, activate: { previous: function() { var $menuItems = $followMenu.children('.item'), $section = $menuItems.filter('.active'), index = $menuItems.index($section) ; if($section.prev().size() > 0) { $section .removeClass('active') .prev('.item') .addClass('active') ; $followMenu .accordion('open', index - 1) ; } }, accordion: function() { var $section = $(this), index = $sectionHeaders.index($section), $followSection = $followMenu.children('.item'), $activeSection = $followSection.eq(index) ; $followMenu .accordion('open', index) ; }, section: function() { var $section = $(this), index = $sectionHeaders.index($section), $followSection = $followMenu.children('.item'), $activeSection = $followSection.eq(index) ; $followSection .removeClass('active') ; $activeSection .addClass('active') ; }, example: function() { var $section = $(this).children('h4').eq(0), index = $exampleHeaders.index($section), $followSection = $followMenu.find('.menu > .item'), $activeSection = $followSection.eq(index), inClosedTab = ($(this).closest('.tab:not(.active)').size() > 0), anotherExample = ($(this).filter('.another.example').size() > 0) ; if(!inClosedTab && !anotherExample) { $followSection .removeClass('active') ; $activeSection .addClass('active') ; } } }, translatePage: function(languageCode, text, $choice) { languageDropdownUsed = true; window.Transifex.live.translateTo(languageCode, true); }, showLanguageModal: function(languageCode) { var $choice = $languageDropdown.find('[data-value="' + languageCode + '"]').eq(0), percent = $choice.data('percent') || 0, text = $choice.text() ; if(percent < 100 && languageDropdownUsed) { languageDropdownUsed = false; $languageModal .modal() .find('.header .name') .html(text) .end() .find('.complete') .html(percent) .end() ; $languageModal .modal('show', function() { $('.language.modal .progress .bar').css('width', percent + '%'); }) ; } }, tryCreateMenu: function(event) { if($(window).width() > 640) { if($container.find('.following.menu').size() === 0) { handler.createMenu(); handler.createWaypoints(); $(window).off('resize.menu'); } } }, createAnchors: function() { $allHeaders .each(function() { var $section = $(this), safeName = $section.text().trim().replace(/\s+/g, '-').replace(/[^-,'A-Za-z0-9]+/g, '').toLowerCase(), id = window.escape(safeName), $anchor = $('').addClass('anchor').attr('id', id) ; $section .append($anchor) ; }) ; $example .each(function() { var $title = $(this).children('h4').eq(0), safeName = $title.text().trim().replace(/\s+/g, '-').replace(/[^-,'A-Za-z0-9]+/g, '').toLowerCase(), id = window.escape(safeName), $anchor = $('').addClass('anchor').attr('id', id) ; if($title.size() > 0) { $title.after($anchor); } }) ; }, createMenu: function() { // grab each h3 var html = '', $sticky, $rail ; $sectionHeaders .each(function(index) { var $currentHeader = $(this), $nextElements = $currentHeader.nextUntil('h2'), $examples = $nextElements.find('.example').andSelf().filter('.example'), activeClass = (index === 0) ? 'active ' : '', safeName = $currentHeader.text().trim().replace(/\s+/g, '-').replace(/[^-,'A-Za-z0-9]+/g, '').toLowerCase(), id = window.escape(safeName), $anchor = $('').addClass('anchor').attr('id', id) ; html += '
'; if($examples.size() === 0) { html += '' + $(this).text() + ''; } else { html += ' ' + $(this).text() + ''; } if($examples.size() > 0) { html += ''; } html += '
'; }) ; $followMenu = $('
') .addClass('ui secondary vertical following fluid accordion menu') .html(html) ; $sticky = $('
') .addClass('ui sticky hidden transition') .html($followMenu) ; $rail = $('
') .addClass('ui close right rail') .html($sticky) .appendTo($container) ; $followMenu .accordion({ exclusive: false, onChange: function() { $sticky.sticky('refresh'); } }) .find('.menu a[href], .title[href]') .on('click', handler.scrollTo) ; $sticky .transition('fade', function() { $sticky.sticky({ context: $container, offset: 50 }); }) ; }, scrollTo: function(event) { var id = $(this).attr('href').replace('#', ''), $element = $('#'+id), position = $element.offset().top ; $element .addClass('active') ; $('html, body') .animate({ scrollTop: position }, 500) ; location.hash = '#' + id; event.stopImmediatePropagation(); event.preventDefault(); return false; }, less: { parseFile: function(content) { var variables = {}, lines = content.match(/^(@[\s|\S]+?;)/gm), name, value ; if(lines) { $.each(lines, function(index, line) { // clear whitespace line = $.trim(line); // match variables only if(line[0] == '@') { name = line.match(/^@(.+):/); value = line.match(/:\s*([\s|\S]+?;)/); if( ($.isArray(name) && name.length >= 2) && ($.isArray(value) && value.length >= 2) ) { name = name[1]; value = value[1]; variables[name] = value; } } }); } return variables; }, changeTheme: function(theme) { var $themeDropdown = $(this), variableURL = '/build/less/themes/packages/{$theme}/{$type}s/{$element}.variables', overrideURL = '/build/less/themes/packages/{$theme}/{$type}s/{$element}.overrides', urlData = { theme : typeof(theme === 'string') ? theme.toLowerCase() : theme, type : $themeDropdown.data('type'), element : $themeDropdown.data('element') } ; $themeDropdown .api({ on : 'now', url : variableURL, dataType : 'text', urlData : urlData, onSuccess: function(content) { window.less.modifyVars( handler.less.parseFile(content) ); $themeDropdown .api({ on : 'now', url : overrideURL, dataType : 'text', urlData : urlData, onSuccess: function(content) { if( $('style.override').size() > 0 ) { $('style.override').remove(); } console.log(content); $('') .addClass('override') .appendTo('body') ; $('.sticky').sticky('refresh'); } }) ; } }) ; } }, create: { examples: function(json) { var types = json['Types'], text = json['Text'], states = json['States'], variations = json['Variations'], $element, html ; $.each(types, function(name, type){ html += '

' + name + '

') } else if(image) { $(this).replaceWith(''); } }) ; // remove wireframe images $this.find('.wireframe').remove(); if($this.not('br').not('.wireframe')) { // allow inline styles only with this one class if($this.is('.my-container')) { code += $this.get(0).outerHTML + "\n"; } else { code += $this.removeAttr('style').get(0).outerHTML + "\n"; } } }) ; } $example.data('code', code); return code; }, createCode: function(type) { var $example = $(this).closest('.example'), $header = $example.children('.ui.header:first-of-type').eq(0).add('p:first-of-type'), $annotation = $example.find('.annotation'), $code = $annotation.find('.code'), $ignoredContent = $('.ui.popup, i.code:last-child, .anchor, .code, .existing.segment, .instructive, .language.label, .annotation, br, .ignore, .ignored'), $demo = $example.children().not($header).not($ignoredContent), code = $example.data('code') || $.proxy(handler.generateCode, this)() ; if( $code.hasClass('existing') ) { $annotation.show(); $code.removeClass('existing'); $.proxy(handler.initializeCode, $code)(); } if($annotation.size() === 0) { $annotation = $('
') .addClass('annotation') .appendTo($example) ; } if( $example.find('.instructive').size() === 0) { $code = $('
') .data('type', 'html') .addClass('code') .html(code) .hide() .appendTo($annotation) ; $.proxy(handler.initializeCode, $code)(); } if( ($demo.first().is(':visible') || type == 'developer') && type != 'designer' ) { $demo.hide(); $header.show(); $annotation.fadeIn(500); } else { $annotation.hide(); if($demo.size() > 1) { $demo.show(); } else { $demo.fadeIn(500); } } $sectionHeaders.visibility('refresh'); $sectionExample.visibility('refresh'); $footer.visibility('refresh'); }, createAnnotation: function() { if(!$(this).data('type')) { $(this).data('type', 'html'); } $(this) .wrap('
') .parent() .hide() ; }, makeCode: function() { if(window.hljs !== undefined) { $code .filter(':visible') .each(handler.initializeCode) ; $existingCode .each(handler.createAnnotation) ; } else { console.log('Syntax highlighting not found'); } }, initializeCode: function() { var $code = $(this).show(), code = $code.html(), existingCode = $code.hasClass('existing'), evaluatedCode = $code.hasClass('evaluated'), contentType = $code.data('type') || 'javascript', title = $code.data('title') || false, demo = $code.data('demo') || false, preview = $code.data('preview') || false, label = $code.data('label') || false, displayType = { html : 'HTML', javascript : 'Javascript', css : 'CSS', text : 'Command Line', sh : 'Command Line' }, indent = handler.getIndent(code) || 2, padding = 20, name = (evaluatedCode) ? 'existing' : 'instructive', formattedCode = code, whiteSpace, $label, codeHeight ; var entityMap = { "&": "&", "<": "<", ">": ">", '"': '"', "'": ''', "/": '/' }; function escapeHTML(string) { return String(string).replace(/[&<>"'\/]/g, function (s) { return entityMap[s]; }); } // evaluate if specified if(evaluatedCode) { eval(code); } // trim whitespace & escape whiteSpace = new RegExp('\\n\\s{' + indent + '}', 'g'); formattedCode = $.trim(code).replace(whiteSpace, '\n'); formattedCode = escapeHTML(formattedCode); $code.html(formattedCode); // wrap $code = $code .wrap('
') .wrap('
')
      ;

      // color code
      window.hljs.highlightBlock($code[0]);

      // add label
      if(title) {
        $('
') .addClass('ui attached top label') .html('' + title + '' + '' + (displayType[contentType] || contentType) + '') .prependTo( $(this).closest('.segment') ) ; } if(label) { $('
') .addClass('ui pointing below language label') .html(displayType[contentType] || contentType) .insertBefore ( $(this).closest('.segment') ) ; } // add run code button if(demo) { $('') .addClass('ui pointing below label') .html('Run Code') .on('click', function() { eval(code); }) .insertBefore ( $(this).closest('.segment') ) ; } // add preview if specified if(preview) { $(code) .insertAfter( $(this).closest('.segment') ) ; } $code.removeClass('hidden'); }, swapStyle: function() { var theme = $(this).data('theme') ; $(this) .addClass('active') .siblings() .removeClass('active') ; $('head link.ui') .each(function() { var href = $(this).attr('href'), subDirectory = href.split('/')[3], newLink = href.replace(subDirectory, theme) ; $(this) .attr('href', newLink) ; }) ; } }; handler.createAnchors(); if( $pageTabs.size() > 0 ) { $pageTabs .tab({ context : '.main.container', childrenOnly : true, history : true, onTabInit : function() { handler.makeCode(); $container = ($('.fixed.column').size() > 0 ) ? $(this).find('.examples') : $(this) ; $sectionHeaders = $container.children('h2'); $sectionExample = $container.find('.example'); $exampleHeaders = $sectionExample.children('h4'); // create code handler.tryCreateMenu(); $(window).on('resize.menu', function() { handler.tryCreateMenu(); }); }, onTabLoad : function() { $sticky.filter(':visible').sticky('refresh'); } }) ; } else { handler.makeCode(); handler.tryCreateMenu(); $(window).on('resize.menu', function() { handler.tryCreateMenu(); }); } $sticky .sticky({ context : '.main.container', pushing : true }) ; window.hljs.configure({ languages: [ 'xml', 'css', 'javascript' ] }); $menu .sidebar({ transition : 'uncover', mobileTransition : 'uncover' }) .sidebar('attach events', '.launch.button, .view-ui, .launch.item') ; handler.createIcon(); $example .each(function() { $.proxy(handler.generateCode, this)(); }) .find('i.code') .on('click', handler.createCode) ; $shownExample .each(handler.createCode) ; $downloadDropdown .dropdown({ on : 'click', transition : 'scale' }) ; $themeDropdown .dropdown({ action: 'select', onChange: handler.less.changeTheme }) ; if($.fn.tablesort !== undefined && $sortTable.size() > 0) { $sortTable .tablesort() ; } $helpPopup .popup() ; $swap .on('click', handler.swapStyle) ; $overview .on('click', handler.overviewMode) ; $menuPopup .popup({ position : 'bottom center', className : { popup: 'ui popup' } }) ; $pageDropdown .dropdown({ on : 'hover', action : 'nothing', allowTab : false }) ; $languageDropdown .popup() .dropdown({ on : 'click', onShow: function() { $(this).popup('hide'); }, onChange: handler.translatePage }) ; window.Transifex.live.onTranslatePage(handler.showLanguageModal); }; // attach ready event $(document) .ready(semantic.ready) ;