| 
									
										
										
										
											2013-10-18 02:33:04 +08:00
										 |  |  | /*! | 
					
						
							| 
									
										
										
										
											2014-01-14 13:07:17 +08:00
										 |  |  |  * Bootstrap Customizer (http://getbootstrap.com/customize/)
 | 
					
						
							| 
									
										
										
										
											2014-01-07 08:05:24 +08:00
										 |  |  |  * Copyright 2011-2014 Twitter, Inc. | 
					
						
							| 
									
										
										
										
											2013-10-18 05:11:40 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Creative Commons Attribution 3.0 Unported License. For | 
					
						
							|  |  |  |  * details, see http://creativecommons.org/licenses/by/3.0/.
 | 
					
						
							| 
									
										
										
										
											2013-10-18 02:33:04 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-19 02:37:55 +08:00
										 |  |  | /* jshint multistr:true */ | 
					
						
							| 
									
										
										
										
											2013-10-18 02:33:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  | window.onload = function () { // wait for load in a dumb way because B-0
 | 
					
						
							| 
									
										
										
										
											2013-12-19 07:37:46 +08:00
										 |  |  |   var cw = '/*!\n' + | 
					
						
							| 
									
										
										
										
											2013-12-25 04:16:17 +08:00
										 |  |  |            ' * Bootstrap v3.0.3 (http://getbootstrap.com)\n' + | 
					
						
							| 
									
										
										
										
											2014-01-07 08:05:24 +08:00
										 |  |  |            ' * Copyright 2011-2014 Twitter, Inc.\n' + | 
					
						
							| 
									
										
										
										
											2013-12-19 07:37:46 +08:00
										 |  |  |            ' * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n' + | 
					
						
							|  |  |  |            ' */\n\n'; | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 15:28:52 +08:00
										 |  |  |   function showError(msg, err) { | 
					
						
							| 
									
										
										
										
											2013-08-18 10:04:41 +08:00
										 |  |  |     $('<div id="bsCustomizerAlert" class="bs-customizer-alert">\ | 
					
						
							|  |  |  |         <div class="container">\ | 
					
						
							|  |  |  |           <a href="#bsCustomizerAlert" data-dismiss="alert" class="close pull-right">×</a>\ | 
					
						
							| 
									
										
										
										
											2013-08-19 15:54:53 +08:00
										 |  |  |           <p class="bs-customizer-alert-text"><span class="glyphicon glyphicon-warning-sign"></span>' + msg + '</p>' + | 
					
						
							| 
									
										
										
										
											2013-08-18 10:04:41 +08:00
										 |  |  |           (err.extract ? '<pre class="bs-customizer-alert-extract">' + err.extract.join('\n') + '</pre>' : '') + '\ | 
					
						
							|  |  |  |         </div>\ | 
					
						
							|  |  |  |       </div>').appendTo('body').alert() | 
					
						
							|  |  |  |     throw err | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 15:28:52 +08:00
										 |  |  |   function showCallout(msg, showUpTop) { | 
					
						
							|  |  |  |     var callout = $('<div class="bs-callout bs-callout-danger">\ | 
					
						
							|  |  |  |        <h4>Attention!</h4>\ | 
					
						
							|  |  |  |       <p>' + msg + '</p>\ | 
					
						
							|  |  |  |     </div>') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (showUpTop) { | 
					
						
							|  |  |  |       callout.appendTo('.bs-docs-container') | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       callout.insertAfter('.bs-customize-download') | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |   function getQueryParam(key) { | 
					
						
							| 
									
										
										
										
											2013-09-19 00:50:02 +08:00
										 |  |  |     key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, '\\$&'); // escape RegEx meta chars
 | 
					
						
							|  |  |  |     var match = location.search.match(new RegExp('[?&]' + key + '=([^&]+)(&|$)')); | 
					
						
							|  |  |  |     return match && decodeURIComponent(match[1].replace(/\+/g, ' ')); | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-14 16:26:42 +08:00
										 |  |  |   function createGist(configJson) { | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |     var data = { | 
					
						
							| 
									
										
										
										
											2013-09-19 00:50:02 +08:00
										 |  |  |       'description': 'Bootstrap Customizer Config', | 
					
						
							|  |  |  |       'public': true, | 
					
						
							|  |  |  |       'files': { | 
					
						
							|  |  |  |         'config.json': { | 
					
						
							|  |  |  |           'content': configJson | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     $.ajax({ | 
					
						
							|  |  |  |       url: 'https://api.github.com/gists', | 
					
						
							|  |  |  |       type: 'POST', | 
					
						
							|  |  |  |       dataType: 'json', | 
					
						
							|  |  |  |       data: JSON.stringify(data) | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2013-09-19 02:37:55 +08:00
										 |  |  |     .success(function (result) { | 
					
						
							| 
									
										
										
										
											2013-09-19 00:50:02 +08:00
										 |  |  |       var origin = window.location.protocol + '//' + window.location.host | 
					
						
							| 
									
										
										
										
											2013-11-02 09:56:27 +08:00
										 |  |  |       history.replaceState(false, document.title, origin + window.location.pathname + '?id=' + result.id) | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2013-09-19 02:37:55 +08:00
										 |  |  |     .error(function (err) { | 
					
						
							| 
									
										
										
										
											2013-08-19 14:36:36 +08:00
										 |  |  |       showError('<strong>Ruh roh!</strong> Could not save gist file, configuration not saved.', err) | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |     }) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 15:28:52 +08:00
										 |  |  |   function getCustomizerData() { | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  |     var vars = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $('#less-variables-section input') | 
					
						
							|  |  |  |         .each(function () { | 
					
						
							| 
									
										
										
										
											2013-09-19 02:37:55 +08:00
										 |  |  |           $(this).val() && (vars[$(this).prev().text()] = $(this).val()) | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var data = { | 
					
						
							|  |  |  |       vars: vars, | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |       css: $('#less-section input:checked')  .map(function () { return this.value }).toArray(), | 
					
						
							|  |  |  |       js:  $('#plugin-section input:checked').map(function () { return this.value }).toArray() | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($.isEmptyObject(data.vars) && !data.css.length && !data.js.length) return | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 15:28:52 +08:00
										 |  |  |     return data | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function parseUrl() { | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |     var id = getQueryParam('id') | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |     if (!id) return | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |     $.ajax({ | 
					
						
							|  |  |  |       url: 'https://api.github.com/gists/' + id, | 
					
						
							|  |  |  |       type: 'GET', | 
					
						
							|  |  |  |       dataType: 'json' | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2013-09-19 02:37:55 +08:00
										 |  |  |     .success(function (result) { | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |       var data = JSON.parse(result.files['config.json'].content) | 
					
						
							|  |  |  |       if (data.js) { | 
					
						
							|  |  |  |         $('#plugin-section input').each(function () { | 
					
						
							|  |  |  |           $(this).prop('checked', ~$.inArray(this.value, data.js)) | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |       if (data.css) { | 
					
						
							|  |  |  |         $('#less-section input').each(function () { | 
					
						
							|  |  |  |           $(this).prop('checked', ~$.inArray(this.value, data.css)) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (data.vars) { | 
					
						
							|  |  |  |         for (var i in data.vars) { | 
					
						
							|  |  |  |           $('input[data-var="' + i + '"]').val(data.vars[i]) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2013-09-19 02:37:55 +08:00
										 |  |  |     .error(function (err) { | 
					
						
							| 
									
										
										
										
											2013-08-18 10:04:41 +08:00
										 |  |  |       showError('Error fetching bootstrap config file', err) | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-14 16:26:42 +08:00
										 |  |  |   function generateZip(css, js, fonts, config, complete) { | 
					
						
							| 
									
										
										
										
											2013-08-19 14:36:36 +08:00
										 |  |  |     if (!css && !js) return showError('<strong>Ruh roh!</strong> No Bootstrap files selected.', new Error('no Bootstrap')) | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     var zip = new JSZip() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (css) { | 
					
						
							|  |  |  |       var cssFolder = zip.folder('css') | 
					
						
							|  |  |  |       for (var fileName in css) { | 
					
						
							|  |  |  |         cssFolder.file(fileName, css[fileName]) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (js) { | 
					
						
							|  |  |  |       var jsFolder = zip.folder('js') | 
					
						
							| 
									
										
										
										
											2013-09-19 02:37:55 +08:00
										 |  |  |       for (var jsFileName in js) { | 
					
						
							|  |  |  |         jsFolder.file(jsFileName, js[jsFileName]) | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-20 03:19:00 +08:00
										 |  |  |     if (fonts) { | 
					
						
							|  |  |  |       var fontsFolder = zip.folder('fonts') | 
					
						
							| 
									
										
										
										
											2013-09-19 02:37:55 +08:00
										 |  |  |       for (var fontsFileName in fonts) { | 
					
						
							|  |  |  |         fontsFolder.file(fontsFileName, fonts[fontsFileName], {base64: true}) | 
					
						
							| 
									
										
										
										
											2013-08-20 03:19:00 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-14 16:26:42 +08:00
										 |  |  |     if (config) { | 
					
						
							| 
									
										
										
										
											2013-09-19 00:50:02 +08:00
										 |  |  |       zip.file('config.json', config) | 
					
						
							| 
									
										
										
										
											2013-09-14 16:26:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-19 00:50:02 +08:00
										 |  |  |     var content = zip.generate({ type: 'blob' }) | 
					
						
							| 
									
										
										
										
											2013-08-18 15:28:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     complete(content) | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function generateCustomCSS(vars) { | 
					
						
							|  |  |  |     var result = '' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (var key in vars) { | 
					
						
							|  |  |  |       result += key + ': ' + vars[key] + ';\n' | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return result + '\n\n' | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-20 03:19:00 +08:00
										 |  |  |   function generateFonts() { | 
					
						
							|  |  |  |     var glyphicons = $('#less-section [value="glyphicons.less"]:checked') | 
					
						
							|  |  |  |     if (glyphicons.length) { | 
					
						
							|  |  |  |       return __fonts | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-08 10:38:37 +08:00
										 |  |  |   // Returns an Array of @import'd filenames in the order
 | 
					
						
							| 
									
										
										
										
											2013-09-24 14:29:45 +08:00
										 |  |  |   // in which they appear in the file.
 | 
					
						
							| 
									
										
										
										
											2014-01-08 10:38:37 +08:00
										 |  |  |   function includedLessFilenames(lessFilename) { | 
					
						
							| 
									
										
										
										
											2013-09-24 14:29:45 +08:00
										 |  |  |     var IMPORT_REGEX = /^@import \"(.*?)\";$/ | 
					
						
							| 
									
										
										
										
											2014-01-08 10:38:37 +08:00
										 |  |  |     var lessLines = __less[lessFilename].split('\n') | 
					
						
							| 
									
										
										
										
											2013-09-24 14:29:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-08 10:38:37 +08:00
										 |  |  |     for (var i = 0, imports = []; i < lessLines.length; i++) { | 
					
						
							|  |  |  |       var match = IMPORT_REGEX.exec(lessLines[i]) | 
					
						
							| 
									
										
										
										
											2013-09-24 14:29:45 +08:00
										 |  |  |       if (match) imports.push(match[1]) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return imports | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-08 10:38:37 +08:00
										 |  |  |   function generateLESS(lessFilename, lessFileIncludes, vars) { | 
					
						
							|  |  |  |     var lessSource = __less[lessFilename] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $.each(includedLessFilenames(lessFilename), function(index, filename) { | 
					
						
							|  |  |  |       var fileInclude = lessFileIncludes[filename] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Files not explicitly unchecked are compiled into the final stylesheet.
 | 
					
						
							|  |  |  |       // Core stylesheets like 'normalize.less' are not included in the form
 | 
					
						
							|  |  |  |       // since disabling them would wreck everything, and so their 'fileInclude'
 | 
					
						
							|  |  |  |       // will be 'undefined'.
 | 
					
						
							|  |  |  |       if (fileInclude || (fileInclude == null))    lessSource += __less[filename] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Custom variables are added after Bootstrap variables so the custom
 | 
					
						
							|  |  |  |       // ones take precedence.
 | 
					
						
							|  |  |  |       if (('variables.less' === filename) && vars) lessSource += generateCustomCSS(vars) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     lessSource = lessSource.replace(/@import[^\n]*/gi, '') //strip any imports
 | 
					
						
							|  |  |  |     return lessSource | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function compileLESS(lessSource, baseFilename, intoResult) { | 
					
						
							|  |  |  |     var parser = new less.Parser({ | 
					
						
							|  |  |  |         paths: ['variables.less', 'mixins.less'], | 
					
						
							|  |  |  |         optimization: 0, | 
					
						
							|  |  |  |         filename: baseFilename + '.css' | 
					
						
							|  |  |  |     }).parse(lessSource, function (err, tree) { | 
					
						
							|  |  |  |       if (err) { | 
					
						
							|  |  |  |         return showError('<strong>Ruh roh!</strong> Could not parse less files.', err) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       intoResult[baseFilename + '.css']     = cw + tree.toCSS() | 
					
						
							|  |  |  |       intoResult[baseFilename + '.min.css'] = cw + tree.toCSS({ compress: true }) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  |   function generateCSS() { | 
					
						
							| 
									
										
										
										
											2013-09-24 14:29:45 +08:00
										 |  |  |     var oneChecked = false | 
					
						
							|  |  |  |     var lessFileIncludes = {} | 
					
						
							|  |  |  |     $('#less-section input').each(function() { | 
					
						
							|  |  |  |       var $this = $(this) | 
					
						
							|  |  |  |       var checked = $this.is(':checked') | 
					
						
							|  |  |  |       lessFileIncludes[$this.val()] = checked | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       oneChecked = oneChecked || checked | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-24 14:29:45 +08:00
										 |  |  |     if (!oneChecked) return false | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     var result = {} | 
					
						
							|  |  |  |     var vars = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $('#less-variables-section input') | 
					
						
							|  |  |  |         .each(function () { | 
					
						
							| 
									
										
										
										
											2013-09-19 02:37:55 +08:00
										 |  |  |           $(this).val() && (vars[$(this).prev().text()] = $(this).val()) | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-08 10:57:15 +08:00
										 |  |  |     var bsLessSource    = generateLESS('bootstrap.less', lessFileIncludes, vars) | 
					
						
							|  |  |  |     var themeLessSource = generateLESS('theme.less',     lessFileIncludes, vars) | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     try { | 
					
						
							| 
									
										
										
										
											2014-01-08 10:38:37 +08:00
										 |  |  |       compileLESS(bsLessSource, 'bootstrap', result) | 
					
						
							| 
									
										
										
										
											2014-01-08 10:57:15 +08:00
										 |  |  |       compileLESS(themeLessSource, 'bootstrap-theme', result) | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  |     } catch (err) { | 
					
						
							| 
									
										
										
										
											2013-08-19 14:36:36 +08:00
										 |  |  |       return showError('<strong>Ruh roh!</strong> Could not parse less files.', err) | 
					
						
							| 
									
										
										
										
											2013-08-12 09:42:13 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return result | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function generateJavascript() { | 
					
						
							|  |  |  |     var $checked = $('#plugin-section input:checked') | 
					
						
							|  |  |  |     if (!$checked.length) return false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var js = $checked | 
					
						
							|  |  |  |       .map(function () { return __js[this.value] }) | 
					
						
							|  |  |  |       .toArray() | 
					
						
							|  |  |  |       .join('\n') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       'bootstrap.js': js, | 
					
						
							|  |  |  |       'bootstrap.min.js': cw + uglify(js) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var inputsComponent = $('#less-section input') | 
					
						
							|  |  |  |   var inputsPlugin    = $('#plugin-section input') | 
					
						
							|  |  |  |   var inputsVariables = $('#less-variables-section input') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   $('#less-section .toggle').on('click', function (e) { | 
					
						
							|  |  |  |     e.preventDefault() | 
					
						
							|  |  |  |     inputsComponent.prop('checked', !inputsComponent.is(':checked')) | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   $('#plugin-section .toggle').on('click', function (e) { | 
					
						
							|  |  |  |     e.preventDefault() | 
					
						
							|  |  |  |     inputsPlugin.prop('checked', !inputsPlugin.is(':checked')) | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   $('#less-variables-section .toggle').on('click', function (e) { | 
					
						
							|  |  |  |     e.preventDefault() | 
					
						
							|  |  |  |     inputsVariables.val('') | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 12:50:01 +08:00
										 |  |  |   $('[data-dependencies]').on('click', function () { | 
					
						
							|  |  |  |     if (!$(this).is(':checked')) return | 
					
						
							|  |  |  |     var dependencies = this.getAttribute('data-dependencies') | 
					
						
							|  |  |  |     if (!dependencies) return | 
					
						
							|  |  |  |     dependencies = dependencies.split(',') | 
					
						
							|  |  |  |     for (var i = 0; i < dependencies.length; i++) { | 
					
						
							|  |  |  |       var dependency = $('[value="' + dependencies[i] + '"]') | 
					
						
							|  |  |  |       dependency && dependency.prop('checked', true) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   $('[data-dependents]').on('click', function () { | 
					
						
							|  |  |  |     if ($(this).is(':checked')) return | 
					
						
							|  |  |  |     var dependents = this.getAttribute('data-dependents') | 
					
						
							|  |  |  |     if (!dependents) return | 
					
						
							|  |  |  |     dependents = dependents.split(',') | 
					
						
							|  |  |  |     for (var i = 0; i < dependents.length; i++) { | 
					
						
							|  |  |  |       var dependent = $('[value="' + dependents[i] + '"]') | 
					
						
							|  |  |  |       dependent && dependent.prop('checked', false) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 15:28:52 +08:00
										 |  |  |   var $compileBtn = $('#btn-compile') | 
					
						
							|  |  |  |   var $downloadBtn = $('#btn-download') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   $compileBtn.on('click', function (e) { | 
					
						
							| 
									
										
										
										
											2013-09-14 16:26:42 +08:00
										 |  |  |     var configData = getCustomizerData() | 
					
						
							|  |  |  |     var configJson = JSON.stringify(configData, null, 2) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 15:28:52 +08:00
										 |  |  |     e.preventDefault() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $compileBtn.attr('disabled', 'disabled') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-14 16:26:42 +08:00
										 |  |  |     generateZip(generateCSS(), generateJavascript(), generateFonts(), configJson, function (blob) { | 
					
						
							| 
									
										
										
										
											2013-08-18 15:28:52 +08:00
										 |  |  |       $compileBtn.removeAttr('disabled') | 
					
						
							| 
									
										
										
										
											2013-09-19 00:50:02 +08:00
										 |  |  |       saveAs(blob, 'bootstrap.zip') | 
					
						
							| 
									
										
										
										
											2013-09-14 16:26:42 +08:00
										 |  |  |       createGist(configJson) | 
					
						
							| 
									
										
										
										
											2013-08-18 15:28:52 +08:00
										 |  |  |     }) | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // browser support alerts
 | 
					
						
							|  |  |  |   if (!window.URL && navigator.userAgent.toLowerCase().indexOf('safari') != -1) { | 
					
						
							| 
									
										
										
										
											2013-09-19 00:50:02 +08:00
										 |  |  |     showCallout('Looks like you\'re using safari, which sadly doesn\'t have the best support\ | 
					
						
							|  |  |  |                  for HTML5 blobs. Because of this your file will be downloaded with the name <code>"untitled"</code>.\ | 
					
						
							|  |  |  |                  However, if you check your downloads folder, just rename this <code>"untitled"</code> file\ | 
					
						
							|  |  |  |                  to <code>"bootstrap.zip"</code> and you should be good to go!') | 
					
						
							| 
									
										
										
										
											2013-08-18 15:28:52 +08:00
										 |  |  |   } else if (!window.URL && !window.webkitURL) { | 
					
						
							|  |  |  |     $('.bs-docs-section, .bs-sidebar').css('display', 'none') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-19 00:50:02 +08:00
										 |  |  |     showCallout('Looks like your current browser doesn\'t support the Bootstrap Customizer. Please take a second\ | 
					
						
							|  |  |  |                  to <a href="https://www.google.com/intl/en/chrome/browser/"> upgrade to a more modern browser</a>.', true) | 
					
						
							| 
									
										
										
										
											2013-08-18 15:28:52 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 09:41:36 +08:00
										 |  |  |   parseUrl() | 
					
						
							| 
									
										
										
										
											2013-08-19 14:27:46 +08:00
										 |  |  | } |