# -*- coding: utf-8 -*-
from wsgiref.simple_server import make_server
from webob import Request

def application(environ, start_response):
    request = Request(environ)
    request.charset = "utf-8"
    
    format = request.GET.get("format", None)
    callback = request.GET.get("callback", None)

    if format == u"xml" and callback is not None:
        start_response("200 OK", [("Content-Type", "text/javascript;eax=1;charset=utf-8")])
        return ['if(typeof %s !== "undefined"){' % str(callback),
                "%s(" % str(callback),
                "<root>",
                    '<hello lang="en">World!</hello>',
                    '<hello lang="fr">Bonjour !</hello>',
                    '<hello lang="de">Hallo!</hello>',
                "</root>",
                ")}"]
    else:
        start_response("200 OK", [("Content-Type", "text/html; charset=utf-8")])

        return ["""<!DOCTYPE html>
<html lang=en>
<meta charset=utf-8>
<title>XML-P</title>
<h1>XML with padding</h1>
<p>
    XML with padding is like JSON with padding (aka JSONP) but using XML via E4X
    instead. It's not very applicable since only Gecko-based browsers and Flash 
    supports E4X. So take it as a proof of concept.
</p>
<p><a href="#" id="test">testing XML-P</a> (<a href="/?format=xml&callback=callback">JavaScript source</a>)</p>
<pre id="response"></pre>
<address>yoan.dosimple.ch (change the first dot with a @)</address>
<script charset=utf-8>
var langs = ["en", "de", "fr"],
    test = document.getElementById("test"),
    response = document.getElementById("response");

test.onclick = function() {
    // very basic and not safe (but as it's only intended to work on Gecko)
    var script = document.createElement("script");
    script.setAttribute("type", "text/javascript;e4x=1");
    script.setAttribute("src", "/?format=xml&callback=moo");
    document.body.appendChild(script);
    return false;
};

function moo(xml) {
    response.appendChild(document.createTextNode(xml.toXMLString()));
    lang = navigator.language.substring(2);
    lang = langs.indexOf(lang) == -1 ? "en" : lang;
    alert("Language "+ lang + ": " + xml..hello.(@lang == lang));
}
</script>
</html>
    """]

if __name__ == "__main__":
    server = make_server("", 8080, application)
    try:
        print "Serving from port 8080… (hit Ctrl+C to stop me)"
        server.serve_forever()
    except KeyboardInterrupt:
        print "Bye bye fellow!"

