2010-12-06 19:03:09 +00:00
<!DOCTYPE html>
2011-07-29 12:14:19 +00:00
<!-- [if lt IE 7]><html lang="en - us" class="ie6"><![endif] -->
<!-- [if IE 7]><html lang="en - us" class="ie7"><![endif] -->
<!-- [if IE 8]><html lang="en - us" class="ie8"><![endif] -->
<!-- [if gt IE 8]><! --> < html lang = "en-us" > <!-- <![endif] -->
2009-05-15 23:46:54 +00:00
< head >
2011-07-29 12:14:19 +00:00
< meta charset = "utf-8" >
< title > Online JavaScript beautifier< / title >
2012-05-31 11:31:43 +00:00
< link rel = "icon" href = "favicon.png" type = "image/png" >
2012-05-29 10:13:46 +00:00
< script src = "third-party/codemirror2/lib/codemirror.js" > < / script >
< script src = "third-party/codemirror2/mode/javascript/javascript.js" > < / script >
< link rel = "stylesheet" href = "third-party/codemirror2/lib/codemirror.css" >
2011-07-29 12:14:19 +00:00
< style >
2011-05-02 13:16:34 +00:00
body {
background: #eee;
color: #333;
2010-12-11 07:36:34 +00:00
}
2009-12-02 01:40:38 +00:00
2012-05-29 10:13:46 +00:00
img {
2009-12-02 01:40:38 +00:00
border: 0;
2009-05-15 23:46:54 +00:00
}
2012-05-29 10:13:46 +00:00
p, select, label, .blurb {
font:13px/1.231 arial, sans-serif;
*font-size:small;
2009-05-15 23:46:54 +00:00
}
2012-05-29 10:13:46 +00:00
2009-05-15 23:46:54 +00:00
a {
color: #36d;
}
2011-05-02 13:16:34 +00:00
button#submit {
2012-05-29 10:13:46 +00:00
clear: both;
2011-05-02 13:16:34 +00:00
margin-top: 5px;
width: 100%;
2012-05-29 10:13:46 +00:00
padding: 10px 0;
2011-05-02 13:16:34 +00:00
cursor: pointer;
2010-02-06 00:30:49 +00:00
}
2012-05-29 10:13:46 +00:00
2011-05-02 13:16:34 +00:00
button#submit em {
font-size: 11px;
font-style: normal;
color: #999;
2009-05-15 23:46:54 +00:00
}
2011-05-02 13:16:34 +00:00
label {
cursor: pointer;
2009-05-15 23:46:54 +00:00
}
2011-05-02 13:16:34 +00:00
2012-05-29 10:13:46 +00:00
select {
2011-05-02 13:16:34 +00:00
width: 220px;
2010-12-06 19:03:09 +00:00
}
2011-05-02 13:16:34 +00:00
2012-05-29 10:13:46 +00:00
table#options {
float: right;
2009-05-15 23:46:54 +00:00
}
2012-05-29 10:13:46 +00:00
table#options td {
vertical-align: top;
padding-left: 10px;
2009-12-02 01:40:38 +00:00
}
2011-05-02 13:16:34 +00:00
2012-05-29 10:13:46 +00:00
#about p {
margin: 0 6px 6px 0;
2009-12-02 01:40:38 +00:00
}
2011-05-02 13:16:34 +00:00
2012-05-29 10:13:46 +00:00
#testresults {
display: none;
font-family: monaco, "lucida console", "courier new", monospace;
2009-12-02 01:40:38 +00:00
}
2012-03-04 18:14:47 +00:00
2012-05-29 10:13:46 +00:00
.CodeMirror {
border: 1px solid #ccc;
margin-bottom: 6px;
2012-05-29 10:18:14 +00:00
background: white;
2012-05-29 10:13:46 +00:00
}
.CodeMirror-scroll {
min-height: 400px;
max-height: 100%;
height: auto;
overflow-y: hidden;
overflow-x: auto;
width: 100%
2012-03-04 18:14:47 +00:00
}
2011-05-02 13:16:34 +00:00
< / style >
2011-07-29 12:14:19 +00:00
< script src = "jquery/jquery.js" > < / script >
< script src = "jquery/jquery.cookie.js" > < / script >
2011-05-02 13:16:34 +00:00
2012-05-16 05:15:52 +00:00
2011-07-29 12:14:19 +00:00
< script src = "beautify.js" > < / script >
2011-12-23 07:38:08 +00:00
< script src = "beautify-css.js" > < / script >
2011-07-29 12:14:19 +00:00
< script src = "beautify-html.js" > < / script >
< script src = "tests/sanitytest.js" > < / script >
< script src = "tests/beautify-tests.js" > < / script >
< script src = "unpackers/javascriptobfuscator_unpacker.js" > < / script >
< script src = "unpackers/urlencode_unpacker.js" > < / script >
< script src = "unpackers/p_a_c_k_e_r_unpacker.js" > < / script >
< script src = "unpackers/myobfuscate_unpacker.js" > < / script >
2010-12-06 19:03:09 +00:00
2011-07-29 12:14:19 +00:00
< script >
2011-05-02 13:16:34 +00:00
var the = {
2012-06-01 07:52:07 +00:00
use_codemirror: ( ! window.location.href.match(/without-codemirror/)),
2012-05-16 05:15:52 +00:00
beautify_in_progress: false,
editor: null // codemirror editor
2011-07-29 12:14:19 +00:00
};
2011-05-02 13:16:34 +00:00
2011-07-29 12:14:19 +00:00
function run_tests() {
2011-05-02 13:16:34 +00:00
var st = new SanityTest();
run_beautifier_tests(st);
JavascriptObfuscator.run_tests(st);
P_A_C_K_E_R.run_tests(st);
Urlencoded.run_tests(st);
MyObfuscate.run_tests(st);
2012-05-29 10:13:46 +00:00
// $('#testresults').html(results.replace(/r/g, '').replace(/\n/g, '< br > '));
var results = st.results_raw().replace(/ /g, ' ').replace(/\r/g, '·').replace(/\n/g, '< br > ');
$('#testresults').html(results).show();
2010-12-06 19:03:09 +00:00
}
2011-05-02 13:16:34 +00:00
2011-07-29 12:14:19 +00:00
function any(a, b) {
return a || b;
2010-12-06 19:03:09 +00:00
}
2011-05-02 13:16:34 +00:00
2011-07-29 12:14:19 +00:00
function read_settings_from_cookie() {
2011-05-02 13:16:34 +00:00
$('#tabsize').val(any($.cookie('tabsize'), '4'));
$('#brace-style').val(any($.cookie('brace-style'), 'collapse'));
$('#detect-packers').attr('checked', $.cookie('detect-packers') !== 'off');
$('#preserve-newlines').attr('checked', $.cookie('preserve-newlines') !== 'off');
$('#keep-array-indentation').attr('checked', $.cookie('keep-array-indentation') === 'on');
2012-01-02 17:19:37 +00:00
$('#indent-scripts').val(any($.cookie('indent-scripts'), 'normal'));
$('#space-before-conditional').attr('checked', $.cookie('space-before-conditional') !== 'off');
}
2010-12-06 19:03:09 +00:00
2011-07-29 12:14:19 +00:00
function store_settings_to_cookie() {
2011-05-02 13:16:34 +00:00
var opts = { expires: 360 };
$.cookie('tabsize', $('#tabsize').val(), opts);
$.cookie('brace-style', $('#brace-style').val(), opts);
$.cookie('detect-packers', $('#detect-packers').attr('checked') ? 'on' : 'off', opts);
$.cookie('preserve-newlines', $('#preserve-newlines').attr('checked') ? 'on' : 'off', opts);
$.cookie('keep-array-indentation', $('#keep-array-indentation').attr('checked') ? 'on' : 'off', opts);
2012-01-02 17:19:37 +00:00
$.cookie('space-before-conditional', $('#space-before-conditional').attr('checked') ? 'on' : 'off', opts);
$.cookie('indent-scripts', $('#indent-scripts').val(), opts);
}
2011-05-02 13:16:34 +00:00
2011-07-29 12:14:19 +00:00
function unpacker_filter(source) {
2011-05-11 23:28:42 +00:00
var trailing_comments = '';
var comment = '';
var found = false;
do {
found = false;
if (/^\s*\/\*/.test(source)) {
found = true;
2011-05-11 23:34:56 +00:00
comment = source.substr(0, source.indexOf('*/') + 2);
source = source.substr(comment.length).replace(/^\s+/, '');
trailing_comments += comment + "\n";
2011-05-11 23:28:42 +00:00
} else if (/^\s*\/\//.test(source)) {
found = true;
2011-05-11 23:34:56 +00:00
comment = source.match(/^\s*\/\/.*/)[0];
source = source.substr(comment.length).replace(/^\s+/, '');
trailing_comments += comment + "\n";
2011-05-02 13:16:34 +00:00
}
2011-05-11 23:28:42 +00:00
} while (found);
2011-05-02 13:16:34 +00:00
2011-05-11 23:28:42 +00:00
if (P_A_C_K_E_R.detect(source)) {
2012-01-26 12:05:28 +00:00
// P.A.C.K.E.R unpacking may fail, even though it is detected
var unpacked = P_A_C_K_E_R.unpack(source);
if (unpacked != source) {
source = unpacker_filter(unpacked);
}
2011-05-11 23:28:42 +00:00
}
2011-05-02 13:16:34 +00:00
if (Urlencoded.detect(source)) {
2011-05-11 23:28:42 +00:00
source = unpacker_filter(Urlencoded.unpack(source))
2011-05-02 13:16:34 +00:00
}
2011-05-11 23:28:42 +00:00
if (JavascriptObfuscator.detect(source)) {
source = unpacker_filter(JavascriptObfuscator.unpack(source))
2011-05-02 13:16:34 +00:00
}
2011-05-11 23:28:42 +00:00
if (MyObfuscate.detect(source)) {
source = unpacker_filter(MyObfuscate.unpack(source))
2011-05-02 13:16:34 +00:00
}
2011-05-11 23:28:42 +00:00
2011-05-11 23:34:56 +00:00
return trailing_comments + source;
2011-05-02 13:16:34 +00:00
}
2011-07-29 12:14:19 +00:00
function beautify() {
2011-05-02 13:16:34 +00:00
if (the.beautify_in_progress) return;
store_settings_to_cookie();
the.beautify_in_progress = true;
2012-05-16 05:15:52 +00:00
var source;
if (the.editor) {
source = the.editor.getValue();
} else {
source = $('#source').val();
}
2011-05-02 13:16:34 +00:00
var indent_size = $('#tabsize').val();
var indent_char = indent_size == 1 ? '\t' : ' ';
var preserve_newlines = $('#preserve-newlines').attr('checked');
var keep_array_indentation = $('#keep-array-indentation').attr('checked');
2011-12-23 07:37:03 +00:00
var indent_scripts = $('#indent-scripts').val();
2011-05-02 13:16:34 +00:00
var brace_style = $('#brace-style').val();
2012-01-02 17:19:37 +00:00
var space_before_conditional = $('#space-before-conditional').attr('checked');
2011-05-02 13:16:34 +00:00
2011-06-06 18:32:53 +00:00
var opts = {
2011-05-02 13:16:34 +00:00
indent_size: indent_size,
indent_char: indent_char,
preserve_newlines:preserve_newlines,
brace_style: brace_style,
keep_array_indentation:keep_array_indentation,
2011-12-23 07:37:03 +00:00
space_after_anon_function:true,
2012-01-02 17:19:37 +00:00
space_before_conditional: space_before_conditional,
2011-12-23 07:37:03 +00:00
indent_scripts:indent_scripts};
2011-06-06 18:32:53 +00:00
2012-05-16 05:15:52 +00:00
var output;
2012-02-22 23:24:05 +00:00
if (looks_like_html(source)) {
2012-05-16 05:15:52 +00:00
output = style_html(source, opts);
2011-06-06 18:32:53 +00:00
} else {
2012-01-26 12:05:28 +00:00
if ($('#detect-packers').attr('checked')) {
source = unpacker_filter(source);
}
2012-05-16 05:15:52 +00:00
output = js_beautify(source, opts);
}
if (the.editor) {
the.editor.setValue(output);
} else {
$('#source').val(output);
2011-05-02 13:16:34 +00:00
}
the.beautify_in_progress = false;
2010-12-08 09:21:24 +00:00
}
2012-02-22 23:24:05 +00:00
function looks_like_html(source)
{
2012-03-02 10:15:04 +00:00
// < foo > - looks like html
// <!-- \nalert('foo!');\n --> - doesn't look like html
2012-02-22 23:24:05 +00:00
var trimmed = source.replace(/^[ \t\n\r]+/, '');
2012-05-29 10:13:46 +00:00
var comment_mark = '< ' + '!-' + '-';
2012-03-02 10:15:04 +00:00
return (trimmed & & (trimmed.substring(0, 1) === '< ' & & trimmed.substring(0, 4) !== comment_mark));
2012-02-22 23:24:05 +00:00
}
2011-05-02 13:16:34 +00:00
$(function() {
read_settings_from_cookie();
2011-12-23 10:14:21 +00:00
var default_text = "// This is just a sample script. Paste your real code (javascript or HTML) here.\n\nif ('this_is'==/an_example/){of_beautifer();}else{var a=b?(c%d):e[f];}";
2011-12-23 07:37:03 +00:00
2012-05-29 10:13:46 +00:00
if (the.use_codemirror) {
the.editor = CodeMirror.fromTextArea($('#source').get(0))
the.editor.setValue(default_text);
$('.CodeMirror').click(function () {
if (the.editor.getValue() == default_text) {
the.editor.setValue('');
}
});
} else {
$('#source').val(default_text).bind('click focus', function () {
if ($(this).val() == default_text) {
$(this).val('');
}
}).bind('blur', function () {
if ( ! $(this).val()) {
$(this).val(default_text);
}
});
}
2011-05-02 13:16:34 +00:00
$(window).bind('keydown', function (e) {
if (e.ctrlKey & & e.keyCode == 13) {
beautify();
}
})
2012-05-29 10:13:46 +00:00
$('#submit').click(beautify);
$('select').change(beautify);
2012-05-16 05:15:52 +00:00
2011-05-02 13:16:34 +00:00
});
< / script >
2009-05-15 23:46:54 +00:00
< / head >
< body >
2012-05-29 10:13:46 +00:00
< table id = "options" >
< tr >
< td >
< select name = "tabsize" id = "tabsize" >
2009-12-02 01:40:38 +00:00
< option value = "1" > indent with a tab character< / option >
< option value = "2" > indent with 2 spaces< / option >
< option value = "3" > indent with 3 spaces< / option >
2011-05-02 13:16:34 +00:00
< option value = "4" > indent with 4 spaces< / option >
2009-12-02 01:40:38 +00:00
< option value = "8" > indent with 8 spaces< / option >
2012-05-29 10:13:46 +00:00
< / select > < br >
< select id = "brace-style" >
2011-03-23 04:07:38 +00:00
< option value = "collapse" > Braces with control statement< / option >
< option value = "expand" > Braces on own line< / option >
< option value = "end-expand" > End braces on own line< / option >
2012-01-02 17:19:37 +00:00
<!-- option value="expand - strict">Braces always on own line (not recommended)</option -->
2012-05-29 10:13:46 +00:00
< / select >
< p style = "margin:6px 0 0 0" > HTML < style> , < script> formatting:< / p > < select id = "indent-scripts" >
2011-12-23 07:37:03 +00:00
< option value = "keep" > Keep indent level of the tag< / option >
< option value = "normal" > Add one indent level< / option >
2011-12-23 10:18:24 +00:00
< option value = "separate" > Separate indentation< / option >
2012-05-29 10:13:46 +00:00
< / select >
< / td > < td >
2011-05-02 13:16:34 +00:00
2012-05-29 10:13:46 +00:00
< input class = "checkbox" type = "checkbox" id = "preserve-newlines" > < label for = "preserve-newlines" > Preserve empty lines?< / label > < br >
< input class = "checkbox" type = "checkbox" id = "detect-packers" > < label for = "detect-packers" > Detect packers and obfuscators?< / label > < br >
< input class = "checkbox" type = "checkbox" id = "keep-array-indentation" > < label for = "keep-array-indentation" > Keep array indentation?< / label > < br >
< input class = "checkbox" type = "checkbox" id = "space-before-conditional" > < label for = "space-before-conditional" > Space before conditional: "if(x)" / "if (x)"
2012-06-01 07:52:07 +00:00
< br > < a style = "margin-left: 25px" href = "?without-codemirror" > Turn off bells and whistles?< / a >
2011-10-07 15:18:38 +00:00
2012-05-29 10:13:46 +00:00
< / td > < / tr >
< / table >
< div id = "about" >
< p > < strong > Beautify, unpack or deobfuscate JavaScript and HTML, make JSON/JSONP readable, etc.< / strong > .< / p >
< p > All of the source code is completely free and open, available on the < a href = "https://github.com/einars/js-beautify" > github< / a > under MIT licence, < br > and we have a command-line version and a python library as well.
< / div >
2011-05-02 13:16:34 +00:00
2011-10-07 15:18:38 +00:00
2012-05-29 10:13:46 +00:00
< button id = "submit" > < strong > Beautify JavaScript or HTML< / strong > < em > (ctrl-enter)< / em > < / button >
< textarea id = "source" rows = "30" cols = "160" > < / textarea >
< div class = "blurb" >
< div style = "float:right; width: 210px;" >
< a style = "display:block; float: left; padding-top: 3px" href = "http://flattr.com/thing/94550/jsbeautifier-org" target = "_blank" > < img src = "http://api.flattr.com/button/flattr-badge-large.png" alt = "Flattr" / > < / a >
< form action = "https://www.paypal.com/cgi-bin/webscr" method = "post" >
2010-12-31 08:52:36 +00:00
< input type = "hidden" name = "cmd" value = "_s-xclick" >
< input type = "hidden" name = "hosted_button_id" value = "TL28UJK2ARCUJ" >
2011-03-28 03:10:13 +00:00
< input style = "border:0" type = "image" src = "http://spicausis.lv/misc/paypal-donate.gif" name = "submit" alt = "PayPal - The safer, easier way to pay online!" >
2010-12-31 08:52:36 +00:00
< img alt = "" src = "https://www.paypal.com/en_US/i/scr/pixel.gif" width = "1" height = "1" >
< / form >
2011-05-02 13:34:37 +00:00
< / div >
2010-12-31 08:52:36 +00:00
2011-05-02 13:16:34 +00:00
< p > Browser extensions and other uses:< / p >
< ul id = "uses" >
2011-07-26 14:45:32 +00:00
2011-07-26 14:46:52 +00:00
< li > A < a href = "javascript:(function(){s=document.getElementsByTagName('SCRIPT');tx='';sr=[];for(i=0;i<s.length;i++){with(s.item(i)){t=text;if(t){tx+=t;}else{sr.push(src)};}};with(window.open()){document.write('<textarea id="t">'+(sr.join("\n"))+"\n\n-----\n\n"+tx+'</textarea><script src="http://jsbeautifier.org/beautify.js"></script><script>with(document.getElementById("t")){value=js_beautify(value);with(style){width="99%";height="99%";borderStyle="none";}};</script>');document.close();}})();" > < strong > bookmarklet< / strong > < / a > (drag it to your bookmarks) by Ichiro Hiroshi to see all scripts used on the page,< / li >
2011-07-26 14:45:32 +00:00
2011-09-30 05:53:09 +00:00
< li style = "margin-top: 8px" > < strong > Chrome< / strong > : < a href = "https://github.com/rixth/jsbeautify-for-chrome" > jsbeautify-for-chrome< / a > by Tom Rix,< / li >
2011-07-29 12:14:19 +00:00
< li > < strong > Chrome< / strong > : < a href = "https://chrome.google.com/webstore/detail/piekbefgpgdecckjcpffhnacjflfoddg" > Pretty Beautiful JavaScript< / a > by Will McSweeney,< / li >
2011-11-02 18:34:17 +00:00
< li style = "margin-top: 8px" > < strong > Firefox< / strong > : < a href = "https://addons.mozilla.org/en-US/firefox/addon/javascript-deminifier/" > Javascript deminifier< / a > by Ben Murphy,< br > to be used together with the firebug (< a href = "https://github.com/benmmurphy/jsdeminifier_xpi/" > github< / a > ),< / li >
2011-09-30 05:53:09 +00:00
< li style = "margin-top: 8px" > < strong > Safari< / strong > : < a href = "http://spadin.github.com/js-beautify-safari-extension" > Safari extension< / a > by Sandro Padin,< / li >
< li style = "margin-top: 8px" > < strong > Opera< / strong > : < a href = "https://addons.opera.com/addons/extensions/details/readable-javascript/" > Readable JavaScript< / a > (< a href = "https://github.com/Dither/readable-javascript" > github< / a > ) by Dither,< / li >
2011-05-11 23:28:42 +00:00
< li > < strong > Opera< / strong > : < a href = "https://addons.opera.com/addons/extensions/details/source/" > Source< / a > extension by Deathamns,< / li >
2011-09-30 05:53:09 +00:00
< li style = "margin-top: 12px" > < a style = "font-weight: bold" href = "http://fiddler2.com/" > Fiddler< / a > proxy: < a href = "http://fiddler2.com/Fiddler2/extensions.asp" > JavaScript Formatter addon< / a > ,
< li > < strong > gEdit< / strong > < a href = "https://github.com/nagaozen/gedit-tunnings/" > tips by Fabio Nagao< / a > ,< / li >
2011-05-05 20:32:46 +00:00
< li > < strong > Akelpad< / strong > < a href = "http://akelpad.sourceforge.net/forum/viewtopic.php?p=11246#11246" > extension< / a > by Infocatcher,< / li >
2011-06-13 20:27:03 +00:00
< li > Beautifier in < a style = "font-weight: bold" href = "http://sethmason.com/2011/04/28/jsbeautify-in-emacs.html" > Emacs< / a > write-up by Seth Mason,< / li >
2011-07-26 14:45:32 +00:00
< li > < a style = "font-weight:bold" href = "http://c9.io" > Cloud9< / a > , a lovely IDE running in a browser, working in the node/cloud, uses jsbeautifier (< a href = "https://github.com/ajaxorg/cloud9" > github< / a > ),< / li >
2012-05-23 02:49:22 +00:00
< li > < a style = "font-weight:bold" href = "http://www.symetronapps.com/pages/apps/shrinker.html" > Shrinker< / a > , a non-free JavaScript packer for Mac. I haven't used it, so I have no idea if it's any good,< / li >
2012-04-02 00:29:38 +00:00
< li > < a style = "font-weight:bold" href = "http://www.restconsole.com/" > REST Console< / a > , a request debugging tool for Chrome, beautifies JSON responses (< a href = "https://github.com/codeinchaos/rest-console" > github< / a > ),< / li >
< li > < a style = "font-weight:bold" href = "http://mitmproxy.org/" > mitmproxy< / a > , a nifty SSL-capable HTTP proxy, provides pretty javascript responses (< a href = "https://github.com/cortesi/mitmproxy" > github< / a > ).< / li >
2012-04-13 09:47:01 +00:00
< li > < a style = "font-weight:bold" href = "http://www.wakanda.org/" > wakanda< / a > , a neat IDE for web and mobile applications has a < a href = "http://forum.wakanda.org/showthread.php?1483-3-new-extensions-JSLint-Beautifier-and-Snippet" > Beautifier extension< / a > (< a href = "https://github.com/Wakanda/wakanda-extensions/tree/master/Beautifier" > github< / a > ).< / li >
2012-05-23 02:46:38 +00:00
< li > < a style = "font-weight:bold" href = "https://github.com/michalliu/sourcebeautify.vim" > sourcebeautify.vim< / a > , a nice vim plugin by michalliu (needs a supported js runtime).< / li >
2011-05-02 13:16:34 +00:00
< li class = "writeme" > Doing anything interesting? Write me to einar@jsbeautifier.org and I'll include your link.< / li >
< / ul >
2010-12-06 19:03:09 +00:00
2012-06-01 07:52:07 +00:00
< p class = "me-me-me" > Written by Einar Lielmanis, < a href = "mailto:einar@jsbeautifier.org" > einar@jsbeautifier.org< / a > , Python version flourished by < a href = "http://github.com/satufk" > Stefano Sanfilippo< / a > . We use the wonderful < a href = "http://codemirror.net" > CodeMirror< / a > syntax highlighting editor, written by Marijn Haverbeke.< / p >
2012-05-29 10:13:46 +00:00
< p class = "contributors" > Made with a great help of < a href = "http://jason.diamond.name/weblog/" > Jason Diamond< / a > , Patrick Hof, Nochum Sossonko, Andreas Schneider, Dave Vasilevsky, < a href = "http://my.opera.com/Vital/blog/" > Vital Batmanov,< / a > Ron Baldwin, Gabriel Harrison, < a href = "http://shullian.com" > Chris J. Shull< / a > , < a href = "http://mathiasbynens.be/" > Mathias Bynens< / a > and others.
< / p >
2011-05-02 13:16:34 +00:00
2012-05-29 10:13:46 +00:00
< p style = "text-align:right" >
< a href = "#" style = "color: #ccc; border-bottom: 1px dashed #ccc; text-decoration: none;" onclick = "run_tests(); return false;" > Run the tests< / a >
< / p >
2009-05-15 23:46:54 +00:00
2011-05-02 13:16:34 +00:00
< / div >
2012-05-29 10:13:46 +00:00
< div id = "testresults" > < / div >
2011-07-29 12:14:19 +00:00
< script >
var _gaq = [['_setAccount', 'UA-7409939-1'], ['_trackPageview']];
(function(d, t) {
var g = d.createElement(t),
s = d.getElementsByTagName(t)[0];
g.src = '//www.google-analytics.com/ga.js';
s.parentNode.insertBefore(g, s);
}(document, 'script'));
< / script >
2009-05-15 23:46:54 +00:00
< / body >
2011-09-05 12:36:24 +00:00
< / html >