module('Dom')

u = SockJS.getUtils()

newIframe = (path = '/iframe.html') ->
    # Requires to put:
    #     document.domain = document.domain
    # in HEAD, for IE7
    hook = u.createHook()
    err = ->
        log('iframe error. bad.')
    hook.iobj = u.createIframe(path + '?a=' + Math.random() + '#' + hook.id, err)
    return hook

onunload_test_factory = (code) ->
    return ->
        expect(3)
        hook = newIframe()
        hook.open = ->
            ok(true, 'open hook called by an iframe')
            hook.callback(code)
        hook.load = ->
            ok(true, 'onload hook called by an iframe')
            f = -> hook.iobj.cleanup()
            setTimeout(f, 1)
        hook.unload = ->
            ok(true, 'onunload hook called by an iframe')
            hook.del()
            start()

if navigator.userAgent.indexOf('Konqueror') isnt -1 or navigator.userAgent.indexOf('Opera') isnt -1
    test "onunload [unsupported by client]", ->
        ok(true)
else
    asyncTest('onunload', onunload_test_factory("""
                    var u = SockJS.getUtils();
                    u.attachEvent('load', function(){
                        hook.load();
                    });
                    var w = 0;
                    var run = function(){
                        if(w === 0) {
                            w = 1;
                            hook.unload();
                        }
                    };
                    u.attachEvent('beforeunload', run);
                    u.attachEvent('unload', run);
                """))

if not SockJS.getIframeTransport().enabled()
    test "onmessage [unsupported by client]", ->
        ok(true)
else
    asyncTest 'onmessage', ->
        expect(3)
        hook = newIframe()
        hook.open = ->
            ok(true, 'open hook called by an iframe')
            hook.callback("""
                    var u = SockJS.getUtils();
                    u.attachMessage(function(e) {
                        var b = e.data;
                        parent.postMessage(window_id + ' ' + 'e', '*');
                    });
                    parent.postMessage(window_id + ' ' + 's', '*');
                """)
        u.attachMessage (e) ->
            [window_id, data] = e.data.split(' ')
            if window_id is hook.id
                switch data
                    when 's'
                        hook.iobj.loaded()
                        ok(true, 'start frame send')
                        origin = u.getOrigin(u.amendUrl('/'))
                        hook.iobj.post(hook.id + ' ' + 's' , origin)
                    when 'e'
                        ok(true, 'done hook called by an iframe')
                        hook.iobj.cleanup()
                        hook.del()
                        start()


ajax_simple_factory = (name) ->
    asyncTest name + ' simple', ->
        expect(2)
        x = new u[name]('GET', '/simple.txt', null)
        x.onfinish = (status, text) ->
            equal(text.length, 2051)
            equal(text.slice(-2), 'b\n')
            start()

ajax_streaming_factory = (name) ->
    asyncTest name + ' streaming', ->
        expect(4)
        x = new u[name]('GET', '/streaming.txt', null)
        x.onchunk = (status, text) ->
            equal(status, 200)
            ok(text.length <= 2049, 'Most likely you\'re behind a transparent Proxy that can\'t do streaming. QUnit tests won\'t work properly. Sorry!')
            delete x.onchunk
        x.onfinish = (status, text) ->
            equal(status, 200)
            equal(text.slice(-4), 'a\nb\n')
            start()


test_wrong_url = (name, url, statuses) ->
    if window.console and console.log
        console.log(' [*] Connecting to wrong url ' + url)
    expect(2)
    x = new u[name]('GET', url, null)
    x.onchunk = ->
        ok(false, "chunk shall not be received")
    x.onfinish = (status, text) ->
        ok(u.arrIndexOf(statuses, status) isnt -1)
        equal(text, '')
        start()

ajax_wrong_port_factory = (name) ->
    for port in [25, 8999, 65300]
        asyncTest name + ' wrong port ' + port, ->
            test_wrong_url(name, 'http://localhost:'+port+'/wrong_url_indeed.txt', [0])


ajax_simple_factory('XHRLocalObject')
if window.XDomainRequest
    ajax_simple_factory('XDRObject')

if not window.ActiveXObject
    # Ajax streaming is not working in ie.
    ajax_streaming_factory('XHRLocalObject')
if window.XDomainRequest
    ajax_streaming_factory('XDRObject')

ajax_wrong_port_factory('XHRLocalObject')
if window.XDomainRequest
    ajax_wrong_port_factory('XDRObject')

asyncTest 'XHRLocalObject wrong url', ->
    # Opera responds with 0, all other browsers with 404
    test_wrong_url('XHRLocalObject', '/wrong_url_indeed.txt', [0, 404])
if window.XDomainRequest
    asyncTest 'XDRObject wrong url', ->
        test_wrong_url('XDRObject', '/wrong_url_indeed.txt', [0])