{"version":3,"sources":["Scripts/haikom.slickupload.js"],"names":["kw","window","value","_components","_hasWindowLoaded","_initFunctionList","push","isLicensed","Error","handleLicense","_registerInit","initFunction","splice","debug","log","createLog","verboseLog","dropZoneWindow","_frameLoadedHandlers","_completionActions","_licenseHandlerUrl","UploadState","Initializing","Uploading","Completing","Complete","UploadErrorType","None","Cancelled","Other","defaultFileSizeFormatter","bytes","isFinite","suffix","i","length","decimalCount","Math","max","round","toString","toFixed","defaultPercentFormatter","percent","numericPercent","parseFloat","min","defaultTimeFormatter","seconds","hours","floor","minutes","defaultFileValidationMessageFormatter","file","fileList","message","get_IsExtensionValid","get_InvalidExtensionMessage","get_IsSizeValid","get_InvalidFileSizeMessage","_uploadFrameLoaded","data","setTimeout","componentConstructor","component","settings","options","events","isElementRequired","elementClass","extend","assert","id","isDOMElement","element","el","document","getElementById","addClass","addGetters","oldComponent","_dispose","addEventAdders","connectEvents","root","arguments","arg","key","object","name","substr","toUpperCase","dataKey","handler","isInternal","mergeComponent","dest","source","filter","toLowerCase","event","eventFunction","eval","resolveComponent","type","typeName","isRequired","resolveElement","getXmlReq","XMLHttpRequest","progIds","constructor","ActiveXObject","ex","existingBrands","licenseData","brand","parentNode","removeChild","brandLocation","version","createElement","style","cssText","innerHTML","body","appendChild","FileSelector","brandHTML","brandUrl","support","folderSelection","get_FolderElement","get_Element","parent","lastChild","insertBefore","nextSibling","isMouseEventSupported","eventName","isSupported","setAttribute","ua","navigator","userAgent","browserMatch","exec","test","browser","browserVersion","browserMinorVersion","parts","split","slice","join","androidMatch","androidVersion","xhr","fileInput","isSupportedBrowser","disabled","isSkinnable","display","filters","webkitNotChrome","indexOf","supportMatrix","fileInputMultiple","platform","fileInputTabbable","mouseEnterLeave","xmlHttpRequest","xmlHttpRequestInSubmit","html5Upload","FormData","cors","XDomainRequest","dragDrop","console","dir","argArray","Date","bind","ctx","captureEvents","forceDirectWire","wrapper","e","x","call","addEventListener","attachEvent","original","unbind","removeEventListener","detachEvent","getComputedStyle","currentStyle","defaultView","styles","showElement","currentDisplay","withinElement","relatedTarget","windowSize","sizeWindow","w","h","innerWidth","innerHeight","sizeDoc","documentElement","clientWidth","clientHeight","width","height","objectSize","obj","size","nodeType","tagName","splitClasses","classes","className","removeClass","arr","item","trim","replace","queryStringSerialize","o","s","k","encodeURIComponent","hexChars","generateGuid","r","uuid","random","list","filterFunction","filteredList","callHandlers","args","apply","addIFrame","src","iframe","addIFrameInternal","undefined","frames","isIFrameError","urlRoot","isError","frameLocation","location","pathname","search","getIsLoaded","isLoaded","doc","contentWindow","contentDocument","readyState","childNodes","connectTemplate","templateElements","eachElementFunction","all","getElementsByTagName","childEl","templateSource","j","kw_TemplateSource","updateTemplate","templateValueFunction","File","fileUpdatedHandlers","fileSelector","fileObject","extension","lastModified","isErrored","isCancelled","isExtensionValid","isSizeValid","isValid","status","this","get_Id","_set_Validation","_set_Status","isLastCalculateSize","contentLength","_validateFile","_set_IsCancelled","getFileName","path","pos","lastIndexOf","getExtension","fileName","files","fileSize","lastModifiedDate","self","fileSelectorImpl","selectedFiles","uploadBoxIdCounter","fileAddingHandlers","fileAddedHandlers","fileValidatedHandlers","fileRemovedHandlers","unskinnedElement","unsupportedElement","folderElement","uploadConnector","dropZone","maxFiles","maxFileSize","allowZeroLengthFiles","validExtensions","isSkinned","showDropZoneOnDocumentDragOver","htmlFileSelector","currentInput","onChange","validity","valid","onchangehandler","processFiles","updateHover","sourceIdSet","loopTest","executeIfIsFile","get_FileSelector","add_File","ensureAddBoxIfLessThanMaxFiles","codeBlock","executeNow","_onDrop","_onFileRemoved","setupFileInput","input","hideFocus","offsetWidth","offsetHeight","tabIndex","multiple","keyCode","charCode","onMouseOut","onMouseOver","isOverSelector","selectFolder","webkitdirectory","click","removeAttribute","inputs","internalAddedHandlers","externalAddedHandlers","_add_File","get_Files","clear","remove_File","_remove_File","skipValidationEvent","get_Size","get_Name","ext","onBeforeSessionEnd","UploadConnector","position","overflow","direction","replaceChild","DropZoneManager","registerDropZone","add_OnBeforeSessionEnd","createTextNode","FileList","fileElements","templateElement","invalidFileSizeMessage","invalidExtensionMessage","fileSizeFormatter","fileValidationMessageFormatter","percentFormatter","updateItem","kw_TemplateElements","get_Status","uploadState","get_UploadConnector","state","isRemovable","get_IsCancelled","errorType","parsedPosition","parsedContentLength","percentComplete","onFileAdded","cloneNode","idPrefix","get_Extension","add_OnFileUpdated","onFileUpdated","onFileRemoved","getItemElementById","add_OnFileAdded","add_OnFileRemoved","UploadProgressDisplay","timeFormatter","showDuringUpload","hideAfterUpload","updateDisplay","currentFileName","currentFileIndex","fileCount","speedText","totalSpeed","timeRemaining","parsedPercentComplete","onSessionStarted","onSessionProgress","onSessionEnded","add_OnUploadSessionStarted","add_OnUploadSessionProgress","add_OnUploadSessionEnded","uploadConnectorImpl","uploadThreadTimeout","originalOnSubmit","submittedElement","uploadSessionIdElement","uploadErrorTypeElement","sourceConnectorIdElement","failedRequestsElement","cancelledRequests","cancelledRequestsElement","completionIframeElement","uploadDataElement","isCompleting","isManuallyStartedUpload","allowPartialError","uploadHandlerUrl","completeHandlerUrl","documentDomain","uploadSessionId","uploadForm","autoUploadOnSubmit","autoUploadTriggerIdList","autoCompleteAfterLastFile","confirmNavigateDuringUploadMessage","uploadProfile","completionMethod","completionBody","completionContentType","pollInterval","pollTimeout","uploadTimeout","validationGroup","timeoutDoubleOnResponse","hasDoubledTimeout","postbackFunction","concurrentMaxFiles","beforeSessionStartHandlers","uploadSessionStartedHandlers","uploadFileStartedHandlers","uploadFileEndedHandlers","uploadSessionProgressHandlers","beforeSessionEndHandlers","uploadSessionEndedHandlers","set_CompletionBody","set_Data","html4UploadConnector","uploadFile","uploadUrl","sourceId","targetId","uploadFrame","form","addForm","pollProgress","dataElement","get_FileObject","submit","heartbeatCheck","getIsUploadError","action","disposeFile","progressFrame","url","enctype","encoding","method","target","html5UploadConnector","onUploadProgress","loaded","total","totalSize","lastProgressReceiveDate","getTime","onRequestProgressInternal","onUploadError","fileData","uploadXhr","upload","onReadyStateChange","open","setRequestHeader","formData","append","send","abort","responseText","uploadThread","clearTimeout","hasWork","uploadingFileCount","lastProgressSendDate","now","lastActionDate","firstProgressSendDate","cancelProgressRequest","startDate","isLastRetry","executeProgressRequest","getUrl","complete","onSessionProgressInternal","isCalculateSize","handlerType","isFinalRequest","currentStatus","newProgressException","progressException","alert","errorMessage","onSessionStatusUpdate","sanitizeStatus","elapsed","parsedTimeRemaining","progressXhr","isBusy","onProgressRecieved","onFormSubmitted","updatePanelId","Sys","WebForms","PageRequestManager","triggerPanelId","getInstance","_postBackSettings","panelID","ret","start","validationCallbacks","preventDefault","returnValue","wireAutoUploadOnSubmit","Array","add","_onSubmitStatements","Mvc","AsyncForm","onsubmit","elements","isWireable","onElementSubmitted","__doPostBack","originalDoPostBack","eventTarget","eventArgument","theForm","href","invokedByAutoUploadOnSubmit","Page_ClientValidate","cancel","isAutoComplete","hasSuccessfulFiles","executeUploadCompleteHandler","executeUploadCompletePostBack","failedRequests","remove","submitButton","submitFunction","wasDisabled","nodeName","match","onclick","decodeURI","completionData","fileListList","executeCompleteAction","onUploadCompleteHandlerReadyStateChange","onBeforeUnload","domain","uploadRequestId","SlickUpload","uploadProgressDisplay","mergeFilter","underScorePos","zoneElements","leaveTimeout","areZonesVisible","isValidDrag","dt","types","onDocumentDragEnter","dataTransfer","setZonesVisible","onDocumentDragOver","dropEffect","stopPropagation","resetLeaveTimeout","onDocumentDragLeave","elementFromPoint","clientX","clientY","isOutsideBody","onZoneDragOver","effectAllowed","onZoneDragEnter","onZoneDragLeave","onZoneDrop","isVisible","_showDropZoneOnDocumentDragOver","dropTarget","zoneDocument","zIndex","cancelDropFunction","zoneBody","init","_kwInit","lastCount","interval","setInterval","count","clearInterval","Browser","WebKit","agent","Application","notifyScriptLoaded"],"mappings":"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","file":"slickupload.js","sourcesContent":["//\r\n// Modified SlickUpload JavaScript file. For HaiKom use only.\r\n//\r\n// IMPORTANT! DO NOT REPLACE THIS FILE BEFORE THE MODIFICATIONS ARE PRESENT IN THE NEW FILE!\r\n//\r\n// Modifications:\r\n// 2012-09-06:\t\tAdded validationGroup setting\r\n// 2014-06-10:\t\tChanged maxFiles to support unlimited number of files instead of maximum 100\r\n//\r\n(function () {\r\n\t// --- Component registry\r\n\tvar kw = window.kw || function (value) {\r\n\t\tif (typeof value === \"string\") {\r\n\t\t\treturn kw._components[value];\r\n\t\t} else if (typeof value === \"function\") {\r\n\t\t\tif (kw._hasWindowLoaded) value();\r\n\t\t\telse kw._initFunctionList.push(value);\r\n\t\t} else if (value && value.isLicensed !== null) {\r\n\t\t\thandleLicense(value);\r\n\t\t} else {\r\n\t\t\tthrow new Error(\"Invalid value argument type. Must be a string (to get a component) or a function (to call on load).\");\r\n\t\t}\r\n\t};\r\n\r\n\tkw._registerInit = function (initFunction) {\r\n\t\tif (typeof initFunction === \"function\") {\r\n\t\t\tif (kw._hasWindowLoaded) initFunction();\r\n\t\t\telse kw._initFunctionList.splice(0, 0, initFunction);\r\n\t\t} else {\r\n\t\t\tthrow new Error(\"Invalid value argument type. Must be a function.\");\r\n\t\t}\r\n\t};\r\n\r\n\t// --- Globals\r\n\tkw.debug = false;\r\n\tkw.log = [];\r\n\tkw.createLog = false;\r\n\tkw.verboseLog = false;\r\n\tkw.dropZoneWindow = window;\r\n\r\n\tkw._components = kw._components || {};\r\n\tkw._hasWindowLoaded = kw._hasWindowLoaded || false;\r\n\tkw._initFunctionList = kw._initFunctionList || [];\r\n\tkw._frameLoadedHandlers = kw._frameLoadedHandlers || [];\r\n\tkw._completionActions = kw._completionActions || [];\r\n\tkw._licenseHandlerUrl = null;\r\n\r\n\t// TODO: make case insensitive\r\n\tkw.UploadState = {\r\n\t\tInitializing: \"Initializing\",\r\n\t\tUploading: \"Uploading\",\r\n\t\tCompleting: \"Completing\",\r\n\t\tComplete: \"Complete\",\r\n\t\tError: \"Error\"\r\n\t};\r\n\r\n\tkw.UploadErrorType = {\r\n\t\tNone: \"None\",\r\n\t\tCancelled: \"Cancelled\",\r\n\t\tOther: \"Other\"\r\n\t};\r\n\r\n\t// --- Formatters\r\n\tkw.defaultFileSizeFormatter = function (bytes) {\r\n\t\tif (bytes !== null && isFinite(bytes) && bytes >= 0) {\r\n\t\t\tvar suffix = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\r\n\r\n\t\t\tfor (var i = 0; i < suffix.length && bytes / 1024 > 1; i++)\r\n\t\t\t\tbytes /= 1024;\r\n\r\n\t\t\tvar decimalCount = Math.max(0, 3 - Math.round(bytes).toString().length);\r\n\r\n\t\t\treturn bytes.toFixed(decimalCount) + \" \" + suffix[i];\r\n\t\t} else if (bytes === -1) {\r\n\t\t\treturn \"(unknown size)\";\r\n\t\t} else {\r\n\t\t\treturn null; // \"(calculating)\";\r\n\t\t}\r\n\t};\r\n\r\n\tkw.defaultPercentFormatter = function (percent) {\r\n\t\tif (percent !== null) {\r\n\t\t\tvar numericPercent = parseFloat(percent);\r\n\r\n\t\t\tif (isFinite(numericPercent)) return Math.min(Math.max(numericPercent, \"0\"), \"100\").toFixed(2) + \" %\";\r\n\t\t}\r\n\r\n\t\treturn null; // \"(calculating)\";\r\n\t};\r\n\r\n\tkw.defaultTimeFormatter = function (seconds) {\r\n\t\tseconds = parseFloat(seconds);\r\n\r\n\t\tif (isFinite(seconds) && seconds > 0) {\r\n\t\t\tvar hours = Math.floor(seconds / (60 * 60));\r\n\r\n\t\t\tseconds -= hours * (60 * 60);\r\n\r\n\t\t\tvar minutes = Math.floor(seconds / 60);\r\n\r\n\t\t\tseconds = Math.floor(seconds - minutes * 60);\r\n\r\n\t\t\tvar value = \"\";\r\n\r\n\t\t\tif (hours > 0) {\r\n\t\t\t\tvalue += hours;\r\n\r\n\t\t\t\tif (hours === 1) value += \" hour\";\r\n\t\t\t\telse value += \" hours\";\r\n\t\t\t}\r\n\r\n\t\t\tif (minutes > 0) {\r\n\t\t\t\tif (value.length > 0) {\r\n\t\t\t\t\tif (seconds > 0) value += \", \";\r\n\t\t\t\t\telse value += \" and \";\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvalue += minutes;\r\n\r\n\t\t\t\tif (minutes === 1) value += \" minute\";\r\n\t\t\t\telse value += \" minutes\";\r\n\t\t\t}\r\n\r\n\t\t\tif (seconds > 0) {\r\n\t\t\t\tif (value.length > 0) value += \" and \";\r\n\r\n\t\t\t\tvalue += seconds;\r\n\r\n\t\t\t\tif (seconds === 1) value += \" second\";\r\n\t\t\t\telse value += \" seconds\";\r\n\t\t\t}\r\n\r\n\t\t\treturn value;\r\n\t\t} else if (seconds === 0) {\r\n\t\t\treturn \"an instant\";\r\n\t\t}\r\n\r\n\t\treturn null; // \"(calculating)\";\r\n\t};\r\n\r\n\tkw.defaultFileValidationMessageFormatter = function (file, fileList) {\r\n\t\tvar message = \"\";\r\n\r\n\t\tif (!file.get_IsExtensionValid() && fileList.get_InvalidExtensionMessage()) {\r\n\t\t\tif (message.length > 0) message += \" \";\r\n\r\n\t\t\tmessage += fileList.get_InvalidExtensionMessage();\r\n\t\t}\r\n\t\tif (!file.get_IsSizeValid() && fileList.get_InvalidFileSizeMessage()) {\r\n\t\t\tif (message.length > 0) message += \" \";\r\n\r\n\t\t\tmessage += fileList.get_InvalidFileSizeMessage();\r\n\t\t}\r\n\r\n\t\tif (message.length > 0) return message;\r\n\t\telse return null;\r\n\t};\r\n\r\n\t/*kw.defaultFileTypeFormatter = function (type)\r\n\t{\r\n\t\tif (type != null)\r\n\t\t{\r\n\t\t\treturn type;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn \"(unknown)\";\r\n\t\t}\r\n\t};*/\r\n\r\n\t// --- Frame trampoline\r\n\tkw._uploadFrameLoaded = function (data) {\r\n\t\t// setTimeout required for webkit\r\n\t\twindow.setTimeout(function () {\r\n\t\t\tfor (var i = 0; i < kw._frameLoadedHandlers.length; i++)\r\n\t\t\t\tkw._frameLoadedHandlers[i](data);\r\n\t\t}, 1);\r\n\t};\r\n\r\n\t// --- Generic component constructor\r\n\tvar componentConstructor = function (component, settings, options, events, isElementRequired, elementClass) {\r\n\t\tif (settings && options) extend(settings, options);\r\n\r\n\t\t//component.uniqueId = settings.uniqueId = Math.floor(Math.random() * 1000);\r\n\r\n\t\tassert(!settings.id || typeof settings.id === \"string\", \"id must be a string.\");\r\n\r\n\t\tif (isDOMElement(settings.element) && !settings.id) {\r\n\t\t\tif (settings.element.id && typeof settings.element.id === \"string\" && settings.element.id.length > 0) settings.id = settings.element.id;\r\n\t\t} else if (!settings.element && settings.id) {\r\n\t\t\tvar el = document.getElementById(settings.id);\r\n\r\n\t\t\tif (isElementRequired) assert(isDOMElement(el), \"id '\" + settings.id + \"' must resolve to a valid element.\");\r\n\r\n\t\t\tif (el) settings.element = el;\r\n\t\t} else if (isElementRequired) {\r\n\t\t\tassert(isDOMElement(el), \"element is required.\");\r\n\t\t}\r\n\r\n\t\tif (settings.element && elementClass) addClass(settings.element, elementClass);\r\n\r\n\t\tif (settings) {\r\n\t\t\taddGetters(component, settings);\r\n\r\n\t\t\tif (settings.id) {\r\n\t\t\t\tvar oldComponent = kw._components[settings.id];\r\n\r\n\t\t\t\tif (oldComponent && oldComponent._dispose) oldComponent._dispose();\r\n\r\n\t\t\t\tkw._components[settings.id] = component;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (events) {\r\n\t\t\taddEventAdders(component, events);\r\n\r\n\t\t\tif (settings) connectEvents(events, settings);\r\n\t\t}\r\n\t};\r\n\r\n\tvar extend = function (root) {\r\n\t\tfor (var i = 0; i < arguments.length; i++) {\r\n\t\t\tvar arg = arguments[i];\r\n\r\n\t\t\tif (arg) {\r\n\t\t\t\tfor (var key in arg)\r\n\t\t\t\t\troot[key] = arg[key];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn root;\r\n\t};\r\n\r\n\tvar addGetters = function (object, settings) {\r\n\t\tfor (var key in settings) {\r\n\t\t\tvar name = key.substr(0, 1).toUpperCase() + key.substr(1);\r\n\r\n\t\t\t// TODO: figure out a better way of doing this\r\n\t\t\tif (name !== \"Data\") {\r\n\t\t\t\t(function (key, name) {\r\n\t\t\t\t\tobject[\"get_\" + name] = function () {\r\n\t\t\t\t\t\treturn settings[key];\r\n\t\t\t\t\t};\r\n\t\t\t\t})(key, name);\r\n\t\t\t} else {\r\n\t\t\t\t(function (key, name) {\r\n\t\t\t\t\tobject[\"get_\" + name] = function (dataKey) {\r\n\t\t\t\t\t\treturn settings[key][dataKey];\r\n\t\t\t\t\t};\r\n\t\t\t\t})(key, name);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tvar addEventAdders = function (object, events) {\r\n\t\tfor (var key in events) {\r\n\t\t\tvar name = key.substr(0, 1).toUpperCase() + key.substr(1, key.length - 9);\r\n\r\n\t\t\t(function (key, name) {\r\n\t\t\t\tobject[\"add_On\" + name] = function (handler, isInternal) {\r\n\t\t\t\t\thandler.isInternal = isInternal;\r\n\r\n\t\t\t\t\tif (isInternal) events[key].splice(0, 0, handler);\r\n\t\t\t\t\telse events[key].push(handler);\r\n\t\t\t\t};\r\n\t\t\t})(key, name);\r\n\t\t}\r\n\t};\r\n\r\n\tvar mergeComponent = function (dest, source, filter) {\r\n\t\tfor (var key in source) {\r\n\t\t\tif (typeof source[key] === \"function\") {\r\n\t\t\t\tif (!dest[key] && filter && filter(key)) dest[key] = source[key];\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tvar connectEvents = function (events, settings) {\r\n\t\tfor (var key in settings) {\r\n\t\t\tif (key.length > 4) {\r\n\t\t\t\tvar name = key.substr(2, 1).toLowerCase() + key.substr(3) + \"Handlers\";\r\n\t\t\t\tvar event = events[name];\r\n\r\n\t\t\t\tif (event) {\r\n\t\t\t\t\tvar eventFunction = settings[key];\r\n\r\n\t\t\t\t\tif (typeof eventFunction == \"string\") {\r\n\t\t\t\t\t\tif (window[eventFunction] && typeof window[eventFunction] == \"function\") {\r\n\t\t\t\t\t\t\teventFunction = window[eventFunction];\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// TODO: maybe throw exception instead?\r\n\t\t\t\t\t\t\teventFunction = (function (eventFunction) {\r\n\t\t\t\t\t\t\t\treturn function (data) {\r\n\t\t\t\t\t\t\t\t\treturn eval(eventFunction);\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t})(eventFunction);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tevent.push(eventFunction);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tvar resolveComponent = function (settings, name, type, typeName, isRequired) {\r\n\t\tvar message = null;\r\n\r\n\t\tif (typeof settings[name] == \"string\") {\r\n\t\t\tvar el = kw(settings[name]);\r\n\r\n\t\t\tif (el) settings[name] = el;\r\n\t\t\telse message = name + \" '\" + settings[name] + \"' must resolve to a valid \" + typeName + \".\";\r\n\t\t}\r\n\r\n\t\tif (!message) message = name + \" must be a \" + typeName + \".\";\r\n\r\n\t\tif (settings[name] || isRequired) assert(settings[name] instanceof type, message);\r\n\t};\r\n\r\n\tvar resolveElement = function (settings, name, isRequired) {\r\n\t\tvar message = null;\r\n\r\n\t\tif (typeof settings[name] == \"string\") {\r\n\t\t\tvar el = document.getElementById(settings[name]);\r\n\r\n\t\t\tif (isDOMElement(el)) settings[name] = el;\r\n\t\t\telse message = name + \" '\" + settings[name] + \"' must resolve to an element.\";\r\n\t\t}\r\n\r\n\t\tif (!message) message = name + \" must be an element.\";\r\n\r\n\t\tif (settings[name] || isRequired) assert(isDOMElement(settings[name]), message);\r\n\t};\r\n\r\n\tvar getXmlReq = (function () {\r\n\t\tif (window.XMLHttpRequest) {\r\n\t\t\treturn function () {\r\n\t\t\t\treturn new XMLHttpRequest();\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tvar progIds = [\"Msxml2.XMLHTTP.6.0\", \"MSXML2.XMLHTTP.3.0\", \"MSXML2.XMLHTTP\", \"Microsoft.XMLHTTP\"];\r\n\r\n\t\t\tfor (var i = 0; i < progIds.length; i++) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tvar constructor = function () {\r\n\t\t\t\t\t\treturn new ActiveXObject(progIds[i]);\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tif (constructor()) return constructor;\r\n\t\t\t\t} catch (ex) {\r\n\t\t\t\t\t// Eat it and try the next one\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn function () {\r\n\t\t\t\treturn null;\r\n\t\t\t};\r\n\t\t}\r\n\t})();\r\n\r\n\tvar existingBrands = [];\r\n\tvar licenseData = null;\r\n\r\n\t// TODO: periodically check to ensure that brand still exists\r\n\tvar handleLicense = function (data) {\r\n\t\tdata = data || licenseData;\r\n\r\n\t\tfor (var i = 0; i < existingBrands.length; i++) {\r\n\t\t\tvar brand = existingBrands[i];\r\n\r\n\t\t\tif (brand.parentNode) brand.parentNode.removeChild(brand);\r\n\t\t}\r\n\r\n\t\texistingBrands = [];\r\n\r\n\t\tif (!data || !data.isLicensed) {\r\n\t\t\tlicenseData = data;\r\n\r\n\t\t\tvar brandLocation = data ? data.brandLocation : null;\r\n\t\t\tvar version = data ? data.version : null;\r\n\r\n\t\t\tif (!version) version = \"unknown\";\r\n\r\n\t\t\tif (!brandLocation || brandLocation == \"inline\") {\r\n\t\t\t\tfor (var key in kw._components) {\r\n\t\t\t\t\tvar component = kw._components[key];\r\n\r\n\t\t\t\t\tif (component.constructor == kw.FileSelector) {\r\n\t\t\t\t\t\tvar brand = document.createElement(\"div\");\r\n\r\n\t\t\t\t\t\tbrand.style.cssText = \"background-image:url('http://krystalware.com/brandping?version=\" + version + \"');clear:both;\";\r\n\r\n\t\t\t\t\t\t//brand.style.cssText = \"background-image:url('http://krystalware.com/brandping?version=\" + version + \"');z-index:99999;background-color:#265ecf;border-top:1px solid #37b0e5;border-right:1px solid #37b0e5;position:absolute;position:fixed;right:0;bottom:0;margin:0;padding:.25em .5em .25em .5em;font-size:80%;font-family:Calibri,Verdana,Arial,sans-serif;filter:alpha(opacity=100);opacity:1;-moz-opacity:1\";\r\n\r\n\t\t\t\t\t\tvar brandHTML = \"\";\r\n\r\n\t\t\t\t\t\tif (data && data.brandUrl) brandHTML += \"
\";\r\n\t\t\t\t\t\telse brandHTML += \"Powered By SlickUpload Community Edition\";\r\n\r\n\t\t\t\t\t\tbrandHTML += \"\";\r\n\r\n\t\t\t\t\t\tbrand.innerHTML = brandHTML;\r\n\r\n\t\t\t\t\t\tvar element;\r\n\r\n\t\t\t\t\t\tif (support.folderSelection) element = component.get_FolderElement();\r\n\r\n\t\t\t\t\t\tif (!element || !element.parentNode) element = component.get_Element();\r\n\r\n\t\t\t\t\t\tvar parent = element.parentNode;\r\n\r\n\t\t\t\t\t\tif (parent) {\r\n\t\t\t\t\t\t\tif (parent.lastChild == element) parent.appendChild(element);\r\n\t\t\t\t\t\t\telse parent.insertBefore(brand, element.nextSibling);\r\n\r\n\t\t\t\t\t\t\texistingBrands.push(brand);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t/*while (element && !element.nextSibling)\r\n\t\t\t\t\t\t\telement = element.parentNode;\r\n\r\n\t\t\t\t\t\tif (element && element.nextSibling)\r\n\t\t\t\t\t\t\telement.parentNode.insertBefore(brand, element.nextSibling);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tdocument.body.appendChild(brand);*/\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (brandLocation == \"bottom-right\") {\r\n\t\t\t\tvar brand = document.createElement(\"div\");\r\n\r\n\t\t\t\tbrand.style.cssText = \"background-image:url('http://krystalware.com/brandping?version=\" + version + \"');z-index:99999;background-color:#265ecf;border-top:1px solid #37b0e5;border-right:1px solid #37b0e5;position:absolute;position:fixed;right:0;bottom:0;margin:0;padding:.25em .5em .25em .5em;font-size:80%;font-family:Calibri,Verdana,Arial,sans-serif;filter:alpha(opacity=100);opacity:1;-moz-opacity:1\";\r\n\r\n\t\t\t\tbrand.innerHTML = \"Powered By SlickUpload Community Edition\";\r\n\r\n\t\t\t\tdocument.body.appendChild(brand);\r\n\r\n\t\t\t\texistingBrands.push(brand);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t// https://github.com/kangax/iseventsupported/blob/master/isEventSupported.js\r\n\tvar isMouseEventSupported = function (eventName) {\r\n\t\tvar el = document.createElement('div');\r\n\t\teventName = 'on' + eventName;\r\n\t\tvar isSupported = (eventName in el);\r\n\t\tif (!isSupported) {\r\n\t\t\tel.setAttribute(eventName, 'return;');\r\n\t\t\tisSupported = typeof el[eventName] == 'function';\r\n\t\t}\r\n\t\tel = null;\r\n\t\treturn isSupported;\r\n\t};\r\n\r\n\tvar support = (function () {\r\n\t\tvar ua = window.navigator.userAgent.toLowerCase();\r\n\r\n\t\t// From $.browser\r\n\t\tvar browserMatch = /(webkit)[ \\/]([\\w.]+)/.exec(ua) || /(opera)(?:.*version)?[ \\/]([\\w.]+)/.exec(ua) || /(msie) ([\\w.]+)/.exec(ua) || !/compatible/.test(ua) && /(mozilla)(?:.*? rv:([\\w.]+))?/.exec(ua) || [];\r\n\r\n\t\tvar browser = browserMatch[1] || \"\",\r\n\t\t\tbrowserVersion = parseFloat(browserMatch[2]) || 0,\r\n\t\t\tbrowserMinorVersion = 0;\r\n\r\n\t\tvar parts = browserMatch[2] ? browserMatch[2].split(\".\") : [];\r\n\r\n\t\tif (parts.length > 2) browserMinorVersion = parseFloat(parts.slice(2).join(\".\")) || 0;\r\n\r\n\t\tvar androidMatch = /(android)[ ]([\\w.]+)/.exec(ua) || [];\r\n\t\tvar androidVersion = androidMatch[1] ? parseFloat(androidMatch[2]) : null;\r\n\r\n\t\tvar xhr = getXmlReq();\r\n\r\n\t\t// http://leaverou.me/2009/03/regarding-native-single-input-multiple-file-uploads/\r\n\t\tvar fileInput = document.createElement(\"input\");\r\n\r\n\t\tfileInput.type = 'file';\r\n\r\n\t\t// TODO: create iframe and see if we can target it\r\n\t\tvar isSupportedBrowser = (\"src\" in document.createElement(\"iframe\") && !fileInput.disabled && !(browser == \"webkit\" && browserVersion < 523) && (!androidVersion || androidVersion >= 2.2));\r\n\r\n\t\tvar isSkinnable = (\r\n\t\t(browser == \"msie\" && browserVersion > 5) || (browser == \"opera\" && browserVersion >= 9) || (browser == \"mozilla\" && browserVersion > 1.7) || (browser == \"webkit\" && browserVersion > 523));\r\n\r\n\t\tif (browser == \"msie\" && browserVersion < 9) {\r\n\t\t\t// Check to make sure that \"binary and script behaviors\" is enabled in IE. That is required for opacity filter to work.\r\n\t\t\ttry {\r\n\t\t\t\tfileInput.style.display = \"none\";\r\n\r\n\t\t\t\tdocument.appendChild(fileInput);\r\n\r\n\t\t\t\tvar test = fileInput.filters;\r\n\r\n\t\t\t\tdocument.removeChild(fileInput);\r\n\t\t\t} catch (ex) {\r\n\t\t\t\tisSkinnable = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// TODO: support dnd in safari\r\n\t\tvar webkitNotChrome = (browser == \"webkit\" && ua.indexOf(\"chrome\") == -1);\r\n\r\n\t\tvar supportMatrix = {\r\n\t\t\tbrowser: browser,\r\n\t\t\tbrowserVersion: browserVersion,\r\n\t\t\tbrowserMinorVersion: browserMinorVersion,\r\n\t\t\t//dragDrop: (\"draggable\" in document.createElement(\"span\")) && (\"multiple\" in fileInput) && (\"files\" in fileInput),\r\n\t\t\tisSupportedBrowser: isSupportedBrowser,\r\n\t\t\tisSkinnable: isSkinnable,\r\n\t\t\t// TODO: figure out why multiple is broken in Safari 5.1\r\n\t\t\tfileInputMultiple: (\"multiple\" in fileInput) && !(browser == \"webkit\" && window.navigator.platform.toLowerCase().indexOf(\"win\") != -1 && browserVersion == 534.5),\r\n\t\t\tfolderSelection: (\"webkitdirectory\" in fileInput),\r\n\t\t\tfileInputTabbable: ((browser == \"mozilla\" && browserVersion > 1.8) || (browser == \"webkit\" && browserVersion > 523)),\r\n\t\t\tmouseEnterLeave: (isMouseEventSupported(\"mouseenter\") && isMouseEventSupported(\"mouseleave\")),\r\n\t\t\t// TODO: implement full iframe progress for this\r\n\t\t\txmlHttpRequest: (xhr !== null),\r\n\t\t\t// TODO: see if newer versions work\r\n\t\t\txmlHttpRequestInSubmit: (browser != \"webkit\"),\r\n\t\t\thtml5Upload: ((window.FormData || (browser == \"mozilla\" && browserVersion >= 1.9 && browserMinorVersion >= 2)) ? true : false),\r\n\t\t\tcors: (xhr !== null && \"withCredentials\" in xhr) || typeof XDomainRequest !== \"undefined\"\r\n\t\t};\r\n\r\n\t\tsupportMatrix.dragDrop = supportMatrix.fileInputMultiple && (\"draggable\" in document.createElement(\"span\")) && !webkitNotChrome;\r\n\r\n\t\treturn supportMatrix;\r\n\t})();\r\n\r\n\t// TODO: is this the best way?\r\n\tkw.support = kw.support || {};\r\n\r\n\textend(kw.support, support);\r\n\r\n\t// --- Helper functions\r\n\t// debug\r\n\tvar log = function () {\r\n\t\tif (kw.debug && window.console && console.log) {\r\n\t\t\tif (console.dir && arguments.length > 1) {\r\n\t\t\t\tconsole.log(arguments);\r\n\t\t\t} else {\r\n\t\t\t\tfor (var i = 0; i < arguments.length; i++)\r\n\t\t\t\t\tconsole.log(arguments[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (kw.createLog) {\r\n\t\t\tvar argArray = [];\r\n\r\n\t\t\tfor (var i = 0; i < arguments.length; i++)\r\n\t\t\t\targArray.push(arguments[i]);\r\n\r\n\r\n\t\t\targArray.push(new Date().toString());\r\n\r\n\t\t\tkw.log.push(argArray);\r\n\t\t}\r\n\t};\r\n\r\n\tvar assert = function (test, message) {\r\n\t\tif (!test) throw new Error(message);\r\n\t};\r\n\r\n\t// event binding\r\n\tvar bind = function (source, event, ctx, handler, captureEvents, forceDirectWire) {\r\n\t\tvar wrapper = function (e) {\r\n\t\t\tvar x = handler.call(ctx, e, source);\r\n\t\t\treturn x;\r\n\t\t};\r\n\r\n\t\tif (!forceDirectWire) {\r\n\t\t\ttry {\r\n\t\t\t\tif (source.addEventListener) {\r\n\t\t\t\t\tsource.addEventListener(event, wrapper, captureEvents);\r\n\r\n\t\t\t\t\treturn wrapper;\r\n\t\t\t\t} else if (source.attachEvent) {\r\n\t\t\t\t\tsource.attachEvent(\"on\" + event, wrapper);\r\n\r\n\t\t\t\t\treturn wrapper;\r\n\t\t\t\t}\r\n\t\t\t} catch (ex) { }\r\n\t\t}\r\n\r\n\t\tvar original;\r\n\r\n\t\ttry {\r\n\t\t\toriginal = source[\"on\" + event];\r\n\t\t} catch (ex) { }\r\n\r\n\t\t// TODO: handle returns\r\n\t\t// TODO: handle unwiring\r\n\t\tif (original && !forceDirectWire) wrapper = function (e) {\r\n\t\t\toriginal(e);\r\n\t\t\twrapper(e, source);\r\n\t\t};\r\n\r\n\t\tsource[\"on\" + event] = wrapper;\r\n\t};\r\n\r\n\tvar unbind = function (source, event, handler, forceDirectWire) {\r\n\t\ttry {\r\n\t\t\tif (forceDirectWire) source[\"on\" + event] = null;\r\n\t\t\tif (source.removeEventListener) source.removeEventListener(event, handler, false);\r\n\t\t\telse if (source.detachEvent) source.detachEvent(\"on\" + event, handler);\r\n\r\n\t\t\treturn true;\r\n\t\t\t// TODO: handle old browsers wired directly\r\n\t\t} catch (e) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t};\r\n\r\n\tvar getComputedStyle = function (el, style) {\r\n\t\tif (!el || !el.style) return null;\r\n\r\n\t\tif (el.style[style]) return el.style[style];\r\n\t\tif (el.currentStyle) return el.currentStyle[style];\r\n\t\telse if (document.defaultView && document.defaultView.getComputedStyle) {\r\n\t\t\tvar styles = document.defaultView.getComputedStyle(el, null);\r\n\r\n\t\t\tif (styles) return styles[style];\r\n\t\t} else return null;\r\n\t};\r\n\r\n\tvar showElement = function (el) {\r\n\t\tif (el && el.style) {\r\n\t\t\tvar currentDisplay = getComputedStyle(el, \"display\");\r\n\r\n\t\t\tif (!currentDisplay || currentDisplay == \"none\") el.style.display = \"block\";\r\n\t\t}\r\n\t};\r\n\r\n\r\n\t// Checks if an event happened on an element within another element\r\n\t// Used in jQuery.event.special.mouseenter and mouseleave handlers\r\n\t// http://ecmascript.stchur.com/2007/03/15/mouseenter-and-mouseleave-events-for-firefox-and-other-non-ie-browsers/\r\n\tvar withinElement = function (parent, event, relatedTarget) {\r\n\t\t// Check if mouse(over|out) are still within the same parent element\r\n\t\tif (!relatedTarget) relatedTarget = event.relatedTarget;\r\n\r\n\t\t// Firefox sometimes assigns relatedTarget a XUL element\r\n\t\t// which we cannot access the parentNode property of\r\n\t\ttry {\r\n\t\t\tif (parent === relatedTarget) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\twhile (relatedTarget && relatedTarget !== parent) {\r\n\t\t\t\trelatedTarget = relatedTarget.parentNode;\r\n\t\t\t}\r\n\r\n\t\t\treturn relatedTarget === parent;\r\n\r\n\t\t\t// assuming we've left the element since we most likely mousedover a xul element\r\n\t\t} catch (e) { }\r\n\r\n\t\treturn false;\r\n\t};\r\n\r\n\t// http://www.geekdaily.net/2007/07/04/javascript-cross-browser-window-size-and-centering/\r\n\tvar windowSize = function () {\r\n\t\tvar sizeWindow = kw.dropZoneWindow;\r\n\r\n\t\tvar w = 0;\r\n\t\tvar h = 0;\r\n\r\n\t\t//IE\r\n\t\tif (!sizeWindow.innerWidth) {\r\n\t\t\tvar sizeDoc = sizeWindow.document;\r\n\r\n\t\t\t//strict mode\r\n\t\t\tif (sizeDoc.documentElement.clientWidth !== 0) {\r\n\t\t\t\tw = sizeDoc.documentElement.clientWidth;\r\n\t\t\t\th = sizeDoc.documentElement.clientHeight;\r\n\t\t\t}\r\n\t\t\t\t//quirks mode\r\n\t\t\telse {\r\n\t\t\t\tw = sizeDoc.body.clientWidth;\r\n\t\t\t\th = sizeDoc.body.clientHeight;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\t//w3c\r\n\t\telse {\r\n\t\t\tw = sizeWindow.innerWidth;\r\n\t\t\th = sizeWindow.innerHeight;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\twidth: w,\r\n\t\t\theight: h\r\n\t\t};\r\n\t};\r\n\r\n\tvar objectSize = function (obj) {\r\n\t\tvar size = 0;\r\n\t\tvar key;\r\n\r\n\t\tfor (key in obj) {\r\n\t\t\t//if (obj.hasOwnProperty(key))\r\n\t\t\tsize++;\r\n\t\t}\r\n\r\n\t\treturn size;\r\n\t};\r\n\r\n\tvar isDOMElement = function (el) {\r\n\t\treturn el && el.nodeType == 1 && el.tagName;\r\n\t};\r\n\r\n\tvar splitClasses = function (classes) {\r\n\t\tif (classes) return classes.split(/\\s+/);\r\n\t\telse return [];\r\n\t};\r\n\r\n\tvar addClass = function (el, className) {\r\n\t\tvar classes = splitClasses(el.className);\r\n\r\n\t\tif (indexOf(classes, className) == -1) classes.push(className);\r\n\r\n\t\tel.className = classes.join(\" \");\r\n\t};\r\n\r\n\tvar removeClass = function (el, className) {\r\n\t\tvar classes = splitClasses(el.className);\r\n\r\n\t\tfor (var i = classes.length; i--; i >= 0) {\r\n\t\t\tif (classes[i] == className) classes.splice(i, 1);\r\n\t\t}\r\n\r\n\t\tel.className = classes.join(\" \");\r\n\t};\r\n\r\n\tvar indexOf = function (arr, item) {\r\n\t\tfor (var i = 0; i < arr.length; i++)\r\n\t\t\tif (arr[i] == item) return i;\r\n\r\n\t\treturn -1;\r\n\t};\r\n\r\n\tvar trim = function (value) {\r\n\t\tif (value) return value.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\r\n\t\telse return null;\r\n\t};\r\n\r\n\tvar queryStringSerialize = function (o) {\r\n\t\tvar s = [];\r\n\r\n\t\tfor (var k in o)\r\n\t\t\ts.push(k + \"=\" + encodeURIComponent(o[k]));\r\n\r\n\t\treturn s.join(\"&\");\r\n\t};\r\n\r\n\tvar hexChars = \"0123456789ABCDEF\".split(\"\");\r\n\r\n\tvar generateGuid = function () {\r\n\t\tvar uuid = [];\r\n\t\t// rfc4122, version 4 form\r\n\t\tvar r;\r\n\r\n\t\t// rfc4122 requires these characters\r\n\t\tuuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';\r\n\t\tuuid[14] = '4';\r\n\r\n\t\t// Fill in random data. At i==19 set the high bits of clock sequence as\r\n\t\t// per rfc4122, sec. 4.1.5\r\n\t\tfor (i = 0; i < 36; i++) {\r\n\t\t\tif (!uuid[i]) {\r\n\t\t\t\tr = 0 | Math.random() * 16;\r\n\t\t\t\tuuid[i] = hexChars[(i == 19) ? (r & 0x3) | 0x8 : r];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn uuid.join('');\r\n\t};\r\n\r\n\tvar filter = function (list, filterFunction) {\r\n\t\tvar filteredList = [];\r\n\r\n\t\tif (list && list.length > 0) for (var i = 0; i < list.length; i++)\r\n\t\t\tif (filterFunction(list[i])) filteredList.push(list[i]);\r\n\r\n\t\treturn filteredList;\r\n\t};\r\n\r\n\tvar callHandlers = function (list) {\r\n\t\tif (list && list.length > 0) {\r\n\t\t\tvar args = [];\r\n\r\n\t\t\tfor (var i = 1; i < arguments.length; i++)\r\n\t\t\t\targs.push(arguments[i]);\r\n\r\n\t\t\t// TODO: use call so we set this\r\n\t\t\tfor (var i = 0; i < list.length; i++) {\r\n\t\t\t\tif (list[i].apply(null, args) === false) return false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t};\r\n\r\n\tvar addIFrame = function (id, src) {\r\n\t\tvar iframe = null;\r\n\r\n\t\tif (!src) src = \"javascript:false;\";\r\n\t\t//src = \"javascript:\\\"\\\";\";\r\n\t\t//src = getUrl(\"blank\");\r\n\r\n\t\t// TODO: if couldn't create either, fall back to non-javascript progress mode\r\n\r\n\t\tvar addIFrameInternal = function (id, el) {\r\n\t\t\tvar iframe = document.createElement(el);\r\n\r\n\t\t\tiframe.name = iframe.id = id;\r\n\t\t\tiframe.src = src;\r\n\t\t\t// TODO: fix this if it doesn't work crossbrowser (old browsers may need 1x1px or 0x0px)\r\n\t\t\tiframe.style.display = \"none\";\r\n\r\n\t\t\tdocument.body.appendChild(iframe);\r\n\r\n\t\t\treturn iframe;\r\n\t\t};\r\n\r\n\t\t// try the IE way first\r\n\t\tif (support.browser == \"msie\") {\r\n\t\t\ttry {\r\n\t\t\t\tiframe = addIFrameInternal(id, \"\");\r\n\r\n\t\t\t\tif (!iframe || iframe.tagName.toLowerCase() !== \"iframe\" || iframe.name !== id || window.frames[id] === undefined || window.frames[id].name !== id) {\r\n\t\t\t\t\tif (iframe) document.body.removeChild(iframe);\r\n\r\n\t\t\t\t\tiframe = null;\r\n\t\t\t\t}\r\n\t\t\t} catch (ex) {\r\n\t\t\t\tiframe = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// standard cross browser way\r\n\t\tif (iframe === null) iframe = addIFrameInternal(id, \"iframe\");\r\n\r\n\t\t//alert(iframe);\r\n\t\t//alert(iframe.src);\r\n\t\t//alert(window.frames[id].name);\r\n\r\n\t\treturn iframe;\r\n\t};\r\n\r\n\tvar isIFrameError = function (id, urlRoot) {\r\n\t\tvar isError = false;\r\n\t\tvar frameLocation = null;\r\n\r\n\t\ttry {\r\n\t\t\tframeLocation = window.frames[id].location.pathname + window.frames[id].location.search;\r\n\r\n\t\t\tif (frameLocation !== null && frameLocation.length > 0 && frameLocation !== \"false;\") isError = (frameLocation.length < urlRoot.length || frameLocation.substr(0, urlRoot.length) !== urlRoot);\r\n\t\t} catch (e) {\r\n\t\t\tisError = true;\r\n\t\t}\r\n\r\n\t\tif (!frameLocation) isError = true;\r\n\r\n\t\t//alert(\"error:\" + isError);\r\n\t\t//alert(frameLocation);\r\n\r\n\t\treturn isError;\r\n\t};\r\n\r\n\tvar getIsLoaded = function (iframe) {\r\n\t\tvar isLoaded = false;\r\n\t\tvar frameLocation = window.frames[iframe.name].location.pathname + window.frames[iframe.name].location.search;\r\n\r\n\t\tif (frameLocation !== null && frameLocation.length > 0 && frameLocation !== \"false;\") {\r\n\t\t\tvar doc = iframe.contentWindow || iframe.contentDocument;\r\n\r\n\t\t\tif (doc && doc.document) doc = doc.document;\r\n\r\n\t\t\tif (doc) {\r\n\t\t\t\tif (doc.readyState == \"complete\") isLoaded = true;\r\n\t\t\t\telse if (doc.body && (doc.body.childNodes.length > 0 || (doc.body.innerHTML && doc.body.innerHTML.length > 0))) isLoaded = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// alert(\"loaded:\" + isLoaded);\r\n\r\n\t\treturn isLoaded;\r\n\t};\r\n\r\n\t// --- Templating\r\n\tvar connectTemplate = function (element, templateElements, eachElementFunction) {\r\n\t\tvar all = element.getElementsByTagName(\"*\");\r\n\r\n\t\tfor (var i = 0; i < all.length; i++) {\r\n\t\t\tvar childEl = all[i];\r\n\t\t\tvar classes = splitClasses(childEl.className);\r\n\t\t\tvar templateSource = null;\r\n\r\n\t\t\tif (eachElementFunction) eachElementFunction(childEl);\r\n\r\n\t\t\tfor (var j = 0; j < classes.length; j++) {\r\n\t\t\t\tif (classes[j].length > 5 && classes[j].substr(0, 3) == \"su-\") {\r\n\t\t\t\t\ttemplateSource = classes[j].substr(3).toLowerCase().replace(/-/g, \"\");\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (templateSource !== null) {\r\n\t\t\t\tchildEl.kw_TemplateSource = templateSource;\r\n\r\n\t\t\t\ttemplateElements.push(childEl);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tvar updateTemplate = function (templateElements, templateValueFunction) {\r\n\t\tfor (var i = 0; i < templateElements.length; i++) {\r\n\t\t\tvar childEl = templateElements[i];\r\n\t\t\tvar value = templateValueFunction(childEl, childEl.kw_TemplateSource ? childEl.kw_TemplateSource.toLowerCase() : null);\r\n\r\n\t\t\t// TODO: figure out how not to remove spaces in IE6\r\n\t\t\tif (value) childEl.innerHTML = value;\r\n\t\t}\r\n\t};\r\n\r\n\t// --- Components\r\n\tkw.File = function (options) {\r\n\t\t// fields\r\n\t\tvar\r\n\t\t//self = this,\r\n\t\tevents = {\r\n\t\t\tfileUpdatedHandlers: []\r\n\t\t},\r\n\t\tsettings = {\r\n\t\t\tid: generateGuid(),\r\n\t\t\tfileSelector: null,\r\n\t\t\tfileObject: null,\r\n\t\t\tname: null,\r\n\t\t\textension: null,\r\n\t\t\tsize: null,\r\n\t\t\tlastModified: null,\r\n\t\t\t//type: null,\r\n\t\t\tisErrored: false,\r\n\t\t\tisCancelled: false,\r\n\t\t\tisExtensionValid: true,\r\n\t\t\tisSizeValid: true,\r\n\t\t\tisValid: true,\r\n\t\t\tstatus: null\r\n\t\t};\r\n\r\n\t\tthis.getElementById = function (id) {\r\n\t\t\treturn document.getElementById(settings.fileSelector.get_Id() + \"_\" + settings.id + \"_\" + id);\r\n\t\t};\r\n\r\n\t\tthis._set_Validation = function (isExtensionValid, isSizeValid) {\r\n\t\t\tsettings.isExtensionValid = isExtensionValid;\r\n\t\t\tsettings.isSizeValid = isSizeValid;\r\n\t\t\tsettings.isValid = settings.isExtensionValid && settings.isSizeValid;\r\n\r\n\t\t\tcallHandlers(events.fileUpdatedHandlers, this);\r\n\t\t};\r\n\r\n\t\tthis._set_Status = function (value, isLastCalculateSize) {\r\n\t\t\tsettings.status = value;\r\n\r\n\t\t\tif ((settings.size === null || settings.size === -1) && settings.status) {\r\n\t\t\t\tif (settings.status.contentLength || isLastCalculateSize) {\r\n\t\t\t\t\tsettings.size = settings.status.contentLength || -1;\r\n\r\n\t\t\t\t\tsettings.fileSelector._validateFile(this);\r\n\r\n\t\t\t\t\tlog(settings.fileSelector.id + \" - File size calculated.\", this);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tcallHandlers(events.fileUpdatedHandlers, this);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis._set_IsCancelled = function (value) {\r\n\t\t\tsettings.isCancelled = value;\r\n\r\n\t\t\tcallHandlers(events.fileUpdatedHandlers, this);\r\n\t\t};\r\n\r\n\t\tvar getFileName = function (path) {\r\n\t\t\tvar pos = path.lastIndexOf(\"\\\\\");\r\n\r\n\t\t\tif (pos == -1) pos = path.lastIndexOf(\"/\");\r\n\r\n\t\t\treturn path.substr(pos + 1);\r\n\t\t};\r\n\r\n\t\tvar getExtension = function (fileName) {\r\n\t\t\tvar pos = fileName.lastIndexOf(\".\");\r\n\r\n\t\t\tif (pos == -1) return null;\r\n\t\t\telse return fileName.substr(pos + 1);\r\n\t\t};\r\n\r\n\t\t/*var getFileType = function (fileName)\r\n\t\t{\r\n\t\t\t// TODO: parse filename and look up\r\n\t\t\treturn null;\r\n\t\t};*/\r\n\r\n\t\t// constructor\r\n\t\tsettings.name = getFileName(options.fileObject.fileName || options.fileObject.value || options.fileObject.name);\r\n\t\tsettings.extension = getExtension(settings.name);\r\n\r\n\t\tif (!options.fileObject.tagName) {\r\n\t\t\tsettings.size = options.fileObject.fileSize || options.fileObject.size;\r\n\r\n\t\t\tsettings.lastModified = options.fileObject.lastModifiedDate;\r\n\t\t\t//settings.type = options.fileObject.type || getFileType(settings.name);\r\n\t\t} else if (options.fileObject.files && options.fileObject.files.length == 1) {\r\n\t\t\t// moz < 3.6 doesn't support xhr uploads, but we can still get size\r\n\t\t\tvar file = options.fileObject.files[0];\r\n\r\n\t\t\tif ((file.name || file.fileName) == options.fileObject.value) {\r\n\t\t\t\tsettings.size = file.fileSize || file.size;\r\n\t\t\t\tsettings.lastModified = file.lastModifiedDate;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!settings.size && settings.size !== 0) settings.size = null;\r\n\r\n\t\t//if (!settings.type)\r\n\t\t// settings.type = getFileType(settings.name);\r\n\r\n\t\tcomponentConstructor(this, settings, options, events);\r\n\t};\r\n\r\n\tkw.FileSelector = function (options) {\r\n\t\t// fields\r\n\t\tvar self = this,\r\n\t\t\t fileSelectorImpl = null,\r\n\t\t\t selectedFiles = [],\r\n\t\t\t uploadBoxIdCounter = 0,\r\n\t\t\t events = {\r\n\t\t\t \tfileAddingHandlers: [],\r\n\t\t\t \tfileAddedHandlers: [],\r\n\t\t\t \tfileValidatedHandlers: [],\r\n\t\t\t \tfileRemovedHandlers: []\r\n\t\t\t },\r\n\t\t\t settings = {\r\n\t\t\t \tid: null,\r\n\t\t\t \telement: null,\r\n\t\t\t \tunskinnedElement: null,\r\n\t\t\t \tunsupportedElement: null,\r\n\t\t\t \tfolderElement: null,\r\n\t\t\t \tuploadConnector: null,\r\n\t\t\t \tdropZone: this,\r\n\t\t\t \tmaxFiles: -1, // Modified by HaiKom 2014-06-10, original value 100\r\n\t\t\t \tmaxFileSize: 2097140,\r\n\t\t\t \tallowZeroLengthFiles: false,\r\n\t\t\t \tvalidExtensions: null,\r\n\t\t\t \tisSkinned: true,\r\n\t\t\t \tshowDropZoneOnDocumentDragOver: false\r\n\t\t\t };\r\n\r\n\t\tvar htmlFileSelector = function () {\r\n\t\t\t// fields\r\n\t\t\tvar currentInput = null;\r\n\r\n\t\t\tvar onChange = function (e, source) {\r\n\t\t\t\t// if this is opera and someone is typing in the box, ignore\r\n\t\t\t\tif (source.validity && !source.validity.valid) return;\r\n\r\n\t\t\t\tlog(settings.id + \" - Files selected.\");\r\n\r\n\t\t\t\tif (source.value && source.value.length > 0) {\r\n\t\t\t\t\tcurrentInput = null;\r\n\r\n\t\t\t\t\tif (source.parentNode) source.parentNode.removeChild(source);\r\n\r\n\t\t\t\t\tunbind(source, \"change\", source.onchangehandler);\r\n\t\t\t\t\tsource.onchangehandler = null;\r\n\r\n\t\t\t\t\t//processFiles(source.files || source);\r\n\t\t\t\t\tprocessFiles(support.html5Upload ? source.files : source);\r\n\t\t\t\t\t//window.setTimeout(function () { processFiles(support.html5Upload ? source.files : source); }, 5000);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tupdateHover(false);\r\n\r\n\t\t\t\tremoveClass(settings.element, \"su-focus\");\r\n\t\t\t};\r\n\r\n\t\t\tvar processFiles = function (files) {\r\n\t\t\t\tvar sourceIdSet = false;\r\n\r\n\t\t\t\tvar loopTest = function (i, files) {\r\n\t\t\t\t\t// If we hit maxfiles, we're done\r\n\t\t\t\t\tif (settings.maxFiles && selectedFiles.length >= settings.maxFiles) return false;\r\n\t\t\t\t\t\t// If this is a single file selector, hit the loop once\r\n\t\t\t\t\telse if (typeof files.length === \"undefined\") return (i === 0);\r\n\t\t\t\t\t\t// This is a multi file selector, loop through the files\r\n\t\t\t\t\telse return (i < files.length);\r\n\t\t\t\t};\r\n\r\n\t\t\t\tfor (var i = 0; loopTest(i, files) ; i++) {\r\n\t\t\t\t\tif (i === 0 || ((files[i].name || files[i].fileName) !== (files[0].name || files[0].fileName))) {\r\n\t\t\t\t\t\tvar fileObject = support.html5Upload ? files[i] : files;\r\n\r\n\t\t\t\t\t\tvar size = (fileObject.fileSize || fileObject.size);\r\n\r\n\t\t\t\t\t\t// filter out directory file on folder selection\r\n\t\t\t\t\t\tif (size === null || size > 0 || settings.allowZeroLengthFiles) {\r\n\t\t\t\t\t\t\texecuteIfIsFile(fileObject, function (fileObject) {\r\n\t\t\t\t\t\t\t\t// TODO: filter out zero length files?\r\n\t\t\t\t\t\t\t\t//if (fileObject.fileSize != 0 && fileObject.size != 0)\r\n\t\t\t\t\t\t\t\t//{\r\n\t\t\t\t\t\t\t\tvar file = new kw.File({\r\n\t\t\t\t\t\t\t\t\tfileObject: fileObject,\r\n\t\t\t\t\t\t\t\t\tfileSelector: self\r\n\t\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\t\tif (files.tagName && !sourceIdSet) {\r\n\t\t\t\t\t\t\t\t\t// TODO: genericise the name\r\n\t\t\t\t\t\t\t\t\tfiles.id = files.name = file.get_FileSelector().get_Id() + \"_\" + file.get_Id();\r\n\r\n\t\t\t\t\t\t\t\t\tsourceIdSet = true;\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tadd_File(file);\r\n\t\t\t\t\t\t\t\t//}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tensureAddBoxIfLessThanMaxFiles();\r\n\t\t\t};\r\n\r\n\t\t\tvar executeIfIsFile = function (fileObject, codeBlock) {\r\n\t\t\t\tvar executeNow = true;\r\n\r\n\t\t\t\tif ((fileObject.name || fileObject.fileName) == \".\") {\r\n\t\t\t\t\texecuteNow = false;\r\n\t\t\t\t}\r\n\t\t\t\t/*else\r\n\t\t\t\t{\r\n\t\t\t\t\tvar size = (fileObject.fileSize || fileObject.size);\r\n\r\n\t\t\t\t\tif (size != null && size >= 0 && size < 1024 * 1024 && window.FileReader)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\texecuteNow = false;\r\n\r\n\t\t\t\t\t\tvar blob = null;\r\n\r\n\t\t\t\t\t\ttry\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (fileObject.webkitSlice)\r\n\t\t\t\t\t\t\t\tblob = fileObject.webkitSlice(0, 1);\r\n\t\t\t\t\t\t\telse if (fileObject.mozSlice)\r\n\t\t\t\t\t\t\t\tblob = fileObject.mozSlice(0, 1);\r\n\t\t\t\t\t\t\telse if (fileObject.slice)\r\n\t\t\t\t\t\t\t\tblob = fileObject.slice(0, 1);\r\n\r\n\t\t\t\t\t\t\tvar reader = new FileReader();\r\n\r\n\t\t\t\t\t\t\treader.onload = function ()\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcodeBlock(fileObject);\r\n\r\n\t\t\t\t\t\t\t\ttry\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\treader.abort();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tcatch (ex)\r\n\t\t\t\t\t\t\t\t{ }\r\n\t\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\t\tif (blob)\r\n\t\t\t\t\t\t\t\treader.readAsBinaryString(blob);\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\treader.readAsBinaryString(fileObject);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcatch (ex)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t// Do nothing. Errored while reading the \"file\", so it's probably not valid\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}*/\r\n\r\n\t\t\t\tif (executeNow) codeBlock(fileObject);\r\n\t\t\t};\r\n\r\n\t\t\tthis._onDrop = function (files) {\r\n\t\t\t\tlog(settings.id + \" - Files dropped.\");\r\n\r\n\t\t\t\tprocessFiles(files);\r\n\t\t\t};\r\n\r\n\t\t\tthis._onFileRemoved = function (file) {\r\n\t\t\t\tensureAddBoxIfLessThanMaxFiles();\r\n\t\t\t};\r\n\r\n\t\t\tvar ensureAddBoxIfLessThanMaxFiles = function () {\r\n\t\t\t\tif (currentInput === null) {\r\n\t\t\t\t\tcurrentInput = document.createElement(\"input\");\r\n\r\n\t\t\t\t\tsetupFileInput(currentInput);\r\n\r\n\t\t\t\t\tsettings.element.appendChild(currentInput);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!settings.maxFiles || selectedFiles.length < settings.maxFiles) {\r\n\t\t\t\t\tif (settings.isSkinned) settings.element.style.display = \"block\";\r\n\t\t\t\t\telse showElement(settings.element);\r\n\r\n\t\t\t\t\tif (settings.folderElement && kw.support.folderSelection) showElement(settings.folderElement);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsettings.element.style.display = \"none\";\r\n\r\n\t\t\t\t\tif (settings.folderElement && kw.support.folderSelection) settings.folderElement.style.display = \"none\";\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tvar setupFileInput = function (input) {\r\n\t\t\t\tinput.type = \"file\";\r\n\t\t\t\tinput.name = input.id = settings.id + \"_html_file\" + uploadBoxIdCounter++;\r\n\t\t\t\t//input.style.cssText = \"position:absolute;padding:0;margin:0;font-size:20px;z-index:100000;visibility:hidden;opacity:0;filter:alpha(opacity=0);-moz-opacity:0;outline:none;\";\r\n\t\t\t\tinput.hideFocus = true;\r\n\r\n\t\t\t\tif (support.isSkinnable && settings.isSkinned) {\r\n\t\t\t\t\t// zoom:1 required to force positioning on IE7-8 as per http://joseph.randomnetworks.com/2006/08/16/css-opacity-in-internet-explorer-ie/\r\n\t\t\t\t\t// -ms-filter: \"alpha(opacity=80)\"; required on ie8 as per http://snook.ca/archives/html_and_css/ie-position-fixed-opacity-filter\r\n\t\t\t\t\tinput.style.cssText = \"position:absolute;right:0;top:0;padding:0;margin:0;height:auto;width:auto;font-family:Arial;font-size:215px;z-index:100000;zoom:1;-ms-filter:\\\"progid:DXImageTransform.Microsoft.Alpha(opacity=0)\\\";filter:\\\"progid:DXImageTransform.Microsoft.Alpha(opacity=0)\\\";filter:alpha(opacity=0);opacity:0;outline:none;\";\r\n\t\t\t\t\t//input.originalcss = \"position:absolute;right:0;top:0;padding:0;margin:0;font-family:Arial;font-size:215px;z-index:100000;zoom:1;-ms-filter:\\\"progid:DXImageTransform.Microsoft.Alpha(opacity=0)\\\";filter:\\\"progid:DXImageTransform.Microsoft.Alpha(opacity=0)\\\";filter:alpha(opacity=0);opacity:0\";\r\n\r\n\t\t\t\t\tif (support.browser == \"msie\" && support.browserVersion < 9 && settings.element.offsetWidth > 0) {\r\n\t\t\t\t\t\t// Add width to fix opacity issue\r\n\t\t\t\t\t\tinput.style.width = settings.element.offsetWidth * 2 + \"px\";\r\n\t\t\t\t\t\tinput.style.height = settings.element.offsetHeight * 2 + \"px\";\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (!support.fileInputTabbable) input.tabIndex = \"-1\";\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// TODO: revisit this if maxfiles becomes settable\r\n\t\t\t\tif (support.html5Upload && support.fileInputMultiple && settings.maxFiles != 1) input.multiple = true;\r\n\r\n\t\t\t\tinput.onchangehandler = bind(input, \"change\", this, onChange);\r\n\r\n\t\t\t\t// TODO: handle the case when the mouse ends up on the selector after the box is closed (mousemove to readd hover class?)\r\n\t\t\t\tbind(input, \"click\", this, function () {\r\n\t\t\t\t\tupdateHover(false);\r\n\t\t\t\t});\r\n\t\t\t\tbind(input, \"keydown\", this, function (e) {\r\n\t\t\t\t\treturn e.keyCode == 9 || e.keyCode == 32 || e.keyCode == 13;\r\n\t\t\t\t});\r\n\t\t\t\tbind(input, \"keypress\", this, function (e) {\r\n\t\t\t\t\tvar key = e.charCode || e.keyCode;\r\n\r\n\t\t\t\t\treturn key == 9 || key == 13;\r\n\t\t\t\t});\r\n\t\t\t\tbind(input, \"paste\", this, function () {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t});\r\n\r\n\t\t\t\tbind(input, \"focus\", this, function () {\r\n\t\t\t\t\taddClass(settings.element, \"su-focus\");\r\n\t\t\t\t});\r\n\t\t\t\tbind(input, \"blur\", this, function () {\r\n\t\t\t\t\tremoveClass(settings.element, \"su-focus\");\r\n\t\t\t\t});\r\n\t\t\t};\r\n\r\n\t\t\tvar onMouseOut = function (event) {\r\n\t\t\t\tif (support.mouseEnterLeave || !withinElement(settings.element, event)) updateHover(false);\r\n\t\t\t};\r\n\r\n\t\t\tvar onMouseOver = function (event) {\r\n\t\t\t\tif (support.mouseEnterLeave || !withinElement(settings.element, event)) updateHover(true);\r\n\t\t\t};\r\n\r\n\t\t\tvar updateHover = function (isOverSelector) {\r\n\t\t\t\t(isOverSelector ? addClass : removeClass)(settings.element, \"su-hover\");\r\n\t\t\t};\r\n\r\n\t\t\tthis.selectFolder = function () {\r\n\t\t\t\tif (currentInput && support.folderSelection) {\r\n\t\t\t\t\tvar input = currentInput;\r\n\r\n\t\t\t\t\tinput.webkitdirectory = true;\r\n\r\n\t\t\t\t\tinput.click();\r\n\r\n\t\t\t\t\tif (input) input.removeAttribute(\"webkitdirectory\");\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tthis._dispose = function () {\r\n\t\t\t\tif (currentInput && currentInput.onchangehandler) {\r\n\t\t\t\t\tunbind(currentInput, \"change\", currentInput.onchangehandler);\r\n\t\t\t\t\tcurrentInput.onchangehandler = null;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t// constructor\r\n\t\t\tvar inputs = settings.element.getElementsByTagName(\"input\");\r\n\r\n\t\t\t// TODO: support multiple elements in unskinned by turning off auto add\r\n\t\t\tfor (var i = 0; i < inputs.length; i++) {\r\n\t\t\t\tif (inputs[i].type === \"file\") {\r\n\t\t\t\t\tif (currentInput === null) {\r\n\t\t\t\t\t\tcurrentInput = inputs[i];\r\n\r\n\t\t\t\t\t\tsetupFileInput(currentInput);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tinputs[i].parentNode.removeChild(inputs[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tensureAddBoxIfLessThanMaxFiles();\r\n\r\n\t\t\tif (support.mouseEnterLeave) {\r\n\t\t\t\tbind(settings.element, \"mouseenter\", this, onMouseOver);\r\n\t\t\t\tbind(settings.element, \"mouseleave\", this, onMouseOut);\r\n\t\t\t} else {\r\n\t\t\t\tbind(settings.element, \"mouseover\", this, onMouseOver);\r\n\t\t\t\tbind(settings.element, \"mouseout\", this, onMouseOut);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar add_File = function (file) {\r\n\t\t\tself._validateFile(file, true);\r\n\r\n\t\t\tlog(file);\r\n\r\n\t\t\tif (callHandlers(events.fileAddingHandlers, file) !== false) {\r\n\t\t\t\tselectedFiles.push(file);\r\n\r\n\t\t\t\tvar internalAddedHandlers = filter(events.fileAddedHandlers, function (handler) {\r\n\t\t\t\t\treturn handler.isInternal === true;\r\n\t\t\t\t});\r\n\t\t\t\tvar externalAddedHandlers = filter(events.fileAddedHandlers, function (handler) {\r\n\t\t\t\t\treturn !handler.isInternal;\r\n\t\t\t\t});\r\n\r\n\t\t\t\tcallHandlers(internalAddedHandlers, file);\r\n\r\n\t\t\t\tsettings.uploadConnector._add_File(file);\r\n\r\n\t\t\t\tcallHandlers(externalAddedHandlers, file);\r\n\t\t\t\tcallHandlers(events.fileValidatedHandlers, file);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis.get_Files = function () {\r\n\t\t\treturn selectedFiles.slice();\r\n\t\t};\r\n\r\n\t\tthis.clear = function () {\r\n\t\t\tfor (var i = selectedFiles.length - 1; i >= 0; i--)\r\n\t\t\t\tthis.remove_File(selectedFiles[i]);\r\n\t\t};\r\n\r\n\t\tthis.remove_File = function (file) {\r\n\t\t\tfor (var i = 0; i < selectedFiles.length; i++) {\r\n\t\t\t\tif (selectedFiles[i].get_Id() == file.get_Id()) {\r\n\t\t\t\t\tselectedFiles.splice(i, 1);\r\n\r\n\t\t\t\t\tcallHandlers(events.fileRemovedHandlers, file);\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfileSelectorImpl._onFileRemoved(file);\r\n\r\n\t\t\tsettings.uploadConnector._remove_File(file);\r\n\r\n\t\t\tlog(settings.id + \" - File removed.\", file);\r\n\t\t};\r\n\r\n\t\tvar updateValidationAll = function () {\r\n\t\t\tfor (var i = 0; i < selectedFiles.length; i++)\r\n\t\t\t\tself._validateFile(selectedFiles[i]);\r\n\t\t};\r\n\r\n\t\tthis._validateFile = function (file, skipValidationEvent) {\r\n\t\t\tvar isExtensionValid = true;\r\n\t\t\tvar isSizeValid = true;\r\n\t\t\tvar size = file.get_Size();\r\n\r\n\t\t\tif (settings.maxFileSize && size && size != -1) isSizeValid = size / 1024 < settings.maxFileSize;\r\n\r\n\t\t\tif (settings.validExtensions && settings.validExtensions.length > 0) {\r\n\t\t\t\tisExtensionValid = false;\r\n\r\n\t\t\t\tvar name = file.get_Name();\r\n\r\n\t\t\t\tfor (var i = 0; i < settings.validExtensions.length; i++) {\r\n\t\t\t\t\tvar ext = settings.validExtensions[i];\r\n\r\n\t\t\t\t\tif (name.length > ext.length && name.substr(name.length - ext.length).toLowerCase() == ext.toLowerCase()) {\r\n\t\t\t\t\t\tisExtensionValid = true;\r\n\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfile._set_Validation(isExtensionValid, isSizeValid);\r\n\r\n\t\t\tif (!skipValidationEvent) callHandlers(events.fileValidatedHandlers, file);\r\n\t\t};\r\n\r\n\t\tvar onBeforeSessionEnd = function (data) {\r\n\t\t\t// TODO: should we be forcing this?\r\n\t\t\tsettings.element.style.display = \"none\";\r\n\r\n\t\t\tif (settings.folderElement) settings.folderElement.style.display = \"none\";\r\n\t\t};\r\n\r\n\t\tthis._dispose = function () {\r\n\t\t\tif (fileSelectorImpl && fileSelectorImpl._dispose) fileSelectorImpl._dispose();\r\n\t\t};\r\n\r\n\t\t// constructor\r\n\t\tcomponentConstructor(this, settings, options, events, false, \"su-fileselector\");\r\n\r\n\t\tresolveElement(settings, \"unskinnedElement\", false);\r\n\r\n\t\tassert(settings.element || settings.unskinnedElement, \"Either element or unskinnedElement is required.\");\r\n\r\n\t\tif (settings.element == settings.unskinnedElement) settings.element = null;\r\n\r\n\t\ttry {\r\n\t\t\tresolveElement(settings, \"folderElement\", false);\r\n\t\t} catch (ex) {\r\n\t\t\tsettings.folderElement = null;\r\n\r\n\t\t\tlog(\"Error resolving folderElement, ignoring:\" + ex);\r\n\t\t}\r\n\r\n\t\tif (!settings.element) settings.isSkinned = false;\r\n\r\n\t\tif (settings.dropZone == this) settings.dropZone = settings.element;\r\n\t\telse resolveElement(settings, \"dropZone\", false);\r\n\r\n\t\tif (settings.maxFiles && settings.maxFiles < 0) settings.maxFiles = null;\r\n\r\n\t\tif (settings.maxFileSize && settings.maxFileSize < 0) settings.maxFileSize = null;\r\n\r\n\t\tif (typeof (settings.validExtensions) == \"string\") settings.validExtensions = settings.validExtensions.split(\",\");\r\n\r\n\t\tif (settings.validExtensions) {\r\n\t\t\tfor (var i = 0; i < settings.validExtensions.length; i++)\r\n\t\t\t\tsettings.validExtensions[i] = trim(settings.validExtensions[i]);\r\n\t\t}\r\n\r\n\t\tif (support.isSupportedBrowser) {\r\n\t\t\tresolveComponent(settings, \"uploadConnector\", kw.UploadConnector, \"UploadConnector\", true);\r\n\r\n\t\t\tif (support.isSkinnable && settings.isSkinned) {\r\n\t\t\t\tif (!settings.element.style.position || settings.element.style.position.toLowerCase() != \"absolute\") settings.element.style.position = \"relative\";\r\n\r\n\t\t\t\tsettings.element.style.display = \"block\";\r\n\t\t\t\tsettings.element.style.overflow = \"hidden\";\r\n\t\t\t\tsettings.element.style.direction = \"ltr\";\r\n\r\n\t\t\t\tif (settings.unskinnedElement && settings.unskinnedElement.parentNode) settings.unskinnedElement.parentNode.removeChild(settings.unskinnedElement);\r\n\t\t\t} else {\r\n\t\t\t\tif (!settings.unskinnedElement) {\r\n\t\t\t\t\tsettings.unskinnedElement = document.createElement(\"div\");\r\n\r\n\t\t\t\t\tsettings.element.parentNode.insertBefore(settings.unskinnedElement, settings.element);\r\n\t\t\t\t}\r\n\r\n\t\t\t\taddClass(settings.unskinnedElement, \"su-fileselector\");\r\n\t\t\t\taddClass(settings.unskinnedElement, \"su-unskinned\");\r\n\r\n\t\t\t\tif (settings.element && settings.element.parentNode) settings.element.parentNode.replaceChild(settings.unskinnedElement, settings.element);\r\n\r\n\t\t\t\tsettings.element = settings.unskinnedElement;\r\n\r\n\t\t\t\tshowElement(settings.element);\r\n\t\t\t}\r\n\r\n\t\t\tfileSelectorImpl = new htmlFileSelector();\r\n\r\n\t\t\tif (settings.folderElement && support.folderSelection) {\r\n\t\t\t\taddClass(settings.folderElement, \"su-folderselector\");\r\n\r\n\t\t\t\tbind(settings.folderElement, \"click\", this, function () {\r\n\t\t\t\t\tfileSelectorImpl.selectFolder();\r\n\t\t\t\t});\r\n\r\n\t\t\t\tshowElement(settings.folderElement);\r\n\t\t\t} else if (settings.folderElement && settings.folderElement.parentNode) {\r\n\t\t\t\tsettings.folderElement.parentNode.removeChild(settings.folderElement);\r\n\t\t\t}\r\n\r\n\t\t\tif (settings.dropZone) {\r\n\t\t\t\tif (support.dragDrop) {\r\n\t\t\t\t\tkw.DropZoneManager.registerDropZone(settings.dropZone, fileSelectorImpl, settings.showDropZoneOnDocumentDragOver);\r\n\r\n\t\t\t\t\tif (!settings.showDropZoneOnDocumentDragOver) showElement(settings.dropZone);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// We can't do this in case the drop zone has other controls inside it\r\n\t\t\t\t\t//if (settings.dropZone.parentNode && settings.dropZone != settings.element)\r\n\t\t\t\t\t// settings.dropZone.parentNode.removeChild(settings.dropZone);\r\n\r\n\t\t\t\t\tsettings.dropZone = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tsettings.uploadConnector.add_OnBeforeSessionEnd(onBeforeSessionEnd, true);\r\n\t\t} else {\r\n\t\t\tresolveElement(settings, \"unsupportedElement\", false);\r\n\r\n\t\t\tif (!settings.unsupportedElement) {\r\n\t\t\t\tsettings.unsupportedElement = document.createElement(\"div\");\r\n\r\n\t\t\t\tsettings.unsupportedElement.appendChild(document.createTextNode(\"Your browser doesn't support uploading. Please upgrade to a recent browser.\"));\r\n\t\t\t}\r\n\r\n\t\t\taddClass(settings.unsupportedElement, \"su-fileselector\");\r\n\t\t\taddClass(settings.unsupportedElement, \"su-unsupported\");\r\n\r\n\t\t\tsettings.element.parentNode.replaceChild(settings.unsupportedElement, settings.element);\r\n\r\n\t\t\tshowElement(settings.unsupportedElement);\r\n\r\n\t\t\tif (settings.dropZone) {\r\n\t\t\t\taddClass(settings.dropZone, \"su-unsupported\");\r\n\t\t\t\t// TODO: maybe redo this? it breaks if the unsupportedelement or anything else is inside the drop zone\r\n\t\t\t\t//settings.dropZone.parentNode.removeChild(settings.dropZone);\r\n\t\t\t\t//settings.dropZone = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (licenseData) handleLicense();\r\n\r\n\t\tlog(\"FileSelector constructed\", settings.id, \"SlickUpload \" + (support.isSupportedBrowser ? \"supported\" : \"NOT supported. Disabling...\"), settings, this);\r\n\t};\r\n\r\n\tkw.FileList = function (options) {\r\n\t\t// fields\r\n\t\tvar\r\n\t\tself = this,\r\n\t\t\tfileElements = [],\r\n\t\t\tsettings = {\r\n\t\t\t\tid: null,\r\n\t\t\t\telement: null,\r\n\t\t\t\ttemplateElement: null,\r\n\t\t\t\tfileSelector: null,\r\n\t\t\t\tinvalidFileSizeMessage: \"File is too large.\",\r\n\t\t\t\tinvalidExtensionMessage: \"Invalid file extension.\",\r\n\t\t\t\tfileSizeFormatter: kw.defaultFileSizeFormatter,\r\n\t\t\t\tfileValidationMessageFormatter: kw.defaultFileValidationMessageFormatter,\r\n\t\t\t\tpercentFormatter: kw.defaultPercentFormatter\r\n\t\t\t};\r\n\r\n\t\tvar updateItem = function (el, file) {\r\n\t\t\tif (el && el.kw_TemplateElements) {\r\n\t\t\t\tvar status = file.get_Status();\r\n\r\n\t\t\t\tvar uploadState = settings.fileSelector.get_UploadConnector().get_Status().state;\r\n\t\t\t\tvar isRemovable = (uploadState == kw.UploadState.Initializing || uploadState == kw.UploadState.Uploading) && !file.get_IsCancelled();\r\n\r\n\t\t\t\tupdateTemplate(el.kw_TemplateElements, function (childEl, templateSource) {\r\n\t\t\t\t\tvar value = null;\r\n\r\n\t\t\t\t\tswitch (templateSource) {\r\n\t\t\t\t\t\tcase \"filename\":\r\n\t\t\t\t\t\t\treturn file.get_Name();\r\n\t\t\t\t\t\tcase \"filesize\":\r\n\t\t\t\t\t\t\tif (settings.fileSizeFormatter) return settings.fileSizeFormatter(file.get_Size());\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t\tcase \"fileType\":\r\n\t\t\t\t\t\t\tif (settings.fileTypeFormatter)\r\n\t\t\t\t\t\t\treturn settings.fileTypeFormatter(file.get_Type());\r\n\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t*/\r\n\t\t\t\t\t\tcase \"validationmessage\":\r\n\t\t\t\t\t\t\tif (settings.fileValidationMessageFormatter) value = settings.fileValidationMessageFormatter(file, self);\r\n\r\n\t\t\t\t\t\t\tchildEl.style.display = (value ? \"\" : \"none\");\r\n\r\n\t\t\t\t\t\t\treturn value;\r\n\t\t\t\t\t\tcase \"error\":\r\n\t\t\t\t\t\t\tif (status && status.errorType && status.errorType != kw.UploadErrorType.None && !file.get_IsCancelled()) addClass(el, \"su-error\");\r\n\r\n\t\t\t\t\t\t\t// TODO: figure out a sane way to display error messages\r\n\t\t\t\t\t\t\t/*value = status.errorMessage || status.errorType;\r\n\r\n\t\t\t\t\t\t\tchildEl.style.display = (value ? \"\" : \"none\");*/\r\n\r\n\t\t\t\t\t\t\treturn value;\r\n\t\t\t\t\t\tcase \"removecommand\":\r\n\t\t\t\t\t\t\tif (!isRemovable) childEl.style.display = \"none\";\r\n\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"percentcompletetext\":\r\n\t\t\t\t\t\t\tif (settings.percentFormatter && status && status.contentLength && status.position) {\r\n\t\t\t\t\t\t\t\tvar parsedPosition = parseFloat(status.position);\r\n\t\t\t\t\t\t\t\tvar parsedContentLength = parseFloat(status.contentLength);\r\n\r\n\t\t\t\t\t\t\t\tif (isFinite(parsedPosition) && isFinite(parsedContentLength)) {\r\n\t\t\t\t\t\t\t\t\tvar percentComplete = parsedPosition / parsedContentLength;\r\n\r\n\t\t\t\t\t\t\t\t\tif (isFinite(percentComplete)) return settings.percentFormatter(percentComplete * 100);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"progressbar\":\r\n\t\t\t\t\t\t\tif (status && status.contentLength && status.position) {\r\n\t\t\t\t\t\t\t\tvar parsedPosition = parseFloat(status.position);\r\n\t\t\t\t\t\t\t\tvar parsedContentLength = parseFloat(status.contentLength);\r\n\r\n\t\t\t\t\t\t\t\tif (isFinite(parsedPosition) && isFinite(parsedContentLength)) {\r\n\t\t\t\t\t\t\t\t\tvar percentComplete = parsedPosition / parsedContentLength;\r\n\r\n\t\t\t\t\t\t\t\t\tif (isFinite(percentComplete)) {\r\n\t\t\t\t\t\t\t\t\t\tshowElement(childEl);\r\n\t\t\t\t\t\t\t\t\t\tshowElement(childEl.parentNode);\r\n\r\n\t\t\t\t\t\t\t\t\t\tchildEl.style.width = Math.min(percentComplete * 100, 100).toFixed(2) + \"%\";\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar onFileAdded = function (file) {\r\n\t\t\tvar el = settings.templateElement.cloneNode(true);\r\n\r\n\t\t\tvar id = file.get_Id();\r\n\t\t\tvar idPrefix = file.get_FileSelector().get_Id() + \"_\" + id;\r\n\r\n\t\t\tel.id = null;\r\n\t\t\tel.file = file;\r\n\t\t\tel.style.display = \"\";\r\n\t\t\tel.kw_TemplateElements = [];\r\n\t\t\tremoveClass(el, \"su-filelisttemplate\");\r\n\t\t\taddClass(el, \"su-filelistitem\");\r\n\r\n\t\t\tvar ext = file.get_Extension();\r\n\r\n\t\t\tif (ext) addClass(el, \"su-ext-\" + ext.toLowerCase().replace(/\\./g, \"-\"));\r\n\r\n\t\t\tconnectTemplate(el, el.kw_TemplateElements, function (childEl) {\r\n\t\t\t\tvar className = childEl.className.replace(/-/g, \"\");\r\n\r\n\t\t\t\t// hook remove command\r\n\t\t\t\tif (className.indexOf(\"suremovecommand\") != -1) bind(childEl, \"click\", childEl, function () {\r\n\t\t\t\t\tsettings.fileSelector.remove_File(file);\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// prefix ids\r\n\t\t\t\tif (childEl.id) childEl.id = idPrefix + \"_\" + childEl.id;\r\n\t\t\t\tif (childEl.name) childEl.name = idPrefix + \"_\" + childEl.name;\r\n\t\t\t});\r\n\r\n\t\t\tfileElements[id] = el;\r\n\r\n\t\t\tsettings.element.appendChild(el);\r\n\r\n\t\t\tfile.add_OnFileUpdated(onFileUpdated);\r\n\r\n\t\t\tupdateItem(el, file);\r\n\t\t};\r\n\r\n\t\tvar onFileUpdated = function (file) {\r\n\t\t\tvar el = fileElements[file.get_Id()];\r\n\r\n\t\t\tupdateItem(el, file);\r\n\t\t};\r\n\r\n\t\tvar onFileRemoved = function (file) {\r\n\t\t\tvar el = fileElements[file.get_Id()];\r\n\r\n\t\t\tdelete fileElements[file.get_Id()];\r\n\r\n\t\t\tel.parentNode.removeChild(el);\r\n\t\t};\r\n\r\n\t\tvar onBeforeSessionEnd = function (data) {\r\n\t\t\tfor (var key in fileElements) {\r\n\t\t\t\tvar el = fileElements[key];\r\n\r\n\t\t\t\tupdateItem(el, el.file);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis.getItemElementById = function (id) {\r\n\t\t\treturn fileElements[id];\r\n\t\t};\r\n\r\n\t\t// constructor\r\n\t\tif (support.isSupportedBrowser) {\r\n\t\t\tcomponentConstructor(this, settings, options, null, true, \"su-filelist\");\r\n\r\n\t\t\tresolveElement(settings, \"templateElement\", true);\r\n\t\t\tresolveComponent(settings, \"fileSelector\", kw.FileSelector, \"FileSelector\", true);\r\n\r\n\t\t\taddClass(settings.templateElement, \"su-filelisttemplate\");\r\n\r\n\t\t\tsettings.fileSelector.add_OnFileAdded(onFileAdded, true);\r\n\t\t\tsettings.fileSelector.add_OnFileRemoved(onFileRemoved, true);\r\n\t\t\tsettings.fileSelector.get_UploadConnector().add_OnBeforeSessionEnd(onBeforeSessionEnd, true);\r\n\r\n\t\t\tlog(\"FileList constructed\", settings.id, settings, this);\r\n\t\t} else log(\"FileList NOT constructed -- unsupported browser\", settings.id, settings, this);\r\n\t};\r\n\r\n\tkw.UploadProgressDisplay = function (options) {\r\n\t\t// fields\r\n\t\tvar\r\n\t\ttemplateElements = [],\r\n\t\t\tsettings = {\r\n\t\t\t\tid: null,\r\n\t\t\t\telement: null,\r\n\t\t\t\tuploadConnector: null,\r\n\t\t\t\tfileSizeFormatter: kw.defaultFileSizeFormatter,\r\n\t\t\t\tpercentFormatter: kw.defaultPercentFormatter,\r\n\t\t\t\ttimeFormatter: kw.defaultTimeFormatter,\r\n\t\t\t\tshowDuringUpload: true,\r\n\t\t\t\thideAfterUpload: true\r\n\t\t\t};\r\n\r\n\t\tvar updateDisplay = function (status) {\r\n\t\t\tupdateTemplate(templateElements, function (childEl, templateSource) {\r\n\t\t\t\tswitch (templateSource) {\r\n\t\t\t\t\tcase \"currentfilename\":\r\n\t\t\t\t\t\treturn status.currentFileName;\r\n\t\t\t\t\tcase \"currentfileindex\":\r\n\t\t\t\t\t\treturn status.currentFileIndex;\r\n\t\t\t\t\tcase \"filecount\":\r\n\t\t\t\t\t\treturn status.fileCount;\r\n\t\t\t\t\tcase \"contentlengthtext\":\r\n\t\t\t\t\t\tif (settings.fileSizeFormatter && status.contentLength) return settings.fileSizeFormatter(status.contentLength);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"percentcompletetext\":\r\n\t\t\t\t\t\tif (settings.percentFormatter) return settings.percentFormatter(status.percentComplete);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"speedtext\":\r\n\t\t\t\t\t\tvar speedText = null;\r\n\r\n\t\t\t\t\t\tif (status.totalSpeed) speedText = settings.fileSizeFormatter(status.totalSpeed);\r\n\r\n\t\t\t\t\t\tif (speedText) return speedText + \"/s\";\r\n\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"timeremainingtext\":\r\n\t\t\t\t\t\tif (settings.timeFormatter) return settings.timeFormatter(status.timeRemaining);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"progressbar\":\r\n\t\t\t\t\t\tif (status.percentComplete !== null) {\r\n\t\t\t\t\t\t\tshowElement(childEl);\r\n\t\t\t\t\t\t\tshowElement(childEl.parentNode);\r\n\r\n\t\t\t\t\t\t\tvar parsedPercentComplete = parseFloat(status.percentComplete);\r\n\r\n\t\t\t\t\t\t\tif (isFinite(parsedPercentComplete)) childEl.style.width = parsedPercentComplete.toFixed(2) + \"%\";\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tvar onSessionStarted = function (status) {\r\n\t\t\tif (settings.showDuringUpload) showElement(settings.element);\r\n\r\n\t\t\tupdateDisplay(status);\r\n\t\t};\r\n\r\n\t\tvar onSessionProgress = function (status) {\r\n\t\t\tupdateDisplay(status);\r\n\t\t};\r\n\r\n\t\tvar onSessionEnded = function (status) {\r\n\t\t\tupdateDisplay(status);\r\n\r\n\t\t\tif (settings.hideAfterUpload) settings.element.style.display = \"none\";\r\n\t\t};\r\n\r\n\t\t// constructor\r\n\t\tif (support.isSupportedBrowser) {\r\n\t\t\tcomponentConstructor(this, settings, options, null, true, \"su-uploadprogressdisplay\");\r\n\r\n\t\t\tresolveComponent(settings, \"uploadConnector\", kw.UploadConnector, \"UploadConnector\", true);\r\n\r\n\t\t\tsettings.uploadConnector.add_OnUploadSessionStarted(onSessionStarted, true);\r\n\t\t\tsettings.uploadConnector.add_OnUploadSessionProgress(onSessionProgress, true);\r\n\t\t\tsettings.uploadConnector.add_OnUploadSessionEnded(onSessionEnded, true);\r\n\r\n\t\t\tconnectTemplate(settings.element, templateElements);\r\n\r\n\t\t\tlog(\"UploadProgressDisplay constructed\", settings.id, settings, this);\r\n\t\t} else log(\"UploadProgressDisplay NOT constructed -- unsupported browser\", settings.id, settings, this);\r\n\t};\r\n\r\n\tkw.UploadConnector = function (options) {\r\n\t\t// fields\r\n\t\tvar\r\n\t\tself = this,\r\n\t\t\tuploadConnectorImpl = null,\r\n\t\t\tfiles = [],\r\n\t\t\tuploadThreadTimeout = null,\r\n\t\t\toriginalOnSubmit = null,\r\n\t\t\tsubmittedElement = null,\r\n\t\t\tuploadSessionIdElement = null,\r\n\t\t\tuploadErrorTypeElement = null,\r\n\t\t\tsourceConnectorIdElement = null,\r\n\t\t\tfailedRequestsElement = null,\r\n\t\t\tcancelledRequests = [],\r\n\t\t\tcancelledRequestsElement = null,\r\n\t\t\tcompletionIframeElement = null,\r\n\t\t\tuploadDataElement = null,\r\n\t\t\tisCompleting = false,\r\n\t\t\tisManuallyStartedUpload = false,\r\n\t\t\tsettings = {\r\n\t\t\t\tid: null,\r\n\t\t\t\tallowPartialError: false,\r\n\t\t\t\tuploadHandlerUrl: null,\r\n\t\t\t\tcompleteHandlerUrl: null,\r\n\t\t\t\tdocumentDomain: null,\r\n\t\t\t\tuploadSessionId: generateGuid(),\r\n\t\t\t\tuploadForm: null,\r\n\t\t\t\tautoUploadOnSubmit: false,\r\n\t\t\t\tautoUploadTriggerIdList: null,\r\n\t\t\t\tautoCompleteAfterLastFile: true,\r\n\t\t\t\t// includeFormData: false, // TODO: implement\r\n\t\t\t\tconfirmNavigateDuringUploadMessage: null,\r\n\t\t\t\tuploadProfile: null,\r\n\t\t\t\tcompletionMethod: \"POST\",\r\n\t\t\t\tcompletionBody: null,\r\n\t\t\t\tcompletionContentType: \"application/x-www-form-urlencoded\",\r\n\t\t\t\tpollInterval: 1000,\r\n\t\t\t\tpollTimeout: 6500,\r\n\t\t\t\tuploadTimeout: 15000,\r\n\t\t\t\tvalidationGroup: null,\r\n\t\t\t\ttimeoutDoubleOnResponse: true,\r\n\t\t\t\thasDoubledTimeout: false,\r\n\t\t\t\tpostbackFunction: null,\r\n\t\t\t\tconcurrentMaxFiles: 1,\r\n\t\t\t\tdata: {},\r\n\t\t\t\tstatus: {\r\n\t\t\t\t\tstate: kw.UploadState.Initializing,\r\n\t\t\t\t\terrorType: kw.UploadErrorType.None\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tevents = {\r\n\t\t\t\tbeforeSessionStartHandlers: [],\r\n\t\t\t\tuploadSessionStartedHandlers: [],\r\n\t\t\t\tuploadFileStartedHandlers: [],\r\n\t\t\t\tuploadFileEndedHandlers: [],\r\n\t\t\t\tuploadSessionProgressHandlers: [],\r\n\t\t\t\tbeforeSessionEndHandlers: [],\r\n\t\t\t\tuploadSessionEndedHandlers: []\r\n\t\t\t};\r\n\r\n\t\tthis.set_CompletionBody = function (value) {\r\n\t\t\tsettings.completionBody = value;\r\n\t\t};\r\n\t\tthis.set_Data = function (key, value) {\r\n\t\t\tsettings.data[key] = value;\r\n\t\t};\r\n\r\n\t\tvar html4UploadConnector = function () {\r\n\t\t\tthis.uploadFile = function (file, uploadUrl) {\r\n\t\t\t\tvar id = file.get_Id();\r\n\t\t\t\tvar sourceId = id + \"-source\";\r\n\t\t\t\tvar targetId = id + \"-target\";\r\n\r\n\t\t\t\tfile.uploadFrame = addIFrame(targetId);\r\n\t\t\t\tfile.form = addForm(sourceId, targetId, uploadUrl);\r\n\t\t\t\tfile.uploadUrl = uploadUrl;\r\n\t\t\t\tfile.pollProgress = true;\r\n\r\n\t\t\t\tif (objectSize(settings.data) > 0) {\r\n\t\t\t\t\tvar dataElement = document.createElement(\"input\");\r\n\r\n\t\t\t\t\tdataElement.type = \"hidden\";\r\n\t\t\t\t\tdataElement.name = \"kw_uploadData\";\r\n\t\t\t\t\tdataElement.value = queryStringSerialize(settings.data);\r\n\r\n\t\t\t\t\tfile.form.appendChild(dataElement);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfile.form.appendChild(file.get_FileObject());\r\n\r\n\t\t\t\t// setTimeout required for webkit\r\n\t\t\t\twindow.setTimeout(function () {\r\n\t\t\t\t\tif (file.form) {\r\n\t\t\t\t\t\tfile.form.submit();\r\n\r\n\t\t\t\t\t\tfile.state = \"uploading\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}, 1);\r\n\r\n\r\n\t\t\t\t//file.form.submit();\r\n\t\t\t};\r\n\r\n\t\t\tthis.heartbeatCheck = function () {\r\n\t\t\t\tfor (var i = files.length - 1; i >= 0; i--) {\r\n\t\t\t\t\tvar file = files[i];\r\n\r\n\t\t\t\t\tif (file.state == \"uploading\") {\r\n\t\t\t\t\t\tif (getIsUploadError(file) || (file.action == \"calculatesize\" && getIsLoaded(file.uploadFrame) && !getIsUploadError(file, file.uploadUrl))) file.state = \"checking\";\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t/*if (!file.findingError && file.isStarted)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar isErrored = false;\r\n\r\n\t\t\t\t\t\tif (file.mode == \"calculatesize\" && (getIsUploadError(file) || (getIsLoaded(file.uploadFrame) && !getIsUploadError(file, file.uploadUrl))))\r\n\t\t\t\t\t\t\tisErrored = true;\r\n\t\t\t\t\t\telse if (file.mode == \"upload\" && getIsUploadError(file))\r\n\t\t\t\t\t\t\tisErrored = true;\r\n\r\n\t\t\t\t\t\tif (isErrored)\r\n\t\t\t\t\t\t\tonRequestProgress(file, null);\r\n\t\t\t\t\t}*/\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tthis.disposeFile = function (file) {\r\n\t\t\t\tif (file.uploadFrame) {\r\n\t\t\t\t\tfile.uploadFrame.src = \"javascript:false;\";\r\n\t\t\t\t\t//window.frames[file.uploadFrame.id].location = \"javascript:false;\";\r\n\r\n\t\t\t\t\tfile.uploadFrame.parentNode.removeChild(file.uploadFrame);\r\n\t\t\t\t}\r\n\t\t\t\tif (file.progressFrame) file.progressFrame.parentNode.removeChild(file.progressFrame);\r\n\t\t\t\tif (file.form) file.form.parentNode.removeChild(file.form);\r\n\r\n\t\t\t\tdelete file.uploadFrame;\r\n\t\t\t\tdelete file.progressFrame;\r\n\t\t\t\tdelete file.form;\r\n\t\t\t\tdelete file.uploadUrl;\r\n\t\t\t};\r\n\r\n\t\t\t// private methods\r\n\t\t\tvar addForm = function (id, targetId, url) {\r\n\t\t\t\tvar form = document.createElement(\"form\");\r\n\r\n\t\t\t\tform.name = form.id = id;\r\n\t\t\t\tform.action = url;\r\n\r\n\t\t\t\tform.enctype = form.encoding = \"multipart/form-data\";\r\n\t\t\t\tform.method = \"POST\";\r\n\r\n\t\t\t\tform.style.display = \"none\";\r\n\r\n\t\t\t\tdocument.body.appendChild(form);\r\n\r\n\t\t\t\tform.target = targetId;\r\n\r\n\t\t\t\treturn form;\r\n\t\t\t};\r\n\r\n\t\t\tvar getIsUploadError = function (file, uploadHandlerUrl) {\r\n\t\t\t\tif (!uploadHandlerUrl) uploadHandlerUrl = settings.uploadHandlerUrl;\r\n\r\n\t\t\t\treturn isIFrameError(file.get_Id() + \"-target\", uploadHandlerUrl);\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tvar html5UploadConnector = function () {\r\n\t\t\tthis.uploadFile = function (file, uploadUrl) {\r\n\t\t\t\tvar fileData = file.get_FileObject();\r\n\r\n\t\t\t\tvar xhr = getXmlReq();\r\n\r\n\t\t\t\tfile.uploadXhr = xhr;\r\n\r\n\t\t\t\t//var eventSource = ;\r\n\r\n\t\t\t\t//xhr.upload.addEventListener(\"progress\", onUploadProgress, false);\r\n\t\t\t\t//bind(eventSource, \"load\", file, onUploadComplete);\r\n\t\t\t\tbind(xhr, \"error\", file, onUploadError, null, true);\r\n\t\t\t\t//bind(xhr, \"abort\", file, onUploadError, null, true);\r\n\t\t\t\tbind(xhr.upload || xhr, \"progress\", file, onUploadProgress);\r\n\t\t\t\tbind(xhr, \"readystatechange\", file, onReadyStateChange, null, true);\r\n\r\n\t\t\t\txhr.open(\"POST\", uploadUrl, true);\r\n\r\n\t\t\t\txhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n\t\t\t\txhr.setRequestHeader(\"X-File-Size\", fileData.fileSize);\r\n\r\n\t\t\t\t//xhr.setRequestHeader(\"Content-Length\", fileData.fileSize);\r\n\t\t\t\t// TODO: pass along form vars\r\n\t\t\t\tif (window.FormData) {\r\n\t\t\t\t\tvar formData = new FormData();\r\n\r\n\t\t\t\t\tif (objectSize(settings.data) > 0) formData.append(\"X-SlickUpload-Data\", queryStringSerialize(settings.data));\r\n\r\n\t\t\t\t\t// TODO: genericise the name\r\n\t\t\t\t\tformData.append(file.get_FileSelector().get_Id() + \"_\" + file.get_Id(), fileData);\r\n\r\n\t\t\t\t\txhr.send(formData);\r\n\t\t\t\t} else {\r\n\t\t\t\t\txhr.setRequestHeader(\"X-File-Name\", fileData.fileName);\r\n\t\t\t\t\txhr.setRequestHeader(\"X-File-Content-Type\", fileData.type);\r\n\t\t\t\t\txhr.setRequestHeader(\"X-File-Source-Element\", file.get_FileSelector().get_Id() + \"_\" + file.get_Id());\r\n\t\t\t\t\txhr.setRequestHeader(\"Content-Type\", \"application/octet-stream\");\r\n\r\n\t\t\t\t\tif (objectSize(settings.data) > 0) xhr.setRequestHeader(\"X-SlickUpload-Data\", queryStringSerialize(settings.data));\r\n\r\n\t\t\t\t\t/*if (xhr.sendAsBinary && fileData.getAsBinary)\r\n\t\t\t\t\txhr.sendAsBinary(fileData.getAsBinary());\r\n\t\t\t\t\telse*/\r\n\t\t\t\t\txhr.send(fileData);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfile.state = \"uploading\";\r\n\t\t\t};\r\n\r\n\t\t\tthis.disposeFile = function (file) {\r\n\t\t\t\tif (file.status != \"complete\" && file.uploadXhr && file.uploadXhr.abort) file.uploadXhr.abort();\r\n\r\n\t\t\t\tdelete file.uploadXhr;\r\n\t\t\t};\r\n\r\n\t\t\tfunction onUploadProgress(e) {\r\n\t\t\t\tvar position = e.position || e.loaded;\r\n\t\t\t\tvar total = e.totalSize || e.total;\r\n\r\n\t\t\t\tif (position === 0 || position === total || !this.lastProgressReceiveDate || (new Date().getTime() - this.lastProgressReceiveDate.getTime() > 100)) {\r\n\t\t\t\t\t// Don't update if we got to the end before we received the initial ping\r\n\t\t\t\t\t// TODO: only up\r\n\t\t\t\t\tif (this.lastProgressReceiveDate || position < total) {\r\n\t\t\t\t\t\tvar data = {\r\n\t\t\t\t\t\t\tposition: position\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\t// Only pass contentLength if we haven't already gotten it from the initial ping\r\n\t\t\t\t\t\tif (!this.lastProgressReceiveDate) data.contentLength = total;\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t// Make sure that date is updated so we don't time out if we do a manual progress request later\r\n\t\t\t\t\t\t\tthis.lastProgressReceiveDate = new Date();\r\n\r\n\t\t\t\t\t\tonRequestProgressInternal(this, data);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar status = this.get_Status();\r\n\r\n\t\t\t\tif (status && status.state == kw.UploadState.Error) disposeFile(this);\r\n\t\t\t\t// TODO: check for error\r\n\t\t\t}\r\n\r\n\t\t\tfunction onUploadError(e) {\r\n\t\t\t\t// TODO: fix\r\n\t\t\t\tthis.state = \"checking\";\r\n\t\t\t\t//onRequestProgress(this, null);\r\n\t\t\t}\r\n\r\n\t\t\tvar onReadyStateChange = function (e, source) {\r\n\t\t\t\tif (source.readyState == 4) {\r\n\t\t\t\t\tvar data = null;\r\n\r\n\t\t\t\t\tif (source.status == 200 && source.responseText && source.responseText.length > 0) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tdata = eval(\"(\" + source.responseText + \")\");\r\n\t\t\t\t\t\t} catch (ex) {\r\n\t\t\t\t\t\t\tdata = null;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (kw.verboseLog && data === null) log(\"Received HTML5 completion with null data.\", \"status=\" + source.status, source.responseText);\r\n\r\n\t\t\t\t\tonRequestProgressInternal(this, data);\r\n\r\n\t\t\t\t\tunbind(source, \"readystatechange\", null, true);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tvar uploadThread = function () {\r\n\t\t\tif (uploadThreadTimeout) {\r\n\t\t\t\tclearTimeout(uploadThreadTimeout);\r\n\r\n\t\t\t\tuploadThreadTimeout = null;\r\n\t\t\t}\r\n\r\n\t\t\tif (uploadConnectorImpl.heartbeatCheck) uploadConnectorImpl.heartbeatCheck();\r\n\r\n\t\t\tvar hasWork = false;\r\n\r\n\t\t\tvar uploadingFileCount = 0;\r\n\r\n\t\t\tfor (var i = 0; i < files.length; i++) {\r\n\t\t\t\tvar file = files[i];\r\n\r\n\t\t\t\tif (file.state == \"uploading\" || file.state == \"checking\") uploadingFileCount++;\r\n\r\n\t\t\t\tif (file.action == \"calculatesize\" || file.state == \"checking\" || (settings.status.state == kw.UploadState.Uploading && (file.state == \"uploading\" || file.state == \"ready\"))) hasWork = true;\r\n\r\n\t\t\t\tif (settings.status.state == kw.UploadState.Uploading && uploadingFileCount < settings.concurrentMaxFiles && file.state == \"ready\") {\r\n\t\t\t\t\tuploadFile(file);\r\n\r\n\t\t\t\t\tuploadingFileCount++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (file.action == \"calculatesize\" || (file.state == \"uploading\" && ((!file.lastProgressSendDate || !file.lastProgressReceiveDate) || file.pollProgress || !file.get_Status() || file.get_Status().errorType == \"ServerUnavailable\")) || file.state == \"checking\") {\r\n\t\t\t\t\tvar now = new Date();\r\n\t\t\t\t\tvar lastActionDate = file.lastProgressReceiveDate || file.firstProgressSendDate;\r\n\r\n\t\t\t\t\tif (lastActionDate && now - lastActionDate > settings.uploadTimeout) {\r\n\t\t\t\t\t\tif (kw.verboseLog) log(\"cancel-lastReceive:\" + (file.lastProgressReceiveDate ? file.lastProgressReceiveDate : \"null\") + \";firstSend:\" + (file.firstProgressSendDate ? file.firstProgressSendDate : \"null\") + \";actionTimeout:\" + (now - lastActionDate));\r\n\r\n\t\t\t\t\t\tcancelProgressRequest(file);\r\n\r\n\t\t\t\t\t\tonRequestProgressInternal(file, null, true);\r\n\t\t\t\t\t\t// TODO: error\r\n\t\t\t\t\t} else if (!file.lastProgressSendDate || now - file.lastProgressSendDate >= settings.pollTimeout || (file.lastProgressReceiveDate && file.lastProgressReceiveDate > file.lastProgressSendDate && now - file.lastProgressReceiveDate >= settings.pollInterval)) {\r\n\t\t\t\t\t\tif (now - file.startDate >= settings.pollInterval) {\r\n\t\t\t\t\t\t\tif (kw.verboseLog) log(\"execute-lastSend:\" + (!file.lastProgressSendDate ? \"null\" : (file.lastProgressSendDate + \";lastSendInterval:\" + (now - file.lastProgressSendDate) + \";lastReceiveInterval:\" + (!file.lastProgressReceiveDate ? \"null\" : (now - file.lastProgressReceiveDate)))));\r\n\r\n\t\t\t\t\t\t\tvar isLastRetry = lastActionDate && now - lastActionDate + settings.pollTimeout + settings.pollInterval > settings.uploadTimeout;\r\n\r\n\t\t\t\t\t\t\texecuteProgressRequest(file, getUrl(\"progress\", file, isLastRetry), onRequestProgressInternal);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Exit early if we have nothing left to do\r\n\t\t\t\tif (uploadingFileCount >= settings.concurrentMaxFiles && hasWork) break;\r\n\t\t\t}\r\n\r\n\t\t\tif (!hasWork && settings.autoCompleteAfterLastFile && (settings.status.state == kw.UploadState.Uploading || settings.status.state == kw.UploadState.Error)) self.complete(true);\r\n\r\n\t\t\tif ((hasWork || settings.status.state == kw.UploadState.Completing) && settings.status.state != kw.UploadState.Error) uploadThreadTimeout = window.setTimeout(function () {\r\n\t\t\t\tuploadThread.call(this);\r\n\t\t\t}, settings.pollInterval / 2);\r\n\r\n\t\t\tif (settings.status.state == kw.UploadState.Completing) {\r\n\t\t\t\tvar now = new Date();\r\n\t\t\t\tvar lastActionDate = self.lastProgressReceiveDate || self.firstProgressSendDate;\r\n\r\n\t\t\t\tif (lastActionDate && now - lastActionDate > settings.uploadTimeout) {\r\n\t\t\t\t\t//cancelProgressRequest(file);\r\n\r\n\t\t\t\t\t//onRequestProgressInternal(file, null, true);\r\n\t\t\t\t\t// TODO: error\r\n\t\t\t\t} else if (!self.lastProgressSendDate || now - self.lastProgressSendDate >= settings.pollTimeout || (self.lastProgressReceiveDate && self.lastProgressReceiveDate > self.lastProgressSendDate && now - self.lastProgressReceiveDate >= settings.pollInterval)) {\r\n\t\t\t\t\t//if (now - self.startDate >= settings.pollInterval)\r\n\t\t\t\t\texecuteProgressRequest(self, getUrl(\"progress\"), onSessionProgressInternal);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar uploadFile = function (file, isCalculateSize) {\r\n\t\t\tvar uploadUrl = getUrl((isCalculateSize ? \"calculatesize\" : \"upload\"), file);\r\n\r\n\t\t\tfile.action = (isCalculateSize ? \"calculatesize\" : \"upload\");\r\n\t\t\tfile.state = \"uploading\";\r\n\t\t\tfile.startDate = new Date();\r\n\r\n\t\t\tfile.lastProgressSendDate = null;\r\n\t\t\tfile.firstProgressSendDate = null;\r\n\t\t\tfile.lastProgressReceiveDate = null;\r\n\r\n\t\t\tuploadConnectorImpl.uploadFile(file, uploadUrl);\r\n\r\n\t\t\tif (isCalculateSize) {\r\n\t\t\t\tuploadThread();\r\n\t\t\t} else {\r\n\t\t\t\tcallHandlers(events.uploadFileStartedHandlers, file);\r\n\t\t\t}\r\n\r\n\t\t\tlog(settings.id + \" - starting \" + (isCalculateSize ? \"size calculation\" : \"upload\") + \" - \" + file.get_Name(), file);\r\n\t\t};\r\n\r\n\t\tvar getUrl = function (handlerType, file, isLastRetry) {\r\n\t\t\tvar url = settings.uploadHandlerUrl + (settings.uploadHandlerUrl.indexOf(\"?\") > 0 ? \"&\" : \"?\") + \"handlerType=\" + handlerType;\r\n\r\n\t\t\turl += \"&uploadSessionId=\" + settings.uploadSessionId;\r\n\r\n\t\t\tif (file) {\r\n\t\t\t\t//url += \"&name=\" + encodeURIComponent(file.get_Name());\r\n\t\t\t\t//url += \"&length=\" + file.get_Size();\r\n\r\n\t\t\t\turl += \"&uploadRequestId=\" + file.get_Id();\r\n\r\n\t\t\t\tif (settings.uploadProfile) url += \"&uploadProfile=\" + settings.uploadProfile;\r\n\t\t\t}\r\n\r\n\t\t\tif (isLastRetry) url += \"&isLastRetry=true\";\r\n\r\n\t\t\treturn url;\r\n\t\t};\r\n\r\n\t\tvar onRequestProgressInternal = function (file, data, isFinalRequest) {\r\n\t\t\tif (kw.verboseLog) {\r\n\t\t\t\tif (data) log(\"Received file progress. Status: \" + data.status, file, data.position, data.contentLength, \"isFinalRequest=\" + isFinalRequest);\r\n\t\t\t\telse log(\"Received file progress with null data.\", file, \"isFinalRequest=\" + isFinalRequest);\r\n\t\t\t}\r\n\r\n\t\t\tvar currentStatus = file.get_Status();\r\n\r\n\t\t\tvar newProgressException = null;\r\n\r\n\t\t\tif (data && data.progressException) newProgressException = data.progressException;\r\n\r\n\t\t\tif (!data || data.progressException) {\r\n\t\t\t\tdata = {\r\n\t\t\t\t\tstatus: kw.UploadState.Error,\r\n\t\t\t\t\terrorType: \"ServerUnavailable\"\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif (newProgressException) data.progressException = newProgressException;\r\n\t\t\t} else if (data.status) {\r\n\t\t\t\tif (currentStatus && data.position < currentStatus.position) //|| data.position != data.contentLength) && !file.pollProgress && !file.lastProgressReceiveDate)\r\n\t\t\t\t{\r\n\t\t\t\t\t// If we got to the end of the file before receiving the initial ping, switch to progress polling\r\n\t\t\t\t\tif (!file.lastProgressReceiveDate && currentStatus.position == currentStatus.contentLength) file.pollProgress = true;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\t// This is probably the test ping request for an HTML5 upload. Throw away position in case it is out of date.\r\n\t\t\t\t\t\tdelete data.position;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfile.lastProgressReceiveDate = new Date();\r\n\r\n\t\t\t\tif (settings.timeoutDoubleOnResponse && !settings.hasDoubledTimeout) {\r\n\t\t\t\t\tsettings.pollTimeout *= 2;\r\n\t\t\t\t\tsettings.uploadTimeout *= 2;\r\n\r\n\t\t\t\t\tsettings.hasDoubledTimeout = true;\r\n\r\n\t\t\t\t\tlog(\"First response received and timeoutDoubleOnResponse=true. Doubling timeouts.\", settings);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (data && currentStatus) data = extend(currentStatus, data);\r\n\r\n\t\t\tif (data.errorType == \"ServerUnavailable\" && isFinalRequest) {\r\n\t\t\t\tvar message;\r\n\r\n\t\t\t\tif (data.progressException) message = \"DEBUG MESSAGE: Request progress handler (\" + settings.uploadHandlerUrl + \") exception: \" + data.progressException.replace(/\\\\r\\\\n/g, \"\\n\");\r\n\t\t\t\telse if (file.action != \"calculatesize\") message = \"DEBUG MESSAGE: Could not contact SlickUpload request progress handler at \\\"\" + settings.uploadHandlerUrl + \"\\\".\";\r\n\r\n\t\t\t\tlog(message, file, data);\r\n\r\n\t\t\t\tif (kw.debug) alert(message);\r\n\t\t\t}\r\n\r\n\t\t\tif (file.action == \"calculatesize\" && (isFinalRequest || data.errorType != \"ServerUnavailable\")) {\r\n\t\t\t\tfile.action = \"upload\";\r\n\t\t\t\tfile.state = \"ready\";\r\n\r\n\t\t\t\tuploadConnectorImpl.disposeFile(file);\r\n\t\t\t} else if (file.action == \"upload\") {\r\n\t\t\t\t// TODO: complete and errored modes?\r\n\t\t\t\tif (data.status == kw.UploadState.Complete || (data.status == kw.UploadState.Error && (isFinalRequest || data.errorType != \"ServerUnavailable\")) && file.state != \"complete\") {\r\n\t\t\t\t\tfile.state = \"complete\";\r\n\r\n\t\t\t\t\tdata.isErrored = (data.errorType != \"None\");\r\n\r\n\t\t\t\t\tuploadConnectorImpl.disposeFile(file);\r\n\r\n\t\t\t\t\t//file.pollProgress = false;\r\n\r\n\t\t\t\t\t// Ensure status is set before we call other handlers. It's possible we complete before we get a progress event to fire. This is a known issue on FF 3.6 with tiny files.\r\n\t\t\t\t\tfile._set_Status(data, isFinalRequest);\r\n\r\n\t\t\t\t\tcallHandlers(events.uploadFileEndedHandlers, file);\r\n\r\n\t\t\t\t\tvar message = settings.id + \" - file upload complete - \" + file.get_Name() + \".\";\r\n\r\n\t\t\t\t\tif (data.errorType != \"None\") message += \" Error: \" + data.errorType + \".\";\r\n\r\n\t\t\t\t\tif (data.errorMessage) message += \" Message: \" + data.errorMessage;\r\n\r\n\t\t\t\t\tlog(message, file, data);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// TODO: check for file.state = \"complete\" and don't do this, if it was done above?\r\n\t\t\tfile._set_Status(data, isFinalRequest);\r\n\r\n\t\t\tif (settings.status.state == kw.UploadState.Uploading) onSessionStatusUpdate();\r\n\t\t};\r\n\r\n\t\tvar onSessionProgressInternal = function (uploadConnector, data, isFinalRequest) {\r\n\t\t\tif (kw.verboseLog) log(\"Received session progress.\", uploadConnector, data, \"isFinalRequest=\" + isFinalRequest);\r\n\r\n\t\t\t/*if (uploadConnector.progressTimeout)\r\n\t\t\t{\r\n\t\t\t\twindow.clearTimeout(uploadConnector.progressTimeout);\r\n\r\n\t\t\t\tuploadConnector.progressTimeout = null;\r\n\t\t\t}*/\r\n\r\n\t\t\tvar newProgressException = null;\r\n\r\n\t\t\tif (data && data.progressException) newProgressException = data.progressException;\r\n\r\n\t\t\tif (!data || data.progressException) {\r\n\t\t\t\tdata = {\r\n\t\t\t\t\tstatus: kw.UploadState.Error,\r\n\t\t\t\t\terrorType: \"ServerUnavailable\"\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif (newProgressException) data.progressException = newProgressException;\r\n\t\t\t} else if (data.state) uploadConnector.lastProgressReceiveDate = new Date();\r\n\r\n\t\t\tif (data.errorType == \"ServerUnavailable\" && isFinalRequest) {\r\n\t\t\t\tvar message;\r\n\r\n\t\t\t\tif (data.progressException) message = \"DEBUG MESSAGE: Session progress handler (\" + settings.uploadHandlerUrl + \") exception: \" + data.progressException.replace(/\\\\r\\\\n/g, \"\\n\");\r\n\t\t\t\telse if (file.action != \"calculatesize\") message = \"DEBUG MESSAGE: Could not contact SlickUpload session progress handler at \\\"\" + settings.uploadHandlerUrl + \"\\\".\";\r\n\r\n\t\t\t\tlog(message, settings.status, data);\r\n\r\n\t\t\t\tif (kw.debug) alert(message);\r\n\t\t\t}\r\n\r\n\t\t\tif (settings.status && settings.status.state == \"Completing\" && data) data.state = \"Completing\";\r\n\r\n\t\t\textend(settings.status, data);\r\n\r\n\t\t\t/*if (settings.status.errorType == \"ServerUnavailable\")\r\n\t\t\t\tuploadConnector.progressRetryCount = (uploadConnector.progressRetryCount || 0) + 1;\r\n\r\n\t\t\t\tif (settings.status.state == kw.UploadState.Completing && (uploadConnector.progressRetryCount || 0) < 5)\r\n\t\t\t\t\twindow.setTimeout(function ()\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\texecuteProgressRequest(uploadConnector, getUrl(\"progress\"), onSessionProgressInternal);\r\n\t\t\t\t\t}, 1000);\r\n\t\t\t\telse if ((uploadConnector.progressRetryCount || 0) == 5)\r\n\t\t\t\t\tdata.status = kw.UploadState.Error;*/\r\n\r\n\t\t\tsanitizeStatus();\r\n\r\n\t\t\tcallHandlers(events.uploadSessionProgressHandlers, settings.status);\r\n\t\t};\r\n\r\n\t\tvar onSessionStatusUpdate = function () {\r\n\t\t\tvar position = 0;\r\n\t\t\tvar contentLength = 0;\r\n\t\t\tvar fileCompleteCount = 0;\r\n\t\t\tvar currentFileName = null;\r\n\t\t\tvar currentFileIndex = 0;\r\n\r\n\t\t\tfor (var i = 0; i < files.length; i++) {\r\n\t\t\t\tvar file = files[i];\r\n\t\t\t\tvar status = file.get_Status();\r\n\t\t\t\tvar size = file.get_Size();\r\n\r\n\t\t\t\tif (status && status.position) position += status.position;\r\n\t\t\t\tif (size) // && (status == null || status.status != kw.UploadState.Error))\r\n\t\t\t\t\tcontentLength += size;\r\n\r\n\t\t\t\t// Find either currently uploading file or the last completed\r\n\t\t\t\tif (file.action == \"upload\" && (file.state == \"uploading\" || file.state == \"complete\")) {\r\n\t\t\t\t\tcurrentFileName = file.get_Name();\r\n\t\t\t\t\tcurrentFileIndex++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/*if (file.action == \"upload\" && file.startDate)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar elapsed = (new Date().getTime() - file.startDate.getTime()) / 1000;\r\n\r\n\t\t\t\t\tif (status && status.position)\r\n\t\t\t\t\t\ttotalSpeed += status.position / elapsed;\r\n\t\t\t\t}*/\r\n\t\t\t}\r\n\r\n\t\t\tif (currentFileIndex === 0) currentFileIndex = 1;\r\n\r\n\t\t\tsettings.status.position = position;\r\n\t\t\tsettings.status.contentLength = contentLength;\r\n\t\t\tsettings.status.percentComplete = (position / contentLength * 100);\r\n\t\t\tsettings.status.currentFileName = currentFileName;\r\n\t\t\tsettings.status.currentFileIndex = currentFileIndex;\r\n\t\t\tsettings.status.fileCount = files.length;\r\n\r\n\t\t\tvar elapsed = (new Date().getTime() - settings.status.startDate.getTime()) / 1000;\r\n\r\n\t\t\tif (elapsed) settings.status.totalSpeed = position / elapsed;\r\n\r\n\t\t\tif (settings.status.totalSpeed) settings.status.timeRemaining = (contentLength - position) / settings.status.totalSpeed;\r\n\r\n\t\t\tsanitizeStatus();\r\n\r\n\t\t\tcallHandlers(events.uploadSessionProgressHandlers, settings.status);\r\n\t\t};\r\n\r\n\t\tvar sanitizeStatus = function () {\r\n\t\t\tif (settings.status.percentComplete) {\r\n\t\t\t\tvar parsedPercentComplete = parseFloat(settings.status.percentComplete);\r\n\r\n\t\t\t\tif (isFinite(parsedPercentComplete)) settings.status.percentComplete = Math.min(parsedPercentComplete, 100);\r\n\t\t\t\telse settings.status.percentComplete = 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (settings.status.timeRemaining) {\r\n\t\t\t\tvar parsedTimeRemaining = parseFloat(settings.status.timeRemaining);\r\n\r\n\t\t\t\tif (isFinite(parsedTimeRemaining)) settings.status.timeRemaining = Math.max(parsedTimeRemaining, 0);\r\n\t\t\t\telse settings.status.timeRemaining = 0;\r\n\t\t\t}\r\n\r\n\t\t\t// TODO: sanitize other fields\r\n\t\t};\r\n\r\n\t\tvar cancelProgressRequest = function (object) {\r\n\t\t\tif (object.progressFrame) object.progressFrame.contentWindow.location = \"javascript:false;\";\r\n\t\t\telse if (object.progressXhr) {\r\n\t\t\t\tunbind(object.progressXhr, \"readystatechange\", null, true);\r\n\r\n\t\t\t\tvar isBusy = false;\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tisBusy = object.progressXhr.readyState && object.progressXhr.readyState != 4;\r\n\t\t\t\t} catch (ex) { }\r\n\r\n\t\t\t\tif (object.progressXhr.abort && isBusy) {\r\n\t\t\t\t\t// log(\"cancelling existing request\");\r\n\r\n\t\t\t\t\tobject.progressXhr.abort();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar executeProgressRequest = function (object, url, onProgressRecieved) {\r\n\t\t\tif (kw.verboseLog) log(\"Executing progress request.\", object, url);\r\n\r\n\t\t\t// TODO: do we need this?\r\n\t\t\t//cancelProgressRequest(object);\r\n\r\n\t\t\tobject.lastProgressSendDate = new Date();\r\n\r\n\t\t\tif (!object.firstProgressSendDate) object.firstProgressSendDate = object.lastProgressSendDate;\r\n\r\n\t\t\tif ((support.xmlHttpRequestInSubmit || settings.status.state != kw.UploadState.Completing) && (!settings.documentDomain || support.cors)) {\r\n\t\t\t\tif (object.progressXhr) {\r\n\t\t\t\t\tif (kw.verboseLog) log(\"Cancelling previous progress request.\", object);\r\n\r\n\t\t\t\t\tcancelProgressRequest(object);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tobject.progressXhr = getXmlReq();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tobject.progressXhr.open(\"GET\", url, true);\r\n\r\n\t\t\t\tobject.progressXhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n\r\n\t\t\t\tbind(object.progressXhr, \"readystatechange\", object.progressXhr, function () {\r\n\t\t\t\t\tif (object.progressXhr.readyState == 4) {\r\n\t\t\t\t\t\tvar data = null;\r\n\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tdata = eval(\"(\" + object.progressXhr.responseText + \")\");\r\n\t\t\t\t\t\t} catch (ex) {\r\n\t\t\t\t\t\t\tdata = null;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (objectSize(data) === 0) data = null;\r\n\r\n\t\t\t\t\t\tonProgressRecieved(object, data);\r\n\r\n\t\t\t\t\t\tunbind(object.progressXhr, \"readystatechange\", null, true);\r\n\t\t\t\t\t}\r\n\t\t\t\t}, null, true);\r\n\r\n\t\t\t\tobject.progressXhr.send(\"\");\r\n\t\t\t} else {\r\n\t\t\t\tif (!object.progressFrame) {\r\n\t\t\t\t\tobject.progressFrame = document.createElement(\"iframe\");\r\n\t\t\t\t\tobject.progressFrame.src = \"javascript:false;\";\r\n\t\t\t\t\tobject.progressFrame.style.display = \"none\";\r\n\r\n\t\t\t\t\tdocument.body.appendChild(object.progressFrame);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tobject.progressFrame.contentWindow.location = url;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar onFormSubmitted = function (event) {\r\n\t\t\tif (settings.updatePanelId && window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\t// Check to see if this came from our panel\r\n\t\t\t\t\tvar triggerPanelId = Sys.WebForms.PageRequestManager.getInstance()._postBackSettings.panelID;\r\n\r\n\t\t\t\t\tif (triggerPanelId && triggerPanelId.split(\"|\")[0] != settings.updatePanelId) return true;\r\n\t\t\t\t} catch (ex) { }\r\n\t\t\t}\r\n\r\n\t\t\t// TODO: see if cancelling interferes with anything else...\r\n\t\t\tif (settings.status.state == kw.UploadState.Uploading) {\r\n\t\t\t\t// We cancel this submit, but .complete() triggers a new one\r\n\t\t\t\twindow.setTimeout(self.complete, 1);\r\n\r\n\t\t\t\treturn false;\r\n\t\t\t} else if (settings.status.state != kw.UploadState.Initializing) return true;\r\n\r\n\t\t\tvar ret;\r\n\r\n\t\t\t/*if (originalOnSubmit)\r\n\t\t\t{\r\n\t\t\t\tvar isPreventDefaultCalled = false;\r\n\r\n\t\t\t\tif (event == null)\r\n\t\t\t\t\tevent = window.event;\r\n\r\n\t\t\t\tif (event != null && event.preventDefault)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar oldEvent = event;\r\n\t\t\t\t\tvar eventAdapter = new Object();\r\n\r\n\t\t\t\t\teventAdapter.prototype = event.prototype;\r\n\r\n\t\t\t\t\tfor (key in event)\r\n\t\t\t\t\t\teventAdapter[key] = event[key];\r\n\r\n\t\t\t\t\teventAdapter.preventDefault = function ()\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tisPreventDefaultCalled = true;\r\n\r\n\t\t\t\t\t\tif (oldEvent.preventDefault)\r\n\t\t\t\t\t\t\toldEvent.preventDefault();\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tevent = eventAdapter;\r\n\r\n\t\t\t\t\ttry\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\twindow.event = event;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (ex)\r\n\t\t\t\t\t{ }\r\n\t\t\t\t}\r\n\r\n\t\t\t\tret = originalOnSubmit.call(this);\r\n\r\n\t\t\t\tif (ret == false || isPreventDefaultCalled || (event != null && (event.returnValue == false || event.defaultPrevented == true)))\r\n\t\t\t\t\tret = false;\r\n\t\t\t}*/\r\n\r\n\t\t\t//if (ret != false)\r\n\t\t\t//{\r\n\t\t\tif (files.length > 0 || !settings.autoCompleteAfterLastFile) {\r\n\t\t\t\twindow.setTimeout(function () {\r\n\t\t\t\t\tself.start.call(self, true);\r\n\t\t\t\t}, 1);\r\n\r\n\t\t\t\tret = false;\r\n\t\t\t} else {\r\n\t\t\t\tif (settings.autoUploadOnSubmit && originalOnSubmit) {\r\n\t\t\t\t\tif (settings.uploadForm.validationCallbacks) settings.uploadForm.validationCallbacks.splice(indexOf(settings.uploadForm.validationCallbacks, onFormSubmitted), 1);\r\n\r\n\t\t\t\t\tret = originalOnSubmit(event);\r\n\t\t\t\t} else ret = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (ret === false) {\r\n\t\t\t\tevent = event || window.event;\r\n\r\n\t\t\t\tif (event) {\r\n\t\t\t\t\tif (event.preventDefault) event.preventDefault();\r\n\t\t\t\t\telse if (\"returnValue\" in event) event.returnValue = ret;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t//}\r\n\r\n\t\t\treturn ret;\r\n\t\t};\r\n\r\n\t\tvar wireAutoUploadOnSubmit = function () {\r\n\t\t\tif (window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager) Array.add(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, onFormSubmitted);\r\n\t\t\telse if (window.Sys && Sys.Mvc && Sys.Mvc.AsyncForm) {\r\n\t\t\t\tsettings.uploadForm.validationCallbacks = settings.uploadForm.validationCallbacks || [];\r\n\t\t\t\tsettings.uploadForm.validationCallbacks.push(onFormSubmitted);\r\n\t\t\t}\r\n\t\t\t//}\r\n\t\t\t//else\r\n\t\t\t//{\r\n\t\t\toriginalOnSubmit = settings.uploadForm.onsubmit;\r\n\t\t\tsettings.uploadForm.onsubmit = onFormSubmitted;\r\n\t\t\t//}\r\n\r\n\t\t\t// hook submit elements so we can determine which element submitted\r\n\t\t\t// TODO: ensure we're not getting extra elements here\r\n\t\t\tvar elements = settings.uploadForm.getElementsByTagName(\"*\");\r\n\r\n\t\t\tfor (var i = 0; i < elements.length; i++) {\r\n\t\t\t\tvar el = elements[i];\r\n\r\n\t\t\t\tif (!settings.autoUploadTriggerIdList || indexOf(settings.autoUploadTriggerIdList, el.id) != -1) {\r\n\t\t\t\t\tvar isWireable = false;\r\n\r\n\t\t\t\t\tif (el.type) {\r\n\t\t\t\t\t\tswitch (el.type.toLowerCase()) {\r\n\t\t\t\t\t\t\tcase \"submit\":\r\n\t\t\t\t\t\t\tcase \"image\":\r\n\t\t\t\t\t\t\t\tisWireable = true;\r\n\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (el.tagName == \"A\") isWireable = true;\r\n\r\n\t\t\t\t\tif (isWireable) bind(el, \"click\", this, onElementSubmitted);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// rewrite __doPostBack so we get the proper postback events\r\n\t\t\t// if ASP.NET AJAX, leave __doPostBack as is\r\n\t\t\tif (window.__doPostBack) // && !(window.Sys && Sys.Application))\r\n\t\t\t{\r\n\t\t\t\tvar originalDoPostBack = __doPostBack;\r\n\r\n\t\t\t\t__doPostBack = function (eventTarget, eventArgument) {\r\n\t\t\t\t\t/*theForm.__EVENTTARGET.value = eventTarget;\r\n\t\t\t\t\ttheForm.__EVENTARGUMENT.value = eventArgument;*/\r\n\r\n\t\t\t\t\tsubmittedElement = document.getElementById(eventTarget);\r\n\r\n\t\t\t\t\tif (!submittedElement && eventTarget) {\r\n\t\t\t\t\t\tvar id = eventTarget.replace(/\\$/g, \"_\");\r\n\r\n\t\t\t\t\t\twhile (id.indexOf(\"_\") !== -1 && ((submittedElement = document.getElementById(id)) === null)) {\r\n\t\t\t\t\t\t\tid = id.substr(id.indexOf(\"_\") + 1);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (!theForm.onsubmit || (theForm.onsubmit() !== false)) originalDoPostBack(eventTarget, eventArgument);\r\n\t\t\t\t\t//if (!theForm.onsubmit || (theForm.onsubmit() != false))\r\n\t\t\t\t\t// theForm.submit();\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar onElementSubmitted = function (e, source) {\r\n\t\t\tif (settings.status.state == kw.UploadState.Initializing || !submittedElement) {\r\n\t\t\t\tif (source.tagName != \"A\" || (source.href && source.href.toLowerCase().indexOf(\"dopostback\") != -1)) submittedElement = source;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis._add_File = function (file) {\r\n\t\t\t//file.mode = \"ready\";\r\n\t\t\tfile.state = \"ready\";\r\n\r\n\t\t\tfiles.push(file);\r\n\r\n\t\t\tif (file.get_Size() === null) uploadFile(file, true);\r\n\t\t\telse if (settings.status.state === kw.UploadState.Uploading) uploadThread();\r\n\t\t};\r\n\r\n\t\tthis._remove_File = function (file) {\r\n\t\t\tfor (var i = 0; i < files.length; i++) {\r\n\t\t\t\tif (files[i].get_Id() == file.get_Id()) {\r\n\t\t\t\t\tfiles.splice(i, 1);\r\n\r\n\t\t\t\t\tfile._set_IsCancelled(true);\r\n\r\n\t\t\t\t\tif ((file.action == \"calculatesize\" || file.action == \"upload\") && file.state == \"uploading\") uploadConnectorImpl.disposeFile(file);\r\n\r\n\t\t\t\t\tcancelledRequests.push(file.get_Id());\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis.start = function (invokedByAutoUploadOnSubmit) {\r\n\t\t\tif (settings.status.state != kw.UploadState.Initializing) {\r\n\t\t\t\tlog(settings.id + \" - session has already been started - \" + settings.uploadSessionId + \" - ignoring start request\", settings.status);\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// TODO: exception?\r\n\t\t\t//if (settings.status.state != kw.UploadState.Initializing)\r\n\t\t\t// return false;\r\n\r\n\t\t\t// skip if this is an async postback\r\n\t\t\t/*if (window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager)\r\n\t\t\t{\r\n\t\t\t\tvar prm = Sys.WebForms.PageRequestManager.getInstance();\r\n\r\n\t\t\t\tif (prm.get_isInAsyncPostBack() || (prm._postBackSettings && prm._postBackSettings.async))\r\n\t\t\t\t\treturn true;\r\n\t\t\t}*/\r\n\r\n\t\t\tif (settings.autoUploadOnSubmit) {\r\n\t\t\t\tif (window.Page_ClientValidate && Page_ClientValidate(settings.validationGroup) === false) return false;\r\n\r\n\t\t\t\tisManuallyStartedUpload = (invokedByAutoUploadOnSubmit !== true);\r\n\t\t\t}\r\n\r\n\t\t\tif (callHandlers(events.beforeSessionStartHandlers, settings.status) === false) return false;\r\n\r\n\t\t\tsettings.status.state = kw.UploadState.Uploading;\r\n\t\t\tsettings.status.fileCount = files.length;\r\n\t\t\tsettings.status.startDate = new Date();\r\n\r\n\t\t\tif (files.length > 0) {\r\n\t\t\t\tsettings.status.currentFileIndex = 1;\r\n\t\t\t\tsettings.status.currentFileName = files[0].get_Name();\r\n\t\t\t}\r\n\r\n\t\t\tlog(settings.id + \" - starting session - \" + settings.uploadSessionId, settings.status, \"files=\" + files.length);\r\n\r\n\t\t\tcallHandlers(events.uploadSessionStartedHandlers, settings.status);\r\n\r\n\t\t\tuploadThread();\r\n\t\t};\r\n\r\n\t\tthis.cancel = function () {\r\n\t\t\tif (settings.status.state == kw.UploadState.Uploading) {\r\n\t\t\t\tlog(settings.id + \" - cancelling session - \" + settings.uploadSessionId, settings.status);\r\n\r\n\t\t\t\tfor (var i = 0; i < files.length; i++) {\r\n\t\t\t\t\tfiles[i]._set_IsCancelled(true);\r\n\r\n\t\t\t\t\tuploadConnectorImpl.disposeFile(files[i]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsettings.status.state = kw.UploadState.Error;\r\n\t\t\t\tsettings.status.errorType = kw.UploadErrorType.Cancelled;\r\n\r\n\t\t\t\t// Ensure cancel complete gets executed\r\n\t\t\t\t//uploadThread();\r\n\t\t\t} else {\r\n\t\t\t\tlog(settings.id + \" - skipping session cancellation - \" + settings.uploadSessionId + \". Cancellation can only be performed when UploadState=Uploading.\", settings.status);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis.complete = function (isAutoComplete) {\r\n\t\t\tif (isCompleting) {\r\n\t\t\t\tlog(settings.id + \" - session already completing - \" + settings.uploadSessionId + \" - ignoring complete request\", settings.status);\r\n\r\n\t\t\t\treturn;\r\n\t\t\t} else if (settings.status.state == kw.UploadState.Uploading) {\r\n\t\t\t\tvar hasWork = false;\r\n\r\n\t\t\t\t// TODO: combine this and the check in uploadThread\r\n\t\t\t\t// TODO: fix\r\n\t\t\t\tfor (var i = 0; i < files.length; i++) {\r\n\t\t\t\t\tvar file = files[i];\r\n\r\n\t\t\t\t\tif (file.action == \"calculatesize\" || file.state == \"checking\" || (settings.status.state == kw.UploadState.Uploading && (file.state == \"uploading\" || file.state == \"ready\"))) {\r\n\t\t\t\t\t\thasWork = true;\r\n\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (hasWork) {\r\n\t\t\t\t\tlog(settings.id + \" - session still has uploads in process - \" + settings.uploadSessionId + \" - setting autoCompleteAfterLastFile = true\", settings.status);\r\n\r\n\t\t\t\t\tsettings.autoCompleteAfterLastFile = true;\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tisCompleting = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (files.length === 0 && settings.status.state !== kw.UploadState.Error) {\r\n\t\t\t\tsettings.status.state = kw.UploadState.Error;\r\n\t\t\t\tsettings.status.errorType = kw.UploadErrorType.Cancelled;\r\n\t\t\t} else {\r\n\t\t\t\tvar hasSuccessfulFiles = false;\r\n\r\n\t\t\t\tfor (var i = 0; i < files.length; i++) {\r\n\t\t\t\t\tvar status = files[i].get_Status();\r\n\r\n\t\t\t\t\tif (status && !status.isErrored) {\r\n\t\t\t\t\t\thasSuccessfulFiles = true;\r\n\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!hasSuccessfulFiles) settings.status.errorType = kw.UploadErrorType.Other;\r\n\r\n\t\t\t\tsettings.status.state = (settings.status.errorType == kw.UploadErrorType.None) ? kw.UploadState.Completing : kw.UploadState.Error;\r\n\t\t\t}\r\n\r\n\t\t\tlog(settings.id + \" - session starting completion - \" + settings.uploadSessionId, settings.status);\r\n\r\n\t\t\tcallHandlers(events.beforeSessionEndHandlers, settings.status);\r\n\r\n\t\t\tif (settings.uploadForm && settings.uploadForm.validationCallbacks) settings.uploadForm.validationCallbacks.splice(indexOf(settings.uploadForm.validationCallbacks, onFormSubmitted), 1);\r\n\r\n\t\t\tif (settings.completeHandlerUrl) executeUploadCompleteHandler();\r\n\t\t\telse if (settings.uploadForm) executeUploadCompletePostBack();\r\n\r\n\t\t\tif (!isAutoComplete)\r\n\t\t\t\t// Ensure post processing occurs\r\n\t\t\t\tuploadThread();\r\n\r\n\t\t\tif (settings.uploadForm || settings.completeHandlerUrl) {\r\n\t\t\t\tlog(settings.id + \" - session completing - \" + settings.uploadSessionId, settings.status);\r\n\r\n\t\t\t\tonSessionProgressInternal(this, {});\r\n\t\t\t} else {\r\n\t\t\t\tlog(settings.id + \" - session finished with no completion handler, and will be rolled back - \" + settings.uploadSessionId, settings.status);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar executeUploadCompletePostBack = function () {\r\n\t\t\t//alert(\"completing\");\r\n\r\n\t\t\t// pass back upload execution information\r\n\t\t\tif (!uploadSessionIdElement) {\r\n\t\t\t\tuploadSessionIdElement = document.createElement(\"input\");\r\n\r\n\t\t\t\tuploadSessionIdElement.type = \"hidden\";\r\n\t\t\t\tuploadSessionIdElement.name = \"kw_uploadSessionId\";\r\n\r\n\t\t\t\tsettings.uploadForm.appendChild(uploadSessionIdElement);\r\n\t\t\t}\r\n\r\n\t\t\tif (!uploadErrorTypeElement) {\r\n\t\t\t\tuploadErrorTypeElement = document.createElement(\"input\");\r\n\r\n\t\t\t\tuploadErrorTypeElement.type = \"hidden\";\r\n\t\t\t\tuploadErrorTypeElement.name = \"kw_uploadErrorType\";\r\n\r\n\t\t\t\tsettings.uploadForm.appendChild(uploadErrorTypeElement);\r\n\t\t\t}\r\n\r\n\t\t\tif (!sourceConnectorIdElement) {\r\n\t\t\t\tsourceConnectorIdElement = document.createElement(\"input\");\r\n\r\n\t\t\t\tsourceConnectorIdElement.type = \"hidden\";\r\n\t\t\t\tsourceConnectorIdElement.name = \"kw_sourceConnectorId\";\r\n\r\n\t\t\t\tsettings.uploadForm.appendChild(sourceConnectorIdElement);\r\n\t\t\t}\r\n\r\n\t\t\tif (!failedRequestsElement) {\r\n\t\t\t\tfailedRequestsElement = document.createElement(\"input\");\r\n\r\n\t\t\t\tfailedRequestsElement.type = \"hidden\";\r\n\t\t\t\tfailedRequestsElement.name = \"kw_failedRequests\";\r\n\r\n\t\t\t\tsettings.uploadForm.appendChild(failedRequestsElement);\r\n\t\t\t}\r\n\r\n\t\t\tif (!cancelledRequestsElement) {\r\n\t\t\t\tcancelledRequestsElement = document.createElement(\"input\");\r\n\r\n\t\t\t\tcancelledRequestsElement.type = \"hidden\";\r\n\t\t\t\tcancelledRequestsElement.name = \"kw_cancelledRequests\";\r\n\r\n\t\t\t\tsettings.uploadForm.appendChild(cancelledRequestsElement);\r\n\t\t\t}\r\n\r\n\t\t\tif (!uploadDataElement && objectSize(settings.data) > 0) {\r\n\t\t\t\tuploadDataElement = document.createElement(\"input\");\r\n\r\n\t\t\t\tuploadDataElement.type = \"hidden\";\r\n\t\t\t\tuploadDataElement.name = \"kw_uploadData\";\r\n\r\n\t\t\t\tsettings.uploadForm.appendChild(uploadDataElement);\r\n\t\t\t}\r\n\r\n\t\t\tuploadSessionIdElement.value = settings.uploadSessionId;\r\n\t\t\tuploadErrorTypeElement.value = settings.status.errorType;\r\n\t\t\tsourceConnectorIdElement.value = settings.id;\r\n\r\n\t\t\tvar failedRequests = [];\r\n\r\n\t\t\tfor (var i = 0; i < files.length; i++) {\r\n\t\t\t\tvar status = files[i].get_Status();\r\n\r\n\t\t\t\tif (status && status.isErrored) failedRequests.push(files[i].get_Id());\r\n\t\t\t}\r\n\r\n\t\t\tif (failedRequests.length) failedRequestsElement.value = failedRequests.join(\",\");\r\n\t\t\tif (cancelledRequests.length) cancelledRequestsElement.value = cancelledRequests.join(\",\");\r\n\r\n\t\t\tif (objectSize(settings.data) > 0) uploadDataElement.value = queryStringSerialize(settings.data);\r\n\r\n\t\t\t//settings.uploadForm.enctype = form.encoding = \"application/x-www-form-urlencoded\";\r\n\t\t\t// clear our handler if it exists\r\n\t\t\tif (window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager) Array.remove(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, onFormSubmitted);\r\n\t\t\tif (settings.autoUploadOnSubmit) settings.uploadForm.onsubmit = originalOnSubmit;\r\n\r\n\t\t\tif (submittedElement === null || isManuallyStartedUpload) {\r\n\t\t\t\tif (settings.postbackFunction) {\r\n\t\t\t\t\tif (typeof settings.postbackFunction == \"function\") settings.postbackFunction();\r\n\t\t\t\t\telse eval(settings.postbackFunction);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// settings.uploadForm.submit();\r\n\t\t\t\t\t// Instead, we create a dummy submit button and click it. This makes uploadForm.onsubmit handlers be called,\r\n\t\t\t\t\t// which makes Ajax.BeginForm work, among other things.\r\n\t\t\t\t\tvar submitButton = document.createElement(\"input\");\r\n\r\n\t\t\t\t\tsubmitButton.type = \"submit\";\r\n\t\t\t\t\tsubmitButton.style.display = \"none\";\r\n\r\n\t\t\t\t\tsettings.uploadForm.appendChild(submitButton);\r\n\r\n\t\t\t\t\tsubmitButton.click();\r\n\r\n\t\t\t\t\tsettings.uploadForm.removeChild(submitButton);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tvar submitFunction = function (wasDisabled) {\r\n\t\t\t\t\tif (submittedElement.nodeName === \"A\" && submittedElement.href && submittedElement.href.toLowerCase().match(\"^javascript:\")) {\r\n\t\t\t\t\t\tif (!submittedElement.onclick || submittedElement.onclick() !== false) {\r\n\t\t\t\t\t\t\t// TODO: maybe try both ways?\r\n\t\t\t\t\t\t\teval(decodeURI(submittedElement.href));\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// TODO: error?\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (submittedElement.click) {\r\n\t\t\t\t\t\tsubmittedElement.click();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// TODO: error?\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (wasDisabled) submittedElement.disabled = true;\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif (submittedElement.disabled) {\r\n\t\t\t\t\tsubmittedElement.disabled = false;\r\n\r\n\t\t\t\t\twindow.setTimeout(function () {\r\n\t\t\t\t\t\tsubmitFunction(true);\r\n\t\t\t\t\t}, 1);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsubmitFunction();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//callHandlers(events.uploadSessionEndedHandlers, settings.status);\r\n\r\n\t\t\tisCompleting = false;\r\n\t\t\t//alert(\"completed\");\r\n\t\t};\r\n\r\n\t\tvar executeUploadCompleteHandler = function () {\r\n\t\t\tif (settings.completeHandlerUrl) {\r\n\t\t\t\tvar url = settings.completeHandlerUrl + (settings.completeHandlerUrl.indexOf(\"?\") > 0 ? \"&\" : \"?\");\r\n\r\n\t\t\t\turl += \"uploadSessionId=\" + settings.uploadSessionId;\r\n\r\n\t\t\t\tif (settings.uploadProfile) url += \"&uploadProfile=\" + settings.uploadProfile;\r\n\r\n\t\t\t\tif (settings.status.errorType) url += \"&uploadErrorType=\" + settings.status.errorType;\r\n\r\n\t\t\t\tvar failedRequests = [];\r\n\r\n\t\t\t\tfor (var i = 0; i < files.length; i++) {\r\n\t\t\t\t\tvar status = files[i].get_Status();\r\n\r\n\t\t\t\t\tif (status && status.isErrored) failedRequests.push(files[i].get_Id());\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (failedRequests.length) url += \"&failedRequests=\" + failedRequests.join(\",\");\r\n\t\t\t\tif (cancelledRequests.length) url += \"&cancelledRequests=\" + cancelledRequests.join(\",\");\r\n\r\n\t\t\t\tif (settings.id) url += \"&sourceConnectorId=\" + settings.id;\r\n\r\n\t\t\t\tif (settings.completionContentType == \"application/x-www-form-urlencoded\" && !settings.completionBody) {\r\n\t\t\t\t\tvar completionData = {};\r\n\t\t\t\t\tvar fileListList = [];\r\n\r\n\t\t\t\t\tfor (var key in kw._components) {\r\n\t\t\t\t\t\tvar component = kw._components[key];\r\n\r\n\t\t\t\t\t\tif (component.constructor == kw.FileList) fileListList.push(component);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfor (var i = 0; i < fileListList.length; i++) {\r\n\t\t\t\t\t\tvar elements = fileListList[i].get_Element().getElementsByTagName(\"*\");\r\n\r\n\t\t\t\t\t\tfor (var j = 0; j < elements.length; j++) {\r\n\t\t\t\t\t\t\tvar el = elements[j];\r\n\r\n\t\t\t\t\t\t\tif (el.name && el.value) completionData[el.name] = el.value;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tsettings.completionBody = queryStringSerialize(completionData);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar executeCompleteAction = function () {\r\n\t\t\t\t\tvar xhr = getXmlReq();\r\n\r\n\t\t\t\t\txhr.open(settings.completionMethod || \"POST\", url, true);\r\n\r\n\t\t\t\t\tbind(xhr, \"readystatechange\", this, onUploadCompleteHandlerReadyStateChange, null, true);\r\n\r\n\t\t\t\t\tif (settings.completionContentType) xhr.setRequestHeader(\"Content-Type\", settings.completionContentType);\r\n\r\n\t\t\t\t\tif (objectSize(settings.data) > 0) xhr.setRequestHeader(\"X-SlickUpload-Data\", queryStringSerialize(settings.data));\r\n\r\n\t\t\t\t\txhr.send(settings.completionBody || \"\");\r\n\t\t\t\t};\r\n\r\n\t\t\t\t/*if (!settings.documentDomain || support.cors)\r\n\t\t\t\texecuteCompleteAction();\r\n\t\t\t\telse\r\n\t\t\t\t{*/\r\n\t\t\t\tkw._completionActions.push(executeCompleteAction);\r\n\r\n\t\t\t\tif (completionIframeElement && completionIframeElement.parentNode) completionIframeElement.parentNode.removeChild(completionIframeElement);\r\n\r\n\t\t\t\tcompletionIframeElement = executeCompleteAction.iframe = addIFrame(null, getUrl(\"complete\"));\r\n\t\t\t\t//}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar onUploadCompleteHandlerReadyStateChange = function (e, source) {\r\n\t\t\tif (source.readyState == 4) {\r\n\t\t\t\tsettings.status.state = (source.status == 200 && settings.status.errorType == kw.UploadErrorType.None) ? kw.UploadState.Complete : kw.UploadState.Error;\r\n\r\n\t\t\t\tcallHandlers(events.uploadSessionEndedHandlers, settings.status, source.responseText);\r\n\r\n\t\t\t\tlog(settings.id + \" - session completed - \" + settings.uploadSessionId, settings.status);\r\n\r\n\t\t\t\tunbind(source, \"readystatechange\", null, true);\r\n\r\n\t\t\t\tisCompleting = false;\r\n\r\n\t\t\t\tif (completionIframeElement && completionIframeElement.parentNode) completionIframeElement.parentNode.removeChild(completionIframeElement);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar onBeforeUnload = function (e) {\r\n\t\t\tif (settings.status.state == kw.UploadState.Uploading) {\r\n\t\t\t\te.returnValue = settings.confirmNavigateDuringUploadMessage;\r\n\r\n\t\t\t\treturn settings.confirmNavigateDuringUploadMessage;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis._dispose = function () {\r\n\t\t\tif (window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager) {\r\n\t\t\t\tArray.remove(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, onFormSubmitted);\r\n\t\t\t}\r\n\r\n\t\t\tif (uploadSessionIdElement && uploadSessionIdElement.parentNode) uploadSessionIdElement.parentNode.removeChild(uploadSessionIdElement);\r\n\t\t\tif (uploadErrorTypeElement && uploadErrorTypeElement.parentNode) uploadErrorTypeElement.parentNode.removeChild(uploadErrorTypeElement);\r\n\t\t\tif (sourceConnectorIdElement && sourceConnectorIdElement.parentNode) sourceConnectorIdElement.parentNode.removeChild(sourceConnectorIdElement);\r\n\t\t\tif (failedRequestsElement && failedRequestsElement.parentNode) failedRequestsElement.parentNode.removeChild(failedRequestsElement);\r\n\t\t\tif (cancelledRequestsElement && cancelledRequestsElement.parentNode) cancelledRequestsElement.parentNode.removeChild(cancelledRequestsElement);\r\n\t\t\tif (uploadDataElement && uploadDataElement.parentNode) uploadDataElement.parentNode.removeChild(uploadDataElement);\r\n\t\t};\r\n\r\n\t\t// constructor\r\n\t\tif (support.isSupportedBrowser) {\r\n\t\t\tif (options && options.state) delete options.state;\r\n\r\n\t\t\tcomponentConstructor(this, settings, options, events, false, \"su-uploadconnector\");\r\n\r\n\t\t\tif (settings.documentDomain) document.domain = settings.documentDomain;\r\n\r\n\t\t\tassert(settings.uploadHandlerUrl, \"uploadHandlerUrl is required.\");\r\n\r\n\t\t\tresolveElement(settings, \"uploadForm\", false);\r\n\r\n\t\t\tassert(settings.uploadForm || !settings.autoUploadOnSubmit, \"uploadForm must be specified if autoUploadOnSubmit is true.\");\r\n\r\n\t\t\t// ensure data isn't null\r\n\t\t\tsettings.data = settings.data || {};\r\n\r\n\t\t\tif (settings.autoUploadOnSubmit || (settings.uploadForm && settings.autoUploadOnSubmit !== false)) {\r\n\t\t\t\tif (settings.autoUploadTriggerIdList) {\r\n\t\t\t\t\tif (typeof (settings.autoUploadTriggerIdList) == \"string\") settings.autoUploadTriggerIdList = settings.autoUploadTriggerIdList.split(\",\");\r\n\r\n\t\t\t\t\tif (settings.autoUploadTriggerIdList) {\r\n\t\t\t\t\t\tfor (var i = 0; i < settings.autoUploadTriggerIdList.length; i++)\r\n\t\t\t\t\t\t\tsettings.autoUploadTriggerIdList[i] = trim(settings.autoUploadTriggerIdList[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\twireAutoUploadOnSubmit();\r\n\t\t\t}\r\n\r\n\t\t\tif (settings.confirmNavigateDuringUploadMessage) bind(window, \"beforeunload\", this, onBeforeUnload);\r\n\r\n\t\t\tif (support.html5Upload) uploadConnectorImpl = new html5UploadConnector();\r\n\t\t\telse uploadConnectorImpl = new html4UploadConnector();\r\n\r\n\t\t\tkw._frameLoadedHandlers.push(function (data) {\r\n\t\t\t\tif (data.uploadSessionId == settings.uploadSessionId) {\r\n\t\t\t\t\tif (data.uploadRequestId) {\r\n\t\t\t\t\t\tfor (var i = 0; i < files.length; i++) {\r\n\t\t\t\t\t\t\tvar file = files[i];\r\n\r\n\t\t\t\t\t\t\tif (file.get_Id() == data.uploadRequestId) {\r\n\t\t\t\t\t\t\t\tonRequestProgressInternal(file, data);\r\n\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else onSessionProgressInternal(this, data);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tlog(\"UploadConnector constructed\", settings.id, \"Html\" + (support.html5Upload ? \"5\" : \"4\") + \" mode\", settings, this);\r\n\t\t} else log(\"UploadConnector NOT constructed -- unsupported browser\", settings.id, settings, this);\r\n\r\n\t\tkw._licenseHandlerUrl = getUrl(\"license\");\r\n\t};\r\n\r\n\tkw.SlickUpload = function (options) {\r\n\t\t// fields\r\n\t\tvar\r\n\t\tsettings = {\r\n\t\t\tid: null,\r\n\t\t\telement: null,\r\n\t\t\tfileSelector: null,\r\n\t\t\tfileList: null,\r\n\t\t\tuploadProgressDisplay: null,\r\n\t\t\tuploadConnector: null\r\n\t\t};\r\n\r\n\t\tvar mergeFilter = function (key) {\r\n\t\t\tvar underScorePos = key.indexOf(\"_\");\r\n\r\n\t\t\tif (underScorePos === 0) return false;\r\n\t\t\telse if (underScorePos > 0) key = key.substr(underScorePos + 1);\r\n\r\n\t\t\tswitch (key.toLowerCase()) {\r\n\t\t\t\tcase \"templateelement\":\r\n\t\t\t\tcase \"unskinnedelement\":\r\n\t\t\t\tcase \"unsupportedelement\":\r\n\t\t\t\tcase \"fileselector\":\r\n\t\t\t\tcase \"uploadconnector\":\r\n\t\t\t\t\treturn false;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// TODO: implement props/methods\r\n\r\n\t\t// constructor\r\n\t\tcomponentConstructor(this, settings, options, null, true, \"su-slickupload\");\r\n\r\n\t\tdelete this[\"get_FileSelector\"];\r\n\t\tdelete this[\"get_FileList\"];\r\n\t\tdelete this[\"get_UploadProgressDisplay\"];\r\n\t\tdelete this[\"get_UploadConnector\"];\r\n\r\n\t\tresolveComponent(settings, \"fileSelector\", kw.FileSelector, \"FileSelector\", true);\r\n\t\tresolveComponent(settings, \"fileList\", kw.FileList, \"FileList\", false);\r\n\t\tresolveComponent(settings, \"uploadProgressDisplay\", kw.UploadProgressDisplay, \"UploadProgressDisplay\", false);\r\n\t\tresolveComponent(settings, \"uploadConnector\", kw.UploadConnector, \"UploadConnector\", true);\r\n\r\n\t\tmergeComponent(this, settings.fileSelector, mergeFilter);\r\n\t\tif (settings.fileList) mergeComponent(this, settings.fileList, mergeFilter);\r\n\t\tif (settings.uploadProgressDisplay) mergeComponent(this, settings.uploadProgressDisplay, mergeFilter);\r\n\t\tmergeComponent(this, settings.uploadConnector, mergeFilter);\r\n\r\n\t\tlog(\"SlickUpload constructed\", settings.id, settings, this);\r\n\t};\r\n\r\n\tkw.DropZoneManager = new (function () {\r\n\t\tvar zoneElements = [];\r\n\t\tvar leaveTimeout = null;\r\n\t\tvar areZonesVisible = false;\r\n\r\n\t\tvar isValidDrag = function (dt) {\r\n\t\t\t// TODO: see if this is cross browser\r\n\t\t\t//if (dt && dt.files && dt.types && dt.types.length > 0 && dt.types[0] == \"Files\")\r\n\t\t\treturn dt && ((dt.files && dt.files.length > 0) || (dt.types && indexOf(dt.types, \"Files\") != -1));\r\n\t\t};\r\n\r\n\t\tvar onDocumentDragEnter = function (e) {\r\n\t\t\tvar dt = e.dataTransfer;\r\n\r\n\t\t\tif (isValidDrag(dt)) setZonesVisible(true);\r\n\t\t};\r\n\r\n\t\tvar onDocumentDragOver = function (e) {\r\n\t\t\tvar dt = e.dataTransfer;\r\n\r\n\t\t\tif (dt) dt.dropEffect = \"none\";\r\n\r\n\t\t\tif (!areZonesVisible && isValidDrag(dt)) setZonesVisible(true);\r\n\r\n\t\t\te.stopPropagation();\r\n\t\t\te.preventDefault();\r\n\r\n\t\t\tresetLeaveTimeout();\r\n\t\t};\r\n\r\n\t\tvar onDocumentDragLeave = function (e) {\r\n\t\t\tvar relatedTarget = kw.dropZoneWindow.document.elementFromPoint(e.clientX, e.clientY);\r\n\r\n\t\t\tvar isOutsideBody = false;\r\n\r\n\t\t\tif (!relatedTarget || relatedTarget.nodeName === \"HTML\" || (e.clientX === 0 && e.clientY === 0)) {\r\n\t\t\t\tisOutsideBody = true;\r\n\t\t\t} else if (relatedTarget.nodeName === \"BODY\") {\r\n\t\t\t\tvar size = windowSize();\r\n\r\n\t\t\t\t// TODO: test if 10px margin is enough or too much\r\n\t\t\t\tisOutsideBody = ((e.clientX <= 10 && e.clientY <= 10) || (e.clientX >= size.width - 10 && e.clientY >= size.height - 10));\r\n\t\t\t}\r\n\r\n\t\t\tif (e.dataTransfer === null || isOutsideBody) setZonesVisible(false);\r\n\t\t};\r\n\r\n\t\tvar onZoneDragOver = function (e) {\r\n\t\t\tvar dt = e.dataTransfer;\r\n\r\n\t\t\tif (dt) {\r\n\t\t\t\tif (dt.effectAllowed === \"move\" || dt.effectAllowed === \"linkMove\") dt.dropEffect = \"move\";\r\n\t\t\t\telse dt.dropEffect = \"copy\";\r\n\t\t\t}\r\n\r\n\t\t\te.stopPropagation();\r\n\t\t\te.preventDefault();\r\n\r\n\t\t\tresetLeaveTimeout();\r\n\t\t};\r\n\r\n\t\tvar onZoneDragEnter = function (e) {\r\n\t\t\tvar relatedTarget = kw.dropZoneWindow.document.elementFromPoint(e.clientX, e.clientY);\r\n\r\n\t\t\tif (relatedTarget === this || withinElement(this, e, relatedTarget)) addClass(this, \"kw-dragover\");\r\n\t\t};\r\n\r\n\t\tvar onZoneDragLeave = function (e) {\r\n\t\t\tvar relatedTarget = kw.dropZoneWindow.document.elementFromPoint(e.clientX, e.clientY);\r\n\r\n\t\t\tif (relatedTarget !== this && !withinElement(this, e, relatedTarget)) removeClass(this, \"kw-dragover\");\r\n\t\t};\r\n\r\n\t\tvar onZoneDrop = function (e) {\r\n\t\t\te.stopPropagation();\r\n\t\t\te.preventDefault();\r\n\r\n\t\t\tvar dt = e.dataTransfer;\r\n\r\n\t\t\tlog(\"DropZoneManager - File drop detected.\");\r\n\r\n\t\t\tthis._onDrop(dt.files);\r\n\r\n\t\t\tsetZonesVisible(false);\r\n\t\t};\r\n\r\n\t\tvar resetLeaveTimeout = function () {\r\n\t\t\t// TODO: browser sniff (only should be needed on firefox)\r\n\t\t\tif (leaveTimeout) clearTimeout(leaveTimeout);\r\n\r\n\t\t\tleaveTimeout = setTimeout(function () {\r\n\t\t\t\tsetZonesVisible(false);\r\n\t\t\t}, 100);\r\n\t\t};\r\n\r\n\t\tvar setZonesVisible = function (isVisible) {\r\n\t\t\tfor (var i = 0; i < zoneElements.length; i++) {\r\n\t\t\t\tvar el = zoneElements[i];\r\n\r\n\t\t\t\tif (isVisible) {\r\n\t\t\t\t\taddClass(el, \"kw-dragging\");\r\n\r\n\t\t\t\t\tif (el._showDropZoneOnDocumentDragOver) showElement(el);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tremoveClass(el, \"kw-dragging\");\r\n\r\n\t\t\t\t\tif (el._showDropZoneOnDocumentDragOver) el.style.display = \"none\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tareZonesVisible = isVisible;\r\n\t\t};\r\n\r\n\t\tthis.registerDropZone = function (el, dropTarget, showDropZoneOnDocumentDragOver) {\r\n\t\t\tif (zoneElements.length === 0) {\r\n\t\t\t\tvar zoneDocument = kw.dropZoneWindow.document;\r\n\r\n\t\t\t\tbind(zoneDocument, \"dragover\", zoneDocument, onDocumentDragOver);\r\n\t\t\t\tbind(zoneDocument, \"dragenter\", zoneDocument, onDocumentDragEnter);\r\n\t\t\t\tbind(zoneDocument, \"dragleave\", zoneDocument, onDocumentDragLeave);\r\n\t\t\t}\r\n\r\n\t\t\taddClass(el, \"su-dropzone\");\r\n\r\n\t\t\tel.style.zIndex = \"1000\";\r\n\r\n\t\t\tbind(el, \"dragenter\", el, onZoneDragEnter, true);\r\n\t\t\tbind(el, \"dragleave\", el, onZoneDragLeave, true);\r\n\t\t\tbind(el, \"dragover\", el, onZoneDragOver);\r\n\t\t\tbind(el, \"drop\", dropTarget, onZoneDrop);\r\n\r\n\t\t\tel._showDropZoneOnDocumentDragOver = showDropZoneOnDocumentDragOver;\r\n\r\n\t\t\tzoneElements.push(el);\r\n\t\t};\r\n\r\n\t\t// static constructor\r\n\t\tif (support.browser == \"msie\" && support.browserVersion <= 9) {\r\n\t\t\tkw(function () {\r\n\t\t\t\tvar cancelDropFunction = function (e) {\r\n\t\t\t\t\te.returnValue = false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\tvar zoneBody = kw.dropZoneWindow.document.body;\r\n\r\n\t\t\t\tbind(zoneBody, \"dragenter\", null, cancelDropFunction);\r\n\t\t\t\tbind(zoneBody, \"dragover\", null, cancelDropFunction);\r\n\t\t\t\tbind(zoneBody, \"drop\", null, cancelDropFunction);\r\n\t\t\t});\r\n\t\t}\r\n\t})();\r\n\r\n\tvar init = function () {\r\n\t\tif (!kw._hasWindowLoaded) {\r\n\t\t\tlog(\"Feature support\", support);\r\n\r\n\t\t\tif (window._kwInit) {\r\n\t\t\t\tfor (var i = 0; i < _kwInit.length; i++) {\r\n\t\t\t\t\tvar initFunction = _kwInit[i];\r\n\r\n\t\t\t\t\t// TODO: error if not\r\n\t\t\t\t\t//if (typeof initFunction == \"function\")\r\n\t\t\t\t\tkw(initFunction);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twindow._kwInit = [];\r\n\t\t\t}\r\n\r\n\t\t\t_kwInit.push = kw;\r\n\r\n\t\t\tfor (var i = 0; i < kw._initFunctionList.length; i++)\r\n\t\t\t\tkw._initFunctionList[i]();\r\n\r\n\t\t\tkw._initFunctionList = [];\r\n\r\n\t\t\tkw._hasWindowLoaded = true;\r\n\r\n\t\t\t// Check licensing\r\n\t\t\t/*if (kw._licenseHandlerUrl)\r\n\t\t\t{\r\n\t\t\t\tvar req = getXmlReq();\r\n\t\t\t\treq.open(\"GET\", kw._licenseHandlerUrl, true);\r\n\t\t\t\tvar licenseTimeout = window.setTimeout(function () { handleLicense(null); }, 10000);\r\n\t\t\t\tbind(req, \"readystatechange\", req, function ()\r\n\t\t\t\t{\r\n\t\t\t\t\tif (req.readyState == 4)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar data = null;\r\n\t\t\t\t\t\ttry\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tdata = eval(\"(\" + req.responseText + \")\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcatch (ex)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tdata = null;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (objectSize(data) == 0)\r\n\t\t\t\t\t\t\tdata = null;\r\n\t\t\t\t\t\thandleLicense(data);\r\n\t\t\t\t\t\twindow.clearTimeout(licenseTimeout);\r\n\t\t\t\t\t}\r\n\t\t\t\t}, null, true);\r\n\t\t\t\treq.send(\"\");\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\thandleLicense(null);\r\n\t\t\t}*/\r\n\t\t}\r\n\t};\r\n\r\n\tif (document.readyState && document.readyState == \"complete\") {\r\n\t\tinit();\r\n\t} else {\r\n\t\tbind(window, \"load\", this, init);\r\n\t\tbind(window, \"DOMContentLoaded\", this, init);\r\n\r\n\t\tif (document.getElementsByTagName && (document.getElementsByTagName(\"body\")[0] !== null || document.body !== null)) {\r\n\t\t\tvar lastCount = null;\r\n\r\n\t\t\tvar interval = window.setInterval(function () {\r\n\t\t\t\tvar count = document.getElementsByTagName(\"*\").length;\r\n\r\n\t\t\t\tif (count == lastCount || kw._hasWindowLoaded) {\r\n\t\t\t\t\twindow.clearInterval(interval);\r\n\r\n\t\t\t\t\tif (!kw._hasWindowLoaded) init();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlastCount = count;\r\n\t\t\t\t}\r\n\t\t\t}, 200);\r\n\t\t}\r\n\t}\r\n\r\n\ttry {\r\n\t\tif (window.Sys) {\r\n\t\t\t// Apply hack to fix webkit browsers on older ASP.NET AJAX versions, as per http://forums.asp.net/t/1252014.aspx/1\r\n\t\t\t// TODO: test with v4 to make sure we're not breaking anything\r\n\t\t\tif (Sys.Browser && !Sys.Browser.WebKit) {\r\n\t\t\t\tSys.Browser.WebKit = {}; // Safari 3 is considered WebKit\r\n\r\n\t\t\t\tif (navigator.userAgent.indexOf('WebKit/') > -1) {\r\n\t\t\t\t\tSys.Browser.agent = Sys.Browser.WebKit;\r\n\t\t\t\t\tSys.Browser.version = parseFloat(navigator.userAgent.match(/WebKit\\/(\\d+(\\.\\d+)?)/)[1]);\r\n\t\t\t\t\tSys.Browser.name = 'WebKit';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (Sys.Application) {\r\n\t\t\t\tSys.Application.notifyScriptLoaded();\r\n\t\t\t}\r\n\t\t}\r\n\t} catch (ex) { }\r\n\r\n\twindow.kw = kw;\r\n})();\r\n"],"sourceRoot":"/source/"}