1// Name: AjaxFileUpload.AjaxFileUpload.Control.debug.js 2// Assembly: AjaxControlToolkit 3// Version: 4.1.7.1213 4// FileVersion: 4.1.7.1213 5Type.registerNamespace("Sys.Extended.UI.AjaxFileUpload"); 6Type.registerNamespace("AjaxFileUpload"); 7 8Sys.Extended.UI.AjaxFileUpload.Control = function (element) { 9 10 Sys.Extended.UI.AjaxFileUpload.Control.initializeBase(this, [element]); 11 12 this._allowedFileTypes = null; 13 this._contextKey = null; 14 this._postBackUrl = null; 15 this._mode = 0; 16 this._serverPollingSupport = false; 17 this._throbber = null; 18 this._maximumNumberOfFiles = 10; 19 this._allowedFileTypes = ''; 20 this._chunkSize = 4096; 21 this._storeToAzure = false; 22 this._azureContainerName = ''; 23 24 this._uploadUrl = 'AjaxFileUploadHandler.axd'; 25 this._useHtml5Support = false; 26 this._elements = null; 27 this._processor = null; 28 this._filesInQueue = []; 29 this._isUploading = false; 30 this._currentFileId = null; 31 this._currentQueueIndex = 0; 32 this._canceled = false; 33}; 34 35Sys.Extended.UI.AjaxFileUpload.Control.prototype = { 36 37 initialize: function () { 38 39 var utils = new Sys.Extended.UI.AjaxFileUpload.Utils(), 40 41 id = this.get_id(), 42 43 getElement = function (name) { 44 return document.getElementById(id + name); 45 }, 46 47 elements = { 48 queueContainer: getElement('_QueueContainer'), 49 selectFileButton: getElement('_SelectFileButton'), 50 uploadOrCancelButton: getElement('_UploadOrCancelButton'), 51 fileStatusContainer: getElement('_FileStatusContainer'), 52 footer: getElement('_Footer') 53 }; 54 55 this._useHtml5Support = utils.checkHtml5BrowserSupport() && this._mode != 2; 56 57 elements.progressBar = getElement('_ProgressBar'); 58 elements.progressBarContainer = getElement('_ProgressBarContainer'); 59 60 if (this._useHtml5Support) { 61 62 elements.inputFile = getElement('_Html5InputFile'); 63 elements.dropZone = getElement('_Html5DropZone'); 64 } else { 65 66 elements.inputFile = getElement('_InputFileElement'); 67 } 68 this._elements = elements; 69 70 var processor = this._useHtml5Support 71 ? new Sys.Extended.UI.AjaxFileUpload.ProcessorHtml5(this, elements) 72 : new Sys.Extended.UI.AjaxFileUpload.Processor(this, elements); 73 74 this.setDefaultElementsLayout(elements); 75 76 this.attachEvents(elements); 77 78 processor.initialize(); 79 80 this._processor = processor; 81 Sys.Extended.UI.AjaxFileUpload.Control.callBaseMethod(this, "initialize"); 82 }, 83 84 dispose: function () { 85 Sys.Extended.UI.AjaxFileUpload.Control.callBaseMethod(this, "dispose"); 86 }, 87 88 setDefaultElementsLayout: function (elements) { 89 90 $common.setVisible(elements.inputFile, true); 91 $common.setVisible(elements.uploadOrCancelButton, false); 92 $common.setVisible(elements.fileStatusContainer, true); 93 94 elements.selectFileButton.innerHTML = Sys.Extended.UI.Resources.AjaxFileUpload_SelectFile; 95 elements.uploadOrCancelButton.innerHTML = Sys.Extended.UI.Resources.AjaxFileUpload_Upload; 96 97 this.setStatusMessage(Sys.Extended.UI.Resources.AjaxFileUpload_SelectFileToUpload); 98 }, 99 100 attachEvents: function (elements) { 101 this.onUploadOrCancelButtonClicked$delegate = Function.createDelegate(this, this.onUploadOrCancelButtonClickedHandler); 102 $addHandlers(elements.uploadOrCancelButton, { 'click': this.onUploadOrCancelButtonClicked$delegate }); 103 }, 104 105 onUploadOrCancelButtonClickedHandler: function (e) { 106 /// <summary> 107 /// Event handler for click event on upload button. Upload button will act as a toggle driven by _isUploading field, for Upload and Cancel action. 108 /// if _isUploading set to true, it indicates that this button will act as Cancel, otherwise is Upload. 109 /// </summary> 110 /// <param name="e"></param> 111 112 var files = this._filesInQueue; 113 if (!files.length) { 114 alert(Sys.Extended.UI.Resources.AjaxFileUpload_SelectFileToUpload); 115 return; 116 } 117 118 var uploaded = 0; 119 for (var i = 0; i < files.length; i++) { 120 if (files[i]._isUploaded) 121 uploaded++; 122 } 123 124 if (uploaded == files.length) { 125 alert(Sys.Extended.UI.Resources.AjaxFileUpload_AllFilesUploaded); 126 return; 127 } 128 129 this.enableControls(this._isUploading); 130 131 this._isUploading = !this._isUploading; 132 if (this._isUploading) { 133 this._canceled = false; 134 135 var xhr = new XMLHttpRequest(), 136 self = this; 137 138 xhr.open("POST", '?contextKey=' + this._contextKey 139 + "&start=1&queue=" + this._filesInQueue.length); 140 xhr.onreadystatechange = function () { 141 if (xhr.readyState == 4) { 142 if (xhr.status == 200) { 143 self._processor.startUpload(); 144 self.raiseUploadStart(Sys.Serialization.JavaScriptSerializer.deserialize(xhr.responseText)); 145 } else { 146 self.raiseUploadError(xhr); 147 throw "Failed to starting upload."; 148 } 149 } 150 }; 151 xhr.send(null); 152 153 } else { 154 this._canceled = true; 155 this._processor.cancelUpload(); 156 157 for (var i = 0; i < files.length; i++) { 158 if (!files[i]._isUploaded) { 159 files[i]._isUploading = false; 160 } 161 } 162 } 163 }, 164 165 enableControls: function (enable) { 166 /// <summary> 167 /// If set to true, it will set control state to be enable (ready to upload), 168 /// otherwise control will disable and button state turns to Cancel button. 169 /// </summary> 170 /// <param name="enable"></param> 171 172 var btn = this._elements.uploadOrCancelButton; 173 $common.setText(btn, enable ? Sys.Extended.UI.Resources.AjaxFileUpload_Upload : Sys.Extended.UI.Resources.AjaxFileUpload_Cancel); 174 btn.setAttribute('class', enable ? 'ajax__fileupload_uploadbutton' : 'ajax_fileupload_cancelbutton'); 175 176 $common.setVisible(this._elements.inputFile, enable); 177 178 if (this._useHtml5Support) { 179 this._elements.dropZone.disable = !enable; 180 this._elements.inputFile.disable = !enable; 181 } 182 }, 183 184 done: function () { 185 /// <summary> 186 /// Call this method when all files has been uploaded. 187 /// This method will reset states of control. 188 /// </summary> 189 190 this._isUploading = false; 191 this.enableControls(true); 192 this.setStatusMessage(Sys.Extended.UI.Resources.AjaxFileUpload_AllFilesUploaded + " " + Sys.Extended.UI.Resources.AjaxFileUpload_SelectFileToUpload); 193 $common.setVisible(this._elements.uploadOrCancelButton, false); 194 195 var xhr = new XMLHttpRequest(), 196 self = this, 197 currentFile = this._filesInQueue[this._currentQueueIndex - 1]; 198 199 xhr.open("POST", '?contextKey=' + this._contextKey 200 + "&complete=1&queue=" + this._filesInQueue.length 201 + "&uploaded=" + (this._currentQueueIndex - (currentFile._isUploaded ? 0 : 1)) 202 + "&reason=" + (this._canceled ? "cancel" : "done")); 203 204 xhr.onreadystatechange = function () { 205 if (xhr.readyState == 4) { 206 if (xhr.status == 200) { 207 self.raiseUploadCompleteAll(Sys.Serialization.JavaScriptSerializer.deserialize(xhr.responseText)); 208 } else { 209 self.raiseUploadError(xhr); 210 throw "Failed to completing upload."; 211 } 212 } 213 }; 214 xhr.send(null); 215 216 this._filesInQueue = []; 217 this._currentQueueIndex = 0; 218 }, 219 220 removeFileFromQueueHandler: function (e) { 221 /// <summary> 222 /// Event handler of file item when user clicks remove button. 223 /// </summary> 224 /// <param name="e">FileItem to be removed.</param> 225 226 if (!e || e._isUploading) 227 return; 228 229 Array.remove(this._filesInQueue, e); 230 231 e.removeNodeFrom(this._elements.queueContainer); 232 233 if (!this._elements.queueContainer.hasChildNodes()) { 234 $common.setVisible(this._elements.queueContainer, false); 235 $common.setVisible(this._elements.uploadOrCancelButton, false); 236 } 237 238 this._showFilesCount(); 239 }, 240 241 addFileToQueue: function (item) { 242 /// <summary> 243 /// Processor will call this method to add selected file to queue. 244 /// Will return true if file item successfully added, otherwise are false. 245 /// </summary> 246 /// <param name="inputElementValue">Value from input file element</param> 247 248 var max = this.get_maximumNumberOfFiles(); 249 if (max > 0 && this._filesInQueue.length >= max) { 250 alert(Sys.Extended.UI.Resources.AjaxFileUpload_MaxNumberOfFilesExceeded); 251 return false; 252 } 253 254 var fileItem = new Sys.Extended.UI.AjaxFileUpload.Item(this.get_id(), item, 255 Function.createDelegate(this, this.removeFileFromQueueHandler)); 256 257 fileItem.appendNodeTo(this._elements.queueContainer); 258 259 fileItem.setStatus('pending', Sys.Extended.UI.Resources.AjaxFileUpload_Pending); 260 261 $common.setVisible(this._elements.queueContainer, true); 262 $common.setVisible(this._elements.uploadOrCancelButton, true); 263 264 this._filesInQueue.push(fileItem); 265 266 this._showFilesCount(); 267 268 return true; 269 }, 270 271 _showFilesCount: function () { 272 /// <summary> 273 /// This will show number of files in queue or message to select file(s) when there is no file in queue. 274 /// </summary> 275 276 var empty = (this._filesInQueue.length == 0); 277 278 this.setStatusMessage(empty 279 ? Sys.Extended.UI.Resources.AjaxFileUpload_SelectFileToUpload 280 : String.format(Sys.Extended.UI.Resources.AjaxFileUpload_FileInQueue, this._filesInQueue.length.toString())); 281 }, 282 283 284 fileTypeIsValid: function (fileType) { 285 /// <summary> 286 /// Check whether file type is allowed to be uploaded by checking it against <code>AllowedFileTypes</code> property 287 /// </summary> 288 /// <param name="fileType"></param> 289 /// <returns type=""></returns> 290 291 if (!this._allowedFileTypes) 292 return true; 293 294 var allowedFileTypes = this._allowedFileTypes.split(','); 295 296 for (var i = 0; i < allowedFileTypes.length; i++) { 297 var ftype = allowedFileTypes[i];
298 if (fileType.toLocaleLowerCase() == ftype.toLocaleLowerCase()) 299 return true; 300 } 301 302 return false; 303 }, 304 305 confirmFileIsInvalid: function (fileItem) { 306 /// <summary> 307 /// Send alert to user that file type is not acceptable. Processor uses this method after validation. 308 /// </summary> 309 /// <param name="fileItem"></param> 310 311 var utils = new Sys.Extended.UI.AjaxFileUpload.Utils(); 312 alert(String.format(Sys.Extended.UI.Resources.AjaxFileUpload_WrongFileType, utils.getFileName(fileItem.value), fileItem.type)); 313 }, 314 315 doneAndUploadNextFile: function (fileItem) { 316 /// <summary> 317 /// Mark fileItem as uploaded, and upload next file in queue. 318 /// </summary> 319 /// <param name="fileItem">Uploaded File</param> 320 321 var xhr = new XMLHttpRequest(), 322 self = this; 323 324 xhr.open("POST", "?contextKey="+ this._contextKey +"&done=1&guid=" + fileItem._id, true); 325 xhr.onreadystatechange = function (e) { 326 if (xhr.readyState == 4) { 327 if (xhr.status == 200) { 328 329 self.raiseUploadComplete(Sys.Serialization.JavaScriptSerializer.deserialize(xhr.responseText)); 330 331 self._processor.startUpload(); 332 333 } else { 334 self.setFileStatus(fileItem, 'error', Sys.Extended.UI.Resources.AjaxFileUpload_error); 335 self.raiseUploadError(xhr); 336 throw "error raising upload complete event and start new upload"; 337 } 338 } 339 }; 340 xhr.send(null); 341 }, 342 343 cancelUpload: function () { 344 345 var fileItem = this.getCurrentFileItem(); 346 347 fileItem._isUploaded = false; 348 fileItem._isUploading = false; 349 350 this.setStatusMessage(Sys.Extended.UI.Resources.AjaxFileUpload_UploadCanceled); 351 352 for (var i = 0; i < this._filesInQueue.length; i++) { 353 var file = this._filesInQueue[i]; 354 if (!file._isUploaded) { 355 this.setFileStatus(file, 'cancelled', Sys.Extended.UI.Resources.AjaxFileUpload_Canceled); 356 } 357 } 358 }, 359 360 setAsUploading: function (fileItem) { 361 /// <summary> 362 /// Set file item status is uploading. 363 /// </summary> 364 /// <param name="fileItem"></param> 365 366 fileItem._isUploading = true; 367 fileItem._isUploaded = false; 368 369 this._currentQueueIndex = Array.indexOf(this._filesInQueue, fileItem) + 1; 370 371 this.setFileStatus(fileItem, 'uploading', Sys.Extended.UI.Resources.AjaxFileUpload_Uploading); 372 this.setStatusMessage('Uploading ' + this._currentQueueIndex + ' of ' + this._filesInQueue.length + ' file(s)'); 373 }, 374 375 setFileStatus: function (fileItem, fileStatusText, text) { 376 /// <summary> 377 /// Set file item status 378 /// </summary> 379 /// <param name="fileItem">file item or id</param> 380 /// <param name="fileStatusText">status text</param> 381 /// <param name="text">status resource</param> 382 383 if (typeof (fileItem) === "string") 384 fileItem = this.getFileItem(fileItem); 385 if (fileItem) 386 fileItem.setStatus(fileStatusText, text); 387 }, 388 389 setStatusMessage: function (msg) { 390 /// <summary> 391 /// Set status message. 392 /// </summary> 393 /// <param name="msg"></param> 394 this._elements.fileStatusContainer.innerHTML = msg; 395 }, 396 397 setPercent: function (percent) { 398 /// <summary> 399 /// Set percentage of progress bar. 400 /// </summary> 401 /// <param name="percent">percentage</param> 402 var progressBar = this._elements.progressBar; 403 if (percent <= 0) 404 percent = "0"; 405 else if (percent >= 100) 406 percent = "100"; 407 408 progressBar.style.width = percent + '%'; 409 $common.setText(progressBar, String.format(Sys.Extended.UI.Resources.AjaxFileUpload_UploadedPercentage, percent)); 410 }, 411 412 get_allowedFileTypes: function () { 413 return this._allowedFileTypes; 414 }, 415 set_allowedFileTypes: function (value) { 416 this._allowedFileTypes = value; 417 }, 418 419 get_contextKey: function () { 420 return this._contextKey; 421 }, 422 set_contextKey: function (value) { 423 this._contextKey = value; 424 }, 425 426 get_postBackUrl: function () { 427 return this._postBackUrl; 428 }, 429 set_postBackUrl: function (value) { 430 this._postBackUrl = value; 431 }, 432 433 get_mode: function () { 434 return this._mode; 435 }, 436 set_mode: function (value) { 437 this._mode = value; 438 }, 439 440 get_serverPollingSupport: function () { 441 return this._serverPollingSupport; 442 }, 443 set_serverPollingSupport: function (value) { 444 this._serverPollingSupport = value; 445 }, 446 447 get_throbber: function () { 448 return this._throbber; 449 }, 450 set_throbber: function (value) { 451 this._throbber = value; 452 }, 453 454 get_maximumNumberOfFiles: function () { 455 return this._maximumNumberOfFiles; 456 }, 457 set_maximumNumberOfFiles: function (value) { 458 this._maximumNumberOfFiles = value; 459 }, 460 461 get_chunkSize: function () { 462 return this._chunkSize; 463 }, 464 set_chunkSize: function (value) { 465 this._chunkSize = value; 466 }, 467 468 get_storeToAzure: function () { 469 return this._storeToAzure; 470 }, 471 set_storeToAzure: function (value) { 472 this._storeToAzure = value; 473 }, 474 475 get_azureContainerName: function () { 476 return this._azureContainerName; 477 }, 478 set_azureContainerName: function (value) { 479 this._azureContainerName = value; 480 }, 481 482 add_uploadStart: function (handler) { 483 this.get_events().addHandler("uploadStart", handler); 484 }, 485 remove_uploadStart: function (handler) { 486 this.get_events().removeHandler("uploadStart", handler); 487 }, 488 489 add_uploadComplete: function (handler) { 490 this.get_events().addHandler("uploadComplete", handler); 491 }, 492 remove_uploadComplete: function (handler) { 493 this.get_events().removeHandler("uploadComplete", handler); 494 }, 495 496 add_uploadCompleteAll: function (handler) { 497 this.get_events().addHandler("uploadCompleteAll", handler); 498 }, 499 remove_uploadCompleteAll: function (handler) { 500 this.get_events().removeHandler("uploadCompleteAll", handler); 501 }, 502 503 raiseUploadStart: function(e) { 504 var eh = this.get_events().getHandler("uploadStart"); 505 if (eh) { 506 var eventArgs = new Sys.Extended.UI.AjaxFileUploadStartEventArgs(e.FilesInQueue, e.ServerArguments); 507 eh(this, eventArgs); 508 } 509 }, 510 511 raiseUploadComplete: function (e) { 512 /// <summary> 513 /// This method called once file is succesfully uploaded. 514 /// </summary> 515 /// <param name="e">Uploaded file information</param> 516 517 var fileItem = this.getCurrentFileItem(); 518 519 if (!fileItem || !e || e.FileId !== fileItem._id) 520 throw "Invalid finalizing upload server response."; 521 522 this.setFileStatus(fileItem, 'uploaded', Sys.Extended.UI.Resources.AjaxFileUpload_Uploaded); 523 this.setStatusMessage('Uploaded ' + this._currentQueueIndex + ' of ' + this._filesInQueue.length + ' file(s)'); 524 525 fileItem._isUploaded = true; 526 fileItem._isUploading = false; 527 fileItem.hide(); 528 529 var eh = this.get_events().getHandler("uploadComplete"); 530 if (eh) { 531 var fileIndex = Array.indexOf(this._filesInQueue, fileItem), 532 eventArgs = new Sys.Extended.UI.AjaxFileUploadEventArgs(e.FileId, "Success", e.FileName, 533 e.FileSize, e.ContentType, 534 e.PostedUrl, fileIndex, 535 this._filesInQueue.length); 536 eh(this, eventArgs); 537 } 538 }, 539 540 raiseUploadCompleteAll: function(e) { 541 var eh = this.get_events().getHandler("uploadCompleteAll"); 542 if (eh) { 543 var eventArgs = new Sys.Extended.UI.AjaxFileUploadCompleteAllEventArgs(e.FilesInQueue, e.FilesUploaded, e.Reason, e.ServerArguments); 544 eh(this, eventArgs); 545 } 546 }, 547 548 add_uploadError: function (handler) { 549 this.get_events().addHandler("uploadError", handler); 550 }, 551 remove_uploadError: function (handler) { 552 this.get_events().removeHandler("uploadError", handler); 553 }, 554 raiseUploadError: function (e) { 555 556 var eh = this.get_events().getHandler("uploadError"); 557 if (eh) { 558 eh(this, e); 559 } 560 561 this._canceled = false; 562 this._isUploading = false; 563 this.enableControls(true); 564 }, 565 566 getCurrentFileItem: function () { 567 /// <summary> 568 /// Get file item based on current file id. 569 /// </summary> 570 /// <returns type=""></returns> 571 return this.getFileItem(this._currentFileId); 572 }, 573 574 getNextFile: function () { 575 /// <summary> 576 /// Get next file in queue for upload. 577 /// </summary> 578 /// <returns type="">Will returns null if all files has been uploaded.</returns> 579 if (!this._isUploading) 580 return null; 581 582 for (var i = 0; i < this._filesInQueue.length; i++) { 583 var file = this._filesInQueue[i]; 584 if (!file._isUploaded) { 585 return file; 586 } 587 } 588 589 return null; 590 }, 591 592 getFileItem: function (id) { 593 /// <summary> 594 /// Get file item based on id. 595 /// </summary> 596 /// <param name="id">id of file item to find.</param> 597 /// <returns type="">File Item</returns> 598 for (var i = 0; i < this._filesInQueue.length; i++) { 599 var file = this._filesInQueue[i]; 600 if (file._id === id) { 601 return file; 602 } 603 } 604 605 return null; 606 } 607}; 608 609Sys.Extended.UI.AjaxFileUpload.Control.registerClass("Sys.Extended.UI.AjaxFileUpload.Control", Sys.Extended.UI.ControlBase);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.