Project

General

Profile

Statistics
| Branch: | Revision:

root / docs / www / colonyscout / internal / jeditable / js / jquery.ajaxfileupload.js @ f59acf11

History | View | Annotate | Download (6.58 KB)

1

    
2
jQuery.extend({
3

    
4
    createUploadIframe: function(id, uri)
5
        {
6
                        //create frame
7
            var frameId = 'jUploadFrame' + id;
8
            
9
            if(window.ActiveXObject) {
10
                var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
11
                if(typeof uri== 'boolean'){
12
                    io.src = 'javascript:false';
13
                }
14
                else if(typeof uri== 'string'){
15
                    io.src = uri;
16
                }
17
            }
18
            else {
19
                var io = document.createElement('iframe');
20
                io.id = frameId;
21
                io.name = frameId;
22
            }
23
            io.style.position = 'absolute';
24
            io.style.top = '-1000px';
25
            io.style.left = '-1000px';
26

    
27
            document.body.appendChild(io);
28

    
29
            return io                        
30
    },
31
    createUploadForm: function(id, fileElementId)
32
        {
33
                //create form        
34
                var formId = 'jUploadForm' + id;
35
                var fileId = 'jUploadFile' + id;
36
                var form = $('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');        
37
                var oldElement = $('#' + fileElementId);
38
                var newElement = $(oldElement).clone();
39
                $(oldElement).attr('id', fileId);
40
                $(oldElement).before(newElement);
41
                $(oldElement).appendTo(form);
42
                //set attributes
43
                $(form).css('position', 'absolute');
44
                $(form).css('top', '-1200px');
45
                $(form).css('left', '-1200px');
46
                $(form).appendTo('body');                
47
                return form;
48
    },
49

    
50
    ajaxFileUpload: function(s) {
51
        // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout                
52
        s = jQuery.extend({}, jQuery.ajaxSettings, s);
53
        var id = new Date().getTime()        
54
                var form = jQuery.createUploadForm(id, s.fileElementId);
55
                var io = jQuery.createUploadIframe(id, s.secureuri);
56
                var frameId = 'jUploadFrame' + id;
57
                var formId = 'jUploadForm' + id;                
58
        // Watch for a new set of requests
59
        if ( s.global && ! jQuery.active++ )
60
                {
61
                        jQuery.event.trigger( "ajaxStart" );
62
                }            
63
        var requestDone = false;
64
        // Create the request object
65
        var xml = {}   
66
        if ( s.global )
67
            jQuery.event.trigger("ajaxSend", [xml, s]);
68
        // Wait for a response to come back
69
        var uploadCallback = function(isTimeout)
70
                {                        
71
                        var io = document.getElementById(frameId);
72
            try 
73
                        {                                
74
                                if(io.contentWindow)
75
                                {
76
                                         xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
77
                         xml.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;
78
                                         
79
                                }else if(io.contentDocument)
80
                                {
81
                                         xml.responseText = io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:null;
82
                        xml.responseXML = io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocument:io.contentDocument.document;
83
                                }                                                
84
            }catch(e)
85
                        {
86
                                jQuery.handleError(s, xml, null, e);
87
                        }
88
            if ( xml || isTimeout == "timeout") 
89
                        {                                
90
                requestDone = true;
91
                var status;
92
                try {
93
                    status = isTimeout != "timeout" ? "success" : "error";
94
                    // Make sure that the request was successful or notmodified
95
                    if ( status != "error" )
96
                                        {
97
                        // process the data (runs the xml through httpData regardless of callback)
98
                        var data = jQuery.uploadHttpData( xml, s.dataType );    
99
                        // If a local callback was specified, fire it and pass it the data
100
                        if ( s.success )
101
                            s.success( data, status );
102
    
103
                        // Fire the global callback
104
                        if( s.global )
105
                            jQuery.event.trigger( "ajaxSuccess", [xml, s] );
106
                    } else
107
                        jQuery.handleError(s, xml, status);
108
                } catch(e) 
109
                                {
110
                    status = "error";
111
                    jQuery.handleError(s, xml, status, e);
112
                }
113

    
114
                // The request was completed
115
                if( s.global )
116
                    jQuery.event.trigger( "ajaxComplete", [xml, s] );
117

    
118
                // Handle the global AJAX counter
119
                if ( s.global && ! --jQuery.active )
120
                    jQuery.event.trigger( "ajaxStop" );
121

    
122
                // Process result
123
                if ( s.complete )
124
                    s.complete(xml, status);
125

    
126
                jQuery(io).unbind()
127

    
128
                setTimeout(function()
129
                                                                        {        try 
130
                                                                                {
131
                                                                                        $(io).remove();
132
                                                                                        $(form).remove();        
133
                                                                                        
134
                                                                                } catch(e) 
135
                                                                                {
136
                                                                                        jQuery.handleError(s, xml, null, e);
137
                                                                                }                                                                        
138

    
139
                                                                        }, 100)
140

    
141
                xml = null
142

    
143
            }
144
        }
145
        // Timeout checker
146
        if ( s.timeout > 0 ) 
147
                {
148
            setTimeout(function(){
149
                // Check to see if the request is still happening
150
                if( !requestDone ) uploadCallback( "timeout" );
151
            }, s.timeout);
152
        }
153
        try 
154
                {
155
           // var io = $('#' + frameId);
156
                        var form = $('#' + formId);
157
                        $(form).attr('action', s.url);
158
                        $(form).attr('method', 'POST');
159
                        $(form).attr('target', frameId);
160
            if(form.encoding)
161
                        {
162
                form.encoding = 'multipart/form-data';                                
163
            }
164
            else
165
                        {                                
166
                form.enctype = 'multipart/form-data';
167
            }                        
168
            $(form).submit();
169

    
170
        } catch(e) 
171
                {                        
172
            jQuery.handleError(s, xml, null, e);
173
        }
174
        if(window.attachEvent){
175
            document.getElementById(frameId).attachEvent('onload', uploadCallback);
176
        }
177
        else{
178
            document.getElementById(frameId).addEventListener('load', uploadCallback, false);
179
        }                 
180
        return {abort: function () {}};        
181

    
182
    },
183

    
184
    uploadHttpData: function( r, type ) {
185
        var data = !type;
186
        data = type == "xml" || data ? r.responseXML : r.responseText;
187
        // If the type is "script", eval it in global context
188
        if ( type == "script" )
189
            jQuery.globalEval( data );
190
        // Get the JavaScript object, if JSON is used.
191
        if ( type == "json" )
192
            eval( "data = " + data );
193
        // evaluate scripts within html
194
        if ( type == "html" )
195
            jQuery("<div>").html(data);
196
            //jQuery("<div>").html(data).evalScripts();
197
                        //alert($('param', data).each(function(){alert($(this).attr('value'));}));
198
        return data;
199
    }
200
})
201