Вход Регистрация
Файл: 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+'">&nbsp;</span></span><span class="bg">&nbsp;</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){}
?>
Онлайн: 2
Реклама