Hormold

VK Change (#1385731806)

Nov 29th, 2013
380
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 48.53 KB | None | 0 0
  1. Файл - upload.js (Старый размер - 40112 | Новый - 0):
  2. 0.  - if (!window.jsonpManager) {
  3. 1.  -   window.jsonpManager = window.__jsp = {
  4. 2.  -     c: 1,
  5. 3.  -     h: {},
  6. 4.  -     reg: function(h) {
  7. 5.  -       __jsp.h[__jsp.c] = isFunction(h) ? h : function(){};
  8. 6.  -       return __jsp.c++;
  9. 7.  -     }
  10. 8.  -   }
  11. 9.  - }
  12. 10.  -
  13. 11.  - if (!window.Upload) {
  14. 12.  - var Upload = {
  15. 13.  -
  16. 14.  - init: function(obj, uploadUrl, vars, options) {
  17. 15.  -   window.uploadInterface = (window.uploadInterface != undefined) ? uploadInterface + 1 : 0;
  18. 16.  -   var iUpload = uploadInterface;
  19. 17.  -
  20. 18.  -   each(['obj', 'dropbox', 'options', 'vars', 'types', 'uploadUrls', 'callbacks', 'checks'], function(i, v) {
  21. 19.  -     if (!Upload[v]) Upload[v] = {};
  22. 20.  -   });
  23. 21.  -
  24. 22.  -   this.obj[iUpload] = ge(obj);
  25. 23.  -   if (options.dropbox) {
  26. 24.  -     this.dropbox[iUpload] = ge(options.dropbox);
  27. 25.  -   }
  28. 26.  -   this.vars[iUpload] = vars;
  29. 27.  -   options.file_input = ge(options.file_input);
  30. 28.  -   this.options[iUpload] = options;
  31. 29.  -   if (options.clear) {
  32. 30.  -     cur.destroy.push(Upload.deinit.pbind(iUpload));
  33. 31.  -   }
  34. 32.  -
  35. 33.  -   this.uploadUrls[iUpload] = uploadUrl;
  36. 34.  -   if (options.flash_lite && !browser.flash && !this.checkFileApi()) {
  37. 35.  -     this.obj[iUpload] = ge(options.fieldEl) || this.obj[iUpload].parentNode.firstChild;
  38. 36.  -   } else {
  39. 37.  -     if (options.customShowProgress) {
  40. 38.  -       options.customShowProgress();
  41. 39.  -     } else {
  42. 40.  -       if (this.obj[iUpload].tagName == 'INPUT' && !this.checkFileApi()) {
  43. 41.  -         this.obj[iUpload] = ge(options.fieldEl) || this.obj[iUpload].parentNode.firstChild;
  44. 42.  -       } else if (!options.flash_lite) {
  45. 43.  -         this.obj[iUpload].innerHTML = '<div class="loading"><img src="/images/upload.gif" /></div>';
  46. 44.  -       }
  47. 45.  -     }
  48. 46.  -   }
  49. 47.  -   if (options.noCheck) {
  50. 48.  -     this.embed(iUpload);
  51. 49.  -   } else {
  52. 50.  -     this.check(iUpload);
  53. 51.  -   }
  54. 52.  -
  55. 53.  -   return iUpload;
  56. 54.  - },
  57. 55.  - deinit: function(iUpload) {
  58. 56.  -   if (!Upload.obj[iUpload]) return;
  59. 57.  -
  60. 58.  -   var options = Upload.options[iUpload] || {}, dragEl = options.dragEvObj;
  61. 59.  -   if (dragEl) {
  62. 60.  -     removeEvent(dragEl, 'dragenter');
  63. 61.  -     removeEvent(dragEl, 'dragover');
  64. 62.  -     removeEvent(dragEl, 'dragleave');
  65. 63.  -   }
  66. 64.  -   each(['obj', 'dropbox', 'options', 'vars', 'types', 'uploadUrls', 'callbacks'], function(i, v) {if (Upload[v]) delete Upload[v][iUpload]});
  67. 65.  -   if (Upload.callbacks) {
  68. 66.  -     if (Upload.callbacks['oncheck'+iUpload]) delete Upload.callbacks['oncheck'+iUpload];
  69. 67.  -     if (Upload.callbacks['ondone'+iUpload]) delete Upload.callbacks['ondone'+iUpload];
  70. 68.  -     if (Upload.callbacks['onfail'+iUpload]) delete Upload.callbacks['onfail'+iUpload];
  71. 69.  -   }
  72. 70.  -   clearTimeout(Upload.checks['timer'+iUpload]);
  73. 71.  - },
  74. 72.  -
  75. 73.  - check: function(iUpload) {
  76. 74.  -   var obj = this.obj[iUpload], vars = this.vars[iUpload], options = this.options[iUpload];
  77. 75.  -   var check_url = options.check_url ? options.check_url : this.uploadUrls[iUpload], check_vars = {};
  78. 76.  -   if (options.signed) {
  79. 77.  -     if (!check_url) return Upload.onCheckComplete(iUpload);
  80. 78.  -     extend(check_vars, {_jsonp: jsonpManager.reg(function(r) { Upload.onCheckComplete(iUpload, r); })});
  81. 79.  -   } else {
  82. 80.  -     if (!options.check_hash && !options.server) {
  83. 81.  -       return Upload.onCheckComplete(iUpload);
  84. 82.  -     }
  85. 83.  -
  86. 84.  -     this.callbacks['oncheck'+iUpload] = Upload.onCheckComplete.pbind(iUpload);
  87. 85.  -     var t = ['mid', 'aid', 'gid', 'hash', 'rhash'];
  88. 86.  -     for (var i in t) {
  89. 87.  -       check_vars[t[i]] = vars[t[i]];
  90. 88.  -     }
  91. 89.  -     if (options.check_hash) {
  92. 90.  -       check_vars.hash = options.check_hash;
  93. 91.  -     }
  94. 92.  -     if (options.check_rhash) {
  95. 93.  -       check_vars.rhash = options.check_rhash;
  96. 94.  -     }
  97. 95.  -     if (vars.https_resp) {
  98. 96.  -       check_vars.https_resp = vars.https_resp;
  99. 97.  -     }
  100. 98.  -     extend(check_vars, {al: 1, act: 'check_upload', type: options.type, ondone: "Upload.callbacks.oncheck"+iUpload});
  101. 99.  -   }
  102. 100.  -   var html = '<form action="' + check_url + '" enctype="multipart/form-data" method="post" id="check_upload_form' + iUpload + '" target="check_iframe' + iUpload + '">';
  103. 101.  -   for (var i in check_vars) {
  104. 102.  -     html += '<input type="hidden" name="' + i + '" value="' + check_vars[i] + '" />';
  105. 103.  -   }
  106. 104.  -   html += '</form><iframe style="visibility: hidden; width: 1px; height: 1px;" id="check_iframe' + iUpload + '" name="check_iframe' + iUpload + '"></iframe>';
  107. 105.  -   var check = ce('div', {id: 'check_upload_'+iUpload, innerHTML: html, className: options.checkClass || ''}, {display: 'none'});
  108. 106.  -   if (ge('check_upload_'+iUpload)) re('check_upload_'+iUpload);
  109. 107.  -   obj.appendChild(check);
  110. 108.  -   var form = ge('check_upload_form' + iUpload);
  111. 109.  -   try {
  112. 110.  -     form && form.submit();
  113. 111.  -     clearTimeout(Upload.checks['timer'+iUpload]);
  114. 112.  -     this.checks['timer'+iUpload] = setTimeout(Upload.serverFail.pbind(iUpload), 10000);
  115. 113.  -   } catch(e) {
  116. 114.  -     debugLog(e);
  117. 115.  -   }
  118. 116.  - },
  119. 117.  -
  120. 118.  - onCheckComplete: function(i, res) {
  121. 119.  -   clearTimeout(Upload.checks['timer' + i]);
  122. 120.  -   delete Upload.checks['timer' + i];
  123. 121.  -
  124. 122.  -   var obj = {}, options = Upload.options[i], data = res;
  125. 123.  -   if (options.signed) {
  126. 124.  -     obj = parseJSON(res || '{}');
  127. 125.  -   } else {
  128. 126.  -     res = res || '';
  129. 127.  -     res = res.split('&');
  130. 128.  -     for (var j in res) {
  131. 129.  -       var t = res[j].split('=');
  132. 130.  -       obj[t[0]] = t[1];
  133. 131.  -     }
  134. 132.  -     data = obj;
  135. 133.  -   }
  136. 134.  -   if (options.customHideProgress) {
  137. 135.  -     options.customHideProgress();
  138. 136.  -   }
  139. 137.  -   if (!obj.error && !obj.fail) {
  140. 138.  -     options.noCheck = 1;
  141. 139.  -     if (options.onCheckComplete) {
  142. 140.  -       options.onCheckComplete(i);
  143. 141.  -     } else if (options.flash_lite && browser.flash) {
  144. 142.  -       Upload.initFlash(i, Upload.obj[i]);
  145. 143.  -     } else {
  146. 144.  -       Upload.embed(i);
  147. 145.  -     }
  148. 146.  -     Upload.serverSuccess(i, data);
  149. 147.  -   } else {
  150. 148.  -     Upload.serverFail(i, data);
  151. 149.  -   }
  152. 150.  - },
  153. 151.  -
  154. 152.  - serverFail: function(i, err_obj) {
  155. 153.  -   var obj = Upload.obj[i], options = Upload.options[i], vars = Upload.vars[i];
  156. 154.  -   if (!obj) return;
  157. 155.  -   if (!options.signed && !options.server) return;
  158. 156.  -
  159. 157.  -   if (!Upload.fails) Upload.fails = {};
  160. 158.  -   Upload.fails[i] = Upload.fails[i] ? Upload.fails[i] + 1 : 1;
  161. 159.  -   if (options.signed) {
  162. 160.  -     var parts = Upload.uploadUrls[i].split('?'), tmp = q2ajx(parts[1]), q = extend({
  163. 161.  -       act: 'check_result',
  164. 162.  -       _resign: tmp._query || parts[1]
  165. 163.  -     }, err_obj ? {_query: err_obj} : {_check: options.check_url.split('?')[1]});
  166. 164.  -     ajax.post('upload_fails.php', q, {
  167. 165.  -       onDone: function(url, check_url, base_url, static_url) {
  168. 166.  -         if (Upload.fails[i] < options.max_attempts) {
  169. 167.  -           Upload.uploadUrls[i] = url;
  170. 168.  -           extend(Upload.options[i], {
  171. 169.  -             check_url: check_url,
  172. 170.  -             base_url: base_url,
  173. 171.  -             static_url: static_url
  174. 172.  -           });
  175. 173.  -           Upload.check(i);
  176. 174.  -         } else {
  177. 175.  -           obj.innerHTML = '';
  178. 176.  -           if (options.lang && options.lang.cannot_upload_title && options.lang.cannot_upload_text) {
  179. 177.  -             showFastBox({title: options.lang.cannot_upload_title, width: 430}, options.lang.cannot_upload_text);
  180. 178.  -           }
  181. 179.  -         }
  182. 180.  -       }
  183. 181.  -     });
  184. 182.  -     return;
  185. 183.  -   }
  186. 184.  -   var query = extend({
  187. 185.  -     act: 'fail',
  188. 186.  -     role: options.type,
  189. 187.  -     mid: vars.mid,
  190. 188.  -     oid: vars.oid,
  191. 189.  -     gid: vars.gid,
  192. 190.  -     aid: vars.aid,
  193. 191.  -     server: options.server,
  194. 192.  -     error: options.error,
  195. 193.  -     hash: options.error_hash
  196. 194.  -   }, err_obj);
  197. 195.  -   if (options.custom_hash) {
  198. 196.  -     extend(query, {custom_hash: options.custom_hash, photo_hash: vars.photo_hash, size: vars.size, fid: vars.fid, vid: vars.vid, tag: vars.tag});
  199. 197.  -   }
  200. 198.  -   if (window.ajax) {
  201. 199.  -     ajax.post('upload_fails.php', query, {
  202. 200.  -       onDone: function(url, new_vars, opts) {
  203. 201.  -         if (Upload.fails[i] < options.max_attempts) {
  204. 202.  -           Upload.uploadUrls[i] = url;
  205. 203.  -           extend(Upload.options[i], opts);
  206. 204.  -           extend(Upload.vars[i], new_vars);
  207. 205.  -           Upload.check(i);
  208. 206.  -         } else {
  209. 207.  -           obj.innerHTML = '';
  210. 208.  -           if (options.lang && options.lang.cannot_upload_title && options.lang.cannot_upload_text) {
  211. 209.  -             showFastBox({title: options.lang.cannot_upload_title, width: 430}, options.lang.cannot_upload_text);
  212. 210.  -           }
  213. 211.  -         }
  214. 212.  -       }
  215. 213.  -     });
  216. 214.  -   } else {
  217. 215.  -     if (options.server != 100000) return;
  218. 216.  -     Ajax.Send('/upload_fails.php', query, function(ajaxObj, response) {
  219. 217.  -       try {
  220. 218.  -         response = eval('(' + response + ')');
  221. 219.  -       } catch (e) {
  222. 220.  -         response = null;
  223. 221.  -       }
  224. 222.  -       var opts = response.options, new_vars = response.vars, url = response.upload_url;
  225. 223.  -       if (Upload.fails[i] < options.max_attempts) {
  226. 224.  -         Upload.uploadUrls[i] = url;
  227. 225.  -         extend(Upload.options[i], opts);
  228. 226.  -         extend(Upload.vars[i], new_vars);
  229. 227.  -         Upload.check(i);
  230. 228.  -       } else {
  231. 229.  -         obj.innerHTML = '';
  232. 230.  -         if (options.lang && options.lang.cannot_upload_title && options.lang.cannot_upload_text) {
  233. 231.  -           showFastBox({title: options.lang.cannot_upload_title, width: 430}, options.lang.cannot_upload_text);
  234. 232.  -         }
  235. 233.  -         options.onCheckServerFailed && options.onCheckServerFailed();
  236. 234.  -       }
  237. 235.  -     });
  238. 236.  -   }
  239. 237.  - },
  240. 238.  -
  241. 239.  - serverSuccess: function(i, err_obj) {
  242. 240.  -   var options = Upload.options[i], vars = Upload.vars[i];
  243. 241.  -   Upload.checked = Upload.checked || {};
  244. 242.  -   Upload.checked[i] = 1;
  245. 243.  -   if (options.signed) {
  246. 244.  -     ajax.post('upload_fails.php', {act: 'check_result', _query: err_obj});
  247. 245.  -     return;
  248. 246.  -   }
  249. 247.  -   if (!options.server && !options.error_hash) return;
  250. 248.  -   var query = extend({
  251. 249.  -     act: 'success',
  252. 250.  -     mid: vars.mid,
  253. 251.  -     oid: vars.oid,
  254. 252.  -     gid: vars.gid,
  255. 253.  -     aid: vars.aid,
  256. 254.  -     server: options.server,
  257. 255.  -     error: options.error,
  258. 256.  -     hash: options.error_hash
  259. 257.  -   }, err_obj);
  260. 258.  -   if (window.ajax) {
  261. 259.  -     ajax.post('upload_fails.php', query);
  262. 260.  -   } else {
  263. 261.  -     Ajax.Send('/upload_fails.php', query);
  264. 262.  -   }
  265. 263.  - },
  266. 264.  -
  267. 265.  - embed: function(iUpload) {
  268. 266.  -   var i = iUpload.num != undefined ? iUpload.num : iUpload, obj = this.obj[i], dropbox = this.dropbox[i], options = this.options[i];
  269. 267.  -   if (options.noEmbed) {
  270. 268.  -     re('check_upload_'+iUpload);
  271. 269.  -     return;
  272. 270.  -   }
  273. 271.  -   if (!options.noCheck) return;
  274. 272.  -
  275. 273.  -   if (browser.flash > 9 && options.forceFlash) {
  276. 274.  -     this.initFlash(i, obj);
  277. 275.  -   } else if (this.checkFileApi() && !options.flash_lite) {
  278. 276.  -     this.initFileApi(i, obj, dropbox);
  279. 277.  -   } else if (browser.flash > 9 && !options.noFlash) {
  280. 278.  -     this.initFlash(i, obj);
  281. 279.  -   } else if (!options.noForm) {
  282. 280.  -     this.initForm(i, obj);
  283. 281.  -   }
  284. 282.  - },
  285. 283.  -
  286. 284.  - checkFileApi: function() {
  287. 285.  -   return (window.XMLHttpRequest || window.XDomainRequest) && (window.FormData || window.FileReader && (window.XMLHttpRequest && XMLHttpRequest.sendAsBinary ||  window.ArrayBuffer && window.Uint8Array && (window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder)));
  288. 286.  - },
  289. 287.  -
  290. 288.  - initFlash: function(iUpload, obj) {
  291. 289.  -   var postData = [], vars = Upload.vars[iUpload], options = Upload.options[iUpload];
  292. 290.  -   var opts = {
  293. 291.  -     url: options.flashPath || '/swf/uploader_lite.swf',
  294. 292.  -     id: 'uploader_lite'+iUpload,
  295. 293.  -     preventhide: true,
  296. 294.  -     width: '100%',
  297. 295.  -     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%'
  298. 296.  -   };
  299. 297.  -   var params = {
  300. 298.  -     swliveconnect: 'true',
  301. 299.  -     allowscriptaccess: 'always',
  302. 300.  -     wmode: browser.msie ? 'opaque' : 'transparent'
  303. 301.  -   }
  304. 302.  -   Upload.types[iUpload]  = 'flash';
  305. 303.  -   for (var i in vars) {
  306. 304.  -     postData.push(i+'='+vars[i]);
  307. 305.  -   }
  308. 306.  -   if (!options.signed && !vars['ajx']) {
  309. 307.  -     postData.push('ajx=1');
  310. 308.  -   }
  311. 309.  -
  312. 310.  -   var flashVars = clone(vars)
  313. 311.  -   extend(flashVars, {
  314. 312.  -     'upload_url': Upload.uploadUrls[iUpload],
  315. 313.  -     'file_size_limit': options.file_size_limit,
  316. 314.  -     'file_types_description': options.file_types_description,
  317. 315.  -     'file_types': options.file_types,
  318. 316.  -     'file_name': options.file_name,
  319. 317.  -     'post_data': escape(postData.join('&')),
  320. 318.  -     'onUploadStart': "Upload.onUploadStart.pbind("+iUpload+")",
  321. 319.  -     'onUploadProgress': "Upload.onUploadProgress.pbind("+iUpload+")",
  322. 320.  -     'onUploadSuccess': "Upload.onUploadComplete.pbind("+iUpload+")",
  323. 321.  -     'onUploadComplete': "Upload.onUploadCompleteAll.pbind("+iUpload+")",
  324. 322.  -     'onUploadError': "Upload.onUploadError.pbind("+iUpload+")",
  325. 323.  -     'onDebug': "Upload.onDebug.pbind("+iUpload+")",
  326. 324.  -     'onMouseDown': "Upload.buttonDown.pbind("+iUpload+")",
  327. 325.  -     'onMouseUp': "Upload.buttonUp.pbind("+iUpload+")",
  328. 326.  -     'onMouseOver': "Upload.buttonOver.pbind("+iUpload+")",
  329. 327.  -     'onMouseOut': "Upload.buttonOut.pbind("+iUpload+")",
  330. 328.  -     'onSelectClick': "Upload.onSelectClick.pbind("+iUpload+")"
  331. 329.  -   });
  332. 330.  -
  333. 331.  -   if (!options.flash_lite) {
  334. 332.  -     if (!options.lang['button_browse']) {
  335. 333.  -       options.lang['button_browse'] = '������� ����';
  336. 334.  -     }
  337. 335.  -     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>';
  338. 336.  -   } else {
  339. 337.  -     obj.innerHTML = '<div class="lite_upload" id="lite_upload' + iUpload + '" style="z-index:10000; width: 100%; height: 100%; cursor: pointer;"></div>';
  340. 338.  -   }
  341. 339.  -   renderFlash(ge('lite_upload'+iUpload), opts, params, flashVars);
  342. 340.  -   if (browser.msie) setStyle(ge('lite_upload'+iUpload), {opacity: 0, cursor: 'pointer'});
  343. 341.  -
  344. 342.  -   if (options.lang.switch_mode) {
  345. 343.  -     var text = options.lang.switch_mode.replace('{link}', '<a onclick="Upload.switchMode('+iUpload+');">');
  346. 344.  -     text = text.replace('{/link}', '</a>');
  347. 345.  -     obj.appendChild(ce('div', {
  348. 346.  -       innerHTML: text,
  349. 347.  -       align: 'left'
  350. 348.  -     }, {
  351. 349.  -       marginTop: '15px'
  352. 350.  -     }));
  353. 351.  -   }
  354. 352.  - },
  355. 353.  -
  356. 354.  - initForm: function(iUpload, obj) {
  357. 355.  -   var _iu = iUpload, vars = this.vars[_iu], options = this.options[_iu];
  358. 356.  -   this.types[_iu] = 'form';
  359. 357.  -
  360. 358.  -   // setTimeout is needed at least for Opera to allow to do ajax requests in this callbacks. Otherwise it hangs up on XHR.open() call.
  361. 359.  -
  362. 360.  -   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%;">';
  363. 361.  -   if (options.signed) {
  364. 362.  -     extend(vars, {_jsonp: jsonpManager.reg(function(r) { Upload.onUploadComplete(_iu, r); })});
  365. 363.  -   } else {
  366. 364.  -     var onDoneCallback = Upload.onUploadComplete.pbind(_iu);
  367. 365.  -     var onFailCallback = Upload.onUploadError.pbind(_iu);
  368. 366.  -     this.callbacks['ondone'+_iu] = function() { var callback = onDoneCallback.pbind.apply(onDoneCallback, arguments); setTimeout(function(){ callback(); }, 1); };
  369. 367.  -     this.callbacks['onfail'+_iu] = function() { var callback = onFailCallback.pbind.apply(onFailCallback, arguments); setTimeout(function(){ callback(); }, 1); };
  370. 368.  -     extend(vars, {al: 1, ondone: "Upload.callbacks.ondone"+_iu, onfail: "Upload.callbacks.onfail"+_iu});
  371. 369.  -   }
  372. 370.  -   for (var i in vars) {
  373. 371.  -     html += '<input type="hidden" name="' + i + '" value="' + vars[i] + '" />';
  374. 372.  -   }
  375. 373.  -   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 + '"' : '') + '/>\
  376. 374.  -   \
  377. 375.  -   </form><iframe style="position: absolute; visibility: hidden; width: 1px; height: 1px;" id="upload_iframe' + _iu + '" name="upload_iframe' + _iu + '"></iframe>';
  378. 376.  -   if (options.label) {
  379. 377.  -     html += options.label.split('{file}').join(input);
  380. 378.  -   } else {
  381. 379.  -     html += input;
  382. 380.  -   }
  383. 381.  -   obj.innerHTML = html;
  384. 382.  -   var nfile = options.file_input,
  385. 383.  -       cfile = geByClass1('file', obj, 'input');
  386. 384.  -
  387. 385.  -   delete options.file_input;
  388. 386.  -   if (nfile && cfile) {
  389. 387.  -     cfile.parentNode.replaceChild(nfile, cfile);
  390. 388.  -     nfile.onchange = function () {Upload.onUploadStart(_iu)};
  391. 389.  -     if (data(nfile, 'changed')) {
  392. 390.  -       data(nfile, 'changed', false);
  393. 391.  -       nfile.onchange();
  394. 392.  -     }
  395. 393.  -   }
  396. 394.  - },
  397. 395.  -
  398. 396.  - buttonOver: function(iUpload) {
  399. 397.  -   var options = Upload.options[iUpload];
  400. 398.  -   if (options.flash_lite) {
  401. 399.  -     if (options.hoverEl) {
  402. 400.  -       addClass(options.hoverEl, 'hover');
  403. 401.  -     } else if (isVisible('photos_flash_add_button')) {
  404. 402.  -       addClass(ge('photos_flash_add_button'), 'hover');
  405. 403.  -     } else {
  406. 404.  -       addClass(ge('photos_upload_area'), 'hover');
  407. 405.  -     }
  408. 406.  -   } else {
  409. 407.  -     addClass(ge('lite_upload'+iUpload).nextSibling, 'hover');
  410. 408.  -   }
  411. 409.  - },
  412. 410.  - buttonOut: function(iUpload) {
  413. 411.  -   var options = Upload.options[iUpload];
  414. 412.  -   if (options.flash_lite) {
  415. 413.  -     if (options.hoverEl) {
  416. 414.  -       removeClass(options.hoverEl, 'hover');
  417. 415.  -     } else if (isVisible('photos_flash_add_button')) {
  418. 416.  -       removeClass(ge('photos_flash_add_button'), 'hover');
  419. 417.  -       removeClass(ge('photos_flash_add_button'), 'active');
  420. 418.  -     } else {
  421. 419.  -       removeClass(ge('photos_upload_area'), 'hover');
  422. 420.  -     }
  423. 421.  -   } else {
  424. 422.  -     removeClass(ge('lite_upload'+iUpload).nextSibling, 'hover');
  425. 423.  -     removeClass(ge('lite_upload'+iUpload).nextSibling, 'active');
  426. 424.  -   }
  427. 425.  - },
  428. 426.  - buttonDown: function(iUpload) {
  429. 427.  -   if (Upload.options[iUpload].flash_lite) {
  430. 428.  -     if (isVisible('photos_flash_add_button')) {
  431. 429.  -       addClass(ge('photos_flash_add_button'), 'active');
  432. 430.  -     }
  433. 431.  -   } else {
  434. 432.  -     addClass(ge('lite_upload'+iUpload).nextSibling, 'active');
  435. 433.  -   }
  436. 434.  - },
  437. 435.  - buttonUp: function(iUpload) {
  438. 436.  -   if (Upload.options[iUpload].flash_lite) {
  439. 437.  -     if (isVisible('photos_flash_add_button')) {
  440. 438.  -       removeClass(ge('photos_flash_add_button'), 'active');
  441. 439.  -     }
  442. 440.  -   } else {
  443. 441.  -     removeClass(ge('lite_upload'+iUpload).nextSibling, 'active');
  444. 442.  -   }
  445. 443.  - },
  446. 444.  -
  447. 445.  - initFileApi: function(iUpload, obj, dropbox) {
  448. 446.  -   var options = this.options[iUpload], input,
  449. 447.  -       dragEl = options && options.dragEl || window.boxLayerWrap;
  450. 448.  -   if (dropbox && dragEl) {
  451. 449.  -     if (!Upload.addedDocEvent) {
  452. 450.  -       addEvent(document, 'drop', Upload.drop);
  453. 451.  -       Upload.addedDocEvent = true;
  454. 452.  -     }
  455. 453.  -     options.dragEvObj = dragEl;
  456. 454.  -     addEvent(dragEl, 'dragenter', Upload.dragEnter.pbind(iUpload));
  457. 455.  -     addEvent(dragEl, 'dragover', Upload.dragOver.pbind(iUpload));
  458. 456.  -     addEvent(dragEl, 'dragleave', Upload.dragOut.pbind(iUpload));
  459. 457.  -   }
  460. 458.  -   this.types[iUpload] = 'fileApi';
  461. 459.  -   if (options.chooseBox) {
  462. 460.  -     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;"/>';
  463. 461.  -   } else {
  464. 462.  -     if (!options.lang['button_browse']) {
  465. 463.  -       options.lang['button_browse'] = '������� ����';
  466. 464.  -     }
  467. 465.  -     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;"/>';
  468. 466.  -   }
  469. 467.  -   if (options.label) {
  470. 468.  -     obj.innerHTML = options.label.split('{file}').join(input);
  471. 469.  -   } else {
  472. 470.  -     obj.innerHTML = input;
  473. 471.  -   }
  474. 472.  -   var nfile = options.file_input,
  475. 473.  -       cfile = geByClass1('file', obj, 'input');
  476. 474.  -   if (nfile && cfile) {
  477. 475.  -     cfile.parentNode.replaceChild(nfile, cfile);
  478. 476.  -     nfile.onchange = function () {Upload.onFileApiSend(iUpload, this.files);};
  479. 477.  -     if (data(nfile, 'changed')) {
  480. 478.  -       data(nfile, 'changed', false);
  481. 479.  -       setTimeout(nfile.onchange.bind(nfile), 0);
  482. 480.  -     }
  483. 481.  -   }
  484. 482.  - },
  485. 483.  -
  486. 484.  - switchMode: function(i) {
  487. 485.  -   Upload.options[i].noFlash = Upload.options[i].noCheck = 1;
  488. 486.  -   Upload.embed(i);
  489. 487.  - },
  490. 488.  -
  491. 489.  - onUploadStart: function(info, result) {
  492. 490.  -   cur.fileApiUploadStarted = true;
  493. 491.  -   var i = info.ind !== undefined ? info.ind : info;
  494. 492.  -   if (Upload.types[i] == 'form') {
  495. 493.  -     var form = ge('file_uploader_form' + i);
  496. 494.  -     form.submit();
  497. 495.  -     var file = geByClass1('file', Upload.obj[i]);
  498. 496.  -     file.disabled = true;
  499. 497.  -   }
  500. 498.  -
  501. 499.  -   var options = Upload.options[i];
  502. 500.  -   if (options.onUploadStart) {
  503. 501.  -     options.onUploadStart(info, result);
  504. 502.  -   };
  505. 503.  - },
  506. 504.  -
  507. 505.  - getErrorAdditional: function(obj) {
  508. 506.  -   if (obj.error && obj.server !== undefined && obj.bwact !== undefined) {
  509. 507.  -     return ((obj.error.indexOf(':') !== -1) ? ',' : ':') + ' from upl_' + intval(obj.server) + '?act=' + obj.bwact.replace(/[^a-zA-Z_0-9]/g, '');
  510. 508.  -   }
  511. 509.  -   return '';
  512. 510.  - },
  513. 511.  - onUploadComplete: function(info, result, extra_info) {
  514. 512.  -   var i = info.ind !== undefined ? info.ind : info, options = Upload.options[i], obj;
  515. 513.  -   if (extra_info !== undefined && i === info) {
  516. 514.  -     info = extra_info;
  517. 515.  -   }
  518. 516.  -   info.ind = i;
  519. 517.  -   if (Upload.types[i] == 'form') {
  520. 518.  -     var file = geByClass1('file', Upload.obj[i]);
  521. 519.  -     file.disabled = false;
  522. 520.  -   }
  523. 521.  -   if (options.onUploadComplete) {
  524. 522.  -     var errorAdd = '';
  525. 523.  -     if (options.signed) {
  526. 524.  -       var obj = parseJSON(result);
  527. 525.  -       if (!obj) {
  528. 526.  -         result = '{"error":"ERR_CLIENT_UPLOAD_FAIL: upload request bad result, url \\"' + Upload.uploadUrls[i] + '\\""}';
  529. 527.  -       } else {
  530. 528.  -         errorAdd = Upload.getErrorAdditional(obj);
  531. 529.  -       }
  532. 530.  -     }
  533. 531.  -     options.onUploadComplete(info, result, errorAdd);
  534. 532.  -   }
  535. 533.  -   if (Upload.types[i] == 'form') {
  536. 534.  -     Upload.onUploadCompleteAll(info, result);
  537. 535.  -   }
  538. 536.  - },
  539. 537.  -
  540. 538.  - onUploadCompleteAll: function(info, result, extra_info) {
  541. 539.  -   var i = info.ind !== undefined ? info.ind : info, options = Upload.options[i];
  542. 540.  -   if (extra_info !== undefined && i === info) {
  543. 541.  -     info = extra_info;
  544. 542.  -   }
  545. 543.  -   if (Upload.types[i] == 'fileApi') {
  546. 544.  -     var cfile = geByClass1('file', Upload.obj[i], 'input');
  547. 545.  -     if (cfile) {
  548. 546.  -       cfile.value = '';
  549. 547.  -     }
  550. 548.  -   }
  551. 549.  -
  552. 550.  -   if (options.onUploadCompleteAll) {
  553. 551.  -     options.onUploadCompleteAll(info, result);
  554. 552.  -   }
  555. 553.  - },
  556. 554.  -
  557. 555.  - onUploadError: function(info, result) {
  558. 556.  -   var i = info.ind !== undefined ? info.ind : info, options = Upload.options[i];
  559. 557.  -   if (Upload.types[i] == 'form') {
  560. 558.  -     var file = geByClass1('file', Upload.obj[i]);
  561. 559.  -     file.disabled = false;
  562. 560.  -   }
  563. 561.  -   if (options.signed) {
  564. 562.  -     if (options.onUploadComplete) {
  565. 563.  -       options.onUploadComplete('{"error":"ERR_CLIENT_UPLOAD_FAIL: upload request fail, code \\"' + result.replace(/([\\\"])/g, '\\$1').replace(/\n/g, '\\n') + '\\", url \\"' + Upload.uploadUrls[i] + '\\""}');
  566. 564.  -     }
  567. 565.  -   } else if (options.onUploadError) {
  568. 566.  -     options.onUploadError(info, result);
  569. 567.  -   };
  570. 568.  - },
  571. 569.  -
  572. 570.  - onUploadProgress: function(info, bytesLoaded, bytesTotal) {
  573. 571.  -   var i = info.ind !== undefined ? info.ind : info, options = Upload.options[i];
  574. 572.  -   if (options.onUploadProgress) {
  575. 573.  -     options.onUploadProgress(info, bytesLoaded, bytesTotal);
  576. 574.  -   };
  577. 575.  - },
  578. 576.  -
  579. 577.  - onDebug: function(info, result) {
  580. 578.  -   var i = info.ind !== undefined ? info.ind : info, options = Upload.options[i];
  581. 579.  -   if (options.onDebug) {
  582. 580.  -     options.onDebug(info, result);
  583. 581.  -   }
  584. 582.  - },
  585. 583.  -
  586. 584.  - onSelectClick: function(info, result) {
  587. 585.  -   var i = info.ind !== undefined ? info.ind : info, options = Upload.options[i];
  588. 586.  -   if (options.onSelectClick) {
  589. 587.  -     options.onSelectClick(info, result);
  590. 588.  -   }
  591. 589.  - },
  592. 590.  -
  593. 591.  - onFileApiSend: function(i, files, force) {
  594. 592.  -   if (!files || !files.length) return;
  595. 593.  -
  596. 594.  -   var options = this.options[i];
  597. 595.  -   if (options.reverse_files) {
  598. 596.  -     files = Array.prototype.slice.call(files).reverse();
  599. 597.  -   }
  600. 598.  -
  601. 599.  -   if (!options.multiple && files.length > 1) {
  602. 600.  -     files = [files[0]]
  603. 601.  -   }
  604. 602.  -
  605. 603.  -   if (options.photoBox && !force) {
  606. 604.  -     return Upload.onPhotoAdd(i, files);
  607. 605.  -   }
  608. 606.  -
  609. 607.  -   if (options.beforeUpload) options.beforeUpload(i);
  610. 608.  -
  611. 609.  -   cur.notStarted = cur.fileApiUploadStarted = true;
  612. 610.  -   if (!options.multi_progress) this.onUploadStart(i);
  613. 611.  -   var max_files = files.length;
  614. 612.  -   if (options.max_files) {
  615. 613.  -     var attachCount = cur.attachCount;
  616. 614.  -     if (!attachCount && cur.addMedia) {
  617. 615.  -       var maxIndex = -1;
  618. 616.  -       for (var j in cur.addMedia) {
  619. 617.  -         if (j > maxIndex) maxIndex = j;
  620. 618.  -       }
  621. 619.  -       if (maxIndex >= 0 && cur.addMedia[maxIndex] && cur.addMedia[maxIndex].attachCount) {
  622. 620.  -         attachCount = cur.addMedia[maxIndex].attachCount;
  623. 621.  -       }
  624. 622.  -     }
  625. 623.  -     var curCount = attachCount ? attachCount() : 0;
  626. 624.  -     if (options.max_files - curCount < files.length && options.lang && options.lang.max_files_warning) {
  627. 625.  -       max_files = options.max_files - curCount;
  628. 626.  -       showFastBox({
  629. 627.  -         title: getLang('global_error'),
  630. 628.  -         width: 430,
  631. 629.  -         onHide: function() {
  632. 630.  -           Upload.embed(i);
  633. 631.  -           delete cur.notStarted;
  634. 632.  -         }
  635. 633.  -       }, options.lang.max_files_warning, getLang('global_continue'), function() {
  636. 634.  -         Upload.uploadFiles(i, files, max_files);
  637. 635.  -         if (options.max_files_hide_last) {
  638. 636.  -           curBox().hide();
  639. 637.  -         } else {
  640. 638.  -           boxQueue.hideAll();
  641. 639.  -         }
  642. 640.  -       }, getLang('global_cancel'));
  643. 641.  -     } else {
  644. 642.  -       if (options.force_max_files) {
  645. 643.  -         max_files = Math.min(max_files, options.max_files - (cur.savedPhotos || []).length);
  646. 644.  -       }
  647. 645.  -       this.uploadFiles(i, files, max_files);
  648. 646.  -     }
  649. 647.  -   } else {
  650. 648.  -     this.uploadFiles(i, files, max_files);
  651. 649.  -   }
  652. 650.  - },
  653. 651.  -
  654. 652.  - onPhotoAdd: function(i, files) {
  655. 653.  -   var needFire = 0, count = 0;
  656. 654.  -   Upload.fileList = Upload.fileList || {};
  657. 655.  -   if (!Upload.fileList[i]) {
  658. 656.  -     Upload.fileList[i] = [];
  659. 657.  -     if (Upload.options[i].onPhotoBox) {
  660. 658.  -       needFire = true;
  661. 659.  -     }
  662. 660.  -   }
  663. 661.  -   each(files, function(n, file) {
  664. 662.  -     count++;
  665. 663.  -     var preview = Upload.options[i].photoBox;
  666. 664.  -     var imageType = new RegExp('image.*')
  667. 665.  -     if (!file.type.match(imageType)) {
  668. 666.  -       //return false;
  669. 667.  -     }
  670. 668.  -     cur.uploaderPhotoId = (cur.uploaderPhotoId || 0) + 1;
  671. 669.  -     var photoId = cur.uploaderPhotoId;
  672. 670.  -     Upload.fileList[i][photoId] = file;
  673. 671.  -
  674. 672.  -     var img = ce('img');
  675. 673.  -     var photo = ce('div', {
  676. 674.  -       id: 'photos_add_item'+photoId,
  677. 675.  -       className: 'photos_add_item',
  678. 676.  -       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>'
  679. 677.  -     });
  680. 678.  -     preview.appendChild(photo);
  681. 679.  -
  682. 680.  -     var reader = new FileReader();
  683. 681.  -     reader.onload = function(e) {
  684. 682.  -       img.src = e.target.result;
  685. 683.  -       img.onload = function() {
  686. 684.  -         img.onload = false;
  687. 685.  -         var size = {w: img.width, h: img.height}, dx, dy;
  688. 686.  -         if (size.w > 130) {
  689. 687.  -           dx = 130 / size.w;
  690. 688.  -           size.w = 130;
  691. 689.  -           size.h = parseInt(size.h * dx);
  692. 690.  -         }
  693. 691.  -
  694. 692.  -
  695. 693.  -         if (size.h > 130) {
  696. 694.  -           dy = 130 / size.h;
  697. 695.  -           size.h = 130;
  698. 696.  -           size.w = parseInt(size.w * dy);
  699. 697.  -         }
  700. 698.  -
  701. 699.  -         var cnv = ce('canvas', {
  702. 700.  -           width: size.w,
  703. 701.  -           height: size.h
  704. 702.  -         });
  705. 703.  -         var ctx = cnv.getContext('2d');
  706. 704.  -         ctx.drawImage(img, 0, 0, size.w, size.h);
  707. 705.  -         delete img;
  708. 706.  -         var dataURL = cnv.toDataURL("image/jpeg");
  709. 707.  -         img.src = dataURL;
  710. 708.  -         var thumbCont = ge('photos_add_s'+photoId);
  711. 709.  -         var tw = Math.max(size.w, 80);
  712. 710.  -         var th = Math.min(size.h, 98);
  713. 711.  -         setStyle(thumbCont, {
  714. 712.  -           width: tw,
  715. 713.  -           height: th,
  716. 714.  -           //marginTop: Math.ceil((98 - th) / 2),
  717. 715.  -           marginLeft: Math.ceil((130 - tw) / 2)
  718. 716.  -         });
  719. 717.  -         thumbCont.innerHTML = '';
  720. 718.  -         thumbCont.appendChild(img);
  721. 719.  -         img.onload = function() {
  722. 720.  -           setTimeout(function() {
  723. 721.  -             thumbCont.parentNode.className = 'photos_add_img';
  724. 722.  -           }, 0);
  725. 723.  -           img.onload = false;
  726. 724.  -         }
  727. 725.  -         Upload.finishTask();
  728. 726.  -       }
  729. 727.  -     }
  730. 728.  -     Upload.taskToQ(function() {
  731. 729.  -       reader.readAsDataURL(file);
  732. 730.  -     });
  733. 731.  -   });
  734. 732.  -   if (needFire && count) {
  735. 733.  -     Upload.options[i].onPhotoBox();
  736. 734.  -   }
  737. 735.  -   if (Upload.options[i].onPhotoAdd && count) {
  738. 736.  -     Upload.options[i].onPhotoAdd();
  739. 737.  -   }
  740. 738.  - },
  741. 739.  -
  742. 740.  - uploadPhotos: function(uplId) {
  743. 741.  -   var files = [], flist = Upload.fileList[uplId];
  744. 742.  -   for (var i in flist) {
  745. 743.  -     if (flist[i]) {
  746. 744.  -       files.push(extend(flist[i], {
  747. 745.  -         fileRef: i
  748. 746.  -       }));
  749. 747.  -     }
  750. 748.  -   }
  751. 749.  -   if (Upload.options[uplId].onUploadStart) Upload.options[uplId].onUploadStart();
  752. 750.  -   if (files.length) {
  753. 751.  -     cur.uploadCount = Math.min(500, files.length);
  754. 752.  -     Upload.uploadFiles(uplId, files, cur.uploadCount);
  755. 753.  -     return true;
  756. 754.  -   } else {
  757. 755.  -     return false;
  758. 756.  -   }
  759. 757.  - },
  760. 758.  -
  761. 759.  - taskToQ: function(task) {
  762. 760.  -   if (!Upload.previewFileQ) {
  763. 761.  -     Upload.previewFileQ = [];
  764. 762.  -   }
  765. 763.  -   if (task) {
  766. 764.  -     Upload.previewFileQ.push(task);
  767. 765.  -   }
  768. 766.  -
  769. 767.  -   if (Upload.doingQ) {
  770. 768.  -     return;
  771. 769.  -   }
  772. 770.  -   var newTask = Upload.previewFileQ.shift();
  773. 771.  -   if (newTask) {
  774. 772.  -     Upload.doingQ = true;
  775. 773.  -     newTask();
  776. 774.  -   }
  777. 775.  - },
  778. 776.  -
  779. 777.  - finishTask: function() {
  780. 778.  -   setTimeout(function() {
  781. 779.  -     Upload.doingQ = false;
  782. 780.  -     Upload.taskToQ();
  783. 781.  -
  784. 782.  -   }, 100);
  785. 783.  - },
  786. 784.  -
  787. 785.  - uploadFiles: function(i, files, max_files) {
  788. 786.  -   if (max_files <= 0) return;
  789. 787.  -   var options = this.options[i],
  790. 788.  -       vars = options.signed ? this.vars[i] : extend(this.vars[i], {ajx: 1}),
  791. 789.  -       params = [],
  792. 790.  -       totalSize = 0,
  793. 791.  -       totalCount = 0,
  794. 792.  -       loadedSize = 0,
  795. 793.  -       loadedCount = 0,
  796. 794.  -       filesQueue = [],
  797. 795.  -       re;
  798. 796.  -
  799. 797.  -   if (options.uploading) {
  800. 798.  -     totalSize = options.filesTotalSize || 0;
  801. 799.  -     totalCount = options.filesTotalCount || 0;
  802. 800.  -     loadedCount = options.filesLoadedCount || 0;
  803. 801.  -     loadedSize = options.filesLoadedSize || 0;
  804. 802.  -     filesQueue = options.filesQueue;
  805. 803.  -   }
  806. 804.  -
  807. 805.  -   if (options.file_match) re = new RegExp(options.file_match, "i");
  808. 806.  -   for (var j in vars) {
  809. 807.  -     params.push(j + "=" + vars[j]);
  810. 808.  -   }
  811. 809.  -   var uploadUrl = this.uploadUrls[i] + (this.uploadUrls[i].match(/\?/) ? '&' : '?') + params.join('&'),
  812. 810.  -       fileName;
  813. 811.  -
  814. 812.  -   var errors = false;
  815. 813.  -   for (var j = 0; j < max_files; j++) {
  816. 814.  -     fileName = files[j].fileName || files[j].name || '';
  817. 815.  -     if (options.file_match) {
  818. 816.  -       if (!fileName.match(re)) {
  819. 817.  -         errors = true;
  820. 818.  -         continue;
  821. 819.  -       }
  822. 820.  -     }
  823. 821.  -     if (options.multi_progress && !options.multi_sequence) {
  824. 822.  -       this.onUploadStart({ind: i, fileName: fileName});
  825. 823.  -     }
  826. 824.  -     totalSize += files[j].size;
  827. 825.  -     totalCount += 1;
  828. 826.  -     filesQueue.push(files[j]);
  829. 827.  -   }
  830. 828.  -   filesQueue.reverse();
  831. 829.  -
  832. 830.  -   extend(options, {
  833. 831.  -     filesQueue: filesQueue,
  834. 832.  -     filesTotalSize: totalSize,
  835. 833.  -     filesLoadedSize: loadedSize,
  836. 834.  -     filesLoadedCount: loadedCount,
  837. 835.  -     filesTotalCount: totalCount
  838. 836.  -   });
  839. 837.  -
  840. 838.  -   // if (options.multi_sequence && options.onUploadProgress) {
  841. 839.  -   //   options.onUploadProgress(Upload.getFileInfo(i, options, false));
  842. 840.  -   // }
  843. 841.  -
  844. 842.  -   if (filesQueue.length > 0) {
  845. 843.  -     if (cur.multiProgressIndex !== undefined) {
  846. 844.  -       if (!cur.nextQueues) cur.nextQueues = [];
  847. 845.  -       cur.nextQueues.push(i);
  848. 846.  -     } else {
  849. 847.  -       this.uploadFile(i, filesQueue.pop(), uploadUrl);
  850. 848.  -       if (options.multi_progress) cur.multiProgressIndex = i;
  851. 849.  -     }
  852. 850.  -   } else if (errors) {
  853. 851.  -     Upload.onUploadError(i, 'file type not supported');
  854. 852.  -   }
  855. 853.  - },
  856. 854.  -
  857. 855.  - getFileInfo: function(i, options, file) {
  858. 856.  -   return options.multi_progress ? {
  859. 857.  -     ind: i,
  860. 858.  -     fileName: (file) ? file.fileName || file.name || '' : '',
  861. 859.  -     num: options.filesLoadedCount,
  862. 860.  -     totalSize: options.filesTotalSize,
  863. 861.  -     loadedSize: options.filesLoadedSize,
  864. 862.  -     totalCount: options.filesTotalCount,
  865. 863.  -     file: file
  866. 864.  -   } : i;
  867. 865.  - },
  868. 866.  -
  869. 867.  - uploadFile: function(uplId, file, url) {
  870. 868.  -   var options = this.options[uplId];
  871. 869.  -   var XHR = (browser.msie && intval(browser.version) < 10) ? window.XDomainRequest : window.XMLHttpRequest;
  872. 870.  -
  873. 871.  -   var info = Upload.getFileInfo(uplId, options, file);
  874. 872.  -
  875. 873.  -   if (options.multi_sequence) {
  876. 874.  -     this.onUploadStart(info);
  877. 875.  -   }
  878. 876.  -
  879. 877.  -   options.uploading = true;
  880. 878.  -
  881. 879.  -   if (window.FormData) {
  882. 880.  -     var formData = new FormData();
  883. 881.  -     formData.append(options.file_name, file);
  884. 882.  -
  885. 883.  -     var xhr = new XHR(), fastFail = true;
  886. 884.  -     xhr.open('POST', url, true);
  887. 885.  -     xhr.onload = function(e) {
  888. 886.  -       extend(info, Upload.getFileInfo(uplId, options, file)); // can be extended
  889. 887.  -       Upload.options[uplId].filesLoadedSize += file.size;
  890. 888.  -       Upload.options[uplId].filesLoadedCount += 1;
  891. 889.  -       Upload.onUploadComplete(info, e.target.responseText);
  892. 890.  -       if (Upload.options[uplId].filesQueue && Upload.options[uplId].filesQueue.length > 0) {
  893. 891.  -         Upload.uploadFile(uplId, Upload.options[uplId].filesQueue.pop(), url);
  894. 892.  -       } else {
  895. 893.  -         Upload.startNextQueue(uplId);
  896. 894.  -         Upload.onUploadCompleteAll(info, e.target.responseText);
  897. 895.  -         options.uploading = false;
  898. 896.  -       }
  899. 897.  -     };
  900. 898.  -     xhr.onerror = function(e) {
  901. 899.  -       if (false && !e.target.responseText && fastFail) { // Disabled. Replace it by layer to prevent losing unsaved changes on the page.
  902. 900.  -         return nav.go('/login?act=upload_fail', false, {nocur: true, params: {context: 0, name: file.fileName || file.name || ''}});
  903. 901.  -       }
  904. 902.  -       extend(info, Upload.getFileInfo(uplId, options, file));
  905. 903.  -       Upload.options[uplId].filesTotalSize -= file.size;
  906. 904.  -       Upload.options[uplId].filesTotalCount -= 1;
  907. 905.  -       Upload.onUploadError(info, e.target.responseText);
  908. 906.  -       if (Upload.options[uplId].filesQueue.length > 0) {
  909. 907.  -         Upload.uploadFile(uplId, Upload.options[uplId].filesQueue.pop(), url);
  910. 908.  -       } else {
  911. 909.  -         Upload.startNextQueue(uplId);
  912. 910.  -         Upload.onUploadCompleteAll(info, e.target.responseText);
  913. 911.  -         options.uploading = false;
  914. 912.  -       }
  915. 913.  -     };
  916. 914.  -     xhr.upload.onprogress = function(e) {
  917. 915.  -       fastFail = false;
  918. 916.  -       extend(info, Upload.getFileInfo(uplId, options, file));
  919. 917.  -       if (e.lengthComputable) {
  920. 918.  -         if (!options.multi_progress) {
  921. 919.  -           Upload.onUploadProgress(uplId, Math.min(e.loaded + options.filesLoadedSize, options.filesTotalSize), options.filesTotalSize);
  922. 920.  -         } else {
  923. 921.  -           Upload.onUploadProgress(info, e.loaded, e.total);
  924. 922.  -         }
  925. 923.  -       }
  926. 924.  -     };
  927. 925.  -     xhr.send(formData);
  928. 926.  -   } else try {
  929. 927.  -     if (XHR && !XHR.prototype.sendAsBinary && window.ArrayBuffer && window.Uint8Array) {
  930. 928.  -       var BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder;
  931. 929.  -       if (BlobBuilder) {
  932. 930.  -         XHR.prototype.sendAsBinary = function(text){
  933. 931.  -           var data = new ArrayBuffer(text.length);
  934. 932.  -           var ui8a = new Uint8Array(data, 0);
  935. 933.  -           for (var i = 0; i < text.length; i++) ui8a[i] = (text.charCodeAt(i) & 0xff);
  936. 934.  -           var bb = new BlobBuilder();
  937. 935.  -           bb.append(data);
  938. 936.  -           var blob = bb.getBlob();
  939. 937.  -           this.send(blob);
  940. 938.  -         }
  941. 939.  -       }
  942. 940.  -     }
  943. 941.  -
  944. 942.  -     var reader = new FileReader();
  945. 943.  -
  946. 944.  -     reader.onload = function() {
  947. 945.  -       var xhr = new XHR(), fastFail = true;
  948. 946.  -
  949. 947.  -       xhr.onload = function(e) {
  950. 948.  -         extend(info, Upload.getFileInfo(uplId, options, file));
  951. 949.  -         Upload.options[uplId].filesLoadedSize += file.size;
  952. 950.  -         Upload.options[uplId].filesLoadedCount += 1;
  953. 951.  -         Upload.onUploadComplete(info, e.target.responseText);
  954. 952.  -         if (Upload.options[uplId].filesQueue.length > 0) {
  955. 953.  -           Upload.uploadFile(uplId, Upload.options[uplId].filesQueue.pop(), url);
  956. 954.  -         } else {
  957. 955.  -           Upload.startNextQueue(uplId);
  958. 956.  -           Upload.onUploadCompleteAll(info, e.target.responseText);
  959. 957.  -         }
  960. 958.  -       };
  961. 959.  -       xhr.onerror = function(e) {
  962. 960.  -         if (false && !e.target.responseText && fastFail) { // Disabled. Replace it by layer to prevent losing unsaved changes on the page.
  963. 961.  -           return nav.go('/login?act=upload_fail', false, {nocur: true, params: {context: 1, name: file.fileName || file.name || ''}});
  964. 962.  -         }
  965. 963.  -         extend(info, Upload.getFileInfo(uplId, options, file));
  966. 964.  -         Upload.options[uplId].filesTotalSize -= file.size;
  967. 965.  -         Upload.options[uplId].filesTotalCount -= 1;
  968. 966.  -         Upload.onUploadError(info, e.target.responseText);
  969. 967.  -         if (Upload.options[uplId].filesQueue.length > 0) {
  970. 968.  -           Upload.uploadFile(uplId, Upload.options[uplId].filesQueue.pop(), url);
  971. 969.  -         } else {
  972. 970.  -           Upload.startNextQueue(uplId);
  973. 971.  -           Upload.onUploadCompleteAll(info, e.target.responseText);
  974. 972.  -           options.uploading = false;
  975. 973.  -         }
  976. 974.  -       };
  977. 975.  -       xhr.upload.onprogress = function(e) {
  978. 976.  -         fastFail = false;
  979. 977.  -         extend(info, Upload.getFileInfo(uplId, options, file));
  980. 978.  -         if (e.lengthComputable) {
  981. 979.  -           if (!options.multi_progress) {
  982. 980.  -             Upload.onUploadProgress(uplId, Math.min(e.loaded + options.filesLoadedSize, options.filesTotalSize), options.filesTotalSize);
  983. 981.  -           } else {
  984. 982.  -             Upload.onUploadProgress(info, e.loaded, e.total);
  985. 983.  -             options.uploading = false;
  986. 984.  -           }
  987. 985.  -         }
  988. 986.  -       };
  989. 987.  -
  990. 988.  -       xhr.open('POST', url, true);
  991. 989.  -       var boundary = '---------' + irand(1111111111, 9999999999);
  992. 990.  -       xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary=" + boundary);
  993. 991.  -       var body = '--' + boundary + "\r\n";
  994. 992.  -       body += "Content-Disposition: form-data; name='" + options.file_name + "'; filename='" + file.name + "'\r\n";
  995. 993.  -       body += "Content-Type: application/octet-stream\r\n\r\n";
  996. 994.  -       body += reader.result + "\r\n";
  997. 995.  -       body += '--' + boundary + '--';
  998. 996.  -
  999. 997.  -       xhr.sendAsBinary(body);
  1000. 998.  -     };
  1001. 999.  -     reader.readAsBinaryString(file);
  1002. 1000.  -   } catch (e) {
  1003. 1001.  -     try { console.error(e); } catch (e2) {}
  1004. 1002.  -   }
  1005. 1003.  -   Upload.options[uplId].xhr = xhr;
  1006. 1004.  - },
  1007. 1005.  -
  1008. 1006.  - terminateUpload: function(i, name) {
  1009. 1007.  -   try {
  1010. 1008.  -     var vars = Upload.vars[i],
  1011. 1009.  -         options = Upload.options[i],
  1012. 1010.  -         params = [],
  1013. 1011.  -         queue = options.filesQueue;
  1014. 1012.  -         inQueue = false,
  1015. 1013.  -         info = options.multi_progress ? {ind: i, fileName: name} : i,
  1016. 1014.  -         ind = name ? i + '_' + name : i;
  1017. 1015.  -
  1018. 1016.  -     for (var j in vars) {
  1019. 1017.  -       params.push(j + "=" + vars[j]);
  1020. 1018.  -     }
  1021. 1019.  -     for (var j in queue) {
  1022. 1020.  -       if (name == (queue[j].fileName || queue[j].name || '')) {
  1023. 1021.  -         queue.splice(j, 1);
  1024. 1022.  -         inQueue = true;
  1025. 1023.  -         break;
  1026. 1024.  -       }
  1027. 1025.  -     }
  1028. 1026.  -     re('upload' + ind + '_progress_wrap');
  1029. 1027.  -     Upload.onUploadComplete(info, '');
  1030. 1028.  -     if (!inQueue && options.xhr) options.xhr.abort();
  1031. 1029.  -     var url = this.uploadUrls[i] + (this.uploadUrls[i].match(/\?/) ? '&' : '?') + params.join('&');
  1032. 1030.  -     if (!inQueue) {
  1033. 1031.  -       if (queue.length > 0) {
  1034. 1032.  -         Upload.uploadFile(i, queue.pop(), url);
  1035. 1033.  -       } else {
  1036. 1034.  -         Upload.startNextQueue(i);
  1037. 1035.  -         Upload.onUploadCompleteAll(info, '');
  1038. 1036.  -       }
  1039. 1037.  -     }
  1040. 1038.  -   } catch (e) {
  1041. 1039.  -     try { console.error(e); } catch (e2) {}
  1042. 1040.  -   }
  1043. 1041.  - },
  1044. 1042.  -
  1045. 1043.  - startNextQueue: function(i) {
  1046. 1044.  -   if (cur.multiProgressIndex === undefined) {
  1047. 1045.  -     setTimeout(function() {delete cur.fileApiUploadStarted;}, 1000);
  1048. 1046.  -   }
  1049. 1047.  -   if (i != cur.multiProgressIndex) return;
  1050. 1048.  -   var options = this.options[i];
  1051. 1049.  -   if (options.multi_progress && cur.nextQueues && cur.nextQueues.length) {
  1052. 1050.  -     var next = cur.nextQueues[0],
  1053. 1051.  -         queue = Upload.options[next].filesQueue;
  1054. 1052.  -     cur.nextQueues.splice(0, 1);
  1055. 1053.  -     while (queue.length == 0 && cur.nextQueues.length > 0) {
  1056. 1054.  -       next = cur.nextQueues[0];
  1057. 1055.  -       cur.nextQueues.splice(0, 1);
  1058. 1056.  -       queue = Upload.options[next].filesQueue;
  1059. 1057.  -     }
  1060. 1058.  -     if (queue.length > 0) {
  1061. 1059.  -       var vars = Upload.vars[next], params = [];
  1062. 1060.  -       for (var j in vars) {
  1063. 1061.  -         params.push(j + "=" + vars[j]);
  1064. 1062.  -       }
  1065. 1063.  -       var url = Upload.uploadUrls[next] + (Upload.uploadUrls[next].match(/\?/) ? '&' : '?') + params.join('&');
  1066. 1064.  -       Upload.uploadFile(next, queue.pop(), url);
  1067. 1065.  -       cur.multiProgressIndex = next;
  1068. 1066.  -     } else {
  1069. 1067.  -       delete cur.multiProgressIndex;
  1070. 1068.  -       setTimeout(function() {delete cur.fileApiUploadStarted;}, 1000);
  1071. 1069.  -     }
  1072. 1070.  -   } else {
  1073. 1071.  -     delete cur.multiProgressIndex;
  1074. 1072.  -     setTimeout(function() {delete cur.fileApiUploadStarted;}, 1000);
  1075. 1073.  -   }
  1076. 1074.  - },
  1077. 1075.  -
  1078. 1076.  - isFileDrag: function(e) {
  1079. 1077.  -   if (!e || e.target && (e.target.tagName == 'IMG' || e.target.tagName == 'A')) return false;
  1080. 1078.  -   if (e.dataTransfer.types) {
  1081. 1079.  -     for (var i = 0; i < e.dataTransfer.types.length; i++) {
  1082. 1080.  -       if (e.dataTransfer.types[i] == "Files") {
  1083. 1081.  -         return true;
  1084. 1082.  -       }
  1085. 1083.  -     }
  1086. 1084.  -   } else {
  1087. 1085.  -     return true;
  1088. 1086.  -   }
  1089. 1087.  -   return false;
  1090. 1088.  - },
  1091. 1089.  -
  1092. 1090.  - dragEnter: function(i, e) {
  1093. 1091.  -   if (!cur.uploadDragStarted || cur.uploadDragStarted == 1) {
  1094. 1092.  -     cur.uploadDragStarted = Upload.isFileDrag(e) ? 2 : 1;
  1095. 1093.  -   }
  1096. 1094.  -   if (cur.uploadDragStarted == 1 || !Upload.dropbox[i]) {
  1097. 1095.  -     cancelEvent(e);
  1098. 1096.  -     return;
  1099. 1097.  -   }
  1100. 1098.  -   setTimeout(function() {
  1101. 1099.  -     clearTimeout(cur.dragTimer);
  1102. 1100.  -     delete cur.dragTimer;
  1103. 1101.  -   }, 0);
  1104. 1102.  -   if (Upload.options[i].onDragEnter) {
  1105. 1103.  -     Upload.options[i].onDragEnter();
  1106. 1104.  -   }
  1107. 1105.  -   show(Upload.dropbox[i]);
  1108. 1106.  -   cancelEvent(e);
  1109. 1107.  - },
  1110. 1108.  -
  1111. 1109.  - dragOut: function(i, e) {
  1112. 1110.  -   if (cur.uploadDragStarted == 1 || !Upload.dropbox[i]) {
  1113. 1111.  -     cancelEvent(e);
  1114. 1112.  -     return;
  1115. 1113.  -   }
  1116. 1114.  -   if (cur.dragTimer) {
  1117. 1115.  -     clearTimeout(cur.dragTimer);
  1118. 1116.  -     delete cur.dragTimer;
  1119. 1117.  -   }
  1120. 1118.  -   cur.dragTimer = setTimeout(function() {
  1121. 1119.  -     if (!Upload.options[i].visibleDropbox) {
  1122. 1120.  -       hide(Upload.dropbox[i]);
  1123. 1121.  -     }
  1124. 1122.  -     removeClass(Upload.dropbox[i], 'dropbox_over');
  1125. 1123.  -   }, 100);
  1126. 1124.  -   cancelEvent(e);
  1127. 1125.  - },
  1128. 1126.  -
  1129. 1127.  - dragOver: function(i, e) {
  1130. 1128.  -   if (cur.uploadDragStarted == 1 || !Upload.dropbox[i]) {
  1131. 1129.  -     cancelEvent(e);
  1132. 1130.  -     return;
  1133. 1131.  -   }
  1134. 1132.  -   if (browser.mozilla && intval(browser.version) > 3 && !Upload.options[i].visibleDropbox) {
  1135. 1133.  -     if (cur.dragOverTimer) {
  1136. 1134.  -       clearTimeout(cur.dragOverTimer);
  1137. 1135.  -       delete cur.dragOverTimer;
  1138. 1136.  -     }
  1139. 1137.  -     cur.dragOverTimer = setTimeout(function() {
  1140. 1138.  -       hide(Upload.dropbox[i]);
  1141. 1139.  -     }, 100);
  1142. 1140.  -   }
  1143. 1141.  -   var inside = Upload.insideDropbox(i, e);
  1144. 1142.  -   if (e.dataTransfer) {
  1145. 1143.  -     e.dataTransfer.dropEffect = inside ? 'copy' : 'none';
  1146. 1144.  -   }
  1147. 1145.  -   toggleClass(Upload.dropbox[i], 'dropbox_over', inside);
  1148. 1146.  -   cancelEvent(e);
  1149. 1147.  - },
  1150. 1148.  -
  1151. 1149.  - drop: function(e) {
  1152. 1150.  -   each (Upload.dropbox, function (i, dropbox) {
  1153. 1151.  -     if (!dropbox) {return;}
  1154. 1152.  -     if (Upload.insideDropbox(i, e)) {
  1155. 1153.  -       Upload.onFileApiSend(i, e.dataTransfer.files);
  1156. 1154.  -     }
  1157. 1155.  -     if (!Upload.options[i].visibleDropbox) {
  1158. 1156.  -       hide(dropbox);
  1159. 1157.  -     }
  1160. 1158.  -     removeClass(dropbox, 'dropbox_over');
  1161. 1159.  -   });
  1162. 1160.  -   delete cur.uploadDragStarted;
  1163. 1161.  -   cancelEvent(e);
  1164. 1162.  -   return false;
  1165. 1163.  - },
  1166. 1164.  -
  1167. 1165.  - insideDropbox: function(i, e) {
  1168. 1166.  -   var el = e.target;
  1169. 1167.  -   while (el.parentNode) {
  1170. 1168.  -     if (el == Upload.dropbox[i]) return true;
  1171. 1169.  -     el = el.parentNode;
  1172. 1170.  -   }
  1173. 1171.  -   return false;
  1174. 1172.  - },
  1175. 1173.  -
  1176. 1174.  - _eof: 1};
  1177. 1175.  -
  1178. 1176.  - }
  1179. 1177.  -
  1180. 1178.  - try{stManager.done('upload.js');}catch(e){}
  1181. ------
Advertisement
Add Comment
Please, Sign In to add comment