242 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			242 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								var MUB = {
							 | 
						||
| 
								 | 
							
								    _uid : 0
							 | 
						||
| 
								 | 
							
								    ,_minRoot : '/min/?'
							 | 
						||
| 
								 | 
							
								    ,checkRewrite : function () {
							 | 
						||
| 
								 | 
							
								        var testUri = location.pathname.replace(/\/[^\/]*$/, '/rewriteTest.js').substr(1);
							 | 
						||
| 
								 | 
							
								        function fail() {
							 | 
						||
| 
								 | 
							
								            $('#minRewriteFailed')[0].className = 'topNote';
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								        $.ajax({
							 | 
						||
| 
								 | 
							
								            url : '../f=' + testUri + '&' + (new Date()).getTime()
							 | 
						||
| 
								 | 
							
								            ,success : function (data) {
							 | 
						||
| 
								 | 
							
								                if (data === '1') {
							 | 
						||
| 
								 | 
							
								                    MUB._minRoot = '/min/';
							 | 
						||
| 
								 | 
							
								                    $('span.minRoot').html('/min/');
							 | 
						||
| 
								 | 
							
								                } else
							 | 
						||
| 
								 | 
							
								                    fail();                
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            ,error : fail
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Get markup for new source LI element
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    ,newLi : function () {
							 | 
						||
| 
								 | 
							
								        return '<li id="li' + MUB._uid + '">http://' + location.host + '/<input type=text size=20>' 
							 | 
						||
| 
								 | 
							
								        + ' <button title="Remove">x</button> <button title="Include Earlier">↑</button>'
							 | 
						||
| 
								 | 
							
								        + ' <button title="Include Later">↓</button> <span></span></li>';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Add new empty source LI and attach handlers to buttons
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    ,addLi : function () {
							 | 
						||
| 
								 | 
							
								        $('#sources').append(MUB.newLi());
							 | 
						||
| 
								 | 
							
								        var li = $('#li' + MUB._uid)[0];
							 | 
						||
| 
								 | 
							
								        $('button[title=Remove]', li).click(function () {
							 | 
						||
| 
								 | 
							
								            $('#results').hide();
							 | 
						||
| 
								 | 
							
								            var hadValue = !!$('input', li)[0].value;
							 | 
						||
| 
								 | 
							
								            $(li).remove();
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        $('button[title$=Earlier]', li).click(function () {
							 | 
						||
| 
								 | 
							
								            $(li).prev('li').find('input').each(function () {
							 | 
						||
| 
								 | 
							
								                $('#results').hide();
							 | 
						||
| 
								 | 
							
								                // this = previous li input
							 | 
						||
| 
								 | 
							
								                var tmp = this.value;
							 | 
						||
| 
								 | 
							
								                this.value = $('input', li).val();
							 | 
						||
| 
								 | 
							
								                $('input', li).val(tmp);
							 | 
						||
| 
								 | 
							
								                MUB.updateAllTestLinks();
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        $('button[title$=Later]', li).click(function () {
							 | 
						||
| 
								 | 
							
								            $(li).next('li').find('input').each(function () {
							 | 
						||
| 
								 | 
							
								                $('#results').hide();
							 | 
						||
| 
								 | 
							
								                // this = next li input
							 | 
						||
| 
								 | 
							
								                var tmp = this.value;
							 | 
						||
| 
								 | 
							
								                this.value = $('input', li).val();
							 | 
						||
| 
								 | 
							
								                $('input', li).val(tmp);
							 | 
						||
| 
								 | 
							
								                MUB.updateAllTestLinks();
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        ++MUB._uid;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * In the context of a source LI element, this will analyze the URI in
							 | 
						||
| 
								 | 
							
								     * the INPUT and check the URL on the site.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    ,liUpdateTestLink : function () { // call in context of li element
							 | 
						||
| 
								 | 
							
								        if (! $('input', this)[0].value) 
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								        var li = this;
							 | 
						||
| 
								 | 
							
								        $('span', this).html('');
							 | 
						||
| 
								 | 
							
								        var url = 'http://' + location.host + '/' 
							 | 
						||
| 
								 | 
							
								                + $('input', this)[0].value.replace(/^\//, '');
							 | 
						||
| 
								 | 
							
								        $.ajax({
							 | 
						||
| 
								 | 
							
								            url : url
							 | 
						||
| 
								 | 
							
								            ,complete : function (xhr, stat) {
							 | 
						||
| 
								 | 
							
								                if ('success' == stat)
							 | 
						||
| 
								 | 
							
								                    $('span', li).html('✓');
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    $('span', li).html('<button><b>404! </b> recheck</button>')
							 | 
						||
| 
								 | 
							
								                        .find('button').click(function () {
							 | 
						||
| 
								 | 
							
								                            MUB.liUpdateTestLink.call(li);
							 | 
						||
| 
								 | 
							
								                        });
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            ,dataType : 'text'
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Check all source URLs
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    ,updateAllTestLinks : function () {
							 | 
						||
| 
								 | 
							
								        $('#sources li').each(MUB.liUpdateTestLink);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * In a given array of strings, find the character they all have at
							 | 
						||
| 
								 | 
							
								     * a particular index
							 | 
						||
| 
								 | 
							
								     * @param Array arr array of strings
							 | 
						||
| 
								 | 
							
								     * @param Number pos index to check
							 | 
						||
| 
								 | 
							
								     * @return mixed a common char or '' if any do not match
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    ,getCommonCharAtPos : function (arr, pos) {
							 | 
						||
| 
								 | 
							
								        var i
							 | 
						||
| 
								 | 
							
								           ,l = arr.length
							 | 
						||
| 
								 | 
							
								           ,c = arr[0].charAt(pos);
							 | 
						||
| 
								 | 
							
								        if (c === '' || l === 1)
							 | 
						||
| 
								 | 
							
								            return c;
							 | 
						||
| 
								 | 
							
								        for (i = 1; i < l; ++i)
							 | 
						||
| 
								 | 
							
								            if (arr[i].charAt(pos) !== c)
							 | 
						||
| 
								 | 
							
								                return '';
							 | 
						||
| 
								 | 
							
								        return c;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Get the shortest URI to minify the set of source files
							 | 
						||
| 
								 | 
							
								     * @param Array sources URIs
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    ,getBestUri : function (sources) {
							 | 
						||
| 
								 | 
							
								        var pos = 0
							 | 
						||
| 
								 | 
							
								           ,base = ''
							 | 
						||
| 
								 | 
							
								           ,c;
							 | 
						||
| 
								 | 
							
								        while (true) {
							 | 
						||
| 
								 | 
							
								            c = MUB.getCommonCharAtPos(sources, pos);
							 | 
						||
| 
								 | 
							
								            if (c === '')
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								                base += c;
							 | 
						||
| 
								 | 
							
								            ++pos;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        base = base.replace(/[^\/]+$/, '');
							 | 
						||
| 
								 | 
							
								        var uri = MUB._minRoot + 'f=' + sources.join(',');
							 | 
						||
| 
								 | 
							
								        if (base.charAt(base.length - 1) === '/') {
							 | 
						||
| 
								 | 
							
								            // we have a base dir!
							 | 
						||
| 
								 | 
							
								            var basedSources = sources
							 | 
						||
| 
								 | 
							
								               ,i
							 | 
						||
| 
								 | 
							
								               ,l = sources.length;
							 | 
						||
| 
								 | 
							
								            for (i = 0; i < l; ++i) {
							 | 
						||
| 
								 | 
							
								                basedSources[i] = sources[i].substr(base.length);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            base = base.substr(0, base.length - 1);
							 | 
						||
| 
								 | 
							
								            var bUri = MUB._minRoot + 'b=' + base + '&f=' + basedSources.join(',');
							 | 
						||
| 
								 | 
							
								            //window.console && console.log([uri, bUri]);
							 | 
						||
| 
								 | 
							
								            uri = uri.length < bUri.length
							 | 
						||
| 
								 | 
							
								                ? uri
							 | 
						||
| 
								 | 
							
								                : bUri;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return uri;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Create the Minify URI for the sources
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    ,update : function () {
							 | 
						||
| 
								 | 
							
								        MUB.updateAllTestLinks();
							 | 
						||
| 
								 | 
							
								        var sources = []
							 | 
						||
| 
								 | 
							
								           ,ext = false
							 | 
						||
| 
								 | 
							
								           ,fail = false;
							 | 
						||
| 
								 | 
							
								        $('#sources input').each(function () {
							 | 
						||
| 
								 | 
							
								            var m, val;
							 | 
						||
| 
								 | 
							
								            if (! fail && this.value && (m = this.value.match(/\.(css|js)$/))) {
							 | 
						||
| 
								 | 
							
								                var thisExt = m[1];
							 | 
						||
| 
								 | 
							
								                if (ext === false)
							 | 
						||
| 
								 | 
							
								                    ext = thisExt; 
							 | 
						||
| 
								 | 
							
								                else if (thisExt !== ext) {
							 | 
						||
| 
								 | 
							
								                    fail = true;
							 | 
						||
| 
								 | 
							
								                    return alert('extensions must match!');
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                this.value = this.value.replace(/^\//, '');
							 | 
						||
| 
								 | 
							
								                if (-1 != $.inArray(this.value, sources)) {
							 | 
						||
| 
								 | 
							
								                    fail = true;
							 | 
						||
| 
								 | 
							
								                    return alert('duplicate file!');
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                sources.push(this.value);
							 | 
						||
| 
								 | 
							
								            } 
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        if (fail || ! sources.length)
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								        $('#groupConfig').val("    'keyName' => array('//" + sources.join("', '//") + "'),");
							 | 
						||
| 
								 | 
							
								        var uri = MUB.getBestUri(sources)
							 | 
						||
| 
								 | 
							
								           ,uriH = uri.replace(/</, '<').replace(/>/, '>').replace(/&/, '&');
							 | 
						||
| 
								 | 
							
								        $('#uriA').html(uriH)[0].href = uri;
							 | 
						||
| 
								 | 
							
								        $('#uriHtml').val(
							 | 
						||
| 
								 | 
							
								            ext === 'js' 
							 | 
						||
| 
								 | 
							
								            ? '<script type="text/javascript" src="' + uriH + '"></script>'
							 | 
						||
| 
								 | 
							
								            : '<link type="text/css" rel="stylesheet" href="' + uriH + '" />'
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								        $('#results').show();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Handler for the "Add file +" button
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    ,addButtonClick : function () {
							 | 
						||
| 
								 | 
							
								        $('#results').hide();
							 | 
						||
| 
								 | 
							
								        MUB.addLi();
							 | 
						||
| 
								 | 
							
								        MUB.updateAllTestLinks();
							 | 
						||
| 
								 | 
							
								        $('#update').show().click(MUB.update);
							 | 
						||
| 
								 | 
							
								        $('#sources li:last input')[0].focus();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Runs on DOMready
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    ,init : function () {
							 | 
						||
| 
								 | 
							
								        $('#app').show();
							 | 
						||
| 
								 | 
							
								        $('#sources').html('');
							 | 
						||
| 
								 | 
							
								        $('#add button').click(MUB.addButtonClick);
							 | 
						||
| 
								 | 
							
								        // make easier to copy text out of
							 | 
						||
| 
								 | 
							
								        $('#uriHtml, #groupConfig').click(function () {
							 | 
						||
| 
								 | 
							
								            this.select();
							 | 
						||
| 
								 | 
							
								        }).focus(function () {
							 | 
						||
| 
								 | 
							
								            this.select();
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        $('a.ext').attr({target:'_blank'});
							 | 
						||
| 
								 | 
							
								        if (location.hash) {
							 | 
						||
| 
								 | 
							
								            // make links out of URIs from bookmarklet
							 | 
						||
| 
								 | 
							
								            $('#getBm').hide();
							 | 
						||
| 
								 | 
							
								            $('#bmUris').html('<p><strong>Found by bookmarklet:</strong> /<a href=#>'
							 | 
						||
| 
								 | 
							
								                + location.hash.substr(1).split(',').join('</a> | /<a href=#>')
							 | 
						||
| 
								 | 
							
								                + '</a></p>'
							 | 
						||
| 
								 | 
							
								            );
							 | 
						||
| 
								 | 
							
								            $('#bmUris a').click(function () {
							 | 
						||
| 
								 | 
							
								                MUB.addButtonClick();
							 | 
						||
| 
								 | 
							
								                $('#sources li:last input').val(this.innerHTML)
							 | 
						||
| 
								 | 
							
								                MUB.liUpdateTestLink.call($('#sources li:last')[0]);
							 | 
						||
| 
								 | 
							
								                $('#results').hide();
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								            }).attr({title:'Add file +'});
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            // copy bookmarklet code into href
							 | 
						||
| 
								 | 
							
								            var bmUri = location.pathname.replace(/\/[^\/]*$/, '/bm.js').substr(1);
							 | 
						||
| 
								 | 
							
								            $.ajax({
							 | 
						||
| 
								 | 
							
								                url : '../?f=' + bmUri
							 | 
						||
| 
								 | 
							
								                ,success : function (code) {
							 | 
						||
| 
								 | 
							
								                    $('#bm')[0].href = code
							 | 
						||
| 
								 | 
							
								                        .replace('%BUILDER_URL%', location.href)
							 | 
						||
| 
								 | 
							
								                        .replace(/\n/g, ' ');
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                ,dataType : 'text'
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								            $.browser.msie && $('#getBm p:last').append(' Sorry, not supported in MSIE!');
							 | 
						||
| 
								 | 
							
								            MUB.addButtonClick();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        MUB.checkRewrite();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								window.onload = MUB.init;
							 |