Файл: js/al/upload.js
Строк: 1457
<?php
if (!window.jsonpManager) {
window.jsonpManager = window.__jsp = {
c: 1,
h: {},
reg: function(h) {
__jsp.h[__jsp.c] = isFunction(h) ? h : function(){};
return __jsp.c++;
}
}
}
if (!window.Upload) {
var Upload = {
init: function(obj, uploadUrl, vars, options) {
window.uploadInterface = (window.uploadInterface != undefined) ? uploadInterface + 1 : 0;
var iUpload = uploadInterface;
each(['obj', 'dropbox', 'options', 'vars', 'types', 'uploadUrls', 'callbacks', 'checks'], function(i, v) {
if (!Upload[v]) Upload[v] = {};
});
this.obj[iUpload] = ge(obj);
if (options.dropbox) {
this.dropbox[iUpload] = ge(options.dropbox);
}
this.vars[iUpload] = vars;
options.file_input = ge(options.file_input);
this.options[iUpload] = options;
if (options.clear) {
cur.destroy.push(Upload.deinit.pbind(iUpload));
}
this.uploadUrls[iUpload] = uploadUrl;
if (options.flash_lite && !browser.flash && !this.checkFileApi()) {
this.obj[iUpload] = ge(options.fieldEl) || this.obj[iUpload].parentNode.firstChild;
} else {
if (options.customShowProgress) {
options.customShowProgress();
} else {
if (this.obj[iUpload].tagName == 'INPUT' && !this.checkFileApi()) {
this.obj[iUpload] = ge(options.fieldEl) || this.obj[iUpload].parentNode.firstChild;
} else if (!options.flash_lite) {
this.obj[iUpload].innerHTML = '<div class="loading"><img src="/images/upload.gif" /></div>';
}
}
}
if (options.noCheck) {
this.embed(iUpload);
} else {
this.check(iUpload);
}
return iUpload;
},
deinit: function(iUpload) {
if (!Upload.obj[iUpload]) return;
var options = Upload.options[iUpload] || {}, dragEl = options.dragEvObj;
if (dragEl) {
removeEvent(dragEl, 'dragenter');
removeEvent(dragEl, 'dragover');
removeEvent(dragEl, 'dragleave');
}
each(['obj', 'dropbox', 'options', 'vars', 'types', 'uploadUrls', 'callbacks'], function(i, v) {if (Upload[v]) delete Upload[v][iUpload]});
if (Upload.callbacks) {
if (Upload.callbacks['oncheck'+iUpload]) delete Upload.callbacks['oncheck'+iUpload];
if (Upload.callbacks['ondone'+iUpload]) delete Upload.callbacks['ondone'+iUpload];
if (Upload.callbacks['onfail'+iUpload]) delete Upload.callbacks['onfail'+iUpload];
}
clearTimeout(Upload.checks['timer'+iUpload]);
},
check: function(iUpload) {
var obj = this.obj[iUpload], vars = this.vars[iUpload], options = this.options[iUpload];
var check_url = options.check_url ? options.check_url : this.uploadUrls[iUpload], check_vars = {};
if (options.signed) {
if (!check_url) return Upload.onCheckComplete(iUpload);
extend(check_vars, {_jsonp: jsonpManager.reg(function(r) { Upload.onCheckComplete(iUpload, r); })});
} else {
if (!options.check_hash && !options.server) {
return Upload.onCheckComplete(iUpload);
}
this.callbacks['oncheck'+iUpload] = Upload.onCheckComplete.pbind(iUpload);
var t = ['mid', 'aid', 'gid', 'hash', 'rhash'];
for (var i in t) {
check_vars[t[i]] = vars[t[i]];
}
if (options.check_hash) {
check_vars.hash = options.check_hash;
}
if (options.check_rhash) {
check_vars.rhash = options.check_rhash;
}
if (vars.https_resp) {
check_vars.https_resp = vars.https_resp;
}
extend(check_vars, {al: 1, act: 'check_upload', type: options.type, ondone: "Upload.callbacks.oncheck"+iUpload});
}
var html = '<form action="' + check_url + '" enctype="multipart/form-data" method="post" id="check_upload_form' + iUpload + '" target="check_iframe' + iUpload + '">';
for (var i in check_vars) {
html += '<input type="hidden" name="' + i + '" value="' + check_vars[i] + '" />';
}
html += '</form><iframe style="visibility: hidden; width: 1px; height: 1px;" id="check_iframe' + iUpload + '" name="check_iframe' + iUpload + '"></iframe>';
var check = ce('div', {id: 'check_upload_'+iUpload, innerHTML: html, className: options.checkClass || ''}, {display: 'none'});
if (ge('check_upload_'+iUpload)) re('check_upload_'+iUpload);
obj.appendChild(check);
var form = ge('check_upload_form' + iUpload);
form && form.submit();
clearTimeout(Upload.checks['timer'+iUpload]);
this.checks['timer'+iUpload] = setTimeout(Upload.serverFail.pbind(iUpload), 10000);
},
onCheckComplete: function(i, res) {
clearTimeout(Upload.checks['timer' + i]);
delete Upload.checks['timer' + i];
var obj = {}, options = Upload.options[i], data = res;
if (options.signed) {
obj = parseJSON(res || '{}');
} else {
res = res || '';
res = res.split('&');
for (var j in res) {
var t = res[j].split('=');
obj[t[0]] = t[1];
}
data = obj;
}
if (options.customHideProgress) {
options.customHideProgress();
}
if (!obj.error && !obj.fail) {
options.noCheck = 1;
if (options.onCheckComplete) {
options.onCheckComplete(i);
} else if (options.flash_lite && browser.flash) {
Upload.initFlash(i, Upload.obj[i]);
} else {
Upload.embed(i);
}
Upload.serverSuccess(i, data);
} else {
Upload.serverFail(i, data);
}
},
serverFail: function(i, err_obj) {
var obj = Upload.obj[i], options = Upload.options[i], vars = Upload.vars[i];
if (!obj) return;
if (!options.signed && !options.server) return;
if (!Upload.fails) Upload.fails = {};
Upload.fails[i] = Upload.fails[i] ? Upload.fails[i] + 1 : 1;
if (options.signed) {
var parts = Upload.uploadUrls[i].split('?'), tmp = q2ajx(parts[1]), q = extend({
act: 'check_result',
_resign: tmp._query || parts[1]
}, err_obj ? {_query: err_obj} : {_check: options.check_url.split('?')[1]});
ajax.post('upload_fails.php', q, {
onDone: function(url, check_url, base_url, static_url) {
if (Upload.fails[i] < options.max_attempts) {
Upload.uploadUrls[i] = url;
extend(Upload.options[i], {
check_url: check_url,
base_url: base_url,
static_url: static_url
});
Upload.check(i);
} else {
obj.innerHTML = '';
if (options.lang && options.lang.cannot_upload_title && options.lang.cannot_upload_text) {
showFastBox({title: options.lang.cannot_upload_title, width: 430}, options.lang.cannot_upload_text);
}
}
}
});
return;
}
var query = extend({
act: 'fail',
role: options.type,
mid: vars.mid,
oid: vars.oid,
gid: vars.gid,
aid: vars.aid,
server: options.server,
error: options.error,
hash: options.error_hash
}, err_obj);
if (options.custom_hash) {
extend(query, {custom_hash: options.custom_hash, photo_hash: vars.photo_hash, size: vars.size, fid: vars.fid, vid: vars.vid, tag: vars.tag});
}
if (window.ajax) {
ajax.post('upload_fails.php', query, {
onDone: function(url, new_vars, opts) {
if (Upload.fails[i] < options.max_attempts) {
Upload.uploadUrls[i] = url;
extend(Upload.options[i], opts);
extend(Upload.vars[i], new_vars);
Upload.check(i);
} else {
obj.innerHTML = '';
if (options.lang && options.lang.cannot_upload_title && options.lang.cannot_upload_text) {
showFastBox({title: options.lang.cannot_upload_title, width: 430}, options.lang.cannot_upload_text);
}
}
}
});
} else {
if (options.server != 100000) return;
Ajax.Send('/upload_fails.php', query, function(ajaxObj, response) {
try {
response = eval('(' + response + ')');
} catch (e) {
response = null;
}
var opts = response.options, new_vars = response.vars, url = response.upload_url;
if (Upload.fails[i] < options.max_attempts) {
Upload.uploadUrls[i] = url;
extend(Upload.options[i], opts);
extend(Upload.vars[i], new_vars);
Upload.check(i);
} else {
obj.innerHTML = '';
if (options.lang && options.lang.cannot_upload_title && options.lang.cannot_upload_text) {
showFastBox({title: options.lang.cannot_upload_title, width: 430}, options.lang.cannot_upload_text);
}
options.onCheckServerFailed && options.onCheckServerFailed();
}
});
}
},
serverSuccess: function(i, err_obj) {
var options = Upload.options[i], vars = Upload.vars[i];
Upload.checked = Upload.checked || {};
Upload.checked[i] = 1;
if (options.signed) {
ajax.post('upload_fails.php', {act: 'check_result', _query: err_obj});
return;
}
if (!options.server && !options.error_hash) return;
var query = extend({
act: 'success',
mid: vars.mid,
oid: vars.oid,
gid: vars.gid,
aid: vars.aid,
server: options.server,
error: options.error,
hash: options.error_hash
}, err_obj);
if (window.ajax) {
ajax.post('upload_fails.php', query);
} else {
Ajax.Send('/upload_fails.php', query);
}
},
embed: function(iUpload) {
var i = iUpload.num != undefined ? iUpload.num : iUpload, obj = this.obj[i], dropbox = this.dropbox[i], options = this.options[i];
if (options.noEmbed) {
re('check_upload_'+iUpload);
return;
}
if (!options.noCheck) return;
if (browser.flash > 9 && options.forceFlash) {
this.initFlash(i, obj);
} else if (this.checkFileApi() && !options.flash_lite) {
this.initFileApi(i, obj, dropbox);
} else if (browser.flash > 9 && !options.noFlash) {
this.initFlash(i, obj);
} else if (!options.noForm) {
this.initForm(i, obj);
}
},
checkFileApi: function() {
return (window.XMLHttpRequest || window.XDomainRequest) && (window.FormData || window.FileReader && (window.XMLHttpRequest && XMLHttpRequest.sendAsBinary || window.ArrayBuffer && window.Uint8Array && (window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder)));
},
initFlash: function(iUpload, obj) {
var postData = [], vars = Upload.vars[iUpload], options = Upload.options[iUpload];
var opts = {
url: options.flashPath || '/swf/uploader_lite.swf',
id: 'uploader_lite'+iUpload,
preventhide: true,
width: '100%',
height: browser.safari || browser.msie || browser.chrome && intval(browser.version) < 17 ? (options.flashHeight ? options.flashHeight + 'px' : (cur.flash_lite && !isVisible('photos_flash_add_button') ? '67px' : '25px')) : '100%'
};
var params = {
swliveconnect: 'true',
allowscriptaccess: 'always',
wmode: browser.msie ? 'opaque' : 'transparent'
}
Upload.types[iUpload] = 'flash';
for (var i in vars) {
postData.push(i+'='+vars[i]);
}
if (!options.signed && !vars['ajx']) {
postData.push('ajx=1');
}
var flashVars = clone(vars)
extend(flashVars, {
'upload_url': Upload.uploadUrls[iUpload],
'file_size_limit': options.file_size_limit,
'file_types_description': options.file_types_description,
'file_types': options.file_types,
'file_name': options.file_name,
'post_data': escape(postData.join('&')),
'onUploadStart': "Upload.onUploadStart.pbind("+iUpload+")",
'onUploadProgress': "Upload.onUploadProgress.pbind("+iUpload+")",
'onUploadSuccess': "Upload.onUploadComplete.pbind("+iUpload+")",
'onUploadComplete': "Upload.onUploadCompleteAll.pbind("+iUpload+")",
'onUploadError': "Upload.onUploadError.pbind("+iUpload+")",
'onDebug': "Upload.onDebug.pbind("+iUpload+")",
'onMouseDown': "Upload.buttonDown.pbind("+iUpload+")",
'onMouseUp': "Upload.buttonUp.pbind("+iUpload+")",
'onMouseOver': "Upload.buttonOver.pbind("+iUpload+")",
'onMouseOut': "Upload.buttonOut.pbind("+iUpload+")",
'onSelectClick': "Upload.onSelectClick.pbind("+iUpload+")"
});
if (!options.flash_lite) {
if (!options.lang['button_browse']) {
options.lang['button_browse'] = 'Выбрать файл';
}
obj.innerHTML = '<div id="uploader'+iUpload+'" class="button_blue" style="position: relative;"><div id="lite_upload' + iUpload + '" style="position: absolute; height: 100%; width: 100%; z-index: 10000; cursor: pointer;"></div><button class="upload_btn">' + options.lang['button_browse'] + '</button></div>';
} else {
obj.innerHTML = '<div class="lite_upload" id="lite_upload' + iUpload + '" style="z-index:10000; width: 100%; height: 100%; cursor: pointer;"></div>';
}
renderFlash(ge('lite_upload'+iUpload), opts, params, flashVars);
if (browser.msie) setStyle(ge('lite_upload'+iUpload), {opacity: 0, cursor: 'pointer'});
if (options.lang.switch_mode) {
var text = options.lang.switch_mode.replace('{link}', '<a onclick="Upload.switchMode('+iUpload+');">');
text = text.replace('{/link}', '</a>');
obj.appendChild(ce('div', {
innerHTML: text,
align: 'left'
}, {
marginTop: '15px'
}));
}
},
initForm: function(iUpload, obj) {
var _iu = iUpload, vars = this.vars[_iu], options = this.options[_iu];
this.types[_iu] = 'form';
// setTimeout is needed at least for Opera to allow to do ajax requests in this callbacks. Otherwise it hangs up on XHR.open() call.
var html = '<form action="' + this.uploadUrls[_iu] + '" enctype="multipart/form-data" method="post" id="file_uploader_form' + _iu + '" target="upload_iframe' + _iu + '" style="text-align: center; width: 100%;">';
if (options.signed) {
extend(vars, {_jsonp: jsonpManager.reg(function(r) { Upload.onUploadComplete(_iu, r); })});
} else {
var onDoneCallback = Upload.onUploadComplete.pbind(_iu);
var onFailCallback = Upload.onUploadError.pbind(_iu);
this.callbacks['ondone'+_iu] = function() { var callback = onDoneCallback.pbind.apply(onDoneCallback, arguments); setTimeout(function(){ callback(); }, 1); };
this.callbacks['onfail'+_iu] = function() { var callback = onFailCallback.pbind.apply(onFailCallback, arguments); setTimeout(function(){ callback(); }, 1); };
extend(vars, {al: 1, ondone: "Upload.callbacks.ondone"+_iu, onfail: "Upload.callbacks.onfail"+_iu});
}
for (var i in vars) {
html += '<input type="hidden" name="' + i + '" value="' + vars[i] + '" />';
}
var input = '<input type="file" class="file" size="28" onchange="Upload.onUploadStart(' + _iu + ');" name="' + options['file_name'] + '" style="cursor: pointer;"' + (options.accept ? ' accept="' + options.accept + '"' : '') + '/>
</form><iframe style="position: absolute; visibility: hidden; width: 1px; height: 1px;" id="upload_iframe' + _iu + '" name="upload_iframe' + _iu + '"></iframe>';
if (options.label) {
html += options.label.split('{file}').join(input);
} else {
html += input;
}
obj.innerHTML = html;
var nfile = options.file_input,
cfile = geByClass1('file', obj, 'input');
delete options.file_input;
if (nfile && cfile) {
cfile.parentNode.replaceChild(nfile, cfile);
nfile.onchange = function () {Upload.onUploadStart(_iu)};
if (data(nfile, 'changed')) {
data(nfile, 'changed', false);
nfile.onchange();
}
}
},
buttonOver: function(iUpload) {
var options = Upload.options[iUpload];
if (options.flash_lite) {
if (options.hoverEl) {
addClass(options.hoverEl, 'hover');
} else if (isVisible('photos_flash_add_button')) {
addClass(ge('photos_flash_add_button'), 'hover');
} else {
addClass(ge('photos_upload_area'), 'hover');
}
} else {
addClass(ge('lite_upload'+iUpload).nextSibling, 'hover');
}
},
buttonOut: function(iUpload) {
var options = Upload.options[iUpload];
if (options.flash_lite) {
if (options.hoverEl) {
removeClass(options.hoverEl, 'hover');
} else if (isVisible('photos_flash_add_button')) {
removeClass(ge('photos_flash_add_button'), 'hover');
removeClass(ge('photos_flash_add_button'), 'active');
} else {
removeClass(ge('photos_upload_area'), 'hover');
}
} else {
removeClass(ge('lite_upload'+iUpload).nextSibling, 'hover');
removeClass(ge('lite_upload'+iUpload).nextSibling, 'active');
}
},
buttonDown: function(iUpload) {
if (Upload.options[iUpload].flash_lite) {
if (isVisible('photos_flash_add_button')) {
addClass(ge('photos_flash_add_button'), 'active');
}
} else {
addClass(ge('lite_upload'+iUpload).nextSibling, 'active');
}
},
buttonUp: function(iUpload) {
if (Upload.options[iUpload].flash_lite) {
if (isVisible('photos_flash_add_button')) {
removeClass(ge('photos_flash_add_button'), 'active');
}
} else {
removeClass(ge('lite_upload'+iUpload).nextSibling, 'active');
}
},
initFileApi: function(iUpload, obj, dropbox) {
var options = this.options[iUpload], input,
dragEl = options && options.dragEl || window.boxLayerWrap;
if (dropbox && dragEl) {
if (!Upload.addedDocEvent) {
addEvent(document, 'drop', Upload.drop);
Upload.addedDocEvent = true;
}
options.dragEvObj = dragEl;
addEvent(dragEl, 'dragenter', Upload.dragEnter.pbind(iUpload));
addEvent(dragEl, 'dragover', Upload.dragOver.pbind(iUpload));
addEvent(dragEl, 'dragleave', Upload.dragOut.pbind(iUpload));
}
this.types[iUpload] = 'fileApi';
if (options.chooseBox) {
input = '<input class="file" type="file" size="28" onchange="Upload.onFileApiSend('+iUpload+', this.files);"' + (options.multiple ? ' multiple="true"' : '') + (options.accept ? ' accept="' + options.accept + '"' : '') + ' name="' + options['file_name'] + '" style="cursor: pointer;"/>';
} else {
if (!options.lang['button_browse']) {
options.lang['button_browse'] = 'Выбрать файл';
}
input = '<div class="button_blue"><button class="upload_btn" onclick="this.parentNode.nextSibling.click()">' + options.lang['button_browse'] + '</button></div><input class="file" type="file" size="28" onchange="Upload.onFileApiSend('+iUpload+', this.files);"' + (options.multiple ? ' multiple="true"' : '') + (options.accept ? ' accept="' + options.accept + '"' : '') + ' name="' + options['file_name'] + '" style="visibility: hidden; position: absolute;"/>';
}
if (options.label) {
obj.innerHTML = options.label.split('{file}').join(input);
} else {
obj.innerHTML = input;
}
var nfile = options.file_input,
cfile = geByClass1('file', obj, 'input');
if (nfile && cfile) {
cfile.parentNode.replaceChild(nfile, cfile);
nfile.onchange = function () {Upload.onFileApiSend(iUpload, this.files);};
if (data(nfile, 'changed')) {
data(nfile, 'changed', false);
setTimeout(nfile.onchange.bind(nfile), 0);
}
}
},
switchMode: function(i) {
Upload.options[i].noFlash = Upload.options[i].noCheck = 1;
Upload.embed(i);
},
onUploadStart: function(info, result) {
cur.fileApiUploadStarted = true;
var i = info.ind !== undefined ? info.ind : info;
if (Upload.types[i] == 'form') {
var form = ge('file_uploader_form' + i);
form.submit();
var file = geByClass1('file', Upload.obj[i]);
file.disabled = true;
}
var options = Upload.options[i];
if (options.onUploadStart) {
options.onUploadStart(info, result);
};
},
getErrorAdditional: function(obj) {
if (obj.error && obj.server !== undefined && obj.bwact !== undefined) {
return ((obj.error.indexOf(':') !== -1) ? ',' : ':') + ' from upl_' + intval(obj.server) + '?act=' + obj.bwact.replace(/[^a-zA-Z_0-9]/g, '');
}
return '';
},
onUploadComplete: function(info, result, extra_info) {
var i = info.ind !== undefined ? info.ind : info, options = Upload.options[i], obj;
if (extra_info !== undefined && i === info) {
info = extra_info;
}
info.ind = i;
if (Upload.types[i] == 'form') {
var file = geByClass1('file', Upload.obj[i]);
file.disabled = false;
}
if (options.onUploadComplete) {
var errorAdd = '';
if (options.signed) {
var obj = parseJSON(result);
if (!obj) {
result = '{"error":"ERR_CLIENT_UPLOAD_FAIL: upload request bad result, url \"' + Upload.uploadUrls[i] + '\""}';
} else {
errorAdd = Upload.getErrorAdditional(obj);
}
}
options.onUploadComplete(info, result, errorAdd);
}
if (Upload.types[i] == 'form') {
Upload.onUploadCompleteAll(info, result);
}
},
onUploadCompleteAll: function(info, result, extra_info) {
var i = info.ind !== undefined ? info.ind : info, options = Upload.options[i];
if (extra_info !== undefined && i === info) {
info = extra_info;
}
if (Upload.types[i] == 'fileApi') {
var cfile = geByClass1('file', Upload.obj[i], 'input');
if (cfile) {
cfile.value = '';
}
}
if (options.onUploadCompleteAll) {
options.onUploadCompleteAll(info, result);
}
},
onUploadError: function(info, result) {
var i = info.ind !== undefined ? info.ind : info, options = Upload.options[i];
if (Upload.types[i] == 'form') {
var file = geByClass1('file', Upload.obj[i]);
file.disabled = false;
}
if (options.signed) {
if (options.onUploadComplete) {
options.onUploadComplete('{"error":"ERR_CLIENT_UPLOAD_FAIL: upload request fail, code \"' + result.replace(/([\"])/g, '\$1').replace(/n/g, '\n') + '\", url \"' + Upload.uploadUrls[i] + '\""}');
}
} else if (options.onUploadError) {
options.onUploadError(info, result);
};
},
onUploadProgress: function(info, bytesLoaded, bytesTotal) {
var i = info.ind !== undefined ? info.ind : info, options = Upload.options[i];
if (options.onUploadProgress) {
options.onUploadProgress(info, bytesLoaded, bytesTotal);
};
},
onDebug: function(info, result) {
var i = info.ind !== undefined ? info.ind : info, options = Upload.options[i];
if (options.onDebug) {
options.onDebug(info, result);
}
},
onSelectClick: function(info, result) {
var i = info.ind !== undefined ? info.ind : info, options = Upload.options[i];
if (options.onSelectClick) {
options.onSelectClick(info, result);
}
},
onFileApiSend: function(i, files, force) {
if (!files || !files.length) return;
var options = this.options[i];
if (options.reverse_files) {
files = Array.prototype.slice.call(files).reverse();
}
if (!options.multiple && files.length > 1) {
files = [files[0]]
}
if (options.photoBox && !force) {
return Upload.onPhotoAdd(i, files);
}
if (options.beforeUpload) options.beforeUpload(i);
cur.notStarted = cur.fileApiUploadStarted = true;
if (!options.multi_progress) this.onUploadStart(i);
var max_files = files.length;
if (options.max_files) {
var curCount = cur.attachCount ? cur.attachCount() : 0;
if (options.max_files - curCount < files.length && options.lang && options.lang.max_files_warning) {
max_files = options.max_files - curCount;
showFastBox({
title: getLang('global_error'),
width: 430,
onHide: function() {
Upload.embed(i);
delete cur.notStarted;
}
}, options.lang.max_files_warning, getLang('global_continue'), function() {
Upload.uploadFiles(i, files, max_files);
if (options.max_files_hide_last) {
curBox().hide();
} else {
boxQueue.hideAll();
}
}, getLang('global_cancel'));
} else {
if (options.force_max_files) {
max_files = Math.min(max_files, options.max_files - (cur.savedPhotos || []).length);
}
this.uploadFiles(i, files, max_files);
}
} else {
this.uploadFiles(i, files, max_files);
}
},
onPhotoAdd: function(i, files) {
var needFire = 0, count = 0;
Upload.fileList = Upload.fileList || {};
if (!Upload.fileList[i]) {
Upload.fileList[i] = [];
if (Upload.options[i].onPhotoBox) {
needFire = true;
}
}
each(files, function(n, file) {
count++;
var preview = Upload.options[i].photoBox;
var imageType = new RegExp('image.*')
if (!file.type.match(imageType)) {
//return false;
}
cur.uploaderPhotoId = (cur.uploaderPhotoId || 0) + 1;
var photoId = cur.uploaderPhotoId;
Upload.fileList[i][photoId] = file;
var img = ce('img');
var photo = ce('div', {
id: 'photos_add_item'+photoId,
className: 'photos_add_item',
innerHTML: '<span class="photos_add_img photos_add_wait" id="photos_add_cont'+photoId+'" onmouseover="PhotosAdd.thumbOver('+photoId+', this);" onmouseout="PhotosAdd.thumbOut('+photoId+');"><span class="photos_add_s" id="photos_add_s'+photoId+'"> </span></span><span class="bg"> </span>'
});
preview.appendChild(photo);
var reader = new FileReader();
reader.onload = function(e) {
img.src = e.target.result;
img.onload = function() {
img.onload = false;
var size = {w: img.width, h: img.height}, dx, dy;
if (size.w > 130) {
dx = 130 / size.w;
size.w = 130;
size.h = parseInt(size.h * dx);
}
if (size.h > 130) {
dy = 130 / size.h;
size.h = 130;
size.w = parseInt(size.w * dy);
}
var cnv = ce('canvas', {
width: size.w,
height: size.h
});
var ctx = cnv.getContext('2d');
ctx.drawImage(img, 0, 0, size.w, size.h);
delete img;
var dataURL = cnv.toDataURL("image/jpeg");
img.src = dataURL;
var thumbCont = ge('photos_add_s'+photoId);
var tw = Math.max(size.w, 80);
var th = Math.min(size.h, 98);
setStyle(thumbCont, {
width: tw,
height: th,
//marginTop: Math.ceil((98 - th) / 2),
marginLeft: Math.ceil((130 - tw) / 2)
});
thumbCont.innerHTML = '';
thumbCont.appendChild(img);
img.onload = function() {
setTimeout(function() {
thumbCont.parentNode.className = 'photos_add_img';
}, 0);
img.onload = false;
}
Upload.finishTask();
}
}
Upload.taskToQ(function() {
reader.readAsDataURL(file);
});
});
if (needFire && count) {
Upload.options[i].onPhotoBox();
}
if (Upload.options[i].onPhotoAdd && count) {
Upload.options[i].onPhotoAdd();
}
},
uploadPhotos: function(uplId) {
var files = [], flist = Upload.fileList[uplId];
for (var i in flist) {
if (flist[i]) {
files.push(extend(flist[i], {
fileRef: i
}));
}
}
if (Upload.options[uplId].onUploadStart) Upload.options[uplId].onUploadStart();
if (files.length) {
cur.uploadCount = Math.min(500, files.length);
Upload.uploadFiles(uplId, files, cur.uploadCount);
return true;
} else {
return false;
}
},
taskToQ: function(task) {
if (!Upload.previewFileQ) {
Upload.previewFileQ = [];
}
if (task) {
Upload.previewFileQ.push(task);
}
if (Upload.doingQ) {
return;
}
var newTask = Upload.previewFileQ.shift();
if (newTask) {
Upload.doingQ = true;
newTask();
}
},
finishTask: function() {
setTimeout(function() {
Upload.doingQ = false;
Upload.taskToQ();
}, 100);
},
uploadFiles: function(i, files, max_files) {
if (max_files <= 0) return;
var options = this.options[i],
vars = options.signed ? this.vars[i] : extend(this.vars[i], {ajx: 1}),
params = [],
totalSize = 0,
totalCount = 0,
loadedSize = 0,
loadedCount = 0,
filesQueue = [],
re;
if (options.uploading) {
totalSize = options.filesTotalSize || 0;
totalCount = options.filesTotalCount || 0;
loadedCount = options.filesLoadedCount || 0;
loadedSize = options.filesLoadedSize || 0;
filesQueue = options.filesQueue;
}
if (options.file_match) re = new RegExp(options.file_match, "i");
for (var j in vars) {
params.push(j + "=" + vars[j]);
}
var uploadUrl = this.uploadUrls[i] + (this.uploadUrls[i].match(/?/) ? '&' : '?') + params.join('&'),
fileName;
var errors = false;
for (var j = 0; j < max_files; j++) {
fileName = files[j].fileName || files[j].name || '';
if (options.file_match) {
if (!fileName.match(re)) {
errors = true;
continue;
}
}
if (options.multi_progress && !options.multi_sequence) {
this.onUploadStart({ind: i, fileName: fileName});
}
totalSize += files[j].size;
totalCount += 1;
filesQueue.push(files[j]);
}
filesQueue.reverse();
extend(options, {
filesQueue: filesQueue,
filesTotalSize: totalSize,
filesLoadedSize: loadedSize,
filesLoadedCount: loadedCount,
filesTotalCount: totalCount
});
// if (options.multi_sequence && options.onUploadProgress) {
// options.onUploadProgress(Upload.getFileInfo(i, options, false));
// }
if (filesQueue.length > 0) {
if (cur.multiProgressIndex !== undefined) {
if (!cur.nextQueues) cur.nextQueues = [];
cur.nextQueues.push(i);
} else {
this.uploadFile(i, filesQueue.pop(), uploadUrl);
if (options.multi_progress) cur.multiProgressIndex = i;
}
} else if (errors) {
Upload.onUploadError(i, 'file type not supported');
}
},
getFileInfo: function(i, options, file) {
return options.multi_progress ? {
ind: i,
fileName: (file) ? file.fileName || file.name || '' : '',
num: options.filesLoadedCount,
totalSize: options.filesTotalSize,
loadedSize: options.filesLoadedSize,
totalCount: options.filesTotalCount,
file: file
} : i;
},
uploadFile: function(uplId, file, url) {
var options = this.options[uplId];
var XHR = (browser.msie && intval(browser.version) < 10) ? window.XDomainRequest : window.XMLHttpRequest;
var info = Upload.getFileInfo(uplId, options, file);
if (options.multi_sequence) {
this.onUploadStart(info);
}
options.uploading = true;
if (window.FormData) {
var formData = new FormData();
formData.append(options.file_name, file);
var xhr = new XHR(), fastFail = true;
xhr.open('POST', url, true);
xhr.onload = function(e) {
extend(info, Upload.getFileInfo(uplId, options, file)); // can be extended
Upload.options[uplId].filesLoadedSize += file.size;
Upload.options[uplId].filesLoadedCount += 1;
Upload.onUploadComplete(info, e.target.responseText);
if (Upload.options[uplId].filesQueue && Upload.options[uplId].filesQueue.length > 0) {
Upload.uploadFile(uplId, Upload.options[uplId].filesQueue.pop(), url);
} else {
Upload.startNextQueue(uplId);
Upload.onUploadCompleteAll(info, e.target.responseText);
options.uploading = false;
}
};
xhr.onerror = function(e) {
if (!e.target.responseText && fastFail) {
return nav.go('/login?act=upload_fail', false, {nocur: true, params: {context: 0, name: file.fileName || file.name || ''}});
}
extend(info, Upload.getFileInfo(uplId, options, file));
Upload.options[uplId].filesTotalSize -= file.size;
Upload.options[uplId].filesTotalCount -= 1;
Upload.onUploadError(info, e.target.responseText);
if (Upload.options[uplId].filesQueue.length > 0) {
Upload.uploadFile(uplId, Upload.options[uplId].filesQueue.pop(), url);
} else {
Upload.startNextQueue(uplId);
Upload.onUploadCompleteAll(info, e.target.responseText);
options.uploading = false;
}
};
xhr.upload.onprogress = function(e) {
fastFail = false;
extend(info, Upload.getFileInfo(uplId, options, file));
if (e.lengthComputable) {
if (!options.multi_progress) {
Upload.onUploadProgress(uplId, Math.min(e.loaded + options.filesLoadedSize, options.filesTotalSize), options.filesTotalSize);
} else {
Upload.onUploadProgress(info, e.loaded, e.total);
}
}
};
xhr.send(formData);
} else try {
if (XHR && !XHR.prototype.sendAsBinary && window.ArrayBuffer && window.Uint8Array) {
var BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder;
if (BlobBuilder) {
XHR.prototype.sendAsBinary = function(text){
var data = new ArrayBuffer(text.length);
var ui8a = new Uint8Array(data, 0);
for (var i = 0; i < text.length; i++) ui8a[i] = (text.charCodeAt(i) & 0xff);
var bb = new BlobBuilder();
bb.append(data);
var blob = bb.getBlob();
this.send(blob);
}
}
}
var reader = new FileReader();
reader.onload = function() {
var xhr = new XHR(), fastFail = true;
xhr.onload = function(e) {
extend(info, Upload.getFileInfo(uplId, options, file));
Upload.options[uplId].filesLoadedSize += file.size;
Upload.options[uplId].filesLoadedCount += 1;
Upload.onUploadComplete(info, e.target.responseText);
if (Upload.options[uplId].filesQueue.length > 0) {
Upload.uploadFile(uplId, Upload.options[uplId].filesQueue.pop(), url);
} else {
Upload.startNextQueue(uplId);
Upload.onUploadCompleteAll(info, e.target.responseText);
}
};
xhr.onerror = function(e) {
if (!e.target.responseText && fastFail) {
return nav.go('/login?act=upload_fail', false, {nocur: true, params: {context: 1, name: file.fileName || file.name || ''}});
}
extend(info, Upload.getFileInfo(uplId, options, file));
Upload.options[uplId].filesTotalSize -= file.size;
Upload.options[uplId].filesTotalCount -= 1;
Upload.onUploadError(info, e.target.responseText);
if (Upload.options[uplId].filesQueue.length > 0) {
Upload.uploadFile(uplId, Upload.options[uplId].filesQueue.pop(), url);
} else {
Upload.startNextQueue(uplId);
Upload.onUploadCompleteAll(info, e.target.responseText);
options.uploading = false;
}
};
xhr.upload.onprogress = function(e) {
fastFail = false;
extend(info, Upload.getFileInfo(uplId, options, file));
if (e.lengthComputable) {
if (!options.multi_progress) {
Upload.onUploadProgress(uplId, Math.min(e.loaded + options.filesLoadedSize, options.filesTotalSize), options.filesTotalSize);
} else {
Upload.onUploadProgress(info, e.loaded, e.total);
options.uploading = false;
}
}
};
xhr.open('POST', url, true);
var boundary = '---------' + irand(1111111111, 9999999999);
xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary=" + boundary);
var body = '--' + boundary + "rn";
body += "Content-Disposition: form-data; name='" + options.file_name + "'; filename='" + file.name + "'rn";
body += "Content-Type: application/octet-streamrnrn";
body += reader.result + "rn";
body += '--' + boundary + '--';
xhr.sendAsBinary(body);
};
reader.readAsBinaryString(file);
} catch (e) {
try { console.error(e); } catch (e2) {}
}
Upload.options[uplId].xhr = xhr;
},
terminateUpload: function(i, name) {
try {
var vars = Upload.vars[i],
options = Upload.options[i],
params = [],
queue = options.filesQueue;
inQueue = false,
info = options.multi_progress ? {ind: i, fileName: name} : i,
ind = name ? i + '_' + name : i;
for (var j in vars) {
params.push(j + "=" + vars[j]);
}
for (var j in queue) {
if (name == (queue[j].fileName || queue[j].name || '')) {
queue.splice(j, 1);
inQueue = true;
break;
}
}
re('upload' + ind + '_progress_wrap');
Upload.onUploadComplete(info, '');
if (!inQueue && options.xhr) options.xhr.abort();
var url = this.uploadUrls[i] + (this.uploadUrls[i].match(/?/) ? '&' : '?') + params.join('&');
if (!inQueue) {
if (queue.length > 0) {
Upload.uploadFile(i, queue.pop(), url);
} else {
Upload.startNextQueue(i);
Upload.onUploadCompleteAll(info, '');
}
}
} catch (e) {
try { console.error(e); } catch (e2) {}
}
},
startNextQueue: function(i) {
if (cur.multiProgressIndex === undefined) {
setTimeout(function() {delete cur.fileApiUploadStarted;}, 1000);
}
if (i != cur.multiProgressIndex) return;
var options = this.options[i];
if (options.multi_progress && cur.nextQueues && cur.nextQueues.length) {
var next = cur.nextQueues[0],
queue = Upload.options[next].filesQueue;
cur.nextQueues.splice(0, 1);
while (queue.length == 0 && cur.nextQueues.length > 0) {
next = cur.nextQueues[0];
cur.nextQueues.splice(0, 1);
queue = Upload.options[next].filesQueue;
}
if (queue.length > 0) {
var vars = Upload.vars[next], params = [];
for (var j in vars) {
params.push(j + "=" + vars[j]);
}
var url = Upload.uploadUrls[next] + (Upload.uploadUrls[next].match(/?/) ? '&' : '?') + params.join('&');
Upload.uploadFile(next, queue.pop(), url);
cur.multiProgressIndex = next;
} else {
delete cur.multiProgressIndex;
setTimeout(function() {delete cur.fileApiUploadStarted;}, 1000);
}
} else {
delete cur.multiProgressIndex;
setTimeout(function() {delete cur.fileApiUploadStarted;}, 1000);
}
},
isFileDrag: function(e) {
if (!e || e.target && (e.target.tagName == 'IMG' || e.target.tagName == 'A')) return false;
if (e.dataTransfer.types) {
for (var i = 0; i < e.dataTransfer.types.length; i++) {
if (e.dataTransfer.types[i] == "Files") {
return true;
}
}
} else {
return true;
}
return false;
},
dragEnter: function(i, e) {
if (!cur.uploadDragStarted || cur.uploadDragStarted == 1) {
cur.uploadDragStarted = Upload.isFileDrag(e) ? 2 : 1;
}
if (cur.uploadDragStarted == 1 || !Upload.dropbox[i]) {
cancelEvent(e);
return;
}
setTimeout(function() {
clearTimeout(cur.dragTimer);
delete cur.dragTimer;
}, 0);
if (Upload.options[i].onDragEnter) {
Upload.options[i].onDragEnter();
}
show(Upload.dropbox[i]);
cancelEvent(e);
},
dragOut: function(i, e) {
if (cur.uploadDragStarted == 1 || !Upload.dropbox[i]) {
cancelEvent(e);
return;
}
if (cur.dragTimer) {
clearTimeout(cur.dragTimer);
delete cur.dragTimer;
}
cur.dragTimer = setTimeout(function() {
if (!Upload.options[i].visibleDropbox) {
hide(Upload.dropbox[i]);
}
removeClass(Upload.dropbox[i], 'dropbox_over');
}, 100);
cancelEvent(e);
},
dragOver: function(i, e) {
if (cur.uploadDragStarted == 1 || !Upload.dropbox[i]) {
cancelEvent(e);
return;
}
if (browser.mozilla && intval(browser.version) > 3 && !Upload.options[i].visibleDropbox) {
if (cur.dragOverTimer) {
clearTimeout(cur.dragOverTimer);
delete cur.dragOverTimer;
}
cur.dragOverTimer = setTimeout(function() {
hide(Upload.dropbox[i]);
}, 100);
}
var inside = Upload.insideDropbox(i, e);
if (e.dataTransfer) {
e.dataTransfer.dropEffect = inside ? 'copy' : 'none';
}
toggleClass(Upload.dropbox[i], 'dropbox_over', inside);
cancelEvent(e);
},
drop: function(e) {
each (Upload.dropbox, function (i, dropbox) {
if (!dropbox) {return;}
if (Upload.insideDropbox(i, e)) {
Upload.onFileApiSend(i, e.dataTransfer.files);
}
if (!Upload.options[i].visibleDropbox) {
hide(dropbox);
}
removeClass(dropbox, 'dropbox_over');
});
delete cur.uploadDragStarted;
cancelEvent(e);
return false;
},
insideDropbox: function(i, e) {
var el = e.target;
while (el.parentNode) {
if (el == Upload.dropbox[i]) return true;
el = el.parentNode;
}
return false;
},
_eof: 1};
}
try{stManager.done('upload.js');}catch(e){}
?>