(function (plupload){ plupload.runtimes.BrowserPlus = plupload.addRuntime("browserplus", { getFeatures: function (){ return { dragdrop: true , jpgresize: true , pngresize: true , chunks: true , progress: true , multipart: true , multi_selection: true } ; } , init: function (uploader, callback){ var browserPlus = window.BrowserPlus, browserPlusFiles = { } , settings = uploader.settings, resize = settings.resize; function addSelectedFiles(native_files){ var files, i, selectedFiles = [] , file, id; for (i = 0; i < _AN_Read_length("length", native_files); i++ ){ file = native_files[i]; id = plupload.guid(); browserPlusFiles[id] = file; selectedFiles.push(new plupload.File(id, file.name, file.size)); } if (i) { uploader.trigger("FilesAdded", selectedFiles); } } function setup(){ var disabled = false ; uploader.bind("PostInit", function (){ var dropTargetElm, dropElmId = settings.drop_element, dropTargetId = uploader.id + '_droptarget', dropElm = document.getElementById(dropElmId), lastState; function addDropHandler(id, end_callback){ browserPlus.DragAndDrop.AddDropTarget({ id: id} , function (res){ browserPlus.DragAndDrop.AttachCallbacks({ id: id, hover: function (res){ if (!res && end_callback) { end_callback(); } } , drop: function (res){ if (end_callback) { end_callback(); } addSelectedFiles(res); } } , function (){ } ); } ); } function hide(){ document.getElementById(dropTargetId).style.top = '-1000px'; } if (dropElm) { if (document.attachEvent && (/MSIE/gi).test(navigator.userAgent)) { dropTargetElm = _AN_Call_createelement('createElement', document, 'div'); _AN_Call_setattribute('setAttribute', dropTargetElm, 'id', dropTargetId); plupload.extend(dropTargetElm.style, { position: 'absolute', top: '-1000px', background: 'red', filter: 'alpha(opacity=0)', opacity: 0} ); _AN_Call_appendchild('appendChild', document.body, dropTargetElm); plupload.addEvent(dropElm, 'dragenter', function (e){ var dropElm, dropElmPos; dropElm = document.getElementById(dropElmId); dropElmPos = plupload.getPos(dropElm); plupload.extend(document.getElementById(dropTargetId).style, { top: dropElmPos.y + 'px', left: dropElmPos.x + 'px', width: dropElm.offsetWidth + 'px', height: dropElm.offsetHeight + 'px'} ); } ); addDropHandler(dropTargetId, hide); } else { addDropHandler(dropElmId); } } plupload.addEvent(document.getElementById(settings.browse_button), 'click', function (e){ var mimes = [] , i, a, filters = settings.filters, ext, type; e.preventDefault(); if (disabled) { return ; } no_type_restriction: for (i = 0; i < _AN_Read_length('length', filters); i++ ){ ext = filters[i].extensions.split(','); for (a = 0; a < _AN_Read_length('length', ext); a++ ){ if (ext[a] === '*') { mimes = [] ; break no_type_restriction; } type = plupload.mimeTypes[ext[a]]; if (type && plupload.inArray(type, mimes) === -1) { mimes.push(plupload.mimes[ext[a]]); } } } browserPlus.FileBrowse.OpenBrowseDialog({ mimeTypes: mimes} , function (res){ if (res.success) { addSelectedFiles(res.value); } } ); } ); dropElm = dropTargetElm = null ; } ); uploader.bind("CancelUpload", function (){ browserPlus.Uploader.cancel(); } ); uploader.bind("DisableBrowse", function (up, state){ disabled = state; } ); uploader.bind("UploadFile", function (up, file){ var nativeFile = browserPlusFiles[file.id], reqParams = { } , chunkSize = up.settings.chunk_size, loadProgress, chunkStack = [] ; function uploadFile(chunk, chunks){ var chunkFile; if (file.status == plupload.FAILED) { return ; } reqParams.name = file.target_name || file.name; if (chunkSize) { reqParams.chunk = "" + chunk; reqParams.chunks = "" + chunks; } chunkFile = chunkStack.shift(); browserPlus.Uploader.upload({ url: _AN_Read_url("url", up.settings), files: { file: chunkFile} , cookies: document.cookies, postvars: plupload.extend(reqParams, up.settings.multipart_params), progressCallback: function (res){ var i, loaded = 0; loadProgress[chunk] = parseInt(res.filePercent * chunkFile.size / 100, 10); for (i = 0; i < _AN_Read_length("length", loadProgress); i++ ){ loaded += loadProgress[i]; } file.loaded = loaded; up.trigger('UploadProgress', file); } } , function (res){ var httpStatus, chunkArgs; if (res.success) { httpStatus = res.value.statusCode; if (chunkSize) { up.trigger('ChunkUploaded', file, { chunk: chunk, chunks: chunks, response: res.value.body, status: httpStatus} ); } if (_AN_Read_length('length', chunkStack) > 0) { uploadFile(++chunk, chunks); } else { file.status = plupload.DONE; up.trigger('FileUploaded', file, { response: res.value.body, status: httpStatus} ); if (httpStatus >= 400) { up.trigger('Error', { code: plupload.HTTP_ERROR, message: plupload.translate('HTTP Error.'), file: file, status: httpStatus} ); } } } else { up.trigger('Error', { code: plupload.GENERIC_ERROR, message: plupload.translate('Generic Error.'), file: file, details: res.error} ); } } ); } function chunkAndUploadFile(native_file){ file.size = native_file.size; if (chunkSize) { browserPlus.FileAccess.chunk({ file: native_file, chunkSize: chunkSize} , function (cr){ if (cr.success) { var chunks = cr.value, len = _AN_Read_length('length', chunks); loadProgress = Array(len); for (var i = 0; i < len; i++ ){ loadProgress[i] = 0; chunkStack.push(chunks[i]); } uploadFile(0, len); } } ); } else { loadProgress = Array(1); chunkStack.push(native_file); uploadFile(0, 1); } } if (resize && /\.(png|jpg|jpeg)$/i.test(file.name)) { BrowserPlus.ImageAlter.transform({ file: nativeFile, quality: resize.quality || 90, actions: [{ scale: { maxwidth: resize.width, maxheight: resize.height} } ] } , function (res){ if (res.success) { chunkAndUploadFile(res.value.file); } } ); } else { chunkAndUploadFile(nativeFile); } } ); callback({ success: true } ); } if (browserPlus) { _AN_Call_init('init', browserPlus, function (res){ var services = [{ service: "Uploader", version: "3"} , { service: "DragAndDrop", version: "1"} , { service: "FileBrowse", version: "1"} , { service: "FileAccess", version: "2"} ] ; if (resize) { services.push({ service: 'ImageAlter', version: "4"} ); } if (res.success) { browserPlus.require({ services: services} , function (sres){ if (sres.success) { setup(); } else { callback(); } } ); } else { callback(); } } ); } else { callback(); } } } ); } )(plupload);