update bootstrap to 3.0.0-rc2
[bootswatch] / bower_components / bootstrap / assets / js / customizer.js
1 window.onload = function () { // wait for load in a dumb way because B-0
2   var cw = '/*!\n * Bootstrap v3.0.0-rc.2\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n\n'
3
4   function generateUrl() {
5     var vars = {}
6
7     $('#less-variables-section input')
8         .each(function () {
9           $(this).val() && (vars[ $(this).prev().text() ] = $(this).val())
10         })
11
12     var data = {
13       vars: vars,
14       css: $('#less-section input:not(:checked)').map(function () { return this.value }).toArray(),
15       js: $('#plugin-section input:not(:checked)').map(function () { return this.value }).toArray()
16     }
17
18     if ($.isEmptyObject(data.vars) && !data.css.length && !data.js.length) return
19
20     window.location = jQuery.param.querystring('/customize/', data)
21   }
22
23   function parseUrl() {
24     var data = jQuery.deparam.querystring()
25
26     if (data.js) {
27       for (var i = 0; i < data.js.length; i++) {
28         var input = $('input[value="'+data.js[i]+'"]')
29         input && input.prop('checked', false)
30       }
31     }
32
33     if (data.css) {
34       for (var i = 0; i < data.css.length; i++) {
35         var input = $('input[value="'+data.css[i]+'"]')
36         input && input.prop('checked', false)
37       }
38     }
39
40     if (data.vars) {
41       // todo (fat): vars
42     }
43   }
44
45   function generateZip(css, js, complete) {
46     if (!css && !js) return alert('you want to build nothing… o_O')
47
48     var zip = new JSZip()
49
50     if (css) {
51       var cssFolder = zip.folder('css')
52       for (var fileName in css) {
53         cssFolder.file(fileName, css[fileName])
54       }
55     }
56
57     if (js) {
58       var jsFolder = zip.folder('js')
59       for (var fileName in js) {
60         jsFolder.file(fileName, js[fileName])
61       }
62     }
63
64     var content = zip.generate()
65
66     location.href = 'data:application/zip;base64,' + content
67
68     complete()
69   }
70
71   function generateCustomCSS(vars) {
72     var result = ''
73
74     for (var key in vars) {
75       result += key + ': ' + vars[key] + ';\n'
76     }
77
78     return result + '\n\n'
79   }
80
81   function generateCSS() {
82     var $checked = $('#less-section input:checked')
83
84     if (!$checked.length) return false
85
86     var result = {}
87     var vars = {}
88     var css = ''
89
90     $('#less-variables-section input')
91         .each(function () {
92           $(this).val() && (vars[ $(this).prev().text() ] = $(this).val())
93         })
94
95     css += __less['variables.less']
96     if (vars) css += generateCustomCSS(vars)
97     css += __less['mixins.less']
98     css += $checked
99       .map(function () { return __less[this.value] })
100       .toArray()
101       .join('\n')
102
103     css = css.replace(/@import[^\n]*/gi, '') //strip any imports
104
105     try {
106       var parser = new less.Parser({
107           paths: ['variables.less', 'mixins.less']
108         , optimization: 0
109         , filename: 'bootstrap.css'
110       }).parse(css, function (err, tree) {
111         if (err) return alert(err)
112
113         result = {
114           'bootstrap.css'     : cw + tree.toCSS(),
115           'bootstrap.min.css' : cw + tree.toCSS({ compress: true })
116         }
117       })
118     } catch (err) {
119       return alert(err)
120     }
121
122     return result
123   }
124
125   function generateJavascript() {
126     var $checked = $('#plugin-section input:checked')
127     if (!$checked.length) return false
128
129     var js = $checked
130       .map(function () { return __js[this.value] })
131       .toArray()
132       .join('\n')
133
134     return {
135       'bootstrap.js': js,
136       'bootstrap.min.js': cw + uglify(js)
137     }
138   }
139
140   var $downloadBtn = $('#btn-download').on('click', function (e) {
141     e.preventDefault()
142     $downloadBtn.addClass('loading')
143     generateZip(generateCSS(), generateJavascript(), function () {
144       $downloadBtn.removeClass('loading')
145       setTimeout(function () {
146         generateUrl()
147       }, 1)
148     })
149   })
150
151   var inputsComponent = $('#less-section input')
152   var inputsPlugin    = $('#plugin-section input')
153   var inputsVariables = $('#less-variables-section input')
154
155   $('#less-section .toggle').on('click', function (e) {
156     e.preventDefault()
157     inputsComponent.prop('checked', !inputsComponent.is(':checked'))
158   })
159
160   $('#plugin-section .toggle').on('click', function (e) {
161     e.preventDefault()
162     inputsPlugin.prop('checked', !inputsPlugin.is(':checked'))
163   })
164
165   $('#less-variables-section .toggle').on('click', function (e) {
166     e.preventDefault()
167     inputsVariables.val('')
168   })
169
170   try {
171     parseUrl()
172   } catch (e) {
173     // maybe alert user that we can't parse their url
174   }
175 }