{"version":3,"sources":["../TypeScript/viggo.ts","../TypeScript/viggo.cookie.ts","../TypeScript/viggo.classes.ts","../TypeScript/viggo.dom.ts","../TypeScript/viggo.func.ts","../TypeScript/viggo.richeditor.ts","../TypeScript/viggo.weekcalendar.ts","../TypeScript/viggo.webauthn.ts","../TypeScript/cbor.ts","../TypeScript/viggo.ping.ts","../TypeScript/viggo.effect.ts","../TypeScript/viggo.calendar.ts","../TypeScript/viggo.progress.ts","../TypeScript/viggo.modal.ts","../TypeScript/viggo.ajax.ts","../TypeScript/viggo.history.ts","../TypeScript/viggo.load.ts","../TypeScript/viggo.undo.ts","../TypeScript/viggo.clock.ts","../TypeScript/viggo.hint.ts","../TypeScript/viggo.imageeditor.ts","../TypeScript/viggo.autocomplete.ts","../TypeScript/viggo.dynamiclistview.ts","../TypeScript/viggo.search.ts","../TypeScript/viggo.contextmenu.ts","../TypeScript/viggo.pagination.ts","../TypeScript/viggo.confidential.ts","../TypeScript/viggo.weekcalendar.item.ts","../TypeScript/viggo.editportal.ts","../TypeScript/viggo.notifications.ts","../TypeScript/viggo.navigation.ts","../TypeScript/viggo.picker.ts","../TypeScript/viggo.vibrate.ts","../TypeScript/viggo.prompt.ts","../TypeScript/viggo.upload.ts","../TypeScript/viggo.dragdrop.ts","../TypeScript/viggo.ordering.ts","../TypeScript/viggo.speech.ts","../TypeScript/viggo.error.ts","../TypeScript/viggo.events.viggo.ts"],"names":["viggo","global","undefined","POW_2_24","POW_2_32","POW_2_53","obj","encode","value","lastLength","data","ArrayBuffer","dataView","DataView","offset","prepareWrite","length","newByteLength","byteLength","requiredLength","oldDataView","uint32count","i","setUint32","getUint32","commitWrite","writeUint8","setUint8","writeUint8Array","writeTypeAndLength","type","setUint16","writeUint32","low","high","writeUint64","encodeItem","Math","floor","setFloat64","writeFloat64","utf8data","charCode","charCodeAt","push","Array","isArray","Uint8Array","Map","size","row","entries","keys","Object","key","slice","ret","retView","getUint8","decode","tagger","simpleValue","commitRead","readArrayBuffer","readUint8","readUint16","getUint16","readUint32","readBreak","readLength","additionalInformation","readIndefiniteStringLength","majorType","initialByte","appendUtf16Data","utf16data","decodeItem","tempArrayBuffer","tempDataView","sign","exponent","fraction","getFloat32","readFloat16","getFloat64","elements","fullArrayLength","fullArray","fullArrayOffset","set","String","fromCharCode","apply","retArray","retObject","CBOR","this","mapQueryString","url","pos","indexOf","substring","result","hashSplit","split","urlSplit","s","version","isReady","isMobileDevice","isMobileApp","hasOwnProperty","defineProperty","get","window","matchMedia","matches","isDevelopment","match","screen","isFunction","param","isNumber","isObject","getStyle","element","property","getComputedStyle","getPropertyValue","getTopScrollable","isMobileView","document","querySelector","getElementById","documentElement","getPosition","top","left","fixed","offsetParent","offsetTop","offsetLeft","getScrollTop","nodeType","scrollTop","parentNode","merge","objects","each","name","extend","properties","mapValues","object","mapDefaults","defaults","intersect","a","b","index","callback","thisObject","call","Error","checkBrowser","agent","navigator","userAgent","defaultApple","versions","Firefox","Chrome","GSA","CriOS","Safari","AppleWebKit","found","getIntVersion","map","parseInt","reduce","previousValue","currentValue","array","foundVersion","minVersion","browserVersion","browser","freezeScroll","addEventListener","event","target","body","contains","position","distanceTop","style","width","classList","add","remove","splice","inCollection","clientWidth","ready","func","f","removeEventListener","isTablet","registerUser","user","localStorage","setItem","JSON","stringify","getRegisteredUser","json","getItem","parse","isPwa","wait","ms","Promise","resolve","setTimeout","loadScript","src","complete","createElement","setAttribute","getElementsByTagName","appendChild","isLoggedIn","getQueryString","location","search","appendQueryString","originalUrl","hash","querystring","assign","join","pop","xhr","XMLHttpRequest","animationCount","counter","elm","timeout","clearTimeout","delete","start","ev","end","frame","isAnimationExecuted","prepareAnimationFrame","requestAnimationFrame","isAnimationFrameExecuted","disableCssAnimations","disabled","head","dom","tag","text","effect","durationFactor","isIdle","delay","ajax","modal","autocomplete","load","invalidate","listOrQuery","parameters","from","querySelectorAll","Element","promises","CustomEvent","bubbles","cancelable","dispatchEvent","loadParent","all","history","reload","searchableSelect","options","ul","selected","input","filter","toLowerCase","foundLi","childNodes","li","child","firstChild","nodeValue","select","dataset","optionArrayIndex","max","min","selectedIndex","Event","unfocus","div","focus","tagName","firstNode","selectedOptions","className","onclick","icon","createViewFromString","innerHTML","placeholder","__","tabIndex","onfocus","onkeydown","preventDefault","onkeyup","stopPropagation","closest","option","x","level","setProperty","insertBefore","forEach","e","empty","cloneNode","createSearchableSelects","parent","selects","prev","previousSibling","removeSearchableSelects","updateSearchableSelects","str","template","content","installPwa","parentElement","button","beforeinstall","deferredPrompt","display","prompt","userChoice","then","choiceResult","outcome","radians","degrees","PI","prototype","unique","self","Date","stdTimezoneOffset","jan","getFullYear","jul","getTimezoneOffset","dst","isDstSwitchDay","copy","getTime","noon","setHours","fromViggoTime","m","d","isToday","getMonth","getDate","getWeekOfYear","setDate","getDay","yearStart","weekNo","ceil","getDateOfWeek","week","year","simple","dow","weekStart","daysInMonth","setMonth","format","date","zero","count","toString","num","repeat","nothingIfZero","inString","replace","t","getMilliseconds","getHours","getMinutes","getSeconds","abs","formatISO8601","toJSON","nav","height","clientHeight","open","to","duration","parentIndex","checkboxes","checked","ctrlKey","shiftKey","altKey","metaKey","toUpperCase","shortcut","getLatestModalElement","selector","click","shortcutMode","valueFunction","email","phone","password","contentEditable","blur","html","aniScroll","aniResize","styleObject","cancelAnimationFrame","y","lastScroll","scroll","down","resize","page","offsetWidth","offsetHeight","pathname","serviceWorker","controller","scriptURL","console","log","register","scope","reg","catch","err","error","localStorageName","storedTimestamp","sessionStorage","now","getRegistration","pushManager","getSubscription","subscription","notice","NoticeType","cursor","showAjax","close","cookie","[object Object]","toObject","classes","eventListener","eventListeners","listener","singleListener","prevented","specialAttrs","attributes","children","attr","svg","createElementNS","textContent","fragment","createDocumentFragment","createTextNode","parseHTML","parseResponse","betweenTags","startPos","endPos","getPos","includeScroll","scrollLeft","lastChild","removeNonTags","node","removeChild","nodes","id","parentFilter","parentTag","parentDataset","parentClass","parentId","parentOf","func_1","getSelectedFolderId","dataAttribute","returnElement","folder","openFolders","getAttribute","getParameterByName","href","results","RegExp","exec","decodeURIComponent","createFolder","createItem","toggleEditPortal","editportal","isOn","turnOff","turnOn","toggleTouchMenu","isTrue","list","toggle","changeProperty","n","toggleCheckboxes","checkbox","toggleTexts","values","treeWalker","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_ACCEPT","FILTER_SKIP","hint","rehint","nextNode","readMessage","amount","readRoomThread","generateFormElements","step","inputSelector","parentCopySiblings","overwrite","toValue","stepValue","doStep","fromMatch","timeReg","fromValue","setTime","numReg","copySiblings","parentCopy","temp","generateFormElementsForModules","templateSelector","destinationSelector","fromDate","fields","emptyFields","numberOfNewFields","j","clone","inputs","_a","fieldsIncludeNew","emptyFieldsIncludeNew","k","siblings","p","createAdvancedDate","form","dates","testing","existing","x1","x2","y1","y2","today","starts","ends","testAdvancedDates","endDates","namedItem","startTimes","endTimes","getAdvancedDates","getDateFromInput","setSeconds","createTemplate","paramName","Function","transformXml","xmltxt","xsltxt","implementation","doc","DOMParser","xml","parseFromString","nodeName","xsltPrs","XSLTProcessor","xsl","setParameter","importStylesheet","transformToFragment","createAdvancedDatesFromDates","selectedDates","startTime","endTime","testAndCreateExisting","createAdvancedDatesFromDatesButton","viggoPicker","selectedList","createAdvancedDatesFromWeek","firstDate","lastDate","days","day","first","last","trim","l","showElementsBeginningWith","findElementsBeginningWith","shift","hideElements","showElements","dateCheck","frag","createMonthCalendar","timestart","timeend","td","starttime","selectCount","toTd","endtime","getColorFromValue","alpha","color","md5","md5_cmn","_","r","safe_add","bit_rol","md5_ff","md5_gg","md5_hh","md5_ii","charAt","rstr2hex","binl2rstr","h","g","binl_md5","rstr2binl","month","calendar","table","colgroup","tr","tbody","swap","getElementsByClassName","isActive","getLatestModal","print","decimals","da","toFixed","getDateTimeFromValue","d0","d1","ndays","round","pa","headlineElementName","functionId","Id","Value","headline","viggoFunction","loadDraft","topswitch","viggoAutoComplete","initialize","item","viewFunction","lastIndexOf","scrollIntoView","behavior","block","inline","script","getStyleVersion","parentView","getUsersCallback","cause","place","previousUserCount","updateAccess","userIds","method","params","accessNeedsUpdate","updateEndTime","showCases","startDate","endDate","absenceId","inputEndDate","inputEndTime","convert","placeId","selectedOption","dispatch","ignoreDefaultEnd","updateConflicts","stop","alert","conflictsOnly","currentUserCount","users","updateCauses","defaultNote","encodeURIComponent","updateNote","newname","img","uid","skip","ignoreParent","translations","line","whitespaces","current","regex","prettyHtml","startTag","fullString","attrName","attrValue","defaultSelected","defaultChanged","defaultValue","sort","parseFloat","defaultChecked","updated","change","description","names","ogValue","transformXmlUrl","xmlUrl","xslUrl","fetch","Request","credentials","ping","onLine","logId","getCookie","warning","progress","reset","instance","getInstance","stopped","removeStyle","types","linear","fps","styleToProperty","styles","time","lastFrameTimestamp","animate","prop","browserPrefix","prefixProperty","prefixes","constructor","runningEffects","waitDuration","callComplete","margin","boxShadow","zIndex","canvas","context","getContext","fillStyle","fillRect","strokeStyle","beginPath","moveTo","lineTo","stroke","transform","delayTime","lastIdleTime","easeinout","pow","root","elastic","cos","sqrt","sine","flicker","random","pulse","spring","exp","calc","fromValues","toValues","regexFloats","regexBracket","colors","maroon","red","orange","yellow","olive","purple","fuchsia","white","lime","green","navy","blue","aqua","teal","black","silver","gray","c1","c2","toggleHeight","hideClass","minHeight","hideLinkClass","ownElement","overflow","classesLink","visible","expandHeight","displayType","collapseHeight","domContainer","createDomContainer","footerElement","headerElement","repaint","appendContainer","owner","onmousedown","PickerMode","DatePicker","AbstractPicker","super","pickerFor","_b","mode","intervalStart","intervalEnd","multiselect","selectedDate","inputOptions","compareDates","d2","caption","previous","setMode","next","thead","generateCells","colSpan","viggoDate","me","toggleSelected","selectDate","setCellClassName","inSelected","th","clickDate","setFullYear","sameMonth","createDayPicker","createMonthPicker","createYearPicker","finish","scrollCalendar","multiplier","sameDate","detail","getMonday","WeekPicker","scrollCallback","scrollElement","scrollAdd","scrollListener","auto","modalShowListener","modalCloseListener","PickerSelectMode","datePos","monthPos","yearPos","cursorTimeout","selectMode","pickerSelectMode","inputControl","FocusedInputControl","marginTop","getRelatedElement","intervalInput","initializeInput","mousedown","oldDate","eventDetail","pickerClass","keyCode","addChar","addDate","addMonth","addYear","reselect","mouseup","selectFromCursor","selectionStart","keydown","setValue","chr","delayReset","resetCursor","selectionEnd","DatePickerInput","ajaxData","dateField","c","TimePicker","spanHours","spanMinutes","domElement","hideClock","createHours","showClock","createMinutes","viewBox","class","hour","sin","circle","cx","cy","data-hour","baseVal","minute","data-minute","status","oldValue","newHour","newMinute","newDate","hourPos","minutePos","selectedHour","selectedMinute","minuteinterval","addHour","addMinute","TimePickerInput","delayEvent","hourArray","reverse","minuteArray","sync","dif","setMinutes","zeroToOne","setProgress","isNaN","sender","show","pushState","focusFirst","getNavigation","isCaptureClick","response","exception","contentType","textToData","isAppleSpecificBug","ErrorEvent","colno","columnNumber","filename","lineno","lineNumber","message","report","scripts","setupClose","post","pre","forceClose","analyze","info","replaceState","modalUrl","getBestTitle","changes","texts","previousModal","bind","shortcuts","nextModal","selectorElement","navigationSelector","urls","modalList","allClosed","notsaved","find","modalElement","closeTop","updateSender","state","aborted","important","async","multisender","HTMLFormElement","formToObject","encodeDataString","latestUrl","setProgressTime","getProgressTime","readyState","getResponseHeader","responseText","innerException","column","requestLog","removeRequest","webdriver","referer","callProgress","requests","setRequestHeader","send","HTMLElement","getElementValue","abort","getLoadtimes","avg","newLink","oldLink","replaceChild","multiple","jsonType","resetButtons","nextSibling","init","richeditor","showElement","aria","previousElementSibling","queryString","collectData","extraFieldsSelector","tuple","getElementTuple","enctype","FormData","appendAll","ownerDocument","expect","range","createRange","selectNode","createContextualFragment","TypeError","cancelRequests","loadHtml","ajaxLoads","iframe","title","responseURL","statusText","contentWindow","write","appendNode","request","noBar","win","opener","closed","w","animation","resp","Inner_Error","Type","Message","el","onchunk","boundary","headers","decoder","TextDecoder","MultipartReader","getReader","reader","read","done","partial","chunk","getResponse","header","responseType","ReaderState","buffer","awaitingBoundary","readBuffer","MultipartResponse","readUntilBoundary","removeBoundary","chunks","readAfterBoundary","awaitingContent","readingChunk","chunkFinished","finished","invalid","stateFinished","removeUntilBoundary","dashBoundary","LoadAppendType","originalTitle","scriptVersion","styleVersion","removeAjax","query","internalLink","removeLastRequest","lastRequest","clickTimeout","innerText","abortLoadingElements","scrolls","noScroll","clearSelector","reloadNext","getScriptVersion","appendType","prepend","append","replaceOwner","htmlId","setUrl","realUrl","pageXOffset","pageYOffset","main","UIEvent","appleBugs","loadChildren","loader","loadClear","eval","fullReload","loadInitiator","clearArea","timestamp","wasLastRequest","cancelAllRequests","navigate","signal","initiator","AreaLoader","loadUrl","loadPreloadTemplate","isLoadable","loaders","parsedResult","getScripts","scriptNode","preloaderName","parseUrl","idMatch","subid","Area","SubArea","Controller","Action","validUrl","slashParam","valueName","conditionList","defaultConditionValue","prefix","startsWith","optional","preloader","preloaders","preload","abortLoad","abortLoading","loadingClassName","preloadIfEmpty","AbortController","addAjax","hideTimeout","hide","fast","actions","hideDelay","action","createAction","createDom","undo","interval","animationFrame","dateformat","timeformat","servertime","dateNode","timeNode","refresh","setInterval","clearInterval","clock","clientTime","timedif","customHint","ajaxTimeout","hintOwner","hintParent","hintElement","blocked","nextElementSibling","initializeHint","createHintFromTemplate","ajaxLink","loadAjaxHint","hintDelay","hintTimeout","isChildOf","followmouse","userId","getUser","createView","templates","beforeHintNode","followListener","maxX","maxY","defaultDelay","loadTemplates","getFirstHinted","pageX","pageY","getDelay","touches","clientX","clientY","elementFromPoint","imageeditor","profile","angleAdd","image","zoomControl","angleControl","resultWidth","resultHeight","ratioWidth","ratioHeight","oldZoom","zoom","centerLeft","centerTop","transformOrigin","notifyEventListener","angle","rotateElement","naturalWidth","naturalHeight","valueAsNumber","changed","mousemove","difX","difY","moveX","moveY","AutoCompleteFlags","flags","flag","initializeDestination","idMap","groupMap","destination","destinationName","dest","gui","guiDestination","autocompleteUrl","defaultUrl","autocompleteName","getScroll","clear","scrolledElement","domParent","domRelation","User","view","Group","UserSelected","GroupSelected","Header","Title","HeaderGroup","lastSelectedItem","scroller","modalScroll","dynamiclist","roll","UserRolls","TypeName","Name","rollTypes","typeHeader","createHeaderFragment","firstElementChild","userRoleDictionary","","sortCallback","createUserFragment","lastType","groups","FolderName","createGroupHeaderFragment","createGroupFragment","relation","getBoundingClientRect","parentPos","bottom","loaded","dynamiclistview","itemCount","itemHeight","stickyClass","createDomParent","lowerCaseRelation","isMessages","includes","createItems","hasFlags","Users","createUsers","Groups","createGroups","secondType","render","isListItem","ids","evaluate","XPathResult","FIRST_ORDERED_NODE_TYPE","singleNodeValue","evt","createEvent","initMouseEvent","moveUp","moveDown","clickSelected","createSelectedGroupFragment","createSelectedUserFragment","autocompleteId","removeElementFromSelected","dispatchAllChanged","removeAllButton","removeTarget","addOnly","dispatchAllEvent","RemoveAllSelected","SingleItem","AllowDuplicates","arg","createGuiUser","btn","UsersIds","userA","userB","NameLowerCase","addUser","errors","inSelectedElements","string","valueIndex","queryToLists","filterValues","valueSet","searchElement","exactMatch","Search","some","searchItem","score","scoreElement","group","rollB","rollA","Orderby","showAll","addElementToSelected","StayOpen","formGroup","shortcutInfo","showInfo","dispatchChanged","isUser","localeCompare","localVersion","cacheVersion","isCacheValid","setList","statepushed","modalloaded","resetInstances","relationNames","SearchText","IsSelected","Image","Initials","Grade","OtherInfo","StudentId","MainUserRoll","HouseRoom","Relations","silent","RelationSearchHeadlineUser","RelationSearchHeadlineGroup","RelationSearchMasterUser","RelationSearchChildHeader","RelationSearchChildUser","RelationSearchRelationCheckboxes","RelationSearchAddAll","SuperSearchGroup","missingUsers","missingGroups","missingReferences","regSplit","spaceIndex","charIndex","lastIndex","mainRoll","RelationNames","MasterUserId","UserId","RelationsId","relationId","master","rel","Relation","concat","Set","HasRelations","serverTemplates","Templates","Translations","warn","wordFind","wordList","part","queryList","elementSearchIndex","foundAt","q","finalScore","fullWords","word","autocompleteFlags","autocompleteResults","autoCompleter","autocompleteInput","showAllClick","showShortcutsClick","Crmcustomers","Crmlist","modals","relationSearch","keyup","Backspace","Escape","setRelationSearch","createRelationSearchAddAllFragment","createRelationSearchRelationCheckboxesFragment","createRelationSearchedGroupFragment","createRelationUserFragment","delaySearch","lastSelectionIndex","createRelationSearchUserFragment","createRelationSearchGroupFragment","relations","RelationUser","relationUser","updateCheckboxes","Quill","import","AutocompleteBlot","Inline","create","domNode","formats","blotName","formats/mention","quill","replaceWith","QuillAutocomplete","container","selectedUsers","keyboard","addBinding","onAtKey","collapsed","onArrowUp","onArrowDown","onEsc","onEnter","bindings","unshift","on","textChange","selectionChange","getFormat","mention","getAutocompletePosition","callbackReplace","getSelection","bounds","getBounds","quillIndex","replacedText","deleteText","insertText","setSelection","dict","oldRange","source","msg","label","delta","oldContents","getLeaf","leaf","AutocompleteMention","atRegex","userRegex","checkContentForUsers","Module","palette","closeListener","ignoreInput","toolbar","getModule","addHandler","togglePalette","ToolbarEmoji","emojiList","buttonIcon","oldDelta","showPalette","atSignBounds","tabToolbar","emoji","rangeIndex","sources","USER","panel","tabElementHolder","tab","updatePanel","category","span","DEFAULTS","registerTypeListener","registerPasteListener","registerSpaceHandler","registerEnterHandler","urlPattern","prefixMatch","AutoLinks","link","prefixLength","prefixStart","prefixProtocol","getText","formatText","addMatcher","Node","TEXT_NODE","ops","lastMatchEndIndex","globalPattern","insert","registerAutoEmojiHandler","emojiPattern","AutoEmoji","ascii","getEmoji","emojiSet","🙂","😊","😃","😄","😆","ðŸ˜","ðŸ™","😢","😂","😮","😚","😉","😛","😕","ðŸ˜","💔","â¤ï¸","Text","textarea","editor","openGraphUrl","openGraphContainer","richeditorLinkContainer","richeditorLink","autoEmoji","tools","handlers","emoji-toolbar","theme","allowedTools","onTextChange","clipboard","ELEMENT_NODE","onPaste","initializeAllowedTools","op","filterOperation","origin","previewLink","tool","richeditorTools","indent","direction","background","font","align","defaultHeight","fillTop","padding","fillBottom","oldIndex","items","heights","getIndex","distance","moveWindow","sum","lastSearch","queryName","clearInput","clearResult","selection","parentOffsetLeft","resultLimit","area","lastQuery","cancelAjax","getHorizontalSelection","getVerticalSelection","getBestNewParents","supersearch","ITEM_SELECTOR","PARENT_SELECTOR","parentOffset","selectedParent","allParents","filtered","newParent","selectRight","parents","Infinity","newTop","newParentScroll","bestTop","areas","<",">","&","\"","char","generateHtml","prepareSearch","userList","groupList","resUsers","resGroups","setData","iterate","contextmenu","ajaxModal","reposition","addItem","unblock","menu","showDom","cancelTimer","touchtimer","PointerEvent","innerHeight","rect","paginationUrl","check","confidentialIds","confidential","unlock","styleTag","getConfidential","setConfidential","startSelection","endSelection","setStyle","clickListener","exitListener","lock","locked","informationTypes","birthday","guard","presence","absence","itemStyles","CalendarItemTemporaryMode","CalendarContextType","UrlReplacement","overlapMode","elementname","FilterResult","premises","premisesConflict","hintClass","readonly","initials","selectedsubstitute","elementType","elementId","links","columnIds","copyType","overlappingItemsOnDay","temporaryMode","lowercase","getColorFromBackground","creating","copied","AbstractCalendar","copiedItems","has","alsoBookedBy","CalendarItemType","typeString","colorNameToHex","CalendarItem","pointerEvents","urlTemplate","createUrlFromItem","createUrlFromElement","isInPeriod","timeDetail","isBetween","Execute","createUrl","topElement","Move","popup","Add","Url","startdate","right","repaintLater","removing","removeAllElements","removeItem","addClassName","removeClassName","dim","viggoItem","selectedItems","clearSelection","toggleSelect","deleteSelected","replacement","Callback","DataAttributes","iconClassName","AjaxModal","ExecuteDelete","splitUrl","Copy","addLine","cut","showItemHint","highlightElements","lowlightElements","dblclick","isVisible","overlaps","t1","typeStringLowerCase","t2","compareStart","compareBackgroundColor","compareLength","compareCreateingNew","compareTitle","compareId","b1","b2","formatTime","aliceblue","antiquewhite","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","gainsboro","ghostwhite","gold","goldenrod","greenyellow","honeydew","hotpink","indianred ","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","limegreen","linen","magenta","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","oldlace","olivedrab","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","rebeccapurple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","thistle","tomato","turquoise","whitesmoke","yellowgreen","setElementTime","calendarStart","hourHeight","getOffset","overlapsNarrowItemOnDay","getHeaderRow","cells","cellIndex","getFooterRow","startColumn","getColumn","endColumn","cell","calendarEnd","columns","startCell","endCell","col","cal","parentTop","getTop","columnWidth","dayIndex","CustomHeaderCalendar","setMilliseconds","parentRow","parentBody","mousedownTime","rowIndex","move","setLength","update","moved","sortItems","save","firstDay","mapIndex","isInView","dayWidth","getDayWidth","getItemPosition","calStart","calEnd","itemStart","itemEnd","startHour","endHour","dayHours","spaceMultiplier","hiddenHours","spacerWidth","rows","foundCell","realIndex","createRow","getCellIndex","noStart","noEnd","getCell","draggable","dragstart","dragend","MultimonthCalendarItem","CopyMode","pasteButton","periodIncrement","periodClickTimeout","_filter","defaultFilter","viggoCalendar","originalDate","offline","periodEnd","periodStart","slipDistance","validPeriods","p1","p2","From","invalidPeriods","paste","deleteItems","clearCopy","loadData","copyData","repositionStartDate","inputElementDate","setPeriod","clickElementPrevious","previousPreiod","clickElementToday","clickElementNext","nextPeriod","initializePeriod","getStringSetting","setSetting","pasting","createInvalidAreaAndCheckSlip","period","To","previousPeriod","accomidateSlip","createInvalidArea","slip","cacheReload","clearCopyCut","copyMode","none","copyDate","visibleSelectedItems","backgroundColor","borderColor","INPUT","TEXTAREA","copyCut","Delete","newItem","itemClass","allowPaste","pasteToDates","deselect","compare","visibleItems","ajaxRequest","GetItems","itemMap","oldItem","middle","old","selectedColumnIds","calendarId","elementName","timeStart","minutes","readOnly","defaultTime","foundIndex","WeekCalendarGroup","maxColumns","copyWeekButton","timelineTimeout","narrowItems","periodElements","WeekCalendarItem","startDay","weekLength","setTable","section","resetPeriods","fromColumn","getTimePosition","toColumn","createInvalidItem","footerRows","headerRows","WeekCalendar","createColgroup","createThead","createTbody","createTfoot","pasteLine","removePasteLine","getFirstCopiedDate","mousedownCell","setStart","COPY_TYPE_INVALID","Calendar","hasTemplates","savedDates","loadColumns","overlapping","overlapsOnDay","WeekCalendarGroups","checkDoubleBooking","showCurrentTimeLine","timeLine","v","createHeaders","DayColumn","createHeadFootRow","Birthday","tfoot","WorkWeekCalendar","DayCalendar","arguments","CustomHeaderCalendarItem","orderHeaders","headerId","onscroll","createHeader","orderedHeaders","orderBy","createDay","repaintSideHeader","columnId","sections","_days","popstate","tableHeader","createTableHead","createTableBodySections","createTableFoot","getJsonSetting","createTableBody","isCollapsed","setJsonSetting","createSectionHeader","Headers","elementsFromPoint","getGroupId","repositionEndDateForEditing","setGroup","originalGroup","toggleSection","createTable","updateRowVariables","entity","maxItems","deltaX","deltaY","AbstractCustomRowCalendar","CustomRowDayCalendarItem","createControls","controls","rowSpan","control","addResizeListener","addCreateAndMoveListener","getUnixDay","calDay","hours","CustomRowDayCalendar","getNumberSetting","CustomRowDetailCalendarItem","_startHour","_endHour","trHead","trTime","endDay","CustomRowDetailCalendar","MultiweekCalendarItem","loadRows","weekCount","tds","mouseDownCell","mouseUpCell","compareDocumentPosition","onmouseover","highlightCells","draggedItem","setHighlightClass","cellDate","currentMonth","tableObject","createBackground","keepItems","dataTransfer","effectAllowed","MultiweekCalendar","MonthCalendar","_itemRows","_itemColumns","itemRows","itemColumns","monthCount","months","removeShow","buttons","grid","originalRows","repaintGrid","inputColumns","inputRows","firstMonth","startRow","endRow","maxDays","mouseupCell","mouseover","highlightBetween","MultimonthCalendar","SemesterCalendar","lastCalendar","calendars","Schedules","loadCalendars","Selected","InputName","Links","CopyType","CopyData","PeriodEnd","PeriodStart","ValidPeriods","InvalidPeriods","ExternalNavigation","inputDate","StartDay","WeekLength","MaxItems","Days","ColumnWidth","OrderHeaders","Sections","StartHour","EndHour","popState","getToolbarRelatedCalendar","reference","dragging","positionElement","mouseDownListener","opacity","movedId","MovedItem","removeEventListeners","mouseMoveListener","mouseUpListener","box","delPos","boxPos","keyDownListener","confirm","notification","notifications","listVisible","List","Item","selectItem","Navigation","showList","ListNavigation","backgroundImage","picker","pickerGuid","pickerType","vibrate","audio","AudioContext","osc","createOscillator","gain","createGain","setValueAtTime","currentTime","connect","beep","cancel","ok","contents","escapeListener","stopImmediatePropagation","total","lastModified","reject","file","bytesLoaded","bytesTotal","formData","returnValue","uploadComplete","warnNavigate","upload","files","completeResultElement","WeakMap","fileRun","fileProgress","handleResult","replaceLi","DocumentFragment","newLi","oldLi","templateName","run","fileComplete","handleFailedUpload","fileFailed","Uploader","graph","Chart","ctx","datasets","backgrounds","borderWidth","chart","removeFinishPie","filetypes","extension","skippedFiles","maxFilesize","goodFiles","uploader","createUploader","completeElement","UploadItem","autoclose","SeparateUploader","u","FakeUploadItem","mimetypes","docx","jpg","keynote","numbers","pages","pdf","png","pptx","psd","txt","accept","urlResult","urlTarget","uploadUrl","resultElement","getData","dragTime","allowDrag","getDropTarget","allowedType","dropEffect","kind","areaFunctionId","dragFunctionId","attribute","extensions","validExtensions","maxSize","resultUrl","dropId","parentFunctionId","dropFunctionId","moveStuff","dragdrop","movedTarget","bestTarget","dropValidFunctionIds","listTop","startY","lastElementChild","movingTarget","oldY","newY","waitFormMove","orderingRowId","orderingFunctionId","order","orderingId","WebAuthnStatus","LOCAL_STORAGE_KEY","VERSION","LocalKeyPair","keyPair","credentialId","signCounter","wrappingKey","test","getWrappingKey","salt","crypto","subtle","generateKey","namedCurve","ivPrivate","getRandomValues","wrappedPrivateKeyBuffer","wrapKey","privateKey","iv","unwrapKey","publicKey","exportKey","encoder","TextEncoder","keyMaterial","importKey","deriveKey","iterations","privateWrap","btoa","storage","atob","unwrappedPrivateKey","coder","username","isSupported","challenge","coerceToBase64Url","makeCredentialOptions","clientExtensions","appid","hashAlgorithm","clientDataJSON","authData","getAuthData","digest","dataToSign","signature","derSignature","getCredentials","authenticatorData","userHandle","rawId","getId","getClientExtensionResults","isUserVerifyingPlatformAuthenticatorAvailable","protocol","host","withPublicKey","hostname","aaguid","credentialIdLength","cborCredentialPublicKey","jwk","getPublicKey","credentialPublicKey","coerceToArrayBuffer","authDataLength","Uint32Array","credentialLengthBuffer","Uint16Array","attestationObject","attStmt","getTransports","webauthn","PublicKeyCredential","FakeCredentials","LOCAL_STORAGE_USERNAME","device","cred","doCreate","authenticator","displayName","createPublicKeyCredentialCreationOptions","errorMessage","newCredential","registerNewCredential","credential","makeAssertionOptions","verifyAssertionWithServer","doGet","res","Accept","allowCredentials","listItem","fixedId","Content-Type","clientDataJson","registerCredentialWithServer","attestation_type","authenticator_attachment","user_verification","require_resident_key","fetchMakeCredentialOptions","excludeCredentials","authenticatorSelection","authenticatorAttachment","assertedCredential","sig","buf","thing","bytes","b64enc","SpeechRecognition","webkitSpeechRecognition","SpeechGrammarList","webkitSpeechGrammarList","speech","recognition","continuous","grammer","addFromString","grammars","lang","interimResults","maxAlternatives","eventResult","eventEnd","eventNomatch","eventError","stack","lines","foreignErrors","isIgnorableError","mapStackTrace","trackedEvents","STARTUP_TIME","identifier","userMessage","stackTrace","getArchive","archive","path","getCssSelector","errorListener","isArchived","addTrackedEvent","enable","cleanUp","disableButtons","enableButtons","selectorId","messageElement","created","Total","Counter","fromEntries","connection","signalR","HubConnectionBuilder","withUrl","skipNegotiation","transport","HttpTransportType","WebSockets","build","subProgress","subProgressClass","command","ex","invoke","topList","selectableClick","keepSelected","unselectAll","selectItems","toggleClasses","removeParent","editrights","expanded","sibling","classname"],"mappings":"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","file":"bundle.min.js","sourcesContent":["namespace viggo {\r\n export const version: string = \"#build.number#\";\r\n export let isReady: boolean = false;\r\n export let isMobileDevice: boolean = false; // this is set in the browser, by the server\r\n export let isMobileApp: boolean = false; // also set in the browser, by the server\r\n if (!viggo.hasOwnProperty('isMobileView')) {\r\n Object.defineProperty(viggo, 'isMobileView', {\r\n get: function () {\r\n return window.matchMedia(\"(max-width: 768px)\").matches;\r\n }\r\n });\r\n }\r\n export const isDevelopment = !viggo.version.match(/\\d/);\r\n export var screen: boolean = false;\r\n\r\n export function isFunction(param: any): boolean {\r\n return typeof param === 'function';\r\n }\r\n export function isNumber(param: any): boolean {\r\n return typeof param === 'number';\r\n }\r\n export function isObject(param: any): boolean {\r\n return typeof param === 'object' && param !== null;\r\n }\r\n // return a style for an element\r\n export function getStyle(element: Element, property: string): string {\r\n return window.getComputedStyle(element).getPropertyValue(property);\r\n }\r\n export function getTopScrollable(): HTMLElement {\r\n return <HTMLElement | null>(viggo.isMobileView ? document.querySelector('main') : document.getElementById('page')) || document.documentElement!;\r\n }\r\n export function getPosition(element: HTMLElement) {\r\n var top = 0,\r\n left = 0,\r\n fixed: HTMLElement | null = null;\r\n while (element && element.offsetParent) {\r\n if (!fixed && viggo.getStyle(element, 'position') == 'fixed') {\r\n fixed = element;\r\n }\r\n top += element.offsetTop;\r\n left += element.offsetLeft;\r\n element = <HTMLElement>element.offsetParent;\r\n }\r\n if (element && !fixed && viggo.getStyle(element, 'position') == 'fixed') {\r\n fixed = element;\r\n }\r\n return {\r\n top: top,\r\n left: left,\r\n fixed: fixed\r\n };\r\n }\r\n export function getScrollTop(element: HTMLElement): number {\r\n var top = 0;\r\n while (element && element.nodeType === 1) {\r\n top += element.scrollTop;\r\n element = <HTMLElement>element.parentNode;\r\n }\r\n return top;\r\n }\r\n // merge an all arguments into one object\r\n // Example: merge({a: 1},{b: 2, c:3},{d: 4}) => {a: 1, b: 2, c:3, d: 4}\r\n export function merge(...objects: any[]): any {\r\n var result: any = {};\r\n viggo.each(objects, function (param: any) {\r\n viggo.each(param, function (value: any, name: string) {\r\n if (!(name in result))\r\n result[name] = value;\r\n });\r\n });\r\n return result;\r\n }\r\n export function extend(obj: any, properties: any): any {\r\n for (var i in properties) {\r\n obj[i] = properties[i];\r\n }\r\n return obj;\r\n }\r\n // Maps all elements of the object to value\r\n // Example: mapValues(['foo', 'bar'], 'foobar') => {foo: 'foobar', 'bar': 'foobar'}\r\n export function mapValues(object: any, value: any): any {\r\n var result: any = {};\r\n viggo.each(object, function (obj: any) {\r\n result[obj] = value;\r\n });\r\n return result;\r\n }\r\n // puts missing properties from defaults into object\r\n export function mapDefaults(object: any, defaults: any): any {\r\n viggo.each(defaults, function (data: any, name: string) {\r\n if (!(name in object)) {\r\n object[name] = data;\r\n }\r\n });\r\n return object;\r\n }\r\n // will intersect two objects using keys and use the values from first object\r\n export function intersect(a: any, b: any): any {\r\n var result: any = {};\r\n viggo.each(a, function (value: any, index: string) {\r\n if (index in b) {\r\n result[index] = value;\r\n }\r\n });\r\n return result;\r\n }\r\n // executes callback for each element in object.\r\n // @param object Object or Array\r\n // @param callback function\r\n export function each(object: any, callback: (obj: any, index?: any, object?: any) => void, thisObject?: any): void {\r\n var i: any = 0, obj: any;\r\n if (object && typeof object.length == 'number') {\r\n for (; i < object.length;) {\r\n obj = object[i];\r\n callback.call(thisObject, obj, i, object);\r\n if (obj === object[i]) {\r\n i++;\r\n }\r\n }\r\n } else if (object) {\r\n for (i in object) {\r\n obj = object[i];\r\n callback.call(thisObject, obj, i, object);\r\n }\r\n } else {\r\n throw new Error(\"Unknown object in \\\"each\\\"\");\r\n }\r\n }\r\n\r\n type CheckBrowserResultType = 'ok' | 'unknown' | 'old';\r\n interface CheckBrowserResult {\r\n result: CheckBrowserResultType;\r\n browser: string;\r\n version: string;\r\n minVersion: string;\r\n }\r\n\r\n export function checkBrowser(agent: string = navigator.userAgent): CheckBrowserResult {\r\n type VersionCheck = [RegExp, string];\r\n let defaultApple: VersionCheck = [/CPU (?:iPhone )?OS (\\d+_\\d+)/, '13_6'];\r\n let versions: {[index: string]: VersionCheck} = {\r\n Firefox: [/Firefox\\/(\\d+\\.\\d+)/, '82.0'],\r\n Chrome: [/Chrome\\/(\\d+\\.\\d+)/, '86.0'],\r\n GSA: defaultApple, // this is the Google Search App. The version number is iOS version.\r\n CriOS: defaultApple, // this is the Chrome Browser App for iPhone. For rendering and JS it still uses Safari.\r\n Safari: [/Version\\/(\\d+\\.\\d+)/, '14.0'], // Safari comes last, as i sometimes registeres as other versions\r\n AppleWebKit: defaultApple\r\n };\r\n let found: string | null = null;\r\n for (let name in versions) {\r\n if (agent.indexOf(name) != -1) {\r\n found = name;\r\n break;\r\n }\r\n }\r\n let getIntVersion = (version: string) => {\r\n return version.split(/\\D/).map((value) => parseInt(value)).reduce((previousValue, currentValue, index, array) => previousValue + currentValue << (8*(array.length - index-1)), 0);\r\n }\r\n let result: CheckBrowserResultType;\r\n let foundVersion = 'unknown';\r\n let minVersion = 'unknown';\r\n if (found) {\r\n let version = versions[found];\r\n minVersion = version[1];\r\n let browserVersion = agent.match(version[0]);\r\n if (browserVersion) {\r\n foundVersion = browserVersion[1];\r\n if (getIntVersion(foundVersion) < getIntVersion(minVersion)) { // too old\r\n result = 'old';\r\n } else {\r\n result = 'ok';\r\n }\r\n } else {\r\n result = 'unknown'\r\n }\r\n } else {\r\n result = 'unknown';\r\n }\r\n return {\r\n result: result,\r\n browser: found || 'Unknown',\r\n version: foundVersion,\r\n minVersion: minVersion\r\n };\r\n }\r\n\r\n export const freezeScroll = (function () {\r\n interface ElementObject {\r\n element: HTMLElement,\r\n position: any,\r\n distanceTop: number,\r\n width: number\r\n }\r\n var elements: Array<ElementObject> = [];\r\n var eventHandler = function (event: Event) {\r\n var target = event.target;\r\n for (var i = elements.length - 1; i >= 0; i--) {\r\n var element = elements[i].element;\r\n if (document.body.contains(element)) {\r\n if ((<Node>target).contains(element)) {\r\n var offset = elements[i].position.top - elements[i].distanceTop;\r\n if (viggo.getScrollTop(<HTMLElement>element.parentNode) >= offset) {\r\n if (element.style.position != 'fixed') {\r\n element.style.top = elements[i].distanceTop + 'px';\r\n element.style.left = elements[i].position.left + 'px';\r\n element.style.position = 'fixed';\r\n element.style.width = elements[i].width + 'px';\r\n element.classList.add('frozen');\r\n }\r\n } else if (element.style.position == 'fixed') {\r\n element.style.position = '';\r\n element.style.top = '';\r\n element.style.left = '';\r\n element.style.width = '';\r\n element.classList.remove('frozen');\r\n }\r\n }\r\n } else {\r\n elements.splice(i, 1);\r\n }\r\n }\r\n };\r\n var inCollection = function (element: HTMLElement) {\r\n var found = false;\r\n for (var i = 0; i < elements.length && !found; i++) {\r\n found = elements[i].element == element;\r\n }\r\n return found;\r\n };\r\n window.addEventListener('scroll', eventHandler, true);\r\n return function (element: HTMLElement, distanceTop: number): void {\r\n var position = viggo.getPosition(element);\r\n if (!inCollection(element)) {\r\n elements.push({\r\n element: element,\r\n position: position,\r\n distanceTop: distanceTop,\r\n width: element.clientWidth\r\n });\r\n }\r\n };\r\n }())\r\n // calls a function when the dom is ready\r\n export function ready(func: () => void) {\r\n if (viggo.isReady) {\r\n func.call(document);\r\n } else {\r\n var f = function () {\r\n viggo.isReady = true;\r\n document.removeEventListener(\"DOMContentLoaded\", f, false);\r\n func.call(document);\r\n };\r\n document.addEventListener(\"DOMContentLoaded\", f, false);\r\n }\r\n }\r\n export function isTablet() {\r\n return window.matchMedia(\"(min-width: 768px)\").matches;\r\n }\r\n interface RegisteredUser {\r\n username: string;\r\n Fullname: string;\r\n image?: string;\r\n }\r\n export function registerUser(user: RegisteredUser) {\r\n localStorage.setItem('registeredUser', JSON.stringify(user));\r\n }\r\n export function getRegisteredUser() {\r\n let json = localStorage.getItem('registeredUser');\r\n if (json) {\r\n let user = <RegisteredUser>JSON.parse(json);\r\n return user;\r\n }\r\n return null;\r\n }\r\n export function isPwa() {\r\n return window.matchMedia(\"(display-mode: standalone)\").matches;\r\n }\r\n export function wait(ms: number) {\r\n return new Promise(function (resolve) {\r\n setTimeout(resolve, ms);\r\n });\r\n }\r\n export function loadScript(src: string, complete: (event: Event) => void) {\r\n var s = document.createElement('script');\r\n s.addEventListener('load', complete, false);\r\n s.setAttribute('type', 'text/javascript');\r\n s.setAttribute('src', src);\r\n document.getElementsByTagName('head')[0].appendChild(s);\r\n }\r\n export function isLoggedIn(): boolean {\r\n return !!document.getElementById('nav');\r\n }\r\n export function mapQueryString(url: string): ObjectOfString {\r\n if (url) {\r\n var pos = url.indexOf('?');\r\n if (pos !== -1) {\r\n url = url.substring(pos + 1);\r\n }\r\n }\r\n var result: ObjectOfString = {};\r\n if (url) {\r\n let hashSplit = url.split('#');\r\n url = hashSplit[0];\r\n if (hashSplit[1]) {\r\n result['#'] = hashSplit[1];\r\n }\r\n let urlSplit = url.split('&');\r\n for (var i = 0; i < urlSplit.length; i++) {\r\n var s = urlSplit[i].split('=');\r\n result[s[0]] = s[1] ? s[1] : '';\r\n }\r\n }\r\n return result;\r\n }\r\n export function getQueryString(name: string, url = window.location.search) {\r\n var query = mapQueryString(url);\r\n return query[name] || null;\r\n }\r\n export function appendQueryString(url: string, originalUrl: string = window.location.search): string {\r\n let urlSplit = url.split('?');\r\n let hash: string[] | string;\r\n if (!urlSplit[1]) {\r\n hash = urlSplit[0].split('#');\r\n urlSplit[0] = hash[0];\r\n urlSplit.push('');\r\n } else {\r\n hash = urlSplit[1].split('#');\r\n urlSplit[1] = hash[0];\r\n }\r\n let search: any = viggo.mapQueryString(originalUrl);\r\n let querystring = viggo.mapQueryString(urlSplit[1]);\r\n Object.assign(search, querystring);\r\n querystring = search;\r\n search = [];\r\n for (var i in querystring) {\r\n search.push(i + '=' + querystring[i]);\r\n }\r\n urlSplit[1] = search.join('&');\r\n if (!urlSplit[1]) {\r\n urlSplit.pop();\r\n }\r\n hash = hash[1] ? '#' + hash[1] : '';\r\n return urlSplit.join('?') + hash;\r\n }\r\n // returns a new XMLHttpRequest\r\n export function xhr(): XMLHttpRequest {\r\n return new XMLHttpRequest();\r\n }\r\n export const animationCount = (function () {\r\n let counter = 0,\r\n map = new Map<Element, number>(),\r\n remove = (elm: Element) => {\r\n let timeout = map.get(elm);\r\n clearTimeout(timeout);\r\n map.delete(elm);\r\n return !!timeout;\r\n },\r\n start = (ev: Event) => {\r\n let elm = <Element>ev.target;\r\n if (elm.nodeType == 1) { // weird Edge bug.\r\n let isTransition = ev.type == 'transitionrun';\r\n if (isTransition || viggo.getStyle(elm, 'animation-iteration-count') != \"infinite\") {\r\n if (!remove(elm)) {\r\n counter++;\r\n }\r\n map.set(elm, window.setTimeout(() => {\r\n map.delete(elm);\r\n counter--;\r\n }, 500));\r\n }\r\n }\r\n },\r\n end = (ev: Event) => {\r\n if (remove(<Element>ev.target)) {\r\n counter--;\r\n }\r\n };\r\n document.addEventListener('animationstart', start, true);\r\n document.addEventListener('animationcancel', end, true);\r\n document.addEventListener('animationend', end, true);\r\n\r\n document.addEventListener('transitionrun', start, true);\r\n document.addEventListener('transitioncancel', end, true);\r\n document.addEventListener('transitionend', end, true);\r\n return function animationCount() {\r\n return counter;\r\n };\r\n }());\r\n\r\n let frame = 0;\r\n let isAnimationExecuted = false;\r\n\r\n export function prepareAnimationFrame() {\r\n if (!frame) {\r\n isAnimationExecuted = false;\r\n frame = requestAnimationFrame(function () {\r\n isAnimationExecuted = true;\r\n frame = 0;\r\n });\r\n }\r\n return frame;\r\n }\r\n\r\n export function isAnimationFrameExecuted() {\r\n if (isAnimationExecuted) {\r\n frame = 0;\r\n isAnimationExecuted = false;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n export const disableCssAnimations = (function () {\r\n let disabled = false;\r\n return function disableCssAnimations() {\r\n if (!disabled) {\r\n let head = document.getElementsByTagName('head')[0];\r\n if (head) {\r\n disabled = true;\r\n let style = viggo.dom.tag('style');\r\n style.setAttribute('type', 'text/css');\r\n style.appendChild(viggo.dom.text('*{animation-duration: 0s !important; animation-delay: 0s !important; transition-duration: 0s !important; transition-delay: 0s !important;}'));\r\n head.appendChild(style);\r\n }\r\n viggo.effect.durationFactor = 0;\r\n }\r\n }\r\n }());\r\n\r\n export function isIdle(delay: number = 0) {\r\n return viggo.animationCount() == 0\r\n && viggo.ajax.isIdle(delay)\r\n && (!viggo.modal || viggo.modal.isIdle(delay))\r\n && viggo.effect.isIdle(delay)\r\n && viggo.autocomplete.isIdle()\r\n && (<any>viggo).load // this is to prevent screen-typescript from being stupid\r\n && (<any>viggo).load.isIdle();\r\n }\r\n\r\n export function invalidate(listOrQuery?: Element[] | Element | string | null, parameters: DOMStringMap = {}) {\r\n if (typeof listOrQuery == 'string') {\r\n listOrQuery = Array.from(document.querySelectorAll(listOrQuery));\r\n }\r\n if (listOrQuery instanceof Element) {\r\n listOrQuery = [listOrQuery];\r\n }\r\n if (listOrQuery && listOrQuery.length) {\r\n let promises: Promise<void>[] = [];\r\n for (let i = 0; i < listOrQuery.length; i++) {\r\n let element = listOrQuery[i];\r\n let event = new CustomEvent('invalidate', { bubbles: true, cancelable: true });\r\n if (element.dispatchEvent(event)) {\r\n let result = viggo.load.loadParent(element, 'invalidate', parameters);\r\n if (result) {\r\n promises.push(result);\r\n }\r\n }\r\n }\r\n if (promises.length) {\r\n return Promise.all(promises);\r\n } else {\r\n viggo.history.reload();\r\n }\r\n } else {\r\n viggo.history.reload();\r\n }\r\n }\r\n}\r\n\r\nnamespace viggo.func {\r\n export function searchableSelect(elm: HTMLSelectElement): void {\r\n if (elm && elm.options.length) {\r\n let ul: HTMLUListElement, selected: HTMLElement, filter = function (value: string) {\r\n value = value.toLowerCase();\r\n let foundLi = null;\r\n for (let i = 0; i < ul.childNodes.length; i++) {\r\n let li = <HTMLLIElement>ul.childNodes[i], child = li.firstChild;\r\n if (child && child.nodeValue && child.nodeValue.toLowerCase().indexOf(value) == -1) {\r\n li.classList.add('hidden');\r\n } else {\r\n foundLi = foundLi || li;\r\n li.classList.remove('hidden');\r\n }\r\n }\r\n if (value && foundLi && foundLi.nodeType == 1) {\r\n select(parseInt(foundLi.dataset.optionArrayIndex || '0'));\r\n }\r\n };\r\n let select = (index: number) => {\r\n index = Math.max(0, Math.min(elm.options.length - 1, index));\r\n elm.selectedIndex = index;\r\n let ev = new Event('change', { bubbles: true, cancelable: false });\r\n elm.dispatchEvent(ev);\r\n };\r\n let input: HTMLInputElement;\r\n let unfocus = function (event?: Event) {\r\n if (!event || !div.contains(<Node>event.target)) {\r\n document.removeEventListener('click', unfocus, true);\r\n document.removeEventListener('focus', unfocus, true);\r\n div.classList.remove('focused');\r\n input.value = '';\r\n filter('');\r\n }\r\n };\r\n let focus = function (event: Event) {\r\n document.addEventListener('click', unfocus, true);\r\n document.addEventListener('focus', unfocus, true);\r\n if (div.classList.contains('focused') && div != event.target && (!div.contains(<Node>event.target) || (<HTMLElement>event.target).tagName != 'INPUT')) {\r\n div.classList.remove('focused');\r\n unfocus();\r\n } else {\r\n div.classList.add('focused');\r\n }\r\n }\r\n let firstNode = elm.selectedOptions[0] || elm.options[0];\r\n var div = viggo.dom.tag('div', {\r\n className: 'input-select' + (elm.disabled ? ' disabled' : ''),\r\n onclick: focus\r\n },\r\n selected = viggo.dom.tag('span', { className: firstNode.className, dataset: Object.assign(firstNode.dataset, {}) }, firstNode.dataset.icon ? viggo.dom.tag('i', { className: firstNode.dataset.icon }) : null, firstNode.dataset.icon ? ' ' : null, viggo.func.createViewFromString(firstNode.innerHTML)),\r\n viggo.dom.tag('div', { className: '' }, input = <HTMLInputElement>viggo.dom.tag('input', {\r\n placeholder: __('Search'),\r\n type: 'text',\r\n tabIndex: elm.tabIndex,\r\n onfocus: focus,\r\n onkeydown: function (event: KeyboardEvent) {\r\n let index = elm.selectedIndex;\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n do {\r\n index++;\r\n } while (index < elm.options.length && (<HTMLElement>ul.childNodes[index]).classList.contains('hidden'));\r\n if (index >= elm.options.length || (<HTMLElement>ul.childNodes[index]).classList.contains('hidden')) {\r\n index = 0;\r\n while (index < elm.selectedIndex && (<HTMLElement>ul.childNodes[index]).classList.contains('hidden')) {\r\n index++;\r\n }\r\n }\r\n select(index);\r\n break;\r\n case 'ArrowUp':\r\n do {\r\n index--\r\n } while (index >= 0 && (<HTMLElement>ul.childNodes[index]).classList.contains('hidden'));\r\n if (index < 0 || (<HTMLElement>ul.childNodes[index]).classList.contains('hidden')) {\r\n index = ul.childNodes.length;\r\n do {\r\n index--;\r\n } while (index > elm.selectedIndex && (<HTMLElement>ul.childNodes[index]).classList.contains('hidden'));\r\n }\r\n select(index);\r\n break;\r\n case 'Enter':\r\n event.preventDefault();\r\n case 'Tab':\r\n unfocus();\r\n break;\r\n }\r\n },\r\n onkeyup: function (event: KeyboardEvent) {\r\n switch (event.key) {\r\n case 'ArrowUp':\r\n case 'ArrowDown':\r\n case 'ArrowLeft':\r\n case 'ArrowRight':\r\n case 'Shift':\r\n case 'Control':\r\n case 'Alt':\r\n case 'Meta':\r\n break;\r\n case 'Enter':\r\n select(elm.selectedIndex);\r\n case 'Escape':\r\n unfocus();\r\n event.preventDefault();\r\n event.stopPropagation();\r\n break;\r\n default:\r\n filter(this.value);\r\n break;\r\n }\r\n }\r\n })),\r\n ul = <HTMLUListElement>viggo.dom.tag('ul', {\r\n onclick: function (event: MouseEvent) {\r\n let li = (<HTMLElement>event.target).closest('li');\r\n event.stopPropagation();\r\n event.preventDefault();\r\n if (li && !li.classList.contains('disabled')) {\r\n select(parseInt(<string>li.dataset.optionArrayIndex));\r\n unfocus();\r\n }\r\n }\r\n })\r\n );\r\n for (let i = 0; i < elm.options.length; i++) {\r\n let option = elm.options[i];\r\n let li = viggo.dom.tag('li', {\r\n className: [option.selected ? 'selected' : '', option.className, option.disabled ? 'disabled' : ''].filter(x => x).join(' '),\r\n dataset: Object.assign(option.dataset, { optionArrayIndex: i })\r\n }, option.dataset.icon ? (option.dataset.icon.indexOf('/') != -1 ? viggo.dom.tag('img', { src: option.dataset.icon }) : viggo.dom.tag('i', { className: option.dataset.icon })) : null, option.dataset.icon ? ' ' : null, viggo.func.createViewFromString(option.innerHTML));\r\n if (option.dataset.level) {\r\n li.style.setProperty('--level', option.dataset.level);\r\n }\r\n ul.appendChild(li);\r\n }\r\n (<HTMLElement>elm.parentNode).insertBefore(div, elm);\r\n elm.addEventListener('change', (event: Event) => { // there might be changes outside of this contexts\r\n ul.querySelectorAll('li.selected').forEach(e => e.classList.remove('selected'));\r\n let index = elm.selectedIndex;\r\n if (index == -1) {\r\n index = elm.selectedIndex = 0;\r\n }\r\n let option = elm.options[index];\r\n if (option) {\r\n viggo.dom.empty(selected);\r\n if (option.dataset.icon) {\r\n selected.appendChild(viggo.dom.tag('i', { className: option.dataset.icon }));\r\n selected.appendChild(viggo.dom.text(' '));\r\n }\r\n if (option.firstChild) {\r\n selected.appendChild(option.firstChild.cloneNode(true));\r\n }\r\n (<HTMLLIElement>ul.childNodes[index]).classList.add('selected');\r\n ul.scrollTop = (<HTMLLIElement>ul.childNodes[index]).offsetTop;\r\n }\r\n }, true);\r\n if (elm.disabled) {\r\n div.querySelector('div')!.remove();\r\n ul.remove();\r\n div.removeEventListener('click', focus, false);\r\n }\r\n }\r\n }\r\n\r\n export function createSearchableSelects(parent?: any): void {\r\n if (!parent) {\r\n parent = document;\r\n }\r\n let selects = parent.querySelectorAll('select');\r\n for (let i = 0; i < selects.length; i++) {\r\n let select = selects[i];\r\n let prev = select.previousSibling;\r\n if ((!prev || prev.nodeType != 1 || !prev.classList.contains('input-select')) && !select.classList.contains('simple') && select.options.length) {\r\n viggo.func.searchableSelect(select);\r\n }\r\n }\r\n return parent;\r\n }\r\n export function removeSearchableSelects(parent?: any): void {\r\n if (!parent) {\r\n parent = document;\r\n }\r\n let selects = parent.getElementsByTagName('select');\r\n for (let i = selects.length - 1; i >= 0; i--) {\r\n let select = selects[i];\r\n let prev = select.previousSibling;\r\n if (prev && prev.nodeType == 1 && prev.classList.contains('input-select')) {\r\n prev.remove();\r\n }\r\n }\r\n }\r\n export function updateSearchableSelects(parent?: any): void {\r\n viggo.func.removeSearchableSelects(parent);\r\n viggo.func.createSearchableSelects(parent);\r\n }\r\n export function createViewFromString(str: string) {\r\n let template = <HTMLTemplateElement>viggo.dom.tag('template');\r\n template.innerHTML = str;\r\n return template.content;\r\n }\r\n\r\n export function installPwa(parentElement: HTMLElement, button: HTMLElement, callback?: (success: boolean) => void, beforeinstall?: () => void) {\r\n let deferredPrompt: any = null;\r\n\r\n window.addEventListener('beforeinstallprompt', (e) => {\r\n // Prevent Chrome 67 and earlier from automatically showing the prompt\r\n e.preventDefault();\r\n // Stash the event so it can be triggered later.\r\n deferredPrompt = e;\r\n if (parentElement) {\r\n parentElement.style.display = '';\r\n }\r\n if (beforeinstall) {\r\n beforeinstall();\r\n }\r\n });\r\n\r\n if (button) {\r\n button.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (deferredPrompt) {\r\n deferredPrompt.prompt();\r\n deferredPrompt.userChoice.then(function (choiceResult: any) {\r\n if (callback) {\r\n callback(choiceResult.outcome == 'accepted');\r\n }\r\n deferredPrompt = null;\r\n });\r\n }\r\n }, false);\r\n }\r\n }\r\n}\r\n\r\n// Converts from degrees to radians.\r\nMath.radians = function (degrees: number) {\r\n return degrees * Math.PI / 180;\r\n}\r\n\r\n// Converts from radians to degrees.\r\nMath.degrees = function (radians: number) {\r\n return radians * 180 / Math.PI;\r\n}\r\n\r\nArray.prototype.unique = function () {\r\n return this.filter(function (value, index, self) {\r\n return self.indexOf(value) === index;\r\n });\r\n}\r\n\r\nDate.prototype.stdTimezoneOffset = function () {\r\n var jan = new Date(this.getFullYear(), 0, 1);\r\n var jul = new Date(this.getFullYear(), 6, 1);\r\n return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());\r\n};\r\n\r\nDate.prototype.dst = function (): boolean {\r\n return this.getTimezoneOffset() < this.stdTimezoneOffset();\r\n};\r\n\r\nDate.prototype.isDstSwitchDay = function (): boolean {\r\n var copy = new Date(this.getTime()),\r\n noon = new Date(this.getTime());\r\n copy.setHours(0, 0, 0, 0);\r\n noon.setHours(12, 0, 0, 0);\r\n return copy.getTimezoneOffset() != noon.getTimezoneOffset();\r\n};\r\n\r\nDate.fromViggoTime = function (input: (string | HTMLInputElement)) {\r\n if (typeof input == 'object') {\r\n input = input.value;\r\n }\r\n var m = input.match(/^(?:([0-3]\\d)-([01]\\d)-(\\d{4}))?\\s*(?:([012]\\d):([0-5]\\d)(?::([0-5]\\d))?)?$/);\r\n var d: (Date | null) = null;\r\n if (m) {\r\n if (m[1] && m[4]) {\r\n d = new Date(parseInt(m[3]), parseInt(m[2]) - 1, parseInt(m[1]), parseInt(m[4]), parseInt(m[5]), parseInt(m[6]));\r\n } else if (m[1]) {\r\n d = new Date(parseInt(m[3]), parseInt(m[2]) - 1, parseInt(m[1]));\r\n } else if (m[4]) {\r\n d = new Date();\r\n d.setHours(parseInt(m[4]), parseInt(m[5]), parseInt(m[6]));\r\n }\r\n }\r\n return d;\r\n};\r\n\r\nDate.prototype.isToday = function (d = new Date()) {\r\n return this.getFullYear() == d.getFullYear() && this.getMonth() == d.getMonth() && this.getDate() == d.getDate();\r\n};\r\n\r\nDate.prototype.getWeekOfYear = function () {\r\n var d = new Date(this.getTime());\r\n d.setHours(0, 0, 0);\r\n // Set to nearest Thursday: current date + 4 - current day number\r\n // Make Sunday's day number 7\r\n d.setDate(d.getDate() + 4 - (d.getDay() || 7));\r\n // Get first day of year\r\n var yearStart = new Date(d.getFullYear(), 0, 1);\r\n // Calculate full weeks to nearest Thursday\r\n var weekNo = Math.ceil((((d.getTime() - yearStart.getTime()) / 86400000) + 1) / 7);\r\n // Return array of year and week number\r\n return [d.getFullYear(), weekNo];\r\n};\r\n\r\n// Returns the monday of a given week in a year\r\nDate.getDateOfWeek = function (week, year) {\r\n var simple = new Date(year, 0, 1 + (week - 1) * 7);\r\n var dow = simple.getDay();\r\n var weekStart = simple;\r\n if (dow <= 4)\r\n weekStart.setDate(simple.getDate() - simple.getDay() + 1);\r\n else\r\n weekStart.setDate(simple.getDate() + 8 - simple.getDay());\r\n return weekStart;\r\n};\r\n\r\nDate.prototype.daysInMonth = function () {\r\n let d = new Date(this);\r\n d.setDate(1);\r\n d.setMonth(d.getMonth() + 1);\r\n d.setDate(0);\r\n return d.getDate();\r\n};\r\n\r\n// implementation of .NET DateTime.ToString function\r\nDate.prototype.format = function (format: string) {\r\n let date = this;\r\n let repeat = (s: string, num: number) => {\r\n return num && num > 0 ? new Array(num + 1).join(s) : '';\r\n };\r\n let zero = (a: number, count: number) => {\r\n let b = a.toString(10);\r\n return repeat('0', count - b.length) + b;\r\n };\r\n let nothingIfZero = (s: string) => {\r\n return s.match(/^0+$/) ? '' : s;\r\n };\r\n let inString: any = false;\r\n return format.replace(/([dfFghHKmMstyz])(?:\\1*)|[\"']/g, (all: string): string => {\r\n if (inString == all) {\r\n inString = false;\r\n return '';\r\n }\r\n if (inString) {\r\n return all;\r\n }\r\n let t;\r\n switch (all) {\r\n case \"'\": inString = \"'\"; return '';\r\n case '\"': inString = '\"'; return '';\r\n case 'd': return date.getDate().toString();\r\n case 'dd': return zero(date.getDate(), 2);\r\n case 'ddd': return __('Sunday Monday Tuesday Wednesday Thursday Friday Saturday'.split(' ')[date.getDay()]).substring(0, 3);\r\n case 'dddd': return __('Sunday Monday Tuesday Wednesday Thursday Friday Saturday'.split(' ')[date.getDay()]);\r\n case 'f': return zero(date.getMilliseconds(), 3).substring(0, 1);\r\n case 'ff': return zero(date.getMilliseconds(), 3).substring(0, 2);\r\n case 'fff': return zero(date.getMilliseconds(), 3);\r\n case 'ffff': return zero(date.getMilliseconds(), 3) + '0';\r\n case 'fffff': return zero(date.getMilliseconds(), 3) + '00';\r\n case 'ffffff': return zero(date.getMilliseconds(), 3) + '000';\r\n case 'fffffff': return zero(date.getMilliseconds(), 3) + '0000';\r\n case 'F': return nothingIfZero(zero(date.getMilliseconds(), 3).substring(0, 1));\r\n case 'FF': return nothingIfZero(zero(date.getMilliseconds(), 3).substring(0, 2));\r\n case 'FFF': return nothingIfZero(zero(date.getMilliseconds(), 3));\r\n case 'FFFF': return nothingIfZero(zero(date.getMilliseconds(), 3) + '0');\r\n case 'FFFFF': return nothingIfZero(zero(date.getMilliseconds(), 3) + '00');\r\n case 'FFFFFF': return nothingIfZero(zero(date.getMilliseconds(), 3) + '000');\r\n case 'FFFFFFF': return nothingIfZero(zero(date.getMilliseconds(), 3) + '0000');\r\n case 'g': case 'gg': throw \"Unimplemented\";\r\n case 'h': return (date.getHours() % 12) + \"\";\r\n case 'hh': return zero(date.getHours() % 12, 2);\r\n case 'H': return date.getHours() + \"\";\r\n case 'HH': return zero(date.getHours(), 2);\r\n case 'K': throw \"Unimplemented\";\r\n case 'm': return date.getMinutes() + \"\";\r\n case 'mm': return zero(date.getMinutes(), 2);\r\n case 'M': return (date.getMonth() + 1) + \"\";\r\n case 'MM': return zero(date.getMonth() + 1, 2);\r\n case 'MMM': return __('January February March April May June July August September October November December'.split(' ')[date.getMonth()]).substring(0, 3);\r\n case 'MMMM': return __('January February March April May June July August September October November December'.split(' ')[date.getMonth()]);\r\n case 's': return date.getSeconds() + \"\";\r\n case 'ss': return zero(date.getSeconds(), 2);\r\n case 't': return date.getHours() < 12 ? 'A' : 'P';\r\n case 'tt': return date.getHours() < 12 ? 'AM' : 'PM';\r\n case 'y': return (date.getFullYear() % 100) + \"\";\r\n case 'yy': return zero(date.getFullYear() % 100, 2);\r\n case 'yyy': return zero(date.getFullYear(), 3);\r\n case 'yyyy': return date.getFullYear() + \"\";\r\n case 'yyyyy': return zero(date.getFullYear(), 5);\r\n case 'z': t = date.getTimezoneOffset(); return (t < 0 ? '+' : '-') + Math.floor(Math.abs(t) / 60);\r\n case 'zz': t = date.getTimezoneOffset(); return (t < 0 ? '+' : '-') + zero(Math.floor(Math.abs(t) / 60), 2);\r\n case 'zzz': t = date.getTimezoneOffset(); return (t < 0 ? '+' : '-') + zero(Math.floor(Math.abs(t) / 60), 2) + ':' + zero(Math.abs(t) % 60, 2);\r\n default: return all;\r\n }\r\n });\r\n};\r\n\r\nDate.prototype.formatISO8601 = function() {\r\n return this.format('dd-MM-yyyyTHH:mm:sszzz');\r\n}\r\n\r\nDate.prototype.toJSON = function toJSON() {\r\n return this.format('yyyy-MM-ddTHH:mm:sszzz');\r\n};\r\n\r\n// foldout navigation\r\nviggo.ready(function () {\r\n viggo.isReady = true;\r\n var nav = document.getElementById('nav2');\r\n if (nav) {\r\n nav.addEventListener('click', function (event) {\r\n var a = viggo.dom.parent(<HTMLElement>event.target, 'a');\r\n if (a) {\r\n var ul = (<HTMLElement>a.parentNode).getElementsByTagName('ul')[0];\r\n if (ul) {\r\n var height = ul.clientHeight;\r\n var open = (<HTMLElement>ul.parentNode).className.match(/(?:^|\\s)selected(?:\\s|$)/);\r\n new viggo.effect({\r\n element: ul,\r\n from: open ? 0 : height,\r\n to: open ? ul.clientHeight : 0,\r\n duration: 800,\r\n style: 'height',\r\n complete: function () {\r\n ul.style.height = '';\r\n }\r\n });\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n }\r\n }, false);\r\n }\r\n});\r\n\r\ndocument.addEventListener('change', function (event) {\r\n var target = <HTMLInputElement>event.target;\r\n var m;\r\n if (target.tagName == 'INPUT' && target.type == 'checkbox' && (m = target.className.match(/checkradio(\\d+)/))) {\r\n var parentIndex = parseInt(m[1], 10);\r\n if (parentIndex) {\r\n var parentNode: Node | null = <Node>target;\r\n while (parentIndex-- && parentNode) {\r\n parentNode = parentNode.parentNode;\r\n }\r\n if (parentNode) {\r\n var checkboxes = <NodeListOf<HTMLInputElement>>(<HTMLElement>parentNode).querySelectorAll('[name=\"' + target.name + '\"]');\r\n for (var i = 0; i < checkboxes.length; i++) {\r\n checkboxes[i].checked = checkboxes[i] == target;\r\n }\r\n }\r\n }\r\n }\r\n}, true);\r\n\r\nwindow.addEventListener('keydown', function (event: KeyboardEvent) {\r\n var type: string[] = [];\r\n if (event.ctrlKey) {\r\n type.push('Ctrl');\r\n }\r\n if (event.shiftKey) {\r\n type.push('Shift');\r\n }\r\n if (event.altKey) {\r\n type.push('Alt');\r\n }\r\n if (event.metaKey) {\r\n type.push('Meta');\r\n }\r\n if (!type.length) {\r\n type.push('Shortcut');\r\n }\r\n let key = event.key;\r\n if (key && key != '\"') {\r\n if (key.length == 1) {\r\n key = key.toUpperCase();\r\n }\r\n type.push(key);\r\n }\r\n let target = <HTMLElement | null>event.target;\r\n let shortcut = type.join('+');\r\n var ev = new CustomEvent(shortcut, { bubbles: true, cancelable: true });\r\n if (target && ((target.tagName != 'TEXTAREA' && target.tagName != 'INPUT') || (target.classList && target.classList.contains('allow-shortcuts')))) {\r\n if (!target.dispatchEvent(ev)) {\r\n event.preventDefault();\r\n } else if ((<any>target).querySelectorAll) {\r\n let modal = viggo.modal ? viggo.modal.getLatestModalElement() : null;\r\n if (modal) {\r\n target = modal;\r\n }\r\n let selector = `[data-shortcuts~=\"${shortcut}\"]`;\r\n if (target!.matches(selector)) {\r\n target!.dispatchEvent(ev);\r\n } else {\r\n target!.querySelectorAll(selector).forEach(x => {\r\n if (x.tagName == 'A' || x.tagName == 'BUTTON') {\r\n (<HTMLAnchorElement>x).click();\r\n if ((<HTMLElement>x).dataset.shortcutMode == 'prevent') {\r\n event.preventDefault();\r\n }\r\n }\r\n if (!x.dispatchEvent(ev)) {\r\n event.preventDefault();\r\n }\r\n });\r\n }\r\n }\r\n }\r\n}, false);\r\n\r\nviggo.ready(function () {\r\n var f = function (event?: Event) {\r\n let target = event ? event.target : undefined;\r\n viggo.func.createSearchableSelects(target);\r\n };\r\n\r\n var valueFunction = function (event: Event) {\r\n var target = <HTMLInputElement>event.target;\r\n let value: string | null = null;\r\n if (target.tagName == 'TEXTAREA' || (target.tagName == 'INPUT' && target.type in { text: 1, email: 1, phone: 1, password: 1 })) {\r\n value = target.value;\r\n } else if (target.contentEditable == \"true\") {\r\n value = target.innerHTML;\r\n let element = target;\r\n if (value.match(/^<p><br\\s*\\/?><\\/p>$/im)) {\r\n value = '';\r\n }\r\n target = <HTMLInputElement>target.closest('.form-group');\r\n if (event.type == 'focus' && target) {\r\n let blur = function () {\r\n element.removeEventListener('blur', blur, false);\r\n target.classList.remove('focused');\r\n };\r\n target.classList.add('focused');\r\n element.addEventListener('blur', blur, false);\r\n }\r\n }\r\n if (value !== null && target) {\r\n if (value == \"\") {\r\n target.classList.add('empty-value');\r\n target.classList.remove('value-specified');\r\n } else {\r\n target.classList.remove('empty-value');\r\n target.classList.add('value-specified');\r\n }\r\n }\r\n };\r\n\r\n return function () {\r\n window.addEventListener('statepushed', f, false);\r\n if (viggo.modal) {\r\n viggo.modal.addEventListener('show', f);\r\n viggo.modal.addEventListener('load', f);\r\n }\r\n f();\r\n if (viggo.isMobileDevice) {\r\n document.documentElement!.classList.add('mobile');\r\n }\r\n window.addEventListener('keyup', valueFunction, true);\r\n window.addEventListener('focus', valueFunction, true);\r\n };\r\n}());\r\n\r\n(function (html) {\r\n let aniScroll: number, aniResize: number;\r\n let styleObject = html.style;\r\n html.addEventListener('mousemove', function (event) {\r\n window.cancelAnimationFrame(aniScroll);\r\n var x = event.x,\r\n y = event.y;\r\n aniScroll = window.requestAnimationFrame(function () {\r\n //styleObject.setProperty('--mouse-x', x+'px');\r\n //styleObject.setProperty('--mouse-y', y+'px');\r\n });\r\n }, false);\r\n var lastScroll = 0;\r\n window.addEventListener('scroll', function (event) {\r\n let target = <HTMLElement>event.target;\r\n if (target.tagName == 'MAIN') {\r\n var scroll = (<HTMLElement>event.target).scrollTop;\r\n var down = scroll > lastScroll && scroll > 0;\r\n window.cancelAnimationFrame(aniScroll);\r\n aniScroll = window.requestAnimationFrame(function () {\r\n styleObject.setProperty('--scroll-down', down ? \"1\" : \"0\");\r\n });\r\n lastScroll = scroll;\r\n }\r\n if (target.nodeType == 1 && target.classList.contains('scroll-var') || target.querySelector('.scroll-var')) {\r\n window.requestAnimationFrame(function () {\r\n if (target && target.style && target.style.setProperty) {\r\n target.style.setProperty('--scroll', target.scrollTop + '');\r\n }\r\n });\r\n }\r\n }, true);\r\n let resize = function () {\r\n let page = <HTMLElement | null>document.querySelector(viggo.isMobileView ? 'main' : '#page');\r\n if (page) {\r\n styleObject.setProperty('--browser-width', page.offsetWidth + '');\r\n styleObject.setProperty('--browser-height', page.offsetHeight + '');\r\n }\r\n };\r\n window.addEventListener('resize', function (event) {\r\n cancelAnimationFrame(aniResize);\r\n aniResize = requestAnimationFrame(resize);\r\n });\r\n styleObject.setProperty('--scroll-down', \"0\");\r\n viggo.ready(resize);\r\n}(document.documentElement!));\r\n\r\n\r\nif (\"serviceWorker\" in navigator && !window.location.pathname.match(/^screen/i)) {\r\n let version = 2;\r\n let url = `/viggo.serviceworker.js?version=${version}`;\r\n if (navigator.serviceWorker.controller && navigator.serviceWorker.controller.scriptURL.indexOf(url) != -1) {\r\n console.log(\"Service worker found, no need to register\");\r\n } else {\r\n // Register the service worker\r\n navigator.serviceWorker\r\n .register(url, {\r\n scope: \"/\"\r\n })\r\n .then(function (reg) {\r\n console.log(\"Service worker has been registered for scope: \" + reg.scope);\r\n })\r\n .catch(function (err) {\r\n console.error(err);\r\n });\r\n\r\n const localStorageName = 'pwa-notifications';\r\n let storedTimestamp = localStorage.getItem(localStorageName);\r\n let date = new Date(0);\r\n if (storedTimestamp) {\r\n date = new Date(parseInt(storedTimestamp));\r\n }\r\n\r\n if ((true || viggo.isPwa()) && !sessionStorage.getItem(localStorageName) && (Date.now() - date.getTime() > 7*24*60*60*1000)) {\r\n navigator.serviceWorker.getRegistration()\r\n .then(reg => reg ? reg.pushManager.getSubscription() : null)\r\n .then(subscription => {\r\n sessionStorage.setItem(localStorageName, \"push\");\r\n if (!subscription && viggo.isLoggedIn()) {\r\n let notice = viggo.notice(viggo.NoticeType.notice, '♫ ' + __('Want to receive notifications?'), 15000);\r\n let text = notice.querySelector('p');\r\n if (text) {\r\n text.style.cursor = 'pointer';\r\n text.addEventListener('click', function () {\r\n viggo.modal.showAjax('/Shared/ProfileSettings/ActivateNotificationsForDevice');\r\n }, false);\r\n }\r\n let close = notice.querySelector('.close');\r\n if (close) {\r\n close.addEventListener('click', function () {\r\n localStorage.setItem(localStorageName, Date.now().toString());\r\n }, false);\r\n }\r\n }\r\n }).catch(e => {\r\n sessionStorage.setItem('pwa-notifications', \"push\");\r\n });\r\n }\r\n }\r\n}","module viggo {\r\n export class cookie {\r\n public static getCookie(name: string) {\r\n return this.toObject()[name];\r\n }\r\n private static toObject() {\r\n let result: ObjectOfString = {};\r\n document.cookie.replace(/(\\w+)=([^;]*)(?:\\;\\s*|$)/g, (all: string, name: string, value: string) => {\r\n result[name] = value;\r\n return all;\r\n });\r\n return result;\r\n }\r\n }\r\n}","module viggo.classes {\r\n export class eventListener {\r\n private eventListeners: any = null;\r\n private static eventListeners: any = null;\r\n public addEventListener(event: string, listener: (data: any) => void) {\r\n if (!this.eventListeners) {\r\n this.eventListeners = {};\r\n }\r\n if (!this.eventListeners[event]) {\r\n this.eventListeners[event] = [];\r\n }\r\n var i = this.eventListeners[event].indexOf(listener);\r\n if (i === -1) {\r\n this.eventListeners[event].push(listener);\r\n }\r\n }\r\n public removeEventListener(event: string, listener: (data: any) => void) {\r\n if (this.eventListeners && this.eventListeners[event]) {\r\n var i = this.eventListeners[event].indexOf(listener);\r\n if (i !== -1) {\r\n this.eventListeners[event].splice(i, 1);\r\n }\r\n }\r\n }\r\n public dispatchEvent(event: string, data?: any, singleListener?: (data: any) => void) {\r\n var i = 0, prevented = false;\r\n if (data === null || typeof data == 'undefined') {\r\n data = {};\r\n }\r\n data.preventDefault = function () {\r\n prevented = true;\r\n };\r\n if (singleListener) {\r\n singleListener.call(this, data);\r\n } else {\r\n while (this.eventListeners && this.eventListeners[event] && i < this.eventListeners[event].length) {\r\n let listener = this.eventListeners[event][i];\r\n listener.call(this, data);\r\n if (listener === this.eventListeners[event][i]) {\r\n i++;\r\n }\r\n }\r\n }\r\n delete data.preventDefault;\r\n return !prevented;\r\n }\r\n\r\n public static addEventListener = eventListener.prototype.addEventListener;\r\n public static removeEventListener = eventListener.prototype.removeEventListener;\r\n public static dispatchEvent = eventListener.prototype.dispatchEvent;\r\n }\r\n}","module viggo.dom {\r\n const specialAttrs = { style: 1, dataset: 1 };\r\n export function tag<K extends keyof HTMLElementTagNameMap>(name: K, attributes?: any, ...children: any[]): HTMLElementTagNameMap[K] {\r\n var tag = document.createElement(name);\r\n if (attributes) {\r\n for (var attr in attributes) {\r\n var value = attributes[attr];\r\n if (attr in specialAttrs) {\r\n for (var property in value) {\r\n (<any>tag)[attr][property] = value[property];\r\n }\r\n } else if (attr.substring(0, 2) == 'on') {\r\n tag.addEventListener(attr.substring(2), value, false);\r\n } else {\r\n (<any>tag)[attr] = value;\r\n }\r\n }\r\n }\r\n for (var i = 0; i < children.length; i++) {\r\n let child = children[i];\r\n if (typeof child == 'string' || typeof child == 'number')\r\n child = viggo.dom.text(child);\r\n if (child) {\r\n tag.appendChild(<Node>child);\r\n }\r\n }\r\n return tag;\r\n }\r\n export function svg<K extends keyof SVGElementTagNameMap>(name: K, attributes?: any, ...children: any[]): SVGElementTagNameMap[K] {\r\n var tag = document.createElementNS('http://www.w3.org/2000/svg', name);\r\n if (attributes) {\r\n for (var attr in attributes) {\r\n tag.setAttribute(attr, attributes[attr]);\r\n }\r\n }\r\n for (var i = 0; i < children.length; i++) {\r\n let child = children[i];\r\n if (typeof child == 'string' || typeof child == 'number') {\r\n tag.textContent = child.toString();\r\n } else {\r\n tag.appendChild(<Node>child);\r\n }\r\n }\r\n return tag;\r\n }\r\n export function fragment(...elements: (Node|null)[]): DocumentFragment {\r\n var fragment = document.createDocumentFragment();\r\n for (var i = 0; i < elements.length; i++) {\r\n if (elements[i]) {\r\n fragment.appendChild(<Node>elements[i]);\r\n }\r\n }\r\n return fragment;\r\n }\r\n export function text(text: string|number): Text {\r\n return document.createTextNode(<string>text);\r\n }\r\n export function parseHTML(html: string): DocumentFragment {\r\n return viggo.ajax.parseResponse('text/html', html, document, 'html');\r\n }\r\n export function betweenTags(text: string, tag: string): string {\r\n let startPos = text.indexOf('<' + tag);\r\n if (startPos != -1) {\r\n startPos = text.indexOf('>', startPos + tag.length);\r\n if (startPos != -1) {\r\n let endPos = text.indexOf('</' + tag, startPos);\r\n if (endPos != -1) {\r\n return text.substring(startPos + 1, endPos);\r\n }\r\n }\r\n }\r\n return \"\";\r\n }\r\n export function getPos(element: HTMLElement, includeScroll?: boolean) {\r\n let left = 0, top = 0;\r\n let scroll = element;\r\n do {\r\n left += element.offsetLeft;\r\n top += element.offsetTop;\r\n } while (element = <HTMLElement>element.offsetParent);\r\n if (includeScroll) {\r\n do {\r\n left -= scroll.scrollLeft;\r\n top -= scroll.scrollTop;\r\n } while ((scroll = <HTMLElement>scroll.parentNode) && scroll.nodeType == 1);\r\n }\r\n return { left: left, top: top };\r\n }\r\n export function empty(elm: Node): DocumentFragment {\r\n var fragment = viggo.dom.fragment();\r\n while (elm && elm.lastChild) {\r\n fragment.appendChild(elm.lastChild);\r\n }\r\n return fragment;\r\n }\r\n export function removeNonTags(node: Element): void {\r\n for (var i = node.childNodes.length - 1; i >= 0; i--) {\r\n if (node.childNodes[i].nodeType != 1) {\r\n node.removeChild(node.childNodes[i]);\r\n }\r\n }\r\n }\r\n export function remove(...nodes: any[]): void {\r\n for (var i = 0; i < nodes.length; i++) {\r\n var id = nodes[i];\r\n var elm = typeof id == 'string' ? document.getElementById(id) : id;\r\n if (elm) {\r\n elm.parentNode.removeChild(elm);\r\n }\r\n }\r\n }\r\n // takes a node and a filter. When the filter returns true, that node is returned\r\n export function parentFilter(child: Element, filter: (child: Element) => boolean): Element|null {\r\n if (child && child.nodeType != 1 && child.parentNode) {\r\n child = <Element>child.parentNode;\r\n }\r\n while (child && child.nodeType == 1) {\r\n if (filter.call(child, child)) {\r\n return child;\r\n } else {\r\n child = <Element>child.parentNode;\r\n }\r\n }\r\n return null;\r\n }\r\n export function parent<S extends keyof HTMLElementTagNameMap>(child: Element, parentTag: S): HTMLElementTagNameMap[S] | null {\r\n return child ? <HTMLElementTagNameMap[S]>viggo.dom.closest(child, parentTag) : null;\r\n }\r\n export function parentDataset(child: HTMLElement, name: string, value?: string) {\r\n var callback = typeof value == 'undefined' ? (elm: Element) => {\r\n return name in (<HTMLElement>elm).dataset;\r\n } : (elm: Element) => {\r\n return name in (<HTMLElement>elm).dataset && (<HTMLElement>elm).dataset[name] == value;\r\n }\r\n return viggo.dom.parentFilter(child, callback);\r\n }\r\n export function parentClass(child: Element, className: string) {\r\n return viggo.dom.closest(child, '.' + className);\r\n }\r\n export function parentId(child: Element, id: string) {\r\n return viggo.dom.closest(child, '#' + id);\r\n }\r\n export function parentOf(child: Element, parent: Element) {\r\n return parent.contains(child);\r\n }\r\n export function closest(child: Element, selector: string) {\r\n if (child.nodeType != 1) {\r\n child = <Element>child.parentNode;\r\n }\r\n return child ? child.closest(selector) : null;\r\n }\r\n};","module viggo.func {\r\n // getParameterByName\r\n export function getParameterByName(name: string, url: string) {\r\n if (!url) url = window.location.href;\r\n name = name.replace(/[\\[\\]]/g, \"\\\\$&\");\r\n var regex = new RegExp(\"[?&]\" + name + \"(=([^&#]*)|&|#|$)\"),\r\n results = regex.exec(url);\r\n if (!results) return null;\r\n if (!results[2]) return '';\r\n return decodeURIComponent(results[2].replace(/\\+/g, \" \"));\r\n }\r\n // buttons to create folders and items for folder\r\n export function getSelectedFolderId(dataAttribute = \"data-drop-id\", returnElement = false, folder = true) {\r\n var openFolders = document.querySelectorAll(`#folderRoot li.selected${folder?'.folder':''}[${dataAttribute}]:not(.subselected)`);\r\n if (!openFolders.length) {\r\n openFolders = document.querySelectorAll(`#folderRoot>li:first-child[${dataAttribute}]`);\r\n }\r\n if (openFolders.length) {\r\n let elm = openFolders[openFolders.length - 1];\r\n return returnElement ? elm : elm.getAttribute(dataAttribute);\r\n }\r\n return null;\r\n }\r\n //HttpContext.Current.Request.RequestContext.RouteData.DataTokens[\"area\"].ToString() == \"Info\"\r\n /**\r\n * A function to create folders!\r\n * @param url The folder URL\r\n * @param type The folder Type\r\n */\r\n export function createFolder(url: string, type: string) {\r\n var id = getSelectedFolderId();\r\n if (id) {\r\n url += url.indexOf('?') == -1 ? '?' : '&';\r\n viggo.modal.showAjax(url + 'ViggoFunctions=' + type + '&parentFolderId=' + id);\r\n }\r\n };\r\n export function createItem(url: string) {\r\n var id = getSelectedFolderId();\r\n if (id) {\r\n url += url.indexOf('?') == -1 ? '?' : '&';\r\n viggo.modal.showAjax(url + 'FolderId=' + id);\r\n }\r\n };\r\n\r\n // toggle editing portal\r\n export function toggleEditPortal() {\r\n if (!viggo.editportal) {\r\n viggo.loadScript('/Scripts/viggo.editportal.js?' + Date.now().toString(36), () => {\r\n viggo.editportal.turnOn();\r\n });\r\n } else if (viggo.editportal.isOn) {\r\n viggo.editportal.turnOff();\r\n } else {\r\n viggo.editportal.turnOn();\r\n }\r\n };\r\n\r\n export function toggleTouchMenu(event: MouseEvent, id: string) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n var isTrue = true;\r\n var list = document.querySelectorAll('.touch');\r\n for (var i = 0; i < list.length; i++) {\r\n if (list[i].id == id) {\r\n list[i].classList.toggle('touch');\r\n } else {\r\n list[i].classList.remove('touch');\r\n }\r\n isTrue = false;\r\n }\r\n if (isTrue) {\r\n viggo.func.changeProperty(\".touch:not(#\" + id + \")\", 'touch', '');\r\n var n = document.getElementById(id);\r\n if (n) {\r\n n.classList.toggle('touch');\r\n }\r\n }\r\n };\r\n\r\n export function changeProperty(selector: string, property: string, value: any) {\r\n document.querySelectorAll(selector).forEach((e) => {\r\n (<any>e)[property] = value;\r\n });\r\n };\r\n\r\n export function toggleCheckboxes(selector: string, checkbox: HTMLInputElement) {\r\n viggo.func.changeProperty(selector + ' input[type=\"checkbox\"]', 'checked', checkbox.checked);\r\n };\r\n\r\n export function toggleTexts(node: Node, values: string[]) {\r\n let accept = function (node: Node) {\r\n if (values.indexOf(<string>node.nodeValue) != -1) {\r\n return NodeFilter.FILTER_ACCEPT;\r\n } else {\r\n return NodeFilter.FILTER_SKIP;\r\n }\r\n };\r\n let treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, {acceptNode: accept}, false);\r\n\r\n viggo.hint.rehint(function () {\r\n while (node = <Node>treeWalker.nextNode()) {\r\n let index = values.indexOf(<string>node.nodeValue);\r\n index = (index + 1) % values.length;\r\n node.nodeValue = values[index];\r\n }\r\n });\r\n };\r\n\r\n export function readMessage(id: string) {\r\n var li = document.getElementById('tree-item-message-id-' + id);\r\n if (li && li.classList.contains('new')) {\r\n li.classList.remove('new');\r\n var num = li.querySelector(':scope>label');\r\n var count = 1;\r\n if (num && num.firstChild && num.parentNode) {\r\n count = parseInt(<string>num.firstChild.nodeValue);\r\n num.parentNode.removeChild(num);\r\n }\r\n var a = <HTMLAnchorElement|null>document.querySelector('#notification-messages > a');\r\n if (a) {\r\n var amount = parseInt(<string>a.dataset.amount, 10) - count;\r\n a.dataset.amount = Math.max(amount, 0)+'';\r\n }\r\n }\r\n };\r\n\r\n export function readRoomThread(id: string) {\r\n var li = document.getElementById('RoomItem_' + id);\r\n if (li && li.classList.contains('newpost')) {\r\n li.classList.remove('newpost');\r\n }\r\n };\r\n\r\n /*\r\n // This is legacy code\r\n export function showModalWithSelectedCalendars(event: Event) {\r\n var items: string[] = [];\r\n viggo.calendarPicker.iterate(function (item: any, selected: any) {\r\n if (selected) {\r\n items.push(item.InputName + '=' + item.Id);\r\n }\r\n }, null);\r\n event.preventDefault();\r\n event.stopPropagation();\r\n var target = <HTMLAnchorElement|null>viggo.dom.parent(<Element>event.target, 'A');\r\n if (target) {\r\n var href = target.href;\r\n var pos = href.indexOf(\"#\");\r\n if (pos !== -1) {\r\n var id = href.substring(pos + 1);\r\n href = href.substring(0, pos);\r\n if (target.classList.contains('append-query-string')) {\r\n href = viggo.appendQueryString(href);\r\n }\r\n if (items.length) {\r\n href += href.indexOf('?') == -1 ? '?' : '&';\r\n href += items.join('&');\r\n }\r\n viggo.modal.showAjax(href);\r\n }\r\n }\r\n };\r\n */\r\n\r\n export function generateFormElements(from: string, to: string, step: string, inputSelector: string, parentCopySiblings: string, overwrite: boolean) {\r\n let timeReg = /^(.*?)(\\d\\d?):(\\d\\d)(.*?)$/,\r\n fromValue: any = from.match(timeReg),\r\n toValue: any,\r\n stepValue: any,\r\n doStep: any,\r\n fromMatch: any;\r\n\r\n if (fromValue) {\r\n toValue = to.match(timeReg);\r\n stepValue = step.match(timeReg);\r\n if (!toValue || !stepValue || (stepValue[2] == '00' && stepValue[3] == '00')) {\r\n return false;\r\n }\r\n fromMatch = fromValue;\r\n fromValue = new Date(2015, 0, 27, parseInt(fromValue[2]), parseInt(fromValue[3]), 0, 0);\r\n toValue = new Date(2015, 0, 27, parseInt(toValue[2]), parseInt(toValue[3]), 0, 0);\r\n stepValue = (parseInt(stepValue[2], 10) * 60 + parseInt(stepValue[3], 10)) * 60 * 1000;\r\n doStep = function () {\r\n var result = fromValue.format('HH:mm');\r\n fromValue.setTime(fromValue.getTime() + stepValue);\r\n return fromMatch[1] + result + fromMatch[4];\r\n };\r\n } else {\r\n var numReg = /^(.*?)(\\d+)(.*?)$/;\r\n fromValue = from.match(numReg);\r\n toValue = to.match(numReg);\r\n stepValue = step.match(numReg);\r\n if (!fromValue || !toValue || !stepValue || parseInt(stepValue[2]) == 0) {\r\n return false;\r\n }\r\n fromMatch = fromValue;\r\n fromValue = parseInt(fromValue[2], 10);\r\n toValue = parseInt(toValue[2], 10);\r\n stepValue = parseInt(stepValue[2], 10);\r\n doStep = function () {\r\n var result = fromMatch[1] + fromValue + fromMatch[3];\r\n fromValue += stepValue;\r\n return result;\r\n };\r\n }\r\n\r\n var list = document.querySelectorAll(inputSelector);\r\n var counter = 0;\r\n\r\n var fragment = viggo.func.copySiblings(parentCopySiblings, 0);\r\n let parentCopy = document.getElementById(parentCopySiblings);\r\n var temp;\r\n\r\n for (var i = 0; fromValue <= toValue; i++) {\r\n var elm: any = list[i];\r\n if (i >= list.length) {\r\n temp = <Element>fragment.cloneNode(true);\r\n elm = temp.querySelector('select');\r\n if (elm) {\r\n elm.selectedIndex = 0;\r\n elm.name = 'newlimitAmount';\r\n }\r\n elm = temp.querySelector('input');\r\n elm.value = '';\r\n elm.name = 'newitem';\r\n if (parentCopy) {\r\n parentCopy.appendChild(temp);\r\n }\r\n counter--;\r\n }\r\n if (elm.value == '' || overwrite) {\r\n counter++;\r\n elm.value = doStep();\r\n }\r\n }\r\n\r\n var c = 0;\r\n counter = Math.max(counter, 0);\r\n while (counter-- && !overwrite) {\r\n c++;\r\n temp = <Element>fragment.cloneNode(true);\r\n var select = temp.querySelector('select');\r\n if (select) {\r\n select.selectedIndex = 0;\r\n select.name = 'newlimitAmount';\r\n }\r\n var input = temp.querySelector('input');\r\n if (input && parentCopy) {\r\n input.value = '';\r\n input.name = 'newitem';\r\n parentCopy.appendChild(temp);\r\n }\r\n }\r\n };\r\n\r\n export function generateFormElementsForModules(from: string, to: string, step: string, templateSelector: string, destinationSelector: string) {\r\n let timeReg = /^(.*?)(\\d\\d?):(\\d\\d)(.*?)$/,\r\n fromValue: any = from.match(timeReg),\r\n toValue: any,\r\n stepValue: any,\r\n doStep: any,\r\n fromMatch: any;\r\n\r\n if (fromValue) {\r\n toValue = to.match(timeReg);\r\n stepValue = step.match(timeReg);\r\n if (!toValue || !stepValue || (stepValue[2] == '00' && stepValue[3] == '00')) {\r\n return false;\r\n }\r\n fromMatch = fromValue;\r\n fromValue = new Date(2015, 0, 27, parseInt(fromValue[2]), parseInt(fromValue[3]), 0, 0).getTime();\r\n toValue = new Date(2015, 0, 27, parseInt(toValue[2]), parseInt(toValue[3]), 0, 0).getTime();\r\n stepValue = (parseInt(stepValue[2], 10) * 60 + parseInt(stepValue[3], 10)) * 60 * 1000;\r\n doStep = function () {\r\n var fromDate = new Date(2015, 0, 27).setTime(fromValue);\r\n fromValue += stepValue;\r\n return fromMatch[1] + new Date(fromDate).format(\"HH:mm\") + fromMatch[4];\r\n };\r\n } else {\r\n var numReg = /^(.*?)(\\d+)(.*?)$/;\r\n fromValue = from.match(numReg);\r\n toValue = to.match(numReg);\r\n stepValue = step.match(numReg);\r\n if (!fromValue || !toValue || !stepValue || parseInt(stepValue[2]) == 0) {\r\n return false;\r\n }\r\n fromMatch = fromValue;\r\n fromValue = parseInt(fromValue[2], 10);\r\n toValue = parseInt(toValue[2], 10);\r\n stepValue = parseInt(stepValue[2], 10);\r\n doStep = function () {\r\n var result = fromMatch[1] + fromValue + fromMatch[3];\r\n fromValue += stepValue;\r\n return result;\r\n };\r\n }\r\n \r\n var values = [];\r\n for (var i = fromValue; i <= toValue; i = i + stepValue) {\r\n values.push(doStep());\r\n }\r\n\r\n var fields = document.querySelectorAll(\"#formular-edit-elements-list input[type='text'].value-field\");\r\n var emptyFields = Array.from(fields).map(x => <HTMLInputElement>x).filter(x => x.value == \"\" || x.value == null ||x.value == undefined);\r\n\r\n var numberOfNewFields = values.length - emptyFields.length;\r\n for (var j = 0; j < numberOfNewFields; j++) {\r\n var fragment = document.querySelector(templateSelector) as HTMLTemplateElement;\r\n var clone = fragment.content.cloneNode(true) as Element;\r\n\r\n var index = Date.now();\r\n var inputs = clone.querySelectorAll(\"input\");\r\n var select = clone.querySelector(\"select\") as HTMLSelectElement;\r\n\r\n inputs[0].value = index.toString();\r\n inputs[1].name = \"SubElement[\" + index + \"].Value\";\r\n select.name = \"SubElement[\" + index + \"].Limit\";\r\n\r\n document.querySelector(destinationSelector)?.appendChild(clone);\r\n }\r\n \r\n var fieldsIncludeNew = document.querySelectorAll(\"#formular-edit-elements-list input[type='text'].value-field\");\r\n var emptyFieldsIncludeNew = Array.from(fieldsIncludeNew).map(x => <HTMLInputElement>x).filter(x => x.value == \"\" || x.value == null ||x.value == undefined);\r\n console.log(emptyFieldsIncludeNew);\r\n for (var k = 0; k < Math.min(emptyFieldsIncludeNew.length, values.length); k++) {\r\n emptyFieldsIncludeNew[k].value = values[k];\r\n }\r\n };\r\n\r\n\r\n export function copySiblings(parent: string, ...siblings: number[]) {\r\n let p = document.getElementById(parent);\r\n let fragment = document.createDocumentFragment();\r\n if (p) {\r\n siblings.forEach(i => fragment.appendChild(p!.children[i].cloneNode(true)));\r\n }\r\n return fragment;\r\n };\r\n\r\n let getAdvancedDates = function (form: HTMLFormElement) {\r\n var endDates: any = form.elements.namedItem('EndDate');\r\n var startTimes: any = form.elements.namedItem('StartDateTime');\r\n var endTimes: any = form.elements.namedItem('EndDateTime');\r\n if (!endDates) {\r\n endDates = [];\r\n startTimes = [];\r\n endTimes = [];\r\n } else if (!endDates.length) {\r\n endDates = [endDates];\r\n startTimes = [startTimes];\r\n endTimes = [endTimes];\r\n }\r\n var starts = [];\r\n var ends = [];\r\n for (var i = 0; i < endDates.length; i++) {\r\n var date = endDates[i].value;\r\n var start = startTimes[i].value;\r\n var end = endTimes[i].value;\r\n date = new Date(date.substring(6, 10), date.substring(3, 5) - 1, date.substring(0, 2), start.substring(0, 2), start.substring(3, 5), 0, 0);\r\n starts.push(new Date(date));\r\n date.setHours(end.substring(0, 2), end.substring(3, 5));\r\n ends.push(new Date(date));\r\n }\r\n return {\r\n starts: starts,\r\n ends: ends\r\n };\r\n };\r\n\r\n let testAdvancedDates = function (testing: any, existing: any) {\r\n var result = false, x1, x2, y1, y2;\r\n\r\n var today = new Date();\r\n for (var i = 0; i < testing.starts.length && !result; i++) {\r\n x1 = testing.starts[i];\r\n x2 = testing.ends[i];\r\n if (x2 < today) {\r\n return true;\r\n }\r\n for (var j = 0; j < existing.starts.length && !result; j++) {\r\n y1 = existing.starts[j];\r\n y2 = existing.ends[j];\r\n\r\n result =\r\n (x1 >= y1 && x1 < y2) ||\r\n (x1 >= y1 && x2 <= y2) ||\r\n (x1 <= y1 && x2 >= y2) ||\r\n (x2 > y1 && x2 <= y2);\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n let createAdvancedDate = function (from: Date, to: Date) {\r\n var li = viggo.dom.tag('li');\r\n li.innerHTML = '<input value=\"\" name=\"IdDateTime\" type=\"hidden\">\\\r\n <div class=\"td_30\"><input name=\"EndDate\" value=\"' + from.format('dd-MM-yyyy') + '\" type=\"hidden\"> ' + from.format('d. MMM') + '</div>\\\r\n <div class=\"td_50\">\\\r\n <input name=\"StartDateTime\" class=\"xxsmall time\" value=\"' + from.format('HH:mm') + '\" type=\"text\">\\\r\n <input name=\"EndDateTime\" class=\"xxsmall time\" value=\"' + to.format('HH:mm') + '\" type=\"text\">\\\r\n <input type=\"hidden\" name=\"Delete\" value=\"\">\\\r\n </div>\\\r\n<div class=\"td_20\"><a href=\"#\" class=\"link_image_button_small icon size18 delete\"></a></div>';\r\n li.getElementsByTagName('a')[0].onclick = function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n li.remove();\r\n };\r\n return li;\r\n };\r\n\r\n let testAndCreateExisting = function (form: HTMLFormElement, dates: any, ul: HTMLUListElement) {\r\n var existing = getAdvancedDates(form);\r\n if (testAdvancedDates(dates, existing)) { // returns true if there is an overlap\r\n return false;\r\n } else {\r\n for (var i = 0; i < dates.starts.length; i++) {\r\n ul.appendChild(createAdvancedDate(dates.starts[i], dates.ends[i]));\r\n }\r\n return true;\r\n }\r\n };\r\n\r\n interface AdvancedDates {\r\n starts: Date[],\r\n ends: Date[]\r\n }\r\n interface AdvancedDate {\r\n start: Date,\r\n end: Date\r\n }\r\n export function createAdvancedDatesFromDates(form: HTMLFormElement, ul: HTMLUListElement, selectedDates: Date[], startTime: Date, endTime: Date) {\r\n let dates: AdvancedDates = {\r\n starts: [],\r\n ends: []\r\n };\r\n for (var i = 0; i < selectedDates.length; i++) {\r\n var d = new Date(selectedDates[i]);\r\n d.setHours(startTime.getHours(), startTime.getMinutes(), 0, 0);\r\n dates.starts.push(d);\r\n d = new Date(selectedDates[i]);\r\n d.setHours(endTime.getHours(), endTime.getMinutes(), 0, 0);\r\n dates.ends.push(d);\r\n }\r\n return testAndCreateExisting(form, dates, ul);\r\n };\r\n\r\n export function createAdvancedDatesFromDatesButton(button: HTMLButtonElement) {\r\n let form = button.form;\r\n if (!form) {\r\n throw new Error('Unable to connect form to button');\r\n }\r\n let start = <HTMLInputElement>form.elements.namedItem('Starttime'),\r\n end = <HTMLInputElement>form.elements.namedItem('Endtime');\r\n\r\n let startTime: string | Date = new Date();\r\n let endTime: string | Date = new Date();\r\n if (start && end) {\r\n startTime = start.value;\r\n endTime = end.value;\r\n startTime = new Date(2015, 1, 11, parseInt(startTime.substring(0, 2)), parseInt(startTime.substring(3, 5)), 0, 0);\r\n endTime = new Date(2015, 1, 11, parseInt(endTime.substring(0, 2)), parseInt(endTime.substring(3, 5)), 0, 0);\r\n }\r\n return viggo.func.createAdvancedDatesFromDates(form, <HTMLUListElement>document.getElementById('interval-selected-dates'), (<any>document.getElementById('interval-calendar')).viggoPicker.selectedList, startTime, endTime);\r\n };\r\n\r\n export function createAdvancedDatesFromWeek(form: HTMLFormElement, ul: HTMLUListElement, firstDate: Date, lastDate: Date, days: (AdvancedDate|null)[]) {\r\n let dates: AdvancedDates = {\r\n starts: [],\r\n ends: []\r\n };\r\n var date = new Date(firstDate);\r\n while (date <= lastDate) {\r\n let day = days[date.getDay()];\r\n if (day) {\r\n date.setHours(day.start.getHours(), day.start.getMinutes());\r\n dates.starts.push(date);\r\n date = new Date(date);\r\n date.setHours(day.end.getHours(), day.end.getMinutes());\r\n dates.ends.push(date);\r\n date = new Date(date);\r\n date.setHours(0, 0, 0, 0);\r\n }\r\n date.setDate(date.getDate() + 1);\r\n }\r\n return testAndCreateExisting(form, dates, ul);\r\n };\r\n\r\n export function createAdvancedDatesFromWeekButton(button: HTMLButtonElement) {\r\n let form = button.form;\r\n if (!form) {\r\n throw new Error('Unable to connect form to button');\r\n }\r\n let first = <HTMLInputElement>form.elements.namedItem('datestart');\r\n let last = <HTMLInputElement>form.elements.namedItem('dateend');\r\n if (first && last) {\r\n let firstDate: string | Date = first.value;\r\n let lastDate: string | Date = last.value;\r\n\r\n firstDate = new Date(parseInt(firstDate.substring(6, 10)), parseInt(firstDate.substring(3, 5)) - 1, parseInt(firstDate.substring(0, 2)));\r\n lastDate = new Date(parseInt(lastDate.substring(6, 10)), parseInt(lastDate.substring(3, 5)) - 1, parseInt(lastDate.substring(0, 2)));\r\n var week = 'sun mon tue wed thu fri sat'.split(' ');\r\n var days: AdvancedDate[] = [];\r\n for (var i = 0; i < week.length; i++) {\r\n let elm = <HTMLInputElement>form.elements.namedItem('insert_' + week[i]);\r\n if (elm && elm.checked) {\r\n first = <HTMLInputElement>form.elements.namedItem(week[i] + '_starttime');\r\n last = <HTMLInputElement>form.elements.namedItem(week[i] + '_endtime');\r\n if (first && last) {\r\n let start = first.value;\r\n let end = last.value;\r\n let day = {\r\n start: new Date(2015, 1, 11, parseInt(start.substring(0, 2)), parseInt(start.substring(3, 5)), 0, 0),\r\n end: new Date(2015, 1, 11, parseInt(end.substring(0, 2)), parseInt(end.substring(3, 5)), 0, 0)\r\n };\r\n days[i] = day;\r\n }\r\n }\r\n }\r\n return viggo.func.createAdvancedDatesFromWeek(form, <HTMLUListElement>document.getElementById('interval-selected-dates'), firstDate, lastDate, days);\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n export function findElementsBeginningWith(elements: NodeList, text: string) {\r\n let found = [];\r\n text = text.trim().toLowerCase();\r\n let l = text.length;\r\n for (var i = 0; i < elements.length; i++) {\r\n let e = elements[i];\r\n if (e) {\r\n let t = e.textContent;\r\n if (t) {\r\n t = t.trim().toLowerCase();\r\n if (t.substring(0, l) == text) {\r\n found.push(elements[i]);\r\n }\r\n }\r\n }\r\n }\r\n return found;\r\n };\r\n\r\n export function showElementsBeginningWith(selector: string, text: string) {\r\n var elements = document.querySelectorAll(selector);\r\n var found = viggo.func.findElementsBeginningWith(elements, text);\r\n for (var i = 0; i < elements.length; i++) {\r\n let elm = <HTMLElement>elements[i];\r\n if (elm == found[0]) {\r\n found.shift();\r\n elm.style.display = '';\r\n } else {\r\n elm.style.display = 'none';\r\n }\r\n }\r\n };\r\n\r\n export function hideElements(selector: string) {\r\n var e = document.querySelectorAll(selector);\r\n for (var i = 0; i < e.length; i++) {\r\n (<HTMLElement>e[i]).style.display = 'none';\r\n }\r\n };\r\n\r\n export function showElements(selector: string) {\r\n var e = document.querySelectorAll(selector);\r\n for (var i = 0; i < e.length; i++) {\r\n (<HTMLElement>e[i]).style.display = '';\r\n }\r\n };\r\n\r\n export function stop(event: Event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n };\r\n\r\n interface TimeCalendar {\r\n timestart: Date,\r\n timeend: Date\r\n }\r\n\r\n export function createMonthCalendars(from: Date, to: Date, selectedDates: TimeCalendar[], dateCheck?: (td: HTMLTableDataCellElement, from: Date, to: Date) => boolean) {\r\n from = new Date(from);\r\n to = new Date(to);\r\n var frag = viggo.dom.fragment();\r\n while (from <= to) {\r\n frag.appendChild(viggo.func.createMonthCalendar(from.getFullYear(), from.getMonth()));\r\n from.setMonth(from.getMonth() + 1, 1);\r\n }\r\n\r\n for (var i = 0; i < selectedDates.length; i++) {\r\n from = new Date(selectedDates[i].timestart);\r\n to = new Date(selectedDates[i].timeend);\r\n var format = from.format('HH:mm');\r\n let td: HTMLTableDataCellElement | null = null;\r\n if (format != '00:00') {\r\n td = <HTMLTableDataCellElement|null>frag.querySelector('td[data-date=\"' + from.format('yyyy-MM-dd') + '\"]');\r\n if (td) {\r\n td.dataset.starttime = format;\r\n }\r\n }\r\n var multiDay = false;\r\n while (from <= to) {\r\n td = <HTMLTableDataCellElement|null>frag.querySelector('td[data-date=\"' + from.format('yyyy-MM-dd') + '\"]');\r\n if (td) {\r\n td.classList.add('selected');\r\n if (multiDay) {\r\n td.classList.add('multiday');\r\n } else {\r\n if (td.dataset.selectCount) {\r\n td.dataset.selectCount = parseInt(<string>td.dataset.selectCount)+1 + '';\r\n } else {\r\n td.dataset.selectCount = '1';\r\n }\r\n }\r\n }\r\n from.setDate(from.getDate() + 1);\r\n multiDay = true;\r\n }\r\n var toTd = frag.querySelector('td[data-date=\"' + to.format('yyyy-MM-dd') + '\"]');\r\n if (td) {\r\n td.classList.add('selected');\r\n format = to.format('HH:mm');\r\n if (format != '23:59') {\r\n td.dataset.endtime = format;\r\n }\r\n if (toTd != td) {\r\n if (td.dataset.selectCount) {\r\n td.dataset.selectCount = parseInt(<string>td.dataset.selectCount) + 1 + '';\r\n } else {\r\n td.dataset.selectCount = '1';\r\n }\r\n }\r\n }\r\n if (dateCheck) {\r\n dateCheck(<HTMLTableDataCellElement>td, new Date(selectedDates[i].timestart), to);\r\n }\r\n }\r\n\r\n return frag;\r\n };\r\n\r\n export function getColorFromValue(value: string, alpha = 1.0) {\r\n const color = viggo.func.md5(value.toString()).substring(0, 6);\r\n if (alpha < 1.0) {\r\n let m = color.match(/[0-9a-f]{2}/gi);\r\n if (m) {\r\n return `rgba(${Array.from(m).map(x => parseInt(x, 16)).join(',')},${alpha})`;\r\n }\r\n }\r\n return '#' + color;\r\n }\r\n\r\n export function md5(d: string) {\r\n function rstr2hex(d: any) {\r\n for (var _, m = \"0123456789ABCDEF\", f = \"\", r = 0; r < d.length; r++)_ = d.charCodeAt(r), f += m.charAt(_ >>> 4 & 15) + m.charAt(15 & _);\r\n return f;\r\n }\r\n function rstr2binl(d: string) {\r\n for (var _ = Array(d.length >> 2), m = 0; m < _.length; m++)\r\n _[m] = 0;\r\n for (m = 0; m < 8 * d.length; m += 8)\r\n _[m >> 5] |= (255 & d.charCodeAt(m / 8)) << m % 32;\r\n return _;\r\n }\r\n function binl2rstr(d: number[]) {\r\n for (var _ = \"\", m = 0; m < 32 * d.length; m += 8)\r\n _ += String.fromCharCode(d[m >> 5] >>> m % 32 & 255);\r\n return _;\r\n }\r\n function binl_md5(d: number[], _: number) {\r\n d[_ >> 5] |= 128 << _ % 32, d[14 + (_ + 64 >>> 9 << 4)] = _;\r\n for (var m = 1732584193, f = -271733879, r = -1732584194, i = 271733878, n = 0; n < d.length; n += 16) {\r\n var h = m, t = f, g = r, e = i;\r\n f = md5_ii(f = md5_ii(f = md5_ii(f = md5_ii(f = md5_hh(f = md5_hh(f = md5_hh(f = md5_hh(f = md5_gg(f = md5_gg(f = md5_gg(f = md5_gg(f = md5_ff(f = md5_ff(f = md5_ff(f = md5_ff(f, r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 0], 7, -680876936), f, r, d[n + 1], 12, -389564586), m, f, d[n + 2], 17, 606105819), i, m, d[n + 3], 22, -1044525330), r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 4], 7, -176418897), f, r, d[n + 5], 12, 1200080426), m, f, d[n + 6], 17, -1473231341), i, m, d[n + 7], 22, -45705983), r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 8], 7, 1770035416), f, r, d[n + 9], 12, -1958414417), m, f, d[n + 10], 17, -42063), i, m, d[n + 11], 22, -1990404162), r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 12], 7, 1804603682), f, r, d[n + 13], 12, -40341101), m, f, d[n + 14], 17, -1502002290), i, m, d[n + 15], 22, 1236535329), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 1], 5, -165796510), f, r, d[n + 6], 9, -1069501632), m, f, d[n + 11], 14, 643717713), i, m, d[n + 0], 20, -373897302), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 5], 5, -701558691), f, r, d[n + 10], 9, 38016083), m, f, d[n + 15], 14, -660478335), i, m, d[n + 4], 20, -405537848), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 9], 5, 568446438), f, r, d[n + 14], 9, -1019803690), m, f, d[n + 3], 14, -187363961), i, m, d[n + 8], 20, 1163531501), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 13], 5, -1444681467), f, r, d[n + 2], 9, -51403784), m, f, d[n + 7], 14, 1735328473), i, m, d[n + 12], 20, -1926607734), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 5], 4, -378558), f, r, d[n + 8], 11, -2022574463), m, f, d[n + 11], 16, 1839030562), i, m, d[n + 14], 23, -35309556), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 1], 4, -1530992060), f, r, d[n + 4], 11, 1272893353), m, f, d[n + 7], 16, -155497632), i, m, d[n + 10], 23, -1094730640), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 13], 4, 681279174), f, r, d[n + 0], 11, -358537222), m, f, d[n + 3], 16, -722521979), i, m, d[n + 6], 23, 76029189), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 9], 4, -640364487), f, r, d[n + 12], 11, -421815835), m, f, d[n + 15], 16, 530742520), i, m, d[n + 2], 23, -995338651), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 0], 6, -198630844), f, r, d[n + 7], 10, 1126891415), m, f, d[n + 14], 15, -1416354905), i, m, d[n + 5], 21, -57434055), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 12], 6, 1700485571), f, r, d[n + 3], 10, -1894986606), m, f, d[n + 10], 15, -1051523), i, m, d[n + 1], 21, -2054922799), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 8], 6, 1873313359), f, r, d[n + 15], 10, -30611744), m, f, d[n + 6], 15, -1560198380), i, m, d[n + 13], 21, 1309151649), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 4], 6, -145523070), f, r, d[n + 11], 10, -1120210379), m, f, d[n + 2], 15, 718787259), i, m, d[n + 9], 21, -343485551), m = safe_add(m, h), f = safe_add(f, t), r = safe_add(r, g), i = safe_add(i, e)\r\n }\r\n return Array(m, f, r, i);\r\n }\r\n function md5_cmn(d: number, _: number, m: number, f: number, r: number, i: number) {\r\n return safe_add(bit_rol(safe_add(safe_add(_, d), safe_add(f, i)), r), m);\r\n }\r\n function md5_ff(d: number, _: number, m: number, f: number, r: number, i: number, n: number) {\r\n return md5_cmn(_ & m | ~_ & f, d, _, r, i, n);\r\n }\r\n function md5_gg(d: number, _: number, m: number, f: number, r: number, i: number, n: number) {\r\n return md5_cmn(_ & f | m & ~f, d, _, r, i, n);\r\n }\r\n function md5_hh(d: number, _: number, m: number, f: number, r: number, i: number, n: number) {\r\n return md5_cmn(_ ^ m ^ f, d, _, r, i, n);\r\n }\r\n function md5_ii(d: number, _: number, m: number, f: number, r: number, i: number, n: number) {\r\n return md5_cmn(m ^ (_ | ~f), d, _, r, i, n);\r\n }\r\n function safe_add(d: number, _: number) {\r\n var m = (65535 & d) + (65535 & _);\r\n return (d >> 16) + (_ >> 16) + (m >> 16) << 16 | 65535 & m;\r\n }\r\n function bit_rol(d: number, _: number) {\r\n return d << _ | d >>> 32 - _;\r\n }\r\n return rstr2hex(binl2rstr(binl_md5(rstr2binl(d), 8 * d.length)));\r\n }\r\n\r\n export function createMonthCalendar(year: number, month: number) {\r\n var date = new Date(year, month, 1, 12, 0, 0, 0);\r\n var calendar = viggo.dom.tag('div', {\r\n className: 'date-picker'\r\n });\r\n\r\n var table = calendar.appendChild(viggo.dom.tag('table'));\r\n\r\n table.appendChild(viggo.dom.tag('caption', null, date.format('MMMM yyyy')));\r\n var colgroup = table.appendChild(viggo.dom.tag('colgroup'));\r\n for (var i = 0; i < 8; i++) {\r\n colgroup.appendChild(viggo.dom.tag('col', { className: i ? ('day' + i) : 'weeks' }));\r\n }\r\n var tr = table.appendChild(viggo.dom.tag('thead')).appendChild(viggo.dom.tag('tr'));\r\n var d = new Date(2012, 6, 1, 12, 0, 0, 0); // monday\r\n for (i = 0; i < 8; i++) {\r\n tr.appendChild(viggo.dom.tag('th', null, i ? d.format('dddd').substring(0, 2) : __('Week')));\r\n d.setDate(d.getDate() + 1);\r\n }\r\n\r\n var tbody = table.appendChild(viggo.dom.tag('tbody'));\r\n\r\n var day = (date.getDay() + 6) % 7;\r\n\r\n date.setDate(1 - day);\r\n\r\n do {\r\n tr = viggo.dom.tag('tr');\r\n var td, week;\r\n for (var i = 0; i < 8; i++) {\r\n if (!i) {\r\n week = date.getWeekOfYear();\r\n td = viggo.dom.tag('td', {\r\n dataset: {\r\n week: week.join(',')\r\n }\r\n }, week[1]);\r\n } else {\r\n if (date.getMonth() != month) {\r\n td = viggo.dom.tag('td', null, '');\r\n } else {\r\n td = viggo.dom.tag('td', {\r\n dataset: {\r\n date: date.format('yyyy-MM-dd'),\r\n day: date.getDay()\r\n }\r\n }, date.getDate());\r\n }\r\n date.setDate(date.getDate() + 1);\r\n }\r\n tr.appendChild(td);\r\n }\r\n tbody.appendChild(tr);\r\n } while (date.getMonth() == month);\r\n\r\n return calendar;\r\n };\r\n\r\n export function switchClass(from: string, to: string, swap: boolean) {\r\n var e = document.getElementsByClassName(from);\r\n if (e.length > 0) {\r\n while (e.length) {\r\n e[0].classList.add(to);\r\n e[0].classList.remove(from);\r\n }\r\n } else {\r\n if (swap) {\r\n var f = document.getElementsByClassName(to);\r\n while (f.length) {\r\n f[0].classList.add(from);\r\n f[0].classList.remove(to);\r\n }\r\n }\r\n }\r\n };\r\n export function closeModalAndPrint() {\r\n if (viggo.modal.isActive()) {\r\n var m = viggo.modal.getLatestModal();\r\n var f = function () {\r\n window.print();\r\n if (m) {\r\n m.removeEventListener('closed', f);\r\n }\r\n };\r\n if (m) {\r\n m.addEventListener('closed', f);\r\n m.close();\r\n }\r\n } else {\r\n window.print();\r\n }\r\n };\r\n export function onlyNumbers(i: string, decimals?: number) {\r\n var da = <HTMLInputElement|null>document.getElementById(i);\r\n if (da && da.value != null) {\r\n da.value = da.value.replace(/[^0-9,]/g, \"\");\r\n if (decimals !== undefined && da.value != '') {\r\n da.value = parseInt(da.value).toFixed(decimals);\r\n }\r\n }\r\n };\r\n\r\n export function getDateFromInput(e: string | HTMLInputElement): Date|null {\r\n let input: HTMLInputElement|null = null;\r\n if (typeof e == 'string') {\r\n input = e.match(/[#\\. ]/) ? <HTMLInputElement | null>document.querySelector(e) : <HTMLInputElement|null>document.getElementById(e);\r\n } else {\r\n input = e;\r\n }\r\n var m = input ? input.value.match(/^(\\d{2})-(\\d{2})-(\\d{4})$/) : null;\r\n var date = null;\r\n if (m) {\r\n date = new Date(parseInt(m[3]), parseInt(m[2]) - 1, parseInt(m[1]));\r\n }\r\n return date;\r\n };\r\n\r\n export function getDateTimeFromValue(input: string) {\r\n var m = input.match(/^(\\d\\d)-(\\d\\d)-(\\d{4})(?: (\\d\\d):(\\d\\d)(?::(\\d\\d))?)?$/);\r\n var date = null;\r\n if (m) {\r\n date = new Date(parseInt(m[3]), parseInt(m[2]) - 1, parseInt(m[1]));\r\n if (m[4] && m[5]) {\r\n date.setHours(parseInt(m[4]), parseInt(m[5]));\r\n if (m[6]) {\r\n date.setSeconds(parseInt(m[6]));\r\n }\r\n }\r\n }\r\n return date;\r\n }\r\n\r\n // http://stackoverflow.com/questions/25562173/calculate-number-of-specific-weekdays-between-dates\r\n // days is an array of weekdays: 0 is Sunday, ..., 6 is Saturday\r\n export function countCertainDays(days: number[], d0: Date, d1: Date) {\r\n var ndays = 1 + Math.round((d1.getTime() - d0.getTime()) / (24 * 3600 * 1000));\r\n var sum = function (a: number, b: number) {\r\n return a + Math.floor((ndays + (d0.getDay() + 6 - b) % 7) / 7);\r\n };\r\n return days.reduce(sum, 0);\r\n };\r\n\r\n\r\n export function hideMenu() {\r\n var pa = document.getElementById('page');\r\n var but = document.getElementById('hide-menu');\r\n if (pa) {\r\n if (pa.classList.contains('hide-menu')) {\r\n pa.classList.remove('hide-menu');\r\n pa.className += ' show-menu animate ';\r\n } else if (pa.classList.contains('show-menu')) {\r\n pa.classList.remove('show-menu');\r\n pa.className += ' hide-menu animate ';\r\n } else {\r\n pa.className += ' hide-menu animate ';\r\n }\r\n setTimeout(function () {\r\n if (pa && pa.classList.contains('animate')) {\r\n pa.classList.remove('animate');\r\n }\r\n }, 1000);\r\n }\r\n };\r\n\r\n export function hideTopMenu() {\r\n var pa = document.getElementById('page');\r\n var but = document.getElementById('hide-topmenu');\r\n if (pa) {\r\n if (pa.classList.contains('hide-topmenu')) {\r\n pa.classList.remove('hide-topmenu');\r\n pa.className += ' show-topmenu animate-t ';\r\n } else if (pa.classList.contains('show-topmenu')) {\r\n pa.classList.remove('show-topmenu');\r\n pa.className += ' hide-topmenu animate-t ';\r\n } else {\r\n pa.className += ' hide-topmenu animate-t ';\r\n }\r\n setTimeout(function () {\r\n if (pa && pa.classList.contains('animate-t')) {\r\n pa.classList.remove('animate-t');\r\n }\r\n }, 300);\r\n }\r\n };\r\n\r\n export function saveDraft(form: HTMLFormElement, headlineElementName: string, functionId: number, id?: number|null) {\r\n let elements = [];\r\n for (var i = 0; i < form.elements.length; i++) {\r\n var e = <HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement | HTMLButtonElement>form.elements[i];\r\n let value = null;\r\n let name = e.name;\r\n switch (e.tagName) {\r\n case 'INPUT':\r\n switch (e.type) {\r\n case 'button':\r\n case 'submit':\r\n case 'reset':\r\n case 'image':\r\n case 'file':\r\n break;\r\n case 'checkbox':\r\n case 'radio':\r\n if (!(<HTMLInputElement>e).checked) {\r\n break;\r\n }\r\n default:\r\n value = e.value;\r\n break;\r\n }\r\n break;\r\n case 'TEXTAREA':\r\n value = e.value;\r\n break;\r\n case 'SELECT':\r\n for (let j = 0; j < (<HTMLSelectElement>e).options.length; j++) {\r\n var option = (<HTMLSelectElement>e).options[j];\r\n if (option.selected) {\r\n elements.push({\r\n Id: name,\r\n Value: option.value\r\n });\r\n }\r\n }\r\n break;\r\n }\r\n if (value !== null) {\r\n elements.push({\r\n Id: name,\r\n Value: value\r\n });\r\n }\r\n }\r\n let headline = <HTMLInputElement|null>form.elements.namedItem(headlineElementName);\r\n let name = (headline ? headline.value : 'Kladde') || 'Kladde';\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Shared/SavedViews/SaveView',\r\n json: true,\r\n data: {\r\n id: id || 0,\r\n name: name,\r\n viggoFunction: functionId,\r\n elements: elements\r\n }\r\n });\r\n };\r\n\r\n export function loadDraft(form: HTMLFormElement, id: number, complete?: () => void) {\r\n new viggo.ajax({\r\n method: 'get',\r\n url: '/Shared/SavedViews/GetSavedView/' + id,\r\n complete: function (data) {\r\n data = data.elements;\r\n for (let i = 0; i < data.length; i++) {\r\n var elm = <HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>form.elements[data[i].id];\r\n var value = data[i].value;\r\n if (elm) {\r\n topswitch:\r\n switch (elm.tagName) {\r\n case 'INPUT':\r\n switch (elm.type) {\r\n case 'radio':\r\n if (elm.value == value) {\r\n (<HTMLInputElement>elm).checked = true;\r\n }\r\n break topswitch;\r\n case 'checkbox':\r\n (<HTMLInputElement>elm).checked = true;\r\n break topswitch;\r\n }\r\n elm.value = value;\r\n if ((<HTMLInputElement>elm).viggoAutoComplete) {\r\n delete (<HTMLInputElement>elm).viggoAutoComplete;\r\n }\r\n if (value) {\r\n elm.classList.add('value-specified');\r\n }\r\n break;\r\n case 'TEXTAREA':\r\n elm.value = value;\r\n if (value) {\r\n elm.classList.add('value-specified');\r\n }\r\n break;\r\n case 'SELECT':\r\n for (var j = 0; j < (<HTMLSelectElement>elm).options.length; j++) {\r\n let option = (<HTMLSelectElement>elm).options[j];\r\n if (option.value == value) {\r\n option.selected = true;\r\n }\r\n }\r\n elm.dispatchEvent(new Event('change'));\r\n break;\r\n }\r\n }\r\n }\r\n viggo.autocomplete.initialize(form);\r\n if (complete) {\r\n complete();\r\n }\r\n }\r\n });\r\n };\r\n\r\n type TemplateCallback = (item: any) => string;\r\n\r\n export function createTemplate(func: string, paramName: string = 'item'): TemplateCallback {\r\n return <TemplateCallback>new Function(paramName, 'return `' + func + '`;');\r\n }\r\n\r\n export function createTemplateFromScriptTag(element: HTMLScriptElement | string, paramName: string = 'item'): TemplateCallback {\r\n if (typeof element == 'string') {\r\n element = <HTMLScriptElement>document.querySelector(element);\r\n }\r\n if (!element || element.tagName != 'SCRIPT' || element.type != 'text/template') {\r\n throw new Error('Tag for template must be of type=text/template and be a script-tag.');\r\n }\r\n return createTemplate(element.textContent||'', paramName);\r\n }\r\n\r\n export function createView<T>(item: T, viewFunction: ((item: T) => string)|Function) {\r\n try {\r\n var result = viewFunction(item);\r\n } catch (err) {\r\n var str = viewFunction.toString();\r\n result = '';\r\n str = str.substring(str.indexOf('`') + 1, str.lastIndexOf('`'));\r\n console.log(str, item);\r\n console.error(err);\r\n }\r\n return viggo.func.createViewFromString(result);\r\n };\r\n\r\n export function scrollToBottom(selector: string) {\r\n let element = typeof selector == 'string' ? document.querySelector(selector) : selector;\r\n if (element) {\r\n element.scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"end\",\r\n inline: \"nearest\"\r\n });\r\n }\r\n };\r\n\r\n export function getScriptVersion(attr?: string) {\r\n if (!attr) {\r\n let script = <HTMLScriptElement|null>document.querySelector('head script[src*=\"/bundle.\"]');\r\n if (script) {\r\n attr = script.src;\r\n }\r\n }\r\n let m = attr ? attr.match(/bundle(?:\\.min)?\\.js\\?v=([A-Za-z0-9_\\-]+)/) : null;\r\n return m ? m[1] : \"\";\r\n };\r\n\r\n export function getStyleVersion(attr?: string) {\r\n if (!attr) {\r\n let style = <HTMLStyleElement | null>document.querySelector('head link[rel=\"stylesheet\"][href*=\"/viggo.\"]');\r\n if (style) {\r\n attr = <string|undefined>style.getAttribute(\"href\");\r\n }\r\n }\r\n let m = attr ? attr.match(/viggo(?:\\.min)?\\.css\\?v=([A-Za-z0-9_\\-]+)/) : null;\r\n return m ? m[1] : \"\";\r\n };\r\n\r\n interface AbsenceViewOptions {\r\n ignoreDefaultEnd?: boolean;\r\n }\r\n\r\n export function absenceView(parentView: Element, getUsersCallback: () => number[], options: AbsenceViewOptions = {}): ((users: number[]) => void) {\r\n let cause = <HTMLSelectElement | null>parentView.querySelector('select[name=\"Cause_id\"]');\r\n let place = <HTMLSelectElement | null>parentView.querySelector('select[name=\"Place_id\"]');\r\n let note = <HTMLTextAreaElement | null>parentView.querySelector('textarea[name=\"Note\"]');\r\n let button = <HTMLButtonElement>viggo.dom.parent(parentView, 'form')!.querySelector('button[type=\"submit\"]');\r\n\r\n let previousUserCount = 0; // Track previous user count\r\n\r\n let updateAccess = (userIds: number[]) => {\r\n button!.disabled = true;\r\n var result = parentView.querySelector('#changed-result');\r\n var error = parentView.querySelector('#changed-error');\r\n var params = parentView.querySelector('#changing-parameters');\r\n cause = <HTMLSelectElement | null>parentView.querySelector('select[name=\"Cause_id\"]');\r\n //viggo.dom.empty(result);\r\n //viggo.dom.empty(error);\r\n if (userIds.length && cause) {\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Basic/Absence/CheckAccessToCreate',\r\n convert: 'html',\r\n data: {\r\n userIds: userIds,\r\n absenceCaseId: cause.value\r\n },\r\n complete: (html) => {\r\n if (error) {\r\n viggo.dom.empty(error);\r\n error.appendChild(html);\r\n } else {\r\n console.error('Missing #changed-error in parentView');\r\n }\r\n }\r\n });\r\n } else if (params) {\r\n params.classList.add('disabled');\r\n }\r\n };\r\n\r\n let updateCauses = (userIds: number[], accessNeedsUpdate: boolean, updateEndTime: boolean = true) => {\r\n let showCases = parentView.querySelector('#changing-cause');\r\n if (showCases && cause) {\r\n viggo.dom.empty(showCases);\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Basic/Absence/GetCausesByUserIds',\r\n convert: 'html',\r\n data: {\r\n userIds: userIds,\r\n causeId: cause.value\r\n },\r\n complete: (html) => {\r\n if (showCases) {\r\n viggo.dom.empty(showCases);\r\n showCases.appendChild(html);\r\n viggo.func.createSearchableSelects(showCases);\r\n let select = showCases.querySelector('select');\r\n if (select && updateEndTime) {\r\n select.dispatchEvent(new Event('change', { bubbles: true, cancelable: false }));\r\n } else if (accessNeedsUpdate) {\r\n updateAccess(userIds);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }\r\n let updateNote = (userIds: number[], accessNeedsUpdate: boolean) => {\r\n let showCases = parentView.querySelector('#changing-note');\r\n if (showCases) {\r\n viggo.dom.empty(showCases);\r\n var defaultNote = (showCases as HTMLElement).dataset.defaultNote ?? \"\";\r\n console.log(defaultNote);\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Basic/Absence/CheckNotesByUserIds?defaultNote=' + encodeURIComponent(defaultNote),\r\n convert: 'html',\r\n data: {\r\n userIds: userIds\r\n },\r\n complete: (html) => {\r\n if (showCases) {\r\n viggo.dom.empty(showCases);\r\n showCases.appendChild(html);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n let updateConflicts = (userIds: number[]) => {\r\n let result = <Element>parentView.querySelector('#changed-result');\r\n let id = <HTMLInputElement|null|string>document.getElementById('Id');\r\n id = id ? (<HTMLInputElement>id).value : '0';\r\n let data = {\r\n userIds: userIds,\r\n startDate: '',\r\n endDate: '',\r\n absenceId: id\r\n };\r\n let start = <HTMLInputElement | null>parentView.querySelector('input[name=\"startdate\"]');\r\n if (!start) {\r\n return;\r\n }\r\n data.startDate = start.value + ' ' + (<HTMLInputElement>parentView.querySelector('input[name=\"starttime\"]')).value + ':00';\r\n let inputEndDate = <HTMLInputElement>parentView.querySelector('input[name=\"enddate\"]'),\r\n inputEndTime = <HTMLInputElement>parentView.querySelector('input[name=\"endtime\"]');\r\n data.endDate = inputEndDate.value + ' ' + inputEndTime.value + ':00';\r\n let startDate = viggo.func.getDateTimeFromValue(data.startDate);\r\n let endDate = viggo.func.getDateTimeFromValue(data.endDate);\r\n if (!startDate || !endDate || startDate >= endDate) {\r\n inputEndDate.classList.add('invalid');\r\n inputEndTime.classList.add('invalid');\r\n button.disabled = true;\r\n } else {\r\n inputEndDate.classList.remove('invalid');\r\n inputEndTime.classList.remove('invalid');\r\n button.disabled = false;\r\n viggo.dom.empty(result);\r\n if (userIds.length) {\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Basic/Absence/CheckForConflicts',\r\n convert: 'html',\r\n data: data,\r\n complete: function (html) {\r\n viggo.dom.empty(result);\r\n if (result) {\r\n result.appendChild(html);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n parentView.addEventListener('change', (ev: Event) => {\r\n let target = <HTMLSelectElement>ev.target;\r\n if (target.name == 'Cause_id') {\r\n let selectedOption = target.selectedOptions[0];\r\n if (selectedOption) {\r\n let placeId = selectedOption.dataset.placeId;\r\n if (placeId) {\r\n let select = (<HTMLSelectElement>parentView.querySelector('select[name=\"Place_id\"]'));\r\n select.value = placeId;\r\n let dispatch = new Event('change', ev);\r\n select.dispatchEvent(dispatch);\r\n }\r\n if (!options.ignoreDefaultEnd) {\r\n let endTime = selectedOption.dataset.endtime;\r\n if (endTime) {\r\n (<NodeListOf<HTMLInputElement>>parentView.querySelectorAll('input[name=\"endtime\"],input.timeend-repeat')).forEach(e => e.value = <string>endTime);\r\n }\r\n }\r\n }\r\n }\r\n updateAccess(getUsersCallback());\r\n }, false);\r\n\r\n parentView.addEventListener('datechange', () => {\r\n updateConflicts(getUsersCallback());\r\n }, false);\r\n\r\n let stop = function (ev: Event) {\r\n ev.stopPropagation();\r\n };\r\n\r\n parentView.querySelector('select[name=\"Place_id\"]')!.addEventListener('change', stop, false);\r\n parentView.querySelector('textarea[name=\"Note\"]')!.addEventListener('change', stop, false);\r\n\r\n let run = (users: number[], conflictsOnly = false) => {\r\n // Only update causes if user count transitions from 0 to 1\r\n const currentUserCount = users.length;\r\n if (!conflictsOnly) { \r\n if (previousUserCount === 0 && currentUserCount > 0) {\r\n updateCauses(users, true, true);\r\n }\r\n else {\r\n updateCauses(users, true, false);\r\n }\r\n updateNote(users, true);\r\n }\r\n updateConflicts(users);\r\n previousUserCount = currentUserCount; // Update previous user count\r\n };\r\n\r\n if (!cause || !cause.options.length || !place || !place.options.length && viggo.isDevelopment) {\r\n alert('Cause should have name=\"Cause_id\" and place should have name=\"Place_id\", and both should have options!');\r\n }\r\n return run;\r\n }\r\n\r\n export function getSelectedDate() {\r\n let elm = <HTMLInputElement|null>document.getElementById('selected-date');\r\n let date: Date = new Date();\r\n if (elm) {\r\n let e = getDateFromInput(elm);\r\n if (e) {\r\n date = e;\r\n }\r\n } else {\r\n let map = viggo.mapQueryString(location.search);\r\n if (map.date) {\r\n let e = getDateTimeFromValue(map.date);\r\n if (e) {\r\n date = e;\r\n }\r\n }\r\n }\r\n return date.format('yyyy-MM-dd');\r\n }\r\n\r\n export function updateProfileImage(id: number, newname: string | null) {\r\n (<NodeListOf<HTMLImageElement>>document.querySelectorAll(`img[src*=\"/users/${id}/\"]:not([data-original-src])`)).forEach(img => {\r\n img.src = newname ? img.src.replace(/\\/(small|big)\\/[a-z0-9\\-_]+\\.jpg/i, `/$1/${newname}`) : 'https://viggopublic.azureedge.net/shared/user.svg';\r\n });\r\n if (newname) {\r\n let temp = <HTMLImageElement | null>document.querySelector('img[src*=\"/users/\"]');\r\n if (temp) {\r\n let src = temp.src;\r\n (<NodeListOf<HTMLImageElement>>document.querySelectorAll(`[data-user-id=\"${id}\"] img[src*=\"/shared/user.svg\"]:not([data-original-src])`)).forEach(img => {\r\n img.src = src.replace(/\\/users\\/\\d+\\/(?:small|big)\\/[a-z0-9\\-_]+.jpg/i, `/users/${id}/big/${newname}`);\r\n });\r\n }\r\n }\r\n }\r\n\r\n export function showDocumentation(uid: string, count: number, skip: number, ignoreParent = false, translations: ObjectOfString = {}) {\r\n let elm = document.getElementById(uid);\r\n if (elm) {\r\n let parent = elm.parentElement;\r\n if (parent) {\r\n let index = Array.from(parent.children).indexOf(elm);\r\n index -= skip + count;\r\n let result = [];\r\n while (index >= 0 && count > 0) {\r\n result.push(parent.children[index][(ignoreParent ? 'innerHTML' : 'outerHTML')]);\r\n index++;\r\n count--;\r\n }\r\n result = result.join('\\n').split(/\\r\\n|\\n/);\r\n if (ignoreParent) {\r\n result = result.filter((line, index) => {\r\n if (index == 0 || index == result.length - 1) {\r\n return line.trim() != '';\r\n }\r\n return true;\r\n });\r\n }\r\n let whitespaces = result.reduce((current: number, value: string): number => {\r\n let m = value.match(/^\\s+/);\r\n if (m) {\r\n if (current > m[0].length) {\r\n current = m[0].length;\r\n }\r\n }\r\n return current;\r\n }, 1000);\r\n if (whitespaces < 1000) {\r\n let regex = new RegExp(\"^ {\" + whitespaces + \"}\");\r\n result = result.map((value) => {\r\n return value.replace(regex, '');\r\n });\r\n }\r\n viggo.dom.empty(elm);\r\n let str = result.join('\\n');\r\n for (let [key, value] of Object.entries(translations)) {\r\n str = str.replace(value, `@Translate.T(\"${key}\")`);\r\n }\r\n elm.appendChild(viggo.func.prettyHtml(str));\r\n }\r\n }\r\n }\r\n\r\n export function prettyHtml(html: string) {\r\n let fragment = viggo.dom.fragment();\r\n let index = 0;\r\n html.replace(/(<\\/?)([a-z][a-z0-9]*)(?: ([^>]+))?>/g, (all: string, startTag: string, tagName: string, attributes: string, offset: number, fullString: string) => {\r\n if (index != offset) {\r\n fragment.appendChild(viggo.dom.text(fullString.substring(index, offset)));\r\n }\r\n index = offset + all.length;\r\n fragment.appendChild(viggo.dom.tag(\"span\", { style: { color: '#808080' } }, startTag));\r\n fragment.appendChild(viggo.dom.tag(\"span\", { style: { color: '#569CD6' } }, tagName));\r\n if (attributes) {\r\n attributes.replace(/([a-z\\-]+)(=[\"][^\"]*\")?/g, (all: string, attrName: string, attrValue: string) => {\r\n fragment.appendChild(viggo.dom.text(' '));\r\n fragment.appendChild(viggo.dom.tag('span', { style: { color: '#9CDCFE' } }, attrName));\r\n if (attrValue) {\r\n fragment.appendChild(viggo.dom.tag('span', { style: { color: '#C8C8B8'}}, attrValue));\r\n }\r\n return '';\r\n });\r\n }\r\n fragment.appendChild(viggo.dom.tag(\"span\", { style: { color: '#808080' } }, '>'));\r\n return '';\r\n });\r\n return fragment;\r\n }\r\n\r\n export function defaultChangeCheck(form: HTMLFormElement, url: string, result: HTMLElement) {\r\n let updated = false;\r\n let change = function (ev: Event) {\r\n let target = <HTMLInputElement | HTMLSelectElement | null>(<HTMLElement>ev.target).closest('input[data-default-change-check],select[data-default-change-check]');\r\n if (target) {\r\n let defaultChanged = false;\r\n (<NodeListOf<HTMLInputElement | HTMLSelectElement>>form.querySelectorAll('input[data-default-change-check],select[data-default-change-check]')).forEach(input => {\r\n if (defaultChanged) {\r\n return;\r\n }\r\n switch (input.tagName) {\r\n case 'SELECT':\r\n let option = (<HTMLSelectElement>input).selectedOptions[0];\r\n if (option) {\r\n defaultChanged = !option.defaultSelected;\r\n }\r\n break;\r\n case 'INPUT':\r\n switch (input.type) {\r\n case 'text':\r\n if (input.classList.contains('date') || input.classList.contains('time')) {\r\n defaultChanged = input.value != (<HTMLInputElement>input).defaultValue;\r\n } else if (input.classList.contains('autocomplete')) {\r\n let autocomplete = <viggo.autocomplete>(<any>input).viggoAutoComplete;\r\n if (autocomplete) {\r\n defaultChanged = autocomplete.value.split(',').sort().join(',') != autocomplete.defaultValue.split(',').sort().join(',');\r\n }\r\n } else {\r\n defaultChanged = parseFloat(input.value.replace(',', '.')) != parseFloat((<HTMLInputElement>input).defaultValue.replace(',', '.'));\r\n }\r\n break;\r\n case 'checkbox':\r\n defaultChanged = (<HTMLInputElement>input).defaultChecked != (<HTMLInputElement>input).checked;\r\n break;\r\n }\r\n break;\r\n }\r\n });\r\n if (defaultChanged && !updated) {\r\n updated = true;\r\n new viggo.ajax({\r\n method: 'get',\r\n url: url,\r\n convert: 'html',\r\n complete: (html) => {\r\n viggo.dom.empty(result);\r\n result.appendChild(html);\r\n }\r\n });\r\n } else if (!defaultChanged && updated) {\r\n viggo.dom.empty(result);\r\n updated = false;\r\n }\r\n }\r\n };\r\n form.addEventListener('change', change, false);\r\n form.addEventListener('datechange', change, false);\r\n form.addEventListener('viggoAutocompletedAll', change, false);\r\n }\r\n\r\n export function showMore(elm: Element|string, description: string) {\r\n if (typeof elm == 'string') {\r\n elm = document.querySelector(elm)!;\r\n }\r\n if (elm) {\r\n let height = elm.clientHeight;\r\n elm.classList.add('show');\r\n if (elm.clientHeight > height + 16) {\r\n elm.classList.remove('show');\r\n let a = elm.appendChild(viggo.dom.tag('a', {\r\n href: '#',\r\n onclick: function (e: MouseEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n a.remove();\r\n (<Element>elm).classList.add('show');\r\n }\r\n }, viggo.dom.tag('i', {\r\n className: 'flaticon-arrow-down-simple'\r\n }), ' ' + description));\r\n }\r\n }\r\n }\r\n\r\n export function transformXml(xmltxt: string, xsltxt: string, parameters?: ObjectOfAny) {\r\n if (document.implementation) {\r\n if (!xmltxt) {\r\n return null;\r\n }\r\n let doc = new DOMParser();\r\n let xml = doc.parseFromString(xmltxt, \"text/xml\");\r\n if (xml.documentElement.nodeName == \"parsererror\") {\r\n console.log(xml.documentElement.childNodes[0].nodeValue);\r\n return null;\r\n }\r\n // XSL:\r\n var xsltPrs = new XSLTProcessor();\r\n if (xsltxt == \"\") {\r\n return null;\r\n }\r\n let xsl = doc.parseFromString(xsltxt, \"text/xml\");\r\n if (xsl.documentElement.nodeName == \"parsererror\") {\r\n console.log(xsl.documentElement.childNodes[0].nodeValue);\r\n return null;\r\n }\r\n\r\n if (parameters) {\r\n for (let name in parameters) {\r\n xsltPrs.setParameter('', name, parameters[name]);\r\n }\r\n }\r\n\r\n xsltPrs.importStylesheet(xsl);\r\n\r\n // Transform:\r\n return xsltPrs.transformToFragment(xml, document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n export function createOpenGraphTemplate(template: DocumentFragment, data: any) {\r\n (<NodeListOf<HTMLElement>>template.querySelectorAll('*')).forEach(element => {\r\n for (let attrName in element.dataset) {\r\n let ogName = element.dataset[attrName]!;\r\n let names = ogName.split('|');\r\n let found = false;\r\n for (let name of names) {\r\n let ogValue = data[name];\r\n if (ogValue) {\r\n if (Array.isArray(ogValue)) {\r\n ogValue = ogValue[0];\r\n }\r\n if (attrName == 'content') {\r\n element.appendChild(viggo.dom.text(ogValue));\r\n } else {\r\n element.setAttribute(attrName, ogValue);\r\n }\r\n delete element.dataset[attrName];\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n element.remove();\r\n break;\r\n }\r\n }\r\n });\r\n return template;\r\n }\r\n\r\n export async function transformXmlUrl(xmlUrl: string, xslUrl: string, parameters?: ObjectOfAny) {\r\n let xml = fetch(new Request(xmlUrl, {\r\n method: 'GET',\r\n credentials: 'same-origin'\r\n })).then(x => x.text());\r\n let xsl = fetch(new Request(xslUrl, {\r\n method: 'GET',\r\n credentials: 'same-origin'\r\n })).then(x => x.text());\r\n let result = await Promise.all([xml, xsl]);\r\n return transformXml(result[0], result[1], parameters);\r\n }\r\n}\r\n","/*\r\nGet emoji list from https://unicode.org/emoji/charts/full-emoji-list.html\r\n\r\n// this function does the job of categorizing\r\n(function(){\r\n\tlet rows = document.querySelector('table').rows;\r\n\tlet result = {};\r\n\tlet header;\r\n\tfor (let row of rows) {\r\n\t\tif (row.cells[0].classList.contains('bighead')) {\r\n\t\t\theader = row.textContent;\r\n\t\t\tresult[header] = [];\r\n\t\t} else {\r\n\t\t\tlet cell = row.cells[2];\r\n\t\t\tif (cell && cell.classList.contains('chars')) {\r\n\t\t\t\tif (!result[header]) {\r\n\t\t\t\t\tconsole.log(header, cell);\r\n\t\t\t\t\tthrow new Error();\r\n\t\t\t\t}\r\n\t\t\t\tresult[header].push(cell.textContent);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tconsole.log(JSON.stringify(result));\r\n}());\r\n*/\r\nnamespace viggo {\r\n const Text = Quill.import('blots/text');\r\n const Module = Quill.import('core/module');\r\n const Keyboard = Quill.import('modules/keyboard');\r\n\r\n class EmojiBlot extends Text { }\r\n\r\n class ToolbarEmoji extends Module {\r\n private palette: HTMLElement | null = null;\r\n private quill: Quill;\r\n private toolbar: any;\r\n private closeListener: (() => void) | null = null;\r\n private ignoreInput = false;\r\n static emojiList: { [name: string]: string[] };\r\n\r\n constructor(quill: Quill, options: any) {\r\n super(quill, options);\r\n\r\n this.quill = quill;\r\n this.toolbar = quill.getModule('toolbar');\r\n if (this.toolbar) {\r\n this.toolbar.addHandler('emoji', this.togglePalette.bind(this));\r\n }\r\n\r\n if (!ToolbarEmoji.emojiList) {\r\n fetch(\"/Scripts/emoji-list.json\").then(x => x.json()).then(json => {\r\n ToolbarEmoji.emojiList = json;\r\n });\r\n }\r\n\r\n document.querySelectorAll('.ql-emoji').forEach(btn => {\r\n btn.innerHTML = options.buttonIcon;\r\n });\r\n\r\n this.quill.on('text-change', (delta: Delta, oldDelta: Delta, source: string) => {\r\n if (source === 'user' && !this.ignoreInput) {\r\n this.close();\r\n }\r\n });\r\n }\r\n\r\n private togglePalette() {\r\n if (this.palette) {\r\n this.close();\r\n } else {\r\n this.showPalette();\r\n }\r\n }\r\n\r\n public showPalette() {\r\n let range = this.quill.getSelection();\r\n const atSignBounds = this.quill.getBounds(range!.index);\r\n\r\n this.palette = viggo.dom.tag('div', {\r\n className: 'emoji-palette',\r\n style: {\r\n top: 10 + atSignBounds.top + atSignBounds.height + 'px',\r\n left: (atSignBounds.left + 250 > (<any>this.quill).container.offsetWidth ? atSignBounds.left - 250 : atSignBounds.left) + 'px'\r\n },\r\n onclick: function (ev: MouseEvent) {\r\n ev.stopPropagation();\r\n }\r\n });\r\n (<any>this.quill).container.appendChild(this.palette);\r\n\r\n let tabToolbar = viggo.dom.tag('div', {\r\n className: 'emoji-toolbar'\r\n });\r\n this.palette.appendChild(tabToolbar);\r\n\r\n let rangeIndex = range!.index;\r\n\r\n //panel\r\n let panel = viggo.dom.tag('div', {\r\n className: 'emoji-panel',\r\n onclick: (event: MouseEvent) => {\r\n let target = <HTMLElement>event.target;\r\n if (target.tagName == 'SPAN') {\r\n this.ignoreInput = true;\r\n let emoji = target.textContent || '';\r\n this.quill.insertText(rangeIndex, emoji, (<any>Quill).sources.USER);\r\n setTimeout(() => {\r\n rangeIndex += emoji.length;\r\n this.quill.setSelection(rangeIndex, 0);\r\n this.ignoreInput = false;\r\n }, 0);\r\n }\r\n }\r\n });\r\n this.palette.appendChild(panel);\r\n this.closeListener = this.close.bind(this);\r\n setTimeout(() => {\r\n document.addEventListener('click', this.closeListener!, false);\r\n }, 0);\r\n\r\n let tabElementHolder = document.createElement('ul');\r\n tabToolbar.appendChild(tabElementHolder);\r\n\r\n let i = 0;\r\n for (let name in ToolbarEmoji.emojiList) {\r\n //add tab bar\r\n let tab = viggo.dom.tag('li', {\r\n className: 'tab-' + name.split(' ')[0].toLowerCase() + (i++ ? '' : ' selected'),\r\n onclick: () => {\r\n for (let item of tabElementHolder.children) {\r\n item.classList.remove('selected');\r\n }\r\n tab.classList.add('selected');\r\n this.updatePanel(name, panel);\r\n }\r\n });\r\n tabElementHolder.appendChild(tab);\r\n }\r\n\r\n this.updatePanel(Object.keys(ToolbarEmoji.emojiList)[0], panel);\r\n }\r\n\r\n private updatePanel(category: string, panel: HTMLElement) {\r\n viggo.dom.empty(panel);\r\n this.quill.focus();\r\n\r\n ToolbarEmoji.emojiList[category].forEach((emoji) => {\r\n let span = viggo.dom.tag('span');\r\n let t = document.createTextNode(emoji);\r\n span.appendChild(t);\r\n panel.appendChild(span);\r\n });\r\n }\r\n\r\n public close() {\r\n if (this.palette) {\r\n this.palette.remove();\r\n this.palette = null;\r\n }\r\n if (this.closeListener) {\r\n document.removeEventListener('click', this.closeListener, false);\r\n this.closeListener = null;\r\n }\r\n }\r\n }\r\n\r\n ToolbarEmoji.DEFAULTS = {\r\n buttonIcon: '<svg viewbox=\"0 0 18 18\"><circle class=\"ql-fill\" cx=\"7\" cy=\"7\" r=\"1\"></circle><circle class=\"ql-fill\" cx=\"11\" cy=\"7\" r=\"1\"></circle><path class=\"ql-stroke\" d=\"M7,10a2,2,0,0,0,4,0H7Z\"></path><circle class=\"ql-stroke\" cx=\"9\" cy=\"9\" r=\"6\"></circle></svg>'\r\n };\r\n\r\n class AutoLinks {\r\n private quill: Quill;\r\n private static urlPattern = /(?:(https?|ftp):\\/\\/|[Ww]{3}\\.)[A-Za-z0-9\\u00C0-\\u00D6\\u00D8-\\u00f6\\u00f8-\\u00ff][A-Za-z0-9\\-\\u00C0-\\u00D6\\u00D8-\\u00f6\\u00f8-\\u00ff]*(?:\\.[A-Za-z0-9\\-\\u00C0-\\u00D6\\u00D8-\\u00f6\\u00f8-\\u00ff]+)*\\.[A-Za-z0-9]+(?:\\:\\d+)?(?:\\/[\\w\\?\\-\\._=%@&/~#;:\\{\\}\\[\\],\\(\\)\\+]+)?/;\r\n constructor(quill: Quill) {\r\n this.quill = quill;\r\n this.registerTypeListener();\r\n this.registerPasteListener();\r\n }\r\n\r\n private registerTypeListener() {\r\n this.registerSpaceHandler();\r\n this.registerEnterHandler();\r\n }\r\n\r\n private registerSpaceHandler() {\r\n this.quill.keyboard.addBinding({\r\n key: ' ',\r\n collapsed: true,\r\n prefix: AutoLinks.urlPattern,\r\n handler: (range: RangeStatic, context: any) => {\r\n const prefixMatch = context.prefix.match(AutoLinks.urlPattern);\r\n if (prefixMatch) {\r\n if (context.format.link) {\r\n this.quill.format('link', false);\r\n return true;\r\n }\r\n const prefixLength = prefixMatch[0].length;\r\n const prefixStart = range.index - prefixLength;\r\n const url = AutoLinks.prefixProtocol(this.quill.getText(prefixStart, prefixLength));\r\n this.quill.formatText(prefixStart, prefixLength, { link: url }, 'user');\r\n this.quill.setSelection(range, 'user');\r\n this.quill.format('link', false);\r\n }\r\n return true;\r\n }\r\n });\r\n }\r\n private registerEnterHandler() {\r\n this.quill.keyboard.addBinding({\r\n key: 13,\r\n prefix: AutoLinks.urlPattern,\r\n collapsed: true,\r\n format: { link: false },\r\n handler: function (this: KeyboardStatic, range: RangeStatic, context: any) {\r\n const prefixMatch = context.prefix.match(AutoLinks.urlPattern);\r\n if (prefixMatch != null) {\r\n const prefixLength = prefixMatch[0].length;\r\n const prefixStart = range.index - prefixLength;\r\n const url = AutoLinks.prefixProtocol(this.quill.getText(prefixStart, prefixLength));\r\n\r\n this.quill.formatText(prefixStart, prefixLength, { link: url }, 'user');\r\n this.quill.setSelection(range, 'user');\r\n this.quill.format('link', false);\r\n }\r\n return true;\r\n }\r\n });\r\n\r\n // this is a hack, to make sure the enter event is handled.\r\n // otherwise Quill will handle internal events for enter, and ignore the others\r\n this.quill.keyboard.bindings[13].unshift(this.quill.keyboard.bindings[13].pop());\r\n }\r\n\r\n private registerPasteListener() {\r\n const globalPattern = new RegExp(AutoLinks.urlPattern.source, 'g');\r\n this.quill.clipboard.addMatcher(Node.TEXT_NODE, (node: Text, delta) => {\r\n const ops: DeltaOperation[] = [];\r\n const str = node.data;\r\n let lastMatchEndIndex = 0;\r\n let match = globalPattern.exec(str);\r\n while (match) {\r\n if (match.index > lastMatchEndIndex) {\r\n ops.push({ insert: str.slice(lastMatchEndIndex, match.index) });\r\n }\r\n const url = AutoLinks.prefixProtocol(match[0]);\r\n ops.push({ insert: match[0], attributes: { link: url } });\r\n lastMatchEndIndex = match.index + match[0].length;\r\n\r\n match = globalPattern.exec(str);\r\n }\r\n\r\n if (lastMatchEndIndex < str.length) {\r\n ops.push({ insert: str.slice(lastMatchEndIndex) });\r\n }\r\n\r\n delta.ops = ops;\r\n return delta;\r\n });\r\n }\r\n\r\n private static prefixProtocol(url: string) {\r\n if (url.substring(0, 4).toLowerCase() == 'www.') {\r\n url = 'http://' + url;\r\n }\r\n return url;\r\n }\r\n }\r\n\r\n // emoji list based on https://en.wikipedia.org/wiki/List_of_emoticons\r\n class AutoEmoji {\r\n private quill: Quill;\r\n private static emojiPattern = /(?:[:8xX=;]'?-?|<[\\\\\\/]?)[)3}D(oOpP\\/\\\\*|]$/;\r\n private static emojiSet: ObjectOf<string[]> = {\r\n \"🙂\": [\":-)\", \":)\"], // Smiley or happy face.\r\n \"😊\": [\":-3\", \":3\", \":-}\", \":}\"],\r\n \"😃\": [\":-D\", \":D\"], // Laughing, big grin, laugh with glasses, or wide-eyed surprisea\r\n \"😄\": [\"8-D\", \"8D\"],\r\n \"😆\": [\"x-D\", \"xD\", \"X-D\", \"XD\"],\r\n \"ðŸ˜\": [\"=D\", \"=3\"],\r\n \"ðŸ™\": [\":-(\", \":(\"], // Frown, sad, angry, pouting \r\n \"😢\": [\":'-(\", \":'(\"], // Crying\r\n \"😂\": [\":'-)\", \":')\"], // Tears of happiness\r\n \"😮\": [\":-O\", \":O\", \":‑o\", \":o\"], // Surprise, shock, yawn\r\n \"😚\": [\":-*\", \":*\"], // Kiss\r\n \"😉\": [\";-)\", \";)\"], // Wink, smirk\r\n \"😛\": [\":-P\", \":P\", \":-p\", \":p\"], // Tongue sticking out, cheeky/playful, blowing a raspberry\r\n \"😕\": [\":-/\", \":/\", \":\\\\\"], // Skeptical, annoyed, undecided, uneasy, hesitant\r\n \"ðŸ˜\": [\":-|\", \":|\"], // Straight face[5] no expression, indecision\r\n // Embarrassed, blushing\r\n // Sealed lips or wearing braces, tongue-tied\r\n // Angel, saint, innocent\r\n // Evil, devilish\r\n // Cool, bored/yawning\r\n // Tongue-in-cheek\r\n // Partied all night\r\n // Drunk, confused\r\n // Being sick\r\n // Dumb, dunce-like\r\n // Scepticism, disbelief, or disapproval\r\n \"💔\": [\"</3\", \"<\\\\3\"],\r\n \"â¤ï¸\": [\"<3\"]\r\n };\r\n constructor(quill: Quill) {\r\n this.quill = quill;\r\n this.registerAutoEmojiHandler();\r\n }\r\n\r\n private registerAutoEmojiHandler() {\r\n this.quill.keyboard.addBinding({\r\n key: ' ',\r\n collapsed: true,\r\n prefix: AutoEmoji.emojiPattern,\r\n handler: (range: RangeStatic, context: any) => {\r\n const prefixMatch = context.prefix.match(AutoEmoji.emojiPattern);\r\n if (prefixMatch) {\r\n const ascii = prefixMatch[0];\r\n const emoji = this.getEmoji(ascii);\r\n if (emoji) {\r\n const prefixLength = ascii.length;\r\n const prefixStart = range.index - prefixLength;\r\n this.quill.deleteText(prefixStart, prefixLength, \"user\");\r\n this.quill.insertText(prefixStart, emoji, \"user\");\r\n this.quill.setSelection(range, 'user');\r\n }\r\n }\r\n return true;\r\n }\r\n });\r\n }\r\n\r\n private getEmoji(ascii: string) {\r\n for (let emoji in AutoEmoji.emojiSet) {\r\n const list = AutoEmoji.emojiSet[emoji];\r\n if (list.includes(ascii)) {\r\n return emoji;\r\n }\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n Quill.register({\r\n 'formats/emoji': EmojiBlot,\r\n 'modules/emoji-toolbar': ToolbarEmoji,\r\n 'modules/autoLinks': AutoLinks,\r\n 'modules/autoEmoji': AutoEmoji\r\n });\r\n\r\n // script is superscript/subscript\r\n type RichEditorTool = \"background\" | \"bold\" | \"color\" | \"font\" | \"code\" | \"italic\" | \"link\" | \"size\" | \"strike\" | \"script\" | \"underline\" | \"blockquote\" | \"header\" | \"indent\" | \"list\" | \"align\" | \"direction\" | \"code-block\" | \"formular\" | \"image\" | \"video\";\r\n interface RichEditorOptions {\r\n element: HTMLTextAreaElement;\r\n tools: any;\r\n }\r\n export class richeditor {\r\n private textarea: HTMLTextAreaElement;\r\n private editor: HTMLElement;\r\n private quill: Quill;\r\n private openGraphContainer: HTMLElement | null;\r\n private openGraphUrl: string | null;\r\n private allowedTools: string[];\r\n\r\n constructor(options: RichEditorOptions) {\r\n this.textarea = options.element;\r\n this.editor = viggo.dom.tag('div', {\r\n className: this.textarea.className,\r\n innerHTML: this.textarea.value,\r\n dataset: this.textarea.dataset,\r\n });\r\n\r\n this.openGraphUrl = null;\r\n this.openGraphContainer = null;\r\n this.initializeOpenGraph(this.textarea.dataset.richeditorLinkContainer, this.textarea.dataset.richeditorLink);\r\n let parent = this.textarea.parentElement;\r\n if (parent) {\r\n parent.insertBefore(this.editor, this.textarea);\r\n }\r\n this.quill = new Quill(this.editor, {\r\n modules: {\r\n autoLinks: true,\r\n autoEmoji: true,\r\n toolbar: {\r\n container: options.tools,\r\n handlers: {\r\n emoji: function () {}\r\n }\r\n },\r\n \"emoji-toolbar\": options.tools.some((x: string | string[]) => Array.isArray(x) ? x.some(y => y == 'emoji') : x == 'emoji'),\r\n mention: this.textarea.classList.contains('autocomplete')\r\n },\r\n theme: 'snow'\r\n });\r\n this.allowedTools = ['link'];\r\n this.quill.on(\"text-change\", this.onTextChange.bind(this));\r\n this.quill.clipboard.addMatcher(Node.ELEMENT_NODE, this.onPaste.bind(this));\r\n this.quill.root.tabIndex = this.textarea.tabIndex;\r\n this.initializeAllowedTools(options.tools);\r\n this.allowedTools = this.allowedTools.unique();\r\n }\r\n\r\n private onPaste(node: any, delta: Delta) {\r\n for (let op of delta.ops) {\r\n this.filterOperation(op);\r\n }\r\n return delta;\r\n }\r\n\r\n private onTextChange(delta: Delta, oldContents: Delta, source: Sources) {\r\n if (source !== \"user\") {\r\n return;\r\n }\r\n if (this.openGraphContainer && !this.openGraphUrl) {\r\n let link: string | null | undefined;\r\n for (let i = 0; i < delta.ops.length && !link; i++) {\r\n let op = delta.ops[i];\r\n link = <string | null | undefined>(op.attributes ? op.attributes!.link : null);\r\n if (link && !link.match(/^https?:\\/\\//)) {\r\n link = null;\r\n }\r\n }\r\n if (link && link.indexOf(location.origin) != 0) {\r\n this.previewLink(link);\r\n }\r\n }\r\n this.textarea.value = this.quill.root.innerHTML;\r\n }\r\n\r\n private filterOperation(op: Op) {\r\n let found = false;\r\n if (op.attributes) {\r\n let list = Object.keys(op.attributes);\r\n let counter = 0;\r\n for (let format of list) {\r\n if (this.allowedTools.indexOf(format) == -1) { // format is now allowed\r\n delete op.attributes[format];\r\n counter++;\r\n found = true;\r\n }\r\n }\r\n if (counter == list.length) { // all formats was removed\r\n delete op.attributes;\r\n }\r\n }\r\n return found;\r\n }\r\n\r\n private initializeAllowedTools(tools: any) {\r\n for (let tool of tools) {\r\n if (Array.isArray(tool)) {\r\n this.initializeAllowedTools(tool);\r\n } else {\r\n if (typeof tool == 'string') {\r\n this.allowedTools.push(tool);\r\n } else if (typeof tool == 'object') {\r\n this.initializeAllowedTools(Object.keys(tool));\r\n }\r\n }\r\n }\r\n }\r\n\r\n private previewLink(url: string) {\r\n this.openGraphUrl = url;\r\n viggo.dom.empty(this.openGraphContainer!);\r\n this.openGraphContainer!.classList.add('loading');\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Shared/OpenGraph/GetView',\r\n json: true,\r\n convert: 'html',\r\n data: url,\r\n complete: (html) => {\r\n let close = html.querySelector('.close');\r\n if (close) {\r\n close.addEventListener('click', () => {\r\n viggo.dom.empty(this.openGraphContainer!);\r\n this.openGraphUrl = null;\r\n });\r\n }\r\n this.openGraphContainer!.classList.remove('loading');\r\n this.openGraphContainer!.appendChild(html);\r\n }\r\n });\r\n }\r\n\r\n private initializeOpenGraph(container?: string, link?: string) {\r\n if (container) {\r\n this.openGraphContainer = document.getElementById(container);\r\n }\r\n if (this.openGraphContainer && link) {\r\n this.previewLink(link);\r\n }\r\n }\r\n\r\n public static initialize(element: Element | Document) {\r\n (<NodeListOf<HTMLTextAreaElement>>element.querySelectorAll('textarea.richeditor')).forEach(textarea => {\r\n let s = textarea.dataset.richeditorTools;\r\n let tools: any[] = [];\r\n if (!s) {\r\n tools = [\"bold\", \"italic\", \"underline\", \"emoji\", { list: 'ordered' }, { list: 'bullet' }];\r\n } else if (s == 'all') {\r\n tools = [\r\n ['bold', 'italic', 'underline', 'strike'], // toggled buttons\r\n ['blockquote', 'code-block'],\r\n ['emoji'],\r\n\r\n [{ 'header': 1 }, { 'header': 2 }], // custom button values\r\n [{ 'list': 'ordered' }, { 'list': 'bullet' }],\r\n [{ 'script': 'sub' }, { 'script': 'super' }], // superscript/subscript\r\n [{ 'indent': '-1' }, { 'indent': '+1' }], // outdent/indent\r\n [{ 'direction': 'rtl' }], // text direction\r\n\r\n [{ 'size': ['small', false, 'large', 'huge'] }], // custom dropdown\r\n [{ 'header': [1, 2, 3, 4, 5, 6, false] }],\r\n\r\n [{ 'color': [] }, { 'background': [] }], // dropdown with defaults from theme\r\n [{ 'font': [] }],\r\n [{ 'align': [] }],\r\n\r\n ['clean'] // remove formatting button\r\n ];\r\n } else if (s == 'none') {\r\n tools = [];\r\n } else {\r\n tools = JSON.parse(s);\r\n }\r\n new viggo.richeditor({\r\n element: textarea,\r\n tools: tools\r\n });\r\n });\r\n }\r\n }\r\n}\r\n\r\nviggo.modal.addEventListener('load', function (data) {\r\n viggo.richeditor.initialize(data.target);\r\n});\r\n\r\ndocument.addEventListener('statepushed', async function (event) {\r\n viggo.richeditor.initialize(<Element | Document>event.target);\r\n}, false);\r\n\r\nviggo.modal.addEventListener('show', function (data) {\r\n viggo.richeditor.initialize(data.target);\r\n});\r\n\r\nviggo.ready(function () {\r\n viggo.richeditor.initialize(document);\r\n});","module viggo {\r\n\r\n const translations: {\r\n guard: string;\r\n birthday: string;\r\n [index: string]: string\r\n } = {\r\n guard: __('Supervision'),\r\n birthday: __('Birthday')\r\n };\r\n\r\n const COPY_TYPE_INVALID = 0;\r\n\r\n class DayColumn {\r\n public cell: HTMLTableDataCellElement;\r\n public date: Date;\r\n public index: number;\r\n public container: HTMLElement;\r\n constructor(cell: HTMLTableDataCellElement, date: Date, index: number) {\r\n this.cell = cell;\r\n this.date = date;\r\n this.index = index;\r\n this.container = <HTMLElement>cell.querySelector('.container');\r\n this.cell.classList.remove('today');\r\n if (date.isToday()) {\r\n this.cell.classList.add('today');\r\n }\r\n }\r\n public compare(date: Date): number {\r\n if (this.date.getDate() == date.getDate() && this.date.getMonth() == date.getMonth() && this.date.getFullYear() == date.getFullYear()) {\r\n return 0;\r\n } else {\r\n return this.date < date ? -1 : 1;\r\n }\r\n }\r\n }\r\n\r\n interface CalendarTemplate {\r\n [index: string]: Function|undefined;\r\n }\r\n\r\n interface DatePeriod {\r\n From: Date;\r\n To: Date;\r\n }\r\n\r\n interface PeriodCalendarPartOptions {\r\n periodStart: Date | null;\r\n periodEnd: Date | null;\r\n validPeriods: DatePeriod[];\r\n invalidPeriods: DatePeriod[];\r\n slipDistance?: number;\r\n }\r\n\r\n interface CalendarOptions extends PeriodCalendarPartOptions {\r\n links: CalendarLinksDTO;\r\n startDate: Date;\r\n data: CalendarLoadData;\r\n element: HTMLElement;\r\n copyType: number;\r\n copyData: number[] | null;\r\n offline?: boolean;\r\n inputElementDate?: HTMLInputElement|null;\r\n clickElementPrevious?: HTMLElement|null;\r\n clickElementToday?: HTMLElement|null;\r\n clickElementNext?: HTMLElement|null;\r\n templates: {[index: string]: string};\r\n }\r\n\r\n interface CalendarAddLink {\r\n Title: string;\r\n Url: string;\r\n }\r\n\r\n interface CalendarLinksDTO {\r\n Add: CalendarAddLink[];\r\n Move?: string;\r\n Copy?: string;\r\n Delete?: string;\r\n Execute?: string;\r\n GetItems?: string;\r\n }\r\n\r\n export enum FilterResult {\r\n hide = 0,\r\n show = 1,\r\n dim = 2\r\n }\r\n\r\n enum CopyMode {\r\n none = \"none\",\r\n copy = \"copy\",\r\n cut = \"cut\"\r\n }\r\n\r\n export enum CalendarItemType {\r\n Subject = 0,\r\n Activity = 1,\r\n Presence = 2,\r\n Task = 3,\r\n Preparation = 4,\r\n Supervision = 5,\r\n Absence = 6,\r\n Substitute = 7,\r\n Calendar = 8,\r\n Birthday = 9,\r\n Guard = 10,\r\n Nothing = -1\r\n }\r\n\r\n export interface CalendarInterface {\r\n startDate: Date;\r\n endDate: Date;\r\n links: CalendarLinksDTO;\r\n removeItem(item: CalendarItem, repaintLater?: boolean): boolean;\r\n createView(name: string, item: any): DocumentFragment | null;\r\n isInPeriod(item: CalendarItem): boolean;\r\n selectedItems: CalendarItem[];\r\n clearSelection(): void;\r\n toggleSelect(item: CalendarItem): void;\r\n deleteSelected(): void;\r\n copy(event?: Event): boolean;\r\n cut(event?: Event): boolean;\r\n reload(): void;\r\n }\r\n\r\n export abstract class AbstractCalendar<GenericItem extends CalendarItem> extends viggo.classes.eventListener implements CalendarInterface {\r\n public static calendarStart = new Date(0 * 60 * 60 * 1000);\r\n public static calendarEnd = new Date(24 * 60 * 60 * 1000 - 1);\r\n public static hourHeight = 46;\r\n public static defaultTime = 30 * 60 * 1000;\r\n\r\n public links!: CalendarLinksDTO;\r\n public startDate!: Date;\r\n protected itemMap!: Map<CalendarItemType, Map<number, GenericItem>>;\r\n protected items!: GenericItem[];\r\n public templates!: CalendarTemplate;\r\n public static timeDetail = 5 * 60 * 1000;\r\n public static copiedItems: Map<number, viggo.CalendarItemDTO> = new Map();\r\n protected static copyDate: Date|null = null;\r\n protected static copyMode: CopyMode = CopyMode.none;\r\n protected pasteButton: HTMLElement|null = null;\r\n public selectedItems!: GenericItem[];\r\n protected inputElementDate?: HTMLInputElement|null;\r\n protected periodIncrement: number = 0;\r\n public loadData!: CalendarLoadData;\r\n public originalDate: Date;\r\n public abstract get name(): string;\r\n protected copyType!: number;\r\n protected copyData!: number[] | null;\r\n private _filter: ((item: GenericItem) => FilterResult) | null;\r\n private defaultFilter: (item: GenericItem) => FilterResult;\r\n protected abstract repositionStartDate(startDate: Date): Date;\r\n protected abstract repaint(): void;\r\n protected abstract itemClass: new (item: CalendarItemDTO) => GenericItem;\r\n private periodClickTimeout: number = 0;\r\n private ajaxRequest?: viggo.ajax;\r\n public readonly element: HTMLElement;\r\n public periodEnd!: Date;\r\n public periodStart!: Date;\r\n public validPeriods!: DatePeriod[];\r\n public invalidPeriods!: DatePeriod[];\r\n public slipDistance!: number; // miliseconds. Defaults to 5 minutes\r\n\r\n constructor(options: CalendarOptions) {\r\n super();\r\n this._filter = null;\r\n this.defaultFilter = () => FilterResult.show;\r\n this.element = options.element;\r\n (<any>this.element).viggoCalendar = this;\r\n this.originalDate = options.startDate;\r\n this.initialize(options);\r\n if (!options.offline) {\r\n viggo.wait(1).then(() => this.reload());\r\n }\r\n }\r\n public initializePeriod(options: PeriodCalendarPartOptions) {\r\n this.periodEnd = new Date(options.periodEnd ? options.periodEnd : new Date(3000, 0, 1)); // Not much has changed, but they lived under water\r\n this.periodStart = new Date(options.periodStart ? options.periodStart : new Date(0));\r\n this.slipDistance = options.slipDistance || 5 * 60 * 1000; // 5 minutes.\r\n this.validPeriods = options.validPeriods.sort((p1, p2) => {\r\n return p1.From.getTime() - p2.From.getTime();\r\n });\r\n this.invalidPeriods = options.invalidPeriods.sort((p1, p2) => {\r\n return p1.From.getTime() - p2.From.getTime();\r\n });\r\n if (this.periodEnd <= this.periodStart) {\r\n throw new Error('End date must be after start date.');\r\n }\r\n }\r\n public get endDate(): Date {\r\n let end = new Date(this.startDate);\r\n end.setDate(end.getDate() + this.periodIncrement);\r\n return end;\r\n }\r\n public setFilter(filter: ((item: GenericItem) => FilterResult)|null) {\r\n this._filter = filter;\r\n }\r\n protected get filter(): (item: GenericItem) => FilterResult {\r\n return this._filter || this.defaultFilter;\r\n }\r\n protected * visibleItems() {\r\n for (let item of this.items) {\r\n if (item.isInView()) {\r\n yield item;\r\n }\r\n }\r\n }\r\n protected * visibleSelectedItems() {\r\n for (let item of this.selectedItems) {\r\n if (item.isInView()) {\r\n yield item;\r\n }\r\n }\r\n }\r\n private setupCopyEventHandlers() {\r\n let copy = (event: Event) => this.copy(event);\r\n let paste = (event: Event) => this.paste(event);\r\n let cut = (event: Event) => this.cut(event);\r\n\r\n let clear = () => this.clearCopy();\r\n\r\n let deleteItems = (event: Event) => {\r\n event.preventDefault();\r\n this.deleteSelected();\r\n };\r\n\r\n this.element.dataset.shortcuts = \"Ctrl+C Ctrl+V Ctrl+X Meta+C Meta+V Meta+X Shortcut+Escape Shortcut+Delete Shortcut+Backspace\";\r\n this.element.addEventListener('Ctrl+C', copy, false);\r\n this.element.addEventListener('Ctrl+V', paste, false);\r\n this.element.addEventListener('Ctrl+X', cut, false);\r\n this.element.addEventListener('Meta+C', copy, false);\r\n this.element.addEventListener('Meta+V', paste, false);\r\n this.element.addEventListener('Meta+X', cut, false);\r\n this.element.addEventListener('Shortcut+Escape', clear, false);\r\n this.element.addEventListener('Shortcut+Delete', deleteItems, false);\r\n this.element.addEventListener('Shortcut+Backspace', deleteItems, false);\r\n this.element.addEventListener('invalidate', (event) => {\r\n event.preventDefault();\r\n this.reload();\r\n }, false);\r\n }\r\n protected initialize(options: CalendarOptions) {\r\n this.links = options.links;\r\n this.links.Add = this.links.Add || [];\r\n this.loadData = options.data;\r\n this.copyType = options.copyType;\r\n this.copyData = options.copyData;\r\n this.startDate = this.repositionStartDate(options.startDate);\r\n this.setupCopyEventHandlers();\r\n this.inputElementDate = options.inputElementDate;\r\n\r\n if (this.inputElementDate) {\r\n this.inputElementDate.addEventListener('datechange', (ev: Event) => {\r\n let event = <DatePickerEvent>ev;\r\n let lastDate = new Date(this.startDate);\r\n let date = <Date>event.detail.newDate;\r\n if (lastDate.getFullYear() != date.getFullYear() || lastDate.getMonth() != date.getMonth() || lastDate.getDate() != date.getDate()) {\r\n this.setPeriod(date);\r\n }\r\n });\r\n }\r\n let blur = (ev: Event) => {\r\n let a = (<HTMLElement>ev.target).closest('a');\r\n if (a) {\r\n a.blur();\r\n }\r\n };\r\n if (options.clickElementPrevious) {\r\n options.clickElementPrevious.addEventListener('click', (ev: Event) => {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n this.previousPreiod();\r\n blur(ev);\r\n });\r\n }\r\n if (options.clickElementToday) {\r\n options.clickElementToday.addEventListener('click', (ev: Event) => {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n let date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n this.setPeriod(date);\r\n blur(ev);\r\n });\r\n }\r\n if (options.clickElementNext) {\r\n options.clickElementNext.addEventListener('click', (ev: Event) => {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n this.nextPeriod();\r\n blur(ev);\r\n });\r\n }\r\n this.items = [];\r\n this.selectedItems = [];\r\n this.itemMap = new Map();\r\n this.templates = {};\r\n for (let name in options.templates) {\r\n try {\r\n this.templates[name] = viggo.func.createTemplate(options.templates[name]);\r\n } catch (err) {\r\n console.error(`Error in template \"${name}\"`);\r\n console.error(err);\r\n }\r\n }\r\n this.initializePeriod(options);\r\n }\r\n protected getNumberSetting(name: string) {\r\n let value = this.getStringSetting(name);\r\n if (value) {\r\n let num = parseInt(value);\r\n return isNaN(num) ? null : num;\r\n }\r\n return null;\r\n }\r\n protected getStringSetting(name: string) {\r\n return localStorage.getItem(`${this.name}.${name}`);\r\n }\r\n protected setSetting(name: string, value: string | number) {\r\n localStorage.setItem(`${this.name}.${name}`, value+'');\r\n }\r\n protected getJsonSetting(name: string) {\r\n let json = this.getStringSetting(name);\r\n return json ? JSON.parse(json) : null;\r\n }\r\n protected setJsonSetting(name: string, value: any) {\r\n this.setSetting(name, JSON.stringify(value));\r\n }\r\n public reset(startDate: Date) {\r\n this.startDate = this.repositionStartDate(startDate);\r\n this.items.forEach(item => {\r\n if (item.temporaryMode === CalendarItemTemporaryMode.pasting) {\r\n item.remove(true);\r\n }\r\n });\r\n\r\n this.selectedItems = [];\r\n }\r\n\r\n public resetPeriods() {\r\n if (!this.validPeriods.length) {\r\n this.createInvalidAreaAndCheckSlip(this.startDate, this.periodStart);\r\n this.createInvalidAreaAndCheckSlip(this.periodEnd, this.endDate);\r\n }\r\n for (let period of this.invalidPeriods) {\r\n this.createInvalidAreaAndCheckSlip(period.From, period.To);\r\n }\r\n if (this.validPeriods.length) {\r\n this.createInvalidAreaAndCheckSlip(this.startDate, this.validPeriods[0].From);\r\n }\r\n for (let i = 1; i < this.validPeriods.length; i++) {\r\n let previousPeriod = this.validPeriods[i - 1];\r\n let period = this.validPeriods[i];\r\n this.createInvalidAreaAndCheckSlip(previousPeriod.To, period.From);\r\n }\r\n if (this.validPeriods.length) {\r\n this.createInvalidAreaAndCheckSlip(this.validPeriods[this.validPeriods.length - 1].To, this.endDate);\r\n }\r\n }\r\n\r\n private createInvalidAreaAndCheckSlip(from: Date, to: Date) {\r\n let dates = this.accomidateSlip(from, to);\r\n if (dates) {\r\n this.createInvalidArea(new Date(dates[0]), new Date(dates[1]));\r\n }\r\n }\r\n\r\n public isInPeriod(item: GenericItem) {\r\n let result = item.isBetween(this.periodStart, this.periodEnd);\r\n if (result) {\r\n if (this.validPeriods.length) {\r\n result = !item.isBetween(this.periodStart, this.validPeriods[0].From);\r\n for (let i = 1; i < this.validPeriods.length && result; i++) {\r\n let period = this.validPeriods[i];\r\n let previousPeriod = this.validPeriods[i-1];\r\n result = !item.isBetween(previousPeriod.To, period.From);\r\n }\r\n result = result && !item.isBetween(this.validPeriods[this.validPeriods.length-1].To, this.periodEnd);\r\n }\r\n for (let i = 0; i < this.invalidPeriods.length && result; i++) {\r\n let period = this.invalidPeriods[i];\r\n result = !item.isBetween(period.From, period.To);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n protected accomidateSlip(from: Date, to: Date) {\r\n if (from > to || to.getTime() - from.getTime() < this.slipDistance) {\r\n return null;\r\n }\r\n let slip: Date;\r\n if (from < this.startDate) {\r\n from = new Date(this.startDate);\r\n from.setHours(0, 0, 0, 0);\r\n } else {\r\n slip = new Date(from.getTime() + this.slipDistance);\r\n if (slip.getDate() != from.getDate()) {\r\n from = slip;\r\n from.setHours(0, 0, 0, 0);\r\n }\r\n }\r\n if (to > this.endDate) {\r\n to = new Date(this.endDate);\r\n to.setDate(to.getDate() - 1);\r\n to.setHours(23, 59, 59, 999);\r\n } else {\r\n slip = new Date(to.getTime() - this.slipDistance);\r\n if (slip.getDate() != to.getDate()) {\r\n to = slip;\r\n to.setHours(23, 59, 59, 999);\r\n }\r\n }\r\n return [from, to];\r\n }\r\n\r\n protected abstract createInvalidArea(from: Date, to: Date): void;\r\n\r\n public allowPaste() {\r\n return !!(AbstractCalendar.copiedItems.size > 0 && this.links.Copy);\r\n }\r\n\r\n public nextPeriod() {\r\n this.originalDate.setDate(this.originalDate.getDate() + this.periodIncrement);\r\n this.setPeriod(this.originalDate);\r\n }\r\n public previousPreiod() {\r\n this.originalDate.setDate(this.originalDate.getDate() - this.periodIncrement);\r\n this.setPeriod(this.originalDate);\r\n }\r\n public setPeriod(date: Date) {\r\n this.originalDate = date;\r\n this.startDate = this.repositionStartDate(date);\r\n if (this.inputElementDate) {\r\n this.inputElementDate.value = date.format('dd-MM-yyyy');\r\n }\r\n this.cacheReload();\r\n let url = viggo.appendQueryString('?date=' + date.format('yyyy-MM-dd'));\r\n clearTimeout(this.periodClickTimeout);\r\n this.periodClickTimeout = window.setTimeout(() => {\r\n this.reload(undefined, undefined, { url: url });\r\n }, 200);\r\n }\r\n\r\n public createView(name: string, item: any) {\r\n let template = this.templates[name];\r\n return template ? viggo.func.createView(item, template) : null;\r\n }\r\n\r\n protected hasTemplates(...names: string[]) {\r\n let found = true;\r\n for (let i = 0; i < names.length && found; i++) {\r\n found = names[i] in this.templates;\r\n }\r\n return found;\r\n }\r\n\r\n protected copyCut(mode: CopyMode) {\r\n for (var i = 0; i < this.items.length; i++) {\r\n this.items[i].clearCopyCut();\r\n }\r\n AbstractCalendar.copiedItems.clear();\r\n AbstractCalendar.copyMode = CopyMode.none;\r\n if (mode != CopyMode.none && this.copyType) {\r\n AbstractCalendar.copyDate = new Date(this.startDate);\r\n let counter = 0;\r\n for (let s of this.visibleSelectedItems()) {\r\n counter++;\r\n s.copyCut();\r\n AbstractCalendar.copiedItems.set(<number>s.id, {\r\n id: s.id,\r\n group: '',\r\n title: s.title,\r\n elementId: s.elementId,\r\n elementname: s.elementname,\r\n description: s.description,\r\n premises: s.premises,\r\n start: new Date(s.start),\r\n length: s.length,\r\n type: s.type,\r\n elementType: s.elementType,\r\n copyType: this.copyType,\r\n readonly: s.readonly,\r\n backgroundColor: s.style.backgroundColor,\r\n borderColor: s.style.borderColor,\r\n color: s.style.color\r\n });\r\n }\r\n if (counter) {\r\n AbstractCalendar.copyMode = mode;\r\n }\r\n }\r\n }\r\n public copy(event?: Event): boolean {\r\n let result = !event || !((<HTMLElement>event.target).tagName in { INPUT: 1, TEXTAREA: 1 });\r\n if (result) {\r\n this.copyCut(CopyMode.copy);\r\n }\r\n return result;\r\n }\r\n public cut(event?: Event): boolean {\r\n let result = !event || !((<HTMLElement>event.target).tagName in { INPUT: 1, TEXTAREA: 1 });\r\n if (result) {\r\n this.copyCut(CopyMode.cut);\r\n }\r\n return result;\r\n }\r\n public deleteSelected() {\r\n let list = Array.from(this.visibleSelectedItems());\r\n if (list.length && this.links.Delete) {\r\n new viggo.ajax({\r\n url: this.links.Delete,\r\n method: 'post',\r\n json: true,\r\n data: list.map(x => x.id)\r\n });\r\n while (list.length) {\r\n let e = list.pop();\r\n if (e) {\r\n e.remove();\r\n }\r\n }\r\n this.selectedItems = [];\r\n }\r\n }\r\n protected pasteToDates(dates: Date[], copyData: number[] | null = null) {\r\n if (AbstractCalendar.copyDate && this.links.Copy) {\r\n let items: any = [];\r\n for (var i = 0; i < dates.length; i++) {\r\n let date = new Date(dates[i]);\r\n let add = date.getTime() - AbstractCalendar.copyDate.getTime();\r\n for (var item of AbstractCalendar.copiedItems.values()) {\r\n let newItem = <CalendarItemDTO>Object.assign({}, item);\r\n newItem.temporaryMode = viggo.CalendarItemTemporaryMode.pasting;\r\n newItem.calendar = this;\r\n newItem.id = -newItem.id;\r\n newItem.classes = newItem.classes ? newItem.classes + ' pasting' : 'pasting';\r\n newItem.start = new Date(item.start.getTime() + add);\r\n // readonly will be updated, when calendar is reloaded with new id.\r\n newItem.readonly = true;\r\n // this should take care of the daylight savings time issue\r\n //newItem.start.setHours(item.start.getHours(), item.start.getMinutes(), item.start.getSeconds(), item.start.getMilliseconds());\r\n this.addItem(new this.itemClass(newItem));\r\n delete newItem.calendar;\r\n items.push(newItem);\r\n }\r\n }\r\n if (items.length) {\r\n let data = {\r\n type: AbstractCalendar.copyMode.toString(),\r\n date: this.startDate.format('yyyy-MM-dd'),\r\n calendar: this.name,\r\n items: items,\r\n copyType: this.copyType,\r\n copyData: copyData\r\n };\r\n new viggo.ajax({\r\n method: 'post',\r\n url: this.links.Copy,\r\n json: true,\r\n data: data\r\n });\r\n if (AbstractCalendar.copyMode == 'cut') {\r\n AbstractCalendar.copiedItems.clear();\r\n AbstractCalendar.copyMode = CopyMode.none;\r\n AbstractCalendar.copyDate = null;\r\n if (this.pasteButton) {\r\n this.pasteButton.remove();\r\n this.pasteButton = null;\r\n }\r\n }\r\n this.repaint();\r\n }\r\n }\r\n }\r\n protected paste(event: Event) {\r\n // the solution might be to look at the copyDate timezoneoffset and the startdate timezoneoffset, and then add the difference\r\n if ((!event || !((<Element>event.target).tagName in { INPUT: 1, TEXTAREA: 1 })) && AbstractCalendar.copyDate && AbstractCalendar.copyMode != CopyMode.none && this.allowPaste()) {\r\n let copyDate = new Date(AbstractCalendar.copyDate);\r\n let startDate = new Date(this.startDate);\r\n AbstractCalendar.copyDate.setHours(4, 0, 0, 0);\r\n startDate.setHours(4, 0, 0, 0);\r\n this.pasteToDates([startDate], this.copyData);\r\n AbstractCalendar.copyDate = copyDate;\r\n }\r\n }\r\n public clearSelection() {\r\n while (this.selectedItems.length) {\r\n let e = this.selectedItems.pop();\r\n if (e) {\r\n e.deselect();\r\n }\r\n }\r\n }\r\n protected clearCopy() {\r\n this.clearSelection();\r\n this.copyCut(CopyMode.none);\r\n AbstractCalendar.copiedItems.clear();\r\n AbstractCalendar.copyMode = CopyMode.none;\r\n }\r\n\r\n public toggleSelect(item: GenericItem) {\r\n if (!item.readonly) {\r\n var index = this.selectedItems.indexOf(item);\r\n if (index === -1) {\r\n this.selectedItems.push(item);\r\n this.selectedItems.sort(function (a, b) {\r\n return a.compare(b);\r\n });\r\n item.select();\r\n } else {\r\n item.deselect();\r\n this.selectedItems.splice(index, 1);\r\n }\r\n }\r\n }\r\n protected selectAll() {\r\n this.clearSelection();\r\n for (let item of this.visibleItems()) {\r\n this.toggleSelect(item);\r\n }\r\n }\r\n public sortItems() {\r\n this.items.sort(function (a, b) {\r\n return a.compare(b);\r\n });\r\n }\r\n public reload(data?: CalendarLoadData, complete?: () => void, pushState?: { url: string }) {\r\n if (!data) {\r\n data = Object.assign({}, this.loadData);\r\n data.date = this.originalDate.format('yyyy-MM-dd');\r\n data.startDate = this.startDate.format('yyyy-MM-dd');\r\n data.endDate = this.endDate.format('yyyy-MM-dd');\r\n }\r\n if (this.ajaxRequest) {\r\n this.ajaxRequest.abort();\r\n }\r\n if (this.links.GetItems) {\r\n this.cacheReload();\r\n this.ajaxRequest = new viggo.ajax({\r\n method: 'get',\r\n url: this.links.GetItems,\r\n data: data,\r\n convert: 'json',\r\n complete: (json) => {\r\n delete this.ajaxRequest;\r\n if (complete) {\r\n complete();\r\n }\r\n this.reset(this.originalDate);\r\n this.createItems(json);\r\n if (pushState) {\r\n viggo.history.pushState(pushState.url, viggo.history.getBestTitle() + \" - \" + this.originalDate.format('dd-MM-yyyy'), 'Calendar');\r\n }\r\n this.dispatchEvent('load');\r\n }\r\n });\r\n }\r\n return this.ajaxRequest;\r\n }\r\n protected cacheReload() {\r\n if (this.items.length) {\r\n this.items.forEach(item => item.removeAllElements());\r\n this.reset(this.originalDate);\r\n this.repaint();\r\n }\r\n }\r\n public addItem(item: GenericItem) {\r\n let result = this.dispatchEvent('additem', item);\r\n if (result) {\r\n let map = this.itemMap.get(item.type) || new Map<number, GenericItem>();\r\n if (item.id) {\r\n if (map.has(item.id)) {\r\n let oldItem = map.get(item.id);\r\n if (oldItem) {\r\n oldItem.remove(true);\r\n }\r\n }\r\n }\r\n let first = 0,\r\n last = this.items.length,\r\n middle;\r\n\r\n while (first != last) {\r\n middle = Math.floor((first + last) / 2);\r\n let value = item.compare(this.items[middle]);\r\n if (value < 0) {\r\n last = middle;\r\n } else {\r\n first = middle + 1;\r\n }\r\n }\r\n\r\n this.items.splice(first, 0, item);\r\n if (item.id) {\r\n map.set(item.id, item);\r\n } else {\r\n let old = map.get(0);\r\n if (old) {\r\n this.removeItem(old);\r\n }\r\n map.set(0, item);\r\n }\r\n }\r\n return result;\r\n }\r\n protected getItem(type: CalendarItemType, id: number) {\r\n let map = this.itemMap.get(type);\r\n return map ? map.get(id) : map;\r\n }\r\n public removeItem(item: GenericItem, repaintLater?: boolean) {\r\n var pos = this.items.indexOf(item);\r\n if (pos != -1) {\r\n let map = this.itemMap.get(item.type);\r\n if (map) {\r\n if (item.id) {\r\n map.delete(item.id);\r\n } else {\r\n map.delete(0);\r\n }\r\n }\r\n this.items.splice(pos, 1);\r\n item.remove();\r\n if (!repaintLater) {\r\n this.repaint();\r\n }\r\n }\r\n return pos != -1;\r\n }\r\n protected createItem(data: CalendarItemDTO) {\r\n data.calendar = this;\r\n var item = new this.itemClass(data);\r\n return this.addItem(item) ? item : null;\r\n }\r\n protected createItems(items: any[]) {\r\n let calendar = this;\r\n let start = this.startDate;\r\n let end = this.endDate;\r\n for (let i = this.items.length - 1; i >= 0; i--) {\r\n let item = this.items[i];\r\n if (item.isBetween(start, end)) {\r\n item.remove(true);\r\n }\r\n }\r\n // don't use arrow functions, as iOS 10.3 has shown issues with refering to itemClass\r\n items.forEach(function(e: any) {\r\n let item = new calendar.itemClass({\r\n calendar: calendar,\r\n id: e.id,\r\n group: e.selectedColumnIds ? e.selectedColumnIds[0] : e.calendarId,\r\n title: e.title || e.name,\r\n elementname: e.elementName,\r\n elementId: e.elementId,\r\n hint: e.hint,\r\n description: e.description,\r\n premises: e.premises,\r\n premisesConflict: e.premisesConflict,\r\n hintClass: e.hintClass,\r\n start: new Date(e.start||e.timeStart),\r\n length: e.minutes * 60 * 1000,\r\n type: typeof e.type == 'number' ? e.type : CalendarItemType[e.type.replace(/^[a-z]/, (x: string) => x.toUpperCase())],\r\n links: e.links,\r\n classes: e.classes,\r\n readonly: e.readOnly,\r\n elementType: e.elementType,\r\n copyType: calendar.copyType,\r\n backgroundColor: e.backgroundColor,\r\n borderColor: e.borderColor,\r\n color: e.color,\r\n columnIds: e.selectedColumnIds,\r\n selectedsubstitute: e.selectedSubstitute,\r\n initials: e.initials,\r\n data: e.data,\r\n contextmenu: e.contextMenu ? e.contextMenu : []\r\n });\r\n /*\r\n let startDst = item.start.dst(),\r\n endDst = item.end.dst();\r\n if (startDst != endDst) {\r\n item.length += (<any>startDst - <any>endDst) * 60 * 60 * 1000;\r\n }\r\n */\r\n calendar.addItem(item);\r\n });\r\n this.repaint();\r\n }\r\n public static getFirstCopiedDate() {\r\n return Array.from(AbstractCalendar.copiedItems.values()).reduce((date: Date, item: CalendarItemDTO) => {\r\n return date < item.start ? date : item.start;\r\n }, new Date(2200, 0, 1, 12, 0, 0, 0));\r\n }\r\n public abstract getDate(element: HTMLElement|null, event?: Event): Date | null;\r\n }\r\n\r\n interface WeekCalendarOptions extends CalendarOptions {\r\n element: HTMLTableElement;\r\n startDay: number;\r\n weekLength: number;\r\n }\r\n\r\n class WeekCalendarGroups {\r\n private groups: WeekCalendarGroup[];\r\n private end: Date;\r\n public constructor() {\r\n this.groups = [];\r\n this.end = new Date(1970, 0, 1);\r\n }\r\n public addItem(item: WeekCalendarItem) {\r\n if (item.start >= this.end) {\r\n this.close();\r\n }\r\n let foundIndex = -1;\r\n for (let index = 0; index < this.groups.length && foundIndex == -1; index++) {\r\n let group = this.groups[index];\r\n if (group.addItem(item)) {\r\n foundIndex = index;\r\n }\r\n }\r\n if (foundIndex == -1) {\r\n this.groups.push(new WeekCalendarGroup(item));\r\n this.groups.forEach(group => group.maxColumns = this.groups.length);\r\n }\r\n if (item.end > this.end) {\r\n this.end = item.end;\r\n }\r\n }\r\n public close() {\r\n for (let i = 0; i < this.groups.length; i++) {\r\n let group = this.groups[i];\r\n group.close(i);\r\n }\r\n this.groups = [];\r\n }\r\n }\r\n\r\n class WeekCalendarGroup {\r\n private items: WeekCalendarItem[];\r\n private start: Date;\r\n private end: Date;\r\n private max: number;\r\n public constructor(item: WeekCalendarItem) {\r\n this.items = [item];\r\n this.start = item.start;\r\n this.end = item.end;\r\n this.max = 1;\r\n }\r\n public get maxColumns() {\r\n return this.max;\r\n }\r\n public set maxColumns(value: number) {\r\n this.max = Math.max(value, this.max);\r\n }\r\n public addItem(item: WeekCalendarItem) {\r\n let result = this.end <= item.start;\r\n if (result) {\r\n this.items.push(item);\r\n this.end = item.end;\r\n }\r\n return result;\r\n }\r\n public close(index: number) {\r\n this.items.forEach(item => {\r\n item.indent = index;\r\n item.itemCount = this.maxColumns;\r\n item.update(FilterResult.show);\r\n });\r\n }\r\n }\r\n\r\n export class WeekCalendar extends AbstractCalendar<viggo.WeekCalendarItem> {\r\n public columns!: DayColumn[];\r\n public timeLine?: HTMLElement;\r\n private narrowItems: WeekCalendarItem[];\r\n private thead!: HTMLTableSectionElement;\r\n private tbody!: HTMLTableSectionElement;\r\n private tfoot!: HTMLTableSectionElement;\r\n private footerRows!: {[index: string]: HTMLTableRowElement | undefined};\r\n private headerRows!: {[index: string]: HTMLTableRowElement | undefined};\r\n private copyWeekButton: HTMLElement | null = null;\r\n public element!: HTMLTableElement;\r\n protected periodIncrement = 7;\r\n protected startDay: number;\r\n protected weekLength: number;\r\n protected itemClass: new (item: CalendarItemDTO) => viggo.WeekCalendarItem;\r\n private periodElements: HTMLElement[];\r\n\r\n constructor(options: WeekCalendarOptions) {\r\n super(options);\r\n this.narrowItems = [];\r\n this.periodElements = [];\r\n this.itemClass = viggo.WeekCalendarItem;\r\n this.startDay = options.startDay;\r\n this.weekLength = options.weekLength;\r\n this.setTable(this.element);\r\n let section = viggo.dom.parentFilter(options.element, (child) => {\r\n return viggo.getStyle(child, 'overflow-y') in {auto:1,scroll:1};\r\n }) || document.querySelector('main>section');\r\n if (section && section.contains(this.element)) {\r\n section.scrollTop = 360;\r\n }\r\n\r\n this.reset(this.originalDate);\r\n }\r\n protected clearCopy() {\r\n super.clearCopy();\r\n if (this.copyWeekButton) {\r\n this.copyWeekButton.remove();\r\n this.copyWeekButton = null;\r\n }\r\n }\r\n public resetPeriods() {\r\n for (let period of this.periodElements) {\r\n period.remove();\r\n }\r\n this.periodElements = [];\r\n super.resetPeriods();\r\n }\r\n protected createInvalidArea(from: Date, to: Date) {\r\n if (from < to && from < this.endDate && to > this.startDate) { // are we in range of the calendar\r\n let fromColumn = this.getColumn(from);\r\n let toColumn = this.getColumn(to);\r\n let start: number;\r\n let end: number;\r\n if (!fromColumn) {\r\n fromColumn = this.columns[0];\r\n start = 0;\r\n } else {\r\n start = this.getTimePosition(from);\r\n }\r\n while (fromColumn != toColumn) {\r\n fromColumn.container.appendChild(this.createInvalidItem(start, 1 - start));\r\n start = 0;\r\n fromColumn = this.columns[fromColumn.index + 1];\r\n }\r\n if (fromColumn) {\r\n end = this.getTimePosition(to);\r\n fromColumn.container.appendChild(this.createInvalidItem(start, end - start));\r\n }\r\n }\r\n }\r\n private createInvalidItem(top: number, height: number) {\r\n let element = viggo.dom.tag('div', {\r\n className: 'offperiod',\r\n style: {\r\n top: `${top * 24 * AbstractCalendar.hourHeight}px`,\r\n height: `${height * 24 * AbstractCalendar.hourHeight}px`\r\n }\r\n });\r\n this.periodElements.push(element);\r\n return element;\r\n }\r\n private getTimePosition(date: Date) {\r\n return (date.getHours() * 60 + date.getMinutes()) / (24 * 60);\r\n }\r\n protected initialize(options: WeekCalendarOptions) {\r\n super.initialize(options);\r\n this.footerRows = {};\r\n this.headerRows = {};\r\n }\r\n protected createColgroup() {\r\n let colgroup = viggo.dom.tag('colgroup');\r\n colgroup.appendChild(viggo.dom.tag('col', { className: 'time' }));\r\n let days = 'sun mon tues wednes thurs fri satur'.split(' ');\r\n for (let i = 0; i < this.weekLength; i++) {\r\n let index = (this.startDay + i) % 7;\r\n colgroup.appendChild(viggo.dom.tag('col', {className: `day ${days[index]}day`}));\r\n }\r\n return colgroup;\r\n }\r\n protected createThead() {\r\n let thead = viggo.dom.tag('thead');\r\n let tr = thead.appendChild(viggo.dom.tag('tr'));\r\n tr.appendChild(viggo.dom.tag('th', { title: __('Week') }));\r\n for (let i = 0; i < this.weekLength; i++) {\r\n tr.appendChild(viggo.dom.tag('th'));\r\n }\r\n return thead;\r\n }\r\n protected createTbody() {\r\n let tbody = viggo.dom.tag('tbody');\r\n let tr = tbody.appendChild(viggo.dom.tag('tr'));\r\n let th = tr.appendChild(viggo.dom.tag('th'));\r\n let d = { className: 'd' };\r\n for (let i = 0; i < 24; i++) {\r\n th.appendChild(viggo.dom.tag('div',\r\n i < 8 || i > 16 ? d : null, // set the className to d, if out of day hours\r\n i < 10 ? '0' + i : i, // hours\r\n viggo.dom.tag('small', null, '00'), // minutes\r\n viggo.dom.tag('i') // tag for dotted line\r\n ));\r\n }\r\n let node = viggo.dom.tag('td', null, viggo.dom.tag('div', { className: 'container' }));\r\n for (let i = 0; i < this.weekLength; i++) {\r\n tr.appendChild(node.cloneNode(true));\r\n }\r\n return tbody;\r\n }\r\n protected createTfoot() {\r\n return viggo.dom.tag('tfoot');\r\n }\r\n\r\n private getTop(ev: MouseEvent) {\r\n let y = this.tbody.getBoundingClientRect().top;\r\n return ev.clientY - y;\r\n }\r\n\r\n private getTime(y: number, column: number) {\r\n let t = Math.round(((y / AbstractCalendar.hourHeight * 60 * 60 * 1000) + AbstractCalendar.calendarStart.getTime()) / WeekCalendar.timeDetail) * WeekCalendar.timeDetail;\r\n let time = new Date(this.columns[column].date.getTime());\r\n time.setMilliseconds(t);\r\n return time;\r\n }\r\n\r\n protected setTable(table: HTMLTableElement) {\r\n this.element = table;\r\n viggo.dom.empty(table);\r\n (<any>this.element).viggoCalendar = this;\r\n table.appendChild(this.createColgroup());\r\n this.thead = table.appendChild(this.createThead());\r\n this.tbody = table.appendChild(this.createTbody());\r\n this.tfoot = table.appendChild(this.createTfoot());\r\n\r\n this.tbody.addEventListener('mousemove', (event: MouseEvent) => {\r\n let target = viggo.dom.parent(<Element>event.target, 'div'),\r\n item = target ? target.viggoItem : null;\r\n\r\n if (target && item && !item.readonly && target == item.elements[item.elements.length - 1]) {\r\n if (event.clientY - viggo.dom.getPos(target, true).top - target.offsetHeight >= -10) {\r\n target.style.cursor = 's-resize';\r\n } else {\r\n target.style.cursor = '';\r\n }\r\n }\r\n }, false);\r\n\r\n this.tbody.addEventListener('contextmenu', (event: Event) => {\r\n var cell = <HTMLTableDataCellElement>viggo.dom.parent(<Element>event.target, 'td');\r\n\r\n if (cell && AbstractCalendar.copiedItems.size && this.links.Copy) {\r\n let time = this.getTime(this.getTop(<MouseEvent>event), cell.cellIndex - 1);\r\n var date = new Date(time);\r\n date.setHours(0, 0, 0, 0);\r\n var offset = (time.getTime() - date.getTime()) / (24 * 60 * 60 * 1000) * cell.offsetHeight;\r\n let pasteLine = cell.firstChild!.appendChild(viggo.dom.tag('span', {\r\n className: 'current-paste-line',\r\n style: {\r\n top: offset + 'px'\r\n }\r\n }));\r\n let removePasteLine = () => {\r\n pasteLine.remove();\r\n document.removeEventListener('click', removePasteLine, true);\r\n document.removeEventListener('mousedown', removePasteLine, true);\r\n document.removeEventListener('contextmenu', removePasteLine, true);\r\n };\r\n document.addEventListener('mousedown', removePasteLine, true);\r\n document.addEventListener('click', removePasteLine, true);\r\n document.addEventListener('contextmenu', removePasteLine, true);\r\n\r\n if (this.allowPaste()) {\r\n viggo.contextmenu.addItem({\r\n title: __('Paste'),\r\n className: 'calendar-paste',\r\n icon: 'o-flaticon-paste',\r\n click: () => {\r\n if (AbstractCalendar.copiedItems.size) {\r\n let firstDate = AbstractCalendar.getFirstCopiedDate();\r\n let copyDate = AbstractCalendar.copyDate;\r\n AbstractCalendar.copyDate = firstDate;\r\n var date = this.getTime(this.getTop(<MouseEvent>event), cell.cellIndex - 1);\r\n this.pasteToDates([date], this.copyData);\r\n AbstractCalendar.copyDate = copyDate;\r\n }\r\n }\r\n });\r\n viggo.contextmenu.addItem({\r\n title: __('Paste with time'),\r\n className: 'calendar-paste-time',\r\n icon: 'o-flaticon-paste',\r\n click: () => {\r\n if (AbstractCalendar.copiedItems.size) {\r\n let firstDate = AbstractCalendar.getFirstCopiedDate();\r\n let copyDate = AbstractCalendar.copyDate;\r\n AbstractCalendar.copyDate = firstDate;\r\n let date = this.getTime((firstDate.getHours() + firstDate.getMinutes() / 60) * AbstractCalendar.hourHeight, cell.cellIndex - 1);\r\n this.pasteToDates([date], this.copyData);\r\n AbstractCalendar.copyDate = copyDate;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }, false);\r\n\r\n this.tbody.addEventListener('mousedown', (event: MouseEvent) => {\r\n if (event.button != 0 || !this.links.Add.length) {\r\n return;\r\n }\r\n\r\n let target = <HTMLDivElement|null>event.target;\r\n let item: WeekCalendarItem|null = null;\r\n while (target) {\r\n if (target.viggoItem) {\r\n item = <WeekCalendarItem>target.viggoItem;\r\n break;\r\n }\r\n target = <HTMLDivElement|null>target.parentNode;\r\n }\r\n let mousedownCell = <HTMLTableDataCellElement|null>viggo.dom.parent(<Element>event.target, 'td');\r\n if (!mousedownCell) { // mousedown on scrollbar, or somewhere that aren't a TD.\r\n return;\r\n }\r\n let mousedownTime = this.getTime(this.getTop(event), mousedownCell.cellIndex - 1);\r\n\r\n let move: (ev: MouseEvent) => void, moved = false;\r\n viggo.hint.block();\r\n\r\n if (!item) {\r\n item = new WeekCalendarItem({\r\n calendar: this,\r\n group: '',\r\n start: mousedownTime,\r\n length: AbstractCalendar.defaultTime,\r\n title: \"\",\r\n elementname: \"\",\r\n elementId: 0,\r\n id: 0,\r\n copyType: COPY_TYPE_INVALID,\r\n readonly: false,\r\n type: CalendarItemType.Calendar,\r\n temporaryMode: viggo.CalendarItemTemporaryMode.creating,\r\n });\r\n if (item) {\r\n if (!this.addItem(item)) {\r\n item = null;\r\n }\r\n }\r\n this.repaint();\r\n this.tbody.addEventListener('mousemove', move = (ev: MouseEvent) => {\r\n ev.stopPropagation();\r\n moved = true;\r\n let td = viggo.dom.parent(<Element>ev.target, 'td');\r\n if (td) {\r\n let time = this.getTime(this.getTop(ev), td.cellIndex - 1);\r\n let from = mousedownTime;\r\n let to = time;\r\n if (from > to) {\r\n from = to;\r\n to = mousedownTime;\r\n }\r\n if (item) {\r\n item.setStart(from);\r\n item.setLength(Math.max(to.getTime() - from.getTime(), AbstractCalendar.defaultTime));\r\n item.update(this.filter(item));\r\n }\r\n }\r\n }, false);\r\n } else if (!(event.ctrlKey || event.shiftKey || event.metaKey || event.altKey)) {\r\n let dif = 0;\r\n if (target && target.style.cursor) {\r\n dif = item.start.getTime() + item.length - mousedownTime.getTime();\r\n this.tbody.addEventListener('mousemove', move = (ev: MouseEvent) => {\r\n ev.stopPropagation();\r\n let td = <HTMLTableDataCellElement>viggo.dom.parent(<Element>ev.target, 'td');\r\n if (td) {\r\n let time = this.getTime(this.getTop(ev), td.cellIndex - 1);\r\n let add = mousedownTime.getTime() - time.getTime();\r\n if (item) {\r\n item.setLength(mousedownTime.getTime() - item.start.getTime() + dif - add);\r\n item.update(this.filter(item));\r\n }\r\n moved = moved || ev.clientX != event.clientX || ev.clientY != event.clientY;\r\n }\r\n }, false);\r\n } else if (target) {\r\n dif = item.start.getTime() - mousedownTime.getTime();\r\n this.tbody.addEventListener('mousemove', move = (ev: MouseEvent) => {\r\n ev.stopPropagation();\r\n var td = <HTMLTableDataCellElement>viggo.dom.parent(<Element>ev.target, 'td');\r\n if (td) {\r\n let time = this.getTime(this.getTop(ev), td.cellIndex - 1);\r\n let add = mousedownTime.getTime() - time.getTime();\r\n time = mousedownTime;\r\n time.setTime(time.getTime() + dif - add);\r\n if (item) {\r\n item.setStart(time);\r\n item.update(this.filter(item));\r\n }\r\n moved = moved || ev.clientX != event.clientX || ev.clientY != event.clientY;\r\n }\r\n }, false);\r\n }\r\n } else {\r\n return;\r\n }\r\n\r\n /*\r\n let scrollToCursor = (ev: MouseEvent) => {\r\n let top = this.table.getBoundingClientRect().top;\r\n var y = window.pageYOffset + ev.clientY + viggo.getScrollTop(this.tbody.parentNode);\r\n if (y < top) {\r\n cal.tbody.scrollTop -= 10;\r\n } else if (y > parentTop + cal.tbody.offsetHeight) {\r\n cal.tbody.scrollTop += 10;\r\n }\r\n window.getSelection().removeAllRanges();\r\n };\r\n */\r\n\r\n let mouseup = () => {\r\n this.tbody.removeEventListener('mousemove', move, false);\r\n document.removeEventListener('mouseup', mouseup, false);\r\n viggo.hint.unblock();\r\n //document.removeEventListener('mousemove', scrollToCursor, true);\r\n if (moved) {\r\n this.sortItems();\r\n this.repaint();\r\n if (item) {\r\n item.save();\r\n }\r\n } else if (item && !item.id) {\r\n item.remove();\r\n }\r\n };\r\n document.addEventListener('mouseup', mouseup, false);\r\n //document.addEventListener('mousemove', scrollToCursor, true);\r\n }, false);\r\n }\r\n public get name() {\r\n return 'Week';\r\n }\r\n protected repositionStartDate(startDate: Date) {\r\n let date = new Date(startDate);\r\n date.setDate(date.getDate() - ((date.getDay() + (7 - this.startDay)) % 7));\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n }\r\n\r\n public get endDate() {\r\n let end = new Date(this.startDate);\r\n end.setDate(end.getDate() + this.weekLength);\r\n return end;\r\n }\r\n\r\n public copy(event: Event) {\r\n let result = super.copy(event);\r\n if (result && this.columns.length >= 5 && AbstractCalendar.copiedItems.size && this.hasTemplates('CopyToPeriodButton', 'CopyToPeriodModal', 'CopyToPeriodItem')) {\r\n // only show the \"copy to weeks\"-action if it's a weeks-calendar.\r\n if (this.copyWeekButton) {\r\n this.copyWeekButton.remove();\r\n }\r\n let fragment = this.createView('CopyToPeriodButton', null)!;\r\n this.copyWeekButton = <HTMLElement>fragment.firstElementChild;\r\n let link = this.copyWeekButton.querySelector('a');\r\n if (!link) {\r\n throw new Error(\"Need link in view CopyToPeriodButton\");\r\n }\r\n let parent = document.querySelector('#events-details .toolbar .button-group');\r\n if (!parent) {\r\n throw new Error(\"Unable to find parent for copy to multiple weeks.\");\r\n }\r\n parent.insertBefore(this.copyWeekButton, parent.firstChild);\r\n link.addEventListener('click', (ev: MouseEvent) => {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n let modal = this.createView('CopyToPeriodModal', null)!;\r\n let list = <HTMLElement>modal.querySelector('.items');\r\n if (!list) {\r\n throw new Error(\"Missing element .items in view CopyToPeriodModal\");\r\n }\r\n let button = <HTMLButtonElement>modal.querySelector('button');\r\n if (!button) {\r\n throw new Error(\"Missing button in view CopyToPeriodModal\");\r\n }\r\n button.style.display = 'none';\r\n let savedDates: Date[] = [];\r\n button.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.pasteToDates(savedDates, this.copyData);\r\n viggo.modal.close();\r\n }, false);\r\n let placeholder = <HTMLElement|undefined>modal.querySelector('.calendar-placeholder');\r\n new viggo.modal({ element: modal });\r\n viggo.createCalendar({\r\n type: 'week',\r\n input: placeholder,\r\n date: new Date(this.startDate),\r\n multiselect: true,\r\n callback: (dates: Date | Date[]) => {\r\n viggo.dom.empty(list);\r\n let last = null;\r\n let start: number[] | null = null;\r\n if (!(dates instanceof Array)) {\r\n dates = [dates];\r\n }\r\n savedDates = dates;\r\n for (var i = 0; i < dates.length; i++) {\r\n let d = dates[i].getWeekOfYear();\r\n if (!start) {\r\n start = d;\r\n }\r\n if (last) {\r\n if (d[1] - 1 != last[1] || d[0] != last[0]) {\r\n let item = this.createView('CopyToPeriodItem', { week: start == last ? start[1] : start[1] + '-' + last[1], year: start[0] });\r\n if (item) {\r\n list.appendChild(item);\r\n }\r\n start = d;\r\n }\r\n }\r\n last = d;\r\n }\r\n if (last) {\r\n let item = this.createView('CopyToPeriodItem', { week: start == last ? start[1] : start![1] + '-' + last[1], year: start![0] });\r\n if (item) {\r\n list.appendChild(item);\r\n }\r\n button.style.display = '';\r\n } else {\r\n button.style.display = 'none';\r\n }\r\n }\r\n });\r\n }, false);\r\n }\r\n return result;\r\n }\r\n\r\n public reset(startDate: Date) {\r\n super.reset(startDate);\r\n this.columns = [];\r\n this.loadColumns(true);\r\n this.narrowItems = [];\r\n this.resetPeriods();\r\n }\r\n\r\n public overlapsNarrowItemOnDay(date: Date) {\r\n date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0, 0);\r\n let overlapping = false;\r\n for (let i = 0; i < this.narrowItems.length && !overlapping; i++) {\r\n overlapping = this.narrowItems[i].overlapsOnDay(date);\r\n }\r\n return overlapping;\r\n }\r\n\r\n //overlapFunctionName: 'overlaps',\r\n public repaint() {\r\n this.resetPeriods();\r\n let items = new WeekCalendarGroups(), narrowItems = new WeekCalendarGroups();\r\n this.items.forEach(item => item.alsoBookedBy = []);\r\n this.narrowItems = [];\r\n this.items.forEach((item, index) => {\r\n let type = (item.typeString||'calendar').toLowerCase();\r\n if (type in viggo.informationTypes && viggo.informationTypes[type] != 1) {\r\n item.itemCount = 1;\r\n item.update(this.filter(item));\r\n } else {\r\n item.itemCount = 1;\r\n if (viggo.informationTypes[type] == 1) {\r\n this.narrowItems.push(item);\r\n narrowItems.addItem(item);\r\n } else {\r\n items.addItem(item);\r\n }\r\n for (let i = index + 1; i < this.items.length; i++) {\r\n item.checkDoubleBooking(this.items[i]);\r\n }\r\n }\r\n });\r\n\r\n items.close();\r\n narrowItems.close();\r\n this.columns.forEach(column => {\r\n let elm = <HTMLDivElement>column.cell.firstChild;\r\n let min = AbstractCalendar.hourHeight * 24,\r\n max = 0;\r\n for (let i = 0; i < elm.childNodes.length; i++) {\r\n let item = elm.childNodes[i];\r\n if (item.nodeType == 1) {\r\n if ((<HTMLElement>item).classList.contains('calendar-item')) {\r\n let top = parseFloat((<HTMLElement>item).style.getPropertyValue('--top'));\r\n let height = parseFloat((<HTMLElement>item).style.getPropertyValue('--height'));\r\n if (!isNaN(top) && !isNaN(height)) {\r\n min = Math.min(min, top + height);\r\n max = Math.max(max, top);\r\n }\r\n }\r\n }\r\n }\r\n elm.style.setProperty('--min', min+'');\r\n elm.style.setProperty('--max', max+'');\r\n });\r\n this.showCurrentTimeLine();\r\n }\r\n protected timelineTimeout = 0;\r\n protected showCurrentTimeLine() {\r\n clearTimeout(this.timelineTimeout);\r\n if (this.timeLine) {\r\n this.timeLine.remove();\r\n delete this.timeLine;\r\n }\r\n if (document.body.contains(this.element)) {\r\n var date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n var column = this.getColumn(date);\r\n if (column) {\r\n var offset = (Date.now() - date.getTime()) / (24 * 60 * 60 * 1000) * column.cell.offsetHeight;\r\n let container = column.cell.firstChild;\r\n if (container) {\r\n this.timeLine = container.appendChild(\r\n viggo.dom.tag('span', {\r\n className: 'current-time-line',\r\n style: {\r\n top: offset + 'px'\r\n }\r\n })\r\n );\r\n this.timelineTimeout = window.setTimeout(() => this.showCurrentTimeLine(), 10000);\r\n }\r\n }\r\n }\r\n }\r\n public getColumn(date: Date): DayColumn|null {\r\n for (var i = 0; i < this.columns.length; i++) {\r\n var v = this.columns[i].compare(date);\r\n if (v == 0) {\r\n return this.columns[i];\r\n } else if (v > 0) {\r\n return null;\r\n }\r\n }\r\n return null;\r\n }\r\n protected loadColumns(createHeaders?: boolean) {\r\n let columns = [];\r\n let cells = this.thead.getElementsByTagName('tr')[0].cells;\r\n let tr = this.tbody.getElementsByTagName('tr')[0];\r\n let date = new Date(this.startDate);\r\n viggo.dom.empty(cells[0]);\r\n let template = this.createView('WeekNumber', {date: date});\r\n if (template) {\r\n cells[0].appendChild(template);\r\n }\r\n for (let i = 1; i < cells.length; i++) {\r\n columns.push(new DayColumn(tr.cells[i], new Date(date), i-1));\r\n if (createHeaders) {\r\n let cell = cells[i];\r\n viggo.dom.empty(cell);\r\n cell.classList.remove('dst', 'today');\r\n template = this.createView('Header', {date: date});\r\n if (template) {\r\n cell.appendChild(template);\r\n }\r\n if (date.isDstSwitchDay()) {\r\n cell.classList.add('dst');\r\n }\r\n if (date.isToday()) {\r\n cell.classList.add('today');\r\n }\r\n }\r\n date.setDate(date.getDate() + 1);\r\n }\r\n this.columns = columns;\r\n }\r\n protected createHeadFootRow(type: string) {\r\n var row = viggo.dom.tag('tr', {\r\n className: 'calendar-' + type\r\n });\r\n for (var i = 0; i <= this.columns.length; i++) {\r\n if (!i) {\r\n row.appendChild(viggo.dom.tag('th', null, this.createView('FooterLabel', {type: type})));\r\n } else {\r\n row.appendChild(viggo.dom.tag('td', null, viggo.dom.tag('div', { className: 'container' })));\r\n }\r\n }\r\n return row;\r\n }\r\n public getHeaderRow(type: string) {\r\n var row = this.headerRows[type];\r\n if (!row) {\r\n row = this.thead.appendChild(this.createHeadFootRow(type));\r\n this.headerRows[type] = row;\r\n }\r\n return row;\r\n }\r\n public getFooterRow(type: string) {\r\n let row = this.footerRows[type];\r\n if (!row) {\r\n row = this.createHeadFootRow(type);\r\n if (type == CalendarItemType[CalendarItemType.Birthday].toLowerCase()) {\r\n this.tfoot.appendChild(row);\r\n } else {\r\n this.tfoot.insertBefore(row, this.tfoot.firstChild);\r\n }\r\n this.footerRows[type] = row;\r\n }\r\n return row;\r\n }\r\n public getDate(element: HTMLElement|null, event?: MouseEvent) {\r\n if (element) {\r\n element = element.closest('td');\r\n if (element && this.element.contains(element)) {\r\n let date: Date;\r\n if (event) {\r\n date = this.getTime(this.getTop(event), (<HTMLTableDataCellElement>element).cellIndex - 1);\r\n } else {\r\n date = new Date(this.startDate);\r\n date.setDate(date.getDate() + (<HTMLTableDataCellElement>element).cellIndex - 1);\r\n }\r\n return date;\r\n }\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n export class WorkWeekCalendar extends WeekCalendar {\r\n public get name() {\r\n return 'WorkWeek';\r\n }\r\n }\r\n\r\n export class DayCalendar extends WeekCalendar {\r\n protected periodIncrement = 1;\r\n public get name() {\r\n return 'Day';\r\n }\r\n protected repositionStartDate(startDate: Date) {\r\n let date = new Date(startDate);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n }\r\n }\r\n\r\n interface CustomHeaderCalendarOptions extends CalendarOptions {\r\n days?: number;\r\n columnWidth?: number;\r\n orderHeaders?: boolean;\r\n headers: any[];\r\n element: HTMLTableElement;\r\n }\r\n\r\n export class CustomHeaderCalendar extends AbstractCalendar<viggo.CustomHeaderCalendarItem> {\r\n public element!: HTMLTableElement;\r\n public columns!: Map<number, Map<number, HTMLDivElement>>;\r\n public days!: number;\r\n public columnWidth!: number;\r\n protected orderHeaders!: boolean;\r\n protected thead!: HTMLTableSectionElement;\r\n protected tbody!: HTMLTableSectionElement[];\r\n protected itemClass: new (item: CalendarItemDTO) => viggo.CustomHeaderCalendarItem;\r\n public name = 'CustomHeader';\r\n\r\n constructor(options: CustomHeaderCalendarOptions) {\r\n super(options);\r\n this.itemClass = viggo.CustomHeaderCalendarItem;\r\n }\r\n\r\n protected initialize(options: CustomHeaderCalendarOptions) {\r\n super.initialize(options);\r\n this.days = options.days || 1;\r\n this.periodIncrement = this.days == 5 && this.startDate.getDay() == 1 ? 7 : this.days;\r\n this.orderHeaders = options.orderHeaders || false;\r\n\r\n let me = this;\r\n let scroll = function (this: HTMLTableSectionElement, event: MouseEvent) {\r\n let left = this.scrollLeft;\r\n for (let i = 0; i < me.tbody.length; i++) {\r\n let e = me.tbody[i].scrollLeft = left;\r\n }\r\n me.thead.scrollLeft = left;\r\n }\r\n\r\n viggo.dom.empty(this.element);\r\n this.element.addEventListener('contextmenu', (event: MouseEvent) => {\r\n let td = (<HTMLElement>event.target).closest('td');\r\n if (td && this.allowPaste()) {\r\n let date = this.getDate(td);\r\n let headerId = parseInt(td.dataset.headerId||'0');\r\n if (date && headerId) {\r\n viggo.contextmenu.addItem({\r\n title: __('Paste'),\r\n click: () => {\r\n let oldDate = AbstractCalendar.copyDate;\r\n let firstDate = AbstractCalendar.getFirstCopiedDate();\r\n AbstractCalendar.copyDate = firstDate;\r\n date!.setHours(firstDate.getHours(), firstDate.getMinutes(), 0, 0);\r\n this.pasteToDates([date!], [headerId]); // we don't use copyData here, because the header is the data.\r\n AbstractCalendar.copyDate = oldDate;\r\n }\r\n });\r\n }\r\n }\r\n }, false);\r\n let colgroup = viggo.dom.tag('colgroup');\r\n this.element.appendChild(colgroup);\r\n this.thead = this.element.appendChild(viggo.dom.tag('thead', { onscroll: scroll }));\r\n let tr = viggo.dom.tag('tr');\r\n this.thead.appendChild(tr);\r\n this.columns = new Map();\r\n let th = viggo.dom.tag('th', null, viggo.dom.tag('div', { className: 'container' }));\r\n tr.appendChild(th);\r\n colgroup.appendChild(viggo.dom.tag('col', { className: 'time' }));\r\n let createHeader = async (data: any) => {\r\n let map = new Map();\r\n colgroup.appendChild(viggo.dom.tag('col'));\r\n this.columns.set(data.id, map);\r\n tr.appendChild(viggo.dom.tag('th', { dataset: { headerId: data.id } }, this.createView('Header', data)));\r\n };\r\n let orderedHeaders = Array.from(options.headers);\r\n orderedHeaders.forEach(x => x.calendar = this);\r\n if (this.orderHeaders) {\r\n let orderBy = function (a: any, b: any) {\r\n return a.orderBy < b.orderBy ? -1 : (a.orderBy > b.orderBy ? 1 : 0);\r\n };\r\n orderedHeaders.sort(orderBy);\r\n }\r\n for (let i = 0; i < orderedHeaders.length; i++) {\r\n createHeader(orderedHeaders[i]);\r\n }\r\n this.tbody = [];\r\n this.columnWidth = Math.max((this.element.clientWidth - th.offsetWidth) / this.columns.size, 5);\r\n let createDay = (tr: HTMLTableRowElement, day: number) => {\r\n let d = this.repositionStartDate(options.startDate);\r\n d.setDate(d.getDate() + day);\r\n tr.appendChild(viggo.dom.tag('th', null, this.createView('SideHeader', { date: d })));\r\n };\r\n for (let i = 0; i < this.days; i++) {\r\n let tbody = this.element.appendChild(viggo.dom.tag('tbody', { onscroll: scroll }));\r\n this.tbody.push(tbody);\r\n let tr = tbody.appendChild(viggo.dom.tag('tr'));\r\n createDay(tr, i);\r\n for (let j = 0; j < orderedHeaders.length; j++) {\r\n let map = this.columns.get(orderedHeaders[j].id);\r\n if (map) {\r\n let td = tr.appendChild(viggo.dom.tag('td', { dataset: Object.assign(orderedHeaders[j].data || {}, { headerId: orderedHeaders[j].id }) }));\r\n let view = this.createView('Container', orderedHeaders[j]);\r\n if (view) {\r\n let container = <HTMLDivElement>view.firstChild;\r\n td.appendChild(container);\r\n map.set(i, container);\r\n }\r\n }\r\n }\r\n }\r\n\r\n let section = document.querySelector('main>section');\r\n if (section && section.contains(this.element)) {\r\n section.scrollTop = 360;\r\n }\r\n /*\r\n * // is this nessacery?\r\n for (let i = 1; i < tr.childNodes.length; i++) {\r\n tr.childNodes[i].firstChild.style.width = this.columnWidth + 'px';\r\n }\r\n */\r\n }\r\n\r\n protected createInvalidArea(from: Date, to: Date) {\r\n // Method not implemented\r\n }\r\n\r\n public get endDate() {\r\n let result = new Date(this.startDate);\r\n result.setDate(result.getDate() + this.days);\r\n return result;\r\n }\r\n\r\n public getDate(td: HTMLTableDataCellElement, event?: MouseEvent) {\r\n let tbody = <Element | null>td.closest('tbody');\r\n let date: Date | null = new Date(this.startDate);\r\n if (tbody) {\r\n do {\r\n tbody = tbody.previousElementSibling;\r\n date.setDate(date.getDate() + 1);\r\n } while (tbody && tbody.tagName == 'TBODY');\r\n date.setDate(date.getDate() - 1);\r\n } else {\r\n date = null;\r\n }\r\n return date;\r\n }\r\n\r\n protected repositionStartDate(date: Date) {\r\n date = new Date(date);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n }\r\n\r\n private repaintSideHeader() {\r\n let date = new Date(this.startDate);\r\n for (let tbody of this.tbody) {\r\n let th = tbody.rows[0].cells[0];\r\n viggo.dom.empty(th);\r\n th.appendChild(this.createView('SideHeader', { date: date })!);\r\n date.setDate(date.getDate() + 1);\r\n }\r\n }\r\n\r\n public repaint() {\r\n this.repaintSideHeader();\r\n let map: Map<number, CustomHeaderCalendarItem[]> = new Map();\r\n this.items.forEach(item => {\r\n let type = (item.typeString || 'calendar').toLowerCase();\r\n if (type in viggo.informationTypes && viggo.informationTypes[type] != 1) {\r\n item.itemCount = 1;\r\n item.update(this.filter(item));\r\n } else {\r\n item.itemCount = 1;\r\n if (item.columnIds) {\r\n item.columnIds.filter(x => this.columns.has(x)).forEach(columnId => {\r\n let items = map.get(columnId);\r\n if (!items) {\r\n items = [];\r\n map.set(columnId, items);\r\n }\r\n while (items.length && !item.overlaps(items[items.length - 1])) {\r\n let i = items.pop();\r\n if (i) {\r\n i.update(this.filter(item));\r\n }\r\n }\r\n item.indent = items.length;\r\n items.push(item);\r\n items.forEach(x => x.itemCount = Math.max(items!.length, x.itemCount));\r\n });\r\n }\r\n }\r\n });\r\n map.forEach(items => {\r\n while (items.length) {\r\n let item = items.pop();\r\n if (item) {\r\n item.update(this.filter(item));\r\n }\r\n }\r\n });\r\n\r\n /*\r\n let previousParent = null;\r\n let samePlaceElements: HTMLDivElement[] = [];\r\n let lastElement = null;\r\n let minTop = -1, maxTop = -1;\r\n let repos = function () {\r\n let length = samePlaceElements.length;\r\n if (length > 1) {\r\n while (samePlaceElements.length) {\r\n let elm = <HTMLDivElement>samePlaceElements.pop();\r\n let width = parseFloat(<string>elm.style.width) / length;\r\n elm.style.width = width + 'px';\r\n elm.style.left = width * samePlaceElements.length + 'px';\r\n }\r\n } else {\r\n samePlaceElements = [];\r\n }\r\n };\r\n for (let i = 0; i < elements.length; i++) {\r\n let element = elements[i],\r\n parent = element.parentNode,\r\n item = (<HTMLDivElement>element).viggoItem;\r\n if (previousParent != parent && item) {\r\n previousParent = parent;\r\n repos();\r\n samePlaceElements.push(element);\r\n minTop = item.start.getHours() * 60 * 60 * 1000 + item.start.getMinutes() * 60 * 1000 + item.start.getSeconds() * 1000 + item.start.getMilliseconds();\r\n maxTop = item.length + minTop;\r\n } else if (item) {\r\n var top = item.start.getHours() * 60 * 60 * 1000 + item.start.getMinutes() * 60 * 1000 + item.start.getSeconds() * 1000 + item.start.getMilliseconds();\r\n if (top < maxTop && top >= minTop) {\r\n samePlaceElements.push(element);\r\n minTop = Math.min(minTop, top);\r\n maxTop = Math.max(top + item.length, maxTop);\r\n } else {\r\n repos();\r\n samePlaceElements.push(element);\r\n minTop = top;\r\n maxTop = top + item.length;\r\n }\r\n }\r\n lastElement = element;\r\n }\r\n repos();\r\n */\r\n }\r\n }\r\n\r\n interface AbstractCustomRowCalendarOptions extends CalendarOptions {\r\n days: number;\r\n sections: CustomRowSection[];\r\n }\r\n\r\n interface CustomRowDayCalendarOptions extends AbstractCustomRowCalendarOptions {\r\n }\r\n\r\n interface CustomRowHeaderItem {\r\n Id: number;\r\n Title: string;\r\n }\r\n\r\n export interface CustomRowSection {\r\n Id: string;\r\n Title: string;\r\n Headers: { [id: string]: CustomRowHeaderItem };\r\n }\r\n\r\n export abstract class AbstractCustomRowCalendar<GenericItem extends CalendarItem, GenericSection extends CustomRowSection> extends AbstractCalendar<GenericItem> {\r\n protected _days!: number;\r\n private dayWidth = 0;\r\n protected groupMap: Map<string, HTMLTableRowElement>;\r\n protected sections: GenericSection[];\r\n // tableHeader is used for measuring the width of one day\r\n protected tableHeader!: HTMLTableHeaderCellElement;\r\n public constructor(options: AbstractCustomRowCalendarOptions) {\r\n super(options);\r\n this.sections = <GenericSection[]>options.sections;\r\n this.groupMap = new Map<string, HTMLTableRowElement>();\r\n this.element.classList.add('events-row-header');\r\n this._days = options.days || 7;\r\n let resize = (event: UIEvent) => {\r\n if (document.body.contains(this.element)) {\r\n this.repaint();\r\n } else {\r\n window.removeEventListener('resize', resize, false);\r\n }\r\n };\r\n let popstate = () => {\r\n if (!document.body.contains(this.element)) {\r\n window.removeEventListener('resize', resize, false);\r\n window.removeEventListener('popstate', popstate, false);\r\n }\r\n };\r\n window.addEventListener('resize', resize, false);\r\n window.addEventListener('popstate', popstate, false);\r\n this.element.addEventListener('wheel', this.scroll.bind(this), false);\r\n }\r\n\r\n public get days() {\r\n return this._days;\r\n }\r\n\r\n public getDayWidth() {\r\n if (!this.dayWidth) {\r\n this.dayWidth = this.tableHeader.getBoundingClientRect().width;\r\n }\r\n return this.dayWidth;\r\n }\r\n\r\n protected getUnixDay(date: Date) {\r\n date = new Date(date);\r\n date.setHours(0, 0, 0, 0);\r\n return Math.floor(date.getTime() / (1000 * 60 * 60 * 24));\r\n }\r\n\r\n protected getGroupId(element: HTMLElement) {\r\n let group = '';\r\n let container = <HTMLElement | null>element.closest('tr[data-header-id]');\r\n if (container) {\r\n group = container.dataset.headerId || '';\r\n }\r\n return group;\r\n }\r\n\r\n protected createTable() {\r\n viggo.dom.empty(this.element);\r\n this.createTableHead();\r\n this.createTableBodySections();\r\n this.createTableFoot();\r\n }\r\n\r\n protected createTableBodySections() {\r\n let collapsed = this.getJsonSetting('collapsedSections');\r\n if (!collapsed) {\r\n collapsed = {};\r\n }\r\n for (let section of this.sections) {\r\n let tbody = this.createTableBody(section);\r\n if (collapsed[section.Id]) {\r\n tbody.classList.add('collapsed');\r\n }\r\n this.element.appendChild(tbody);\r\n }\r\n }\r\n\r\n protected toggleSection(id: string, tbody: HTMLTableSectionElement) {\r\n let isCollapsed = tbody.classList.toggle('collapsed');\r\n let json = this.getJsonSetting(\"collapsedSections\");\r\n if (!json) {\r\n json = {};\r\n }\r\n if (isCollapsed) {\r\n json[id] = 1;\r\n } else {\r\n delete json[id];\r\n }\r\n this.setJsonSetting('collapsedSections', json);\r\n }\r\n\r\n protected createTableBody(section: GenericSection) {\r\n let tbody = viggo.dom.tag('tbody');\r\n let tr = viggo.dom.tag('tr');\r\n tbody.appendChild(tr);\r\n tr.appendChild(this.createSectionHeader(section, tbody));\r\n for (let id in section.Headers) {\r\n tr = tbody.appendChild(viggo.dom.tag('tr', { dataset: {headerId: id}}));\r\n this.groupMap.set(id, tr);\r\n tr.appendChild(viggo.dom.tag('th', null, this.createView('RowHeader', section.Headers[id])));\r\n this.createRow(tr);\r\n }\r\n return tbody;\r\n }\r\n\r\n protected addResizeListener(tbody: HTMLTableSectionElement) {\r\n tbody.addEventListener('mousemove', (event: MouseEvent) => {\r\n let target = viggo.dom.parent(<Element>event.target, 'div'),\r\n item = target ? target.viggoItem : null;\r\n\r\n if (target && item && !item.readonly && target == item.elements[item.elements.length - 1]) {\r\n if (event.clientX - viggo.dom.getPos(target, true).left - target.offsetWidth >= -10) {\r\n target.style.cursor = 'e-resize';\r\n } else {\r\n target.style.cursor = '';\r\n }\r\n }\r\n }, false);\r\n }\r\n\r\n protected addCreateAndMoveListener(tbody: HTMLTableSectionElement) {\r\n tbody.addEventListener('mousedown', (event) => {\r\n if (event.button != 0 || !this.links.Add.length) {\r\n return;\r\n }\r\n let target: HTMLElement | null = <HTMLElement>event.target;\r\n let item: GenericItem | undefined;\r\n while (target && !item) {\r\n item = (<any>target).viggoItem;\r\n if (!item) {\r\n target = <HTMLElement | null>target.parentNode;\r\n }\r\n }\r\n if (item) {\r\n item.pointerEvents = false;\r\n target = <HTMLElement|null>document.elementsFromPoint(event.clientX, event.clientY).find(x => x.tagName == 'TD');\r\n } else {\r\n target = <HTMLElement>event.target;\r\n }\r\n let group = this.getGroupId(<HTMLElement>event.target);\r\n let originalGroup = group;\r\n let moved = false;\r\n let move: (ev: MouseEvent) => void;\r\n let td = (<HTMLElement>target).closest('td');\r\n if (td) {\r\n let mousedownTime = this.getTime(td, event.clientX);\r\n if (!item) {\r\n if (group) {\r\n item = new this.itemClass({\r\n calendar: this,\r\n group: group,\r\n start: mousedownTime,\r\n length: AbstractCalendar.defaultTime,\r\n title: \"\",\r\n elementname: \"\",\r\n elementId: 0,\r\n id: 0,\r\n copyType: COPY_TYPE_INVALID,\r\n readonly: false,\r\n type: CalendarItemType.Calendar,\r\n temporaryMode: viggo.CalendarItemTemporaryMode.creating\r\n });\r\n this.addItem(item);\r\n item.update(this.filter(item));\r\n\r\n this.element.addEventListener('mousemove', move = (ev: MouseEvent) => {\r\n ev.stopPropagation();\r\n group = this.getGroupId(<HTMLElement>ev.target);\r\n let td = <HTMLTableDataCellElement | null>(<HTMLElement>ev.target).closest('tbody td');\r\n if (group && td) {\r\n moved = true;\r\n let time = this.getTime(td, ev.clientX);\r\n let from = mousedownTime;\r\n let to = time;\r\n if (from > to) {\r\n from = to;\r\n to = mousedownTime;\r\n }\r\n if (item) {\r\n item.setStart(from);\r\n item.setGroup(group);\r\n item.setLength(Math.max(to.getTime() - from.getTime(), AbstractCalendar.defaultTime));\r\n item.update(this.filter(item));\r\n }\r\n }\r\n }, false);\r\n }\r\n } else {\r\n let dif = 0;\r\n if (target && target.style.cursor) {\r\n let end = item.end;\r\n this.repositionEndDateForEditing(end);\r\n if (end <= item.start) {\r\n end.setDate(end.getDate() + 1);\r\n }\r\n try {\r\n item.end = end;\r\n } catch (e) {\r\n console.log('end smaller than start');\r\n }\r\n // resize\r\n dif = item.start.getTime() + item.length - mousedownTime.getTime();\r\n this.element.addEventListener('mousemove', move = (ev: MouseEvent) => {\r\n let td = <HTMLTableDataCellElement | null>(<HTMLElement>ev.target).closest('tbody td');\r\n if (td) {\r\n ev.stopPropagation();\r\n let time = this.getTime(td, ev.clientX);\r\n let add = mousedownTime.getTime() - time.getTime();\r\n if (item) {\r\n item.setLength(mousedownTime.getTime() - item.start.getTime() + dif - add);\r\n item.update(this.filter(item));\r\n }\r\n moved = moved || ev.clientX != event.clientX || ev.clientY != event.clientY;\r\n }\r\n }, false);\r\n } else if (target) {\r\n // move\r\n dif = item.start.getTime() - mousedownTime.getTime();\r\n this.element.addEventListener('mousemove', move = (ev: MouseEvent) => {\r\n let td = <HTMLTableDataCellElement | null>(<HTMLElement>ev.target).closest('tbody td');\r\n if (td) {\r\n ev.stopPropagation();\r\n group = this.getGroupId(td);\r\n if (group) {\r\n let time = this.getTime(td, ev.clientX);\r\n let add = mousedownTime.getTime() - time.getTime();\r\n time = mousedownTime;\r\n time.setTime(time.getTime() + dif - add);\r\n if (item) {\r\n item.setStart(time);\r\n item.setGroup(group);\r\n item.update(this.filter(item));\r\n }\r\n moved = moved || ev.clientX != event.clientX || ev.clientY != event.clientY || group != originalGroup;\r\n }\r\n }\r\n }, false);\r\n }\r\n }\r\n }\r\n\r\n let mouseup = () => {\r\n this.element.removeEventListener('mousemove', move, false);\r\n document.removeEventListener('mouseup', mouseup, false);\r\n viggo.hint.unblock();\r\n //document.removeEventListener('mousemove', scrollToCursor, true);\r\n if (moved) {\r\n if (item) {\r\n item.pointerEvents = true;\r\n }\r\n this.sortItems();\r\n this.repaint();\r\n if (item) {\r\n item.save();\r\n }\r\n } else if (item && !item.id) {\r\n item.remove();\r\n }\r\n };\r\n document.addEventListener('mouseup', mouseup, false);\r\n }, false);\r\n }\r\n\r\n protected abstract repositionEndDateForEditing(end: Date): void;\r\n\r\n protected createSectionHeader(section: GenericSection, tbody: HTMLTableSectionElement) {\r\n return viggo.dom.tag('td', {\r\n colSpan: this.days + 1,\r\n onclick: () => {\r\n this.toggleSection(section.Id, tbody);\r\n },\r\n onmousedown: (e: MouseEvent) => {\r\n e.stopPropagation();\r\n }\r\n }, this.createView('SectionHeader', section));\r\n }\r\n\r\n protected createRow(tr: HTMLTableRowElement) {\r\n for (let i = 0; i < this.days; i++) {\r\n tr.appendChild(viggo.dom.tag('td'));\r\n }\r\n }\r\n\r\n protected repaint() {\r\n this.groupMap.clear();\r\n this.dayWidth = 0;\r\n this.createTable();\r\n this.items.forEach(item => {\r\n item.alsoBookedBy = [];\r\n item.indent = -1;\r\n });\r\n let map = new Map<string, GenericItem[]>();\r\n for (let item of this.items) {\r\n if (item.isInView()) {\r\n if (!map.has(item.group)) {\r\n map.set(item.group, [item]);\r\n item.indent = 0;\r\n } else {\r\n let list = map.get(item.group);\r\n if (list) {\r\n list.forEach(x => item.checkDoubleBooking(x));\r\n list.push(item);\r\n item.indent = item.alsoBookedBy.length;\r\n }\r\n }\r\n } else {\r\n item.removeAllElements();\r\n }\r\n }\r\n\r\n this.updateRowVariables(map);\r\n \r\n // this may seem stupid, but you need to add the containers before adding the content.\r\n // otherwise the width of the table may change, and this leeds to wrong positioning.\r\n this.items.forEach(item => item.update(this.filter(item)));\r\n }\r\n\r\n protected updateRowVariables(itemMap: Map<string, GenericItem[]>) {\r\n for (let entity of this.groupMap) {\r\n let list = itemMap.get(entity[0]);\r\n let num = list ? Math.max(...list.map(x => x.alsoBookedBy.length + 2)).toString() : '0';\r\n entity[1].style.setProperty('--max-items', num);\r\n entity[1].dataset.maxItems = num;\r\n }\r\n }\r\n\r\n public set days(value: number) {\r\n if (!isNaN(value)) {\r\n this._days = value;\r\n this.element.style.setProperty('--days', this.days + '');\r\n this.setSetting('days', value);\r\n }\r\n }\r\n\r\n public get endDate() {\r\n let end = new Date(this.startDate);\r\n end.setDate(end.getDate() + this.days);\r\n return end;\r\n }\r\n protected repositionStartDate(startDate: Date): Date {\r\n let date = new Date(startDate);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n }\r\n private scroll(event: WheelEvent) {\r\n let scroll = event.deltaX;\r\n if (!scroll && event.shiftKey) {\r\n scroll = event.deltaY;\r\n }\r\n\r\n if (scroll < 0) {\r\n event.preventDefault();\r\n this.previousPreiod();\r\n } else if (scroll > 0) {\r\n event.preventDefault();\r\n this.nextPeriod();\r\n } // if scroll == 0 do nothing\r\n }\r\n protected abstract createTableHead(): void;\r\n protected abstract createTableFoot(): void;\r\n protected abstract getTime(td: HTMLTableDataCellElement, x: number): Date;\r\n }\r\n\r\n export class CustomRowDayCalendar<GenericItem extends CustomRowDayCalendarItem, GenericSection extends CustomRowSection> extends AbstractCustomRowCalendar<GenericItem, GenericSection> {\r\n protected itemClass: new (item: CalendarItemDTO) => GenericItem;\r\n protected periodIncrement = 1;\r\n public get name() {\r\n return 'CustomRowDay';\r\n }\r\n public constructor(options: CustomRowDayCalendarOptions) {\r\n super(options);\r\n this.itemClass = <any>CustomRowDayCalendarItem;\r\n }\r\n protected repositionStartDate(startDate: Date) {\r\n startDate = new Date(startDate);\r\n startDate.setHours(0, 0, 0, 0);\r\n return startDate;\r\n }\r\n public getDate(element: HTMLElement | null) {\r\n throw new Error(\"Not implemented\");\r\n return new Date();\r\n }\r\n protected createTableHead() {\r\n let thead = viggo.dom.tag('thead');\r\n let tr = thead.appendChild(viggo.dom.tag('tr'));\r\n tr.appendChild(this.createControls()); // controls\r\n let date = new Date(this.startDate);\r\n for (let i = 0; i < this.days; i++) {\r\n tr.appendChild(viggo.dom.tag('th', null, this.createView('Header', { date: date })));\r\n date.setDate(date.getDate() + 1);\r\n }\r\n this.tableHeader = <HTMLTableHeaderCellElement>tr.lastChild;\r\n this.element.appendChild(thead);\r\n }\r\n protected createControls() {\r\n let controls = viggo.dom.tag('th', { rowSpan: 2 }, this.createView('ViewControls', { days: this.days }));\r\n let control = <HTMLInputElement | HTMLSelectElement | null>controls.querySelector('.days-control');\r\n if (!control) {\r\n throw new Error('Element with class=\"days-control\" not found.');\r\n }\r\n control.addEventListener('change', (ev: Event) => {\r\n let target = <HTMLInputElement | HTMLSelectElement>ev.target;\r\n let d = parseInt(target.value);\r\n if (!isNaN(d)) {\r\n this.days = d;\r\n this.repaint();\r\n }\r\n }, false);\r\n return controls;\r\n }\r\n\r\n protected createTableBody(section: GenericSection) {\r\n let tbody = super.createTableBody(section);\r\n this.addResizeListener(tbody);\r\n this.addCreateAndMoveListener(tbody);\r\n\r\n return tbody;\r\n }\r\n public getItemPosition(group: string, date: Date) {\r\n let calDay = this.getUnixDay(this.startDate);\r\n let startDay = this.getUnixDay(date);\r\n let index = startDay - calDay;\r\n\r\n // calculate starting index of calendar item\r\n if (index < 0) {\r\n index = 0;\r\n } else if (index > this.days) {\r\n index = this.days;\r\n }\r\n\r\n let row = this.groupMap.get(group);\r\n return row ? row.cells[index + 1] : null;\r\n }\r\n protected repositionEndDateForEditing(end: Date) {\r\n\r\n }\r\n public createTableFoot() { }\r\n\r\n protected getTime(td: HTMLTableDataCellElement, x: number) {\r\n let size = td.getBoundingClientRect();\r\n x = (x - size.left) / size.width;\r\n let cellIndex = td.cellIndex - 1;\r\n let days = cellIndex;\r\n\r\n let hours = (x % 1) * 24;\r\n\r\n let date = new Date(this.startDate);\r\n date.setHours(0, 0, 0, 0);\r\n date.setDate(date.getDate() + days);\r\n date.setTime(Math.round((date.getTime() + hours * 60 * 60 * 1000) / AbstractCalendar.timeDetail) * AbstractCalendar.timeDetail);\r\n return date;\r\n }\r\n\r\n protected createInvalidArea(from: Date, to: Date) {\r\n // Method not implemented\r\n }\r\n }\r\n\r\n interface CustomRowDetailCalendarOptions extends AbstractCustomRowCalendarOptions {\r\n startHour: number;\r\n endHour: number;\r\n }\r\n\r\n export class CustomRowDetailCalendar extends AbstractCustomRowCalendar<CustomRowDetailCalendarItem, CustomRowSection> {\r\n protected itemClass: new (item: CalendarItemDTO) => CustomRowDetailCalendarItem;\r\n public get name() {\r\n return 'CustomRowDetail';\r\n }\r\n private _startHour!: number;\r\n private _endHour!: number;\r\n protected periodIncrement = 1;\r\n\r\n constructor(options: CustomRowDetailCalendarOptions) {\r\n super(options);\r\n let days = this.getNumberSetting('days');\r\n if (days === null) {\r\n days = options.days || 7;\r\n }\r\n this._days = days;\r\n let hour = this.getNumberSetting('startHour');\r\n if (hour !== null) {\r\n options.startHour = hour;\r\n }\r\n hour = this.getNumberSetting('endHour');\r\n if (hour !== null) {\r\n options.endHour = hour;\r\n }\r\n this.startHour = options.startHour;\r\n this.endHour = options.endHour;\r\n this.days = this._days; // update the css value.\r\n this.itemClass = CustomRowDetailCalendarItem;\r\n }\r\n\r\n public get startHour() {\r\n return this._startHour;\r\n }\r\n public get endHour() {\r\n return this._endHour;\r\n }\r\n\r\n public set startHour(value: number) {\r\n if (!isNaN(value)) {\r\n value = Math.min(Math.max(value, 0), 12);\r\n this._startHour = value;\r\n if (!isNaN(this.endHour)) {\r\n this.element.style.setProperty('--hours', (this.endHour - this.startHour) + '');\r\n }\r\n this.setSetting('startHour', value);\r\n }\r\n }\r\n\r\n public set endHour(value: number) {\r\n if (!isNaN(value)) {\r\n value = Math.min(Math.max(value, 13), 24);\r\n this._endHour = value;\r\n if (!isNaN(this.startHour)) {\r\n this.element.style.setProperty('--hours', (this.endHour - this.startHour) + '');\r\n }\r\n this.setSetting('endHour', value);\r\n }\r\n }\r\n\r\n public getDate(element: HTMLElement | null) {\r\n throw new Error(\"Not implemented\");\r\n return new Date();\r\n }\r\n\r\n protected getTime(td: HTMLTableDataCellElement, x: number) {\r\n let size = td.getBoundingClientRect();\r\n x = (x - size.left) / size.width;\r\n let cellIndex = td.cellIndex - 1;\r\n let days = Math.floor(cellIndex / 2);\r\n\r\n let hours = (x % 1) * (this.endHour - this.startHour) + this.startHour;\r\n\r\n let date = new Date(this.startDate);\r\n date.setHours(0, 0, 0, 0);\r\n date.setDate(date.getDate() + days);\r\n if (cellIndex % 2 == 1) {\r\n date.setTime(Math.round((date.getTime() + hours * 60 * 60 * 1000) / AbstractCalendar.timeDetail) * AbstractCalendar.timeDetail);\r\n }\r\n return date;\r\n }\r\n\r\n protected createInvalidArea(from: Date, to: Date) {\r\n // Method not implemented\r\n }\r\n\r\n protected repositionEndDateForEditing(end: Date) {\r\n if (end.getHours() < this.startHour || (end.getHours() == this.startHour && end.getMinutes())) {\r\n end.setHours(this.startHour, 0, 0, 0);\r\n } else if (end.getHours() >= this.endHour) {\r\n end.setHours(this.endHour, 0, 0, 0);\r\n }\r\n }\r\n\r\n protected createControls() {\r\n let controls = viggo.dom.tag('th', { rowSpan: 2 }, this.createView('ViewControls', { days: this.days, startHour: this.startHour, endHour: this.endHour }));\r\n let control = <HTMLInputElement | HTMLSelectElement | null>controls.querySelector('.days-control');\r\n if (!control) {\r\n throw new Error('Element with class=\"days-control\" not found.');\r\n }\r\n control.addEventListener('click', (ev: Event) => {\r\n let target = <HTMLElement|null>ev.target;\r\n target = target!.closest('[data-days]');\r\n if (target) {\r\n let d = parseInt(target.dataset.days!);\r\n if (!isNaN(d)) {\r\n this.days = d;\r\n this.repaint();\r\n }\r\n }\r\n }, false);\r\n control = <HTMLInputElement | HTMLSelectElement | null>controls.querySelector('.start-hour-control');\r\n if (!control) {\r\n throw new Error('Element with class=\"start-hour-control\" not found.');\r\n }\r\n control.addEventListener('change', (ev: Event) => {\r\n let target = <HTMLInputElement | HTMLSelectElement>ev.target;\r\n let d = parseInt(target.value);\r\n if (!isNaN(d)) {\r\n this.startHour = d;\r\n this.repaint();\r\n }\r\n }, false);\r\n control.addEventListener('input', (ev: Event) => {\r\n let target = <HTMLInputElement>ev.target;\r\n controls.querySelectorAll('.start-hour-value').forEach(x => x.textContent = target.value);\r\n }, false);\r\n control = <HTMLInputElement | HTMLSelectElement | null>controls.querySelector('.end-hour-control');\r\n if (!control) {\r\n throw new Error('Element with class=\"end-hour-control\" not found.');\r\n }\r\n control.addEventListener('change', (ev: Event) => {\r\n let target = <HTMLInputElement | HTMLSelectElement>ev.target;\r\n let d = parseInt(target.value);\r\n if (!isNaN(d)) {\r\n this.endHour = d;\r\n this.repaint();\r\n }\r\n }, false);\r\n control.addEventListener('input', (ev: Event) => {\r\n let target = <HTMLInputElement>ev.target;\r\n controls.querySelectorAll('.end-hour-value').forEach(x => x.textContent = target.value);\r\n }, false);\r\n return controls;\r\n }\r\n\r\n protected createTableHead() {\r\n let colgroup = viggo.dom.tag('colgroup');\r\n\r\n let thead = viggo.dom.tag('thead');\r\n let trHead = thead.appendChild(viggo.dom.tag('tr'));\r\n trHead.appendChild(this.createControls());\r\n let hours = this.endHour - this.startHour;\r\n let trTime = thead.appendChild(viggo.dom.tag('tr'));\r\n\r\n let date = new Date(this.startDate);\r\n date.setHours(12, 0, 0, 0);\r\n colgroup.appendChild(viggo.dom.tag('col', { className: 'headers' }));\r\n\r\n for (let i = 0; i < this.days; i++) {\r\n colgroup.appendChild(viggo.dom.tag('col', { className: 'between-days' }));\r\n trHead.appendChild(viggo.dom.tag('th', { className: 'between-days' }));\r\n trTime.appendChild(viggo.dom.tag('td', { className: 'between-days' }));\r\n\r\n trHead.appendChild(viggo.dom.tag('th', { colSpan: hours }, this.createView('Header', { date: date })));\r\n\r\n for (let i = 0; i < hours; i++) {\r\n trTime.appendChild(viggo.dom.tag('td', null, this.createView('TimeHeader', { hour: this.startHour + i })));\r\n colgroup.appendChild(viggo.dom.tag('col'));\r\n }\r\n\r\n date.setDate(date.getDate() + 1);\r\n }\r\n\r\n colgroup.appendChild(viggo.dom.tag('col', { className: 'between-days' }));\r\n trHead.appendChild(viggo.dom.tag('th', { className: 'between-days' }));\r\n trTime.appendChild(viggo.dom.tag('td', { className: 'between-days' }));\r\n this.tableHeader = <HTMLTableHeaderCellElement>trHead.childNodes[2];\r\n this.element.appendChild(colgroup);\r\n this.element.appendChild(thead);\r\n }\r\n\r\n protected createRow(tr: HTMLTableRowElement) {\r\n let hours = this.endHour - this.startHour;\r\n for (let i = 0; i < this.days; i++) {\r\n tr.appendChild(viggo.dom.tag('td', { className: 'between-days' }));\r\n let td = viggo.dom.tag('td', { colSpan: hours });\r\n tr.appendChild(td);\r\n }\r\n tr.appendChild(viggo.dom.tag('td', { className: 'between-days' }));\r\n }\r\n\r\n protected createSectionHeader(section: CustomRowSection, tbody: HTMLTableSectionElement) {\r\n let td = super.createSectionHeader(section, tbody);\r\n td.colSpan = this.days * (this.endHour - this.startHour + 1) + 2;\r\n return td;\r\n }\r\n\r\n protected createTableBody(section: CustomRowSection) {\r\n let tbody = super.createTableBody(section);\r\n\r\n this.addResizeListener(tbody);\r\n\r\n this.addCreateAndMoveListener(tbody);\r\n\r\n return tbody;\r\n }\r\n\r\n protected createTableFoot() { }\r\n\r\n public getItemPosition(group: string, startDate: Date, endDate: Date) {\r\n let calDay = this.getUnixDay(this.startDate);\r\n let startDay = this.getUnixDay(startDate);\r\n let start = startDay - calDay;\r\n\r\n // calculate starting index of calendar item\r\n if (start < 0) {\r\n start = 0;\r\n } else if (start > this.days) {\r\n start = this.days * 2;\r\n } else {\r\n start = start * 2 + 1;\r\n if (startDate.getHours() < this.startHour) {\r\n start--;\r\n } else if (startDate.getHours() >= this.endHour) {\r\n start++;\r\n }\r\n }\r\n\r\n // calculate ending index of calendar item\r\n let endDay = this.getUnixDay(endDate);\r\n let end = endDay - calDay;\r\n if (endDay < 0) {\r\n endDay = 0;\r\n } else if (end > this.days) {\r\n end = this.days * 2;\r\n } else {\r\n end = end * 2 + 1;\r\n if (endDate.getHours() < this.startHour) {\r\n end--;\r\n } else if (endDate.getHours() > this.endHour || (endDate.getHours() == this.endHour && endDate.getMinutes())) {\r\n end++;\r\n }\r\n }\r\n let list = this.groupMap.get(group);\r\n if (list) {\r\n return {\r\n parent: list.cells[start + 1],\r\n start: start,\r\n end: end\r\n }\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n interface MultiweekCalendarOptions extends CalendarOptions {\r\n element: HTMLElement;\r\n maxItems?: number;\r\n }\r\n\r\n export class MultiweekCalendar extends AbstractCalendar<viggo.MultiweekCalendarItem> {\r\n public rows!: HTMLTableElement[];\r\n protected maxItems = 5;\r\n private draggedItem?: MultiweekCalendarItem;\r\n protected itemClass: new (item: CalendarItemDTO) => viggo.MultiweekCalendarItem;\r\n protected get weekCount() {\r\n return 4;\r\n }\r\n constructor(options: MultiweekCalendarOptions) {\r\n super(options);\r\n this.itemClass = viggo.MultiweekCalendarItem;\r\n }\r\n protected initialize(options: MultiweekCalendarOptions) {\r\n super.initialize(options);\r\n this.periodEnd.setHours(23, 59, 59, 999);\r\n this.maxItems = options.maxItems || 5;\r\n this.loadRows();\r\n }\r\n public get name() {\r\n return \"Weeks\";\r\n }\r\n\r\n protected createInvalidArea(from: Date, to: Date) {\r\n let slip = new Date(from.getTime() - this.slipDistance);\r\n let td: HTMLTableDataCellElement | null;\r\n if (from.getDate() == slip.getDate()) {\r\n td = this.getCell(from);\r\n if (td) {\r\n td.classList.add('halfperiod');\r\n }\r\n }\r\n while (from < to) {\r\n td = this.getCell(from);\r\n if (td) {\r\n td.classList.add('offperiod');\r\n } else {\r\n break;\r\n }\r\n from.setDate(from.getDate() + 1);\r\n from.setHours(0, 0, 0, this.slipDistance);\r\n }\r\n slip = new Date(to.getTime() + this.slipDistance);\r\n if (to.getDate() == slip.getDate()) {\r\n td = this.getCell(to);\r\n if (td) {\r\n td.classList.add('halfperiod');\r\n }\r\n }\r\n }\r\n public resetPeriods() {\r\n this.element.querySelectorAll('table:not(.cal-items) td:not(.out)').forEach(td => td.classList.remove('offperiod', 'halfperiod'));\r\n super.resetPeriods();\r\n }\r\n public get endDate() {\r\n let end = new Date(this.startDate);\r\n end.setDate(end.getDate() + 7 * this.weekCount);\r\n return end;\r\n }\r\n protected repositionStartDate(startDate: Date) {\r\n let date = new Date(startDate);\r\n date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n }\r\n protected repaint() {\r\n this.loadRows();\r\n for (let i = 0; i < this.items.length; i++) {\r\n let item = this.items[i];\r\n item.update(this.filter(item));\r\n }\r\n for (let row of this.rows) {\r\n row.parentElement!.style.setProperty('--rows', row.rows.length+'');\r\n }\r\n }\r\n public getDate(td: HTMLTableDataCellElement) {\r\n let start = this.startDate;\r\n let row = td.closest('div.week-row');\r\n if (row) {\r\n let week = Array.prototype.indexOf.call(row.parentElement!.children, row);\r\n if (week != -1) {\r\n let days = -1;\r\n let first = true;\r\n while (td != null) {\r\n days += first ? 1 : td.colSpan;\r\n first = false;\r\n td = <HTMLTableDataCellElement>td.previousElementSibling;\r\n }\r\n return new Date(start.getFullYear(), start.getMonth(), start.getDate() + week * 7 + days, 0, 0, 0, 0);\r\n }\r\n }\r\n return null;\r\n }\r\n public getCellIndex(date: Date) {\r\n date = new Date(date);\r\n var end = new Date(this.startDate);\r\n var dst = end.dst();\r\n var add = 0;\r\n if (date.dst() != dst) {\r\n add = dst ? 1 : -1;\r\n }\r\n end.setDate(end.getDate() + 7 * this.rows.length);\r\n end.setHours(end.getHours() + add);\r\n date.setHours(end.getHours() + add);\r\n if (date < this.startDate || date >= end) {\r\n return -1;\r\n } else {\r\n return Math.floor((date.getTime() - this.startDate.getTime()) / (1000 * 60 * 60 * 24));\r\n }\r\n }\r\n protected loadRows() {\r\n viggo.dom.empty(this.element);\r\n\r\n var fragment = viggo.dom.fragment();\r\n let date = new Date(2013, 6, 15, 0, 0, 0, 0); // monday\r\n for (let i = 7; i--;) {\r\n fragment.appendChild(viggo.dom.tag('th', null, this.createView('Header', { date: date })));\r\n date.setDate(date.getDate() + 1);\r\n }\r\n this.element.appendChild(\r\n viggo.dom.tag('table', null,\r\n viggo.dom.tag('thead', null,\r\n viggo.dom.tag('tr', null, fragment)\r\n )\r\n )\r\n );\r\n\r\n this.rows = [];\r\n let rows: HTMLTableElement[] = [];\r\n date = new Date(this.startDate);\r\n let mouseDownCell: HTMLTableDataCellElement|null = null;\r\n let mouseUpCell: HTMLTableDataCellElement|null = null;\r\n let setHighlightClass = (start: HTMLTableDataCellElement, end: HTMLTableDataCellElement, className: string) => {\r\n let tds = this.element.querySelectorAll('table.calBackground td');\r\n let found = false, td: Element;\r\n for (var i = 0; i < tds.length; i++) {\r\n td = tds[i];\r\n if (td == start) {\r\n found = true;\r\n }\r\n if (found) {\r\n td.classList.add('create-new');\r\n } else {\r\n td.classList.remove('create-new');\r\n }\r\n\r\n if (td == end) {\r\n found = false;\r\n }\r\n }\r\n }\r\n let highlightCells = function () {\r\n let start = mouseDownCell,\r\n end = mouseUpCell;\r\n if (start && end) {\r\n if (!(start.compareDocumentPosition(end) & 4)) {\r\n let temp = start;\r\n start = end;\r\n end = temp;\r\n }\r\n setHighlightClass(start, end, 'create-new');\r\n }\r\n };\r\n let tableObject = {\r\n className: 'cal-background',\r\n onmousedown: (event: MouseEvent) => {\r\n if (event.button) {\r\n return;\r\n }\r\n mouseDownCell = viggo.dom.parent(<HTMLElement>event.target, 'td');\r\n mouseUpCell = mouseDownCell;\r\n highlightCells();\r\n let mouseup = (event: MouseEvent) => {\r\n if (mouseDownCell && mouseUpCell) {\r\n if (!(mouseDownCell.compareDocumentPosition(mouseUpCell) & 4)) {\r\n var temp = mouseDownCell;\r\n mouseDownCell = mouseUpCell;\r\n mouseUpCell = temp;\r\n }\r\n setHighlightClass(mouseDownCell, mouseUpCell, 'create-new');\r\n let from = <Date>mouseDownCell.viggoDate;\r\n let to = <Date>mouseUpCell.viggoDate;\r\n let item = this.createItem({\r\n calendar: this,\r\n id: 0,\r\n group: '',\r\n title: \"\",\r\n elementId: 0,\r\n elementname: \"\",\r\n copyType: COPY_TYPE_INVALID,\r\n start: new Date(from),\r\n length: to.getTime() - from.getTime() + 4 * 60 * 60 * 1000,\r\n readonly: false,\r\n type: CalendarItemType.Calendar\r\n });\r\n mouseDownCell = null;\r\n mouseUpCell = null;\r\n document.removeEventListener('mouseup', mouseup, true);\r\n this.reset(this.originalDate, true);\r\n this.repaint();\r\n if (item) {\r\n item.save();\r\n }\r\n }\r\n };\r\n document.addEventListener('mouseup', mouseup, true);\r\n },\r\n onmouseover: (event: MouseEvent) => {\r\n if (mouseDownCell) {\r\n var cell = viggo.dom.parent(<Element>event.target, 'td');\r\n if (cell)\r\n mouseUpCell = cell;\r\n highlightCells();\r\n }\r\n },\r\n ondragover: (event: DragEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n },\r\n ondragenter: (event: DragEvent) => {\r\n let target = viggo.dom.parent(<Element>event.target, 'td');\r\n if (target && this.draggedItem) {\r\n let item = this.draggedItem;\r\n var endDate = new Date(<Date>target.viggoDate);\r\n endDate.setHours(item.start.getHours(), item.start.getMinutes(), item.start.getSeconds(), item.start.getMilliseconds() + item.length - 1);\r\n var index = this.getCellIndex(endDate);\r\n var cells = this.element.querySelectorAll('table.cal-background td');\r\n if (index == -1) {\r\n index = cells.length - 1;\r\n }\r\n setHighlightClass(target, <HTMLTableDataCellElement>cells[index], 'create-new');\r\n event.stopPropagation();\r\n }\r\n },\r\n ondragleave: (event: DragEvent) => {\r\n event.stopPropagation();\r\n },\r\n ondrop: (event: DragEvent) => {\r\n var target = viggo.dom.parent(<Element>event.target, 'td');\r\n if (target && this.draggedItem) {\r\n let item = this.draggedItem;\r\n let oldDate = item.start;\r\n let newDate = new Date(oldDate);\r\n let cellDate = <Date>target.viggoDate;\r\n newDate.setFullYear(cellDate.getFullYear(), cellDate.getMonth(), cellDate.getDate());\r\n if (newDate.getFullYear() != oldDate.getFullYear() || newDate.getMonth() != oldDate.getMonth() || newDate.getDate() != oldDate.getDate()) {\r\n this.draggedItem.setStart(newDate);\r\n this.draggedItem.save();\r\n this.reset(this.originalDate, true);\r\n this.repaint();\r\n }\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n },\r\n oncontextmenu: (event: MouseEvent) => {\r\n let td = (<HTMLElement>event.target).closest('td');\r\n if (AbstractCalendar.copiedItems.size && td && this.allowPaste()) {\r\n let date = this.getDate(td);\r\n if (date) {\r\n viggo.contextmenu.addItem({\r\n title: __('Paste'),\r\n click: () => {\r\n let oldDate = AbstractCalendar.copyDate;\r\n let firstDate = AbstractCalendar.getFirstCopiedDate();\r\n AbstractCalendar.copyDate = firstDate\r\n date!.setHours(firstDate.getHours(), firstDate.getMinutes(), 0, 0);\r\n this.pasteToDates([date!], this.copyData);\r\n AbstractCalendar.copyDate = oldDate;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n };\r\n let createBackground = () => {\r\n let tr = viggo.dom.tag('tr');\r\n for (let i = 0; i < 7; i++) {\r\n let view = this.createView('CalendarBackground', {date: date, currentMonth: this.originalDate.getMonth()});\r\n if (!view) {\r\n throw new Error('Missing view \"CalendarBackground\"');\r\n }\r\n let td = <HTMLTableDataCellElement | null>view.firstChild;\r\n if (!td) {\r\n throw new Error('<td> must be first in \"CalendarBackground view\"');\r\n }\r\n td.viggoDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 8, 0, 0, 0);\r\n tr.appendChild(td);\r\n date.setDate(date.getDate() + 1);\r\n }\r\n return viggo.dom.tag('table', tableObject, viggo.dom.tag('tbody', null, tr)); };\r\n\r\n let createTable = () => {\r\n return viggo.dom.tag('table', { className: 'cal-items' }, viggo.dom.tag('tbody'));\r\n };\r\n\r\n let createRow = () => {\r\n let row = viggo.dom.tag('div', { className: 'week-row' });\r\n row.appendChild(createBackground());\r\n rows.push(row.appendChild(createTable()));\r\n return row;\r\n };\r\n\r\n let div = viggo.dom.tag('div', { className: 'week-rows' });\r\n\r\n let i = this.weekCount;\r\n while (i--) div.appendChild(createRow());\r\n this.element.appendChild(div);\r\n\r\n this.rows = rows;\r\n\r\n this.resetPeriods();\r\n }\r\n public getCell(date: Date) {\r\n let days = Math.floor((date.getTime() - this.startDate.getTime()) / (1000 * 60 * 60 * 24));\r\n if (days >= 0) {\r\n return <HTMLTableDataCellElement | null>this.element.querySelector(`.week-row:nth-child(${Math.floor(days / 7) + 1}) table.cal-background td:nth-child(${days % 7 + 1})`);\r\n }\r\n return null;\r\n }\r\n public reset(startDate: Date, keepItems?: boolean) {\r\n super.reset(startDate);\r\n if (!keepItems) {\r\n while (this.items.length) {\r\n this.items.pop()!.remove();\r\n }\r\n }\r\n this.loadRows();\r\n }\r\n public dragstart(this: HTMLDivElement, event: DragEvent) {\r\n if (this.viggoItem) {\r\n let calendar = <MultiweekCalendar>this.viggoItem.calendar;\r\n calendar.draggedItem = <MultiweekCalendarItem>this.viggoItem;\r\n event.dataTransfer!.setData(\"application/x-viggo-calendar-item\", this.viggoItem.id.toString());\r\n event.dataTransfer!.effectAllowed = 'move';\r\n viggo.hint.block();\r\n }\r\n }\r\n public dragend(this: HTMLDivElement, event: DragEvent) {\r\n viggo.hint.unblock();\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n export class MonthCalendar extends MultiweekCalendar {\r\n protected get weekCount() {\r\n let from = new Date(this.startDate);\r\n let to = new Date(from);\r\n if (from.getDate() > 20) {\r\n to.setDate(to.getDate() + 20);\r\n to.setDate(1);\r\n }\r\n to.setMonth(to.getMonth() + 1);\r\n to.setDate(0);\r\n to = super.repositionStartDate(to);\r\n to.setDate(to.getDate()+7);\r\n let days = Math.round((to.getTime() - from.getTime()) / (24 * 60 * 60 * 1000));\r\n return Math.ceil(days / 7);\r\n }\r\n public get name() {\r\n return \"Month\";\r\n }\r\n protected repositionStartDate(startDate: Date) {\r\n let date = new Date(startDate);\r\n date.setDate(1);\r\n date = super.repositionStartDate(date);\r\n return date;\r\n }\r\n public nextPeriod() {\r\n this.originalDate.setDate(1);\r\n this.originalDate.setMonth(this.originalDate.getMonth() + 1);\r\n this.setPeriod(this.originalDate);\r\n }\r\n public previousPreiod() {\r\n this.originalDate.setDate(1);\r\n this.originalDate.setMonth(this.originalDate.getMonth() - 1);\r\n this.setPeriod(this.originalDate);\r\n }\r\n }\r\n\r\n interface PeriodMonthOptions extends MultiweekCalendarOptions, PeriodCalendarPartOptions {\r\n }\r\n\r\n interface MultimonthCalendarOptions extends CalendarOptions {\r\n element: HTMLTableElement;\r\n readonly?: boolean;\r\n }\r\n\r\n export class MultimonthCalendar extends AbstractCalendar<MultimonthCalendarItem> {\r\n public get name() {\r\n return \"Multimonth\";\r\n }\r\n public element!: HTMLTableElement;\r\n protected draggedItem?: MultimonthCalendarItem;\r\n protected tbody!: HTMLTableSectionElement;\r\n protected readonly!: boolean;\r\n private readonly maxColumns = 4;\r\n private _itemRows: number = 1;\r\n private _itemColumns: number = 2;\r\n\r\n protected itemClass: new (item: CalendarItemDTO) => MultimonthCalendarItem;\r\n protected get monthCount() {\r\n let months = (this.periodEnd.getFullYear() - this.periodStart.getFullYear()) * 12 + this.periodEnd.getMonth() - this.periodStart.getMonth() + 1;\r\n if (months > 13) {\r\n months = 6;\r\n }\r\n return months;\r\n }\r\n constructor(options: MultimonthCalendarOptions) {\r\n super(options);\r\n let num = this.getNumberSetting('itemRows');\r\n if (num === null) {\r\n num = 1;\r\n }\r\n this.itemRows = num;\r\n num = this.getNumberSetting('itemColumns');\r\n if (num === null) {\r\n num = 2;\r\n }\r\n this.itemColumns = num;\r\n this.itemClass = viggo.MultimonthCalendarItem;\r\n }\r\n protected initialize(options: MultimonthCalendarOptions) {\r\n super.initialize(options);\r\n this.periodEnd.setHours(23, 59, 59, 999);\r\n this.readonly = !!options.readonly;\r\n }\r\n\r\n public resetPeriods() {\r\n let parent = this.tbody;\r\n parent.querySelectorAll('table:not(.cal-items) td:not(.out)').forEach(td => td.classList.remove('offperiod', 'halfperiod'));\r\n super.resetPeriods();\r\n }\r\n\r\n protected createInvalidArea(from: Date, to: Date) {\r\n let date = new Date(from);\r\n while (date < to) {\r\n let cell = this.getCell(date);\r\n if (cell) {\r\n cell.classList.add('offperiod');\r\n } else {\r\n break;\r\n }\r\n date.setDate(date.getDate() + 1);\r\n date.setHours(0, 0, 0, this.slipDistance);\r\n }\r\n let slip = new Date(from.getTime() - this.slipDistance);\r\n if (from.getDate() == slip.getDate()) {\r\n let cell = this.getCell(from);\r\n if (cell) {\r\n cell.classList.remove('offperiod');\r\n cell.classList.add('halfperiod');\r\n }\r\n }\r\n slip = new Date(to.getTime() + this.slipDistance);\r\n if (to.getDate() == slip.getDate()) {\r\n let cell = this.getCell(to);\r\n if (cell) {\r\n cell.classList.remove('offperiod');\r\n cell.classList.add('halfperiod');\r\n }\r\n }\r\n }\r\n protected repositionStartDate(date: Date) {\r\n date = new Date(date);\r\n date.setHours(0, 0, 0, 0);\r\n date.setDate(1);\r\n return date;\r\n }\r\n public get endDate() {\r\n let end = new Date(this.startDate);\r\n end.setMonth(end.getMonth() + this.monthCount);\r\n return end;\r\n }\r\n public get itemRows() {\r\n return this._itemRows;\r\n }\r\n public set itemRows(value: number) {\r\n if (!isNaN(value)) {\r\n this._itemRows = value;\r\n this.element.style.setProperty('--item-rows', value + '');\r\n this.element.dataset.itemRows = value + '';\r\n this.setSetting('itemRows', value);\r\n }\r\n }\r\n public get itemColumns() {\r\n return this._itemColumns;\r\n }\r\n public set itemColumns(value: number) {\r\n if (!isNaN(value)) {\r\n this._itemColumns = value;\r\n this.element.style.setProperty('--item-columns', value + '');\r\n this.element.dataset.itemColumns = value + '';\r\n this.setSetting('itemColumns', value);\r\n }\r\n }\r\n public repaint() {\r\n this.tbody.querySelectorAll('span.show-more').forEach(span => span.remove());\r\n for (let item of this.items) {\r\n item.update(this.filter(item));\r\n }\r\n let max = this.itemRows * this.itemColumns;\r\n if (max != 0) {\r\n this.tbody.querySelectorAll('td > div').forEach(node => {\r\n if (node.childNodes.length > max + 1) {\r\n node.appendChild(viggo.dom.tag('span', {\r\n className: 'show-more',\r\n onmousedown: (event: MouseEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n },\r\n onclick: (event: MouseEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n let td = viggo.dom.parent(<Element>event.target, 'td');\r\n if (td) {\r\n td.classList.toggle('show-more');\r\n if (td.classList.contains('show-more')) {\r\n let removeShow = (ev: MouseEvent) => {\r\n if (ev.buttons & 1) {\r\n document.removeEventListener('mousedown', removeShow, false);\r\n if (td) {\r\n td.classList.remove('show-more');\r\n }\r\n }\r\n };\r\n document.addEventListener('mousedown', removeShow, false);\r\n }\r\n }\r\n }\r\n }, \"+\" + (node.childNodes.length - max - 1)));\r\n }\r\n });\r\n }\r\n }\r\n public getCell(date: Date) {\r\n var month = (date.getFullYear() - this.startDate.getFullYear())*12 + date.getMonth() - this.startDate.getMonth();\r\n if (month < 0 || month > this.monthCount) {\r\n return null;\r\n }\r\n return this.element.rows[date.getDate()].cells[month];\r\n }\r\n public getDate(cell: HTMLTableDataCellElement) {\r\n let row = <HTMLTableRowElement>cell.parentElement;\r\n let date = new Date(this.startDate);\r\n date.setMonth(date.getMonth() + cell.cellIndex);\r\n let month = date.getMonth();\r\n date.setDate(row.rowIndex);\r\n date.setHours(0, 0, 0, 0);\r\n return month == date.getMonth() ? date : null;\r\n }\r\n public dragstart(this: HTMLDivElement, event: DragEvent) {\r\n if (this.viggoItem) {\r\n let calendar = <MultimonthCalendar>this.viggoItem.calendar;\r\n calendar.draggedItem = <MultimonthCalendarItem>this.viggoItem;\r\n event.dataTransfer!.setData(\"application/x-viggo-calendar-item\", this.viggoItem.id.toString());\r\n event.dataTransfer!.effectAllowed = 'move';\r\n viggo.hint.block();\r\n }\r\n }\r\n public dragend(this: HTMLDivElement, event: DragEvent) {\r\n viggo.hint.unblock();\r\n event.preventDefault();\r\n }\r\n private repaintGrid(grid: Element) {\r\n grid.querySelectorAll('.x').forEach(x => x.classList.remove('x'));\r\n for (let y = 0; y < (this.itemRows || 1); y++) {\r\n for (let x = 0; x < this.itemColumns; x++) {\r\n grid.children[y * this.maxColumns + x].classList.add('x');\r\n }\r\n }\r\n }\r\n private createControls() {\r\n let controls = this.createView('ViewControls', { rows: this.itemRows, columns: this.itemColumns });\r\n if (controls) {\r\n let grid = controls.querySelector('.grid-control');\r\n let checkbox = <HTMLInputElement|null>controls.querySelector('input.rows-auto');\r\n let originalRows = this.itemRows || 1;\r\n if (grid) {\r\n grid.addEventListener('click', (event) => {\r\n let index = Array.prototype.indexOf.call(grid!.children, event.target);\r\n if (index != -1) {\r\n this.itemColumns = (index % this.maxColumns) + 1;\r\n if (!checkbox || !checkbox.checked) {\r\n this.itemRows = Math.floor(index / this.maxColumns) + 1;\r\n originalRows = this.itemRows || 1;\r\n }\r\n this.repaintGrid(grid!);\r\n this.repaint();\r\n }\r\n }, false);\r\n this.repaintGrid(grid);\r\n }\r\n if (checkbox) {\r\n checkbox.addEventListener('change', () => {\r\n if (checkbox!.checked) {\r\n originalRows = this.itemRows;\r\n this.itemRows = 0;\r\n this.repaint();\r\n } else {\r\n this.itemRows = originalRows;\r\n this.repaint();\r\n }\r\n });\r\n }\r\n let inputColumns = <HTMLInputElement | null>controls.querySelector('input.max-columns');\r\n if (inputColumns) {\r\n inputColumns.addEventListener('change', () => {\r\n this.itemColumns = inputColumns!.valueAsNumber;\r\n this.repaint();\r\n }, false);\r\n }\r\n let inputRows = <HTMLInputElement | null>controls.querySelector('input.max-rows');\r\n if (inputRows) {\r\n inputRows.addEventListener('change', () => {\r\n this.itemRows = inputRows!.valueAsNumber;\r\n this.repaint();\r\n }, false);\r\n }\r\n }\r\n return controls;\r\n }\r\n protected createTable() {\r\n let table: DocumentFragment, caption: HTMLTableCaptionElement, colgroup: HTMLTableColElement, thead: HTMLTableSectionElement, tbody: HTMLTableSectionElement, tr: HTMLTableRowElement;\r\n table = viggo.dom.fragment(\r\n caption = viggo.dom.tag('caption'),\r\n colgroup = viggo.dom.tag('colgroup'),\r\n thead = viggo.dom.tag('thead'),\r\n this.tbody = tbody = viggo.dom.tag('tbody', {\r\n oncontextmenu: (event: PointerEvent) => {\r\n let td = (<HTMLElement>event.target).closest('td');\r\n if (td) {\r\n let date = <Date>this.getDate(td!);\r\n if (date && this.allowPaste()) {\r\n viggo.contextmenu.addItem({\r\n title: __('Paste'),\r\n click: () => {\r\n let oldDate = AbstractCalendar.copyDate;\r\n let firstDate = AbstractCalendar.getFirstCopiedDate();\r\n AbstractCalendar.copyDate = firstDate\r\n date.setHours(firstDate.getHours(), firstDate.getMinutes(), 0, 0);\r\n this.pasteToDates([date], this.copyData);\r\n AbstractCalendar.copyDate = oldDate;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n })\r\n );\r\n let controls = this.createControls();\r\n if (controls) {\r\n caption.appendChild(controls);\r\n } else {\r\n caption.remove();\r\n }\r\n thead.appendChild(tr = viggo.dom.tag('tr'));\r\n let d = new Date(this.startDate);\r\n d.setDate(1);\r\n let counter = this.monthCount;\r\n while (counter--) {\r\n tr.appendChild(viggo.dom.tag('th', null, this.createView('Header', { date: d })));\r\n let col = viggo.dom.tag('col');\r\n //if (i == 1) {\r\n // col.className = 'days';\r\n //} else {\r\n // d.setMonth(d.getMonth() + 1);\r\n //}\r\n d.setMonth(d.getMonth() + 1);\r\n colgroup.appendChild(col);\r\n }\r\n\r\n let year = this.startDate.getFullYear();\r\n let firstMonth = this.startDate.getMonth();\r\n\r\n for (let day = 1; day <= 31; day++) {\r\n tr = tbody.appendChild(viggo.dom.tag('tr'));\r\n for (let month = 0; month < this.monthCount; month++) {\r\n let d = new Date(year, firstMonth + month, day);\r\n let td: HTMLTableDataCellElement | undefined;\r\n if (day != d.getDate()) {\r\n td = viggo.dom.tag('td', { className: 'out' });\r\n } else {\r\n let view = this.createView('TableData', { date: d });\r\n if (view) {\r\n td = <HTMLTableDataCellElement>view.firstChild;\r\n }\r\n }\r\n if (td) {\r\n tr.appendChild(td);\r\n }\r\n }\r\n }\r\n return table;\r\n }\r\n public reset(date: Date) {\r\n super.reset(date);\r\n viggo.dom.empty(this.element);\r\n this.element.appendChild(this.createTable());\r\n this.resetPeriods();\r\n if (!this.readonly) {\r\n let getDate = (cell: HTMLTableDataCellElement) => {\r\n return cell ? new Date(this.startDate.getFullYear(), this.startDate.getMonth() + cell.cellIndex, (<HTMLTableRowElement>cell.parentNode).rowIndex, 0, 0, 0, 0) : null;\r\n };\r\n\r\n let highlightBetween = (start: HTMLTableDataCellElement, end: HTMLTableDataCellElement, func: (cell: HTMLTableDataCellElement) => void) => {\r\n let startDate = getDate(start),\r\n endDate = getDate(end),\r\n temp;\r\n\r\n if (startDate && endDate) {\r\n if (endDate < startDate) {\r\n temp = start;\r\n start = end;\r\n end = temp;\r\n }\r\n if (end == null) {\r\n let d = new Date(this.startDate);\r\n d.setMonth(d.getMonth() + this.monthCount);\r\n end = this.element.rows[d.daysInMonth()].cells[this.monthCount - 1];\r\n }\r\n let startColumn = start.cellIndex,\r\n endColumn = end.cellIndex,\r\n startRow = (<HTMLTableRowElement>start.parentNode).rowIndex,\r\n endRow = (<HTMLTableRowElement>end.parentNode).rowIndex;\r\n\r\n let d = new Date(this.startDate);\r\n d.setMonth(d.getMonth() + startColumn);\r\n for (let col = startColumn; col <= endColumn; col++) {\r\n let maxDays = d.daysInMonth();\r\n for (let row = startRow; (row <= endRow && col == endColumn) || (col < endColumn && row <= maxDays); row++) {\r\n func(this.element.rows[row].cells[col]);\r\n }\r\n startRow = 1;\r\n d.setMonth(d.getMonth() + 1);\r\n }\r\n }\r\n };\r\n this.tbody.addEventListener('mousedown', (event: MouseEvent) => {\r\n if (event.buttons == 1) {\r\n event.stopPropagation();\r\n let item = viggo.dom.parentClass(<Element>event.target, 'calendar-item');\r\n if (item && this.element.contains(item)) {\r\n return;\r\n } else {\r\n event.preventDefault(); // no drag/drop\r\n }\r\n let mousedownCell = viggo.dom.parent(<Element>event.target, 'td');\r\n if (mousedownCell && !mousedownCell.classList.contains('out')) {\r\n this.tbody.className = 'creating';\r\n let startTime = getDate(mousedownCell);\r\n let mouseupCell: HTMLTableDataCellElement | null = mousedownCell;\r\n let mouseover = (ev: MouseEvent) => {\r\n highlightBetween(mousedownCell!, mouseupCell!, td => td.classList.remove('create-new'));\r\n mouseupCell = viggo.dom.parent(<Element>ev.target, 'td');\r\n while (mouseupCell && mouseupCell.classList.contains('out')) {\r\n mouseupCell = this.tbody.rows[(<HTMLTableRowElement>mouseupCell.parentNode).rowIndex - 2].cells[mouseupCell.cellIndex];\r\n }\r\n highlightBetween(mousedownCell!, mouseupCell!, td => td.classList.add('create-new'));\r\n };\r\n let mouseup = () => {\r\n this.tbody.removeEventListener('mouseover', mouseover, false);\r\n document.removeEventListener('mouseup', mouseup, false);\r\n highlightBetween(mousedownCell!, mouseupCell!, td => td.classList.remove('create-new'));\r\n this.tbody.classList.remove('creating');\r\n let endTime = getDate(mouseupCell!);\r\n if (startTime && endTime) {\r\n if (startTime > endTime) {\r\n let temp = startTime;\r\n startTime = endTime;\r\n endTime = temp;\r\n }\r\n startTime.setHours(8, 0, 0, 0);\r\n endTime.setHours(12, 0, 0, 0);\r\n let item = new this.itemClass({\r\n calendar: this,\r\n start: startTime,\r\n length: endTime.getTime() - startTime.getTime(),\r\n title: \"\",\r\n id: 0,\r\n elementId: 0,\r\n group: '',\r\n columnIds: [],\r\n copyType: COPY_TYPE_INVALID,\r\n readonly: false,\r\n type: CalendarItemType.Calendar\r\n });\r\n if (this.addItem(item)) {\r\n this.repaint();\r\n item.save();\r\n } else {\r\n item.remove();\r\n }\r\n }\r\n };\r\n this.tbody.addEventListener('mouseover', mouseover, false);\r\n document.addEventListener('mouseup', mouseup, false);\r\n mouseover(event);\r\n }\r\n }\r\n }, false);\r\n this.tbody.addEventListener('dragover', function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }, false);\r\n this.tbody.addEventListener('dragenter', (event: DragEvent) => {\r\n let target = viggo.dom.parent(<Element>event.target, 'td');\r\n if (target) {\r\n let item = this.draggedItem;\r\n let endDate = getDate(target);\r\n if (item && endDate) {\r\n endDate.setHours(item.start.getHours(), item.start.getMinutes(), item.start.getSeconds(), item.start.getMilliseconds() + item.length);\r\n let endCell = this.getCell(endDate);\r\n if (endCell) {\r\n highlightBetween(target, endCell, td => td.classList.add('create-new'));\r\n }\r\n }\r\n event.stopPropagation();\r\n }\r\n }, false);\r\n this.tbody.addEventListener('dragleave', (event: DragEvent) => {\r\n var target = viggo.dom.parent(<Element>event.target, 'td');\r\n if (target) {\r\n var item = this.draggedItem;\r\n var endDate = getDate(target);\r\n if (item && endDate) {\r\n endDate.setHours(item.start.getHours(), item.start.getMinutes(), item.start.getSeconds(), item.start.getMilliseconds() + item.length);\r\n let endCell = this.getCell(endDate);\r\n if (endCell) {\r\n highlightBetween(target, endCell, td => td.classList.remove('create-new'));\r\n }\r\n }\r\n event.stopPropagation();\r\n }\r\n }, false);\r\n this.tbody.addEventListener('drop', (event: DragEvent) => {\r\n var target = viggo.dom.parent(<Element>event.target, 'td');\r\n if (target) {\r\n this.tbody.classList.remove('creating');\r\n var item = this.draggedItem;\r\n if (item) {\r\n let oldDate = item.start;\r\n let newDate = new Date(oldDate);\r\n let cellDate = getDate(target);\r\n if (cellDate && this.draggedItem) {\r\n newDate.setFullYear(cellDate.getFullYear(), cellDate.getMonth(), cellDate.getDate());\r\n if (newDate.getFullYear() != oldDate.getFullYear() || newDate.getMonth() != oldDate.getMonth() || newDate.getDate() != oldDate.getDate()) {\r\n this.draggedItem.setStart(newDate);\r\n this.draggedItem.save();\r\n this.reset(this.startDate);\r\n this.repaint();\r\n }\r\n }\r\n }\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n }, false);\r\n }\r\n }\r\n public nextPeriod() {\r\n this.originalDate.setDate(1);\r\n this.originalDate.setMonth(this.originalDate.getMonth() + this.monthCount);\r\n this.setPeriod(this.originalDate);\r\n }\r\n public previousPreiod() {\r\n this.originalDate.setDate(1);\r\n this.originalDate.setMonth(this.originalDate.getMonth() - this.monthCount);\r\n this.setPeriod(this.originalDate);\r\n }\r\n }\r\n\r\n export class SemesterCalendar extends MultimonthCalendar {\r\n public get name() {\r\n return \"Semester\";\r\n }\r\n protected repositionStartDate(date: Date) {\r\n date = super.repositionStartDate(date);\r\n date.setMonth(Math.floor(date.getMonth() / 6) * 6);\r\n return date;\r\n }\r\n }\r\n\r\n interface PeriodCalendarOptions extends MultimonthCalendarOptions, PeriodCalendarPartOptions {\r\n }\r\n\r\n interface HasDateCells {\r\n getCell(date: Date): HTMLTableDataCellElement | null;\r\n }\r\n\r\n abstract class PeriodCalendarPart implements HasDateCells {\r\n public originalDate!: Date;\r\n public startDate!: Date;\r\n public abstract makePeriodInvalid(from: Date, to: Date): void;\r\n public abstract getCell(date: Date): HTMLTableDataCellElement | null;\r\n }\r\n\r\n let lastCalendar: AbstractCalendar<CalendarItem>|null = null;\r\n\r\n let popState = function (event: PopStateEvent) {\r\n if (event.state && event.state.owner === 'Calendar') {\r\n var d = window.location.search.match(/date=(\\d{4})-(\\d\\d)-(\\d\\d)/);\r\n if (d && lastCalendar) {\r\n let date = new Date(parseInt(d[1]), parseInt(d[2]) - 1, parseInt(d[3]), 0, 0, 0, 0);\r\n lastCalendar.setPeriod(date);\r\n }\r\n }\r\n };\r\n\r\n interface ScheduleDTO {\r\n Id: number;\r\n Name: string;\r\n InfoName: string;\r\n Framecolor: string;\r\n Bgcolor: string;\r\n Textcolor: string;\r\n Selected: boolean;\r\n InputName: string;\r\n ShowtimeOnScreen: number;\r\n ShowinViggo: number;\r\n }\r\n\r\n interface CalendarLoadData {\r\n date: string;\r\n type: string;\r\n [index: string]: number[]|Date|string|undefined;\r\n }\r\n\r\n interface CalendarConstructorDTO {\r\n Schedules: ScheduleDTO[];\r\n Links: CalendarLinksDTO;\r\n MaxItems: number;\r\n UserRoll: any[];\r\n Days?: number;\r\n StartHour?: number;\r\n EndHour?: number;\r\n ColumnWidth?: number;\r\n OrderHeaders: boolean;\r\n Headers: any[];\r\n CopyType: number;\r\n CopyData: number[] | null;\r\n RowHeader?: boolean;\r\n ExternalNavigation?: boolean;\r\n StartDay: number;\r\n WeekLength: number;\r\n PeriodStart?: Date;\r\n PeriodEnd?: Date;\r\n ValidPeriods?: DatePeriod[];\r\n InvalidPeriods?: DatePeriod[];\r\n Sections: CustomRowSection[];\r\n Templates: { [name: string]: string };\r\n }\r\n\r\n export function loadCalendar(element: HTMLElement | string | null, date: Date, type: string, options: CalendarConstructorDTO): any {\r\n if (typeof element == 'string') {\r\n element = <HTMLElement|null>document.querySelector(element);\r\n }\r\n if (!element) {\r\n throw new Error('Missing calender element. Needs to be HTMLElement or selector string.');\r\n }\r\n var calendars = options.Schedules;\r\n if (!calendars) {\r\n calendars = [];\r\n }\r\n date = new Date(date);\r\n let calendar: any,\r\n loadCalendars: CalendarLoadData = {\r\n date: date.format('yyyy-MM-dd'),\r\n type: type\r\n },\r\n inputDate = <HTMLInputElement|null>document.getElementById('selected-date');\r\n\r\n calendars.forEach(e => {\r\n if (e.Selected) {\r\n if (!loadCalendars[e.InputName]) {\r\n loadCalendars[e.InputName] = [];\r\n }\r\n (<number[]>loadCalendars[e.InputName]).push(e.Id);\r\n }\r\n });\r\n\r\n let properties: CalendarOptions = {\r\n element: element,\r\n links: options.Links,\r\n startDate: date,\r\n templates: options.Templates,\r\n data: loadCalendars,\r\n copyType: options.CopyType,\r\n copyData: options.CopyData,\r\n periodEnd: options.PeriodEnd || null,\r\n periodStart: options.PeriodStart || null,\r\n validPeriods: (options.ValidPeriods||[]).map(x => { return { From: new Date(x.From), To: new Date(x.To) }; }),\r\n invalidPeriods: (options.InvalidPeriods||[]).map(x => { return { From: new Date(x.From), To: new Date(x.To) }; })\r\n };\r\n\r\n if (!options.ExternalNavigation) {\r\n Object.assign(properties, {\r\n inputElementDate: inputDate,\r\n clickElementToday: document.getElementById('date-today'),\r\n clickElementNext: document.getElementById('date-next'),\r\n clickElementPrevious: document.getElementById('date-prev'),\r\n });\r\n }\r\n\r\n switch (type) {\r\n case 'day':\r\n calendar = new DayCalendar(Object.assign(properties, {\r\n element: <HTMLTableElement>element,\r\n startDay: date.getDay(),\r\n weekLength: 1\r\n }));\r\n break;\r\n case 'workweek':\r\n calendar = new WorkWeekCalendar(Object.assign(properties, {\r\n element: <HTMLTableElement>element,\r\n startDay: 1,\r\n weekLength: 5\r\n }));\r\n break;\r\n case 'week':\r\n calendar = new WeekCalendar(Object.assign(properties, {\r\n element: <HTMLTableElement>element,\r\n startDay: options.StartDay,\r\n weekLength: options.WeekLength\r\n }));\r\n break;\r\n case 'weeks':\r\n case 'month':\r\n case 'periodmonth':\r\n calendar = new MonthCalendar(Object.assign(properties, {\r\n element: element,\r\n maxItems: options.MaxItems\r\n }));\r\n break;\r\n case 'planning':\r\n calendar = new CustomHeaderCalendar(Object.assign(properties, {\r\n element: <HTMLTableElement>element,\r\n headers: options.Headers,\r\n days: options.Days,\r\n columnWidth: options.ColumnWidth,\r\n orderHeaders: options.OrderHeaders\r\n }));\r\n break;\r\n case 'customrowdetail':\r\n calendar = new CustomRowDetailCalendar(Object.assign(properties, {\r\n element: <HTMLTableElement>element,\r\n days: options.Days || 7,\r\n sections: options.Sections,\r\n startHour: options.StartHour || 0,\r\n endHour: options.EndHour || 24\r\n }));\r\n break;\r\n case 'customrowday':\r\n calendar = new CustomRowDayCalendar(Object.assign(properties, {\r\n element: <HTMLTableElement>element,\r\n days: options.Days || 30,\r\n sections: options.Sections\r\n }));\r\n break;\r\n case 'semester':\r\n calendar = new SemesterCalendar(Object.assign(properties, {\r\n element: <HTMLTableElement>element\r\n }));\r\n break;\r\n case 'period':\r\n calendar = new MultimonthCalendar(Object.assign(properties, {\r\n element: <HTMLTableElement>element\r\n }));\r\n break;\r\n default:\r\n throw new Error('Unknown calendar type');\r\n }\r\n lastCalendar = calendar;\r\n \r\n window.addEventListener('popstate', popState, false);\r\n return calendar;\r\n };\r\n\r\n export let weekcalendar = {\r\n reload: function (element?: HTMLElement|string|null) {\r\n if (typeof element == 'string') {\r\n element = <HTMLElement|null>document.querySelector(element);\r\n if (!element) {\r\n throw new Error('Element for calendar reload not found.');\r\n }\r\n }\r\n let calendar = lastCalendar;\r\n if (element) {\r\n calendar = (<any>element).viggoCalendar;\r\n }\r\n if (calendar) {\r\n calendar.reload();\r\n }\r\n },\r\n getLatestCalendar: function () {\r\n return lastCalendar;\r\n },\r\n getToolbarRelatedCalendar: function (reference: Element) {\r\n let result = reference.closest('.toolbar');\r\n if (result) {\r\n result = result.nextElementSibling;\r\n }\r\n return result ? (<any>result).viggoCalendar : null;\r\n }\r\n };\r\n}","module viggo {\r\n interface WebAuthnOptions {\r\n username: string;\r\n }\r\n enum WebAuthnStatus {\r\n ok = \"ok\",\r\n error = \"error\"\r\n }\r\n interface WebAuthnResponse {\r\n status: WebAuthnStatus;\r\n errorMessage?: string;\r\n }\r\n interface KeyPairSalt extends CryptoKeyPair {\r\n salt: Uint8Array;\r\n }\r\n interface CredentialCreator {\r\n create(options: CredentialCreationOptions): Promise<Credential|null>;\r\n get(options?: CredentialRequestOptions): Promise<Credential|null>;\r\n }\r\n interface CorceCoder {\r\n b64enc(buf: any): any;\r\n coerceToBase64Url(thing: any): any;\r\n coerceToArrayBuffer(thing: string): any;\r\n b64RawEnc(buf: any): any;\r\n }\r\n\r\n const LOCAL_STORAGE_KEY = 'viggo.webauthn';\r\n const LOCAL_STORAGE_USERNAME = LOCAL_STORAGE_KEY + '.username';\r\n const VERSION = 2;\r\n\r\n class LocalKeyPair {\r\n private password: string;\r\n private keyPair: KeyPairSalt | null;\r\n private credentialId: Uint8Array | null;\r\n private counter: number;\r\n\r\n public constructor(password: string) {\r\n this.password = password;\r\n this.keyPair = null;\r\n this.credentialId = null;\r\n this.counter = 0;\r\n }\r\n\r\n public get signCounter() {\r\n return this.counter;\r\n }\r\n\r\n public set signCounter(value: number) {\r\n let item = localStorage.getItem(LOCAL_STORAGE_KEY);\r\n if (item) {\r\n let json = JSON.parse(item);\r\n if (json) {\r\n json.signCounter = value;\r\n this.counter = value;\r\n item = JSON.stringify(json);\r\n localStorage.setItem(LOCAL_STORAGE_KEY, item);\r\n }\r\n }\r\n }\r\n\r\n public static async isSupported() {\r\n let test = new LocalKeyPair('test');\r\n let salt = new Uint8Array(12);\r\n let result = false;\r\n try {\r\n let wrappingKey = await test.getWrappingKey(salt);\r\n const keyPair = await window.crypto.subtle.generateKey(\r\n {\r\n name: 'ECDSA',\r\n namedCurve: 'P-256'\r\n },\r\n true,\r\n ['sign', 'verify']\r\n );\r\n let ivPrivate = window.crypto.getRandomValues(new Uint8Array(12));\r\n const wrappedPrivateKeyBuffer = await window.crypto.subtle.wrapKey(\r\n 'jwk',\r\n keyPair.privateKey,\r\n wrappingKey,\r\n <any>{\r\n name: 'AES-GCM',\r\n iv: ivPrivate\r\n }\r\n );\r\n\r\n\r\n await window.crypto.subtle.unwrapKey(\r\n 'jwk',\r\n wrappedPrivateKeyBuffer,\r\n wrappingKey,\r\n <any>{\r\n name: 'AES-GCM',\r\n iv: ivPrivate\r\n },\r\n <any>{\r\n name: 'ECDSA',\r\n namedCurve: 'P-256'\r\n },\r\n true,\r\n ['sign']\r\n );\r\n result = true;\r\n } catch (e) {\r\n //console.log(e);\r\n }\r\n return result;\r\n }\r\n\r\n public async getPublicKey(format: string) {\r\n if (!this.keyPair) {\r\n throw new Error(\"Must load or create before using rawId\");\r\n }\r\n if (!this.keyPair.publicKey) {\r\n throw new Error(\"Cannot get public key\");\r\n }\r\n return await window.crypto.subtle.exportKey(format, this.keyPair.publicKey);\r\n }\r\n\r\n public get privateKey() {\r\n if (!this.keyPair) {\r\n throw new Error(\"Must load or create before using privateKey\");\r\n }\r\n return this.keyPair.privateKey;\r\n }\r\n\r\n public get publicKey() {\r\n if (!this.keyPair) {\r\n throw new Error(\"Must load or create before using publicKey\");\r\n }\r\n if (!this.keyPair.publicKey) {\r\n throw new Error(\"Cannot get public key\");\r\n }\r\n return this.keyPair.publicKey;\r\n }\r\n\r\n public get salt() {\r\n if (!this.keyPair) {\r\n throw new Error(\"Must load or create before using publicKey\");\r\n }\r\n return this.keyPair.salt;\r\n }\r\n\r\n public getCredentialId() {\r\n return this.credentialId;\r\n }\r\n\r\n public async create() {\r\n const keyPair = await window.crypto.subtle.generateKey(\r\n {\r\n name: 'ECDSA',\r\n namedCurve: 'P-256'\r\n },\r\n true,\r\n ['sign', 'verify']\r\n );\r\n\r\n this.keyPair = {\r\n privateKey: keyPair.privateKey,\r\n publicKey: keyPair.publicKey,\r\n salt: window.crypto.getRandomValues(new Uint8Array(16))\r\n };\r\n this.credentialId = window.crypto.getRandomValues(new Uint8Array(16));\r\n this.counter = 0;\r\n await this.save();\r\n }\r\n private async getWrappingKey(salt: Uint8Array) {\r\n const encoder = new TextEncoder();\r\n const keyMaterial = await window.crypto.subtle.importKey(\r\n 'raw',\r\n encoder.encode(this.password),\r\n <any>{\r\n name: 'PBKDF2'\r\n },\r\n false,\r\n ['deriveBits', 'deriveKey']\r\n );\r\n const wrappingKey = await window.crypto.subtle.deriveKey(\r\n {\r\n name: 'PBKDF2',\r\n salt: salt.buffer,\r\n iterations: 100000,\r\n hash: 'SHA-256'\r\n },\r\n keyMaterial,\r\n {\r\n name: 'AES-GCM',\r\n length: 256\r\n },\r\n true,\r\n ['wrapKey', 'unwrapKey']\r\n );\r\n return wrappingKey;\r\n }\r\n private async save() {\r\n if (!this.keyPair) {\r\n throw new Error(\"Create keys before saving\");\r\n }\r\n\r\n let wrappingKey = await this.getWrappingKey(this.keyPair.salt);\r\n\r\n let ivPrivate = window.crypto.getRandomValues(new Uint8Array(12));\r\n const privateWrap = await window.crypto.subtle.wrapKey(\r\n 'jwk',\r\n this.keyPair.privateKey,\r\n wrappingKey,\r\n <any>{\r\n name: 'AES-GCM',\r\n iv: ivPrivate\r\n }\r\n );\r\n\r\n let data = {\r\n privateKey: Array.from(new Uint8Array(privateWrap)),\r\n salt: Array.from(this.keyPair.salt),\r\n credentialId: Array.from(this.credentialId!),\r\n ivPrivate: Array.from(ivPrivate)\r\n };\r\n localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify({\r\n version: VERSION,\r\n signCounter: this.counter,\r\n data: btoa(String.fromCharCode(...new Uint8Array(CBOR.encode(data))))\r\n }));\r\n }\r\n public async load() {\r\n let storage = localStorage.getItem(LOCAL_STORAGE_KEY);\r\n if (storage) {\r\n let json = JSON.parse(storage);\r\n if (json.version != VERSION || !json.data) {\r\n localStorage.removeItem(LOCAL_STORAGE_KEY);\r\n return false;\r\n }\r\n this.counter = json.signCounter;\r\n storage = <string>json.data;\r\n json = CBOR.decode(Uint8Array.from(atob(storage), x => x.charCodeAt(0)).buffer);\r\n const wrappedPrivateKeyBuffer = new Uint8Array(json.privateKey);\r\n const ivPrivate = new Uint8Array(json.ivPrivate);\r\n const salt = new Uint8Array(json.salt);\r\n\r\n const wrappingKey = await this.getWrappingKey(salt);\r\n\r\n try {\r\n const unwrappedPrivateKey = await window.crypto.subtle.unwrapKey(\r\n 'jwk',\r\n wrappedPrivateKeyBuffer,\r\n wrappingKey,\r\n <any>{\r\n name: 'AES-GCM',\r\n iv: ivPrivate\r\n },\r\n <any>{\r\n name: 'ECDSA',\r\n namedCurve: 'P-256'\r\n },\r\n true,\r\n ['sign']\r\n );\r\n\r\n this.keyPair = <any>{\r\n salt: salt,\r\n privateKey: unwrappedPrivateKey,\r\n publicKey: null\r\n };\r\n this.credentialId = new Uint8Array(json.credentialId);\r\n } catch (e) {\r\n throw new Error('Unable to unwrap key');\r\n }\r\n }\r\n return !!storage;\r\n }\r\n }\r\n\r\n class FakeCredentials implements CredentialCreator {\r\n private keyPair: LocalKeyPair;\r\n private coder: CorceCoder;\r\n private username: string;\r\n public constructor(password: string, coder: CorceCoder, username: string) {\r\n this.keyPair = new LocalKeyPair(password);\r\n this.coder = coder;\r\n this.username = username;\r\n }\r\n public static async isSupported() {\r\n return await LocalKeyPair.isSupported();\r\n }\r\n public async get(options: CredentialRequestOptions): Promise<Credential> {\r\n let makeCredentialOptions = options.publicKey!;\r\n\r\n await this.keyPair.load();\r\n\r\n let encoder = new TextEncoder();\r\n\r\n let json = {\r\n challenge: this.coder.coerceToBase64Url(makeCredentialOptions.challenge),\r\n clientExtensions: {\r\n appid: this.origin\r\n },\r\n hashAlgorithm: \"SHA-256\",\r\n origin: this.origin,\r\n type: \"webauthn.get\"\r\n };\r\n let clientDataJSON = encoder.encode(JSON.stringify(json));\r\n let authData = await this.getAuthData(false);\r\n let hash = await window.crypto.subtle.digest('SHA-256', clientDataJSON);\r\n let dataToSign = new Uint8Array(authData.byteLength + hash.byteLength);\r\n dataToSign.set(authData, 0);\r\n dataToSign.set(new Uint8Array(hash), authData.byteLength);\r\n\r\n let signature = new Uint8Array(await window.crypto.subtle.sign(\r\n {\r\n name: 'ECDSA',\r\n hash: 'SHA-256'\r\n },\r\n this.keyPair.privateKey,\r\n dataToSign\r\n ));\r\n\r\n let derSignature = new Uint8Array(signature.byteLength + 6); // signature is length 64\r\n derSignature.set([0x30, signature.byteLength], 0); // SEQUENCE byteLength\r\n derSignature.set([0x02, 32], 2); // INTEGER 32 bytes\r\n derSignature.set(signature.slice(0, 32), 4);\r\n derSignature.set([0x02, 32], 36);\r\n derSignature.set(signature.slice(32), 38);\r\n\r\n this.keyPair.signCounter += 1;\r\n\r\n return await this.getCredentials({\r\n clientDataJSON: clientDataJSON.buffer,\r\n authenticatorData: authData,\r\n signature: derSignature,\r\n userHandle: null\r\n });\r\n }\r\n private async getId() {\r\n let encoder = new TextEncoder();\r\n let user = encoder.encode(this.username);\r\n let salt = this.keyPair.salt;\r\n let data = new Uint8Array(user.byteLength + salt.byteLength);\r\n data.set(user, 0);\r\n data.set(salt, user.byteLength);\r\n return await window.crypto.subtle.digest('SHA-512', data);\r\n }\r\n private async getCredentials(response: AuthenticatorAttestationResponse | AuthenticatorAssertionResponse): Promise<PublicKeyCredential> {\r\n let rawId = await this.getId();\r\n return <PublicKeyCredential>{\r\n rawId: <ArrayBuffer>rawId,\r\n id: this.coder.coerceToBase64Url(rawId),\r\n getClientExtensionResults: function () {\r\n return new Uint8Array().buffer;\r\n },\r\n isUserVerifyingPlatformAuthenticatorAvailable: function () {\r\n return Promise.resolve(true);\r\n },\r\n response: response,\r\n type: 'public-key'\r\n };\r\n }\r\n // origin includes the port\r\n private get origin() {\r\n return window.location.protocol + '//' + window.location.host;\r\n }\r\n private async getAuthData(withPublicKey: boolean) {\r\n const encoder = new TextEncoder();\r\n const digest = await window.crypto.subtle.digest('SHA-256', encoder.encode(window.location.hostname)); // challenge doesn't include port in host\r\n const flags = withPublicKey ? 0b01000001 : 0b00000001;\r\n const signCounter = this.keyPair.signCounter + 1; // uint\r\n const aaguid = new Uint8Array(16);\r\n const credentialId = await this.getId();\r\n const credentialIdLength = credentialId.byteLength; // ushort, big endian\r\n let cborCredentialPublicKey = new Uint8Array(0).buffer;\r\n if (withPublicKey) {\r\n let jwk = <JsonWebKey>await this.keyPair.getPublicKey('jwk');\r\n const credentialPublicKey = new Map<number, any>();\r\n credentialPublicKey.set(1, 2); // The 1 field describes the key type. The value of 2 indicates that the key type is in the Elliptic Curve format.\r\n credentialPublicKey.set(3, -7); // The 3 field describes the algorithm used to generate authentication signatures. The -7 value indicates this authenticator will be using ES256.\r\n credentialPublicKey.set(-1, 1); // The -1 field describes this key's \"curve type\". The value 1 indicates the that this key uses the \"P-256\" curve.\r\n credentialPublicKey.set(-2, new Uint8Array(this.coder.coerceToArrayBuffer(jwk.x!))); // The -2 field describes the x-coordinate of this public key.\r\n credentialPublicKey.set(-3, new Uint8Array(this.coder.coerceToArrayBuffer(jwk.y!))); // The -3 field describes the y-coordinate of this public key.\r\n\r\n cborCredentialPublicKey = CBOR.encode(credentialPublicKey);\r\n }\r\n\r\n let authDataLength = digest.byteLength // origin hash\r\n + 1 // flags\r\n + 4; // sign counter\r\n\r\n if (withPublicKey) {\r\n // attested credential data\r\n authDataLength += aaguid.byteLength // aaguid\r\n + 2 // credential id length\r\n + credentialId.byteLength // credential id\r\n + cborCredentialPublicKey.byteLength; // credential public key\r\n }\r\n\r\n let authData = new Uint8Array(authDataLength);\r\n\r\n let offset = 0;\r\n authData.set(new Uint8Array(digest), offset); // origin hash\r\n offset += digest.byteLength;\r\n authData.set(new Uint8Array([flags]), offset); // flags\r\n offset += 1;\r\n authData.set(new Uint8Array(new Uint32Array([signCounter]).buffer).reverse(), offset); // sign counter\r\n if (withPublicKey) {\r\n offset += 4;\r\n authData.set(aaguid, offset); // aaguid\r\n offset += aaguid.byteLength;\r\n let credentialLengthBuffer = new Uint16Array([credentialIdLength]); // setup credential length as a 16 bit unsigned number\r\n authData.set(new Uint8Array(credentialLengthBuffer.buffer).reverse(), offset); // credential id length written as big endian\r\n offset += 2;\r\n authData.set(new Uint8Array(credentialId), offset); // credential id\r\n offset += credentialId.byteLength;\r\n authData.set(new Uint8Array(cborCredentialPublicKey), offset);\r\n }\r\n\r\n return authData;\r\n }\r\n public async create(options: CredentialCreationOptions): Promise<Credential> {\r\n await this.keyPair.create();\r\n\r\n let makeCredentialOptions = options.publicKey!;\r\n\r\n let json = {\r\n challenge: this.coder.coerceToBase64Url(makeCredentialOptions.challenge),\r\n clientExtensions: {},\r\n hashAlgorithm: \"SHA-256\",\r\n origin: this.origin,\r\n type: \"webauthn.create\"\r\n };\r\n\r\n const encoder = new TextEncoder();\r\n let attestationObject = {\r\n authData: await this.getAuthData(true),\r\n attStmt: {},\r\n fmt: 'none'\r\n };\r\n\r\n this.keyPair.signCounter += 1;\r\n return await this.getCredentials(<any>{\r\n clientDataJSON: encoder.encode(JSON.stringify(json)).buffer,\r\n attestationObject: CBOR.encode(attestationObject),\r\n getTransports: function () {\r\n return [];\r\n }\r\n });\r\n }\r\n }\r\n\r\n export class webauthn implements CorceCoder {\r\n private username: string;\r\n constructor(options: WebAuthnOptions) {\r\n this.username = options.username;\r\n }\r\n public static get isSupported() {\r\n return navigator.credentials && window.PublicKeyCredential && typeof (PublicKeyCredential) != 'undefined';\r\n }\r\n public static async isPinSupported() {\r\n return await FakeCredentials.isSupported();\r\n }\r\n public static get hasLocalPin() {\r\n let item = localStorage.getItem(LOCAL_STORAGE_KEY);\r\n if (item) {\r\n try {\r\n let data = JSON.parse(item);\r\n return data && data.version == VERSION;\r\n } catch (e) { }\r\n }\r\n return false;\r\n }\r\n public static removeLocalPin() {\r\n localStorage.removeItem(LOCAL_STORAGE_KEY);\r\n }\r\n public static getSavedUsername() {\r\n return localStorage.getItem(LOCAL_STORAGE_USERNAME);\r\n }\r\n public async createPin(password: string, device: string) {\r\n let cred = new FakeCredentials(password, this, this.username);\r\n return await this.doCreate(cred, device);\r\n }\r\n\r\n private async doCreate(authenticator: CredentialCreator, device: string) {\r\n let result: WebAuthnResponse = {\r\n status: WebAuthnStatus.error\r\n };\r\n\r\n let username = this.username;\r\n let displayName = this.username;\r\n\r\n // possible values: none, direct, indirect\r\n let attestation_type = \"none\";\r\n // possible values: <empty>, platform, cross-platform\r\n let authenticator_attachment = \"\";\r\n\r\n // possible values: preferred, required, discouraged\r\n let user_verification = \"preferred\";\r\n\r\n // possible values: true,false\r\n let require_resident_key = false;\r\n\r\n let makeCredentialOptions: PublicKeyCredentialCreationOptions;\r\n try {\r\n makeCredentialOptions = await this.createPublicKeyCredentialCreationOptions(username, displayName, attestation_type, authenticator_attachment, user_verification, require_resident_key);\r\n } catch (e) {\r\n result.errorMessage = e.message;\r\n return result;\r\n }\r\n\r\n // console.log(\"Credential Options Formatted\", makeCredentialOptions);\r\n\r\n // console.log(\"Creating PublicKeyCredential...\");\r\n let newCredential: PublicKeyCredential | null = null;\r\n try {\r\n newCredential = <PublicKeyCredential|null>await authenticator.create({\r\n publicKey: makeCredentialOptions\r\n });\r\n } catch (e) {\r\n result.errorMessage = \"Could not create credentials in browser. Probably because the username is already registered with your authenticator. Please change username or authenticator. \" + e.message\r\n return result;\r\n }\r\n\r\n //console.log(\"PublicKeyCredential Created\", newCredential);\r\n //console.log(String.fromCharCode(...new Uint8Array(newCredential.response.clientDataJSON)));\r\n //console.log(String.fromCharCode(...new Uint8Array(newCredential.getClientExtensionResults())));\r\n //console.log(CBOR.decode(((<any>newCredential.response).attestationObject)));\r\n\r\n if (newCredential) {\r\n try {\r\n await this.registerNewCredential(newCredential, device);\r\n } catch (err) {\r\n result.errorMessage = err.message;\r\n return result;\r\n }\r\n }\r\n localStorage.setItem(LOCAL_STORAGE_USERNAME, username);\r\n result.status = WebAuthnStatus.ok;\r\n return result;\r\n }\r\n private async doGet(authenticator: CredentialCreator): Promise<WebAuthnResponse> {\r\n let result: WebAuthnResponse = {\r\n status: WebAuthnStatus.error\r\n }\r\n\r\n // ask browser for credentials (browser will ask connected authenticators)\r\n let credential: PublicKeyCredential | undefined;\r\n try {\r\n let makeAssertionOptions = await this.makeAssertionOptions();\r\n credential = <PublicKeyCredential>await authenticator.get({ publicKey: makeAssertionOptions });\r\n //console.log(credential);\r\n let response = <AuthenticatorAssertionResponse>credential.response;\r\n //console.log(String.fromCharCode(...new Uint8Array(response.clientDataJSON)));\r\n //console.log(String.fromCharCode(...new Uint8Array(response.authenticatorData)));\r\n //console.log(String.fromCharCode(...new Uint8Array(response.signature)));\r\n //console.log(CBOR.decode(response.authenticatorData));\r\n } catch (err) {\r\n let msg = err.message;\r\n if (msg) {\r\n msg = msg.replace(/\\..*/, '.');\r\n msg = __(msg);\r\n }\r\n result.errorMessage = msg;\r\n return result;\r\n }\r\n\r\n if (credential) {\r\n try {\r\n await this.verifyAssertionWithServer(credential);\r\n } catch (e) {\r\n result.errorMessage = \"Could not verify assertion: \" + e.message;\r\n return result;\r\n }\r\n }\r\n result.status = WebAuthnStatus.ok;\r\n return result;\r\n }\r\n\r\n public async getPin(password: string) {\r\n let cred = new FakeCredentials(password, this, this.username);\r\n return await this.doGet(cred);\r\n }\r\n\r\n private async makeAssertionOptions() {\r\n // prepare form post data\r\n let formData = new FormData();\r\n formData.append('username', this.username);\r\n\r\n // send to server for registering\r\n let makeAssertionOptions;\r\n let res = await fetch('/Shared/WebAuthn/AssertionOptionsPost', {\r\n method: 'POST', // or 'PUT'\r\n body: formData, // data can be `string` or {object}!\r\n headers: {\r\n 'Accept': 'application/json'\r\n }\r\n });\r\n\r\n makeAssertionOptions = await res.json();\r\n\r\n // console.log(\"Assertion Options Object\", makeAssertionOptions);\r\n\r\n // show options error to user\r\n if (makeAssertionOptions.status !== \"ok\") {\r\n throw new Error(makeAssertionOptions.errorMessage);\r\n }\r\n\r\n // todo: switch this to coercebase64\r\n const challenge = makeAssertionOptions.challenge.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n makeAssertionOptions.challenge = Uint8Array.from(atob(challenge), c => c.charCodeAt(0));\r\n\r\n // fix escaping. Change this to coerce\r\n makeAssertionOptions.allowCredentials.forEach(function (listItem: any) {\r\n var fixedId = listItem.id.replace(/\\_/g, \"/\").replace(/\\-/g, \"+\");\r\n listItem.id = Uint8Array.from(atob(fixedId), c => c.charCodeAt(0));\r\n });\r\n\r\n // console.log(\"Assertion options\", makeAssertionOptions);\r\n return makeAssertionOptions;\r\n }\r\n public async get(): Promise<WebAuthnResponse> {\r\n return await this.doGet(navigator.credentials);\r\n }\r\n private async fetchMakeCredentialOptions(formData: FormData) {\r\n let response = await fetch('/Shared/WebAuthn/MakeCredentialOptions', {\r\n method: 'POST', // or 'PUT'\r\n body: formData, // data can be `string` or {object}!\r\n headers: {\r\n 'Accept': 'application/json'\r\n }\r\n });\r\n\r\n let data = await response.json();\r\n\r\n return data;\r\n }\r\n // This should be used to verify the auth data with the server\r\n private async registerCredentialWithServer(formData: FormData) {\r\n let response = await fetch('/Shared/WebAuthn/MakeCredential', {\r\n method: 'POST', // or 'PUT'\r\n body: JSON.stringify(formData), // data can be `string` or {object}!\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n }\r\n });\r\n\r\n let data = await response.json();\r\n\r\n return data;\r\n }\r\n private async registerNewCredential(newCredential: PublicKeyCredential, device: string) {\r\n // Move data into Arrays incase it is super long\r\n let attestationObject = new Uint8Array((<AuthenticatorAttestationResponse>newCredential.response).attestationObject);\r\n let clientDataJSON = new Uint8Array(newCredential.response.clientDataJSON);\r\n let rawId = new Uint8Array(newCredential.rawId);\r\n\r\n const data = {\r\n id: newCredential.id,\r\n rawId: this.coerceToBase64Url(rawId),\r\n type: newCredential.type,\r\n extensions: newCredential.getClientExtensionResults(),\r\n response: {\r\n attestationObject: this.coerceToBase64Url(attestationObject),\r\n clientDataJson: this.coerceToBase64Url(clientDataJSON)\r\n },\r\n device: device\r\n };\r\n\r\n let response;\r\n try {\r\n response = await this.registerCredentialWithServer(<any>data);\r\n } catch (e) {\r\n // console.error(e);\r\n throw e;\r\n }\r\n\r\n // console.log(\"Credential Object\", response);\r\n\r\n // show error\r\n if (response.status !== \"ok\") {\r\n throw new Error(\"Error creating credential: \" + response.errorMessage);\r\n }\r\n\r\n //console.log('Registration Successful!');\r\n\r\n // redirect to dashboard?\r\n //window.location.href = \"/dashboard/\" + state.user.displayName;\r\n }\r\n public async create(device: string): Promise<WebAuthnResponse> {\r\n return await this.doCreate(navigator.credentials, device);\r\n }\r\n private async createPublicKeyCredentialCreationOptions(username: string, displayName: string, attestation_type: string, authenticator_attachment: string, user_verification: string, require_resident_key: boolean) {\r\n // prepare form post data\r\n let data = new FormData();\r\n data.append('username', username);\r\n data.append('displayName', displayName);\r\n data.append('attType', attestation_type);\r\n data.append('authType', authenticator_attachment);\r\n data.append('userVerification', user_verification);\r\n data.append('requireResidentKey', require_resident_key.toString());\r\n\r\n // send to server for registering\r\n let makeCredentialOptions: PublicKeyCredentialCreationOptions;\r\n try {\r\n makeCredentialOptions = await this.fetchMakeCredentialOptions(data);\r\n } catch (e) {\r\n throw e;\r\n }\r\n\r\n // console.log(\"Credential Options Object\", makeCredentialOptions);\r\n\r\n if ((<any>makeCredentialOptions).status !== \"ok\") {\r\n throw new Error(\"Error creating credential options: \" + (<any>makeCredentialOptions).errorMessage);\r\n }\r\n\r\n // Turn the challenge back into the accepted format of padded base64\r\n makeCredentialOptions.challenge = this.coerceToArrayBuffer(<any>makeCredentialOptions.challenge);\r\n // Turn ID into a UInt8Array Buffer for some reason\r\n makeCredentialOptions.user.id = this.coerceToArrayBuffer(<any>makeCredentialOptions.user.id);\r\n\r\n if (makeCredentialOptions.excludeCredentials) {\r\n makeCredentialOptions.excludeCredentials = makeCredentialOptions.excludeCredentials.map((c: any) => {\r\n c.id = this.coerceToArrayBuffer(c.id);\r\n return c;\r\n });\r\n }\r\n\r\n if (makeCredentialOptions.authenticatorSelection && makeCredentialOptions.authenticatorSelection.authenticatorAttachment === null) {\r\n makeCredentialOptions.authenticatorSelection.authenticatorAttachment = undefined;\r\n }\r\n return makeCredentialOptions;\r\n }\r\n private async verifyAssertionWithServer(assertedCredential: PublicKeyCredential) {\r\n // Move data into Arrays incase it is super long\r\n let authData = new Uint8Array((<AuthenticatorAssertionResponse>assertedCredential.response).authenticatorData);\r\n let clientDataJSON = new Uint8Array(assertedCredential.response.clientDataJSON);\r\n let rawId = new Uint8Array(assertedCredential.rawId);\r\n let sig = new Uint8Array((<AuthenticatorAssertionResponse>assertedCredential.response).signature);\r\n const data = {\r\n id: assertedCredential.id,\r\n rawId: this.coerceToBase64Url(rawId),\r\n type: assertedCredential.type,\r\n extensions: assertedCredential.getClientExtensionResults(),\r\n response: {\r\n authenticatorData: this.coerceToBase64Url(authData),\r\n clientDataJson: this.coerceToBase64Url(clientDataJSON),\r\n signature: this.coerceToBase64Url(sig)\r\n }\r\n };\r\n\r\n let response;\r\n try {\r\n let res = await fetch(\"/Shared/WebAuthn/MakeAssertion\", {\r\n method: 'POST', // or 'PUT'\r\n body: JSON.stringify(data), // data can be `string` or {object}!\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n }\r\n });\r\n\r\n response = await res.json();\r\n } catch (e) {\r\n // console.error(\"Request to server failed\", e);\r\n throw e;\r\n }\r\n\r\n // console.log(\"Assertion Object\", response);\r\n\r\n // show error\r\n if (response.status !== \"ok\") {\r\n throw new Error(\"Error doing assertion: \" + response.errorMessage);\r\n }\r\n }\r\n public b64enc(buf: any) {\r\n return this.coerceToBase64Url(buf);\r\n }\r\n public coerceToBase64Url(thing: any) {\r\n // Array or ArrayBuffer to Uint8Array\r\n if (Array.isArray(thing)) {\r\n thing = Uint8Array.from(thing);\r\n }\r\n\r\n if (thing instanceof ArrayBuffer) {\r\n thing = new Uint8Array(thing);\r\n }\r\n\r\n // Uint8Array to base64\r\n if (thing instanceof Uint8Array) {\r\n thing = String.fromCharCode(...thing);\r\n thing = window.btoa(thing);\r\n }\r\n\r\n if (typeof thing != 'string') {\r\n throw new Error(\"could not coerce '\" + name + \"' to string\");\r\n }\r\n\r\n // base64 to base64url\r\n // NOTE: \"=\" at the end of challenge is optional, strip it off here\r\n thing = thing.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=*$/g, \"\");\r\n\r\n return thing;\r\n };\r\n public coerceToArrayBuffer(thing: string) {\r\n // base64url to base64\r\n thing = thing.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n\r\n // base64 to Uint8Array\r\n var str = window.atob(thing);\r\n var bytes = new Uint8Array(str.length);\r\n for (var i = 0; i < str.length; i++) {\r\n bytes[i] = str.charCodeAt(i);\r\n }\r\n return new Uint8Array(bytes).buffer;\r\n };\r\n // Don't drop any blanks\r\n public b64RawEnc(buf: any) {\r\n return this.b64enc(buf);\r\n }\r\n }\r\n}","/*\r\n * The MIT License (MIT)\r\n *\r\n * Copyright (c) 2014-2016 Patrick Gansterer <paroga@paroga.com>\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n */\r\n\r\ndeclare namespace CBOR {\r\n export function encode(data: any): ArrayBuffer;\r\n export function decode(data: ArrayBuffer): any;\r\n}\r\n\r\ndeclare interface CBOR {\r\n encode(data: any): ArrayBuffer;\r\n decode(data: ArrayBuffer): any;\r\n}\r\n\r\n(function (global, undefined) {\r\n \"use strict\";\r\n var POW_2_24 = 5.960464477539063e-8,\r\n POW_2_32 = 4294967296,\r\n POW_2_53 = 9007199254740992;\r\n\r\n function encode(value: any) {\r\n var data = new ArrayBuffer(256);\r\n var dataView = new DataView(data);\r\n var lastLength: number;\r\n var offset = 0;\r\n\r\n function prepareWrite(length: number) {\r\n var newByteLength = data.byteLength;\r\n var requiredLength = offset + length;\r\n while (newByteLength < requiredLength)\r\n newByteLength <<= 1;\r\n if (newByteLength !== data.byteLength) {\r\n var oldDataView = dataView;\r\n data = new ArrayBuffer(newByteLength);\r\n dataView = new DataView(data);\r\n var uint32count = (offset + 3) >> 2;\r\n for (var i = 0; i < uint32count; ++i)\r\n dataView.setUint32(i << 2, oldDataView.getUint32(i << 2));\r\n }\r\n\r\n lastLength = length;\r\n return dataView;\r\n }\r\n function commitWrite() {\r\n offset += lastLength;\r\n }\r\n function writeFloat64(value: number) {\r\n prepareWrite(8).setFloat64(offset, value)\r\n commitWrite();\r\n }\r\n function writeUint8(value: number) {\r\n prepareWrite(1).setUint8(offset, value)\r\n commitWrite();\r\n }\r\n function writeUint8Array(value: number[] | Uint8Array) {\r\n var dataView = prepareWrite(value.length);\r\n for (var i = 0; i < value.length; ++i)\r\n dataView.setUint8(offset + i, value[i]);\r\n commitWrite();\r\n }\r\n function writeUint16(value: number) {\r\n prepareWrite(2).setUint16(offset, value)\r\n commitWrite();\r\n }\r\n function writeUint32(value: number) {\r\n prepareWrite(4).setUint32(offset, value)\r\n commitWrite();\r\n }\r\n function writeUint64(value: number) {\r\n var low = value % POW_2_32;\r\n var high = (value - low) / POW_2_32;\r\n var dataView = prepareWrite(8);\r\n dataView.setUint32(offset, high);\r\n dataView.setUint32(offset + 4, low);\r\n commitWrite();\r\n }\r\n function writeTypeAndLength(type: number, length: number) {\r\n if (length < 24) {\r\n writeUint8(type << 5 | length);\r\n } else if (length < 0x100) {\r\n writeUint8(type << 5 | 24);\r\n writeUint8(length);\r\n } else if (length < 0x10000) {\r\n writeUint8(type << 5 | 25);\r\n writeUint16(length);\r\n } else if (length < 0x100000000) {\r\n writeUint8(type << 5 | 26);\r\n writeUint32(length);\r\n } else {\r\n writeUint8(type << 5 | 27);\r\n writeUint64(length);\r\n }\r\n }\r\n\r\n function encodeItem(value: any) {\r\n let i: number;\r\n\r\n if (value === false)\r\n return writeUint8(0xf4);\r\n if (value === true)\r\n return writeUint8(0xf5);\r\n if (value === null)\r\n return writeUint8(0xf6);\r\n if (value === undefined)\r\n return writeUint8(0xf7);\r\n\r\n switch (typeof value) {\r\n case \"number\":\r\n if (Math.floor(value) === value) {\r\n if (0 <= value && value <= POW_2_53)\r\n return writeTypeAndLength(0, value);\r\n if (-POW_2_53 <= value && value < 0)\r\n return writeTypeAndLength(1, -(value + 1));\r\n }\r\n writeUint8(0xfb);\r\n return writeFloat64(value);\r\n\r\n case \"string\":\r\n var utf8data = [];\r\n for (i = 0; i < value.length; ++i) {\r\n var charCode = value.charCodeAt(i);\r\n if (charCode < 0x80) {\r\n utf8data.push(charCode);\r\n } else if (charCode < 0x800) {\r\n utf8data.push(0xc0 | charCode >> 6);\r\n utf8data.push(0x80 | charCode & 0x3f);\r\n } else if (charCode < 0xd800) {\r\n utf8data.push(0xe0 | charCode >> 12);\r\n utf8data.push(0x80 | (charCode >> 6) & 0x3f);\r\n utf8data.push(0x80 | charCode & 0x3f);\r\n } else {\r\n charCode = (charCode & 0x3ff) << 10;\r\n charCode |= value.charCodeAt(++i) & 0x3ff;\r\n charCode += 0x10000;\r\n\r\n utf8data.push(0xf0 | charCode >> 18);\r\n utf8data.push(0x80 | (charCode >> 12) & 0x3f);\r\n utf8data.push(0x80 | (charCode >> 6) & 0x3f);\r\n utf8data.push(0x80 | charCode & 0x3f);\r\n }\r\n }\r\n\r\n writeTypeAndLength(3, utf8data.length);\r\n return writeUint8Array(utf8data);\r\n\r\n default:\r\n var length;\r\n if (Array.isArray(value)) {\r\n length = value.length;\r\n writeTypeAndLength(4, length);\r\n for (i = 0; i < length; ++i)\r\n encodeItem(value[i]);\r\n } else if (value instanceof Uint8Array) {\r\n writeTypeAndLength(2, value.length);\r\n writeUint8Array(value);\r\n } else if (value instanceof Map) {\r\n writeTypeAndLength(5, value.size);\r\n for (let row of value.entries()) {\r\n encodeItem(row[0]);\r\n encodeItem(row[1]);\r\n }\r\n } else {\r\n var keys = Object.keys(value);\r\n length = keys.length;\r\n writeTypeAndLength(5, length);\r\n for (i = 0; i < length; ++i) {\r\n var key = keys[i];\r\n encodeItem(key);\r\n encodeItem(value[key]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n encodeItem(value);\r\n\r\n if (\"slice\" in data)\r\n return data.slice(0, offset);\r\n\r\n var ret = new ArrayBuffer(offset);\r\n var retView = new DataView(ret);\r\n for (var i = 0; i < offset; ++i)\r\n retView.setUint8(i, dataView.getUint8(i));\r\n return ret;\r\n }\r\n\r\n function decode(data: ArrayBuffer, tagger?: Function, simpleValue?: Function) {\r\n var dataView = new DataView(data);\r\n var offset = 0;\r\n\r\n if (typeof tagger !== \"function\")\r\n tagger = function (value: any) { return value; };\r\n if (typeof simpleValue !== \"function\")\r\n simpleValue = function () { return undefined; };\r\n\r\n function commitRead(length: number, value: any) {\r\n offset += length;\r\n return value;\r\n }\r\n function readArrayBuffer(length: number) {\r\n return commitRead(length, new Uint8Array(data, offset, length));\r\n }\r\n function readFloat16() {\r\n var tempArrayBuffer = new ArrayBuffer(4);\r\n var tempDataView = new DataView(tempArrayBuffer);\r\n var value = readUint16();\r\n\r\n var sign = value & 0x8000;\r\n var exponent = value & 0x7c00;\r\n var fraction = value & 0x03ff;\r\n\r\n if (exponent === 0x7c00)\r\n exponent = 0xff << 10;\r\n else if (exponent !== 0)\r\n exponent += (127 - 15) << 10;\r\n else if (fraction !== 0)\r\n return (sign ? -1 : 1) * fraction * POW_2_24;\r\n\r\n tempDataView.setUint32(0, sign << 16 | exponent << 13 | fraction << 13);\r\n return tempDataView.getFloat32(0);\r\n }\r\n function readFloat32() {\r\n return commitRead(4, dataView.getFloat32(offset));\r\n }\r\n function readFloat64() {\r\n return commitRead(8, dataView.getFloat64(offset));\r\n }\r\n function readUint8() {\r\n return commitRead(1, dataView.getUint8(offset));\r\n }\r\n function readUint16() {\r\n return commitRead(2, dataView.getUint16(offset));\r\n }\r\n function readUint32() {\r\n return commitRead(4, dataView.getUint32(offset));\r\n }\r\n function readUint64() {\r\n return readUint32() * POW_2_32 + readUint32();\r\n }\r\n function readBreak() {\r\n if (dataView.getUint8(offset) !== 0xff)\r\n return false;\r\n offset += 1;\r\n return true;\r\n }\r\n function readLength(additionalInformation: number) {\r\n if (additionalInformation < 24)\r\n return additionalInformation;\r\n if (additionalInformation === 24)\r\n return readUint8();\r\n if (additionalInformation === 25)\r\n return readUint16();\r\n if (additionalInformation === 26)\r\n return readUint32();\r\n if (additionalInformation === 27)\r\n return readUint64();\r\n if (additionalInformation === 31)\r\n return -1;\r\n throw \"Invalid length encoding\";\r\n }\r\n function readIndefiniteStringLength(majorType: number) {\r\n var initialByte = readUint8();\r\n if (initialByte === 0xff)\r\n return -1;\r\n var length = readLength(initialByte & 0x1f);\r\n if (length < 0 || (initialByte >> 5) !== majorType)\r\n throw \"Invalid indefinite length element\";\r\n return length;\r\n }\r\n\r\n function appendUtf16Data(utf16data: number[], length: number) {\r\n for (var i = 0; i < length; ++i) {\r\n var value = readUint8();\r\n if (value & 0x80) {\r\n if (value < 0xe0) {\r\n value = (value & 0x1f) << 6\r\n | (readUint8() & 0x3f);\r\n length -= 1;\r\n } else if (value < 0xf0) {\r\n value = (value & 0x0f) << 12\r\n | (readUint8() & 0x3f) << 6\r\n | (readUint8() & 0x3f);\r\n length -= 2;\r\n } else {\r\n value = (value & 0x0f) << 18\r\n | (readUint8() & 0x3f) << 12\r\n | (readUint8() & 0x3f) << 6\r\n | (readUint8() & 0x3f);\r\n length -= 3;\r\n }\r\n }\r\n\r\n if (value < 0x10000) {\r\n utf16data.push(value);\r\n } else {\r\n value -= 0x10000;\r\n utf16data.push(0xd800 | (value >> 10));\r\n utf16data.push(0xdc00 | (value & 0x3ff));\r\n }\r\n }\r\n }\r\n\r\n function decodeItem(): any {\r\n var initialByte = readUint8();\r\n var majorType = initialByte >> 5;\r\n var additionalInformation = initialByte & 0x1f;\r\n var i;\r\n var length;\r\n\r\n if (majorType === 7) {\r\n switch (additionalInformation) {\r\n case 25:\r\n return readFloat16();\r\n case 26:\r\n return readFloat32();\r\n case 27:\r\n return readFloat64();\r\n }\r\n }\r\n\r\n length = readLength(additionalInformation);\r\n if (length < 0 && (majorType < 2 || 6 < majorType))\r\n throw \"Invalid length\";\r\n\r\n switch (majorType) {\r\n case 0:\r\n return length;\r\n case 1:\r\n return -1 - length;\r\n case 2:\r\n if (length < 0) {\r\n var elements = [];\r\n var fullArrayLength = 0;\r\n while ((length = readIndefiniteStringLength(majorType)) >= 0) {\r\n fullArrayLength += length;\r\n elements.push(readArrayBuffer(length));\r\n }\r\n var fullArray = new Uint8Array(fullArrayLength);\r\n var fullArrayOffset = 0;\r\n for (i = 0; i < elements.length; ++i) {\r\n fullArray.set(elements[i], fullArrayOffset);\r\n fullArrayOffset += elements[i].length;\r\n }\r\n return fullArray;\r\n }\r\n return readArrayBuffer(length);\r\n case 3:\r\n var utf16data: number[] = [];\r\n if (length < 0) {\r\n while ((length = readIndefiniteStringLength(majorType)) >= 0)\r\n appendUtf16Data(utf16data, length);\r\n } else\r\n appendUtf16Data(utf16data, length);\r\n return String.fromCharCode.apply(null, utf16data);\r\n case 4:\r\n var retArray;\r\n if (length < 0) {\r\n retArray = [];\r\n while (!readBreak())\r\n retArray.push(decodeItem());\r\n } else {\r\n retArray = new Array(length);\r\n for (i = 0; i < length; ++i)\r\n retArray[i] = decodeItem();\r\n }\r\n return retArray;\r\n case 5:\r\n var retObject: any = {};\r\n for (i = 0; i < length || length < 0 && !readBreak(); ++i) {\r\n var key = decodeItem();\r\n retObject[key] = decodeItem();\r\n }\r\n return retObject;\r\n case 6:\r\n return tagger!(decodeItem(), length);\r\n case 7:\r\n switch (length) {\r\n case 20:\r\n return false;\r\n case 21:\r\n return true;\r\n case 22:\r\n return null;\r\n case 23:\r\n return undefined;\r\n default:\r\n return simpleValue!(length);\r\n }\r\n }\r\n }\r\n\r\n var ret = decodeItem();\r\n if (offset !== data.byteLength)\r\n throw \"Remaining bytes\";\r\n return ret;\r\n }\r\n\r\n var obj = { encode: encode, decode: decode };\r\n\r\n global.CBOR = obj;\r\n})(this);","module viggo {\r\n export class ping {\r\n protected delay: number = 10 * 60 * 1000;\r\n protected timeout: number = 0;\r\n protected static instance: ping;\r\n private static logId = viggo.cookie.getCookie('LogId');\r\n protected constructor() { }\r\n private isLoggedIn() {\r\n return viggo.isLoggedIn() && !document.getElementById('login-window');\r\n }\r\n protected ping() {\r\n if (this.isLoggedIn() && window.navigator.onLine) {\r\n if (ping.logId != viggo.cookie.getCookie('LogId')) {\r\n window.location.href = \"/\";\r\n return;\r\n }\r\n let err = () => {\r\n if (!viggo.isMobileApp) {\r\n viggo.notice(NoticeType.warning, __('You have been logged out for inactivity'), -1);\r\n var tag = document.body.appendChild(viggo.dom.tag('div', { id: 'login-window' }));\r\n new viggo.ajax({\r\n method: 'get',\r\n url: '/Basic/Account/LoginWindow',\r\n complete: (html: DocumentFragment) => tag.appendChild(html)\r\n });\r\n }\r\n };\r\n new viggo.ajax({\r\n method: 'get',\r\n url: '/Basic/Ping',\r\n progress: false,\r\n convert: false,\r\n error: err,\r\n complete: (data: string) => {\r\n if (data != \"pung\" && this.isLoggedIn()) {\r\n err();\r\n }\r\n }\r\n });\r\n } else {\r\n this.reset();\r\n // TODO: set eventlistener for window.navigator.onLine\r\n }\r\n }\r\n protected static getInstance(): ping {\r\n if (!this.instance) {\r\n this.instance = new ping();\r\n }\r\n return this.instance;\r\n }\r\n protected reset() {\r\n clearTimeout(this.timeout);\r\n this.timeout = window.setTimeout(() => {\r\n this.ping();\r\n }, this.delay);\r\n }\r\n public static ping() {\r\n this.getInstance().ping();\r\n }\r\n public static reset() {\r\n this.getInstance().reset();\r\n }\r\n public static removeLoginWindow() {\r\n let e = document.getElementById('login-window');\r\n if (e) {\r\n e.remove();\r\n ping.ping();\r\n }\r\n }\r\n }\r\n ping.reset();\r\n}\r\nwindow.addEventListener('visibilitychange', function () {\r\n if (document.visibilityState == 'visible') {\r\n viggo.ping.ping();\r\n }\r\n}, false);\r\nwindow.addEventListener('online', function () {\r\n viggo.ping.ping();\r\n}, false);","/*\r\nEffects:\r\nExample:\r\n viggo.effect({\r\n element: document.getElementById('test'),\r\n style: 'opacity',\r\n from: 1,\r\n to: 0,\r\n duration: 500, // default: 1000\r\n type: 'sine', // default: 'sine'\r\n complete: function() { // default: function(){}\r\n var a = document.getElementById('test');\r\n a.parentNode.removeChild(a);\r\n }\r\n });\r\n\r\nObject-properties:\r\n element: DOM-element or id\r\n style: CSS-style property\r\n from: Initial value\r\n to: Final value\r\n duration: Effect-duration in miliseconds,\r\n type: How the effect glides. Included is: easeinout, root, easein, easeout, linear, sine, flicker, wobble, pulse, spring\r\n complete: function to run after the effect has finished.\r\n */\r\n\r\ninterface EffectOptions {\r\n element: Element | Element[] | null,\r\n style: string | EffectStyleCalculator,\r\n from: number | string,\r\n to: number | string,\r\n duration?: number,\r\n removeStyle?: boolean,\r\n type?: string | EffectTypeCalculator,\r\n fps?: number,\r\n complete?: (this: viggo.effect) => void\r\n}\r\n\r\ntype EffectTypeCalculator = (a: number, b?: number) => number;\r\ntype EffectStyleCalculator = (start: number | string, end: number | string, index: number) => string | void;\r\n\r\nmodule viggo {\r\n export class effect implements EffectOptions {\r\n private static browserPrefix: { [index: string]: boolean } = { transform: true };\r\n private static prefixes = ['webkit', 'moz', 'ms', 'o'];\r\n public static durationFactor: number = 1;\r\n private stopped: boolean | number = false;\r\n\r\n element: Element | Element[] | null;\r\n style: string | EffectStyleCalculator;\r\n from: number | string;\r\n to: number | string;\r\n duration: number = 1000;\r\n removeStyle: boolean = false;\r\n type: EffectTypeCalculator = effect.types.linear;\r\n fps: number = 0;\r\n complete: () => void = (() => { });\r\n\r\n constructor(object: EffectOptions) {\r\n Object.assign(this, object);\r\n this.element = object.element;\r\n this.style = object.style;\r\n this.from = object.from;\r\n this.to = object.to;\r\n this.duration *= effect.durationFactor;\r\n\r\n let property = typeof object.style == 'string' ? effect.styleToProperty(object.style) : null;\r\n let start = Date.now();\r\n if (typeof object.element === 'string') {\r\n this.element = document.getElementById(object.element);\r\n }\r\n if (!this.element) {\r\n return;\r\n }\r\n if (object.type) {\r\n this.type = typeof object.type == 'string' ? effect.types[object.type] : object.type;\r\n }\r\n let callback = typeof object.style == 'function' ? object.style : effect.styles[object.style];\r\n let lastFrameTimestamp = 0;\r\n\r\n let animate = () => {\r\n let time = Date.now();\r\n if (!this.stopped) {\r\n if (this.fps > 0) {\r\n if (time - lastFrameTimestamp < 1000 / this.fps) {\r\n requestAnimationFrame(animate);\r\n return;\r\n } else {\r\n lastFrameTimestamp = time;\r\n }\r\n }\r\n let index = this.duration <= 0 ? 1 : (time - start) / this.duration;\r\n if (index >= 1) {\r\n index = 1;\r\n }\r\n let style: string;\r\n var f = function (e: HTMLElement) {\r\n let prop: any = <string>property;\r\n e.style[prop] = style;\r\n if (effect.browserPrefix[prop]) {\r\n let prefixProperty = (<string>property).replace(/^[a-z]/, a => a.toUpperCase());\r\n effect.prefixes.forEach(x => {\r\n prop = x + prefixProperty;\r\n e.style[prop] = style;\r\n });\r\n }\r\n };\r\n if (typeof object.style == 'string') {\r\n style = <string>callback(object.from, object.to, this.type(index));\r\n if (object.element!.constructor == Array) {\r\n (<HTMLElement[]>object.element).forEach(x => f.call(this, x));\r\n } else {\r\n f.call(this, <HTMLElement>object.element);\r\n }\r\n } else {\r\n callback.call(this, object.from, object.to, this.type(index));\r\n }\r\n if (index < 1) {\r\n requestAnimationFrame(animate);\r\n } else {\r\n if (object.removeStyle) {\r\n style = '';\r\n if (object.element!.constructor == Array) {\r\n (<HTMLElement[]>object.element).forEach(x => f.call(this, x));\r\n } else {\r\n f.call(this, <HTMLElement>object.element);\r\n }\r\n }\r\n this.complete.call(this);\r\n effect.runningEffects = Math.max(effect.runningEffects - 1, 0);\r\n }\r\n } else {\r\n if (this.stopped === 1) {\r\n this.complete.call(this);\r\n } else if (this.stopped === 2) {\r\n setTimeout(() => {\r\n this.complete.call(this);\r\n }, Math.max(this.duration - (time - start), 1));\r\n }\r\n }\r\n }\r\n effect.runningEffects++;\r\n animate();\r\n }\r\n\r\n public stop(callComplete: boolean, waitDuration: boolean) {\r\n if (!this.stopped) {\r\n effect.runningEffects = Math.max(effect.runningEffects - 1, 0);\r\n }\r\n this.stopped = true;\r\n if (callComplete) {\r\n this.stopped = 1;\r\n if (waitDuration) {\r\n this.stopped = 2;\r\n }\r\n }\r\n }\r\n\r\n public static isIdle = (function () {\r\n let lastIdleTime: number = 0;\r\n return function (delayTime: number = 0) {\r\n effect.runningEffects = Math.max(effect.runningEffects, 0);\r\n if (effect.runningEffects) {\r\n lastIdleTime = 0;\r\n } else if (!lastIdleTime) {\r\n lastIdleTime = Date.now();\r\n }\r\n return !effect.runningEffects && (Date.now() - lastIdleTime) >= delayTime;\r\n }\r\n }());\r\n\r\n public static styleCalc(style: string, from: number | string, to: number | string, index: number) {\r\n return effect.styles[style](from, to, index);\r\n };\r\n\r\n public static types: { [index: string]: EffectTypeCalculator } = {\r\n easeinout: (a: number, b: number = 3): number => {\r\n b = b - b % 2 + 1;\r\n return a < 0.5 ? Math.pow(a * 2, b) / 2 : Math.pow((a - 1) * 2, b) / 2 + 1;\r\n },\r\n root: (a: number, b: number = 2): number => {\r\n return Math.pow(a, 1 / b);\r\n },\r\n elastic: (x: number): number => {\r\n return (-Math.cos(x * Math.PI - Math.PI) + Math.pow(2 * x, 2) - 1) / 2;\r\n //return -Math.pow(x-1, 5)+2*x-1; // a bit slower\r\n },\r\n easeout: (a: number): number => {\r\n return Math.sqrt(1 - Math.pow(a - 1, 2));\r\n },\r\n easein: (a: number): number => {\r\n return 1 - Math.sqrt(1 - Math.pow(a, 2));\r\n },\r\n linear: (a: number): number => {\r\n return a;\r\n },\r\n sine: (a: number): number => {\r\n return -Math.cos(a * Math.PI) / 2 + 0.5;\r\n },\r\n flicker: (a: number): number => {\r\n a = -Math.cos(a * Math.PI) / 4 + 0.75 + Math.random() / 4;\r\n return a > 1 ? 1 : a;\r\n },\r\n wobble: (a: number): number => {\r\n return -Math.cos(a * Math.PI * (9 * a)) / 2 + 0.5;\r\n },\r\n pulse: (a: number, b: number = 5): number => {\r\n return Math.round(a % (1 / b) * b) == 0 ? a * b * 2 - Math.floor(a * b * 2) : 1 - (a * b * 2 - Math.floor(a * b * 2));\r\n },\r\n spring: (a: number): number => {\r\n return 1 - Math.cos(a * 4.5 * Math.PI) * Math.exp(-a * 6);\r\n }\r\n }\r\n\r\n private static runningEffects: number = 0;\r\n\r\n public static calc(start: number, end: number, index: number): number {\r\n return start - index * (start - end);\r\n }\r\n public static styleToProperty(style: string): string {\r\n if (style == 'float') {\r\n style = 'cssFloat';\r\n } else {\r\n style = style.replace(/-([a-z])/, function (a, l) {\r\n return l.toUpperCase();\r\n });\r\n }\r\n return style;\r\n }\r\n private static styles: { [index: string]: EffectStyleCalculator } = Object.assign({},\r\n viggo.mapValues(('width height top right bottom left max-width min-width max-height min-height background-position-x background-position-y' +\r\n 'margin margin-top margin-right margin-bottom margin-left ' +\r\n 'padding padding-top padding-right padding-bottom padding-left ' +\r\n 'border-width border-top-width border-right-width border-bottom-width border-left-width ' +\r\n 'font-size letter-spacing word-spacing line-height text-indent vertical-align').split(' '), (start: number | string, end: number | string, index: number) => {\r\n if (typeof start == 'string') {\r\n return start.replace(/^-?(?:\\d+.)?\\d+/, (): string => {\r\n return effect.calc(parseFloat(<string>start), parseFloat(<string>end), index) + '';\r\n });\r\n } else {\r\n return effect.calc(start, parseFloat(<string>end), index) + 'px';\r\n }\r\n }),\r\n viggo.mapValues(['box-shadow', 'text-shadow'], (from: string, to: string, index: number) => {\r\n var f = from.split(' ');\r\n var t = to.split(' ');\r\n for (var i = 0; i < f.length; i++) {\r\n if (f[i].match(/^\\d+/)) {\r\n f[i] = <string>effect.styles.top(parseFloat(f[i]), t[i], index);\r\n } else {\r\n f[i] = <string>effect.styles.color(f[i], t[i], index);\r\n }\r\n }\r\n return f.join(' ');\r\n }),\r\n viggo.mapValues(['transform'], (from: string, to: string, index: number) => {\r\n var i = 0;\r\n var fromValues: number[] = [], toValues: number[] = [];\r\n var regexFloats = /[0-9]+(?:\\.[0-9]+)?|\\.[0-9]+/g;\r\n var regexBracket = /\\([^\\)]+\\)/g;\r\n from = from.replace(regexBracket, function (s) {\r\n return s.replace(regexFloats, function (x) {\r\n fromValues.push(parseFloat(x));\r\n return '{' + (i++) + '}';\r\n });\r\n });\r\n to.replace(regexBracket, (s: string) => {\r\n s.replace(regexFloats, (x: string) => {\r\n toValues.push(parseFloat(x));\r\n return x;\r\n });\r\n return s;\r\n });\r\n return from.replace(/\\{([0-9]+)\\}/g, function (all: string, num: number) {\r\n return effect.calc(fromValues[num], toValues[num], index) + '';\r\n });\r\n }),\r\n viggo.mapValues(('background-color color outline-color' +\r\n 'border-color border-top-color border-right-color border-bottom-color border-left-color').split(' '), (() => {\r\n let colors: any = {\r\n maroon: \"#800000\", red: \"#ff0000\", orange: \"#ffA500\", yellow: \"#ffff00\", olive: \"#808000\",\r\n purple: \"#800080\", fuchsia: \"#ff00ff\", white: \"#ffffff\", lime: \"#00ff00\", green: \"#008000\",\r\n navy: \"#000080\", blue: \"#0000ff\", aqua: \"#00ffff\", teal: \"#008080\",\r\n black: \"#000000\", silver: \"#c0c0c0\", gray: \"#808080\"\r\n };\r\n let regex: RegExp[] = [\r\n /^rgba\\(([0-9]+),\\s*([0-9]+),\\s*([0-9]+),\\s*([01]?(?:\\.[0-9]+)?)\\)$/,\r\n /^rgb\\(([0-9]+),\\s*([0-9]+)\\s*([0-9]+)\\)$/,\r\n /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i,\r\n /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i\r\n ];\r\n interface Color {\r\n r: number,\r\n g: number,\r\n b: number,\r\n a: number\r\n }\r\n let func = [\r\n (all: string, r: string, g: string, b: string, a: string): Color => {\r\n return { r: parseInt(r, 10), g: parseInt(g, 10), b: parseInt(b, 10), a: parseFloat(a) };\r\n },\r\n (all: string, r: string, g: string, b: string): Color => {\r\n return { r: parseInt(r, 10), g: parseInt(g, 10), b: parseInt(b, 10), a: 1 };\r\n },\r\n (all: string, r: string, g: string, b: string): Color => {\r\n return { r: parseInt(r, 16), g: parseInt(g, 16), b: parseInt(b, 16), a: 1 };\r\n },\r\n (all: string, r: string, g: string, b: string): Color => {\r\n return { r: parseInt(r, 16) * 16, g: parseInt(g, 16) * 16, b: parseInt(b, 16) * 16, a: 1 };\r\n }\r\n ];\r\n\r\n return (start: string, end: string, index: number): string => {\r\n if (start in colors)\r\n start = <string>colors[start];\r\n if (end in colors)\r\n end = <string>colors[end];\r\n let c1: Color | null = null;\r\n let c2: Color | null = null;\r\n\r\n let i = 0;\r\n for (let reg of regex) {\r\n if (!c1) {\r\n let m = start.match(reg);\r\n if (m) {\r\n c1 = func[i].apply<null, string[], Color | null>(null, m);\r\n }\r\n }\r\n if (!c2) {\r\n let m = end.match(reg);\r\n if (m) {\r\n c2 = func[i].apply<null, string[], Color>(null, m);\r\n }\r\n }\r\n i++;\r\n }\r\n if (c1 && c2) {\r\n return 'rgba(' +\r\n Math.round(effect.calc(c1.r, c2.r, index)) + ',' +\r\n Math.round(effect.calc(c1.g, c2.g, index)) + ',' +\r\n Math.round(effect.calc(c1.b, c2.b, index)) + ',' +\r\n effect.calc(c1.a, c2.a, index) +\r\n ')';\r\n } else {\r\n return '';\r\n }\r\n };\r\n })()),\r\n viggo.mapValues(['background-position'], function (start: string, end: string, index: number): string {\r\n let s = start.split(' ');\r\n let e = end.split(' ');\r\n return effect.calc(parseFloat(s[0]), parseFloat(e[0]), index) + 'px ' + effect.calc(parseFloat(s[1]), parseFloat(e[1]), index) + 'px';\r\n }),\r\n viggo.mapValues(['opacity'], function (start: number | string, end: number | string, index: number) {\r\n return effect.calc(parseFloat(<string>start), parseFloat(<string>end), index).toString();\r\n })\r\n );\r\n\r\n public static show(element: HTMLElement) {\r\n return new viggo.effect({\r\n element: element,\r\n from: 0,\r\n to: 1,\r\n style: 'opacity',\r\n duration: 400\r\n });\r\n };\r\n\r\n public static graph(func: string | EffectTypeCalculator) {\r\n var canvas = <HTMLCanvasElement>viggo.dom.tag('canvas', {\r\n width: 100,\r\n height: 100,\r\n style: {\r\n width: '100px',\r\n height: '100px',\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n margin: '-50px 0 0 -50px',\r\n boxShadow: '0 0 10px black',\r\n zIndex: 2000\r\n },\r\n onclick: function () {\r\n this.parentNode.removeChild(this);\r\n }\r\n });\r\n canvas.width = 100;\r\n canvas.height = 100;\r\n document.body.appendChild(canvas);\r\n if (typeof func == 'string') {\r\n func = effect.types[func];\r\n }\r\n let context = canvas.getContext('2d');\r\n if (context) {\r\n context.fillStyle = 'white';\r\n context.fillRect(0, 0, 100, 100);\r\n context.strokeStyle = 'black';\r\n context.beginPath();\r\n context.moveTo(0, 100);\r\n for (var x = 0; x <= 100; x++) {\r\n context.lineTo(x, (1 - func(x / 100)) * 100);\r\n }\r\n context.stroke();\r\n }\r\n return canvas;\r\n }\r\n }\r\n\r\n export function toggleHeight(element: HTMLElement | string | null, hideClass?: string, minHeight: number = 0, hideLinkClass?: string) {\r\n if (typeof element === 'string') {\r\n element = <HTMLElement>document.getElementById(element) || document.querySelector(element);\r\n }\r\n\r\n if (!element) {\r\n return;\r\n }\r\n\r\n if (hideClass) {\r\n var classes = document.getElementsByClassName(hideClass);\r\n for (var i = 0; i < classes.length; i++) {\r\n var elm = <HTMLElement>classes[i];\r\n if (elm != element && elm.style.display != 'none') {\r\n (function (ownElement) {\r\n ownElement.style.overflow = 'hidden';\r\n new viggo.effect({\r\n element: ownElement,\r\n from: ownElement.offsetHeight,\r\n to: 0,\r\n style: 'height',\r\n type: 'easeinout',\r\n duration: 200,\r\n complete: function () {\r\n ownElement.style.display = 'none';\r\n }\r\n });\r\n }(elm));\r\n }\r\n }\r\n }\r\n\r\n if (hideLinkClass) {\r\n var classesLink = document.getElementsByClassName(hideLinkClass);\r\n for (var i = 0; i < classesLink.length; i++) {\r\n var elm2 = classesLink[i];\r\n elm2.className += ' hide';\r\n }\r\n }\r\n\r\n\r\n let visible = minHeight ? minHeight <= element.clientHeight : element.style.display != 'none';\r\n element.style.display = 'grid';\r\n element.style.overflow = 'hidden';\r\n element.style.height = '';\r\n let height = element.offsetHeight;\r\n new viggo.effect({\r\n element: element,\r\n from: visible ? height : minHeight,\r\n to: visible ? minHeight : height,\r\n style: 'height',\r\n type: 'easeinout',\r\n duration: 200,\r\n complete: () => {\r\n if (visible && element) {\r\n if (!minHeight) {\r\n (<HTMLElement>element).style.display = 'none';\r\n }\r\n } else if (element) {\r\n (<HTMLElement>element).style.height = '';\r\n (<HTMLElement>element).style.overflow = '';\r\n (<HTMLElement>element).style.display = '';\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Expands the element to the highest \r\n * @param element\r\n * @param hideClass\r\n * @param minHeight\r\n * @param hideLinkClass\r\n */\r\n export function expandHeight(element: HTMLElement | string | null, hideClass?: string, minHeight: number = 0, hideLinkClass?: string, displayType?: string) {\r\n if (typeof element === 'string') {\r\n element = <HTMLElement>document.getElementById(element) || document.querySelector(element);\r\n }\r\n\r\n if (!element) {\r\n return;\r\n }\r\n\r\n if (hideClass) {\r\n var classes = document.getElementsByClassName(hideClass);\r\n for (var i = 0; i < classes.length; i++) {\r\n var elm = <HTMLElement>classes[i];\r\n if (elm != element && elm.style.display != 'none') {\r\n (function (ownElement) {\r\n ownElement.style.overflow = 'hidden';\r\n new viggo.effect({\r\n element: ownElement,\r\n from: ownElement.offsetHeight,\r\n to: 0,\r\n style: 'height',\r\n type: 'easeinout',\r\n duration: 200,\r\n complete: function () {\r\n ownElement.style.display = 'none';\r\n }\r\n });\r\n }(elm));\r\n }\r\n }\r\n }\r\n\r\n if (hideLinkClass) {\r\n var classesLink = document.getElementsByClassName(hideLinkClass);\r\n for (var i = 0; i < classesLink.length; i++) {\r\n var elm2 = classesLink[i];\r\n elm2.className += ' hide';\r\n }\r\n }\r\n\r\n\r\n let visible = minHeight ? minHeight <= element.clientHeight : element.style.display != 'none';\r\n\r\n if (visible) {\r\n return;\r\n }\r\n\r\n element.style.display = 'grid';\r\n element.style.overflow = 'hidden';\r\n element.style.height = '';\r\n let height = element.offsetHeight;\r\n new viggo.effect({\r\n element: element,\r\n from: minHeight,\r\n to: height,\r\n style: 'height',\r\n type: 'easeinout',\r\n duration: 200,\r\n complete: () => {\r\n if (!visible && element) {\r\n (<HTMLElement>element).style.height = '';\r\n (<HTMLElement>element).style.overflow = '';\r\n (<HTMLElement>element).style.display = displayType || '';\r\n }\r\n }\r\n });\r\n }\r\n\r\n export function collapseHeight(element: HTMLElement | string | null, hideClass?: string, minHeight: number = 0, hideLinkClass?: string) {\r\n if (typeof element === 'string') {\r\n element = <HTMLElement>document.getElementById(element) || document.querySelector(element);\r\n }\r\n\r\n if (!element) {\r\n return;\r\n }\r\n\r\n if (hideClass) {\r\n var classes = document.getElementsByClassName(hideClass);\r\n for (var i = 0; i < classes.length; i++) {\r\n var elm = <HTMLElement>classes[i];\r\n if (elm != element && elm.style.display != 'none') {\r\n (function (ownElement) {\r\n ownElement.style.overflow = 'hidden';\r\n new viggo.effect({\r\n element: ownElement,\r\n from: ownElement.offsetHeight,\r\n to: 0,\r\n style: 'height',\r\n type: 'easeinout',\r\n duration: 200,\r\n complete: function () {\r\n ownElement.style.display = 'none';\r\n }\r\n });\r\n }(elm));\r\n }\r\n }\r\n }\r\n\r\n if (hideLinkClass) {\r\n var classesLink = document.getElementsByClassName(hideLinkClass);\r\n for (var i = 0; i < classesLink.length; i++) {\r\n var elm2 = classesLink[i];\r\n elm2.className += ' hide';\r\n }\r\n }\r\n\r\n let visible = minHeight ? minHeight <= element.clientHeight : element.style.display != 'none';\r\n\r\n if (!visible) {\r\n return;\r\n }\r\n\r\n element.style.display = 'grid';\r\n element.style.overflow = 'hidden';\r\n element.style.height = '';\r\n let height = element.offsetHeight;\r\n new viggo.effect({\r\n element: element,\r\n from: height,\r\n to: minHeight,\r\n style: 'height',\r\n type: 'easeinout',\r\n duration: 200,\r\n complete: () => {\r\n if (visible && element) {\r\n if (!minHeight) {\r\n (<HTMLElement>element).style.display = 'none';\r\n }\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","module viggo {\r\n\r\n abstract class AbstractPicker {\r\n protected domContainer: HTMLElement;\r\n protected date!: Date;\r\n protected owner?: Element;\r\n protected callback: ((date: Date | Date[]) => void) | null = null;\r\n constructor(options: PickerOptions) {\r\n this.initialize(options);\r\n this.domContainer = this.createDomContainer(options.className);\r\n if (options.footerElement) {\r\n this.domContainer.appendChild(options.footerElement);\r\n }\r\n if (options.headerElement) {\r\n this.domContainer.insertBefore(options.headerElement, this.domContainer.firstChild);\r\n }\r\n this.repaint(this.date);\r\n this.appendContainer();\r\n }\r\n protected initialize(options: PickerOptions) {\r\n this.date = new Date(options.date);\r\n this.owner = options.owner;\r\n this.callback = options.callback || null;\r\n }\r\n protected createDomContainer(className?: string): HTMLElement {\r\n return viggo.dom.tag('div', {\r\n className: className || '',\r\n style: { position: 'relative' },\r\n onmousedown: (event: MouseEvent) => {\r\n event.stopPropagation();\r\n }\r\n });\r\n }\r\n protected appendContainer() {\r\n if (this.owner) {\r\n this.owner.appendChild(this.domContainer);\r\n }\r\n }\r\n protected abstract repaint(date: Date): void;\r\n }\r\n\r\n enum PickerMode {\r\n day = \"day\",\r\n month = \"month\",\r\n year = \"year\"\r\n }\r\n\r\n interface PickerOptions {\r\n date: Date,\r\n className?: string,\r\n headerElement?: Element,\r\n footerElement?: Element,\r\n callback?: (date: Date|Date[]) => void,\r\n owner?: Element\r\n }\r\n\r\n interface DatePickerOptions extends PickerOptions {\r\n multiselect?: boolean,\r\n intervalStart?: Date,\r\n intervalEnd?: Date\r\n }\r\n\r\n interface WeekPickerOptions extends DatePickerOptions {\r\n\r\n }\r\n\r\n interface DatePickerInputOptions extends DatePickerOptions {\r\n input: HTMLInputElement\r\n }\r\n\r\n interface TimePickerInputOptions extends PickerOptions {\r\n input: HTMLInputElement,\r\n minuteinterval?: number,\r\n seconds?: boolean,\r\n secondinterval?: number\r\n }\r\n\r\n interface PickerEventDetail {\r\n newDate: Date|Date[],\r\n oldDate: Date\r\n }\r\n\r\n export type DatePickerEvent = CustomEvent<PickerEventDetail>;\r\n\r\n export class DatePicker extends AbstractPicker {\r\n private selected: HTMLTableDataCellElement|null = null;\r\n protected mode!: PickerMode;\r\n public selectedList: Date[] = [];\r\n private selectedDate!: Date;\r\n private multiselect!: boolean;\r\n private table!: HTMLTableElement;\r\n protected intervalStart?: Date;\r\n protected intervalEnd?: Date;\r\n private pickerFor: string = \"\";\r\n\r\n constructor(options: DatePickerOptions) {\r\n super(options);\r\n }\r\n protected initialize(options: DatePickerOptions) {\r\n console.log(options);\r\n super.initialize(options);\r\n this.date.setHours(0, 0, 0, 0);\r\n this.mode = PickerMode.day;\r\n this.intervalStart = options.intervalStart;\r\n this.intervalEnd = options.intervalEnd;\r\n this.multiselect = options.multiselect || false;\r\n this.selectedDate = new Date(this.date);\r\n this.selectedList = [];\r\n if (this.multiselect) {\r\n this.selectedList.push(this.selectedDate);\r\n }\r\n\r\n if(\"input\" in options) {\r\n let inputOptions = options as DatePickerInputOptions;\r\n this.pickerFor = inputOptions.input.id ?? inputOptions.input.name ?? \"\";\r\n }\r\n\r\n }\r\n protected createDomContainer(className?: string): HTMLElement {\r\n let elm = super.createDomContainer(className);\r\n elm.classList.add('pick-date');\r\n elm.classList.add('date-picker');\r\n return elm;\r\n }\r\n private setMode(mode: PickerMode, date: Date) {\r\n this.mode = mode;\r\n this.repaint(date);\r\n }\r\n public inSelected(date: Date, mode: PickerMode) {\r\n var result = false;\r\n if (this.multiselect) {\r\n for (var i = 0; i < this.selectedList.length && !result; i++) {\r\n result = this.compareDates(date, this.selectedList[i], mode);\r\n }\r\n } else {\r\n result = this.compareDates(date, this.date, mode);\r\n }\r\n return result;\r\n }\r\n private compareDates(d1: Date, d2: Date, mode: PickerMode) {\r\n var result = true;\r\n switch (mode) {\r\n case PickerMode.day:\r\n result = result && d1.getDate() == d2.getDate();\r\n case PickerMode.month:\r\n result = result && d1.getMonth() == d2.getMonth();\r\n case PickerMode.year:\r\n result = result && d1.getFullYear() == d2.getFullYear();\r\n }\r\n return result;\r\n }\r\n public toggleSelected(date: Date) {\r\n var result = true;\r\n for (var i = 0; i < this.selectedList.length && result; i++) {\r\n result = date.getFullYear() != this.selectedList[i].getFullYear() ||\r\n date.getMonth() != this.selectedList[i].getMonth() ||\r\n date.getDate() != this.selectedList[i].getDate();\r\n }\r\n if (result) {\r\n this.selectedList.push(date);\r\n } else {\r\n this.selectedList.splice(i-1, 1);\r\n }\r\n this.selectedList.sort(function(a, b) {\r\n return a.getTime() - b.getTime();\r\n });\r\n return result;\r\n }\r\n protected selectDate(date: Date, td: HTMLTableDataCellElement) {\r\n if (this.selected) {\r\n this.selected.classList.remove('selected');\r\n }\r\n this.selected = td;\r\n td.classList.add('selected');\r\n }\r\n private createDayPicker(date: Date) {\r\n var table = viggo.dom.tag('table', { dataset: { mode: this.mode, pickerFor: this.pickerFor }, onclick: (event: MouseEvent) => { event.stopPropagation(); } });\r\n var caption = viggo.dom.tag('caption', null,\r\n viggo.dom.tag('i', { className: 'o-flaticon-arrow-left-simple previous', onclick: () => { this.previous(date);} }),\r\n viggo.dom.tag('span', {\r\n onclick: () => {\r\n this.setMode(PickerMode.month, date);\r\n }\r\n }, date.format('MMMM yyyy')),\r\n viggo.dom.tag('i', { className: 'o-flaticon-arrow-right-simple next', onclick: () => { this.next(date);} })\r\n );\r\n table.appendChild(caption);\r\n var colgroup = table.appendChild(viggo.dom.tag('colgroup'));\r\n for (var i = 0; i < 8; i++) {\r\n colgroup.appendChild(viggo.dom.tag('col', { className: i ? ('day' + i) : 'weeks' }));\r\n }\r\n var thead = viggo.dom.tag('thead');\r\n var tr = viggo.dom.tag('tr');\r\n var d = new Date(2012, 6, 1, 12, 0, 0, 0);\r\n for (i = 0; i < 8; i++) {\r\n tr.appendChild(viggo.dom.tag('th', null, i ? d.format('dddd').substring(0, 2) : __('Week')));\r\n d.setDate(d.getDate() + 1);\r\n }\r\n thead.appendChild(tr);\r\n table.appendChild(thead);\r\n\r\n this.selected = null;\r\n\r\n if (this.intervalStart || this.intervalEnd) {\r\n table.classList.add('interval-date');\r\n }\r\n\r\n table.appendChild(this.generateCells(date));\r\n table.appendChild(viggo.dom.tag('tfoot', null,\r\n viggo.dom.tag('tr', null,\r\n viggo.dom.tag('td', {colSpan: 8},\r\n viggo.dom.tag('button', {\r\n type: 'button',\r\n className: 'today',\r\n onclick: () => {\r\n let d = new Date();\r\n d.setHours(0, 0, 0, 0);\r\n this.setDate(d);\r\n }\r\n }, __('Today'))\r\n )\r\n )\r\n ));\r\n\r\n return table;\r\n }\r\n protected generateCells(date: Date) {\r\n var calendar = new Date(date.getFullYear(), date.getMonth(), 1, 0, 0, 0, 0);\r\n var day = (calendar.getDay() + 6) % 7;\r\n\r\n calendar.setDate(calendar.getDate() - day);\r\n\r\n let tbody = viggo.dom.tag('tbody');\r\n let me = this;\r\n let click = {\r\n onmousedown: function (this: HTMLTableCellElement, event: MouseEvent) {\r\n var date = <Date>this.viggoDate;\r\n if (me.multiselect) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n me.toggleSelected(date);\r\n } else {\r\n me.selectDate(date, this);\r\n }\r\n me.setDate(date);\r\n }\r\n };\r\n do {\r\n let tr = viggo.dom.tag('tr');\r\n let td: HTMLTableDataCellElement;\r\n for (var i = 0; i < 8; i++) {\r\n if (!i) {\r\n let th = viggo.dom.tag('th', null, calendar.getWeekOfYear()[1]);\r\n tr.appendChild(th);\r\n } else {\r\n td = viggo.dom.tag('td', click, calendar.getDate());\r\n if (calendar.getMonth() != date.getMonth()) {\r\n td.classList.add('out');\r\n } else if (calendar.isToday()) {\r\n this.setCellClassName(td, tr, 'today');\r\n }\r\n if (this.inSelected(calendar, PickerMode.day)) {\r\n this.selected = td;\r\n this.setCellClassName(td, tr, 'selected');\r\n } else if (this.intervalStart && this.intervalStart <= calendar && this.date >= calendar) {\r\n this.setCellClassName(td, tr, 'interval');\r\n if (this.intervalStart.getTime() == calendar.getTime()) {\r\n this.setCellClassName(td, tr, 'interval-start');\r\n }\r\n } else if (this.intervalEnd && this.intervalEnd >= calendar && this.date <= calendar) {\r\n this.setCellClassName(td, tr, 'interval');\r\n if (this.intervalEnd.getTime() == calendar.getTime()) {\r\n this.setCellClassName(td, tr, 'interval-end');\r\n }\r\n }\r\n td.viggoDate = new Date(calendar.getFullYear(), calendar.getMonth(), calendar.getDate(), 0, 0, 0, 0);\r\n calendar.setDate(calendar.getDate() + 1);\r\n tr.appendChild(td);\r\n }\r\n }\r\n tbody.appendChild(tr);\r\n } while (calendar.getMonth() == date.getMonth());\r\n\r\n return tbody;\r\n }\r\n protected setCellClassName(td: HTMLTableDataCellElement, tr: HTMLTableRowElement, className: string) {\r\n td.classList.add(className);\r\n }\r\n private createMonthPicker(date: Date) {\r\n var table = viggo.dom.tag('table', { dataset: { mode: this.mode }, onclick: (event: MouseEvent) => { event.stopPropagation(); } });\r\n table.appendChild(viggo.dom.tag('caption', null,\r\n viggo.dom.tag('i', { className: 'o-flaticon-arrow-left-simple previous', onclick: () => { this.previous(date);} }),\r\n viggo.dom.tag('span', {\r\n onclick: () => {\r\n this.setMode(PickerMode.year, date);\r\n }\r\n }, date.format('yyyy')),\r\n viggo.dom.tag('i', { className: 'o-flaticon-arrow-right-simple next', onclick: () => { this.next(date);} })\r\n ));\r\n var tr = null;\r\n var tbody = table.appendChild(viggo.dom.tag('tbody'));\r\n for (var i = 0; i < 12; i++) {\r\n var d = new Date(date);\r\n d.setMonth(i);\r\n if (i % 4 == 0) {\r\n tr = tbody.appendChild(viggo.dom.tag('tr'));\r\n }\r\n if (d.getMonth() != i) {\r\n d.setDate(0); // set to last day of month\r\n }\r\n if (tr) {\r\n let td = tr.appendChild(viggo.dom.tag('td', {\r\n onclick: ((clickDate) => {\r\n return () => {\r\n this.setMode(PickerMode.day, clickDate);\r\n };\r\n })(new Date(d))\r\n }, d.format('MMM')));\r\n if (this.inSelected(d, PickerMode.month)) {\r\n td.classList.add('selected');\r\n }\r\n }\r\n }\r\n return table;\r\n }\r\n private createYearPicker(date: Date) {\r\n var table = viggo.dom.tag('table', { dataset: { mode: this.mode }, onclick: (event: MouseEvent) => { event.stopPropagation(); }});\r\n var d1 = new Date(date);\r\n d1.setFullYear(Math.floor(d1.getFullYear() / 10) * 10);\r\n var d2 = new Date(d1);\r\n d2.setFullYear(d2.getFullYear() + 9);\r\n table.appendChild(viggo.dom.tag('caption', null,\r\n viggo.dom.tag('i', { className: 'o-flaticon-arrow-left-simple previous', onclick: () => { this.previous(date); } }),\r\n viggo.dom.tag('span', null, d1.getFullYear() + '-' + d2.getFullYear()),\r\n viggo.dom.tag('i', { className: 'o-flaticon-arrow-right-simple next', onclick: () => { this.next(date); } })\r\n ));\r\n\r\n d1.setFullYear(d1.getFullYear() - 1);\r\n var tbody = table.appendChild(viggo.dom.tag('tbody'));\r\n var tr = null;\r\n for (var i = 0; i < 12; i++) {\r\n if (i % 4 == 0) {\r\n tr = tbody.appendChild(viggo.dom.tag('tr'));\r\n }\r\n if (tr) {\r\n var td = tr.appendChild(viggo.dom.tag('td', {\r\n onclick: ((clickDate) => {\r\n return () => {\r\n this.setMode(PickerMode.month, clickDate);\r\n }\r\n })(new Date(d1))\r\n }, d1.getFullYear()));\r\n\r\n if (this.inSelected(d1, PickerMode.year)) {\r\n td.classList.add('selected');\r\n }\r\n if (i % 11 == 0) {\r\n td.classList.add('out');\r\n }\r\n d1.setFullYear(d1.getFullYear() + 1);\r\n }\r\n }\r\n return table;\r\n }\r\n\r\n protected repaint(date: Date, sameMonth?: boolean) {\r\n let table: HTMLTableElement;\r\n switch (this.mode) {\r\n case PickerMode.day:\r\n table = this.createDayPicker(date);\r\n break;\r\n case PickerMode.month:\r\n table = this.createMonthPicker(date);\r\n break;\r\n case PickerMode.year:\r\n table = this.createYearPicker(date);\r\n break;\r\n }\r\n\r\n let finish = () => {\r\n if (this.table) {\r\n this.table.remove();\r\n }\r\n this.domContainer.appendChild(table);\r\n this.table = table;\r\n };\r\n if (!sameMonth && this.table) {\r\n new viggo.effect({\r\n element: this.table,\r\n from: 1,\r\n to: 0,\r\n style: 'opacity',\r\n duration: 100,\r\n complete: () => {\r\n finish();\r\n new viggo.effect({\r\n element: this.table,\r\n from: 0,\r\n to: 1,\r\n style: 'opacity',\r\n duration: 100\r\n });\r\n }\r\n });\r\n } else {\r\n finish();\r\n }\r\n }\r\n\r\n private next(date: Date) {\r\n this.scrollCalendar(date, 1);\r\n }\r\n\r\n private previous(date: Date) {\r\n this.scrollCalendar(date, -1);\r\n }\r\n\r\n private scrollCalendar(date: Date, multiplier: number) {\r\n date = new Date(date);\r\n switch (this.mode) {\r\n case 'day':\r\n let day = date.getDate();\r\n date.setMonth(date.getMonth() + 1 * multiplier);\r\n if (day != date.getDate()) {\r\n date.setDate(0);\r\n }\r\n break;\r\n case 'month':\r\n date.setFullYear(date.getFullYear() + 1 * multiplier);\r\n break;\r\n case 'year':\r\n date.setFullYear(date.getFullYear() + 10 * multiplier);\r\n break;\r\n }\r\n this.repaint(date);\r\n }\r\n\r\n public setDate(date: Date) {\r\n let sameMonth = this.date.getFullYear() == date.getFullYear() && this.date.getMonth() == date.getMonth();\r\n let sameDate = sameMonth && date.getDate() == this.date.getDate();\r\n this.date = new Date(date);\r\n this.date.setHours(0, 0, 0, 0);\r\n this.selectedDate = new Date(this.date);\r\n let detail: Date|Date[] = new Date(this.date);\r\n if (this.multiselect) {\r\n sameDate = false;\r\n detail = [];\r\n for (var i = 0; i < this.selectedList.length; i++) {\r\n detail.push(new Date(this.selectedList[i]));\r\n }\r\n }\r\n if (!sameDate) {\r\n if (this.callback) {\r\n this.callback(detail);\r\n }\r\n this.repaint(date, sameMonth);\r\n }\r\n return detail;\r\n }\r\n }\r\n\r\n export class WeekPicker extends DatePicker {\r\n private regex = /(\\d+|__)\\s*,\\s*(\\d{4}|____)/;\r\n constructor(options: WeekPickerOptions) {\r\n super(options);\r\n /*\r\n // if we need to implement this with an input\r\n var m = this.input.value.match(this.regex);\r\n if (!m) {\r\n textInput.value = __('Week {week}, {year}', {week: '__', year: '____'});\r\n }\r\n */\r\n }\r\n /*\r\n private match() {\r\n return this.input.value.match(this.regex) || ['__, ____', '__', '____'];\r\n }\r\n */\r\n private getMonday(date: Date) {\r\n let week = date.getWeekOfYear();\r\n return Date.getDateOfWeek(week[1], week[0]);\r\n }\r\n public setDate(date: Date) {\r\n date = this.getMonday(date);\r\n return super.setDate(date);\r\n }\r\n public toggleSelected(date: Date) {\r\n date = this.getMonday(date);\r\n return super.toggleSelected(date);\r\n }\r\n protected createDomContainer(className?: string) {\r\n let e = super.createDomContainer(className);\r\n e.classList.add('date-picker');\r\n e.classList.remove('pick-date');\r\n e.classList.add('pick-week');\r\n return e;\r\n }\r\n }\r\n\r\n class FocusedInputControl {\r\n private input: HTMLInputElement;\r\n private scrollElement: Element | Document | null = null;\r\n private scrollListener!: (event: Event) => void;\r\n private modalCloseListener!: () => void;\r\n private modalShowListener!: () => void;\r\n public scrollAdd = 0;\r\n constructor(input: HTMLInputElement, scrollCallback: (scroll: number) => void) {\r\n this.input = input;\r\n this.scrollListener = (event: Event) => {\r\n this.scrollAdd = (<HTMLElement>event.target).scrollTop;\r\n scrollCallback(this.scrollAdd);\r\n };\r\n if (this.scrollElement = viggo.dom.parentFilter(this.input, (e) => {\r\n return e.nodeType == 1 && viggo.getStyle(e, 'overflow-y') in { scroll: 1, auto: 1 };\r\n })) {\r\n this.scrollElement.addEventListener('scroll', this.scrollListener, false);\r\n this.scrollListener(<any>{target: this.scrollElement});\r\n }\r\n this.modalShowListener = () => {\r\n viggo.modal.addEventListener('scroll', this.scrollListener);\r\n let elm = viggo.modal.getLatestModalElement();\r\n if (elm) {\r\n this.scrollAdd = elm.scrollTop;\r\n }\r\n };\r\n this.modalCloseListener = () => {\r\n viggo.modal.removeEventListener('scroll', this.scrollListener);\r\n this.scrollAdd = 0;\r\n };\r\n viggo.modal.addEventListener('show', this.modalShowListener);\r\n viggo.modal.addEventListener('close', this.modalCloseListener);\r\n }\r\n public remove() {\r\n if (this.scrollElement && this.scrollListener) {\r\n this.scrollElement.removeEventListener('scroll', this.scrollListener, false);\r\n this.scrollElement = null;\r\n }\r\n viggo.modal.removeEventListener('show', this.modalShowListener);\r\n viggo.modal.removeEventListener('close', this.modalCloseListener);\r\n }\r\n }\r\n\r\n enum PickerSelectMode {\r\n remove = 'remove',\r\n keep = 'keep'\r\n }\r\n\r\n export class DatePickerInput extends DatePicker {\r\n private input!: HTMLInputElement;\r\n private datePos: number = -1;\r\n private monthPos: number = -1;\r\n private yearPos: number = -1;\r\n private cursorTimeout: number = 0;\r\n private intervalInput?: HTMLInputElement;\r\n private regex = /^(\\d\\d|__)-(\\d\\d|__)-(\\d{4}|____)$/;\r\n private inputControl!: FocusedInputControl;\r\n private selectMode!: PickerSelectMode;\r\n constructor(options: DatePickerInputOptions) {\r\n super(options);\r\n }\r\n\r\n protected initialize(options: DatePickerInputOptions) {\r\n super.initialize(options);\r\n this.owner = document.body;\r\n this.input = options.input;\r\n this.selectMode = <PickerSelectMode>this.input.dataset.pickerSelectMode || 'remove';\r\n this.input.viggoPicker = this;\r\n this.inputControl = new FocusedInputControl(this.input, (scroll: number) => {\r\n if (this.domContainer) {\r\n this.domContainer.style.marginTop = -scroll + 2 + 'px';\r\n }\r\n });\r\n\r\n let m = this.input.value.match(this.regex);\r\n if (!m) {\r\n this.input.value = '__-__-____';\r\n }\r\n\r\n if (!this.intervalStart && this.input.dataset.start) {\r\n let input = this.getRelatedElement(this.input.dataset.start);\r\n if (input) {\r\n this.intervalInput = input;\r\n let start = viggo.func.getDateFromInput(input);\r\n if (start) {\r\n this.intervalStart = start;\r\n }\r\n }\r\n }\r\n if (!this.intervalEnd && this.input.dataset.end) {\r\n let input = this.getRelatedElement(this.input.dataset.end);\r\n if (input) {\r\n this.intervalInput = input;\r\n let end = viggo.func.getDateFromInput(<HTMLInputElement>input);\r\n if (end) {\r\n this.intervalEnd = end;\r\n }\r\n }\r\n }\r\n\r\n this.initializeInput();\r\n }\r\n\r\n private getRelatedElement(name: string) {\r\n let form = this.input.closest('form');\r\n let input: HTMLInputElement | null;\r\n if (form) {\r\n input = form.querySelector(`input[name=\"${name}\"]`);\r\n } else {\r\n input = <HTMLInputElement | null>document.getElementById(name) || document.querySelector(`input[name=\"${name}\"]`);\r\n }\r\n return input;\r\n }\r\n\r\n public remove() {\r\n this.domContainer.remove();\r\n this.inputControl.remove();\r\n }\r\n\r\n protected selectDate(date: Date, td: HTMLTableDataCellElement) {\r\n super.selectDate(date, td);\r\n if (this.selectMode == 'remove') {\r\n this.remove();\r\n }\r\n }\r\n\r\n protected appendContainer() {\r\n super.appendContainer();\r\n let mousedown = (event: MouseEvent) => {\r\n if (event.target != this.input) {\r\n document.removeEventListener('mousedown', mousedown, false);\r\n this.remove();\r\n }\r\n };\r\n document.addEventListener('mousedown', mousedown, false);\r\n }\r\n\r\n public setDate(date: Date, dispatchEvent = true) {\r\n let oldDate = new Date(this.date);\r\n let detail = super.setDate(date);\r\n let eventDetail = {\r\n newDate: detail,\r\n oldDate: oldDate\r\n };\r\n this.input.value = date.format('dd-MM-yyyy');\r\n if (dispatchEvent) {\r\n if (this.intervalInput && !this.input.className.match(/syncWith_[^ ]/)) {\r\n if (this.intervalStart && this.intervalStart > date) {\r\n this.intervalInput.value = this.input.value;\r\n this.intervalStart = date;\r\n } else if (this.intervalEnd && this.intervalEnd < date) {\r\n this.intervalInput.value = this.input.value;\r\n this.intervalEnd = date;\r\n }\r\n }\r\n let event = new CustomEvent(\"datechange\", { bubbles: true, cancelable: false, detail: eventDetail });\r\n this.input.dispatchEvent(event);\r\n }\r\n return detail;\r\n }\r\n protected createDomContainer(className?: string) {\r\n let e = super.createDomContainer(className);\r\n e.classList.add('date-picker');\r\n className = this.input.dataset.pickerClass;\r\n if (className) {\r\n e.classList.add(...className.split(' '));\r\n }\r\n e.style.position = viggo.modal.getLatestModal() ? 'fixed' : 'absolute';\r\n let pos = viggo.dom.getPos(this.input);\r\n e.style.top = pos.top + this.input.offsetHeight + 'px';\r\n e.style.left = pos.left + 'px';\r\n e.style.marginTop = -this.inputControl.scrollAdd + 2 + 'px';\r\n return e;\r\n }\r\n private initializeInput() {\r\n let keydown = (event: KeyboardEvent) => {\r\n switch (event.keyCode) {\r\n case 48: case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // NUMBERS\r\n this.addChar(event.keyCode - 48);\r\n break;\r\n case 96: case 97: case 98: case 99: case 100: case 101: case 102: case 103: case 104: case 105: // NUMERIC KEYBOARD\r\n this.addChar(event.keyCode - 96);\r\n break;\r\n case 38: // UP\r\n case 40: // DOWN\r\n var add = 39 - event.keyCode;\r\n if (this.datePos > -1) {\r\n this.addDate(add);\r\n } else if (this.monthPos > -1) {\r\n this.addMonth(add);\r\n } else {\r\n this.addYear(add);\r\n }\r\n this.reselect();\r\n break;\r\n case 39: // RIGHT\r\n this.yearPos = this.monthPos;\r\n this.monthPos = this.datePos;\r\n this.datePos = -1;\r\n if (this.monthPos == this.yearPos) {\r\n this.yearPos = 0;\r\n }\r\n this.reselect();\r\n break;\r\n case 37: // LEFT\r\n this.datePos = this.monthPos;\r\n this.monthPos = this.yearPos;\r\n this.yearPos = -1;\r\n if (this.datePos == this.monthPos) {\r\n this.datePos = 0;\r\n }\r\n this.reselect();\r\n break;\r\n case 9: // TAB\r\n if ((this.datePos > -1 && !event.shiftKey) || (this.yearPos > -1 && event.shiftKey)) {\r\n this.monthPos = 0;\r\n this.datePos = this.yearPos = -1;\r\n this.reselect();\r\n } else if (this.monthPos > -1) {\r\n this.datePos = this.monthPos = this.yearPos = -1;\r\n if (event.shiftKey) {\r\n this.datePos = 0;\r\n } else {\r\n this.yearPos = 0;\r\n }\r\n this.reselect();\r\n } else {\r\n this.remove();\r\n return;\r\n }\r\n break;\r\n default:\r\n if (event.ctrlKey || event.altKey || event.metaKey || (event.keyCode >= 112 && event.keyCode <= 123)) {\r\n return; // accept ctrl, alt, meta and F-keys\r\n }\r\n break;\r\n }\r\n event.preventDefault();\r\n };\r\n\r\n var mouseup = (event: MouseEvent) => {\r\n event.preventDefault();\r\n this.selectFromCursor(this.input.selectionStart||0);\r\n };\r\n\r\n var blur = () => {\r\n this.input.removeEventListener('keydown', keydown, false);\r\n this.input.removeEventListener('mouseup', mouseup, false);\r\n this.input.removeEventListener('blur', blur, false);\r\n this.setValue(this.input.value, this.input.value != this.date.format('dd-MM-yyyy'));\r\n };\r\n this.input.addEventListener('keydown', keydown, false);\r\n this.input.addEventListener('mouseup', mouseup, false);\r\n this.input.addEventListener('blur', blur, false);\r\n\r\n setTimeout(() => {\r\n this.selectFromCursor(this.input.selectionStart || 0);\r\n }, 10);\r\n }\r\n private match() {\r\n return this.input.value.match(this.regex) || ['__-__-____', '__', '__', '____'];\r\n }\r\n // only used for type=date\r\n private setValue(value: string, dispatchEvent = true) {\r\n var m = value.match(this.regex);\r\n if (m && m[0].indexOf('_') == -1 && m[1] != '00' && m[2] != '00' && m[3][0] != '0') {\r\n var max = new Date(parseInt(m[3]), parseInt(m[2]), 0).getDate();\r\n if (parseInt(m[1]) > max) {\r\n m[1] = max.toString();\r\n }\r\n var d = new Date(parseInt(m[3]), parseInt(m[2]) - 1, parseInt(m[1]), 0, 0, 0, 0);\r\n this.setDate(d, dispatchEvent);\r\n } else {\r\n (<HTMLInputElement>this.input).value = value;\r\n }\r\n }\r\n // only used for type=date\r\n private addChar(chr: number) {\r\n this.delayReset();\r\n let match = this.match();\r\n let d: string|string[] = match[1];\r\n let m: string|string[] = match[2];\r\n let y: string|string[] = match[3];\r\n\r\n if (this.datePos > -1) {\r\n d = d.replace(/_/g, '0').split(\"\");\r\n if (this.datePos == 0) {\r\n d[0] = d[1] = '0';\r\n }\r\n d[0] = d[1];\r\n d[1] = chr.toString();\r\n\r\n if ((chr > 3 && this.datePos == 0) || this.datePos == 1) {\r\n this.monthPos = 0;\r\n this.datePos = -1;\r\n if (d[0] == d[1] && d[1] == '0') {\r\n d[1] = '1';\r\n }\r\n } else {\r\n this.datePos++;\r\n }\r\n d = d.join(\"\");\r\n if (parseInt(d) > 31)\r\n d = '31';\r\n } else if (this.monthPos > -1) {\r\n m = m.replace(/_/g, '0').split(\"\");\r\n if (this.monthPos == 0) {\r\n m[0] = m[1] = '0';\r\n }\r\n m[0] = m[1];\r\n m[1] = chr.toString();\r\n if ((this.monthPos == 0 && chr > 1) || this.monthPos == 1) {\r\n this.monthPos = -1;\r\n this.yearPos = 0;\r\n if (m[0] == m[1] && m[1] == '0') {\r\n m[1] = '1';\r\n }\r\n } else {\r\n this.monthPos++;\r\n }\r\n m = m.join(\"\");\r\n if (parseInt(m) > 12)\r\n m = '12';\r\n } else if (this.yearPos > -1 && this.yearPos < 4) {\r\n if (this.yearPos == 0) {\r\n y = '0000';\r\n }\r\n y = y.replace(/_/g, '0').split(\"\");\r\n for (var i = 0; i < 4; i++) {\r\n y[i] = y[i + 1];\r\n }\r\n y[3] = chr.toString();\r\n this.yearPos++;\r\n y = y.join(\"\");\r\n }\r\n\r\n this.setValue(d + '-' + m + '-' + y, false);\r\n this.reselect();\r\n }\r\n // only used for type=date\r\n private delayReset() {\r\n var me = this;\r\n clearTimeout(this.cursorTimeout);\r\n this.cursorTimeout = window.setTimeout(function () {\r\n me.resetCursor();\r\n }, 1000);\r\n }\r\n // only used for type=date\r\n private resetCursor() {\r\n if (this.datePos > -1) {\r\n this.datePos = 0;\r\n this.monthPos = this.yearPos = -1;\r\n } else if (this.monthPos > -1) {\r\n this.monthPos = 0;\r\n this.datePos = this.yearPos = -1;\r\n } else {\r\n this.yearPos = 0;\r\n this.datePos = this.monthPos = -1;\r\n }\r\n }\r\n // only used for type=date\r\n private selectFromCursor(cursor: number) {\r\n this.datePos = -1;\r\n this.monthPos = -1;\r\n this.yearPos = -1;\r\n if (cursor < 3) {\r\n this.datePos = 0;\r\n } else if (cursor < 6) {\r\n this.monthPos = 0;\r\n } else {\r\n this.yearPos = 0;\r\n }\r\n this.reselect();\r\n }\r\n // only used for type=date\r\n private reselect() {\r\n let input = <HTMLInputElement>this.input;\r\n if (this.datePos > -1) {\r\n input.selectionStart = 0;\r\n input.selectionEnd = input.selectionStart + 2;\r\n } else if (this.monthPos > -1) {\r\n input.selectionStart = 3;\r\n input.selectionEnd = input.selectionStart + 2;\r\n } else {\r\n input.selectionStart = 6;\r\n input.selectionEnd = input.selectionStart + 4;\r\n }\r\n }\r\n private zero(n: number|string) {\r\n return n < 10 ? '0' + n : n.toString();\r\n }\r\n // only used for type=date\r\n private addDate(step: number) {\r\n let m = this.match();\r\n let value = m[1];\r\n if (value == '__') {\r\n value = new Date().getDate().toString();\r\n } else {\r\n var max = 31;\r\n if (m[0].indexOf('_') == -1) {\r\n max = new Date(parseInt(m[3]), parseInt(m[2]), 0).getDate();\r\n }\r\n value = ((parseInt(value, 10) + step - 1 + max) % max + 1).toString();\r\n }\r\n this.setValue(this.zero(value) + '-' + m[2] + '-' + m[3], false);\r\n }\r\n // only used for type=date\r\n private addMonth(step: number) {\r\n var m = this.match();\r\n var value = m[2];\r\n if (value == '__') {\r\n value = (new Date().getMonth() + 1).toString();\r\n } else {\r\n value = ((parseInt(value, 10) + step - 1 + 12) % 12 + 1).toString();\r\n }\r\n this.setValue(m[1] + '-' + this.zero(value) + '-' + m[3], false);\r\n }\r\n // only used for type=date\r\n private addYear(step: number) {\r\n var m = this.match();\r\n var value = m[3];\r\n if (value == '____') {\r\n value = new Date().getFullYear().toString();\r\n } else {\r\n value = (parseInt(value, 10) + step).toString();\r\n }\r\n this.setValue(m[1] + '-' + m[2] + '-' + this.zero(value), false);\r\n }\r\n }\r\n\r\n interface StaticCalendarOptions {\r\n date?: Date,\r\n id?: string,\r\n input?: HTMLElement,\r\n callback?: (date: Date|Date[]) => void,\r\n data?: any,\r\n dateField?: string|string[],\r\n method?: string,\r\n url?: string,\r\n replace?: string,\r\n multiselect?: boolean,\r\n type?: string\r\n }\r\n\r\n export function createCalendar(object: StaticCalendarOptions) {\r\n if (!object.callback) {\r\n object.callback = (date: Date|Date[]) => {\r\n let d: string|string[];\r\n if (date instanceof Array) {\r\n d = [];\r\n for (let i = 0; i < date.length; i++) {\r\n d.push(date[i].format('dd-MM-yyyy'));\r\n }\r\n } else {\r\n d = date.format('dd-MM-yyyy');\r\n }\r\n let ajaxData = object.data;\r\n if (object.dateField instanceof Array) {\r\n for (let i = 0; i < object.dateField.length; i++) {\r\n ajaxData[object.dateField[i]] = d;\r\n }\r\n } else if (typeof object.dateField == 'string') {\r\n ajaxData[object.dateField] = d;\r\n }\r\n if (object.url) {\r\n new viggo.ajax({\r\n method: object.method || 'get',\r\n url: object.url,\r\n convert: 'html',\r\n data: ajaxData,\r\n complete: function (data: DocumentFragment) {\r\n if (object.replace) {\r\n let replace = document.getElementById(object.replace);\r\n if (replace) {\r\n viggo.dom.empty(replace);\r\n replace.appendChild(data);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n };\r\n }\r\n if (!object.input && object.id) {\r\n let input = document.getElementById(object.id);\r\n if (input) {\r\n object.input = input;\r\n }\r\n }\r\n let className: string[] = ['center', 'right'];\r\n let start: Date|null = null;\r\n let end: Date|null = null;\r\n if (object.input) {\r\n className = className.filter(c => object.input!.classList.contains(c));\r\n if (object.input.dataset.start) {\r\n let input = document.getElementById(object.input.dataset.start);\r\n if (input) {\r\n start = viggo.func.getDateFromInput(<HTMLInputElement>input);\r\n }\r\n }\r\n if (object.input.dataset.end) {\r\n let input = document.getElementById(object.input.dataset.end);\r\n if (input) {\r\n end = viggo.func.getDateFromInput(object.input.dataset.end);\r\n }\r\n }\r\n }\r\n let c = DatePicker;\r\n if (object.type == \"week\") {\r\n c = WeekPicker;\r\n }\r\n return new c({\r\n date: object.date || new Date(),\r\n className: className.join(' '),\r\n callback: object.callback,\r\n owner: object.input,\r\n multiselect: object.multiselect,\r\n intervalStart: <Date|undefined>start,\r\n intervalEnd: <Date|undefined>end\r\n });\r\n }\r\n\r\n document.addEventListener('focus', function(event){\r\n var target = <HTMLInputElement>event.target;\r\n if (target.tagName == 'INPUT' && target.type == 'text' && (target.classList.contains('date') || target.classList.contains('week'))) {\r\n let type = target.classList.contains('week') ? 'week' : 'date';\r\n switch (type) {\r\n case 'date':\r\n let date = viggo.func.getDateTimeFromValue(target.value) || new Date();\r\n let options: DatePickerInputOptions = {\r\n date: date,\r\n input: target,\r\n callback: (date: Date|Date[]) => {\r\n target.value = (<Date>date).format('dd-MM-yyyy');\r\n }\r\n };\r\n new DatePickerInput(options);\r\n break;\r\n /*\r\n // pretty sure this isn't used\r\n case 'week':\r\n let m = target.value.match(/(\\d+)\\s*,\\s*(\\d{4})/);\r\n if (m) {\r\n value = Date.getDateOfWeek(m[1], m[2]);\r\n }\r\n break;\r\n */\r\n }\r\n\t\t}\r\n\t}, true);\r\n\r\n export class TimePicker extends AbstractPicker {\r\n protected static regex = /^([01]\\d|2[0-3]|--):([0-5]\\d|--)$/;\r\n protected domElement!: HTMLElement;\r\n protected value!: string;\r\n private spanHours!: Element | null;\r\n private spanMinutes!: Element | null;\r\n protected initialize(options: PickerOptions) {\r\n this.spanHours = null;\r\n this.spanMinutes = null;\r\n this.value = options.date.format('HH:mm');\r\n super.initialize(options);\r\n }\r\n protected repaint() {\r\n let g: SVGGElement, line: SVGLineElement;\r\n if (this.domElement) {\r\n this.domElement.remove();\r\n }\r\n this.domElement = viggo.dom.tag('div', {\r\n onclick: (event: MouseEvent) => {\r\n event.stopPropagation();\r\n }\r\n },\r\n viggo.dom.tag('h5', null,\r\n this.spanHours = viggo.dom.tag('span', {\r\n onclick: () => {\r\n this.hideClock(g, () => {\r\n this.createHours(g, line);\r\n this.showClock(g);\r\n });\r\n }\r\n }, this.value.substring(0, 2)),\r\n viggo.dom.text(':'),\r\n this.spanMinutes = viggo.dom.tag('span', {\r\n onclick: () => {\r\n this.hideClock(g, () => {\r\n this.createMinutes(g, line);\r\n this.showClock(g);\r\n });\r\n }\r\n }, this.value.substring(3, 5))\r\n ),\r\n viggo.dom.svg('svg', { viewBox: '0,0,400,400' },\r\n g = viggo.dom.svg('g', { transform: 'translate(200,200)' },\r\n viggo.dom.svg('circle', { 'class': 'back', r: '192' }),\r\n line = viggo.dom.svg('line', { 'class': 'hour-hand', x1: 0, y1: 0, x2: 0, y2: 0 }),\r\n viggo.dom.svg('circle', { 'class': 'center', r: '15' })\r\n )\r\n )\r\n );\r\n\r\n this.createHours(g, line);\r\n this.domContainer.appendChild(this.domElement);\r\n }\r\n protected createHours(g: SVGGElement, line: SVGLineElement) {\r\n var me = this;\r\n var click = function (this: SVGCircleElement, event: MouseEvent) {\r\n event.stopPropagation();\r\n // dataset is supported on svg elements, but is currently only in candidate recomendation\r\n // https://developer.mozilla.org/en-US/docs/Web/API/SVGElement/dataset\r\n me.setValue(me.zero((<any>this).dataset.hour) + me.value.substring(2, 5));\r\n me.hideClock(g, function () {\r\n me.createMinutes(g, line);\r\n me.showClock(g);\r\n });\r\n };\r\n\r\n this.resetClock(g, line);\r\n\r\n var hour = parseInt(me.value.substring(0, 2));\r\n\r\n for (var j = 0; j < 2; j++) {\r\n for (var i = 0; i < 12; i++) {\r\n var x = -(162 - j * 52) * Math.sin(-Math.PI * 2 * i / 12);\r\n var y = -(162 - j * 52) * Math.cos(-Math.PI * 2 * i / 12);\r\n\r\n var h = j * 12 + i;\r\n\r\n var circle = viggo.dom.svg('circle', { 'class': 'hour', r: 30, cx: x, cy: y, 'data-hour': h });\r\n if (h == hour) {\r\n circle.classList.add('selected');\r\n line.x2.baseVal.value = x;\r\n line.y2.baseVal.value = y;\r\n }\r\n var text = viggo.dom.svg('text', { 'class': 'hour', x: x, y: y + 7 }, h);\r\n g.appendChild(circle);\r\n g.appendChild(text);\r\n circle.addEventListener('click', click, false);\r\n }\r\n }\r\n }\r\n protected createMinutes(g: SVGGElement, line: SVGLineElement) {\r\n var me = this;\r\n var click = function (this: SVGCircleElement, event: MouseEvent) {\r\n event.stopPropagation();\r\n me.setValue(me.value.substring(0, 3) + me.zero((<any>this).dataset.minute));\r\n me.hideClock(g, () => {\r\n me.remove();\r\n });\r\n };\r\n\r\n this.resetClock(g, line);\r\n\r\n var minute = parseInt(me.value.substring(3, 5));\r\n\r\n for (var i = 0; i < 60; i += 5) {\r\n var x = -162 * Math.sin(-Math.PI * 2 * i / 60);\r\n var y = -162 * Math.cos(-Math.PI * 2 * i / 60);\r\n\r\n var circle = viggo.dom.svg('circle', { 'class': 'minute', r: 30, cx: x, cy: y, 'data-minute': i });\r\n if (minute == i) {\r\n circle.classList.add('selected');\r\n line.x2.baseVal.value = x;\r\n line.y2.baseVal.value = y;\r\n }\r\n var text = viggo.dom.svg('text', { 'class': 'minute', x: x, y: y + 7 }, i);\r\n g.appendChild(circle);\r\n g.appendChild(text);\r\n circle.addEventListener('click', click, false);\r\n }\r\n }\r\n protected resetClock(g: SVGGElement, line: SVGLineElement) {\r\n for (var i = g.childNodes.length - 1; i >= 0; i--) {\r\n var child = g.children[i]\r\n if (child.classList.contains('hour') || child.classList.contains('minute')) {\r\n g.removeChild(child);\r\n }\r\n }\r\n line.x2.baseVal.value = 0;\r\n line.y2.baseVal.value = 0;\r\n }\r\n protected hideClock(g: SVGGElement, callback: () => void) {\r\n var status = 0;\r\n var complete = function () {\r\n status++;\r\n if (status == 2) {\r\n callback();\r\n };\r\n };\r\n new viggo.effect({\r\n element: g,\r\n duration: 100,\r\n style: 'transform',\r\n from: 'scale(1) translate(200px,200px)',\r\n to: 'scale(1.05) translate(190px,190px)',\r\n removeStyle: true,\r\n complete: complete\r\n });\r\n new viggo.effect({\r\n element: g,\r\n duration: 100,\r\n style: 'opacity',\r\n from: 1,\r\n to: 0,\r\n removeStyle: true,\r\n complete: complete\r\n });\r\n }\r\n protected showClock(g: SVGGElement) {\r\n new viggo.effect({\r\n element: g,\r\n duration: 100,\r\n style: 'transform',\r\n from: 'scale(.95) translate(210px,210px)',\r\n to: 'scale(1) translate(200px,200px)',\r\n removeStyle: true\r\n });\r\n new viggo.effect({\r\n element: g,\r\n duration: 100,\r\n style: 'opacity',\r\n from: 0,\r\n to: 1,\r\n removeStyle: true\r\n });\r\n }\r\n public remove() {\r\n this.domContainer.remove();\r\n }\r\n public setValue(value: string) {\r\n var m = value.match(TimePicker.regex);\r\n if (!m) {\r\n value = '--:--';\r\n } else if (this.spanHours && this.spanMinutes) {\r\n this.spanHours.textContent = m[1];\r\n this.spanMinutes.textContent = m[2];\r\n }\r\n let oldValue = this.value || '';\r\n this.value = value;\r\n let changed = oldValue != value;\r\n let detail: PickerEventDetail | null = null;\r\n\r\n if (changed) {\r\n let newHour = parseInt(value);\r\n let newMinute = parseInt(value.substring(3, 5));\r\n detail = {\r\n newDate: new Date(1970, 0, 1, newHour, newMinute, 0, 0),\r\n oldDate: new Date(1970, 0, 1, parseInt(oldValue), parseInt(oldValue.substring(3, 5)), 0, 0)\r\n };\r\n let node = this.domElement.querySelector('svg .selected');\r\n if (node) {\r\n node.classList.remove('selected');\r\n }\r\n node = this.domElement.querySelector('svg circle.hour[data-hour=\"' + newHour + '\"]');\r\n if (node) {\r\n node.classList.add('selected');\r\n }\r\n node = this.domElement.querySelector('svg circle.minute[data-minute=\"' + newMinute + '\"]');\r\n if (node) {\r\n node.classList.add('selected');\r\n }\r\n if (this.callback) {\r\n this.callback(detail.newDate);\r\n }\r\n }\r\n return detail;\r\n }\r\n protected zero(n: string | number) {\r\n return n < 10 ? '0' + n : n.toString();\r\n }\r\n protected createDomContainer(className?: string) {\r\n let e = super.createDomContainer(className);\r\n e.classList.add('time-picker');\r\n e.style.position = viggo.modal.getLatestModal() ? 'fixed' : 'absolute';\r\n return e;\r\n }\r\n }\r\n\r\n export class TimePickerInput extends TimePicker {\r\n private cursorTimeout: number = 0;\r\n // A note on the hour/minute positions: -1 indicates not in selection. 0 is first char being edited, 1 is the second char.\r\n private hourPos: number = -1;\r\n private minutePos: number = -1;\r\n private selectedHour: Element|null = null;\r\n private selectedMinute: Element|null = null;\r\n private input!: HTMLInputElement;\r\n private inputControl!: FocusedInputControl;\r\n private minuteinterval: number = 5;\r\n private eventDetail: PickerEventDetail | null = null;\r\n constructor(options: TimePickerInputOptions) {\r\n super(options);\r\n\r\n setTimeout(() => {\r\n this.selectFromCursor(this.input.selectionStart || 0);\r\n }, 10);\r\n }\r\n\r\n protected initialize(options: TimePickerInputOptions) {\r\n this.minuteinterval = options.minuteinterval || 5;\r\n this.input = options.input;\r\n this.owner = options.owner || document.body;\r\n this.value = options.input.value;\r\n this.inputControl = new FocusedInputControl(this.input, (scroll: number) => {\r\n if (this.domContainer) {\r\n this.domContainer.style.marginTop = -scroll + 2 + 'px';\r\n }\r\n });\r\n\r\n let keydown = (event: KeyboardEvent) => {\r\n switch (event.keyCode) {\r\n case 48: case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // NUMBERS\r\n this.addChar(event.keyCode - 48);\r\n break;\r\n case 96: case 97: case 98: case 99: case 100: case 101: case 102: case 103: case 104: case 105: // NUMERIC KEYBOARD\r\n this.addChar(event.keyCode - 96);\r\n break;\r\n case 38: // UP\r\n case 40: // DOWN\r\n var add = 39 - event.keyCode;\r\n if (this.hourPos > -1) {\r\n this.addHour(add);\r\n } else {\r\n this.addMinute(add * this.minuteinterval);\r\n }\r\n this.reselect();\r\n break;\r\n case 39: // RIGHT\r\n if (this.minutePos !== -1) {\r\n this.minutePos = -1;\r\n } else {\r\n this.minutePos = 0;\r\n }\r\n this.hourPos = -1;\r\n this.reselect();\r\n break;\r\n case 37: // LEFT\r\n if (this.minutePos !== -1) {\r\n this.hourPos = 0;\r\n this.minutePos = -1;\r\n } else {\r\n this.minutePos = 0;\r\n this.hourPos = -1;\r\n }\r\n this.reselect();\r\n break;\r\n case 9: // TAB\r\n if (this.hourPos > -1 && !event.shiftKey) {\r\n this.hourPos = -1;\r\n this.minutePos = 0;\r\n } else if (this.minutePos > -1 && event.shiftKey) {\r\n this.hourPos = 0;\r\n this.minutePos = -1;\r\n } else {\r\n this.remove();\r\n return; // tab out\r\n }\r\n this.reselect();\r\n break;\r\n default:\r\n if (event.ctrlKey || event.altKey || event.metaKey || (event.keyCode >= 112 && event.keyCode <= 123)) {\r\n return; // accept ctrl, alt, meta and F-keys\r\n }\r\n break;\r\n }\r\n event.preventDefault();\r\n };\r\n\r\n var mouseup = (event: MouseEvent) => {\r\n event.preventDefault();\r\n this.selectFromCursor(this.input.selectionStart || 0);\r\n };\r\n\r\n var blur = () => {\r\n this.input.removeEventListener('keydown', keydown, false);\r\n this.input.removeEventListener('mouseup', mouseup, false);\r\n this.input.removeEventListener('blur', blur, false);\r\n let m = this.match();\r\n let t: string = m[2];\r\n if (t != '--') {\r\n t = (Math.floor(parseInt(t, 10) / this.minuteinterval) * this.minuteinterval).toString();\r\n m[2] = this.zero(t);\r\n this.input.value = m[1] + ':' + m[2];\r\n }\r\n };\r\n this.input.addEventListener('keydown', keydown, false);\r\n this.input.addEventListener('mouseup', mouseup, false);\r\n this.input.addEventListener('blur', blur, false);\r\n\r\n this.setValue(this.input.value);\r\n }\r\n\r\n private match() {\r\n return this.value.match(TimePickerInput.regex) || ['--:--', '--', '--'];\r\n }\r\n protected createDomContainer(className?: string) {\r\n let e = super.createDomContainer(className);\r\n className = this.input.dataset.pickerClass;\r\n if (className) {\r\n e.classList.add(...className.split(' '));\r\n }\r\n let pos = viggo.dom.getPos(this.input);\r\n e.style.top = pos.top + this.input.offsetHeight + 'px';\r\n e.style.left = pos.left + 'px';\r\n e.style.marginTop = -this.inputControl.scrollAdd + 2 + 'px';\r\n return e;\r\n }\r\n protected appendContainer() {\r\n super.appendContainer();\r\n let mousedown = (event: MouseEvent) => {\r\n if (event.target != this.input) {\r\n document.removeEventListener('mousedown', mousedown, false);\r\n this.remove();\r\n }\r\n };\r\n document.addEventListener('mousedown', mousedown, false);\r\n }\r\n public setValue(value: string, delayEvent: boolean = false) {\r\n let result = super.setValue(value);\r\n if (result) {\r\n this.input.value = value;\r\n if (delayEvent) {\r\n this.eventDetail = result;\r\n } else {\r\n this.eventDetail = null;\r\n this.dispatchEvent(result);\r\n }\r\n }\r\n return result;\r\n }\r\n private dispatchEvent(detail: PickerEventDetail) {\r\n let event = new CustomEvent('datechange', { bubbles: true, cancelable: false, detail: detail });\r\n this.input.dispatchEvent(event);\r\n }\r\n private selectFromCursor(cursor: number) {\r\n if (cursor < 3) {\r\n this.hourPos = 0;\r\n this.minutePos = -1;\r\n } else {\r\n this.hourPos = -1;\r\n this.minutePos = 0;\r\n }\r\n this.reselect();\r\n }\r\n private reselect() {\r\n var g = <SVGGElement>this.domElement.querySelector('svg g'),\r\n line = <SVGLineElement>this.domElement.querySelector('svg line');\r\n let input = <HTMLInputElement>this.input;\r\n if (this.hourPos > -1) {\r\n input.selectionStart = 0;\r\n this.createHours(g, line);\r\n } else if (this.minutePos > -1) {\r\n input.selectionStart = 3;\r\n this.createMinutes(g, line);\r\n } else {\r\n input.selectionStart = 6;\r\n }\r\n input.selectionEnd = input.selectionStart + 2;\r\n }\r\n private delayReset() {\r\n clearTimeout(this.cursorTimeout);\r\n this.cursorTimeout = window.setTimeout(() => {\r\n this.resetCursor();\r\n if (this.eventDetail != null) {\r\n this.dispatchEvent(this.eventDetail);\r\n this.eventDetail = null;\r\n }\r\n }, 1000);\r\n }\r\n private resetCursor() {\r\n if (this.hourPos > -1) {\r\n this.hourPos = 0;\r\n this.minutePos = -1;\r\n } else {\r\n this.minutePos = 0;\r\n this.hourPos = -1;\r\n }\r\n }\r\n private addChar(chr: number) {\r\n this.delayReset();\r\n let match = this.match();\r\n let hourArray: string[] = match[1].replace(/-/g, '0').split(\"\");\r\n let minuteArray: string[] = match[2].replace(/-/g, '0').split(\"\");\r\n\r\n if (this.hourPos > -1) {\r\n if (this.hourPos == 0) {\r\n hourArray[0] = '0';\r\n hourArray[1] = chr.toString();\r\n if (chr > 2) {\r\n this.minutePos = 0;\r\n this.hourPos = -1;\r\n } else {\r\n this.hourPos++;\r\n }\r\n } else {\r\n hourArray[0] = chr.toString();\r\n hourArray = hourArray.reverse();\r\n this.minutePos = 0;\r\n this.hourPos = -1;\r\n }\r\n } else if (this.minutePos > -1 && this.minutePos < 2) {\r\n if (this.minutePos == 0) {\r\n minuteArray[0] = '0';\r\n minuteArray[1] = chr.toString();\r\n } else {\r\n minuteArray[0] = chr.toString();\r\n minuteArray = minuteArray.reverse();\r\n }\r\n this.minutePos++;\r\n }\r\n\r\n let hour: number|string = parseInt(hourArray.join(\"\"));\r\n let minute: number | string = parseInt(minuteArray.join(\"\"));\r\n hour = Math.min(hour, 23);\r\n if (hour < 10) {\r\n hour = '0' + hour;\r\n }\r\n minute = Math.min(minute, 59);\r\n if (minute < 10) {\r\n minute = '0' + minute;\r\n }\r\n\r\n this.setValue(hour + ':' + minute, this.hourPos == 1 || this.minutePos == 1);\r\n this.reselect();\r\n }\r\n private addHour(step: number) {\r\n var m = this.match();\r\n var value = m[1];\r\n if (value == '--') {\r\n value = step > 0 ? '0' : '23';\r\n } else {\r\n value = ((parseInt(value, 10) + step + 24) % 24).toString();\r\n }\r\n this.setValue(this.zero(value)+':'+m[2]);\r\n }\r\n private addMinute(step: number) {\r\n let m = this.match();\r\n let value = m[2];\r\n if (value == '--') {\r\n value = (step > 0 ? 0 : 60 - this.minuteinterval).toString();\r\n } else {\r\n value = ((parseInt(value, 10) + step + 60) % 60).toString();\r\n }\r\n this.setValue(m[1] + ':' + this.zero(value));\r\n }\r\n public remove() {\r\n super.remove();\r\n this.inputControl.remove();\r\n }\r\n }\r\n\r\n\r\n document.addEventListener('focus', function (event) {\r\n var target = <HTMLInputElement>event.target;\r\n if (target.tagName == 'INPUT' && target.type == 'text' && (target.classList.contains('time') || target.classList.contains('timeseconds'))) {\r\n let d = target.value.match(/^(\\d+):(\\d+)(?::(\\d+))?$/);\r\n let options: TimePickerInputOptions = {\r\n input: target,\r\n className: ['right', 'center'].filter(x => target.classList.contains(x)).join(' '),\r\n date: d ? new Date(1970, 0, 1, parseInt(d[1]), parseInt(d[2]), d[3]?parseInt(d[3]):0) : new Date(),\r\n minuteinterval: target.dataset.minuteinterval ? parseInt(target.dataset.minuteinterval) : 5\r\n };\r\n new TimePickerInput(options);\r\n }\r\n }, true);\r\n\r\n document.addEventListener('datechange', (ev: Event) => {\r\n let event = <CustomEvent<PickerEventDetail>>ev;\r\n let target = <HTMLInputElement>event.target;\r\n let m = target.className.match(/syncWith_([^ ]+)/);\r\n if (m) {\r\n if (target.form) {\r\n let sync = <HTMLInputElement>target.form.elements.namedItem(m[1]);\r\n if (sync) {\r\n let dif = (<Date>event.detail.newDate).getTime() - event.detail.oldDate.getTime(), d;\r\n switch (true) {\r\n case target.classList.contains('date') && sync.classList.contains('date'):\r\n m = sync.value.match(/^(\\d\\d)-(\\d\\d)-(\\d{4})$/);\r\n if (m) {\r\n var day = 1000 * 60 * 60 * 24;\r\n dif = Math.round(dif / day);\r\n d = new Date(parseInt(m[3]), parseInt(m[2], 10) - 1, parseInt(m[1]), 0, 0, 0, 0);\r\n d.setDate(d.getDate() + dif);\r\n sync.value = d.format('dd-MM-yyyy');\r\n }\r\n break;\r\n case target.classList.contains('time') && sync.classList.contains('time'):\r\n m = sync.value.match(/^(\\d\\d):(\\d\\d)$/);\r\n if (m) {\r\n var minute = 1000 * 60;\r\n dif = Math.round(dif / minute);\r\n d = new Date(1970, 0, 1, parseInt(m[1]), parseInt(m[2]), 0, 0);\r\n d.setMinutes(d.getMinutes() + dif);\r\n sync.value = d.format('HH:mm');\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }, true);\r\n}","module viggo {\r\n export class progress {\r\n protected constructor() {\r\n this.domElement = viggo.dom.tag('div', { id: 'progress-load-page' });\r\n document.body.appendChild(this.domElement);\r\n }\r\n private endTime?: Date;\r\n private domElement?: HTMLElement;\r\n private effect: any;\r\n private remove(): void {\r\n if (this.domElement) {\r\n document.body.removeChild(this.domElement);\r\n }\r\n delete this.domElement;\r\n delete progress.instance;\r\n }\r\n protected static instance?: progress;\r\n protected static getInstance() {\r\n if (!this.instance) {\r\n this.instance = new progress();\r\n }\r\n return this.instance;\r\n }\r\n public static setProgress(zeroToOne: number|null) {\r\n this.getInstance().setProgress(zeroToOne);\r\n }\r\n public static setProgressTime(ms: number) {\r\n let p = this.getInstance();\r\n p.endTime = new Date(Date.now() + ms);\r\n }\r\n private setProgress(zeroToOne: number|null): void {\r\n if (this.effect) {\r\n this.effect.stop();\r\n }\r\n if (zeroToOne === null) {\r\n this.remove();\r\n } else if (this.domElement) {\r\n let from = parseFloat(this.domElement.style.getPropertyValue('--progress') || '');\r\n if (isNaN(from)) {\r\n from = 0;\r\n }\r\n if (this.endTime && zeroToOne != 1) {\r\n let x = zeroToOne;\r\n x = -0.125 * x * x + 0.275 * x + 0.85;\r\n zeroToOne = x;\r\n }\r\n this.effect = new viggo.effect({\r\n from: from,\r\n to: Math.pow(zeroToOne, 0.5),\r\n duration: this.endTime && zeroToOne != 1 ? Math.max(this.endTime.getTime() - Date.now(), 200) : 200/Math.pow(zeroToOne, 1.5),\r\n type: 'easeinout',\r\n element: this.domElement,\r\n style: (start: number|string, end: number|string, index: number) => {\r\n if (this.domElement) {\r\n this.domElement.style.setProperty('--progress', viggo.effect.calc(<number>start, <number>end, index)+'');\r\n }\r\n },\r\n complete: () => {\r\n if (zeroToOne == 1 && this.domElement) {\r\n this.effect = new viggo.effect({\r\n from: 1,\r\n to: 0,\r\n duration: 200,\r\n type: 'sine',\r\n element: this.domElement,\r\n style: 'opacity',\r\n complete: () => {\r\n this.remove();\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }\r\n}","module viggo {\r\n interface ModalOptions {\r\n element?: Element|DocumentFragment|null;\r\n url?: string;\r\n complete?: (() => void);\r\n pushState?: boolean;\r\n sender?: Element;\r\n }\r\n\r\n interface ModalUrlNavigation {\r\n next?: string;\r\n previous?: string;\r\n target?: HTMLElement;\r\n }\r\n\r\n export class modal extends viggo.classes.eventListener {\r\n private static modalList: modal[] = [];\r\n private static allClosed = true;\r\n public element: HTMLElement | null = null;\r\n public url?: string;\r\n private sender?: Element;\r\n constructor(object?: ModalOptions) {\r\n super();\r\n modal.modalList.push(this);\r\n if (object) {\r\n this.sender = object.sender;\r\n if (object.element) {\r\n this.show(object.element);\r\n } else if (object.url) {\r\n this.url = object.url;\r\n this.showAjax(object.url, object.complete, object.pushState);\r\n }\r\n }\r\n }\r\n\r\n public show(element?: Node) {\r\n this.createModal(element);\r\n modal.allClosed = false;\r\n document.documentElement!.classList.add('modal');\r\n\r\n if (element) {\r\n this.focusFirst();\r\n var close = this.element!.getElementsByClassName('close')[0] || this.element!.appendChild(viggo.dom.tag('div', { className: 'close' }));\r\n close.addEventListener('click', () => {\r\n this.close();\r\n close.remove();\r\n }, false);\r\n }\r\n\r\n this.dispatchEvent('show', { target: this.element, modal: this });\r\n viggo.modal.dispatchEvent('show', { target: this.element, modal: this });\r\n }\r\n\r\n private nextModal() {\r\n let url = this.getNavigation().next;\r\n if (url) {\r\n this.url = url;\r\n this.reload();\r\n }\r\n }\r\n\r\n private previousModal() {\r\n let url = this.getNavigation().previous;\r\n if (url) {\r\n this.url = url;\r\n this.reload();\r\n }\r\n }\r\n\r\n public createModal(child?: Node) {\r\n let me = this;\r\n let isCaptureClick = false;\r\n this.element = viggo.dom.tag('div', {\r\n className: 'modal',\r\n onkeydown: function (event: KeyboardEvent) {\r\n if (event.type == 'keydown' && event.keyCode == 27) {\r\n me.close(event);\r\n event.stopPropagation();\r\n }\r\n },\r\n onclick: function (event: MouseEvent) {\r\n if (event.target == this && isCaptureClick) {\r\n me.close(event);\r\n }\r\n },\r\n onscroll: function (event: MouseEvent) {\r\n var ev = {\r\n target: this,\r\n event: event,\r\n modal: me\r\n };\r\n me.dispatchEvent('scroll', ev);\r\n viggo.modal.dispatchEvent('scroll', ev);\r\n }\r\n }, child);\r\n\r\n this.element.addEventListener('mousedown', function (event) {\r\n isCaptureClick = event.target == this;\r\n }, true);\r\n this.element.addEventListener('keypress', (event) => {\r\n if (event.key == 'Enter' && event.ctrlKey) {\r\n if (this.element) {\r\n let button = <HTMLButtonElement|null>this.element.querySelector('button[type=\"submit\"]');\r\n if (button) {\r\n button.click();\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n }\r\n }\r\n }, true);\r\n\r\n return document.body.appendChild(this.element);\r\n }\r\n public focusFirst() {\r\n if (this.element) {\r\n let first = <HTMLInputElement>this.element.getElementsByClassName('cursor-selected')[0];\r\n if (first && first.focus) {\r\n first.focus();\r\n }\r\n }\r\n }\r\n public alwaysOnTop(value: boolean = true) {\r\n var func: string = value ? 'add' : 'remove';\r\n value ? this.element!.classList.add('alwaysOnTop') : this.element!.classList.remove('alwaysOnTop');\r\n }\r\n\r\n public showAjax(url: string, complete?: () => void, pushState?: boolean) {\r\n this.show();\r\n let xhr = new viggo.ajax(<ViggoAjaxRequest>{\r\n method: 'get',\r\n url: url,\r\n convert: false,\r\n error: (xhr: XMLHttpRequest, response: string, exception: Error, contentType: string) => {\r\n try {\r\n viggo.ajax.textToData(contentType, response, document, 'javascript');\r\n } catch (e) {\r\n if (viggo.error.isAppleSpecificBug(e)) {\r\n window.location.reload();\r\n } else {\r\n console.log(e);\r\n console.log(response, exception);\r\n if (!viggo.isDevelopment) {\r\n let err = new viggo.error(new ErrorEvent(\"error\", {\r\n colno: e.columnNumber || e.colno || 0,\r\n error: e,\r\n filename: url,\r\n lineno: e.lineNumber || e.lineno || 0,\r\n message: exception + \"\"\r\n }));\r\n err.report(`Method: get\\nUrl: ${url}\\nConvert: false\\nStatus: ${xhr.status}`);\r\n }\r\n }\r\n }\r\n this.forceClose();\r\n },\r\n complete: (html: string) => {\r\n if (this.element) {\r\n var scripts: string[] = [];\r\n html = html.replace(/<script(?:.*)?src=\"[^>]+>\\s*<\\/script>/g, '');\r\n html = html.replace(/<script\\s+type=\"text\\/javascript\"[^>]*>((?:.|\\r|\\n)*?)<\\/script>/mg, function(all, script) {\r\n scripts.push(script);\r\n return \"\";\r\n });\r\n let fragment = <DocumentFragment>viggo.ajax.parseResponse('text/html', html);\r\n viggo.dom.empty(this.element);\r\n this.element.appendChild(fragment);\r\n this.setupNavigation();\r\n viggo.modal.setupClose(this.element);\r\n let s: string = '';\r\n let pre = /^\\(\\s*function\\s*\\(\\s*\\)\\s*\\{/,\r\n post = /\\}\\s*(?:\\)\\s*\\(\\s*\\)|\\(\\s*\\)\\s*\\))\\s*;?$/;\r\n try {\r\n while (scripts.length && this.element) {\r\n s = <string>scripts.shift();\r\n s = s.trim();\r\n if (s.match(pre) && s.match(post)) {\r\n s = s.replace(pre, '').replace(post, '');\r\n s = s.trim();\r\n }\r\n let f = new Function(s);\r\n f.call(null);\r\n }\r\n } catch (err) {\r\n if (viggo.error.isAppleSpecificBug(err)) {\r\n this.forceClose();\r\n window.location.reload();\r\n return;\r\n } else {\r\n alert(\"Der skete en fejl ved Ã¥bning. Prøv eventuelt at genindlæse siden.\\nFejlen sendes til Viggo, og vi fikser den hurtigst muligt.\");\r\n console.error(err);\r\n let info = viggo.error.analyze(err, s);\r\n if (viggo.isDevelopment) {\r\n console.log(info.message);\r\n } else {\r\n let error = new viggo.error(new ErrorEvent(\"error\", {\r\n colno: info.columnNumber,\r\n error: err,\r\n filename: url,\r\n lineno: info.lineNumber,\r\n message: err.message\r\n }));\r\n error.report(info.message);\r\n }\r\n this.forceClose();\r\n return;\r\n }\r\n }\r\n if (this.element) {\r\n this.focusFirst();\r\n if (complete) {\r\n complete.call(this);\r\n } else if (pushState) {\r\n window.history.replaceState({ owner: 'ViggoModal', url: window.location.href.replace(/#.*$/, ''), modalUrl: url }, viggo.history.getBestTitle(this.element), '#modal');\r\n }\r\n this.dispatchEvent('load', { target: this.element, modal: this });\r\n viggo.modal.dispatchEvent('load', { target: this.element, modal: this });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n public hasChanges() {\r\n var\r\n element = this.element,\r\n changes = false,\r\n texts = <NodeListOf<HTMLInputElement>>element!.querySelectorAll('input[type=\"text\"],textarea');\r\n\r\n for (var i = 0; i < texts.length && !changes; i++) {\r\n changes = texts[i].value !== texts[i].defaultValue;\r\n }\r\n\r\n return changes;\r\n }\r\n private setupNavigation() {\r\n let nav = this.getNavigation();\r\n if (nav.target) {\r\n if (nav.previous) {\r\n nav.target.insertBefore(viggo.dom.tag('a', {\r\n href: '#',\r\n className: 'previousModal',\r\n onclick: this.previousModal.bind(this),\r\n dataset: {\r\n shortcuts: 'Ctrl+ArrowLeft Meta+ArrowLeft'\r\n }\r\n }, viggo.dom.tag('i', { className: 'flaticon-arrow-left-simple'})), nav.target.firstChild);\r\n }\r\n if (nav.next) {\r\n nav.target.appendChild(viggo.dom.tag('a', {\r\n href: '#',\r\n className: 'nextModal',\r\n onclick: this.nextModal.bind(this),\r\n dataset: {\r\n shortcuts: 'Ctrl+ArrowRight Meta+ArrowRight'\r\n }\r\n }, viggo.dom.tag('i', { className: 'flaticon-arrow-right-simple' })));\r\n }\r\n }\r\n }\r\n private getNavigation(): ModalUrlNavigation {\r\n if (this.url && this.element) {\r\n let selectorElement = <HTMLElement | null>this.element.querySelector('[data-navigation-selector]');\r\n if (selectorElement) {\r\n let selector = selectorElement.dataset.navigationSelector!;\r\n let urls = Array.from(document.querySelectorAll(selector)).map(x => (<HTMLAnchorElement>x).href).filter(x => x).map(x => (<string>x).replace(/#.*/, ''));\r\n let index = urls.indexOf(this.url);\r\n if (index != -1) {\r\n return {\r\n next: urls[index + 1],\r\n previous: urls[index - 1],\r\n target: selectorElement\r\n };\r\n }\r\n }\r\n }\r\n return {};\r\n }\r\n public forceClose() {\r\n var element = this.element;\r\n if (element) {\r\n // Disable form submit when closing.\r\n (<NodeListOf<HTMLButtonElement | HTMLInputElement>>element.querySelectorAll('button[type=\"submit\"],input[type=\"submit\"]')).forEach(e => e.disabled = true);\r\n this.element = null;\r\n new viggo.effect({\r\n element: element,\r\n style: 'opacity',\r\n from: 1,\r\n to: 0,\r\n removeStyle: true,\r\n duration: 100,\r\n complete: () => {\r\n if (element) {\r\n element.remove();\r\n }\r\n if (!modal.modalList.length) {\r\n modal.allClosed = true;\r\n document.documentElement!.classList.remove('modal');\r\n }\r\n this.dispatchEvent('closed');\r\n viggo.modal.isIdle();\r\n }\r\n });\r\n }\r\n var index = modal.modalList.indexOf(this);\r\n if (index != -1) {\r\n modal.modalList.splice(index, 1);\r\n }\r\n }\r\n public reload() {\r\n if (this.url && this.element) {\r\n this.element.remove();\r\n this.element = null;\r\n this.showAjax(this.url);\r\n }\r\n }\r\n\r\n public finish(data: any) {\r\n this.close();\r\n this.dispatchEvent('finish', data);\r\n }\r\n\r\n public close(event?: Event) {\r\n if (!this.element) {\r\n return;\r\n }\r\n var\r\n me = this,\r\n element = me.element;\r\n\r\n var f = function () {\r\n if (!me.dispatchEvent('close', {target: element, modal: me}) || !viggo.modal.dispatchEvent('close', {target: element, modal: me})) {\r\n return;\r\n }\r\n me.forceClose();\r\n };\r\n\r\n if (event && (event.type == 'click' || event.type == 'keydown' && (<KeyboardEvent>event).keyCode == 27)) {\r\n if (this.hasChanges()) {\r\n viggo.undo(NoticeType.notsaved, __(\"ModalSaveChanges\"), [{\r\n description: __(\"Yes, leave this page\"),\r\n className: 'confirm',\r\n callback: f\r\n }, {\r\n description: __('No, continue'),\r\n className: 'deconfirm',\r\n callback: function () { }\r\n }]);\r\n } else {\r\n f();\r\n }\r\n } else if (!event) {\r\n f();\r\n }\r\n }\r\n\r\n public updateSender() {\r\n viggo.invalidate(this.sender);\r\n }\r\n\r\n public static setupClose(element: Element) {\r\n let close = element.querySelector('.dialog>.close');\r\n if (close) {\r\n let modalElement = element.closest('.modal');\r\n if (modalElement) {\r\n let m = viggo.modal.modalList.find(modal => modal.element == modalElement);\r\n if (m) {\r\n close.addEventListener('click', function (this: HTMLElement) {\r\n m!.close();\r\n this.remove();\r\n }, false);\r\n }\r\n }\r\n }\r\n }\r\n public static close(event?: Event) {\r\n if (event && event.type == 'keydown' && (<KeyboardEvent>event).keyCode == 27) {\r\n modal.closeTop(event);\r\n } else if (!event) {\r\n for (var i = modal.modalList.length - 1; i >= 0; i--) {\r\n modal.modalList[i].close(event);\r\n }\r\n }\r\n }\r\n public static reloadAll() {\r\n for (let m of modal.modalList) {\r\n m.reload();\r\n }\r\n }\r\n\r\n public static closeAll = modal.close;\r\n public static closeTop(event?: Event) {\r\n if (modal.modalList.length) {\r\n modal.modalList[modal.modalList.length - 1].close(event);\r\n }\r\n }\r\n\r\n public static finish(data: any) {\r\n if (modal.modalList.length) {\r\n modal.modalList[modal.modalList.length - 1].finish(data);\r\n }\r\n }\r\n\r\n public static updateSender() {\r\n if (modal.modalList.length) {\r\n modal.modalList[modal.modalList.length - 1].updateSender();\r\n }\r\n }\r\n\r\n public static show(id: string): modal {\r\n return new modal({ element: document.getElementById(id) });\r\n }\r\n\r\n public static showElement(element: Element | DocumentFragment): modal {\r\n return new modal({ element: element });\r\n };\r\n\r\n public static showAjax(url: string, complete?: ()=> void): modal {\r\n return new modal({ url: url, complete: complete, pushState: true });\r\n };\r\n\r\n public static showAjaxWindow(url: string) {\r\n return window.open(url, \"ViggoModal\", 'resizable,scrollbars,dependent,width=800,height=450');\r\n }\r\n\r\n public static isActive(): boolean {\r\n return !modal.isIdle();\r\n }\r\n\r\n private static lastIdleTime: number = 0;\r\n public static isIdle(delayTime: number = 0): boolean {\r\n if (!modal.allClosed) {\r\n modal.lastIdleTime = 0;\r\n } else if (!modal.lastIdleTime) {\r\n modal.lastIdleTime = Date.now();\r\n }\r\n return !modal.lastIdleTime || (Date.now() - modal.lastIdleTime) >= delayTime;\r\n }\r\n\r\n public static getLatestModal(): modal|null {\r\n return modal.modalList.length ? modal.modalList[modal.modalList.length - 1] : null;\r\n };\r\n\r\n public static getLatestModalElement(): HTMLElement|null {\r\n var m = modal.getLatestModal();\r\n return m ? m.element : m;\r\n };\r\n }\r\n}\r\n\r\n(function () {\r\n document.addEventListener('click', function (event) {\r\n if (event.button === 0 && event.target) {\r\n var target = viggo.dom.parent(<HTMLElement>event.target, 'a');\r\n var id, pos;\r\n if (target && target.classList.contains('ajaxModal')) {\r\n var url = target.href;\r\n pos = url.indexOf(\"#\");\r\n if (pos !== -1) {\r\n id = url.substring(pos + 1);\r\n url = url.substring(0, pos);\r\n if (target.classList.contains('append-query-string')) {\r\n url = viggo.appendQueryString(url);\r\n }\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return new viggo.modal({ url: url, pushState: true, sender: target });\r\n }\r\n }\r\n }\r\n }, false);\r\n\r\n document.addEventListener('keydown', viggo.modal.close, false);\r\n\r\n var start = function () {\r\n setTimeout(function () {\r\n window.addEventListener('popstate', function (event) {\r\n if (event.state && event.state.owner === 'ViggoModal') {\r\n var m = viggo.modal.getLatestModal();\r\n if (m) {\r\n m.close();\r\n }\r\n }\r\n }, false);\r\n }, 1000);\r\n window.removeEventListener('load', start, false);\r\n };\r\n window.addEventListener('load', start, false);\r\n}());","namespace viggo {\r\n export interface ViggoAjaxRequest {\r\n method: string,\r\n url: string,\r\n data?: any,\r\n tag?: string,\r\n important?: boolean | null,\r\n async?: boolean,\r\n testing?: boolean,\r\n convert?: boolean | string,\r\n json?: boolean,\r\n multisender?: boolean,\r\n contentType?: string | boolean,\r\n error?: (xhr: XMLHttpRequest, response: string, exception: Error, contentType: string) => void,\r\n timestamp?: Date,\r\n progress?: boolean | ((zeroToOne: number | null) => void) | number,\r\n complete?: (result: any) => void\r\n }\r\n\r\n export interface ViggoAjaxMappedRequest extends ViggoAjaxRequest {\r\n method: string,\r\n data: any,\r\n tag: string,\r\n important: boolean,\r\n async: boolean,\r\n testing: boolean,\r\n convert: boolean,\r\n json: boolean,\r\n multisender: boolean,\r\n contentType: string,\r\n error?: (xhr: XMLHttpRequest, response: string, exception?: Error, contentType?: string) => boolean | undefined,\r\n complete: (result: any) => void,\r\n xhr: XMLHttpRequest\r\n }\r\n\r\n export interface ViggoAjaxRequestLog {\r\n method: string;\r\n url: string;\r\n referer: string;\r\n convert: string | boolean;\r\n multisender: boolean;\r\n timestamp: string;\r\n }\r\n\r\n export class ajax extends viggo.classes.eventListener {\r\n protected encodeDataString(data: {[index: string]: any} | HTMLElement): string | null {\r\n if (data && typeof data == 'object') {\r\n let result: string[] = [];\r\n if (data instanceof HTMLElement) {\r\n data.querySelectorAll('input,textarea,select').forEach(e => {\r\n let value = ajax.getElementValue(<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>e);\r\n if (value) {\r\n result.push(value);\r\n }\r\n });\r\n } else {\r\n let encode = encodeURIComponent;\r\n for (let name in data) {\r\n let value = data[name];\r\n if (value instanceof Array) {\r\n value.forEach(e => {\r\n if (e instanceof Date) {\r\n e = e.format('yyyy-MM-dd HH:mm:ss');\r\n }\r\n result.push(encode(name) + \"=\" + encode(e));\r\n });\r\n } else {\r\n if (value instanceof Date) {\r\n value = value.format('yyyy-MM-dd HH:mm:ss');\r\n }\r\n result.push(encode(name) + \"=\" + encode(value));\r\n }\r\n }\r\n }\r\n return result.join(\"&\");\r\n }\r\n return null;\r\n }\r\n private aborted = false;\r\n public abort() {\r\n if (this.xhr.readyState != 4) {\r\n this.aborted = true;\r\n this.xhr.abort();\r\n viggo.progress.setProgress(null);\r\n ajax.removeRequest(this);\r\n }\r\n };\r\n public xhr: XMLHttpRequest;\r\n public tag: string;\r\n public important: boolean;\r\n private static requests: any = {};\r\n public progress?: (zeroToOne: number|null) => void;\r\n private callProgress(zeroToOne: number|null): void {\r\n if (typeof this.progress == 'function') {\r\n this.progress(zeroToOne);\r\n } else {\r\n viggo.progress.setProgress(zeroToOne);\r\n }\r\n }\r\n\r\n private getLoadtimes() {\r\n let json = localStorage.getItem('loadtime');\r\n return json ? JSON.parse(json) : {};\r\n }\r\n private getProgressTime(method: string, url: string) {\r\n url = url.replace(/^https?:\\/\\/[^\\/]+/, '').replace(/\\d+/g, '0');\r\n let obj = this.getLoadtimes();\r\n let row = obj['[' + method + ']' + url];\r\n return row ? <number>row.avg || 0 : 0;\r\n }\r\n private setProgressTime(method: string, url: string, time: number) {\r\n url = url.replace(/^https?:\\/\\/[^\\/]+/, '').replace(/\\d+/g, '0');\r\n let obj = this.getLoadtimes();\r\n let row = obj['[' + method + ']' + url];\r\n if (!row) {\r\n row = { count: 1, avg: time };\r\n } else {\r\n row.count++;\r\n row.avg = (row.avg/(row.count/(row.count-1))) + time / row.count;\r\n }\r\n obj['[' + method + ']' + url] = row;\r\n\r\n localStorage.setItem('loadtime', JSON.stringify(obj));\r\n }\r\n public static requestLog: ViggoAjaxRequestLog[] = [];\r\n private static latestUrl: string = \"\";\r\n static wasLastRequest(method: string, url: string) {\r\n return this.latestUrl == `${method.toUpperCase()}:${url}`;\r\n }\r\n constructor(object: ViggoAjaxRequest|HTMLFormElement) {\r\n super();\r\n let obj = <ViggoAjaxRequest>object;\r\n let form = <HTMLFormElement>object;\r\n let xhr = this.xhr = viggo.xhr();\r\n if (object instanceof HTMLFormElement) {\r\n obj = ajax.formToObject(form);\r\n } else if (obj.json) {\r\n obj.contentType = 'application/json';\r\n obj.data = JSON.stringify(obj.data);\r\n } else if (typeof obj.data !== 'string') {\r\n obj.data = this.encodeDataString(obj.data);\r\n }\r\n let map = <ViggoAjaxMappedRequest>viggo.mapDefaults(obj, this.defaults);\r\n if (map.method.toUpperCase() == 'GET') {\r\n if (map.data) {\r\n map.url += map.url.indexOf('?') == -1 ? '?' : '&';\r\n map.url += map.data;\r\n }\r\n map.data = null;\r\n }\r\n ajax.latestUrl = map.method.toUpperCase() + ':' + map.url;\r\n\r\n this.tag = map.tag;\r\n this.important = map.important;\r\n if (this.important === null) {\r\n this.important = map.method.toLowerCase() != 'get';\r\n }\r\n \r\n //if (lastRequestSent &&\r\n // lastRequestSent.method.toLowerCase() == map.method.toLowerCase() &&\r\n // lastRequestSent.url == map.url &&\r\n // lastRequestSent.data == map.data &&\r\n // !lastRequestSent.multisender &&\r\n // Date.now() - (<Date>lastRequestSent.timestamp).getTime() < 500 && // 0.5 second delay\r\n // !confirm('Du forsøger at sende den samme forespørgsel til serveren igen.\\nEr det virkelig det du ønsker?')) {\r\n // return;\r\n //}\r\n\r\n let start = 0;\r\n if (typeof map.progress === 'function') {\r\n this.progress = map.progress;\r\n } else if (map.progress === false) {\r\n this.progress = () => { };\r\n } else if (typeof map.progress == 'number') {\r\n viggo.progress.setProgressTime(map.progress);\r\n } else {\r\n let time = this.getProgressTime(map.method, map.url);\r\n start = Date.now();\r\n if (time) {\r\n time += 100;\r\n viggo.progress.setProgressTime(time);\r\n }\r\n }\r\n\r\n this.callProgress(0.2);\r\n xhr.open(\r\n map.method.toUpperCase(),\r\n map.url,\r\n map.async\r\n );\r\n var me = this;\r\n xhr.onreadystatechange = () => {\r\n this.callProgress((xhr.readyState + 1) / 5);\r\n \r\n if (xhr.readyState == 4) {\r\n let exception = null;\r\n if (!this.aborted) {\r\n let contentType = xhr.getResponseHeader('Content-Type') || \"\";\r\n contentType = contentType.split(';')[0];\r\n switch (xhr.status) {\r\n case 0:\r\n // ajax was aborted - no worries (maybe)\r\n break;\r\n case 200: // OK\r\n if (start) {\r\n this.setProgressTime(map.method, map.url, Date.now() - start);\r\n }\r\n try {\r\n var response = map.convert ? ajax.textToData(contentType, xhr.responseText, document, map.convert) : xhr.responseText;\r\n if (typeof map.complete == 'function') {\r\n map.complete.call(xhr, response);\r\n }\r\n break;\r\n } catch (error) {\r\n exception = error;\r\n // continue\r\n }\r\n case 403: // Forbidden\r\n case 404: // Not found\r\n case 423: // Locked\r\n case 500: // Internal Server Error\r\n case 501: // Not Implemented\r\n case 502: // Bad Gateway\r\n case 503: // Service Unavailable\r\n case 504: // Gateway Timeout\r\n case 505: // HTTP Version Not Supported\r\n if (typeof map.error == 'function') {\r\n map.error(xhr, xhr.responseText, exception, contentType);\r\n } else if (xhr.status != 200) {\r\n try {\r\n ajax.textToData(contentType, xhr.responseText, document, 'javascript');\r\n } catch (e) {\r\n if (exception) {\r\n e.innerException = exception;\r\n }\r\n exception = e;\r\n }\r\n }\r\n if (exception) {\r\n if (viggo.error.isAppleSpecificBug(exception)) {\r\n window.location.reload();\r\n } else {\r\n console.error('Error in url: ' + map.url);\r\n console.error(exception);\r\n if (!viggo.isDevelopment) {\r\n let info: { message: string, lineNumber: number, columnNumber: number } | null = null;\r\n if (['text/javascript', 'application/javascript', 'x-application/javascript'].indexOf(contentType) != -1) {\r\n info = viggo.error.analyze(exception, xhr.responseText);\r\n } else {\r\n info = {\r\n message: exception.message,\r\n lineNumber: exception.lineNumber || exception.lineno || exception.line || 0,\r\n columnNumber: exception.columnNumber || exception.colno || exception.column || 0\r\n };\r\n }\r\n let err = new viggo.error(new ErrorEvent(\"error\", {\r\n colno: info.columnNumber,\r\n error: exception,\r\n filename: map.url,\r\n lineno: info.lineNumber,\r\n message: info.message\r\n }));\r\n err.report(`Status: ${xhr.status}\\nRequest log: ${JSON.stringify(ajax.requestLog, null, 2)}` + (exception.innerException ? `\\nInner exception: ${JSON.stringify(exception.innerException, null, 2)}` : '') + `\\nData: ${map.data}`);\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n if (!this.aborted && (typeof map.error != 'function' || !map.error(xhr, xhr.responseText))) {\r\n alert(\"Something went wrong with the request.\\nSee console for errors. Status \" + xhr.status);\r\n console.log(xhr);\r\n }\r\n break;\r\n }\r\n }\r\n ajax.removeRequest(this);\r\n if (ajax.isIdle()) {\r\n ajax.dispatchEvent('idle');\r\n ajax.requestLog = [];\r\n }\r\n if (exception && navigator.webdriver) {\r\n throw exception;\r\n }\r\n }\r\n };\r\n ajax.requestLog.push({\r\n method: map.method,\r\n url: map.url,\r\n referer: window.location.href,\r\n convert: map.convert,\r\n multisender: map.multisender,\r\n timestamp: new Date().format(\"yyyy-MM-dd HH:mm:ss.fff\")\r\n });\r\n if (map.testing) {\r\n console.log('Ajax sending: ' + map.url);\r\n console.log(map.data);\r\n this.callProgress(1);\r\n } else {\r\n if (!ajax.requests[this.tag]) {\r\n ajax.requests[this.tag] = [];\r\n }\r\n ajax.requests[this.tag].push(this);\r\n if (map.contentType) {\r\n xhr.setRequestHeader('Content-type', map.contentType);\r\n }\r\n xhr.setRequestHeader('X-Request-By', 'ViggoAjax');\r\n xhr.send(map.data);\r\n if (viggo.ping) {\r\n viggo.ping.reset();\r\n }\r\n }\r\n }\r\n private defaults: ViggoAjaxRequest = {\r\n method: 'get',\r\n url: \"\",\r\n data: null,\r\n tag: \"\",\r\n important: null,\r\n async: true,\r\n testing: false,\r\n convert: true,\r\n json: false,\r\n multisender: false,\r\n contentType: \"application/x-www-form-urlencoded\"\r\n };\r\n \r\n public setFavicon(url: string) {\r\n let newLink = viggo.dom.tag('link', {\r\n type: url.match(/\\.ico/) ? 'image/x-icon' : 'image/gif',\r\n rel: 'shortcut icon',\r\n href: url\r\n });\r\n let oldLink = document.querySelector('link[rel~=\"icon\"]');\r\n if (oldLink) {\r\n (<HTMLElement>oldLink.parentNode).replaceChild(newLink, oldLink);\r\n } else {\r\n document.getElementsByTagName('head')[0].appendChild(newLink);\r\n }\r\n }\r\n \r\n \r\n private static removeRequest(xhr: ajax) {\r\n if (ajax.requests[xhr.tag]) {\r\n let index = ajax.requests[xhr.tag].indexOf(xhr);\r\n if (index != -1) {\r\n ajax.requests[xhr.tag].splice(index, 1);\r\n }\r\n }\r\n };\r\n\r\n private static getElementValue(element: HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement) {\r\n let encode = encodeURIComponent;\r\n let result: string|null = null;\r\n switch (element.tagName) {\r\n case 'INPUT':\r\n switch (element.type) {\r\n case 'button':\r\n case 'submit':\r\n case 'image':\r\n break;\r\n case 'checkbox':\r\n case 'radio':\r\n if (!(<HTMLInputElement>element).checked) {\r\n break;\r\n }\r\n case 'text':\r\n if (element.name && element.classList.contains('date') && element.classList.contains('submit-date')) {\r\n result = encode(element.name) + '=' + encode(element.value.split('-').reverse().join('-'));\r\n break;\r\n }\r\n case 'hidden':\r\n case 'password':\r\n case 'file':\r\n case 'textarea':\r\n default: // new types (datetime, range, etc.)\r\n if (element.name && element.className.indexOf('autocomplete') == -1) {\r\n result = encode(element.name) + '=' + encode(element.value);\r\n }\r\n break;\r\n }\r\n break;\r\n case 'TEXTAREA':\r\n if (element.name) {\r\n result = encode(element.name) + '=' + encode(element.value);\r\n }\r\n break;\r\n case 'SELECT':\r\n let name = encode(element.name);\r\n if (name) {\r\n if ((<HTMLSelectElement>element).multiple) {\r\n result = '';\r\n Array.from((<HTMLSelectElement>element).options).forEach(function(e) {\r\n if (e.selected) {\r\n result += name + '=' + encode(e.value);\r\n }\r\n });\r\n if (result === '')\r\n result = null;\r\n } else if ((<HTMLSelectElement>element).selectedIndex !== -1) {\r\n result = name + '=' + encode((<HTMLSelectElement>element).options[(<HTMLSelectElement>element).selectedIndex].value);\r\n }\r\n }\r\n break;\r\n case 'BUTTON':\r\n break;\r\n }\r\n return result;\r\n }\r\n\r\n private static getElementTuple(element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement): [string, string | boolean | number] | null {\r\n let value: string | boolean | number | null = element.value;\r\n let name = element.name;\r\n switch (element.tagName) {\r\n case 'INPUT':\r\n switch (element.type) {\r\n case 'button':\r\n case 'submit':\r\n case 'image':\r\n break;\r\n case 'checkbox':\r\n case 'radio':\r\n if (!(<HTMLInputElement>element).checked) {\r\n break;\r\n }\r\n case 'text':\r\n case 'hidden':\r\n case 'password':\r\n case 'file':\r\n case 'textarea':\r\n default: // new types (datetime, range, etc.)\r\n if (element.name && element.className.indexOf('autocomplete') == -1) {\r\n switch (element.dataset.jsonType) {\r\n case 'bool':\r\n case 'boolean':\r\n value = parseInt(value);\r\n if (isNaN(value)) {\r\n throw new Error(`Could not convert input \"${name}\" to boolean`);\r\n }\r\n value = !!value;\r\n break;\r\n case 'int':\r\n case 'integer':\r\n value = parseInt(value);\r\n if (isNaN(value)) {\r\n throw new Error(`Could not convert input \"${name}\" to integer`);\r\n }\r\n break;\r\n case 'float':\r\n case 'double':\r\n case 'decimal':\r\n value = parseFloat(value);\r\n if (isNaN(value)) {\r\n throw new Error(`Could not convert input \"${name}\" to float`);\r\n }\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n break;\r\n case 'TEXTAREA':\r\n break;\r\n case 'SELECT':\r\n break;\r\n case 'BUTTON':\r\n value = null;\r\n break;\r\n }\r\n return name && value !== null ? [name, value] : null;\r\n }\r\n\r\n public static formToObject(form: HTMLFormElement) {\r\n let object: ViggoAjaxRequest = {\r\n method: form.getAttribute('method') || 'get',\r\n url: form.getAttribute('action') || '',\r\n convert: true\r\n };\r\n let type = (form.className.match(/append(?!-query-string)|prepend|replace(?:Owner)?|before|after|ajaxModal/) || ['replace'])[0];\r\n let target: string = <string>(form.className.match(new RegExp(type + '_([A-Za-z][A-Za-z0-9_\\\\-]*)')) || ['', null])[1];\r\n let resetButtons = function (xhr?: XMLHttpRequest) {\r\n (<NodeListOf<HTMLButtonElement | HTMLInputElement>>form.querySelectorAll('button[type=\"submit\"],input[type=\"submit\"]')).forEach(e => {\r\n if (!xhr || xhr.status == 200) {\r\n e.disabled = false;\r\n e.classList.remove('loading');\r\n e.querySelectorAll('span').forEach(x => x.remove());\r\n }\r\n });\r\n };\r\n object.error = resetButtons;\r\n object.complete = function (x: DocumentFragment) {\r\n resetButtons();\r\n if ((target || type == 'ajaxModal') && x && x.nodeType == 11) {\r\n let element = target ? document.getElementById(target) : null;\r\n let init = element;\r\n if (element) {\r\n switch (type) {\r\n case 'replace':\r\n case 'ajaxModal':\r\n viggo.dom.empty(element);\r\n // don't break\r\n case 'append':\r\n element.appendChild(x);\r\n break;\r\n case 'prepend':\r\n element.insertBefore(x, element.firstChild);\r\n break;\r\n case 'before':\r\n (<Node>element.parentNode).insertBefore(x, element);\r\n break;\r\n case 'after':\r\n (<Node>element.parentNode).insertBefore(x, element.nextSibling);\r\n break;\r\n case 'replaceOwner':\r\n init = <HTMLElement>element.parentNode;\r\n let modal = viggo.modal.getLatestModal();\r\n if (modal) {\r\n let close = x.querySelector('.close');\r\n if (close) {\r\n close.addEventListener('click', () => {\r\n if (modal) {\r\n modal.close();\r\n }\r\n close!.remove();\r\n });\r\n }\r\n }\r\n let children = Array.from(x.children);\r\n init.replaceChild(x, element);\r\n if ((<any>viggo).richeditor) {\r\n children.forEach((node) => {\r\n (<any>viggo).richeditor.initialize(node);\r\n });\r\n };\r\n break;\r\n }\r\n }\r\n if (type == 'ajaxModal') {\r\n if (element) {\r\n viggo.modal.show(target);\r\n } else {\r\n viggo.modal.showElement(x);\r\n }\r\n }\r\n viggo.autocomplete.initialize(<HTMLElement|undefined>init);\r\n let aria: Element|null = viggo.dom.parentClass(form, 'dropdown-menu');\r\n if (aria) {\r\n aria = aria.previousElementSibling;\r\n if (aria && aria.getAttribute('aria-expanded')) {\r\n aria.setAttribute('aria-expanded', 'false');\r\n }\r\n }\r\n }\r\n };\r\n let queryString: string[] = [];\r\n\r\n let collectData = (callback: (e: Element) => void) => {\r\n Array.from(form.elements).forEach(callback);\r\n if (form.dataset.extraFieldsSelector) {\r\n document.querySelectorAll(form.dataset.extraFieldsSelector).forEach(callback);\r\n }\r\n };\r\n\r\n if (form.classList.contains('json')) {\r\n let data: ObjectOfAny = {};\r\n let callback = (e: Element) => {\r\n let tuple = this.getElementTuple(<any>e);\r\n if (tuple) {\r\n data[tuple[0]] = tuple[1];\r\n }\r\n };\r\n collectData(callback);\r\n object.contentType = 'application/json';\r\n object.data = JSON.stringify(data);\r\n } else if (form.enctype == 'multipart/form-data') {\r\n object.data = new FormData(form);\r\n object.contentType = <any>null;\r\n } else if (form.classList.contains('ajax-upload')) {\r\n object.data = new FormData(form);\r\n object.contentType = false;\r\n } else {\r\n let appendQueryString = form.classList.contains('append-query-string');\r\n let appendAll = !form.querySelector('.append-query-string');\r\n let data: string[] = [];\r\n let callback = (e: Element) => {\r\n let value = this.getElementValue(<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>e);\r\n if (value) {\r\n data.push(value);\r\n if (appendQueryString && (appendAll || e.classList.contains('append-query-string'))) {\r\n queryString.push(value);\r\n }\r\n }\r\n };\r\n collectData(callback);\r\n object.data = data.join('&');\r\n if ((<string>object.method).toUpperCase() == 'GET') {\r\n if (object.data.length > 0) {\r\n object.url += object.url.indexOf('?') === -1 ? '?' : '&';\r\n object.url += object.data;\r\n }\r\n object.data = null;\r\n }\r\n if (appendQueryString && queryString.length) {\r\n let url = viggo.appendQueryString('?' + queryString.join('&'));\r\n url = url.replace(/([&?])ajax=1&?/, '$1');\r\n viggo.history.pushState(url, viggo.history.getBestTitle(form));\r\n }\r\n }\r\n return object;\r\n }\r\n\r\n public static textToData(contentType: string, data: string, ownerDocument?: Document, expect?: string|boolean): any {\r\n if (!ownerDocument) {\r\n ownerDocument = document;\r\n }\r\n if (contentType) {\r\n let pos = contentType.indexOf(';');\r\n if (pos > 1) {\r\n contentType = contentType.substring(0, pos);\r\n }\r\n }\r\n if (!expect) {\r\n expect = true;\r\n }\r\n switch (contentType) {\r\n case 'text/html':\r\n if (expect === true || expect == 'html') {\r\n let range = ownerDocument.createRange();\r\n let m;\r\n if (m = data.trim().match(/^<(t[rdh])[\\s>]/)) {\r\n range.selectNode(document.querySelector(m[1]) || document.body);\r\n } else {\r\n range.selectNode(document.body);\r\n }\r\n return range.createContextualFragment(data);\r\n }\r\n break;\r\n case 'text/javascript':\r\n case 'application/javascript':\r\n case 'application/x-javascript':\r\n if (expect === true || expect == 'javascript') {\r\n // Don't throw errors. We will handle them elsewhere.\r\n let func = new Function(data);\r\n return func.call(null);\r\n }\r\n break;\r\n case 'application/json':\r\n if (expect === true || expect == 'json') {\r\n return JSON.parse(data);\r\n }\r\n break;\r\n default:\r\n if (typeof expect == 'string') {\r\n break;\r\n } else {\r\n return data;\r\n }\r\n }\r\n throw new TypeError('Unexpected contenttype from ajax. Expected \"' + expect + '\" but got \"' + contentType + '\".');\r\n }\r\n\r\n public static parseResponse = ajax.textToData;\r\n\r\n private static ajaxLoads: any = {};\r\n public static cancelRequests(tag: string): void {\r\n if (ajax.requests[tag]) {\r\n let i = ajax.requests[tag].length;\r\n while (i--) {\r\n let req = ajax.requests[tag][i];\r\n if (!req.important) {\r\n ajax.requests[tag][i].abort();\r\n }\r\n }\r\n delete ajax.requests[tag];\r\n }\r\n };\r\n public static cancelAllRequests(): void {\r\n for (let i in ajax.requests) {\r\n ajax.cancelRequests(i);\r\n }\r\n };\r\n public static isIdle = (function () {\r\n let lastIdleTime: number = 0;\r\n return function isIdle(delayTime: number = 0) {\r\n let length = 0;\r\n for (let tag in ajax.requests) {\r\n length += ajax.requests[tag].length;\r\n }\r\n if (length) {\r\n lastIdleTime = 0;\r\n } else if (!lastIdleTime) {\r\n lastIdleTime = Date.now();\r\n }\r\n return length == 0 && (Date.now() - lastIdleTime) >= delayTime;\r\n }\r\n }());\r\n public static loadHtml(url: string, id: string, object?: ViggoAjaxRequest, params?: any) {\r\n if (!viggo.isReady) {\r\n viggo.ready(function () {\r\n ajax.loadHtml(url, id, object);\r\n });\r\n return;\r\n }\r\n let elm = document.getElementById(id);\r\n let request = null;\r\n if (elm) {\r\n if (ajax.ajaxLoads[id]) {\r\n ajax.ajaxLoads[id].abort();\r\n delete ajax.ajaxLoads[id];\r\n }\r\n if (!object) {\r\n object = {\r\n method: 'get',\r\n url: url\r\n };\r\n }\r\n object.url = url;\r\n object.convert = 'html';\r\n object.progress = false;\r\n object.error = function (err) {\r\n (<HTMLElement>elm).classList.add('load-failed');\r\n if (viggo.isDevelopment) {\r\n let iframe = viggo.dom.tag('iframe', { style: { width: '100%', height: err.status == 403 ? '150px' : '300px'} });\r\n (<HTMLElement>elm).appendChild(viggo.dom.tag('h5', {title: err.responseURL}, `${err.status} ${err.statusText}`));\r\n (<HTMLElement>elm).appendChild(iframe);\r\n let doc = iframe.contentWindow!.document;\r\n doc.open();\r\n doc.write(err.responseText);\r\n doc.close();\r\n }\r\n delete ajax.ajaxLoads[id];\r\n };\r\n let complete = object.complete;\r\n object.complete = function (html: DocumentFragment) {\r\n delete ajax.ajaxLoads[id];\r\n (<HTMLElement>elm).classList.remove('loading-spinner');\r\n if (!params) {\r\n params = {\r\n type: 'replace'\r\n };\r\n }\r\n switch (params.type) {\r\n case 'replaceOwner':\r\n let parent = (<HTMLElement>elm).parentNode;\r\n if (parent) {\r\n parent.replaceChild(html, <HTMLElement>elm);\r\n elm = <HTMLElement>parent;\r\n }\r\n break;\r\n case 'append':\r\n let appendNode = (<HTMLElement>elm);\r\n if (appendNode) {\r\n appendNode.appendChild(html);\r\n elm = <HTMLElement>appendNode;\r\n }\r\n break;\r\n case 'replace':\r\n default:\r\n viggo.dom.empty(<HTMLElement>elm);\r\n (<HTMLElement>elm).appendChild(html);\r\n break;\r\n }\r\n viggo.autocomplete.initialize(<HTMLElement | undefined>elm);\r\n if (complete) {\r\n complete.call(this, elm);\r\n }\r\n };\r\n elm.classList.add('loading-spinner');\r\n request = new ajax(object);\r\n ajax.ajaxLoads[id] = request;\r\n }\r\n return request;\r\n };\r\n private static win: Window|null = window;\r\n public static openExternalPopup(url: string, notice: string, noBar: boolean) {\r\n if (ajax.win && ajax.win.opener && !ajax.win.opener.closed) return ajax.win.focus();\r\n let h = window.screen.height / 1.5;\r\n let w = window.screen.width / 1.5;\r\n let options = noBar ? 'width=' + w + ',height=' + h : '';\r\n ajax.win = window.open(url, '_blank', options);\r\n if (ajax.win === null || typeof ajax.win === 'undefined') {\r\n return viggo.modal.showAjax('/Basic/FileSharing/PopupWarning');\r\n } else {\r\n ajax.win.focus();\r\n return new Function(notice)();\r\n }\r\n };\r\n public static openWindow(e: Event, url: string) {\r\n e.preventDefault();\r\n let hash = url.split(\"#\");\r\n let el = document.getElementById(hash[1]) || null;\r\n if (el === null) return viggo.notice(NoticeType.error, 'Wrong syntax');\r\n \r\n el.style.animation = \"ajaxload 1s alternate infinite\";\r\n \r\n var win = window.open('/Basic/FileSharing/WaitingForService', '_blank');\r\n \r\n win ? win.onload = function() {\r\n new viggo.ajax({\r\n method: 'post',\r\n convert: false,\r\n url: url,\r\n complete: function (data: string) {\r\n viggo.history.load(window.location.href);\r\n var resp = JSON.parse(data);\r\n \r\n if (resp.Error) {\r\n viggo.notice(NoticeType.error, resp.Inner_Error, 10000);\r\n if (win) {\r\n win.close();\r\n }\r\n return;\r\n } else {\r\n new viggo.ajax({\r\n method: 'get',\r\n url: '/Shared/Ember/OpenFiles',\r\n convert: 'html',\r\n complete: function (html: DocumentFragment) {\r\n var div = document.getElementById('ember-open-files');\r\n if (div) {\r\n viggo.dom.empty(div);\r\n div.appendChild(html);\r\n }\r\n }\r\n });\r\n }\r\n \r\n if (resp.Type === 'url') {\r\n if (win) {\r\n win.location.href = resp.Message;\r\n win.focus();\r\n }\r\n return;\r\n }\r\n \r\n if (resp.Type === 'notification') {\r\n viggo.notice(NoticeType.notice, resp.Message, 10000);\r\n if (win) {\r\n win.close();\r\n }\r\n return;\r\n }\r\n \r\n if (win) {\r\n win.close();\r\n }\r\n },\r\n error: function () {\r\n viggo.notice(NoticeType.notice, 'Error', 10000);\r\n viggo.history.load(window.location.href);\r\n if (el) {\r\n el.style.animation = \"\";\r\n }\r\n if (win) {\r\n win.close();\r\n }\r\n }\r\n });\r\n }:null;\r\n };\r\n\r\n public static async stream(url: string, init?: RequestInit, onchunk?: (result: ResponseResult) => void) {\r\n let boundary: string | undefined;\r\n const response = await fetch(url, init);\r\n const contentType = response.headers.get('content-type');\r\n if (contentType) {\r\n boundary = (contentType.match(/^multipart\\/byteranges;\\s*boundary=(.*)$/)||[])[1];\r\n }\r\n if (boundary && response.body) {\r\n let decoder = new TextDecoder('utf-8');\r\n let partial = new MultipartReader(boundary);\r\n const reader = response.body.getReader();\r\n let done = false;\r\n do {\r\n let data = await reader.read();\r\n done = data.done;\r\n if (!done) {\r\n let text = decoder.decode(data.value);\r\n let results = partial.add(text);\r\n for (let chunk of results) {\r\n let result = this.getResponse(chunk);\r\n if (onchunk) {\r\n onchunk(result);\r\n }\r\n }\r\n }\r\n } while (!done);\r\n } else {\r\n throw new Error(\"Unable to stream content.\");\r\n }\r\n }\r\n\r\n private static getResponse(chunk: MultipartResponse): ResponseResult {\r\n let contentType = chunk.header('content-type') || '';\r\n let result = viggo.ajax.parseResponse(contentType, chunk.body);\r\n let responseType: ResponseType = \"unknown\";\r\n switch (contentType) {\r\n case 'text/html':\r\n responseType = \"html\";\r\n break;\r\n case 'text/javascript':\r\n case 'application/javascript':\r\n case 'application/x-javascript':\r\n responseType = \"javascript\";\r\n break;\r\n case 'application/json':\r\n responseType = \"json\";\r\n break;\r\n }\r\n return {\r\n type: responseType,\r\n value: result,\r\n response: chunk\r\n };\r\n }\r\n }\r\n\r\n interface ResponseResultBase {\r\n response: MultipartResponse;\r\n }\r\n type ResponseType = \"json\" | \"html\" | \"javascript\" | \"unknown\";\r\n\r\n interface JsonResponseResult extends ResponseResultBase {\r\n type: \"json\",\r\n value: any;\r\n }\r\n\r\n interface HtmlResponseResult extends ResponseResultBase {\r\n type: \"html\";\r\n value: DocumentFragment;\r\n }\r\n\r\n interface JavascriptResponseResult extends ResponseResultBase {\r\n type: \"javascript\";\r\n value: any;\r\n }\r\n\r\n interface UnknownResponseResult extends ResponseResultBase {\r\n type: \"unknown\";\r\n value: string;\r\n }\r\n\r\n type ResponseResult = JsonResponseResult | HtmlResponseResult | JavascriptResponseResult | UnknownResponseResult;\r\n\r\n class MultipartResponse {\r\n private headers: Map<string, string>;\r\n private content: string;\r\n constructor(data: string) {\r\n this.headers = new Map<string, string>();\r\n const headerContentBoundary = '\\r\\n\\r\\n';\r\n let index = data.indexOf(headerContentBoundary);\r\n if (index != -1) {\r\n let headers = data.substring(0, index).split('\\r\\n');\r\n headers.forEach(header => {\r\n let [name, value] = header.split(/:\\s+/);\r\n this.headers.set(name.toLowerCase(), value);\r\n });\r\n this.content = data.substring(index + headerContentBoundary.length);\r\n let length = this.header('content-length');\r\n if (length && parseInt(length) != this.content.length) {\r\n throw new Error('Content-Length and body length differs.');\r\n }\r\n } else {\r\n this.content = '';\r\n }\r\n }\r\n public header(name: string) {\r\n name = name.toLowerCase();\r\n return this.headers.get(name);\r\n }\r\n public get body() {\r\n return this.content;\r\n }\r\n }\r\n enum ReaderState {\r\n invalid,\r\n awaitingBoundary,\r\n awaitingContent,\r\n readingChunk,\r\n chunkFinished,\r\n finished\r\n }\r\n class MultipartReader {\r\n private buffer: string;\r\n private boundary: string;\r\n private state: ReaderState;\r\n constructor(boundary: string) {\r\n this.boundary = boundary;\r\n this.buffer = \"\";\r\n this.state = ReaderState.awaitingBoundary;\r\n }\r\n public add(buffer: string) {\r\n this.buffer += buffer;\r\n let results: MultipartResponse[] = [];\r\n let result = this.readBuffer();\r\n while (result != null) {\r\n results.push(new MultipartResponse(result));\r\n result = this.readBuffer();\r\n }\r\n return results;\r\n }\r\n private get dashBoundary() {\r\n return '--' + this.boundary;\r\n }\r\n private readBuffer() {\r\n let chunks: string[] = [];\r\n let result: string | null;\r\n let i = 0;\r\n do {\r\n switch (this.state) {\r\n case ReaderState.awaitingBoundary:\r\n result = this.readUntilBoundary();\r\n if (result !== null) {\r\n this.removeBoundary();\r\n chunks.push(result);\r\n this.readAfterBoundary();\r\n }\r\n break;\r\n case ReaderState.awaitingContent:\r\n case ReaderState.readingChunk:\r\n result = this.readUntilBoundary();\r\n if (result !== null) {\r\n result = result.substring(0, result.length - 2);\r\n chunks.push(result);\r\n this.state = ReaderState.chunkFinished;\r\n } else {\r\n this.state = ReaderState.awaitingContent;\r\n }\r\n break;\r\n case ReaderState.chunkFinished:\r\n case ReaderState.finished:\r\n break;\r\n case ReaderState.invalid:\r\n throw new Error(\"Response state was invalid\");\r\n break;\r\n }\r\n if (i++ > 10) {\r\n throw new Error(\"Too many readings.\");\r\n }\r\n } while (!this.stateFinished());\r\n\r\n if (this.state == ReaderState.chunkFinished) {\r\n this.state = ReaderState.awaitingBoundary;\r\n this.removeUntilBoundary();\r\n return chunks.join('');\r\n } else {\r\n return null;\r\n }\r\n }\r\n private stateFinished() {\r\n let breakingStates = [ReaderState.finished, ReaderState.awaitingBoundary, ReaderState.awaitingContent, ReaderState.chunkFinished, ReaderState.invalid];\r\n return breakingStates.indexOf(this.state) != -1;\r\n }\r\n private readUntilBoundary() {\r\n let index = this.buffer.indexOf(this.dashBoundary);\r\n return index != -1 ? this.buffer.substring(0, index) : null;\r\n }\r\n private removeUntilBoundary() {\r\n let index = this.buffer.indexOf(this.dashBoundary);\r\n if (index != -1) {\r\n this.buffer = this.buffer.substring(index);\r\n }\r\n }\r\n private removeBoundary() {\r\n let index = this.buffer.indexOf(this.dashBoundary);\r\n if (index != -1) {\r\n this.buffer = this.buffer.substring(index + this.dashBoundary.length);\r\n }\r\n }\r\n private readAfterBoundary() {\r\n let nextChars = this.buffer.substring(0, 2);\r\n let found = false;\r\n switch (nextChars) {\r\n case '\\r\\n':\r\n this.state = ReaderState.readingChunk;\r\n found = true;\r\n break;\r\n case '--':\r\n this.state = ReaderState.finished;\r\n found = true;\r\n break;\r\n case '':\r\n this.state = ReaderState.awaitingContent;\r\n break;\r\n default:\r\n this.state = ReaderState.invalid;\r\n break;\r\n }\r\n if (found) {\r\n this.buffer = this.buffer.substring(2);\r\n }\r\n }\r\n }\r\n}\r\n","module viggo.history {\r\n interface LoadRequest {\r\n url: string,\r\n timestamp: number\r\n }\r\n\r\n enum LoadAppendType {\r\n replace = 'replace', // default\r\n append = 'append',\r\n prepend = 'prepend',\r\n replaceOwner = 'replaceOwner'\r\n }\r\n\r\n const originalTitle = document.title;\r\n let scriptVersion: string|null = null;\r\n let styleVersion: string | null = null;\r\n let reloadNext = false;\r\n\r\n interface LoadOptions {\r\n multisender?: boolean; // default: false\r\n clearSelector?: string; // css query\r\n pushState?: boolean; // default: false\r\n appendType?: LoadAppendType; // default: 'replace'\r\n noScroll?: boolean|string; // default: false\r\n loader?: LoadCheckInitiator;\r\n complete?: (this: Element, target: Element) => void; // both this and target are the same\r\n }\r\n\r\n let lastRequest: LoadRequest|null;\r\n let clickTimeout: number;\r\n\r\n // will remove ajax=[0-9]+ from url string\r\n function removeAjax(url: string) {\r\n let m = url.match(/[?&](ajax=\\d+)(?:&|$)/);\r\n if (m) {\r\n let query = url.split('?');\r\n let params = query[1].split('&');\r\n params.splice(params.indexOf(m[1]), 1);\r\n url = query[0] + (params.length ? '?' + params.join('&') : '');\r\n }\r\n return url;\r\n };\r\n\r\n function internalLink(url: string): boolean {\r\n return !!url.match(/^(?:\\/|\\?)/);\r\n };\r\n\r\n export function reload() {\r\n load(window.location.href);\r\n }\r\n\r\n export function removeLastRequest() {\r\n lastRequest = null;\r\n clearTimeout(clickTimeout);\r\n }\r\n\r\n export function getBestTitle(scope: HTMLElement | DocumentFragment | Document = document) {\r\n let title: string[] = [];\r\n let result = <HTMLElement | null>document.querySelector('#nav nav ul li.selected > a');\r\n if (result) {\r\n title.push(result.innerText.trim());\r\n }\r\n result = Array.from(<NodeListOf<HTMLElement>>scope.querySelectorAll('h1,h2,h3,h4')).reduce((previous: HTMLElement|null, current: HTMLElement) => {\r\n if (!previous || current.tagName < previous.tagName) {\r\n previous = current;\r\n }\r\n return previous;\r\n }, null);\r\n if (!result) {\r\n result = document.querySelector('#nav nav ul li.subselected > a');\r\n }\r\n if (result && result.innerText) {\r\n title.push(result.innerText.trim());\r\n }\r\n return title.join(' - ');\r\n }\r\n\r\n export function pushState(url: string, title: string = '', owner = \"Viggo\") {\r\n if (!title) {\r\n title = getBestTitle();\r\n }\r\n window.history.pushState({ owner: owner, url: url }, title, url);\r\n let t = document.querySelector('title');\r\n if (t) {\r\n if (t.firstChild) {\r\n t.firstChild.nodeValue = title;\r\n } else {\r\n viggo.dom.empty(t);\r\n t.appendChild(viggo.dom.text(title));\r\n }\r\n }\r\n document.title = title;\r\n }\r\n\r\n export function load(url: string, object: LoadOptions = {}) {\r\n let hash: string|null = url.split('#')[1];\r\n if (hash) {\r\n let element = document.getElementById(hash);\r\n if (element) {\r\n element.classList.add('loading-spinner');\r\n viggo.load.abortLoadingElements(element);\r\n } else {\r\n url = removeAjax(url);\r\n hash = null;\r\n }\r\n } else {\r\n viggo.load.abortLoadingElements(document.body);\r\n }\r\n\r\n return new viggo.ajax({\r\n method: 'get',\r\n url: url.split(\"#\")[0],\r\n convert: false,\r\n multisender: object.multisender,\r\n complete: function (this: XMLHttpRequest, response: string) {\r\n clickTimeout = window.setTimeout(function () {\r\n lastRequest = null;\r\n }, 5000);\r\n let type: string|null = this.getResponseHeader('Content-Type');\r\n if (type) {\r\n type = type.split(';')[0];\r\n }\r\n if (type == 'application/javascript') {\r\n let func = new Function(response);\r\n func();\r\n return;\r\n }\r\n if (type != 'text/html') {\r\n throw \"Unexpected response: \" + type;\r\n } else {\r\n let scrollElement: Element | null = null;\r\n let scrolls: ObjectOf<number> = {};\r\n if (typeof object.noScroll == 'string') {\r\n object.noScroll.split(',').forEach(selector => {\r\n let element = document.querySelector(selector);\r\n if (element) {\r\n scrolls[selector] = element.scrollTop;\r\n }\r\n });\r\n }\r\n if (object.clearSelector) {\r\n document.querySelectorAll(object.clearSelector).forEach(x => viggo.dom.empty(x));\r\n }\r\n let body: string | null | DocumentFragment = response;\r\n let htmlId: string = '';\r\n if (!hash) {\r\n htmlId = (response.match(/<html .*?id=\"([^\"]+)\"/)||['',document.documentElement!.id])[1];\r\n body = viggo.dom.betweenTags(response, 'body');\r\n let style = response.match(/<link .*?href=\"([^\"]+?viggo(?:\\.min)?\\.css[^\"]+)\"/);\r\n if (style) {\r\n let version = viggo.func.getStyleVersion(style[1]);\r\n if (version && version != styleVersion) {\r\n reloadNext = true;\r\n console.log('full reload style');\r\n }\r\n }\r\n let script = response.match(/<script .*?src=\"([^\"]+?bundle(?:\\.min)?\\.js[^\"]+)\"/);\r\n if (script) {\r\n let version = viggo.func.getScriptVersion(script[1]);\r\n if (version && version != scriptVersion) {\r\n reloadNext = true;\r\n console.log('full reload script');\r\n }\r\n }\r\n }\r\n let scripts: string[] = [];\r\n // no javascript-downloads\r\n body = body.replace(/<script (?:.*)?src=\"[^>]+>\\s*<\\/script>/g, '');\r\n body = body.replace(/<script (?:.*)?type=\"text\\/javascript\"[^>]*>((?:.|\\r|\\n)*?)<\\/script>/mg, function (all, script) {\r\n scripts.push(script);\r\n return \"\";\r\n });\r\n body = body.trim();\r\n body = viggo.dom.parseHTML(body);\r\n\r\n let owner: HTMLElement | null;\r\n if (hash) {\r\n owner = document.getElementById(hash);\r\n if (owner) {\r\n owner.classList.remove('loading-spinner');\r\n switch (object.appendType) {\r\n case LoadAppendType.prepend:\r\n owner.insertBefore(<DocumentFragment>body, owner.firstChild);\r\n break;\r\n case LoadAppendType.append:\r\n owner.appendChild(body);\r\n break;\r\n case LoadAppendType.replaceOwner:\r\n scrollElement = <Element>owner.parentNode;\r\n scrollElement.replaceChild(body, owner);\r\n if (scrollElement.classList.contains('modal')) {\r\n viggo.modal.setupClose(scrollElement);\r\n }\r\n break;\r\n case LoadAppendType.replace:\r\n default:\r\n viggo.dom.empty(owner);\r\n owner.appendChild(body);\r\n break;\r\n }\r\n }\r\n } else {\r\n owner = body.querySelector('div[id=\"page\"]');\r\n if (owner) {\r\n document.body.replaceChild(owner, document.getElementById('page')!);\r\n if (htmlId) {\r\n document.documentElement!.id = htmlId;\r\n switch (htmlId) {\r\n case 'area-administrator':\r\n viggo.autocomplete.setUrl(\"\", \"/Shared/Search/GetAutoCompleteDataAllUsers\");\r\n break;\r\n default:\r\n viggo.autocomplete.setUrl(\"\", \"/Shared/Search/GetautocompleteData\");\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n let realUrl = removeAjax(this.responseURL.split(\"#\")[0]);\r\n if (object.pushState) {\r\n let title = getBestTitle(owner||document);\r\n viggo.history.pushState(realUrl, title);\r\n //if (window.ga) {\r\n // window.ga('send', 'pageview', { page: u, title: title });\r\n //}\r\n }\r\n if (!object.noScroll) {\r\n if (!hash) {\r\n document.body.scrollTop = document.documentElement!.scrollTop = 0;\r\n } else {\r\n var x = window.pageXOffset,\r\n y = window.pageYOffset;\r\n let element: Element | null = scrollElement || document.getElementById(hash);\r\n if (element) {\r\n element.scrollIntoView();\r\n }\r\n }\r\n } else if (typeof object.noScroll == 'string') {\r\n for (let selector in scrolls) {\r\n let element = document.querySelector(selector);\r\n if (element) {\r\n element.scrollTop = scrolls[selector];\r\n }\r\n }\r\n }\r\n\r\n if (owner && owner.id == 'page') {\r\n let main = document.querySelector('main');\r\n if (main) {\r\n let ev = new UIEvent('scroll');\r\n main.dispatchEvent(ev);\r\n }\r\n }\r\n\r\n var ev = new CustomEvent('statepushed', { bubbles: true });\r\n var target = hash ? (scrollElement || document.getElementById(hash)) : document.body;\r\n if (target) {\r\n target.dispatchEvent(ev);\r\n }\r\n\r\n let appleBugs = 0;\r\n scripts.forEach(x => {\r\n try {\r\n if (!appleBugs) {\r\n let fn = new Function(x);\r\n fn.call(null);\r\n }\r\n } catch (e) {\r\n if (viggo.error.isAppleSpecificBug(e)) {\r\n appleBugs++;\r\n } else {\r\n let info = viggo.error.analyze(e, x);\r\n console.error(e);\r\n if (viggo.isDevelopment) {\r\n console.log(info.message);\r\n } else {\r\n let err = new viggo.error(new ErrorEvent('error', {\r\n colno: info.columnNumber,\r\n error: e,\r\n filename: url,\r\n lineno: info.lineNumber,\r\n message: e.message\r\n }));\r\n err.report(info.message);\r\n }\r\n }\r\n }\r\n });\r\n\r\n if (appleBugs) {\r\n if (object.pushState) {\r\n window.location.href = realUrl;\r\n } else {\r\n window.location.reload();\r\n }\r\n } else {\r\n if (object.complete) {\r\n object.complete.call(<Element>target, <Element>target);\r\n }\r\n }\r\n\r\n if (owner) {\r\n viggo.load.loadChildren(owner, object.loader || \"click\");\r\n if (owner.dataset.loadClear) {\r\n document.querySelectorAll(owner.dataset.loadClear).forEach(x => viggo.dom.empty(x));\r\n }\r\n }\r\n }\r\n },\r\n error: function (this: XMLHttpRequest, xhr: XMLHttpRequest, response: string, exception: Error, contentType: string) {\r\n if (hash) {\r\n let elm = document.getElementById(hash);\r\n if (elm) {\r\n elm.classList.add('load-failed');\r\n if (['text/javascript', 'application/javascript', 'x-application/javascript'].indexOf(contentType) != -1) {\r\n eval(xhr.responseText);\r\n } else if (viggo.isDevelopment) {\r\n let iframe = viggo.dom.tag('iframe', { style: { width: '100%', height: xhr.status == 403 ? '150px' : '300px' } });\r\n (<HTMLElement>elm).appendChild(viggo.dom.tag('h5', { title: xhr.responseURL }, `${xhr.status} ${xhr.statusText}`));\r\n (<HTMLElement>elm).appendChild(iframe);\r\n let doc = iframe.contentWindow!.document;\r\n doc.open();\r\n doc.write(xhr.responseText);\r\n doc.close();\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n window.addEventListener('click', function (event: MouseEvent) {\r\n let target = <HTMLAnchorElement>viggo.dom.parent(<Element>event.target, 'a');\r\n let fullReload = reloadNext;\r\n if (event.button === 0 && target && target.href && internalLink(target.getAttribute('href') + \"\") && !(event.shiftKey || event.ctrlKey || event.metaKey || event.altKey) && !target.classList.contains('no-ajax') && !target.closest('[contenteditable=\"true\"]')) {\r\n var obj: LoadOptions = {};\r\n if (!target.classList.contains('no-history')) {\r\n obj.pushState = true;\r\n } else {\r\n fullReload = false;\r\n }\r\n obj.appendType = LoadAppendType.replace;\r\n for (let type in LoadAppendType) {\r\n if (target.classList.contains(type)) {\r\n obj.appendType = <LoadAppendType>type;\r\n fullReload = false;\r\n break;\r\n }\r\n }\r\n let href: string = target.href;\r\n if (target.classList.contains('append-query-string')) {\r\n href = viggo.appendQueryString(href);\r\n fullReload = false;\r\n }\r\n obj.noScroll = target.classList.contains('no-scroll');\r\n obj.loader = <LoadCheckInitiator>target.dataset.loadInitiator || 'click';\r\n let clearSelector = target.dataset.clearArea;\r\n if (!clearSelector) {\r\n let m = target.className.match(/clearArea_([^ ]+)/);\r\n if (m) {\r\n clearSelector = '#' + m[1];\r\n }\r\n }\r\n if (clearSelector) {\r\n obj.clearSelector = clearSelector;\r\n fullReload = false;\r\n }\r\n if (href.indexOf('ajax=1') != -1) {\r\n fullReload = false;\r\n }\r\n if (!lastRequest || lastRequest.url != href || Date.now() - lastRequest.timestamp > 10000 || !viggo.ajax.wasLastRequest('GET', href)) {\r\n viggo.ajax.cancelAllRequests();\r\n if (!fullReload) {\r\n load(href, obj);\r\n event.preventDefault();\r\n } else {\r\n console.log('making full reload');\r\n }\r\n clearTimeout(clickTimeout);\r\n lastRequest = {\r\n url: href,\r\n timestamp: Date.now()\r\n };\r\n } else {\r\n event.preventDefault();\r\n }\r\n } else if (target && target.getAttribute('href') == '#') {\r\n event.preventDefault();\r\n }\r\n }, false);\r\n\r\n let start = function () {\r\n setTimeout(function () {\r\n var navigate = function (url: string) {\r\n var m = viggo.modal.getLatestModal();\r\n if (m) {\r\n m.forceClose();\r\n }\r\n load(url, {});\r\n };\r\n scriptVersion = viggo.func.getScriptVersion();\r\n styleVersion = viggo.func.getStyleVersion();\r\n window.addEventListener('popstate', function (event: PopStateEvent) {\r\n if (event.state) {\r\n switch (event.state.owner) {\r\n case 'Viggo':\r\n navigate(window.location.href);\r\n break;\r\n case 'ViggoModal':\r\n navigate(window.location.href.replace(/#.*$/, ''));\r\n break;\r\n }\r\n } else {\r\n navigate(window.location.href);\r\n }\r\n }, false);\r\n }, 1000);\r\n window.removeEventListener('load', start, false);\r\n };\r\n window.addEventListener('load', start, false);\r\n}","namespace viggo {\r\n interface ParsedHTML {\r\n html: string;\r\n scripts: string[];\r\n }\r\n\r\n interface Preloader {\r\n html: string;\r\n }\r\n\r\n interface PreloaderList {\r\n [index: string]: Preloader | undefined;\r\n }\r\n\r\n export type LoadCheckInitiator = \"init\" | \"click\" | \"load\" | \"invalidate\" | \"click-no-clear\";\r\n export class load {\r\n private url: string;\r\n private static loaders = 0;\r\n\r\n constructor(url: string) {\r\n this.url = url;\r\n }\r\n\r\n async html(signal: AbortSignal) {\r\n let response = await fetch(this.url, {signal: signal});\r\n let contentType = response.headers.get(\"content-type\");\r\n if (contentType) {\r\n contentType = contentType.split(';')[0];\r\n }\r\n\r\n let content = await response.text();\r\n\r\n switch (contentType) {\r\n case 'text/html':\r\n return this.parseHTML(content);\r\n case 'text/javascript':\r\n case 'application/javascript':\r\n try {\r\n let func = new Function(content);\r\n func();\r\n } catch (e) {}\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n public static abortLoadingElements(parent: Element) {\r\n AreaLoader.abortLoadingElements(parent);\r\n }\r\n\r\n static async loadChildren(element: HTMLElement | Document = document, initiator: LoadCheckInitiator = 'load', parameters: DOMStringMap = {}) {\r\n let result: Promise<void>[] = [];\r\n (<NodeListOf<HTMLElement>>element.querySelectorAll('[data-load-url]')).forEach(x => {\r\n let loader = new AreaLoader(x, x.dataset.loadUrl!, initiator, x.dataset.loadPreloadTemplate, parameters);\r\n if (loader.isLoadable) {\r\n AreaLoader.abortLoadingElements(x);\r\n result.push(loader.load());\r\n }\r\n });\r\n this.loaders += result.length;\r\n await Promise.all(result);\r\n this.loaders -= result.length;\r\n }\r\n\r\n static loadParent(element: Element, initiator: LoadCheckInitiator = 'invalidate', parameters: DOMStringMap = {}) {\r\n let parent = <HTMLElement | null>element.closest('[data-load-url]');\r\n while (parent) {\r\n let loader = new AreaLoader(parent, parent.dataset.loadUrl!, initiator, parent.dataset.loadPreloadTemplate, parameters);\r\n if (loader.isLoadable) {\r\n AreaLoader.abortLoadingElements(parent);\r\n return loader.load();\r\n }\r\n parent = parent.parentElement;\r\n if (parent) {\r\n parent = parent.closest('[data-load-url]');\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static isIdle() {\r\n return this.loaders == 0;\r\n }\r\n\r\n private parseHTML(html: string): DocumentFragment {\r\n let parsedResult = this.getScripts(html);\r\n let result = viggo.dom.parseHTML(parsedResult.html);\r\n for (let script of parsedResult.scripts) {\r\n let scriptNode = viggo.dom.tag('script');\r\n scriptNode.type = 'text/javascript';\r\n scriptNode.appendChild(viggo.dom.text(script));\r\n result.appendChild(scriptNode);\r\n }\r\n return result;\r\n }\r\n\r\n private getScripts(html: string): ParsedHTML {\r\n let scripts: string[] = [];\r\n html = html.replace(/<script (?:.*)?src=\"[^>]+>\\s*<\\/script>/g, ''); // ignore javascripts with src tags\r\n html = html.replace(/<script (?:.*)?type=\"text\\/javascript\"[^>]*>((?:.|\\r|\\n)*?)<\\/script>/mg, function (all, script) {\r\n scripts.push(script);\r\n return \"\";\r\n });\r\n return {\r\n html: html.trim(),\r\n scripts: scripts\r\n };\r\n }\r\n }\r\n\r\n class AreaLoader {\r\n private url: string | null;\r\n private initiator: LoadCheckInitiator;\r\n private preloaderName?: string;\r\n private parameters: DOMStringMap;\r\n public element: HTMLElement;\r\n public static preloaders: PreloaderList = {};\r\n private static abortLoading: WeakMap<Element, AbortController> = new WeakMap<Element, AbortController>();\r\n\r\n // url parameter are specified in special format with curly brackets\r\n // url example: /Test/{id}/{subid?}?folder={folder?}&name={name=Stig}\r\n // In this example {id} must be present, and {subid} can be present.\r\n // {folder} can be present, but is removed if unavaliable\r\n // {name} can be present, but if not, \"Stig\" will be the value of name\r\n // {id} and {subid} are loaded from the /[0-9]+/[0-9]+ in the end of an url\r\n constructor(element: HTMLElement, url: string, initiator: LoadCheckInitiator, preloaderName: string | undefined, parameters: DOMStringMap) {\r\n this.element = element;\r\n this.parameters = parameters;\r\n this.url = this.parseUrl(url);\r\n this.initiator = initiator;\r\n this.preloaderName = preloaderName;\r\n }\r\n\r\n private parseUrl(url: string) {\r\n let query = viggo.mapQueryString(window.location.href);\r\n if (!query.id) {\r\n let idMatch = window.location.href.match(new RegExp(\"/(-?\\\\d+)(?:/(-?\\\\d+))?\"));\r\n if (idMatch) {\r\n query.id = idMatch[1];\r\n if (idMatch[2] && !query.subid) {\r\n query.subid = idMatch[2];\r\n }\r\n }\r\n }\r\n let match = window.location.pathname.match(/^\\/([A-Z][a-z]+)\\/([A-Z][A-Za-z]+)(?:\\/([A-Z][A-Za-z]+))?(?:\\/([A-Z][A-Za-z]+))?/);\r\n if (match) {\r\n query.Area = match[1];\r\n if (match[4]) {\r\n query.SubArea = match[2];\r\n query.Controller = match[3];\r\n query.Action = match[4];\r\n } else {\r\n query.Controller = match[2];\r\n query.Action = match[3] || 'Index';\r\n }\r\n }\r\n\r\n for (let param in this.parameters) {\r\n query[param] = this.parameters[param]!;\r\n }\r\n\r\n let validUrl = true;\r\n url = viggo.func.createTemplate(url, 'url')(query);\r\n url = url.replace(/(\\/|&?\\w+==?)\\{([^\\}]*)\\}/g, (all: string) => {\r\n if (!validUrl) {\r\n return all;\r\n }\r\n return all.replace(/(\\/|&?\\w+==?)\\{([^\\}]*)\\}/, (a: string, slashParam: string, valueName: string) => {\r\n let match = valueName.match(/^\\w+==(.+)/);\r\n let conditionList = match ? match[1].split('|') : null;\r\n match = valueName.match(/^\\w+=(.*)$/);\r\n let defaultValue = !conditionList && match ? match[1] : null;\r\n match = valueName.match(/^\\w+\\?$/);\r\n let optional = !!match;\r\n match = valueName.match(/\\w+/);\r\n valueName = match ? match[0] : '';\r\n\r\n if (valueName in query) {\r\n if (conditionList) {\r\n validUrl = conditionList.indexOf(query[valueName]) != -1;\r\n if (!validUrl) {\r\n let defaultConditionValue = conditionList[conditionList.length - 1];\r\n let prefix = 'default:';\r\n if (defaultConditionValue && defaultConditionValue.startsWith(prefix)) {\r\n defaultConditionValue = defaultConditionValue.substring(prefix.length);\r\n validUrl = true;\r\n return slashParam + defaultConditionValue;\r\n }\r\n }\r\n }\r\n return slashParam + query[valueName];\r\n } else if (optional) {\r\n return '';\r\n } else if (defaultValue !== null) {\r\n return slashParam + defaultValue;\r\n } else {\r\n validUrl = false;\r\n return '';\r\n }\r\n });\r\n });\r\n return validUrl ? url : null;\r\n }\r\n\r\n private addAjax(url: string) {\r\n return url + (url.split('?')[1] ? '&' : (url.indexOf('?') == -1 ? '?' : '')) + 'ajax=1';\r\n }\r\n\r\n private preload(name: string) {\r\n let preloader = AreaLoader.preloaders[name];\r\n if (preloader) {\r\n let fragment = viggo.func.createViewFromString(preloader.html);\r\n this.element.appendChild(fragment);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private preloadIfEmpty() {\r\n if (this.preloaderName && this.element.childNodes.length == 0) {\r\n return this.preload(this.preloaderName);\r\n }\r\n return false;\r\n }\r\n\r\n public static abortLoadingElements(parent: Element) {\r\n this.abortLoad(parent);\r\n parent.querySelectorAll('[data-load-url]').forEach(element => {\r\n this.abortLoad(element);\r\n });\r\n }\r\n\r\n private static abortLoad(element: Element) {\r\n let abort = this.abortLoading.get(element);\r\n if (abort) {\r\n abort.abort();\r\n this.abortLoading.delete(element);\r\n }\r\n }\r\n\r\n public async load() {\r\n if (this.url) {\r\n let loadingClassName = 'loading-spinner';\r\n if (this.preloadIfEmpty()) {\r\n loadingClassName = 'loading-preload';\r\n }\r\n this.element.classList.add(loadingClassName);\r\n var abort = new AbortController();\r\n AreaLoader.abortLoading.set(this.element, abort);\r\n let loader = new load(this.addAjax(this.url));\r\n let fragment: DocumentFragment | null = null;\r\n try {\r\n fragment = await loader.html(abort.signal);\r\n this.element.classList.remove(loadingClassName);\r\n } catch (e) {\r\n console.log(`${(<DOMException>e).message}: ${this.url}`);\r\n this.element.classList.add('load-aborted');\r\n }\r\n AreaLoader.abortLoading.delete(this.element);\r\n\r\n if (fragment) {\r\n while (this.element.lastChild) {\r\n this.element.removeChild(this.element.lastChild);\r\n }\r\n this.element.classList.remove('loading-spinner', 'loading-preload', 'load-aborted');\r\n this.element.appendChild(fragment);\r\n if (this.initiator == \"click\") {\r\n let clearSelector = this.element.dataset.loadClear;\r\n if (clearSelector) {\r\n document.querySelectorAll(clearSelector).forEach(e => {\r\n while (e.lastChild) {\r\n e.removeChild(e.lastChild);\r\n }\r\n });\r\n }\r\n }\r\n viggo.load.loadChildren(this.element, \"load\");\r\n }\r\n }\r\n }\r\n\r\n get isLoadable() {\r\n return !!this.url;\r\n }\r\n }\r\n fetch('/Scripts/preloader-templates.json').then(x => x.json()).then(x => AreaLoader.preloaders = x);\r\n\r\n viggo.ready(function() {\r\n viggo.load.loadChildren(document.body, \"init\");\r\n });\r\n}\r\n","/*\r\nUndo and notices\r\nDefinitions:\r\n viggo.undo(type, text, actions);\r\n viggo.notice(type, text);\r\n\r\nExamples:\r\n viggo.undo('delete', 'Pages was deleted.', [{\r\n description: \"Fortryd\",\r\n className: \"rollback\",\r\n callback: function(){viggo.ajax({method: 'post', url: '/UndoUrl'});}\r\n }]);\r\n viggo.notice('complete', 'Filen blev uploadet.')\r\n*/\r\nmodule viggo {\r\n let div: HTMLElement|null, hideTimeout = 0;\r\n function remove() {\r\n clearTimeout(hideTimeout);\r\n if (div) {\r\n div.remove();\r\n }\r\n div = null;\r\n }\r\n export enum NoticeType {\r\n notice = 'notice', // 0\r\n complete = 'complete', // 1\r\n warning = 'warning', // 2\r\n error = 'error', // 3\r\n success = 'success', // 4\r\n notsaved = 'notsaved', // 5\r\n delete = 'delete' // 100\r\n };\r\n interface NoticeAction {\r\n description: string,\r\n className?: string,\r\n url?: string,\r\n callback?: string | NoticeCallback\r\n }\r\n type NoticeCallback = (event: Event) => void|boolean;\r\n\r\n function createDom(type: NoticeType, text: string, actions?: NoticeAction|NoticeAction[], hideDelay: number = 4000) {\r\n remove();\r\n let fragment = viggo.dom.fragment();\r\n text.split(\"\\n\").forEach((x, index) => {\r\n if (index) {\r\n fragment.appendChild(viggo.dom.tag('br'));\r\n }\r\n fragment.appendChild(viggo.dom.text(x));\r\n });\r\n\r\n div = viggo.dom.tag('div', {\r\n id: 'notice',\r\n className: type\r\n },\r\n viggo.dom.tag('i', { className: 'flaticon-' + type }),\r\n viggo.dom.tag('p', null, fragment),\r\n viggo.dom.tag('a', {\r\n className: 'close',\r\n onclick: (event: MouseEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n hide(true);\r\n }\r\n })\r\n );\r\n if (actions) {\r\n let createAction = function (action: NoticeAction) {\r\n let a = viggo.dom.tag('a', {\r\n href: '#',\r\n className: action.className || '',\r\n onclick: function (event: MouseEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n viggo.history.removeLastRequest();\r\n if (action.callback) {\r\n var callback: string | NoticeCallback = action.callback;\r\n if (typeof callback == 'string') {\r\n callback = <NoticeCallback>new Function(\"event\", callback);\r\n }\r\n if (callback.call(a, event) !== false) {\r\n hide(true);\r\n }\r\n } else if (action.url) {\r\n new viggo.ajax({\r\n method: 'post',\r\n url: action.url\r\n });\r\n hide(true);\r\n }\r\n }\r\n }, action.description || '');\r\n div!.appendChild(a);\r\n };\r\n\r\n if (actions) {\r\n if (actions.constructor == Array) {\r\n (<NoticeAction[]>actions).forEach(x => createAction(x));\r\n } else {\r\n createAction(<NoticeAction>actions);\r\n }\r\n }\r\n }\r\n if (hideDelay >= 0) {\r\n let f = function () {\r\n document.removeEventListener('click', f, false);\r\n if (div) {\r\n hide(true);\r\n }\r\n };\r\n switch (type) {\r\n case NoticeType.notice:\r\n case NoticeType.complete:\r\n if (!actions) {\r\n hideTimeout = window.setTimeout(f, hideDelay);\r\n break;\r\n } // don't break\r\n default:\r\n hideTimeout = window.setTimeout(function () {\r\n document.addEventListener('click', f, false);\r\n }, hideDelay);\r\n break;\r\n }\r\n }\r\n return document.body.appendChild(div);\r\n //viggo.vibrate([100, 200, 100, 200, 100]);\r\n }\r\n function hide(fast?: boolean) {\r\n clearTimeout(hideTimeout);\r\n new viggo.effect({\r\n element: div,\r\n style: 'opacity',\r\n from: 0.95,\r\n to: 0,\r\n duration: fast ? 100 : 200,\r\n complete: remove\r\n });\r\n }\r\n /*\r\n TODO:\r\n Evt. ændre parametrerne til noget mere action-specifikt.\r\n */\r\n export function undo(type: NoticeType, text: string, actions?: NoticeAction|NoticeAction[], hideDelay?: number) {\r\n return createDom(type, text, actions, hideDelay);\r\n }\r\n export function notice(type: NoticeType, text: string, hideDelay?: number) {\r\n return viggo.undo(type, text, undefined, hideDelay);\r\n }\r\n}","module viggo {\r\n function zero(s: number | number): string {\r\n return s < 10 ? '0' + s : s+'';\r\n }\r\n interface ClockOptions {\r\n servertime: number;\r\n dateformat: string;\r\n timeformat: string;\r\n parent: HTMLElement;\r\n }\r\n export class clock {\r\n private dateNode: Node;\r\n private timeNode: Node;\r\n private servertime: number;\r\n private dateformat: string;\r\n private timeformat: string;\r\n private interval: number = 0;\r\n private animationFrame: number = 0;\r\n private static clientTime: number = Date.now();\r\n constructor(options: ClockOptions) {\r\n this.dateformat = options.dateformat;\r\n this.timeformat = options.timeformat;\r\n this.servertime = options.servertime;\r\n let parent = options.parent;\r\n let elm = parent.querySelector('.date');\r\n if (elm && elm.firstChild) {\r\n this.dateNode = elm.firstChild;\r\n } else {\r\n throw new Error('Missing element with class \"date\" in clock');\r\n }\r\n elm = parent.querySelector('.time');\r\n if (elm && elm.firstChild) {\r\n this.timeNode = elm.firstChild;\r\n } else {\r\n throw new Error('Missing element with class \"time\" in clock');\r\n }\r\n clearInterval(this.interval);\r\n this.refresh();\r\n let body = document.body;\r\n this.interval = window.setInterval(() => {\r\n cancelAnimationFrame(this.animationFrame);\r\n // airtame weirdness.\r\n if (body && body.contains(parent)) {\r\n this.animationFrame = requestAnimationFrame(() => this.refresh());\r\n } else {\r\n clearInterval(this.interval);\r\n }\r\n }, 1000);\r\n }\r\n public static setTime(date: number) {\r\n clock.clientTime = date;\r\n }\r\n private refresh() {\r\n let timedif = this.servertime - clock.clientTime;\r\n let now = new Date();\r\n now.setTime(now.getTime() + timedif);\r\n this.dateNode.nodeValue = now.format(this.dateformat);\r\n this.timeNode.nodeValue = now.format(this.timeformat);\r\n }\r\n }\r\n}","module viggo {\r\n interface TemplateData {\r\n user?: AutoCompleteUser | null;\r\n data: DOMStringMap;\r\n }\r\n\r\n type TemplateCallback = (item: TemplateData) => string;\r\n\r\n export class hint {\r\n private static owner = viggo.dom.tag('div', {id: 'hint'});\r\n private static blocked = 0;\r\n private ajaxTimeout = 0;\r\n private static instance: hint | null;\r\n private static templates: { [index: string]: TemplateCallback };\r\n private hintOwner: Node | null = null;\r\n private hintParent: Node | null = null;\r\n public hintElement: Element | null = null;\r\n private beforeHintNode: Node | null = null;\r\n constructor(element: HTMLElement, customHint?: Element) {\r\n if (hint.blocked) {\r\n throw new Error('Hint is blocked');\r\n }\r\n if (!hint.blocked && (!hint.instance || element != hint.instance.hintOwner) && !viggo.isMobileDevice) {\r\n let found: Element | null | undefined = customHint;\r\n if (!found) {\r\n found = element.nextElementSibling;\r\n if (found && !found.classList.contains('hint')) {\r\n found = null;\r\n }\r\n }\r\n if (!found) {\r\n found = element.querySelector('.hint');\r\n }\r\n if (found) {\r\n this.initializeHint(found, element);\r\n } else {\r\n this.createHintFromTemplate(element).then(div => {\r\n if (div) {\r\n this.initializeHint(div, element);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n private initializeHint(found: Element, element: HTMLElement) {\r\n hint.remove();\r\n hint.instance = this;\r\n this.hintElement = found;\r\n let ajaxLink = <HTMLAnchorElement>this.hintElement.querySelector('a.ajax-hint');\r\n if (ajaxLink) {\r\n this.ajaxTimeout = window.setTimeout(() => {\r\n hint.loadAjaxHint(ajaxLink);\r\n }, parseInt(ajaxLink.dataset.hintDelay || '500'));\r\n }\r\n this.hintOwner = element;\r\n this.hintParent = this.hintElement.parentNode;\r\n this.beforeHintNode = this.hintElement.nextSibling;\r\n clearTimeout(hint.hintTimeout);\r\n this.show();\r\n let f = (event: Event) => {\r\n if (!hint.isChildOf(<Element>event.target, <Element>this.hintOwner) && !hint.isChildOf(<Element>event.target, hint.owner)) {\r\n hint.hide();\r\n document.removeEventListener('mouseover', f, true);\r\n document.removeEventListener('touchstart', f, true);\r\n }\r\n };\r\n document.addEventListener('mouseover', f, true);\r\n document.addEventListener('touchstart', f, true);\r\n this.followmouse();\r\n }\r\n private async createHintFromTemplate(target: HTMLElement) {\r\n let template = target.dataset.hint;\r\n if (template) {\r\n let data: TemplateData = {\r\n data: target.dataset\r\n };\r\n if (target.dataset.userId) {\r\n data.user = await viggo.autocomplete.getUser(parseInt(target.dataset.userId));\r\n if (!data.user) {\r\n return null;\r\n //data.user = viggo.autocomplete.createFakeUser();\r\n }\r\n }\r\n return viggo.func.createView(data, hint.templates[template]).querySelector('.hint');\r\n }\r\n return null;\r\n }\r\n private show() {\r\n hint.owner.appendChild(<Element>this.hintElement);\r\n document.body.appendChild(hint.owner);\r\n }\r\n private static isChildOf(element: Element, parent: Element) {\r\n let result = parent != null;\r\n let block = element.closest('.blockhint');\r\n if (block && result) {\r\n result = !parent.contains(block);\r\n }\r\n return result && parent.contains(element);\r\n }\r\n public static x: number = 0;\r\n public static y: number = 0;\r\n public remove() {\r\n if (this.hintParent) {\r\n this.hintParent.insertBefore(<Element>this.hintElement, this.beforeHintNode);\r\n } else if (this.hintElement && this.hintElement.parentNode) {\r\n this.hintElement.parentNode.removeChild(this.hintElement);\r\n } else if (this.hintElement) {\r\n viggo.dom.empty(this.hintElement);\r\n }\r\n clearTimeout(this.ajaxTimeout);\r\n document.removeEventListener('mousemove', hint.followListener, true);\r\n document.removeEventListener('touchmove', hint.followListener, true);\r\n document.removeEventListener('dragover', hint.followListener, true);\r\n hint.owner.remove();\r\n this.hintElement = this.hintParent = this.beforeHintNode = this.hintOwner = null;\r\n }\r\n private followmouse() {\r\n document.addEventListener('mousemove', hint.followListener, true);\r\n document.addEventListener('touchmove', hint.followListener, true);\r\n document.addEventListener('dragover', hint.followListener, true);\r\n hint.followListener();\r\n }\r\n private static followListener() {\r\n let offsetWidth = hint.owner.offsetWidth,\r\n offsetHeight = hint.owner.offsetHeight;\r\n let page = viggo.getTopScrollable();\r\n\r\n let maxX = page.offsetWidth - offsetWidth - 20,\r\n maxY = page.offsetHeight - offsetHeight - 30;\r\n\r\n if (maxY < hint.y && maxX < hint.x) {\r\n hint.x -= hint.owner.offsetWidth;\r\n }\r\n\r\n hint.owner.style.top = Math.min(hint.y, maxY) + 'px';\r\n hint.owner.style.left = Math.min(hint.x, maxX) + 'px';\r\n }\r\n\r\n public static loadAjaxHint(a: HTMLAnchorElement, complete?: ()=>void) {\r\n let parent = a.parentNode;\r\n new viggo.ajax({\r\n method: 'get',\r\n url: a.href,\r\n convert: 'html',\r\n complete: function (html) {\r\n if (a.parentNode == parent && parent) {\r\n parent.replaceChild(html, a);\r\n if (complete) {\r\n complete();\r\n }\r\n var ev = new CustomEvent('viggoHintLoad', {\r\n bubbles: true,\r\n cancelable: false\r\n });\r\n parent = viggo.dom.parentClass(<Element>parent, 'hint');\r\n if (parent) {\r\n parent.dispatchEvent(ev);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n private static hintTimeout = 0;\r\n private static hide() {\r\n clearTimeout(hint.hintTimeout);\r\n hint.hintTimeout = window.setTimeout(()=>hint.remove(), 1);\r\n };\r\n\r\n public static remove() {\r\n if (hint.instance) {\r\n hint.instance.remove();\r\n }\r\n }\r\n\r\n public static getFirstHinted(target: Element|null) {\r\n let result = target && target.closest ? <HTMLElement|null>target.closest('.hinted,.blockhint') : null;\r\n return result && result.classList.contains('hinted') ? result : null;\r\n }\r\n\r\n public static block() {\r\n hint.blocked++;\r\n if (hint.instance) {\r\n hint.remove();\r\n }\r\n }\r\n public static unblock() {\r\n hint.blocked = Math.max(0, hint.blocked - 1);\r\n }\r\n public static get isBlocked() {\r\n return !!hint.blocked;\r\n }\r\n public static rehint(callback: () => void) {\r\n if (hint.instance) {\r\n let elm = hint.instance.hintOwner,\r\n child = hint.instance.hintElement;\r\n hint.remove();\r\n callback();\r\n new hint(<HTMLElement>elm, <Element>child);\r\n }\r\n }\r\n private static defaultDelay = '200';\r\n public static getDelay(target: HTMLElement): number {\r\n var delay = target.dataset.hintDelay || hint.defaultDelay;\r\n return parseInt(delay);\r\n }\r\n public static loadTemplates() {\r\n this.templates = {};\r\n fetch('/Scripts/hint-templates.json').then(x => x.json()).then(json => {\r\n for (let key in json) {\r\n this.templates[key] = viggo.func.createTemplate(json[key].html);\r\n }\r\n });\r\n }\r\n }\r\n\r\n document.addEventListener('statepushed', hint.remove, false);\r\n viggo.hint.loadTemplates();\r\n\r\n // show hints on mouseover with (.hinted .hint)\r\n // used when user is scrolling the page and the elementer under the cursor changes.\r\n let timeout = 0;\r\n document.addEventListener('touchstart', function (event) {\r\n clearTimeout(timeout);\r\n var target = viggo.hint.getFirstHinted(<Element>event.target);\r\n if (target) {\r\n try {\r\n new viggo.hint(target);\r\n } catch (e) {\r\n // hint is blocked\r\n }\r\n }\r\n }, false);\r\n document.addEventListener('mouseover', function (event) {\r\n clearTimeout(timeout);\r\n hint.x = event.pageX;\r\n hint.y = event.pageY;\r\n var target = viggo.hint.getFirstHinted(<Element>event.target);\r\n if (target) {\r\n var delay = viggo.hint.getDelay(<HTMLElement>target);\r\n var f = function () {\r\n try {\r\n new viggo.hint(<HTMLElement>target);\r\n } catch (e) {\r\n // hint is blocked\r\n }\r\n };\r\n if (delay) {\r\n timeout = window.setTimeout(f, delay);\r\n } else {\r\n f();\r\n }\r\n }\r\n }, false);\r\n document.addEventListener('touchmove', function (event) {\r\n hint.x = event.touches[0].pageX;\r\n hint.y = event.touches[0].pageY;\r\n }, false);\r\n document.addEventListener('mousemove', function (event) {\r\n hint.x = event.clientX;\r\n hint.y = event.clientY;\r\n }, true);\r\n document.addEventListener('dragover', function (event) {\r\n hint.x = event.clientX;\r\n hint.y = event.clientY;\r\n }, true);\r\n document.addEventListener('wheel', function (event) {\r\n clearTimeout(timeout);\r\n var target = viggo.hint.getFirstHinted(<Element>event.target);\r\n if (target) {\r\n var delay = viggo.hint.getDelay(<HTMLElement>target);\r\n var f = function () {\r\n target = viggo.hint.getFirstHinted(document.elementFromPoint(hint.x, hint.y));\r\n if (target) {\r\n try {\r\n new viggo.hint(target);\r\n } catch (e) {\r\n // hint is blocked\r\n }\r\n }\r\n };\r\n if (delay) {\r\n timeout = window.setTimeout(f, delay);\r\n } else {\r\n f();\r\n }\r\n }\r\n }, false);\r\n}","module viggo {\r\n export module imageeditor {\r\n interface ImageCropOptions {\r\n cropLeft: number;\r\n cropTop: number;\r\n cropRight: number;\r\n cropBottom: number;\r\n width: number;\r\n height: number;\r\n zoom: number;\r\n }\r\n interface IndexChanger {\r\n [index: number]: (x: number, y: number) => number;\r\n }\r\n class crop {\r\n public image: HTMLImageElement;\r\n public data: ImageCropOptions;\r\n private mouseisdown = false;\r\n/*\r\n * mousearea:\r\n * _________\r\n * | 0 1 2 |\r\n * | 3 4 5 |\r\n * | 6 7 8 |\r\n * ‾‾‾‾‾‾‾‾‾\r\n */\r\n private mousearea = 0;\r\n private lastX = 0;\r\n private lastY = 0;\r\n/**\r\n * @param image DOMImage\r\n * @param data Object\r\n * Parameter data should contain: cropLeft, cropTop, cropRight, cropBottom, width, height, zoom\r\n * width and height are positive integers\r\n * crop-paramters are flotingpoint numbers with values from [0;1[\r\n * zoom is a flotingpoint number larger than zero.\r\n */\r\n public constructor(image: HTMLImageElement, data?: ImageCropOptions) {\r\n this.image = image;\r\n this.data = data || {\r\n cropLeft: 0,\r\n cropTop: 0,\r\n cropRight: 0,\r\n cropBottom: 0,\r\n width: image.naturalWidth,\r\n height: image.naturalHeight,\r\n zoom: 1\r\n };\r\n image.classList.add('crop');\r\n image.style.width = image.width + 'px';\r\n image.style.height = image.height + 'px';\r\n let src = image.src;\r\n let original = image.dataset.originalSrc;\r\n image.src = '/Content/transparent.gif';\r\n image.style.background = `url(\"${original}\") no-repeat`;\r\n this.refresh();\r\n image.addEventListener('mousemove', (event) => this.mousemoveCursor(event));\r\n image.addEventListener('mousedown', (event) => this.mousedown(event));\r\n image.addEventListener('wheel', (event) => this.wheel(event));\r\n }\r\n\r\n\t\t protected refresh() {\r\n\t\t\t let data = this.data;\r\n\t\t\t this.image.style.width = (1 - data.cropLeft - data.cropRight) * data.zoom * data.width + 'px';\r\n\t\t\t this.image.style.height = (1 - data.cropTop - data.cropBottom) * data.zoom * data.height + 'px';\r\n\t\t\t this.image.style.backgroundPosition = (-data.cropLeft * data.width * data.zoom + 'px ') + (-data.cropTop * data.height * data.zoom + 'px');\r\n\t\t\t this.image.style.backgroundSize = (data.zoom * data.width + 'px ') + (data.zoom * data.height + 'px');\r\n\t\t }\r\n\t\t private mousemoveCursor (event: MouseEvent) {\r\n\t\t\t if (!this.mouseisdown) {\r\n\t\t\t\t let target = this.image,\r\n\t\t\t\t\t pos = viggo.dom.getPos(target),\r\n\t\t\t\t\t x = event.clientX - pos.left + window.pageXOffset,\r\n\t\t\t\t\t y = event.clientY - pos.top + window.pageYOffset,\r\n\t\t\t\t\t w = target.clientWidth,\r\n\t\t\t\t\t h = target.clientHeight,\r\n\t\t\t\t\t c = ['nw-resize', 'n-resize', 'ne-resize', 'w-resize', 'move', 'e-resize', 'sw-resize', 's-resize', 'se-resize', 'not-allowed'],\r\n\t\t\t\t\t f = 5;\r\n\r\n\t\t\t\t x = Math.floor(x / w * f);\r\n\t\t\t\t y = Math.floor(y / h * f);\r\n\r\n\t\t\t\t if (x == f - 1) {\r\n\t\t\t\t\t x = 2;\r\n\t\t\t\t } else if (x > 1) {\r\n\t\t\t\t\t x = 1;\r\n\t\t\t\t }\r\n\r\n\t\t\t\t if (y == f - 1) {\r\n\t\t\t\t\t y = 2;\r\n\t\t\t\t } else if (y > 1) {\r\n\t\t\t\t\t y = 1;\r\n\t\t\t\t }\r\n\r\n\t\t\t\t this.mousearea = y * 3 + x;\r\n\t\t\t if (this.mousearea < 0 || this.mousearea > 8) {\r\n\t\t\t this.mousearea = 9;\r\n\t\t\t }\r\n\r\n\t\t\t\t target.style.cursor = c[this.mousearea];\r\n\t\t\t }\r\n\t\t }\r\n\t\t private changers: IndexChanger = {\r\n\t\t\t 0: function(this: crop, x: number, y: number): number { // nw\r\n\t\t\t\t return this.changers[1].call(this, x, y) & this.changers[3].call(this, x, y);\r\n\t\t\t },\r\n\t\t\t 1: function(this: crop, x: number, y: number): number { // n\r\n\t\t\t\t var d = this.data;\r\n\t\t\t\t d.cropTop = d.cropTop - y / d.height / d.zoom;\r\n\t\t\t\t if (d.cropTop < 0) {\r\n\t\t\t\t\t d.cropTop = 0;\r\n\t\t\t\t\t return 1;\r\n\t\t\t\t }\r\n\t\t\t\t return 3;\r\n\t\t\t },\r\n\t\t\t 2: function(this: crop, x: number, y: number): number { // ne\r\n\t\t\t\t return \tthis.changers[1].call(this, x, y) & this.changers[5].call(this, x, y);\r\n\t\t\t },\r\n\t\t\t 3: function(this: crop, x: number, y: number): number { // w\r\n\t\t\t\t var d = this.data;\r\n\t\t\t\t d.cropLeft = d.cropLeft - x / d.width / d.zoom;\r\n\t\t\t\t if (d.cropLeft < 0) {\r\n\t\t\t\t\t d.cropLeft = 0;\r\n\t\t\t\t\t return 2;\r\n\t\t\t\t }\r\n\t\t\t\t return 3;\r\n\t\t\t },\r\n 4: function (this: crop, x: number, y: number): number { // center\r\n\t\t\t\t var d = this.data;\r\n\t\t\t\t d.cropTop = d.cropTop + y / d.height / d.zoom;\r\n\t\t\t\t d.cropLeft = d.cropLeft + x / d.width / d.zoom;\r\n\t\t\t\t d.cropRight = d.cropRight - x / d.width / d.zoom;\r\n\t\t\t\t d.cropBottom = d.cropBottom - y / d.height / d.zoom;\r\n\r\n\t\t\t\t var result = 3;\r\n\t\t\t\t if (d.cropTop < 0) {\r\n\t\t\t\t\t d.cropBottom += d.cropTop;\r\n\t\t\t\t\t d.cropTop = 0;\r\n\t\t\t\t\t result = result & 1;\r\n\t\t\t\t } else if (d.cropBottom < 0) {\r\n\t\t\t\t\t d.cropTop += d.cropBottom;\r\n\t\t\t\t\t d.cropBottom = 0;\r\n\t\t\t\t\t result = result & 1;\r\n\t\t\t\t }\r\n\r\n\t\t\t\t if (d.cropLeft < 0) {\r\n\t\t\t\t\t d.cropRight += d.cropLeft;\r\n\t\t\t\t\t d.cropLeft = 0;\r\n\t\t\t\t\t result = result & 2;\r\n\t\t\t\t } else if (d.cropRight < 0) {\r\n\t\t\t\t\t d.cropLeft += d.cropRight;\r\n\t\t\t\t\t d.cropRight = 0;\r\n\t\t\t\t\t result = result & 2;\r\n\t\t\t\t }\r\n\t\t\t\t return result;\r\n\t\t\t },\r\n 5: function (this: crop, x: number, y: number): number { // e\r\n\t\t\t\t var d = this.data;\r\n\t\t\t\t d.cropRight = d.cropRight + x / d.width / d.zoom;\r\n\t\t\t\t if (d.cropRight < 0) {\r\n\t\t\t\t\t d.cropRight = 0;\r\n\t\t\t\t\t return 2;\r\n\t\t\t\t }\r\n\t\t\t\t return 3;\r\n\t\t\t },\r\n 6: function (this: crop, x: number, y: number): number { // sw\r\n\t\t\t\t return this.changers[3].call(this, x, y) & this.changers[7].call(this, x, y);\r\n\t\t\t },\r\n 7: function (this: crop, x: number, y: number): number { // s\r\n\t\t\t\t var d = this.data;\r\n\t\t\t\t d.cropBottom = d.cropBottom + y / d.height / d.zoom;\r\n\t\t\t\t if (d.cropBottom < 0) {\r\n\t\t\t\t\t d.cropBottom = 0;\r\n\t\t\t\t\t return 1;\r\n\t\t\t\t }\r\n\t\t\t\t return 3;\r\n\t\t\t },\r\n 8: function (this: crop, x: number, y: number): number { // se\r\n\t\t\t\t return this.changers[5].call(this, x, y) & this.changers[7].call(this, x, y);\r\n\t\t\t },\r\n 9: function (this: crop, x: number, y: number): number {\r\n\t\t\t return 0;\r\n }\r\n\t\t }\r\n\t\t private mousemoveChange(event: MouseEvent) {\r\n\t\t\t var deltaX = this.lastX - event.clientX,\r\n\t\t\t\t deltaY = this.lastY - event.clientY,\r\n\t\t\t\t data = this.data;\r\n\r\n\t\t\t var result = this.changers[this.mousearea].call(this, deltaX, deltaY);\r\n\t\t\t if (result & 1) {\r\n\t\t\t\t this.lastX = event.clientX;\r\n\t\t\t }\r\n\t\t\t if (result & 2) {\r\n\t\t\t\t this.lastY = event.clientY;\r\n\t\t\t }\r\n\t\t\t this.refresh();\r\n }\r\n private mousedown(event: MouseEvent) {\r\n\t\t\t this.mouseisdown = true;\r\n\t\t\t this.lastX = event.clientX;\r\n\t\t\t this.lastY = event.clientY;\r\n\t\t\t event.preventDefault();\r\n\t\t\t event.stopPropagation();\r\n\t\t\t let move = (e: MouseEvent) => {\r\n\t\t\t\t this.mousemoveChange(e);\r\n\t\t\t }, up = (e: MouseEvent) => {\r\n\t\t\t\t this.mouseisdown = false;\r\n\t\t\t\t document.removeEventListener('mousemove', move, true);\r\n\t\t\t\t document.removeEventListener('mouseup', up, true);\r\n\t\t\t };\r\n\t\t\t document.addEventListener('mousemove', move, true);\r\n\t\t\t document.addEventListener('mouseup', up, true);\r\n\t\t }\r\n\t\t public autosize(event: MouseEvent) {\r\n let data = this.data;\r\n let parent = this.image.parentElement;\r\n if (parent) {\r\n let fullWidth = parent.clientWidth;\r\n data.zoom = fullWidth / data.width / (1 - data.cropLeft - data.cropRight);\r\n this.refresh();\r\n }\r\n }\r\n private wheel(event: WheelEvent) {\r\n\t\t\t var d = event.deltaY / Math.abs(event.deltaY);\r\n\t\t\t if (isFinite(d)) {\r\n\t\t\t\t event.preventDefault();\r\n\t\t\t\t var data = this.data;\r\n\t\t\t\t if (event.ctrlKey || event.altKey || event.shiftKey || event.metaKey) {\r\n\t\t\t\t\t data.zoom *= 1 - d / 50;\r\n\t\t\t\t } else {\r\n\t\t\t\t\t // placer øverste venstre hjørne og fokuser pÃ¥ musen ud fra hele billedet.\r\n\t\t\t\t\t // beregning af øverste venstre hjørne samt bredde og højde er vigtigst.\r\n\t\t\t\t\t var pos = viggo.dom.getPos(this.image);\r\n\r\n\t\t\t\t\t var z = data.zoom;\r\n\t\t\t\t\t var w = (1 - data.cropLeft - data.cropRight) * z * data.width;\r\n\t\t\t\t\t var h = (1 - data.cropTop - data.cropBottom) * z * data.height;\r\n\r\n\t\t\t\t var oldLeft = data.cropLeft,\r\n\t\t\t\t oldRight = data.cropRight,\r\n\t\t\t\t oldTop = data.cropTop,\r\n\t\t\t\t oldBottom = data.cropBottom,\r\n\t\t\t\t reset = false;\r\n\r\n\t\t\t\t\t var x = (event.clientX - pos.left) / w;\r\n\t\t\t\t\t var y = (event.clientY - pos.top) / h;\r\n\r\n\t\t\t\t\t data.zoom = z * (1 - d / 50);\r\n\r\n\t\t\t\t\t var nw = (1 - data.cropLeft - data.cropRight) * data.zoom * data.width;\r\n\t\t\t\t\t var nh = (1 - data.cropTop - data.cropBottom) * data.zoom * data.height;\r\n\r\n\t\t\t\t\t var difw = w - nw;\r\n\t\t\t\t\t var difh = h - nh;\r\n\r\n\t\t\t\t\t data.cropLeft -= x*difw/data.width/data.zoom;\r\n\t\t\t\t\t data.cropRight -= (1-x)*difw/data.width/data.zoom;\r\n\t\t\t\t\t data.cropTop -= y*difh/data.height/data.zoom;\r\n\t\t\t\t\t data.cropBottom -= (1 - y) * difh / data.height / data.zoom;\r\n \r\n\t\t\t\t\t if (data.cropLeft < 0 && data.cropLeft + data.cropRight >= 0) {\r\n data.cropRight += data.cropLeft;\r\n data.cropLeft = 0;\r\n } else if (data.cropRight < 0 && data.cropRight + data.cropLeft >= 0) {\r\n data.cropLeft += data.cropRight;\r\n\t\t\t\t\t data.cropRight = 0;\r\n } else if (data.cropLeft + data.cropRight < 0) {\r\n\t\t\t\t\t reset = true;\r\n\t\t\t\t\t }\r\n\r\n\t\t\t\t\t if (data.cropTop < 0 && data.cropTop + data.cropBottom >= 0) {\r\n\t\t\t\t\t data.cropTop += data.cropBottom;\r\n\t\t\t\t\t data.cropTop = 0;\r\n\t\t\t\t\t } else if (data.cropBottom < 0 && data.cropBottom + data.cropTop >= 0) {\r\n\t\t\t\t\t data.cropBottom += data.cropTop;\r\n\t\t\t\t\t data.cropBottom = 0;\r\n\t\t\t\t\t } else if (data.cropTop + data.cropBottom < 0) {\r\n\t\t\t\t\t reset = true;\r\n\t\t\t\t\t }\r\n\t\t\t\t \r\n if (reset) {\r\n data.cropLeft = oldLeft;\r\n data.cropRight = oldRight;\r\n data.cropTop = oldTop;\r\n data.cropBottom = oldBottom;\r\n data.zoom = z;\r\n }\r\n\t\t\t\t /*\r\n\t\t\t\t\t this.data.cropLeft += Math.max(z * x);\r\n\t\t\t\t\t this.data.cropRight += Math.max(z * (1 - x));\r\n\t\t\t\t\t this.data.cropTop += Math.max(z * y);\r\n\t\t\t\t\t this.data.cropBottom += Math.max(z * (1 - y));\r\n\t\t\t\t\t */\r\n\t\t\t\t }\r\n\t\t\t\t this.refresh();\r\n\t\t\t }\r\n\t\t }\r\n }\r\n\r\n interface ProfileEditorOptions {\r\n image: HTMLImageElement;\r\n zoomControl: HTMLInputElement;\r\n angleControl: HTMLInputElement;\r\n rotateElement: HTMLElement;\r\n width: number;\r\n height: number;\r\n }\r\n\r\n export class profile extends viggo.classes.eventListener {\r\n private angleAdd: number = 0;\r\n private ratioWidth: number;\r\n private ratioHeight: number;\r\n private image: HTMLImageElement;\r\n private zoomControl: HTMLInputElement;\r\n private angleControl: HTMLInputElement;\r\n private resultWidth: number;\r\n private resultHeight: number;\r\n public constructor(options: ProfileEditorOptions) {\r\n super();\r\n this.image = options.image;\r\n this.zoomControl = options.zoomControl;\r\n this.angleControl = options.angleControl;\r\n this.resultWidth = options.width;\r\n this.resultHeight = options.height;\r\n this.ratioWidth = 1;\r\n this.ratioHeight = 1;\r\n let oldZoom = this.zoom;\r\n this.zoomControl.addEventListener('input', () => {\r\n let left = this.left;\r\n let top = this.top;\r\n let centerLeft = (this.resultWidth / 2 - left) / (this.resultWidth * oldZoom);\r\n let centerTop = (this.resultHeight / 2 - top) / (this.resultHeight * oldZoom);\r\n\r\n let zoom = this.zoom;\r\n this.image.style.width = zoom * this.resultWidth * this.ratioWidth + 'px';\r\n this.image.style.height = zoom * this.resultHeight * this.ratioHeight + 'px';\r\n\r\n this.image.style.transformOrigin = `${centerLeft * this.resultWidth * zoom}px ${centerTop * this.resultHeight * zoom}px`;\r\n\r\n this.left = this.resultWidth / 2 - centerLeft * this.resultWidth * zoom;\r\n this.top = this.resultHeight / 2 - centerTop * this.resultHeight * zoom;\r\n\r\n oldZoom = zoom;\r\n this.notifyEventListener();\r\n }, false);\r\n this.angleControl.addEventListener('input', () => {\r\n this.angle = this.angle;\r\n this.notifyEventListener();\r\n }, false);\r\n this.image.addEventListener('mousedown', event => this.mousedown(event), false);\r\n options.rotateElement.addEventListener('click', () => {\r\n this.angleAdd = (this.angleAdd + 90) % 360;\r\n this.angle = this.angle;\r\n this.notifyEventListener();\r\n }, false);\r\n let f = () => {\r\n this.ratioWidth = this.image.naturalWidth / this.image.naturalHeight;\r\n this.ratioHeight = this.image.naturalHeight / this.image.naturalWidth;\r\n if (this.ratioWidth < this.ratioHeight) {\r\n this.ratioWidth = 1;\r\n } else {\r\n this.ratioHeight = 1;\r\n }\r\n let zoom = this.zoom;\r\n this.image.style.width = zoom * this.resultWidth * this.ratioWidth + 'px';\r\n this.image.style.height = zoom * this.resultHeight * this.ratioHeight + 'px';\r\n this.top = (200 - this.image.height) / 2;\r\n this.left = (200 - this.image.width) / 2;\r\n setTimeout(() => this.notifyEventListener(), 10);\r\n };\r\n if (this.image.height) {\r\n f();\r\n } else {\r\n this.image.addEventListener('load', f, false);\r\n }\r\n }\r\n public get angle() {\r\n return this.angleControl.valueAsNumber + this.angleAdd;\r\n }\r\n public set angle(value: number) {\r\n this.image.style.transform = `rotate(${this.angle}deg)`;\r\n }\r\n public get zoom() {\r\n return this.zoomControl.valueAsNumber;\r\n }\r\n public get width() {\r\n return this.image.width;\r\n }\r\n public get height() {\r\n return this.image.height;\r\n }\r\n public get top() {\r\n let value = parseFloat(this.image.style.top || '0');\r\n return isNaN(value) ? 0 : value;\r\n }\r\n public set top(value: number) {\r\n this.image.style.top = Math.max(Math.min(value, 0), this.resultHeight - this.height) + 'px';\r\n }\r\n public get left() {\r\n let value = parseFloat(this.image.style.left || '0');\r\n return isNaN(value) ? 0 : value;\r\n }\r\n public set left(value: number) {\r\n this.image.style.left = Math.max(Math.min(value, 0), this.resultWidth - this.width) + 'px';\r\n }\r\n private notifyEventListener() {\r\n this.dispatchEvent('change', {\r\n left: this.left,\r\n top: this.top,\r\n zoom: this.zoom,\r\n angle: this.angle\r\n });\r\n }\r\n private mousedown(event: MouseEvent) {\r\n event.preventDefault();\r\n let x = event.clientX,\r\n y = event.clientY,\r\n top = this.top,\r\n left = this.left,\r\n changed = false;\r\n\r\n let mousemove = (ev: MouseEvent) => {\r\n ev.preventDefault();\r\n let angle = Math.radians(this.angle);\r\n let difX = ev.clientX - x;\r\n let difY = ev.clientY - y;\r\n let moveX = Math.cos(angle) * difX + Math.sin(angle) * difY;\r\n let moveY = -Math.sin(angle) * difX + Math.cos(angle) * difY;\r\n let zoom = this.zoom;\r\n this.left = left + moveX;\r\n this.top = top + moveY;\r\n let centerLeft = (this.resultWidth / 2 - this.left) / (this.resultWidth * zoom);\r\n let centerTop = (this.resultHeight / 2 - this.top) / (this.resultHeight * zoom);\r\n this.image.style.transformOrigin = `${centerLeft * this.resultWidth * zoom}px ${centerTop * this.resultHeight * zoom}px`;\r\n changed = true;\r\n };\r\n let mouseup = (ev: MouseEvent) => {\r\n document.removeEventListener('mousemove', mousemove, false);\r\n document.removeEventListener('mouseup', mouseup, false);\r\n if (changed) {\r\n this.notifyEventListener();\r\n }\r\n };\r\n document.addEventListener('mousemove', mousemove, false);\r\n document.addEventListener('mouseup', mouseup, false);\r\n }\r\n }\r\n }\r\n}","module viggo {\r\n interface UserRole {\r\n Id: number,\r\n TypeNameExt: string,\r\n TypeName: string,\r\n Color: string\r\n Selected: boolean,\r\n ShowForAdmin: boolean,\r\n Orderby: number,\r\n TimeStart: Date,\r\n TimeEnd: Date\r\n UserRoleId?: number,\r\n CountUsers: number,\r\n\r\n NameLowerCase: string\r\n }\r\n interface UserProfile {\r\n ViggoFunction: number,\r\n Usertype: UserRole,\r\n Value: string\r\n }\r\n export interface AutoCompleteItem {\r\n // set by server\r\n Id: number,\r\n Name: string,\r\n SearchText: string,\r\n\r\n // set by javascript\r\n type: string,\r\n NameLowerCase: string,\r\n Search: string[],\r\n IsSelected: boolean,\r\n score: number,\r\n exactMatch: boolean\r\n }\r\n export interface AutoCompleteUser extends AutoCompleteItem {\r\n Image: string,\r\n Initials: string,\r\n Grade: string,\r\n OtherInfo: string,\r\n StudentId?: number,\r\n UserRolls: UserRole[],\r\n HouseRoom: string,\r\n SearchText: string,\r\n\r\n // set by javascript\r\n MainUserRoll: UserRole | null,\r\n Relations?: { [name: number]: AutoCompleteUserRelation },\r\n }\r\n interface AutoCompleteUserRelation extends Array<AutoCompleteUser> {\r\n Relation: AutoCompleteRelation\r\n }\r\n export interface AutoCompleteGroup extends AutoCompleteItem {\r\n // set by server\r\n Users: AutoCompleteUser[],\r\n Teachers: AutoCompleteUser[],\r\n UsersIds: number[],\r\n UsersIdsString: string,\r\n ContractTeacherIds: number[],\r\n ContractTeacherString: string,\r\n ContractTeacher: boolean,\r\n OriginalName: string,\r\n Categories: any,\r\n FolderId: number,\r\n FolderName: string,\r\n Visible: boolean,\r\n CountMemberInGroup: number,\r\n Description: string,\r\n UpdatedBy: number,\r\n UpdatedByUser: AutoCompleteUser,\r\n TimeStamp: Date,\r\n Selected: boolean,\r\n SyncId: string,\r\n Remove: boolean,\r\n GroupType: number,\r\n NameFirstPriority: string,\r\n Locked: boolean,\r\n LockedSync: boolean,\r\n AccessGroups: AutoCompleteGroup[],\r\n\r\n // set by javascript\r\n HasRelations: boolean,\r\n }\r\n\r\n interface AutoCompleteRelation {\r\n // set by server\r\n Id: number\r\n Name: string,\r\n Description: string,\r\n TimeStamp: Date,\r\n OrderBy: number,\r\n\r\n // set by javascript\r\n checked: boolean\r\n }\r\n\r\n interface AutoCompleteServerResponse {\r\n Users: AutoCompleteUser[],\r\n Groups: AutoCompleteGroup[],\r\n RelationNames?: AutoCompleteRelation[],\r\n Relations?: AutoCompleteRelationReference[],\r\n Templates: {[name: string]: string},\r\n Translations?: {[name: string]: string}\r\n }\r\n\r\n interface AutoCompleteRelationReference {\r\n MasterUserId: number,\r\n UserId: number,\r\n RelationsId: number\r\n }\r\n\r\n interface AutoCompleteRelationHeader {\r\n Name: string\r\n }\r\n interface HeaderItem {\r\n Title: string;\r\n }\r\n interface AutocompleteQuery {\r\n queryList: string[],\r\n wordList: string[]\r\n }\r\n\r\n type UserTemplate = (item: AutoCompleteUser) => string;\r\n type GroupTemplate = (item: AutoCompleteGroup) => string;\r\n type HeaderTemplate = (item: HeaderItem) => string;\r\n interface AutoCompleteTemplates {\r\n User?: UserTemplate,\r\n Group?: GroupTemplate,\r\n RelationUser?: UserTemplate,\r\n RelationSearchMasterUser?: UserTemplate,\r\n RelationSearchChildHeader?: (item: AutoCompleteUserRelation) => string,\r\n RelationSearchChildUser?: UserTemplate,\r\n RelationSearchRelationCheckboxes?: (item: AutoCompleteRelation[]) => string,\r\n RelationSearchAddAll?: (item: any) => string,\r\n RelationSearchHeadlineUser?: UserTemplate,\r\n RelationSearchHeadlineGroup?: GroupTemplate,\r\n UserSelected?: UserTemplate,\r\n GroupSelected?: GroupTemplate,\r\n Header?: HeaderTemplate,\r\n HeaderGroup?: HeaderTemplate,\r\n RemoveAllSelected?: (item: any) => string,\r\n SuperSearchUser?: UserTemplate,\r\n SuperSearchGroup?: GroupTemplate,\r\n [index: string]: Function|undefined\r\n }\r\n type AutoCompleteRelationNames = {[index: number] : AutoCompleteRelation};\r\n type AutoCompleteValueList = AutoCompleteItem[];\r\n type AutoCompleteSelectCallback = (element: AutoCompleteItem, event: Event) => void;\r\n type AutoCompleteUserMap = { [index: number]: AutoCompleteUser|null };\r\n type AutoCompleteGroupMap = { [index: number]: AutoCompleteGroup | null };\r\n\r\n enum AutoCompleteFlags {\r\n Users = 1,\r\n Groups = 2,\r\n StayOpen = 4,\r\n AllowDuplicates = 8,\r\n SingleItem = 16\r\n }\r\n\r\n interface AutoCompleteOptions {\r\n element: HTMLElement;\r\n flags: string | number;\r\n results: string;\r\n }\r\n\r\n export abstract class autocomplete extends viggo.classes.eventListener {\r\n private static defaultUrl: string = '/Shared/Search/GetautocompleteData';\r\n private static values: { [name: string]: AutoCompleteValueList } = {};\r\n private static urls: { [name: string]: string } = {\r\n \"\": autocomplete.defaultUrl,\r\n \"Crmcustomers\": '/Crm/Lists/GetCustomerAutoCompleteData/',\r\n \"Crmlist\": '/Crm/Lists/GetListAutoCompleteData/',\r\n //\"Substitutefor\": '/Crm/Lists/GetListAutoCompleteData/'\r\n }\r\n private static idMap: { [name: string]: AutoCompleteUserMap } = {}\r\n private static groupMap: { [name: string]: AutoCompleteGroupMap } = {}\r\n protected static relationNames: { [name: string]: AutoCompleteRelationNames } = {}\r\n private static templates: { [name: string]: AutoCompleteTemplates } = {}\r\n private static translations: { [name: string]: { [index: string]: string } } = {}\r\n private static scroller: Document | Element | null = null;\r\n public static loaded: { [name: string]: number } = {}\r\n public static cacheVersion: string|null = null;\r\n private static shortcutInfo: string|null = null;\r\n\r\n private static domRelation: HTMLElement | null;\r\n public static domParent: HTMLElement | null;\r\n protected static dynamiclist: viggo.dynamiclistview | null = null;\r\n public static modals: viggo.modal[] = [];\r\n public static scrollAdd: number = 0;\r\n\r\n private static lastSelectedItem: Element | null = null;\r\n\r\n protected lastSelectionIndex: number = -1;\r\n\r\n protected filter: AutoCompleteFlags = 0;\r\n protected element: HTMLElement;\r\n protected destination!: HTMLInputElement;\r\n protected guiDestination!: Element;\r\n protected templates: AutoCompleteTemplates;\r\n protected idMap: AutoCompleteUserMap;\r\n protected groupMap: AutoCompleteGroupMap;\r\n protected values: AutoCompleteValueList;\r\n protected translations: { [name: string]: string };\r\n private removeAllButton: HTMLElement | null = null;\r\n public defaultValue: string;\r\n\r\n constructor(options: AutoCompleteOptions) {\r\n super();\r\n if (options.flags) {\r\n if (typeof options.flags == 'string') {\r\n for (let flag of options.flags.split(' ')) {\r\n if (flag) {\r\n this.filter |= AutoCompleteFlags[<keyof typeof AutoCompleteFlags>flag];\r\n }\r\n }\r\n } else if (typeof options.flags == 'number') {\r\n this.filter = options.flags;\r\n }\r\n }\r\n this.element = options.element;\r\n\r\n if (!autocomplete.urls[this.name]) {\r\n autocomplete.urls[this.name] = this.url;\r\n }\r\n this.initializeDestination(options.results);\r\n\r\n this.values = autocomplete.values[this.name];\r\n this.idMap = autocomplete.idMap[this.name];\r\n this.groupMap = autocomplete.groupMap[this.name];\r\n this.templates = autocomplete.templates[this.name];\r\n this.translations = autocomplete.translations[this.name];\r\n\r\n this.element.addEventListener('selectstart', (ev: Event) => autocomplete.remove(ev), false);\r\n this.defaultValue = this.destination.value;\r\n }\r\n\r\n protected initializeDestination(destinationName: string) {\r\n let elm = <HTMLInputElement | HTMLTextAreaElement>this.element;\r\n let dest = elm.form ? <Element | null>elm.form.elements.namedItem(destinationName) : document.querySelector(`input[type=\"hidden\"][name=\"${destinationName}\"]`);\r\n\r\n let gui: HTMLElement | null = null;\r\n if (dest && (<HTMLInputElement>dest).tagName == 'INPUT') {\r\n this.destination = <HTMLInputElement>dest;\r\n gui = <HTMLElement | null>this.destination.previousElementSibling;\r\n } else {\r\n throw new Error('Missing destination for autocomplete');\r\n }\r\n if (gui && gui.classList.contains('choosen-choices')) {\r\n this.guiDestination = <HTMLElement>gui;\r\n } else {\r\n this.guiDestination = document.createElement('ul');\r\n this.guiDestination.classList.add('choosen-choices');\r\n this.destination.parentNode!.insertBefore(this.guiDestination, this.destination);\r\n }\r\n\r\n }\r\n\r\n public get url() {\r\n return this.element.dataset.autocompleteUrl || autocomplete.defaultUrl;\r\n }\r\n\r\n public set url(value: string) {\r\n this.element.dataset.autocompleteUrl = value;\r\n }\r\n\r\n public get name() {\r\n return this.element.dataset.autocompleteName || '';\r\n }\r\n\r\n public set name(value: string) {\r\n this.element.dataset.autocompleteName = value;\r\n }\r\n\r\n public static modalScroll(e: Event) {\r\n autocomplete.getScroll(<Element|Document>e.target);\r\n }\r\n\r\n public static setUrl(name: string, url: string) {\r\n if (autocomplete.urls[name] != url) {\r\n autocomplete.urls[name] = url;\r\n if (name === \"\") {\r\n autocomplete.defaultUrl = url;\r\n }\r\n autocomplete.clear(name);\r\n }\r\n }\r\n \r\n private static getScroll(scrolledElement: Element | Document) {\r\n if (scrolledElement != autocomplete.domParent) {\r\n if (autocomplete.domRelation && viggo.dom.parentOf(autocomplete.domRelation, <Element>scrolledElement)) {\r\n autocomplete.scrollAdd = viggo.getScrollTop(<HTMLElement>scrolledElement);\r\n } else if (scrolledElement == document) {\r\n autocomplete.scrollAdd = document.documentElement!.scrollTop;\r\n } else {\r\n autocomplete.scrollAdd = 0;\r\n }\r\n if (autocomplete.domParent) {\r\n autocomplete.domParent.style.marginTop = -autocomplete.scrollAdd + 'px';\r\n }\r\n }\r\n return autocomplete.scrollAdd;\r\n };\r\n\r\n protected delaySearch: (() => void) | null = null;\r\n\r\n public hasFlags(flags: AutoCompleteFlags) {\r\n return (this.filter & flags) == flags;\r\n }\r\n\r\n public get value() {\r\n return this.destination.value;\r\n }\r\n\r\n protected createUserFragment(element: AutoCompleteUser, callback: AutoCompleteSelectCallback) {\r\n if (!this.templates.User) {\r\n throw new Error('Missing template \"User\"');\r\n }\r\n let view = viggo.func.createView(element, this.templates.User);\r\n if (view.firstChild) {\r\n (<HTMLElement>view.firstChild).addEventListener('click', (event: MouseEvent) => {\r\n callback(element, event);\r\n }, false);\r\n }\r\n return view;\r\n }\r\n\r\n protected createGroupFragment(element: AutoCompleteGroup) {\r\n if (!this.templates.Group) {\r\n throw new Error('Missing template \"Group\"');\r\n }\r\n return viggo.func.createView(element, this.templates.Group);\r\n }\r\n\r\n private createSelectedUserFragment(element: AutoCompleteUser) {\r\n if (!this.templates.UserSelected) {\r\n throw new Error('Missing template \"UserSelected\"');\r\n }\r\n return viggo.func.createView(element, this.templates.UserSelected);\r\n }\r\n\r\n private createSelectedGroupFragment(element: AutoCompleteGroup) {\r\n if (!this.templates.GroupSelected) {\r\n throw new Error('Missing template \"GroupSelected\"');\r\n }\r\n return viggo.func.createView(element, this.templates.GroupSelected);\r\n }\r\n\r\n private createHeaderFragment(title: string) {\r\n if (!this.templates.Header) {\r\n throw new Error('Missing template \"Header\"');\r\n }\r\n return viggo.func.createView({ Title: title }, this.templates.Header);\r\n }\r\n\r\n private createGroupHeaderFragment(title: string) {\r\n if (!this.templates.HeaderGroup) {\r\n throw new Error('Missing template \"HeaderGroup\"');\r\n }\r\n return viggo.func.createView({ Title: title }, this.templates.HeaderGroup);\r\n }\r\n\r\n public static remove(ev?: Event) {\r\n if (!ev || !(<HTMLInputElement>ev.target).viggoAutoComplete) {\r\n if (autocomplete.domParent) {\r\n document.removeEventListener('click', autocomplete.remove, false);\r\n autocomplete.domParent.parentNode!.removeChild(autocomplete.domParent);\r\n autocomplete.domParent = null;\r\n autocomplete.lastSelectedItem = null;\r\n }\r\n if (autocomplete.scroller) {\r\n (<Document>autocomplete.scroller).removeEventListener('scroll', autocomplete.modalScroll, false);\r\n autocomplete.scroller = null;\r\n }\r\n autocomplete.domRelation = null;\r\n autocomplete.dynamiclist = null;\r\n }\r\n }\r\n\r\n protected userRoleDictionary(users: AutoCompleteUser[]) {\r\n let rollTypes: { [index: string]: AutoCompleteUser[] } = {};\r\n for (let element of users) {\r\n for (let roll of element.UserRolls) {\r\n let name: string = roll.TypeName || (<any>roll).Name;\r\n if (!rollTypes[name]) {\r\n rollTypes[name] = [];\r\n }\r\n rollTypes[name].push(element);\r\n }\r\n }\r\n return rollTypes;\r\n }\r\n\r\n protected createHeaders() {\r\n\r\n }\r\n\r\n protected createUsers(users: AutoCompleteUser[], callback: AutoCompleteSelectCallback, typeHeader?: boolean) {\r\n var element, div, me = this, lastType = null;\r\n if (users.length && !typeHeader && autocomplete.dynamiclist) {\r\n autocomplete.dynamiclist.appendChild(<HTMLElement>this.createHeaderFragment(this.translations.users).firstElementChild);\r\n }\r\n this.createHeaders();\r\n let rollTypes = typeHeader ? this.userRoleDictionary(users) : { '': users.slice() };\r\n Object.values(rollTypes).forEach(list => {\r\n list.sort(autocomplete.sortCallback);\r\n });\r\n if (autocomplete.dynamiclist) {\r\n for (let type in rollTypes) {\r\n let list = rollTypes[type];\r\n if (typeHeader) {\r\n autocomplete.dynamiclist.appendChild(<HTMLElement>this.createHeaderFragment(type).firstElementChild);\r\n }\r\n for (let user of list) {\r\n div = this.createUserFragment(user, callback);\r\n autocomplete.dynamiclist.appendChild(<HTMLElement>div.firstElementChild);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private createGroups(groups: AutoCompleteGroup[], callback: AutoCompleteSelectCallback, typeHeader?: boolean) {\r\n var i = 0, element, div, me = this, lastType = null;\r\n if (groups.length && autocomplete.dynamiclist) {\r\n autocomplete.dynamiclist.appendChild(<HTMLElement>this.createHeaderFragment(this.translations.groups).firstElementChild);\r\n while (i < groups.length) {\r\n element = groups[i++];\r\n if (typeHeader) {\r\n if (lastType !== element.FolderName) {\r\n lastType = element.FolderName;\r\n autocomplete.dynamiclist.appendChild(<HTMLElement>this.createGroupHeaderFragment(lastType).firstElementChild);\r\n }\r\n }\r\n div = <HTMLElement|null>this.createGroupFragment(element).firstElementChild;\r\n ((obj) => {\r\n if (div) {\r\n (<HTMLElement>div).addEventListener('click', (event: MouseEvent) => {\r\n callback(obj, event);\r\n }, false);\r\n }\r\n })(element);\r\n autocomplete.dynamiclist.appendChild(<HTMLElement>div);\r\n }\r\n }\r\n }\r\n\r\n private createDomParent(relation: HTMLElement, top?: number, left?: number, width?: number) {\r\n if (autocomplete.scroller) {\r\n (<Document>autocomplete.scroller).removeEventListener('scroll', autocomplete.modalScroll, true);\r\n autocomplete.scroller = null;\r\n }\r\n autocomplete.scroller = document;\r\n if (autocomplete.scroller) {\r\n autocomplete.scroller.addEventListener('scroll', autocomplete.modalScroll, true);\r\n autocomplete.scrollAdd = autocomplete.getScroll(relation);\r\n }\r\n autocomplete.scrollAdd += window.pageYOffset;\r\n if (top === undefined || left === undefined || width == undefined) {\r\n let pos = relation.getBoundingClientRect(),\r\n parentPos = pos;\r\n if (relation.parentNode) {\r\n parentPos = (<Element>relation.parentNode).getBoundingClientRect();\r\n }\r\n top = pos.bottom;\r\n left = parentPos.left;\r\n width = parentPos.width;\r\n }\r\n autocomplete.domRelation = relation;\r\n autocomplete.domParent = viggo.dom.tag('ul', {\r\n id: 'autocomplete',\r\n onmousemove: (event: Event) => this.mousemove(event),\r\n className: viggo.autocomplete.loaded[this.name] == 2 ? '' : 'loading',\r\n style: {\r\n top: top + window.pageYOffset + 'px',\r\n left: left + 'px',\r\n width: width + 'px',\r\n marginTop: -autocomplete.scrollAdd + 'px'\r\n }\r\n });\r\n autocomplete.dynamiclist = new viggo.dynamiclistview({\r\n element: autocomplete.domParent,\r\n itemCount: 60,\r\n itemHeight: 55,\r\n stickyClass: 'h5'\r\n });\r\n }\r\n\r\n protected mousemove(event: Event) {\r\n autocomplete.lastSelectedItem = <HTMLElement>event.target;\r\n }\r\n\r\n public show(users: AutoCompleteUser[], groups: AutoCompleteGroup[], callback: AutoCompleteSelectCallback, relation: HTMLElement, top?: number, left?: number, width?: number) {\r\n autocomplete.remove();\r\n this.createDomParent(relation, top, left, width);\r\n\r\n // Define the order of rendering\r\n var lowerCaseRelation = relation.id.toLowerCase();\r\n const validRelations = [\"recievers\", \"cc\", \"bcc\"];\r\n const isMessages = validRelations.includes(lowerCaseRelation);\r\n const firstType = isMessages ? 'Groups' : 'Users';\r\n const secondType = isMessages ? 'Users' : 'Groups';\r\n\r\n // Helper function to create elements based on type\r\n const createItems = (type: 'Users' | 'Groups') => {\r\n if (type === 'Users' && this.hasFlags(AutoCompleteFlags.Users)) {\r\n this.createUsers(users, callback);\r\n } else if (type === 'Groups' && this.hasFlags(AutoCompleteFlags.Groups)) {\r\n this.createGroups(groups, callback);\r\n }\r\n };\r\n\r\n createItems(firstType);\r\n createItems(secondType);\r\n\r\n if (autocomplete.domParent) {\r\n document.body.appendChild(autocomplete.domParent);\r\n if (autocomplete.dynamiclist) {\r\n autocomplete.dynamiclist.render();\r\n }\r\n autocomplete.lastSelectedItem = <Element>autocomplete.domParent.firstElementChild;\r\n while (autocomplete.lastSelectedItem && !this.isListItem(autocomplete.lastSelectedItem)) {\r\n autocomplete.lastSelectedItem = <Element>autocomplete.lastSelectedItem.nextElementSibling;\r\n }\r\n if (autocomplete.lastSelectedItem) {\r\n autocomplete.lastSelectedItem.classList.add('autocomplete-selected');\r\n }\r\n }\r\n document.addEventListener('click', autocomplete.remove, false);\r\n }\r\n\r\n protected dispatchAllChanged() {\r\n let value = this.value;\r\n let ids = value ? value.split(',').map(x => parseInt(x)) : [];\r\n\r\n let ev = new CustomEvent('viggoAutocompletedAll', {\r\n bubbles: true,\r\n cancelable: false,\r\n detail: ids\r\n });\r\n this.element.dispatchEvent(ev);\r\n }\r\n\r\n public showAll(users: AutoCompleteUser[], groups: AutoCompleteGroup[], callback: AutoCompleteSelectCallback, relation: HTMLElement) {\r\n autocomplete.remove();\r\n this.createDomParent(relation);\r\n if (this.hasFlags(AutoCompleteFlags.Users)) {\r\n this.createUsers(users, callback, true);\r\n }\r\n if (this.hasFlags(AutoCompleteFlags.Groups)) {\r\n this.createGroups(groups, callback, true);\r\n }\r\n if (autocomplete.domParent) {\r\n document.body.appendChild(autocomplete.domParent);\r\n if (autocomplete.dynamiclist) {\r\n autocomplete.dynamiclist.render();\r\n }\r\n }\r\n let search = \"\";\r\n let timeout: number = 0;\r\n let keydown = this.keydown.bind(this);\r\n let k = function (event: KeyboardEvent) {\r\n window.clearTimeout(timeout);\r\n timeout = window.setTimeout(function () {\r\n search = \"\";\r\n }, 1000);\r\n event.preventDefault();\r\n switch (event.keyCode) {\r\n case 8: // backspace\r\n search = search.substring(0, search.length - 1);\r\n break;\r\n default:\r\n search += String.fromCharCode(event.charCode).toLowerCase();\r\n break;\r\n }\r\n if (autocomplete.domParent) {\r\n var node = <HTMLElement|null>document.evaluate('div[starts-with(translate(., \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\", \"abcdefghijklmnopqrstuvwxyz\"),\"' + search + '\")]', autocomplete.domParent, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\r\n if (node && autocomplete.domParent) {\r\n autocomplete.domParent.scrollTop = node.offsetTop;\r\n if (autocomplete.lastSelectedItem) {\r\n autocomplete.lastSelectedItem.classList.remove('autocomplete-selected');\r\n autocomplete.lastSelectedItem = null;\r\n }\r\n autocomplete.lastSelectedItem = <Element>node;\r\n node.classList.add('autocomplete-selected');\r\n }\r\n }\r\n }, b = function (event: KeyboardEvent) {\r\n if (event.keyCode == 8) {\r\n event.preventDefault();\r\n }\r\n }\r\n , c = () => {\r\n document.removeEventListener('keypress', k, false);\r\n document.removeEventListener('keydown', b, false);\r\n document.removeEventListener('keydown', keydown, false);\r\n document.removeEventListener('click', c, false);\r\n autocomplete.remove();\r\n };\r\n document.addEventListener('keydown', keydown, false);\r\n document.addEventListener('keydown', b, false);\r\n document.addEventListener('keypress', k, false);\r\n document.addEventListener('click', c, false);\r\n }\r\n\r\n protected isListItem(item: Element) {\r\n return !(item.className == '' || item.classList.contains('h4') || item.classList.contains('h5'));\r\n }\r\n\r\n public moveUp() {\r\n let item: HTMLElement | null = null;\r\n if (autocomplete.lastSelectedItem) {\r\n item = <HTMLElement | null>autocomplete.lastSelectedItem.previousElementSibling;\r\n while (item && !this.isListItem(item)) {\r\n item = <HTMLElement | null>item.previousElementSibling;\r\n }\r\n }\r\n if (item) {\r\n this.scrollIntoView(item);\r\n }\r\n return !!item;\r\n }\r\n\r\n public moveDown() {\r\n let item: HTMLElement | null = null;\r\n if (autocomplete.domParent) {\r\n if (!autocomplete.lastSelectedItem) {\r\n item = <HTMLElement>autocomplete.domParent.firstChild;\r\n } else {\r\n item = <HTMLElement>autocomplete.lastSelectedItem.nextElementSibling;\r\n }\r\n while (item && !this.isListItem(item)) {\r\n item = <HTMLElement>item.nextElementSibling;\r\n }\r\n if (item) {\r\n this.scrollIntoView(item);\r\n }\r\n }\r\n return !!item;\r\n }\r\n\r\n private scrollIntoView(item: HTMLElement) {\r\n if (autocomplete.lastSelectedItem) {\r\n autocomplete.lastSelectedItem.classList.remove('autocomplete-selected');\r\n }\r\n autocomplete.lastSelectedItem = item;\r\n item.classList.add('autocomplete-selected');\r\n if (autocomplete.domParent) {\r\n let top = autocomplete.domParent.scrollTop;\r\n top = Math.min(top, item.offsetTop);\r\n top = Math.max(top, item.offsetTop - autocomplete.domParent.offsetHeight + item.offsetHeight);\r\n autocomplete.domParent.scrollTop = top;\r\n }\r\n }\r\n\r\n public clickSelected() {\r\n if (autocomplete.lastSelectedItem) {\r\n var evt = document.createEvent('MouseEvents');\r\n evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n autocomplete.lastSelectedItem.dispatchEvent(evt);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n protected keydown(event: KeyboardEvent) {\r\n let key = event.key;\r\n if (autocomplete.domParent) {\r\n switch (key) {\r\n case 'ArrowUp':\r\n if (this.moveUp()) {\r\n event.preventDefault();\r\n }\r\n break;\r\n case 'ArrowDown':\r\n if (this.moveDown()) {\r\n event.preventDefault();\r\n }\r\n break;\r\n case 'Enter':\r\n case 'Tab':\r\n this.clickSelected();\r\n if (key == 'Enter') { // ignore tab\r\n event.preventDefault();\r\n }\r\n break;\r\n default:\r\n if (autocomplete.lastSelectedItem && !event.ctrlKey && !event.metaKey) {\r\n autocomplete.lastSelectedItem.classList.remove('autocomplete-selected');\r\n autocomplete.lastSelectedItem = null;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private getPosition() {\r\n return viggo.getPosition(this.element);\r\n }\r\n\r\n private createGuiUser(object: AutoCompleteItem) {\r\n let elm: HTMLElement|DocumentFragment|null = null;\r\n switch (object.type) {\r\n case 'group':\r\n elm = this.createSelectedGroupFragment(<AutoCompleteGroup>object);\r\n break;\r\n case 'user':\r\n default:\r\n elm = this.createSelectedUserFragment(<AutoCompleteUser>object);\r\n break;\r\n }\r\n if (elm) {\r\n let child = <HTMLElement|null>elm.firstChild;\r\n if (child) {\r\n child.dataset.autocompleteId = object.Id.toString();\r\n let remove = elm.querySelector('.remove');\r\n if (remove) {\r\n remove.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.removeElementFromSelected(object.Id);\r\n this.dispatchAllChanged();\r\n }, false);\r\n }\r\n }\r\n }\r\n return elm;\r\n }\r\n \r\n public removeElementFromSelected(id: number | string) {\r\n id = id.toString();\r\n let result = true;\r\n let ids = this.destination.value.split(',');\r\n let index = ids.indexOf(id);\r\n if (index !== -1) {\r\n ids.splice(index, 1);\r\n }\r\n var ev = new CustomEvent('viggoAutocompleted', {\r\n bubbles: true,\r\n cancelable: true,\r\n detail: ids\r\n });\r\n result = this.element.dispatchEvent(ev);\r\n if (result) {\r\n this.destination.value = ids.join(',');\r\n }\r\n var elm = this.guiDestination.querySelector('[data-autocomplete-id=\"' + id + '\"]');\r\n if (elm) {\r\n this.guiDestination.removeChild(elm);\r\n }\r\n if (this.destination.value == '' && this.removeAllButton) {\r\n this.removeAllButton.remove();\r\n this.removeAllButton = null;\r\n }\r\n return result;\r\n }\r\n\r\n private clearSelectedElements() {\r\n var elm = this.guiDestination.querySelectorAll('[data-autocomplete-id]').forEach(elm => this.guiDestination.removeChild(elm));\r\n if (this.destination.value == '' && this.removeAllButton) {\r\n this.removeAllButton.remove();\r\n this.removeAllButton = null;\r\n }\r\n }\r\n \r\n public async addElementToSelected(obj: AutoCompleteItem, removeTarget?: HTMLElement, addOnly = false, dispatchAllEvent = true) {\r\n await this.load();\r\n let addUser = (id: number, target?: HTMLElement) => {\r\n if (!this.templates.RemoveAllSelected) {\r\n throw new Error('Missing template \"RemoveAllSelected\"');\r\n }\r\n if (this.hasFlags(AutoCompleteFlags.SingleItem)) {\r\n viggo.dom.empty(this.guiDestination);\r\n this.destination.value = '';\r\n }\r\n var value = this.destination.value.split(',');\r\n if (value.length && value[0] === '') {\r\n value = [];\r\n }\r\n if (this.hasFlags(AutoCompleteFlags.AllowDuplicates) || value.indexOf(id.toString()) == -1) {\r\n let arg: AutoCompleteItem | null = this.hasFlags(AutoCompleteFlags.Users) ? this.idMap[id] : this.groupMap[id];\r\n if (arg) {\r\n value.push(id.toString());\r\n var ev = new CustomEvent('viggoAutocompleted', {\r\n bubbles: true,\r\n cancelable: true,\r\n detail: value\r\n });\r\n if (this.element.dispatchEvent(ev)) {\r\n this.destination.value = value.join(',');\r\n this.guiDestination.appendChild(this.createGuiUser(arg));\r\n arg.IsSelected = true;\r\n if (!this.removeAllButton) {\r\n let fragment = viggo.func.createView({}, this.templates.RemoveAllSelected);\r\n if (fragment.firstChild instanceof HTMLElement) {\r\n this.removeAllButton = fragment.firstChild;\r\n let btn = <HTMLElement|null>this.removeAllButton.querySelector('.remove-all');\r\n if (btn) {\r\n btn.addEventListener('click', (ev: MouseEvent) => {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.destination.value.split(',').forEach(id => this.removeElementFromSelected(id));\r\n this.dispatchAllChanged();\r\n this.removeAllButton = null;\r\n }, false);\r\n }\r\n this.guiDestination.insertBefore(this.removeAllButton, this.guiDestination.firstChild);\r\n }\r\n }\r\n }\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n if (target) {\r\n target = <HTMLElement|undefined>viggo.dom.parentFilter(target, function (elm) {\r\n return elm.classList.contains('autocomplete_user') || elm.classList.contains('autocomplete_group');\r\n });\r\n if (target) {\r\n if (target == autocomplete.lastSelectedItem) {\r\n do {\r\n autocomplete.lastSelectedItem = <Element|null>autocomplete.lastSelectedItem!.nextSibling;\r\n } while (autocomplete.lastSelectedItem && autocomplete.lastSelectedItem.tagName !== 'UL');\r\n \r\n if (!autocomplete.lastSelectedItem) {\r\n autocomplete.lastSelectedItem = target;\r\n do {\r\n autocomplete.lastSelectedItem = <Element|null>autocomplete.lastSelectedItem!.previousSibling;\r\n } while (autocomplete.lastSelectedItem && autocomplete.lastSelectedItem.tagName !== 'UL');\r\n }\r\n if (autocomplete.lastSelectedItem) {\r\n autocomplete.lastSelectedItem.classList.add('autocomplete-selected');\r\n }\r\n }\r\n target.remove();\r\n }\r\n }\r\n };\r\n var errors = 0;\r\n if (this.hasFlags(AutoCompleteFlags.Users | AutoCompleteFlags.Groups) && obj.type == 'group') {\r\n let ids = (<AutoCompleteGroup>obj).UsersIds.slice(0);\r\n ids.sort((a, b) => {\r\n let result = 0;\r\n let userA = this.idMap[a],\r\n userB = this.idMap[b];\r\n if (userA && userB) {\r\n result = userA.NameLowerCase < userB.NameLowerCase ? -1 : 1;\r\n }\r\n return result;\r\n });\r\n for (let id of ids) {\r\n if (addUser(id) === false) {\r\n errors++;\r\n }\r\n }\r\n } else if (this.inSelectedElements(obj) && !addOnly) {\r\n this.removeElementFromSelected(obj.Id);\r\n } else {\r\n addUser(obj.Id, removeTarget);\r\n }\r\n if (errors) {\r\n viggo.notice(NoticeType.warning, __(\"{num} users were not added, due to access restrictions\", {num: errors}));\r\n }\r\n if (dispatchAllEvent) {\r\n this.dispatchAllChanged();\r\n }\r\n }\r\n \r\n private inSelectedElements(object: AutoCompleteItem) {\r\n if (object.type != 'user')\r\n return false;\r\n var ids = this.destination.value.split(',');\r\n var index = ids.indexOf(object.Id.toString());\r\n return index !== -1;\r\n }\r\n\r\n protected abstract filterValues(): AutoCompleteItem[];\r\n\r\n public async search(string: string) {\r\n let users: AutoCompleteUser[] = [],\r\n groups: AutoCompleteGroup[] = [],\r\n valueIndex = 0,\r\n element;\r\n\r\n let query = viggo.autocomplete.queryToLists(string);\r\n\r\n await this.load();\r\n let valueSet = this.filterValues();\r\n\r\n while (valueIndex < valueSet.length) {\r\n element = valueSet[valueIndex++];\r\n element.IsSelected = this.inSelectedElements && this.inSelectedElements(element);\r\n if (viggo.autocomplete.searchElement(query, element)) {\r\n // Assign the exactMatch property\r\n element.exactMatch = element.Search.some(searchItem => searchItem.toLowerCase() === string.toLowerCase());\r\n\r\n element.score = autocomplete.scoreElement(query, element);\r\n switch (element.type) {\r\n case 'user':\r\n users.push(<AutoCompleteUser>element);\r\n break;\r\n case 'group':\r\n groups.push(<AutoCompleteGroup>element);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n users: users.sort(autocomplete.sortCallback),\r\n groups: groups.sort(autocomplete.sortCallback)\r\n };\r\n }\r\n\r\n \r\n private async showAllClick(relation?: HTMLElement) {\r\n let data: {[index: string]: AutoCompleteItem[]} = {\r\n user: [],\r\n group: []\r\n };\r\n \r\n await this.load();\r\n \r\n for (var i = 0; i < this.values.length; i++) {\r\n if (!this.inSelectedElements(this.values[i])) {\r\n data[this.values[i].type].push(this.values[i]);\r\n }\r\n }\r\n data.user = (<AutoCompleteUser[]>data.user).sort(function (a, b) {\r\n var rollA = a.UserRolls[0],\r\n rollB = b.UserRolls[0];\r\n if (rollA.Orderby != rollB.Orderby) {\r\n return rollA.Orderby - rollB.Orderby;\r\n } else if (rollA.NameLowerCase != rollB.NameLowerCase) {\r\n return rollA.NameLowerCase < rollB.NameLowerCase ? -1 : 1;\r\n } else if (a.NameLowerCase != b.NameLowerCase) {\r\n return a.NameLowerCase < b.NameLowerCase ? -1 : 1;\r\n } else {\r\n return a.Id - b.Id;\r\n }\r\n });\r\n this.showAll(<AutoCompleteUser[]>data.user, <AutoCompleteGroup[]>data.group, (obj: AutoCompleteItem, event: Event) => {\r\n this.addElementToSelected(obj, <HTMLElement>event.target);\r\n if (this.hasFlags(AutoCompleteFlags.StayOpen) || (<KeyboardEvent>event).ctrlKey || (<KeyboardEvent>event).metaKey) {\r\n event.stopPropagation();\r\n }\r\n }, relation || this.element);\r\n };\r\n\r\n private showShortcutsClick(formGroup: Element) {\r\n let showInfo = () => {\r\n if (document.body.contains(formGroup)) {\r\n let tag = viggo.dom.parseHTML(<string>autocomplete.shortcutInfo).firstElementChild;\r\n if (tag) {\r\n let remove = (event: Event) => {\r\n (<Element>tag).remove();\r\n document.removeEventListener('click', remove, true);\r\n };\r\n document.addEventListener('click', remove, true);\r\n formGroup.appendChild(tag);\r\n }\r\n }\r\n }\r\n\r\n if (autocomplete.shortcutInfo) {\r\n showInfo();\r\n } else {\r\n fetch(new Request('/Shared/Search/ShortcutInfo', {\r\n method: 'GET',\r\n credentials: 'same-origin'\r\n })).then(x => x.text())\r\n .then((text) => {\r\n autocomplete.shortcutInfo = text;\r\n }).then(showInfo);\r\n }\r\n }\r\n\r\n private async load() {\r\n this.element.classList.add('loading');\r\n await autocomplete.load(true, this.name);\r\n this.element.classList.remove('loading');\r\n this.values = autocomplete.values[this.name];\r\n this.idMap = autocomplete.idMap[this.name];\r\n this.groupMap = autocomplete.groupMap[this.name];\r\n this.templates = autocomplete.templates[this.name];\r\n this.translations = autocomplete.translations[this.name];\r\n }\r\n\r\n public async reload() {\r\n autocomplete.urls[this.name] = this.url;\r\n await this.load();\r\n }\r\n\r\n public async repaint(dispatchChanged: boolean) {\r\n await this.load();\r\n let oldValue = this.destination.value;\r\n let ids = oldValue.split(',');\r\n this.destination.value = '';\r\n this.clearSelectedElements();\r\n if (ids.length && ids[0] !== '') {\r\n let isUser = this.hasFlags(AutoCompleteFlags.Users);\r\n let errors = [];\r\n let list: (AutoCompleteUser | AutoCompleteGroup)[] = [];\r\n for (let id of ids) {\r\n let data;\r\n if (isUser) {\r\n data = this.idMap[parseInt(id)];\r\n } else {\r\n data = this.groupMap[parseInt(id)];\r\n }\r\n if (data) {\r\n list.push(data);\r\n } else {\r\n errors.push(id);\r\n }\r\n }\r\n list.sort((a, b) => {\r\n return a.NameLowerCase.localeCompare(b.NameLowerCase);\r\n });\r\n for (let x of list) {\r\n await this.addElementToSelected(x, undefined, false, false);\r\n }\r\n if (dispatchChanged && this.destination.value) {\r\n this.dispatchAllChanged();\r\n }\r\n\r\n if (errors.length) {\r\n console.log(\"Missing users in hidden value: \" + errors.join(', '));\r\n }\r\n }\r\n }\r\n\r\n public static isReady(name?: string) {\r\n name = name || '';\r\n return name in autocomplete.loaded && autocomplete.loaded[name] == 2;\r\n }\r\n\r\n public static isIdle() {\r\n let result = true;\r\n for (let name in autocomplete.loaded) {\r\n result = result && autocomplete.loaded[name] == 2;\r\n }\r\n return result;\r\n }\r\n\r\n private static statepushed(event: Event) {\r\n autocomplete.initialize(<HTMLElement>event.target);\r\n }\r\n\r\n private static modalloaded(event: Event) {\r\n autocomplete.initialize(<HTMLElement>event.target);\r\n }\r\n\r\n private static promises: { [name: string]: Promise<void> } = {};\r\n\r\n private static isCacheValid() {\r\n let localVersion = localStorage.getItem('cache.version');\r\n if (this.cacheVersion == null) {\r\n this.cacheVersion = localVersion;\r\n if (!this.cacheVersion) {\r\n this.cacheVersion = Date.now().toString()\r\n localStorage.setItem('cache.version', this.cacheVersion);\r\n }\r\n return true;\r\n }\r\n if (this.cacheVersion != localVersion) {\r\n this.cacheVersion = null;\r\n }\r\n return this.cacheVersion == localVersion;\r\n }\r\n\r\n public static load(sync?: boolean, name?: string) {\r\n name = name || '';\r\n let url = autocomplete.urls[name];\r\n if (!this.isCacheValid()) {\r\n autocomplete.reload(true);\r\n }\r\n if (!(name in autocomplete.loaded) && url) {\r\n autocomplete.loaded[name] = 0;\r\n autocomplete.clear(name);\r\n autocomplete.loaded[name] = 1;\r\n this.promises[name] = fetch(new Request(url, {\r\n method: 'GET',\r\n credentials: 'same-origin'\r\n })).then(x => x.json())\r\n .then((data) => {\r\n autocomplete.loaded[<string>name] = 2;\r\n autocomplete.setList(data, name, sync);\r\n delete this.promises[<string>name];\r\n autocomplete.dispatchEvent('load' + name);\r\n window.addEventListener('statepushed', autocomplete.statepushed, false);\r\n if (viggo.modal) {\r\n viggo.modal.addEventListener('load', autocomplete.modalloaded);\r\n }\r\n });\r\n }\r\n if (this.promises[name]) {\r\n return this.promises[name];\r\n } else {\r\n return new Promise<void>((resolve) => { resolve(); });\r\n }\r\n }\r\n \r\n public static reload(resetInstances: boolean = false) {\r\n autocomplete.loaded = {};\r\n autocomplete.values = {};\r\n autocomplete.idMap = {};\r\n autocomplete.groupMap = {};\r\n autocomplete.initialize(document, resetInstances);\r\n };\r\n\r\n private static clear(name: string) {\r\n name = name || '';\r\n delete autocomplete.loaded[name];\r\n autocomplete.values[name] = [];\r\n autocomplete.idMap[name] = {};\r\n autocomplete.groupMap[name] = {};\r\n autocomplete.templates[name] = {};\r\n autocomplete.translations[name] = {};\r\n autocomplete.relationNames[name] = {};\r\n autocomplete.translations[name] = {\r\n users: __('Users'),\r\n groups: __('Groups')\r\n };\r\n }\r\n\r\n public static createFakeUser(): AutoCompleteUser {\r\n return {\r\n Id: -1,\r\n Name: 'Fake user',\r\n SearchText: '',\r\n type: 'fake',\r\n NameLowerCase: 'fake user',\r\n Search: [],\r\n IsSelected: false,\r\n score: -1,\r\n Image: 'https://viggopublic.azureedge.net/skolernesithus/logo/clientlogo.png',\r\n Initials: 'UU',\r\n Grade: 'Fake grade',\r\n OtherInfo: '',\r\n StudentId: -1,\r\n UserRolls: [],\r\n MainUserRoll: null,\r\n HouseRoom: 'Fake house, Fake room',\r\n Relations: {}\r\n };\r\n }\r\n\r\n public static setList(list: AutoCompleteServerResponse, name: string = \"\", silent?: boolean) {\r\n name = name || '';\r\n let templates: {[name: string]: string} = {\r\n User: '<li>${item.Name}</li>',\r\n Group: '<li>${item.Name}</li>',\r\n UserSelected: '<div>${item.Name}</div>',\r\n GroupSelected: '<div>${item.Name}</div>',\r\n RelationSearchHeadlineUser: '<div>${item.Name}</div>',\r\n RelationSearchHeadlineGroup: '<div>${item.Name}</div>',\r\n RelationSearchMasterUser: '<li><h4>${item.Name}</h5><ul class=\"relations\"></ul></li>',\r\n RelationSearchChildHeader: '<li><h5>${item.Relation.Name}</h6></li>',\r\n RelationSearchChildUser: '<li><h6>${item.Name}</h6></li>',\r\n RelationSearchRelationCheckboxes: '<li>${Object.values(item).map(rel => `<label><input type=\"checkbox\" value=\"${rel.Id}\"/> ${rel.Name}</label>`).join(\"\")}</li>',\r\n RelationSearchAddAll: '<li><button class=\"add-all\" type=\"button\">Tilføj alle</button></li>',\r\n RemoveAllSelected: '<li><button class=\"remove-all\" type=\"button\">Fjern alle</button></li>',\r\n Header: '<li><h2>${item.Title}</h2></li>',\r\n HeaderGroup: '<li><h3 class=\"groupHeader\">${item.Title}</h3></li>',\r\n SuperSearchUser: '<li>${item.Name}</li>',\r\n SuperSearchGroup: '<li>${item.Name}<li>'\r\n };\r\n let users = list.Users || (<any>list).users, missingUsers = [], missingGroups = [], missingReferences = [], regSplit = /[ ().\\-_[\\]/\\\\{}]/g;\r\n for (let user of users) {\r\n if (!user.Name) {\r\n missingUsers.push(user.Id);\r\n }\r\n user.type = 'user';\r\n user.NameLowerCase = user.Name.toLowerCase();\r\n user.Search = [];\r\n regSplit.lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n let spaceIndex = 0;\r\n let charIndex = 0;\r\n while (match = regSplit.exec(user.SearchText)) {\r\n if (match[0] == ' ') {\r\n if (spaceIndex != charIndex) {\r\n user.Search.push(user.SearchText.substring(spaceIndex, regSplit.lastIndex - 1));\r\n }\r\n user.Search.push(user.SearchText.substring(charIndex, regSplit.lastIndex - 1));\r\n spaceIndex = charIndex = regSplit.lastIndex;\r\n } else {\r\n user.Search.push(user.SearchText.substring(charIndex, regSplit.lastIndex - 1));\r\n charIndex = regSplit.lastIndex;\r\n }\r\n }\r\n if (charIndex != spaceIndex) {\r\n user.Search.push(user.SearchText.substring(spaceIndex, user.SearchText.length));\r\n }\r\n user.Search.push(user.SearchText.substring(charIndex, user.SearchText.length));\r\n\r\n let mainRoll: UserRole|null = null;\r\n for (let roll of user.UserRolls) {\r\n roll.NameLowerCase = (roll.TypeName||(<any>roll).Name).toLowerCase();\r\n if (!mainRoll || mainRoll.Orderby > roll.Orderby) {\r\n mainRoll = roll;\r\n }\r\n }\r\n user.MainUserRoll = mainRoll;\r\n autocomplete.idMap[name][user.Id] = user;\r\n autocomplete.values[name].push(user);\r\n }\r\n \r\n if (list.RelationNames) {\r\n for (let relation of list.RelationNames) {\r\n autocomplete.relationNames[name][relation.Id] = relation;\r\n relation.checked = true;\r\n }\r\n }\r\n if (list.Relations) {\r\n for (let i = 0; i < list.Relations.length; i++) {\r\n let relation: AutoCompleteRelationReference|AutoCompleteRelation = list.Relations[i];\r\n let master = autocomplete.idMap[name][relation.MasterUserId];\r\n let user = autocomplete.idMap[name][relation.UserId];\r\n let relationId = relation.RelationsId;\r\n relation = autocomplete.relationNames[name][relationId];\r\n if (master && user && relation) {\r\n if (!master.Relations) {\r\n master.Relations = {};\r\n }\r\n if (!master.Relations[relationId]) {\r\n let rel: AutoCompleteUser[] = [];\r\n (<AutoCompleteUserRelation>rel).Relation = relation;\r\n master.Relations[relationId] = <AutoCompleteUserRelation>rel;\r\n }\r\n master.Relations[relationId].push(user);\r\n if (!user.Relations) {\r\n user.Relations = {};\r\n }\r\n if (!user.Relations[relationId]) {\r\n let rel: AutoCompleteUser[] = [];\r\n (<AutoCompleteUserRelation>rel).Relation = relation;\r\n user.Relations[relationId] = <AutoCompleteUserRelation>rel;\r\n }\r\n user.Relations[relationId].push(master);\r\n }\r\n }\r\n }\r\n \r\n let groups = list.Groups;\r\n if (groups) {\r\n for (let group of groups) {\r\n if (!group.Name) {\r\n missingGroups.push(group.Id);\r\n }\r\n group.type = 'group';\r\n group.Search = group.SearchText.split(regSplit);\r\n group.Search = group.Search.concat(group.SearchText.split(' '));\r\n group.Search = [...new Set(group.Search)];\r\n group.NameLowerCase = group.Name.toLowerCase();\r\n group.HasRelations = group.UsersIds.some((x: number) => {\r\n let result = autocomplete.idMap[name][x];\r\n return result ? !!result.Relations : false;\r\n });\r\n for (var j = 0; j < group.UsersIds.length; j++) {\r\n if (!autocomplete.idMap[name][group.UsersIds[j]]) {\r\n missingReferences.push(group.Id + ':' + group.UsersIds[j]);\r\n }\r\n }\r\n autocomplete.values[name].push(group);\r\n autocomplete.groupMap[name][group.Id] = group;\r\n }\r\n }\r\n\r\n let serverTemplates = list.Templates || (<any>list).templates;\r\n if (serverTemplates) {\r\n for (let key in serverTemplates) {\r\n templates[key] = list.Templates[key];\r\n }\r\n }\r\n\r\n for (let i in templates) {\r\n var e = templates[i];\r\n if (typeof e == 'string') {\r\n try {\r\n autocomplete.templates[name][i] = viggo.func.createTemplate(e);\r\n } catch (err) {\r\n console.log(`Error in template \"${i}\".`, e);\r\n console.error(err);\r\n }\r\n }\r\n }\r\n\r\n if (list.Translations) {\r\n autocomplete.translations[name].users = list.Translations.Users;\r\n autocomplete.translations[name].groups = list.Translations.Groups;\r\n }\r\n \r\n if (missingUsers.length || missingGroups.length || missingReferences.length) {\r\n console.warn(`Missing users: ${missingUsers.join(\", \")}\r\n Missing groups: ${missingGroups.join(\", \")}\r\n Missing references: ${missingReferences.join(\", \")}`);\r\n }\r\n if (!silent) {\r\n autocomplete.initialize();\r\n }\r\n };\r\n \r\n public static createView(element: any, name: string, autocompleteName?: string) {\r\n autocompleteName = autocompleteName || '';\r\n let func = autocomplete.templates[autocompleteName][name];\r\n let result = null;\r\n if (func) {\r\n result = viggo.func.createView(element, func);\r\n }\r\n return result;\r\n }\r\n\r\n public static async iterate(callback: (item: AutoCompleteItem, index: number, array: AutoCompleteItem[]) => void, sort?: (a: AutoCompleteItem, b: AutoCompleteItem) => number, name = \"\") {\r\n name = name || '';\r\n await autocomplete.load(true, name);\r\n let array = autocomplete.values[name];\r\n if (sort) {\r\n array = array.slice();\r\n array.sort(sort);\r\n }\r\n array.forEach(callback);\r\n }\r\n\r\n public static sortCallback(a: AutoCompleteItem, b: AutoCompleteItem) {\r\n let result = 0;\r\n\r\n if (a.exactMatch && !b.exactMatch) {\r\n return -1; \r\n }\r\n if (!a.exactMatch && b.exactMatch) {\r\n return 1; \r\n }\r\n\r\n if (a.type === 'user' && b.type === 'user') {\r\n let rollA = (<AutoCompleteUser>a).MainUserRoll,\r\n rollB = (<AutoCompleteUser>b).MainUserRoll;\r\n if (rollA && rollB) {\r\n result = rollA.Orderby - rollB.Orderby;\r\n }\r\n }\r\n if (!result) {\r\n result = b.score - a.score;\r\n }\r\n if (!result) {\r\n if (a.NameLowerCase === b.NameLowerCase) {\r\n result = a.Id - b.Id;\r\n } else {\r\n result = a.NameLowerCase > b.NameLowerCase ? 1 : -1;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n\r\n public static searchElement(query: AutocompleteQuery, element: AutoCompleteItem) {\r\n let wordFind = 0;\r\n\r\n // First loop: Check if each word in query.wordList exists in element.Search\r\n for (let i = 0; i < query.wordList.length && wordFind === i; i++) {\r\n if (element.Search.some(part => part.includes(query.wordList[i]))) {\r\n wordFind++;\r\n }\r\n }\r\n\r\n const foundAt = [];\r\n\r\n // If all words are found, proceed with checking substrings in query.queryList\r\n if (wordFind === query.wordList.length) {\r\n for (let substring of query.queryList) {\r\n let found = false;\r\n\r\n // Loop through each part of element.Search\r\n for (let elementSearchIndex = 0; elementSearchIndex < element.Search.length; elementSearchIndex++) {\r\n const elementSearch = element.Search[elementSearchIndex];\r\n\r\n // Check if the substring exists anywhere in the current elementSearch\r\n if (elementSearch.includes(substring)) {\r\n found = true;\r\n foundAt.push(elementSearchIndex);\r\n break;\r\n }\r\n }\r\n\r\n // If a match is not found for this substring, break out of the loop\r\n if (!found) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n // Return true if all substrings were matched\r\n return foundAt.length === query.queryList.length && wordFind === query.wordList.length;\r\n }\r\n\r\n\r\n \r\n /*\r\n \"pe\":\r\n Pernille Pedersen\r\n Per Andersen\r\n Peter Kristensen\r\n Pernille Nielsen\r\n Knud Pedersen\r\n \r\n \"per\":\r\n Per Andersen\r\n Pernille Nielsen\r\n Pernille Pedersen\r\n Anders Persson\r\n */\r\n public static scoreElement(query: AutocompleteQuery, element: AutoCompleteItem) {\r\n let finalScore = query.wordList.length * 100;\r\n \r\n for (let i = 0; i < query.queryList.length; i++) {\r\n let q = query.queryList[i];\r\n for (let j = 0; j < element.Search.length; j++) {\r\n let index = element.Search[j];\r\n if (q == index) {\r\n finalScore += 100;\r\n } else if (index.substring(0, q.length) == q) {\r\n finalScore += element.Search.length - j;\r\n finalScore += query.queryList.length - i;\r\n if (i == j) {\r\n finalScore += 10;\r\n }\r\n }\r\n }\r\n }\r\n finalScore = finalScore / element.Search.length;\r\n return finalScore;\r\n }\r\n \r\n public static queryToLists(q: string): AutocompleteQuery {\r\n var fullWords: string[] = [];\r\n q = q.replace(/(^|\\s+)([A-ZÆØÅ]{2,}|#[0-9]*|@@?[A-Za-zÆØÅæøå\\-0-9]*)(\\s+|$)/, function (a, start, word, end) {\r\n fullWords.push(word.toLowerCase());\r\n return start + end;\r\n });\r\n fullWords = fullWords.filter(function (word) {\r\n return word != '';\r\n });\r\n \r\n q = q.replace(/^\\s+|\"|\\s+$/g, '');\r\n let query = q.split(/\\s+/);\r\n \r\n query = query.filter(function (word) {\r\n return word != '';\r\n }).map(function (a) {\r\n return a.toLowerCase();\r\n });\r\n \r\n return {\r\n queryList: query,\r\n wordList: fullWords\r\n };\r\n }\r\n \r\n public static async getUser(id: number, name = \"\") {\r\n name = name || '';\r\n await autocomplete.load(true, name);\r\n return autocomplete.idMap[name][id];\r\n }\r\n \r\n public static async getGroup(id: number, name = \"\") {\r\n name = name || '';\r\n await autocomplete.load(true, name);\r\n return autocomplete.groupMap[name][id];\r\n }\r\n \r\n public static async getUsersFromGroups(ids: number[], name = \"\") {\r\n name = name || '';\r\n await autocomplete.load(true, name);\r\n let result: number[] = [];\r\n for (var i = 0; i < ids.length; i++) {\r\n let group = autocomplete.groupMap[name][ids[i]];\r\n if (group) {\r\n result = result.concat(group.UsersIds);\r\n }\r\n }\r\n return result.unique();\r\n }\r\n\r\n public static async initializeInput(input: HTMLInputElement|HTMLTextAreaElement) {\r\n if (input && input.classList.contains('autocomplete') && input.dataset.autocompleteFlags && input.dataset.autocompleteResults) {\r\n if (input.viggoAutoComplete) {\r\n (<autocomplete>input.viggoAutoComplete).repaint(false);\r\n } else {\r\n let autoCompleter: autocomplete | null = null;\r\n let options: AutoCompleteOptions = {\r\n element: input,\r\n flags: input.dataset.autocompleteFlags,\r\n results: input.dataset.autocompleteResults\r\n };\r\n switch (input.tagName) {\r\n case 'INPUT':\r\n autoCompleter = new autocompleteInput(<AutoCompleteInputOptions>options);\r\n break;\r\n }\r\n (<any>input).viggoAutoComplete = autoCompleter;\r\n if (autoCompleter) {\r\n autoCompleter.repaint(true);\r\n if (!autoCompleter.destination.viggoAutoComplete) {\r\n autoCompleter.destination.viggoAutoComplete = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public static initialize(parent?: HTMLElement | Document, resetInstances = false) {\r\n if (!parent) {\r\n parent = document;\r\n }\r\n parent.querySelectorAll('input.autocomplete').forEach(async function (x) {\r\n if (resetInstances) {\r\n delete (<any>x).viggoAutoComplete;\r\n } else {\r\n await autocomplete.initializeInput(<HTMLInputElement | HTMLTextAreaElement>x);\r\n }\r\n });\r\n }\r\n\r\n public static showAll(event: Event, input: string|HTMLInputElement|HTMLTextAreaElement|null) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n if (typeof input === 'string') {\r\n input = <HTMLInputElement | HTMLTextAreaElement | null>document.getElementById(input);\r\n }\r\n if (input) {\r\n autocomplete.initializeInput(input);\r\n if (input.viggoAutoComplete) {\r\n (<autocomplete>input.viggoAutoComplete).showAllClick();\r\n }\r\n }\r\n }\r\n\r\n public static showShortcuts(event: Event, input: string|HTMLInputElement|HTMLTextAreaElement|null) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n if (typeof input === 'string') {\r\n input = <HTMLInputElement | HTMLTextAreaElement | null>document.getElementById(input);\r\n }\r\n if (input) {\r\n autocomplete.initializeInput(input);\r\n if (input.viggoAutoComplete) {\r\n let target = (<Element>event.target).closest('.form-group');\r\n if (target) {\r\n (<autocomplete>input.viggoAutoComplete).showShortcutsClick(target);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n interface AutoCompleteInputOptions extends AutoCompleteOptions {\r\n element: HTMLInputElement;\r\n }\r\n\r\n interface AutoCompleteTextareaOptions extends AutoCompleteOptions {\r\n element: HTMLTextAreaElement;\r\n }\r\n\r\n class autocompleteInput extends autocomplete {\r\n protected element!: HTMLInputElement;\r\n protected relationSearch: AutoCompleteUser | AutoCompleteGroup | null = null;\r\n public constructor(options: AutoCompleteInputOptions) {\r\n super(options);\r\n this.element.addEventListener('keydown', (event: KeyboardEvent) => this.keydown(event), false);\r\n this.element.addEventListener('keyup', (event: KeyboardEvent) => this.keyup(event), false);\r\n\r\n this.element.addEventListener('keydown', (event: KeyboardEvent) => {\r\n if (this.element.value == \"\" && this.relationSearch && event.key in { Backspace: 1, Escape: 1 }) {\r\n event.stopPropagation();\r\n this.setRelationSearch(null);\r\n }\r\n }, false);\r\n this.element.addEventListener('focus', async (event: FocusEvent) => {\r\n if (this.element.value || this.relationSearch) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n var result = await this.search(this.element.value);\r\n this.show(result.users, result.groups, (obj: AutoCompleteItem, ev: Event) => {\r\n this.addElementToSelected(obj, this.hasFlags(AutoCompleteFlags.StayOpen) ? <HTMLElement>ev.target : undefined);\r\n ev.stopPropagation();\r\n this.element.focus();\r\n }, this.element);\r\n }\r\n }, false)\r\n }\r\n\r\n protected createHeaders() {\r\n if (this.relationSearch && autocomplete.dynamiclist) {\r\n autocomplete.dynamiclist.appendChild(<HTMLElement>this.createRelationSearchAddAllFragment().firstElementChild);\r\n if (this.relationSearch.type == 'group') {\r\n autocomplete.dynamiclist.appendChild(<HTMLElement>this.createRelationSearchRelationCheckboxesFragment().firstElementChild);\r\n }\r\n }\r\n }\r\n\r\n protected filterValues() {\r\n let valueSet = this.values;\r\n if (this.relationSearch) {\r\n switch (this.relationSearch.type) {\r\n case 'user':\r\n valueSet = Array.prototype.concat.apply([], Object.values(<any>(<AutoCompleteUser>this.relationSearch).Relations)).unique();\r\n break;\r\n case 'group':\r\n valueSet = <AutoCompleteItem[]>(<AutoCompleteGroup>this.relationSearch).UsersIds.map(x => this.idMap[x]).filter(x => !!x);\r\n break;\r\n }\r\n }\r\n return valueSet;\r\n }\r\n\r\n protected createUserFragment(element: AutoCompleteUser, callback: AutoCompleteSelectCallback) {\r\n let view: DocumentFragment;\r\n if (this.relationSearch && this.relationSearch.type == 'group') {\r\n view = this.createRelationSearchedGroupFragment(element, callback);\r\n } else {\r\n if (this.relationSearch) {\r\n view = this.createRelationUserFragment(element, callback);\r\n } else {\r\n view = super.createUserFragment(element, callback);\r\n }\r\n }\r\n let btn = <HTMLElement | null>view.querySelector('.relation-search');\r\n if (btn) {\r\n if (this.relationSearch || !element.Relations) {\r\n btn.remove();\r\n } else {\r\n btn.addEventListener('click', (event: MouseEvent) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n this.setRelationSearch(element);\r\n }, false);\r\n }\r\n }\r\n return view;\r\n }\r\n\r\n protected createGroupFragment(element: AutoCompleteGroup) {\r\n let view = super.createGroupFragment(element);\r\n let btn = <HTMLElement | null>view.querySelector('.relation-search');\r\n if (btn) {\r\n if (this.relationSearch || !element.HasRelations || !this.hasFlags(AutoCompleteFlags.Users)) {\r\n if (btn.parentNode) {\r\n btn.parentNode.removeChild(btn);\r\n }\r\n } else {\r\n btn.addEventListener('click', (event: MouseEvent) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n this.setRelationSearch(element);\r\n });\r\n }\r\n }\r\n return view;\r\n }\r\n\r\n private async keyup(event: KeyboardEvent) {\r\n let\r\n input = <HTMLInputElement>event.target,\r\n value = input.value,\r\n index = input.selectionStart,\r\n results;\r\n if (this.delaySearch) {\r\n viggo.autocomplete.removeEventListener('load' + this.name, this.delaySearch);\r\n this.delaySearch = null;\r\n }\r\n if (this.lastSelectionIndex !== index) {\r\n this.lastSelectionIndex = index || 0;\r\n if (value.match(/\\S/) || this.relationSearch) {\r\n value = value.replace(/^\\s+|\\s+$/, '').replace(/\\s+/, ' ');\r\n if (!autocomplete.loaded[this.name] || viggo.autocomplete.loaded[this.name] < 2) {\r\n event = <KeyboardEvent>{ target: event.target };\r\n var me = this;\r\n this.delaySearch = () => {\r\n this.lastSelectionIndex = -1;\r\n this.keyup(event);\r\n };\r\n viggo.autocomplete.addEventListener('load' + this.name, this.delaySearch);\r\n }\r\n results = await this.search(value);\r\n this.show(results.users, results.groups, (obj: AutoCompleteItem, ev: Event) => {\r\n this.addElementToSelected(obj, this.hasFlags(AutoCompleteFlags.StayOpen) ? <HTMLElement>ev.target : undefined);\r\n ev.stopPropagation();\r\n if (!this.hasFlags(AutoCompleteFlags.StayOpen) && !(<KeyboardEvent>ev).ctrlKey && !(<KeyboardEvent>ev).metaKey) {\r\n input.value = '';\r\n input.focus();\r\n autocomplete.remove();\r\n }\r\n }, input);\r\n } else {\r\n autocomplete.remove();\r\n }\r\n }\r\n }\r\n\r\n protected async setRelationSearch(element: AutoCompleteGroup | AutoCompleteUser | null) {\r\n let gui: DocumentFragment | Element | null;\r\n if (this.relationSearch) {\r\n gui = this.element.previousElementSibling;\r\n if (gui) {\r\n gui.remove();\r\n }\r\n }\r\n this.relationSearch = element;\r\n if (element) {\r\n gui = element.type == 'user' ? this.createRelationSearchUserFragment(<AutoCompleteUser>element) : this.createRelationSearchGroupFragment(<AutoCompleteGroup>element);\r\n if (gui) {\r\n let close = gui.querySelector('.close');\r\n if (close) {\r\n close.addEventListener('click', (ev) => {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.setRelationSearch(null);\r\n }, false);\r\n }\r\n this.element.parentNode!.insertBefore(gui, this.element);\r\n }\r\n this.element.value = '';\r\n var result = await this.search('');\r\n this.element.focus();\r\n this.show(result.users, result.groups, (obj: AutoCompleteItem, ev: Event) => {\r\n this.addElementToSelected(obj, this.hasFlags(AutoCompleteFlags.StayOpen) ? <HTMLElement>ev.target : undefined);\r\n ev.stopPropagation();\r\n this.element.focus();\r\n }, this.element);\r\n } else {\r\n autocomplete.remove();\r\n }\r\n };\r\n private createRelationSearchedGroupFragment(element: AutoCompleteUser, callback: AutoCompleteSelectCallback) {\r\n if (!this.templates.RelationSearchMasterUser) {\r\n throw new Error('Missing template \"RelationSearchMasterUser\"');\r\n }\r\n if (!this.templates.RelationSearchChildHeader) {\r\n throw new Error('Missing template \"RelationSearchChildHeader\"');\r\n }\r\n if (!this.templates.RelationSearchChildUser) {\r\n throw new Error('Missing template \"RelationSearchChildUser\"');\r\n }\r\n var view = viggo.func.createView(element, this.templates.RelationSearchMasterUser);\r\n var relations = view.querySelector('.relations');\r\n\r\n if (element.Relations) {\r\n for (var relationId in element.Relations) {\r\n if (!autocomplete.relationNames[this.name][relationId].checked) {\r\n continue;\r\n }\r\n var rel = element.Relations[relationId];\r\n var child = viggo.func.createView(rel, this.templates.RelationSearchChildHeader);\r\n if (relations) {\r\n relations.appendChild(child);\r\n for (var i = 0; i < rel.length; i++) {\r\n child = viggo.func.createView(rel[i], this.templates.RelationSearchChildUser);\r\n if (child.firstChild) {\r\n (<HTMLElement>child.firstChild).addEventListener('click', ((obj: AutoCompleteUser) => {\r\n return (event: MouseEvent) => {\r\n callback(obj, event);\r\n event.stopPropagation();\r\n };\r\n })(rel[i]));\r\n relations.appendChild(child);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return view;\r\n }\r\n\r\n private createRelationSearchUserFragment(element: AutoCompleteUser) {\r\n if (!this.templates.RelationSearchHeadlineUser) {\r\n throw new Error('Missing template \"RelationSearchHeadlineUser\"');\r\n }\r\n return viggo.func.createView(element, this.templates.RelationSearchHeadlineUser);\r\n };\r\n\r\n private createRelationSearchGroupFragment(element: AutoCompleteGroup) {\r\n if (!this.templates.RelationSearchHeadlineGroup) {\r\n throw new Error('Missing template \"RelationSearchHeadlineGroup\"');\r\n }\r\n return viggo.func.createView(element, this.templates.RelationSearchHeadlineGroup);\r\n }\r\n private createRelationUserFragment(element: AutoCompleteUser, callback: AutoCompleteSelectCallback) {\r\n if (!this.templates.RelationUser) {\r\n throw new Error('Missing template \"RelationUser\"');\r\n }\r\n (<any>element).relationUser = this.relationSearch;\r\n let result = viggo.func.createView(element, this.templates.RelationUser);\r\n if (result.firstChild) {\r\n (<HTMLElement>result.firstChild).addEventListener('click', (event: MouseEvent) => {\r\n callback(element, event);\r\n }, false);\r\n }\r\n delete (<any>element).relationUser;\r\n return result;\r\n }\r\n private createRelationSearchAddAllFragment() {\r\n if (!this.templates.RelationSearchAddAll) {\r\n throw new Error('Missing template \"RelationSearchAddAll\"');\r\n }\r\n var view = viggo.func.createView({}, this.templates.RelationSearchAddAll);\r\n var btn = view.querySelector('.add-all');\r\n if (btn) {\r\n btn.addEventListener('click', async (ev) => {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n var result = await this.search(this.element.value);\r\n if (this.relationSearch) {\r\n switch (this.relationSearch.type) {\r\n case 'user':\r\n for (let x of result.users) {\r\n await this.addElementToSelected(x, undefined, true, false);\r\n }\r\n break;\r\n case 'group':\r\n for (let user of result.users) {\r\n if (user.Relations) {\r\n for (let rel of Object.values(user.Relations)) {\r\n if (autocomplete.relationNames[this.name][rel.Relation.Id].checked) {\r\n for (let x of rel) {\r\n await this.addElementToSelected(x, undefined, true, false);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n this.dispatchAllChanged();\r\n }\r\n this.setRelationSearch(null);\r\n }, false);\r\n }\r\n let updateCheckboxes = (value: boolean) => {\r\n if (autocomplete.domParent) {\r\n (<NodeListOf<HTMLInputElement>>autocomplete.domParent.querySelectorAll('input[type=\"checkbox\"][value]')).forEach(input => {\r\n input.checked = value;\r\n autocomplete.relationNames[this.name][parseInt(input.value)].checked = value;\r\n });\r\n let input = autocomplete.domParent.querySelector('input[type=\"checkbox\"][value]');\r\n if (input) {\r\n input.dispatchEvent(new Event('change'));\r\n }\r\n }\r\n };\r\n btn = view.querySelector('.check-all');\r\n if (btn) {\r\n if (this.relationSearch && this.relationSearch.type == 'group') {\r\n btn.addEventListener('click', (ev) => {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n updateCheckboxes(true);\r\n }, false);\r\n } else {\r\n btn.remove();\r\n }\r\n }\r\n btn = view.querySelector('.uncheck-all');\r\n if (btn) {\r\n if (this.relationSearch && this.relationSearch.type == 'group') {\r\n btn.addEventListener('click', (ev) => {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n updateCheckboxes(false);\r\n }, false);\r\n } else {\r\n btn.remove();\r\n }\r\n }\r\n return view;\r\n }\r\n private createRelationSearchRelationCheckboxesFragment() {\r\n if (!this.templates.RelationSearchRelationCheckboxes) {\r\n throw new Error('Missing template \"RelationSearchRelationCheckboxes\"');\r\n }\r\n var view = viggo.func.createView<AutoCompleteRelationNames>(autocomplete.relationNames[this.name], this.templates.RelationSearchRelationCheckboxes);\r\n if (view.firstChild) {\r\n view.firstChild.addEventListener('click', event => event.stopPropagation(), false);\r\n let change = async (event: Event) => {\r\n let target = <HTMLInputElement>event.target;\r\n autocomplete.relationNames[this.name][parseInt(target.value)].checked = target.checked;\r\n var result = await this.search(this.element.value);\r\n this.show(result.users, result.groups, (obj: AutoCompleteItem, ev: Event) => {\r\n this.addElementToSelected(obj, this.hasFlags(AutoCompleteFlags.StayOpen) ? <HTMLElement>ev.target : undefined);\r\n ev.stopPropagation();\r\n this.element.focus();\r\n }, this.element);\r\n };\r\n let checkboxes = <NodeListOf<HTMLInputElement>>view.querySelectorAll('input[type=\"checkbox\"][value]');\r\n checkboxes.forEach((input) => {\r\n input.checked = autocomplete.relationNames[this.name][parseInt(input.value)].checked;\r\n input.addEventListener('change', change, false);\r\n });\r\n }\r\n return view;\r\n }\r\n }\r\n\r\n const Inline = Quill.import('blots/inline');\r\n\r\n // autocomplete in richeditor is called \"mention\"\r\n class AutocompleteBlot extends Inline {\r\n public static blotName = \"mention\";\r\n public static tagName = \"A\";\r\n public static className = \"hinted\";\r\n protected domNode!: HTMLAnchorElement;\r\n public static create(userId: string) {\r\n let node: HTMLAnchorElement = super.create();\r\n node.dataset.hint = 'user';\r\n node.setAttribute('href', `/Basic/Users/Details/${userId}`);\r\n node.dataset.userId = userId + '';\r\n return node;\r\n }\r\n\r\n public static formats(node: HTMLElement) {\r\n return node.dataset.userId;\r\n }\r\n public format(name: string, value: string) {\r\n if (name === \"mention\" && value) {\r\n this.domNode.dataset.userId = value;\r\n } else {\r\n super.format(name, value);\r\n }\r\n }\r\n\r\n public formats() {\r\n const formats = super.formats();\r\n formats[\"mention\"] = AutocompleteBlot.formats(this.domNode);\r\n return formats;\r\n }\r\n }\r\n\r\n Quill.register({ \"formats/mention\": AutocompleteBlot });\r\n\r\n class QuillAutocomplete extends autocomplete {\r\n private quill: Quill;\r\n constructor(options: AutoCompleteOptions, quill: Quill) {\r\n super(options);\r\n this.quill = quill;\r\n }\r\n protected createUserFragment(element: AutoCompleteUser, callback: AutoCompleteSelectCallback) {\r\n let view = super.createUserFragment(element, callback);\r\n let btn = <HTMLElement | null>view.querySelector('.relation-search');\r\n if (btn) {\r\n btn.remove();\r\n }\r\n return view;\r\n }\r\n\r\n protected createGroupFragment(element: AutoCompleteGroup) {\r\n let view = super.createGroupFragment(element);\r\n if (!this.templates.Group) {\r\n throw new Error('Missing template \"Group\"');\r\n }\r\n let btn = <HTMLElement | null>view.querySelector('.relation-search');\r\n if (btn) {\r\n btn.remove();\r\n }\r\n return view;\r\n }\r\n\r\n public removeElementFromSelected(id: string | number) {\r\n let result = super.removeElementFromSelected(id);\r\n if (result) {\r\n this.quill.root.querySelectorAll(`a[data-user-id=\"${id}\"]`).forEach(elm => elm.replaceWith(viggo.dom.empty(elm)));\r\n }\r\n return result;\r\n }\r\n\r\n protected filterValues(): AutoCompleteItem[] {\r\n return this.values;\r\n }\r\n }\r\n\r\n class AutocompleteMention {\r\n protected quill: Quill;\r\n protected autocomplete: QuillAutocomplete;\r\n private static userRegex = /[A-Z\\u00c0-\\u00d6\\u00d8-\\u00dd][A-Za-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\-]*(?: | [A-Z\\u00c0-\\u00d6\\u00d8-\\u00dd][A-Za-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\-]*)*$/;\r\n private static atRegex = /@([A-Za-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\- ]*)/;\r\n private selectedUsers: string[] | null;\r\n constructor(quill: Quill) {\r\n this.quill = quill;\r\n this.autocomplete = new QuillAutocomplete({\r\n element: quill.container,\r\n flags: quill.container.dataset.autocompleteFlags || '',\r\n results: quill.container.dataset.autocompleteResults || ''\r\n }, quill);\r\n\r\n this.selectedUsers = null;\r\n\r\n quill.keyboard.addBinding({\r\n key: 50,\r\n shiftKey: true,\r\n }, this.onAtKey.bind(this));\r\n\r\n quill.keyboard.addBinding({ // up\r\n key: 38,\r\n collapsed: true\r\n }, this.onArrowUp.bind(this));\r\n\r\n quill.keyboard.addBinding({ // down\r\n key: 40,\r\n collapsed: true\r\n }, this.onArrowDown.bind(this));\r\n\r\n quill.keyboard.addBinding({\r\n key: 27,\r\n collapsed: true\r\n }, this.onEsc.bind(this));\r\n\r\n quill.keyboard.addBinding({ // enter\r\n key: 13,\r\n collapsed: true\r\n }, this.onEnter.bind(this));\r\n\r\n quill.keyboard.addBinding({ // tab\r\n key: 9,\r\n collapsed: true\r\n }, this.onEnter.bind(this));\r\n\r\n // tab and enter must be moved up before the default Quill handlers, or they will not run\r\n quill.keyboard.bindings[13].unshift(quill.keyboard.bindings[13].pop());\r\n quill.keyboard.bindings[9].unshift(quill.keyboard.bindings[9].pop());\r\n quill.on('text-change', this.textChange.bind(this));\r\n quill.on('selection-change', this.selectionChange.bind(this));\r\n\r\n quill.root.addEventListener('keydown', this.keydown.bind(this), false);\r\n }\r\n\r\n private keydown(event: KeyboardEvent) {\r\n if (event.key.length == 1) {\r\n let format = this.quill.getFormat();\r\n if (format.mention) {\r\n this.quill.format('mention', false, 'user');\r\n }\r\n }\r\n }\r\n\r\n private onAtKey() {\r\n this.autocomplete.search(\"\").then((result) => {\r\n let pos = this.getAutocompletePosition();\r\n this.autocomplete.show(result.users, result.groups, this.callbackReplace(this.quill.getSelection(true).index, '@'), this.quill.container, pos.top, pos.left, pos.width);\r\n });\r\n return true;\r\n }\r\n\r\n private getAutocompletePosition() {\r\n let bounds = this.quill.getBounds(this.quill.getSelection(true).index);\r\n let position = viggo.dom.getPos(this.quill.root);\r\n\r\n return {\r\n top: bounds.top + position.top + bounds.height,\r\n left: bounds.left + position.left,\r\n width: this.quill.container.clientWidth / 2\r\n };\r\n }\r\n\r\n private onArrowUp() {\r\n return !this.autocomplete.moveUp();\r\n }\r\n\r\n private onArrowDown() {\r\n return !this.autocomplete.moveDown();\r\n }\r\n\r\n private onEsc() {\r\n autocomplete.remove();\r\n return true;\r\n }\r\n\r\n private onEnter() {\r\n return !this.autocomplete.clickSelected();\r\n }\r\n\r\n private callbackReplace(quillIndex: number, replacedText: string) {\r\n return (elm: AutoCompleteItem) => {\r\n this.quill.focus();\r\n this.quill.deleteText(quillIndex, replacedText.length, \"user\");\r\n let insertText = elm.Name;\r\n if (replacedText == (<AutoCompleteUser>elm).Initials) {\r\n insertText = (<AutoCompleteUser>elm).Initials;\r\n }\r\n this.quill.insertText(quillIndex, insertText, \"mention\", elm.Id, \"user\");\r\n this.quill.setSelection(quillIndex + insertText.length, 0, \"user\");\r\n this.autocomplete.addElementToSelected(elm, undefined, true, true);\r\n }\r\n }\r\n\r\n private async checkContentForUsers() {\r\n if (this.selectedUsers == null) {\r\n this.selectedUsers = Array.from(<NodeListOf<HTMLAnchorElement>>this.quill.root.querySelectorAll('a[data-user-id]')).map(x => x.dataset.userId!);\r\n }\r\n let dict: ObjectOf<boolean> = {};\r\n (<NodeListOf<HTMLElement>>this.quill.root.querySelectorAll('a[data-user-id]')).forEach(x => {\r\n dict[x.dataset.userId!] = true;\r\n });\r\n let repaint = false;\r\n for (let i = this.selectedUsers.length - 1; i >= 0; i--) {\r\n let id = this.selectedUsers[i];\r\n if (!dict[id]) {\r\n this.autocomplete.removeElementFromSelected(id);\r\n this.selectedUsers.splice(i, 1);\r\n repaint = true;\r\n }\r\n }\r\n for (let id in dict) {\r\n if (this.selectedUsers.indexOf(id) == -1) {\r\n let user = await autocomplete.getUser(parseInt(id));\r\n if (user) {\r\n this.selectedUsers.push(user.Id + '');\r\n await this.autocomplete.addElementToSelected(user, undefined, true, false);\r\n }\r\n }\r\n }\r\n if (repaint) {\r\n await this.autocomplete.repaint(true);\r\n }\r\n }\r\n\r\n private selectionChange(range: RangeStatic, oldRange: RangeStatic, source: Sources) {\r\n\r\n }\r\n\r\n private log(msg: any) {\r\n let label = this.quill.root.closest('.form-group')?.querySelector('label');\r\n if (label) {\r\n label.textContent = msg;\r\n }\r\n }\r\n\r\n private async textChange(delta: Delta, oldContents: Delta, source: Sources) {\r\n let range = this.quill.getSelection();\r\n let found = false;\r\n if (range) {\r\n let [leaf, offset] = this.quill.getLeaf(range.index);\r\n if (leaf && (<any>leaf).text && !this.quill.getFormat(range).mention) {\r\n let text: string = (<any>leaf).text.substring(0, offset);\r\n let match = text.match(AutocompleteMention.atRegex);\r\n let result;\r\n let quillIndex = range.index - offset;\r\n if (match) {\r\n result = await this.autocomplete.search(match[1]);\r\n quillIndex += match.index || 0;\r\n } else if (match = text.match(AutocompleteMention.userRegex)) {\r\n text = match[0];\r\n quillIndex += match.index || 0;\r\n do {\r\n result = await this.autocomplete.search(text);\r\n if (!result.users.length) {\r\n let index = text.indexOf(' ');\r\n if (index == -1) {\r\n text = '';\r\n } else {\r\n quillIndex += index;\r\n text = text.substring(index + 1).trim();\r\n }\r\n }\r\n } while (!result.users.length && text);\r\n }\r\n if (result && result.users.length) {\r\n found = true;\r\n let pos = this.getAutocompletePosition();\r\n this.autocomplete.show(result.users, [], this.callbackReplace(quillIndex, text), this.quill.container, pos.top, pos.left, pos.width);\r\n autocomplete.modalScroll(<any>{target: this.quill.container});\r\n }\r\n }\r\n }\r\n if (!found) {\r\n autocomplete.remove();\r\n }\r\n await this.checkContentForUsers();\r\n }\r\n }\r\n\r\n Quill.register(\"modules/mention\", AutocompleteMention);\r\n\r\n viggo.modal.addEventListener('load', function (data) {\r\n autocomplete.initialize(data.target);\r\n });\r\n\r\n document.addEventListener('statepushed', async function(event) {\r\n autocomplete.initialize(<HTMLElement|Document>event.target);\r\n }, false);\r\n\r\n viggo.modal.addEventListener('show', function (data) {\r\n viggo.autocomplete.initialize(data.target);\r\n autocomplete.modals.push(data.modal);\r\n autocomplete.scrollAdd = 0;\r\n data.modal.addEventListener('scroll', autocomplete.modalScroll);\r\n if (autocomplete.domParent) {\r\n autocomplete.domParent.style.marginTop = -autocomplete.scrollAdd + 'px';\r\n }\r\n });\r\n viggo.modal.addEventListener('close', function(data) {\r\n data.modal.removeEventListener('scroll', autocomplete.modalScroll);\r\n var index = autocomplete.modals.indexOf(data.modal);\r\n if (index !== -1) {\r\n autocomplete.modals.splice(index, 1);\r\n }\r\n let m = autocomplete.modals[autocomplete.modals.length - 1];\r\n while (autocomplete.modals.length && m.element && !document.body.contains(m.element)) {\r\n autocomplete.modals.pop();\r\n }\r\n if (autocomplete.modals.length) {\r\n m = autocomplete.modals[autocomplete.modals.length - 1];\r\n if (m.element) {\r\n autocomplete.scrollAdd = m.element.scrollTop;\r\n }\r\n } else {\r\n autocomplete.scrollAdd = 0;\r\n }\r\n if (autocomplete.domParent) {\r\n autocomplete.domParent.style.marginTop = -autocomplete.scrollAdd + 'px';\r\n }\r\n });\r\n\r\n autocomplete.addEventListener = async function (event, listener) {\r\n viggo.classes.eventListener.addEventListener.call(this, event, listener);\r\n var m = event.match(/^load(.+)$/);\r\n if (m) {\r\n await autocomplete.load(false, m[1]);\r\n if (autocomplete.loaded[m[1]] == 2) {\r\n autocomplete.dispatchEvent(event, null, listener);\r\n }\r\n }\r\n };\r\n}\r\n\r\ndocument.addEventListener('focus', async function (event) {\r\n var target = <HTMLInputElement|HTMLTextAreaElement>event.target;\r\n if (viggo && viggo.autocomplete && target.tagName == 'INPUT' && target.type == 'text') {\r\n viggo.autocomplete.initializeInput(target);\r\n if (target.viggoAutoComplete) {\r\n await viggo.autocomplete.load(false, (<viggo.autocomplete>target.viggoAutoComplete).name);\r\n }\r\n }\r\n}, true);\r\n\r\nviggo.ready(function () {\r\n viggo.autocomplete.initialize();\r\n});\r\n","module viggo {\r\n interface DynamicListOptions {\r\n element: HTMLElement;\r\n itemHeight: number;\r\n itemCount: number;\r\n stickyClass?: string;\r\n }\r\n export class dynamiclistview {\r\n private parent: HTMLElement;\r\n private items: HTMLElement[];\r\n private defaultHeight: number;\r\n private heights: number[];\r\n private fillTop: HTMLElement;\r\n private fillBottom: HTMLElement;\r\n private oldIndex: number;\r\n private count: number;\r\n private stickyClass?: string;\r\n\r\n public constructor(options: DynamicListOptions) {\r\n this.parent = options.element;\r\n this.defaultHeight = options.itemHeight;\r\n this.stickyClass = options.stickyClass;\r\n this.count = options.itemCount;\r\n this.fillTop = viggo.dom.tag('li', { style: {padding: '0'} });\r\n this.fillBottom = viggo.dom.tag('li', { style: { padding: '0'} });\r\n this.oldIndex = 0;\r\n this.items = [];\r\n this.heights = [];\r\n this.parent.addEventListener('scroll', this.scroll.bind(this), false);\r\n }\r\n\r\n private scroll() {\r\n let index = this.getIndex(this.parent.scrollTop);\r\n let distance = Math.floor(this.count / 6);\r\n if (Math.abs(index - this.oldIndex) > distance || (this.oldIndex <= distance && index <= distance)) {\r\n this.moveWindow(index);\r\n this.oldIndex = index;\r\n }\r\n }\r\n\r\n private getIndex(top: number) {\r\n let sum = 0;\r\n let index = -1;\r\n while (top > sum && index < this.heights.length) {\r\n index++;\r\n sum += this.heights[index] || this.defaultHeight;\r\n }\r\n index -= Math.floor(this.count / 3);\r\n return Math.min(Math.max(0, index), this.heights.length - Math.floor(this.count / 3));\r\n }\r\n\r\n private moveWindow(index: number) {\r\n if (this.items.length) {\r\n let end = Math.min(this.items.length, index + this.count);\r\n let child;\r\n while (child = this.parent.firstChild) {\r\n this.parent.removeChild(child);\r\n }\r\n this.updateFill(index);\r\n this.parent.appendChild(this.fillTop);\r\n for (let i = 0; i < end; i++) {\r\n let item = this.items[i];\r\n if (i >= index || (this.stickyClass && item.classList.contains(this.stickyClass))) {\r\n this.parent.appendChild(item);\r\n if (!this.heights[i]) {\r\n this.heights[i] = item.offsetHeight;\r\n }\r\n }\r\n }\r\n this.parent.appendChild(this.fillBottom);\r\n }\r\n }\r\n\r\n private updateFill(index: number) {\r\n let top = 0;\r\n let bottom = 0;\r\n for (let i = 0; i < index; i++) {\r\n top += this.heights[i] || this.defaultHeight;\r\n }\r\n for (let i = index + this.count; i < this.items.length; i++) {\r\n bottom += this.heights[i] || this.defaultHeight;\r\n }\r\n this.fillTop.style.height = top + 'px';\r\n this.fillBottom.style.height = bottom + 'px';\r\n }\r\n\r\n public appendChild(item: HTMLElement) {\r\n this.items.push(item);\r\n this.heights.push(0);\r\n }\r\n\r\n public render() {\r\n this.moveWindow(0);\r\n }\r\n }\r\n}\r\n","module viggo {\r\n\r\n interface SearchOptions {\r\n input: HTMLInputElement,\r\n url: string,\r\n data: any,\r\n queryName: string,\r\n result: HTMLElement\r\n }\r\n\r\n interface SuperSearchAreas {\r\n [index: string]: string\r\n }\r\n\r\n interface SuperSearchTemplates {\r\n \r\n }\r\n\r\n interface SuperSearchOptions {\r\n input: HTMLInputElement;\r\n urls: SuperSearchAreas;\r\n result: HTMLElement;\r\n templates: SuperSearchAreas;\r\n }\r\n\r\n export class search {\r\n protected input: HTMLInputElement;\r\n protected url: string;\r\n protected data: any;\r\n protected queryName: string;\r\n protected result: HTMLElement;\r\n protected lastSearch: string = \"\";\r\n protected ajax: viggo.ajax|null = null;\r\n constructor(options: SearchOptions) {\r\n this.input = options.input;\r\n this.url = options.url;\r\n this.data = options.data;\r\n this.queryName = options.queryName;\r\n this.result = options.result;\r\n let timeout = 0;\r\n this.input.addEventListener('keyup', (event: KeyboardEvent) => {\r\n clearTimeout(timeout);\r\n if (this.ajax) {\r\n this.ajax.abort();\r\n this.ajax = null;\r\n }\r\n\r\n let value = this.input.value.replace(/^\\s+|\\s+$/g, '');\r\n if (value == '') {\r\n if (value != this.lastSearch) {\r\n this.clear();\r\n }\r\n this.lastSearch = '';\r\n } else {\r\n timeout = window.setTimeout(() => this.search(value), 350);\r\n }\r\n }, true);\r\n }\r\n public clear(clearInput: boolean = true, clearResult: boolean = true) {\r\n if (clearResult) {\r\n viggo.dom.empty(this.result);\r\n }\r\n if (clearInput) {\r\n this.input.value = '';\r\n }\r\n }\r\n public search(query: string) {\r\n let data = this.data;\r\n if (typeof this.data == 'function') {\r\n data = data();\r\n } else {\r\n data = Object.assign({}, data);\r\n }\r\n data[this.queryName] = query;\r\n new viggo.ajax({\r\n method: 'get',\r\n url: this.url,\r\n data: this.data,\r\n convert: 'html',\r\n complete: (html: DocumentFragment) => {\r\n viggo.dom.empty(this.result);\r\n this.result.appendChild(this.result);\r\n }\r\n });\r\n }\r\n }\r\n\r\n export class supersearch {\r\n protected urls: SuperSearchAreas;\r\n protected input: HTMLInputElement;\r\n protected result: HTMLElement;\r\n protected ajax: { [index: string]: viggo.ajax } = {};\r\n protected templates: { [index: string]: Function };\r\n private selection: HTMLElement | null = null;\r\n private parentOffsetLeft = 0;\r\n private resultLimit = 100;\r\n private static ITEM_SELECTOR = 'div>ul>li';\r\n private static PARENT_SELECTOR = 'div>ul';\r\n constructor(options: SuperSearchOptions) {\r\n this.input = options.input;\r\n this.result = options.result;\r\n this.urls = options.urls;\r\n this.templates = {};\r\n for (let area in options.templates) {\r\n this.templates[area] = viggo.func.createTemplate(options.templates[area]);\r\n }\r\n let focus = () => {\r\n viggo.autocomplete.load();\r\n this.input.removeEventListener('focus', focus, false);\r\n };\r\n this.input.addEventListener('focus', focus, false);\r\n\r\n let lastQuery = '';\r\n let timeout = 0;\r\n this.input.addEventListener('keyup', (event: KeyboardEvent) => {\r\n let value = this.input.value.trim();\r\n if (value != lastQuery) {\r\n lastQuery = value;\r\n clearTimeout(timeout);\r\n this.cancelAjax();\r\n if (lastQuery) {\r\n setTimeout(() => {\r\n this.search(value);\r\n }, 200);\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n }, false);\r\n this.input.addEventListener('keydown', (event: KeyboardEvent) => {\r\n switch (event.key) {\r\n case \"ArrowLeft\":\r\n if (this.selection) {\r\n this.setSelection(this.getHorizontalSelection(false));\r\n event.preventDefault();\r\n }\r\n break;\r\n case \"ArrowRight\":\r\n if (this.selection) {\r\n this.setSelection(this.getHorizontalSelection(true));\r\n event.preventDefault();\r\n }\r\n break;\r\n case \"ArrowUp\":\r\n if (!this.selection) {\r\n let parent = this.result;\r\n let list = this.getBestNewParents();\r\n if (list && list.length) {\r\n parent = list[list.length - 1];\r\n }\r\n let all = <NodeListOf<HTMLElement>>parent.querySelectorAll(supersearch.ITEM_SELECTOR);\r\n this.setSelection(all[all.length - 1]);\r\n } else {\r\n this.setSelection(this.getVerticalSelection(-1));\r\n }\r\n event.preventDefault();\r\n break;\r\n case \"ArrowDown\":\r\n if (!this.selection) {\r\n let parent = this.result;\r\n let list = this.getBestNewParents();\r\n if (list && list.length) {\r\n parent = list[0];\r\n }\r\n this.setSelection(parent.querySelector(supersearch.ITEM_SELECTOR));\r\n } else {\r\n this.setSelection(this.getVerticalSelection(1));\r\n }\r\n event.preventDefault();\r\n break;\r\n case \"Escape\":\r\n this.clear();\r\n break;\r\n case \"Enter\":\r\n if (this.selection) {\r\n let a = this.selection.querySelector('a');\r\n if (a) {\r\n a.click();\r\n }\r\n }\r\n break;\r\n }\r\n }, false);\r\n }\r\n private getBestNewParents() {\r\n let minLeft = 0;\r\n let list = Array.from(<NodeListOf<HTMLElement>>this.result.querySelectorAll(supersearch.PARENT_SELECTOR));\r\n if (this.parentOffsetLeft == 0) {\r\n this.parentOffsetLeft = list[0].offsetLeft;\r\n }\r\n return list.filter(x => Math.abs(this.parentOffsetLeft - x.offsetLeft) < 10);\r\n }\r\n private setSelection(element: HTMLElement | null) {\r\n if (this.selection) {\r\n this.selection.classList.remove('selected');\r\n }\r\n if (element) {\r\n let parent = <HTMLElement | null>element.closest(supersearch.PARENT_SELECTOR);\r\n if (parent) {\r\n this.parentOffsetLeft = parent.offsetLeft;\r\n }\r\n element.classList.add('selected');\r\n let scroll = <HTMLElement|null>viggo.dom.parentFilter(element, (e: Element) => {\r\n return viggo.getStyle(e, 'overflow-y') in { scroll: 1, auto: 1 };\r\n });\r\n if (scroll) {\r\n let parentOffset = scroll.offsetTop;\r\n let top = scroll.scrollTop;\r\n top = Math.min(top, element.offsetTop - parentOffset);\r\n top = Math.max(top, element.offsetTop - scroll.offsetHeight + element.offsetHeight - parentOffset);\r\n scroll.scrollTop = top;\r\n }\r\n }\r\n this.selection = element;\r\n }\r\n private getVerticalSelection(offset: number) {\r\n let result: HTMLElement | null = null;\r\n if (this.selection) {\r\n let selectedParent = <HTMLElement>this.selection.closest(supersearch.PARENT_SELECTOR);\r\n let all = <NodeListOf<HTMLElement>>selectedParent.querySelectorAll(supersearch.ITEM_SELECTOR);\r\n let index = Array.prototype.indexOf.call(all, this.selection);\r\n if (index == -1) {\r\n throw new Error(\"Selection not found in parent\");\r\n }\r\n if (index + offset >= 0 && index + offset < all.length) {\r\n result = all[index + offset];\r\n } else {\r\n let allParents = <HTMLElement[]>Array.from(this.result.querySelectorAll(supersearch.PARENT_SELECTOR));\r\n let left = selectedParent.offsetLeft;\r\n let filtered = allParents.filter(parent => {\r\n return parent != selectedParent && Math.abs(parent.offsetLeft - left) < 10;\r\n });\r\n let newParent: HTMLElement | null = filtered[0];\r\n if (filtered.length > 1) {\r\n let index = allParents.indexOf(selectedParent);\r\n index = (index + allParents.length + offset) % allParents.length;\r\n newParent = allParents[index];\r\n }\r\n if (newParent) {\r\n if ((newParent.offsetTop - selectedParent.offsetTop) * offset > 0) {\r\n let items = <NodeListOf<HTMLElement>>newParent.querySelectorAll(supersearch.ITEM_SELECTOR);\r\n result = items[offset > 0 ? 0 : items.length - 1];\r\n }\r\n }\r\n\r\n }\r\n }\r\n return result;\r\n }\r\n private getHorizontalSelection(selectRight: boolean) {\r\n if (this.selection) {\r\n let parents = <HTMLElement[]>Array.from(this.result.querySelectorAll(supersearch.PARENT_SELECTOR));\r\n let selectedParent = <HTMLElement>this.selection.closest(supersearch.PARENT_SELECTOR);\r\n let left = selectedParent.offsetLeft;\r\n let top = selectedParent.offsetTop;\r\n parents = parents.filter((parent) => {\r\n let offsetLeft = parent.offsetLeft;\r\n return Math.abs(offsetLeft - left) > 10 && // accept elements not in the same column\r\n Math.abs(parent.offsetTop - top) < 10 // accept elements with same top-index\r\n });\r\n let newParent = parents[0];\r\n if (parents.length > 1) {\r\n let filtered = parents.filter(parent => {\r\n return selectRight ? parent.offsetLeft > left : parent.offsetLeft < left;\r\n });\r\n if (filtered.length) {\r\n newParent = filtered[selectRight ? 0 : filtered.length - 1];\r\n } else {\r\n newParent = parents[selectRight ? 0 : 1];\r\n }\r\n }\r\n let newParentScroll = newParent.scrollTop;\r\n top = this.selection.offsetTop - selectedParent.scrollTop;\r\n let bestTop = Infinity;\r\n let result: HTMLElement|null = null;\r\n (<NodeListOf<HTMLElement>>newParent.querySelectorAll(supersearch.ITEM_SELECTOR)).forEach(element => {\r\n let newTop = Math.abs((element.offsetTop - newParentScroll) - top);\r\n if (newTop < bestTop) {\r\n result = element;\r\n bestTop = newTop;\r\n }\r\n });\r\n return result;\r\n }\r\n return null;\r\n }\r\n public clear() {\r\n this.cancelAjax();\r\n this.selection = null;\r\n this.input.value = '';\r\n viggo.dom.empty(this.result);\r\n let page = document.getElementById('page');\r\n if (page) {\r\n page.classList.remove('autocomplete-searching');\r\n }\r\n }\r\n\r\n protected generateHtml() {\r\n let page = document.getElementById('page');\r\n if (page) {\r\n page.classList.add('autocomplete-searching');\r\n }\r\n\r\n let master = viggo.func.createView(this, this.templates['master']);\r\n let close = master.querySelector('.close');\r\n if (close) {\r\n close.addEventListener('click', () => this.clear(), false);\r\n }\r\n let areas = master.querySelector('.supersearch-areas');\r\n if (!areas) {\r\n throw new Error('Missing class=\"supersearch-areas\" in master template');\r\n }\r\n\r\n areas.appendChild(viggo.func.createView(this, this.templates['area_users']));\r\n areas.appendChild(viggo.func.createView(this, this.templates['area_groups']));\r\n\r\n for (let area in this.urls) {\r\n let template = this.templates['area_' + area];\r\n if (!template) {\r\n template = this.templates['area'];\r\n }\r\n let fragment = viggo.func.createView(this, template);\r\n areas.appendChild(fragment);\r\n }\r\n\r\n return master;\r\n }\r\n\r\n private cancelAjax() {\r\n for (var type in this.ajax) {\r\n this.ajax[type].abort();\r\n delete this.ajax[type];\r\n }\r\n }\r\n\r\n private prepareSearch(type: string, q: string) {\r\n let e = document.getElementById('supersearch-' + type);\r\n if (e) {\r\n viggo.dom.empty(e);\r\n let map: ObjectOfString = {\r\n '<': '<',\r\n '>': '>',\r\n '&': '&',\r\n '\"': '"',\r\n \"'\": '''\r\n };\r\n let view = viggo.func.createView({ query: q.replace(/[<>&\"']/g, (char)=>map[char]||''), type: type }, this.templates['searchlink']);\r\n let a = view.querySelector('a');\r\n e.appendChild(view);\r\n if (a) {\r\n a.addEventListener('click', (event: MouseEvent) => {\r\n let setSelection = event.clientX == 0 && event.clientY == 0;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (a) {\r\n a.classList.add('loading-spinner');\r\n }\r\n this.ajax[type] = new viggo.ajax({\r\n method: 'get',\r\n url: this.urls[type],\r\n data: { q: q },\r\n convert: 'html',\r\n progress: false,\r\n complete: (html: DocumentFragment) => {\r\n delete this.ajax[type];\r\n let elm = document.getElementById('supersearch-' + type);\r\n if (elm) {\r\n setSelection = setSelection && !!this.selection && elm.contains(this.selection);\r\n viggo.dom.empty(elm);\r\n elm.appendChild(html);\r\n if (setSelection) {\r\n this.setSelection(elm.querySelector(supersearch.ITEM_SELECTOR));\r\n }\r\n }\r\n }\r\n });\r\n }, false);\r\n }\r\n }\r\n }\r\n\r\n public search(query: string) {\r\n let html = this.generateHtml();\r\n viggo.dom.empty(this.result);\r\n this.result.appendChild(html);\r\n\r\n for (var i in this.urls) {\r\n this.prepareSearch(i, query);\r\n }\r\n\r\n let userList: AutoCompleteUser[] = [],\r\n groupList: AutoCompleteGroup[] = [];\r\n let users = viggo.dom.fragment(),\r\n groups = viggo.dom.fragment();\r\n let resUsers = <HTMLElement>document.getElementById('supersearch-users');\r\n let resGroups = <HTMLElement>document.getElementById('supersearch-groups');\r\n if (!resUsers || !resGroups) {\r\n throw new Error('Missing supersearch-users or supersearch-groups');\r\n }\r\n\r\n let ready = viggo.autocomplete.isReady();\r\n\r\n let setData = () => {\r\n this.selection = null;\r\n viggo.dom.empty(resUsers);\r\n viggo.dom.empty(resGroups);\r\n\r\n if (!userList.length) {\r\n users.appendChild(viggo.dom.tag('li', { className: 'nohover empty' + (ready ? '' : 'ajaxLoading') }, ready ? 'Ingen resultater' : null));\r\n }\r\n if (!groupList.length) {\r\n groups.appendChild(viggo.dom.tag('li', { className: 'nohover empty' + (ready ? '' : 'ajaxLoading') }, ready ? 'Ingen resultater' : null));\r\n }\r\n\r\n resUsers.appendChild(users);\r\n resGroups.appendChild(groups);\r\n };\r\n\r\n new Promise(async (resolve) => {\r\n let list = viggo.autocomplete.queryToLists(query);\r\n\r\n await viggo.autocomplete.iterate((element: AutoCompleteItem) => {\r\n if (viggo.autocomplete.searchElement(list, element)) {\r\n\r\n element.exactMatch = Array.isArray(element.Search) && element.Search.some(\r\n searchItem => searchItem.trim().toLowerCase() === query.trim().toLowerCase()\r\n );\r\n\r\n element.score = viggo.autocomplete.scoreElement(list, element);\r\n if (element.type == 'user') {\r\n userList.push(<AutoCompleteUser>element);\r\n } else if (element.type == 'group') {\r\n groupList.push(<AutoCompleteGroup>element);\r\n }\r\n }\r\n });\r\n\r\n\r\n userList = userList.sort(viggo.autocomplete.sortCallback).slice(0, this.resultLimit);\r\n groupList = groupList.sort(viggo.autocomplete.sortCallback).slice(0, this.resultLimit);\r\n\r\n viggo.dom.empty(users);\r\n viggo.dom.empty(groups);\r\n\r\n for (let i = 0; i < userList.length; i++) {\r\n users.appendChild(viggo.autocomplete.createView(userList[i], 'SuperSearchUser')!);\r\n }\r\n for (let i = 0; i < groupList.length; i++) {\r\n groups.appendChild(viggo.autocomplete.createView(groupList[i], 'SuperSearchGroup')!);\r\n }\r\n setData();\r\n resolve(null);\r\n });\r\n }\r\n }\r\n}","module viggo {\r\n\texport interface ContextMenuItem {\r\n\t\tscript?: string,\r\n\t\tajax?: ViggoAjaxRequest,\r\n\t\tajaxModal?: {\r\n\t\t\turl: string,\r\n\t\t\tcomplete?: () => void\r\n\t\t}\r\n\t\tclick?: (event: MouseEvent) => void,\r\n\t\tclassName?: string,\r\n image?: string,\r\n icon?: string,\r\n\t\ttitle: string,\r\n\t\tchildren?: ContextMenuItem[]\r\n\t}\r\n\texport class contextmenu {\r\n\t\tprivate items: ContextMenuItem[] = [];\r\n\t\tprivate domNode: HTMLDivElement;\r\n\t\tprivate static instance: contextmenu|null = null;\r\n\t\tprivate constructor() {\r\n\t\t\tif (contextmenu.instance) {\r\n\t\t\t\tcontextmenu.instance.hide();\r\n\t\t\t}\r\n\t\t\tcontextmenu.instance = this;\r\n\t\t\tthis.domNode = viggo.dom.tag('div', { id: 'contextmenu' });\r\n\t\t}\r\n\t\tpublic static getInstance() {\r\n\t\t\tif (!contextmenu.instance) {\r\n\t\t\t\tcontextmenu.instance = new contextmenu();\r\n\t\t\t}\r\n\t\t\treturn contextmenu.instance;\r\n\t\t}\r\n\t\tpublic static isVisible(): boolean {\r\n\t\t return !!contextmenu.instance;\r\n\t\t}\r\n\t\tprivate createItem(parent: Node, item: ContextMenuItem) {\r\n\t\t\tlet click;\r\n\t\t\tif (item.script) {\r\n\t\t\t\tclick = new Function('event', item.script);\r\n\t\t\t} else if (item.ajax) {\r\n\t\t\t click = () => {\r\n\t\t\t\t\tif (item.ajax) {\r\n\t\t\t\t\t\tnew viggo.ajax(item.ajax);\r\n\t\t\t\t\t}\r\n\t\t\t };\r\n\t\t\t} else if (item.ajaxModal) {\r\n\t\t\t let m = item.ajaxModal;\r\n\t\t\t click = () => {\r\n viggo.modal.showAjax(m.url, m.complete);\r\n\t\t\t };\r\n\t\t\t} else if (item.click) {\r\n\t\t\t click = item.click;\r\n\t\t\t} else {\r\n\t\t\t\tclick = function (event: MouseEvent) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tlet li = viggo.dom.tag('li', {\r\n\t\t\t\tonclick: click\r\n\t\t\t});\r\n\t\t if (item.className) {\r\n\t\t li.className = item.className\r\n\t\t }\r\n\t\t\tif (item.image) {\r\n\t\t\t\tli.appendChild(viggo.dom.tag('img', {src: item.image}));\r\n }\r\n if (item.icon) {\r\n li.appendChild(viggo.dom.tag('i', { className: item.icon }));\r\n }\r\n\t\t\tli.appendChild(viggo.dom.tag('span', null, viggo.dom.text(item.title)));\r\n\t\t\tif (item.children) {\r\n\t\t\t var ul = viggo.dom.tag('ul');\r\n\t\t\t for (var i = 0; i < item.children.length; i++) {\r\n\t\t\t this.createItem(ul, item.children[i]);\r\n\t\t\t }\r\n\t\t\t if (ul.childNodes.length) {\r\n\t\t\t li.appendChild(ul);\r\n\t\t\t }\r\n }\r\n\t\t\tparent.appendChild(li);\r\n\t\t}\r\n\t\t/*\r\n\t\tprivate createUrl(parent: Node, url: string) {\r\n\t\t\tvar li = viggo.dom.tag('li', { className: 'contextLoading' });\r\n\t\t\tli.appendChild(viggo.dom.tag('span', null, viggo.dom.text('Loading...')));\r\n\t\t\tparent.appendChild(li);\r\n\t\t\tnew viggo.ajax({\r\n\t\t\t\turl: url,\r\n\t\t\t\tmethod: 'get',\r\n\t\t\t\tconvert: 'json',\r\n\t\t\t\tcomplete: (data) => {\r\n\t\t\t\t\tvar frag = viggo.dom.fragment();\r\n\t\t\t\t\tfor (var i = 0; i < data.length; i++) {\r\n\t\t\t\t\t\tthis.createItem(frag, data[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tparent.replaceChild(frag, li);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\t*/\r\n\t\tprivate createLine(parent: Node) {\r\n\t\t\tparent.appendChild(viggo.dom.tag('li', {className: 'line'}));\r\n\t\t}\r\n\t\tpublic showDom(element: HTMLElement, event: MouseEvent|TouchEvent|PointerEvent) {\r\n\t\t var parent = <HTMLElement>element.parentNode;\r\n\t\t var next = element.nextSibling;\r\n\t\t let click = (ev: MouseEvent|TouchEvent) => {\r\n\t\t document.removeEventListener('click', click, false);\r\n document.removeEventListener('touchstart', click, false);\r\n\t\t var hide = () => {\r\n\t\t parent.insertBefore(element, next);\r\n\t\t this.hide();\r\n\t\t };\r\n\t\t if (ev.type == 'click') {\r\n\t\t hide();\r\n\t\t } else {\r\n\t\t setTimeout(hide, 2000);\r\n\t\t }\r\n\t\t };\r\n\t\t this.domNode.appendChild(element);\r\n\t\t document.addEventListener('click', click, false);\r\n\t\t document.addEventListener('touchstart', click, false);\r\n\t\t\tdocument.body.appendChild(this.domNode);\r\n\t\t\tlet x: number = 0, y: number = 0;\r\n\t\t\tif (event.type == 'click' || event.type == 'contextmenu') {\r\n\t\t\t\tx = (<MouseEvent>event).clientX;\r\n\t\t\t\ty = (<MouseEvent>event).clientY;\r\n\t\t\t} else if (event.type == 'touchstart') {\r\n\t\t\t\tx = (<TouchEvent>event).touches[0].clientX;\r\n\t\t\t\ty = (<TouchEvent>event).touches[0].clientY;\r\n\t\t\t}\r\n\t\t this.reposition(x, y);\r\n\t\t viggo.hint.block();\r\n\t\t}\r\n\t\tpublic static addItem(item: ContextMenuItem) {\r\n\t\t\tcontextmenu.getInstance().addItem(item);\r\n }\r\n public static addLine() {\r\n contextmenu.addItem({className: 'line', title: ''});\r\n }\r\n public static hide() {\r\n if (contextmenu.instance) {\r\n contextmenu.instance.hide();\r\n }\r\n }\r\n\t\tpublic addItem(item: ContextMenuItem) {\r\n\t\t\tthis.items.push(item);\r\n\t\t}\r\n public hide() {\r\n\t\t\tthis.domNode.remove();\r\n\t\t\tcontextmenu.instance = null;\r\n\t\t\tviggo.hint.unblock();\r\n\t\t}\r\n\t\tpublic show(event: MouseEvent) {\r\n if (this.items.length) {\r\n let ul = this.domNode.appendChild(viggo.dom.tag('ul', {className: 'dropdown-menu'}));\r\n\t\t\t\tthis.items.forEach((e => {\r\n\t\t\t\t\tthis.createItem(ul, e);\r\n\t\t\t\t}));\r\n let click = (ev: MouseEvent) => {\r\n if (ev.button == 0) { // Firefox on Mac calls click on right-click, so we make sure it's the right button\r\n document.removeEventListener('click', click, false);\r\n this.hide();\r\n }\r\n\t\t\t\t};\r\n\t\t\t\tdocument.addEventListener('click', click, false);\r\n\t\t\t // removed this part, because touchstart is triggered before click, and the menu is removed when touched\r\n\t\t\t //document.addEventListener('touchstart', hide, false);\r\n\t\t\t\tdocument.body.appendChild(this.domNode);\r\n\t\t\t\tthis.reposition(event.clientX, event.clientY);\r\n\t\t\t\tviggo.hint.block();\r\n\t\t\t\treturn true;\r\n\t\t\t} else {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tprivate reposition(x: number, y: number) {\r\n if (this.domNode) {\r\n let page = viggo.getTopScrollable();\r\n\t\t let maxY = page.offsetHeight - this.domNode.offsetHeight - 10;\r\n\t\t let maxX = page.offsetWidth - this.domNode.offsetWidth - 10;\r\n\t\t y = Math.min(y, maxY);\r\n\t\t x = Math.min(x, maxX);\r\n\t\t this.domNode.style.top = y + 'px';\r\n\t\t this.domNode.style.left = x + 'px';\r\n\t\t }\r\n\t\t}\r\n\t}\r\n\r\n\tdocument.addEventListener('contextmenu', (event: MouseEvent) => {\r\n let target;\r\n\t if (contextmenu.getInstance().show(event)) {\r\n\t\t\tevent.preventDefault();\r\n } else if (target = (<Element>event.target).closest('.contextmenu,.block-contextmenu')) {\r\n if (target.classList.contains('contextmenu')) {\r\n let menu = target.querySelector('.context-dropdown-menu') || target.querySelector('.dropdown-menu');\r\n if (menu) {\r\n contextmenu.getInstance().showDom(<HTMLElement>menu, event);\r\n event.preventDefault();\r\n }\r\n }\r\n\t\t}\r\n\t}, false);\r\n\r\n document.addEventListener('contextmenu', (event: MouseEvent) => {\r\n contextmenu.hide();\r\n }, true);\r\n\r\n\tlet touchtimer: number, cancelTimer = () => {\r\n\t clearTimeout(touchtimer);\r\n\t};\r\n document.addEventListener('touchstart', (event: TouchEvent) => {\r\n clearTimeout(touchtimer);\r\n touchtimer = window.setTimeout(function () {\r\n if (!event.touches || event.touches.length > 1) {\r\n return;\r\n }\r\n let data = {\r\n view: event.view,\r\n bubbles: true,\r\n cancelable: true,\r\n clientX: event.touches[0].clientX,\r\n clientY: event.touches[0].clientY\r\n };\r\n let ev: any;\r\n if (typeof PointerEvent == \"undefined\") { // iPhone 5 doesn't support PointerEvent\r\n ev = new MouseEvent('contextmenu', data);\r\n } else {\r\n ev = new PointerEvent('contextmenu', data);\r\n }\r\n\t\t\t/*\r\n\t\t\t// not accepted by TypeScript\r\n ev.clientX = event.touches[0].clientX; // needs to be here for iPads.\r\n\t\t\tev.clientY = event.touches[0].clientY;\r\n\t\t\t*/\r\n if (!event.target!.dispatchEvent(ev)) {\r\n event.preventDefault();\r\n }\r\n }, 500);\r\n }, false);\r\n\r\n document.addEventListener('touchend', cancelTimer, false);\r\n document.addEventListener('touchmove', cancelTimer, false);\r\n document.addEventListener('touchcancel', cancelTimer, false);\r\n}","module viggo {\r\n let check = () => {\r\n let targets = document.querySelectorAll('.pagination li.next>a,.pagination tr.next[data-pagination-url]');\r\n let bottom = window.pageYOffset + document.documentElement!.offsetHeight;\r\n let distance = 700;\r\n targets.forEach((e) => {\r\n let rect = e.getBoundingClientRect();\r\n let height = Math.max(document.documentElement!.clientHeight, window.innerHeight);\r\n if ((rect.top || rect.height || rect.left || rect.width) && rect.top - height <= distance) {\r\n let href: string;\r\n let parent: Node|null = e;\r\n if (e.tagName == 'A') {\r\n href = (<HTMLAnchorElement>e).href;\r\n parent = parent.parentNode;\r\n e.remove();\r\n } else {\r\n href = (<HTMLElement>e).dataset.paginationUrl || '';\r\n delete (<HTMLElement>e).dataset.paginationUrl;\r\n }\r\n new viggo.ajax({\r\n method: 'get',\r\n url: href,\r\n convert: 'html',\r\n complete: function (html: DocumentFragment) {\r\n if (parent && parent.parentNode) {\r\n parent.parentNode.replaceChild(html, parent);\r\n }\r\n check();\r\n }\r\n });\r\n }\r\n });\r\n };\r\n\r\n //document.addEventListener('wheel', check, true);\r\n document.addEventListener('scroll', check, true);\r\n window.addEventListener('resize', check, true);\r\n document.addEventListener('statepushed', check, false);\r\n viggo.ready(check);\r\n}","module viggo {\r\n export class confidential {\r\n private static instance: confidential | null = null;\r\n private styleTag: HTMLStyleElement;\r\n private confidentialIds: string[] = [];\r\n constructor() {\r\n if (confidential.instance) {\r\n confidential.unlock();\r\n confidential.instance = null;\r\n }\r\n this.styleTag = viggo.dom.tag('style', { type: 'text/css' });\r\n }\r\n public static getInstance() {\r\n if (!confidential.instance) {\r\n confidential.instance = new confidential();\r\n }\r\n return confidential.instance;\r\n }\r\n private static getConfidential(tag: Element): Element | null {\r\n return viggo.dom.parentFilter(tag, (element: Element) => {\r\n return !!((<HTMLElement>element).dataset && (<HTMLElement>element).dataset.confidential);\r\n });\r\n }\r\n private static clickListener(event: MouseEvent) {\r\n var tag = <HTMLElement | null>confidential.getConfidential(<HTMLElement>event.target);\r\n if (tag) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n let id = tag.dataset.confidential;\r\n if (id) {\r\n let instance = confidential.getInstance();\r\n let index = instance.confidentialIds.indexOf(id);\r\n if (index === -1) {\r\n instance.confidentialIds.push(id);\r\n } else {\r\n instance.confidentialIds.splice(index, 1);\r\n }\r\n confidential.setConfidential(id, index === -1);\r\n confidential.startSelection(instance.confidentialIds);\r\n }\r\n }\r\n }\r\n private static exitListener(event: Event) {\r\n if (event.type != 'keydown' || (<KeyboardEvent>event).keyCode == 27) {\r\n viggo.confidential.endSelection();\r\n }\r\n }\r\n public static startSelection(ids: string[]) {\r\n this.unlock();\r\n let instance = confidential.getInstance();\r\n document.documentElement!.classList.add('confidential-selection');\r\n instance.setStyle(`[data-confidential] {\r\n }\r\n div.item:not([data-confidential]) {\r\n opacity: 0.3;\r\n }\r\n [data-confidential=\"${ids.join('\"],[data-confidential=\"')}\"] {\r\n background-color: #f2afaf !important\r\n }`);\r\n instance.confidentialIds = ids;\r\n viggo.notice(NoticeType.complete, __(\"Press [Esc] to finish\"));\r\n document.addEventListener('click', confidential.clickListener, true);\r\n window.addEventListener('keydown', confidential.exitListener, true);\r\n document.addEventListener('statepushed', confidential.exitListener, true);\r\n }\r\n private setStyle(style: string) {\r\n viggo.dom.empty(this.styleTag);\r\n this.styleTag.appendChild(viggo.dom.text(style));\r\n document.getElementsByTagName('head')[0].appendChild(this.styleTag);\r\n }\r\n public static endSelection() {\r\n this.unlock();\r\n document.removeEventListener('click', confidential.clickListener, true);\r\n window.removeEventListener('keydown', confidential.exitListener, true);\r\n document.removeEventListener('statepushed', confidential.exitListener, true);\r\n }\r\n public static hasConfidentialElements() {\r\n return !!document.querySelector('[data-confidential]');\r\n }\r\n public static setConfidential(id: string, lock: boolean) {\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Shared/Visibility/SaveConfidential',\r\n json: true,\r\n data: {\r\n id: id,\r\n locked: lock\r\n }\r\n });\r\n }\r\n public static lock(ids: string[]) {\r\n confidential.unlock();\r\n let instance = confidential.getInstance();\r\n instance.setStyle(`[data-confidential=\"${ids.join('\"],[data-confidential=\"')}\"] {\r\n display: none !important;\r\n }`);\r\n }\r\n public static unlock() {\r\n document.documentElement!.classList.remove('confidential-selection');\r\n if (confidential.instance) {\r\n confidential.instance.styleTag.remove();\r\n }\r\n }\r\n }\r\n}","module viggo {\r\n export const informationTypes: {[index: string]: number} = { // top = 0, center = 1, bottom = 2\r\n top: 0,\r\n birthday: 2,\r\n guard: 2,\r\n presence: 1,\r\n absence: 1\r\n };\r\n\r\n const itemStyles = ['backgroundColor', 'borderColor', 'color'];\r\n\r\n export enum CalendarItemTemporaryMode {\r\n pasting,\r\n creating,\r\n moving\r\n }\r\n\r\n interface CalendarItemLinks {\r\n dblclick?: string;\r\n }\r\n\r\n interface CalendarItemSubstitute {\r\n Fullname?: string;\r\n img?: string;\r\n initials?: string;\r\n }\r\n\r\n enum CalendarContextType {\r\n AjaxModal = 0,\r\n Execute = 1,\r\n ExecuteDelete = 2\r\n }\r\n\r\n enum UrlReplacement {\r\n None = 0,\r\n DataAttributes = 1,\r\n Callback = 2\r\n }\r\n\r\n interface CalendarContextItem {\r\n title: string;\r\n url: string;\r\n type: CalendarContextType;\r\n iconClassName?: string;\r\n invalidate?: boolean;\r\n replacement?: UrlReplacement;\r\n }\r\n\r\n export interface CalendarItemDTO {\r\n calendar?: CalendarInterface,\r\n id: number,\r\n group: string,\r\n title: string,\r\n elementname?: string,\r\n description?: string,\r\n hint?: string,\r\n premises?: string,\r\n premisesConflict?: boolean,\r\n hintClass?: string|null,\r\n start: Date,\r\n length: number,\r\n readonly: boolean,\r\n classes?: string,\r\n type: CalendarItemType,\r\n copyType: number,\r\n elementType?: number,\r\n elementId: number,\r\n links?: CalendarItemLinks,\r\n contextmenu?: CalendarContextItem[],\r\n data?: ObjectOfAny,\r\n columnIds?: number[],\r\n backgroundColor?: string,\r\n borderColor?: string,\r\n color?: string,\r\n temporaryMode?: CalendarItemTemporaryMode,\r\n style?: { [index: string]: string },\r\n initials?: string,\r\n selectedsubstitute?: CalendarItemSubstitute,\r\n [index: string]: any\r\n }\r\n\r\n export abstract class CalendarItem {\r\n public calendar: CalendarInterface;\r\n public id: number;\r\n public group: string;\r\n public title: string;\r\n public elementname: string;\r\n public description: string;\r\n public hint: string;\r\n public premises: string;\r\n public premisesConflict: boolean;\r\n public hintClass: string|null;\r\n public start: Date;\r\n public length: number;\r\n public readonly: boolean;\r\n public classes?: string;\r\n public type: CalendarItemType;\r\n public links: CalendarItemLinks;\r\n public data: ObjectOfAny;\r\n public columnIds?: number[];\r\n public elements: HTMLDivElement[];\r\n public indent: number;\r\n public itemCount: number;\r\n public elementType: number;\r\n public elementId: number;\r\n public initials?: string;\r\n protected contextmenu: CalendarContextItem[];\r\n public selectedsubstitute?: CalendarItemSubstitute;\r\n private overlappingItemsOnDay: CalendarItem[];\r\n private filter: FilterResult;\r\n public style: ObjectOfString;\r\n private copied: boolean;\r\n public alsoBookedBy: CalendarItem[];\r\n private selected: boolean = false;\r\n private changed: boolean = false;\r\n public temporaryMode?: CalendarItemTemporaryMode;\r\n public copyType: number;\r\n public overlapMode: number | boolean = false;\r\n public get end(): Date {\r\n let end = new Date(this.start.getTime() + this.length);\r\n let dif = this.start.getTimezoneOffset() - end.getTimezoneOffset();\r\n if (dif) {\r\n end.setMinutes(end.getMinutes() - dif);\r\n }\r\n return end;\r\n }\r\n public set end(value: Date) {\r\n let length = value.getTime() - this.start.getTime() - (value.getTimezoneOffset() - this.start.getTimezoneOffset()) * 60 * 1000;\r\n if (length <= 0) {\r\n throw new Error(\"End value must be later than start value.\");\r\n }\r\n this.length = length;\r\n }\r\n public get typeString() {\r\n return CalendarItemType[this.type] || 'Calendar';\r\n }\r\n public get typeStringLowerCase() {\r\n return this.typeString.toLowerCase();\r\n }\r\n constructor(object: CalendarItemDTO) {\r\n if (!object.calendar) {\r\n throw new Error(\"Missing calender in CalenderItems\");\r\n }\r\n this.calendar = object.calendar;\r\n this.id = object.id;\r\n this.group = object.group + '';\r\n this.title = object.title;\r\n this.elementname = object.elementname || '';\r\n this.description = object.description || '';\r\n this.filter = FilterResult.show;\r\n this.hint = object.hint || '';\r\n this.premises = object.premises || '';\r\n this.premisesConflict = object.premisesConflict || false;\r\n this.hintClass = object.hintClass || null;\r\n this.start = object.start;\r\n this.length = object.length;\r\n this.readonly = object.readonly;\r\n this.classes = object.classes;\r\n this.type = object.type;\r\n this.initials = object.initials || '';\r\n this.selectedsubstitute = object.selectedsubstitute || {};\r\n this.elementType = typeof object.elementType == 'undefined' ? -1 : object.elementType;\r\n this.elementId = object.elementId;\r\n this.links = object.links || {};\r\n this.data = object.data || {};\r\n this.columnIds = object.columnIds;\r\n this.elements = [];\r\n this.indent = 0;\r\n this.itemCount = 1;\r\n this.copyType = object.copyType;\r\n this.overlappingItemsOnDay = [];\r\n this.contextmenu = object.contextmenu || [];\r\n this.temporaryMode = object.temporaryMode;\r\n this.style = {};\r\n itemStyles.forEach((property: string) => {\r\n if (property in object && object[property]) {\r\n this.style[property.replace('C', '-c')] = object[property];\r\n }\r\n });\r\n if (object.style) {\r\n for (let property in object.style) {\r\n let lowercase = property.replace(/[A-Z]/, (a) => '-' + a.toLowerCase());\r\n this.style[lowercase] = object.style[property];\r\n }\r\n }\r\n if (this.style['background-color'] && !this.style['color']) {\r\n this.style['color'] = this.getColorFromBackground(this.style['background-color']);\r\n }\r\n if (this.temporaryMode == CalendarItemTemporaryMode.creating) {\r\n this.style['pointer-events'] = 'none';\r\n }\r\n this.copied = AbstractCalendar.copiedItems.size > 0 && AbstractCalendar.copiedItems.has(<number>this.id);\r\n this.alsoBookedBy = [];\r\n }\r\n\r\n private getColorFromBackground(color: string) {\r\n const colors: number[] = [];\r\n color = this.colorNameToHex(color);\r\n for (let i = 1; i < color.length; i += 2) {\r\n colors.push(parseInt(color.substring(i, i + 2), 16) / 255);\r\n }\r\n const lightness = (Math.max(...colors) + Math.min(...colors)) / 2;\r\n\r\n return lightness < 0.45 ? 'white' : 'black';\r\n }\r\n\r\n private static colors: ObjectOfString = {\r\n \"aliceblue\": \"#f0f8ff\", \"antiquewhite\": \"#faebd7\", \"aqua\": \"#00ffff\", \"aquamarine\": \"#7fffd4\", \"azure\": \"#f0ffff\",\r\n \"beige\": \"#f5f5dc\", \"bisque\": \"#ffe4c4\", \"black\": \"#000000\", \"blanchedalmond\": \"#ffebcd\", \"blue\": \"#0000ff\", \"blueviolet\": \"#8a2be2\", \"brown\": \"#a52a2a\", \"burlywood\": \"#deb887\",\r\n \"cadetblue\": \"#5f9ea0\", \"chartreuse\": \"#7fff00\", \"chocolate\": \"#d2691e\", \"coral\": \"#ff7f50\", \"cornflowerblue\": \"#6495ed\", \"cornsilk\": \"#fff8dc\", \"crimson\": \"#dc143c\", \"cyan\": \"#00ffff\",\r\n \"darkblue\": \"#00008b\", \"darkcyan\": \"#008b8b\", \"darkgoldenrod\": \"#b8860b\", \"darkgray\": \"#a9a9a9\", \"darkgreen\": \"#006400\", \"darkkhaki\": \"#bdb76b\", \"darkmagenta\": \"#8b008b\", \"darkolivegreen\": \"#556b2f\",\r\n \"darkorange\": \"#ff8c00\", \"darkorchid\": \"#9932cc\", \"darkred\": \"#8b0000\", \"darksalmon\": \"#e9967a\", \"darkseagreen\": \"#8fbc8f\", \"darkslateblue\": \"#483d8b\", \"darkslategray\": \"#2f4f4f\", \"darkturquoise\": \"#00ced1\",\r\n \"darkviolet\": \"#9400d3\", \"deeppink\": \"#ff1493\", \"deepskyblue\": \"#00bfff\", \"dimgray\": \"#696969\", \"dodgerblue\": \"#1e90ff\",\r\n \"firebrick\": \"#b22222\", \"floralwhite\": \"#fffaf0\", \"forestgreen\": \"#228b22\", \"fuchsia\": \"#ff00ff\",\r\n \"gainsboro\": \"#dcdcdc\", \"ghostwhite\": \"#f8f8ff\", \"gold\": \"#ffd700\", \"goldenrod\": \"#daa520\", \"gray\": \"#808080\", \"green\": \"#008000\", \"greenyellow\": \"#adff2f\",\r\n \"honeydew\": \"#f0fff0\", \"hotpink\": \"#ff69b4\",\r\n \"indianred \": \"#cd5c5c\", \"indigo\": \"#4b0082\", \"ivory\": \"#fffff0\", \"khaki\": \"#f0e68c\",\r\n \"lavender\": \"#e6e6fa\", \"lavenderblush\": \"#fff0f5\", \"lawngreen\": \"#7cfc00\", \"lemonchiffon\": \"#fffacd\", \"lightblue\": \"#add8e6\", \"lightcoral\": \"#f08080\", \"lightcyan\": \"#e0ffff\", \"lightgoldenrodyellow\": \"#fafad2\",\r\n \"lightgrey\": \"#d3d3d3\", \"lightgreen\": \"#90ee90\", \"lightpink\": \"#ffb6c1\", \"lightsalmon\": \"#ffa07a\", \"lightseagreen\": \"#20b2aa\", \"lightskyblue\": \"#87cefa\", \"lightslategray\": \"#778899\", \"lightsteelblue\": \"#b0c4de\",\r\n \"lightyellow\": \"#ffffe0\", \"lime\": \"#00ff00\", \"limegreen\": \"#32cd32\", \"linen\": \"#faf0e6\",\r\n \"magenta\": \"#ff00ff\", \"maroon\": \"#800000\", \"mediumaquamarine\": \"#66cdaa\", \"mediumblue\": \"#0000cd\", \"mediumorchid\": \"#ba55d3\", \"mediumpurple\": \"#9370d8\", \"mediumseagreen\": \"#3cb371\", \"mediumslateblue\": \"#7b68ee\",\r\n \"mediumspringgreen\": \"#00fa9a\", \"mediumturquoise\": \"#48d1cc\", \"mediumvioletred\": \"#c71585\", \"midnightblue\": \"#191970\", \"mintcream\": \"#f5fffa\", \"mistyrose\": \"#ffe4e1\", \"moccasin\": \"#ffe4b5\",\r\n \"navajowhite\": \"#ffdead\", \"navy\": \"#000080\",\r\n \"oldlace\": \"#fdf5e6\", \"olive\": \"#808000\", \"olivedrab\": \"#6b8e23\", \"orange\": \"#ffa500\", \"orangered\": \"#ff4500\", \"orchid\": \"#da70d6\",\r\n \"palegoldenrod\": \"#eee8aa\", \"palegreen\": \"#98fb98\", \"paleturquoise\": \"#afeeee\", \"palevioletred\": \"#d87093\", \"papayawhip\": \"#ffefd5\", \"peachpuff\": \"#ffdab9\", \"peru\": \"#cd853f\", \"pink\": \"#ffc0cb\", \"plum\": \"#dda0dd\", \"powderblue\": \"#b0e0e6\", \"purple\": \"#800080\",\r\n \"rebeccapurple\": \"#663399\", \"red\": \"#ff0000\", \"rosybrown\": \"#bc8f8f\", \"royalblue\": \"#4169e1\",\r\n \"saddlebrown\": \"#8b4513\", \"salmon\": \"#fa8072\", \"sandybrown\": \"#f4a460\", \"seagreen\": \"#2e8b57\", \"seashell\": \"#fff5ee\", \"sienna\": \"#a0522d\", \"silver\": \"#c0c0c0\", \"skyblue\": \"#87ceeb\", \"slateblue\": \"#6a5acd\", \"slategray\": \"#708090\", \"snow\": \"#fffafa\", \"springgreen\": \"#00ff7f\", \"steelblue\": \"#4682b4\",\r\n \"tan\": \"#d2b48c\", \"teal\": \"#008080\", \"thistle\": \"#d8bfd8\", \"tomato\": \"#ff6347\", \"turquoise\": \"#40e0d0\",\r\n \"violet\": \"#ee82ee\",\r\n \"wheat\": \"#f5deb3\", \"white\": \"#ffffff\", \"whitesmoke\": \"#f5f5f5\",\r\n \"yellow\": \"#ffff00\", \"yellowgreen\": \"#9acd32\"\r\n };\r\n\r\n private colorNameToHex(color: string) {\r\n return CalendarItem.colors[color.toLowerCase()] || color;\r\n }\r\n public set pointerEvents(value: boolean) {\r\n if (value) {\r\n delete this.style['pointer-events'];\r\n } else {\r\n this.style['pointer-events'] = 'none';\r\n }\r\n }\r\n\r\n public get pointerEvents() {\r\n return this.style['pointer-events'] != 'none';\r\n }\r\n\r\n public createUrlFromItem(urlTemplate: string) {\r\n return viggo.func.createTemplate(urlTemplate)(this);\r\n }\r\n\r\n public createUrlFromElement(urlTemplate: string, element: Element) {\r\n return urlTemplate.replace(/\\[([^\\]]+)\\]/, (all: string, attr: string) => {\r\n let parent = element.closest(all);\r\n return parent ? parent.getAttribute(attr) || '' : '';\r\n });\r\n }\r\n\r\n public createUrl(urlTemplate: string, element?: Element | null) {\r\n urlTemplate = this.createUrlFromItem(urlTemplate);\r\n if (element) {\r\n urlTemplate = this.createUrlFromElement(urlTemplate, element);\r\n }\r\n return urlTemplate;\r\n }\r\n\r\n public get isInPeriod() {\r\n return this.calendar.isInPeriod(this);\r\n }\r\n\r\n public setStart(start: Date) {\r\n if (!this.readonly) {\r\n if (start.getTime() != this.start.getTime()) {\r\n this.start = start;\r\n this.changed = true;\r\n }\r\n }\r\n }\r\n public setLength(length: number) {\r\n if (!this.readonly) {\r\n length = Math.max(length, AbstractCalendar.timeDetail);\r\n if (length != this.length) {\r\n this.length = length;\r\n this.changed = true;\r\n }\r\n }\r\n }\r\n public setGroup(group: string) {\r\n if (!this.readonly) {\r\n this.changed = this.changed || this.group != group;\r\n this.group = group;\r\n }\r\n }\r\n public getStyles() {\r\n let result: string[] = [];\r\n for (let property in this.style) {\r\n result.push(property + \": \" + this.style[property]);\r\n }\r\n return result.join('; ');\r\n }\r\n public isInView() {\r\n return this.isBetween(this.calendar.startDate, this.calendar.endDate);\r\n }\r\n public save(complete?: (item: CalendarItem) => void) {\r\n let topElement = this.elements[this.elements.length - 1];\r\n if (this.id === 0 && !this.calendar.links.Execute) {\r\n let popup: HTMLElement;\r\n let close = (event: Event|false) => {\r\n if (event && event.type == 'mousedown' && viggo.dom.parentId(<Element>event.target, 'events-create-popup')) {\r\n return;\r\n }\r\n viggo.modal.removeEventListener('close', close);\r\n document.removeEventListener('mousedown', close, true);\r\n if (event !== false) {\r\n this.remove();\r\n }\r\n if (popup) {\r\n popup.remove();\r\n }\r\n };\r\n if (!this.elements.length) {\r\n // somehow we got something that shouldn't be saved.\r\n return;\r\n }\r\n let pos = viggo.getPosition(topElement);\r\n pos.top -= viggo.getScrollTop(topElement);\r\n popup = viggo.dom.tag('div', {\r\n id: 'events-create-popup',\r\n style: {\r\n left: pos.left + 'px',\r\n top: pos.top + topElement.offsetHeight + 'px'\r\n },\r\n onmousedown: (event: Event) => {\r\n event.stopPropagation();\r\n }\r\n },\r\n viggo.dom.tag('span', null, this.start.format('dd MMM HH:mm')),\r\n viggo.dom.tag('span', null, (new Date(this.start.getTime() + this.length)).format('dd MMM HH:mm')));\r\n\r\n for (let add of this.calendar.links.Add) {\r\n popup.appendChild(viggo.dom.tag('button', {\r\n onclick: (event: Event) => {\r\n close(false);\r\n event.stopPropagation();\r\n event.preventDefault();\r\n viggo.modal.addEventListener('close', close);\r\n let url = this.createUrl(add.Url, topElement);\r\n let prefix = url.indexOf('?') == -1 ? '?' : '&';\r\n url = `${url}${prefix}date=${encodeURIComponent(this.start.format('yyyy-MM-dd HH:mm:ss'))}&enddate=${encodeURIComponent(this.end.format('yyyy-MM-dd HH:mm:ss'))}`;\r\n viggo.modal.showAjax(url, () => {\r\n this.changed = false;\r\n let input = <HTMLInputElement | null>document.getElementById('calendar_guard');\r\n if (input && input.viggoPicker) {\r\n var d = new Date(this.start);\r\n d.setHours(0, 0, 0, 0);\r\n (<viggo.DatePickerInput>input.viggoPicker).selectedList = [d];\r\n (<viggo.DatePickerInput>input.viggoPicker).setDate(d);\r\n }\r\n\r\n let form = <HTMLFormElement | null>document.getElementById('calendarForm');\r\n if (form) {\r\n let s: { [index: string]: string } = {\r\n startdate: 'dd-MM-yyyy',\r\n starttime: 'HH:mm',\r\n enddate: 'dd-MM-yyyy',\r\n endtime: 'HH:mm'\r\n };\r\n for (let i in s) {\r\n let item = <HTMLInputElement | null>form.elements.namedItem(i);\r\n if (item) {\r\n let date: Date = i.indexOf('end') === 0 ? this.end : this.start;\r\n item.value = date.format(s[i]);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }, add.Title));\r\n }\r\n\r\n let page = document.getElementById('page');\r\n if (page) {\r\n page.appendChild(popup);\r\n let rect = page.getBoundingClientRect();\r\n popup.style.top = Math.min(pos.top + topElement.offsetHeight, rect.bottom - popup.offsetHeight - 32) + 'px';\r\n popup.style.left = Math.min(pos.left, rect.right - popup.offsetWidth - 32) + 'px';\r\n }\r\n document.addEventListener('mousedown', close, true);\r\n } else if (this.id === 0 && this.calendar.links.Execute) {\r\n let data = Object.assign({}, this.data);\r\n data.start = this.start.format('dd-MM-yyyy HH:mm');\r\n data.end = this.end.format('dd-MM-yyyy HH:mm');\r\n\r\n new viggo.ajax({\r\n method: 'post',\r\n url: this.createUrl(this.calendar.links.Execute, topElement),\r\n data: data,\r\n convert: 'javascript',\r\n complete: () => {\r\n if (complete) {\r\n complete(this);\r\n }\r\n }\r\n //complete: function(data) {\r\n // if (data !== true) {\r\n // alert(__(\"Data not saved. Please reload the page.\"));\r\n // }\r\n //}\r\n });\r\n } else if (this.changed && this.calendar.links.Move) {\r\n new viggo.ajax({\r\n method: 'post',\r\n url: this.createUrl(this.calendar.links.Move, topElement),\r\n data: {\r\n id: this.id,\r\n start: this.start.format('dd-MM-yyyy HH:mm'),\r\n end: (new Date(this.start.getTime() + this.length)).format('dd-MM-yyyy HH:mm')\r\n },\r\n convert: 'javascript',\r\n complete: () => {\r\n if (complete) {\r\n complete(this);\r\n }\r\n }\r\n });\r\n this.changed = false;\r\n }\r\n }\r\n public removeAllElements() {\r\n while (this.elements.length) {\r\n var e = this.elements.pop();\r\n if (e) {\r\n e.remove();\r\n }\r\n }\r\n }\r\n public remove(repaintLater?: boolean) {\r\n var removing = !!this.elements.length;\r\n this.removeAllElements();\r\n this.calendar.removeItem(this, repaintLater);\r\n return removing;\r\n }\r\n public abstract update(filter: FilterResult): void;\r\n private showItemHint(event: Event) {\r\n if (this.id) {\r\n let content: HTMLElement|null = null;\r\n let hint = this.calendar.createView('ItemHint', this);\r\n if (hint) {\r\n event.stopPropagation();\r\n try {\r\n new viggo.hint(this.elements[0], <Element>hint.firstChild);\r\n } catch (e) {\r\n // hint is blocked\r\n }\r\n }\r\n }\r\n }\r\n public addClassName(className: string) {\r\n for (var i = 0; i < this.elements.length; i++) {\r\n var e = this.elements[i];\r\n e.classList.add(className);\r\n }\r\n }\r\n public removeClassName(className: string) {\r\n for (var i = 0; i < this.elements.length; i++) {\r\n var e = this.elements[i];\r\n e.classList.remove(className);\r\n }\r\n }\r\n public highlightElements() {\r\n this.addClassName('hover');\r\n let elements: HTMLDivElement[] = [];\r\n this.alsoBookedBy.forEach(item => {\r\n if (item.overlapMode === true) {\r\n elements = elements.concat(item.elements);\r\n }\r\n });\r\n new viggo.effect({\r\n element: elements,\r\n from: 'scale(1)',\r\n to: 'scale(1.05)',\r\n duration: 600,\r\n removeStyle: true,\r\n type: function (x) {\r\n return viggo.effect.types.pulse(x, 3);\r\n },\r\n style: 'transform'\r\n });\r\n }\r\n public lowlightElements() {\r\n this.removeClassName('hover');\r\n }\r\n public select() {\r\n this.addClassName('selected');\r\n this.selected = true;\r\n }\r\n public deselect() {\r\n this.removeClassName('selected');\r\n this.selected = false;\r\n }\r\n public copyCut() {\r\n this.addClassName('cut');\r\n this.copied = true;\r\n }\r\n public clearCopyCut() {\r\n this.removeClassName('cut');\r\n this.copied = false;\r\n }\r\n public createElement(parent: Element, filter: FilterResult): HTMLDivElement {\r\n this.filter = filter;\r\n let element: DocumentFragment | HTMLDivElement | null = this.calendar.createView('Item', this);\r\n if (!element) {\r\n throw new Error('Missing template \"Item\" in calendar.');\r\n }\r\n element = <HTMLDivElement | null>element.firstChild;\r\n if (!element) {\r\n throw new Error('First element of template \"Item\" must be <div>');\r\n }\r\n switch (filter) {\r\n case FilterResult.hide:\r\n return element;\r\n case FilterResult.show:\r\n break;\r\n case FilterResult.dim:\r\n break;\r\n }\r\n\r\n element.viggoItem = this;\r\n element.addEventListener('contextmenu', (event: Event) => {\r\n if (this.calendar.selectedItems.indexOf(this) === -1) {\r\n this.calendar.clearSelection();\r\n this.calendar.toggleSelect(this);\r\n }\r\n \r\n if (this.calendar.selectedItems.length > 1) {\r\n viggo.contextmenu.addItem({\r\n title: __('Delete'),\r\n className: 'calendar_delete ajaxDeleteExecute',\r\n click: () => {\r\n this.calendar.deleteSelected();\r\n },\r\n icon: 'flaticon-delete'\r\n });\r\n } else {\r\n for (let context of this.contextmenu) {\r\n let url = context.url;\r\n switch (context.replacement) {\r\n case UrlReplacement.Callback:\r\n url = this.createUrlFromItem(url);\r\n break;\r\n case UrlReplacement.DataAttributes:\r\n url = this.createUrlFromElement(url, <HTMLElement>element);\r\n break;\r\n }\r\n let item: ContextMenuItem = {\r\n title: context.title,\r\n icon: context.iconClassName\r\n };\r\n\r\n switch (context.type) {\r\n case CalendarContextType.AjaxModal:\r\n item.click = () => {\r\n let modal = viggo.modal.showAjax(url);\r\n if (context.invalidate) {\r\n modal.addEventListener('close', () => {\r\n viggo.invalidate(<HTMLElement>element);\r\n });\r\n }\r\n };\r\n break;\r\n case CalendarContextType.Execute:\r\n case CalendarContextType.ExecuteDelete:\r\n default:\r\n item.click = () => {\r\n let splitUrl = url.split('#');\r\n if (splitUrl[1]) {\r\n let parent = document.getElementById(splitUrl[1]);\r\n if (parent) {\r\n parent.classList.add('loading-spinner');\r\n }\r\n }\r\n new viggo.ajax({\r\n method: context.type == CalendarContextType.ExecuteDelete ? 'delete' : 'get',\r\n url: splitUrl[0],\r\n convert: true,\r\n complete: (result: any) => {\r\n if (splitUrl[1] && result && result.nodeType == 11) {\r\n let parent = document.getElementById(splitUrl[1]);\r\n if (parent) {\r\n parent.classList.remove('loading-spinner');\r\n viggo.dom.empty(parent);\r\n parent.appendChild(result);\r\n }\r\n }\r\n if (context.invalidate) {\r\n viggo.invalidate(<HTMLElement>element);\r\n }\r\n }\r\n });\r\n };\r\n break;\r\n }\r\n viggo.contextmenu.addItem(item);\r\n }\r\n }\r\n if (!this.readonly && this.calendar.links.Copy && this.copyType) {\r\n viggo.contextmenu.addLine();\r\n viggo.contextmenu.addItem({\r\n title: __('Copy'),\r\n className: 'calendar_copy',\r\n icon: 'o-flaticon-copy',\r\n click: () => {\r\n this.calendar.copy();\r\n }\r\n });\r\n viggo.contextmenu.addItem({\r\n title: __('Cut'),\r\n className: 'calendar_cut',\r\n icon: 'o-flaticon-cut',\r\n click: () => {\r\n this.calendar.cut();\r\n }\r\n });\r\n }\r\n });\r\n\r\n element.addEventListener('mouseup', (event: MouseEvent) => {\r\n if (event.button === 0) {\r\n if (!event.ctrlKey && !event.metaKey && !event.shiftKey) {\r\n this.calendar.clearSelection();\r\n }\r\n this.calendar.toggleSelect(this);\r\n }\r\n }, false);\r\n \r\n element.addEventListener('mouseover', (event: MouseEvent) => {\r\n this.showItemHint(event);\r\n this.highlightElements();\r\n event.stopPropagation();\r\n }, false);\r\n\r\n element.addEventListener('mouseout', (event: MouseEvent) => {\r\n this.lowlightElements();\r\n event.stopPropagation();\r\n }, false);\r\n\r\n element.addEventListener('dblclick', (event: MouseEvent) => {\r\n if (!viggo.isMobileDevice && this.links.dblclick) {\r\n viggo.modal.showAjax(this.links.dblclick);\r\n }\r\n }, false);\r\n\r\n element.addEventListener('click', (event: MouseEvent) => {\r\n if (viggo.isMobileDevice && this.links.dblclick && !(viggo.contextmenu && viggo.contextmenu.isVisible())) {\r\n viggo.modal.showAjax(this.links.dblclick);\r\n }\r\n }, false);\r\n parent.appendChild(element);\r\n this.elements.push(element);\r\n\r\n return element;\r\n }\r\n public checkDoubleBooking(item: CalendarItem) {\r\n let counter = 0;\r\n let overlaps = this.overlaps(item);\r\n if (overlaps && this.premises && this.premises == item.premises) {\r\n if (overlaps === true) {\r\n this.overlapMode = item.overlapMode = true;\r\n } else {\r\n if (!this.overlapMode)\r\n this.overlapMode = overlaps;\r\n if (!item.overlapMode) {\r\n item.overlapMode = overlaps;\r\n }\r\n }\r\n if (this.alsoBookedBy.indexOf(item) == -1) {\r\n this.alsoBookedBy.push(item);\r\n item.alsoBookedBy.push(this);\r\n counter++;\r\n }\r\n }\r\n return counter;\r\n }\r\n public overlaps(item: CalendarItem): boolean | number {\r\n let t1 = this.typeStringLowerCase,\r\n t2 = item.typeStringLowerCase;\r\n let result = this.length > 0 && item.length > 0 && // this buggy software should not allow arrangements with a length of zero\r\n (t1 == t2 || !t1 || !t2 || (viggo.informationTypes[t1] == 1 && viggo.informationTypes[t2] == 1)) &&\r\n this.isBetween(item.start, item.end);\r\n return result;\r\n }\r\n public isBetween(start: Date, end: Date) {\r\n let x1 = this.start.getTime(),\r\n x2 = x1 + this.length,\r\n y1 = start.getTime(),\r\n y2 = end.getTime()\r\n\r\n let result =\r\n ((x1 >= y1 && x1 < y2) ||\r\n (x1 >= y1 && x2 <= y2) ||\r\n (x1 <= y1 && x2 >= y2) ||\r\n (x2 > y1 && x2 <= y2));\r\n return result;\r\n }\r\n public overlapsOnDay(date: Date) {\r\n let end = new Date(date);\r\n end.setDate(end.getDate() + 1);\r\n return !!this.overlaps(<any>{\r\n start: date,\r\n length: 24 * 60 * 60 * 1000,\r\n type: this.type,\r\n typeString: this.typeString,\r\n typeStringLowerCase: this.typeStringLowerCase,\r\n end: end\r\n });\r\n }\r\n // only used for new positioning\r\n public overlapsDay(item: CalendarItem) {\r\n var h = (d: Date) => {\r\n d.setHours(0, 0, 0, 0);\r\n return d;\r\n };\r\n var x1 = new Date(this.start),\r\n x2 = new Date(x1.getTime() + this.length),\r\n y1 = new Date(item.start),\r\n y2 = new Date(y1.getTime() + item.length);\r\n\r\n x1 = h(x1);\r\n x2 = h(x2);\r\n y1 = h(y1);\r\n y2 = h(y2);\r\n\r\n var result =\r\n (x1 >= y1 && x1 < y2) ||\r\n (x1 >= y1 && x2 <= y2) ||\r\n (x1 <= y1 && x2 >= y2) ||\r\n (x2 > y1 && x2 <= y2);\r\n return result;\r\n }\r\n public compare(item: CalendarItem) {\r\n let dif = this.compareStart(item);\r\n if (dif == 0) {\r\n dif = this.compareBackgroundColor(item);\r\n }\r\n if (dif == 0) {\r\n dif = this.compareLength(item);\r\n }\r\n if (dif == 0) {\r\n dif = this.compareCreateingNew(item);\r\n }\r\n if (dif == 0) {\r\n dif = this.compareTitle(item);\r\n }\r\n if (dif == 0) {\r\n dif = this.compareId(item);\r\n }\r\n return dif;\r\n }\r\n private compareStart(item: CalendarItem) {\r\n return this.start.getTime() - item.start.getTime();\r\n }\r\n private compareLength(item: CalendarItem) {\r\n return item.length - this.length;\r\n }\r\n private compareCreateingNew(item: CalendarItem) {\r\n return this.id === null ? 1 : (item.id === null ? -1 : 0);\r\n }\r\n private compareBackgroundColor(item: CalendarItem) {\r\n const b1 = this.style['background-color'] || '';\r\n const b2 = item.style['background-color'] || '';\r\n return b1 < b2 ? -1 : (b1 > b2 ? 1 : 0);\r\n }\r\n private compareTitle(item: CalendarItem) {\r\n const t1 = (this.title || '').toLowerCase();\r\n const t2 = (item.title || '').toLowerCase();\r\n return t1 < t2 ? -1 : (t1 > t2 ? 1 : 0);\r\n }\r\n private compareId(item: CalendarItem) {\r\n return this.id - item.id;\r\n }\r\n public formatTime(time: Date) {\r\n return time.format('HH:mm');\r\n }\r\n public createText() {\r\n return this.formatTime(this.start) + ' - ' + this.formatTime(new Date(this.start.getTime() + this.length));\r\n }\r\n }\r\n\r\n export type CalendarItemConstructor = typeof CalendarItem;\r\n\r\n export class WeekCalendarItem extends CalendarItem {\r\n public calendar!: WeekCalendar;\r\n public update(filter: FilterResult) {\r\n let calendar = this.calendar;\r\n let getOffset = (date: Date) => {\r\n let time = ((date.getHours() * 60 + date.getMinutes()) * 60 + date.getSeconds()) * 1000 + date.getMilliseconds();\r\n var y = time - AbstractCalendar.calendarStart.getTime();\r\n y /= 60 * 60 * 1000;\r\n y *= AbstractCalendar.hourHeight;\r\n return Math.round(y);\r\n }\r\n\r\n let setElementTime = (element: HTMLElement, from: Date, to: Date) => {\r\n var top = getOffset(from),\r\n height = (to.getTime() - from.getTime()) / 3600000 * AbstractCalendar.hourHeight;\r\n if (top < 0) {\r\n height += top;\r\n top = 0;\r\n }\r\n\r\n element.style.setProperty('--top', top + '');\r\n element.style.setProperty('--height', height + '');\r\n let width = 0;\r\n let left = 0;\r\n if (this.typeStringLowerCase in informationTypes) {\r\n width = 0.1 / this.itemCount;\r\n left = this.indent * width;\r\n } else if (calendar.overlapsNarrowItemOnDay(from)) {\r\n width = 0.8 / this.itemCount;\r\n left = this.indent * width + 0.1;\r\n } else {\r\n width = 0.85 / this.itemCount;\r\n left = this.indent * width;\r\n }\r\n element.style.width = 100 * width + '%';\r\n element.style.left = 100 * left + '%';\r\n }\r\n\r\n let createElement = (from: Date, to: Date, parent: HTMLTableCellElement) => {\r\n let element = null;\r\n if (from < to) {\r\n if (this.typeStringLowerCase in informationTypes) {\r\n switch (informationTypes[this.typeStringLowerCase]) {\r\n case 0: // top\r\n parent = calendar.getHeaderRow(this.typeStringLowerCase).cells[parent.cellIndex];\r\n break;\r\n case 2: // bottom\r\n parent = calendar.getFooterRow(this.typeStringLowerCase).cells[parent.cellIndex];\r\n break;\r\n }\r\n }\r\n\r\n let container = <HTMLDivElement | null>parent.firstElementChild;\r\n if (container) {\r\n element = this.createElement(container, filter);\r\n if (!(this.typeStringLowerCase in informationTypes) || informationTypes[this.typeStringLowerCase] == 1) {\r\n setElementTime(element, from, to);\r\n }\r\n }\r\n }\r\n return element;\r\n }\r\n\r\n var from = new Date(this.start),\r\n to = this.end,\r\n startColumn = calendar.getColumn(from),\r\n endColumn = calendar.getColumn(to);\r\n\r\n this.removeAllElements();\r\n\r\n if (!startColumn && !endColumn) {\r\n if (from < calendar.startDate && to > calendar.startDate) {\r\n var col;\r\n for (var i = 0; i < calendar.columns.length; i++) {\r\n col = calendar.columns[i];\r\n createElement(new Date(col.date.getTime() + AbstractCalendar.calendarStart.getTime()), new Date(col.date.getTime() + AbstractCalendar.calendarEnd.getTime()), col.cell);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n var first = null,\r\n last = null;\r\n if (startColumn && startColumn == endColumn) {\r\n first = last = createElement.call(this, from, to, startColumn.cell);\r\n } else {\r\n var start, end;\r\n if (!startColumn) {\r\n startColumn = calendar.columns[0];\r\n start = new Date(startColumn.date.getTime() + AbstractCalendar.calendarStart.getTime());\r\n end = new Date(startColumn.date.getTime() + AbstractCalendar.calendarEnd.getTime());\r\n if (startColumn.date.isDstSwitchDay()) {\r\n end.setHours(end.getHours() + (end.dst() ? -1 : 1));\r\n }\r\n if (startColumn == endColumn) {\r\n last = createElement.call(this, start, to, startColumn.cell);\r\n } else {\r\n last = createElement.call(this, start, end, startColumn.cell);\r\n }\r\n } else {\r\n start = new Date(startColumn.date.getTime() + AbstractCalendar.calendarStart.getTime());\r\n end = new Date(startColumn.date.getTime() + AbstractCalendar.calendarEnd.getTime());\r\n if (startColumn.date.isDstSwitchDay()) {\r\n end.setHours(end.getHours() + (end.dst() ? -1 : 1));\r\n }\r\n if (startColumn == endColumn) {\r\n first = last = createElement.call(this, start, to, startColumn.cell);\r\n } else {\r\n first = last = createElement.call(this, from, end, startColumn.cell);\r\n }\r\n }\r\n\r\n let startCell: HTMLTableDataCellElement | null = startColumn.cell;\r\n let endCell = endColumn ? endColumn.cell : null;\r\n\r\n startCell = <HTMLTableDataCellElement | null>startCell.nextElementSibling;\r\n\r\n while (startCell && startCell != endCell && (!endCell || startCell.cellIndex < endCell.cellIndex)) {\r\n end.setDate(end.getDate() + 1);\r\n start.setDate(start.getDate() + 1);\r\n last = createElement.call(this, start, end, startCell);\r\n startCell = <HTMLTableDataCellElement | null>startCell.nextElementSibling;\r\n }\r\n if (startCell) {\r\n start.setDate(start.getDate() + 1);\r\n last = createElement.call(this, start, to, startCell) || last;\r\n }\r\n }\r\n if (first)\r\n first.className += ' first';\r\n if (last)\r\n last.className += ' last';\r\n }\r\n }\r\n export class CustomHeaderCalendarItem extends CalendarItem {\r\n public calendar!: CustomHeaderCalendar;\r\n public update(filter: FilterResult) {\r\n let cal = this.calendar;\r\n let parentTop: number = 0;\r\n function getTop(ev: MouseEvent) {\r\n return ev.pageY - parentTop + viggo.getScrollTop(<HTMLElement>ev.target);\r\n }\r\n\r\n function getOffset(time: Date) {\r\n let y = ((time.getHours() * 60 + time.getMinutes()) * 60 + time.getSeconds()) * 1000 + time.getMilliseconds();\r\n y -= AbstractCalendar.calendarStart.getTime();\r\n y /= 60 * 60 * 1000;\r\n y *= AbstractCalendar.hourHeight;\r\n return Math.round(y);\r\n }\r\n\r\n function setElementTime(this: CustomHeaderCalendarItem, element: HTMLDivElement, from: Date, to: Date) {\r\n let top = getOffset(from),\r\n height = (to.getTime() - from.getTime()) / 3600000 * AbstractCalendar.hourHeight;\r\n if (top < 0) {\r\n height += top;\r\n top = 0;\r\n } else {\r\n element.classList.add('first');\r\n }\r\n if (height + top > 24 * AbstractCalendar.hourHeight) {\r\n height = 24 * AbstractCalendar.hourHeight - top;\r\n } else {\r\n element.classList.add('last');\r\n }\r\n\r\n element.style.top = top + 'px';\r\n element.style.height = height + 'px';\r\n let width: number;\r\n let left: number;\r\n if (this.typeStringLowerCase in informationTypes) {\r\n width = this.calendar.columnWidth * 0.1 / this.itemCount;\r\n left = this.indent * width;\r\n } else {\r\n width = (this.calendar.columnWidth * 0.85) / this.itemCount;\r\n left = this.indent * width;\r\n }\r\n element.style.width = width + 'px';\r\n element.style.left = left + 'px';\r\n }\r\n\r\n let getTime = function (y: number, dayIndex: number) {\r\n let t = Math.floor(((y / AbstractCalendar.hourHeight * 60 * 60 * 1000) + AbstractCalendar.calendarStart.getTime()) / CustomHeaderCalendar.timeDetail) * CustomHeaderCalendar.timeDetail;\r\n let time = new Date(cal.startDate);\r\n time.setDate(time.getDate() + dayIndex);\r\n time.setMilliseconds(t);\r\n return time;\r\n }\r\n\r\n let mousedown = function (this: HTMLDivElement, event: MouseEvent) {\r\n let parentRow = <HTMLTableRowElement>viggo.dom.parent(this, 'tr');\r\n let parentBody = <HTMLTableSectionElement>parentRow.parentNode;\r\n parentTop = viggo.dom.getPos(parentBody).top;\r\n let mousedownTime = getTime(getTop(event), parentRow.rowIndex - 1);\r\n let item = <CustomHeaderCalendarItem>this.viggoItem;\r\n\r\n let dif: number;\r\n let move: (ev: MouseEvent) => void;\r\n let moved: boolean;\r\n let mouseup: (ev: MouseEvent) => void;\r\n if (this.style.cursor == 's-resize') {\r\n dif = item.start.getTime() + item.length - mousedownTime.getTime();\r\n parentBody.addEventListener('mousemove', move = (ev: MouseEvent) => {\r\n ev.stopPropagation();\r\n var time = getTime(getTop(ev), parentRow.rowIndex - 1);\r\n var add = mousedownTime.getTime() - time.getTime();\r\n item.setLength(mousedownTime.getTime() - item.start.getTime() + dif - add);\r\n item.update(FilterResult.show);\r\n moved = moved || ev.clientX != event.clientX || ev.clientY != event.clientY;\r\n }, true);\r\n } else {\r\n dif = item.start.getTime() - mousedownTime.getTime();\r\n parentBody.addEventListener('mousemove', move = (ev: MouseEvent) => {\r\n ev.stopPropagation();\r\n var time = getTime(getTop(ev), parentRow.rowIndex - 1);\r\n var add = mousedownTime.getTime() - time.getTime();\r\n time = mousedownTime;\r\n time.setTime(time.getTime() + dif - add);\r\n item.setStart(time);\r\n item.update(FilterResult.show);\r\n moved = moved || ev.clientX != event.clientX || ev.clientY != event.clientY;\r\n }, true);\r\n }\r\n /*\r\n let scrollToCursor = function (ev: MouseEvent) {\r\n let y = window.pageYOffset + ev.clientY + viggo.getScrollTop(cal.tbody.parentNode);\r\n if (y < parentTop) {\r\n cal.tbody.scrollTop -= 10;\r\n } else if (y > parentTop + cal.tbody.offsetHeight) {\r\n cal.tbody.scrollTop += 10;\r\n }\r\n window.getSelection().removeAllRanges();\r\n };\r\n document.addEventListener('mousemove', scrollToCursor, true);\r\n */\r\n document.addEventListener('mouseup', mouseup = () => {\r\n parentBody.removeEventListener('mousemove', move, true);\r\n document.removeEventListener('mouseup', mouseup, true);\r\n // document.removeEventListener('mousemove', scrollToCursor, true);\r\n if (moved) {\r\n cal.sortItems();\r\n cal.repaint();\r\n item.save();\r\n } else if (!item.id) {\r\n item.remove();\r\n }\r\n }, true);\r\n };\r\n let mousemove = function (this: HTMLDivElement, event: MouseEvent) {\r\n if (event.pageY - viggo.dom.getPos(this, true).top - this.offsetHeight >= -10) {\r\n this.style.cursor = 's-resize';\r\n } else {\r\n this.style.cursor = '';\r\n }\r\n };\r\n this.removeAllElements();\r\n if (this.columnIds) {\r\n let calendarStart = this.calendar.startDate;\r\n let calendarEnd = this.calendar.endDate;\r\n let firstDay = calendarStart.getDay();\r\n for (var i = 0; i < this.columnIds.length; i++) {\r\n let id = this.columnIds[i];\r\n let map = this.calendar.columns.get(id);\r\n if (map) {\r\n let date = new Date(this.start);\r\n do {\r\n let mapIndex = (date.getDay() - firstDay + 14) % 7;\r\n let parent = map.get(mapIndex);\r\n if (parent && date >= calendarStart && date < calendarEnd) {\r\n let element = this.createElement(parent, filter);\r\n setElementTime.call(this, element, date, this.end);\r\n if (!this.readonly) {\r\n element.addEventListener('mousedown', mousedown, false);\r\n element.addEventListener('mousemove', mousemove, false);\r\n }\r\n }\r\n date.setHours(0, 0, 0, 0);\r\n date.setDate(date.getDate() + 1);\r\n } while (date < this.end);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n export class CustomRowDayCalendarItem extends CalendarItem {\r\n public calendar!: CustomRowDayCalendar<CustomRowDayCalendarItem, CustomRowSection>;\r\n public update(filter: FilterResult) {\r\n this.removeAllElements();\r\n if (this.isInView()) {\r\n let dayWidth = this.calendar.getDayWidth();\r\n\r\n let parent = this.calendar.getItemPosition(this.group, this.start);\r\n if (parent) {\r\n let calStart = new Date(this.calendar.startDate);\r\n let calEnd = new Date(this.calendar.endDate);\r\n let start = new Date(this.start);\r\n let end = new Date(this.end);\r\n\r\n if (calStart > start) {\r\n start = new Date(calStart);\r\n }\r\n if (calEnd < end) {\r\n end = new Date(calEnd);\r\n }\r\n\r\n let element = this.createElement(parent, filter);\r\n\r\n let left = start.getHours() * 60 * 60 * 1000 + start.getMinutes() * 60 * 1000;\r\n left = left / (24 * 60 * 60 * 1000);\r\n left *= dayWidth;\r\n element.style.left = left + 'px';\r\n\r\n let width = end.getTime() - start.getTime();\r\n width = width / (24 * 60 * 60 * 1000);\r\n width *= dayWidth;\r\n element.style.width = width + 'px';\r\n if (this.indent >= 0) {\r\n element.style.setProperty('--indent', this.indent.toString());\r\n }\r\n }\r\n }\r\n }\r\n // disable highlighting\r\n public highlightElements() {}\r\n }\r\n export class CustomRowDetailCalendarItem extends CalendarItem {\r\n public calendar!: CustomRowDetailCalendar;\r\n public overlaps(item: CustomRowDetailCalendarItem): boolean | number {\r\n let x = this.calendar.getItemPosition(this.group, this.start, this.end);\r\n let y = this.calendar.getItemPosition(item.group, item.start, item.end);\r\n if (x && y) {\r\n let x1 = x.start,\r\n x2 = x.end,\r\n y1 = y.start,\r\n y2 = y.end;\r\n let result = super.overlaps(item);\r\n if (!result) {\r\n result = (x1 % 2 == 0 && (x1 == y1 || x1 == y2)) || (x2 % 2 == 0 && (x2 == y1 || x2 == y2)) ? 1 : false;\r\n }\r\n return result;\r\n }\r\n return super.overlaps(item);\r\n }\r\n public update(filter: FilterResult) {\r\n this.removeAllElements();\r\n if (this.isInView()) {\r\n let itemStart = new Date(this.start);\r\n let itemEnd = new Date(this.end);\r\n itemEnd.setTime(Math.min(itemEnd.getTime(), this.calendar.startDate.getTime() + this.calendar.days * 24 * 60 * 60 * 1000));\r\n let pos = this.calendar.getItemPosition(this.group, itemStart, itemEnd);\r\n if (pos && pos.parent) {\r\n const dayWidth = this.calendar.getDayWidth();\r\n const startHour = this.calendar.startHour;\r\n const endHour = this.calendar.endHour;\r\n const dayHours = endHour - startHour;\r\n let calendarStart = new Date(Math.max(this.calendar.startDate.getTime(), itemStart.getTime()));\r\n calendarStart.setHours(startHour, 0, 0, 0);\r\n\r\n const element = this.createElement(pos.parent, filter);\r\n const spacerWidth = 21;\r\n let spaceMultiplier = 0;\r\n if (pos.start % 2 == 0) { // we're starting in a seperating area\r\n if (itemStart < calendarStart) {\r\n itemStart = new Date(calendarStart);\r\n } else if (itemStart.getHours() > endHour || (itemStart.getHours() == endHour && itemStart.getMinutes())) {\r\n itemStart.setDate(itemStart.getDate() + 1);\r\n calendarStart.setDate(itemStart.getDate());\r\n }\r\n itemStart.setHours(startHour, 0, 0, 0);\r\n spaceMultiplier++;\r\n }\r\n if (pos.end % 2 == 0) { // we're ending in a seperating area\r\n if (itemEnd.getHours() < startHour) {\r\n itemEnd.setDate(itemEnd.getDate() - 1);\r\n }\r\n itemEnd.setHours(endHour, 0, 0, 0);\r\n spaceMultiplier++;\r\n }\r\n\r\n let left = (itemStart.getTime() - calendarStart.getTime()) / (1000 * 60 * 60 * dayHours) * dayWidth;\r\n let width = spacerWidth;\r\n\r\n if (pos.start % 2 || pos.start != pos.end) {\r\n let hiddenHours = 0;\r\n if (pos.start % 2 == 0) {\r\n if (pos.start == pos.end - 1) {\r\n calendarStart.setHours(startHour, 0, 0, 0);\r\n } else {\r\n calendarStart.setHours(0, 0, 0, 0);\r\n }\r\n }\r\n if (pos.end - pos.start > 1) {\r\n while (pos.start < pos.end - 1) {\r\n if (pos.start % 2) {\r\n hiddenHours += 24 - endHour;\r\n spaceMultiplier++;\r\n } else {\r\n hiddenHours += startHour;\r\n }\r\n pos.start++;\r\n }\r\n if (pos.end % 2) {\r\n hiddenHours += startHour;\r\n }\r\n }\r\n width = (itemEnd.getTime() - calendarStart.getTime() - hiddenHours * 1000*60*60) / (1000 * 60 * 60 * dayHours) * dayWidth + spaceMultiplier * spacerWidth - left;\r\n }\r\n if (left < 0 || width < 0) {\r\n console.log(this.id, left + 'px', width + 'px');\r\n }\r\n element.style.left = left + 'px';\r\n element.style.width = width + 'px';\r\n let count = this.alsoBookedBy.length + 1;\r\n element.style.height = 100 / count + '%';\r\n if (this.indent >= 0) {\r\n element.style.top = 100 * this.indent / count + '%';\r\n }\r\n }\r\n }\r\n }\r\n }\r\n export class MultiweekCalendarItem extends CalendarItem {\r\n public calendar!: MultiweekCalendar;\r\n public update(filter: FilterResult) {\r\n this.removeAllElements();\r\n let end = new Date(this.calendar.startDate.getTime() + this.calendar.rows.length * 7 * 24 * 60 * 60 * 1000);\r\n let dst = this.calendar.startDate.dst();\r\n let add = 0;\r\n if (end.dst() != dst) {\r\n add = dst ? 1 : -1;\r\n end.setHours(end.getHours() + add);\r\n }\r\n // check if the item ends before the calendar begins, or starts after the calender ends\r\n if (this.start.getTime() + this.length <= this.calendar.startDate.getTime() ||\r\n this.start.getTime() >= end.getTime()) {\r\n return;\r\n }\r\n\r\n let createRow = () => {\r\n let tr = viggo.dom.tag('tr');\r\n let i = 7;\r\n while (i--)\r\n tr.appendChild(viggo.dom.tag('td'));\r\n return tr;\r\n };\r\n let getCell = (index: number) => {\r\n let rowIndex = Math.floor(index / 7);\r\n let cellIndex = index % 7;\r\n let table = this.calendar.rows[rowIndex];\r\n let foundCell = null;\r\n for (let y = 0; y < table.rows.length && !foundCell; y++) {\r\n let row = table.rows[y];\r\n let realIndex = 0;\r\n for (let x = 0; x < row.cells.length && !foundCell; x++) {\r\n if (realIndex == cellIndex && !row.cells[x].firstChild) {\r\n foundCell = row.cells[x];\r\n } else {\r\n realIndex += row.cells[x].colSpan;\r\n }\r\n }\r\n }\r\n if (!foundCell && table.firstChild) {\r\n let row = table.firstChild.appendChild(createRow());\r\n foundCell = row.cells[cellIndex];\r\n }\r\n return foundCell;\r\n };\r\n\r\n var startCell = this.calendar.getCellIndex(this.start),\r\n endCell = this.calendar.getCellIndex(new Date(this.start.getTime() + this.length - 1)); // subtract one, to stay inside one day if end is at 00:00\r\n\r\n var noStart = startCell == -1,\r\n noEnd = endCell == -1;\r\n if (noStart) {\r\n startCell = 0;\r\n }\r\n if (noEnd) {\r\n endCell = this.calendar.rows.length * 7 - 1;\r\n }\r\n\r\n let first = null, last = null;\r\n\r\n while (startCell <= endCell) {\r\n var cell = getCell(startCell);\r\n var colSpan;\r\n if (Math.floor(endCell / 7) > Math.floor(startCell / 7)) {\r\n colSpan = 7 - (startCell % 7);\r\n } else {\r\n colSpan = endCell + 1 - startCell;\r\n }\r\n\r\n if (cell) {\r\n cell.colSpan = colSpan;\r\n while (--colSpan && cell.nextSibling && cell.parentNode) {\r\n cell.parentNode.removeChild(cell.nextSibling);\r\n }\r\n\r\n startCell = startCell + cell.colSpan;\r\n\r\n last = this.createElement(cell, filter);\r\n if (!first)\r\n first = last;\r\n if (!this.readonly) {\r\n last.draggable = true;\r\n last.addEventListener('dragstart', this.calendar.dragstart, false);\r\n last.addEventListener('dragend', this.calendar.dragend, false);\r\n }\r\n }\r\n }\r\n if (!noStart && first) {\r\n first.className += ' first';\r\n }\r\n if (!noEnd && last) {\r\n last.className += ' last';\r\n }\r\n }\r\n }\r\n export class MultimonthCalendarItem extends CalendarItem {\r\n public calendar!: MultimonthCalendar;\r\n public update(filter: FilterResult) {\r\n this.removeAllElements();\r\n\r\n let start = new Date(this.start);\r\n start.setHours(0, 0, 0, 0);\r\n let end = new Date(this.end);\r\n if (end.format('HH:mm') == '00:00') {\r\n end.setDate(end.getDate() - 1);\r\n }\r\n end.setHours(12, 0, 0, 0);\r\n\r\n let cell: HTMLTableCellElement | null;\r\n let first: HTMLElement | null = null;\r\n let last: HTMLElement | null = null;\r\n do {\r\n cell = this.calendar.getCell(start);\r\n while (!cell && start <= end) {\r\n start.setDate(start.getDate() + 1);\r\n cell = this.calendar.getCell(start);\r\n }\r\n if (cell && cell.firstChild) {\r\n let element = this.createElement(<Element>cell.firstChild, filter);\r\n if (!first) {\r\n first = element;\r\n }\r\n last = element;\r\n if (!this.readonly) {\r\n element.draggable = true;\r\n element.addEventListener('dragstart', this.calendar.dragstart, false);\r\n element.addEventListener('dragend', this.calendar.dragend, false);\r\n }\r\n start.setDate(start.getDate() + 1);\r\n }\r\n } while (start <= end && cell);\r\n if (first) {\r\n first.classList.add('first');\r\n }\r\n if (last) {\r\n last.classList.add('last');\r\n }\r\n }\r\n }\r\n}","module viggo {\r\n export class editportal {\r\n private dragging: HTMLElement|null = null;\r\n private deltaX: number = 0;\r\n private deltaY: number = 0;\r\n private positionElement: HTMLElement|null = null;\r\n private mouseUpListener?: any;\r\n private mouseDownListener?: any;\r\n private mouseMoveListener?: any;\r\n private clickListener?: any;\r\n private main!: HTMLElement;\r\n private movedId?: string;\r\n private static keyDownListener: any;\r\n\r\n private static instance: editportal | null = null;\r\n public static get isOn() {\r\n return !!this.instance;\r\n }\r\n private constructor() {\r\n this.reset();\r\n }\r\n private static getInstance() {\r\n return this.instance ? this.instance : this.instance = new editportal();\r\n }\r\n private reset() {\r\n let main = document.querySelector('main');\r\n if (!main) {\r\n throw new Error('Missing main');\r\n }\r\n this.main = main;\r\n this.main.addEventListener('mousedown', this.mouseDownListener = this.mousedown.bind(this), false);\r\n this.main.addEventListener('click', this.clickListener = (event: MouseEvent) => {\r\n if ((<HTMLElement>event.target).closest('section')) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n }, false);\r\n viggo.dom.removeNonTags(this.main);\r\n }\r\n private move(event: MouseEvent) {\r\n if (event.clientY < 50) {\r\n // scroll up\r\n } else if (event.clientY > document.documentElement!.offsetHeight - 50) {\r\n // scroll down\r\n }\r\n let x = event.pageX,\r\n y = event.pageY;\r\n if (this.dragging) {\r\n this.dragging.style.left = x - this.deltaX + 'px';\r\n this.dragging.style.top = y - this.deltaY + 'px';\r\n }\r\n let element = <Element | HTMLElement | null>document.elementFromPoint(x, y);\r\n let section: Element | null = null;\r\n let parent: Element | null = null;\r\n if (element) {\r\n section = element.closest('section');\r\n if (section) {\r\n parent = section.parentElement;\r\n } else {\r\n parent = element.closest('main>div[class*=\"column-\"]');\r\n }\r\n }\r\n\r\n if (parent && this.positionElement && section != this.positionElement) {\r\n if (section) {\r\n if (section.previousElementSibling == this.positionElement) {\r\n section = this.positionElement.nextElementSibling;\r\n if (section) {\r\n section = section.nextElementSibling;\r\n }\r\n }\r\n }\r\n parent.insertBefore(this.positionElement, section);\r\n }\r\n }\r\n private mouseup(event: MouseEvent) {\r\n if (this.positionElement && this.dragging) {\r\n this.dragging.remove();\r\n this.positionElement.style.opacity = '';\r\n let columns = [\r\n Array.from(document.querySelectorAll('main>.column-1>section')).map(section => section.id),\r\n Array.from(document.querySelectorAll('main>.column-2>section')).map(section => section.id)\r\n ];\r\n if (this.movedId && columns[0].indexOf(this.movedId) == -1 && columns[1].indexOf(this.movedId) == -1) {\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Shared/Portal/SaveRemove',\r\n data: {\r\n MovedItem: this.movedId\r\n }\r\n });\r\n } else {\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Shared/Portal/SavePortal',\r\n json: true,\r\n data: columns\r\n });\r\n }\r\n }\r\n this.dragging = null;\r\n this.removeEventListeners();\r\n this.reset();\r\n }\r\n private scroll() {\r\n setTimeout(() => {\r\n if (this.positionElement) {\r\n let next = this.positionElement.nextSibling;\r\n let parent = this.positionElement.parentNode;\r\n if (parent) {\r\n parent.removeChild(this.positionElement);\r\n parent.insertBefore(this.positionElement, next);\r\n }\r\n }\r\n }, 200);\r\n }\r\n private mousedown(event: MouseEvent) {\r\n let target = viggo.dom.parent(<Element>event.target, 'section');\r\n if (target) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n let pos = target.getBoundingClientRect();\r\n this.deltaX = event.pageX - pos.left;\r\n this.deltaY = event.pageY - pos.top;\r\n this.positionElement = target;\r\n\r\n let next = target.nextSibling, parent = target.parentNode;\r\n if (parent) {\r\n this.dragging = <HTMLElement>target.cloneNode(true);\r\n parent.insertBefore(this.dragging, this.positionElement);\r\n this.positionElement.style.opacity = '0.5';\r\n this.dragging.style.pointerEvents = 'none';\r\n this.dragging.style.width = viggo.getStyle(this.dragging, 'width');\r\n this.dragging.style.position = 'fixed';\r\n this.dragging.style.zIndex = '20';\r\n this.dragging.style.opacity = '0.5';\r\n this.removeEventListeners();\r\n this.main.addEventListener('mousemove', this.mouseMoveListener = this.move.bind(this), false);\r\n document.addEventListener('mouseup', this.mouseUpListener = this.mouseup.bind(this), false);\r\n this.movedId = target.id;\r\n this.move(event);\r\n }\r\n }\r\n }\r\n private removeEventListeners() {\r\n this.movedId = undefined;\r\n if (this.mouseMoveListener) {\r\n this.main.removeEventListener('mousemove', this.mouseMoveListener, false);\r\n this.mouseMoveListener = null;\r\n }\r\n if (this.mouseUpListener) {\r\n document.removeEventListener('mouseup', this.mouseUpListener, false);\r\n this.mouseUpListener = null\r\n }\r\n if (this.mouseDownListener) {\r\n this.main.removeEventListener('mousedown', this.mouseDownListener, false);\r\n this.mouseDownListener = null;\r\n }\r\n if (this.clickListener) {\r\n this.main.removeEventListener('click', this.clickListener, false);\r\n this.clickListener = null;\r\n }\r\n }\r\n private turnOn() {\r\n var span = {\r\n className: 'remove btn',\r\n onmousedown: (event: MouseEvent) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n },\r\n onclick: (event: MouseEvent) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n let box = viggo.dom.parent(<Element>event.target, 'section');\r\n if (box) {\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Shared/Portal/SaveRemove',\r\n data: {\r\n MovedItem: box.id\r\n }\r\n });\r\n let boxPos = box.getBoundingClientRect();\r\n let column = document.querySelector('main>.column-deleted');\r\n if (column) {\r\n let delPos = column.getBoundingClientRect();\r\n var x = delPos.left - boxPos.left;\r\n var y = delPos.top - boxPos.top;\r\n new viggo.effect({\r\n from: 'translate(0px, 0px) scale(1)',\r\n to: 'translate(' + x + 'px, ' + y + 'px) scale(0.2)',\r\n type: 'easeinout',\r\n removeStyle: true,\r\n duration: 300,\r\n element: box,\r\n style: 'transform',\r\n complete: () => {\r\n if (column && box) {\r\n column.insertBefore(box, column.firstChild);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n document.querySelectorAll('main>[class^=\"column-\"]>section>.head').forEach(head => head.appendChild(viggo.dom.tag('span', span, viggo.dom.tag('i', {className: 'flaticon-cross'}))));\r\n\r\n let main = document.querySelector('main');\r\n if (main) {\r\n main.classList.add('edit-portal');\r\n new viggo.ajax({\r\n method: 'get',\r\n url: '/Shared/Portal/GetDeleted',\r\n convert: 'html',\r\n complete: (html: DocumentFragment) => {\r\n if (main) {\r\n html.querySelectorAll('section>.head').forEach(head => head.appendChild(viggo.dom.tag('span', span, viggo.dom.tag('i', { className: 'flaticon-cross' }))));\r\n main.appendChild(html);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n private turnOff() {\r\n this.removeEventListeners();\r\n editportal.instance = null;\r\n }\r\n public static turnOff() {\r\n document.querySelectorAll('main > [class^=\"column-\"] > section > .head > .remove, main > .column-deleted').forEach(x => x.remove());\r\n let main = document.querySelector('main');\r\n if (main) {\r\n main.classList.remove('edit-portal');\r\n }\r\n this.getInstance().turnOff();\r\n document.removeEventListener('keydown', this.keyDownListener, false);\r\n }\r\n public static turnOn() {\r\n if (viggo.isMobileDevice)\r\n return;\r\n if (!viggo.ajax.isIdle()) {\r\n var f = function () {\r\n viggo.ajax.removeEventListener('idle', f);\r\n viggo.editportal.turnOn();\r\n };\r\n viggo.ajax.addEventListener('idle', f);\r\n return;\r\n } else if (document.querySelector('#main>.column>.loading-spinner')) {\r\n return alert('Vent med at redigere forsiden til alle sider elementer er hentet.');\r\n }\r\n if (this.isOn) {\r\n this.turnOff();\r\n if (confirm('Forsiden kunne ikke redigeres. Vil du prøve igen?')) {\r\n this.turnOn();\r\n }\r\n return;\r\n }\r\n\r\n this.getInstance().turnOn();\r\n document.addEventListener('keydown', this.keyDownListener = (event: KeyboardEvent) => {\r\n if (event.key == 'Escape') {\r\n this.turnOff();\r\n }\r\n }, false);\r\n }\r\n public static toggle() {\r\n if (this.isOn) {\r\n this.turnOff();\r\n } else {\r\n this.turnOn();\r\n }\r\n }\r\n }\r\n}","module viggo {\r\n let list: { [index: string]: notification } = {};\r\n\r\n export class notification {\r\n private id: string;\r\n private click: (event: MouseEvent) => void;\r\n private element: HTMLElement;\r\n constructor(url: string, id: string, element: HTMLElement) {\r\n this.id = id;\r\n this.element = element;\r\n this.click = (event: MouseEvent) => {\r\n if (!this.element.contains(<Node>event.target) && !viggo.modal.getLatestModal()) {\r\n this.hide();\r\n }\r\n };\r\n document.addEventListener('click', this.click, true);\r\n new viggo.ajax({\r\n method: 'get',\r\n url: url,\r\n convert: 'html',\r\n complete: (html) => {\r\n viggo.dom.empty(this.element);\r\n this.element.style.display = '';\r\n this.element.appendChild(html);\r\n }\r\n });\r\n }\r\n hide() {\r\n viggo.dom.empty(this.element);\r\n this.element.style.display = 'none';\r\n document.removeEventListener('click', this.click, true);\r\n delete list[this.id];\r\n }\r\n }\r\n\r\n export class notifications {\r\n public static show(url: string, id: string, event: Event) {\r\n if (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n let elm = document.getElementById(id);\r\n if (elm) {\r\n list[id] = new notification(url, id, elm);\r\n }\r\n }\r\n public static hide(id: string) {\r\n let n = list[id];\r\n if (n) {\r\n n.hide();\r\n }\r\n }\r\n }\r\n}","module viggo {\r\n interface NavigationTemplates<T> {\r\n Navigation: T;\r\n Item: T;\r\n List: T;\r\n [index: string]: T;\r\n }\r\n\r\n interface TemplateItem {\r\n current: any;\r\n list: any[];\r\n index: number;\r\n }\r\n\r\n interface NavigationOptions<T> {\r\n items: T[];\r\n parent: HTMLElement;\r\n index?: number;\r\n templates: NavigationTemplates<string>;\r\n }\r\n\r\n type TemplateFunction = (item: TemplateItem) => string;\r\n\r\n abstract class AbstractNavigation<T> {\r\n protected items: T[];\r\n protected parent: HTMLElement;\r\n protected templates: NavigationTemplates<TemplateFunction>;\r\n protected index: number;\r\n protected listVisible = false;\r\n constructor(options: NavigationOptions<T>) {\r\n this.items = options.items;\r\n this.parent = options.parent;\r\n this.index = options.index || 0;\r\n this.templates = <NavigationTemplates<TemplateFunction>>{};\r\n for (let name in options.templates) {\r\n this.templates[name] = <TemplateFunction>viggo.func.createTemplate(options.templates[name]);\r\n }\r\n this.initialize();\r\n this.repaint();\r\n }\r\n protected abstract initialize(): void;\r\n public next() {\r\n this.index++;\r\n if (this.index >= this.items.length) {\r\n this.index = 0;\r\n }\r\n this.repaint();\r\n }\r\n public previous() {\r\n this.index--;\r\n if (this.index < 0) {\r\n this.index = this.items.length - 1;\r\n }\r\n this.repaint();\r\n }\r\n public selectItem(item: T, event: Event) {\r\n event.preventDefault();\r\n let index = this.items.indexOf(item);\r\n if (index != -1) {\r\n this.index = index;\r\n this.repaint();\r\n }\r\n }\r\n public showList() {\r\n let template = viggo.func.createView<TemplateItem>({\r\n current: this.items[this.index],\r\n list: this.items,\r\n index: this.index\r\n }, this.templates.List);\r\n let list = template.querySelector('.list');\r\n let selected: HTMLElement | null = null;\r\n if (list) {\r\n let info: TemplateItem = {\r\n current: this.items[this.index],\r\n index: this.index,\r\n list: this.items\r\n };\r\n for (let item of this.items) {\r\n let elm = viggo.func.createView<any>({\r\n item: item,\r\n list: info\r\n }, this.templates.Item).firstElementChild;\r\n if (elm) {\r\n elm.addEventListener('click', event => this.selectItem(item, event), false);\r\n if (item == this.items[this.index]) {\r\n selected = <HTMLElement>elm;\r\n elm.classList.add('selected');\r\n }\r\n list.appendChild(elm);\r\n }\r\n }\r\n }\r\n this.parent.appendChild(template);\r\n if (list && selected) {\r\n list.scrollTop = selected.offsetTop;\r\n }\r\n if (!this.listVisible) {\r\n let click = (event: MouseEvent) => {\r\n document.removeEventListener('click', click, false);\r\n this.listVisible = false;\r\n this.repaint();\r\n };\r\n setTimeout(function () {\r\n document.addEventListener('click', click, false);\r\n }, 10);\r\n this.listVisible = true;\r\n }\r\n }\r\n protected repaint() {\r\n viggo.dom.empty(this.parent);\r\n let template = viggo.func.createView<TemplateItem>({\r\n current: this.items[this.index],\r\n list: this.items,\r\n index: this.index\r\n }, this.templates.Navigation);\r\n let elm = <HTMLElement|null>template.querySelector('.previous');\r\n if (elm && !elm.classList.contains('disabled')) {\r\n elm.addEventListener('click', (event: MouseEvent) => {\r\n //event.preventDefault();\r\n //event.stopPropagation();\r\n this.previous();\r\n }, false);\r\n }\r\n elm = <HTMLElement|null>template.querySelector('.next');\r\n if (elm && !elm.classList.contains('disabled')) {\r\n elm.addEventListener('click', (event: MouseEvent) => {\r\n //event.preventDefault();\r\n //event.stopPropagation();\r\n this.next();\r\n });\r\n }\r\n elm = <HTMLElement | null>template.querySelector('.current');\r\n if (elm) {\r\n elm.addEventListener('click', (event: MouseEvent) => {\r\n //event.preventDefault();\r\n //event.stopPropagation();\r\n if (!this.listVisible) {\r\n this.showList();\r\n }\r\n });\r\n }\r\n this.parent.appendChild(template);\r\n if (this.listVisible) {\r\n this.showList();\r\n }\r\n }\r\n }\r\n\r\n export class ListNavigation extends AbstractNavigation<any> {\r\n protected initialize() {\r\n\r\n }\r\n }\r\n}","module viggo {\r\n let picker: HTMLElement | null = null;\r\n let result: HTMLElement | null = null;\r\n let input: HTMLInputElement | null = null;\r\n let click = function (event: MouseEvent) {\r\n let target = <HTMLElement>event.target;\r\n if (result && input) {\r\n let ev = new Event('change', { bubbles: true });\r\n if (target.dataset.img) {\r\n result.style.backgroundImage = 'url(' + (<HTMLImageElement>target).src + ')';\r\n input.value = target.dataset.img;\r\n input.dispatchEvent(ev);\r\n } else if (typeof target.dataset.color == 'string') {\r\n result.style.backgroundColor = target.dataset.color;\r\n input.value = target.dataset.color;\r\n input.dispatchEvent(ev);\r\n }\r\n }\r\n };\r\n\r\n document.addEventListener('click', function (event) {\r\n if (event.button !== 0 || !event.target || !(<HTMLElement>event.target).dataset) {\r\n return;\r\n }\r\n if (picker) {\r\n viggo.dom.empty(picker);\r\n picker.style.display = 'none';\r\n picker = null;\r\n }\r\n let target = <HTMLElement>event.target,\r\n id = target.dataset.pickerGuid,\r\n type = target.dataset.pickerType;\r\n\r\n if (id && type) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n var hidden = 't-' + id;\r\n new viggo.ajax({\r\n method: 'get',\r\n url: '/Shared/Picker/' + type,\r\n convert: 'html',\r\n complete: function (html) {\r\n picker = document.getElementById(id!);\r\n if (picker) {\r\n viggo.dom.empty(picker);\r\n picker.appendChild(html);\r\n picker.style.display = '';\r\n picker.addEventListener('click', click, false);\r\n result = document.querySelector('[data-picker-guid=\"' + id + '\"]');\r\n input = <HTMLInputElement|null>document.getElementById(hidden);\r\n }\r\n }\r\n });\r\n }\r\n }, false);\r\n}","module viggo {\r\n function timeout(ms: number) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n async function beep(interval: number | number[]) {\r\n const audio = new AudioContext();\r\n const osc = audio.createOscillator();\r\n const gain = audio.createGain();\r\n gain.gain.setValueAtTime(1, audio.currentTime);\r\n osc.connect(gain);\r\n gain.connect(audio.destination);\r\n osc.frequency.setValueAtTime(450, audio.currentTime);\r\n osc.start();\r\n if (typeof interval == \"number\") {\r\n interval = [interval];\r\n }\r\n\r\n for (const [index, value] of interval.entries()) {\r\n if (index % 2 == 0) {\r\n gain.gain.setValueAtTime(1, audio.currentTime);\r\n }\r\n await timeout(value);\r\n if (index % 2 == 0) {\r\n gain.gain.setValueAtTime(0, audio.currentTime);\r\n }\r\n }\r\n osc.stop();\r\n }\r\n\r\n export function vibrate(interval: number | number[]) {\r\n if (viggo.isMobileDevice) {\r\n navigator.vibrate(interval);\r\n } else if (viggo.isDevelopment) {\r\n beep(interval);\r\n }\r\n }\r\n}\r\n","module viggo {\r\n interface PromptOptions {\r\n contents: Node|string;\r\n buttons?: boolean;\r\n }\r\n export class prompt {\r\n private element?: HTMLDivElement;\r\n private resolve?: (node: Node | null) => void;\r\n private escapeListener?: (this: Window, event: KeyboardEvent) => any;\r\n public constructor(options: PromptOptions) {\r\n this.element = <HTMLDivElement>viggo.func.createViewFromString(\r\n`<div class=\"prompt\">\r\n <div class=\"dialog\">\r\n <div class=\"close\"><i class=\"flaticon-cross\"></i></div>\r\n <div class=\"content\"></div>\r\n <div class=\"buttons\"><button type=\"button\" class=\"ok\">${__('OK')}</button><button type=\"button\" class=\"cancel\">${__('Cancel')}</button></div>\r\n </div>\r\n</div`\r\n ).firstElementChild;\r\n\r\n this.element.addEventListener('click', (ev) => {\r\n if (ev.target == this.element) {\r\n this.cancel();\r\n }\r\n }, false);\r\n\r\n if (options.buttons === false) {\r\n this.element.querySelectorAll('button').forEach(x => x.remove());\r\n } else {\r\n this.element.querySelector('button.ok')!.addEventListener('click', this.ok.bind(this), false);\r\n this.element.querySelector('button.cancel')!.addEventListener('click', this.cancel.bind(this), false);\r\n this.element.querySelector('.close')!.addEventListener('click', this.cancel.bind(this), false);\r\n }\r\n let content = this.element.querySelector('.content')!;\r\n if (typeof options.contents == 'string') {\r\n content.innerHTML = options.contents;\r\n } else {\r\n content.appendChild(options.contents);\r\n }\r\n }\r\n\r\n public show() {\r\n if (this.element) {\r\n document.body.appendChild(this.element);\r\n this.escapeListener = (ev: KeyboardEvent) => {\r\n if (ev.key == 'Escape') {\r\n ev.stopImmediatePropagation();\r\n this.cancel();\r\n }\r\n };\r\n window.addEventListener('keydown', this.escapeListener, true);\r\n return new Promise((resolve) => {\r\n this.resolve = resolve;\r\n });\r\n }\r\n }\r\n\r\n public ok() {\r\n if (this.resolve && this.element) {\r\n let content = this.element.querySelector('.content');\r\n if (content) {\r\n this.resolve(viggo.dom.empty(content));\r\n } else {\r\n this.resolve(null);\r\n }\r\n }\r\n this.remove();\r\n }\r\n public cancel() {\r\n if (this.resolve) {\r\n this.resolve(null);\r\n }\r\n this.remove();\r\n }\r\n public remove() {\r\n if (this.element) {\r\n this.element.remove();\r\n delete this.element;\r\n }\r\n window.removeEventListener('keydown', <any>this.escapeListener, true);\r\n }\r\n }\r\n}","module viggo {\r\n\r\n interface UploadOptions {\r\n data: DOMStringMap;\r\n files: FileList;\r\n filetypes: string[];\r\n maxFilesize: number;\r\n target: Element;\r\n url: string;\r\n completeElement: HTMLElement | null;\r\n }\r\n type FileId = number;\r\n interface FileElement {\r\n file: File;\r\n element: HTMLElement;\r\n }\r\n\r\n interface HTMLUploader {\r\n element: HTMLDivElement;\r\n files: HTMLUListElement;\r\n graph: HTMLElement;\r\n current: HTMLElement | null;\r\n }\r\n\r\n interface Template {\r\n html: string; // template to insert\r\n }\r\n\r\n type TemplateCallback = (data?: any) => string;\r\n\r\n interface UploadTemplates {\r\n [index: string]: TemplateCallback | undefined;\r\n }\r\n\r\n interface IUploadItem {\r\n contentType: string;\r\n name: string;\r\n size: number;\r\n loaded: number;\r\n total: number;\r\n id: number | string;\r\n lastModified: Date;\r\n color(alpha: number): string;\r\n run(): Promise<XMLHttpRequest>;\r\n addEventListener(event: string, listener: (data: any) => void): void;\r\n }\r\n\r\n class FakeUploadItem extends viggo.classes.eventListener implements IUploadItem {\r\n public contentType: string;\r\n public name: string;\r\n public size: number;\r\n public loaded: number;\r\n public total: number;\r\n public id: number | string;\r\n public lastModified: Date;\r\n public constructor(name: string, contentType: string, size: number) {\r\n super();\r\n this.name = name;\r\n this.contentType = contentType;\r\n this.size = size;\r\n this.total = size;\r\n this.loaded = 0;\r\n this.id = 0;\r\n this.lastModified = new Date();\r\n }\r\n public color(alpha: number = 1.0) {\r\n return `rgba(19,128,164,${alpha})`;\r\n }\r\n public run(): Promise<XMLHttpRequest> {\r\n return new Promise<XMLHttpRequest>((resolve, reject) => {\r\n this.dispatchEvent('run', this);\r\n let interval = setInterval(() => {\r\n this.loaded = Math.min(this.total, this.loaded + 1024 * 2);\r\n this.dispatchEvent('progress', this);\r\n if (this.loaded == this.total) {\r\n clearInterval(interval);\r\n resolve(new XMLHttpRequest());\r\n }\r\n }, 20);\r\n });\r\n }\r\n }\r\n\r\n class UploadItem extends viggo.classes.eventListener implements IUploadItem {\r\n private file: File;\r\n private url: string;\r\n private data: DOMStringMap;\r\n private bytesLoaded: number;\r\n private bytesTotal: number;\r\n public id: number | string;\r\n public constructor(file: File, url: string, data: DOMStringMap) {\r\n super();\r\n this.id = 0;\r\n this.file = file;\r\n this.url = url;\r\n this.data = data;\r\n this.bytesLoaded = 0;\r\n this.bytesTotal = this.size;\r\n }\r\n public get contentType() {\r\n return this.file.type;\r\n }\r\n public get name() {\r\n return this.file.name;\r\n }\r\n public get size() {\r\n return this.file.size;\r\n }\r\n public get loaded() {\r\n return this.bytesLoaded;\r\n }\r\n public get total() {\r\n return this.bytesTotal;\r\n }\r\n public get lastModified() {\r\n return new Date(this.file.lastModified);\r\n }\r\n public color(alpha: number = 1.0) {\r\n return `rgba(19,128,164,${alpha})`;\r\n //return viggo.func.getColorFromValue(this.name, alpha);\r\n }\r\n public run() {\r\n return new Promise<XMLHttpRequest>((resolve, reject) => {\r\n this.dispatchEvent('run', this);\r\n\r\n const formData = new FormData();\r\n formData.append('file', this.file, this.name);\r\n if (this.data) {\r\n for (let key in this.data) {\r\n formData.append(key, this.data[key]!);\r\n }\r\n }\r\n\r\n const xhr = viggo.xhr();\r\n\r\n xhr.open('POST', this.url, true);\r\n\r\n const warnNavigate = (event: BeforeUnloadEvent) => {\r\n const e = __('You are about to cancel your current upload.\\nDo you wish to continue?');\r\n event.returnValue = e;\r\n return e;\r\n };\r\n const uploadComplete = () => {\r\n if (xhr.readyState == 4) {\r\n xhr.removeEventListener('load', uploadComplete, false);\r\n window.removeEventListener('beforeunload', warnNavigate, false);\r\n if (xhr.status == 200) {\r\n resolve(xhr);\r\n } else {\r\n reject(xhr);\r\n }\r\n }\r\n };\r\n xhr.addEventListener('load', uploadComplete, false);\r\n window.addEventListener('beforeunload', warnNavigate, false);\r\n xhr.upload.addEventListener('progress', (event) => {\r\n this.bytesLoaded = event.loaded;\r\n this.bytesTotal = event.total;\r\n this.dispatchEvent('progress', this);\r\n }, false);\r\n xhr.upload.addEventListener('error', () => reject(xhr), false);\r\n xhr.upload.addEventListener('abort', () => reject(xhr), false);\r\n xhr.send(formData);\r\n });\r\n }\r\n }\r\n\r\n class Uploader extends viggo.classes.eventListener {\r\n protected items: IUploadItem[];\r\n protected files!: Element;\r\n protected itemMap: WeakMap<IUploadItem, Element>;\r\n protected completeResultElement: HTMLElement | null;\r\n protected templates: UploadTemplates;\r\n public constructor(files: Element|null, templates: UploadTemplates, completeResultElement: HTMLElement | null) {\r\n super();\r\n this.templates = templates;\r\n this.completeResultElement = completeResultElement;\r\n this.items = [];\r\n this.itemMap = new WeakMap();\r\n this.initialize(files!);\r\n }\r\n protected initialize(target: Element) {\r\n this.files = target;\r\n }\r\n public addItem(item: IUploadItem) {\r\n this.items.push(item);\r\n item.addEventListener('run', this.fileRun.bind(this));\r\n item.addEventListener('progress', this.fileProgress.bind(this));\r\n\r\n let li = this.createElement('pending', item);\r\n if (li) {\r\n this.itemMap.set(item, li);\r\n this.files.appendChild(li);\r\n }\r\n }\r\n protected fileRun(item: IUploadItem) {\r\n this.replaceLi(item, 'uploading');\r\n }\r\n protected fileProgress(item: IUploadItem) {\r\n let li = this.itemMap.get(item);\r\n if (li) {\r\n let progress = li.querySelector('progress');\r\n if (progress) {\r\n progress.max = item.total;\r\n progress.value = item.loaded;\r\n }\r\n }\r\n }\r\n public repaint() {}\r\n protected fileComplete(item: IUploadItem, xhr: XMLHttpRequest | null) {\r\n if (this.handleResult(item, xhr)) {\r\n this.replaceLi(item, 'complete');\r\n }\r\n }\r\n protected handleResult(item: IUploadItem, xhr: XMLHttpRequest|null) {\r\n if (xhr) {\r\n let result = viggo.ajax.parseResponse(<string>xhr.getResponseHeader('Content-Type'), xhr.responseText);\r\n switch (typeof result) {\r\n case \"number\":\r\n item.id = result;\r\n break;\r\n case \"string\":\r\n if (result.match(/^[0-9a-zA-Z\\-_]+$/)) {\r\n item.id = result;\r\n }\r\n break;\r\n case \"object\":\r\n if (result instanceof DocumentFragment) {\r\n if (this.completeResultElement) {\r\n viggo.dom.empty(this.completeResultElement);\r\n this.completeResultElement.appendChild(result);\r\n } else {\r\n result = result.firstElementChild;\r\n this.replaceLi(item, result);\r\n return false;\r\n }\r\n }\r\n break;\r\n case \"undefined\": // probably a script with no return value\r\n default:\r\n break;\r\n }\r\n }\r\n return true;\r\n }\r\n protected fileFailed(item: IUploadItem) {\r\n this.replaceLi(item, 'failed');\r\n }\r\n protected replaceLi(item: IUploadItem, template: string | Element | null) {\r\n let oldLi = this.itemMap.get(item);\r\n if (oldLi) {\r\n let newLi: Element | null = null;\r\n if (typeof template == \"string\") {\r\n newLi = this.createElement(template, item);\r\n } else {\r\n newLi = template;\r\n }\r\n if (newLi) {\r\n this.itemMap.set(item, newLi);\r\n oldLi.replaceWith(newLi);\r\n }\r\n }\r\n }\r\n protected createElement(templateName: string, data: any) {\r\n let callback = this.templates[templateName];\r\n if (callback) {\r\n let fragment = viggo.func.createView(data, callback);\r\n if (fragment) {\r\n return <HTMLElement|null>fragment.firstElementChild;\r\n }\r\n }\r\n return null;\r\n }\r\n public async run() {\r\n for (let file of this.items) {\r\n try {\r\n const xhr = await file.run();\r\n this.fileComplete(file, xhr);\r\n } catch (xhr) {\r\n this.handleFailedUpload(xhr);\r\n this.fileFailed(file);\r\n }\r\n }\r\n this.finish();\r\n }\r\n\r\n private handleFailedUpload(xhr: XMLHttpRequest) {\r\n try {\r\n let contentType = xhr.getResponseHeader(\"Content-Type\");\r\n viggo.ajax.textToData(contentType || \"\", xhr.responseText, document, 'javascript');\r\n } catch {\r\n // don't throw the error, because it will stop consecutive uploads\r\n }\r\n }\r\n\r\n protected finish() {\r\n this.dispatchEvent('finish');\r\n }\r\n\r\n public remove() {\r\n this.items = [];\r\n }\r\n }\r\n\r\n class SeparateUploader extends Uploader {\r\n protected graph: HTMLCanvasElement;\r\n protected chart: Chart;\r\n protected data: number[];\r\n protected colors: string[];\r\n protected backgrounds: string[];\r\n protected root!: HTMLElement;\r\n\r\n public constructor(templates: UploadTemplates, completeResultElement: HTMLElement | null) {\r\n super(null, templates, completeResultElement);\r\n\r\n this.graph = this.root.querySelector('canvas')!;\r\n let ctx = this.graph.getContext(\"2d\")!;\r\n this.colors = [];\r\n this.data = [];\r\n this.backgrounds = [];\r\n this.chart = new Chart(ctx, {\r\n type: 'doughnut',\r\n data: {\r\n datasets: [{\r\n data: this.data,\r\n backgroundColor: this.backgrounds,\r\n borderColor: this.colors,\r\n borderWidth: 1\r\n }],\r\n }\r\n });\r\n }\r\n\r\n protected initialize() {\r\n this.root = this.createElement('separate-uploader', null)!;\r\n document.body.appendChild(this.root);\r\n super.initialize(this.root.querySelector('ul.attached-files')!);\r\n }\r\n\r\n protected fileRun(item: IUploadItem) {\r\n super.fileRun(item);\r\n const index = this.items.indexOf(item);\r\n if (index != -1) {\r\n const color = item.color(1.0);\r\n this.data.splice(index, 0, 0);\r\n this.colors.splice(index, 0, color);\r\n this.backgrounds.splice(index, 0, color);\r\n this.repaint();\r\n }\r\n }\r\n\r\n public addItem(item: IUploadItem) {\r\n super.addItem(item);\r\n this.data.push(item.total);\r\n this.colors.push(item.color(1.0));\r\n this.backgrounds.push(item.color(0.2));\r\n }\r\n\r\n public repaint() {\r\n super.repaint();\r\n this.chart.update({duration: 0});\r\n }\r\n\r\n protected fileProgress(item: IUploadItem) {\r\n super.fileProgress(item);\r\n const index = this.items.indexOf(item);\r\n if (index != -1) {\r\n this.data[index] = item.loaded;\r\n this.data[index + 1] = item.total - item.loaded;\r\n this.repaint();\r\n }\r\n }\r\n\r\n protected fileComplete(item: IUploadItem, xhr: XMLHttpRequest) {\r\n if (this.handleResult(item, xhr)) {\r\n this.replaceLi(item, 'complete-separate');\r\n }\r\n this.removeFinishPie(item);\r\n }\r\n\r\n protected fileFailed(item: IUploadItem) {\r\n super.fileFailed(item);\r\n this.removeFinishPie(item);\r\n }\r\n\r\n private removeFinishPie(item: IUploadItem) {\r\n const index = this.items.indexOf(item);\r\n if (index != -1) {\r\n this.data[index] = item.total;\r\n this.data.splice(index + 1, 1);\r\n this.backgrounds.splice(index + 1, 1);\r\n this.colors.splice(index + 1, 1);\r\n }\r\n }\r\n\r\n public remove() {\r\n super.remove();\r\n new viggo.effect({\r\n element: this.root,\r\n style: 'right',\r\n from: 0,\r\n to: -this.root.offsetWidth,\r\n type: 'elastic',\r\n duration: 500,\r\n complete: () => {\r\n this.root.remove();\r\n }\r\n });\r\n }\r\n }\r\n\r\n export class upload extends viggo.classes.eventListener {\r\n public uploader!: Uploader;\r\n public static templates: UploadTemplates;\r\n public constructor(options: UploadOptions) {\r\n super();\r\n let skippedFiles: File[] = [];\r\n let goodFiles: File[] = [];\r\n for (let file of options.files) {\r\n if (options.filetypes.length) {\r\n let extension = file.name.match(/\\.[0-9a-zA-Z]+$/);\r\n if (!extension || options.filetypes.indexOf(extension[0].toLowerCase()) == -1) {\r\n skippedFiles.push(file);\r\n continue;\r\n }\r\n }\r\n if (options.maxFilesize > 0 && options.maxFilesize < file.size) {\r\n skippedFiles.push(file);\r\n continue;\r\n }\r\n goodFiles.push(file);\r\n }\r\n if (skippedFiles.length) {\r\n let s = \"Følgende filer vil ikke blive uploadet pÃ¥ grund af filtype- eller størrelses restriktion.\\n\" + skippedFiles.map(x => x.name).join(\"\\n\");\r\n if (goodFiles.length) {\r\n if (!confirm(\"Vil du uploade de resterende filer?\\n\" + s)) {\r\n return;\r\n }\r\n } else {\r\n alert(s);\r\n return;\r\n }\r\n }\r\n this.uploader = this.createUploader(options.target, options.completeElement);\r\n this.uploader.addEventListener('finish', () => {\r\n let event = new CustomEvent('viggoUploaderFinished', { bubbles: true, cancelable: false });\r\n options.target.dispatchEvent(event);\r\n });\r\n for (let file of goodFiles) {\r\n this.uploader.addItem(new UploadItem(file, options.url, options.data));\r\n }\r\n this.uploader.repaint();\r\n }\r\n public run(autoclose: boolean) {\r\n if (this.uploader) {\r\n if (autoclose) {\r\n this.uploader.addEventListener('finish', () => {\r\n this.uploader.remove();\r\n });\r\n }\r\n return this.uploader.run();\r\n }\r\n return Promise.resolve();\r\n }\r\n protected createUploader(target: Element, completeElement: HTMLElement | null) {\r\n let parent = target.parentElement;\r\n let files: Element|null = null;\r\n if (parent) {\r\n files = parent.querySelector('ul.attached-files');\r\n }\r\n return files ? new Uploader(files, upload.templates, completeElement) : new SeparateUploader(upload.templates, completeElement);\r\n }\r\n\r\n public static getIcon = (function () {\r\n const mimetypes: ObjectOf<string[]|RegExp> = {\r\n audio: /^audio\\//,\r\n docx: [\"application/msword\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"],\r\n jpg: [\"image/jpg\", \"image/jpeg\", \"image/gif\", \"image/bmp\"],\r\n keynote: [\"application/x-iwork-keynote-sffkey\"],\r\n numbers: [\"application/x-iwork-numbers-sffnumbers\"],\r\n pages: [\"application/x-iwork-pages-sffpages\"],\r\n pdf: [\"application/pdf\"],\r\n png: [\"image/png\"],\r\n pptx: [\"application/vnd.ms-powerpoint\", \"pptxapplication/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\"],\r\n psd: [\"application/psd\"],\r\n txt: [\"text/plain\"],\r\n video: /^video\\//,\r\n xlsx: [\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"],\r\n zip: [\"application/x-zip-compressed\"],\r\n };\r\n return function getIcon(contentType: string) {\r\n let found: string|null = null;\r\n for (let type in mimetypes) {\r\n let row = mimetypes[type];\r\n if (Array.isArray(row)) {\r\n if (row.indexOf(contentType) != -1) {\r\n found = type;\r\n }\r\n } else if (contentType.match(row)) {\r\n found = type;\r\n }\r\n if (found) {\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n found = 'file';\r\n }\r\n return `/Content/img/file-types/${found}.svg`;\r\n }\r\n }())\r\n\r\n public static getData(element: HTMLElement) {\r\n let data: DOMStringMap = {};\r\n for (let name in element.dataset) {\r\n if (name.indexOf('drop') == 0) {\r\n let param = name.replace(/^drop([A-Z])/, (all, char: string) => {\r\n return char.toLowerCase();\r\n });\r\n data[param] = <string>element.dataset[name];\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n public static test() {\r\n let u = new viggo.upload({\r\n data: {},\r\n files: <any>[],\r\n filetypes: [],\r\n maxFilesize: 0,\r\n completeElement: null,\r\n target: document.body,\r\n url: \"\"\r\n });\r\n u.uploader.addItem(new FakeUploadItem(\"stig.jpg\", \"image/jpeg\", 241023));\r\n u.uploader.addItem(new FakeUploadItem(\"erik.docx\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", 181023));\r\n u.uploader.addItem(new FakeUploadItem(\"bjarne.mp3\", \"audio/mpeg\", 541023));\r\n u.uploader.addItem(new FakeUploadItem(\"jesper.xslx\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", 21023));\r\n u.uploader.addItem(new FakeUploadItem(\"mathias.mp4\", \"video/mp4\", 1241023));\r\n u.uploader.addItem(new FakeUploadItem(\"martin.zip\", \"application/x-zip-compressed\", 171023));\r\n u.uploader.addItem(new FakeUploadItem(\"nilan.pdf\", \"application/pdf\", 71023));\r\n u.uploader.addItem(new FakeUploadItem(\"preben.psd\", \"application/psd\", 1341023));\r\n u.uploader.repaint();\r\n u.run(true);\r\n return u;\r\n }\r\n }\r\n\r\n fetch('/Scripts/upload-templates.json').then(x => x.json()).then(json => {\r\n let templates: any = {};\r\n for (let name in json) {\r\n templates[name] = viggo.func.createTemplate(json[name].html);\r\n }\r\n viggo.upload.templates = templates;\r\n });\r\n\r\n document.addEventListener('change', (event: Event) => {\r\n let target = <HTMLInputElement>event.target;\r\n if (target.tagName == 'INPUT' && target.type == 'file') {\r\n let urlTarget = <HTMLElement|null>target.closest('[data-upload-url]');\r\n if (urlTarget && target.files) {\r\n let filetypes = target.accept.split(',').filter(x => x);\r\n let url = urlTarget.dataset.uploadUrl!;\r\n let urlResult = url.split('#');\r\n let resultElement: HTMLElement | null = null;\r\n if (urlResult.length > 1) {\r\n resultElement = document.getElementById(urlResult[1]);\r\n }\r\n let uploader = new upload({\r\n files: target.files,\r\n filetypes: filetypes,\r\n maxFilesize: 0,\r\n target: target,\r\n completeElement: resultElement,\r\n data: viggo.upload.getData(target),\r\n url: urlResult[0]\r\n });\r\n uploader.run(true);\r\n }\r\n }\r\n }, false);\r\n}","module viggo {\r\n\r\n interface DragDropData {\r\n files: boolean;\r\n functionId: number;\r\n area: string;\r\n data: { [index: string]: string };\r\n }\r\n\r\n export class dragdrop {\r\n private static instance: dragdrop;\r\n private data: DragDropData;\r\n private dragTime = 0;\r\n private element: HTMLElement | null = null;\r\n private constructor() {\r\n this.data = {\r\n files: false,\r\n functionId: -1,\r\n area: '',\r\n data: {}\r\n }\r\n document.addEventListener('dragenter', (event: DragEvent) => {\r\n if (!this.allowDrag(event)) {\r\n return;\r\n }\r\n let target = this.getDropTarget(<HTMLElement>event.target);\r\n if (target && this.allowedType(target)) {\r\n event.dataTransfer!.dropEffect = 'move';\r\n target.classList.add('drag-over');\r\n if (this.data.files) {\r\n event.dataTransfer!.dropEffect = 'copy';\r\n }\r\n } else {\r\n event.dataTransfer!.dropEffect = 'none';\r\n }\r\n event.preventDefault();\r\n }, false);\r\n\r\n document.addEventListener('dragleave', (event: DragEvent) => {\r\n let target = this.getDropTarget(<HTMLElement>event.target);\r\n if (target && this.allowedType(target)) {\r\n event.dataTransfer!.dropEffect = 'none';\r\n target.classList.remove('drag-over');\r\n }\r\n document.documentElement!.classList.remove('drag-upload');\r\n document.documentElement!.classList.remove('drag-over');\r\n event.preventDefault();\r\n }, false);\r\n\r\n document.addEventListener('dragover', (event: DragEvent) => {\r\n if (!this.allowDrag(event)) {\r\n return;\r\n }\r\n this.data.files = false;\r\n document.documentElement!.classList.add('drag-over');\r\n\r\n if (event.dataTransfer!.items[0].kind == \"file\") {\r\n document.documentElement!.classList.add('drag-upload');\r\n this.data.files = true;\r\n }\r\n let target = this.getDropTarget(<HTMLElement>event.target);\r\n if (target && this.allowedType(target)) {\r\n event.dataTransfer!.dropEffect = this.data.files ? 'copy' : (event.dataTransfer!.dropEffect == 'none' ? 'move' : event.dataTransfer!.dropEffect);\r\n } else {\r\n event.dataTransfer!.dropEffect = 'none';\r\n }\r\n event.preventDefault();\r\n }, false);\r\n\r\n document.addEventListener('dragstart', (event: DragEvent) => {\r\n this.dragTime = Date.now();\r\n document.documentElement!.classList.add('drag-over');\r\n let target = <HTMLElement|null>viggo.dom.parentDataset(<HTMLElement>event.target, 'dragId');\r\n if (target) {\r\n if (!target.dataset.areaFunctionId) {\r\n throw new Error(\"Missing data-area-function-id for drag\");\r\n }\r\n let functionId = target.dataset.dragFunctionId;\r\n if (!functionId) {\r\n functionId = '-1';\r\n }\r\n event.dataTransfer!.effectAllowed = 'all';\r\n this.data.area = target.dataset.areaFunctionId;\r\n this.data.files = false;\r\n this.data.functionId = parseInt(functionId);\r\n this.data.data = {};\r\n\r\n document.documentElement!.classList.add('drag-' + functionId);\r\n event.dataTransfer!.setData('text', ''); // must be there, or the browser will not initiate the drag\r\n for (var i in target.dataset) {\r\n if (i.indexOf('drag') === 0) { // this will take any aditional drag data defined with data-drag-*\r\n let attribute = i.substring(4);\r\n attribute = attribute.substring(0, 1).toLowerCase() + attribute.substring(1);\r\n this.data.data[attribute] = <string>target.dataset[i];\r\n }\r\n }\r\n this.element = target;\r\n }\r\n }, false);\r\n\r\n document.addEventListener('dragend', (event: DragEvent) => {\r\n if (!this.allowDrag(event)) {\r\n return;\r\n }\r\n this.reset();\r\n event.preventDefault();\r\n }, false);\r\n\r\n document.addEventListener('drop', (event: DragEvent) => {\r\n if (!this.allowDrag(event)) {\r\n return;\r\n }\r\n this.reset();\r\n let target = this.getDropTarget(<HTMLElement>event.target);\r\n if (target && this.allowedType(target)) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n let urlTarget = <HTMLElement|null>target.closest('[data-upload-url]');\r\n if (this.data.files && urlTarget && event.dataTransfer!.files && event.dataTransfer!.files.length) {\r\n let extensions = target.dataset.validExtensions;\r\n let filetypes = extensions ? extensions.split(',').filter(x=>x) : [];\r\n let maxSize = parseInt(target.dataset.maxSize || urlTarget.dataset.maxSize || '0');\r\n if (isNaN(maxSize)) {\r\n throw new Error(\"Max size not correctly set\");\r\n }\r\n\r\n let url = urlTarget.dataset.uploadUrl!;\r\n let resultUrl = url.split('#');\r\n let resultElement: HTMLElement | null = null;\r\n if (resultUrl.length > 1) {\r\n resultElement = document.getElementById(resultUrl[1]);\r\n }\r\n url = resultUrl[0];\r\n\r\n if (urlTarget) {\r\n let uploader = new viggo.upload({\r\n files: event.dataTransfer!.files,\r\n filetypes: filetypes,\r\n maxFilesize: maxSize,\r\n completeElement: resultElement,\r\n data: viggo.upload.getData(target),\r\n target: urlTarget,\r\n url: url\r\n });\r\n uploader.run(true);\r\n } else {\r\n throw new Error(\"Missing data-drop-url for file-upload\");\r\n }\r\n } else {\r\n let data: any = Object.assign({}, this.data.data);\r\n data.parent = target.dataset.dropId;\r\n data.parentFunctionId = target.dataset.dropFunctionId;\r\n data.area = this.data.area;\r\n data.functionId = this.data.functionId;\r\n\r\n this.moveStuff(data, <HTMLElement|undefined>this.element, target);\r\n }\r\n this.data = {\r\n area: '',\r\n files: false,\r\n functionId: -1,\r\n data: {}\r\n };\r\n }\r\n }, false);\r\n }\r\n public static getInstance() {\r\n if (!dragdrop.instance) {\r\n dragdrop.instance = new dragdrop();\r\n }\r\n return dragdrop.instance;\r\n }\r\n public moveStuff(data: any, movedTarget?: Element, newParent?: Element) {\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Shared/Folder/ItemMove',\r\n data: data,\r\n complete: function () {\r\n if (movedTarget) {\r\n if (newParent) {\r\n let link = movedTarget.querySelector(':scope>a');\r\n let text = link ? (link.textContent || 'Element').trim().toLowerCase() : 'Element';\r\n let list;\r\n if (movedTarget.classList.contains('folder')) {\r\n list = newParent.querySelectorAll(':scope>ul>li.folder');\r\n } else {\r\n list = newParent.querySelectorAll(':scope>ul>li:not(.folder)');\r\n }\r\n let bestTarget = null;\r\n if (list.length) {\r\n bestTarget = list[list.length - 1].nextSibling;\r\n }\r\n for (let i = 0; i < list.length; i++) {\r\n let li = list[i];\r\n link = li.querySelector(':scope>a');\r\n let t = link ? (link.textContent || '').trim().toLowerCase() : '';\r\n if (text < t) {\r\n bestTarget = li;\r\n break;\r\n }\r\n }\r\n if (!bestTarget && movedTarget.classList.contains('folder')) {\r\n bestTarget = newParent.firstChild;\r\n }\r\n let ul = newParent.querySelector(':scope>ul');\r\n if (ul && bestTarget && ul.contains(bestTarget)) {\r\n ul.insertBefore(movedTarget, bestTarget);\r\n } else {\r\n viggo.history.reload();\r\n }\r\n } else {\r\n movedTarget.remove();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n public static getData() {\r\n return dragdrop.getInstance().getData();\r\n }\r\n public getData() {\r\n return this.data.data;\r\n }\r\n private reset() {\r\n document.documentElement!.className = document.documentElement!.className.split(' ').filter(function (c) {\r\n return c !== '' && c.substring(0, 5) !== 'drag-';\r\n }).join(' ');\r\n }\r\n private getDropTarget(target: HTMLElement) {\r\n if (target.nodeType != 1) {\r\n target = target.parentElement!;\r\n }\r\n return target ? <HTMLElement|null>target.closest('[data-drop-id]') : null;\r\n }\r\n private allowedType(target: HTMLElement) {\r\n let result = false;\r\n \r\n if (target) {\r\n if (this.data.files) {\r\n result = !!target.closest('[data-upload-url]');\r\n } else {\r\n result = target.dataset.areaFunctionId == this.data.area &&\r\n !!target.dataset.dropValidFunctionIds &&\r\n target.dataset.dropValidFunctionIds.split(' ').indexOf(this.data.functionId + '') != -1 &&\r\n this.element != target\r\n }\r\n }\r\n return result;\r\n }\r\n private allowDrag(event: DragEvent) {\r\n return Date.now() - this.dragTime > 200 && event.dataTransfer;\r\n }\r\n }\r\n\r\n dragdrop.getInstance();\r\n\r\n (function () {\r\n let buttons = document.getElementsByClassName('upload-disabled');\r\n let start = () => {\r\n [].forEach.call(buttons, (e: HTMLButtonElement) => {\r\n e.disabled = true;\r\n });\r\n };\r\n let stop = () => {\r\n [].forEach.call(buttons, (e: HTMLButtonElement) => {\r\n e.disabled = false;\r\n });\r\n };\r\n viggo.upload.addEventListener('upload', start);\r\n viggo.upload.addEventListener('finish', stop);\r\n }());\r\n}","/// <reference path=\"viggo.ts\" />\r\n/// <reference path=\"viggo.dom.ts\" />\r\n/// <reference path=\"viggo.ajax.ts\" />\r\n/// <reference path=\"viggo.effect.ts\" />\r\n\r\nmodule viggo {\r\n document.addEventListener('mousedown', function (event) {\r\n let target = <HTMLElement>(<HTMLElement>event.target).closest('.ordering > li:not(.noorder)');\r\n if (target) {\r\n let ul = target.parentElement!;\r\n let listTop = viggo.dom.getPos(ul).top - (<HTMLElement>ul.firstElementChild).offsetTop;\r\n let startY = event.pageY;\r\n let moved = false;\r\n //event.preventDefault();\r\n event.stopPropagation();\r\n\r\n var mousemove = function (ev: MouseEvent) {\r\n var found = null;\r\n ul.classList.add('isordering');\r\n target.classList.add('order');\r\n var scroll = 0;\r\n if (viggo.isTablet()) {\r\n scroll = viggo.getScrollTop(ul);\r\n }\r\n\r\n for (var i = 0; i < ul.childNodes.length && !found; i++) {\r\n var node = <HTMLElement>ul.childNodes[i];\r\n if (node.nodeType == 1) {\r\n if (node != target && node.offsetTop <= ev.pageY - (listTop - scroll) && node.offsetTop + node.offsetHeight > ev.pageY - (listTop - scroll)) {\r\n found = node;\r\n }\r\n }\r\n }\r\n if (!found) {\r\n if (ev.pageY + scroll < viggo.dom.getPos(<HTMLElement>ul.firstElementChild).top) {\r\n found = ul.firstElementChild;\r\n } else if (ev.pageY + scroll > viggo.dom.getPos(<HTMLElement>ul.lastElementChild).top + (<HTMLElement>ul.lastElementChild).offsetHeight) {\r\n found = ul.querySelector('.noorder');\r\n } else {\r\n found = target;\r\n }\r\n }\r\n var offset = ev.pageY - startY;\r\n if (target != found) {\r\n var dif = target.offsetTop;\r\n if (target.nextElementSibling != found) {\r\n let movingTarget: Element | null = null;\r\n if (offset < 0) {\r\n movingTarget = target.previousElementSibling;\r\n } else {\r\n movingTarget = target.nextElementSibling;\r\n }\r\n let oldY = 0;\r\n if (movingTarget) {\r\n oldY = movingTarget.getBoundingClientRect().y;\r\n }\r\n ul.insertBefore(target, found);\r\n let newY = 0;\r\n if (movingTarget) {\r\n newY = movingTarget.getBoundingClientRect().y;\r\n }\r\n if (movingTarget) {\r\n (<HTMLElement>movingTarget).style.position = 'relative';\r\n new viggo.effect({\r\n element: movingTarget,\r\n style: 'top',\r\n duration: 200,\r\n from: oldY - newY,\r\n to: 0,\r\n removeStyle: true,\r\n complete: function () {\r\n (<HTMLElement>movingTarget).style.position = '';\r\n }\r\n });\r\n }\r\n moved = true;\r\n }\r\n\r\n dif -= target.offsetTop;\r\n offset -= dif;\r\n startY -= dif;\r\n }\r\n if (target == ul.firstElementChild) {\r\n offset = Math.max(offset, 0);\r\n } else if (target == ul.lastElementChild || (target.nextElementSibling && target.nextElementSibling.className.split(' ').indexOf('noorder') != -1)) {\r\n offset = Math.min(offset, 0);\r\n }\r\n target.style.top = offset + 'px';\r\n ev.preventDefault();\r\n };\r\n\r\n var waitFormMove = function (ev: MouseEvent) {\r\n document.removeEventListener('mousemove', waitFormMove, false);\r\n document.addEventListener('mousemove', mousemove, false);\r\n target.style.position = 'relative';\r\n };\r\n\r\n var mouseup = function (ev: MouseEvent) {\r\n target.style.top = '';\r\n target.style.position = '';\r\n document.removeEventListener('mousemove', mousemove, false);\r\n document.removeEventListener('mouseup', mouseup, false);\r\n document.removeEventListener('mousemove', waitFormMove, false);\r\n target.classList.remove('order');\r\n ul.classList.remove('isordering');\r\n if (moved) {\r\n var id = ul.dataset.orderingRowId;\r\n var functionId = ul.dataset.orderingFunctionId;\r\n var url = window.location.pathname.match(/^\\/(?:Cms|Info)/i);\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Shared/Ordering/Ordering',\r\n data: {\r\n functionId: functionId,\r\n id: id,\r\n order: Array.prototype.filter.call(ul.children, li => li.dataset.orderingId).map(li => li.dataset.orderingId).join(',')\r\n }\r\n });\r\n }\r\n };\r\n\r\n document.addEventListener('mouseup', mouseup, false);\r\n document.addEventListener('mousemove', waitFormMove, false);\r\n }\r\n }, false);\r\n}","module viggo {\r\n var SpeechRecognition = <new () => SpeechRecognition>(<any>window).SpeechRecognition || (<any>window).webkitSpeechRecognition;\r\n var SpeechGrammarList = <new () => SpeechGrammarList>(<any>window).SpeechGrammarList || (<any>window).webkitSpeechGrammarList;\r\n export class speech {\r\n private recognition: SpeechRecognition;\r\n private grammer: SpeechGrammarList;\r\n public constructor() {\r\n this.recognition = new SpeechRecognition();\r\n this.recognition.continuous = false\r\n this.grammer = new SpeechGrammarList();\r\n let jsgf = `#JSGF V1.0 UTF-8 da;`;\r\n this.grammer.addFromString(jsgf);\r\n this.recognition.grammars = this.grammer;\r\n this.recognition.lang = \"da\";\r\n this.recognition.interimResults = false;\r\n this.recognition.maxAlternatives = 1;\r\n this.recognition.addEventListener('result', this.eventResult.bind(this), false);\r\n this.recognition.addEventListener('speechend', this.eventEnd.bind(this), false);\r\n this.recognition.addEventListener('nomatch', this.eventNomatch.bind(this), false);\r\n this.recognition.addEventListener('error', this.eventError.bind(this), false);\r\n this.recognition.start();\r\n }\r\n private eventResult(event: SpeechRecognitionEvent) {\r\n console.log(event);\r\n }\r\n private eventEnd(event: Event) {\r\n console.log(event);\r\n this.recognition.stop();\r\n }\r\n private eventNomatch(event: SpeechRecognitionEvent) {\r\n console.log(event);\r\n }\r\n private eventError(event: Event) {\r\n console.log(event);\r\n }\r\n }\r\n}","module viggo {\r\n interface ErrorArchive {\r\n [filename: string]: number; // number is from Date.now()\r\n }\r\n\r\n interface TrackedEvent {\r\n type: string;\r\n target: string;\r\n time: Date;\r\n }\r\n\r\n interface ErrorEventError {\r\n columnNumber: number;\r\n fileName: string;\r\n lineNumber: number;\r\n message: string;\r\n stack: string;\r\n }\r\n\r\n const STARTUP_TIME = new Date();\r\n\r\n export class error {\r\n protected error: ErrorEventError;\r\n protected event: ErrorEvent;\r\n private static errorListener: (error: ErrorEvent) => void;\r\n private static eventListener: (event: Event) => void;\r\n private static trackedEvents: TrackedEvent[] = [];\r\n public constructor(event: ErrorEvent) {\r\n this.event = event;\r\n this.error = event.error;\r\n }\r\n public get filename() {\r\n let m = this.event.filename ? this.event.filename.match(new RegExp(\"^(?:https?://\" + window.location.host.replace(\".\", \"\\\\.\") + \")?(.+)\")) : null;\r\n if (m) {\r\n m[1] = m[1].replace(/([&?]\\w+=|\\/)[0-9\\-,]+\\b/g, \"$1X\").replace(/#modal[a-f0-9\\-]+/, \"#modal\").replace(/\\/$/, '');\r\n }\r\n return m ? m[1] : this.event.filename || 'Unknown';\r\n }\r\n public get lineno() {\r\n return this.event.lineno || 0;\r\n }\r\n public get colno() {\r\n return this.event.colno || 0;\r\n }\r\n public get message() {\r\n let msg = '';\r\n if (this.error && this.error.message) {\r\n msg = this.error.message;\r\n } else if (this.event && this.event.message) {\r\n msg = this.event.message;\r\n }\r\n return msg;\r\n }\r\n public get stack() {\r\n return this.error ? this.error.stack : null;\r\n }\r\n public get identifier() {\r\n return this.filename + ':' + this.lineno + ':' + this.colno;\r\n }\r\n public static analyze(err: any, script: string) {\r\n let lines = script.split(/\\r\\n/);\r\n let lineNumber = err.lineNumber || err.line || err.lineno;\r\n let columnNumber = err.columnNumber || err.column || err.colno;\r\n if (typeof lineNumber == 'undefined' && typeof err.stack == 'string') {\r\n let m = err.stack.match(/<anonymous>:(\\d+):(\\d+)/);\r\n if (m) {\r\n lineNumber = parseInt(m[1]);\r\n columnNumber = parseInt(m[2]);\r\n }\r\n }\r\n if (lineNumber && columnNumber < 256) {\r\n lines.splice(lineNumber - 2, 0, '-'.repeat(columnNumber - 1) + '^');\r\n lines = lines.slice(Math.max(0, lineNumber - 6), lineNumber + 3);\r\n }\r\n return {\r\n message: lines.join('\\r\\n'),\r\n lineNumber: lineNumber,\r\n columnNumber: columnNumber\r\n };\r\n }\r\n public static isAppleSpecificBug(err: any) {\r\n return err.message == \"Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: \\\"default-src x-apple-ql-id: 'unsafe-inline'\\\".\\n\";\r\n }\r\n private static foreignErrors = [\"Cannot read property '_avast_submit' of undefined\"];\r\n private static isIgnorableError(err: any) {\r\n return this.foreignErrors.indexOf(err) != -1;\r\n }\r\n public report(message: string | null) {\r\n if (viggo.error.isIgnorableError(this.error)) {\r\n return;\r\n }\r\n let stack = this.stack||'';\r\n sourceMappedStackTrace.mapStackTrace(stack, (result) => {\r\n let s = result.join(\"\\n\");\r\n result = [];\r\n if (s || this.stack) {\r\n result.push('Stacktrace: \\n' + (s || this.stack || ''));\r\n }\r\n s = JSON.stringify(error.trackedEvents, null, 2);\r\n if (s.length) {\r\n result.push('Events: ' + s);\r\n }\r\n result.push(\"Startup: \" + STARTUP_TIME.format('HH:mm:ss dd-MM-yyyy'));\r\n result.push(\"Location: \" + window.location.href);\r\n let modal = viggo.modal.getLatestModal();\r\n if (modal && modal.url) {\r\n result.push(\"Modal: \" + modal.url);\r\n }\r\n new viggo.ajax({\r\n method: 'post',\r\n url: '/Basic/Error/JavascriptError',\r\n convert: 'javascript',\r\n json: true,\r\n data: {\r\n file: this.identifier,\r\n errorMessage: this.message.trim(),\r\n userMessage: message,\r\n userAgent: navigator.userAgent,\r\n stackTrace: result.join(\"\\n\\n\")\r\n },\r\n error: function () {\r\n viggo.notice(viggo.NoticeType.notice, \"Der kom et uventet resultat fra serveren. Forsøg venligst at logge ud, og ind igen, hvis problemet fortsætter.\", 6000);\r\n return true;\r\n }\r\n });\r\n });\r\n }\r\n public isArchived() {\r\n return !!error.getArchive()[this.identifier];\r\n }\r\n\r\n public archive() {\r\n let archive = error.getArchive();\r\n archive[this.identifier] = Date.now();\r\n window.localStorage.setItem('error', JSON.stringify(archive));\r\n }\r\n\r\n public static clearArchive() {\r\n window.localStorage.removeItem(\"error\");\r\n }\r\n\r\n public static cleanUp(days = 7) {\r\n let time = new Date();\r\n time.setDate(time.getDate() - days);\r\n let compare = time.getTime();\r\n let archive = this.getArchive();\r\n let counter = 0;\r\n for (let filename in archive) {\r\n if (archive[filename] < compare) {\r\n delete archive[filename];\r\n counter++;\r\n }\r\n }\r\n if (counter) {\r\n window.localStorage.setItem('error', JSON.stringify(archive));\r\n }\r\n return counter;\r\n }\r\n\r\n public static getArchive() {\r\n let json = <string | null>window.localStorage.getItem('error');\r\n let result: ErrorArchive;\r\n if (!json) {\r\n result = {};\r\n } else {\r\n result = JSON.parse(json);\r\n }\r\n return result;\r\n }\r\n\r\n private static getCssSelector(target: Element) {\r\n let path: string[] = [];\r\n if (target.nodeType != 1) {\r\n target = <Element>target.parentNode;\r\n }\r\n while (target && target.nodeType == 1) {\r\n let s = target.tagName.toLowerCase();\r\n if (target.id) {\r\n s += '#' + target.id;\r\n }\r\n let className = target.className;\r\n if (className) {\r\n if (className.trim) {\r\n className = className.trim();\r\n }\r\n if (className && className.replace) {\r\n s += '.' + className.replace(/\\s+/g, '.');\r\n }\r\n }\r\n path.unshift(s);\r\n if (target.id && typeof target.id == 'string' && !target.id.match(/\\d/)) {\r\n break;\r\n }\r\n target = <Element>target.parentNode;\r\n }\r\n return path.join(' > ');\r\n }\r\n\r\n private static addTrackedEvent(event: Event) {\r\n let result: TrackedEvent = {\r\n type: event.type,\r\n target: this.getCssSelector(<Element>event.target),\r\n time: new Date()\r\n };\r\n return result;\r\n }\r\n\r\n public static disable() {\r\n if (this.errorListener && this.eventListener) {\r\n window.removeEventListener('error', this.errorListener, true);\r\n document.removeEventListener('click', this.eventListener, true);\r\n document.removeEventListener('submit', this.eventListener, true);\r\n document.removeEventListener('change', this.eventListener, true);\r\n }\r\n }\r\n\r\n public static enable() {\r\n if (!this.errorListener) {\r\n this.errorListener = (event: ErrorEvent) => {\r\n try {\r\n if (event.error) {\r\n if (this.isAppleSpecificBug(event)) {\r\n window.location.reload();\r\n } else {\r\n let err = new error(event);\r\n if (!err.isArchived()) {\r\n err.archive();\r\n\r\n viggo.notice(NoticeType.notice, \"Client side error reported.\", 3000);\r\n if (!viggo.isDevelopment) {\r\n let msg: string|null = null;\r\n if (!ajax.isIdle()) {\r\n msg = JSON.stringify(ajax.requestLog, null, 2);\r\n }\r\n err.report(msg);\r\n }\r\n }\r\n console.error(event.error);\r\n }\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n };\r\n }\r\n\r\n if (!this.eventListener) {\r\n this.eventListener = (event: Event) => {\r\n this.trackedEvents.push(this.addTrackedEvent(event));\r\n };\r\n }\r\n window.addEventListener('error', this.errorListener, true);\r\n\r\n document.addEventListener('click', this.eventListener, true);\r\n document.addEventListener('submit', this.eventListener, true);\r\n document.addEventListener('change', this.eventListener, true);\r\n viggo.ajax.addEventListener('idle', () => {\r\n this.trackedEvents = [];\r\n });\r\n }\r\n }\r\n\r\n error.enable();\r\n viggo.error.cleanUp();\r\n}","\r\n/// <reference path=\"viggo.ts\" />\r\n/// <reference path=\"viggo.dom.ts\" />\r\n/// <reference path=\"viggo.ajax.ts\" />\r\n\r\n\r\n(function () {\r\n function disableButtons(form: HTMLFormElement) {\r\n (<NodeListOf<HTMLInputElement | HTMLButtonElement>>form.querySelectorAll('button[type=\"submit\"],input[type=\"submit\"]')).forEach(e => {\r\n e.disabled = true;\r\n e.classList.add('loading');\r\n e.appendChild(viggo.dom.tag('span'));\r\n });\r\n }\r\n function enableButtons(form: HTMLFormElement) {\r\n (<NodeListOf<HTMLInputElement | HTMLButtonElement>>form.querySelectorAll('button[type=\"submit\"],input[type=\"submit\"]')).forEach(e => {\r\n e.disabled = false;\r\n e.classList.remove('loading');\r\n e.querySelectorAll('span').forEach(x => x.remove());\r\n });\r\n }\r\n // submit forms by ajax\r\n document.addEventListener('submit', function (event) {\r\n let form = (<HTMLElement>event.target).closest('form');\r\n if (form && form.classList.contains('ajax')) {\r\n disableButtons(form);\r\n new viggo.ajax(form);\r\n event.preventDefault();\r\n }\r\n }, false);\r\n\r\n document.addEventListener('submit', function (event) {\r\n let form = (<HTMLElement>event.target).closest('form');\r\n if (form && form.classList.contains('ajax-stream')) {\r\n disableButtons(form);\r\n let formData = new FormData(form);\r\n let type = (form.className.match(/append|prepend|replace/) || ['append'])[0];\r\n let selectorId: string = <string>(form.className.match(new RegExp(type + '_([A-Za-z][A-Za-z0-9_\\\\-]*)')) || ['', null])[1];\r\n\r\n let messageElement = selectorId ? document.getElementById(selectorId) : null;\r\n if (messageElement) {\r\n viggo.dom.empty(messageElement);\r\n }\r\n viggo.ajax.stream(form.action, {\r\n method: form.method,\r\n body: formData\r\n }, (response) => {\r\n if (messageElement) {\r\n switch (response.type) {\r\n case 'html':\r\n switch (type) {\r\n case 'replace':\r\n viggo.dom.empty(messageElement);\r\n case 'append':\r\n messageElement.appendChild(response.value);\r\n break;\r\n case 'prepend':\r\n messageElement.insertBefore(response.value, messageElement.firstChild);\r\n break;\r\n }\r\n break;\r\n case 'json':\r\n switch (response.response.header('x-json-type')) {\r\n case 'ProgressElement':\r\n let json = response.value;\r\n let element = document.getElementById(json.Id);\r\n let created = false;\r\n if (!element) {\r\n element = viggo.dom.tag('div', { id: json.Id, className: 'progress-element' }, viggo.dom.tag('div', {className: 'name'}, json.Name), viggo.dom.tag('progress'));\r\n messageElement.appendChild(element);\r\n created = true;\r\n }\r\n let progress = element.querySelector('progress')!;\r\n progress.max = json.Total;\r\n if (!created) {\r\n element.querySelector('.progress-element .name')!.textContent = `${json.Name} (${json.Counter}/${json.Total})`;\r\n progress.value = json.Counter;\r\n }\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n }).then(x => {\r\n if (messageElement) {\r\n messageElement.querySelectorAll('progress').forEach(p => p.value = p.max);\r\n }\r\n if (form) {\r\n enableButtons(form);\r\n }\r\n });\r\n event.preventDefault();\r\n }\r\n });\r\n\r\n document.addEventListener('submit', function (event) {\r\n //console.log(event);\r\n var form = (<HTMLElement>event.target).closest('form');\r\n //console.log(form);\r\n if (form && form.classList.contains('copy-schoolyear-signalr')) {\r\n disableButtons(form);\r\n event.preventDefault();\r\n var formData = Object.fromEntries(new FormData(form));\r\n console.log(formData);\r\n var connection = new signalR.HubConnectionBuilder().withUrl(\"/copySchoolYearHub\", {skipNegotiation: true, transport: signalR.HttpTransportType.WebSockets}).build();\r\n\r\n connection.on(\"CreateProgress\", function(id: string, name: string, subProgress: string) {\r\n var subProgressClass = subProgress.toLowerCase() === \"true\" ? \" subprocess\" : \"\";\r\n var element = viggo.dom.tag('div', { id: \"copy-\" + id, className: 'progress-element' + subProgressClass }, viggo.dom.tag('div', {className: 'name'}, name), viggo.dom.tag('progress'));\r\n document.getElementById(\"loading-message\")?.appendChild(element);\r\n });\r\n\r\n connection.on(\"UpdateProgress\", function(id: string, name: string, index: number, total: number) {\r\n var element = document.getElementById(\"copy-\" + id);\r\n\r\n if (element) {\r\n let progress = element.querySelector('progress')!;\r\n progress.max = total;\r\n\r\n element.querySelector('.progress-element .name')!.textContent = `${name} (${index}/${total})`;\r\n progress.value = index;\r\n }\r\n });\r\n\r\n connection.on(\"RawJavascript\", function(command: string) {\r\n eval(command);\r\n (<HTMLElement>document.querySelector(\".loading-bars\")).style.display = \"none\";\r\n\r\n var e = <HTMLButtonElement>document.querySelector(\"button[type='submit']\");\r\n e.disabled = false;\r\n e.classList.remove('loading');\r\n e.querySelectorAll('span').forEach(x => x.remove());\r\n\r\n connection.close();\r\n });\r\n\r\n connection.on(\"OnException\", function(ex: string) {\r\n viggo.notice(viggo.NoticeType.error, ex , 4000);\r\n });\r\n\r\n connection.start().then(function() {\r\n connection.invoke(\"CopySchoolYear\", formData);\r\n });\r\n }\r\n }, false); \r\n\r\n}());\r\n\r\n// selectable lists\r\ndocument.addEventListener('click', function (event) {\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n let target = <HTMLElement>event.target;\r\n let link = target.closest('a');\r\n if (link) {\r\n if ((<HTMLElement>link.parentNode).tagName == 'LI' && viggo.dom.parentClass(<Element>link.parentNode, 'selectable')) {\r\n let selectItems = function (from: Element, to: Element | null) {\r\n let i = 0;\r\n while (from && from !== to) {\r\n from = <Element>from.parentNode;\r\n from.classList.add('selected');\r\n if (i++) {\r\n from.classList.add('subselected');\r\n } else {\r\n from.classList.remove('subselected');\r\n }\r\n from = <Element>from.parentNode;\r\n }\r\n };\r\n\r\n let topList = link.closest(':not(li) > ul');\r\n\r\n let unselectAll = function () {\r\n // clear all selected classes\r\n let keepSelected = (<HTMLElement>topList).dataset.selectableClick == 'keep';\r\n topList?.querySelectorAll('.selected').forEach(e => {\r\n if (keepSelected) {\r\n e.classList.add('subselected');\r\n } else {\r\n e.classList.remove('selected');\r\n e.classList.remove('subselected');\r\n }\r\n });\r\n };\r\n // get the top most list\r\n if (target.classList.contains('folder-expand')) {\r\n let li = target.closest('li');\r\n if (li) {\r\n li.classList.toggle('selected');\r\n if (li.classList.contains('selected')) {\r\n li.classList.add('subselected');\r\n } else {\r\n li.classList.remove('subselected');\r\n }\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n } else {\r\n unselectAll();\r\n // set class selected on li until we hit the top list\r\n selectItems(link, topList);\r\n }\r\n }\r\n }\r\n}, false);\r\n\r\n// ajax-toggle\r\ndocument.addEventListener('click', function (event) {\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n let link = <HTMLAnchorElement | null>(<HTMLElement>event.target).closest('a.ajax-toggle');\r\n if (link) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n let classes = (link.dataset.toggleClasses || 'off on').split(' ');\r\n let isOn = link.classList.contains(classes[1]);\r\n\r\n let reset = function (value: boolean) {\r\n link!.classList.remove(value ? classes[0] : classes[1]);\r\n link!.classList.add(value ? classes[1] : classes[0]);\r\n };\r\n reset(!isOn);\r\n if (isOn && link.matches('a[href*=\"settings=Notification\"]')) {\r\n link.parentElement!.querySelectorAll('a.ajax-toggle').forEach(x => {\r\n x.classList.remove(classes[1]);\r\n x.classList.add(classes[0]);\r\n });\r\n }\r\n\r\n new viggo.ajax({\r\n method: 'put',\r\n url: (<HTMLAnchorElement>link).href.replace('%s', isOn ? \"0\" : \"1\"),\r\n convert: true,\r\n complete: function (data) {\r\n if (!data && data !== '' && data !== undefined) {\r\n reset(isOn);\r\n }\r\n },\r\n error: function () {\r\n reset(isOn);\r\n }\r\n });\r\n }\r\n}, false);\r\n\r\n// ajaxExecute\r\ndocument.addEventListener('click', function (event) {\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n let link = (<HTMLElement>event.target).closest('a');\r\n if (link) {\r\n let m = link.className.match(/ajax(Get|Post|Put|Delete)?Execute/);\r\n if (m) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n new viggo.ajax({\r\n method: m[1] || 'get',\r\n url: (<HTMLAnchorElement>link).href,\r\n convert: 'javascript',\r\n complete: () => {\r\n let event = new CustomEvent('viggoAjaxExecute', { detail: (m![1]||'get').toLowerCase(), bubbles: true, cancelable: false });\r\n link!.dispatchEvent(event);\r\n let selector = link?.dataset.removeParent;\r\n if (selector) {\r\n link!.closest(selector)?.remove();\r\n }\r\n }\r\n });\r\n }\r\n }\r\n}, false);\r\n\r\n// ajaxToggleForm\r\ndocument.addEventListener('click', function (event) {\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n let target = <HTMLElement>event.target;\r\n let input = <HTMLInputElement|null>target.closest('input[type=\"checkbox\"]');\r\n if (input && input.form && input.form.classList.contains('ajaxToggleForm')) {\r\n let inputs = <NodeListOf<HTMLInputElement>>input.form.querySelectorAll('input[type=\"checkbox\"]');\r\n let checked = false;\r\n let value: any = null;\r\n for (let i = inputs.length - 1; i >= 0; i--) {\r\n if (input == inputs[i]) {\r\n checked = true;\r\n if (input.checked) {\r\n value = input.value;\r\n } else {\r\n value = true;\r\n }\r\n } else {\r\n if (value === true) {\r\n value = inputs[i].value;\r\n }\r\n inputs[i].checked = checked;\r\n }\r\n }\r\n if (value === true) {\r\n value = parseInt(input.value) - 1;\r\n }\r\n new viggo.ajax({\r\n method: 'put',\r\n url: input.form.action,\r\n convert: true,\r\n data: {\r\n editrights: value\r\n }\r\n });\r\n }\r\n}, false);\r\n\r\n// aria-expanded\r\ndocument.addEventListener('click', function (event) {\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n let target = <HTMLElement>event.target;\r\n let link = <HTMLAnchorElement | HTMLInputElement | HTMLButtonElement | null>target.closest('[aria-expanded]');\r\n\r\n if (link) {\r\n let expanded = link.getAttribute('aria-expanded');\r\n if (expanded && expanded == \"false\") {\r\n link.setAttribute('aria-expanded', \"true\");\r\n let f = (ev: Event) => {\r\n let sibling = (<HTMLElement>link).nextElementSibling;\r\n let target = <Element>ev.target;\r\n if (link!.contains(target) || !sibling || !sibling.contains(target) || target.closest('button[type=\"submit\"]')) {\r\n (<HTMLElement>link).setAttribute('aria-expanded', \"false\");\r\n document.removeEventListener('click', f, false);\r\n }\r\n };\r\n document.addEventListener('click', f, false);\r\n }\r\n }\r\n}, false);\r\n\r\n// handle # references\r\ndocument.addEventListener('click', function (event) {\r\n let target = (<HTMLElement>event.target).closest('a');\r\n if (target) {\r\n let href = target.getAttribute('href');\r\n if (href) {\r\n let match = href.match(/^#(.+)/);\r\n if (match) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n let id = match[1];\r\n let element = document.getElementById(id);\r\n if (element) {\r\n element.scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"center\",\r\n inline: \"start\"\r\n });\r\n const classname = 'focused-target';\r\n element.classList.add(classname);\r\n setTimeout(function () {\r\n if (element) {\r\n element.classList.remove(classname);\r\n }\r\n }, 2500);\r\n }\r\n }\r\n }\r\n }\r\n}, false);"]}