blob: 2d563d74660bb60c58078574031665777260cff1 [file] [log] [blame]
{"version":3,"sources":["public/js/kalamar-0.41.5-de.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","liElements","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","ADDTREE","SHOWANNO","SHOWINFO","DOWNLOAD","TOGGLE_ALIGN","SHOW_KQ","SHOW_META","NEW_QUERY","NEW_CONSTRAINT","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_glimpse","TOUR_help","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","foundry","_foundry","layer","_layer","addTree","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t","
","
","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","qs","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","retJSObj","responseText","status","statusText","send","legacy","docFragment","getJSON","getCollections","cq","getPluginList","putJSON","postJSON","deleteJSON","getQueryList","getQuery","qn","putQuery","postQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","pe"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n var main, req, makeMap, handlers,\r\n defined = {},\r\n waiting = {},\r\n config = {},\r\n defining = {},\r\n hasOwn = Object.prototype.hasOwnProperty,\r\n aps = [].slice,\r\n jsSuffixRegExp = /\\.js$/;\r\n\r\n function hasProp(obj, prop) {\r\n return hasOwn.call(obj, prop);\r\n }\r\n\r\n /**\r\n * Given a relative module name, like ./something, normalize it to\r\n * a real name that can be mapped to a path.\r\n * @param {String} name the relative name\r\n * @param {String} baseName a real name that the name arg is relative\r\n * to.\r\n * @returns {String} normalized name\r\n */\r\n function normalize(name, baseName) {\r\n var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n baseParts = baseName && baseName.split(\"/\"),\r\n map = config.map,\r\n starMap = (map && map['*']) || {};\r\n\r\n //Adjust any relative paths.\r\n if (name) {\r\n name = name.split('/');\r\n lastIndex = name.length - 1;\r\n\r\n // If wanting node ID compatibility, strip .js from end\r\n // of IDs. Have to do this here, and not in nameToUrl\r\n // because node allows either .js or non .js to map\r\n // to same file.\r\n if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n }\r\n\r\n // Starts with a '.' so need the baseName\r\n if (name[0].charAt(0) === '.' && baseParts) {\r\n //Convert baseName to array, and lop off the last part,\r\n //so that . matches that 'directory' and not name of the baseName's\r\n //module. For instance, baseName of 'one/two/three', maps to\r\n //'one/two/three.js', but we want the directory, 'one/two' for\r\n //this normalization.\r\n normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n name = normalizedBaseParts.concat(name);\r\n }\r\n\r\n //start trimDots\r\n for (i = 0; i < name.length; i++) {\r\n part = name[i];\r\n if (part === '.') {\r\n name.splice(i, 1);\r\n i -= 1;\r\n } else if (part === '..') {\r\n // If at the start, or previous value is still ..,\r\n // keep them so that when converted to a path it may\r\n // still work when converted to a path, even though\r\n // as an ID it is less than ideal. In larger point\r\n // releases, may be better to just kick out an error.\r\n if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n continue;\r\n } else if (i > 0) {\r\n name.splice(i - 1, 2);\r\n i -= 2;\r\n }\r\n }\r\n }\r\n //end trimDots\r\n\r\n name = name.join('/');\r\n }\r\n\r\n //Apply map config if available.\r\n if ((baseParts || starMap) && map) {\r\n nameParts = name.split('/');\r\n\r\n for (i = nameParts.length; i > 0; i -= 1) {\r\n nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n if (baseParts) {\r\n //Find the longest baseName segment match in the config.\r\n //So, do joins on the biggest to smallest lengths of baseParts.\r\n for (j = baseParts.length; j > 0; j -= 1) {\r\n mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n //baseName segment has config, find if it has one for\r\n //this name.\r\n if (mapValue) {\r\n mapValue = mapValue[nameSegment];\r\n if (mapValue) {\r\n //Match, update name to the new value.\r\n foundMap = mapValue;\r\n foundI = i;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (foundMap) {\r\n break;\r\n }\r\n\r\n //Check for a star map match, but just hold on to it,\r\n //if there is a shorter segment match later in a matching\r\n //config, then favor over this star map.\r\n if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n foundStarMap = starMap[nameSegment];\r\n starI = i;\r\n }\r\n }\r\n\r\n if (!foundMap && foundStarMap) {\r\n foundMap = foundStarMap;\r\n foundI = starI;\r\n }\r\n\r\n if (foundMap) {\r\n nameParts.splice(0, foundI, foundMap);\r\n name = nameParts.join('/');\r\n }\r\n }\r\n\r\n return name;\r\n }\r\n\r\n function makeRequire(relName, forceSync) {\r\n return function () {\r\n //A version of a require function that passes a moduleName\r\n //value for items that may need to\r\n //look up paths relative to the moduleName\r\n var args = aps.call(arguments, 0);\r\n\r\n //If first arg is not require('string'), and there is only\r\n //one arg, it is the array form without a callback. Insert\r\n //a null so that the following concat is correct.\r\n if (typeof args[0] !== 'string' && args.length === 1) {\r\n args.push(null);\r\n }\r\n return req.apply(undef, args.concat([relName, forceSync]));\r\n };\r\n }\r\n\r\n function makeNormalize(relName) {\r\n return function (name) {\r\n return normalize(name, relName);\r\n };\r\n }\r\n\r\n function makeLoad(depName) {\r\n return function (value) {\r\n defined[depName] = value;\r\n };\r\n }\r\n\r\n function callDep(name) {\r\n if (hasProp(waiting, name)) {\r\n var args = waiting[name];\r\n delete waiting[name];\r\n defining[name] = true;\r\n main.apply(undef, args);\r\n }\r\n\r\n if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n throw new Error('No ' + name);\r\n }\r\n return defined[name];\r\n }\r\n\r\n //Turns a plugin!resource to [plugin, resource]\r\n //with the plugin being undefined if the name\r\n //did not have a plugin prefix.\r\n function splitPrefix(name) {\r\n var prefix,\r\n index = name ? name.indexOf('!') : -1;\r\n if (index > -1) {\r\n prefix = name.substring(0, index);\r\n name = name.substring(index + 1, name.length);\r\n }\r\n return [prefix, name];\r\n }\r\n\r\n //Creates a parts array for a relName where first part is plugin ID,\r\n //second part is resource ID. Assumes relName has already been normalized.\r\n function makeRelParts(relName) {\r\n return relName ? splitPrefix(relName) : [];\r\n }\r\n\r\n /**\r\n * Makes a name map, normalizing the name, and using a plugin\r\n * for normalization if necessary. Grabs a ref to plugin\r\n * too, as an optimization.\r\n */\r\n makeMap = function (name, relParts) {\r\n var plugin,\r\n parts = splitPrefix(name),\r\n prefix = parts[0],\r\n relResourceName = relParts[1];\r\n\r\n name = parts[1];\r\n\r\n if (prefix) {\r\n prefix = normalize(prefix, relResourceName);\r\n plugin = callDep(prefix);\r\n }\r\n\r\n //Normalize according\r\n if (prefix) {\r\n if (plugin && plugin.normalize) {\r\n name = plugin.normalize(name, makeNormalize(relResourceName));\r\n } else {\r\n name = normalize(name, relResourceName);\r\n }\r\n } else {\r\n name = normalize(name, relResourceName);\r\n parts = splitPrefix(name);\r\n prefix = parts[0];\r\n name = parts[1];\r\n if (prefix) {\r\n plugin = callDep(prefix);\r\n }\r\n }\r\n\r\n //Using ridiculous property names for space reasons\r\n return {\r\n f: prefix ? prefix + '!' + name : name, //fullName\r\n n: name,\r\n pr: prefix,\r\n p: plugin\r\n };\r\n };\r\n\r\n function makeConfig(name) {\r\n return function () {\r\n return (config && config.config && config.config[name]) || {};\r\n };\r\n }\r\n\r\n handlers = {\r\n require: function (name) {\r\n return makeRequire(name);\r\n },\r\n exports: function (name) {\r\n var e = defined[name];\r\n if (typeof e !== 'undefined') {\r\n return e;\r\n } else {\r\n return (defined[name] = {});\r\n }\r\n },\r\n module: function (name) {\r\n return {\r\n id: name,\r\n uri: '',\r\n exports: defined[name],\r\n config: makeConfig(name)\r\n };\r\n }\r\n };\r\n\r\n main = function (name, deps, callback, relName) {\r\n var cjsModule, depName, ret, map, i, relParts,\r\n args = [],\r\n callbackType = typeof callback,\r\n usingExports;\r\n\r\n //Use name if no relName\r\n relName = relName || name;\r\n relParts = makeRelParts(relName);\r\n\r\n //Call the callback to define the module, if necessary.\r\n if (callbackType === 'undefined' || callbackType === 'function') {\r\n //Pull out the defined dependencies and pass the ordered\r\n //values to the callback.\r\n //Default to [require, exports, module] if no deps\r\n deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n for (i = 0; i < deps.length; i += 1) {\r\n map = makeMap(deps[i], relParts);\r\n depName = map.f;\r\n\r\n //Fast path CommonJS standard dependencies.\r\n if (depName === \"require\") {\r\n args[i] = handlers.require(name);\r\n } else if (depName === \"exports\") {\r\n //CommonJS module spec 1.1\r\n args[i] = handlers.exports(name);\r\n usingExports = true;\r\n } else if (depName === \"module\") {\r\n //CommonJS module spec 1.1\r\n cjsModule = args[i] = handlers.module(name);\r\n } else if (hasProp(defined, depName) ||\r\n hasProp(waiting, depName) ||\r\n hasProp(defining, depName)) {\r\n args[i] = callDep(depName);\r\n } else if (map.p) {\r\n map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n args[i] = defined[depName];\r\n } else {\r\n throw new Error(name + ' missing ' + depName);\r\n }\r\n }\r\n\r\n ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n if (name) {\r\n //If setting exports via \"module\" is in play,\r\n //favor that over return value and exports. After that,\r\n //favor a non-undefined return value over exports use.\r\n if (cjsModule && cjsModule.exports !== undef &&\r\n cjsModule.exports !== defined[name]) {\r\n defined[name] = cjsModule.exports;\r\n } else if (ret !== undef || !usingExports) {\r\n //Use the return value from the function.\r\n defined[name] = ret;\r\n }\r\n }\r\n } else if (name) {\r\n //May just be an object definition for the module. Only\r\n //worry about defining if have a module name.\r\n defined[name] = callback;\r\n }\r\n };\r\n\r\n requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n if (typeof deps === \"string\") {\r\n if (handlers[deps]) {\r\n //callback in this case is really relName\r\n return handlers[deps](callback);\r\n }\r\n //Just return the module wanted. In this scenario, the\r\n //deps arg is the module name, and second arg (if passed)\r\n //is just the relName.\r\n //Normalize module name, if it contains . or ..\r\n return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n } else if (!deps.splice) {\r\n //deps is a config object, not an array.\r\n config = deps;\r\n if (config.deps) {\r\n req(config.deps, config.callback);\r\n }\r\n if (!callback) {\r\n return;\r\n }\r\n\r\n if (callback.splice) {\r\n //callback is an array, which means it is a dependency list.\r\n //Adjust args if there are dependencies\r\n deps = callback;\r\n callback = relName;\r\n relName = null;\r\n } else {\r\n deps = undef;\r\n }\r\n }\r\n\r\n //Support require(['a'])\r\n callback = callback || function () {};\r\n\r\n //If relName is a function, it is an errback handler,\r\n //so remove it.\r\n if (typeof relName === 'function') {\r\n relName = forceSync;\r\n forceSync = alt;\r\n }\r\n\r\n //Simulate async callback;\r\n if (forceSync) {\r\n main(undef, deps, callback, relName);\r\n } else {\r\n //Using a non-zero value because of concern for what old browsers\r\n //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n //If want a value immediately, use require('id') instead -- something\r\n //that works in almond on the global level, but not guaranteed and\r\n //unlikely to work in other AMD implementations.\r\n setTimeout(function () {\r\n main(undef, deps, callback, relName);\r\n }, 4);\r\n }\r\n\r\n return req;\r\n };\r\n\r\n /**\r\n * Just drops the config on the floor, but returns req in case\r\n * the config return value is used.\r\n */\r\n req.config = function (cfg) {\r\n return req(cfg);\r\n };\r\n\r\n /**\r\n * Expose module registry for debugging and tooling\r\n */\r\n requirejs._defined = defined;\r\n\r\n define = function (name, deps, callback) {\r\n if (typeof name !== 'string') {\r\n throw new Error('See almond README: incorrect module build, no module name');\r\n }\r\n\r\n //This module may not have dependencies\r\n if (!deps.splice) {\r\n //deps is not an array, so probably means\r\n //an object literal or factory function for\r\n //the value. Adjust args.\r\n callback = deps;\r\n deps = [];\r\n }\r\n\r\n if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n waiting[name] = [name, deps, callback];\r\n }\r\n };\r\n\r\n define.amd = {\r\n jQuery: true\r\n };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n // Don't let events bubble up\r\n Event.prototype.halt = function () {\r\n this.stopPropagation();\r\n this.preventDefault();\r\n };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n const cl = this.classList;\r\n if (cl.contains(c1)) {\r\n cl.add(c2);\r\n cl.remove(c1);\r\n }\r\n else {\r\n cl.remove(c2);\r\n cl.add(c1);\r\n };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n // Remove everything underneath\r\n while (node.firstChild)\r\n node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n if ((e.charCode) && (e.keyCode==0))\r\n return e.charCode\r\n return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n const arr = new Uint8Array((len || 40) / 2)\r\n window.crypto.getRandomValues(arr)\r\n return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n // Todo: That's double now!\r\n KorAP.API = KorAP.API || {};\r\n KorAP.Locale = KorAP.Locale || {};\r\n\r\n const loc = KorAP.Locale;\r\n loc.OR = loc.OR || 'or';\r\n loc.AND = loc.AND || 'and';\r\n\r\n // Add new stylesheet object lazily to document\r\n KorAP.newStyleSheet = function () {\r\n if (KorAP._sheet === undefined) {\r\n const sElem = document.createElement('style');\r\n document.head.appendChild(sElem);\r\n KorAP._sheet = sElem.sheet;\r\n };\r\n return KorAP._sheet;\r\n };\r\n\r\n\r\n // Default log message\r\n KorAP.log = KorAP.log || function (type, msg, src) {\r\n if (src)\r\n msg += ' from ' + src;\r\n console.log(type + \": \" + msg);\r\n };\r\n\r\n return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n const ah = KorAP.annotationHelper;\r\n\r\n ah.getDesc = function (foundryLayer, value) {\r\n\r\n if (!foundryLayer)\r\n return;\r\n\r\n let anno = this[foundryLayer];\r\n\r\n if (!anno)\r\n return;\r\n\r\n if (!value.includes(':')) {\r\n value += ' ';\r\n\r\n // Iterate over all annotations and add the descriptions\r\n // This is a classic hash-lookup-case, but we have\r\n // to deal with lists ...\r\n for (var i = 0; i < anno.length; i++) {\r\n if (anno[i] &&\r\n anno[i][1] == value) {\r\n if (anno[i][2])\r\n return anno[i][2];\r\n else\r\n return;\r\n };\r\n };\r\n\r\n return;\r\n }\r\n\r\n else {\r\n const v = value.split(\":\");\r\n let l1 = v[0] + ':';\r\n let l2 = v[1] + ' ';\r\n let text = '';\r\n\r\n // Add key description\r\n for (let i = 0; i < anno.length; i++) {\r\n if (anno[i] &&\r\n anno[i][1] == l1) {\r\n if (anno[i][2])\r\n text += anno[i][2];\r\n else\r\n text += anno[i][0];\r\n break;\r\n };\r\n };\r\n\r\n // Nothing found\r\n if (text.length === 0)\r\n return;\r\n\r\n // Check next level\r\n anno = this[foundryLayer + l1];\r\n\r\n if (!anno)\r\n return;\r\n\r\n // Add value description\r\n for (let i = 0; i < anno.length; i++) {\r\n if (anno[i] &&\r\n anno[i][1] == l2) {\r\n if (anno[i][2])\r\n text += ': ' + anno[i][2];\r\n\r\n return text;\r\n };\r\n }; \r\n };\r\n\r\n return '';\r\n };\r\n\r\n return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n ah[\"-\"].push(\r\n [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n );\r\n\r\n ah[\"base/s=\"] = [\r\n [\"s\", \"s\", \"Sentence\"],\r\n [\"p\", \"p\", \"Paragraph\"],\r\n [\"t\", \"t\", \"Text\"]\r\n ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n ah[\"-\"].push(\r\n [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n );\r\n});\r\n\nrequire([\r\n \"hint/foundries/base\",\r\n \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n /**\r\n * Create a new MenuItem object.\r\n *\r\n * @constructor\r\n * @this {MenuItem}\r\n * @param {Array.<string>} An array object of name, action and\r\n * optionally a description\r\n */\r\n create : function (params) {\r\n return Object.create(this)._init(params);\r\n },\r\n\r\n\r\n /**\r\n * Upgrade this object to another object,\r\n * while private data stays intact.\r\n *\r\n * @param {Object] An object with properties.\r\n */\r\n upgradeTo : function (props) {\r\n for (let prop in props) {\r\n this[prop] = props[prop];\r\n };\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Get or set the content of the meun item.\r\n */\r\n content : function (content) {\r\n if (arguments.length === 1)\r\n this._content = document.createTextNode(content);\r\n return this._content;\r\n },\r\n\r\n\r\n /**\r\n * Get or set the information for action of this item. \r\n */\r\n action : function (action) {\r\n if (arguments.length === 1)\r\n this._action = action;\r\n return this._action;\r\n },\r\n \r\n\r\n /**\r\n * Get the lower cased field of the item\r\n * (used for analyses).\r\n */\r\n lcField : function () {\r\n return this._lcField;\r\n },\r\n\r\n\r\n /**\r\n * Check or set if the item is active\r\n *\r\n * @param {boolean|null} State of activity\r\n */\r\n active : function (bool) {\r\n const cl = this.element().classList;\r\n if (bool === undefined)\r\n return cl.contains(\"active\");\r\n else if (bool)\r\n cl.add(\"active\");\r\n else\r\n cl.remove(\"active\");\r\n },\r\n\r\n\r\n /**\r\n * Check or set if the item is\r\n * at the boundary of the menu\r\n * list\r\n *\r\n * @param {boolean|null} State of activity\r\n */\r\n noMore : function (bool) {\r\n const cl = this.element().classList;\r\n if (bool === undefined)\r\n return cl.contains(\"no-more\");\r\n else if (bool)\r\n cl.add(\"no-more\");\r\n else\r\n cl.remove(\"no-more\");\r\n },\r\n \r\n /**\r\n * Get the document element of the menu item\r\n */\r\n element : function () {\r\n // already defined\r\n if (this._el !== undefined)\r\n return this._el;\r\n \r\n // Create list item\r\n const li = document.createElement(\"li\");\r\n\r\n // Connect action\r\n if (this[\"onclick\"] !== undefined) {\r\n li[\"onclick\"] = this.onclick.bind(this);\r\n };\r\n\r\n // Append template\r\n li.appendChild(this.content());\r\n \r\n return this._el = li;\r\n },\r\n\r\n /**\r\n * Highlight parts of the item\r\n *\r\n * @param {string} Prefix string for highlights\r\n */\r\n highlight : function (prefix) {\r\n\r\n // The prefix already matches\r\n if (this._prefix === prefix)\r\n return;\r\n\r\n // There is a prefix but it doesn't match\r\n if (this._prefix !== null) {\r\n this.lowlight();\r\n }\r\n\r\n const children = this.element().childNodes;\r\n for (let i = children.length -1; i >= 0; i--) {\r\n this._highlight(children[i], prefix);\r\n };\r\n\r\n this._prefix = prefix;\r\n },\r\n\r\n\r\n /**\r\n * Remove highlight of the menu item\r\n */\r\n lowlight : function () {\r\n if (this._prefix === null)\r\n return;\r\n\r\n const e = this.element();\r\n \r\n const marks = e.getElementsByTagName(\"mark\");\r\n\r\n for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n // Replace with content\r\n marks[i].parentNode.replaceChild(\r\n // Create text node clone\r\n\t document.createTextNode(\r\n\t marks[i].firstChild.nodeValue\r\n ),\r\n\t marks[i]\r\n );\r\n };\r\n\r\n // Remove consecutive textnodes\r\n e.normalize();\r\n this._prefix = null;\r\n },\r\n\r\n\r\n // Highlight a certain substring of the menu item\r\n _highlight : function (elem, prefixString) { \r\n if (elem.nodeType === 3) {\r\n \r\n const text = elem.nodeValue;\r\n const textlc = text.toLowerCase();\r\n\r\n // Split prefixes\r\n if (prefixString) {\r\n\r\n // ND:\r\n // Doing this in a single line can trigger\r\n // a deep-recursion in Firefox 57.01, though I don't know why.\r\n prefixString = prefixString.trim();\r\n\r\n const prefixes = prefixString.split(\" \");\r\n\r\n let testPos,\r\n pos = -1,\r\n len = 0;\r\n\r\n // Iterate over all prefixes and get the best one\r\n // for (var i = 0; i < prefixes.length; i++) {\r\n prefixes.forEach(function(i) {\r\n\r\n // Get first pos of a matching prefix\r\n testPos = textlc.indexOf(i);\r\n if (testPos < 0)\r\n return;\r\n\r\n if (pos === -1 || testPos < pos) {\r\n pos = testPos;\r\n len = i.length;\r\n }\r\n else if (testPos === pos && i.length > len) {\r\n len = i.length;\r\n };\r\n });\r\n\r\n // Matches!\r\n if (pos >= 0) {\r\n\t\r\n\t // First element\r\n\t if (pos > 0) {\r\n\t elem.parentNode.insertBefore(\r\n\t document.createTextNode(text.substr(0, pos)),\r\n\t elem\r\n\t );\r\n\t };\r\n\t\r\n\t // Second element\r\n\t const hl = document.createElement(\"mark\");\r\n\t hl.appendChild(\r\n\t document.createTextNode(text.substr(pos, len))\r\n\t );\r\n\t elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t // Third element\r\n\t const third = text.substr(pos + len);\r\n\r\n\t if (third.length > 0) {\r\n\t const thirdE = document.createTextNode(third);\r\n\t elem.parentNode.insertBefore(\r\n\t thirdE,\r\n\t elem\r\n\t );\r\n\t this._highlight(thirdE, prefixString);\r\n\t };\r\n\t\r\n elem.parentNode.removeChild(elem);\r\n };\r\n };\r\n }\r\n\r\n else {\r\n const children = elem.childNodes;\r\n for (let i = children.length -1; i >= 0; i--) {\r\n\t this._highlight(children[i], prefixString);\r\n };\r\n };\r\n },\r\n\r\n // Initialize menu item\r\n _init : function (params) {\r\n \r\n if (params[0] === undefined) {\r\n throw new Error(\"Missing parameters\");\r\n };\r\n\r\n const t = this;\r\n\r\n t.content(params[0]);\r\n \r\n if (params.length > 1) {\r\n t._action = params[1];\r\n\r\n if (params.length > 2)\r\n t._onclick = params[2];\r\n };\r\n \r\n t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n t._prefix = null;\r\n\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * The click action of the menu item.\r\n */\r\n onclick : function (e) {\r\n const m = this.menu();\r\n\r\n // Reset prefix\r\n m.prefix(\"\");\r\n\r\n if (this._onclick)\r\n this._onclick.apply(this, e);\r\n\r\n m.hide();\r\n },\r\n\r\n \r\n /**\r\n * Return menu list.\r\n */\r\n menu : function () {\r\n return this._menu;\r\n }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n /**\r\n * Create new prefix object.\r\n */\r\n create : function () {\r\n return Object.create(this)._init();\r\n },\r\n\r\n\r\n // Initialize prefix object\r\n _init : function () {\r\n const t = this;\r\n\r\n t._string = '';\r\n\r\n // Add prefix span\r\n t._el = document.createElement('span');\r\n t._el.classList.add('non-item');\r\n t._el.classList.add('pref');\r\n // Connect action\r\n\r\n if (t[\"onclick\"] !== undefined)\r\n t._el[\"onclick\"] = t.onclick.bind(t);\r\n \r\n return t;\r\n },\r\n\r\n\r\n _update : function () {\r\n return this._el.innerHTML\r\n = this._string;\r\n },\r\n\r\n\r\n /**\r\n * Upgrade this object to another object,\r\n * while private data stays intact.\r\n *\r\n * @param {Object} An object with properties.\r\n */\r\n upgradeTo : function (props) {\r\n for (let prop in props) {\r\n this[prop] = props[prop];\r\n };\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Get or set the activity status of the prefix.\r\n */\r\n active : function (bool) {\r\n const cl = this.element().classList;\r\n if (bool === undefined)\r\n return cl.contains(\"active\");\r\n else if (bool)\r\n cl.add(\"active\");\r\n else\r\n cl.remove(\"active\");\r\n },\r\n\r\n\r\n /**\r\n * Check, if a prefix is given or not.\r\n */\r\n isSet : function () {\r\n return this._string.length > 0 ?\r\n true : false;\r\n },\r\n\r\n\r\n /**\r\n * Get or set the prefix string.\r\n */\r\n value : function (string) {\r\n if (arguments.length === 1) {\r\n this._string = string;\r\n return this._update();\r\n };\r\n return this._string;\r\n },\r\n\r\n\r\n /**\r\n * Add string to prefix.\r\n */\r\n add : function (string) {\r\n this._string += string;\r\n return this._update();\r\n },\r\n \r\n\r\n /**\r\n * Clear prefix\r\n */\r\n clear : function () {\r\n this._string = '';\r\n return this._update();\r\n },\r\n\r\n\r\n /**\r\n * Action method.\r\n * Expected to be overridden.\r\n */\r\n onclick : function () {},\r\n\r\n \r\n /**\r\n * Remove the last character of the string\r\n */\r\n chop : function () {\r\n const t = this;\r\n\r\n // Prefix is long enough for backspace\r\n if (t._string.length > 1) {\r\n t._string = t._string.substring(\r\n\t 0, t._string.length - 1\r\n );\r\n }\r\n else {\r\n t._string = '';\r\n };\r\n \r\n return t._update();\r\n },\r\n\r\n\r\n /**\r\n * Get the associated dom element.\r\n */\r\n element : function () {\r\n return this._el;\r\n },\r\n\r\n\r\n /**\r\n * Return menu list.\r\n */\r\n menu : function () {\r\n return this._menu;\r\n }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n /**\r\n * Create new lengthField object.\r\n */\r\n create : function () {\r\n return Object.create(this)._init();\r\n },\r\n\r\n\r\n // Initialize lengthField object\r\n _init : function () {\r\n this._el = document.createElement('div');\r\n this._el.classList.add('lengthField');\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Upgrade this object to another object,\r\n * while private data stays intact.\r\n *\r\n * @param {Object} An object with properties.\r\n */\r\n upgradeTo : function (props) {\r\n for (let prop in props) {\r\n this[prop] = props[prop];\r\n };\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Get the associated dom element.\r\n */\r\n element : function () {\r\n return this._el;\r\n },\r\n\r\n\r\n /**\r\n * Add string to lengthField.\r\n */\r\n add : function (param) {\r\n this._el.appendChild(document.createElement('span'))\r\n .appendChild(document.createTextNode(param[0] + '--'));\r\n },\r\n\r\n\r\n /**\r\n * Remove all initialized values\r\n */\r\n reset : function () {\r\n while (this._el.firstChild) {\r\n this._el.firstChild.remove();\r\n };\r\n }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n /**\r\n * Create new slider for Menu.\r\n * @this {Slider}\r\n * @constructor\r\n * @param {Menu} menu object\r\n */\r\n create : function (menu) {\r\n return Object.create(this)._init(menu);\r\n },\r\n\r\n\r\n /**\r\n * Length attribute of the slider\r\n * (as number of items).\r\n *\r\n * @param {number} Number of items (optional)\r\n */\r\n length : function (i) {\r\n if (arguments.length === 0)\r\n return this._length;\r\n if (i == this._length)\r\n return this;\r\n this._length = i;\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Limit of items per screen.\r\n *\r\n * @param {number} Number of items per screen (optional)\r\n */\r\n limit : function (i) {\r\n if (arguments.length === 0)\r\n return this._limit;\r\n if (i == this._limit)\r\n return this;\r\n this._limit = i;\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Is the slider active or not.\r\n *\r\n * @param {bool} true or false (optional)\r\n */\r\n active : function (bool) {\r\n if (arguments.length === 1) {\r\n if (bool) {\r\n\t if (!this._active) {\r\n\t this._el.classList.add('active');\r\n\t this._active = true;\r\n\t };\r\n }\r\n else if (this._active) {\r\n\t this._el.classList.remove('active');\r\n\t this._active = false;\r\n }\r\n };\r\n return this._active;\r\n },\r\n\r\n\r\n /**\r\n * Move the slider to a relative position\r\n *\r\n * @param {number} relative position\r\n */\r\n movetoRel : function (relativePos) {\r\n\r\n // This is important to find the correct percentage!\r\n const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n const relativeOffset = (relativePos / diffHeight);\r\n\r\n // Offset is a value 0 to this._screens\r\n const off = this.offset(\r\n parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n );\r\n\r\n if (off !== undefined) {\r\n this._menu.screen(off);\r\n };\r\n },\r\n\r\n\r\n /**\r\n * Move the slider to an absolute position\r\n *\r\n * @param {number} absolute position\r\n */\r\n movetoAbs : function (absPos) {\r\n const absOffset = (absPos / this._rulerHeight);\r\n const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n if (off !== undefined) {\r\n this._menu.screen(off);\r\n };\r\n },\r\n\r\n\r\n /**\r\n * Screen offset of the slider\r\n *\r\n * @param {number} Offset position of the slider (optional)\r\n */\r\n offset : function (off) {\r\n if (arguments.length === 0)\r\n return this._offset;\r\n\r\n // Normalize offset\r\n if (off > this._screens)\r\n off = this._screens;\r\n else if (off < 0)\r\n off = 0;\r\n\r\n // Identical with old value\r\n if (off === this._offset)\r\n return undefined;\r\n\r\n // Set offset and move\r\n this._offset = off;\r\n this._slider.style.top = (this._step * off) + '%';\r\n return off;\r\n },\r\n\r\n\r\n /**\r\n * Get the associated dom element.\r\n */\r\n element : function () {\r\n return this._el;\r\n },\r\n\r\n\r\n /**\r\n * Reinitialize the size of the slider.\r\n * Necessary to call after each adjustment of the list.\r\n */\r\n reInit : function () {\r\n\r\n const t = this;\r\n const s = t._el.style;\r\n\r\n // Do not show the slider, in case there is nothing to scroll\r\n if (t._length <= t._limit) {\r\n s.display = 'none';\r\n return;\r\n }\r\n else {\r\n s.display = 'block';\r\n };\r\n\r\n t._height = ((t._limit / t._length) * 100);\r\n t._screens = t._length - t._limit;\r\n t._step = (100 - t._height) / t._screens;\r\n t._slider.style.height = t._height + '%';\r\n },\r\n\r\n\r\n // Initialize prefix object\r\n _init : function (menu) {\r\n const t = this;\r\n\r\n t._menu = menu;\r\n\r\n t._offset = 0;\r\n t._event = {};\r\n t._active = false;\r\n\r\n const el = t._el = document.createElement('div');\r\n el.setAttribute('class', 'ruler');\r\n\r\n t._slider = el.appendChild(\r\n document.createElement('span')\r\n );\r\n\r\n t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n // Do not mark the menu on mousedown\r\n t._ruler.addEventListener('mousedown', function (e) {\r\n e.halt()\r\n }, false);\r\n\r\n // Move the slider to the click position\r\n t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n return t;\r\n },\r\n\r\n\r\n // Reinit height based on dom position\r\n _initClientHeight : function () {\r\n this._rulerHeight = this._el.clientHeight;\r\n this._sliderHeight = this._slider.clientHeight;\r\n },\r\n\r\n\r\n // Release mousemove event\r\n _mousemove : function (e) {\r\n this.movetoRel(e.clientY - this._event.init);\r\n e.halt();\r\n },\r\n\r\n\r\n // Release mouseup event\r\n _mouseup : function (e) {\r\n this.active(false);\r\n window.removeEventListener('mousemove', this._event.mov);\r\n window.removeEventListener('mouseup', this._event.up);\r\n this._menu.focus();\r\n },\r\n\r\n\r\n // Release mousedown event\r\n _mousedown : function (e) {\r\n // Bind drag handler\r\n const ev = this._event;\r\n\r\n // _step * _offset is the distance of the ruler to the top\r\n ev.init = e.clientY;\r\n ev.initOffset = this._offset;\r\n // By substracting that, it is like initializing to the first point\r\n\r\n ev.mov = this._mousemove.bind(this);\r\n ev.up = this._mouseup.bind(this);\r\n\r\n // TODO: This may not be necessary all the time\r\n this._initClientHeight();\r\n\r\n this.active(true);\r\n\r\n window.addEventListener('mousemove', ev.mov);\r\n window.addEventListener('mouseup', ev.up);\r\n\r\n e.halt();\r\n },\r\n\r\n\r\n // Release event to reposition slider on ruler\r\n _mouseclick : function (e) {\r\n this._initClientHeight();\r\n\r\n this.movetoAbs(\r\n e.clientY - this._ruler.getClientRects()[0].top\r\n );\r\n e.halt();\r\n }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n * or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n 'menu/item',\r\n 'menu/prefix',\r\n 'menu/lengthField',\r\n 'menu/slider',\r\n 'util'\r\n], function (defaultItemClass,\r\n defaultPrefixClass,\r\n defaultLengthFieldClass,\r\n sliderClass) {\r\n\r\n // Default maximum number of menu items\r\n const menuLimit = 8;\r\n\r\n /**\r\n * List of items for drop down menu (complete).\r\n * Only a sublist of the menu is filtered (live).\r\n * Only a sublist of the filtered menu is visible (shown).\r\n */\r\n return {\r\n /**\r\n * Create new Menu based on the action prefix\r\n * and a list of menu items.\r\n *\r\n *\r\n * Accepts an associative array containg the elements\r\n * itemClass, prefixClass, lengthFieldClass\r\n *\r\n * @this {Menu}\r\n * @constructor\r\n * @param {string} Context prefix\r\n * @param {Array.<Array.<string>>} List of menu items\r\n */\r\n create : function (list, params) {\r\n return Object.create(this)._init(list, params);\r\n },\r\n\r\n // Initialize list\r\n _init : function (list, params) {\r\n \r\n if (params === undefined)\r\n params = {};\r\n\r\n const t = this;\r\n\r\n t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n // Add prefix object\r\n if (params[\"prefixClass\"] !== undefined) {\r\n t._prefix = params[\"prefixClass\"].create();\r\n }\r\n else {\r\n t._prefix = defaultPrefixClass.create();\r\n };\r\n t._prefix._menu = t;\r\n\r\n // Add lengthField object\r\n if (params[\"lengthFieldClass\"] !== undefined) {\r\n t._lengthField = params[\"lengthFieldClass\"].create();\r\n }\r\n else {\r\n t._lengthField = defaultLengthFieldClass.create();\r\n };\r\n t._lengthField._menu = t;\r\n\r\n // Initialize slider\r\n t._slider = sliderClass.create(t);\r\n\r\n // Create the element\r\n var el = document.createElement(\"ul\");\r\n el.style.outline = 0;\r\n el.setAttribute('tabindex', 0);\r\n el.classList.add('menu', 'roll');\r\n el.appendChild(t._prefix.element());\r\n el.appendChild(t._lengthField.element());\r\n el.appendChild(t._slider.element());\r\n\r\n // This has to be cleaned up later on\r\n el[\"menu\"] = t;\r\n\r\n // Arrow keys\r\n el.addEventListener(\r\n 'keydown',\r\n t._keydown.bind(t),\r\n false\r\n );\r\n\r\n // Strings\r\n el.addEventListener(\r\n 'keypress',\r\n t._keypress.bind(t),\r\n false\r\n );\r\n\r\n // Mousewheel\r\n el.addEventListener(\r\n 'wheel',\r\n t._mousewheel.bind(t),\r\n false\r\n );\r\n\r\n // Touch events\r\n ['touchstart', 'touchend', 'touchmove'].forEach(\r\n e => el.addEventListener(e, t._touch.bind(t), false)\r\n );\r\n\r\n \r\n t._el = el;\r\n\r\n t._limit = menuLimit;\r\n \r\n t._items = new Array();\r\n\r\n // TODO:\r\n // Make this separate from _init\r\n t.readItems(list);\r\n\r\n t.dontHide = false;\r\n \r\n return t;\r\n },\r\n\r\n // Read items to add to list\r\n readItems : function (list) {\r\n const t = this;\r\n\r\n t._list = undefined;\r\n\r\n // Remove circular reference to \"this\" in items\r\n for (let i = 0; i < t._items.length; i++) {\r\n delete t._items[i][\"_menu\"];\r\n delete t._items[i];\r\n };\r\n\r\n t._items = new Array();\r\n t.removeItems();\r\n\r\n\r\n // Initialize items\r\n t._lengthField.reset();\r\n\r\n // Initialize item list based on parameters\r\n list.forEach(function(i){\r\n const obj = this._itemClass.create(i);\r\n\r\n // This may become circular\r\n obj[\"_menu\"] = this;\r\n this._lengthField.add(i);\r\n this._items.push(obj);\r\n }, t);\r\n\r\n t._slider.length(t.liveLength())\r\n .limit(t._limit)\r\n .reInit();\r\n \r\n t._firstActive = false;\r\n // Show the first item active always?\r\n t.offset = 0;\r\n t.position = 0;\r\n },\r\n \r\n // Initialize the item list\r\n _initList : function () {\r\n const t = this;\r\n\r\n // Create a new list\r\n if (t._list === undefined) {\r\n t._list = [];\r\n }\r\n else if (t._list.length !== 0) {\r\n t._boundary(false);\r\n t._list.length = 0;\r\n };\r\n\r\n // Offset is initially zero\r\n t.offset = 0;\r\n\r\n // There is no prefix set\r\n if (t.prefix().length <= 0) {\r\n\r\n // add all items to the list and lowlight\r\n let i = 0;\r\n for (; i < t._items.length; i++) {\r\n t._list.push(i);\r\n t._items[i].lowlight();\r\n };\r\n\r\n t._slider.length(i).reInit();\r\n\r\n return true;\r\n };\r\n\r\n /*\r\n * There is a prefix set, so filter the list!\r\n */\r\n let pos;\r\n const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n const items = [];\r\n let maxPoints = 1; // minimum 1\r\n\r\n // Iterate over all items and choose preferred matching items\r\n // i.e. the matching happens at the word start\r\n t._items.forEach(function(it, pos){\r\n\r\n let points = 0;\r\n\r\n prefixList.forEach(function(p) {\r\n\r\n // Check if it matches at the beginning\r\n if ((it.lcField().includes(\" \" + p))) {\r\n points += 5;\r\n }\r\n\r\n // Check if it matches anywhere\r\n else if (it.lcField().includes(p)) {\r\n points += 1;\r\n };\r\n });\r\n\r\n if (points > maxPoints) {\r\n this._list = [pos];\r\n maxPoints = points;\r\n }\r\n else if (points == maxPoints) {\r\n this._list.push(pos);\r\n }\r\n }, t);\r\n\r\n t._slider.length(t._list.length).reInit();\r\n\r\n // Filter was successful - yeah!\r\n return t._list.length > 0 ? true : false;\r\n },\r\n\r\n\r\n /**\r\n * Destroy this menu\r\n * (in case you don't trust the\r\n * mark and sweep GC)!\r\n */\r\n destroy : function () {\r\n const t = this;\r\n\r\n // Remove circular reference to \"this\" in menu\r\n if (t._el != undefined)\r\n delete t._el[\"menu\"]; \r\n\r\n // Remove circular reference to \"this\" in items\r\n t._items.forEach(function(i) {\r\n delete i[\"_menu\"];\r\n });\r\n\r\n // Remove circular reference to \"this\" in prefix\r\n delete t._prefix['_menu'];\r\n delete t._lengthField['_menu'];\r\n delete t._slider['_menu'];\r\n },\r\n\r\n\r\n /**\r\n * Focus on this menu.\r\n */\r\n focus : function () {\r\n this._el.focus();\r\n },\r\n\r\n\r\n // mouse wheel treatment\r\n _mousewheel : function (e) {\r\n const delta = e.deltaY / 120;\r\n if (delta > 0)\r\n this.next();\r\n else if (delta < 0)\r\n this.prev();\r\n e.halt();\r\n },\r\n\r\n\r\n // touchmove treatment\r\n _touch : function (e) {\r\n const s = this.slider();\r\n\r\n if (e.type === \"touchstart\") {\r\n this._lastTouch = e.touches[0].clientY;\r\n }\r\n else if (e.type === \"touchend\") {\r\n this._lastTouch = undefined;\r\n }\r\n else if (e.type === \"touchmove\") {\r\n const to = e.touches[0];\r\n\r\n // TODO:\r\n // Instead of using 26px, choose the item height\r\n // or use the menu height // shownItems\r\n \r\n // s.movetoRel(t.clientY - this._initTouch);\r\n if ((this._lastTouch + 26) < to.clientY) {\r\n this.viewDown();\r\n this._lastTouch = to.clientY;\r\n }\r\n else if ((this._lastTouch - 26) > to.clientY) {\r\n this.viewUp();\r\n this._lastTouch = to.clientY;\r\n }\r\n e.halt();\r\n };\r\n },\r\n\r\n // Arrow key and prefix treatment\r\n _keydown : function (e) {\r\n const t = this;\r\n\r\n switch (_codeFromEvent(e)) {\r\n\r\n case 27: // 'Esc'\r\n e.halt();\r\n t.hide();\r\n break;\r\n\r\n case 38: // 'Up'\r\n e.halt();\r\n t.prev();\r\n break;\r\n\r\n case 33: // 'Page up'\r\n e.halt();\r\n t.pageUp();\r\n break;\r\n\r\n case 40: // 'Down'\r\n e.halt();\r\n t.next();\r\n break;\r\n\r\n case 34: // 'Page down'\r\n e.halt();\r\n t.pageDown();\r\n break;\r\n\r\n case 39: // 'Right'\r\n if (t._prefix.active())\r\n break;\r\n\r\n const item = t.liveItem(t.position);\r\n \r\n if (item[\"further\"] !== undefined) {\r\n item[\"further\"].bind(item).apply();\r\n };\r\n \r\n e.halt();\r\n break;\r\n\r\n case 13: // 'Enter'\r\n // Click on prefix\r\n if (t._prefix.active())\r\n t._prefix.onclick(e);\r\n\r\n // Click on item\r\n else\r\n t.liveItem(t.position).onclick(e);\r\n e.halt();\r\n break;\r\n\r\n case 8: // 'Backspace'\r\n t._prefix.chop();\r\n t.show();\r\n e.halt();\r\n break;\r\n };\r\n },\r\n\r\n\r\n // Add characters to prefix\r\n _keypress : function (e) {\r\n if (e.charCode !== 0) {\r\n e.halt();\r\n \r\n // Add prefix\r\n this._prefix.add(\r\n String.fromCharCode(_codeFromEvent(e))\r\n );\r\n\r\n this.show();\r\n };\r\n },\r\n\r\n\r\n /**\r\n * Show a screen with a given offset\r\n * in the viewport.\r\n */\r\n screen : function (nr) {\r\n const t = this;\r\n\r\n // Normalize negative values\r\n if (nr < 0) {\r\n nr = 0\r\n }\r\n\r\n // The shown list already shows everything\r\n else if (t.liveLength() < t.limit()) {\r\n return false;\r\n }\r\n\r\n // Move relatively to the next screen\r\n else if (nr > (t.liveLength() - t.limit())) {\r\n nr = (t.liveLength() - t.limit());\r\n };\r\n\r\n // no change\r\n if (t.offset === nr)\r\n return false;\r\n\r\n t._showItems(nr);\r\n\r\n return true;\r\n },\r\n\r\n\r\n /**\r\n * Get the associated dom element.\r\n */\r\n element : function () {\r\n return this._el;\r\n },\r\n\r\n\r\n /**\r\n * Get the creator class for items\r\n */\r\n itemClass : function () {\r\n return this._itemClass;\r\n },\r\n\r\n\r\n /**\r\n * Get and set the numerical value\r\n * for the maximum number of items visible.\r\n */\r\n limit : function (limit) {\r\n if (arguments.length === 1) {\r\n if (this._limit !== limit) {\r\n this._limit = limit;\r\n this._slider.limit(limit).reInit();\r\n };\r\n return this;\r\n };\r\n return this._limit;\r\n },\r\n\r\n\r\n /**\r\n * Upgrade this object to another object,\r\n * while private data stays intact.\r\n *\r\n * @param {Object} An object with properties.\r\n */\r\n upgradeTo : function (props) {\r\n for (var prop in props) {\r\n this[prop] = props[prop];\r\n };\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Filter the list and make it visible.\r\n * This is always called once the prefix changes.\r\n *\r\n * @param {string} Prefix for filtering the list\r\n */\r\n show : function (active) {\r\n const t = this;\r\n\r\n // show menu based on initial offset\r\n t._unmark(); // Unmark everything that was marked before\r\n t.removeItems();\r\n\r\n // Initialize the list\r\n if (!t._initList()) {\r\n\r\n // The prefix is not active\r\n t._prefix.active(true);\r\n\r\n // finally show the element\r\n t._el.classList.add('visible');\r\n \r\n return true;\r\n };\r\n\r\n let offset = 0;\r\n\r\n // Set a chosen value to active and move the viewport\r\n if (arguments.length === 1) {\r\n\r\n // Normalize active value\r\n if (active < 0) {\r\n active = 0;\r\n }\r\n else if (active >= t.liveLength()) {\r\n active = t.liveLength() - 1;\r\n };\r\n\r\n // Item is outside the first viewport\r\n if (active >= t._limit) {\r\n offset = active;\r\n const newOffset = t.liveLength() - t._limit;\r\n if (offset > newOffset) {\r\n offset = newOffset;\r\n };\r\n };\r\n \r\n t.position = active;\r\n }\r\n\r\n // Choose the first item\r\n else if (t._firstActive) {\r\n t.position = 0;\r\n }\r\n\r\n // Choose no item\r\n else {\r\n t.position = -1;\r\n };\r\n\r\n t.offset = offset;\r\n t._showItems(offset); // Show new item list\r\n\r\n // Make chosen value active\r\n if (t.position !== -1) {\r\n t.liveItem(t.position).active(true);\r\n };\r\n\r\n // The prefix is not active\r\n t._prefix.active(false);\r\n\r\n // finally show the element\r\n t._el.classList.add('visible');\r\n\r\n // Add classes for rolling menus\r\n t._boundary(true);\r\n\r\n return true;\r\n },\r\n\r\n\r\n /**\r\n * Hide the menu and call the onHide callback.\r\n */\r\n hide : function () {\r\n if (!this.dontHide) {\r\n this.removeItems();\r\n this._prefix.clear();\r\n this.onHide();\r\n this._el.classList.remove('visible');\r\n }\r\n // this._el.blur();\r\n },\r\n\r\n\r\n /**\r\n * Function released when the menu hides.\r\n * This method is expected to be overridden.\r\n */\r\n onHide : function () {},\r\n\r\n\r\n /**\r\n * Get the prefix for filtering,\r\n * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n */\r\n prefix : function (pref) {\r\n if (arguments.length === 1) {\r\n this._prefix.value(pref);\r\n return this;\r\n };\r\n return this._prefix.value();\r\n },\r\n\r\n \r\n /**\r\n * Get the lengthField object.\r\n */\r\n lengthField : function () {\r\n return this._lengthField;\r\n },\r\n\r\n\r\n /**\r\n * Get the associated slider object.\r\n */\r\n slider : function () {\r\n return this._slider;\r\n },\r\n\r\n\r\n /**\r\n * Delete all visible items from the menu element\r\n */\r\n \r\n removeItems : function () {\r\n const liElements=this._el.getElementsByTagName(\"LI\");\r\n while (liElements.length>0){\r\n this._el.removeChild(liElements[0]);\r\n };\r\n },\r\n\r\n\r\n /**\r\n * Get a specific item from the complete list\r\n *\r\n * @param {number} index of the list item\r\n */\r\n item : function (index) {\r\n return this._items[index]\r\n },\r\n\r\n\r\n /**\r\n * Get a specific item from the filtered list\r\n *\r\n * @param {number} index of the list item\r\n * in the filtered list\r\n */\r\n liveItem : function (index) {\r\n if (this._list === undefined)\r\n if (!this._initList())\r\n return;\r\n\r\n return this._items[this._list[index]];\r\n },\r\n\r\n\r\n /**\r\n * Get a specific item from the viewport list\r\n *\r\n * @param {number} index of the list item\r\n * in the visible list\r\n */\r\n shownItem : function (index) {\r\n if (index >= this.limit())\r\n return;\r\n\r\n return this.liveItem(this.offset + index);\r\n },\r\n\r\n\r\n /**\r\n * Get the length of the full item list\r\n */\r\n length : function () {\r\n return this._items.length;\r\n },\r\n\r\n\r\n /**\r\n * Length of the filtered item list.\r\n */\r\n liveLength : function () {\r\n if (this._list === undefined)\r\n this._initList();\r\n return this._list.length;\r\n },\r\n\r\n \r\n /**\r\n * Make the next item in the filtered menu active\r\n */\r\n next : function () {\r\n const t = this;\r\n\r\n // No list\r\n if (t.liveLength() === 0)\r\n return;\r\n\r\n // Deactivate old item\r\n if (t.position !== -1 && !t._prefix.active()) {\r\n t.liveItem(t.position).active(false);\r\n };\r\n\r\n // Get new active item\r\n t.position++;\r\n let newItem = t.liveItem(t.position);\r\n\r\n // The next element is undefined - roll to top or to prefix\r\n if (newItem === undefined) {\r\n\r\n // Activate prefix\r\n const prefix = this._prefix;\r\n\r\n // Prefix is set and not active - choose!\r\n if (prefix.isSet() && !prefix.active()) {\r\n t.position--;\r\n prefix.active(true);\r\n return;\r\n }\r\n\r\n // Choose first item\r\n else {\r\n newItem = t.liveItem(0);\r\n // choose first item\r\n t.position = 0;\r\n t._showItems(0);\r\n };\r\n }\r\n\r\n // The next element is after the viewport - roll down\r\n else if (t.position >= (t.limit() + t.offset)) {\r\n t.screen(t.position - t.limit() + 1);\r\n }\r\n\r\n // The next element is before the viewport - roll up\r\n else if (t.position <= t.offset) {\r\n t.screen(t.position);\r\n };\r\n\r\n t._prefix.active(false);\r\n newItem.active(true);\r\n },\r\n\r\n\r\n /*\r\n * Make the previous item in the menu active\r\n */\r\n prev : function () {\r\n const t = this;\r\n\r\n // No list\r\n if (t.liveLength() === 0)\r\n return;\r\n\r\n // Deactivate old item\r\n if (!t._prefix.active()) {\r\n\r\n // No active element set\r\n if (t.position === -1) {\r\n t.position = t.liveLength();\r\n }\r\n\r\n // No active element set\r\n else {\r\n t.liveItem(t.position--).active(false);\r\n };\r\n };\r\n\r\n // Get new active item\r\n let newItem = t.liveItem(t.position);\r\n\r\n // The previous element is undefined - roll to bottom\r\n if (newItem === undefined) {\r\n\r\n // Activate prefix\r\n const prefix = t._prefix;\r\n let offset = t.liveLength() - t.limit();\r\n \r\n // Normalize offset\r\n offset = offset < 0 ? 0 : offset;\r\n\r\n // Choose the last item\r\n t.position = t.liveLength() - 1;\r\n \r\n // Prefix is set and not active - choose!\r\n if (prefix.isSet() && !prefix.active()) {\r\n t.position++;\r\n prefix.active(true);\r\n t.offset = offset;\r\n return;\r\n }\r\n\r\n // Choose last item\r\n else {\r\n newItem = t.liveItem(t.position);\r\n t._showItems(offset);\r\n };\r\n }\r\n\r\n // The previous element is before the view - roll up\r\n else if (t.position < t.offset) {\r\n t.screen(t.position);\r\n }\r\n\r\n // The previous element is after the view - roll down\r\n else if (t.position >= (t.limit() + t.offset)) {\r\n t.screen(t.position - t.limit() + 2);\r\n };\r\n\r\n t._prefix.active(false);\r\n newItem.active(true);\r\n },\r\n\r\n\r\n /**\r\n * Move the page up by limit!\r\n */\r\n pageUp : function () {\r\n this.screen(this.offset - this.limit());\r\n },\r\n\r\n\r\n /**\r\n * Move the page down by limit!\r\n */\r\n pageDown : function () {\r\n this.screen(this.offset + this.limit());\r\n },\r\n\r\n\r\n /**\r\n * Move the view one item up\r\n */\r\n viewUp : function () {\r\n this.screen(this.offset - 1);\r\n },\r\n\r\n\r\n /**\r\n * Move the view one item down\r\n */\r\n viewDown : function () {\r\n this.screen(this.offset + 1);\r\n },\r\n\r\n\r\n // Unmark all items\r\n _unmark : function () {\r\n this._list.forEach(function(it){\r\n const item = this._items[it];\r\n item.lowlight();\r\n item.active(false);\r\n }, this);\r\n },\r\n\r\n\r\n // Set boundary for viewport\r\n _boundary : function (bool) {\r\n if (this._list.length === 0)\r\n return;\r\n\r\n this.item(this._list[0]).noMore(bool);\r\n this.item(this._list[this._list.length - 1]).noMore(bool);\r\n },\r\n\r\n\r\n // Append Items that should be shown\r\n _showItems : function (off) {\r\n const t = this;\r\n\r\n // optimization: scroll down one step\r\n if (t.offset === (off - 1)) {\r\n t.offset = off;\r\n\r\n // Remove the HTML node from the first item\r\n // leave lengthField/prefix/slider\r\n t._el.removeChild(t._el.children[3]);\r\n\r\n t._append(\r\n t._list[t.offset + t.limit() - 1]\r\n );\r\n }\r\n\r\n // optimization: scroll up one step\r\n else if (t.offset === (off + 1)) {\r\n t.offset = off;\r\n\r\n // Remove the HTML node from the last item\r\n t._el.removeChild(t._el.lastChild);\r\n\r\n t._prepend(t._list[t.offset]);\r\n }\r\n\r\n else {\r\n t.offset = off;\r\n\r\n // Remove all items\r\n t.removeItems();\r\n\r\n // Use list\r\n let shown = 0;\r\n\r\n for (let i = 0; i < t._list.length; i++) {\r\n\r\n // Don't show - it's before offset\r\n shown++;\r\n if (shown <= off)\r\n continue;\r\n\r\n t._append(t._list[i]);\r\n \r\n if (shown >= (t.limit() + off))\r\n break;\r\n };\r\n };\r\n\r\n // set the slider to the new offset\r\n t._slider.offset(t.offset);\r\n },\r\n\r\n\r\n // Append item to the shown list based on index\r\n _append : function (i) {\r\n const item = this.item(i);\r\n\r\n // Highlight based on prefix\r\n if (this.prefix().length > 0) {\r\n item.highlight(this.prefix().toLowerCase());\r\n };\r\n\r\n // Append element\r\n this.element().appendChild(item.element());\r\n },\r\n\r\n\r\n // Prepend item to the shown list based on index\r\n _prepend : function (i) {\r\n const item = this.item(i);\r\n\r\n // Highlight based on prefix\r\n if (this.prefix().length > 0) {\r\n item.highlight(this.prefix().toLowerCase());\r\n };\r\n\r\n const e = this.element();\r\n\r\n // Append element after lengthField/prefix/slider\r\n e.insertBefore(\r\n item.element(),\r\n e.children[3]\r\n );\r\n }\r\n };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n return {\r\n\r\n /**\r\n * Create new menu object.\r\n * Pass the panel object\r\n * and the item parameters.\r\n *\r\n * @param panel The panel object\r\n * @param params The match menu items\r\n * as an array of arrays.\r\n */\r\n create : function (list, itemClass) {\r\n const obj = Object.create(menuClass)\r\n\t .upgradeTo(this)\r\n\t ._init(list, {itemClass : itemClass});\r\n obj.limit(6);\r\n\r\n const e = obj.element();\r\n\r\n // This is only domspecific\r\n e.addEventListener('blur', function (e) {\r\n\t this.menu.hide();\r\n });\r\n\r\n e.classList.add('button-group-list');\r\n\r\n // Add menu to body\r\n document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n return obj;\r\n },\r\n\r\n\r\n /**\r\n * The panel object of the menu.\r\n */\r\n panel :function (panelVar) {\r\n if (panelVar !== undefined)\r\n this._panel = panelVar;\r\n\r\n return this._panel;\r\n },\r\n\r\n\r\n // Attach menu to button\r\n button : function (btn) {\r\n\r\n this._button = btn;\r\n\r\n this._repos(this._button);\r\n this.slider().reInit();\r\n\r\n /*\r\n * This is a suboptimal scrolling solution, see\r\n * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n */\r\n if (this._onscroll !== undefined) {\r\n window.removeEventListener('scroll', this._onscroll);\r\n };\r\n\r\n this._onscroll = function () {\r\n this._repos(this._button);\r\n }.bind(this);\r\n \r\n window.addEventListener('scroll', this._onscroll);\r\n },\r\n\r\n \r\n // Overwrite onHide method\r\n onHide : function () {\r\n\r\n // Remove listener\r\n if (this._onscroll !== undefined) {\r\n window.removeEventListener('scroll', this._onscroll);\r\n };\r\n this.element().blur();\r\n },\r\n\r\n _repos : function (e) {\r\n const bounding = e.getBoundingClientRect();\r\n this._el.style.left = bounding.left + \"px\";\r\n this._el.style.top = (\r\n bounding.top +\r\n bounding.height -\r\n this._el.clientHeight\r\n ) + \"px\";\r\n }\r\n };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n \r\n return {\r\n /**\r\n * Create button group\r\n */\r\n create : function (classes) {\r\n return Object.create(this)._init(classes);\r\n },\r\n \r\n // Initialize button group\r\n _init : function (classes) {\r\n const e = document.createElement('div');\r\n const cl = e.classList;\r\n if (classes) {\r\n cl.add.apply(cl,classes);\r\n };\r\n cl.add('button-group');\r\n this._el = e;\r\n return this;\r\n },\r\n\r\n \r\n /**\r\n * Return main element\r\n */\r\n element : function () {\r\n return this._el;\r\n },\r\n\r\n \r\n /**\r\n * Upgrade this object to another object, \r\n * while private data stays intact.\r\n * \r\n * @param {Object} An object with properties.\r\n */\r\n upgradeTo : function (props) {\r\n for (var prop in props) {\r\n this[prop] = props[prop];\r\n };\r\n return this;\r\n },\r\n\r\n \r\n /**\r\n * Add button in order\r\n * \r\n * Returns the button element\r\n */\r\n add : function (title, data, cb) {\r\n \r\n const b = this._el.addE('span');\r\n b.setAttribute('title',title);\r\n\r\n if (data !== undefined) {\r\n if (data['cls'] !== undefined) {\r\n b.classList.add.apply(b.classList, data['cls']);\r\n };\r\n \r\n if (data['icon'] !== undefined) { \r\n b.setAttribute('data-icon', data['icon']);\r\n };\r\n\r\n if (data['state'] !== undefined) {\r\n b['state'] = data['state'];\r\n }\r\n };\r\n \r\n b.addE('span').addT(title);\r\n\r\n let that = this;\r\n b.addEventListener('click', function (e) {\r\n\r\n // Do not bubble\r\n e.halt();\r\n \r\n // Call callback\r\n let obj = that._bind || this;\r\n obj.button = b;\r\n cb.apply(obj, e)\r\n });\r\n\r\n return b;\r\n },\r\n\r\n \r\n /**\r\n * Add button that spawns a list in order.\r\n * \r\n * Returns the list object.\r\n */\r\n addList : function (title, data, itemClass = defaultItemClass) {\r\n const list = treeMenuClass.create([], itemClass);\r\n this.add(title, data, function (e) {\r\n list.show();\r\n list.button(this.button);\r\n list.focus();\r\n });\r\n return list;\r\n },\r\n\r\n /**\r\n * Add button that can toggle a state.\r\n * The state has to be a state object.\r\n */\r\n addToggle : function (title, data, state) {\r\n const b = this._el.addE('span');\r\n b.setAttribute('title',title);\r\n\r\n if (data != undefined) {\r\n if (data['cls'] !== undefined) {\r\n b.classList.add.apply(\r\n b.classList,\r\n data['cls']\r\n );\r\n };\r\n };\r\n\r\n // Set check marker\r\n const check = b.addE('span');\r\n check.classList.add(\"check\", \"button-icon\");\r\n check.addE('span');\r\n\r\n // Associate this object to state\r\n // Add setState method to object\r\n check.setState = function (value) {\r\n if (value) {\r\n this.classList.add(\"checked\");\r\n } else {\r\n this.classList.remove(\"checked\");\r\n }\r\n };\r\n state.associate(check);\r\n\r\n b.addE('span').addT(title);\r\n \r\n let that = this;\r\n b.addEventListener('click', function (e) {\r\n\r\n // Do not bubble\r\n e.halt();\r\n \r\n // Toggle state\r\n state.roll();\r\n });\r\n\r\n return b;\r\n },\r\n\r\n /**\r\n * Bind an object to all callbacks of the button group. \r\n * To get the button element inside the callback, \r\n * use this.button\r\n */\r\n bind : function (obj) {\r\n if (obj !== undefined) {\r\n this._bind = obj;\r\n return this;\r\n };\r\n return this._bind || this;\r\n },\r\n\r\n \r\n /**\r\n * Remove all defined buttons\r\n */\r\n clear : function () {\r\n _removeChildren(this._el);\r\n return this;\r\n }\r\n }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n const loc = KorAP.Locale;\r\n loc.DEL = loc.DEL || '×';\r\n\r\n // Utility for analysing boolean values\r\n function _bool (bool) {\r\n return (\r\n bool === undefined ||\r\n bool === null ||\r\n bool === false) ? false : true;\r\n };\r\n\r\n\r\n // Add new unspecified document\r\n function _add (obj, type) {\r\n const parent = obj.parent();\r\n\r\n if (obj.ldType() === 'docGroup') {\r\n\r\n // Check that the action differs from the type\r\n if (obj.operation() === type)\r\n\t return;\r\n\r\n if (parent.ldType() !== null) {\r\n\t return parent.newAfter(obj);\r\n }\r\n\r\n else {\r\n\t // The group is on root - wrap\r\n\t return obj.wrapOnRoot();\r\n };\r\n }\r\n\r\n else if (obj.ldType() === 'doc' ||\r\n obj.ldType() === 'docGroupRef') {\r\n\r\n if (parent.ldType() === null) {\r\n\t return obj.wrapOnRoot(type);\r\n }\r\n\r\n else if (parent.operation() === type) {\r\n\t return parent.newAfter(obj);\r\n }\r\n\r\n else {\r\n\t return obj.wrap(type);\r\n };\r\n };\r\n };\r\n\r\n\r\n // Add doc with 'and' relation\r\n KorAP._and = function () {\r\n return _add(this, 'and');\r\n };\r\n\r\n\r\n // Add doc with 'or' relation\r\n KorAP._or = function () {\r\n return _add(this, 'or');\r\n };\r\n\r\n\r\n // Remove doc or docGroup\r\n KorAP._delete = function () {\r\n if (this.parent().ldType() !== null) {\r\n return this.parent().delOperand(this).update();\r\n }\r\n else {\r\n this.parent().clean();\r\n };\r\n };\r\n\r\n\r\n return {\r\n create : function (and, or, del) {\r\n \r\n // Inherit from buttonGroupClass\r\n var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n op.and(and);\r\n op.or(or);\r\n op.del(del);\r\n op.update();\r\n\r\n return op;\r\n },\r\n\r\n\r\n /*\r\n * Update the element\r\n */\r\n update : function () {\r\n const t = this;\r\n\r\n // Clear button group\r\n t.clear();\r\n\r\n if (t._and === true) {\r\n t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n };\r\n\r\n // Add or button\r\n if (t._or === true) {\r\n t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n };\r\n\r\n // Add delete button\r\n if (t._del === true) {\r\n t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n };\r\n\r\n return t.element();\r\n },\r\n\r\n\r\n // Be aware! This may be cyclic\r\n // This is somehow redundant with bind, but relevant for ldTypes\r\n parent : function (obj) {\r\n if (arguments.length === 1) {\r\n\t this._parent = obj;\r\n\r\n // This is somehow duplicate - but it's not that relevant\r\n this.bind(obj);\r\n };\r\n\r\n return this._parent;\r\n },\r\n\r\n\r\n and : function (bool) {\r\n if (arguments.length === 1)\r\n\t this._and = _bool(bool);\r\n return this._and;\r\n },\r\n\r\n\r\n or : function (bool) {\r\n if (arguments.length === 1)\r\n\t this._or = _bool(bool);\r\n return this._or;\r\n },\r\n\r\n\r\n del : function (bool) {\r\n if (arguments.length === 1)\r\n\t this._del = _bool(bool);\r\n return this._del;\r\n }\r\n };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n return {\r\n\r\n __changed : false,\r\n \r\n create : function () {\r\n return Object.create(this);\r\n },\r\n\r\n\r\n /**\r\n * Upgrade this object to another object\r\n * while private data stays intact\r\n */\r\n upgradeTo : function (props) {\r\n for (let prop in props) {\r\n\t this[prop] = props[prop];\r\n };\r\n return this;\r\n },\r\n \r\n\r\n ldType : function (type) {\r\n if (arguments.length === 1)\r\n\t this._ldType = type;\r\n return this._ldType;\r\n },\r\n \r\n\r\n parent : function (obj) {\r\n if (arguments.length === 1) {\r\n\t this._parent = obj;\r\n\t this.__changed = true;\r\n };\r\n return this._parent;\r\n },\r\n\r\n\r\n // Destroy object - especially for\r\n // acyclic structures!\r\n // I'm paranoid!\r\n destroy : function () {\r\n const t = this;\r\n if (t._ops != undefined) {\r\n\t t._ops._parent = undefined;\r\n\t if (t._ops._el !== undefined) {\r\n\t t._ops._el.refTo = undefined;\r\n };\r\n\t t._ops = undefined;\r\n };\r\n\r\n if (t._el !== undefined)\r\n\t t._el = undefined;\r\n \r\n // In case of a group, destroy all operands\r\n if (t._operands !== undefined) {\r\n t._operands.forEach(i => i.destroy());\r\n\t t._operands = [];\r\n };\r\n },\r\n \r\n // Wrap a new operation around the root group element \r\n wrapOnRoot : function (op) {\r\n const parent = this.parent();\r\n const group = require('vc/docgroup').create(parent);\r\n\r\n if (arguments.length === 1)\r\n\t group.operation(op);\r\n else\r\n\t group.operation(\r\n\t this.operation() === 'and' ? 'or' : 'and'\r\n\t );\r\n group.append(this);\r\n this.parent(group);\r\n group.append();\r\n group.element(); // Init (seems to be necessary)\r\n parent.root(group);\r\n return this.parent();\r\n },\r\n\r\n\r\n // Be aware! This may be cyclic\r\n operators : function (and, or, del) {\r\n if (arguments === 0)\r\n\t return this._ops;\r\n\r\n this._ops = operatorsClass.create(\r\n\t and, or, del\r\n );\r\n\r\n this._ops.parent(this);\r\n return this._ops;\r\n },\r\n\r\n\r\n toJson : function () {\r\n return {\r\n\t // Unspecified object\r\n\t \"@type\" : \"koral:\" + this.ldType()\r\n };\r\n },\r\n\r\n\r\n rewrites : function () {\r\n return null;\r\n },\r\n\r\n\r\n incomplete : function () {\r\n return false;\r\n },\r\n\r\n\r\n toQuery : function () {\r\n return '';\r\n }\r\n };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n // injection, modification, and deletion should probably be enough\r\n const _validRewriteOpRE =\r\n new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n return {\r\n\r\n // Construction method\r\n create : function (json) {\r\n return Object(jsonldClass).\r\n\t create().\r\n\t upgradeTo(this).\r\n\t fromJson(json);\r\n },\r\n\r\n\r\n // Get or set source\r\n src : function (string) {\r\n if (arguments.length === 1)\r\n\t this._src = string;\r\n return this._src;\r\n },\r\n \r\n\r\n // Get or set operation\r\n operation : function (op) {\r\n if (arguments.length === 1) {\r\n\t if (_validRewriteOpRE.test(op)) {\r\n\t this._op = op;\r\n\t }\r\n\t else {\r\n\t KorAP.log(814, \"Unknown rewrite operation\");\r\n\t return;\r\n\t };\r\n };\r\n return this._op || 'injection';\r\n },\r\n\r\n\r\n // Get or set scope\r\n scope : function (attr) {\r\n if (arguments.length === 1)\r\n\t this._scope = attr;\r\n return this._scope;\r\n },\r\n\r\n\r\n // Serialize from Json\r\n fromJson : function (json) {\r\n if (json === undefined)\r\n\t return this;\r\n \r\n // Missing @type\r\n if (json[\"@type\"] === undefined) {\r\n\t KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t return;\r\n };\r\n \r\n // Missing source\r\n if (json[\"src\"] === undefined ||\r\n\t typeof json[\"src\"] !== 'string') {\r\n\t KorAP.log(815, \"Rewrite expects source\");\r\n\t return;\r\n };\r\n\r\n // Set source\r\n this.src(json[\"src\"]);\r\n\r\n // Set operation\r\n if (json[\"operation\"] !== undefined) {\r\n\t this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n };\r\n\r\n // Set scope\r\n if (json[\"scope\"] !== undefined &&\r\n\t typeof json[\"scope\"] === 'string')\r\n\t this.scope(json[\"scope\"]);\r\n\r\n return this;\r\n },\r\n \r\n\r\n toString : function () {\r\n let str = '';\r\n const op = this.operation();\r\n str += op.charAt(0).toUpperCase() + op.slice(1);\r\n str += ' of ' + (\r\n\t this._scope === null ?\r\n\t 'object' :\r\n\t this.scope().quote()\r\n );\r\n str += ' by ' + this.src().quote();\r\n return str;\r\n }\r\n };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n return {\r\n\r\n // Construction method\r\n create : function (json) {\r\n return Object(jsonldClass).\r\n\t create().\r\n\t upgradeTo(this).\r\n\t fromJson(json);\r\n },\r\n\r\n\r\n /**\r\n * Deserialize from KoralQuery\r\n */\r\n fromJson : function (json) {\r\n this._list = new Array();\r\n json.forEach(\r\n i => \r\n\t this._list.push(\r\n\t rewriteClass.create(i)\r\n\t )\r\n );\r\n return this;\r\n },\r\n\r\n\r\n length : function () {\r\n return this._list.length;\r\n },\r\n\r\n\r\n /**\r\n * Get element.\r\n */\r\n element : function () {\r\n if (this._el !== undefined)\r\n\t return this._el;\r\n\r\n const e = this._el = document.createElement('div');\r\n e.setAttribute('class', 'rewrite');\r\n\r\n const comments = [];\r\n let span, rewriteText;\r\n this._list.forEach(function (rewrite) {\r\n\t \r\n // This is a blind element\r\n\t span = document.createElement('span');\r\n\r\n\t // Set class attribute\r\n\t span.setAttribute('class', rewrite.operation());\r\n\r\n\t // Append source information\r\n\t rewriteText = rewrite.src();\r\n\r\n\t // Append scope information\r\n\t if (rewrite.scope() !== undefined) {\r\n\t rewriteText += ': ' + rewrite.scope();\r\n\t };\r\n\r\n\t // Append source information\r\n\t span.addT(rewriteText);\r\n\r\n comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n \r\n\t this._el.appendChild(span);\r\n }, this);\r\n\r\n e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n return e;\r\n }\r\n };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n const loc = KorAP.Locale;\r\n loc.REGEX = loc.REGEX || 'RegEx';\r\n loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n return {\r\n /**\r\n * Create new string value helper.\r\n */\r\n create : function () {\r\n const a = arguments;\r\n let regexOp = true,\r\n regex = false,\r\n value = '';\r\n\r\n // Set value\r\n if (a.length >= 1) {\r\n if (a[0] !== undefined)\r\n value = a[0];\r\n };\r\n\r\n // Set regex\r\n if (a.length >= 2) {\r\n if (a[1] !== undefined)\r\n regex = a[1];\r\n };\r\n\r\n // Set regexOp\r\n if (a.length >= 3) {\r\n regexOp = a[2];\r\n if (regexOp === false) {\r\n regex = false;\r\n }\r\n };\r\n return Object.create(this)._init(value, regex, regexOp);\r\n },\r\n \r\n\r\n // Initialize the string value\r\n _init : function (value, regex, regexOp) {\r\n this.value(value);\r\n this.regex(regex);\r\n this._regexOp(regexOp);\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Get or set the regex boolean value.\r\n *\r\n * @param bool Either true or false\r\n */\r\n regex : function (bool) {\r\n if (arguments.length === 1) {\r\n\t this._regex = bool ? true : false;\r\n this._update();\r\n };\r\n return this._regex;\r\n },\r\n\r\n\r\n _regexOp : function (regexOp) {\r\n if (arguments.length === 1) {\r\n this.__regexOp = regexOp ? true : false;\r\n this._update();\r\n };\r\n return this.__regexOp;\r\n },\r\n\r\n\r\n /**\r\n * Toggle the regex, make it either true,\r\n * if it is false, or make it false, if it is true.\r\n */\r\n toggleRegex : function () {\r\n this.regex(this._regex === false ? true : false);\r\n },\r\n \r\n\r\n /**\r\n * Get or set the string value.\r\n */\r\n value : function (val) {\r\n if (arguments.length === 1) {\r\n this._value = val;\r\n // this._input.value = val;\r\n this._update();\r\n };\r\n return this._value;\r\n },\r\n\r\n\r\n // Update dom element\r\n _update : function () {\r\n if (this._el === undefined)\r\n return;\r\n \r\n this._value = this._input.value;\r\n\r\n const cl = this._el.classList;\r\n\r\n if (this._regexOp() && this._regex) {\r\n cl.add('regex');\r\n }\r\n else {\r\n cl.remove('regex');\r\n };\r\n },\r\n \r\n\r\n /**\r\n * Store the string value.\r\n * This method should be overwritten.\r\n * The method receives the value and the regex.\r\n */\r\n store : function (v,r) {},\r\n\r\n\r\n /**\r\n * Put focus on element\r\n */\r\n focus : function () {\r\n this._el.children[0].focus();\r\n },\r\n\r\n\r\n /**\r\n * Get the associated dom element.\r\n */\r\n element : function () {\r\n if (this._el !== undefined)\r\n return this._el;\r\n\r\n // Create element\r\n const e = this._el = document.createElement('div');\r\n e.setAttribute('tabindex', 0);\r\n e.style.outline = 0;\r\n\r\n const cl = e.classList;\r\n cl.add('value');\r\n if (this.regex() === true)\r\n cl.add('regex');\r\n \r\n // Add input field\r\n this._input = e.addE('input');\r\n\r\n if (this.value() !== undefined) {\r\n this._input.value = this.value();\r\n };\r\n\r\n // Add regex button\r\n if (this._regexOp()) {\r\n const re = e.addE('div');\r\n re.addEventListener(\r\n 'click',\r\n function () {\r\n\t this.toggleRegex();\r\n // ev.halt();\r\n }.bind(this),\r\n true\r\n );\r\n re.setAttribute(\"title\", \"Use as regular expression\");\r\n re.addT('RegEx');\r\n };\r\n\r\n // If the focus is not on the text field anymore,\r\n // delegate focus to\r\n this._input.addEventListener(\r\n 'blur',\r\n function (ev) {\r\n const t = this;\r\n if (!t._inField) {\r\n\t t.value(t._input.value);\r\n t.store(t.value(), t.regex());\r\n };\r\n ev.halt();\r\n }.bind(this)\r\n );\r\n\r\n // Workaround to check the click is in the field\r\n e.addEventListener(\r\n 'mousedown',\r\n function () {\r\n this._inField = true;\r\n }.bind(this)\r\n );\r\n\r\n e.addEventListener(\r\n 'mouseup',\r\n function () {\r\n this._inField = false;\r\n this._input.focus();\r\n }.bind(this)\r\n );\r\n\r\n this._input.addEventListener(\r\n 'keypress',\r\n function (ev) {\r\n const t = this;\r\n\t if (ev.keyCode == 13) {\r\n\t t.value(t._input.value);\r\n\t t.store(t.value(), t.regex());\r\n return false;\r\n\t };\r\n }.bind(this)\r\n );\r\n\r\n // Add store button\r\n /*\r\n e.appendChild(\r\n document.createElement('div')\r\n ).addEventListener('click', function () {\r\n this.store(this.value(), this.regex());\r\n }.bind(this));\r\n */\r\n return e;\r\n }\r\n };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n 'vc/jsonld',\r\n 'vc/rewritelist',\r\n 'vc/stringval',\r\n 'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n // TODO:\r\n // Does not support rewrites currently\r\n \r\n const loc = KorAP.Locale;\r\n loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n return {\r\n\r\n // The ld-type\r\n _ldType : \"docGroupRef\",\r\n\r\n /**\r\n * Create new unspecified criterion\r\n * with a link to the parent object\r\n */\r\n create : function (parent, json) {\r\n const obj = Object(jsonldClass).\r\n create().\r\n\t upgradeTo(this).\r\n fromJson(json);\r\n \r\n if (obj === undefined)\r\n console.log(json);\r\n\r\n if (parent !== undefined)\r\n\t obj._parent = parent;\r\n \r\n obj.__changed = true;\r\n return obj;\r\n },\r\n\r\n\r\n /**\r\n * Update the element\r\n */\r\n update : function () {\r\n const t = this;\r\n\r\n if (t._el === undefined)\r\n return t.element();\r\n\r\n const e = t._el;\r\n\r\n // Check if there is a change in the underlying data\r\n if (!t.__changed)\r\n return e;\r\n\r\n // Set ref - TODO: Cleanup!\r\n e.refTo = t;\r\n \r\n // Was rewritten\r\n if (t.rewrites() !== undefined) {\r\n e.classList.add(\"rewritten\");\r\n };\r\n \r\n const refTitle = document.createElement('span');\r\n refTitle.classList.add('key','fixed', 'ref');\r\n refTitle.addT('referTo');\r\n\r\n // Added value operator\r\n const refE = t._refE = document.createElement('span');\r\n refE.setAttribute('data-type', \"string\");\r\n refE.setAttribute('class', 'value');\r\n\r\n if (this.ref()) {\r\n refE.addT(t.ref());\r\n }\r\n else {\r\n refE.addT(loc.EMPTY);\r\n refE.classList.add('unspecified');\r\n };\r\n\r\n // Change value\r\n refE.addEventListener(\r\n 'click',\r\n t._changeRef.bind(t)\r\n );\r\n\r\n // Remove all element children\r\n _removeChildren(e);\r\n\r\n // Add spans\r\n e.appendChild(refTitle);\r\n e.appendChild(refE);\r\n\r\n t.__changed = false;\r\n\r\n if (t._rewrites !== undefined) {\r\n e.appendChild(t._rewrites.element());\r\n };\r\n \r\n if (t._parent !== undefined) {\r\n\r\n // Set operators\r\n // Append new operators\r\n e.appendChild(t.operators(\r\n true,\r\n true,\r\n true\r\n ).element());\r\n }; \r\n\r\n if (KorAP.vc !== undefined) {\r\n KorAP.vc.element().dispatchEvent(\r\n new CustomEvent('vcChange', { 'detail' : t })\r\n );\r\n };\r\n \r\n return t.element();\r\n },\r\n\r\n\r\n /**\r\n * Get the associated element\r\n */\r\n element : function () {\r\n\r\n if (this._el !== undefined)\r\n\t return this._el;\r\n\r\n const e = this._el = document.createElement('div');\r\n e.setAttribute('class', 'doc groupref');\r\n this.update();\r\n return e;\r\n },\r\n\r\n\r\n /**\r\n * Get or set the value\r\n */\r\n ref : function (ref) {\r\n if (arguments.length === 1) {\r\n this._ref = ref;\r\n this._changed();\r\n return this;\r\n };\r\n return this._ref;\r\n },\r\n\r\n\r\n // Click on the reference operator, show me the option\r\n _changeRef : function (e) {\r\n const that = this;\r\n const str = stringValClass.create(this.ref(), false, false);\r\n const strElem = str.element();\r\n\r\n str.store = function (ref, regex) {\r\n that.ref(ref);\r\n \r\n that._el.removeChild(\r\n this._el\r\n );\r\n that.update();\r\n };\r\n\r\n // Insert element\r\n this._el.insertBefore(\r\n strElem,\r\n this._refE\r\n );\r\n\r\n str.focus();\r\n },\r\n \r\n\r\n /**\r\n * Wrap a new operation around the doc element.\r\n * This is copypasta from doc.js\r\n */\r\n wrap : function (op) {\r\n const parent = this.parent();\r\n const group = require('vc/docgroup').create(parent);\r\n group.operation(op);\r\n group.append(this);\r\n group.append();\r\n return parent.replaceOperand(this, group).update();\r\n },\r\n\r\n\r\n /**\r\n * Deserialize from json\r\n */\r\n fromJson : function (json) {\r\n if (json === undefined)\r\n return this;\r\n\r\n if (json[\"@type\"] === undefined) {\r\n KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n return;\r\n };\r\n\r\n if (json[\"ref\"] === undefined ||\r\n typeof json[\"ref\"] != 'string') {\r\n KorAP.log(821, \"Reference is missing\");\r\n return;\r\n };\r\n\r\n this.ref(json[\"ref\"]);\r\n\r\n // Rewrite coming from the server\r\n if (json[\"rewrites\"] !== undefined) {\r\n this.rewrite(json[\"rewrites\"]);\r\n };\r\n\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Click on the unspecified object\r\n */\r\n onclick : function () {\r\n console.log(\"Do not support click on this\");\r\n },\r\n\r\n\r\n // TODO: This is identical to doc.js\r\n rewrites : function () {\r\n return this._rewrites;\r\n },\r\n\r\n\r\n // TODO: This is identical to doc.js\r\n rewrite : function (value) {\r\n if (typeof value === 'string') {\r\n value = [{\r\n \"@type\" : \"koral:rewrite\",\r\n \"operation\" : \"operation:\" + value,\r\n \"src\" : \"Kalamar\"\r\n }];\r\n };\r\n this._rewrites = rewriteListClass.create(value);\r\n },\r\n\r\n\r\n // Mark the underlying data as being changed.\r\n // This is important for rerendering the dom.\r\n // This will also remove rewrite markers, when the data\r\n // change happened by the user\r\n _changed : function () {\r\n this.__changed = true;\r\n\r\n if (this._rewrites === undefined)\r\n return;\r\n\r\n delete this[\"_rewrites\"];\r\n\r\n if (this._el === undefined)\r\n return;\r\n\r\n this._el.classList.remove(\"rewritten\");\r\n },\r\n\r\n\r\n toJson : function () {\r\n if (!this.ref)\r\n return {};\r\n \r\n return {\r\n \"@type\" : \"koral:\" + this.ldType(),\r\n \"ref\" : this.ref()\r\n };\r\n },\r\n\r\n\r\n incomplete : function () {\r\n return this.ref() ? false : true\r\n },\r\n \r\n\r\n toQuery : function () {\r\n if (this.incomplete())\r\n return \"\";\r\n\r\n // Build doc string based on key\r\n return 'referTo ' + this.ref().quote();\r\n }\r\n };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n 'vc/jsonld',\r\n 'vc/rewritelist',\r\n 'vc/stringval',\r\n 'vc/docgroupref',\r\n 'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n /*\r\n * TODO:\r\n * Improve error handling by using window.onerror() to\r\n * capture thrown errors and log them.\r\n */\r\n\r\n const errstr802 = \"Match type is not supported by value type\";\r\n const errstr804 = \"Unknown value type\";\r\n const loc = KorAP.Locale;\r\n loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n return {\r\n\r\n // The JSON-LD type\r\n _ldType : \"doc\",\r\n\r\n // The object ... maybe not important\r\n _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n \r\n\r\n /**\r\n * Create a new document criterion\r\n * by passing the parent object and a json construct.\r\n */\r\n create : function (parent, json) {\r\n\r\n // Create the object, inheriting from Json-LD class\r\n const obj = Object(jsonldClass).\r\n create().\r\n upgradeTo(this).\r\n fromJson(json);\r\n\r\n if (obj === undefined) {\r\n console.log(json);\r\n return;\r\n };\r\n\r\n // Bind the parent\r\n if (parent !== undefined)\r\n obj._parent = parent;\r\n \r\n obj.__changed = true;\r\n return obj;\r\n },\r\n\r\n\r\n /**\r\n * Update the elements content.\r\n */\r\n update : function () {\r\n const t = this;\r\n\r\n if (t._el === undefined)\r\n return t.element();\r\n \r\n // Get element\r\n const e = t._el;\r\n\r\n // Check if there is a change in the underlying data\r\n if (!t.__changed)\r\n return e;\r\n\r\n // Set ref - TODO: Cleanup!\r\n e.refTo = t;\r\n\r\n\r\n // Was rewritten\r\n if (t.rewrites() !== undefined) {\r\n e.classList.add(\"rewritten\");\r\n };\r\n\r\n // Added key\r\n const keyE = t._keyE = document.createElement('span');\r\n keyE.setAttribute('class', 'key');\r\n\r\n // Change key\r\n keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n if (t.key()) {\r\n const k = t.key();\r\n if (loc['VC_' + k] !== undefined)\r\n k = loc['VC_' + k];\r\n keyE.addT(k);\r\n };\r\n\r\n // Added match operator\r\n const matchopE = t._matchopE = document.createElement('span');\r\n matchopE.setAttribute('data-type', t.type());\r\n matchopE.setAttribute('class', 'match');\r\n matchopE.addT(t.matchop());\r\n\r\n // Change matchop\r\n t._matchopE.addEventListener(\r\n 'click',\r\n t._changeMatchop.bind(t)\r\n );\r\n\r\n // Added value operator\r\n const valueE = t._valueE = document.createElement('span');\r\n valueE.setAttribute('data-type', t.type());\r\n valueE.setAttribute('class', 'value');\r\n\r\n if (t.value()) {\r\n valueE.addT(t.value());\r\n }\r\n else {\r\n valueE.addT(loc.EMPTY);\r\n valueE.classList.add('unspecified');\r\n };\r\n\r\n // Change value\r\n valueE.addEventListener(\r\n 'click',\r\n t._changeValue.bind(t)\r\n );\r\n\r\n // Remove all element children\r\n _removeChildren(e);\r\n\r\n // Add spans\r\n e.appendChild(keyE);\r\n e.appendChild(matchopE);\r\n e.appendChild(valueE);\r\n\r\n t.__changed = false;\r\n\r\n if (t._rewrites !== undefined) {\r\n e.appendChild(t._rewrites.element());\r\n };\r\n\r\n if (t._parent !== undefined) {\r\n \r\n // Set operators\r\n // Append new operators\r\n e.appendChild(t.operators(\r\n true,\r\n true,\r\n true\r\n ).element());\r\n };\r\n \r\n if (KorAP.vc){\r\n KorAP.vc.element().dispatchEvent(\r\n new CustomEvent('vcChange', {'detail' : t})\r\n );\r\n }\r\n \r\n return e;\r\n },\r\n\r\n\r\n /**\r\n * Get the associated element\r\n */\r\n element : function () {\r\n const t = this;\r\n if (t._el !== undefined)\r\n return t._el;\r\n\r\n t._el = document.createElement('div');\r\n t._el.setAttribute('class', 'doc');\r\n t.update();\r\n return t._el;\r\n },\r\n\r\n\r\n /**\r\n * Wrap a new operation around the doc element\r\n */\r\n wrap : function (op) {\r\n const parent = this.parent();\r\n const group = require('vc/docgroup').create(parent);\r\n group.operation(op);\r\n group.append(this);\r\n group.append();\r\n return parent.replaceOperand(this, group).update();\r\n },\r\n\r\n\r\n replaceWith : function (op) {\r\n const p = this.parent();\r\n\r\n if (p.ldType() === 'docGroup') {\r\n p.replaceOperand(this, op);\r\n }\r\n else if (p.ldType() == null) {\r\n p.root(op);\r\n };\r\n\r\n p.update();\r\n\r\n this.destroy();\r\n },\r\n \r\n\r\n /**\r\n * Deserialize from json\r\n */\r\n fromJson : function (json) {\r\n const t = this;\r\n if (json === undefined)\r\n return t;\r\n\r\n if (json[\"@type\"] === undefined) {\r\n KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n return;\r\n };\r\n\r\n if (json[\"value\"] === undefined ||\r\n typeof json[\"value\"] != 'string') {\r\n KorAP.log(805, \"Value is invalid\");\r\n return;\r\n };\r\n\r\n let rewrite;\r\n\r\n // There is a defined key\r\n if (json[\"key\"] !== undefined &&\r\n typeof json[\"key\"] === 'string') {\r\n\r\n // Set key\r\n t.key(json[\"key\"]);\r\n\r\n // Set match operation\r\n if (json[\"match\"] !== undefined) {\r\n if (typeof json[\"match\"] === 'string') {\r\n t.matchop(json[\"match\"]);\r\n }\r\n else {\r\n KorAP.log(802, errstr802);\r\n return;\r\n };\r\n };\r\n \r\n // Type is unspecified - but may be known by the menu\r\n if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n // Check the VC list if the field is known\r\n const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n if (type != undefined) {\r\n json[\"type\"] = \"type:\" + type;\r\n };\r\n };\r\n\r\n // Type is still undefined\r\n if (json[\"type\"] === undefined) {\r\n \r\n // Check match type\r\n if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n KorAP.log(802, errstr802);\r\n\r\n // Rewrite method\r\n t.matchop('eq');\r\n rewrite = 'modification';\r\n };\r\n\r\n // Set string value\r\n t.value(json[\"value\"]);\r\n }\r\n\r\n // Field is string type\r\n else if (json[\"type\"] == \"type:string\") {\r\n t.type(\"string\");\r\n\r\n // Check match type\r\n if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n KorAP.log(802, errstr802);\r\n\r\n // Rewrite method\r\n t.matchop('eq');\r\n rewrite = 'modification';\r\n };\r\n \r\n // Set string value\r\n t.value(json[\"value\"]);\r\n }\r\n\r\n // Field is specified\r\n else if (json[\"type\"] == \"type:text\") {\r\n t.type(\"text\");\r\n\r\n // Check match type\r\n if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n KorAP.log(802, errstr802);\r\n\r\n // Rewrite method\r\n t.matchop('eq');\r\n rewrite = 'modification';\r\n };\r\n\r\n // Set string value\r\n t.value(json[\"value\"]);\r\n }\r\n\r\n // Key is a date\r\n else if (json[\"type\"] === \"type:date\") {\r\n t.type(\"date\");\r\n\r\n if (json[\"value\"] !== undefined &&\r\n KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n KorAP.log(802, errstr802);\r\n\r\n // Rewrite method\r\n t.matchop('eq');\r\n rewrite = 'modification';\r\n };\r\n\r\n // Set value\r\n t.value(json[\"value\"]);\r\n }\r\n else {\r\n KorAP.log(806, \"Value is not a valid date string\");\r\n return;\r\n };\r\n }\r\n\r\n // Key is a regular expression\r\n else if (json[\"type\"] === \"type:regex\") {\r\n t.type(\"regex\");\r\n\r\n try {\r\n\r\n // Try to create a regular expression\r\n let check = new RegExp(json[\"value\"]);\r\n\r\n if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n KorAP.log(802, errstr802);\r\n\r\n // Rewrite method\r\n t.matchop('eq');\r\n rewrite = 'modification';\r\n };\r\n\r\n t.value(json[\"value\"]);\r\n }\r\n\r\n catch (e) {\r\n KorAP.log(807, \"Value is not a valid regular expression\");\r\n return;\r\n };\r\n t.type(\"regex\");\r\n }\r\n\r\n else {\r\n KorAP.log(804, errstr804 + \": \" + t.type());\r\n throw new Error(errstr804 + \": \" + t.type());\r\n };\r\n };\r\n\r\n // Rewrite coming from the server\r\n if (json[\"rewrites\"] !== undefined) {\r\n t.rewrite(json[\"rewrites\"]);\r\n }\r\n\r\n // Rewrite coming from Kalamar\r\n else if (rewrite !== undefined) {\r\n t.rewrite(rewrite);\r\n };\r\n\r\n return t;\r\n },\r\n\r\n\r\n /**\r\n * Get or set the key\r\n */\r\n key : function (value) {\r\n if (arguments.length === 1) {\r\n this._key = value;\r\n this._changed();\r\n return this;\r\n };\r\n return this._key;\r\n },\r\n\r\n\r\n // Click on the key, show me the menu\r\n _changeKey : function (e) {\r\n const menu = KorAP._vcKeyMenu;\r\n\r\n // Insert menu\r\n this._el.insertBefore(\r\n menu.element(),\r\n this._keyE\r\n );\r\n\r\n // Release event\r\n const that = this;\r\n menu.released(function (key, type) {\r\n\r\n if (type === 'ref') {\r\n // KorAP._delete.bind(that);\r\n that.replaceWith(\r\n docGroupRefClass.create(that.parent())\r\n );\r\n }\r\n\r\n else {\r\n const doc = that.key(key).type(type);\r\n\r\n // This may not be compatible - then switch to default\r\n doc.matchop(doc.matchop());\r\n doc.value(doc.value());\r\n\r\n // Update the doc\r\n doc.update();\r\n };\r\n\r\n // hide!\r\n this.hide();\r\n });\r\n\r\n // TODO: Highlight the old value!\r\n menu.show();\r\n menu.focus();\r\n },\r\n\r\n\r\n /**\r\n * Get or set the match operator\r\n */\r\n matchop : function (match) {\r\n const t = this;\r\n\r\n if (arguments.length === 1) {\r\n const m = match.replace(/^match:/, '');\r\n\r\n if (\r\n (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n ||\r\n (\r\n (t._type === 'string' || t._type === 'regex') &&\r\n KorAP._validStringMatchRE.test(m)\r\n )\r\n ||\r\n (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n ||\r\n (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n ) {\r\n t._matchop = m;\r\n }\r\n else {\r\n t._matchop = \"eq\";\r\n };\r\n\r\n t._changed();\r\n return t;\r\n };\r\n\r\n return t._matchop || \"eq\";\r\n },\r\n\r\n\r\n // Click on the match operator, show me the menu\r\n _changeMatchop : function (e) {\r\n const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n if (menu === undefined) {\r\n KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n return;\r\n };\r\n\r\n // Insert menu\r\n this._el.insertBefore(\r\n menu.element(),\r\n this._matchopE\r\n );\r\n\r\n // Release event\r\n const that = this;\r\n menu.released(function (mo) {\r\n that.matchop(mo).update();\r\n this.hide();\r\n });\r\n\r\n menu.show();\r\n menu.focus();\r\n },\r\n\r\n\r\n /**\r\n * Get or set the type\r\n */\r\n type : function (type) {\r\n if (arguments.length === 1) {\r\n this._type = type;\r\n this._changed();\r\n return this;\r\n };\r\n return this._type || \"string\";\r\n },\r\n\r\n\r\n /**\r\n * Get or set the value\r\n */\r\n value : function (value) {\r\n const t = this;\r\n if (arguments.length === 1) {\r\n if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n delete t._value;\r\n }\r\n else {\r\n t._value = value;\r\n };\r\n t._changed();\r\n return t;\r\n };\r\n return t._value;\r\n },\r\n\r\n\r\n // Click on the match operator, show me the menu\r\n _changeValue : function (e) {\r\n const that = this;\r\n \r\n // Show datepicker\r\n if (this.type() === 'date') {\r\n const dp = KorAP._vcDatePicker;\r\n dp.fromString(this.value());\r\n\r\n // Todo: change this\r\n dp.onclick(function (selected) {\r\n\r\n // There are values selected\r\n if (selected['year']) {\r\n that.value(this.toString());\r\n that.update();\r\n return;\r\n };\r\n\r\n // Remove datepicker\r\n that._el.removeChild(\r\n dp.element()\r\n );\r\n });\r\n\r\n this._el.insertBefore(\r\n dp.show(), // Get element of the date picker\r\n this._valueE\r\n );\r\n\r\n dp.input().focus();\r\n }\r\n\r\n else {\r\n const regex = this.type() === 'regex' ? true : false;\r\n const str = stringValClass.create(this.value(), regex);\r\n const strElem = str.element();\r\n\r\n str.store = function (value, regex) {\r\n that.value(value);\r\n if (regex === true)\r\n that.type('regex');\r\n else\r\n that.type('string');\r\n \r\n that._el.removeChild(\r\n this._el\r\n );\r\n that.update();\r\n };\r\n\r\n // Insert element\r\n this._el.insertBefore(\r\n strElem,\r\n this._valueE\r\n );\r\n\r\n str.focus();\r\n };\r\n },\r\n\r\n\r\n rewrites : function () {\r\n return this._rewrites;\r\n },\r\n\r\n\r\n rewrite : function (value) {\r\n if (typeof value === 'string') {\r\n value = [{\r\n \"@type\" : \"koral:rewrite\",\r\n \"operation\" : \"operation:\" + value,\r\n \"src\" : \"Kalamar\"\r\n }];\r\n };\r\n this._rewrites = rewriteListClass.create(value);\r\n },\r\n\r\n\r\n // Mark the underlying data as being changed.\r\n // This is important for rerendering the dom.\r\n // This will also remove rewrite markers, when the data\r\n // change happened by the user\r\n _changed : function () {\r\n this.__changed = true;\r\n\r\n if (this._rewrites === undefined)\r\n return;\r\n\r\n delete this[\"_rewrites\"];\r\n \r\n if (this._el === undefined)\r\n return;\r\n\r\n this._el.classList.remove(\"rewritten\");\r\n },\r\n\r\n\r\n toJson : function () {\r\n const t = this;\r\n\r\n if (!t.matchop() || !t.key())\r\n return {};\r\n \r\n return {\r\n \"@type\" : \"koral:\" + t.ldType(),\r\n \"key\" : t.key(),\r\n \"match\" : \"match:\" + t.matchop(),\r\n \"value\" : t.value() || '',\r\n \"type\" : \"type:\" + t.type()\r\n };\r\n },\r\n\r\n\r\n incomplete : function () {\r\n return !(this.matchop() && this.key() && this.value());\r\n },\r\n\r\n\r\n toQuery : function () {\r\n if (this.incomplete())\r\n return \"\";\r\n\r\n // Build doc string based on key\r\n let string = this.key() + ' ';\r\n\r\n // Add match operator\r\n switch (this.matchop()) {\r\n case \"ne\":\r\n string += '!=';\r\n break;\r\n case \"contains\":\r\n string += '~';\r\n break;\r\n case \"excludes\":\r\n string += '!~';\r\n break;\r\n case \"containsnot\":\r\n string += '!~';\r\n break;\r\n case \"geq\":\r\n string += 'since';\r\n break;\r\n case \"leq\":\r\n string += 'until';\r\n break;\r\n default:\r\n string += (this.type() == 'date') ? 'in' : '=';\r\n break;\r\n };\r\n\r\n string += ' ';\r\n\r\n // Add value\r\n switch (this.type()) {\r\n case \"date\":\r\n return string + this.value();\r\n case \"regex\":\r\n return string + '/' + this.value().escapeRegex() + '/';\r\n case \"string\":\r\n case \"text\":\r\n return string + this.value().quote();\r\n };\r\n\r\n return \"\";\r\n }\r\n };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n 'vc/jsonld',\r\n 'vc/doc',\r\n 'vc/docgroupref',\r\n 'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n // Localize empty string\r\n const loc = KorAP.Locale;\r\n loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n return {\r\n\r\n // The ld-type\r\n _ldType : \"non\",\r\n\r\n /**\r\n * Create new unspecified criterion\r\n * with a link to the parent object\r\n */\r\n create : function (parent) {\r\n const obj = Object.create(jsonldClass).\r\n\t upgradeTo(this);\r\n\r\n if (parent !== undefined)\r\n\t obj._parent = parent;\r\n\r\n return obj;\r\n },\r\n\r\n\r\n /**\r\n * Set the key; this will spawn a new doc\r\n */\r\n key : function (v) {\r\n\r\n // Not replaceable\r\n if (this._parent === undefined)\r\n\t return null;\r\n\r\n let newDoc;\r\n const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n // Set JSON-LD type\r\n if (keyType && keyType === 'ref') {\r\n newDoc = docGroupRefClass.create(this._parent);\r\n }\r\n else {\r\n newDoc = docClass.create(this._parent);\r\n newDoc.key(v);\r\n newDoc.type(keyType);\r\n };\r\n \r\n // Unspecified document on root\r\n if (this._parent.ldType() === null) {\r\n\t this._parent.root(newDoc);\r\n\t this.destroy();\r\n }\r\n\r\n // Unspecified document in group\r\n else {\r\n\t this._parent.replaceOperand(this, newDoc);\r\n };\r\n this._parent.update();\r\n return newDoc;\r\n },\r\n\r\n\r\n /**\r\n * Update the element\r\n */\r\n update : function () {\r\n const t = this;\r\n\r\n if (t._el === undefined)\r\n\t return t.element();\r\n\r\n // Remove element content\r\n _removeChildren(t._el);\r\n\r\n const ellipsis = document.createElement('span');\r\n ellipsis.addT(loc.EMPTY);\r\n\r\n // Click on empty criterion\r\n ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n t._el.appendChild(ellipsis);\r\n\r\n // Set ref - TODO: Cleanup!\r\n t._el.refTo = t;\r\n\r\n // Set operators\r\n if (t._parent !== undefined &&\r\n t.parent().ldType() !== null) {\r\n\r\n\t t._el.appendChild(\r\n\t t.operators(\r\n\t false,\r\n\t false,\r\n\t true\r\n\t ).element()\r\n\t );\r\n };\r\n\r\n return t.element();\r\n },\r\n\r\n\r\n /**\r\n * Get the associated element\r\n */\r\n element : function () {\r\n const t = this;\r\n if (t._el !== undefined)\r\n\t return t._el;\r\n t._el = document.createElement('div');\r\n t._el.setAttribute('class', 'doc unspecified');\r\n t.update();\r\n return t._el;\r\n },\r\n\r\n\r\n incomplete : function () {\r\n return true;\r\n },\r\n \r\n\r\n /**\r\n * Click on the unspecified object\r\n */\r\n onclick : function () {\r\n\r\n // Get the key menu\r\n const menu = KorAP._vcKeyMenu;\r\n\r\n // Add key menu element at the correct position\r\n this._el.insertBefore(\r\n\t menu.element(),\t\r\n\t this._el.firstChild\r\n );\r\n\r\n const that = this;\r\n\r\n // Set released method\r\n menu.released(function (key) {\r\n\t // Set chosen key and type - will return a doc\r\n\t that.key(key).update();\r\n\t this.hide();\r\n });\r\n\r\n menu.show();\r\n menu.focus();\r\n }\r\n };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n 'vc/jsonld',\r\n 'vc/unspecified',\r\n 'vc/doc',\r\n 'vc/docgroupref',\r\n 'util'\r\n], function (jsonldClass,\r\n\t unspecClass,\r\n\t docClass,\r\n docGroupRefClass) {\r\n\r\n const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n const docGroupClass = {\r\n\r\n _ldType : \"docGroup\",\r\n\r\n create : function (parent, json) {\r\n const obj = Object.create(jsonldClass).upgradeTo(this);\r\n obj._operands = [];\r\n obj.fromJson(json);\r\n if (parent !== undefined)\r\n\t obj._parent = parent;\r\n return obj;\r\n },\r\n \r\n\r\n newAfter : function (obj) {\r\n this._operands.forEach(function (op, i) {\r\n\t if (op === obj) {\r\n\t const operand = unspecClass.create(this);\r\n\t this._operands.splice(i + 1, 0, operand);\r\n\t return this.update();\r\n\t };\r\n }, this);\r\n },\r\n\r\n\r\n // The doc is already set in the group\r\n _duplicate : function (operand) {\r\n\r\n // TODO:\r\n // Also check for duplicate docGroupRefs!\r\n if (operand.ldType() !== 'doc')\r\n\t return null;\r\n\r\n const f = this._operands.find(\r\n op => \r\n\t op.ldType() === 'doc'\r\n\t && operand.key() === op.key()\r\n\t && operand.matchop() === op.matchop()\r\n\t && operand.value() === op.value()\r\n );\r\n\r\n if (f)\r\n return f;\r\n\r\n return null;\r\n },\r\n \r\n\r\n append : function (operand) {\r\n \r\n // Append unspecified object\r\n if (operand === undefined) {\r\n\r\n\t // Be aware of cyclic structures!\r\n\t operand = unspecClass.create(this);\r\n\t this._operands.push(operand);\r\n\t return operand;\r\n };\r\n \r\n switch (operand[\"@type\"]) {\r\n\t \r\n case undefined:\r\n\t // No @type defined\r\n\t if (operand[\"ldType\"] !== undefined) {\r\n\t if (operand.ldType() !== 'doc' &&\r\n\t operand.ldType() !== 'docGroup' &&\r\n operand.ldType() !== 'docGroupRef') {\r\n\t KorAP.log(812, \"Operand not supported in document group\");\r\n\t return;\r\n\t };\r\n\r\n\t // Be aware of cyclic structures!\r\n\t operand.parent(this);\r\n\r\n\t const dupl = this._duplicate(operand);\r\n\t if (dupl === null) {\r\n\t this._operands.push(operand);\r\n\t return operand;\r\n\t };\r\n\t return dupl;\r\n\t };\r\n\r\n\t KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t return;\r\n\r\n case \"koral:doc\":\r\n\t // Be aware of cyclic structures!\r\n\t const doc = docClass.create(this, operand);\r\n\t if (doc === undefined)\r\n\t return;\r\n \r\n\t const dupl = this._duplicate(doc);\r\n\t if (dupl === null) {\r\n\t this._operands.push(doc);\r\n\t return doc;\r\n\t };\r\n\t return dupl;\r\n\r\n case \"koral:docGroup\":\r\n\r\n // Be aware of cyclic structures!\r\n\t const docGroup = docGroupClass.create(this, operand);\r\n\t if (docGroup === undefined)\r\n\t return;\r\n\r\n\t // Flatten group\r\n\t if (docGroup.operation() === this.operation()) {\r\n docGroup.operands().forEach(function(op) {\r\n\t const dupl = this._duplicate(op);\r\n\t if (dupl === null) {\r\n\t this._operands.push(op);\r\n\t op.parent(this);\r\n\t };\r\n\t }, this);\r\n\t docGroup._operands = [];\r\n\t docGroup.destroy();\r\n\t return this;\r\n\t };\r\n\t this._operands.push(docGroup);\r\n\t return docGroup;\r\n\r\n case \"koral:docGroupRef\":\r\n \r\n const docGroupRef = docGroupRefClass.create(this, operand);\r\n \r\n if (docGroupRef === undefined)\r\n return\r\n\r\n // TODO:\r\n // Currently this doesn't do anything meaningful,\r\n // as duplicate only checks on docs for the moment\r\n /*\r\n\t var dupl = this._duplicate(doc);\r\n\t if (dupl === null) {\r\n\t this._operands.push(doc);\r\n\t return doc;\r\n\t };\r\n\t return dupl;\r\n */\r\n\t this._operands.push(docGroupRef);\r\n return docGroupRef;\r\n\r\n default:\r\n\t KorAP.log(812, \"Operand not supported in document group\");\r\n\t return;\r\n };\r\n },\r\n\r\n\r\n update : function () {\r\n const t = this;\r\n\r\n // There is only one operand in group\r\n \r\n if (t._operands.length === 1) {\r\n\t \r\n\t const parent = t.parent();\r\n\t const op = t.getOperand(0);\r\n\t \r\n\t // This will prevent destruction of\r\n\t // the operand\r\n\t t._operands = [];\r\n\r\n\t // Parent is a group\r\n\t if (parent.ldType() !== null)\r\n\t return parent.replaceOperand(t, op).update();\r\n\r\n\t // Parent is vc\r\n\t else {\r\n\t t.destroy();\r\n\t // Cyclic madness\r\n\t parent.root(op);\r\n\t op.parent(parent);\r\n\t return parent.root();\r\n\t };\r\n };\r\n\r\n if (t._el === undefined)\r\n\t return t;\r\n\r\n const group = t._el;\r\n group.setAttribute('data-operation', t.operation());\r\n\r\n _removeChildren(group);\r\n\r\n // Append operands\r\n t._operands.forEach(\r\n op => group.appendChild(op.element())\r\n );\r\n\r\n // Set operators\r\n var op = t.operators(\r\n\t t.operation() == 'and' ? false : true,\r\n\t t.operation() == 'or' ? false : true,\r\n\t true\r\n );\r\n\r\n group.appendChild(op.element());\r\n\r\n if (KorAP.vc) {\r\n KorAP.vc.element().dispatchEvent(\r\n new CustomEvent('vcChange', {'detail' : t})\r\n );\r\n };\r\n \r\n return t;\r\n },\r\n\r\n\r\n element : function () {\r\n const t = this;\r\n\r\n if (t._el !== undefined)\r\n\t return t._el;\r\n\r\n const e = t._el = document.createElement('div');\r\n e.setAttribute('class', 'docGroup');\r\n\r\n // Update the object - including optimization\r\n t.update();\r\n\r\n return e;\r\n },\r\n\r\n\r\n operation : function (op) {\r\n if (arguments.length === 1) {\r\n\t if (_validGroupOpRE.test(op)) {\r\n\t this._op = op;\r\n\t }\r\n\t else {\r\n\t KorAP.log(810, \"Unknown operation type\");\r\n\t return;\r\n\t };\r\n };\r\n return this._op || 'and';\r\n },\r\n\r\n\r\n operands : function () {\r\n return this._operands;\r\n },\r\n\r\n\r\n getOperand : function (index) {\r\n return this._operands[index];\r\n },\r\n\r\n\r\n // Replace operand\r\n replaceOperand : function (oldOp, newOp) {\r\n \r\n for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t if (this._operands[i] === oldOp) {\r\n\t \r\n\t // Just insert a doc or ...\r\n\t if (newOp.ldType() === \"doc\" ||\r\n\t newOp.ldType() === \"non\" ||\r\n newOp.ldType() === 'docGroupRef' ||\r\n\t // ... insert a group of a different operation\r\n\t // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t newOp.operation() != this.operation()) {\r\n\t this._operands[i] = newOp;\r\n\t newOp.parent(this);\r\n\t }\r\n\r\n\t // Flatten group\r\n\t else {\r\n\r\n // Remove old group\r\n\t this._operands.splice(i, 1);\r\n\r\n\t // Inject new operands\r\n newOp.operands().reverse().forEach(\r\n function(op) {\r\n\t this._operands.splice(i, 0, op);\r\n\t op.parent(this);\r\n\t },\r\n this\r\n );\r\n\r\n\t // Prevent destruction of operands\r\n\t newOp._operands = [];\r\n\t newOp.destroy();\r\n\t };\r\n\r\n\t oldOp.destroy();\r\n\t return this;\r\n\t }\r\n };\r\n return false;\r\n },\r\n\r\n\r\n // Delete operand from group\r\n delOperand : function (obj) {\r\n\r\n for (let i = 0; i < this._operands.length; i++) {\r\n\t if (this._operands[i] === obj) {\r\n\t \r\n\t // Delete identified operand\r\n\t this._operands.splice(i,1);\r\n\r\n\t // Destroy object for cyclic references\r\n\t obj.destroy();\r\n\r\n\t return this;\r\n\t };\r\n };\r\n\r\n // Operand not found\r\n return undefined;\r\n },\r\n \r\n\r\n // Deserialize from json\r\n fromJson : function (json) {\r\n\r\n if (json === undefined)\r\n\t return this;\r\n\r\n if (json[\"@type\"] === undefined) {\r\n\t KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t return;\r\n };\r\n\r\n if (json[\"operation\"] === undefined ||\r\n\t typeof json[\"operation\"] !== 'string') {\r\n\t KorAP.log(811, \"Document group expects operation\");\r\n\t return;\r\n };\r\n\r\n const operation = json[\"operation\"];\r\n\r\n this.operation(operation.replace(/^operation:/,''));\r\n\r\n if (json[\"operands\"] === undefined ||\r\n\t !(json[\"operands\"] instanceof Array)) {\r\n\t KorAP.log(704, \"Operation needs operand list\")\r\n\t return;\r\n };\r\n\r\n // Add all documents\r\n json[\"operands\"].forEach(i => this.append(i));\r\n \r\n return this;\r\n },\r\n\r\n\r\n toJson : function () {\r\n const opArray = new Array();\r\n this._operands.forEach(function(op) {\r\n\t if (op.ldType() !== 'non')\r\n\t opArray.push(op.toJson());\r\n });\r\n\r\n return {\r\n\t \"@type\" : \"koral:\" + this.ldType(),\r\n\t \"operation\" : \"operation:\" + this.operation(),\r\n\t \"operands\" : opArray\r\n };\r\n },\r\n\r\n\r\n toQuery : function (brackets) {\r\n var list = this._operands\r\n\t .filter(function (op) {\r\n return !op.incomplete();\r\n\t })\r\n\t .map(function (op) {\r\n\t return (op.ldType() === 'docGroup') ?\r\n\t op.toQuery(true) :\r\n\t op.toQuery();\r\n\t });\r\n \r\n if (list.length === 1)\r\n\t return list.join('');\r\n else {\r\n\t const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t return brackets ? '(' + str + ')' : str;\r\n };\r\n }\r\n };\r\n \r\n return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n const loc = KorAP.Locale;\r\n\r\n return {\r\n\r\n /**\r\n * Create new menu item.\r\n * Pass two parameters: value and type.\r\n * the value may be localized by a name in\r\n * KorAP.Locale with the prefix 'VC_',\r\n * e.g. 'VC_subTitle'.\r\n */\r\n create : function (params) {\r\n return Object.create(itemClass)\r\n\t .upgradeTo(this)\r\n\t ._init(params);\r\n },\r\n\r\n\r\n // Initialize item object\r\n _init : function (params) {\r\n const t = this;\r\n\r\n if (params[0] === undefined)\r\n\t throw new Error(\"Missing parameters\");\r\n\r\n t._key = params[0];\r\n t._type = params[1];\r\n\r\n const k = t._key;\r\n t._name = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n return t;\r\n },\r\n\r\n\r\n /**\r\n * Override click event by passing all clicks\r\n * to the menu object.\r\n */\r\n onclick : function (e) {\r\n this.menu().release(\r\n\t this._key,\r\n\t this._type\r\n );\r\n e.halt();\r\n },\r\n\r\n\r\n /**\r\n * Get the name of the item.\r\n * This is a potential localized version\r\n * of the value.\r\n */\r\n name : function () {\r\n return this._name;\r\n },\r\n\r\n\r\n /**\r\n * Get the type of the item.\r\n */\r\n type : function () {\r\n return this._type;\r\n },\r\n\r\n\r\n /**\r\n * Get the key of the item.\r\n */\r\n key : function () {\r\n return this._key;\r\n },\r\n\r\n\r\n /**\r\n * Get the HTML element associated with the item. \r\n */\r\n element : function () {\r\n const t = this;\r\n\r\n // already defined\r\n if (t._el !== undefined)\r\n\t return t._el;\r\n\r\n // Create list item\r\n var li = document.createElement(\"li\");\r\n if (t._type)\r\n li.setAttribute(\"data-type\", t._type);\r\n\r\n li.setAttribute(\"data-key\", t._key);\r\n\r\n // Connect action\r\n li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n li.addT(t._name);\r\n return t._el = li;\r\n }\r\n };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n return {\r\n\r\n /**\r\n * Create prefix object for the hint helper menu.\r\n */\r\n create : function (params) {\r\n return Object.create(prefixClass).\r\n\t upgradeTo(this)._init(params);\r\n },\r\n\r\n\r\n /**\r\n * Override the prefix action.\r\n */\r\n onclick : function (e) {\r\n var m = this.menu();\r\n var value = this.value();\r\n m.release(value, \"string\");\r\n }\r\n };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n 'menu',\r\n 'vc/item',\r\n 'vc/prefix'\r\n], function (\r\n menuClass,\r\n itemClass,\r\n prefixClass) {\r\n\r\n return {\r\n\r\n create : function (params) {\r\n const obj = Object.create(menuClass)\r\n .upgradeTo(this)\r\n ._init(params, {\r\n itemClass : itemClass,\r\n prefixClass : prefixClass\r\n });\r\n obj.limit(6);\r\n\r\n // This is only domspecific\r\n obj.element().addEventListener(\r\n 'blur', function (e) {\r\n this.menu.hide();\r\n }\r\n );\r\n \r\n return obj;\r\n },\r\n\r\n\r\n /**\r\n * Register callback for click event.\r\n */\r\n released : function (cb) {\r\n this._cb = cb;\r\n },\r\n\r\n\r\n /**\r\n * A click event was released\r\n */\r\n release : function (key, type) {\r\n if (this._cb !== undefined)\r\n this._cb(key, type);\r\n },\r\n\r\n\r\n /**\r\n * Return a key type based on a key.\r\n * This is a linear search, but should work okay for small\r\n * VCs and small key lists.\r\n */\r\n typeOf : function (key) {\r\n const found = this._items.find(i => i.key() === key);\r\n\r\n if (found)\r\n return found.type();\r\n }\r\n };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n return {\r\n\r\n /**\r\n * Create new statistic object\r\n */\r\n create : function (statistic) {\r\n return Object.create(this)._init(statistic);\r\n },\r\n\r\n\r\n /**\r\n * Initialize statistic object\r\n */\r\n _init : function (statistic) {\r\n if (statistic === undefined) {\r\n throw new Error(\"Missing parameter\");\r\n } else {\r\n this._statistic = statistic;\r\n return this;\r\n }\r\n },\r\n\r\n\r\n /**\r\n * Display statistic object as HTML Description List Element\r\n */\r\n element : function () {\r\n\r\n // if this._el already exists return without doing something\r\n if (this._el !== undefined) {\r\n return this._el;\r\n }\r\n\r\n // create HTML Description List Element\r\n const statDL = document.createElement('dl');\r\n statDL.classList.add(\"flex\");\r\n\r\n const statistic = this._statistic;\r\n let statSp, statDT, statDD;\r\n\r\n Object.keys(statistic).forEach(function (k) {\r\n statSp = statDL.addE('div')\r\n statDT = statSp.addE('dt');\r\n statDT.addT(k);\r\n statDT.setAttribute('title', k);\r\n statDD = statSp.addE('dd');\r\n statDD.addT(new Number(statistic[k]).toLocaleString());\r\n });\r\n\r\n this._el = statDL;\r\n return this._el;\r\n }\r\n }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n KorAP._validDateRE = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n /*\r\n * Localizations\r\n */\r\n const loc = KorAP.Locale;\r\n loc.WDAY = loc.WDAY || [\r\n 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n ];\r\n loc.MONTH = loc.MONTH || [\r\n 'January', 'February', 'March', 'April',\r\n 'May', 'June', 'July', 'August',\r\n 'September', 'October', 'November',\r\n 'December'\r\n ];\r\n\r\n const d = document;\r\n\r\n // The datepicker class\r\n return {\r\n\r\n /**\r\n * Create a new datepicker view.\r\n */\r\n create : function () {\r\n return Object.create(this)._init();\r\n },\r\n\r\n\r\n // Init datepicker\r\n _init : function () {\r\n this._selected = [];\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Get or select a specific date.\r\n */\r\n select : function (year, month, day) {\r\n const t = this;\r\n if (arguments.length >= 1) {\r\n t._selected = {'year' : year};\r\n t._showYear = year;\r\n if (arguments.length >= 2) {\r\n t._selected['month'] = month;\r\n t._showMonth = month;\r\n if (arguments.length >= 3) {\r\n t._selected['day'] = day;\r\n t._showDay = day;\r\n };\r\n };\r\n\r\n return t;\r\n };\r\n\r\n return t._selected;\r\n },\r\n\r\n\r\n /**\r\n * Select a specific date and\r\n * init the accompanied action.\r\n */\r\n set : function (year, month, day) {\r\n this.select(year, month, day);\r\n this._store();\r\n },\r\n\r\n\r\n // Store the selected value\r\n _store : function () {\r\n if (this._click !== undefined)\r\n this._click(this._selected);\r\n else \r\n console.dir(this._selected);\r\n },\r\n\r\n \r\n /**\r\n * Set the action for clicking as a callback.\r\n * The callback will retrieve a an object with\r\n * an optional year attribute,\r\n * an optional month attribute,\r\n * and an optional day attribute\r\n */\r\n onclick : function (cb) {\r\n this._click = cb;\r\n },\r\n\r\n\r\n /**\r\n * The associated input field.\r\n */\r\n input : function () {\r\n return this._input;\r\n },\r\n \r\n\r\n /**\r\n * Show the datepicker.\r\n * Will either show the selected year/month\r\n * or the current date.\r\n * Will return the element for appending to the dom.\r\n */\r\n show : function (year, month) {\r\n\r\n const e = this._el = d.createElement('div');\r\n e.setAttribute('tabindex', 0);\r\n e.style.outline = 0;\r\n e.classList.add('datepicker');\r\n \r\n const today = new Date();\r\n const t = this;\r\n\r\n // Show year\r\n t._showYear = (year !== undefined) ? year :\r\n (t._selected['year'] ? this._selected['year'] :\r\n today.getYear() + 1900);\r\n\r\n // Show month\r\n t._showMonth = month ? month :\r\n (t._selected['month'] ? t._selected['month'] :\r\n (today.getMonth() + 1));\r\n\r\n // Append all helpers\r\n e.appendChild(t._monthHelper());\r\n e.appendChild(t._yearHelper());\r\n e.appendChild(t._dayHelper());\r\n t._input = e.appendChild(t._stringHelper());\r\n\r\n // Always focus\r\n e.addEventListener(\r\n 'mousedown',\r\n function (ev) {\r\n this._inField = true\r\n }.bind(t)\r\n );\r\n\r\n e.addEventListener(\r\n 'mouseup',\r\n function (ev) {\r\n this._inField = false;\r\n this._input.focus();\r\n }.bind(t)\r\n );\r\n\r\n t._input.addEventListener(\r\n 'blur',\r\n function (ev) {\r\n if (!this._inField) {\r\n if (this.fromString(this._input.value)) {\r\n this._store();\r\n };\r\n };\r\n ev.halt();\r\n }.bind(t)\r\n );\r\n\r\n t._input.focus();\r\n\r\n return t._el;\r\n },\r\n\r\n _stringHelper : function () {\r\n\r\n // Create element\r\n // Add input field\r\n const input = d.createElement('input');\r\n input.value = this.toString();\r\n input.setAttribute('tabindex', 0);\r\n\r\n input.addEventListener(\r\n 'keyup',\r\n function (e) {\r\n if (this.fromString(input.value)) {\r\n this._updateYear();\r\n this._updateMonth();\r\n this._updateDay();\r\n };\r\n }.bind(this)\r\n );\r\n\r\n input.addEventListener(\r\n 'keypress',\r\n function (e) {\r\n if (e.keyCode == 13) {\r\n if (this.fromString(input.value))\r\n this._store();\r\n\r\n e.halt();\r\n return false;\r\n }\r\n }.bind(this)\r\n )\r\n\r\n return input;\r\n },\r\n\r\n\r\n /**\r\n * Get the HTML element associated with the datepicker.\r\n */\r\n element : function () {\r\n return this._el;\r\n },\r\n\r\n\r\n /**\r\n * Get the current date in string format.\r\n */\r\n today : function () {\r\n const today = new Date();\r\n let str = today.getYear() + 1900;\r\n const m = today.getMonth() + 1;\r\n const d = today.getDate();\r\n str += '-' + (m < 10 ? '0' + m : m);\r\n str += '-' + (d < 10 ? '0' + d : d);\r\n return str;\r\n },\r\n\r\n\r\n /**\r\n * Stringification\r\n */\r\n toString : function () {\r\n // There are values selected\r\n let v = '';\r\n const s = this._selected;\r\n if (s['year']) {\r\n v += s['year'];\r\n if (s['month']) {\r\n v += '-';\r\n v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n if (s['day']) {\r\n v += '-';\r\n v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n };\r\n };\r\n };\r\n return v;\r\n },\r\n\r\n\r\n /**\r\n * Increment the year.\r\n */\r\n incrYear : function () {\r\n const t = this;\r\n if (t._showYear < 9999) {\r\n t._showYear++;\r\n t._updateYear();\r\n t._updateMonth();\r\n t._updateDay();\r\n return t;\r\n };\r\n return;\r\n },\r\n\r\n\r\n /**\r\n * Decrement the year.\r\n */\r\n decrYear : function () {\r\n const t = this;\r\n if (t._showYear > 0) {\r\n t._showYear--;\r\n t._updateYear();\r\n t._updateMonth();\r\n t._updateDay();\r\n return t;\r\n };\r\n return;\r\n },\r\n\r\n\r\n /**\r\n * Increment the month.\r\n */\r\n incrMonth : function () {\r\n const t = this;\r\n t._showMonth++;\r\n if (t._showMonth > 12) {\r\n t._showMonth = 1;\r\n t.incrYear();\r\n }\r\n else {\r\n t._updateMonth();\r\n t._updateDay();\r\n };\r\n return t;\r\n },\r\n\r\n\r\n /**\r\n * Decrement the month.\r\n */\r\n decrMonth : function () {\r\n const t = this;\r\n t._showMonth--;\r\n if (t._showMonth < 1) {\r\n t._showMonth = 12;\r\n t.decrYear();\r\n }\r\n else {\r\n t._updateMonth();\r\n t._updateDay();\r\n };\r\n\r\n return t;\r\n },\r\n\r\n\r\n // Create the year helper element.\r\n _yearHelper : function () {\r\n const t = this;\r\n const year = d.createElement('div');\r\n year.classList.add('year');\r\n\r\n // Decrement year\r\n year.addE('span')\r\n .onclick = t.decrYear.bind(t);\r\n\r\n t._yElement = year.addE('span');\r\n t._yElement.addT(t._showYear);\r\n\r\n t._yElement.onclick = function () {\r\n t.set(t._showYear);\r\n }.bind(t);\r\n t._selectYear();\r\n\r\n // Increment year\r\n year.addE('span')\r\n .onclick = t.incrYear.bind(t);\r\n\r\n return year;\r\n },\r\n\r\n\r\n // Update the year helper view.\r\n _updateYear : function () {\r\n this._yElement.firstChild.data = this._showYear;\r\n this._selectYear();\r\n },\r\n\r\n\r\n // Check if the viewed year is current\r\n _selectYear : function () {\r\n if (this._showYear === this.select()['year'])\r\n this._yElement.classList.add('selected');\r\n else\r\n this._yElement.classList.remove('selected');\r\n },\r\n\r\n\r\n // Create the month helper element.\r\n _monthHelper : function () {\r\n const t = this;\r\n const month = d.createElement('div');\r\n month.classList.add('month');\r\n\r\n // Decrement month\r\n month.addE('span')\r\n .onclick = t.decrMonth.bind(t);\r\n \r\n t._mElement = month.addE('span');\r\n t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n t._mElement.onclick = function () {\r\n this.set(this._showYear, this._showMonth);\r\n }.bind(t);\r\n\r\n t._selectMonth();\r\n \r\n // Increment month\r\n month.addE('span')\r\n .onclick = t.incrMonth.bind(t);\r\n\r\n return month;\r\n },\r\n\r\n // Update the month helper view.\r\n _updateMonth : function () {\r\n if (this._showMonth === undefined || this._showMonth > 12)\r\n this._showMonth = 1;\r\n\r\n this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n this._selectMonth();\r\n },\r\n\r\n\r\n // Check if the viewed month is current\r\n _selectMonth : function () {\r\n const t = this;\r\n if (t._showYear === t.select()['year'] &&\r\n t._showMonth === t.select()['month'])\r\n t._mElement.classList.add('selected');\r\n else\r\n t._mElement.classList.remove('selected');\r\n },\r\n\r\n\r\n // Create the day (calendar) helper element.\r\n _dayHelper : function () {\r\n const table = d.createElement('table');\r\n\r\n // Localized day view\r\n const tr = table.addE('thead').addE('tr');\r\n for (let i = 0; i < 7; i++) {\r\n tr.addE('th').addT(loc.WDAY[i]);\r\n };\r\n\r\n this._dBElement = this._dayBody();\r\n\r\n table.appendChild(this._dBElement);\r\n return table;\r\n },\r\n\r\n\r\n // Create day body for calendar table\r\n _dayBody : function () {\r\n const showDate = new Date(\r\n this._showYear,\r\n this._showMonth - 1,\r\n 1,\r\n 0,\r\n 0,\r\n 0,\r\n 0\r\n );\r\n const date = new Date(\r\n this._showYear,\r\n this._showMonth - 1,\r\n 1,\r\n 0,\r\n 0,\r\n 0,\r\n 0\r\n );\r\n const today = new Date();\r\n const that = this;\r\n\r\n // What happens, in case someone clicks\r\n // on a date\r\n const click = function () {\r\n that.set(\r\n that._showYear,\r\n that._showMonth,\r\n parseInt(this.firstChild.data)\r\n );\r\n };\r\n\r\n // Skip back to the previous monday (may be in the last month)\r\n date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n const tb = d.createElement('tbody');\r\n\r\n const s = this.select();\r\n \r\n let tr, i, td;\r\n\r\n // Iterate over all days of the table\r\n while (1) {\r\n\r\n // Loop through the week\r\n tr = tb.addE('tr');\r\n for (i = 0; i < 7; i++) {\r\n td = tr.addE('td');\r\n \r\n // Not part of the current month\r\n if (date.getMonth() !== showDate.getMonth()) {\r\n td.classList.add('out');\r\n }\r\n else {\r\n td.onclick = click;\r\n };\r\n \r\n // This is the current day\r\n if (date.getDate() === today.getDate() &&\r\n date.getMonth() === today.getMonth() &&\r\n date.getFullYear() === today.getFullYear()) {\r\n td.classList.add('today');\r\n };\r\n\r\n // This is the day selected\r\n if (s && s['day']) {\r\n if (date.getDate() === s['day'] &&\r\n date.getMonth() === s['month']-1 &&\r\n date.getFullYear() === s['year']) {\r\n td.classList.add('selected');\r\n };\r\n };\r\n \r\n // Add the current day to the table\r\n td.addT(date.getDate());\r\n \r\n // Next day\r\n date.setDate(date.getDate() + 1);\r\n };\r\n \r\n if (date.getMonth() !== showDate.getMonth())\r\n break;\r\n };\r\n return tb;\r\n },\r\n\r\n // Update the calendar view\r\n _updateDay : function () {\r\n const newBody = this._dayBody();\r\n this._dBElement.parentNode.replaceChild(\r\n newBody,\r\n this._dBElement\r\n );\r\n this._dBElement = newBody;\r\n },\r\n\r\n\r\n /**\r\n * Parse date from string.\r\n */\r\n fromString : function (v) {\r\n if (v === undefined)\r\n return false;\r\n\r\n if (!KorAP._validDateRE.test(v))\r\n return false;\r\n\r\n const d = v.split('-', 3);\r\n d[0] = parseInt(d[0]);\r\n if (d[1]) d[1] = parseInt(d[1]);\r\n if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n // Select values\r\n this.select(d[0], d[1], d[2]);\r\n return true;\r\n }\r\n };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n return {\r\n create : function (classes) {\r\n return Object.create(this)._init(classes);\r\n },\r\n\r\n\r\n // Override by inheriting object\r\n _init : function (classes) {\r\n const t = this;\r\n t.views = [];\r\n\r\n /**\r\n * Main action buttons for the panel,\r\n * may be at the bottom (for matches)\r\n * or as tabs (for the result).\r\n */\r\n\r\n t._classes = classes;\r\n const c = ['action', 'button-panel'];\r\n\r\n if (classes)\r\n c.push.apply(c,classes);\r\n\r\n t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n //prepend or append views of the panel\r\n t.prepend = false;\r\n \r\n // Warning: This is circular\r\n t.actions.panel = t;\r\n return t;\r\n },\r\n\r\n \r\n /**\r\n * The element of the panel\r\n */\r\n element : function () {\r\n if (this._el)\r\n return this._el;\r\n\r\n // Create panel element\r\n const e = document.createElement('div');\r\n const cl = e.classList;\r\n cl.add('panel');\r\n \r\n if (this._classes)\r\n cl.add.apply(cl, this._classes);\r\n\r\n this._viewE = e.addE('div');\r\n\r\n // Per default the action buttons are below the view\r\n // and integrated\r\n const aElem = this.actions.element();\r\n if (!aElem.parentNode)\r\n e.appendChild(aElem);\r\n\r\n return this._el = e;\r\n },\r\n\r\n\r\n /*\r\n * The element of the views\r\n */\r\n _viewElement : function () {\r\n this.element();\r\n return this._viewE;\r\n },\r\n\r\n\r\n /**\r\n * Add a view to the panel\r\n */\r\n add : function (view) {\r\n\r\n // Add view to views list\r\n this.views.push(view);\r\n\r\n // Append or prepend element to panel element\r\n if (this.prepend){\r\n this._viewElement().prepend(\r\n view.element()\r\n );\r\n }\r\n else{\r\n this._viewElement().appendChild(\r\n view.element()\r\n );\r\n }\r\n \r\n if (view.afterEmbed)\r\n view.afterEmbed();\r\n \r\n view.panel = this;\r\n },\r\n\r\n\r\n /**\r\n * Delete a closed view from panel\r\n */\r\n delView : function (view) {\r\n this.views.forEach(function(e, i, a) {\r\n if (e === view)\r\n a[i] = undefined;\r\n });\r\n },\r\n\r\n\r\n /**\r\n * Upgrade this object to another object,\r\n * while private data stays intact.\r\n *\r\n * @param {Object] An object with properties.\r\n */\r\n upgradeTo : function (props) {\r\n for (let prop in props) {\r\n this[prop] = props[prop];\r\n };\r\n return this;\r\n }\r\n }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n const loc = KorAP.Locale;\r\n loc.CLOSE = loc.CLOSE || 'Close'; \r\n\r\n return {\r\n create : function (classes) {\r\n return Object.create(this)._init(classes);\r\n },\r\n\r\n // Override by inheriting object\r\n _init : function (classes) {\r\n this.panel = undefined;\r\n this._classes = classes;\r\n this._shown = false;\r\n\r\n // The buttonclass is bind to the view\r\n const c = ['action', 'button-view'];\r\n if (classes)\r\n c.push.apply(c,classes);\r\n \r\n this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n this.close();\r\n });\r\n\r\n // Warning: This is circular\r\n this.actions.view = this;\r\n\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Element of the view\r\n */\r\n element : function () {\r\n if (this._el) {\r\n this._el.classList.add('show');\r\n return this._el;\r\n };\r\n\r\n // Create panel element\r\n const e = document.createElement('div');\r\n const cl = e.classList;\r\n\r\n cl.add('view', 'show');\r\n if (this._classes)\r\n cl.add.apply(cl, this._classes);\r\n\r\n // TODO: The show may need to be wrapped in another DIV!\r\n if (this.show !== undefined) {\r\n const s = this.show();\r\n if (s) {\r\n e.appendChild(s);\r\n } else {\r\n return e\r\n };\r\n }\r\n\r\n this._shown = true;\r\n\r\n e.appendChild(this.actions.element());\r\n\r\n return this._el = e;\r\n },\r\n\r\n\r\n /**\r\n * Is the object shown?\r\n */\r\n shown : function () {\r\n return this._shown;\r\n },\r\n\r\n \r\n /**\r\n * Hide the widget if shown.\r\n */\r\n minimize : function () {\r\n if (this._el) {\r\n this._el.classList.remove(\"show\");\r\n }\r\n },\r\n\r\n\r\n // onClose : function () {},\r\n\r\n \r\n /**\r\n * Close the view.\r\n */\r\n close : function () {\r\n\r\n // Close embedded things before\r\n if (this.onClose)\r\n this.onClose();\r\n\r\n const e = this.element();\r\n if (e.parentNode) {\r\n e.parentNode.removeChild(e);\r\n };\r\n this.panel.delView(this);\r\n this._shown = false;\r\n },\r\n\r\n\r\n /**\r\n * Upgrade this object to another object,\r\n * while private data stays intact.\r\n *\r\n * @param {Object] An object with properties.\r\n */\r\n upgradeTo : function (props) {\r\n for (let prop in props) {\r\n this[prop] = props[prop];\r\n };\r\n return this;\r\n }\r\n };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n function (viewClass, statClass, buttonGroup) {\r\n\r\n // Localization values\r\n const loc = KorAP.Locale;\r\n loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n return {\r\n create : function(vc, panel) {\r\n return Object.create(viewClass).\r\n _init([ 'vcstatistic' ]).\r\n upgradeTo(this).\r\n _init(vc, panel);\r\n },\r\n\r\n _init : function(vc, panel) {\r\n this.vc = vc;\r\n this.panel = panel;\r\n return this;\r\n },\r\n\r\n /*\r\n * Returns corpus of the view,\r\n * vc is used to create the corpus query string \r\n * which is needed to receive the corpus statistic from the server \r\n * (see also getStatistic : function(cb) {...))\r\n */\r\n getvc : function() {\r\n return this.vc;\r\n },\r\n\r\n\r\n /**\r\n * Receive Corpus statistic from the server\r\n */\r\n getStatistic : function (cb) {\r\n const vc = this.vc;\r\n\r\n try {\r\n KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n if (statResponse === null) {\r\n cb(null);\r\n return;\r\n }\r\n if (statResponse === undefined) {\r\n cb(null);\r\n return;\r\n }\r\n\r\n // catches notifications\r\n if (statResponse[\"notifications\"] !== null\r\n && statResponse[\"notifications\"] !== undefined) {\r\n const notif = statResponse[\"notifications\"];\r\n KorAP.log(0, notif[0][1]);\r\n cb(null);\r\n return;\r\n }\r\n\r\n cb(statResponse);\r\n });\r\n }\r\n\r\n catch (e) {\r\n KorAP.log(0, e);\r\n cb(null);\r\n }\r\n\r\n },\r\n\r\n /** \r\n * Show corpus statistic view \r\n */\r\n show : function() {\r\n \r\n if (this._show)\r\n return this._show; \r\n \r\n const statTable = document.createElement('div');\r\n statTable.classList.add('stattable', 'loading');\r\n \r\n /*\r\n * Get corpus statistic, remove \"loading\"-image and\r\n * append result to statTable\r\n */\r\n this.getStatistic(function(statistic) {\r\n statTable.classList.remove('loading');\r\n\r\n if (statistic === null)\r\n return;\r\n\r\n statTable.appendChild(\r\n statClass.create(statistic).element()\r\n );\r\n });\r\n\r\n return this._show = statTable;\r\n },\r\n\r\n \r\n /**\r\n * Checks if statistic has to be disabled\r\n */\r\n checkStatActive : function () {\r\n let newString = KorAP.vc.toQuery();\r\n const oldString = this.vc.oldvcQuery;\r\n /*\r\n * Do ignore surrounding round brackets\r\n * Definining an incomplete docGroup in the vc builder: \r\n * (foo = bar and author = Goethe) and ... \r\n * leads to \r\n * vc.toQuery() -> (foo = bar and author=Goethe)\r\n */\r\n \r\n if (newString || newString === '') {\r\n if (newString.startsWith('(')) {\r\n newString = newString.slice(1, newString.length-1);\r\n };\r\n \r\n if (newString != oldString) {\r\n this.disableStat();\r\n }\r\n }\r\n },\r\n \r\n\r\n /**\r\n * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n */ \r\n disableStat : function(){\r\n const statt = this._show;\r\n \r\n if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n statt.classList.remove('stdisabled');\r\n this.panel.reloadCorpStat(); \r\n }.bind(this));\r\n\r\n statt.appendChild(btg.element());\r\n statt.classList.add('stdisabled');\r\n };\r\n },\r\n\r\n \r\n /**\r\n * Close the view.\r\n */\r\n onClose : function() {\r\n this.vc = undefined;\r\n }\r\n }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n 'panel',\r\n 'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n \r\n const d = document;\r\n\r\n // Localization values\r\n const loc = KorAP.Locale;\r\n loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT || 'Corpus Statistics';\r\n \r\n return {\r\n create : function (vc) {\r\n return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n }, \r\n \r\n _init : function(vc){\r\n this.vc = vc;\r\n const actions = this.actions;\r\n actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n this.addCorpStat();\r\n }.bind(this));\r\n return this;\r\n },\r\n \r\n\r\n /**\r\n * Add corpus statistic view to panel\r\n */\r\n addCorpStat: function(){\r\n const t = this;\r\n\r\n //Refreshes corpus statistic\r\n if (t.statView !== undefined && t.statView.shown()){\r\n let statt = t.statView.show();\r\n if (statt.classList.contains('stdisabled')){\r\n t.reloadCorpStat(); \r\n statt.classList.remove('stdisabled');\r\n }\r\n };\r\n \r\n //Add corpus statistic\r\n if (t.statView === undefined || !t.statView.shown()) {\r\n t.statView = corpStatVClass.create(t.vc,t);\r\n t.add(t.statView);\r\n t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n };\r\n },\r\n \r\n /**\r\n * Reload corpus statistic \r\n *\r\n */\r\n reloadCorpStat: function(){\r\n this.statView.close();\r\n this.addCorpStat();\r\n } \r\n }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n TODO: Disable \"and\" or \"or\" in case it's followed \r\n by an unspecified document\r\n TODO: Add \"and\"-method to root to add further constraints \r\n based on match-input (like clicking on a pubDate timestamp in a match) \r\n TODO: Implement \"persistence\"-Option, injecting the current creation \r\n date stamp \r\n TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n Error codes: \r\n 701: \"JSON-LD group has no @type attribute\" \r\n 704: \"Operation needs operand list\" \r\n 802: \"Match type is not supported by value type\" \r\n 804: \"Unknown value type\" \r\n 805: \"Value is invalid\" \r\n 806: \"Value is not a valid date string\" \r\n 807: \"Value is not a valid regular expression\" \r\n 810: \"Unknown document group operation\" (like 711) \r\n 811: \"Document group expects operation\" (like 703) \r\n 812: \"Operand not supported in document group\" (like 744) \r\n 813: \"Collection type is not supported\" (like 713) \r\n 814: \"Unknown rewrite operation\" \r\n 815: \"Rewrite expects source\"\r\n \r\n Localization strings: \r\n KorAP.Locale = {\r\n EMPTY : '...', \r\n AND : 'and', \r\n OR : 'or',\r\n DELETE : 'x' }\r\n \r\n and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n 'vc/unspecified',\r\n 'vc/doc',\r\n 'vc/docgroup',\r\n 'vc/docgroupref',\r\n 'vc/menu',\r\n 'vc/statistic',\r\n 'datepicker',\r\n 'buttongroup',\r\n 'panel/vc',\r\n 'view/vc/corpstatv',\r\n 'buttongroup',\r\n 'util'\r\n], function(\r\n unspecDocClass,\r\n docClass,\r\n docGroupClass,\r\n docGroupRefClass,\r\n menuClass,\r\n statClass,\r\n dpClass,\r\n buttonGrClass,\r\n vcPanelClass,\r\n corpStatVClass,\r\n buttonGroupClass) {\r\n\r\n KorAP._validUnspecMatchRE = new RegExp(\r\n \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n KorAP._validTextOnlyMatchRE = new RegExp(\r\n \"^(?:contains(?:not)?|excludes)$\");\r\n KorAP._overrideStyles = false;\r\n // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n const loc = KorAP.Locale;\r\n loc.SHOW_STAT = loc.SHOW_STAT || 'Statistics';\r\n loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT || 'Corpus Statistics';\r\n loc.VC_allCorpora = loc.VC_allCorpora || 'all corpora';\r\n loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n loc.MINIMIZE = loc.MINIMIZE || 'Minimize';\r\n\r\n KorAP._vcKeyMenu = undefined;\r\n KorAP._vcDatePicker = dpClass.create();\r\n\r\n // Create match menus ....\r\n KorAP._vcMatchopMenu = {\r\n 'string' : menuClass.create([\r\n [ 'eq', null ],\r\n [ 'ne', null ]\r\n ]),\r\n 'text' : menuClass.create([\r\n [ 'eq', null ], // Requires exact match\r\n [ 'ne', null ],\r\n [ 'contains', null ], // Requires token sequence match\r\n [ 'containsnot', null ]\r\n ]),\r\n 'date' : menuClass.create([\r\n [ 'eq', null ],\r\n [ 'ne', null ],\r\n [ 'geq', null ],\r\n [ 'leq', null ]\r\n ]),\r\n 'regex' : menuClass.create([\r\n [ 'eq', null ],\r\n [ 'ne', null ]\r\n ])\r\n };\r\n\r\n\r\n /**\r\n * Virtual corpus\r\n */\r\n return {\r\n\r\n /**\r\n * The JSON-LD type of the virtual corpus\r\n */\r\n ldType : function() {\r\n return null;\r\n },\r\n\r\n\r\n // Initialize virtual corpus\r\n _init : function(keyList) {\r\n\r\n // Inject localized css styles\r\n if (!KorAP._overrideStyles) {\r\n\r\n const sheet = KorAP.newStyleSheet();\r\n\r\n // Add css rule for OR operations\r\n sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n // Add css rule for AND operations\r\n sheet.insertRule(\r\n '.vc .docGroup[data-operation=and] > .doc::before,'\r\n + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n KorAP._overrideStyles = true;\r\n };\r\n\r\n let l;\r\n if (keyList) {\r\n l = keyList.slice();\r\n l.unshift(['referTo', 'ref']);\r\n }\r\n else {\r\n l = [['referTo', 'ref']];\r\n }\r\n \r\n // Create key menu\r\n KorAP._vcKeyMenu = menuClass.create(l);\r\n KorAP._vcKeyMenu.limit(6);\r\n\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Create a new virtual corpus\r\n */\r\n create : function (keyList) {\r\n const obj = Object.create(this)._init(keyList);\r\n obj._root = unspecDocClass.create(obj);\r\n return obj;\r\n },\r\n\r\n\r\n /**\r\n * Create and render a new virtual corpus based on a KoralQuery\r\n * corpus document\r\n */\r\n fromJson : function(json) {\r\n\r\n let obj;\r\n \r\n if (json !== undefined) {\r\n\r\n // Parse root document\r\n if (json['@type'] == 'koral:doc') {\r\n obj = docClass.create(this, json);\r\n }\r\n\r\n // parse root group\r\n else if (json['@type'] == 'koral:docGroup') {\r\n obj = docGroupClass.create(this, json);\r\n }\r\n\r\n // parse root reference\r\n else if (json['@type'] == 'koral:docGroupRef') {\r\n obj = docGroupRefClass.create(this, json);\r\n }\r\n \r\n // Unknown collection type\r\n else {\r\n KorAP.log(813, \"Collection type is not supported\");\r\n return;\r\n };\r\n }\r\n\r\n else {\r\n // Add unspecified object\r\n obj = unspecDocClass.create(this);\r\n };\r\n\r\n // Init element and update\r\n this.root(obj); \r\n \r\n return this;\r\n },\r\n\r\n\r\n // Check if the virtual corpus contains a rerite\r\n wasRewritten : function (obj) {\r\n\r\n if (arguments.length !== 1) {\r\n obj = this._root;\r\n };\r\n\r\n // Check for rewrite\r\n if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n return true;\r\n }\r\n\r\n // Check recursively\r\n else if (obj.ldType() === 'docGroup') {\r\n\r\n // If there was a rewritten object\r\n if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n return true;\r\n };\r\n };\r\n \r\n return false;\r\n },\r\n\r\n \r\n /**\r\n * Clean the virtual document to unspecified doc.\r\n */\r\n clean : function() {\r\n const t = this;\r\n if (t._root.ldType() !== \"non\") {\r\n t._root.destroy();\r\n t.root(unspecDocClass.create(t));\r\n };\r\n\r\n // update for graying corpus statistic by deleting the first line of the vc builder\r\n t.update();\r\n return t;\r\n },\r\n\r\n\r\n /**\r\n * Get or set the root object of the virtual corpus\r\n */\r\n root : function(obj) {\r\n if (arguments.length === 1) {\r\n const e = this.builder();\r\n \r\n if (e.firstChild !== null) {\r\n\r\n // Object not yet set\r\n if (e.firstChild !== obj.element()) {\r\n e.replaceChild(obj.element(), e.firstChild);\r\n };\r\n }\r\n\r\n // Append root element\r\n else {\r\n e.appendChild(obj.element());\r\n };\r\n\r\n // Update parent child relations\r\n this._root = obj;\r\n obj.parent(this);\r\n\r\n this.update();\r\n };\r\n\r\n return this._root;\r\n },\r\n\r\n\r\n /**\r\n * Get the wrapper element associated with the vc\r\n */\r\n builder : function () {\r\n const t = this;\r\n\r\n // Initialize if necessary\r\n if (t._builder !== undefined)\r\n return t._builder;\r\n\r\n t.element();\r\n return t._builder;\r\n },\r\n \r\n\r\n /**\r\n * Get the element associated with the virtual corpus\r\n */\r\n element : function() {\r\n const t = this;\r\n let e = t._el;\r\n\r\n if (e !== undefined)\r\n return e;\r\n\r\n\r\n e = t._el = document.createElement('div');\r\n e.classList.add('vc');\r\n\r\n\r\n t._builder = e.addE('div');\r\n t._builder.setAttribute('class', 'builder');\r\n\r\n const btn = buttonGroupClass.create(\r\n ['action','button-view']\r\n );\r\n\r\n btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n this.minimize();\r\n }.bind(t));\r\n\r\n e.appendChild(btn.element());\r\n \r\n // Initialize root\r\n t._builder.appendChild(t._root.element()); \r\n \r\n // Add panel to display corpus statistic, ...\r\n t.addVcInfPanel();\r\n \r\n //Adds EventListener for corpus changes\r\n t._el.addEventListener('vcChange', function (e) {\r\n this.checkStatActive(e.detail);\r\n }.bind(t), false);\r\n \r\n return e;\r\n },\r\n\r\n\r\n /**\r\n * Check, if the VC is open\r\n */\r\n isOpen : function () {\r\n if (!this._el)\r\n return false;\r\n return this._el.classList.contains('active');\r\n },\r\n \r\n\r\n /**\r\n * Open the VC view\r\n */\r\n open : function () {\r\n this.element().classList.add('active');\r\n if (this.onOpen)\r\n this.onOpen();\r\n },\r\n\r\n\r\n /**\r\n * Minimize the VC view\r\n */\r\n minimize : function () {\r\n this.element().classList.remove('active');\r\n if (this.onMinimize)\r\n this.onMinimize();\r\n },\r\n\r\n \r\n /**\r\n * Update the whole object based on the underlying data structure\r\n */ \r\n update : function() {\r\n this._root.update();\r\n if (KorAP.vc) {\r\n this.element().dispatchEvent(\r\n new CustomEvent('vcChange', {'detail':this})\r\n );\r\n };\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Make the vc persistant by injecting the current timestamp as a\r\n * creation date limit criterion.\r\n * THIS IS CURRENTLY NOT USED\r\n */\r\n /*\r\n makePersistant : function() {\r\n // this.root().wrapOnRoot('and');\r\n var todayStr = KorAP._vcDatePicker.today();\r\n var doc = docClass.create();\r\n var root = this.root();\r\n\r\n if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n root.append(cond);\r\n } else {\r\n root.wrapOnRoot('and');\r\n root.append(doc);\r\n };\r\n\r\n doc.key(\"creationDate\");\r\n doc.type(\"date\");\r\n doc.matchop(\"leq\");\r\n doc.value(todayStr);\r\n\r\n // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n // this.root().append(cond);\r\n this.update();\r\n },\r\n */\r\n\r\n\r\n // Get the reference name\r\n getName : function () {\r\n if (this._root.ldType() === 'non') {\r\n return loc.VC_allCorpora;\r\n }\r\n else if (this._root.ldType() === 'docGroupRef') {\r\n return this._root.ref();\r\n }\r\n else {\r\n return loc.VC_oneCollection;\r\n }\r\n },\r\n\r\n\r\n // Add \"and\" constraint to VC\r\n addRequired : function (doc) {\r\n const root = this.root();\r\n const ldType = root.ldType();\r\n const parent = root.parent();\r\n\r\n if (ldType === 'non') {\r\n parent.root(doc);\r\n }\r\n\r\n // root is doc\r\n else if (\r\n ldType === 'doc' ||\r\n ldType === 'docGroupRef' ||\r\n (ldType === 'docGroup' &&\r\n root.operation() === 'or'\r\n )) {\r\n const group = require('vc/docgroup').create(\r\n parent\r\n );\r\n group.operation(\"and\");\r\n group.append(root);\r\n group.append(doc);\r\n group.element(); // Init (seems to be necessary)\r\n parent.root(group);\r\n }\r\n \r\n // root is a docGroup\r\n // and is already an 'and'-Group\r\n else if (ldType === 'docGroup') {\r\n root.append(doc);\r\n }\r\n\r\n // Unknown\r\n else {\r\n console.log(\"Unknown root object\");\r\n };\r\n\r\n // Init element and update\r\n this.update();\r\n },\r\n \r\n\r\n /**\r\n * Get the generated json string\r\n */\r\n toJson : function () {\r\n return this._root.toJson();\r\n },\r\n\r\n\r\n /**\r\n * Get the generated query string\r\n */\r\n toQuery : function () {\r\n return this._root.toQuery();\r\n },\r\n\r\n \r\n /**\r\n * Add panel to display virtual corpus information\r\n */\r\n addVcInfPanel : function () {\r\n // Create panel \r\n this.panel = vcPanelClass.create(this); \r\n this._el.addE('div').appendChild(this.panel.element());\r\n \r\n },\r\n \r\n /**\r\n * Checks if corpus statistic has to be disabled,\r\n * and to be updated after clicking at the \"reload-button\"\r\n */\r\n checkStatActive : function (){\r\n if (this.panel !== undefined && this.panel.statView !== undefined){\r\n this.panel.statView.checkStatActive();\r\n };\r\n }\r\n };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n const loc = KorAP.Locale;\r\n \r\n //Query example for guided tour\r\n loc.TOUR_Qexample = \"laufen\";\r\n\r\n /* To define vc for guided tour */\r\n loc.TOUR_vcQuery = {\r\n '@type' : 'koral:doc',\r\n 'key' : 'docSigle', \r\n 'match': 'match:eq',\r\n 'value' : 'WPD17/D01', \r\n };\r\n \r\n loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('loc/de',[],function () {\r\n const loc = KorAP.Locale;\r\n loc.OR = 'oder';\r\n loc.AND = 'und';\r\n // EMPTY, DELETE\r\n\r\n // Virtual corpus:\r\n loc.VC_allCorpora = 'allen Korpora';\r\n loc.VC_oneCollection = 'einem virtuellen Korpus';\r\n\r\n // Regex:\r\n loc.REGEX_DESC = loc.REGEX_DESC || 'Regulären Ausdruck verwenden';\r\n\r\n // Date picker:\r\n loc.WDAY = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];\r\n loc.MONTH = [\r\n 'Januar', 'Februar', 'März', 'April',\r\n 'Mai', 'Juni', 'Juli', 'August',\r\n 'September', 'Oktober', 'November',\r\n 'Dezember'\r\n ];\r\n\r\n // Match view\r\n loc.ADDTREE = 'Relationen';\r\n loc.SHOWANNO = 'Token';\r\n loc.SHOWINFO = 'Informationen';\r\n loc.CLOSE = 'Schließen';\r\n loc.MINIMIZE = 'Zuklappen';\r\n loc.DOWNLOAD = 'Herunterladen';\r\n loc.TOGGLE_ALIGN = 'tausche Textausrichtung';\r\n loc.SHOW_KQ = 'zeige KoralQuery';\r\n loc.SHOW_META = 'Metadaten';\r\n loc.NEW_QUERY = 'Neue Anfrage';\r\n \r\n //Corpus statistic\r\n loc.SHOW_STAT = 'Korpusstatistik';\r\n loc.REFRESH = 'Neu laden';\r\n //verbose description, for title attributes for example\r\n //loc.VERB_SHOWSTAT = 'Korpusstatistik';\r\n\r\n loc.NEW_CONSTRAINT = 'Neue Bedingung';\r\n\r\n //Guided Tour:Buttonlabels\r\n loc.TOUR_lskip = \"Abbrechen\";\r\n loc.TOUR_lprev = \"Zurück\";\r\n loc.TOUR_lnext = \"Weiter\";\r\n loc.TOUR_ldone = \"Beenden\";\r\n loc.TOUR_ldoneSearch = \"Suchen\";\r\n \r\n //Guided Tour: Steps\r\n loc.TOUR_welc = \"<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> \" +\r\n \"<p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. \" +\r\n \"Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>\"; \r\n loc.TOUR_sear1 = \"Eingabe der Suchanfrage, zum Beispiel die Suche nach '\" + loc.TOUR_Qexample + \"'.\" ;\r\n loc.TOUR_searAnnot =\"Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.\";\r\n loc.TOUR_annotAss = \"Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.\";\r\n loc.TOUR_vccho1 = \"Öffnen des Korpusassistenten\";\r\n loc.TOUR_vccho2 = \"Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.\";\r\n loc.TOUR_vcStat1 = \"Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.\";\r\n loc.TOUR_vcStat2 = \"Korpusstatistik\";\r\n loc.TOUR_qlfield = \"Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.\";\r\n loc.TOUR_glimpse = \"Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.\";\r\n loc.TOUR_help = \"Hilfe zu KorAP\";\r\n loc.TOUR_seargo = \"Suchanfrage starten\";\r\n\r\n \r\n //Guided Tour: explain the result\r\n loc.TOUR_kwic = \"Anzeige des Ergebnisses als KWIC (keyword in context).\";\r\n loc.TOUR_snippet = \"Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.\"; \r\n loc.TOUR_snippetb = \"Anzeige des Snippets\";\r\n loc.TOUR_metadatab = \"Durch die Auswahl des Buttons werden die Metadaten angezeigt.\";\r\n loc.TOUR_metadata = \"Anzeige der Metadaten\";\r\n loc.TOUR_tokenb = loc.TOUR_tokenb || \"Anzeige der Token-Annotationen\";\r\n loc.TOUR_token = loc.TOUR_token || \"KorAP unterstützt multiple Annotationen.\";\r\n loc.TOUR_treeb = loc.TOUR_tree || \"Anzeige weiterer Ansichten\"\r\n loc.TOUR_tree = loc.TOUR_tree || \"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.\";\r\n loc.TOUR_tourdone = \"Viel Spaß mit KorAP!\";\r\n \r\n \r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n /**\r\n * Menu item for tree view choice.\r\n */\r\n\r\n return {\r\n\r\n /**\r\n * Create new menu item\r\n * for tree views.\r\n */\r\n create : function (params) {\r\n return Object.create(itemClass)\r\n\t .upgradeTo(this)._init(params);\r\n },\r\n\r\n /**\r\n * Get or set the content of the\r\n * menu item.\r\n */\r\n content : function (content) {\r\n if (arguments.length === 1) {\r\n\t this._content = content;\r\n };\r\n return this._content;\r\n },\r\n \r\n\r\n /**\r\n * The foundry attribute of the menu item.\r\n */\r\n foundry : function () {\r\n return this._foundry;\r\n },\r\n\r\n\r\n /**\r\n * The layer attribute of the menu item.\r\n */\r\n layer : function () {\r\n return this._layer;\r\n },\r\n\r\n\r\n /**\r\n * The type attribute of the menu item.\r\n * Is either \"spans\" or \"rels\".\r\n */\r\n type : function () {\r\n return this._type;\r\n },\r\n \r\n\r\n /**\r\n * Override click action of the menu item.\r\n */\r\n onclick : function (e) {\r\n const menu = this.menu();\r\n menu.hide();\r\n e.halt();\r\n\r\n if (menu.panel() !== undefined) {\r\n\t menu.panel().addTree(this._foundry, this._layer, this._type);\r\n };\r\n },\r\n\r\n\r\n // Initialize tree menu item.\r\n _init : function (params) {\r\n if (params[0] === undefined)\r\n\t throw new Error(\"Missing parameters\");\r\n\r\n const t = this;\r\n\r\n t._name = params[0];\r\n t._foundry = params[1];\r\n t._layer = params[2];\r\n t._type = params[3];\r\n t._content = document.createTextNode(t._name);\r\n t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n return t;\r\n }\r\n };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n /*\r\n * TODO:\r\n * Cache foundry and layer information per row.\r\n * TODO:\r\n * Or-Groups are no longer in use.\r\n * TODO:\r\n * Make language and input fields snigletons!\r\n */\r\n const loc = KorAP.Locale;\r\n loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n \r\n function _getKeyValue (keyValue) {\r\n if (keyValue.match(esc) != null) {\r\n return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n };\r\n return keyValue;\r\n };\r\n \r\n function _getAnnotation (prefix, target) {\r\n\r\n // Complex annotation\r\n if (target.childNodes.length > 1) {\r\n let orGroup = [];\r\n\r\n // Iterate over alternative annotations\r\n target.childNodes.forEach(function (item) {\r\n if (item.nodeType === 3)\r\n orGroup.push(prefix + _getKeyValue(item.data));\r\n });\r\n return '(' + orGroup.sort().join(' | ') + ')';\r\n }\r\n\r\n // Simple annotation\r\n else {\r\n if (target.innerText == '')\r\n return '';\r\n\r\n return prefix + _getKeyValue(target.innerText);\r\n };\r\n };\r\n\r\n return {\r\n\r\n /**\r\n * Constructor\r\n */\r\n create : function (matchTable) {\r\n return Object.create(this)._init(matchTable);\r\n },\r\n\r\n // Initialize query creator\r\n _init : function (matchTable) {\r\n\r\n // Parameter checks\r\n if (matchTable === undefined)\r\n throw new Error('Missing parameters');\r\n else if (!(matchTable instanceof Node))\r\n throw new Error('Requires element');\r\n\r\n const t = this;\r\n\r\n // Collect the token sequence in an array\r\n t._query = []\r\n\r\n // Get the match table\r\n t._matchTable = matchTable;\r\n\r\n // Listen on the match table\r\n t._matchTable.addEventListener(\r\n \"click\", t.clickOnAnno.bind(t), false\r\n );\r\n\r\n // Initialize element\r\n const e = t._el = document.createElement('p');\r\n e.classList.add('query','fragment');\r\n\r\n // Prepend info text\r\n e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n // Append query fragment part\r\n t._queryFragment = e.addE('span');\r\n\r\n // Event when the query fragment is clicked\r\n e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n // Get some basic information - see tutorial.js\r\n // TODO:\r\n // It may be better to consultate a global object\r\n // like KorAP.Hint, however ...\r\n t._ql = document.getElementById(\"ql-field\");\r\n\t t._q = document.getElementById(\"q-field\")\r\n\r\n t._shown = false;\r\n return t;\r\n },\r\n\r\n\r\n // Realease a click event on the annotation table\r\n clickOnAnno : function (event) {\r\n \r\n // Listen for clicks on table cells\r\n if (event.target !== event.currentTarget) {\r\n\r\n // Get target event\r\n const target = event.target;\r\n\r\n let head, foundry, layer, i, sib, annotation;\r\n\r\n if (target.tagName == 'TD') {\r\n\r\n if (target.innerText == '')\r\n return;\r\n\r\n if (target.classList.contains('matchkeyvalues'))\r\n return;\r\n\r\n\r\n // Check foundry and layer\r\n head = target.parentNode.getElementsByTagName('th');\r\n foundry = head[0].innerText;\r\n layer = head[1].innerText;\r\n\r\n // Check index position:\r\n i = -2;\r\n sib = target;\r\n while ((sib = sib.previousSibling) != null) {\r\n if (sib.nodeType === 1)\r\n i++;\r\n };\r\n\r\n // Get annotation value from cell\r\n annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n if (annotation !== '') {\r\n\r\n // Add term\r\n this.toggleInToken(target, i, annotation);\r\n };\r\n }\r\n\r\n // The annotation is part of a key-value-pair\r\n else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n if (target.innerText == '')\r\n return;\r\n\r\n if (target.tagName == 'SPAN') {\r\n target = target.parentNode;\r\n };\r\n\r\n // Check foundry and layer\r\n const parentCell = target.parentNode;\r\n head = parentCell.parentNode.getElementsByTagName('th');\r\n foundry = head[0].innerText;\r\n layer = head[1].innerText;\r\n\r\n // Check index position of parent cell\r\n i = -2;\r\n sib = parentCell;\r\n while((sib = sib.previousSibling) != null) {\r\n if (sib.nodeType === 1)\r\n i++;\r\n };\r\n\r\n // Get annotation value from cell\r\n annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n if (annotation !== '') {\r\n\r\n // Add term\r\n this.toggleInToken(target, i, annotation);\r\n }\r\n }\r\n\r\n // Get orth values\r\n else if (target.tagName == 'TH') {\r\n\r\n // The head is in the top row\r\n if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n // Ignore cutted field\r\n if (target.classList.contains(\"cutted\")) {\r\n return;\r\n }\r\n\r\n i = -2;\r\n sib = target;\r\n while ((sib = sib.previousSibling) != null) {\r\n if (sib.nodeType === 1)\r\n i++;\r\n };\r\n\r\n // Target is an orth\r\n if (i >= 0) {\r\n this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n } \r\n }\r\n\r\n // The head refers to the complete row\r\n // Mark the complete row!\r\n else {\r\n\r\n // Check foundry and layer\r\n head = target.parentNode.getElementsByTagName('th');\r\n foundry = head[0].innerText;\r\n layer = head[1].innerText;\r\n const prefix = foundry + '/' + layer + '=';\r\n\r\n // Iterate over all siblings\r\n i = 0;\r\n sib = target;\r\n while ((sib = sib.nextSibling) != null) {\r\n if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n continue;\r\n\r\n // Is a key-value-cell\r\n if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n Array.from(\r\n sib.getElementsByTagName('div')\r\n ).forEach(function(keyvaluepair){\r\n\r\n // Get annotation value from cell\r\n annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n if (annotation !== '') {\r\n\r\n // Add annotation to string\r\n this._addToToken(i, annotation);\r\n keyvaluepair.classList.add('chosen');\r\n };\r\n }, this);\r\n }\r\n\r\n // Normal cell\r\n else {\r\n\r\n // Get annotation value from cell\r\n annotation = _getAnnotation(prefix, sib);\r\n\r\n if (annotation !== '') {\r\n\r\n // Add annotation to string\r\n this._addToToken(i, annotation);\r\n sib.classList.add('chosen');\r\n };\r\n }\r\n\r\n i++;\r\n };\r\n };\r\n };\r\n };\r\n\r\n event.stopPropagation();\r\n },\r\n\r\n\r\n // Add term to token\r\n _addToToken : function (index, term) {\r\n\r\n let token = this._query[index];\r\n\r\n // Initialize token\r\n if (token === undefined) {\r\n token = this._query[index] = [];\r\n };\r\n\r\n // Push to token array\r\n token.push(term);\r\n\r\n // Make terms unique\r\n this._query[index] = token.filter(\r\n function (e, i, arr) {\r\n return arr.lastIndexOf(e) === i;\r\n }\r\n );\r\n\r\n this.show();\r\n },\r\n\r\n\r\n // Remove term from token\r\n _removeFromToken : function (index, term) {\r\n let token = this._query[index];\r\n\r\n if (token === undefined)\r\n return;\r\n\r\n token.splice(token.indexOf(term), 1);\r\n\r\n this._query[index] = token.length > 0 ? token : undefined;\r\n \r\n this.show();\r\n },\r\n\r\n \r\n // Get element representing annotation line\r\n element : function () {\r\n return this._el;\r\n },\r\n\r\n\r\n // Check if the query fragment is shown\r\n shown : function () {\r\n return this._shown;\r\n },\r\n\r\n \r\n // Show annotation fragment\r\n show : function () {\r\n\r\n const t = this;\r\n const str = t.toString();\r\n const m = t._matchTable;\r\n\r\n // Fragment is empty\r\n if (str === '') {\r\n\r\n // Hide element\r\n if (t._shown === true) {\r\n m.parentNode.removeChild(t._el);\r\n t._shown = false;\r\n }\r\n }\r\n\r\n // Fragment is defined\r\n else {\r\n\r\n if (t._shown === false) {\r\n\r\n // Insert after\r\n m.parentNode.insertBefore(\r\n t._el, m.nextSibling\r\n );\r\n t._shown = true;\r\n };\r\n\r\n // set value\r\n t._queryFragment.innerText = str;\r\n };\r\n },\r\n\r\n\r\n // Add term to token if not yet chosen, otherwise remove\r\n toggleInToken : function (node, index, term) {\r\n const cl = node.classList;\r\n if (cl.contains('chosen')) {\r\n this._removeFromToken(index, term);\r\n cl.remove('chosen');\r\n }\r\n else {\r\n this._addToToken(index, term);\r\n cl.add('chosen');\r\n };\r\n },\r\n\r\n\r\n // Stringify annotation\r\n toString : function () {\r\n let str = '';\r\n let distance = 0;\r\n\r\n // This needs to take undefined tokens into account, therefore\r\n // forEach() is not an option\r\n let token;\r\n for (let i = 0; i < this._query.length; i++) {\r\n token = this._query[i];\r\n\r\n // Token is defined\r\n if (token !== undefined) {\r\n if (distance > 0) {\r\n str += '[]';\r\n if (distance > 1) {\r\n str += '{' + distance + '}';\r\n };\r\n distance = 0;\r\n };\r\n \r\n str += '[' + token.sort().join(\" & \") + ']';\r\n }\r\n\r\n // Token is not defined - but distances count\r\n else if (str !== '') {\r\n distance++;\r\n };\r\n };\r\n\r\n return str;\r\n },\r\n\r\n\r\n // Add query fragment to query bar\r\n toQueryBar : function (e) {\r\n const t = this;\r\n\r\n if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n console.log('No query language object defined');\r\n return;\r\n };\r\n\r\n // Find query language field for Poliqarp\r\n const ql = Array.from(\r\n t._ql.options\r\n ).find(e => e.value == 'poliqarp');\r\n\r\n if (ql)\r\n ql.selected = true;\r\n\r\n // Insert to query bar\r\n t._q.value = t.toString();\r\n\r\n // Scroll to top\r\n window.scrollTo(0, 0);\r\n }\r\n }; \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n 'match/querycreator',\r\n \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n /*\r\n * TODO:\r\n * Create base object for all matchinfo classes!\r\n * TODO:\r\n * Rename to match/annotationtable\r\n */\r\n const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n const d = document;\r\n\r\n return {\r\n\r\n /**\r\n * Create new table view for a match\r\n * based on a snippet string.\r\n */\r\n create : function (snippet) {\r\n return Object.create(this)._init(snippet);\r\n },\r\n\r\n // Initialize table based on snippet\r\n _init : function (snippet) {\r\n\r\n // Create html for traversal\r\n const html = d.createElement(\"div\");\r\n const t = this;\r\n html.innerHTML = snippet;\r\n \r\n t._pos = 0;\r\n t._token = [];\r\n t._mark = [];\r\n t._markE = undefined;\r\n t._cutted = [];\r\n t._info = [];\r\n t._foundry = {};\r\n t._layer = {};\r\n \r\n // Parse the snippet\r\n t._parse(html.childNodes, false); \r\n\r\n html.innerHTML = '';\r\n return t;\r\n },\r\n\r\n\r\n // TODO: Destroy match!\r\n destroy : function () {\r\n this._matchCreator = undefined;\r\n },\r\n\r\n\r\n /**\r\n * Length of the table (columns),\r\n * aka the number of tokens\r\n * in the snippet.\r\n */\r\n length : function () {\r\n return this._pos;\r\n },\r\n\r\n\r\n /**\r\n * Move the viewport to the match\r\n */\r\n toMark : function () {\r\n if (this._markE === undefined)\r\n return;\r\n this._markE.scrollIntoView({\r\n inline: \"start\",\r\n block: \"nearest\"\r\n });\r\n },\r\n \r\n\r\n /**\r\n * Get the token in the snippet\r\n * At a given position.\r\n *\r\n * @param pos\r\n */\r\n getToken : function (pos) {\r\n if (pos === undefined)\r\n return this._token;\r\n return this._token[pos];\r\n },\r\n\r\n\r\n /**\r\n * Get the annotation of a token\r\n * in the snippet based on the position,\r\n * the foundry, and the layer.\r\n *\r\n * @param pos\r\n * @param foundry\r\n * @param layer\r\n */\r\n getValue : function (pos, foundry, layer) {\r\n return this._info[pos][foundry + '/' + layer]\r\n },\r\n\r\n\r\n // Parse the snippet\r\n _parse : function (children, mark) {\r\n\r\n // Get all children\r\n children.forEach(function(c) {\r\n const t = this;\r\n\r\n // Create object on position unless it exists\r\n if (t._info[t._pos] === undefined) {\r\n t._info[t._pos] = {};\r\n };\r\n\r\n // Store at position in foundry/layer as array\r\n const found = t._info[t._pos];\r\n\r\n // Element with title\r\n if (c.nodeType === 1) {\r\n let newMark = mark;\r\n\r\n if (c.tagName === 'MARK') {\r\n newMark = true;\r\n }\r\n\r\n else if (c.hasAttribute(\"title\") &&\r\n _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n // Fill position with info\r\n let foundry, layer, value;\r\n if (RegExp.$2) {\r\n foundry = RegExp.$1;\r\n layer = RegExp.$2;\r\n }\r\n else {\r\n foundry = \"base\";\r\n layer = RegExp.$1\r\n };\r\n\r\n value = RegExp.$3;\r\n \r\n if (found[foundry + \"/\" + layer] === undefined) {\r\n found[foundry + \"/\" + layer] = [value];\r\n }\r\n else {\r\n // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n if (!found[foundry + \"/\" + layer].includes(value)) {\r\n // Push value to foundry/layer at correct position\r\n found[foundry + \"/\" + layer].push(value);\r\n };\r\n }\r\n\r\n // Set foundry\r\n if (t._foundry[foundry] === undefined)\r\n t._foundry[foundry] = {};\r\n t._foundry[foundry][layer] = 1;\r\n\r\n // Set layer\r\n if (t._layer[layer] === undefined)\r\n t._layer[layer] = {};\r\n t._layer[layer][foundry] = 1;\r\n }\r\n\r\n // The current position marks a cut\r\n else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n t._cutted.push(t._pos);\r\n t._token[t._pos++] = \"\"; \r\n }\r\n\r\n // depth search\r\n if (c.hasChildNodes())\r\n t._parse(c.childNodes, newMark);\r\n }\r\n\r\n // Leaf node\r\n // store string on position and go to next string\r\n else if (c.nodeType === 3) {\r\n if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n t._mark[t._pos] = mark ? true : false;\r\n t._token[t._pos++] = c.nodeValue;\r\n };\r\n };\r\n }, this);\r\n\r\n delete this._info[this._pos];\r\n },\r\n\r\n\r\n /**\r\n * Get HTML table view of annotations.\r\n */\r\n element : function () {\r\n if (this._el !== undefined)\r\n return this._el;\r\n\r\n // First the legend table\r\n const wrap = d.createElement('div');\r\n\r\n const table = wrap.addE('table');\r\n\r\n this._el = wrap;\r\n\r\n // Single row in head\r\n let tr = table.addE('thead').addE('tr');\r\n\r\n const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n \r\n // Add cell to row\r\n const addCell = function (type, key, value) { \r\n const c = this.addE(type);\r\n\r\n if (value === undefined)\r\n return c;\r\n\r\n if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n // There are multiple values to add\r\n c.classList.add('matchkeyvalues');\r\n\r\n let e, anno;\r\n value.forEach(function(v) {\r\n e = c.addE('div');\r\n e.addT(v);\r\n\r\n anno = ah.getDesc(key, v);\r\n\r\n if (anno)\r\n e.setAttribute(\"title\", anno);\r\n });\r\n }\r\n\r\n else {\r\n\r\n if (value instanceof Array)\r\n value = value[0];\r\n\r\n c.addT(value);\r\n\r\n // Add tooltip\r\n const anno = ah.getDesc(key, value);\r\n if (anno)\r\n c.setAttribute(\"title\", anno);\r\n };\r\n\r\n return c;\r\n };\r\n\r\n tr.addCell = addCell;\r\n\r\n // Add header information\r\n tr.addCell('th', undefined, 'Foundry');\r\n tr.addCell('th', undefined, 'Layer');\r\n\r\n // Add tokens\r\n Object.keys(this._token).forEach(function(i) {\r\n const surface = this.getToken(i);\r\n const c = tr.addCell('th', undefined, surface);\r\n if (this._mark[i]) {\r\n c.classList.add('mark');\r\n if (this._markE === undefined) {\r\n this._markE = c;\r\n };\r\n }\r\n else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n c.classList.add('cutted');\r\n };\r\n\r\n // In case the title is very long - add a title attribute\r\n if (surface.length > 20) {\r\n c.setAttribute(\"title\", surface)\r\n }\r\n }, this);\r\n \r\n const tbody = table.addE('tbody');\r\n\r\n let layerList, key, v, value, cell;\r\n \r\n Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n let layerList =\r\n Object.keys(this._foundry[foundry]).sort();\r\n\r\n layerList.forEach(function(layer) {\r\n\r\n tr = tbody.addE('tr');\r\n tr.setAttribute('tabindex', 0);\r\n tr.addCell = addCell;\r\n tr.addCell('th', undefined, foundry);\r\n tr.addCell('th', undefined, layer);\r\n\r\n key = foundry + '/' + layer + '=';\r\n\r\n for (v = 0; v < this.length(); v++) {\r\n\r\n // Get the cell value\r\n value = this.getValue(v, foundry, layer);\r\n\r\n // Add cell to row\r\n cell = tr.addCell(\r\n 'td',\r\n key,\r\n value \r\n );\r\n\r\n if (this._mark[v]) {\r\n cell.classList.add('mark');\r\n };\r\n };\r\n }, this);\r\n }, this);\r\n \r\n // Add query creator\r\n this._matchCreator = matchQueryCreator.create(this._el);\r\n \r\n return this._el;\r\n },\r\n };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n const _AvailableRE =\r\n new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n return {\r\n /**\r\n * Create new match information\r\n * object for one layer.\r\n *\r\n * Alternatively pass a string as\r\n * <tt>base/s=span</tt>\r\n *\r\n * @param foundry\r\n */\r\n create : function (foundry, layer, type) {\r\n return Object.create(this)._init(foundry, layer, type);\r\n },\r\n\r\n\r\n // Initialize Layer \r\n _init : function (foundry, layer, type) {\r\n if (foundry === undefined)\r\n\t throw new Error(\"Missing parameters\");\r\n\r\n const t = this;\r\n \r\n if (layer === undefined) {\r\n\t if (_AvailableRE.exec(foundry)) {\r\n\t t.foundry = RegExp.$1;\r\n\t t.layer = RegExp.$2;\r\n\t t.type = RegExp.$3;\r\n\t }\r\n\t else {\r\n\t throw new Error(\"Missing parameters\");\r\n\t };\r\n }\r\n else {\r\n\t t.foundry = foundry;\r\n\t t.layer = layer;\r\n\t t.type = type;\r\n };\r\n \r\n if (t.type === undefined)\r\n\t t.type = 'tokens';\r\n\r\n return t;\r\n }\r\n };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n 'view',\r\n 'match/table',\r\n 'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n const d = document;\r\n \r\n return {\r\n create : function (match) {\r\n return Object.create(viewClass)\r\n ._init(['tokentable'])\r\n .upgradeTo(this)\r\n ._init(match);\r\n },\r\n\r\n\r\n _init : function (match) {\r\n this._match = match;\r\n return this;\r\n },\r\n \r\n\r\n /**\r\n * TokenTable view element\r\n */\r\n show : function () {\r\n if (this._show)\r\n return this._show;\r\n\r\n // Append default table\r\n const matchtable = d.createElement('div');\r\n matchtable.classList.add('matchtable', 'loading');\r\n this._show = matchtable;\r\n return matchtable;\r\n },\r\n\r\n\r\n /**\r\n * Do after embedding\r\n */\r\n afterEmbed : function () {\r\n // TODO:\r\n // Create try-catch-exception-handling\r\n\r\n // TODO:\r\n // Loading should have a timeout on view-level\r\n // matchtable.classList.remove('loading');\r\n\r\n // var that = this;\r\n const matchtable = this._show;\r\n\r\n // Create the table asynchronous\r\n this.getData(undefined, function (table) {\r\n\r\n if (table !== null) {\r\n matchtable.appendChild(table.element());\r\n table.toMark();\r\n\t };\r\n });\r\n\r\n // Load data\r\n matchtable.classList.remove('loading'); \r\n },\r\n\r\n\r\n /**\r\n * Get match object\r\n */\r\n match : function () {\r\n return this._match;\r\n },\r\n\r\n\r\n /**\r\n * Retrieve and parse snippet for table\r\n * representation\r\n */\r\n getData : function (tokens, cb) {\r\n let focus = [];\r\n\r\n // Get all tokens\r\n if (tokens === undefined) {\r\n focus = this._match.getTokens();\r\n }\r\n\r\n // Get only some tokens\r\n else {\r\n \r\n // Push newly to focus array\r\n tokens.forEach(function(term) {\r\n try {\r\n // Create info layer objects\r\n const layer = infoLayerClass.create(term);\r\n layer.type = \"tokens\";\r\n focus.push(layer);\r\n }\r\n catch (e) {\r\n return;\r\n };\r\n });\r\n };\r\n \r\n // No tokens chosen\r\n if (focus.length == 0)\r\n cb(null);\r\n\r\n try {\r\n // Get info (may be cached)\r\n KorAP.API.getMatchInfo(\r\n this._match,\r\n { 'spans' : false, 'layer' : focus },\r\n \r\n // Callback for retrieval\r\n function (matchResponse) {\r\n\r\n if (matchResponse === undefined)\r\n cb(null);\r\n\r\n // Get snippet from match info\r\n if (matchResponse[\"snippet\"] !== undefined) {\r\n cb(\r\n this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n );\r\n };\r\n }.bind(this)\r\n );\r\n }\r\n catch (e) {\r\n KorAP.log(0, e);\r\n cb(null);\r\n };\r\n\r\n /*\r\n // Todo: Store the table as a hash of the focus\r\n return null;\r\n */\r\n },\r\n\r\n\r\n // Delete circular references\r\n onClose : function () {\r\n this._match = undefined;\r\n }\r\n }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n const loc = KorAP.Locale;\r\n loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n \r\n // Create a VC doc\r\n function _doc (op) {\r\n const doc = document.createElement('div');\r\n doc.setAttribute('class','doc');\r\n \r\n const key = doc.addE('span');\r\n key.setAttribute('class','key');\r\n key.addT(op[0]);\r\n\r\n const match = doc.addE('span');\r\n match.setAttribute('class','match');\r\n match.addT('eq');\r\n\r\n const value = doc.addE('span');\r\n value.setAttribute('class', 'value');\r\n value.addT(op[1]);\r\n\r\n return doc;\r\n };\r\n\r\n\r\n // Return object\r\n return {\r\n\r\n /**\r\n * Construct a new VC fragment.\r\n */\r\n create : function () {\r\n const obj = Object.create(this);\r\n obj._operands = [];\r\n return obj;\r\n },\r\n\r\n\r\n /**\r\n * Add document constraint to fragment\r\n */\r\n add : function (key, value, type) {\r\n this._operands.forEach(function (op, i, arr) {\r\n if (op[0] === key && op[1] === value) {\r\n arr.splice(i,1);\r\n }\r\n });\r\n this._operands.push([key, value, type]);\r\n this.update();\r\n },\r\n\r\n \r\n /**\r\n * Remove document constraint from fragment\r\n */\r\n remove : function (key, value) {\r\n for (let i = 0; i < this._operands.length; i++) {\r\n let op = this._operands[i];\r\n if (op[0] === key && op[1] === value) {\r\n this._operands.splice(i, 1);\r\n this.update();\r\n return;\r\n };\r\n };\r\n return;\r\n },\r\n\r\n\r\n /**\r\n * Check, if the fragment contains any constraints\r\n */\r\n isEmpty : function () {\r\n return this._operands.length > 0 ? false : true;\r\n },\r\n \r\n\r\n /**\r\n * Get the element associated with the virtual corpus\r\n */\r\n element : function () {\r\n if (this._el !== undefined) {\r\n return this._el;\r\n };\r\n\r\n // Initialize element\r\n const e = this._el = document.createElement('div');\r\n e.classList.add('vc', 'fragment');\r\n\r\n // Prepend info text\r\n e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n this._frag = e.addE('div');\r\n \r\n return e;\r\n },\r\n\r\n\r\n /**\r\n * Return operands as document objects\r\n */\r\n documents : function () {\r\n return this._operands.map(\r\n function (item) {\r\n const doc = docClass.create();\r\n doc.key(item[0]);\r\n doc.matchop(\"eq\");\r\n doc.value(item[1]);\r\n doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n return doc;\r\n }\r\n );\r\n },\r\n\r\n\r\n /**\r\n * Update the whole object based on the underlying data structure\r\n */\r\n update : function() {\r\n\r\n // <div class=\"docGroup\" data-operation=\"and\">\r\n // <div class=\"doc\">\r\n // <span class=\"key\">author</span>\r\n // <span class=\"match\">eq</span>\r\n // <span class=\"value\">Baum</span>\r\n // </div>\r\n // </div>\r\n let root;\r\n const l = this._operands.length;\r\n\r\n if (l > 1) {\r\n root = document.createElement('div');\r\n root.setAttribute('class','docGroup');\r\n root.setAttribute('data-operation', 'and');\r\n this._operands.forEach(i => root.appendChild(_doc(i)));\r\n }\r\n\r\n else if (l == 1) {\r\n root = _doc(this._operands[0]);\r\n };\r\n\r\n // Init element\r\n this.element();\r\n\r\n const e = this._frag;\r\n if (l === 0) {\r\n _removeChildren(e);\r\n }\r\n else if (e.firstChild)\r\n e.replaceChild(root, e.firstChild);\r\n else\r\n e.appendChild(root);\r\n \r\n return this;\r\n },\r\n\r\n \r\n /**\r\n * Stringification\r\n */\r\n toQuery : function () {\r\n\r\n if (this._operands.length === 0)\r\n return '';\r\n\r\n return this._operands.map(\r\n function (item) {\r\n if (item[2] === \"date\") {\r\n return item[0] + ' in ' + item[1];\r\n };\r\n return item[0] + ' = ' + new String(item[1]).quote();\r\n }\r\n ).join(\" & \");\r\n }\r\n }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n \r\n return {\r\n\r\n /**\r\n * Constructor\r\n */\r\n create : function (meta) {\r\n return Object.create(this)._init(meta);\r\n },\r\n\r\n\r\n // Initialize corpusByMatch\r\n _init : function (meta) {\r\n const t = this;\r\n\r\n // Meta is an element <dl />\r\n if (meta === undefined) {\r\n throw new Error('Missing parameters');\r\n }\r\n else if (!(meta instanceof Node)) {\r\n throw new Error(\"Requires element\");\r\n };\r\n\r\n // Collect the meta constraints\r\n t._vc = {};\r\n\r\n // Remember the meta table\r\n t._meta = meta;\r\n\r\n // CorpusByMatch can be disabled per configuration.\r\n // This is necessary, as the feature won't work with\r\n // indices created before Krill V0.57.\r\n // This is an undocumented feature and will be\r\n // removed in future versions.\r\n // This will also require a change in matchinfo.scss\r\n if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n t._meta.classList.add(\"cbm-disabled\");\r\n return t;\r\n };\r\n\r\n t._meta.addEventListener(\r\n \"click\", t.clickOnMeta.bind(t), false\r\n );\r\n\r\n t._fragment = vcFragmentClass.create(); \r\n\r\n t._fragment.element().addEventListener(\r\n \"click\", t.toVcBuilder.bind(t), true\r\n );\r\n\r\n return t;\r\n },\r\n\r\n\r\n /**\r\n * Join fragment with VC\r\n */\r\n toVcBuilder : function (e) {\r\n if (e)\r\n e.stopPropagation();\r\n\r\n if (this._fragment.isEmpty())\r\n return;\r\n\r\n const vc = KorAP.vc;\r\n if (!vc) {\r\n console.log(\"Global VC not established\");\r\n return;\r\n };\r\n\r\n for (const doc of this._fragment.documents()) {\r\n vc.addRequired(doc);\r\n };\r\n\r\n if (!vc.isOpen())\r\n vc.open();\r\n\r\n // Scroll to top\r\n window.scrollTo(0, 0);\r\n },\r\n\r\n\r\n // Event handler for meta constraint creation\r\n clickOnMeta : function (e) {\r\n e.stopPropagation();\r\n if (e.target === e.currentTarget) {\r\n return;\r\n };\r\n\r\n // Get event target\r\n const target = e.target;\r\n\r\n let key, value, type;\r\n\r\n // Meta information is a single value\r\n if (target.tagName === 'DD') {\r\n type = target.getAttribute(\"data-type\");\r\n key = target.previousElementSibling.innerText;\r\n value = target.innerText;\r\n }\r\n\r\n // Meta information is in a list\r\n else if (target.tagName === 'DIV') {\r\n type = target.parentNode.getAttribute(\"data-type\");\r\n key = target.parentNode.previousElementSibling.innerText;\r\n value = target.innerText;\r\n };\r\n\r\n // Ignore stored types\r\n if (type === \"type:store\" || type === \"type:attachement\")\r\n return;\r\n\r\n type = type || \"type:string\";\r\n\r\n // Add or remove the constraint to the fragment\r\n if (key && value) {\r\n const t = this;\r\n if (target.classList.contains(\"chosen\")) {\r\n target.classList.remove(\"chosen\");\r\n t.remove(key, value);\r\n }\r\n else {\r\n target.classList.add(\"chosen\");\r\n t.add(key, value, type);\r\n };\r\n\r\n // Check if the fragment is empty\r\n // If empty - hide!\r\n if (!t._fragment.isEmpty()) {\r\n t._meta.parentNode.insertBefore(\r\n t._fragment.element(),\r\n t._meta.nextSibling\r\n );\r\n }\r\n\r\n // Otherwise show!\r\n else {\r\n t._meta.parentNode.removeChild(\r\n t._fragment.element()\r\n );\r\n };\r\n }\r\n },\r\n\r\n /**\r\n * Add constraint to fragment\r\n */\r\n add : function (key, value, type) {\r\n type = type.replace(/^type:/, '');\r\n this._fragment.add(key, value, type);\r\n },\r\n\r\n\r\n /**\r\n * Remove constraint from fragment\r\n */\r\n remove : function (key, value) {\r\n this._fragment.remove(key, value);\r\n },\r\n \r\n /**\r\n * Stringify fragment\r\n */\r\n toQuery : function () {\r\n return this._fragment.toQuery();\r\n }\r\n };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n return {\r\n\r\n /**\r\n * Constructor\r\n */\r\n create : function (url) {\r\n return Object.create(this)._init(url);\r\n },\r\n\r\n // Parse URI scheme\r\n _init : function (url) {\r\n const t = this;\r\n\r\n // Decode\r\n url = decodeURIComponent(url);\r\n\r\n if (!uriRE.exec(url))\r\n return;\r\n\r\n t.payload = RegExp.$2;\r\n\r\n let map = {};\r\n let start = 0;\r\n t.base64 = false;\r\n t.isLink = false;\r\n t.contentType = \"text/plain\";\r\n\r\n // Split parameter map\r\n RegExp.$1.split(/ *; */).map(function (item) {\r\n const t = this;\r\n\r\n // Check first parameter\r\n if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n t.contentType = item;\r\n\r\n if (item === \"application/x.korap-link\")\r\n t.isLink = true;\r\n }\r\n \r\n // Decode b64\r\n else if (item.toLowerCase() == \"base64\") {\r\n t.base64 = true;\r\n t.payload = window.atob(t.payload);\r\n }\r\n\r\n // Parse arbitrary metadata\r\n else if (mapRE.exec(item)) {\r\n map[RegExp.$1] = RegExp.$2;\r\n };\r\n }.bind(t));\r\n\r\n t.param = map;\r\n return t;\r\n },\r\n\r\n /**\r\n * Inline the attachement\r\n * This should optimally be plugin-treatable\r\n */ \r\n inline : function () {\r\n if (this.isLink) {\r\n const title = this.param[\"title\"] || this.payload;\r\n const a = document.createElement('a');\r\n a.setAttribute('href', this.payload);\r\n a.setAttribute('rel', 'noopener noreferrer');\r\n a.addT(title);\r\n return a;\r\n };\r\n\r\n return document.createTextNode(this.payload);\r\n }\r\n }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n // Localization values\r\n const loc = KorAP.Locale;\r\n loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n return {\r\n\r\n /**\r\n * Create new match object\r\n */\r\n create : function (match, fields) {\r\n return Object.create(this)._init(match, fields);\r\n },\r\n\r\n\r\n /**\r\n * Initialize object\r\n */\r\n _init : function (match, fields) {\r\n this._match = match;\r\n this._fields = fields;\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Get match object\r\n */\r\n match : function () {\r\n return this._match;\r\n },\r\n\r\n\r\n /**\r\n * Create match reference view.\r\n */\r\n element : function () {\r\n if (this._el !== undefined)\r\n return this._el;\r\n\r\n if (this._fields === null)\r\n return;\r\n\r\n const metaDL = document.createElement('dl');\r\n metaDL.classList.add(\"flex\");\r\n\r\n this._el = metaDL;\r\n\r\n const fields = this._fields;\r\n\r\n // Copy original array position to object\r\n // before sorting by key title\r\n const posInMetaArray = {};\r\n fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n // TODO: Meta fields should be separated\r\n\r\n // Sort all meta keys alphabetically\r\n Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n let metaL, dt, metaDescr, metaDD, att;\r\n\r\n // Ignore internal IDs\r\n if (k !== \"UID\" &&\r\n k !== \"corpusID\" &&\r\n k !== \"docID\" &&\r\n k !== \"textID\" &&\r\n k !== \"layerInfos\") {\r\n\r\n metaL = document.createElement('div');\r\n \r\n dt = metaL.addE('dt');\r\n dt.addT(k);\r\n dt.setAttribute(\"title\", k);\r\n \r\n metaDescr = field[\"value\"];\r\n metaDD = metaL.addE('dd');\r\n metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n if(metaDescr instanceof Array){\r\n \t metaDD.classList.add(\"metakeyvalues\");\r\n metaDescr.forEach(function(md) {\r\n if (field[\"type\"] === 'type:attachement') {\r\n att = attClass.create(md);\r\n if (att)\r\n \t metaDD.addE('div').appendChild(att.inline());\r\n }\r\n else {\r\n \t metaDD.addE('div').addT(md);\r\n }\r\n \t });\r\n }\r\n else{\r\n if (field[\"type\"] === 'type:attachement') {\r\n att = attClass.create(field[\"value\"]);\r\n if (att)\r\n metaDD.appendChild(att.inline());\r\n }\r\n else {\r\n metaDD.addT(field[\"value\"]);\r\n };\r\n }\r\n \r\n metaDL.appendChild(metaL);\r\n };\r\n });\r\n\r\n // Add corpusByMatch assistant\r\n this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n return this._el;\r\n }\r\n };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n 'view',\r\n 'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n const d = document;\r\n \r\n return {\r\n create : function (match) {\r\n return Object.create(viewClass)\r\n ._init(['metatable'])\r\n .upgradeTo(this)\r\n ._init(match);\r\n },\r\n\r\n\r\n _init : function (match) {\r\n this._match = match;\r\n return this;\r\n },\r\n \r\n\r\n /**\r\n * Meta view element\r\n */\r\n show : function () {\r\n if (this._show)\r\n return this._show;\r\n\r\n const metaTable = document.createElement('div');\r\n metaTable.classList.add('metatable', 'loading');\r\n\r\n this.getData(function (meta) {\r\n if (meta === null)\r\n return;\r\n\r\n // Load data\r\n metaTable.classList.remove('loading');\r\n metaTable.appendChild(meta.element());\r\n });\r\n\r\n\r\n // TODO:\r\n // Loading should have a timeout on view-level\r\n // matchtable.classList.remove('loading');\r\n\r\n return this._show = metaTable;\r\n },\r\n\r\n\r\n /**\r\n * Get match object\r\n */\r\n match : function () {\r\n return this._match;\r\n },\r\n\r\n\r\n /**\r\n * Retrieve and parse snippet for table\r\n * representation\r\n */\r\n getData : function (cb) {\r\n\r\n const match = this._match;\r\n try {\r\n KorAP.API.getTextInfo(\r\n match, {}, function (textResponse) {\r\n \r\n if (textResponse === undefined) {\r\n cb(null);\r\n return;\r\n };\r\n\r\n const doc = textResponse[\"document\"];\r\n if (doc === undefined) {\r\n cb(null);\r\n return;\r\n };\r\n\r\n const fields = doc[\"fields\"];\r\n if (fields === undefined) {\r\n cb(null);\r\n return;\r\n };\r\n\r\n // Add metainfo to matchview\r\n cb(matchMetaClass.create(\r\n match, fields\r\n ));\r\n }\r\n );\r\n }\r\n catch (e) {\r\n KorAP.log(0, e);\r\n cb(null);\r\n };\r\n },\r\n\r\n\r\n // Delete circular references\r\n onClose : function () {\r\n this._match = undefined;\r\n }\r\n }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n graphlib: require(\"./lib/graphlib\"),\r\n\r\n layout: require(\"./lib/layout\"),\r\n debug: require(\"./lib/debug\"),\r\n util: {\r\n time: require(\"./lib/util\").time,\r\n notime: require(\"./lib/util\").notime\r\n },\r\n version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n run: run,\r\n undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n var fas = (g.graph().acyclicer === \"greedy\"\r\n ? greedyFAS(g, weightFn(g))\r\n : dfsFAS(g));\r\n _.each(fas, function(e) {\r\n var label = g.edge(e);\r\n g.removeEdge(e);\r\n label.forwardName = e.name;\r\n label.reversed = true;\r\n g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n });\r\n\r\n function weightFn(g) {\r\n return function(e) {\r\n return g.edge(e).weight;\r\n };\r\n }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n var fas = [],\r\n stack = {},\r\n visited = {};\r\n\r\n function dfs(v) {\r\n if (_.has(visited, v)) {\r\n return;\r\n }\r\n visited[v] = true;\r\n stack[v] = true;\r\n _.each(g.outEdges(v), function(e) {\r\n if (_.has(stack, e.w)) {\r\n fas.push(e);\r\n } else {\r\n dfs(e.w);\r\n }\r\n });\r\n delete stack[v];\r\n }\r\n\r\n _.each(g.nodes(), dfs);\r\n return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n _.each(g.edges(), function(e) {\r\n var label = g.edge(e);\r\n if (label.reversed) {\r\n g.removeEdge(e);\r\n\r\n var forwardName = label.forwardName;\r\n delete label.reversed;\r\n delete label.forwardName;\r\n g.setEdge(e.w, e.v, label, forwardName);\r\n }\r\n });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n function dfs(v) {\r\n var children = g.children(v),\r\n node = g.node(v);\r\n if (children.length) {\r\n _.each(children, dfs);\r\n }\r\n\r\n if (_.has(node, \"minRank\")) {\r\n node.borderLeft = [];\r\n node.borderRight = [];\r\n for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n rank < maxRank;\r\n ++rank) {\r\n addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n }\r\n }\r\n }\r\n\r\n _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n var label = { width: 0, height: 0, rank: rank },\r\n prev = sgNode[prop][rank - 1],\r\n curr = util.addDummyNode(g, \"border\", label, prefix);\r\n sgNode[prop][rank] = curr;\r\n g.setParent(curr, sg);\r\n if (prev) {\r\n g.setEdge(prev, curr, { weight: 1 });\r\n }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n adjust: adjust,\r\n undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n var rankDir = g.graph().rankdir.toLowerCase();\r\n if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n swapWidthHeight(g);\r\n }\r\n}\r\n\r\nfunction undo(g) {\r\n var rankDir = g.graph().rankdir.toLowerCase();\r\n if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n reverseY(g);\r\n }\r\n\r\n if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n swapXY(g);\r\n swapWidthHeight(g);\r\n }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n var w = attrs.width;\r\n attrs.width = attrs.height;\r\n attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n _.each(g.edges(), function(e) {\r\n var edge = g.edge(e);\r\n _.each(edge.points, reverseYOne);\r\n if (_.has(edge, \"y\")) {\r\n reverseYOne(edge);\r\n }\r\n });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n _.each(g.edges(), function(e) {\r\n var edge = g.edge(e);\r\n _.each(edge.points, swapXYOne);\r\n if (_.has(edge, \"x\")) {\r\n swapXYOne(edge);\r\n }\r\n });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n var x = attrs.x;\r\n attrs.x = attrs.y;\r\n attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n var sentinel = {};\r\n sentinel._next = sentinel._prev = sentinel;\r\n this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n var sentinel = this._sentinel,\r\n entry = sentinel._prev;\r\n if (entry !== sentinel) {\r\n unlink(entry);\r\n return entry;\r\n }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n var sentinel = this._sentinel;\r\n if (entry._prev && entry._next) {\r\n unlink(entry);\r\n }\r\n entry._next = sentinel._next;\r\n sentinel._next._prev = entry;\r\n sentinel._next = entry;\r\n entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n var strs = [],\r\n sentinel = this._sentinel,\r\n curr = sentinel._prev;\r\n while (curr !== sentinel) {\r\n strs.push(JSON.stringify(curr, filterOutLinks));\r\n curr = curr._prev;\r\n }\r\n return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n entry._prev._next = entry._next;\r\n entry._next._prev = entry._prev;\r\n delete entry._next;\r\n delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n if (k !== \"_next\" && k !== \"_prev\") {\r\n return v;\r\n }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n util = require(\"./util\"),\r\n Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n _.each(g.nodes(), function(v) {\r\n h.setNode(v, { label: v });\r\n h.setParent(v, \"layer\" + g.node(v).rank);\r\n });\r\n\r\n _.each(g.edges(), function(e) {\r\n h.setEdge(e.v, e.w, {}, e.name);\r\n });\r\n\r\n _.each(layerMatrix, function(layer, i) {\r\n var layerV = \"layer\" + i;\r\n h.setNode(layerV, { rank: \"same\" });\r\n _.reduce(layer, function(u, v) {\r\n h.setEdge(u, v, { style: \"invis\" });\r\n return v;\r\n });\r\n });\r\n\r\n return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n try {\r\n graphlib = require(\"graphlib\");\r\n } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n Graph = require(\"./graphlib\").Graph,\r\n List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n if (g.nodeCount() <= 1) {\r\n return [];\r\n }\r\n var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n // Expand multi-edges\r\n return _.flatten(_.map(results, function(e) {\r\n return g.outEdges(e.v, e.w);\r\n }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n var results = [],\r\n sources = buckets[buckets.length - 1],\r\n sinks = buckets[0];\r\n\r\n var entry;\r\n while (g.nodeCount()) {\r\n while ((entry = sinks.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n if (g.nodeCount()) {\r\n for (var i = buckets.length - 2; i > 0; --i) {\r\n entry = buckets[i].dequeue();\r\n if (entry) {\r\n results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n var results = collectPredecessors ? [] : undefined;\r\n\r\n _.each(g.inEdges(entry.v), function(edge) {\r\n var weight = g.edge(edge),\r\n uEntry = g.node(edge.v);\r\n\r\n if (collectPredecessors) {\r\n results.push({ v: edge.v, w: edge.w });\r\n }\r\n\r\n uEntry.out -= weight;\r\n assignBucket(buckets, zeroIdx, uEntry);\r\n });\r\n\r\n _.each(g.outEdges(entry.v), function(edge) {\r\n var weight = g.edge(edge),\r\n w = edge.w,\r\n wEntry = g.node(w);\r\n wEntry[\"in\"] -= weight;\r\n assignBucket(buckets, zeroIdx, wEntry);\r\n });\r\n\r\n g.removeNode(entry.v);\r\n\r\n return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n var fasGraph = new Graph(),\r\n maxIn = 0,\r\n maxOut = 0;\r\n\r\n _.each(g.nodes(), function(v) {\r\n fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n });\r\n\r\n // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n // into a single edge for the fasGraph.\r\n _.each(g.edges(), function(e) {\r\n var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n weight = weightFn(e),\r\n edgeWeight = prevWeight + weight;\r\n fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n maxIn = Math.max(maxIn, fasGraph.node(e.w)[\"in\"] += weight);\r\n });\r\n\r\n var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n var zeroIdx = maxIn + 1;\r\n\r\n _.each(fasGraph.nodes(), function(v) {\r\n assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n });\r\n\r\n return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n if (!entry.out) {\r\n buckets[0].enqueue(entry);\r\n } else if (!entry[\"in\"]) {\r\n buckets[buckets.length - 1].enqueue(entry);\r\n } else {\r\n buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n acyclic = require(\"./acyclic\"),\r\n normalize = require(\"./normalize\"),\r\n rank = require(\"./rank\"),\r\n normalizeRanks = require(\"./util\").normalizeRanks,\r\n parentDummyChains = require(\"./parent-dummy-chains\"),\r\n removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n nestingGraph = require(\"./nesting-graph\"),\r\n addBorderSegments = require(\"./add-border-segments\"),\r\n coordinateSystem = require(\"./coordinate-system\"),\r\n order = require(\"./order\"),\r\n position = require(\"./position\"),\r\n util = require(\"./util\"),\r\n Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n var time = opts && opts.debugTiming ? util.time : util.notime;\r\n time(\"layout\", function() {\r\n var layoutGraph = time(\" buildLayoutGraph\",\r\n function() { return buildLayoutGraph(g); });\r\n time(\" runLayout\", function() { runLayout(layoutGraph, time); });\r\n time(\" updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n time(\" makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n time(\" removeSelfEdges\", function() { removeSelfEdges(g); });\r\n time(\" acyclic\", function() { acyclic.run(g); });\r\n time(\" nestingGraph.run\", function() { nestingGraph.run(g); });\r\n time(\" rank\", function() { rank(util.asNonCompoundGraph(g)); });\r\n time(\" injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n time(\" removeEmptyRanks\", function() { removeEmptyRanks(g); });\r\n time(\" nestingGraph.cleanup\", function() { nestingGraph.cleanup(g); });\r\n time(\" normalizeRanks\", function() { normalizeRanks(g); });\r\n time(\" assignRankMinMax\", function() { assignRankMinMax(g); });\r\n time(\" removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n time(\" normalize.run\", function() { normalize.run(g); });\r\n time(\" parentDummyChains\", function() { parentDummyChains(g); });\r\n time(\" addBorderSegments\", function() { addBorderSegments(g); });\r\n time(\" order\", function() { order(g); });\r\n time(\" insertSelfEdges\", function() { insertSelfEdges(g); });\r\n time(\" adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n time(\" position\", function() { position(g); });\r\n time(\" positionSelfEdges\", function() { positionSelfEdges(g); });\r\n time(\" removeBorderNodes\", function() { removeBorderNodes(g); });\r\n time(\" normalize.undo\", function() { normalize.undo(g); });\r\n time(\" fixupEdgeLabelCoords\", function() { fixupEdgeLabelCoords(g); });\r\n time(\" undoCoordinateSystem\", function() { coordinateSystem.undo(g); });\r\n time(\" translateGraph\", function() { translateGraph(g); });\r\n time(\" assignNodeIntersects\", function() { assignNodeIntersects(g); });\r\n time(\" reversePoints\", function() { reversePointsForReversedEdges(g); });\r\n time(\" acyclic.undo\", function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n _.each(inputGraph.nodes(), function(v) {\r\n var inputLabel = inputGraph.node(v),\r\n layoutLabel = layoutGraph.node(v);\r\n\r\n if (inputLabel) {\r\n inputLabel.x = layoutLabel.x;\r\n inputLabel.y = layoutLabel.y;\r\n\r\n if (layoutGraph.children(v).length) {\r\n inputLabel.width = layoutLabel.width;\r\n inputLabel.height = layoutLabel.height;\r\n }\r\n }\r\n });\r\n\r\n _.each(inputGraph.edges(), function(e) {\r\n var inputLabel = inputGraph.edge(e),\r\n layoutLabel = layoutGraph.edge(e);\r\n\r\n inputLabel.points = layoutLabel.points;\r\n if (_.has(layoutLabel, \"x\")) {\r\n inputLabel.x = layoutLabel.x;\r\n inputLabel.y = layoutLabel.y;\r\n }\r\n });\r\n\r\n inputGraph.graph().width = layoutGraph.graph().width;\r\n inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n nodeNumAttrs = [\"width\", \"height\"],\r\n nodeDefaults = { width: 0, height: 0 },\r\n edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n edgeDefaults = {\r\n minlen: 1, weight: 1, width: 0, height: 0,\r\n labeloffset: 10, labelpos: \"r\"\r\n },\r\n edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n var g = new Graph({ multigraph: true, compound: true }),\r\n graph = canonicalize(inputGraph.graph());\r\n\r\n g.setGraph(_.merge({},\r\n graphDefaults,\r\n selectNumberAttrs(graph, graphNumAttrs),\r\n _.pick(graph, graphAttrs)));\r\n\r\n _.each(inputGraph.nodes(), function(v) {\r\n var node = canonicalize(inputGraph.node(v));\r\n g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n g.setParent(v, inputGraph.parent(v));\r\n });\r\n\r\n _.each(inputGraph.edges(), function(e) {\r\n var edge = canonicalize(inputGraph.edge(e));\r\n g.setEdge(e, _.merge({},\r\n edgeDefaults,\r\n selectNumberAttrs(edge, edgeNumAttrs),\r\n _.pick(edge, edgeAttrs)));\r\n });\r\n\r\n return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n var graph = g.graph();\r\n graph.ranksep /= 2;\r\n _.each(g.edges(), function(e) {\r\n var edge = g.edge(e);\r\n edge.minlen *= 2;\r\n if (edge.labelpos.toLowerCase() !== \"c\") {\r\n if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n edge.width += edge.labeloffset;\r\n } else {\r\n edge.height += edge.labeloffset;\r\n }\r\n }\r\n });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n _.each(g.edges(), function(e) {\r\n var edge = g.edge(e);\r\n if (edge.width && edge.height) {\r\n var v = g.node(e.v),\r\n w = g.node(e.w),\r\n label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n }\r\n });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n var maxRank = 0;\r\n _.each(g.nodes(), function(v) {\r\n var node = g.node(v);\r\n if (node.borderTop) {\r\n node.minRank = g.node(node.borderTop).rank;\r\n node.maxRank = g.node(node.borderBottom).rank;\r\n maxRank = _.max(maxRank, node.maxRank);\r\n }\r\n });\r\n g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n _.each(g.nodes(), function(v) {\r\n var node = g.node(v);\r\n if (node.dummy === \"edge-proxy\") {\r\n g.edge(node.e).labelRank = node.rank;\r\n g.removeNode(v);\r\n }\r\n });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n var minX = Number.POSITIVE_INFINITY,\r\n maxX = 0,\r\n minY = Number.POSITIVE_INFINITY,\r\n maxY = 0,\r\n graphLabel = g.graph(),\r\n marginX = graphLabel.marginx || 0,\r\n marginY = graphLabel.marginy || 0;\r\n\r\n function getExtremes(attrs) {\r\n var x = attrs.x,\r\n y = attrs.y,\r\n w = attrs.width,\r\n h = attrs.height;\r\n minX = Math.min(minX, x - w / 2);\r\n maxX = Math.max(maxX, x + w / 2);\r\n minY = Math.min(minY, y - h / 2);\r\n maxY = Math.max(maxY, y + h / 2);\r\n }\r\n\r\n _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n _.each(g.edges(), function(e) {\r\n var edge = g.edge(e);\r\n if (_.has(edge, \"x\")) {\r\n getExtremes(edge);\r\n }\r\n });\r\n\r\n minX -= marginX;\r\n minY -= marginY;\r\n\r\n _.each(g.nodes(), function(v) {\r\n var node = g.node(v);\r\n node.x -= minX;\r\n node.y -= minY;\r\n });\r\n\r\n _.each(g.edges(), function(e) {\r\n var edge = g.edge(e);\r\n _.each(edge.points, function(p) {\r\n p.x -= minX;\r\n p.y -= minY;\r\n });\r\n if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n });\r\n\r\n graphLabel.width = maxX - minX + marginX;\r\n graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n _.each(g.edges(), function(e) {\r\n var edge = g.edge(e),\r\n nodeV = g.node(e.v),\r\n nodeW = g.node(e.w),\r\n p1, p2;\r\n if (!edge.points) {\r\n edge.points = [];\r\n p1 = nodeW;\r\n p2 = nodeV;\r\n } else {\r\n p1 = edge.points[0];\r\n p2 = edge.points[edge.points.length - 1];\r\n }\r\n edge.points.unshift(util.intersectRect(nodeV, p1));\r\n edge.points.push(util.intersectRect(nodeW, p2));\r\n });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n _.each(g.edges(), function(e) {\r\n var edge = g.edge(e);\r\n if (_.has(edge, \"x\")) {\r\n if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n edge.width -= edge.labeloffset;\r\n }\r\n switch (edge.labelpos) {\r\n case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n _.each(g.edges(), function(e) {\r\n var edge = g.edge(e);\r\n if (edge.reversed) {\r\n edge.points.reverse();\r\n }\r\n });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n _.each(g.nodes(), function(v) {\r\n if (g.children(v).length) {\r\n var node = g.node(v),\r\n t = g.node(node.borderTop),\r\n b = g.node(node.borderBottom),\r\n l = g.node(_.last(node.borderLeft)),\r\n r = g.node(_.last(node.borderRight));\r\n\r\n node.width = Math.abs(r.x - l.x);\r\n node.height = Math.abs(b.y - t.y);\r\n node.x = l.x + node.width / 2;\r\n node.y = t.y + node.height / 2;\r\n }\r\n });\r\n\r\n _.each(g.nodes(), function(v) {\r\n if (g.node(v).dummy === \"border\") {\r\n g.removeNode(v);\r\n }\r\n });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n _.each(g.edges(), function(e) {\r\n if (e.v === e.w) {\r\n var node = g.node(e.v);\r\n if (!node.selfEdges) {\r\n node.selfEdges = [];\r\n }\r\n node.selfEdges.push({ e: e, label: g.edge(e) });\r\n g.removeEdge(e);\r\n }\r\n });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n var layers = util.buildLayerMatrix(g);\r\n _.each(layers, function(layer) {\r\n var orderShift = 0;\r\n _.each(layer, function(v, i) {\r\n var node = g.node(v);\r\n node.order = i + orderShift;\r\n _.each(node.selfEdges, function(selfEdge) {\r\n util.addDummyNode(g, \"selfedge\", {\r\n width: selfEdge.label.width,\r\n height: selfEdge.label.height,\r\n rank: node.rank,\r\n order: i + (++orderShift),\r\n e: selfEdge.e,\r\n label: selfEdge.label\r\n }, \"_se\");\r\n });\r\n delete node.selfEdges;\r\n });\r\n });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n _.each(g.nodes(), function(v) {\r\n var node = g.node(v);\r\n if (node.dummy === \"selfedge\") {\r\n var selfNode = g.node(node.e.v),\r\n x = selfNode.x + selfNode.width / 2,\r\n y = selfNode.y,\r\n dx = node.x - x,\r\n dy = selfNode.height / 2;\r\n g.setEdge(node.e, node.label);\r\n g.removeNode(v);\r\n node.label.points = [\r\n { x: x + 2 * dx / 3, y: y - dy },\r\n { x: x + 5 * dx / 6, y: y - dy },\r\n { x: x + dx , y: y },\r\n { x: x + 5 * dx / 6, y: y + dy },\r\n { x: x + 2 * dx / 3, y: y + dy },\r\n ];\r\n node.label.x = node.x;\r\n node.label.y = node.y;\r\n }\r\n });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n var newAttrs = {};\r\n _.each(attrs, function(v, k) {\r\n newAttrs[k.toLowerCase()] = v;\r\n });\r\n return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n try {\r\n lodash = require(\"lodash\");\r\n } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n run: run,\r\n cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n * 1. Input graph is a DAG\r\n * 2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n * 1. Input graph is connected.\r\n * 2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n * 3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n * get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n depths = treeDepths(g),\r\n height = _.max(depths) - 1,\r\n nodeSep = 2 * height + 1;\r\n\r\n g.graph().nestingRoot = root;\r\n\r\n // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n var weight = sumWeights(g) + 1;\r\n\r\n // Create border nodes and link them up\r\n _.each(g.children(), function(child) {\r\n dfs(g, root, nodeSep, weight, height, depths, child);\r\n });\r\n\r\n // Save the multiplier for node layers for later removal of empty border\r\n // layers.\r\n g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n var children = g.children(v);\r\n if (!children.length) {\r\n if (v !== root) {\r\n g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n }\r\n return;\r\n }\r\n\r\n var top = util.addBorderNode(g, \"_bt\"),\r\n bottom = util.addBorderNode(g, \"_bb\"),\r\n label = g.node(v);\r\n\r\n g.setParent(top, v);\r\n label.borderTop = top;\r\n g.setParent(bottom, v);\r\n label.borderBottom = bottom;\r\n\r\n _.each(children, function(child) {\r\n dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n var childNode = g.node(child),\r\n childTop = childNode.borderTop ? childNode.borderTop : child,\r\n childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n g.setEdge(top, childTop, {\r\n weight: thisWeight,\r\n minlen: minlen,\r\n nestingEdge: true\r\n });\r\n\r\n g.setEdge(childBottom, bottom, {\r\n weight: thisWeight,\r\n minlen: minlen,\r\n nestingEdge: true\r\n });\r\n });\r\n\r\n if (!g.parent(v)) {\r\n g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n var depths = {};\r\n function dfs(v, depth) {\r\n var children = g.children(v);\r\n if (children && children.length) {\r\n _.each(children, function(child) {\r\n dfs(child, depth + 1);\r\n });\r\n }\r\n depths[v] = depth;\r\n }\r\n _.each(g.children(), function(v) { dfs(v, 1); });\r\n return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n return _.reduce(g.edges(), function(acc, e) {\r\n return acc + g.edge(e).weight;\r\n }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n var graphLabel = g.graph();\r\n g.removeNode(graphLabel.nestingRoot);\r\n delete graphLabel.nestingRoot;\r\n _.each(g.edges(), function(e) {\r\n var edge = g.edge(e);\r\n if (edge.nestingEdge) {\r\n g.removeEdge(e);\r\n }\r\n });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n run: run,\r\n undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n * 1. The input graph is a DAG.\r\n * 2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n * 1. All edges in the graph have a length of 1.\r\n * 2. Dummy nodes are added where edges have been split into segments.\r\n * 3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n * the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n g.graph().dummyChains = [];\r\n _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n var v = e.v,\r\n vRank = g.node(v).rank,\r\n w = e.w,\r\n wRank = g.node(w).rank,\r\n name = e.name,\r\n edgeLabel = g.edge(e),\r\n labelRank = edgeLabel.labelRank;\r\n\r\n if (wRank === vRank + 1) return;\r\n\r\n g.removeEdge(e);\r\n\r\n var dummy, attrs, i;\r\n for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n edgeLabel.points = [];\r\n attrs = {\r\n width: 0, height: 0,\r\n edgeLabel: edgeLabel, edgeObj: e,\r\n rank: vRank\r\n };\r\n dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n if (vRank === labelRank) {\r\n attrs.width = edgeLabel.width;\r\n attrs.height = edgeLabel.height;\r\n attrs.dummy = \"edge-label\";\r\n attrs.labelpos = edgeLabel.labelpos;\r\n }\r\n g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n if (i === 0) {\r\n g.graph().dummyChains.push(dummy);\r\n }\r\n v = dummy;\r\n }\r\n\r\n g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n _.each(g.graph().dummyChains, function(v) {\r\n var node = g.node(v),\r\n origLabel = node.edgeLabel,\r\n w;\r\n g.setEdge(node.edgeObj, origLabel);\r\n while (node.dummy) {\r\n w = g.successors(v)[0];\r\n g.removeNode(v);\r\n origLabel.points.push({ x: node.x, y: node.y });\r\n if (node.dummy === \"edge-label\") {\r\n origLabel.x = node.x;\r\n origLabel.y = node.y;\r\n origLabel.width = node.width;\r\n origLabel.height = node.height;\r\n }\r\n v = w;\r\n node = g.node(v);\r\n }\r\n });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n var prev = {},\r\n rootPrev;\r\n\r\n _.each(vs, function(v) {\r\n var child = g.parent(v),\r\n parent,\r\n prevChild;\r\n while (child) {\r\n parent = g.parent(child);\r\n if (parent) {\r\n prevChild = prev[parent];\r\n prev[parent] = child;\r\n } else {\r\n prevChild = rootPrev;\r\n rootPrev = child;\r\n }\r\n if (prevChild && prevChild !== child) {\r\n cg.setEdge(prevChild, child);\r\n return;\r\n }\r\n child = parent;\r\n }\r\n });\r\n\r\n /*\r\n function dfs(v) {\r\n var children = v ? g.children(v) : g.children();\r\n if (children.length) {\r\n var min = Number.POSITIVE_INFINITY,\r\n subgraphs = [];\r\n _.each(children, function(child) {\r\n var childMin = dfs(child);\r\n if (g.children(child).length) {\r\n subgraphs.push({ v: child, order: childMin });\r\n }\r\n min = Math.min(min, childMin);\r\n });\r\n _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n cg.setEdge(prev.v, curr.v);\r\n return curr;\r\n });\r\n return min;\r\n }\r\n return g.node(v).order;\r\n }\r\n dfs(undefined);\r\n */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n return _.map(movable, function(v) {\r\n var inV = g.inEdges(v);\r\n if (!inV.length) {\r\n return { v: v };\r\n } else {\r\n var result = _.reduce(inV, function(acc, e) {\r\n var edge = g.edge(e),\r\n nodeU = g.node(e.v);\r\n return {\r\n sum: acc.sum + (edge.weight * nodeU.order),\r\n weight: acc.weight + edge.weight\r\n };\r\n }, { sum: 0, weight: 0 });\r\n\r\n return {\r\n v: v,\r\n barycenter: result.sum / result.weight,\r\n weight: result.weight\r\n };\r\n }\r\n });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n * 1. Input graph is a DAG\r\n * 2. Base nodes in the input graph have a rank attribute\r\n * 3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n * 4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n * 1. Output graph has all nodes in the movable rank with preserved\r\n * hierarchy.\r\n * 2. Root nodes in the movable layer are made children of the node\r\n * indicated by the root attribute of the graph.\r\n * 3. Non-movable nodes incident on movable nodes, selected by the\r\n * relationship parameter, are included in the graph (without hierarchy).\r\n * 4. Edges incident on movable nodes, selected by the relationship\r\n * parameter, are added to the output graph.\r\n * 5. The weights for copied edges are aggregated as need, since the output\r\n * graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n var root = createRootNode(g),\r\n result = new Graph({ compound: true }).setGraph({ root: root })\r\n .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n _.each(g.nodes(), function(v) {\r\n var node = g.node(v),\r\n parent = g.parent(v);\r\n\r\n if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n result.setNode(v);\r\n result.setParent(v, parent || root);\r\n\r\n // This assumes we have only short edges!\r\n _.each(g[relationship](v), function(e) {\r\n var u = e.v === v ? e.w : e.v,\r\n edge = result.edge(u, v),\r\n weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n });\r\n\r\n if (_.has(node, \"minRank\")) {\r\n result.setNode(v, {\r\n borderLeft: node.borderLeft[rank],\r\n borderRight: node.borderRight[rank]\r\n });\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n var v;\r\n while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n * 1. Input graph must be simple (not a multigraph), directed, and include\r\n * only simple edges.\r\n * 2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n * 1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n var cc = 0;\r\n for (var i = 1; i < layering.length; ++i) {\r\n cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n }\r\n return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n // Sort all of the edges between the north and south layers by their position\r\n // in the north layer and then the south. Map these edges to the position of\r\n // their head in the south layer.\r\n var southPos = _.zipObject(southLayer,\r\n _.map(southLayer, function (v, i) { return i; }));\r\n var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n return _.chain(g.outEdges(v))\r\n .map(function(e) {\r\n return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n })\r\n .sortBy(\"pos\")\r\n .value();\r\n }), true);\r\n\r\n // Build the accumulator tree\r\n var firstIndex = 1;\r\n while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n var treeSize = 2 * firstIndex - 1;\r\n firstIndex -= 1;\r\n var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n // Calculate the weighted crossings\r\n var cc = 0;\r\n _.each(southEntries.forEach(function(entry) {\r\n var index = entry.pos + firstIndex;\r\n tree[index] += entry.weight;\r\n var weightSum = 0;\r\n while (index > 0) {\r\n if (index % 2) {\r\n weightSum += tree[index + 1];\r\n }\r\n index = (index - 1) >> 1;\r\n tree[index] += entry.weight;\r\n }\r\n cc += entry.weight * weightSum;\r\n }));\r\n\r\n return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n initOrder = require(\"./init-order\"),\r\n crossCount = require(\"./cross-count\"),\r\n sortSubgraph = require(\"./sort-subgraph\"),\r\n buildLayerGraph = require(\"./build-layer-graph\"),\r\n addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n Graph = require(\"../graphlib\").Graph,\r\n util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n * 1. Graph must be DAG\r\n * 2. Graph nodes must be objects with a \"rank\" attribute\r\n * 3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n * 1. Graph nodes will have an \"order\" attribute based on the results of the\r\n * algorithm.\r\n */\r\nfunction order(g) {\r\n var maxRank = util.maxRank(g),\r\n downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n var layering = initOrder(g);\r\n assignOrder(g, layering);\r\n\r\n var bestCC = Number.POSITIVE_INFINITY,\r\n best;\r\n\r\n for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n layering = util.buildLayerMatrix(g);\r\n var cc = crossCount(g, layering);\r\n if (cc < bestCC) {\r\n lastBest = 0;\r\n best = _.cloneDeep(layering);\r\n bestCC = cc;\r\n }\r\n }\r\n\r\n assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n return _.map(ranks, function(rank) {\r\n return buildLayerGraph(g, rank, relationship);\r\n });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n var cg = new Graph();\r\n _.each(layerGraphs, function(lg) {\r\n var root = lg.graph().root;\r\n var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n _.each(sorted.vs, function(v, i) {\r\n lg.node(v).order = i;\r\n });\r\n addSubgraphConstraints(lg, cg, sorted.vs);\r\n });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n _.each(layering, function(layer) {\r\n _.each(layer, function(v, i) {\r\n g.node(v).order = i;\r\n });\r\n });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n var visited = {},\r\n simpleNodes = _.filter(g.nodes(), function(v) {\r\n return !g.children(v).length;\r\n }),\r\n maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n function dfs(v) {\r\n if (_.has(visited, v)) return;\r\n visited[v] = true;\r\n var node = g.node(v);\r\n layers[node.rank].push(v);\r\n _.each(g.successors(v), dfs);\r\n }\r\n\r\n var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n _.each(orderedVs, dfs);\r\n\r\n return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n * 1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n * no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n * A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n * `vs` may either be a singleton or it may be an aggregation of nodes\r\n * ordered such that they do not violate constraints from the constraint\r\n * graph. The property `i` is the lowest original index of any of the\r\n * elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n var mappedEntries = {};\r\n _.each(entries, function(entry, i) {\r\n var tmp = mappedEntries[entry.v] = {\r\n indegree: 0,\r\n \"in\": [],\r\n out: [],\r\n vs: [entry.v],\r\n i: i\r\n };\r\n if (!_.isUndefined(entry.barycenter)) {\r\n tmp.barycenter = entry.barycenter;\r\n tmp.weight = entry.weight;\r\n }\r\n });\r\n\r\n _.each(cg.edges(), function(e) {\r\n var entryV = mappedEntries[e.v],\r\n entryW = mappedEntries[e.w];\r\n if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n entryW.indegree++;\r\n entryV.out.push(mappedEntries[e.w]);\r\n }\r\n });\r\n\r\n var sourceSet = _.filter(mappedEntries, function(entry) {\r\n return !entry.indegree;\r\n });\r\n\r\n return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n var entries = [];\r\n\r\n function handleIn(vEntry) {\r\n return function(uEntry) {\r\n if (uEntry.merged) {\r\n return;\r\n }\r\n if (_.isUndefined(uEntry.barycenter) ||\r\n _.isUndefined(vEntry.barycenter) ||\r\n uEntry.barycenter >= vEntry.barycenter) {\r\n mergeEntries(vEntry, uEntry);\r\n }\r\n };\r\n }\r\n\r\n function handleOut(vEntry) {\r\n return function(wEntry) {\r\n wEntry[\"in\"].push(vEntry);\r\n if (--wEntry.indegree === 0) {\r\n sourceSet.push(wEntry);\r\n }\r\n };\r\n }\r\n\r\n while (sourceSet.length) {\r\n var entry = sourceSet.pop();\r\n entries.push(entry);\r\n _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n _.each(entry.out, handleOut(entry));\r\n }\r\n\r\n return _.chain(entries)\r\n .filter(function(entry) { return !entry.merged; })\r\n .map(function(entry) {\r\n return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n })\r\n .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n var sum = 0,\r\n weight = 0;\r\n\r\n if (target.weight) {\r\n sum += target.barycenter * target.weight;\r\n weight += target.weight;\r\n }\r\n\r\n if (source.weight) {\r\n sum += source.barycenter * source.weight;\r\n weight += source.weight;\r\n }\r\n\r\n target.vs = source.vs.concat(target.vs);\r\n target.barycenter = sum / weight;\r\n target.weight = weight;\r\n target.i = Math.min(source.i, target.i);\r\n source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n barycenter = require(\"./barycenter\"),\r\n resolveConflicts = require(\"./resolve-conflicts\"),\r\n sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n var movable = g.children(v),\r\n node = g.node(v),\r\n bl = node ? node.borderLeft : undefined,\r\n br = node ? node.borderRight: undefined,\r\n subgraphs = {};\r\n\r\n if (bl) {\r\n movable = _.filter(movable, function(w) {\r\n return w !== bl && w !== br;\r\n });\r\n }\r\n\r\n var barycenters = barycenter(g, movable);\r\n _.each(barycenters, function(entry) {\r\n if (g.children(entry.v).length) {\r\n var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n subgraphs[entry.v] = subgraphResult;\r\n if (_.has(subgraphResult, \"barycenter\")) {\r\n mergeBarycenters(entry, subgraphResult);\r\n }\r\n }\r\n });\r\n\r\n var entries = resolveConflicts(barycenters, cg);\r\n expandSubgraphs(entries, subgraphs);\r\n\r\n var result = sort(entries, biasRight);\r\n\r\n if (bl) {\r\n result.vs = _.flatten([bl, result.vs, br], true);\r\n if (g.predecessors(bl).length) {\r\n var blPred = g.node(g.predecessors(bl)[0]),\r\n brPred = g.node(g.predecessors(br)[0]);\r\n if (!_.has(result, \"barycenter\")) {\r\n result.barycenter = 0;\r\n result.weight = 0;\r\n }\r\n result.barycenter = (result.barycenter * result.weight +\r\n blPred.order + brPred.order) / (result.weight + 2);\r\n result.weight += 2;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n _.each(entries, function(entry) {\r\n entry.vs = _.flatten(entry.vs.map(function(v) {\r\n if (subgraphs[v]) {\r\n return subgraphs[v].vs;\r\n }\r\n return v;\r\n }), true);\r\n });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n if (!_.isUndefined(target.barycenter)) {\r\n target.barycenter = (target.barycenter * target.weight +\r\n other.barycenter * other.weight) /\r\n (target.weight + other.weight);\r\n target.weight += other.weight;\r\n } else {\r\n target.barycenter = other.barycenter;\r\n target.weight = other.weight;\r\n }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n var parts = util.partition(entries, function(entry) {\r\n return _.has(entry, \"barycenter\");\r\n });\r\n var sortable = parts.lhs,\r\n unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n vs = [],\r\n sum = 0,\r\n weight = 0,\r\n vsIndex = 0;\r\n\r\n sortable.sort(compareWithBias(!!biasRight));\r\n\r\n vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n _.each(sortable, function (entry) {\r\n vsIndex += entry.vs.length;\r\n vs.push(entry.vs);\r\n sum += entry.barycenter * entry.weight;\r\n weight += entry.weight;\r\n vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n });\r\n\r\n var result = { vs: _.flatten(vs, true) };\r\n if (weight) {\r\n result.barycenter = sum / weight;\r\n result.weight = weight;\r\n }\r\n return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n var last;\r\n while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n unsortable.pop();\r\n vs.push(last.vs);\r\n index++;\r\n }\r\n return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n return function(entryV, entryW) {\r\n if (entryV.barycenter < entryW.barycenter) {\r\n return -1;\r\n } else if (entryV.barycenter > entryW.barycenter) {\r\n return 1;\r\n }\r\n\r\n return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n var postorderNums = postorder(g);\r\n\r\n _.each(g.graph().dummyChains, function(v) {\r\n var node = g.node(v),\r\n edgeObj = node.edgeObj,\r\n pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n path = pathData.path,\r\n lca = pathData.lca,\r\n pathIdx = 0,\r\n pathV = path[pathIdx],\r\n ascending = true;\r\n\r\n while (v !== edgeObj.w) {\r\n node = g.node(v);\r\n\r\n if (ascending) {\r\n while ((pathV = path[pathIdx]) !== lca &&\r\n g.node(pathV).maxRank < node.rank) {\r\n pathIdx++;\r\n }\r\n\r\n if (pathV === lca) {\r\n ascending = false;\r\n }\r\n }\r\n\r\n if (!ascending) {\r\n while (pathIdx < path.length - 1 &&\r\n g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n pathIdx++;\r\n }\r\n pathV = path[pathIdx];\r\n }\r\n\r\n g.setParent(v, pathV);\r\n v = g.successors(v)[0];\r\n }\r\n });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n var vPath = [],\r\n wPath = [],\r\n low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n parent,\r\n lca;\r\n\r\n // Traverse up from v to find the LCA\r\n parent = v;\r\n do {\r\n parent = g.parent(parent);\r\n vPath.push(parent);\r\n } while (parent &&\r\n (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n lca = parent;\r\n\r\n // Traverse from w to LCA\r\n parent = w;\r\n while ((parent = g.parent(parent)) !== lca) {\r\n wPath.push(parent);\r\n }\r\n\r\n return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n var result = {},\r\n lim = 0;\r\n\r\n function dfs(v) {\r\n var low = lim;\r\n _.each(g.children(v), dfs);\r\n result[v] = { low: low, lim: lim++ };\r\n }\r\n _.each(g.children(), dfs);\r\n\r\n return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n Graph = require(\"../graphlib\").Graph,\r\n util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n positionX: positionX,\r\n findType1Conflicts: findType1Conflicts,\r\n findType2Conflicts: findType2Conflicts,\r\n addConflict: addConflict,\r\n hasConflict: hasConflict,\r\n verticalAlignment: verticalAlignment,\r\n horizontalCompaction: horizontalCompaction,\r\n alignCoordinates: alignCoordinates,\r\n findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n var conflicts = {};\r\n\r\n function visitLayer(prevLayer, layer) {\r\n var\r\n // last visited node in the previous layer that is incident on an inner\r\n // segment.\r\n k0 = 0,\r\n // Tracks the last node in this layer scanned for crossings with a type-1\r\n // segment.\r\n scanPos = 0,\r\n prevLayerLength = prevLayer.length,\r\n lastNode = _.last(layer);\r\n\r\n _.each(layer, function(v, i) {\r\n var w = findOtherInnerSegmentNode(g, v),\r\n k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n if (w || v === lastNode) {\r\n _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n _.each(g.predecessors(scanNode), function(u) {\r\n var uLabel = g.node(u),\r\n uPos = uLabel.order;\r\n if ((uPos < k0 || k1 < uPos) &&\r\n !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n addConflict(conflicts, u, scanNode);\r\n }\r\n });\r\n });\r\n scanPos = i + 1;\r\n k0 = k1;\r\n }\r\n });\r\n\r\n return layer;\r\n }\r\n\r\n _.reduce(layering, visitLayer);\r\n return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n var conflicts = {};\r\n\r\n function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n var v;\r\n _.each(_.range(southPos, southEnd), function(i) {\r\n v = south[i];\r\n if (g.node(v).dummy) {\r\n _.each(g.predecessors(v), function(u) {\r\n var uNode = g.node(u);\r\n if (uNode.dummy &&\r\n (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n addConflict(conflicts, u, v);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n\r\n function visitLayer(north, south) {\r\n var prevNorthPos = -1,\r\n nextNorthPos,\r\n southPos = 0;\r\n\r\n _.each(south, function(v, southLookahead) {\r\n if (g.node(v).dummy === \"border\") {\r\n var predecessors = g.predecessors(v);\r\n if (predecessors.length) {\r\n nextNorthPos = g.node(predecessors[0]).order;\r\n scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n southPos = southLookahead;\r\n prevNorthPos = nextNorthPos;\r\n }\r\n }\r\n scan(south, southPos, south.length, nextNorthPos, north.length);\r\n });\r\n\r\n return south;\r\n }\r\n\r\n _.reduce(layering, visitLayer);\r\n return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n if (g.node(v).dummy) {\r\n return _.find(g.predecessors(v), function(u) {\r\n return g.node(u).dummy;\r\n });\r\n }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n if (v > w) {\r\n var tmp = v;\r\n v = w;\r\n w = tmp;\r\n }\r\n\r\n var conflictsV = conflicts[v];\r\n if (!conflictsV) {\r\n conflicts[v] = conflictsV = {};\r\n }\r\n conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n if (v > w) {\r\n var tmp = v;\r\n v = w;\r\n w = tmp;\r\n }\r\n return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n var root = {},\r\n align = {},\r\n pos = {};\r\n\r\n // We cache the position here based on the layering because the graph and\r\n // layering may be out of sync. The layering matrix is manipulated to\r\n // generate different extreme alignments.\r\n _.each(layering, function(layer) {\r\n _.each(layer, function(v, order) {\r\n root[v] = v;\r\n align[v] = v;\r\n pos[v] = order;\r\n });\r\n });\r\n\r\n _.each(layering, function(layer) {\r\n var prevIdx = -1;\r\n _.each(layer, function(v) {\r\n var ws = neighborFn(v);\r\n if (ws.length) {\r\n ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n var mp = (ws.length - 1) / 2;\r\n for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n var w = ws[i];\r\n if (align[v] === v &&\r\n prevIdx < pos[w] &&\r\n !hasConflict(conflicts, v, w)) {\r\n align[w] = v;\r\n align[v] = root[v] = root[w];\r\n prevIdx = pos[w];\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n // This portion of the algorithm differs from BK due to a number of problems.\r\n // Instead of their algorithm we construct a new block graph and do two\r\n // sweeps. The first sweep places blocks with the smallest possible\r\n // coordinates. The second sweep removes unused space by moving blocks to the\r\n // greatest coordinates without violating separation.\r\n var xs = {},\r\n blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n // First pass, assign smallest coordinates via DFS\r\n var visited = {};\r\n function pass1(v) {\r\n if (!_.has(visited, v)) {\r\n visited[v] = true;\r\n xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n pass1(e.v);\r\n return Math.max(max, xs[e.v] + blockG.edge(e));\r\n }, 0);\r\n }\r\n }\r\n _.each(blockG.nodes(), pass1);\r\n\r\n function pass2(v) {\r\n if (visited[v] !== 2) {\r\n visited[v]++;\r\n var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n pass2(e.w);\r\n return Math.min(min, xs[e.w] - blockG.edge(e));\r\n }, Number.POSITIVE_INFINITY);\r\n if (min !== Number.POSITIVE_INFINITY) {\r\n xs[v] = Math.max(xs[v], min);\r\n }\r\n }\r\n }\r\n _.each(blockG.nodes(), pass2);\r\n\r\n\r\n // Assign x coordinates to all nodes\r\n _.each(align, function(v) {\r\n xs[v] = xs[root[v]];\r\n });\r\n\r\n return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n var blockGraph = new Graph(),\r\n graphLabel = g.graph(),\r\n sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n _.each(layering, function(layer) {\r\n var u;\r\n _.each(layer, function(v) {\r\n var vRoot = root[v];\r\n blockGraph.setNode(vRoot);\r\n if (u) {\r\n var uRoot = root[u],\r\n prevMax = blockGraph.edge(uRoot, vRoot);\r\n blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n }\r\n u = v;\r\n });\r\n });\r\n\r\n return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n return _.min(xss, function(xs) {\r\n var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n return max - min;\r\n });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n var alignToMin = _.min(alignTo),\r\n alignToMax = _.max(alignTo);\r\n\r\n _.each([\"u\", \"d\"], function(vert) {\r\n _.each([\"l\", \"r\"], function(horiz) {\r\n var alignment = vert + horiz,\r\n xs = xss[alignment],\r\n delta;\r\n if (xs === alignTo) return;\r\n\r\n delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n if (delta) {\r\n xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n }\r\n });\r\n });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n return _.mapValues(xss.ul, function(ignore, v) {\r\n if (align) {\r\n return xss[align.toLowerCase()][v];\r\n } else {\r\n var xs = _.sortBy(_.pluck(xss, v));\r\n return (xs[1] + xs[2]) / 2;\r\n }\r\n });\r\n}\r\n\r\nfunction positionX(g) {\r\n var layering = util.buildLayerMatrix(g),\r\n conflicts = _.merge(findType1Conflicts(g, layering),\r\n findType2Conflicts(g, layering));\r\n\r\n var xss = {},\r\n adjustedLayering;\r\n _.each([\"u\", \"d\"], function(vert) {\r\n adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n _.each([\"l\", \"r\"], function(horiz) {\r\n if (horiz === \"r\") {\r\n adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n return _.values(inner).reverse();\r\n });\r\n }\r\n\r\n var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n var xs = horizontalCompaction(g, adjustedLayering,\r\n align.root, align.align,\r\n horiz === \"r\");\r\n if (horiz === \"r\") {\r\n xs = _.mapValues(xs, function(x) { return -x; });\r\n }\r\n xss[vert + horiz] = xs;\r\n });\r\n });\r\n\r\n var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n alignCoordinates(xss, smallestWidth);\r\n return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n return function(g, v, w) {\r\n var vLabel = g.node(v),\r\n wLabel = g.node(w),\r\n sum = 0,\r\n delta;\r\n\r\n sum += vLabel.width / 2;\r\n if (_.has(vLabel, \"labelpos\")) {\r\n switch (vLabel.labelpos.toLowerCase()) {\r\n case \"l\": delta = -vLabel.width / 2; break;\r\n case \"r\": delta = vLabel.width / 2; break;\r\n }\r\n }\r\n if (delta) {\r\n sum += reverseSep ? delta : -delta;\r\n }\r\n delta = 0;\r\n\r\n sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n sum += wLabel.width / 2;\r\n if (_.has(wLabel, \"labelpos\")) {\r\n switch (wLabel.labelpos.toLowerCase()) {\r\n case \"l\": delta = wLabel.width / 2; break;\r\n case \"r\": delta = -wLabel.width / 2; break;\r\n }\r\n }\r\n if (delta) {\r\n sum += reverseSep ? delta : -delta;\r\n }\r\n delta = 0;\r\n\r\n return sum;\r\n };\r\n}\r\n\r\nfunction width(g, v) {\r\n return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n util = require(\"../util\"),\r\n positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n g = util.asNonCompoundGraph(g);\r\n\r\n positionY(g);\r\n _.each(positionX(g), function(x, v) {\r\n g.node(v).x = x;\r\n });\r\n}\r\n\r\nfunction positionY(g) {\r\n var layering = util.buildLayerMatrix(g),\r\n rankSep = g.graph().ranksep,\r\n prevY = 0;\r\n _.each(layering, function(layer) {\r\n var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n _.each(layer, function(v) {\r\n g.node(v).y = prevY + maxHeight / 2;\r\n });\r\n prevY += maxHeight + rankSep;\r\n });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n Graph = require(\"../graphlib\").Graph,\r\n slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n * 1. Graph must be a DAG.\r\n * 2. Graph must be connected.\r\n * 3. Graph must have at least one node.\r\n * 5. Graph nodes must have been previously assigned a \"rank\" property that\r\n * respects the \"minlen\" property of incident edges.\r\n * 6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n * - Graph nodes will have their rank adjusted to ensure that all edges are\r\n * tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n var t = new Graph({ directed: false });\r\n\r\n // Choose arbitrary node from which to start our tree\r\n var start = g.nodes()[0],\r\n size = g.nodeCount();\r\n t.setNode(start, {});\r\n\r\n var edge, delta;\r\n while (tightTree(t, g) < size) {\r\n edge = findMinSlackEdge(t, g);\r\n delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n shiftRanks(t, g, delta);\r\n }\r\n\r\n return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n function dfs(v) {\r\n _.each(g.nodeEdges(v), function(e) {\r\n var edgeV = e.v,\r\n w = (v === edgeV) ? e.w : edgeV;\r\n if (!t.hasNode(w) && !slack(g, e)) {\r\n t.setNode(w, {});\r\n t.setEdge(v, w, {});\r\n dfs(w);\r\n }\r\n });\r\n }\r\n\r\n _.each(t.nodes(), dfs);\r\n return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n return _.min(g.edges(), function(e) {\r\n if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n return slack(g, e);\r\n }\r\n });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n _.each(t.nodes(), function(v) {\r\n g.node(v).rank += delta;\r\n });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n longestPath = rankUtil.longestPath,\r\n feasibleTree = require(\"./feasible-tree\"),\r\n networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n * 1. Graph must be a connected DAG\r\n * 2. Graph nodes must be objects\r\n * 3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n * 1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n * algorithm. Ranks can start at any index (including negative), we'll\r\n * fix them up later.\r\n */\r\nfunction rank(g) {\r\n switch(g.graph().ranker) {\r\n case \"network-simplex\": networkSimplexRanker(g); break;\r\n case \"tight-tree\": tightTreeRanker(g); break;\r\n case \"longest-path\": longestPathRanker(g); break;\r\n default: networkSimplexRanker(g);\r\n }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n longestPath(g);\r\n feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n feasibleTree = require(\"./feasible-tree\"),\r\n slack = require(\"./util\").slack,\r\n initRank = require(\"./util\").longestPath,\r\n preorder = require(\"../graphlib\").alg.preorder,\r\n postorder = require(\"../graphlib\").alg.postorder,\r\n simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n * 1. The input graph must be a DAG.\r\n * 2. All nodes in the graph must have an object value.\r\n * 3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n * 1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n * been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n * 1. Assign initial ranks to each node. We use the longest path algorithm,\r\n * which assigns ranks to the lowest position possible. In general this\r\n * leads to very wide bottom ranks and unnecessarily long edges.\r\n * 2. Construct a feasible tight tree. A tight tree is one such that all\r\n * edges in the tree have no slack (difference between length of edge\r\n * and minlen for the edge). This by itself greatly improves the assigned\r\n * rankings by shorting edges.\r\n * 3. Iteratively find edges that have negative cut values. Generally a\r\n * negative cut value indicates that the edge could be removed and a new\r\n * tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n g = simplify(g);\r\n initRank(g);\r\n var t = feasibleTree(g);\r\n initLowLimValues(t);\r\n initCutValues(t, g);\r\n\r\n var e, f;\r\n while ((e = leaveEdge(t))) {\r\n f = enterEdge(t, g, e);\r\n exchangeEdges(t, g, e, f);\r\n }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n var vs = postorder(t, t.nodes());\r\n vs = vs.slice(0, vs.length - 1);\r\n _.each(vs, function(v) {\r\n assignCutValue(t, g, v);\r\n });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n var childLab = t.node(child),\r\n parent = childLab.parent;\r\n t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n var childLab = t.node(child),\r\n parent = childLab.parent,\r\n // True if the child is on the tail end of the edge in the directed graph\r\n childIsTail = true,\r\n // The graph's view of the tree edge we're inspecting\r\n graphEdge = g.edge(child, parent),\r\n // The accumulated cut value for the edge between this node and its parent\r\n cutValue = 0;\r\n\r\n if (!graphEdge) {\r\n childIsTail = false;\r\n graphEdge = g.edge(parent, child);\r\n }\r\n\r\n cutValue = graphEdge.weight;\r\n\r\n _.each(g.nodeEdges(child), function(e) {\r\n var isOutEdge = e.v === child,\r\n other = isOutEdge ? e.w : e.v;\r\n\r\n if (other !== parent) {\r\n var pointsToHead = isOutEdge === childIsTail,\r\n otherWeight = g.edge(e).weight;\r\n\r\n cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n if (isTreeEdge(t, child, other)) {\r\n var otherCutValue = t.edge(child, other).cutvalue;\r\n cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n }\r\n }\r\n });\r\n\r\n return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n if (arguments.length < 2) {\r\n root = tree.nodes()[0];\r\n }\r\n dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n var low = nextLim,\r\n label = tree.node(v);\r\n\r\n visited[v] = true;\r\n _.each(tree.neighbors(v), function(w) {\r\n if (!_.has(visited, w)) {\r\n nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n }\r\n });\r\n\r\n label.low = low;\r\n label.lim = nextLim++;\r\n if (parent) {\r\n label.parent = parent;\r\n } else {\r\n // TODO should be able to remove this when we incrementally update low lim\r\n delete label.parent;\r\n }\r\n\r\n return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n return _.find(tree.edges(), function(e) {\r\n return tree.edge(e).cutvalue < 0;\r\n });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n var v = edge.v,\r\n w = edge.w;\r\n\r\n // For the rest of this function we assume that v is the tail and w is the\r\n // head, so if we don't have this edge in the graph we should flip it to\r\n // match the correct orientation.\r\n if (!g.hasEdge(v, w)) {\r\n v = edge.w;\r\n w = edge.v;\r\n }\r\n\r\n var vLabel = t.node(v),\r\n wLabel = t.node(w),\r\n tailLabel = vLabel,\r\n flip = false;\r\n\r\n // If the root is in the tail of the edge then we need to flip the logic that\r\n // checks for the head and tail nodes in the candidates function below.\r\n if (vLabel.lim > wLabel.lim) {\r\n tailLabel = wLabel;\r\n flip = true;\r\n }\r\n\r\n var candidates = _.filter(g.edges(), function(edge) {\r\n return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n });\r\n\r\n return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n var v = e.v,\r\n w = e.w;\r\n t.removeEdge(v, w);\r\n t.setEdge(f.v, f.w, {});\r\n initLowLimValues(t);\r\n initCutValues(t, g);\r\n updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n vs = preorder(t, root);\r\n vs = vs.slice(1);\r\n _.each(vs, function(v) {\r\n var parent = t.node(v).parent,\r\n edge = g.edge(v, parent),\r\n flipped = false;\r\n\r\n if (!edge) {\r\n edge = g.edge(parent, v);\r\n flipped = true;\r\n }\r\n\r\n g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n longestPath: longestPath,\r\n slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n * 1. Input graph is a DAG.\r\n * 2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n * 1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n var visited = {};\r\n\r\n function dfs(v) {\r\n var label = g.node(v);\r\n if (_.has(visited, v)) {\r\n return label.rank;\r\n }\r\n visited[v] = true;\r\n\r\n var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n return dfs(e.w) - g.edge(e).minlen;\r\n }));\r\n\r\n if (rank === Number.POSITIVE_INFINITY) {\r\n rank = 0;\r\n }\r\n\r\n return (label.rank = rank);\r\n }\r\n\r\n _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n addDummyNode: addDummyNode,\r\n simplify: simplify,\r\n asNonCompoundGraph: asNonCompoundGraph,\r\n successorWeights: successorWeights,\r\n predecessorWeights: predecessorWeights,\r\n intersectRect: intersectRect,\r\n buildLayerMatrix: buildLayerMatrix,\r\n normalizeRanks: normalizeRanks,\r\n removeEmptyRanks: removeEmptyRanks,\r\n addBorderNode: addBorderNode,\r\n maxRank: maxRank,\r\n partition: partition,\r\n time: time,\r\n notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n var v;\r\n do {\r\n v = _.uniqueId(name);\r\n } while (g.hasNode(v));\r\n\r\n attrs.dummy = type;\r\n g.setNode(v, attrs);\r\n return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n var simplified = new Graph().setGraph(g.graph());\r\n _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n _.each(g.edges(), function(e) {\r\n var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n label = g.edge(e);\r\n simplified.setEdge(e.v, e.w, {\r\n weight: simpleLabel.weight + label.weight,\r\n minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n });\r\n });\r\n return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n _.each(g.nodes(), function(v) {\r\n if (!g.children(v).length) {\r\n simplified.setNode(v, g.node(v));\r\n }\r\n });\r\n _.each(g.edges(), function(e) {\r\n simplified.setEdge(e, g.edge(e));\r\n });\r\n return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n var weightMap = _.map(g.nodes(), function(v) {\r\n var sucs = {};\r\n _.each(g.outEdges(v), function(e) {\r\n sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n });\r\n return sucs;\r\n });\r\n return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n var weightMap = _.map(g.nodes(), function(v) {\r\n var preds = {};\r\n _.each(g.inEdges(v), function(e) {\r\n preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n });\r\n return preds;\r\n });\r\n return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n var x = rect.x;\r\n var y = rect.y;\r\n\r\n // Rectangle intersection algorithm from:\r\n // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n var dx = point.x - x;\r\n var dy = point.y - y;\r\n var w = rect.width / 2;\r\n var h = rect.height / 2;\r\n\r\n if (!dx && !dy) {\r\n throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n }\r\n\r\n var sx, sy;\r\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n // Intersection is top or bottom of rect.\r\n if (dy < 0) {\r\n h = -h;\r\n }\r\n sx = h * dx / dy;\r\n sy = h;\r\n } else {\r\n // Intersection is left or right of rect.\r\n if (dx < 0) {\r\n w = -w;\r\n }\r\n sx = w;\r\n sy = w * dy / dx;\r\n }\r\n\r\n return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n _.each(g.nodes(), function(v) {\r\n var node = g.node(v),\r\n rank = node.rank;\r\n if (!_.isUndefined(rank)) {\r\n layering[rank][node.order] = v;\r\n }\r\n });\r\n return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n _.each(g.nodes(), function(v) {\r\n var node = g.node(v);\r\n if (_.has(node, \"rank\")) {\r\n node.rank -= min;\r\n }\r\n });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n // Ranks may not start at 0, so we need to offset them\r\n var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n var layers = [];\r\n _.each(g.nodes(), function(v) {\r\n var rank = g.node(v).rank - offset;\r\n if (!_.has(layers, rank)) {\r\n layers[rank] = [];\r\n }\r\n layers[rank].push(v);\r\n });\r\n\r\n var delta = 0,\r\n nodeRankFactor = g.graph().nodeRankFactor;\r\n _.each(layers, function(vs, i) {\r\n if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n --delta;\r\n } else if (delta) {\r\n _.each(vs, function(v) { g.node(v).rank += delta; });\r\n }\r\n });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n var node = {\r\n width: 0,\r\n height: 0\r\n };\r\n if (arguments.length >= 4) {\r\n node.rank = rank;\r\n node.order = order;\r\n }\r\n return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n return _.max(_.map(g.nodes(), function(v) {\r\n var rank = g.node(v).rank;\r\n if (!_.isUndefined(rank)) {\r\n return rank;\r\n }\r\n }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n var result = { lhs: [], rhs: [] };\r\n _.each(collection, function(value) {\r\n if (fn(value)) {\r\n result.lhs.push(value);\r\n } else {\r\n result.rhs.push(value);\r\n }\r\n });\r\n return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n var start = _.now();\r\n try {\r\n return fn();\r\n } finally {\r\n console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n Graph: lib.Graph,\r\n json: require(\"./lib/json\"),\r\n alg: require(\"./lib/alg\"),\r\n version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n var visited = {},\r\n cmpts = [],\r\n cmpt;\r\n\r\n function dfs(v) {\r\n if (_.has(visited, v)) return;\r\n visited[v] = true;\r\n cmpt.push(v);\r\n _.each(g.successors(v), dfs);\r\n _.each(g.predecessors(v), dfs);\r\n }\r\n\r\n _.each(g.nodes(), function(v) {\r\n cmpt = [];\r\n dfs(v);\r\n if (cmpt.length) {\r\n cmpts.push(cmpt);\r\n }\r\n });\r\n\r\n return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n if (!_.isArray(vs)) {\r\n vs = [vs];\r\n }\r\n\r\n var acc = [],\r\n visited = {};\r\n _.each(vs, function(v) {\r\n if (!g.hasNode(v)) {\r\n throw new Error(\"Graph does not have node: \" + v);\r\n }\r\n\r\n doDfs(g, v, order === \"post\", visited, acc);\r\n });\r\n return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n if (!_.has(visited, v)) {\r\n visited[v] = true;\r\n\r\n if (!postorder) { acc.push(v); }\r\n _.each(g.neighbors(v), function(w) {\r\n doDfs(g, w, postorder, visited, acc);\r\n });\r\n if (postorder) { acc.push(v); }\r\n }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n return _.transform(g.nodes(), function(acc, v) {\r\n acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n return runDijkstra(g, String(source),\r\n weightFn || DEFAULT_WEIGHT_FUNC,\r\n edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n var results = {},\r\n pq = new PriorityQueue(),\r\n v, vEntry;\r\n\r\n var updateNeighbors = function(edge) {\r\n var w = edge.v !== v ? edge.v : edge.w,\r\n wEntry = results[w],\r\n weight = weightFn(edge),\r\n distance = vEntry.distance + weight;\r\n\r\n if (weight < 0) {\r\n throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n }\r\n\r\n if (distance < wEntry.distance) {\r\n wEntry.distance = distance;\r\n wEntry.predecessor = v;\r\n pq.decrease(w, distance);\r\n }\r\n };\r\n\r\n g.nodes().forEach(function(v) {\r\n var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n results[v] = { distance: distance };\r\n pq.add(v, distance);\r\n });\r\n\r\n while (pq.size() > 0) {\r\n v = pq.removeMin();\r\n vEntry = results[v];\r\n if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n break;\r\n }\r\n\r\n edgeFn(v).forEach(updateNeighbors);\r\n }\r\n\r\n return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n return runFloydWarshall(g,\r\n weightFn || DEFAULT_WEIGHT_FUNC,\r\n edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n var results = {},\r\n nodes = g.nodes();\r\n\r\n nodes.forEach(function(v) {\r\n results[v] = {};\r\n results[v][v] = { distance: 0 };\r\n nodes.forEach(function(w) {\r\n if (v !== w) {\r\n results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n }\r\n });\r\n edgeFn(v).forEach(function(edge) {\r\n var w = edge.v === v ? edge.w : edge.v,\r\n d = weightFn(edge);\r\n results[v][w] = { distance: d, predecessor: v };\r\n });\r\n });\r\n\r\n nodes.forEach(function(k) {\r\n var rowK = results[k];\r\n nodes.forEach(function(i) {\r\n var rowI = results[i];\r\n nodes.forEach(function(j) {\r\n var ik = rowI[k];\r\n var kj = rowK[j];\r\n var ij = rowI[j];\r\n var altDistance = ik.distance + kj.distance;\r\n if (altDistance < ij.distance) {\r\n ij.distance = altDistance;\r\n ij.predecessor = kj.predecessor;\r\n }\r\n });\r\n });\r\n });\r\n\r\n return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n components: require(\"./components\"),\r\n dijkstra: require(\"./dijkstra\"),\r\n dijkstraAll: require(\"./dijkstra-all\"),\r\n findCycles: require(\"./find-cycles\"),\r\n floydWarshall: require(\"./floyd-warshall\"),\r\n isAcyclic: require(\"./is-acyclic\"),\r\n postorder: require(\"./postorder\"),\r\n preorder: require(\"./preorder\"),\r\n prim: require(\"./prim\"),\r\n tarjan: require(\"./tarjan\"),\r\n topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n try {\r\n topsort(g);\r\n } catch (e) {\r\n if (e instanceof topsort.CycleException) {\r\n return false;\r\n }\r\n throw e;\r\n }\r\n return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n Graph = require(\"../graph\"),\r\n PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n var result = new Graph(),\r\n parents = {},\r\n pq = new PriorityQueue(),\r\n v;\r\n\r\n function updateNeighbors(edge) {\r\n var w = edge.v === v ? edge.w : edge.v,\r\n pri = pq.priority(w);\r\n if (pri !== undefined) {\r\n var edgeWeight = weightFunc(edge);\r\n if (edgeWeight < pri) {\r\n parents[w] = v;\r\n pq.decrease(w, edgeWeight);\r\n }\r\n }\r\n }\r\n\r\n if (g.nodeCount() === 0) {\r\n return result;\r\n }\r\n\r\n _.each(g.nodes(), function(v) {\r\n pq.add(v, Number.POSITIVE_INFINITY);\r\n result.setNode(v);\r\n });\r\n\r\n // Start from an arbitrary node\r\n pq.decrease(g.nodes()[0], 0);\r\n\r\n var init = false;\r\n while (pq.size() > 0) {\r\n v = pq.removeMin();\r\n if (_.has(parents, v)) {\r\n result.setEdge(v, parents[v]);\r\n } else if (init) {\r\n throw new Error(\"Input graph is not connected: \" + g);\r\n } else {\r\n init = true;\r\n }\r\n\r\n g.nodeEdges(v).forEach(updateNeighbors);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n var index = 0,\r\n stack = [],\r\n visited = {}, // node id -> { onStack, lowlink, index }\r\n results = [];\r\n\r\n function dfs(v) {\r\n var entry = visited[v] = {\r\n onStack: true,\r\n lowlink: index,\r\n index: index++\r\n };\r\n stack.push(v);\r\n\r\n g.successors(v).forEach(function(w) {\r\n if (!_.has(visited, w)) {\r\n dfs(w);\r\n entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n } else if (visited[w].onStack) {\r\n entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n }\r\n });\r\n\r\n if (entry.lowlink === entry.index) {\r\n var cmpt = [],\r\n w;\r\n do {\r\n w = stack.pop();\r\n visited[w].onStack = false;\r\n cmpt.push(w);\r\n } while (v !== w);\r\n results.push(cmpt);\r\n }\r\n }\r\n\r\n g.nodes().forEach(function(v) {\r\n if (!_.has(visited, v)) {\r\n dfs(v);\r\n }\r\n });\r\n\r\n return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n var visited = {},\r\n stack = {},\r\n results = [];\r\n\r\n function visit(node) {\r\n if (_.has(stack, node)) {\r\n throw new CycleException();\r\n }\r\n\r\n if (!_.has(visited, node)) {\r\n stack[node] = true;\r\n visited[node] = true;\r\n _.each(g.predecessors(node), visit);\r\n delete stack[node];\r\n results.push(node);\r\n }\r\n }\r\n\r\n _.each(g.sinks(), visit);\r\n\r\n if (_.size(visited) !== g.nodeCount()) {\r\n throw new CycleException();\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n this._arr = [];\r\n this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n var index = this._keyIndices[key];\r\n if (index !== undefined) {\r\n return this._arr[index].priority;\r\n }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n if (this.size() === 0) {\r\n throw new Error(\"Queue underflow\");\r\n }\r\n return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n var keyIndices = this._keyIndices;\r\n key = String(key);\r\n if (!_.has(keyIndices, key)) {\r\n var arr = this._arr;\r\n var index = arr.length;\r\n keyIndices[key] = index;\r\n arr.push({key: key, priority: priority});\r\n this._decrease(index);\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n this._swap(0, this._arr.length - 1);\r\n var min = this._arr.pop();\r\n delete this._keyIndices[min.key];\r\n this._heapify(0);\r\n return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n var index = this._keyIndices[key];\r\n if (priority > this._arr[index].priority) {\r\n throw new Error(\"New priority is greater than current priority. \" +\r\n \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n }\r\n this._arr[index].priority = priority;\r\n this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n var arr = this._arr;\r\n var l = 2 * i,\r\n r = l + 1,\r\n largest = i;\r\n if (l < arr.length) {\r\n largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n if (r < arr.length) {\r\n largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n }\r\n if (largest !== i) {\r\n this._swap(i, largest);\r\n this._heapify(largest);\r\n }\r\n }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n var arr = this._arr;\r\n var priority = arr[index].priority;\r\n var parent;\r\n while (index !== 0) {\r\n parent = index >> 1;\r\n if (arr[parent].priority < priority) {\r\n break;\r\n }\r\n this._swap(index, parent);\r\n index = parent;\r\n }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n var arr = this._arr;\r\n var keyIndices = this._keyIndices;\r\n var origArrI = arr[i];\r\n var origArrJ = arr[j];\r\n arr[i] = origArrJ;\r\n arr[j] = origArrI;\r\n keyIndices[origArrJ.key] = i;\r\n keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n GRAPH_NODE = \"\\x00\",\r\n EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n// * Node id query functions should return string ids for the nodes\r\n// * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n// composed of enough information to uniquely identify an edge: {v, w, name}.\r\n// * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n// reference edges. This is because we need a performant way to look these\r\n// edges up and, object properties, which have string keys, are the closest\r\n// we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n // Label for the graph itself\r\n this._label = undefined;\r\n\r\n // Defaults to be set when creating a new node\r\n this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n // Defaults to be set when creating a new edge\r\n this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n // v -> label\r\n this._nodes = {};\r\n\r\n if (this._isCompound) {\r\n // v -> parent\r\n this._parent = {};\r\n\r\n // v -> children\r\n this._children = {};\r\n this._children[GRAPH_NODE] = {};\r\n }\r\n\r\n // v -> edgeObj\r\n this._in = {};\r\n\r\n // u -> v -> Number\r\n this._preds = {};\r\n\r\n // v -> edgeObj\r\n this._out = {};\r\n\r\n // v -> w -> Number\r\n this._sucs = {};\r\n\r\n // e -> edgeObj\r\n this._edgeObjs = {};\r\n\r\n // e -> label\r\n this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n this._label = label;\r\n return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n if (!_.isFunction(newDefault)) {\r\n newDefault = _.constant(newDefault);\r\n }\r\n this._defaultNodeLabelFn = newDefault;\r\n return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n return _.filter(this.nodes(), function(v) {\r\n return _.isEmpty(this._in[v]);\r\n }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n return _.filter(this.nodes(), function(v) {\r\n return _.isEmpty(this._out[v]);\r\n }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n var args = arguments;\r\n _.each(vs, function(v) {\r\n if (args.length > 1) {\r\n this.setNode(v, value);\r\n } else {\r\n this.setNode(v);\r\n }\r\n }, this);\r\n return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n if (_.has(this._nodes, v)) {\r\n if (arguments.length > 1) {\r\n this._nodes[v] = value;\r\n }\r\n return this;\r\n }\r\n\r\n this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n if (this._isCompound) {\r\n this._parent[v] = GRAPH_NODE;\r\n this._children[v] = {};\r\n this._children[GRAPH_NODE][v] = true;\r\n }\r\n this._in[v] = {};\r\n this._preds[v] = {};\r\n this._out[v] = {};\r\n this._sucs[v] = {};\r\n ++this._nodeCount;\r\n return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode = function(v) {\r\n var self = this;\r\n if (_.has(this._nodes, v)) {\r\n var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n delete this._nodes[v];\r\n if (this._isCompound) {\r\n this._removeFromParentsChildList(v);\r\n delete this._parent[v];\r\n _.each(this.children(v), function(child) {\r\n this.setParent(child);\r\n }, this);\r\n delete this._children[v];\r\n }\r\n _.each(_.keys(this._in[v]), removeEdge);\r\n delete this._in[v];\r\n delete this._preds[v];\r\n _.each(_.keys(this._out[v]), removeEdge);\r\n delete this._out[v];\r\n delete this._sucs[v];\r\n --this._nodeCount;\r\n }\r\n return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n if (!this._isCompound) {\r\n throw new Error(\"Cannot set parent in a non-compound graph\");\r\n }\r\n\r\n if (_.isUndefined(parent)) {\r\n parent = GRAPH_NODE;\r\n } else {\r\n for (var ancestor = parent;\r\n !_.isUndefined(ancestor);\r\n ancestor = this.parent(ancestor)) {\r\n if (ancestor === v) {\r\n throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n \" would create create a cycle\");\r\n }\r\n }\r\n\r\n this.setNode(parent);\r\n }\r\n\r\n this.setNode(v);\r\n this._removeFromParentsChildList(v);\r\n this._parent[v] = parent;\r\n this._children[parent][v] = true;\r\n return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n if (this._isCompound) {\r\n var parent = this._parent[v];\r\n if (parent !== GRAPH_NODE) {\r\n return parent;\r\n }\r\n }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n if (_.isUndefined(v)) {\r\n v = GRAPH_NODE;\r\n }\r\n\r\n if (this._isCompound) {\r\n var children = this._children[v];\r\n if (children) {\r\n return _.keys(children);\r\n }\r\n } else if (v === GRAPH_NODE) {\r\n return this.nodes();\r\n } else if (this.hasNode(v)) {\r\n return [];\r\n }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n var predsV = this._preds[v];\r\n if (predsV) {\r\n return _.keys(predsV);\r\n }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n var sucsV = this._sucs[v];\r\n if (sucsV) {\r\n return _.keys(sucsV);\r\n }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n var preds = this.predecessors(v);\r\n if (preds) {\r\n return _.union(preds, this.successors(v));\r\n }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n if (!_.isFunction(newDefault)) {\r\n newDefault = _.constant(newDefault);\r\n }\r\n this._defaultEdgeLabelFn = newDefault;\r\n return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n var self = this,\r\n args = arguments;\r\n _.reduce(vs, function(v, w) {\r\n if (args.length > 1) {\r\n self.setEdge(v, w, value);\r\n } else {\r\n self.setEdge(v, w);\r\n }\r\n return w;\r\n });\r\n return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n var v, w, name, value,\r\n valueSpecified = false;\r\n\r\n if (_.isPlainObject(arguments[0])) {\r\n v = arguments[0].v;\r\n w = arguments[0].w;\r\n name = arguments[0].name;\r\n if (arguments.length === 2) {\r\n value = arguments[1];\r\n valueSpecified = true;\r\n }\r\n } else {\r\n v = arguments[0];\r\n w = arguments[1];\r\n name = arguments[3];\r\n if (arguments.length > 2) {\r\n value = arguments[2];\r\n valueSpecified = true;\r\n }\r\n }\r\n\r\n v = \"\" + v;\r\n w = \"\" + w;\r\n if (!_.isUndefined(name)) {\r\n name = \"\" + name;\r\n }\r\n\r\n var e = edgeArgsToId(this._isDirected, v, w, name);\r\n if (_.has(this._edgeLabels, e)) {\r\n if (valueSpecified) {\r\n this._edgeLabels[e] = value;\r\n }\r\n return this;\r\n }\r\n\r\n if (!_.isUndefined(name) && !this._isMultigraph) {\r\n throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n }\r\n\r\n // It didn't exist, so we need to create it.\r\n // First ensure the nodes exist.\r\n this.setNode(v);\r\n this.setNode(w);\r\n\r\n this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n // Ensure we add undirected edges in a consistent way.\r\n v = edgeObj.v;\r\n w = edgeObj.w;\r\n\r\n Object.freeze(edgeObj);\r\n this._edgeObjs[e] = edgeObj;\r\n incrementOrInitEntry(this._preds[w], v);\r\n incrementOrInitEntry(this._sucs[v], w);\r\n this._in[w][e] = edgeObj;\r\n this._out[v][e] = edgeObj;\r\n this._edgeCount++;\r\n return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n var e = (arguments.length === 1\r\n ? edgeObjToId(this._isDirected, arguments[0])\r\n : edgeArgsToId(this._isDirected, v, w, name));\r\n return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n var e = (arguments.length === 1\r\n ? edgeObjToId(this._isDirected, arguments[0])\r\n : edgeArgsToId(this._isDirected, v, w, name));\r\n return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n var e = (arguments.length === 1\r\n ? edgeObjToId(this._isDirected, arguments[0])\r\n : edgeArgsToId(this._isDirected, v, w, name)),\r\n edge = this._edgeObjs[e];\r\n if (edge) {\r\n v = edge.v;\r\n w = edge.w;\r\n delete this._edgeLabels[e];\r\n delete this._edgeObjs[e];\r\n decrementOrRemoveEntry(this._preds[w], v);\r\n decrementOrRemoveEntry(this._sucs[v], w);\r\n delete this._in[w][e];\r\n delete this._out[v][e];\r\n this._edgeCount--;\r\n }\r\n return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n var inV = this._in[v];\r\n if (inV) {\r\n var edges = _.values(inV);\r\n if (!u) {\r\n return edges;\r\n }\r\n return _.filter(edges, function(edge) { return edge.v === u; });\r\n }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n var outV = this._out[v];\r\n if (outV) {\r\n var edges = _.values(outV);\r\n if (!w) {\r\n return edges;\r\n }\r\n return _.filter(edges, function(edge) { return edge.w === w; });\r\n }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n var inEdges = this.inEdges(v, w);\r\n if (inEdges) {\r\n return inEdges.concat(this.outEdges(v, w));\r\n }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n if (_.has(map, k)) {\r\n map[k]++;\r\n } else {\r\n map[k] = 1;\r\n }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n if (!isDirected && v > w) {\r\n var tmp = v;\r\n v = w;\r\n w = tmp;\r\n }\r\n return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n if (!isDirected && v > w) {\r\n var tmp = v;\r\n v = w;\r\n w = tmp;\r\n }\r\n var edgeObj = { v: v, w: w };\r\n if (name) {\r\n edgeObj.name = name;\r\n }\r\n return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n Graph: require(\"./graph\"),\r\n version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n write: write,\r\n read: read\r\n};\r\n\r\nfunction write(g) {\r\n var json = {\r\n options: {\r\n directed: g.isDirected(),\r\n multigraph: g.isMultigraph(),\r\n compound: g.isCompound()\r\n },\r\n nodes: writeNodes(g),\r\n edges: writeEdges(g)\r\n };\r\n if (!_.isUndefined(g.graph())) {\r\n json.value = _.clone(g.graph());\r\n }\r\n return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n return _.map(g.nodes(), function(v) {\r\n var nodeValue = g.node(v),\r\n parent = g.parent(v),\r\n node = { v: v };\r\n if (!_.isUndefined(nodeValue)) {\r\n node.value = nodeValue;\r\n }\r\n if (!_.isUndefined(parent)) {\r\n node.parent = parent;\r\n }\r\n return node;\r\n });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n return _.map(g.edges(), function(e) {\r\n var edgeValue = g.edge(e),\r\n edge = { v: e.v, w: e.w };\r\n if (!_.isUndefined(e.name)) {\r\n edge.name = e.name;\r\n }\r\n if (!_.isUndefined(edgeValue)) {\r\n edge.value = edgeValue;\r\n }\r\n return edge;\r\n });\r\n}\r\n\r\nfunction read(json) {\r\n var g = new Graph(json.options).setGraph(json.value);\r\n _.each(json.nodes, function(entry) {\r\n g.setNode(entry.v, entry.value);\r\n if (entry.parent) {\r\n g.setParent(entry.v, entry.parent);\r\n }\r\n });\r\n _.each(json.edges, function(entry) {\r\n g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n });\r\n return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n var undefined;\r\n\r\n /** Used to pool arrays and objects used internally */\r\n var arrayPool = [],\r\n objectPool = [];\r\n\r\n /** Used to generate unique IDs */\r\n var idCounter = 0;\r\n\r\n /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n var keyPrefix = +new Date + '';\r\n\r\n /** Used as the size when optimizations are enabled for large arrays */\r\n var largeArraySize = 75;\r\n\r\n /** Used as the max size of the `arrayPool` and `objectPool` */\r\n var maxPoolSize = 40;\r\n\r\n /** Used to detect and test whitespace */\r\n var whitespace = (\r\n // whitespace\r\n ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n // line terminators\r\n '\\n\\r\\u2028\\u2029' +\r\n\r\n // unicode category \"Zs\" space separators\r\n '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n );\r\n\r\n /** Used to match empty string literals in compiled template source */\r\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n /**\r\n * Used to match ES6 template delimiters\r\n * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n */\r\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n /** Used to match regexp flags from their coerced string values */\r\n var reFlags = /\\w*$/;\r\n\r\n /** Used to detected named functions */\r\n var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n /** Used to match \"interpolate\" template delimiters */\r\n var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n /** Used to match leading whitespace and zeros to be removed */\r\n var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n /** Used to ensure capturing order of template delimiters */\r\n var reNoMatch = /($^)/;\r\n\r\n /** Used to detect functions containing a `this` reference */\r\n var reThis = /\\bthis\\b/;\r\n\r\n /** Used to match unescaped characters in compiled string literals */\r\n var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n /** Used to assign default `context` object properties */\r\n var contextProps = [\r\n 'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n 'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n 'parseInt', 'setTimeout'\r\n ];\r\n\r\n /** Used to make template sourceURLs easier to identify */\r\n var templateCounter = 0;\r\n\r\n /** `Object#toString` result shortcuts */\r\n var argsClass = '[object Arguments]',\r\n arrayClass = '[object Array]',\r\n boolClass = '[object Boolean]',\r\n dateClass = '[object Date]',\r\n funcClass = '[object Function]',\r\n numberClass = '[object Number]',\r\n objectClass = '[object Object]',\r\n regexpClass = '[object RegExp]',\r\n stringClass = '[object String]';\r\n\r\n /** Used to identify object classifications that `_.clone` supports */\r\n var cloneableClasses = {};\r\n cloneableClasses[funcClass] = false;\r\n cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n /** Used as an internal `_.debounce` options object */\r\n var debounceOptions = {\r\n 'leading': false,\r\n 'maxWait': 0,\r\n 'trailing': false\r\n };\r\n\r\n /** Used as the property descriptor for `__bindData__` */\r\n var descriptor = {\r\n 'configurable': false,\r\n 'enumerable': false,\r\n 'value': null,\r\n 'writable': false\r\n };\r\n\r\n /** Used to determine if values are of the language type Object */\r\n var objectTypes = {\r\n 'boolean': false,\r\n 'function': true,\r\n 'object': true,\r\n 'number': false,\r\n 'string': false,\r\n 'undefined': false\r\n };\r\n\r\n /** Used to escape characters for inclusion in compiled string literals */\r\n var stringEscapes = {\r\n '\\\\': '\\\\',\r\n \"'\": \"'\",\r\n '\\n': 'n',\r\n '\\r': 'r',\r\n '\\t': 't',\r\n '\\u2028': 'u2028',\r\n '\\u2029': 'u2029'\r\n };\r\n\r\n /** Used as a reference to the global object */\r\n var root = (objectTypes[typeof window] && window) || this;\r\n\r\n /** Detect free variable `exports` */\r\n var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n /** Detect free variable `module` */\r\n var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n /** Detect the popular CommonJS extension `module.exports` */\r\n var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n var freeGlobal = objectTypes[typeof global] && global;\r\n if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n root = freeGlobal;\r\n }\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * The base implementation of `_.indexOf` without support for binary searches\r\n * or `fromIndex` constraints.\r\n *\r\n * @private\r\n * @param {Array} array The array to search.\r\n * @param {*} value The value to search for.\r\n * @param {number} [fromIndex=0] The index to search from.\r\n * @returns {number} Returns the index of the matched value or `-1`.\r\n */\r\n function baseIndexOf(array, value, fromIndex) {\r\n var index = (fromIndex || 0) - 1,\r\n length = array ? array.length : 0;\r\n\r\n while (++index < length) {\r\n if (array[index] === value) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * An implementation of `_.contains` for cache objects that mimics the return\r\n * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n *\r\n * @private\r\n * @param {Object} cache The cache object to inspect.\r\n * @param {*} value The value to search for.\r\n * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n */\r\n function cacheIndexOf(cache, value) {\r\n var type = typeof value;\r\n cache = cache.cache;\r\n\r\n if (type == 'boolean' || value == null) {\r\n return cache[value] ? 0 : -1;\r\n }\r\n if (type != 'number' && type != 'string') {\r\n type = 'object';\r\n }\r\n var key = type == 'number' ? value : keyPrefix + value;\r\n cache = (cache = cache[type]) && cache[key];\r\n\r\n return type == 'object'\r\n ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n : (cache ? 0 : -1);\r\n }\r\n\r\n /**\r\n * Adds a given value to the corresponding cache object.\r\n *\r\n * @private\r\n * @param {*} value The value to add to the cache.\r\n */\r\n function cachePush(value) {\r\n var cache = this.cache,\r\n type = typeof value;\r\n\r\n if (type == 'boolean' || value == null) {\r\n cache[value] = true;\r\n } else {\r\n if (type != 'number' && type != 'string') {\r\n type = 'object';\r\n }\r\n var key = type == 'number' ? value : keyPrefix + value,\r\n typeCache = cache[type] || (cache[type] = {});\r\n\r\n if (type == 'object') {\r\n (typeCache[key] || (typeCache[key] = [])).push(value);\r\n } else {\r\n typeCache[key] = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Used by `_.max` and `_.min` as the default callback when a given\r\n * collection is a string value.\r\n *\r\n * @private\r\n * @param {string} value The character to inspect.\r\n * @returns {number} Returns the code unit of given character.\r\n */\r\n function charAtCallback(value) {\r\n return value.charCodeAt(0);\r\n }\r\n\r\n /**\r\n * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n * them in ascending order.\r\n *\r\n * @private\r\n * @param {Object} a The object to compare to `b`.\r\n * @param {Object} b The object to compare to `a`.\r\n * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n */\r\n function compareAscending(a, b) {\r\n var ac = a.criteria,\r\n bc = b.criteria,\r\n index = -1,\r\n length = ac.length;\r\n\r\n while (++index < length) {\r\n var value = ac[index],\r\n other = bc[index];\r\n\r\n if (value !== other) {\r\n if (value > other || typeof value == 'undefined') {\r\n return 1;\r\n }\r\n if (value < other || typeof other == 'undefined') {\r\n return -1;\r\n }\r\n }\r\n }\r\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n // that causes it, under certain circumstances, to return the same value for\r\n // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n //\r\n // This also ensures a stable sort in V8 and other engines.\r\n // See http://code.google.com/p/v8/issues/detail?id=90\r\n return a.index - b.index;\r\n }\r\n\r\n /**\r\n * Creates a cache object to optimize linear searches of large arrays.\r\n *\r\n * @private\r\n * @param {Array} [array=[]] The array to search.\r\n * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n */\r\n function createCache(array) {\r\n var index = -1,\r\n length = array.length,\r\n first = array[0],\r\n mid = array[(length / 2) | 0],\r\n last = array[length - 1];\r\n\r\n if (first && typeof first == 'object' &&\r\n mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n return false;\r\n }\r\n var cache = getObject();\r\n cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n var result = getObject();\r\n result.array = array;\r\n result.cache = cache;\r\n result.push = cachePush;\r\n\r\n while (++index < length) {\r\n result.push(array[index]);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Used by `template` to escape characters for inclusion in compiled\r\n * string literals.\r\n *\r\n * @private\r\n * @param {string} match The matched character to escape.\r\n * @returns {string} Returns the escaped character.\r\n */\r\n function escapeStringChar(match) {\r\n return '\\\\' + stringEscapes[match];\r\n }\r\n\r\n /**\r\n * Gets an array from the array pool or creates a new one if the pool is empty.\r\n *\r\n * @private\r\n * @returns {Array} The array from the pool.\r\n */\r\n function getArray() {\r\n return arrayPool.pop() || [];\r\n }\r\n\r\n /**\r\n * Gets an object from the object pool or creates a new one if the pool is empty.\r\n *\r\n * @private\r\n * @returns {Object} The object from the pool.\r\n */\r\n function getObject() {\r\n return objectPool.pop() || {\r\n 'array': null,\r\n 'cache': null,\r\n 'criteria': null,\r\n 'false': false,\r\n 'index': 0,\r\n 'null': false,\r\n 'number': null,\r\n 'object': null,\r\n 'push': null,\r\n 'string': null,\r\n 'true': false,\r\n 'undefined': false,\r\n 'value': null\r\n };\r\n }\r\n\r\n /**\r\n * Releases the given array back to the array pool.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to release.\r\n */\r\n function releaseArray(array) {\r\n array.length = 0;\r\n if (arrayPool.length < maxPoolSize) {\r\n arrayPool.push(array);\r\n }\r\n }\r\n\r\n /**\r\n * Releases the given object back to the object pool.\r\n *\r\n * @private\r\n * @param {Object} [object] The object to release.\r\n */\r\n function releaseObject(object) {\r\n var cache = object.cache;\r\n if (cache) {\r\n releaseObject(cache);\r\n }\r\n object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n if (objectPool.length < maxPoolSize) {\r\n objectPool.push(object);\r\n }\r\n }\r\n\r\n /**\r\n * Slices the `collection` from the `start` index up to, but not including,\r\n * the `end` index.\r\n *\r\n * Note: This function is used instead of `Array#slice` to support node lists\r\n * in IE < 9 and to ensure dense arrays are returned.\r\n *\r\n * @private\r\n * @param {Array|Object|string} collection The collection to slice.\r\n * @param {number} start The start index.\r\n * @param {number} end The end index.\r\n * @returns {Array} Returns the new array.\r\n */\r\n function slice(array, start, end) {\r\n start || (start = 0);\r\n if (typeof end == 'undefined') {\r\n end = array ? array.length : 0;\r\n }\r\n var index = -1,\r\n length = end - start || 0,\r\n result = Array(length < 0 ? 0 : length);\r\n\r\n while (++index < length) {\r\n result[index] = array[start + index];\r\n }\r\n return result;\r\n }\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Create a new `lodash` function using the given context object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {Object} [context=root] The context object.\r\n * @returns {Function} Returns the `lodash` function.\r\n */\r\n function runInContext(context) {\r\n // Avoid issues with some ES3 environments that attempt to use values, named\r\n // after built-in constructors like `Object`, for the creation of literals.\r\n // ES5 clears this up by stating that literals must use built-in constructors.\r\n // See http://es5.github.io/#x11.1.5.\r\n context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n /** Native constructor references */\r\n var Array = context.Array,\r\n Boolean = context.Boolean,\r\n Date = context.Date,\r\n Function = context.Function,\r\n Math = context.Math,\r\n Number = context.Number,\r\n Object = context.Object,\r\n RegExp = context.RegExp,\r\n String = context.String,\r\n TypeError = context.TypeError;\r\n\r\n /**\r\n * Used for `Array` method references.\r\n *\r\n * Normally `Array.prototype` would suffice, however, using an array literal\r\n * avoids issues in Narwhal.\r\n */\r\n var arrayRef = [];\r\n\r\n /** Used for native method references */\r\n var objectProto = Object.prototype;\r\n\r\n /** Used to restore the original `_` reference in `noConflict` */\r\n var oldDash = context._;\r\n\r\n /** Used to resolve the internal [[Class]] of values */\r\n var toString = objectProto.toString;\r\n\r\n /** Used to detect if a method is native */\r\n var reNative = RegExp('^' +\r\n String(toString)\r\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n );\r\n\r\n /** Native method shortcuts */\r\n var ceil = Math.ceil,\r\n clearTimeout = context.clearTimeout,\r\n floor = Math.floor,\r\n fnToString = Function.prototype.toString,\r\n getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n hasOwnProperty = objectProto.hasOwnProperty,\r\n push = arrayRef.push,\r\n setTimeout = context.setTimeout,\r\n splice = arrayRef.splice,\r\n unshift = arrayRef.unshift;\r\n\r\n /** Used to set meta data on functions */\r\n var defineProperty = (function() {\r\n // IE 8 only accepts DOM elements\r\n try {\r\n var o = {},\r\n func = isNative(func = Object.defineProperty) && func,\r\n result = func(o, o, o) && func;\r\n } catch(e) { }\r\n return result;\r\n }());\r\n\r\n /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n nativeIsFinite = context.isFinite,\r\n nativeIsNaN = context.isNaN,\r\n nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n nativeMax = Math.max,\r\n nativeMin = Math.min,\r\n nativeParseInt = context.parseInt,\r\n nativeRandom = Math.random;\r\n\r\n /** Used to lookup a built-in constructor by [[Class]] */\r\n var ctorByClass = {};\r\n ctorByClass[arrayClass] = Array;\r\n ctorByClass[boolClass] = Boolean;\r\n ctorByClass[dateClass] = Date;\r\n ctorByClass[funcClass] = Function;\r\n ctorByClass[objectClass] = Object;\r\n ctorByClass[numberClass] = Number;\r\n ctorByClass[regexpClass] = RegExp;\r\n ctorByClass[stringClass] = String;\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates a `lodash` object which wraps the given value to enable intuitive\r\n * method chaining.\r\n *\r\n * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n * and `unshift`\r\n *\r\n * Chaining is supported in custom builds as long as the `value` method is\r\n * implicitly or explicitly included in the build.\r\n *\r\n * The chainable wrapper functions are:\r\n * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n * and `zip`\r\n *\r\n * The non-chainable wrapper functions are:\r\n * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n * `template`, `unescape`, `uniqueId`, and `value`\r\n *\r\n * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n * provided, otherwise they return unwrapped values.\r\n *\r\n * Explicit chaining can be enabled by using the `_.chain` method.\r\n *\r\n * @name _\r\n * @constructor\r\n * @category Chaining\r\n * @param {*} value The value to wrap in a `lodash` instance.\r\n * @returns {Object} Returns a `lodash` instance.\r\n * @example\r\n *\r\n * var wrapped = _([1, 2, 3]);\r\n *\r\n * // returns an unwrapped value\r\n * wrapped.reduce(function(sum, num) {\r\n * return sum + num;\r\n * });\r\n * // => 6\r\n *\r\n * // returns a wrapped value\r\n * var squares = wrapped.map(function(num) {\r\n * return num * num;\r\n * });\r\n *\r\n * _.isArray(squares);\r\n * // => false\r\n *\r\n * _.isArray(squares.value());\r\n * // => true\r\n */\r\n function lodash(value) {\r\n // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n ? value\r\n : new lodashWrapper(value);\r\n }\r\n\r\n /**\r\n * A fast path for creating `lodash` wrapper objects.\r\n *\r\n * @private\r\n * @param {*} value The value to wrap in a `lodash` instance.\r\n * @param {boolean} chainAll A flag to enable chaining for all methods\r\n * @returns {Object} Returns a `lodash` instance.\r\n */\r\n function lodashWrapper(value, chainAll) {\r\n this.__chain__ = !!chainAll;\r\n this.__wrapped__ = value;\r\n }\r\n // ensure `new lodashWrapper` is an instance of `lodash`\r\n lodashWrapper.prototype = lodash.prototype;\r\n\r\n /**\r\n * An object used to flag environments features.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @type Object\r\n */\r\n var support = lodash.support = {};\r\n\r\n /**\r\n * Detect if functions can be decompiled by `Function#toString`\r\n * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n *\r\n * @memberOf _.support\r\n * @type boolean\r\n */\r\n support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n /**\r\n * Detect if `Function#name` is supported (all but IE).\r\n *\r\n * @memberOf _.support\r\n * @type boolean\r\n */\r\n support.funcNames = typeof Function.name == 'string';\r\n\r\n /**\r\n * By default, the template delimiters used by Lo-Dash are similar to those in\r\n * embedded Ruby (ERB). Change the following template settings to use alternative\r\n * delimiters.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @type Object\r\n */\r\n lodash.templateSettings = {\r\n\r\n /**\r\n * Used to detect `data` property values to be HTML-escaped.\r\n *\r\n * @memberOf _.templateSettings\r\n * @type RegExp\r\n */\r\n 'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n /**\r\n * Used to detect code to be evaluated.\r\n *\r\n * @memberOf _.templateSettings\r\n * @type RegExp\r\n */\r\n 'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n /**\r\n * Used to detect `data` property values to inject.\r\n *\r\n * @memberOf _.templateSettings\r\n * @type RegExp\r\n */\r\n 'interpolate': reInterpolate,\r\n\r\n /**\r\n * Used to reference the data object in the template text.\r\n *\r\n * @memberOf _.templateSettings\r\n * @type string\r\n */\r\n 'variable': '',\r\n\r\n /**\r\n * Used to import variables into the compiled template.\r\n *\r\n * @memberOf _.templateSettings\r\n * @type Object\r\n */\r\n 'imports': {\r\n\r\n /**\r\n * A reference to the `lodash` function.\r\n *\r\n * @memberOf _.templateSettings.imports\r\n * @type Function\r\n */\r\n '_': lodash\r\n }\r\n };\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * The base implementation of `_.bind` that creates the bound function and\r\n * sets its meta data.\r\n *\r\n * @private\r\n * @param {Array} bindData The bind data array.\r\n * @returns {Function} Returns the new bound function.\r\n */\r\n function baseBind(bindData) {\r\n var func = bindData[0],\r\n partialArgs = bindData[2],\r\n thisArg = bindData[4];\r\n\r\n function bound() {\r\n // `Function#bind` spec\r\n // http://es5.github.io/#x15.3.4.5\r\n if (partialArgs) {\r\n // avoid `arguments` object deoptimizations by using `slice` instead\r\n // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n // variable as a ternary expression\r\n var args = slice(partialArgs);\r\n push.apply(args, arguments);\r\n }\r\n // mimic the constructor's `return` behavior\r\n // http://es5.github.io/#x13.2.2\r\n if (this instanceof bound) {\r\n // ensure `new bound` is an instance of `func`\r\n var thisBinding = baseCreate(func.prototype),\r\n result = func.apply(thisBinding, args || arguments);\r\n return isObject(result) ? result : thisBinding;\r\n }\r\n return func.apply(thisArg, args || arguments);\r\n }\r\n setBindData(bound, bindData);\r\n return bound;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.clone` without argument juggling or support\r\n * for `thisArg` binding.\r\n *\r\n * @private\r\n * @param {*} value The value to clone.\r\n * @param {boolean} [isDeep=false] Specify a deep clone.\r\n * @param {Function} [callback] The function to customize cloning values.\r\n * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n * @returns {*} Returns the cloned value.\r\n */\r\n function baseClone(value, isDeep, callback, stackA, stackB) {\r\n if (callback) {\r\n var result = callback(value);\r\n if (typeof result != 'undefined') {\r\n return result;\r\n }\r\n }\r\n // inspect [[Class]]\r\n var isObj = isObject(value);\r\n if (isObj) {\r\n var className = toString.call(value);\r\n if (!cloneableClasses[className]) {\r\n return value;\r\n }\r\n var ctor = ctorByClass[className];\r\n switch (className) {\r\n case boolClass:\r\n case dateClass:\r\n return new ctor(+value);\r\n\r\n case numberClass:\r\n case stringClass:\r\n return new ctor(value);\r\n\r\n case regexpClass:\r\n result = ctor(value.source, reFlags.exec(value));\r\n result.lastIndex = value.lastIndex;\r\n return result;\r\n }\r\n } else {\r\n return value;\r\n }\r\n var isArr = isArray(value);\r\n if (isDeep) {\r\n // check for circular references and return corresponding clone\r\n var initedStack = !stackA;\r\n stackA || (stackA = getArray());\r\n stackB || (stackB = getArray());\r\n\r\n var length = stackA.length;\r\n while (length--) {\r\n if (stackA[length] == value) {\r\n return stackB[length];\r\n }\r\n }\r\n result = isArr ? ctor(value.length) : {};\r\n }\r\n else {\r\n result = isArr ? slice(value) : assign({}, value);\r\n }\r\n // add array properties assigned by `RegExp#exec`\r\n if (isArr) {\r\n if (hasOwnProperty.call(value, 'index')) {\r\n result.index = value.index;\r\n }\r\n if (hasOwnProperty.call(value, 'input')) {\r\n result.input = value.input;\r\n }\r\n }\r\n // exit for shallow clone\r\n if (!isDeep) {\r\n return result;\r\n }\r\n // add the source value to the stack of traversed objects\r\n // and associate it with its clone\r\n stackA.push(value);\r\n stackB.push(result);\r\n\r\n // recursively populate clone (susceptible to call stack limits)\r\n (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n });\r\n\r\n if (initedStack) {\r\n releaseArray(stackA);\r\n releaseArray(stackB);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.create` without support for assigning\r\n * properties to the created object.\r\n *\r\n * @private\r\n * @param {Object} prototype The object to inherit from.\r\n * @returns {Object} Returns the new object.\r\n */\r\n function baseCreate(prototype, properties) {\r\n return isObject(prototype) ? nativeCreate(prototype) : {};\r\n }\r\n // fallback for browsers without `Object.create`\r\n if (!nativeCreate) {\r\n baseCreate = (function() {\r\n function Object() {}\r\n return function(prototype) {\r\n if (isObject(prototype)) {\r\n Object.prototype = prototype;\r\n var result = new Object;\r\n Object.prototype = null;\r\n }\r\n return result || context.Object();\r\n };\r\n }());\r\n }\r\n\r\n /**\r\n * The base implementation of `_.createCallback` without support for creating\r\n * \"_.pluck\" or \"_.where\" style callbacks.\r\n *\r\n * @private\r\n * @param {*} [func=identity] The value to convert to a callback.\r\n * @param {*} [thisArg] The `this` binding of the created callback.\r\n * @param {number} [argCount] The number of arguments the callback accepts.\r\n * @returns {Function} Returns a callback function.\r\n */\r\n function baseCreateCallback(func, thisArg, argCount) {\r\n if (typeof func != 'function') {\r\n return identity;\r\n }\r\n // exit early for no `thisArg` or already bound by `Function#bind`\r\n if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n return func;\r\n }\r\n var bindData = func.__bindData__;\r\n if (typeof bindData == 'undefined') {\r\n if (support.funcNames) {\r\n bindData = !func.name;\r\n }\r\n bindData = bindData || !support.funcDecomp;\r\n if (!bindData) {\r\n var source = fnToString.call(func);\r\n if (!support.funcNames) {\r\n bindData = !reFuncName.test(source);\r\n }\r\n if (!bindData) {\r\n // checks if `func` references the `this` keyword and stores the result\r\n bindData = reThis.test(source);\r\n setBindData(func, bindData);\r\n }\r\n }\r\n }\r\n // exit early if there are no `this` references or `func` is bound\r\n if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n return func;\r\n }\r\n switch (argCount) {\r\n case 1: return function(value) {\r\n return func.call(thisArg, value);\r\n };\r\n case 2: return function(a, b) {\r\n return func.call(thisArg, a, b);\r\n };\r\n case 3: return function(value, index, collection) {\r\n return func.call(thisArg, value, index, collection);\r\n };\r\n case 4: return function(accumulator, value, index, collection) {\r\n return func.call(thisArg, accumulator, value, index, collection);\r\n };\r\n }\r\n return bind(func, thisArg);\r\n }\r\n\r\n /**\r\n * The base implementation of `createWrapper` that creates the wrapper and\r\n * sets its meta data.\r\n *\r\n * @private\r\n * @param {Array} bindData The bind data array.\r\n * @returns {Function} Returns the new function.\r\n */\r\n function baseCreateWrapper(bindData) {\r\n var func = bindData[0],\r\n bitmask = bindData[1],\r\n partialArgs = bindData[2],\r\n partialRightArgs = bindData[3],\r\n thisArg = bindData[4],\r\n arity = bindData[5];\r\n\r\n var isBind = bitmask & 1,\r\n isBindKey = bitmask & 2,\r\n isCurry = bitmask & 4,\r\n isCurryBound = bitmask & 8,\r\n key = func;\r\n\r\n function bound() {\r\n var thisBinding = isBind ? thisArg : this;\r\n if (partialArgs) {\r\n var args = slice(partialArgs);\r\n push.apply(args, arguments);\r\n }\r\n if (partialRightArgs || isCurry) {\r\n args || (args = slice(arguments));\r\n if (partialRightArgs) {\r\n push.apply(args, partialRightArgs);\r\n }\r\n if (isCurry && args.length < arity) {\r\n bitmask |= 16 & ~32;\r\n return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n }\r\n }\r\n args || (args = arguments);\r\n if (isBindKey) {\r\n func = thisBinding[key];\r\n }\r\n if (this instanceof bound) {\r\n thisBinding = baseCreate(func.prototype);\r\n var result = func.apply(thisBinding, args);\r\n return isObject(result) ? result : thisBinding;\r\n }\r\n return func.apply(thisBinding, args);\r\n }\r\n setBindData(bound, bindData);\r\n return bound;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.difference` that accepts a single array\r\n * of values to exclude.\r\n *\r\n * @private\r\n * @param {Array} array The array to process.\r\n * @param {Array} [values] The array of values to exclude.\r\n * @returns {Array} Returns a new array of filtered values.\r\n */\r\n function baseDifference(array, values) {\r\n var index = -1,\r\n indexOf = getIndexOf(),\r\n length = array ? array.length : 0,\r\n isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n result = [];\r\n\r\n if (isLarge) {\r\n var cache = createCache(values);\r\n if (cache) {\r\n indexOf = cacheIndexOf;\r\n values = cache;\r\n } else {\r\n isLarge = false;\r\n }\r\n }\r\n while (++index < length) {\r\n var value = array[index];\r\n if (indexOf(values, value) < 0) {\r\n result.push(value);\r\n }\r\n }\r\n if (isLarge) {\r\n releaseObject(values);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.flatten` without support for callback\r\n * shorthands or `thisArg` binding.\r\n *\r\n * @private\r\n * @param {Array} array The array to flatten.\r\n * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n * @param {number} [fromIndex=0] The index to start from.\r\n * @returns {Array} Returns a new flattened array.\r\n */\r\n function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n var index = (fromIndex || 0) - 1,\r\n length = array ? array.length : 0,\r\n result = [];\r\n\r\n while (++index < length) {\r\n var value = array[index];\r\n\r\n if (value && typeof value == 'object' && typeof value.length == 'number'\r\n && (isArray(value) || isArguments(value))) {\r\n // recursively flatten arrays (susceptible to call stack limits)\r\n if (!isShallow) {\r\n value = baseFlatten(value, isShallow, isStrict);\r\n }\r\n var valIndex = -1,\r\n valLength = value.length,\r\n resIndex = result.length;\r\n\r\n result.length += valLength;\r\n while (++valIndex < valLength) {\r\n result[resIndex++] = value[valIndex];\r\n }\r\n } else if (!isStrict) {\r\n result.push(value);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n * that allows partial \"_.where\" style comparisons.\r\n *\r\n * @private\r\n * @param {*} a The value to compare.\r\n * @param {*} b The other value to compare.\r\n * @param {Function} [callback] The function to customize comparing values.\r\n * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n */\r\n function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n if (callback) {\r\n var result = callback(a, b);\r\n if (typeof result != 'undefined') {\r\n return !!result;\r\n }\r\n }\r\n // exit early for identical values\r\n if (a === b) {\r\n // treat `+0` vs. `-0` as not equal\r\n return a !== 0 || (1 / a == 1 / b);\r\n }\r\n var type = typeof a,\r\n otherType = typeof b;\r\n\r\n // exit early for unlike primitive values\r\n if (a === a &&\r\n !(a && objectTypes[type]) &&\r\n !(b && objectTypes[otherType])) {\r\n return false;\r\n }\r\n // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n // http://es5.github.io/#x15.3.4.4\r\n if (a == null || b == null) {\r\n return a === b;\r\n }\r\n // compare [[Class]] names\r\n var className = toString.call(a),\r\n otherClass = toString.call(b);\r\n\r\n if (className == argsClass) {\r\n className = objectClass;\r\n }\r\n if (otherClass == argsClass) {\r\n otherClass = objectClass;\r\n }\r\n if (className != otherClass) {\r\n return false;\r\n }\r\n switch (className) {\r\n case boolClass:\r\n case dateClass:\r\n // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n return +a == +b;\r\n\r\n case numberClass:\r\n // treat `NaN` vs. `NaN` as equal\r\n return (a != +a)\r\n ? b != +b\r\n // but treat `+0` vs. `-0` as not equal\r\n : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n case regexpClass:\r\n case stringClass:\r\n // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n // treat string primitives and their corresponding object instances as equal\r\n return a == String(b);\r\n }\r\n var isArr = className == arrayClass;\r\n if (!isArr) {\r\n // unwrap any `lodash` wrapped values\r\n var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n if (aWrapped || bWrapped) {\r\n return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n }\r\n // exit for functions and DOM nodes\r\n if (className != objectClass) {\r\n return false;\r\n }\r\n // in older versions of Opera, `arguments` objects have `Array` constructors\r\n var ctorA = a.constructor,\r\n ctorB = b.constructor;\r\n\r\n // non `Object` object instances with different constructors are not equal\r\n if (ctorA != ctorB &&\r\n !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n ('constructor' in a && 'constructor' in b)\r\n ) {\r\n return false;\r\n }\r\n }\r\n // assume cyclic structures are equal\r\n // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n var initedStack = !stackA;\r\n stackA || (stackA = getArray());\r\n stackB || (stackB = getArray());\r\n\r\n var length = stackA.length;\r\n while (length--) {\r\n if (stackA[length] == a) {\r\n return stackB[length] == b;\r\n }\r\n }\r\n var size = 0;\r\n result = true;\r\n\r\n // add `a` and `b` to the stack of traversed objects\r\n stackA.push(a);\r\n stackB.push(b);\r\n\r\n // recursively compare objects and arrays (susceptible to call stack limits)\r\n if (isArr) {\r\n // compare lengths to determine if a deep comparison is necessary\r\n length = a.length;\r\n size = b.length;\r\n result = size == length;\r\n\r\n if (result || isWhere) {\r\n // deep compare the contents, ignoring non-numeric properties\r\n while (size--) {\r\n var index = length,\r\n value = b[size];\r\n\r\n if (isWhere) {\r\n while (index--) {\r\n if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n break;\r\n }\r\n }\r\n } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n // which, in this case, is more costly\r\n forIn(b, function(value, key, b) {\r\n if (hasOwnProperty.call(b, key)) {\r\n // count the number of properties.\r\n size++;\r\n // deep compare each property value.\r\n return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n }\r\n });\r\n\r\n if (result && !isWhere) {\r\n // ensure both objects have the same number of properties\r\n forIn(a, function(value, key, a) {\r\n if (hasOwnProperty.call(a, key)) {\r\n // `size` will be `-1` if `a` has more properties than `b`\r\n return (result = --size > -1);\r\n }\r\n });\r\n }\r\n }\r\n stackA.pop();\r\n stackB.pop();\r\n\r\n if (initedStack) {\r\n releaseArray(stackA);\r\n releaseArray(stackB);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.merge` without argument juggling or support\r\n * for `thisArg` binding.\r\n *\r\n * @private\r\n * @param {Object} object The destination object.\r\n * @param {Object} source The source object.\r\n * @param {Function} [callback] The function to customize merging properties.\r\n * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n */\r\n function baseMerge(object, source, callback, stackA, stackB) {\r\n (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n var found,\r\n isArr,\r\n result = source,\r\n value = object[key];\r\n\r\n if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n // avoid merging previously merged cyclic sources\r\n var stackLength = stackA.length;\r\n while (stackLength--) {\r\n if ((found = stackA[stackLength] == source)) {\r\n value = stackB[stackLength];\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n var isShallow;\r\n if (callback) {\r\n result = callback(value, source);\r\n if ((isShallow = typeof result != 'undefined')) {\r\n value = result;\r\n }\r\n }\r\n if (!isShallow) {\r\n value = isArr\r\n ? (isArray(value) ? value : [])\r\n : (isPlainObject(value) ? value : {});\r\n }\r\n // add `source` and associated `value` to the stack of traversed objects\r\n stackA.push(source);\r\n stackB.push(value);\r\n\r\n // recursively merge objects and arrays (susceptible to call stack limits)\r\n if (!isShallow) {\r\n baseMerge(value, source, callback, stackA, stackB);\r\n }\r\n }\r\n }\r\n else {\r\n if (callback) {\r\n result = callback(value, source);\r\n if (typeof result == 'undefined') {\r\n result = source;\r\n }\r\n }\r\n if (typeof result != 'undefined') {\r\n value = result;\r\n }\r\n }\r\n object[key] = value;\r\n });\r\n }\r\n\r\n /**\r\n * The base implementation of `_.random` without argument juggling or support\r\n * for returning floating-point numbers.\r\n *\r\n * @private\r\n * @param {number} min The minimum possible value.\r\n * @param {number} max The maximum possible value.\r\n * @returns {number} Returns a random number.\r\n */\r\n function baseRandom(min, max) {\r\n return min + floor(nativeRandom() * (max - min + 1));\r\n }\r\n\r\n /**\r\n * The base implementation of `_.uniq` without support for callback shorthands\r\n * or `thisArg` binding.\r\n *\r\n * @private\r\n * @param {Array} array The array to process.\r\n * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n * @param {Function} [callback] The function called per iteration.\r\n * @returns {Array} Returns a duplicate-value-free array.\r\n */\r\n function baseUniq(array, isSorted, callback) {\r\n var index = -1,\r\n indexOf = getIndexOf(),\r\n length = array ? array.length : 0,\r\n result = [];\r\n\r\n var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n seen = (callback || isLarge) ? getArray() : result;\r\n\r\n if (isLarge) {\r\n var cache = createCache(seen);\r\n indexOf = cacheIndexOf;\r\n seen = cache;\r\n }\r\n while (++index < length) {\r\n var value = array[index],\r\n computed = callback ? callback(value, index, array) : value;\r\n\r\n if (isSorted\r\n ? !index || seen[seen.length - 1] !== computed\r\n : indexOf(seen, computed) < 0\r\n ) {\r\n if (callback || isLarge) {\r\n seen.push(computed);\r\n }\r\n result.push(value);\r\n }\r\n }\r\n if (isLarge) {\r\n releaseArray(seen.array);\r\n releaseObject(seen);\r\n } else if (callback) {\r\n releaseArray(seen);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a function that aggregates a collection, creating an object composed\r\n * of keys generated from the results of running each element of the collection\r\n * through a callback. The given `setter` function sets the keys and values\r\n * of the composed object.\r\n *\r\n * @private\r\n * @param {Function} setter The setter function.\r\n * @returns {Function} Returns the new aggregator function.\r\n */\r\n function createAggregator(setter) {\r\n return function(collection, callback, thisArg) {\r\n var result = {};\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n var index = -1,\r\n length = collection ? collection.length : 0;\r\n\r\n if (typeof length == 'number') {\r\n while (++index < length) {\r\n var value = collection[index];\r\n setter(result, value, callback(value, index, collection), collection);\r\n }\r\n } else {\r\n forOwn(collection, function(value, key, collection) {\r\n setter(result, value, callback(value, key, collection), collection);\r\n });\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that, when called, either curries or invokes `func`\r\n * with an optional `this` binding and partially applied arguments.\r\n *\r\n * @private\r\n * @param {Function|string} func The function or method name to reference.\r\n * @param {number} bitmask The bitmask of method flags to compose.\r\n * The bitmask may be composed of the following flags:\r\n * 1 - `_.bind`\r\n * 2 - `_.bindKey`\r\n * 4 - `_.curry`\r\n * 8 - `_.curry` (bound)\r\n * 16 - `_.partial`\r\n * 32 - `_.partialRight`\r\n * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n * provided to the new function.\r\n * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n * provided to the new function.\r\n * @param {*} [thisArg] The `this` binding of `func`.\r\n * @param {number} [arity] The arity of `func`.\r\n * @returns {Function} Returns the new function.\r\n */\r\n function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n var isBind = bitmask & 1,\r\n isBindKey = bitmask & 2,\r\n isCurry = bitmask & 4,\r\n isCurryBound = bitmask & 8,\r\n isPartial = bitmask & 16,\r\n isPartialRight = bitmask & 32;\r\n\r\n if (!isBindKey && !isFunction(func)) {\r\n throw new TypeError;\r\n }\r\n if (isPartial && !partialArgs.length) {\r\n bitmask &= ~16;\r\n isPartial = partialArgs = false;\r\n }\r\n if (isPartialRight && !partialRightArgs.length) {\r\n bitmask &= ~32;\r\n isPartialRight = partialRightArgs = false;\r\n }\r\n var bindData = func && func.__bindData__;\r\n if (bindData && bindData !== true) {\r\n // clone `bindData`\r\n bindData = slice(bindData);\r\n if (bindData[2]) {\r\n bindData[2] = slice(bindData[2]);\r\n }\r\n if (bindData[3]) {\r\n bindData[3] = slice(bindData[3]);\r\n }\r\n // set `thisBinding` is not previously bound\r\n if (isBind && !(bindData[1] & 1)) {\r\n bindData[4] = thisArg;\r\n }\r\n // set if previously bound but not currently (subsequent curried functions)\r\n if (!isBind && bindData[1] & 1) {\r\n bitmask |= 8;\r\n }\r\n // set curried arity if not yet set\r\n if (isCurry && !(bindData[1] & 4)) {\r\n bindData[5] = arity;\r\n }\r\n // append partial left arguments\r\n if (isPartial) {\r\n push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n }\r\n // append partial right arguments\r\n if (isPartialRight) {\r\n unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n }\r\n // merge flags\r\n bindData[1] |= bitmask;\r\n return createWrapper.apply(null, bindData);\r\n }\r\n // fast path for `_.bind`\r\n var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n }\r\n\r\n /**\r\n * Used by `escape` to convert characters to HTML entities.\r\n *\r\n * @private\r\n * @param {string} match The matched character to escape.\r\n * @returns {string} Returns the escaped character.\r\n */\r\n function escapeHtmlChar(match) {\r\n return htmlEscapes[match];\r\n }\r\n\r\n /**\r\n * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n * customized, this method returns the custom method, otherwise it returns\r\n * the `baseIndexOf` function.\r\n *\r\n * @private\r\n * @returns {Function} Returns the \"indexOf\" function.\r\n */\r\n function getIndexOf() {\r\n var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n return result;\r\n }\r\n\r\n /**\r\n * Checks if `value` is a native function.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n */\r\n function isNative(value) {\r\n return typeof value == 'function' && reNative.test(value);\r\n }\r\n\r\n /**\r\n * Sets `this` binding data on a given function.\r\n *\r\n * @private\r\n * @param {Function} func The function to set data on.\r\n * @param {Array} value The data array to set.\r\n */\r\n var setBindData = !defineProperty ? noop : function(func, value) {\r\n descriptor.value = value;\r\n defineProperty(func, '__bindData__', descriptor);\r\n };\r\n\r\n /**\r\n * A fallback implementation of `isPlainObject` which checks if a given value\r\n * is an object created by the `Object` constructor, assuming objects created\r\n * by the `Object` constructor have no inherited enumerable properties and that\r\n * there are no `Object.prototype` extensions.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n */\r\n function shimIsPlainObject(value) {\r\n var ctor,\r\n result;\r\n\r\n // avoid non Object objects, `arguments` objects, and DOM elements\r\n if (!(value && toString.call(value) == objectClass) ||\r\n (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n return false;\r\n }\r\n // In most environments an object's own properties are iterated before\r\n // its inherited properties. If the last iterated property is an object's\r\n // own property then there are no inherited enumerable properties.\r\n forIn(value, function(value, key) {\r\n result = key;\r\n });\r\n return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n }\r\n\r\n /**\r\n * Used by `unescape` to convert HTML entities to characters.\r\n *\r\n * @private\r\n * @param {string} match The matched character to unescape.\r\n * @returns {string} Returns the unescaped character.\r\n */\r\n function unescapeHtmlChar(match) {\r\n return htmlUnescapes[match];\r\n }\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Checks if `value` is an `arguments` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n * @example\r\n *\r\n * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n * // => true\r\n *\r\n * _.isArguments([1, 2, 3]);\r\n * // => false\r\n */\r\n function isArguments(value) {\r\n return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n toString.call(value) == argsClass || false;\r\n }\r\n\r\n /**\r\n * Checks if `value` is an array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @type Function\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n * @example\r\n *\r\n * (function() { return _.isArray(arguments); })();\r\n * // => false\r\n *\r\n * _.isArray([1, 2, 3]);\r\n * // => true\r\n */\r\n var isArray = nativeIsArray || function(value) {\r\n return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n toString.call(value) == arrayClass || false;\r\n };\r\n\r\n /**\r\n * A fallback implementation of `Object.keys` which produces an array of the\r\n * given object's own enumerable property names.\r\n *\r\n * @private\r\n * @type Function\r\n * @param {Object} object The object to inspect.\r\n * @returns {Array} Returns an array of property names.\r\n */\r\n var shimKeys = function(object) {\r\n var index, iterable = object, result = [];\r\n if (!iterable) return result;\r\n if (!(objectTypes[typeof object])) return result;\r\n for (index in iterable) {\r\n if (hasOwnProperty.call(iterable, index)) {\r\n result.push(index);\r\n }\r\n }\r\n return result\r\n };\r\n\r\n /**\r\n * Creates an array composed of the own enumerable property names of an object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The object to inspect.\r\n * @returns {Array} Returns an array of property names.\r\n * @example\r\n *\r\n * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n */\r\n var keys = !nativeKeys ? shimKeys : function(object) {\r\n if (!isObject(object)) {\r\n return [];\r\n }\r\n return nativeKeys(object);\r\n };\r\n\r\n /**\r\n * Used to convert characters to HTML entities:\r\n *\r\n * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n * don't require escaping in HTML and have no special meaning unless they're part\r\n * of a tag or an unquoted attribute value.\r\n * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n */\r\n var htmlEscapes = {\r\n '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#39;'\r\n };\r\n\r\n /** Used to convert HTML entities to characters */\r\n var htmlUnescapes = invert(htmlEscapes);\r\n\r\n /** Used to match HTML entities and HTML characters */\r\n var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Assigns own enumerable properties of source object(s) to the destination\r\n * object. Subsequent sources will overwrite property assignments of previous\r\n * sources. If a callback is provided it will be executed to produce the\r\n * assigned values. The callback is bound to `thisArg` and invoked with two\r\n * arguments; (objectValue, sourceValue).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @type Function\r\n * @alias extend\r\n * @category Objects\r\n * @param {Object} object The destination object.\r\n * @param {...Object} [source] The source objects.\r\n * @param {Function} [callback] The function to customize assigning values.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Object} Returns the destination object.\r\n * @example\r\n *\r\n * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n * // => { 'name': 'fred', 'employer': 'slate' }\r\n *\r\n * var defaults = _.partialRight(_.assign, function(a, b) {\r\n * return typeof a == 'undefined' ? b : a;\r\n * });\r\n *\r\n * var object = { 'name': 'barney' };\r\n * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n * // => { 'name': 'barney', 'employer': 'slate' }\r\n */\r\n var assign = function(object, source, guard) {\r\n var index, iterable = object, result = iterable;\r\n if (!iterable) return result;\r\n var args = arguments,\r\n argsIndex = 0,\r\n argsLength = typeof guard == 'number' ? 2 : args.length;\r\n if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n callback = args[--argsLength];\r\n }\r\n while (++argsIndex < argsLength) {\r\n iterable = args[argsIndex];\r\n if (iterable && objectTypes[typeof iterable]) {\r\n var ownIndex = -1,\r\n ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n length = ownProps ? ownProps.length : 0;\r\n\r\n while (++ownIndex < length) {\r\n index = ownProps[ownIndex];\r\n result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n }\r\n }\r\n }\r\n return result\r\n };\r\n\r\n /**\r\n * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n * be cloned, otherwise they will be assigned by reference. If a callback\r\n * is provided it will be executed to produce the cloned values. If the\r\n * callback returns `undefined` cloning will be handled by the method instead.\r\n * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to clone.\r\n * @param {boolean} [isDeep=false] Specify a deep clone.\r\n * @param {Function} [callback] The function to customize cloning values.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {*} Returns the cloned value.\r\n * @example\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36 },\r\n * { 'name': 'fred', 'age': 40 }\r\n * ];\r\n *\r\n * var shallow = _.clone(characters);\r\n * shallow[0] === characters[0];\r\n * // => true\r\n *\r\n * var deep = _.clone(characters, true);\r\n * deep[0] === characters[0];\r\n * // => false\r\n *\r\n * _.mixin({\r\n * 'clone': _.partialRight(_.clone, function(value) {\r\n * return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n * })\r\n * });\r\n *\r\n * var clone = _.clone(document.body);\r\n * clone.childNodes.length;\r\n * // => 0\r\n */\r\n function clone(value, isDeep, callback, thisArg) {\r\n // allows working with \"Collections\" methods without using their `index`\r\n // and `collection` arguments for `isDeep` and `callback`\r\n if (typeof isDeep != 'boolean' && isDeep != null) {\r\n thisArg = callback;\r\n callback = isDeep;\r\n isDeep = false;\r\n }\r\n return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n }\r\n\r\n /**\r\n * Creates a deep clone of `value`. If a callback is provided it will be\r\n * executed to produce the cloned values. If the callback returns `undefined`\r\n * cloning will be handled by the method instead. The callback is bound to\r\n * `thisArg` and invoked with one argument; (value).\r\n *\r\n * Note: This method is loosely based on the structured clone algorithm. Functions\r\n * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to deep clone.\r\n * @param {Function} [callback] The function to customize cloning values.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {*} Returns the deep cloned value.\r\n * @example\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36 },\r\n * { 'name': 'fred', 'age': 40 }\r\n * ];\r\n *\r\n * var deep = _.cloneDeep(characters);\r\n * deep[0] === characters[0];\r\n * // => false\r\n *\r\n * var view = {\r\n * 'label': 'docs',\r\n * 'node': element\r\n * };\r\n *\r\n * var clone = _.cloneDeep(view, function(value) {\r\n * return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n * });\r\n *\r\n * clone.node == view.node;\r\n * // => false\r\n */\r\n function cloneDeep(value, callback, thisArg) {\r\n return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n }\r\n\r\n /**\r\n * Creates an object that inherits from the given `prototype` object. If a\r\n * `properties` object is provided its own enumerable properties are assigned\r\n * to the created object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} prototype The object to inherit from.\r\n * @param {Object} [properties] The properties to assign to the object.\r\n * @returns {Object} Returns the new object.\r\n * @example\r\n *\r\n * function Shape() {\r\n * this.x = 0;\r\n * this.y = 0;\r\n * }\r\n *\r\n * function Circle() {\r\n * Shape.call(this);\r\n * }\r\n *\r\n * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n *\r\n * var circle = new Circle;\r\n * circle instanceof Circle;\r\n * // => true\r\n *\r\n * circle instanceof Shape;\r\n * // => true\r\n */\r\n function create(prototype, properties) {\r\n var result = baseCreate(prototype);\r\n return properties ? assign(result, properties) : result;\r\n }\r\n\r\n /**\r\n * Assigns own enumerable properties of source object(s) to the destination\r\n * object for all destination properties that resolve to `undefined`. Once a\r\n * property is set, additional defaults of the same property will be ignored.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @type Function\r\n * @category Objects\r\n * @param {Object} object The destination object.\r\n * @param {...Object} [source] The source objects.\r\n * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n * `key` and `object` arguments as sources.\r\n * @returns {Object} Returns the destination object.\r\n * @example\r\n *\r\n * var object = { 'name': 'barney' };\r\n * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n * // => { 'name': 'barney', 'employer': 'slate' }\r\n */\r\n var defaults = function(object, source, guard) {\r\n var index, iterable = object, result = iterable;\r\n if (!iterable) return result;\r\n var args = arguments,\r\n argsIndex = 0,\r\n argsLength = typeof guard == 'number' ? 2 : args.length;\r\n while (++argsIndex < argsLength) {\r\n iterable = args[argsIndex];\r\n if (iterable && objectTypes[typeof iterable]) {\r\n var ownIndex = -1,\r\n ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n length = ownProps ? ownProps.length : 0;\r\n\r\n while (++ownIndex < length) {\r\n index = ownProps[ownIndex];\r\n if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n }\r\n }\r\n }\r\n return result\r\n };\r\n\r\n /**\r\n * This method is like `_.findIndex` except that it returns the key of the\r\n * first element that passes the callback check, instead of the element itself.\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The object to search.\r\n * @param {Function|Object|string} [callback=identity] The function called per\r\n * iteration. If a property name or object is provided it will be used to\r\n * create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n * @example\r\n *\r\n * var characters = {\r\n * 'barney': { 'age': 36, 'blocked': false },\r\n * 'fred': { 'age': 40, 'blocked': true },\r\n * 'pebbles': { 'age': 1, 'blocked': false }\r\n * };\r\n *\r\n * _.findKey(characters, function(chr) {\r\n * return chr.age < 40;\r\n * });\r\n * // => 'barney' (property order is not guaranteed across environments)\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.findKey(characters, { 'age': 1 });\r\n * // => 'pebbles'\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.findKey(characters, 'blocked');\r\n * // => 'fred'\r\n */\r\n function findKey(object, callback, thisArg) {\r\n var result;\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n forOwn(object, function(value, key, object) {\r\n if (callback(value, key, object)) {\r\n result = key;\r\n return false;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * This method is like `_.findKey` except that it iterates over elements\r\n * of a `collection` in the opposite order.\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The object to search.\r\n * @param {Function|Object|string} [callback=identity] The function called per\r\n * iteration. If a property name or object is provided it will be used to\r\n * create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n * @example\r\n *\r\n * var characters = {\r\n * 'barney': { 'age': 36, 'blocked': true },\r\n * 'fred': { 'age': 40, 'blocked': false },\r\n * 'pebbles': { 'age': 1, 'blocked': true }\r\n * };\r\n *\r\n * _.findLastKey(characters, function(chr) {\r\n * return chr.age < 40;\r\n * });\r\n * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.findLastKey(characters, { 'age': 40 });\r\n * // => 'fred'\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.findLastKey(characters, 'blocked');\r\n * // => 'pebbles'\r\n */\r\n function findLastKey(object, callback, thisArg) {\r\n var result;\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n forOwnRight(object, function(value, key, object) {\r\n if (callback(value, key, object)) {\r\n result = key;\r\n return false;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Iterates over own and inherited enumerable properties of an object,\r\n * executing the callback for each property. The callback is bound to `thisArg`\r\n * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n * iteration early by explicitly returning `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @type Function\r\n * @category Objects\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} [callback=identity] The function called per iteration.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Object} Returns `object`.\r\n * @example\r\n *\r\n * function Shape() {\r\n * this.x = 0;\r\n * this.y = 0;\r\n * }\r\n *\r\n * Shape.prototype.move = function(x, y) {\r\n * this.x += x;\r\n * this.y += y;\r\n * };\r\n *\r\n * _.forIn(new Shape, function(value, key) {\r\n * console.log(key);\r\n * });\r\n * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n */\r\n var forIn = function(collection, callback, thisArg) {\r\n var index, iterable = collection, result = iterable;\r\n if (!iterable) return result;\r\n if (!objectTypes[typeof iterable]) return result;\r\n callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n for (index in iterable) {\r\n if (callback(iterable[index], index, collection) === false) return result;\r\n }\r\n return result\r\n };\r\n\r\n /**\r\n * This method is like `_.forIn` except that it iterates over elements\r\n * of a `collection` in the opposite order.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} [callback=identity] The function called per iteration.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Object} Returns `object`.\r\n * @example\r\n *\r\n * function Shape() {\r\n * this.x = 0;\r\n * this.y = 0;\r\n * }\r\n *\r\n * Shape.prototype.move = function(x, y) {\r\n * this.x += x;\r\n * this.y += y;\r\n * };\r\n *\r\n * _.forInRight(new Shape, function(value, key) {\r\n * console.log(key);\r\n * });\r\n * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n */\r\n function forInRight(object, callback, thisArg) {\r\n var pairs = [];\r\n\r\n forIn(object, function(value, key) {\r\n pairs.push(key, value);\r\n });\r\n\r\n var length = pairs.length;\r\n callback = baseCreateCallback(callback, thisArg, 3);\r\n while (length--) {\r\n if (callback(pairs[length--], pairs[length], object) === false) {\r\n break;\r\n }\r\n }\r\n return object;\r\n }\r\n\r\n /**\r\n * Iterates over own enumerable properties of an object, executing the callback\r\n * for each property. The callback is bound to `thisArg` and invoked with three\r\n * arguments; (value, key, object). Callbacks may exit iteration early by\r\n * explicitly returning `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @type Function\r\n * @category Objects\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} [callback=identity] The function called per iteration.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Object} Returns `object`.\r\n * @example\r\n *\r\n * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n * console.log(key);\r\n * });\r\n * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n */\r\n var forOwn = function(collection, callback, thisArg) {\r\n var index, iterable = collection, result = iterable;\r\n if (!iterable) return result;\r\n if (!objectTypes[typeof iterable]) return result;\r\n callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n var ownIndex = -1,\r\n ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n length = ownProps ? ownProps.length : 0;\r\n\r\n while (++ownIndex < length) {\r\n index = ownProps[ownIndex];\r\n if (callback(iterable[index], index, collection) === false) return result;\r\n }\r\n return result\r\n };\r\n\r\n /**\r\n * This method is like `_.forOwn` except that it iterates over elements\r\n * of a `collection` in the opposite order.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} [callback=identity] The function called per iteration.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Object} Returns `object`.\r\n * @example\r\n *\r\n * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n * console.log(key);\r\n * });\r\n * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n */\r\n function forOwnRight(object, callback, thisArg) {\r\n var props = keys(object),\r\n length = props.length;\r\n\r\n callback = baseCreateCallback(callback, thisArg, 3);\r\n while (length--) {\r\n var key = props[length];\r\n if (callback(object[key], key, object) === false) {\r\n break;\r\n }\r\n }\r\n return object;\r\n }\r\n\r\n /**\r\n * Creates a sorted array of property names of all enumerable properties,\r\n * own and inherited, of `object` that have function values.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias methods\r\n * @category Objects\r\n * @param {Object} object The object to inspect.\r\n * @returns {Array} Returns an array of property names that have function values.\r\n * @example\r\n *\r\n * _.functions(_);\r\n * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n */\r\n function functions(object) {\r\n var result = [];\r\n forIn(object, function(value, key) {\r\n if (isFunction(value)) {\r\n result.push(key);\r\n }\r\n });\r\n return result.sort();\r\n }\r\n\r\n /**\r\n * Checks if the specified property name exists as a direct property of `object`,\r\n * instead of an inherited property.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The object to inspect.\r\n * @param {string} key The name of the property to check.\r\n * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n * @example\r\n *\r\n * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n * // => true\r\n */\r\n function has(object, key) {\r\n return object ? hasOwnProperty.call(object, key) : false;\r\n }\r\n\r\n /**\r\n * Creates an object composed of the inverted keys and values of the given object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The object to invert.\r\n * @returns {Object} Returns the created inverted object.\r\n * @example\r\n *\r\n * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n * // => { 'fred': 'first', 'barney': 'second' }\r\n */\r\n function invert(object) {\r\n var index = -1,\r\n props = keys(object),\r\n length = props.length,\r\n result = {};\r\n\r\n while (++index < length) {\r\n var key = props[index];\r\n result[object[key]] = key;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Checks if `value` is a boolean value.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n * @example\r\n *\r\n * _.isBoolean(null);\r\n * // => false\r\n */\r\n function isBoolean(value) {\r\n return value === true || value === false ||\r\n value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n }\r\n\r\n /**\r\n * Checks if `value` is a date.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n * @example\r\n *\r\n * _.isDate(new Date);\r\n * // => true\r\n */\r\n function isDate(value) {\r\n return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n }\r\n\r\n /**\r\n * Checks if `value` is a DOM element.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n * @example\r\n *\r\n * _.isElement(document.body);\r\n * // => true\r\n */\r\n function isElement(value) {\r\n return value && value.nodeType === 1 || false;\r\n }\r\n\r\n /**\r\n * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n * length of `0` and objects with no own enumerable properties are considered\r\n * \"empty\".\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Array|Object|string} value The value to inspect.\r\n * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n * @example\r\n *\r\n * _.isEmpty([1, 2, 3]);\r\n * // => false\r\n *\r\n * _.isEmpty({});\r\n * // => true\r\n *\r\n * _.isEmpty('');\r\n * // => true\r\n */\r\n function isEmpty(value) {\r\n var result = true;\r\n if (!value) {\r\n return result;\r\n }\r\n var className = toString.call(value),\r\n length = value.length;\r\n\r\n if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n return !length;\r\n }\r\n forOwn(value, function() {\r\n return (result = false);\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Performs a deep comparison between two values to determine if they are\r\n * equivalent to each other. If a callback is provided it will be executed\r\n * to compare values. If the callback returns `undefined` comparisons will\r\n * be handled by the method instead. The callback is bound to `thisArg` and\r\n * invoked with two arguments; (a, b).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} a The value to compare.\r\n * @param {*} b The other value to compare.\r\n * @param {Function} [callback] The function to customize comparing values.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n * @example\r\n *\r\n * var object = { 'name': 'fred' };\r\n * var copy = { 'name': 'fred' };\r\n *\r\n * object == copy;\r\n * // => false\r\n *\r\n * _.isEqual(object, copy);\r\n * // => true\r\n *\r\n * var words = ['hello', 'goodbye'];\r\n * var otherWords = ['hi', 'goodbye'];\r\n *\r\n * _.isEqual(words, otherWords, function(a, b) {\r\n * var reGreet = /^(?:hello|hi)$/i,\r\n * aGreet = _.isString(a) && reGreet.test(a),\r\n * bGreet = _.isString(b) && reGreet.test(b);\r\n *\r\n * return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n * });\r\n * // => true\r\n */\r\n function isEqual(a, b, callback, thisArg) {\r\n return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n }\r\n\r\n /**\r\n * Checks if `value` is, or can be coerced to, a finite number.\r\n *\r\n * Note: This is not the same as native `isFinite` which will return true for\r\n * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n * @example\r\n *\r\n * _.isFinite(-101);\r\n * // => true\r\n *\r\n * _.isFinite('10');\r\n * // => true\r\n *\r\n * _.isFinite(true);\r\n * // => false\r\n *\r\n * _.isFinite('');\r\n * // => false\r\n *\r\n * _.isFinite(Infinity);\r\n * // => false\r\n */\r\n function isFinite(value) {\r\n return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n }\r\n\r\n /**\r\n * Checks if `value` is a function.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n * @example\r\n *\r\n * _.isFunction(_);\r\n * // => true\r\n */\r\n function isFunction(value) {\r\n return typeof value == 'function';\r\n }\r\n\r\n /**\r\n * Checks if `value` is the language type of Object.\r\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n * @example\r\n *\r\n * _.isObject({});\r\n * // => true\r\n *\r\n * _.isObject([1, 2, 3]);\r\n * // => true\r\n *\r\n * _.isObject(1);\r\n * // => false\r\n */\r\n function isObject(value) {\r\n // check if the value is the ECMAScript language type of Object\r\n // http://es5.github.io/#x8\r\n // and avoid a V8 bug\r\n // http://code.google.com/p/v8/issues/detail?id=2291\r\n return !!(value && objectTypes[typeof value]);\r\n }\r\n\r\n /**\r\n * Checks if `value` is `NaN`.\r\n *\r\n * Note: This is not the same as native `isNaN` which will return `true` for\r\n * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n * @example\r\n *\r\n * _.isNaN(NaN);\r\n * // => true\r\n *\r\n * _.isNaN(new Number(NaN));\r\n * // => true\r\n *\r\n * isNaN(undefined);\r\n * // => true\r\n *\r\n * _.isNaN(undefined);\r\n * // => false\r\n */\r\n function isNaN(value) {\r\n // `NaN` as a primitive is the only value that is not equal to itself\r\n // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n return isNumber(value) && value != +value;\r\n }\r\n\r\n /**\r\n * Checks if `value` is `null`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n * @example\r\n *\r\n * _.isNull(null);\r\n * // => true\r\n *\r\n * _.isNull(undefined);\r\n * // => false\r\n */\r\n function isNull(value) {\r\n return value === null;\r\n }\r\n\r\n /**\r\n * Checks if `value` is a number.\r\n *\r\n * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n * @example\r\n *\r\n * _.isNumber(8.4 * 5);\r\n * // => true\r\n */\r\n function isNumber(value) {\r\n return typeof value == 'number' ||\r\n value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n }\r\n\r\n /**\r\n * Checks if `value` is an object created by the `Object` constructor.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n * @example\r\n *\r\n * function Shape() {\r\n * this.x = 0;\r\n * this.y = 0;\r\n * }\r\n *\r\n * _.isPlainObject(new Shape);\r\n * // => false\r\n *\r\n * _.isPlainObject([1, 2, 3]);\r\n * // => false\r\n *\r\n * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n * // => true\r\n */\r\n var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n if (!(value && toString.call(value) == objectClass)) {\r\n return false;\r\n }\r\n var valueOf = value.valueOf,\r\n objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n return objProto\r\n ? (value == objProto || getPrototypeOf(value) == objProto)\r\n : shimIsPlainObject(value);\r\n };\r\n\r\n /**\r\n * Checks if `value` is a regular expression.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n * @example\r\n *\r\n * _.isRegExp(/fred/);\r\n * // => true\r\n */\r\n function isRegExp(value) {\r\n return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n }\r\n\r\n /**\r\n * Checks if `value` is a string.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n * @example\r\n *\r\n * _.isString('fred');\r\n * // => true\r\n */\r\n function isString(value) {\r\n return typeof value == 'string' ||\r\n value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n }\r\n\r\n /**\r\n * Checks if `value` is `undefined`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n * @example\r\n *\r\n * _.isUndefined(void 0);\r\n * // => true\r\n */\r\n function isUndefined(value) {\r\n return typeof value == 'undefined';\r\n }\r\n\r\n /**\r\n * Creates an object with the same keys as `object` and values generated by\r\n * running each own enumerable property of `object` through the callback.\r\n * The callback is bound to `thisArg` and invoked with three arguments;\r\n * (value, key, object).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n * @example\r\n *\r\n * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n *\r\n * var characters = {\r\n * 'fred': { 'name': 'fred', 'age': 40 },\r\n * 'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n * };\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.mapValues(characters, 'age');\r\n * // => { 'fred': 40, 'pebbles': 1 }\r\n */\r\n function mapValues(object, callback, thisArg) {\r\n var result = {};\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n forOwn(object, function(value, key, object) {\r\n result[key] = callback(value, key, object);\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Recursively merges own enumerable properties of the source object(s), that\r\n * don't resolve to `undefined` into the destination object. Subsequent sources\r\n * will overwrite property assignments of previous sources. If a callback is\r\n * provided it will be executed to produce the merged values of the destination\r\n * and source properties. If the callback returns `undefined` merging will\r\n * be handled by the method instead. The callback is bound to `thisArg` and\r\n * invoked with two arguments; (objectValue, sourceValue).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The destination object.\r\n * @param {...Object} [source] The source objects.\r\n * @param {Function} [callback] The function to customize merging properties.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Object} Returns the destination object.\r\n * @example\r\n *\r\n * var names = {\r\n * 'characters': [\r\n * { 'name': 'barney' },\r\n * { 'name': 'fred' }\r\n * ]\r\n * };\r\n *\r\n * var ages = {\r\n * 'characters': [\r\n * { 'age': 36 },\r\n * { 'age': 40 }\r\n * ]\r\n * };\r\n *\r\n * _.merge(names, ages);\r\n * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n *\r\n * var food = {\r\n * 'fruits': ['apple'],\r\n * 'vegetables': ['beet']\r\n * };\r\n *\r\n * var otherFood = {\r\n * 'fruits': ['banana'],\r\n * 'vegetables': ['carrot']\r\n * };\r\n *\r\n * _.merge(food, otherFood, function(a, b) {\r\n * return _.isArray(a) ? a.concat(b) : undefined;\r\n * });\r\n * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n */\r\n function merge(object) {\r\n var args = arguments,\r\n length = 2;\r\n\r\n if (!isObject(object)) {\r\n return object;\r\n }\r\n // allows working with `_.reduce` and `_.reduceRight` without using\r\n // their `index` and `collection` arguments\r\n if (typeof args[2] != 'number') {\r\n length = args.length;\r\n }\r\n if (length > 3 && typeof args[length - 2] == 'function') {\r\n var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n callback = args[--length];\r\n }\r\n var sources = slice(arguments, 1, length),\r\n index = -1,\r\n stackA = getArray(),\r\n stackB = getArray();\r\n\r\n while (++index < length) {\r\n baseMerge(object, sources[index], callback, stackA, stackB);\r\n }\r\n releaseArray(stackA);\r\n releaseArray(stackB);\r\n return object;\r\n }\r\n\r\n /**\r\n * Creates a shallow clone of `object` excluding the specified properties.\r\n * Property names may be specified as individual arguments or as arrays of\r\n * property names. If a callback is provided it will be executed for each\r\n * property of `object` omitting the properties the callback returns truey\r\n * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n * (value, key, object).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The source object.\r\n * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n * function called per iteration.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Object} Returns an object without the omitted properties.\r\n * @example\r\n *\r\n * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n * // => { 'name': 'fred' }\r\n *\r\n * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n * return typeof value == 'number';\r\n * });\r\n * // => { 'name': 'fred' }\r\n */\r\n function omit(object, callback, thisArg) {\r\n var result = {};\r\n if (typeof callback != 'function') {\r\n var props = [];\r\n forIn(object, function(value, key) {\r\n props.push(key);\r\n });\r\n props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n var index = -1,\r\n length = props.length;\r\n\r\n while (++index < length) {\r\n var key = props[index];\r\n result[key] = object[key];\r\n }\r\n } else {\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n forIn(object, function(value, key, object) {\r\n if (!callback(value, key, object)) {\r\n result[key] = value;\r\n }\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a two dimensional array of an object's key-value pairs,\r\n * i.e. `[[key1, value1], [key2, value2]]`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The object to inspect.\r\n * @returns {Array} Returns new array of key-value pairs.\r\n * @example\r\n *\r\n * _.pairs({ 'barney': 36, 'fred': 40 });\r\n * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n */\r\n function pairs(object) {\r\n var index = -1,\r\n props = keys(object),\r\n length = props.length,\r\n result = Array(length);\r\n\r\n while (++index < length) {\r\n var key = props[index];\r\n result[index] = [key, object[key]];\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a shallow clone of `object` composed of the specified properties.\r\n * Property names may be specified as individual arguments or as arrays of\r\n * property names. If a callback is provided it will be executed for each\r\n * property of `object` picking the properties the callback returns truey\r\n * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n * (value, key, object).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The source object.\r\n * @param {Function|...string|string[]} [callback] The function called per\r\n * iteration or property names to pick, specified as individual property\r\n * names or arrays of property names.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Object} Returns an object composed of the picked properties.\r\n * @example\r\n *\r\n * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n * // => { 'name': 'fred' }\r\n *\r\n * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n * return key.charAt(0) != '_';\r\n * });\r\n * // => { 'name': 'fred' }\r\n */\r\n function pick(object, callback, thisArg) {\r\n var result = {};\r\n if (typeof callback != 'function') {\r\n var index = -1,\r\n props = baseFlatten(arguments, true, false, 1),\r\n length = isObject(object) ? props.length : 0;\r\n\r\n while (++index < length) {\r\n var key = props[index];\r\n if (key in object) {\r\n result[key] = object[key];\r\n }\r\n }\r\n } else {\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n forIn(object, function(value, key, object) {\r\n if (callback(value, key, object)) {\r\n result[key] = value;\r\n }\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * An alternative to `_.reduce` this method transforms `object` to a new\r\n * `accumulator` object which is the result of running each of its own\r\n * enumerable properties through a callback, with each callback execution\r\n * potentially mutating the `accumulator` object. The callback is bound to\r\n * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n * Callbacks may exit iteration early by explicitly returning `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Array|Object} object The object to iterate over.\r\n * @param {Function} [callback=identity] The function called per iteration.\r\n * @param {*} [accumulator] The custom accumulator value.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {*} Returns the accumulated value.\r\n * @example\r\n *\r\n * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n * num *= num;\r\n * if (num % 2) {\r\n * return result.push(num) < 3;\r\n * }\r\n * });\r\n * // => [1, 9, 25]\r\n *\r\n * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n * result[key] = num * 3;\r\n * });\r\n * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n */\r\n function transform(object, callback, accumulator, thisArg) {\r\n var isArr = isArray(object);\r\n if (accumulator == null) {\r\n if (isArr) {\r\n accumulator = [];\r\n } else {\r\n var ctor = object && object.constructor,\r\n proto = ctor && ctor.prototype;\r\n\r\n accumulator = baseCreate(proto);\r\n }\r\n }\r\n if (callback) {\r\n callback = lodash.createCallback(callback, thisArg, 4);\r\n (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n return callback(accumulator, value, index, object);\r\n });\r\n }\r\n return accumulator;\r\n }\r\n\r\n /**\r\n * Creates an array composed of the own enumerable property values of `object`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {Object} object The object to inspect.\r\n * @returns {Array} Returns an array of property values.\r\n * @example\r\n *\r\n * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n */\r\n function values(object) {\r\n var index = -1,\r\n props = keys(object),\r\n length = props.length,\r\n result = Array(length);\r\n\r\n while (++index < length) {\r\n result[index] = object[props[index]];\r\n }\r\n return result;\r\n }\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates an array of elements from the specified indexes, or keys, of the\r\n * `collection`. Indexes may be specified as individual arguments or as arrays\r\n * of indexes.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n * to retrieve, specified as individual indexes or arrays of indexes.\r\n * @returns {Array} Returns a new array of elements corresponding to the\r\n * provided indexes.\r\n * @example\r\n *\r\n * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n * // => ['a', 'c', 'e']\r\n *\r\n * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n * // => ['fred', 'pebbles']\r\n */\r\n function at(collection) {\r\n var args = arguments,\r\n index = -1,\r\n props = baseFlatten(args, true, false, 1),\r\n length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n result = Array(length);\r\n\r\n while(++index < length) {\r\n result[index] = collection[props[index]];\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Checks if a given value is present in a collection using strict equality\r\n * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n * offset from the end of the collection.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias include\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {*} target The value to check for.\r\n * @param {number} [fromIndex=0] The index to search from.\r\n * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n * @example\r\n *\r\n * _.contains([1, 2, 3], 1);\r\n * // => true\r\n *\r\n * _.contains([1, 2, 3], 1, 2);\r\n * // => false\r\n *\r\n * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n * // => true\r\n *\r\n * _.contains('pebbles', 'eb');\r\n * // => true\r\n */\r\n function contains(collection, target, fromIndex) {\r\n var index = -1,\r\n indexOf = getIndexOf(),\r\n length = collection ? collection.length : 0,\r\n result = false;\r\n\r\n fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n if (isArray(collection)) {\r\n result = indexOf(collection, target, fromIndex) > -1;\r\n } else if (typeof length == 'number') {\r\n result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n } else {\r\n forOwn(collection, function(value) {\r\n if (++index >= fromIndex) {\r\n return !(result = value === target);\r\n }\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an object composed of keys generated from the results of running\r\n * each element of `collection` through the callback. The corresponding value\r\n * of each key is the number of times the key was returned by the callback.\r\n * The callback is bound to `thisArg` and invoked with three arguments;\r\n * (value, index|key, collection).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Object} Returns the composed aggregate object.\r\n * @example\r\n *\r\n * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n * // => { '4': 1, '6': 2 }\r\n *\r\n * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n * // => { '4': 1, '6': 2 }\r\n *\r\n * _.countBy(['one', 'two', 'three'], 'length');\r\n * // => { '3': 2, '5': 1 }\r\n */\r\n var countBy = createAggregator(function(result, value, key) {\r\n (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n });\r\n\r\n /**\r\n * Checks if the given callback returns truey value for **all** elements of\r\n * a collection. The callback is bound to `thisArg` and invoked with three\r\n * arguments; (value, index|key, collection).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias all\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n * else `false`.\r\n * @example\r\n *\r\n * _.every([true, 1, null, 'yes']);\r\n * // => false\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36 },\r\n * { 'name': 'fred', 'age': 40 }\r\n * ];\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.every(characters, 'age');\r\n * // => true\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.every(characters, { 'age': 36 });\r\n * // => false\r\n */\r\n function every(collection, callback, thisArg) {\r\n var result = true;\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n var index = -1,\r\n length = collection ? collection.length : 0;\r\n\r\n if (typeof length == 'number') {\r\n while (++index < length) {\r\n if (!(result = !!callback(collection[index], index, collection))) {\r\n break;\r\n }\r\n }\r\n } else {\r\n forOwn(collection, function(value, index, collection) {\r\n return (result = !!callback(value, index, collection));\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Iterates over elements of a collection, returning an array of all elements\r\n * the callback returns truey for. The callback is bound to `thisArg` and\r\n * invoked with three arguments; (value, index|key, collection).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias select\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array} Returns a new array of elements that passed the callback check.\r\n * @example\r\n *\r\n * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n * // => [2, 4, 6]\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36, 'blocked': false },\r\n * { 'name': 'fred', 'age': 40, 'blocked': true }\r\n * ];\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.filter(characters, 'blocked');\r\n * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.filter(characters, { 'age': 36 });\r\n * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n */\r\n function filter(collection, callback, thisArg) {\r\n var result = [];\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n var index = -1,\r\n length = collection ? collection.length : 0;\r\n\r\n if (typeof length == 'number') {\r\n while (++index < length) {\r\n var value = collection[index];\r\n if (callback(value, index, collection)) {\r\n result.push(value);\r\n }\r\n }\r\n } else {\r\n forOwn(collection, function(value, index, collection) {\r\n if (callback(value, index, collection)) {\r\n result.push(value);\r\n }\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Iterates over elements of a collection, returning the first element that\r\n * the callback returns truey for. The callback is bound to `thisArg` and\r\n * invoked with three arguments; (value, index|key, collection).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias detect, findWhere\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {*} Returns the found element, else `undefined`.\r\n * @example\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36, 'blocked': false },\r\n * { 'name': 'fred', 'age': 40, 'blocked': true },\r\n * { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n * ];\r\n *\r\n * _.find(characters, function(chr) {\r\n * return chr.age < 40;\r\n * });\r\n * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.find(characters, { 'age': 1 });\r\n * // => { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.find(characters, 'blocked');\r\n * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n */\r\n function find(collection, callback, thisArg) {\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n var index = -1,\r\n length = collection ? collection.length : 0;\r\n\r\n if (typeof length == 'number') {\r\n while (++index < length) {\r\n var value = collection[index];\r\n if (callback(value, index, collection)) {\r\n return value;\r\n }\r\n }\r\n } else {\r\n var result;\r\n forOwn(collection, function(value, index, collection) {\r\n if (callback(value, index, collection)) {\r\n result = value;\r\n return false;\r\n }\r\n });\r\n return result;\r\n }\r\n }\r\n\r\n /**\r\n * This method is like `_.find` except that it iterates over elements\r\n * of a `collection` from right to left.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {*} Returns the found element, else `undefined`.\r\n * @example\r\n *\r\n * _.findLast([1, 2, 3, 4], function(num) {\r\n * return num % 2 == 1;\r\n * });\r\n * // => 3\r\n */\r\n function findLast(collection, callback, thisArg) {\r\n var result;\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n forEachRight(collection, function(value, index, collection) {\r\n if (callback(value, index, collection)) {\r\n result = value;\r\n return false;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Iterates over elements of a collection, executing the callback for each\r\n * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n * (value, index|key, collection). Callbacks may exit iteration early by\r\n * explicitly returning `false`.\r\n *\r\n * Note: As with other \"Collections\" methods, objects with a `length` property\r\n * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n * may be used for object iteration.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias each\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function} [callback=identity] The function called per iteration.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array|Object|string} Returns `collection`.\r\n * @example\r\n *\r\n * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n * // => logs each number and returns '1,2,3'\r\n *\r\n * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n */\r\n function forEach(collection, callback, thisArg) {\r\n var index = -1,\r\n length = collection ? collection.length : 0;\r\n\r\n callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n if (typeof length == 'number') {\r\n while (++index < length) {\r\n if (callback(collection[index], index, collection) === false) {\r\n break;\r\n }\r\n }\r\n } else {\r\n forOwn(collection, callback);\r\n }\r\n return collection;\r\n }\r\n\r\n /**\r\n * This method is like `_.forEach` except that it iterates over elements\r\n * of a `collection` from right to left.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias eachRight\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function} [callback=identity] The function called per iteration.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array|Object|string} Returns `collection`.\r\n * @example\r\n *\r\n * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n * // => logs each number from right to left and returns '3,2,1'\r\n */\r\n function forEachRight(collection, callback, thisArg) {\r\n var length = collection ? collection.length : 0;\r\n callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n if (typeof length == 'number') {\r\n while (length--) {\r\n if (callback(collection[length], length, collection) === false) {\r\n break;\r\n }\r\n }\r\n } else {\r\n var props = keys(collection);\r\n length = props.length;\r\n forOwn(collection, function(value, key, collection) {\r\n key = props ? props[--length] : --length;\r\n return callback(collection[key], key, collection);\r\n });\r\n }\r\n return collection;\r\n }\r\n\r\n /**\r\n * Creates an object composed of keys generated from the results of running\r\n * each element of a collection through the callback. The corresponding value\r\n * of each key is an array of the elements responsible for generating the key.\r\n * The callback is bound to `thisArg` and invoked with three arguments;\r\n * (value, index|key, collection).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Object} Returns the composed aggregate object.\r\n * @example\r\n *\r\n * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n *\r\n * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.groupBy(['one', 'two', 'three'], 'length');\r\n * // => { '3': ['one', 'two'], '5': ['three'] }\r\n */\r\n var groupBy = createAggregator(function(result, value, key) {\r\n (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n });\r\n\r\n /**\r\n * Creates an object composed of keys generated from the results of running\r\n * each element of the collection through the given callback. The corresponding\r\n * value of each key is the last element responsible for generating the key.\r\n * The callback is bound to `thisArg` and invoked with three arguments;\r\n * (value, index|key, collection).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Object} Returns the composed aggregate object.\r\n * @example\r\n *\r\n * var keys = [\r\n * { 'dir': 'left', 'code': 97 },\r\n * { 'dir': 'right', 'code': 100 }\r\n * ];\r\n *\r\n * _.indexBy(keys, 'dir');\r\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n *\r\n * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n *\r\n * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n */\r\n var indexBy = createAggregator(function(result, value, key) {\r\n result[key] = value;\r\n });\r\n\r\n /**\r\n * Invokes the method named by `methodName` on each element in the `collection`\r\n * returning an array of the results of each invoked method. Additional arguments\r\n * will be provided to each invoked method. If `methodName` is a function it\r\n * will be invoked for, and `this` bound to, each element in the `collection`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|string} methodName The name of the method to invoke or\r\n * the function invoked per iteration.\r\n * @param {...*} [arg] Arguments to invoke the method with.\r\n * @returns {Array} Returns a new array of the results of each invoked method.\r\n * @example\r\n *\r\n * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n * // => [[1, 5, 7], [1, 2, 3]]\r\n *\r\n * _.invoke([123, 456], String.prototype.split, '');\r\n * // => [['1', '2', '3'], ['4', '5', '6']]\r\n */\r\n function invoke(collection, methodName) {\r\n var args = slice(arguments, 2),\r\n index = -1,\r\n isFunc = typeof methodName == 'function',\r\n length = collection ? collection.length : 0,\r\n result = Array(typeof length == 'number' ? length : 0);\r\n\r\n forEach(collection, function(value) {\r\n result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an array of values by running each element in the collection\r\n * through the callback. The callback is bound to `thisArg` and invoked with\r\n * three arguments; (value, index|key, collection).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias collect\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n * @example\r\n *\r\n * _.map([1, 2, 3], function(num) { return num * 3; });\r\n * // => [3, 6, 9]\r\n *\r\n * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36 },\r\n * { 'name': 'fred', 'age': 40 }\r\n * ];\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.map(characters, 'name');\r\n * // => ['barney', 'fred']\r\n */\r\n function map(collection, callback, thisArg) {\r\n var index = -1,\r\n length = collection ? collection.length : 0;\r\n\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n if (typeof length == 'number') {\r\n var result = Array(length);\r\n while (++index < length) {\r\n result[index] = callback(collection[index], index, collection);\r\n }\r\n } else {\r\n result = [];\r\n forOwn(collection, function(value, key, collection) {\r\n result[++index] = callback(value, key, collection);\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Retrieves the maximum value of a collection. If the collection is empty or\r\n * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n * for each value in the collection to generate the criterion by which the value\r\n * is ranked. The callback is bound to `thisArg` and invoked with three\r\n * arguments; (value, index, collection).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {*} Returns the maximum value.\r\n * @example\r\n *\r\n * _.max([4, 2, 8, 6]);\r\n * // => 8\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36 },\r\n * { 'name': 'fred', 'age': 40 }\r\n * ];\r\n *\r\n * _.max(characters, function(chr) { return chr.age; });\r\n * // => { 'name': 'fred', 'age': 40 };\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.max(characters, 'age');\r\n * // => { 'name': 'fred', 'age': 40 };\r\n */\r\n function max(collection, callback, thisArg) {\r\n var computed = -Infinity,\r\n result = computed;\r\n\r\n // allows working with functions like `_.map` without using\r\n // their `index` argument as a callback\r\n if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n callback = null;\r\n }\r\n if (callback == null && isArray(collection)) {\r\n var index = -1,\r\n length = collection.length;\r\n\r\n while (++index < length) {\r\n var value = collection[index];\r\n if (value > result) {\r\n result = value;\r\n }\r\n }\r\n } else {\r\n callback = (callback == null && isString(collection))\r\n ? charAtCallback\r\n : lodash.createCallback(callback, thisArg, 3);\r\n\r\n forEach(collection, function(value, index, collection) {\r\n var current = callback(value, index, collection);\r\n if (current > computed) {\r\n computed = current;\r\n result = value;\r\n }\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Retrieves the minimum value of a collection. If the collection is empty or\r\n * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n * for each value in the collection to generate the criterion by which the value\r\n * is ranked. The callback is bound to `thisArg` and invoked with three\r\n * arguments; (value, index, collection).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {*} Returns the minimum value.\r\n * @example\r\n *\r\n * _.min([4, 2, 8, 6]);\r\n * // => 2\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36 },\r\n * { 'name': 'fred', 'age': 40 }\r\n * ];\r\n *\r\n * _.min(characters, function(chr) { return chr.age; });\r\n * // => { 'name': 'barney', 'age': 36 };\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.min(characters, 'age');\r\n * // => { 'name': 'barney', 'age': 36 };\r\n */\r\n function min(collection, callback, thisArg) {\r\n var computed = Infinity,\r\n result = computed;\r\n\r\n // allows working with functions like `_.map` without using\r\n // their `index` argument as a callback\r\n if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n callback = null;\r\n }\r\n if (callback == null && isArray(collection)) {\r\n var index = -1,\r\n length = collection.length;\r\n\r\n while (++index < length) {\r\n var value = collection[index];\r\n if (value < result) {\r\n result = value;\r\n }\r\n }\r\n } else {\r\n callback = (callback == null && isString(collection))\r\n ? charAtCallback\r\n : lodash.createCallback(callback, thisArg, 3);\r\n\r\n forEach(collection, function(value, index, collection) {\r\n var current = callback(value, index, collection);\r\n if (current < computed) {\r\n computed = current;\r\n result = value;\r\n }\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Retrieves the value of a specified property from all elements in the collection.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @type Function\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {string} property The name of the property to pluck.\r\n * @returns {Array} Returns a new array of property values.\r\n * @example\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36 },\r\n * { 'name': 'fred', 'age': 40 }\r\n * ];\r\n *\r\n * _.pluck(characters, 'name');\r\n * // => ['barney', 'fred']\r\n */\r\n var pluck = map;\r\n\r\n /**\r\n * Reduces a collection to a value which is the accumulated result of running\r\n * each element in the collection through the callback, where each successive\r\n * callback execution consumes the return value of the previous execution. If\r\n * `accumulator` is not provided the first element of the collection will be\r\n * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias foldl, inject\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function} [callback=identity] The function called per iteration.\r\n * @param {*} [accumulator] Initial value of the accumulator.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {*} Returns the accumulated value.\r\n * @example\r\n *\r\n * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n * return sum + num;\r\n * });\r\n * // => 6\r\n *\r\n * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n * result[key] = num * 3;\r\n * return result;\r\n * }, {});\r\n * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n */\r\n function reduce(collection, callback, accumulator, thisArg) {\r\n if (!collection) return accumulator;\r\n var noaccum = arguments.length < 3;\r\n callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n var index = -1,\r\n length = collection.length;\r\n\r\n if (typeof length == 'number') {\r\n if (noaccum) {\r\n accumulator = collection[++index];\r\n }\r\n while (++index < length) {\r\n accumulator = callback(accumulator, collection[index], index, collection);\r\n }\r\n } else {\r\n forOwn(collection, function(value, index, collection) {\r\n accumulator = noaccum\r\n ? (noaccum = false, value)\r\n : callback(accumulator, value, index, collection)\r\n });\r\n }\r\n return accumulator;\r\n }\r\n\r\n /**\r\n * This method is like `_.reduce` except that it iterates over elements\r\n * of a `collection` from right to left.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias foldr\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function} [callback=identity] The function called per iteration.\r\n * @param {*} [accumulator] Initial value of the accumulator.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {*} Returns the accumulated value.\r\n * @example\r\n *\r\n * var list = [[0, 1], [2, 3], [4, 5]];\r\n * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n * // => [4, 5, 2, 3, 0, 1]\r\n */\r\n function reduceRight(collection, callback, accumulator, thisArg) {\r\n var noaccum = arguments.length < 3;\r\n callback = lodash.createCallback(callback, thisArg, 4);\r\n forEachRight(collection, function(value, index, collection) {\r\n accumulator = noaccum\r\n ? (noaccum = false, value)\r\n : callback(accumulator, value, index, collection);\r\n });\r\n return accumulator;\r\n }\r\n\r\n /**\r\n * The opposite of `_.filter` this method returns the elements of a\r\n * collection that the callback does **not** return truey for.\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array} Returns a new array of elements that failed the callback check.\r\n * @example\r\n *\r\n * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n * // => [1, 3, 5]\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36, 'blocked': false },\r\n * { 'name': 'fred', 'age': 40, 'blocked': true }\r\n * ];\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.reject(characters, 'blocked');\r\n * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.reject(characters, { 'age': 36 });\r\n * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n */\r\n function reject(collection, callback, thisArg) {\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n return filter(collection, function(value, index, collection) {\r\n return !callback(value, index, collection);\r\n });\r\n }\r\n\r\n /**\r\n * Retrieves a random element or `n` random elements from a collection.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to sample.\r\n * @param {number} [n] The number of elements to sample.\r\n * @param- {Object} [guard] Allows working with functions like `_.map`\r\n * without using their `index` arguments as `n`.\r\n * @returns {Array} Returns the random sample(s) of `collection`.\r\n * @example\r\n *\r\n * _.sample([1, 2, 3, 4]);\r\n * // => 2\r\n *\r\n * _.sample([1, 2, 3, 4], 2);\r\n * // => [3, 1]\r\n */\r\n function sample(collection, n, guard) {\r\n if (collection && typeof collection.length != 'number') {\r\n collection = values(collection);\r\n }\r\n if (n == null || guard) {\r\n return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n }\r\n var result = shuffle(collection);\r\n result.length = nativeMin(nativeMax(0, n), result.length);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to shuffle.\r\n * @returns {Array} Returns a new shuffled collection.\r\n * @example\r\n *\r\n * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n * // => [4, 1, 6, 3, 5, 2]\r\n */\r\n function shuffle(collection) {\r\n var index = -1,\r\n length = collection ? collection.length : 0,\r\n result = Array(typeof length == 'number' ? length : 0);\r\n\r\n forEach(collection, function(value) {\r\n var rand = baseRandom(0, ++index);\r\n result[index] = result[rand];\r\n result[rand] = value;\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the size of the `collection` by returning `collection.length` for arrays\r\n * and array-like objects or the number of own enumerable properties for objects.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to inspect.\r\n * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n * @example\r\n *\r\n * _.size([1, 2]);\r\n * // => 2\r\n *\r\n * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n * // => 3\r\n *\r\n * _.size('pebbles');\r\n * // => 7\r\n */\r\n function size(collection) {\r\n var length = collection ? collection.length : 0;\r\n return typeof length == 'number' ? length : keys(collection).length;\r\n }\r\n\r\n /**\r\n * Checks if the callback returns a truey value for **any** element of a\r\n * collection. The function returns as soon as it finds a passing value and\r\n * does not iterate over the entire collection. The callback is bound to\r\n * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias any\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {boolean} Returns `true` if any element passed the callback check,\r\n * else `false`.\r\n * @example\r\n *\r\n * _.some([null, 0, 'yes', false], Boolean);\r\n * // => true\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36, 'blocked': false },\r\n * { 'name': 'fred', 'age': 40, 'blocked': true }\r\n * ];\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.some(characters, 'blocked');\r\n * // => true\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.some(characters, { 'age': 1 });\r\n * // => false\r\n */\r\n function some(collection, callback, thisArg) {\r\n var result;\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n var index = -1,\r\n length = collection ? collection.length : 0;\r\n\r\n if (typeof length == 'number') {\r\n while (++index < length) {\r\n if ((result = callback(collection[index], index, collection))) {\r\n break;\r\n }\r\n }\r\n } else {\r\n forOwn(collection, function(value, index, collection) {\r\n return !(result = callback(value, index, collection));\r\n });\r\n }\r\n return !!result;\r\n }\r\n\r\n /**\r\n * Creates an array of elements, sorted in ascending order by the results of\r\n * running each element in a collection through the callback. This method\r\n * performs a stable sort, that is, it will preserve the original sort order\r\n * of equal elements. The callback is bound to `thisArg` and invoked with\r\n * three arguments; (value, index|key, collection).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an array of property names is provided for `callback` the collection\r\n * will be sorted by each property value.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Array|Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array} Returns a new array of sorted elements.\r\n * @example\r\n *\r\n * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n * // => [3, 1, 2]\r\n *\r\n * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n * // => [3, 1, 2]\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36 },\r\n * { 'name': 'fred', 'age': 40 },\r\n * { 'name': 'barney', 'age': 26 },\r\n * { 'name': 'fred', 'age': 30 }\r\n * ];\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.map(_.sortBy(characters, 'age'), _.values);\r\n * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n *\r\n * // sorting by multiple properties\r\n * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n */\r\n function sortBy(collection, callback, thisArg) {\r\n var index = -1,\r\n isArr = isArray(callback),\r\n length = collection ? collection.length : 0,\r\n result = Array(typeof length == 'number' ? length : 0);\r\n\r\n if (!isArr) {\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n }\r\n forEach(collection, function(value, key, collection) {\r\n var object = result[++index] = getObject();\r\n if (isArr) {\r\n object.criteria = map(callback, function(key) { return value[key]; });\r\n } else {\r\n (object.criteria = getArray())[0] = callback(value, key, collection);\r\n }\r\n object.index = index;\r\n object.value = value;\r\n });\r\n\r\n length = result.length;\r\n result.sort(compareAscending);\r\n while (length--) {\r\n var object = result[length];\r\n result[length] = object.value;\r\n if (!isArr) {\r\n releaseArray(object.criteria);\r\n }\r\n releaseObject(object);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Converts the `collection` to an array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to convert.\r\n * @returns {Array} Returns the new converted array.\r\n * @example\r\n *\r\n * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n * // => [2, 3, 4]\r\n */\r\n function toArray(collection) {\r\n if (collection && typeof collection.length == 'number') {\r\n return slice(collection);\r\n }\r\n return values(collection);\r\n }\r\n\r\n /**\r\n * Performs a deep comparison of each element in a `collection` to the given\r\n * `properties` object, returning an array of all elements that have equivalent\r\n * property values.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @type Function\r\n * @category Collections\r\n * @param {Array|Object|string} collection The collection to iterate over.\r\n * @param {Object} props The object of property values to filter by.\r\n * @returns {Array} Returns a new array of elements that have the given properties.\r\n * @example\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n * { 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }\r\n * ];\r\n *\r\n * _.where(characters, { 'age': 36 });\r\n * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n *\r\n * _.where(characters, { 'pets': ['dino'] });\r\n * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n */\r\n var where = filter;\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates an array with all falsey values removed. The values `false`, `null`,\r\n * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to compact.\r\n * @returns {Array} Returns a new array of filtered values.\r\n * @example\r\n *\r\n * _.compact([0, 1, false, 2, '', 3]);\r\n * // => [1, 2, 3]\r\n */\r\n function compact(array) {\r\n var index = -1,\r\n length = array ? array.length : 0,\r\n result = [];\r\n\r\n while (++index < length) {\r\n var value = array[index];\r\n if (value) {\r\n result.push(value);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an array excluding all values of the provided arrays using strict\r\n * equality for comparisons, i.e. `===`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to process.\r\n * @param {...Array} [values] The arrays of values to exclude.\r\n * @returns {Array} Returns a new array of filtered values.\r\n * @example\r\n *\r\n * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n * // => [1, 3, 4]\r\n */\r\n function difference(array) {\r\n return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n }\r\n\r\n /**\r\n * This method is like `_.find` except that it returns the index of the first\r\n * element that passes the callback check, instead of the element itself.\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to search.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {number} Returns the index of the found element, else `-1`.\r\n * @example\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36, 'blocked': false },\r\n * { 'name': 'fred', 'age': 40, 'blocked': true },\r\n * { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n * ];\r\n *\r\n * _.findIndex(characters, function(chr) {\r\n * return chr.age < 20;\r\n * });\r\n * // => 2\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.findIndex(characters, { 'age': 36 });\r\n * // => 0\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.findIndex(characters, 'blocked');\r\n * // => 1\r\n */\r\n function findIndex(array, callback, thisArg) {\r\n var index = -1,\r\n length = array ? array.length : 0;\r\n\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n while (++index < length) {\r\n if (callback(array[index], index, array)) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * This method is like `_.findIndex` except that it iterates over elements\r\n * of a `collection` from right to left.\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to search.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {number} Returns the index of the found element, else `-1`.\r\n * @example\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36, 'blocked': true },\r\n * { 'name': 'fred', 'age': 40, 'blocked': false },\r\n * { 'name': 'pebbles', 'age': 1, 'blocked': true }\r\n * ];\r\n *\r\n * _.findLastIndex(characters, function(chr) {\r\n * return chr.age > 30;\r\n * });\r\n * // => 1\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.findLastIndex(characters, { 'age': 36 });\r\n * // => 0\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.findLastIndex(characters, 'blocked');\r\n * // => 2\r\n */\r\n function findLastIndex(array, callback, thisArg) {\r\n var length = array ? array.length : 0;\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n while (length--) {\r\n if (callback(array[length], length, array)) {\r\n return length;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * Gets the first element or first `n` elements of an array. If a callback\r\n * is provided elements at the beginning of the array are returned as long\r\n * as the callback returns truey. The callback is bound to `thisArg` and\r\n * invoked with three arguments; (value, index, array).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias head, take\r\n * @category Arrays\r\n * @param {Array} array The array to query.\r\n * @param {Function|Object|number|string} [callback] The function called\r\n * per element or the number of elements to return. If a property name or\r\n * object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n * style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {*} Returns the first element(s) of `array`.\r\n * @example\r\n *\r\n * _.first([1, 2, 3]);\r\n * // => 1\r\n *\r\n * _.first([1, 2, 3], 2);\r\n * // => [1, 2]\r\n *\r\n * _.first([1, 2, 3], function(num) {\r\n * return num < 3;\r\n * });\r\n * // => [1, 2]\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'blocked': true, 'employer': 'slate' },\r\n * { 'name': 'fred', 'blocked': false, 'employer': 'slate' },\r\n * { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n * ];\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.first(characters, 'blocked');\r\n * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n * // => ['barney', 'fred']\r\n */\r\n function first(array, callback, thisArg) {\r\n var n = 0,\r\n length = array ? array.length : 0;\r\n\r\n if (typeof callback != 'number' && callback != null) {\r\n var index = -1;\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n while (++index < length && callback(array[index], index, array)) {\r\n n++;\r\n }\r\n } else {\r\n n = callback;\r\n if (n == null || thisArg) {\r\n return array ? array[0] : undefined;\r\n }\r\n }\r\n return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n }\r\n\r\n /**\r\n * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n * is truey, the array will only be flattened a single level. If a callback\r\n * is provided each element of the array is passed through the callback before\r\n * flattening. The callback is bound to `thisArg` and invoked with three\r\n * arguments; (value, index, array).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to flatten.\r\n * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array} Returns a new flattened array.\r\n * @example\r\n *\r\n * _.flatten([1, [2], [3, [[4]]]]);\r\n * // => [1, 2, 3, 4];\r\n *\r\n * _.flatten([1, [2], [3, [[4]]]], true);\r\n * // => [1, 2, 3, [[4]]];\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n * { 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }\r\n * ];\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.flatten(characters, 'pets');\r\n * // => ['hoppy', 'baby puss', 'dino']\r\n */\r\n function flatten(array, isShallow, callback, thisArg) {\r\n // juggle arguments\r\n if (typeof isShallow != 'boolean' && isShallow != null) {\r\n thisArg = callback;\r\n callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n isShallow = false;\r\n }\r\n if (callback != null) {\r\n array = map(array, callback, thisArg);\r\n }\r\n return baseFlatten(array, isShallow);\r\n }\r\n\r\n /**\r\n * Gets the index at which the first occurrence of `value` is found using\r\n * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n * providing `true` for `fromIndex` will run a faster binary search.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to search.\r\n * @param {*} value The value to search for.\r\n * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n * to perform a binary search on a sorted array.\r\n * @returns {number} Returns the index of the matched value or `-1`.\r\n * @example\r\n *\r\n * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n * // => 1\r\n *\r\n * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n * // => 4\r\n *\r\n * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n * // => 2\r\n */\r\n function indexOf(array, value, fromIndex) {\r\n if (typeof fromIndex == 'number') {\r\n var length = array ? array.length : 0;\r\n fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n } else if (fromIndex) {\r\n var index = sortedIndex(array, value);\r\n return array[index] === value ? index : -1;\r\n }\r\n return baseIndexOf(array, value, fromIndex);\r\n }\r\n\r\n /**\r\n * Gets all but the last element or last `n` elements of an array. If a\r\n * callback is provided elements at the end of the array are excluded from\r\n * the result as long as the callback returns truey. The callback is bound\r\n * to `thisArg` and invoked with three arguments; (value, index, array).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to query.\r\n * @param {Function|Object|number|string} [callback=1] The function called\r\n * per element or the number of elements to exclude. If a property name or\r\n * object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n * style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array} Returns a slice of `array`.\r\n * @example\r\n *\r\n * _.initial([1, 2, 3]);\r\n * // => [1, 2]\r\n *\r\n * _.initial([1, 2, 3], 2);\r\n * // => [1]\r\n *\r\n * _.initial([1, 2, 3], function(num) {\r\n * return num > 1;\r\n * });\r\n * // => [1]\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'blocked': false, 'employer': 'slate' },\r\n * { 'name': 'fred', 'blocked': true, 'employer': 'slate' },\r\n * { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n * ];\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.initial(characters, 'blocked');\r\n * // => [{ 'name': 'barney', 'blocked': false, 'employer': 'slate' }]\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n * // => ['barney', 'fred']\r\n */\r\n function initial(array, callback, thisArg) {\r\n var n = 0,\r\n length = array ? array.length : 0;\r\n\r\n if (typeof callback != 'number' && callback != null) {\r\n var index = length;\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n while (index-- && callback(array[index], index, array)) {\r\n n++;\r\n }\r\n } else {\r\n n = (callback == null || thisArg) ? 1 : callback || n;\r\n }\r\n return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n }\r\n\r\n /**\r\n * Creates an array of unique values present in all provided arrays using\r\n * strict equality for comparisons, i.e. `===`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {...Array} [array] The arrays to inspect.\r\n * @returns {Array} Returns an array of shared values.\r\n * @example\r\n *\r\n * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n * // => [1, 2]\r\n */\r\n function intersection() {\r\n var args = [],\r\n argsIndex = -1,\r\n argsLength = arguments.length,\r\n caches = getArray(),\r\n indexOf = getIndexOf(),\r\n trustIndexOf = indexOf === baseIndexOf,\r\n seen = getArray();\r\n\r\n while (++argsIndex < argsLength) {\r\n var value = arguments[argsIndex];\r\n if (isArray(value) || isArguments(value)) {\r\n args.push(value);\r\n caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n createCache(argsIndex ? args[argsIndex] : seen));\r\n }\r\n }\r\n var array = args[0],\r\n index = -1,\r\n length = array ? array.length : 0,\r\n result = [];\r\n\r\n outer:\r\n while (++index < length) {\r\n var cache = caches[0];\r\n value = array[index];\r\n\r\n if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n argsIndex = argsLength;\r\n (cache || seen).push(value);\r\n while (--argsIndex) {\r\n cache = caches[argsIndex];\r\n if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n continue outer;\r\n }\r\n }\r\n result.push(value);\r\n }\r\n }\r\n while (argsLength--) {\r\n cache = caches[argsLength];\r\n if (cache) {\r\n releaseObject(cache);\r\n }\r\n }\r\n releaseArray(caches);\r\n releaseArray(seen);\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets the last element or last `n` elements of an array. If a callback is\r\n * provided elements at the end of the array are returned as long as the\r\n * callback returns truey. The callback is bound to `thisArg` and invoked\r\n * with three arguments; (value, index, array).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to query.\r\n * @param {Function|Object|number|string} [callback] The function called\r\n * per element or the number of elements to return. If a property name or\r\n * object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n * style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {*} Returns the last element(s) of `array`.\r\n * @example\r\n *\r\n * _.last([1, 2, 3]);\r\n * // => 3\r\n *\r\n * _.last([1, 2, 3], 2);\r\n * // => [2, 3]\r\n *\r\n * _.last([1, 2, 3], function(num) {\r\n * return num > 1;\r\n * });\r\n * // => [2, 3]\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'blocked': false, 'employer': 'slate' },\r\n * { 'name': 'fred', 'blocked': true, 'employer': 'slate' },\r\n * { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n * ];\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.pluck(_.last(characters, 'blocked'), 'name');\r\n * // => ['fred', 'pebbles']\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.last(characters, { 'employer': 'na' });\r\n * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n */\r\n function last(array, callback, thisArg) {\r\n var n = 0,\r\n length = array ? array.length : 0;\r\n\r\n if (typeof callback != 'number' && callback != null) {\r\n var index = length;\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n while (index-- && callback(array[index], index, array)) {\r\n n++;\r\n }\r\n } else {\r\n n = callback;\r\n if (n == null || thisArg) {\r\n return array ? array[length - 1] : undefined;\r\n }\r\n }\r\n return slice(array, nativeMax(0, length - n));\r\n }\r\n\r\n /**\r\n * Gets the index at which the last occurrence of `value` is found using strict\r\n * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n * as the offset from the end of the collection.\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to search.\r\n * @param {*} value The value to search for.\r\n * @param {number} [fromIndex=array.length-1] The index to search from.\r\n * @returns {number} Returns the index of the matched value or `-1`.\r\n * @example\r\n *\r\n * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n * // => 4\r\n *\r\n * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n * // => 1\r\n */\r\n function lastIndexOf(array, value, fromIndex) {\r\n var index = array ? array.length : 0;\r\n if (typeof fromIndex == 'number') {\r\n index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n }\r\n while (index--) {\r\n if (array[index] === value) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * Removes all provided values from the given array using strict equality for\r\n * comparisons, i.e. `===`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to modify.\r\n * @param {...*} [value] The values to remove.\r\n * @returns {Array} Returns `array`.\r\n * @example\r\n *\r\n * var array = [1, 2, 3, 1, 2, 3];\r\n * _.pull(array, 2, 3);\r\n * console.log(array);\r\n * // => [1, 1]\r\n */\r\n function pull(array) {\r\n var args = arguments,\r\n argsIndex = 0,\r\n argsLength = args.length,\r\n length = array ? array.length : 0;\r\n\r\n while (++argsIndex < argsLength) {\r\n var index = -1,\r\n value = args[argsIndex];\r\n while (++index < length) {\r\n if (array[index] === value) {\r\n splice.call(array, index--, 1);\r\n length--;\r\n }\r\n }\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * Creates an array of numbers (positive and/or negative) progressing from\r\n * `start` up to but not including `end`. If `start` is less than `stop` a\r\n * zero-length range is created unless a negative `step` is specified.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {number} [start=0] The start of the range.\r\n * @param {number} end The end of the range.\r\n * @param {number} [step=1] The value to increment or decrement by.\r\n * @returns {Array} Returns a new range array.\r\n * @example\r\n *\r\n * _.range(4);\r\n * // => [0, 1, 2, 3]\r\n *\r\n * _.range(1, 5);\r\n * // => [1, 2, 3, 4]\r\n *\r\n * _.range(0, 20, 5);\r\n * // => [0, 5, 10, 15]\r\n *\r\n * _.range(0, -4, -1);\r\n * // => [0, -1, -2, -3]\r\n *\r\n * _.range(1, 4, 0);\r\n * // => [1, 1, 1]\r\n *\r\n * _.range(0);\r\n * // => []\r\n */\r\n function range(start, end, step) {\r\n start = +start || 0;\r\n step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n if (end == null) {\r\n end = start;\r\n start = 0;\r\n }\r\n // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n var index = -1,\r\n length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n result = Array(length);\r\n\r\n while (++index < length) {\r\n result[index] = start;\r\n start += step;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Removes all elements from an array that the callback returns truey for\r\n * and returns an array of removed elements. The callback is bound to `thisArg`\r\n * and invoked with three arguments; (value, index, array).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to modify.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array} Returns a new array of removed elements.\r\n * @example\r\n *\r\n * var array = [1, 2, 3, 4, 5, 6];\r\n * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n *\r\n * console.log(array);\r\n * // => [1, 3, 5]\r\n *\r\n * console.log(evens);\r\n * // => [2, 4, 6]\r\n */\r\n function remove(array, callback, thisArg) {\r\n var index = -1,\r\n length = array ? array.length : 0,\r\n result = [];\r\n\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n while (++index < length) {\r\n var value = array[index];\r\n if (callback(value, index, array)) {\r\n result.push(value);\r\n splice.call(array, index--, 1);\r\n length--;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The opposite of `_.initial` this method gets all but the first element or\r\n * first `n` elements of an array. If a callback function is provided elements\r\n * at the beginning of the array are excluded from the result as long as the\r\n * callback returns truey. The callback is bound to `thisArg` and invoked\r\n * with three arguments; (value, index, array).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias drop, tail\r\n * @category Arrays\r\n * @param {Array} array The array to query.\r\n * @param {Function|Object|number|string} [callback=1] The function called\r\n * per element or the number of elements to exclude. If a property name or\r\n * object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n * style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array} Returns a slice of `array`.\r\n * @example\r\n *\r\n * _.rest([1, 2, 3]);\r\n * // => [2, 3]\r\n *\r\n * _.rest([1, 2, 3], 2);\r\n * // => [3]\r\n *\r\n * _.rest([1, 2, 3], function(num) {\r\n * return num < 3;\r\n * });\r\n * // => [3]\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'blocked': true, 'employer': 'slate' },\r\n * { 'name': 'fred', 'blocked': false, 'employer': 'slate' },\r\n * { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n * ];\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n * // => ['fred', 'pebbles']\r\n *\r\n * // using \"_.where\" callback shorthand\r\n * _.rest(characters, { 'employer': 'slate' });\r\n * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n */\r\n function rest(array, callback, thisArg) {\r\n if (typeof callback != 'number' && callback != null) {\r\n var n = 0,\r\n index = -1,\r\n length = array ? array.length : 0;\r\n\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n while (++index < length && callback(array[index], index, array)) {\r\n n++;\r\n }\r\n } else {\r\n n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n }\r\n return slice(array, n);\r\n }\r\n\r\n /**\r\n * Uses a binary search to determine the smallest index at which a value\r\n * should be inserted into a given sorted array in order to maintain the sort\r\n * order of the array. If a callback is provided it will be executed for\r\n * `value` and each element of `array` to compute their sort ranking. The\r\n * callback is bound to `thisArg` and invoked with one argument; (value).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to inspect.\r\n * @param {*} value The value to evaluate.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {number} Returns the index at which `value` should be inserted\r\n * into `array`.\r\n * @example\r\n *\r\n * _.sortedIndex([20, 30, 50], 40);\r\n * // => 2\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n * // => 2\r\n *\r\n * var dict = {\r\n * 'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n * };\r\n *\r\n * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n * return dict.wordToNumber[word];\r\n * });\r\n * // => 2\r\n *\r\n * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n * return this.wordToNumber[word];\r\n * }, dict);\r\n * // => 2\r\n */\r\n function sortedIndex(array, value, callback, thisArg) {\r\n var low = 0,\r\n high = array ? array.length : low;\r\n\r\n // explicitly reference `identity` for better inlining in Firefox\r\n callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n value = callback(value);\r\n\r\n while (low < high) {\r\n var mid = (low + high) >>> 1;\r\n (callback(array[mid]) < value)\r\n ? low = mid + 1\r\n : high = mid;\r\n }\r\n return low;\r\n }\r\n\r\n /**\r\n * Creates an array of unique values, in order, of the provided arrays using\r\n * strict equality for comparisons, i.e. `===`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {...Array} [array] The arrays to inspect.\r\n * @returns {Array} Returns an array of combined values.\r\n * @example\r\n *\r\n * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n * // => [1, 2, 3, 5, 4]\r\n */\r\n function union() {\r\n return baseUniq(baseFlatten(arguments, true, true));\r\n }\r\n\r\n /**\r\n * Creates a duplicate-value-free version of an array using strict equality\r\n * for comparisons, i.e. `===`. If the array is sorted, providing\r\n * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n * each element of `array` is passed through the callback before uniqueness\r\n * is computed. The callback is bound to `thisArg` and invoked with three\r\n * arguments; (value, index, array).\r\n *\r\n * If a property name is provided for `callback` the created \"_.pluck\" style\r\n * callback will return the property value of the given element.\r\n *\r\n * If an object is provided for `callback` the created \"_.where\" style callback\r\n * will return `true` for elements that have the properties of the given object,\r\n * else `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias unique\r\n * @category Arrays\r\n * @param {Array} array The array to process.\r\n * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n * @param {Function|Object|string} [callback=identity] The function called\r\n * per iteration. If a property name or object is provided it will be used\r\n * to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array} Returns a duplicate-value-free array.\r\n * @example\r\n *\r\n * _.uniq([1, 2, 1, 3, 1]);\r\n * // => [1, 2, 3]\r\n *\r\n * _.uniq([1, 1, 2, 2, 3], true);\r\n * // => [1, 2, 3]\r\n *\r\n * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n * // => ['A', 'b', 'C']\r\n *\r\n * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n * // => [1, 2.5, 3]\r\n *\r\n * // using \"_.pluck\" callback shorthand\r\n * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n * // => [{ 'x': 1 }, { 'x': 2 }]\r\n */\r\n function uniq(array, isSorted, callback, thisArg) {\r\n // juggle arguments\r\n if (typeof isSorted != 'boolean' && isSorted != null) {\r\n thisArg = callback;\r\n callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n isSorted = false;\r\n }\r\n if (callback != null) {\r\n callback = lodash.createCallback(callback, thisArg, 3);\r\n }\r\n return baseUniq(array, isSorted, callback);\r\n }\r\n\r\n /**\r\n * Creates an array excluding all provided values using strict equality for\r\n * comparisons, i.e. `===`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array} array The array to filter.\r\n * @param {...*} [value] The values to exclude.\r\n * @returns {Array} Returns a new array of filtered values.\r\n * @example\r\n *\r\n * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n * // => [2, 3, 4]\r\n */\r\n function without(array) {\r\n return baseDifference(array, slice(arguments, 1));\r\n }\r\n\r\n /**\r\n * Creates an array that is the symmetric difference of the provided arrays.\r\n * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {...Array} [array] The arrays to inspect.\r\n * @returns {Array} Returns an array of values.\r\n * @example\r\n *\r\n * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n * // => [3, 5, 4]\r\n *\r\n * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n * // => [1, 4, 5]\r\n */\r\n function xor() {\r\n var index = -1,\r\n length = arguments.length;\r\n\r\n while (++index < length) {\r\n var array = arguments[index];\r\n if (isArray(array) || isArguments(array)) {\r\n var result = result\r\n ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n : array;\r\n }\r\n }\r\n return result || [];\r\n }\r\n\r\n /**\r\n * Creates an array of grouped elements, the first of which contains the first\r\n * elements of the given arrays, the second of which contains the second\r\n * elements of the given arrays, and so on.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias unzip\r\n * @category Arrays\r\n * @param {...Array} [array] Arrays to process.\r\n * @returns {Array} Returns a new array of grouped elements.\r\n * @example\r\n *\r\n * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n * // => [['fred', 30, true], ['barney', 40, false]]\r\n */\r\n function zip() {\r\n var array = arguments.length > 1 ? arguments : arguments[0],\r\n index = -1,\r\n length = array ? max(pluck(array, 'length')) : 0,\r\n result = Array(length < 0 ? 0 : length);\r\n\r\n while (++index < length) {\r\n result[index] = pluck(array, index);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an object composed from arrays of `keys` and `values`. Provide\r\n * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n * or two arrays, one of `keys` and one of corresponding `values`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @alias object\r\n * @category Arrays\r\n * @param {Array} keys The array of keys.\r\n * @param {Array} [values=[]] The array of values.\r\n * @returns {Object} Returns an object composed of the given keys and\r\n * corresponding values.\r\n * @example\r\n *\r\n * _.zipObject(['fred', 'barney'], [30, 40]);\r\n * // => { 'fred': 30, 'barney': 40 }\r\n */\r\n function zipObject(keys, values) {\r\n var index = -1,\r\n length = keys ? keys.length : 0,\r\n result = {};\r\n\r\n if (!values && length && !isArray(keys[0])) {\r\n values = [];\r\n }\r\n while (++index < length) {\r\n var key = keys[index];\r\n if (values) {\r\n result[key] = values[index];\r\n } else if (key) {\r\n result[key[0]] = key[1];\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates a function that executes `func`, with the `this` binding and\r\n * arguments of the created function, only after being called `n` times.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {number} n The number of times the function must be called before\r\n * `func` is executed.\r\n * @param {Function} func The function to restrict.\r\n * @returns {Function} Returns the new restricted function.\r\n * @example\r\n *\r\n * var saves = ['profile', 'settings'];\r\n *\r\n * var done = _.after(saves.length, function() {\r\n * console.log('Done saving!');\r\n * });\r\n *\r\n * _.forEach(saves, function(type) {\r\n * asyncSave({ 'type': type, 'complete': done });\r\n * });\r\n * // => logs 'Done saving!', after all saves have completed\r\n */\r\n function after(n, func) {\r\n if (!isFunction(func)) {\r\n throw new TypeError;\r\n }\r\n return function() {\r\n if (--n < 1) {\r\n return func.apply(this, arguments);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that, when called, invokes `func` with the `this`\r\n * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n * provided to the bound function.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {Function} func The function to bind.\r\n * @param {*} [thisArg] The `this` binding of `func`.\r\n * @param {...*} [arg] Arguments to be partially applied.\r\n * @returns {Function} Returns the new bound function.\r\n * @example\r\n *\r\n * var func = function(greeting) {\r\n * return greeting + ' ' + this.name;\r\n * };\r\n *\r\n * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n * func();\r\n * // => 'hi fred'\r\n */\r\n function bind(func, thisArg) {\r\n return arguments.length > 2\r\n ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n : createWrapper(func, 1, null, null, thisArg);\r\n }\r\n\r\n /**\r\n * Binds methods of an object to the object itself, overwriting the existing\r\n * method. Method names may be specified as individual arguments or as arrays\r\n * of method names. If no method names are provided all the function properties\r\n * of `object` will be bound.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {Object} object The object to bind and assign the bound methods to.\r\n * @param {...string} [methodName] The object method names to\r\n * bind, specified as individual method names or arrays of method names.\r\n * @returns {Object} Returns `object`.\r\n * @example\r\n *\r\n * var view = {\r\n * 'label': 'docs',\r\n * 'onClick': function() { console.log('clicked ' + this.label); }\r\n * };\r\n *\r\n * _.bindAll(view);\r\n * jQuery('#docs').on('click', view.onClick);\r\n * // => logs 'clicked docs', when the button is clicked\r\n */\r\n function bindAll(object) {\r\n var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n index = -1,\r\n length = funcs.length;\r\n\r\n while (++index < length) {\r\n var key = funcs[index];\r\n object[key] = createWrapper(object[key], 1, null, null, object);\r\n }\r\n return object;\r\n }\r\n\r\n /**\r\n * Creates a function that, when called, invokes the method at `object[key]`\r\n * and prepends any additional `bindKey` arguments to those provided to the bound\r\n * function. This method differs from `_.bind` by allowing bound functions to\r\n * reference methods that will be redefined or don't yet exist.\r\n * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {Object} object The object the method belongs to.\r\n * @param {string} key The key of the method.\r\n * @param {...*} [arg] Arguments to be partially applied.\r\n * @returns {Function} Returns the new bound function.\r\n * @example\r\n *\r\n * var object = {\r\n * 'name': 'fred',\r\n * 'greet': function(greeting) {\r\n * return greeting + ' ' + this.name;\r\n * }\r\n * };\r\n *\r\n * var func = _.bindKey(object, 'greet', 'hi');\r\n * func();\r\n * // => 'hi fred'\r\n *\r\n * object.greet = function(greeting) {\r\n * return greeting + 'ya ' + this.name + '!';\r\n * };\r\n *\r\n * func();\r\n * // => 'hiya fred!'\r\n */\r\n function bindKey(object, key) {\r\n return arguments.length > 2\r\n ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n : createWrapper(key, 3, null, null, object);\r\n }\r\n\r\n /**\r\n * Creates a function that is the composition of the provided functions,\r\n * where each function consumes the return value of the function that follows.\r\n * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n * Each function is executed with the `this` binding of the composed function.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {...Function} [func] Functions to compose.\r\n * @returns {Function} Returns the new composed function.\r\n * @example\r\n *\r\n * var realNameMap = {\r\n * 'pebbles': 'penelope'\r\n * };\r\n *\r\n * var format = function(name) {\r\n * name = realNameMap[name.toLowerCase()] || name;\r\n * return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n * };\r\n *\r\n * var greet = function(formatted) {\r\n * return 'Hiya ' + formatted + '!';\r\n * };\r\n *\r\n * var welcome = _.compose(greet, format);\r\n * welcome('pebbles');\r\n * // => 'Hiya Penelope!'\r\n */\r\n function compose() {\r\n var funcs = arguments,\r\n length = funcs.length;\r\n\r\n while (length--) {\r\n if (!isFunction(funcs[length])) {\r\n throw new TypeError;\r\n }\r\n }\r\n return function() {\r\n var args = arguments,\r\n length = funcs.length;\r\n\r\n while (length--) {\r\n args = [funcs[length].apply(this, args)];\r\n }\r\n return args[0];\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function which accepts one or more arguments of `func` that when\r\n * invoked either executes `func` returning its result, if all `func` arguments\r\n * have been provided, or returns a function that accepts one or more of the\r\n * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n * if `func.length` is not sufficient.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {Function} func The function to curry.\r\n * @param {number} [arity=func.length] The arity of `func`.\r\n * @returns {Function} Returns the new curried function.\r\n * @example\r\n *\r\n * var curried = _.curry(function(a, b, c) {\r\n * console.log(a + b + c);\r\n * });\r\n *\r\n * curried(1)(2)(3);\r\n * // => 6\r\n *\r\n * curried(1, 2)(3);\r\n * // => 6\r\n *\r\n * curried(1, 2, 3);\r\n * // => 6\r\n */\r\n function curry(func, arity) {\r\n arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n return createWrapper(func, 4, null, null, null, arity);\r\n }\r\n\r\n /**\r\n * Creates a function that will delay the execution of `func` until after\r\n * `wait` milliseconds have elapsed since the last time it was invoked.\r\n * Provide an options object to indicate that `func` should be invoked on\r\n * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n * to the debounced function will return the result of the last `func` call.\r\n *\r\n * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n * on the trailing edge of the timeout only if the the debounced function is\r\n * invoked more than once during the `wait` timeout.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {Function} func The function to debounce.\r\n * @param {number} wait The number of milliseconds to delay.\r\n * @param {Object} [options] The options object.\r\n * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n * @returns {Function} Returns the new debounced function.\r\n * @example\r\n *\r\n * // avoid costly calculations while the window size is in flux\r\n * var lazyLayout = _.debounce(calculateLayout, 150);\r\n * jQuery(window).on('resize', lazyLayout);\r\n *\r\n * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n * 'leading': true,\r\n * 'trailing': false\r\n * });\r\n *\r\n * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n * var source = new EventSource('/stream');\r\n * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n * 'maxWait': 1000\r\n * }, false);\r\n */\r\n function debounce(func, wait, options) {\r\n var args,\r\n maxTimeoutId,\r\n result,\r\n stamp,\r\n thisArg,\r\n timeoutId,\r\n trailingCall,\r\n lastCalled = 0,\r\n maxWait = false,\r\n trailing = true;\r\n\r\n if (!isFunction(func)) {\r\n throw new TypeError;\r\n }\r\n wait = nativeMax(0, wait) || 0;\r\n if (options === true) {\r\n var leading = true;\r\n trailing = false;\r\n } else if (isObject(options)) {\r\n leading = options.leading;\r\n maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n trailing = 'trailing' in options ? options.trailing : trailing;\r\n }\r\n var delayed = function() {\r\n var remaining = wait - (now() - stamp);\r\n if (remaining <= 0) {\r\n if (maxTimeoutId) {\r\n clearTimeout(maxTimeoutId);\r\n }\r\n var isCalled = trailingCall;\r\n maxTimeoutId = timeoutId = trailingCall = undefined;\r\n if (isCalled) {\r\n lastCalled = now();\r\n result = func.apply(thisArg, args);\r\n if (!timeoutId && !maxTimeoutId) {\r\n args = thisArg = null;\r\n }\r\n }\r\n } else {\r\n timeoutId = setTimeout(delayed, remaining);\r\n }\r\n };\r\n\r\n var maxDelayed = function() {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n maxTimeoutId = timeoutId = trailingCall = undefined;\r\n if (trailing || (maxWait !== wait)) {\r\n lastCalled = now();\r\n result = func.apply(thisArg, args);\r\n if (!timeoutId && !maxTimeoutId) {\r\n args = thisArg = null;\r\n }\r\n }\r\n };\r\n\r\n return function() {\r\n args = arguments;\r\n stamp = now();\r\n thisArg = this;\r\n trailingCall = trailing && (timeoutId || !leading);\r\n\r\n if (maxWait === false) {\r\n var leadingCall = leading && !timeoutId;\r\n } else {\r\n if (!maxTimeoutId && !leading) {\r\n lastCalled = stamp;\r\n }\r\n var remaining = maxWait - (stamp - lastCalled),\r\n isCalled = remaining <= 0;\r\n\r\n if (isCalled) {\r\n if (maxTimeoutId) {\r\n maxTimeoutId = clearTimeout(maxTimeoutId);\r\n }\r\n lastCalled = stamp;\r\n result = func.apply(thisArg, args);\r\n }\r\n else if (!maxTimeoutId) {\r\n maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n }\r\n }\r\n if (isCalled && timeoutId) {\r\n timeoutId = clearTimeout(timeoutId);\r\n }\r\n else if (!timeoutId && wait !== maxWait) {\r\n timeoutId = setTimeout(delayed, wait);\r\n }\r\n if (leadingCall) {\r\n isCalled = true;\r\n result = func.apply(thisArg, args);\r\n }\r\n if (isCalled && !timeoutId && !maxTimeoutId) {\r\n args = thisArg = null;\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n /**\r\n * Defers executing the `func` function until the current call stack has cleared.\r\n * Additional arguments will be provided to `func` when it is invoked.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {Function} func The function to defer.\r\n * @param {...*} [arg] Arguments to invoke the function with.\r\n * @returns {number} Returns the timer id.\r\n * @example\r\n *\r\n * _.defer(function(text) { console.log(text); }, 'deferred');\r\n * // logs 'deferred' after one or more milliseconds\r\n */\r\n function defer(func) {\r\n if (!isFunction(func)) {\r\n throw new TypeError;\r\n }\r\n var args = slice(arguments, 1);\r\n return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n }\r\n\r\n /**\r\n * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n * will be provided to `func` when it is invoked.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {Function} func The function to delay.\r\n * @param {number} wait The number of milliseconds to delay execution.\r\n * @param {...*} [arg] Arguments to invoke the function with.\r\n * @returns {number} Returns the timer id.\r\n * @example\r\n *\r\n * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n * // => logs 'later' after one second\r\n */\r\n function delay(func, wait) {\r\n if (!isFunction(func)) {\r\n throw new TypeError;\r\n }\r\n var args = slice(arguments, 2);\r\n return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n }\r\n\r\n /**\r\n * Creates a function that memoizes the result of `func`. If `resolver` is\r\n * provided it will be used to determine the cache key for storing the result\r\n * based on the arguments provided to the memoized function. By default, the\r\n * first argument provided to the memoized function is used as the cache key.\r\n * The `func` is executed with the `this` binding of the memoized function.\r\n * The result cache is exposed as the `cache` property on the memoized function.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {Function} func The function to have its output memoized.\r\n * @param {Function} [resolver] A function used to resolve the cache key.\r\n * @returns {Function} Returns the new memoizing function.\r\n * @example\r\n *\r\n * var fibonacci = _.memoize(function(n) {\r\n * return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n * });\r\n *\r\n * fibonacci(9)\r\n * // => 34\r\n *\r\n * var data = {\r\n * 'fred': { 'name': 'fred', 'age': 40 },\r\n * 'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n * };\r\n *\r\n * // modifying the result cache\r\n * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n * get('pebbles');\r\n * // => { 'name': 'pebbles', 'age': 1 }\r\n *\r\n * get.cache.pebbles.name = 'penelope';\r\n * get('pebbles');\r\n * // => { 'name': 'penelope', 'age': 1 }\r\n */\r\n function memoize(func, resolver) {\r\n if (!isFunction(func)) {\r\n throw new TypeError;\r\n }\r\n var memoized = function() {\r\n var cache = memoized.cache,\r\n key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n return hasOwnProperty.call(cache, key)\r\n ? cache[key]\r\n : (cache[key] = func.apply(this, arguments));\r\n }\r\n memoized.cache = {};\r\n return memoized;\r\n }\r\n\r\n /**\r\n * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n * the function will return the value of the first call. The `func` is executed\r\n * with the `this` binding of the created function.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {Function} func The function to restrict.\r\n * @returns {Function} Returns the new restricted function.\r\n * @example\r\n *\r\n * var initialize = _.once(createApplication);\r\n * initialize();\r\n * initialize();\r\n * // `initialize` executes `createApplication` once\r\n */\r\n function once(func) {\r\n var ran,\r\n result;\r\n\r\n if (!isFunction(func)) {\r\n throw new TypeError;\r\n }\r\n return function() {\r\n if (ran) {\r\n return result;\r\n }\r\n ran = true;\r\n result = func.apply(this, arguments);\r\n\r\n // clear the `func` variable so the function may be garbage collected\r\n func = null;\r\n return result;\r\n };\r\n }\r\n\r\n /**\r\n * Creates a function that, when called, invokes `func` with any additional\r\n * `partial` arguments prepended to those provided to the new function. This\r\n * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {Function} func The function to partially apply arguments to.\r\n * @param {...*} [arg] Arguments to be partially applied.\r\n * @returns {Function} Returns the new partially applied function.\r\n * @example\r\n *\r\n * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n * var hi = _.partial(greet, 'hi');\r\n * hi('fred');\r\n * // => 'hi fred'\r\n */\r\n function partial(func) {\r\n return createWrapper(func, 16, slice(arguments, 1));\r\n }\r\n\r\n /**\r\n * This method is like `_.partial` except that `partial` arguments are\r\n * appended to those provided to the new function.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {Function} func The function to partially apply arguments to.\r\n * @param {...*} [arg] Arguments to be partially applied.\r\n * @returns {Function} Returns the new partially applied function.\r\n * @example\r\n *\r\n * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n *\r\n * var options = {\r\n * 'variable': 'data',\r\n * 'imports': { 'jq': $ }\r\n * };\r\n *\r\n * defaultsDeep(options, _.templateSettings);\r\n *\r\n * options.variable\r\n * // => 'data'\r\n *\r\n * options.imports\r\n * // => { '_': _, 'jq': $ }\r\n */\r\n function partialRight(func) {\r\n return createWrapper(func, 32, null, slice(arguments, 1));\r\n }\r\n\r\n /**\r\n * Creates a function that, when executed, will only call the `func` function\r\n * at most once per every `wait` milliseconds. Provide an options object to\r\n * indicate that `func` should be invoked on the leading and/or trailing edge\r\n * of the `wait` timeout. Subsequent calls to the throttled function will\r\n * return the result of the last `func` call.\r\n *\r\n * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n * on the trailing edge of the timeout only if the the throttled function is\r\n * invoked more than once during the `wait` timeout.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {Function} func The function to throttle.\r\n * @param {number} wait The number of milliseconds to throttle executions to.\r\n * @param {Object} [options] The options object.\r\n * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n * @returns {Function} Returns the new throttled function.\r\n * @example\r\n *\r\n * // avoid excessively updating the position while scrolling\r\n * var throttled = _.throttle(updatePosition, 100);\r\n * jQuery(window).on('scroll', throttled);\r\n *\r\n * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n * 'trailing': false\r\n * }));\r\n */\r\n function throttle(func, wait, options) {\r\n var leading = true,\r\n trailing = true;\r\n\r\n if (!isFunction(func)) {\r\n throw new TypeError;\r\n }\r\n if (options === false) {\r\n leading = false;\r\n } else if (isObject(options)) {\r\n leading = 'leading' in options ? options.leading : leading;\r\n trailing = 'trailing' in options ? options.trailing : trailing;\r\n }\r\n debounceOptions.leading = leading;\r\n debounceOptions.maxWait = wait;\r\n debounceOptions.trailing = trailing;\r\n\r\n return debounce(func, wait, debounceOptions);\r\n }\r\n\r\n /**\r\n * Creates a function that provides `value` to the wrapper function as its\r\n * first argument. Additional arguments provided to the function are appended\r\n * to those provided to the wrapper function. The wrapper is executed with\r\n * the `this` binding of the created function.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Functions\r\n * @param {*} value The value to wrap.\r\n * @param {Function} wrapper The wrapper function.\r\n * @returns {Function} Returns the new function.\r\n * @example\r\n *\r\n * var p = _.wrap(_.escape, function(func, text) {\r\n * return '<p>' + func(text) + '</p>';\r\n * });\r\n *\r\n * p('Fred, Wilma, & Pebbles');\r\n * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n */\r\n function wrap(value, wrapper) {\r\n return createWrapper(wrapper, 16, [value]);\r\n }\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates a function that returns `value`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {*} value The value to return from the new function.\r\n * @returns {Function} Returns the new function.\r\n * @example\r\n *\r\n * var object = { 'name': 'fred' };\r\n * var getter = _.constant(object);\r\n * getter() === object;\r\n * // => true\r\n */\r\n function constant(value) {\r\n return function() {\r\n return value;\r\n };\r\n }\r\n\r\n /**\r\n * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n * name the created callback will return the property value for a given element.\r\n * If `func` is an object the created callback will return `true` for elements\r\n * that contain the equivalent object properties, otherwise it will return `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {*} [func=identity] The value to convert to a callback.\r\n * @param {*} [thisArg] The `this` binding of the created callback.\r\n * @param {number} [argCount] The number of arguments the callback accepts.\r\n * @returns {Function} Returns a callback function.\r\n * @example\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36 },\r\n * { 'name': 'fred', 'age': 40 }\r\n * ];\r\n *\r\n * // wrap to create custom callback shorthands\r\n * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n * var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n * return !match ? func(callback, thisArg) : function(object) {\r\n * return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n * };\r\n * });\r\n *\r\n * _.filter(characters, 'age__gt38');\r\n * // => [{ 'name': 'fred', 'age': 40 }]\r\n */\r\n function createCallback(func, thisArg, argCount) {\r\n var type = typeof func;\r\n if (func == null || type == 'function') {\r\n return baseCreateCallback(func, thisArg, argCount);\r\n }\r\n // handle \"_.pluck\" style callback shorthands\r\n if (type != 'object') {\r\n return property(func);\r\n }\r\n var props = keys(func),\r\n key = props[0],\r\n a = func[key];\r\n\r\n // handle \"_.where\" style callback shorthands\r\n if (props.length == 1 && a === a && !isObject(a)) {\r\n // fast path the common case of providing an object with a single\r\n // property containing a primitive value\r\n return function(object) {\r\n var b = object[key];\r\n return a === b && (a !== 0 || (1 / a == 1 / b));\r\n };\r\n }\r\n return function(object) {\r\n var length = props.length,\r\n result = false;\r\n\r\n while (length--) {\r\n if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n break;\r\n }\r\n }\r\n return result;\r\n };\r\n }\r\n\r\n /**\r\n * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n * corresponding HTML entities.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {string} string The string to escape.\r\n * @returns {string} Returns the escaped string.\r\n * @example\r\n *\r\n * _.escape('Fred, Wilma, & Pebbles');\r\n * // => 'Fred, Wilma, &amp; Pebbles'\r\n */\r\n function escape(string) {\r\n return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n }\r\n\r\n /**\r\n * This method returns the first argument provided to it.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {*} value Any value.\r\n * @returns {*} Returns `value`.\r\n * @example\r\n *\r\n * var object = { 'name': 'fred' };\r\n * _.identity(object) === object;\r\n * // => true\r\n */\r\n function identity(value) {\r\n return value;\r\n }\r\n\r\n /**\r\n * Adds function properties of a source object to the destination object.\r\n * If `object` is a function methods will be added to its prototype as well.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {Function|Object} [object=lodash] object The destination object.\r\n * @param {Object} source The object of functions to add.\r\n * @param {Object} [options] The options object.\r\n * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n * @example\r\n *\r\n * function capitalize(string) {\r\n * return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n * }\r\n *\r\n * _.mixin({ 'capitalize': capitalize });\r\n * _.capitalize('fred');\r\n * // => 'Fred'\r\n *\r\n * _('fred').capitalize().value();\r\n * // => 'Fred'\r\n *\r\n * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n * _('fred').capitalize();\r\n * // => 'Fred'\r\n */\r\n function mixin(object, source, options) {\r\n var chain = true,\r\n methodNames = source && functions(source);\r\n\r\n if (!source || (!options && !methodNames.length)) {\r\n if (options == null) {\r\n options = source;\r\n }\r\n ctor = lodashWrapper;\r\n source = object;\r\n object = lodash;\r\n methodNames = functions(source);\r\n }\r\n if (options === false) {\r\n chain = false;\r\n } else if (isObject(options) && 'chain' in options) {\r\n chain = options.chain;\r\n }\r\n var ctor = object,\r\n isFunc = isFunction(ctor);\r\n\r\n forEach(methodNames, function(methodName) {\r\n var func = object[methodName] = source[methodName];\r\n if (isFunc) {\r\n ctor.prototype[methodName] = function() {\r\n var chainAll = this.__chain__,\r\n value = this.__wrapped__,\r\n args = [value];\r\n\r\n push.apply(args, arguments);\r\n var result = func.apply(object, args);\r\n if (chain || chainAll) {\r\n if (value === result && isObject(result)) {\r\n return this;\r\n }\r\n result = new ctor(result);\r\n result.__chain__ = chainAll;\r\n }\r\n return result;\r\n };\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Reverts the '_' variable to its previous value and returns a reference to\r\n * the `lodash` function.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @returns {Function} Returns the `lodash` function.\r\n * @example\r\n *\r\n * var lodash = _.noConflict();\r\n */\r\n function noConflict() {\r\n context._ = oldDash;\r\n return this;\r\n }\r\n\r\n /**\r\n * A no-operation function.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @example\r\n *\r\n * var object = { 'name': 'fred' };\r\n * _.noop(object) === undefined;\r\n * // => true\r\n */\r\n function noop() {\r\n // no operation performed\r\n }\r\n\r\n /**\r\n * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n * (1 January 1970 00:00:00 UTC).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @example\r\n *\r\n * var stamp = _.now();\r\n * _.defer(function() { console.log(_.now() - stamp); });\r\n * // => logs the number of milliseconds it took for the deferred function to be called\r\n */\r\n var now = isNative(now = Date.now) && now || function() {\r\n return new Date().getTime();\r\n };\r\n\r\n /**\r\n * Converts the given value into an integer of the specified radix.\r\n * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n *\r\n * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n * implementations. See http://es5.github.io/#E.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {string} value The value to parse.\r\n * @param {number} [radix] The radix used to interpret the value to parse.\r\n * @returns {number} Returns the new integer value.\r\n * @example\r\n *\r\n * _.parseInt('08');\r\n * // => 8\r\n */\r\n var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n };\r\n\r\n /**\r\n * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n * given object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {string} key The name of the property to retrieve.\r\n * @returns {Function} Returns the new function.\r\n * @example\r\n *\r\n * var characters = [\r\n * { 'name': 'fred', 'age': 40 },\r\n * { 'name': 'barney', 'age': 36 }\r\n * ];\r\n *\r\n * var getName = _.property('name');\r\n *\r\n * _.map(characters, getName);\r\n * // => ['barney', 'fred']\r\n *\r\n * _.sortBy(characters, getName);\r\n * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }]\r\n */\r\n function property(key) {\r\n return function(object) {\r\n return object[key];\r\n };\r\n }\r\n\r\n /**\r\n * Produces a random number between `min` and `max` (inclusive). If only one\r\n * argument is provided a number between `0` and the given number will be\r\n * returned. If `floating` is truey or either `min` or `max` are floats a\r\n * floating-point number will be returned instead of an integer.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {number} [min=0] The minimum possible value.\r\n * @param {number} [max=1] The maximum possible value.\r\n * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n * @returns {number} Returns a random number.\r\n * @example\r\n *\r\n * _.random(0, 5);\r\n * // => an integer between 0 and 5\r\n *\r\n * _.random(5);\r\n * // => also an integer between 0 and 5\r\n *\r\n * _.random(5, true);\r\n * // => a floating-point number between 0 and 5\r\n *\r\n * _.random(1.2, 5.2);\r\n * // => a floating-point number between 1.2 and 5.2\r\n */\r\n function random(min, max, floating) {\r\n var noMin = min == null,\r\n noMax = max == null;\r\n\r\n if (floating == null) {\r\n if (typeof min == 'boolean' && noMax) {\r\n floating = min;\r\n min = 1;\r\n }\r\n else if (!noMax && typeof max == 'boolean') {\r\n floating = max;\r\n noMax = true;\r\n }\r\n }\r\n if (noMin && noMax) {\r\n max = 1;\r\n }\r\n min = +min || 0;\r\n if (noMax) {\r\n max = min;\r\n min = 0;\r\n } else {\r\n max = +max || 0;\r\n }\r\n if (floating || min % 1 || max % 1) {\r\n var rand = nativeRandom();\r\n return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n }\r\n return baseRandom(min, max);\r\n }\r\n\r\n /**\r\n * Resolves the value of property `key` on `object`. If `key` is a function\r\n * it will be invoked with the `this` binding of `object` and its result returned,\r\n * else the property value is returned. If `object` is falsey then `undefined`\r\n * is returned.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {Object} object The object to inspect.\r\n * @param {string} key The name of the property to resolve.\r\n * @returns {*} Returns the resolved value.\r\n * @example\r\n *\r\n * var object = {\r\n * 'cheese': 'crumpets',\r\n * 'stuff': function() {\r\n * return 'nonsense';\r\n * }\r\n * };\r\n *\r\n * _.result(object, 'cheese');\r\n * // => 'crumpets'\r\n *\r\n * _.result(object, 'stuff');\r\n * // => 'nonsense'\r\n */\r\n function result(object, key) {\r\n if (object) {\r\n var value = object[key];\r\n return isFunction(value) ? object[key]() : value;\r\n }\r\n }\r\n\r\n /**\r\n * A micro-templating method that handles arbitrary delimiters, preserves\r\n * whitespace, and correctly escapes quotes within interpolated code.\r\n *\r\n * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n *\r\n * For more information on precompiling templates see:\r\n * http://lodash.com/custom-builds\r\n *\r\n * For more information on Chrome extension sandboxes see:\r\n * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {string} text The template text.\r\n * @param {Object} data The data object used to populate the text.\r\n * @param {Object} [options] The options object.\r\n * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n * @param {Object} [options.imports] An object to import into the template as local variables.\r\n * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n * @param {string} [variable] The data object variable name.\r\n * @returns {Function|string} Returns a compiled function when no `data` object\r\n * is given, else it returns the interpolated text.\r\n * @example\r\n *\r\n * // using the \"interpolate\" delimiter to create a compiled template\r\n * var compiled = _.template('hello <%= name %>');\r\n * compiled({ 'name': 'fred' });\r\n * // => 'hello fred'\r\n *\r\n * // using the \"escape\" delimiter to escape HTML in data property values\r\n * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n * // => '<b>&lt;script&gt;</b>'\r\n *\r\n * // using the \"evaluate\" delimiter to generate HTML\r\n * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n * _.template(list, { 'people': ['fred', 'barney'] });\r\n * // => '<li>fred</li><li>barney</li>'\r\n *\r\n * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n * // => 'hello pebbles'\r\n *\r\n * // using the internal `print` function in \"evaluate\" delimiters\r\n * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n * // => 'hello barney!'\r\n *\r\n * // using a custom template delimiters\r\n * _.templateSettings = {\r\n * 'interpolate': /{{([\\s\\S]+?)}}/g\r\n * };\r\n *\r\n * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n * // => 'hello mustache!'\r\n *\r\n * // using the `imports` option to import jQuery\r\n * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n * // => '<li>fred</li><li>barney</li>'\r\n *\r\n * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n * compiled(data);\r\n * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n *\r\n * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n * compiled.source;\r\n * // => function(data) {\r\n * var __t, __p = '', __e = _.escape;\r\n * __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n * return __p;\r\n * }\r\n *\r\n * // using the `source` property to inline compiled templates for meaningful\r\n * // line numbers in error messages and a stack trace\r\n * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n * var JST = {\\\r\n * \"main\": ' + _.template(mainText).source + '\\\r\n * };\\\r\n * ');\r\n */\r\n function template(text, data, options) {\r\n // based on John Resig's `tmpl` implementation\r\n // http://ejohn.org/blog/javascript-micro-templating/\r\n // and Laura Doktorova's doT.js\r\n // https://github.com/olado/doT\r\n var settings = lodash.templateSettings;\r\n text = String(text || '');\r\n\r\n // avoid missing dependencies when `iteratorTemplate` is not defined\r\n options = defaults({}, options, settings);\r\n\r\n var imports = defaults({}, options.imports, settings.imports),\r\n importsKeys = keys(imports),\r\n importsValues = values(imports);\r\n\r\n var isEvaluating,\r\n index = 0,\r\n interpolate = options.interpolate || reNoMatch,\r\n source = \"__p += '\";\r\n\r\n // compile the regexp to match each delimiter\r\n var reDelimiters = RegExp(\r\n (options.escape || reNoMatch).source + '|' +\r\n interpolate.source + '|' +\r\n (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n (options.evaluate || reNoMatch).source + '|$'\r\n , 'g');\r\n\r\n text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n // escape characters that cannot be included in string literals\r\n source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n // replace delimiters with snippets\r\n if (escapeValue) {\r\n source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n }\r\n if (evaluateValue) {\r\n isEvaluating = true;\r\n source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n }\r\n if (interpolateValue) {\r\n source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n }\r\n index = offset + match.length;\r\n\r\n // the JS engine embedded in Adobe products requires returning the `match`\r\n // string in order to produce the correct `offset` value\r\n return match;\r\n });\r\n\r\n source += \"';\\n\";\r\n\r\n // if `variable` is not specified, wrap a with-statement around the generated\r\n // code to add the data object to the top of the scope chain\r\n var variable = options.variable,\r\n hasVariable = variable;\r\n\r\n if (!hasVariable) {\r\n variable = 'obj';\r\n source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n }\r\n // cleanup code by stripping empty strings\r\n source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n .replace(reEmptyStringMiddle, '$1')\r\n .replace(reEmptyStringTrailing, '$1;');\r\n\r\n // frame code as the function body\r\n source = 'function(' + variable + ') {\\n' +\r\n (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n \"var __t, __p = '', __e = _.escape\" +\r\n (isEvaluating\r\n ? ', __j = Array.prototype.join;\\n' +\r\n \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n : ';\\n'\r\n ) +\r\n source +\r\n 'return __p\\n}';\r\n\r\n // Use a sourceURL for easier debugging.\r\n // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n try {\r\n var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n } catch(e) {\r\n e.source = source;\r\n throw e;\r\n }\r\n if (data) {\r\n return result(data);\r\n }\r\n // provide the compiled function's source by its `toString` method, in\r\n // supported environments, or the `source` property as a convenience for\r\n // inlining compiled templates during the build process\r\n result.source = source;\r\n return result;\r\n }\r\n\r\n /**\r\n * Executes the callback `n` times, returning an array of the results\r\n * of each callback execution. The callback is bound to `thisArg` and invoked\r\n * with one argument; (index).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {number} n The number of times to execute the callback.\r\n * @param {Function} callback The function called per iteration.\r\n * @param {*} [thisArg] The `this` binding of `callback`.\r\n * @returns {Array} Returns an array of the results of each `callback` execution.\r\n * @example\r\n *\r\n * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n * // => [3, 6, 4]\r\n *\r\n * _.times(3, function(n) { mage.castSpell(n); });\r\n * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n *\r\n * _.times(3, function(n) { this.cast(n); }, mage);\r\n * // => also calls `mage.castSpell(n)` three times\r\n */\r\n function times(n, callback, thisArg) {\r\n n = (n = +n) > -1 ? n : 0;\r\n var index = -1,\r\n result = Array(n);\r\n\r\n callback = baseCreateCallback(callback, thisArg, 1);\r\n while (++index < n) {\r\n result[index] = callback(index);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The inverse of `_.escape` this method converts the HTML entities\r\n * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n * corresponding characters.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {string} string The string to unescape.\r\n * @returns {string} Returns the unescaped string.\r\n * @example\r\n *\r\n * _.unescape('Fred, Barney &amp; Pebbles');\r\n * // => 'Fred, Barney & Pebbles'\r\n */\r\n function unescape(string) {\r\n return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n }\r\n\r\n /**\r\n * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Utilities\r\n * @param {string} [prefix] The value to prefix the ID with.\r\n * @returns {string} Returns the unique ID.\r\n * @example\r\n *\r\n * _.uniqueId('contact_');\r\n * // => 'contact_104'\r\n *\r\n * _.uniqueId();\r\n * // => '105'\r\n */\r\n function uniqueId(prefix) {\r\n var id = ++idCounter;\r\n return String(prefix == null ? '' : prefix) + id;\r\n }\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * Creates a `lodash` object that wraps the given value with explicit\r\n * method chaining enabled.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Chaining\r\n * @param {*} value The value to wrap.\r\n * @returns {Object} Returns the wrapper object.\r\n * @example\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36 },\r\n * { 'name': 'fred', 'age': 40 },\r\n * { 'name': 'pebbles', 'age': 1 }\r\n * ];\r\n *\r\n * var youngest = _.chain(characters)\r\n * .sortBy('age')\r\n * .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n * .first()\r\n * .value();\r\n * // => 'pebbles is 1'\r\n */\r\n function chain(value) {\r\n value = new lodashWrapper(value);\r\n value.__chain__ = true;\r\n return value;\r\n }\r\n\r\n /**\r\n * Invokes `interceptor` with the `value` as the first argument and then\r\n * returns `value`. The purpose of this method is to \"tap into\" a method\r\n * chain in order to perform operations on intermediate results within\r\n * the chain.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Chaining\r\n * @param {*} value The value to provide to `interceptor`.\r\n * @param {Function} interceptor The function to invoke.\r\n * @returns {*} Returns `value`.\r\n * @example\r\n *\r\n * _([1, 2, 3, 4])\r\n * .tap(function(array) { array.pop(); })\r\n * .reverse()\r\n * .value();\r\n * // => [3, 2, 1]\r\n */\r\n function tap(value, interceptor) {\r\n interceptor(value);\r\n return value;\r\n }\r\n\r\n /**\r\n * Enables explicit method chaining on the wrapper object.\r\n *\r\n * @name chain\r\n * @memberOf _\r\n * @category Chaining\r\n * @returns {*} Returns the wrapper object.\r\n * @example\r\n *\r\n * var characters = [\r\n * { 'name': 'barney', 'age': 36 },\r\n * { 'name': 'fred', 'age': 40 }\r\n * ];\r\n *\r\n * // without explicit chaining\r\n * _(characters).first();\r\n * // => { 'name': 'barney', 'age': 36 }\r\n *\r\n * // with explicit chaining\r\n * _(characters).chain()\r\n * .first()\r\n * .pick('age')\r\n * .value();\r\n * // => { 'age': 36 }\r\n */\r\n function wrapperChain() {\r\n this.__chain__ = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Produces the `toString` result of the wrapped value.\r\n *\r\n * @name toString\r\n * @memberOf _\r\n * @category Chaining\r\n * @returns {string} Returns the string result.\r\n * @example\r\n *\r\n * _([1, 2, 3]).toString();\r\n * // => '1,2,3'\r\n */\r\n function wrapperToString() {\r\n return String(this.__wrapped__);\r\n }\r\n\r\n /**\r\n * Extracts the wrapped value.\r\n *\r\n * @name valueOf\r\n * @memberOf _\r\n * @alias value\r\n * @category Chaining\r\n * @returns {*} Returns the wrapped value.\r\n * @example\r\n *\r\n * _([1, 2, 3]).valueOf();\r\n * // => [1, 2, 3]\r\n */\r\n function wrapperValueOf() {\r\n return this.__wrapped__;\r\n }\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n // add functions that return wrapped values when chaining\r\n lodash.after = after;\r\n lodash.assign = assign;\r\n lodash.at = at;\r\n lodash.bind = bind;\r\n lodash.bindAll = bindAll;\r\n lodash.bindKey = bindKey;\r\n lodash.chain = chain;\r\n lodash.compact = compact;\r\n lodash.compose = compose;\r\n lodash.constant = constant;\r\n lodash.countBy = countBy;\r\n lodash.create = create;\r\n lodash.createCallback = createCallback;\r\n lodash.curry = curry;\r\n lodash.debounce = debounce;\r\n lodash.defaults = defaults;\r\n lodash.defer = defer;\r\n lodash.delay = delay;\r\n lodash.difference = difference;\r\n lodash.filter = filter;\r\n lodash.flatten = flatten;\r\n lodash.forEach = forEach;\r\n lodash.forEachRight = forEachRight;\r\n lodash.forIn = forIn;\r\n lodash.forInRight = forInRight;\r\n lodash.forOwn = forOwn;\r\n lodash.forOwnRight = forOwnRight;\r\n lodash.functions = functions;\r\n lodash.groupBy = groupBy;\r\n lodash.indexBy = indexBy;\r\n lodash.initial = initial;\r\n lodash.intersection = intersection;\r\n lodash.invert = invert;\r\n lodash.invoke = invoke;\r\n lodash.keys = keys;\r\n lodash.map = map;\r\n lodash.mapValues = mapValues;\r\n lodash.max = max;\r\n lodash.memoize = memoize;\r\n lodash.merge = merge;\r\n lodash.min = min;\r\n lodash.omit = omit;\r\n lodash.once = once;\r\n lodash.pairs = pairs;\r\n lodash.partial = partial;\r\n lodash.partialRight = partialRight;\r\n lodash.pick = pick;\r\n lodash.pluck = pluck;\r\n lodash.property = property;\r\n lodash.pull = pull;\r\n lodash.range = range;\r\n lodash.reject = reject;\r\n lodash.remove = remove;\r\n lodash.rest = rest;\r\n lodash.shuffle = shuffle;\r\n lodash.sortBy = sortBy;\r\n lodash.tap = tap;\r\n lodash.throttle = throttle;\r\n lodash.times = times;\r\n lodash.toArray = toArray;\r\n lodash.transform = transform;\r\n lodash.union = union;\r\n lodash.uniq = uniq;\r\n lodash.values = values;\r\n lodash.where = where;\r\n lodash.without = without;\r\n lodash.wrap = wrap;\r\n lodash.xor = xor;\r\n lodash.zip = zip;\r\n lodash.zipObject = zipObject;\r\n\r\n // add aliases\r\n lodash.collect = map;\r\n lodash.drop = rest;\r\n lodash.each = forEach;\r\n lodash.eachRight = forEachRight;\r\n lodash.extend = assign;\r\n lodash.methods = functions;\r\n lodash.object = zipObject;\r\n lodash.select = filter;\r\n lodash.tail = rest;\r\n lodash.unique = uniq;\r\n lodash.unzip = zip;\r\n\r\n // add functions to `lodash.prototype`\r\n mixin(lodash);\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n // add functions that return unwrapped values when chaining\r\n lodash.clone = clone;\r\n lodash.cloneDeep = cloneDeep;\r\n lodash.contains = contains;\r\n lodash.escape = escape;\r\n lodash.every = every;\r\n lodash.find = find;\r\n lodash.findIndex = findIndex;\r\n lodash.findKey = findKey;\r\n lodash.findLast = findLast;\r\n lodash.findLastIndex = findLastIndex;\r\n lodash.findLastKey = findLastKey;\r\n lodash.has = has;\r\n lodash.identity = identity;\r\n lodash.indexOf = indexOf;\r\n lodash.isArguments = isArguments;\r\n lodash.isArray = isArray;\r\n lodash.isBoolean = isBoolean;\r\n lodash.isDate = isDate;\r\n lodash.isElement = isElement;\r\n lodash.isEmpty = isEmpty;\r\n lodash.isEqual = isEqual;\r\n lodash.isFinite = isFinite;\r\n lodash.isFunction = isFunction;\r\n lodash.isNaN = isNaN;\r\n lodash.isNull = isNull;\r\n lodash.isNumber = isNumber;\r\n lodash.isObject = isObject;\r\n lodash.isPlainObject = isPlainObject;\r\n lodash.isRegExp = isRegExp;\r\n lodash.isString = isString;\r\n lodash.isUndefined = isUndefined;\r\n lodash.lastIndexOf = lastIndexOf;\r\n lodash.mixin = mixin;\r\n lodash.noConflict = noConflict;\r\n lodash.noop = noop;\r\n lodash.now = now;\r\n lodash.parseInt = parseInt;\r\n lodash.random = random;\r\n lodash.reduce = reduce;\r\n lodash.reduceRight = reduceRight;\r\n lodash.result = result;\r\n lodash.runInContext = runInContext;\r\n lodash.size = size;\r\n lodash.some = some;\r\n lodash.sortedIndex = sortedIndex;\r\n lodash.template = template;\r\n lodash.unescape = unescape;\r\n lodash.uniqueId = uniqueId;\r\n\r\n // add aliases\r\n lodash.all = every;\r\n lodash.any = some;\r\n lodash.detect = find;\r\n lodash.findWhere = find;\r\n lodash.foldl = reduce;\r\n lodash.foldr = reduceRight;\r\n lodash.include = contains;\r\n lodash.inject = reduce;\r\n\r\n mixin(function() {\r\n var source = {}\r\n forOwn(lodash, function(func, methodName) {\r\n if (!lodash.prototype[methodName]) {\r\n source[methodName] = func;\r\n }\r\n });\r\n return source;\r\n }(), false);\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n // add functions capable of returning wrapped and unwrapped values when chaining\r\n lodash.first = first;\r\n lodash.last = last;\r\n lodash.sample = sample;\r\n\r\n // add aliases\r\n lodash.take = first;\r\n lodash.head = first;\r\n\r\n forOwn(lodash, function(func, methodName) {\r\n var callbackable = methodName !== 'sample';\r\n if (!lodash.prototype[methodName]) {\r\n lodash.prototype[methodName]= function(n, guard) {\r\n var chainAll = this.__chain__,\r\n result = func(this.__wrapped__, n, guard);\r\n\r\n return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n ? result\r\n : new lodashWrapper(result, chainAll);\r\n };\r\n }\r\n });\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n /**\r\n * The semantic version number.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @type string\r\n */\r\n lodash.VERSION = '2.4.1';\r\n\r\n // add \"Chaining\" functions to the wrapper\r\n lodash.prototype.chain = wrapperChain;\r\n lodash.prototype.toString = wrapperToString;\r\n lodash.prototype.value = wrapperValueOf;\r\n lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n // add `Array` functions that return unwrapped values\r\n forEach(['join', 'pop', 'shift'], function(methodName) {\r\n var func = arrayRef[methodName];\r\n lodash.prototype[methodName] = function() {\r\n var chainAll = this.__chain__,\r\n result = func.apply(this.__wrapped__, arguments);\r\n\r\n return chainAll\r\n ? new lodashWrapper(result, chainAll)\r\n : result;\r\n };\r\n });\r\n\r\n // add `Array` functions that return the existing wrapped value\r\n forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n var func = arrayRef[methodName];\r\n lodash.prototype[methodName] = function() {\r\n func.apply(this.__wrapped__, arguments);\r\n return this;\r\n };\r\n });\r\n\r\n // add `Array` functions that return new wrapped values\r\n forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n var func = arrayRef[methodName];\r\n lodash.prototype[methodName] = function() {\r\n return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n };\r\n });\r\n\r\n return lodash;\r\n }\r\n\r\n /*--------------------------------------------------------------------------*/\r\n\r\n // expose Lo-Dash\r\n var _ = runInContext();\r\n\r\n // some AMD build optimizers like r.js check for condition patterns like the following:\r\n if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n // case Lo-Dash is loaded with a RequireJS shim config.\r\n // See http://requirejs.org/docs/api.html#config-shim\r\n root._ = _;\r\n\r\n // define as an anonymous module so, through path mapping, it can be\r\n // referenced as the \"underscore\" module\r\n define(function() {\r\n return _;\r\n });\r\n }\r\n // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n else if (freeExports && freeModule) {\r\n // in Node.js or RingoJS\r\n if (moduleExports) {\r\n (freeModule.exports = _)._ = _;\r\n }\r\n // in Narwhal or Rhino -require\r\n else {\r\n freeExports._ = _;\r\n }\r\n }\r\n else {\r\n // in a browser or Rhino\r\n root._ = _;\r\n }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n const d = document;\r\n const svgNS = \"http://www.w3.org/2000/svg\";\r\n const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n // Node size\r\n var WIDTH = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n // Create path for node connections \r\n function _line (src, target) {\r\n const x1 = src.x,\r\n y1 = src.y,\r\n x2 = target.x,\r\n y2 = target.y - target.height / 2;\r\n\r\n // c 0,0 -10,0\r\n return 'M ' + x1 + ',' + y1 + ' ' + \r\n 'C ' + x1 + ',' + y1 + ' ' + \r\n x2 + ',' + (y2 - (y2 - y1) / 2) + ' ' + \r\n x2 + ',' + y2;\r\n };\r\n\r\n return {\r\n\r\n /**\r\n * Create new tree visualization based\r\n * on a match snippet.\r\n */\r\n create : function (snippet) {\r\n return Object.create(this).\r\n _init(snippet);\r\n },\r\n\r\n\r\n // Initialize the tree based on a snippet.\r\n _init : function (snippet) {\r\n this._next = new Number(0);\r\n \r\n // Create html for traversal\r\n let html = d.createElement(\"div\");\r\n html.innerHTML = snippet;\r\n\r\n const g = new dagre.graphlib.Graph({\r\n \"directed\" : true \r\n });\r\n\r\n g.setGraph({\r\n \"nodesep\" : 35,\r\n \"ranksep\" : 15,\r\n \"marginx\" : 40,\r\n \"marginy\" : 10\r\n });\r\n g.setDefaultEdgeLabel({});\r\n\r\n this._graph = g;\r\n \r\n // This is a new root\r\n this._addNode(\r\n this._next++,\r\n { \"class\" : \"root\" }\r\n );\r\n \r\n // Parse nodes from root\r\n this._parse(0, html.childNodes, undefined);\r\n\r\n // Root node has only one child - remove\r\n if (g.outEdges(0).length === 1)\r\n g.removeNode(0);\r\n\r\n html = undefined;\r\n return this;\r\n },\r\n\r\n\r\n _c : function (tag) {\r\n return d.createElementNS(svgNS, tag);\r\n },\r\n \r\n\r\n /**\r\n * The number of nodes in the tree.\r\n */\r\n nodes : function () {\r\n return this._next;\r\n },\r\n\r\n\r\n // Add new node to graph\r\n _addNode : function (id, obj) {\r\n obj[\"width\"] = WIDTH;\r\n obj[\"height\"] = HEIGHT;\r\n this._graph.setNode(id, obj)\r\n return obj;\r\n },\r\n \r\n\r\n // Add new edge to graph\r\n _addEdge : function (src, target) {\r\n this._graph.setEdge(src, target);\r\n },\r\n \r\n\r\n // Remove foundry and layer for labels\r\n _clean : function (title) {\r\n return title.replace(_TermRE, \"$3\");\r\n },\r\n\r\n \r\n // Parse the snippet\r\n _parse : function (parent, children, mark) {\r\n children.forEach(function(c) {\r\n\r\n // Element node\r\n if (c.nodeType == 1) {\r\n\r\n // Get title from html\r\n if (c.getAttribute(\"title\")) {\r\n\r\n // Add child node\r\n const id = this._next++;\r\n\r\n const obj = this._addNode(id, {\r\n \"class\" : \"middle\",\r\n \"label\" : this._clean(c.getAttribute(\"title\"))\r\n });\r\n \r\n if (mark !== undefined) {\r\n obj.class += ' mark';\r\n };\r\n \r\n this._addEdge(parent, id);\r\n\r\n // Check for next level\r\n if (c.hasChildNodes())\r\n this._parse(id, c.childNodes, mark);\r\n }\r\n\r\n // Step further\r\n else if (c.hasChildNodes()) {\r\n\r\n this._parse(\r\n parent,\r\n c.childNodes,\r\n c.tagName === 'MARK' ? true : mark\r\n );\r\n };\r\n }\r\n\r\n // Text node\r\n else if (c.nodeType == 3)\r\n\r\n if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n \r\n // Add child node\r\n const id = this._next++;\r\n this._addNode(id, {\r\n \"class\" : \"leaf\",\r\n \"label\" : c.nodeValue\r\n });\r\n\r\n this._addEdge(parent, id);\r\n };\r\n }, this);\r\n return this;\r\n },\r\n\r\n\r\n // Dummy method to be compatible with relTree\r\n show : function () {\r\n return;\r\n },\r\n\r\n\r\n /**\r\n * Center the viewport of the canvas\r\n * TODO:\r\n * This is identical to relations\r\n */\r\n center : function () {\r\n if (this._el === undefined)\r\n return;\r\n\r\n const treeDiv = this._el.parentNode;\r\n const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n // Reposition:\r\n if (cWidth > treeWidth) {\r\n treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n };\r\n },\r\n\r\n\r\n /**\r\n * Create svg and serialize as base64\r\n */\r\n toBase64 : function () {\r\n\r\n // First clone element\r\n const svgWrapper = d.createElement('div')\r\n svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n const svg = svgWrapper.firstChild;\r\n const style = this._c('style');\r\n\r\n svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n style.innerHTML = \r\n\t 'path.edge ' + '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n 'g.root rect.empty,' +\r\n 'g.middle rect' + '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n 'g.leaf > rect ' + '{ display: none }' +\r\n 'g > text > tspan ' + '{ text-anchor: middle; font-size: 9pt }' +\r\n 'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n },\r\n \r\n\r\n /**\r\n * Get the dom element of the tree view.\r\n */\r\n element : function () {\r\n\r\n if (this._el !== undefined)\r\n return this._el;\r\n\r\n const g = this._graph;\r\n dagre.layout(g);\r\n \r\n const canvas = this._c('svg');\r\n this._el = canvas;\r\n\r\n canvas.appendChild(this._c('defs'));\r\n\r\n // Create edges\r\n const that = this;\r\n\r\n let src, target, p;\r\n\r\n g.edges().forEach(\r\n function (e) {\r\n src = g.node(e.v);\r\n target = g.node(e.w);\r\n p = that._c('path');\r\n p.setAttributeNS(null, \"d\", _line(src, target));\r\n p.classList.add('edge');\r\n canvas.appendChild(p);\r\n }\r\n );\r\n \r\n let height = g.graph().height;\r\n\r\n // Create nodes\r\n g.nodes().forEach(\r\n function (v) {\r\n v = g.node(v);\r\n const group = that._c('g');\r\n group.setAttribute('class', v.class);\r\n \r\n // Add node box\r\n const rect = group.appendChild(that._c('rect'));\r\n rect.setAttribute('x', v.x - v.width / 2);\r\n rect.setAttribute('y', v.y - v.height / 2);\r\n rect.setAttribute('rx', 5);\r\n rect.setAttribute('ry', 5);\r\n rect.setAttribute('width', v.width);\r\n rect.setAttribute('height', v.height);\r\n\r\n if (v.class === 'root' && v.label === undefined) {\r\n rect.setAttribute('width', v.height);\r\n rect.setAttribute('x', v.x - v.height / 2);\r\n rect.setAttribute('class', 'empty');\r\n };\r\n\r\n // Add label\r\n if (v.label !== undefined) {\r\n const text = group.appendChild(that._c('text'));\r\n let y = v.y - v.height / 2;\r\n text.setAttribute('y', y);\r\n text.setAttribute(\r\n 'transform',\r\n 'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n );\r\n\r\n const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n .replace(/&amp;/g, '&')\r\n .replace(/&lt;/g, '<')\r\n .replace(/&gt;/g, '>');\r\n \r\n if (v.class === \"leaf\") {\r\n text.setAttribute('title', vLabel);\r\n\r\n let n = 0;\r\n let tspan;\r\n vLabel.split(\" \").forEach(function(p) {\r\n if (p.length === 0)\r\n return;\r\n\r\n tspan = that._c('tspan');\r\n tspan.appendChild(d.createTextNode(p));\r\n\r\n if (n !== 0)\r\n tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n else\r\n n = 1;\r\n\r\n tspan.setAttribute('x', v.x - v.width / 2);\r\n y += LINEHEIGHT;\r\n text.appendChild(tspan);\r\n });\r\n\r\n y += LINEHEIGHT;\r\n\r\n // The text is below the canvas - readjust the height!\r\n if (y > height)\r\n height = y;\r\n }\r\n else {\r\n const tspan = that._c('tspan');\r\n tspan.appendChild(d.createTextNode(vLabel));\r\n tspan.setAttribute('x', v.x - v.width / 2);\r\n text.appendChild(tspan);\r\n };\r\n };\r\n canvas.appendChild(group);\r\n }\r\n );\r\n\r\n canvas.setAttribute('width', g.graph().width);\r\n canvas.setAttribute('height', height);\r\n return this._el;\r\n },\r\n \r\n downloadLink : function () {\r\n const a = d.createElement('a');\r\n a.setAttribute('href-lang', 'image/svg+xml');\r\n a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n a.setAttribute('download', 'tree.svg');\r\n a.target = '_blank';\r\n a.setAttribute('rel', 'noopener noreferrer');\r\n return a;\r\n }\r\n };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n const svgNS = \"http://www.w3.org/2000/svg\";\r\n const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n const d = document;\r\n\r\n return {\r\n create : function (snippet) {\r\n return Object.create(this)._init(snippet);\r\n },\r\n\r\n // Initialize the state of the object\r\n _init : function (snippet) {\r\n\r\n const t = this;\r\n\r\n // Predefine some values\r\n t._tokens = [];\r\n t._arcs = [];\r\n t._tokenElements = [];\r\n t._y = 0;\r\n t._currentInFocus = undefined;\r\n\r\n // Some configurations\r\n t.maxArc = 200; // maximum height of the bezier control point\r\n t.overlapDiff = 40; // Difference on overlaps and minimum height for self-refernces\r\n t.arcDiff = 15;\r\n t.anchorDiff = 8;\r\n t.anchorStart = 15;\r\n t.tokenSep = 30;\r\n t.xPadding = 10;\r\n t.yPadding = 5;\r\n\r\n // No snippet to process\r\n if (snippet == undefined || snippet == null)\r\n return t;\r\n\r\n // Parse the snippet\r\n const html = d.createElement(\"div\");\r\n html.innerHTML = snippet;\r\n\r\n // Establish temporary parsing memory\r\n t.temp = {\r\n target : {}, // Remember the map id => pos \r\n edges : [], // Remember edge definitions\r\n pos : 0 // Keep track of the current token position\r\n };\r\n\r\n // Start parsing from root\r\n t._parse(0, html.childNodes, undefined);\r\n\r\n // Establish edge list\r\n const targetMap = t.temp['target'];\r\n const edges = t.temp['edges'];\r\n\r\n let targetID, target, relation;\r\n \r\n // Iterate over edge lists\r\n // TODO:\r\n // Support spans for anchors!\r\n edges.forEach(function(edge) {\r\n\r\n // Check the target identifier\r\n targetID = edge.targetID;\r\n target = targetMap[targetID];\r\n\r\n if (target != undefined) {\r\n\r\n // Check if the source is a span anchor\r\n /*\r\n var start = edge.srcStart;\r\n if (start !== edge.srcEnd) {\r\n start = [start, edge.srcEnd];\r\n };\r\n */\r\n \r\n // Add relation\r\n relation = {\r\n start : [edge.srcStart, edge.srcEnd],\r\n end : target,\r\n direction : 'uni',\r\n label : edge.label\r\n };\r\n // console.log(relation);\r\n this.addRel(relation);\r\n };\r\n }, t);\r\n\r\n // Reset parsing memory\r\n delete t[\"temp\"];\r\n\r\n return this;\r\n },\r\n\r\n // Parse a node of the tree snippet\r\n _parse : function (parent, children, mark) {\r\n\r\n // Iterate over all child nodes\r\n Array.from(children).forEach(function(c) {\r\n\r\n // Element node\r\n if (c.nodeType == 1) {\r\n\r\n let xmlid, target, start, end;\r\n\r\n // Node is an identifier\r\n if (c.hasAttribute('xml:id')) {\r\n\r\n // Remember that pos has this identifier\r\n xmlid = c.getAttribute('xml:id');\r\n // this.temp['target'][xmlid] =\r\n start = this.temp['pos'];\r\n end = this.temp['pos'];\r\n }\r\n\r\n // Node is a link\r\n // Stricter: && c.hasAttribute('xlink:show')\r\n else if (c.hasAttribute('xlink:href')) {\r\n\r\n // Node is a continuation\r\n if (c.getAttribute('xlink:show') == \"other\" &&\r\n c.hasAttribute('data-action') &&\r\n c.getAttribute('data-action') == \"join\"\r\n ) {\r\n xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n start = this.temp['pos'];\r\n end = this.temp['pos'];\r\n\r\n // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n // console.log(\"Here\");\r\n }\r\n\r\n // Node is a relation\r\n // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n else {\r\n let label;\r\n\r\n // Get target id\r\n target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n if (c.hasAttribute('xlink:title')) {\r\n label = this._clean(c.getAttribute('xlink:title'));\r\n };\r\n\r\n // Remember the defined edge\r\n// WRONG!\r\n var edge = {\r\n label : label,\r\n srcStart : this.temp['pos'],\r\n targetID : target\r\n };\r\n\r\n // TEMP: Hot-fix for root relations\r\n if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n this.temp['edges'].push(edge);\r\n };\r\n\r\n };\r\n };\r\n\r\n // Go on with child nodes\r\n if (c.hasChildNodes()) {\r\n this._parse(0, c.childNodes, mark);\r\n };\r\n\r\n\r\n // The element is a defined anchor\r\n if (xmlid !== undefined) {\r\n\r\n // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n // Element already defined\r\n if (this.temp['target'][xmlid] !== undefined) {\r\n const newtarget = this.temp['target'][xmlid];\r\n end = this.temp['pos'] - 1;\r\n newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n }\r\n\r\n // Element not yet defined\r\n else {\r\n end = this.temp['pos'] - 1;\r\n this.temp['target'][xmlid] = [start, end];\r\n };\r\n\r\n /*\r\n console.log('Target ' + xmlid + ' spans from ' +\r\n this.temp['target'][xmlid][0] +\r\n ' to ' +\r\n this.temp['target'][xmlid][1]\r\n );\r\n */\r\n xmlid = undefined;\r\n }\r\n\r\n // Current element describes an arc\r\n else if (target !== undefined) {\r\n\r\n // TODO: This does not work yet!\r\n edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n // console.log('Here');\r\n\r\n /*\r\n console.log('Source spans from ' +\r\n edge[\"srcStart\"] +\r\n ' to ' +\r\n edge[\"srcEnd\"]\r\n );\r\n */\r\n target = undefined;\r\n };\r\n }\r\n\r\n // Text node\r\n else if (c.nodeType == 3) {\r\n\r\n // Check, if there is a non-whitespace token\r\n if (c.nodeValue !== undefined) {\r\n\r\n const str = c.nodeValue.trim();\r\n\r\n if (str !== undefined && str.length > 0) {\r\n\r\n // Add token to token list\r\n this.addToken(str);\r\n\r\n // Move token position\r\n this.temp['pos']++;\r\n };\r\n };\r\n };\r\n }, this);\r\n\r\n // Todo: define edges here!\r\n },\r\n\r\n \r\n // Remove foundry and layer for labels\r\n _clean : function (title) {\r\n return title.replace(_TermRE, \"$3\");\r\n },\r\n\r\n \r\n // Return the number of leaf nodes\r\n // (not necessarily part of a relation).\r\n // Consecutive nodes that are not part of any\r\n // relation are summarized in one node.\r\n size : function () {\r\n return this._tokens.length;\r\n },\r\n\r\n \r\n // This is a shorthand for SVG element creation\r\n _c : function (tag) {\r\n return d.createElementNS(svgNS, tag);\r\n },\r\n\r\n\r\n // Get bounding box - with workaround for text nodes\r\n _rect : function (node) {\r\n if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n const range = d.createRange();\r\n range.selectNode(node);\r\n const rect = range.getBoundingClientRect();\r\n range.detach();\r\n return rect;\r\n };\r\n return node.getBoundingClientRect();\r\n },\r\n\r\n\r\n // Returns the center point of the requesting token\r\n _tokenPoint : function (node) {\r\n\t const box = this._rect(node);\r\n\t return box.left + (box.width / 2);\r\n },\r\n\r\n\r\n // Draws an anchor\r\n _drawAnchor : function (anchor) {\r\n\r\n // Calculate the span of the first and last token, the anchor spans\r\n const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n const lastBox = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n const l = this._c('path');\r\n \r\n\t this._arcsElement.appendChild(l);\r\n\r\n const pathStr = \"M \" +\r\n (firstBox.left - this.offsetLeft) +\r\n \",\" +\r\n y +\r\n \" L \" +\r\n (lastBox.right - this.offsetLeft) +\r\n \",\" + y;\r\n\r\n l.setAttribute(\"d\", pathStr);\r\n l.setAttribute(\"class\", \"anchor\");\r\n anchor.element = l;\r\n anchor.y = y;\r\n return l;\r\n },\r\n \r\n\r\n // Create an arc with an optional label\r\n // Potentially needs a height parameter for stacks\r\n _drawArc : function (arc) {\r\n\r\n const t = this;\r\n let startPos, endPos;\r\n let startY = this._y;\r\n let endY = this._y;\r\n\t\r\n if (arc.startAnchor !== undefined) {\r\n startPos = t._tokenPoint(arc.startAnchor.element);\r\n startY = arc.startAnchor.y;\r\n }\r\n else {\r\n startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n };\r\n\r\n if (arc.endAnchor !== undefined) {\r\n endPos = t._tokenPoint(arc.endAnchor.element)\r\n endY = arc.endAnchor.y;\r\n }\r\n else {\r\n endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n };\r\n\r\n startPos -= t.offsetLeft;\r\n endPos -= t.offsetLeft;\r\n\r\n\t // Special treatment for self-references\r\n var overlaps = arc.overlaps;\r\n if (startPos == endPos) {\r\n startPos -= t.overlapDiff / 3;\r\n endPos += t.overlapDiff / 3;\r\n overlaps += .5;\r\n };\r\n\r\n const g = t._c(\"g\");\r\n g.setAttribute(\"class\", \"arc\");\r\n const p = g.appendChild(t._c(\"path\"));\r\n p.setAttribute('class', 'edge');\r\n \r\n // Attach the new arc before drawing, so computed values are available\r\n t._arcsElement.appendChild(g);\r\n\r\n // Create arc\r\n let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n // TODO:\r\n // take the number of tokens into account!\r\n let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n // Respect the maximum height\r\n cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n var x = Math.min(startPos, endPos);\r\n\r\n //var controlY = (startY + endY - cHeight);\r\n let controlY = (endY - cHeight);\r\n \r\n const arcE = \"M \"+ startPos + \",\" + startY +\r\n \" C \" + startPos + \",\" + controlY +\r\n \" \" + endPos + \",\" + controlY +\r\n \" \" + endPos + \",\" + endY;\r\n\r\n p.setAttribute(\"d\", arcE);\r\n\r\n if (arc.direction !== undefined) {\r\n p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n if (arc.direction === 'bi') {\r\n p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n };\r\n };\r\n\r\n if (arc.label === undefined)\r\n return g;\r\n \r\n /*\r\n * Calculate the top point of the arc for labeling using\r\n * de Casteljau's algorithm, see e.g.\r\n * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n * of course simplified to symmetric arcs ...\r\n */\r\n // Interpolate one side of the control polygon\r\n let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n // Create a boxed label\r\n const label = this._c(\"g\");\r\n label.setAttribute(\"class\", \"label\");\r\n t._labelsElement.appendChild(label);\r\n\r\n // Set arc reference\r\n label.arcRef = g;\r\n\r\n const that = t;\r\n label.addEventListener('mouseenter', function () {\r\n that.inFocus(this);\r\n });\r\n\r\n const labelE = label.appendChild(t._c(\"text\"));\r\n labelE.setAttribute(\"x\", x + middle);\r\n labelE.setAttribute(\"y\", middleY + 3);\r\n labelE.setAttribute(\"text-anchor\", \"middle\");\r\n const textNode = d.createTextNode(arc.label);\r\n labelE.appendChild(textNode);\r\n\r\n const labelBox = labelE.getBBox();\r\n\r\n /*\r\n if (!labelBox)\r\n console.log(\"----\");\r\n */\r\n \r\n const textWidth = labelBox.width; // labelE.getComputedTextLength();\r\n const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n // Add box with padding to left and right\r\n const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n const boxWidth = textWidth + 2 * t.xPadding;\r\n labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n labelR.setAttribute(\"ry\", 5);\r\n labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n labelR.setAttribute(\"width\", boxWidth);\r\n labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n },\r\n\r\n\r\n /**\r\n * Get the svg element\r\n */\r\n element : function () {\r\n if (this._el !== undefined)\r\n return this._el;\r\n\r\n // Create svg\r\n const svg = this._c(\"svg\");\r\n\r\n window.addEventListener(\"resize\", function () {\r\n // TODO:\r\n // Only if text-size changed!\r\n // TODO:\r\n // This is currently untested\r\n this.show();\r\n }.bind(this));\r\n\r\n // Define marker arrows\r\n const defs = svg.appendChild(this._c(\"defs\"));\r\n const marker = defs.appendChild(this._c(\"marker\"));\r\n marker.setAttribute(\"refX\", 9);\r\n marker.setAttribute(\"id\", \"arr\");\r\n marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n const arrow = this._c(\"path\");\r\n arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n marker.appendChild(arrow);\r\n\r\n this._el = svg;\r\n return this._el;\r\n },\r\n\r\n\r\n // Add a relation with a start, an end,\r\n // a direction value and an optional label text\r\n addRel : function (rel) {\r\n this._arcs.push(rel);\r\n return this;\r\n },\r\n\r\n\r\n // Add a token to the list (this will mostly be a word)\r\n addToken : function(token) {\r\n this._tokens.push(token);\r\n return this;\r\n },\r\n\r\n\r\n // Move label and arc in focus\r\n inFocus : function (element) {\r\n let cif;\r\n\r\n if (this._currentInFocus) {\r\n\r\n // Already in focus\r\n if (this._currentInFocus === element)\r\n return;\r\n\r\n cif = this._currentInFocus;\r\n cif.classList.remove('infocus');\r\n cif.arcRef.classList.remove('infocus');\r\n };\r\n\r\n cif = this._currentInFocus = element;\r\n this._labelsElement.appendChild(cif);\r\n this._arcsElement.appendChild(cif.arcRef);\r\n cif.classList.add('infocus');\r\n cif.arcRef.classList.add('infocus');\r\n },\r\n \r\n\r\n /*\r\n * All arcs need to be sorted before shown,\r\n * to avoid nesting.\r\n */\r\n _sortArcs : function () {\r\n\r\n // TODO:\r\n // Keep in mind that the arcs may have long anchors!\r\n // 1. Iterate over all arcs\r\n // 2. Sort all multi\r\n let anchors = {};\r\n \r\n // 1. Sort by length\r\n // 2. Tag all spans with the number of overlaps before\r\n // a) Iterate over all spans\r\n // b) check the latest preceeding overlapping span (lpos)\r\n // -> not found: tag with 0\r\n // -> found: Add +1 to the level of the (lpos)\r\n // c) If the new tag is smaller than the previous element,\r\n // reorder\r\n\r\n // Normalize start and end\r\n const sortedArcs = this._arcs.map(function (v) {\r\n\r\n // Check for long anchors\r\n if (v.start instanceof Array) {\r\n\r\n if (v.start[0] == v.start[1]) {\r\n v.start = v.start[0];\r\n }\r\n\r\n else {\r\n \r\n const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n // Calculate signature to avoid multiple anchors\r\n let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n // Reverse signature\r\n if (v.start[0] > v.start[1]) {\r\n anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n };\r\n \r\n // Check if the anchor already exist\r\n let anchor = anchors[anchorSig];\r\n if (anchor === undefined) {\r\n anchor = {\r\n \"first\": v.start[0],\r\n \"last\" : v.start[1],\r\n \"length\" : v.start[1] - v.start[0]\r\n };\r\n anchors[anchorSig] = anchor;\r\n };\r\n\r\n v.startAnchor = anchor;\r\n\r\n // Add to anchors list\r\n v.start = middle;\r\n };\r\n };\r\n\r\n if (v.end instanceof Array) {\r\n\r\n if (v.end[0] == v.end[1]) {\r\n v.end = v.end[0];\r\n }\r\n\r\n else {\r\n\r\n const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n // Calculate signature to avoid multiple anchors\r\n let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n // Reverse signature\r\n if (v.end[0] > v.end[1]) {\r\n anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n };\r\n\r\n // Check if the anchor already exist\r\n var anchor = anchors[anchorSig];\r\n if (anchor === undefined) {\r\n anchor = {\r\n \"first\": v.end[0],\r\n \"last\" : v.end[1],\r\n \"length\" : v.end[1] - v.end[0]\r\n };\r\n anchors[anchorSig] = anchor;\r\n };\r\n \r\n v.endAnchor = anchor;\r\n\r\n // Add to anchors list\r\n v.end = middle;\r\n };\r\n };\r\n\r\n v.first = v.start;\r\n v.last = v.end;\r\n\r\n // calculate the arch length\r\n if (v.start < v.end) {\r\n v.length = v.end - v.start;\r\n }\r\n\r\n else {\r\n v.length = v.start - v.end;\r\n };\r\n\r\n return v;\r\n });\r\n\r\n // Sort based on length\r\n sortedArcs.sort(function (a, b) {\r\n if (a.length < b.length)\r\n return -1;\r\n else\r\n return 1;\r\n });\r\n\r\n // Add sorted arcs and anchors\r\n this._sortedArcs = lengthSort(sortedArcs, false);\r\n this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n },\r\n\r\n\r\n /**\r\n * Center the viewport of the canvas\r\n * TODO:\r\n * This is identical to treehierarchy\r\n */\r\n center : function () {\r\n if (this._el === undefined)\r\n return;\r\n\r\n const treeDiv = this._el.parentNode;\r\n\r\n const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n // Reposition:\r\n if (cWidth > treeWidth) {\r\n var scrollValue = (cWidth - treeWidth) / 2;\r\n treeDiv.scrollLeft = scrollValue;\r\n };\r\n },\r\n\r\n\r\n // Show the element\r\n show : function () {\r\n const t = this;\r\n const svg = this._el;\r\n const height = this.maxArc;\r\n\r\n // Delete old group\r\n if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n svg.removeChild(\r\n svg.getElementsByTagName(\"g\")[0]\r\n );\r\n t._tokenElements = [];\r\n };\r\n\r\n const g = svg.appendChild(t._c(\"g\"));\r\n\r\n // Draw token list\r\n const text = g.appendChild(t._c(\"text\"));\r\n text.setAttribute('class', 'leaf');\r\n text.setAttribute(\"text-anchor\", \"start\");\r\n text.setAttribute(\"y\", height);\r\n\r\n // Calculate the start position\r\n t._y = height - (t.anchorStart);\r\n\r\n // Introduce some prepending whitespace (yeah - I know ...)\r\n const ws = text.appendChild(t._c(\"tspan\"));\r\n ws.appendChild(d.createTextNode('\\u00A0'));\r\n ws.style.textAnchor = \"start\";\r\n \r\n t._tokens.forEach(function(node_i) {\r\n // Append svg\r\n // var x = text.appendChild(this._c(\"text\"));\r\n const tspan = text.appendChild(this._c(\"tspan\"));\r\n tspan.appendChild(d.createTextNode(node_i));\r\n tspan.setAttribute(\"text-anchor\", \"middle\");\r\n \r\n this._tokenElements.push(tspan);\r\n\r\n // Add whitespace!\r\n tspan.setAttribute(\"dx\", this.tokenSep);\r\n }, t);\r\n\r\n // Get some global position data that may change on resize\r\n t.offsetLeft = t._rect(g).left;\r\n\r\n // The group of arcs\r\n const arcs = g.appendChild(t._c(\"g\"));\r\n t._arcsElement = arcs;\r\n arcs.classList.add(\"arcs\");\r\n\r\n const labels = g.appendChild(t._c(\"g\"));\r\n t._labelsElement = labels;\r\n labels.classList.add(\"labels\");\r\n\r\n // Sort arcs if not sorted yet\r\n if (t._sortedArcs === undefined)\r\n t._sortArcs();\r\n\r\n // 1. Draw all anchors\r\n t._sortedAnchors.forEach(\r\n i => t._drawAnchor(i)\r\n );\r\n\r\n // 2. Draw all arcs\r\n t._sortedArcs.forEach(\r\n i => t._drawArc(i)\r\n );\r\n\r\n // Resize the svg with some reasonable margins\r\n svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n svg.setAttribute(\"height\", height + 20);\r\n svg.setAttribute(\"class\", \"relTree\");\r\n }\r\n };\r\n\r\n // Sort relations regarding their span\r\n function lengthSort (list, inclusive) {\r\n\r\n /*\r\n * The \"inclusive\" flag allows to\r\n * modify the behaviour for inclusivity check,\r\n * e.g. if identical start or endpoints mean overlap or not.\r\n */\r\n \r\n let stack = [];\r\n\r\n // Iterate over all definitions\r\n list.forEach(function(current) {\r\n\r\n // Check the stack order\r\n let overlaps = 0;\r\n let check;\r\n for (let j = (stack.length - 1); j >= 0; j--) {\r\n check = stack[j];\r\n\r\n // (a..(b..b)..a)\r\n if (current.first <= check.first && current.last >= check.last) {\r\n overlaps = check.overlaps + 1;\r\n break;\r\n }\r\n\r\n // (a..(b..a)..b)\r\n else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n };\r\n }\r\n \r\n // (b..(a..b)..a)\r\n else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n };\r\n };\r\n };\r\n\r\n // Set overlaps\r\n current.overlaps = overlaps;\r\n\r\n stack.push(current);\r\n\r\n // Although it is already sorted,\r\n // the new item has to be put at the correct place\r\n // TODO:\r\n // Use something like splice() instead\r\n stack.sort(function (a,b) {\r\n b.overlaps - a.overlaps\r\n });\r\n });\r\n\r\n return stack;\r\n };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n 'view',\r\n 'match/treehierarchy',\r\n 'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n const d = document;\r\n const loc = KorAP.Locale;\r\n loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n \r\n return {\r\n create : function (match,foundry,layer,type) {\r\n return Object.create(viewClass)\r\n ._init(['relations'])\r\n .upgradeTo(this)\r\n ._init(match, foundry, layer, type);\r\n },\r\n\r\n\r\n // Initialize relations object\r\n _init : function (match,foundry, layer, type) {\r\n this._match = match;\r\n this._foundry = foundry;\r\n this._layer = layer;\r\n this._type = type;\r\n return this;\r\n },\r\n \r\n\r\n /**\r\n * Meta view element\r\n */\r\n show : function () {\r\n\r\n if (this._show)\r\n return this._show;\r\n\r\n const matchtree = d.createElement('div');\r\n matchtree.classList.add('matchtree', 'loading');\r\n\r\n // Add title line\r\n const h6 = matchtree.addE('h6');\r\n h6.addE('span').addT(this._foundry);\r\n h6.addE('span').addT(this._layer); \r\n\r\n this._tree = matchtree.addE('div');\r\n\r\n return this._show = matchtree;\r\n },\r\n\r\n\r\n /**\r\n * Do after embedding\r\n */\r\n afterEmbed : function () {\r\n\r\n const foundry = this._foundry,\r\n layer = this._layer,\r\n type = this._type;\r\n\r\n const that = this,\r\n tree = this._tree,\r\n matchtree = this._show;\r\n\r\n // Get tree data async\r\n this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n matchtree.classList.remove('loading');\r\n\r\n // Something went wrong - probably log!!!\r\n\r\n if (treeObj === null) {\r\n tree.addT('No data available.');\r\n }\r\n else {\r\n tree.appendChild(treeObj.element());\r\n treeObj.show();\r\n\r\n // Reposition the view to the center\r\n // (This may in a future release be a reposition\r\n // to move the root to the actual match)\r\n\r\n // This is currently not supported by relations\r\n if (type === \"spans\") {\r\n\r\n // Download link\r\n that.actions.add(\r\n loc.DOWNLOAD,\r\n {'cls':['button-icon','download']},\r\n function (e) {\r\n const a = treeObj.downloadLink();\r\n d.body.appendChild(a);\r\n a.click();\r\n d.body.removeChild(a)\r\n }\r\n );\r\n };\r\n \r\n treeObj.center();\r\n };\r\n });\r\n\r\n matchtree.classList.remove('loading');\r\n },\r\n\r\n /**\r\n * Get match object\r\n */\r\n match : function () {\r\n return this._match;\r\n },\r\n\r\n\r\n /**\r\n * Retrieve and parse snippet for relation\r\n * representation\r\n */\r\n getData : function (foundry, layer, type, cb) {\r\n var focus = [];\r\n\r\n try {\r\n // TODO: Support and cache multiple trees\r\n KorAP.API.getMatchInfo(\r\n this._match, {\r\n 'spans' : true,\r\n 'foundry' : foundry,\r\n 'layer' : layer\r\n },\r\n function (matchResponse) {\r\n if (matchResponse === undefined) {\r\n cb(null);\r\n return;\r\n };\r\n\r\n // Get snippet from match info\r\n if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n // Todo: This should be cached somehow\r\n\r\n if (type === \"spans\") {\r\n cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n }\r\n else if (type === \"rels\") {\r\n cb(matchTreeArcClass.create(matchResponse[\"snippet\"])); \r\n }\r\n\r\n // Unknown tree type\r\n else {\r\n cb(null);\r\n };\r\n }\r\n else {\r\n cb(null);\r\n };\r\n }.bind(this)\r\n );\r\n }\r\n catch (e) {\r\n KorAP.log(0, e);\r\n cb(null);\r\n };\r\n },\r\n \r\n\r\n // Delete circular references\r\n onClose : function () {\r\n this._match = undefined;\r\n }\r\n }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n 'panel',\r\n 'match/treeitem',\r\n 'view/match/tokentable',\r\n 'view/match/meta',\r\n 'view/match/relations',\r\n 'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n // Override \r\n KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n return {};\r\n };\r\n\r\n const loc = KorAP.Locale;\r\n\r\n loc.SHOWANNO = loc.SHOWANNO || 'Tokens';\r\n loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n loc.ADDTREE = loc.ADDTREE || 'Relations';\r\n\r\n return {\r\n create : function (match) {\r\n return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n },\r\n\r\n // Initialize match panel\r\n _init : function (match) {\r\n\r\n this._match = match;\r\n\r\n const a = this.actions;\r\n\r\n // TODO:\r\n // Ugly hack!\r\n const cl = a.element().classList;\r\n cl.remove('matchinfo');\r\n cl.add('button-matchinfo');\r\n\r\n // Add meta button\r\n a.add(\r\n loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n this.addMeta();\r\n }\r\n );\r\n\r\n // Add token annotation button\r\n a.add(\r\n loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n this.addTable();\r\n }\r\n );\r\n\r\n // Add relations button\r\n a.add(\r\n loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n // Get global tree menu\r\n if (KorAP.TreeMenu === undefined) {\r\n KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n };\r\n\r\n const tm = KorAP.TreeMenu;\r\n\r\n // Set panel\r\n tm.panel(this);\r\n\r\n // Reread list\r\n tm.readItems(this._treeMenuList());\r\n\r\n // Reposition and show menu\r\n tm.show();\r\n tm.button(this.button);\r\n tm.focus();\r\n }\r\n );\r\n\r\n // If plugins are enabled, add all buttons for the match panel\r\n if (KorAP.Plugin) {\r\n const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n if (matchButtons) {\r\n\r\n // Add all matchbuttons in order\r\n matchButtons.forEach(m => a.add.apply(a, m));\r\n };\r\n };\r\n\r\n return this;\r\n },\r\n\r\n \r\n /**\r\n * Add meta view to panel\r\n */\r\n addMeta : function () {\r\n const t = this;\r\n if (t._metaView && t._metaView.shown())\r\n return;\r\n\r\n t._metaView = metaView.create(t._match);\r\n t.add(t._metaView);\r\n },\r\n\r\n \r\n /**\r\n * Add table view to panel\r\n */\r\n addTable : function () {\r\n const t = this;\r\n if (t._tableView && t._tableView.shown())\r\n return;\r\n t._tableView = tableView.create(t._match);\r\n t.add(t._tableView);\r\n },\r\n\r\n\r\n /**\r\n * Add Tree view to panel\r\n */\r\n addTree : function (foundry, layer, type) {\r\n this.add(\r\n relationsView.create(this._match, foundry, layer, type)\r\n );\r\n \r\n },\r\n\r\n\r\n // Return tree menu list\r\n _treeMenuList : function () {\r\n \r\n if (this._menuList)\r\n return this._menuList;\r\n\r\n // Join spans and relations\r\n let treeLayers = []\r\n\r\n const match = this._match;\r\n match.getSpans().forEach(i => treeLayers.push(i));\r\n match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n // Get spans\r\n treeLayers = treeLayers.sort(\r\n function (a, b) {\r\n if (a.foundry < b.foundry) {\r\n return -1;\r\n }\r\n else if (a.foundry > b.foundry) {\r\n return 1;\r\n }\r\n else if (a.layer < b.layer) {\r\n return -1;\r\n }\r\n else if (a.layer > b.layer) {\r\n return 1;\r\n };\r\n return 0;\r\n });\r\n \r\n let menuList = [];\r\n \r\n // Show tree views\r\n treeLayers.forEach(\r\n s => \r\n // Add foundry/layer to menu list\r\n menuList.push([\r\n s.foundry + '/' + s.layer,\r\n s.foundry,\r\n s.layer,\r\n s.type\r\n ]));\r\n\r\n // Create tree menu\r\n this._menuList = menuList;\r\n return menuList;\r\n } \r\n }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n 'buttongroup',\r\n 'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n // Localization values\r\n const loc = KorAP.Locale;\r\n loc.MINIMIZE = loc.MINIMIZE || 'Minimize';\r\n \r\n // 'corpusID', 'docID', 'textID'\r\n const _matchTerms = ['textSigle', 'matchID', 'available'];\r\n\r\n const d = document;\r\n\r\n /**\r\n * Match object\r\n */\r\n return {\r\n\r\n /**\r\n * Create a new match object.\r\n * Expects an element with match descriptions.\r\n */\r\n create : function (match) {\r\n return Object.create(this)._init(match);\r\n },\r\n\r\n\r\n /**\r\n * Initialize match.\r\n */\r\n _init : function (match) {\r\n const t= this;\r\n t._el = null;\r\n t._initialized = false;\r\n\r\n // No match defined\r\n if (arguments.length < 1 ||\r\n match === null ||\r\n match === undefined) {\r\n throw new Error('Missing parameters');\r\n }\r\n\r\n // Match defined as a node\r\n else if (match instanceof Node) {\r\n t._el = match;\r\n\r\n // Circular reference !!\r\n match[\"_match\"] = t;\r\n\r\n if (match.hasAttribute('data-text-sigle')) {\r\n t.textSigle = match.getAttribute('data-text-sigle')\r\n }\r\n else {\r\n t.textSigle = match.getAttribute('data-corpus-id') +\r\n '/' +\r\n match.getAttribute('data-doc-id') +\r\n '/' +\r\n match.getAttribute('data-text-id');\r\n };\r\n\r\n t.matchID = match.getAttribute('data-match-id');\r\n \r\n // List of available annotations\r\n t.available = match.getAttribute('data-available-info').split(' ');\r\n }\r\n\r\n // Match as an object\r\n else {\r\n\r\n // Iterate over allowed match terms\r\n _matchTerms.forEach(function(term) {\r\n this[term] = match[term] !== undefined ? match[term] : undefined;\r\n }, t);\r\n };\r\n \r\n t._avail = {\r\n tokens : [],\r\n spans : [],\r\n rels : []\r\n };\r\n\r\n // Iterate over info layers\r\n let layer;\r\n t.available.forEach(function(term){\r\n\r\n // Create info layer objects\r\n try {\r\n layer = require('match/infolayer').create(term);\r\n this._avail[layer.type].push(layer);\r\n }\r\n catch (e) {\r\n return;\r\n };\r\n }, t);\r\n \r\n return t;\r\n },\r\n\r\n /**\r\n * Return a list of parseable tree annotations.\r\n */\r\n getSpans : function () {\r\n return this._avail.spans;\r\n },\r\n\r\n\r\n /**\r\n * Return a list of parseable token annotations.\r\n */\r\n getTokens : function () {\r\n return this._avail.tokens;\r\n },\r\n\r\n\r\n /**\r\n * Return a list of parseable relation annotations.\r\n */\r\n getRels : function () {\r\n return this._avail.rels;\r\n },\r\n\r\n /**\r\n * Initialize match\r\n */\r\n init : function () {\r\n const t = this;\r\n if (t._initialized)\r\n return t;\r\n\r\n // Add actions unless it's already activated\r\n const element = t._el;\r\n\r\n // There is an element to open\r\n if (element === undefined || element === null)\r\n return undefined;\r\n \r\n // Add meta button\r\n const refLine = element.querySelector(\"p.ref\");\r\n\r\n // No reference found\r\n if (!refLine)\r\n return undefined;\r\n\r\n // Create panel\r\n t.panel = matchPanelClass.create(t);\r\n\r\n t._el.insertBefore(\r\n t.panel.element(),\r\n t._el.querySelector(\"p.ref\")\r\n );\r\n\r\n // Insert before reference line\r\n refLine.insertBefore(\r\n t.panel.actions.element(),\r\n refLine.firstChild\r\n );\r\n\r\n t._initialized = true;\r\n return t;\r\n },\r\n\r\n /**\r\n * Open match\r\n */\r\n open : function () {\r\n \r\n // Add actions unless it's already activated\r\n const element = this._el;\r\n\r\n // There is an element to open\r\n if (element === undefined || element === null)\r\n return false;\r\n\r\n // The element is already opened\r\n if (element.classList.contains('active'))\r\n return false;\r\n \r\n // Add active class to element\r\n element.classList.add('active');\r\n\r\n const btn = buttonGroupClass.create(\r\n ['action','button-view']\r\n );\r\n\r\n const that = this;\r\n btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n that.minimize();\r\n });\r\n element.appendChild(btn.element());\r\n \r\n if (this.init() == undefined) {\r\n return false;\r\n };\r\n \r\n return true;\r\n },\r\n\r\n \r\n /**\r\n * Toggle match view\r\n */\r\n toggle : function () {\r\n if (this._el.classList.contains('active'))\r\n this.minimize();\r\n else\r\n this.open();\r\n },\r\n\r\n\r\n /**\r\n * Minimize info view\r\n */\r\n minimize : function () {\r\n this._el.classList.remove('active');\r\n },\r\n\r\n \r\n /**\r\n * Get match element.\r\n */\r\n element : function () {\r\n return this._el; // May be null\r\n }\r\n };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n return {\r\n\r\n /**\r\n * Create a new input field.\r\n */\r\n create : function (element) {\r\n return Object.create(this)._init(element);\r\n },\r\n\r\n\r\n // Initialize new input field\r\n _init : function (element) {\r\n this._el = element;\r\n\r\n this._container = document.createElement(\"div\");\r\n this._container.setAttribute('id', 'hint');\r\n\r\n // Create mirror for searchField\r\n // This is important for positioning\r\n // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n this._mirror = document.createElement(\"div\");\r\n const m = this._mirror;\r\n m.classList.add('hint', 'mirror');\r\n m.addE(\"span\");\r\n m.appendChild(this._container);\r\n m.style.height = \"0px\";\r\n document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n // Update position of the mirror\r\n const re = this.reposition.bind(this);\r\n window.addEventListener('resize', re);\r\n this._el.addEventListener('onfocus', re);\r\n this.reposition();\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Get the mirrored input field.\r\n */\r\n mirror : function () {\r\n return this._mirror;\r\n },\r\n\r\n\r\n /**\r\n * Get the container element.\r\n * This contains the hint helper / menus\r\n * and probably an\r\n * error message.\r\n */\r\n container : function () {\r\n return this._container;\r\n },\r\n\r\n\r\n /**\r\n * Get the input element the\r\n * hint helper is attached to.\r\n */\r\n element : function () {\r\n return this._el;\r\n },\r\n\r\n\r\n /**\r\n * Get the value of the input field\r\n * the hint helper is attached to.\r\n */\r\n value : function () {\r\n return this._el.value;\r\n },\r\n\r\n\r\n /**\r\n * Get the value of the input field mirror.\r\n */\r\n mirrorValue : function () {\r\n return this._mirror.firstChild.textContent;\r\n },\r\n\r\n\r\n /**\r\n * Reset the input value\r\n */\r\n reset : function () {\r\n this._el.value = \"\";\r\n },\r\n\r\n\r\n /**\r\n * Update the mirror content.\r\n */\r\n update : function () {\r\n this._mirror.firstChild.textContent = this._split()[0];\r\n this._container.style.left = this._rightPos() + 'px';\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Insert text into the mirror.\r\n * This is a prefix of the input field's\r\n * value.\r\n */\r\n insert : function (text) {\r\n const splittedText = this._split();\r\n const s = this._el;\r\n s.value = splittedText[0] + text + splittedText[1];\r\n s.selectionStart = (splittedText[0] + text).length;\r\n s.selectionEnd = s.selectionStart;\r\n\r\n // Maybe update?\r\n this._mirror.firstChild.textContent = splittedText[0] + text;\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Move hinthelper to given character position\r\n */\r\n moveto : function (charpos) {\r\n const e = this._el;\r\n e.selectionStart = charpos;\r\n e.selectionEnd = charpos;\r\n e.focus();\r\n return this.update();\r\n },\r\n\r\n\r\n /**\r\n * Reposition the input mirror directly\r\n * below the input box.\r\n */\r\n reposition : function () {\r\n const inputClientRect = this._el.getBoundingClientRect();\r\n const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n const bodyClientRect = \r\n document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n // Reset position\r\n const mirrorStyle = this._mirror.style;\r\n mirrorStyle.left = parseInt(inputClientRect.left) + \"px\";\r\n mirrorStyle.top = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n // These may be relevant in case of media depending css\r\n mirrorStyle.paddingLeft = inputStyle.getPropertyValue(\"padding-left\");\r\n mirrorStyle.marginLeft = inputStyle.getPropertyValue(\"margin-left\");\r\n mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n mirrorStyle.fontSize = inputStyle.getPropertyValue(\"font-size\");\r\n mirrorStyle.fontFamily = inputStyle.getPropertyValue(\"font-family\");\r\n },\r\n\r\n\r\n /**\r\n * Get the context, which is the input\r\n * field's value bounded to the\r\n * cursor position.\r\n */\r\n context : function () {\r\n return this._split()[0];\r\n },\r\n\r\n\r\n // Get the right position\r\n _rightPos : function () {\r\n const box = this._mirror.firstChild.getBoundingClientRect();\r\n return box.right - box.left;\r\n },\r\n\r\n\r\n /*\r\n * Return two substrings,\r\n * splitted at a given position\r\n * or at the current cursor position.\r\n */\r\n _split : function (start) {\r\n const s = this._el;\r\n const value = s.value;\r\n\r\n // Get start from cursor position\r\n if (arguments.length === 0)\r\n start = s.selectionStart;\r\n\r\n return new Array(\r\n value.substring(0, start),\r\n value.substring(start, value.length)\r\n );\r\n }\r\n }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n return {\r\n\r\n /**\r\n * Create new menu item object.\r\n */\r\n create : function (params) {\r\n return Object.create(itemClass)\r\n\t .upgradeTo(this)\r\n\t ._init(params);\r\n },\r\n\r\n // Initialize menu item object\r\n _init : function (params) {\r\n if (params[0] === undefined ||\r\n\t params[1] === undefined)\r\n\t throw new Error(\"Missing parameters\");\r\n \r\n this._name = params[0];\r\n this._action = params[1];\r\n this._lcField = ' ' + this._name.toLowerCase();\r\n \r\n if (params.length > 2) {\r\n\t this._desc = params[2];\r\n\t this._lcField += \" \" + this._desc.toLowerCase();\r\n };\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * Get or set the content of the item.\r\n */\r\n content : function (content) {\r\n if (arguments.length === 1) {\r\n\t this._content = content;\r\n };\r\n return this._content;\r\n },\r\n \r\n /**\r\n * Override the click action\r\n * of the menu item.\r\n */\r\n onclick : function (e) {\r\n var m = this.menu();\r\n // m.hide();\r\n\r\n // Reset prefix\r\n m.prefix(\"\");\r\n\r\n var h = m.hint();\r\n\r\n // Update input field\r\n var input = h.inputField();\r\n input.insert(this._action).update();\r\n\r\n e.halt();\r\n \r\n // show alt\r\n h.show(true);\r\n },\r\n\r\n /**\r\n * The name of the menu entry.\r\n */\r\n name : function () {\r\n return this._name;\r\n },\r\n\r\n /**\r\n * The action (the string inserted on click)\r\n * of the menu item.\r\n */\r\n action : function () {\r\n return this._action;\r\n },\r\n\r\n /**\r\n * The description of the menu item.\r\n */\r\n desc : function () {\r\n return this._desc;\r\n },\r\n\r\n /**\r\n * The associated dom element of the\r\n * menu item.\r\n */\r\n element : function () {\r\n // already defined\r\n if (this._el !== undefined)\r\n\t return this._el;\r\n\r\n // Create list item\r\n var li = document.createElement(\"li\");\r\n\r\n if (this.onclick !== undefined) {\r\n\t li[\"onclick\"] = this.onclick.bind(this);\r\n };\r\n\r\n // Create title\r\n var name = document.createElement(\"span\");\r\n name.addT(this._name);\r\n \r\n li.appendChild(name);\r\n\r\n // Create description\r\n if (this._desc !== undefined) {\r\n\t var desc = document.createElement(\"span\");\r\n\t desc.classList.add('desc');\r\n\t desc.addT(this._desc);\r\n\t li.appendChild(desc);\r\n };\r\n return this._el = li;\r\n }\r\n };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n return {\r\n\r\n /**\r\n * Create prefix object for the hint helper menu.\r\n */\r\n create : function (params) {\r\n return Object.create(prefixClass).\r\n\t upgradeTo(this)._init(params);\r\n },\r\n\r\n /**\r\n * Override the prefix action.\r\n */\r\n onclick : function (e) {\r\n const m = this.menu();\r\n const value = this.value();\r\n const h = m.hint();\r\n h.inputField().insert(value);\r\n h.active(null);\r\n m.hide();\r\n // h.unshow();\r\n e.halt();\r\n }\r\n };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n return {\r\n\r\n /**\r\n * Create lengthField object for the hint helper menu.\r\n */\r\n create : function () {\r\n return Object.create(lengthFieldClass).\r\n\t upgradeTo(this)._init();\r\n },\r\n\r\n /**\r\n * Override the prefix action.\r\n */\r\n add : function (param) {\r\n this._el.addE('span').addT(param[0] + '--');\r\n\r\n var desc = this._el.addE('span');\r\n desc.classList.add(\"desc\");\r\n desc.addT(param[2] + '--');\r\n this._el.appendChild(desc);\r\n }\r\n };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n 'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n menuClass,\r\n itemClass,\r\n prefixClass,\r\n lengthFieldClass) {\r\n\r\n return {\r\n \r\n /**\r\n * Create new hint helper menu.\r\n */\r\n create : function (hint, context, params) {\r\n const obj = Object.create(menuClass)\r\n\t .upgradeTo(this)\r\n\t ._init(params, {\r\n\t itemClass : itemClass,\r\n\t prefixClass : prefixClass,\r\n\t lengthFieldClass : lengthFieldClass\r\n\t });\r\n obj._context = context;\r\n obj._el.classList.add('hint');\r\n obj._hint = hint;\r\n\r\n // Make the top item always active\r\n obj._firstActive = true;\r\n\r\n obj.element().addEventListener('blur', function (e) {\r\n this.menu.hide(); // WithoutDestruction();\r\n });\r\n\r\n // Focus on input field on hide\r\n obj.onHide = function () {\r\n const h = this._hint;\r\n h._inputField.element().focus();\r\n if (h.active() !== null) {\r\n if (h._alert.active) {\r\n h._unshowAlert();\r\n };\r\n h.active(null);\r\n };\r\n };\r\n\r\n return obj;\r\n },\r\n\r\n /**\r\n * The hint helper object,\r\n * the menu is attached to.\r\n */ \r\n hint : function () {\r\n return this._hint;\r\n }\r\n };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n /**\r\n * Create analyzer based on regular expression.\r\n */\r\n create : function (regex) {\r\n return Object.create(this)._init(regex);\r\n },\r\n\r\n // Initialize analyzer\r\n _init : function (regex) {\r\n try {\r\n this._regex = new RegExp(regex);\r\n }\r\n catch (e) {\r\n KorAP.log(0, e);\r\n return;\r\n };\r\n return this;\r\n },\r\n\r\n /**\r\n * Check a context based on the analyzer\r\n * and return a valid context string.\r\n */\r\n test : function (text) {\r\n if (!this._regex.exec(text))\r\n return;\r\n return RegExp.$1;\r\n }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n return {\r\n\r\n /**\r\n * Construct a new alert object\r\n */\r\n create : function (msg) {\r\n return Object.create(this)._init(msg);\r\n },\r\n\r\n // Init\r\n _init : function (msg) {\r\n const t = this;\r\n t._type = 'alert';\r\n t.active = false;\r\n t._el = document.createElement('div');\r\n t._el.style.display = 'none';\r\n t._el.classList.add('alert', 'hint');\r\n return t;\r\n },\r\n\r\n\r\n /**\r\n * Show alert.\r\n */\r\n show : function (msg) {\r\n this.active = true;\r\n const e = this._el;\r\n e.textContent = msg;\r\n e.style.display = 'block';\r\n },\r\n\r\n\r\n /**\r\n * Hide alert.\r\n */\r\n hide : function () {\r\n if (!this.active)\r\n\t return false;\r\n this._el.style.display = 'none';\r\n this.active = false;\r\n return true;\r\n },\r\n\r\n\r\n /**\r\n * Get alert object.\r\n */\r\n element : function () {\r\n return this._el;\r\n }\r\n }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n * By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n * like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n 'hint/input',\r\n 'hint/menu',\r\n 'hint/contextanalyzer',\r\n 'hint/alert',\r\n 'util'\r\n], function (inputClass, \r\n menuClass,\r\n analyzerClass,\r\n alertClass) {\r\n\r\n // Initialize hint array\r\n\r\n /**\r\n * KorAP.Hint.create({\r\n * inputField : node,\r\n * context : context regex\r\n * });\r\n */\r\n return {\r\n\r\n /**\r\n * Create new hint helper.\r\n */\r\n create : function (param) {\r\n return Object.create(this)._init(param);\r\n },\r\n\r\n\r\n // Initialize hint helper\r\n _init : function (param) {\r\n param = param || {};\r\n\r\n // Holds all menus per prefix context\r\n this._menu = {};\r\n this._alert = alertClass.create();\r\n\r\n // Active may either hold an alert or a menu\r\n this._active = null;\r\n\r\n // No annotation helper available\r\n if (!KorAP.annotationHelper) {\r\n console.log(\"No annotationhelper defined\");\r\n return;\r\n };\r\n \r\n /**\r\n * @define {regex} Regular expression for context\r\n */\r\n KorAP.context = KorAP.context ||\r\n \"(?:^|[^-_a-zA-Z0-9])\" + // Anchor\r\n \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n \"(?:\" +\r\n \"(?:[-_a-zA-Z0-9]+?)=\" + // Layer\r\n \"(?:\"+\r\n \"(?:[^:=\\/ ]+?):|\" + // Key\r\n \"(?:[^-=\\/ ]+?)-\" + // Node\r\n \")?\" +\r\n \")?\" +\r\n \")$\";\r\n\r\n // Get input field\r\n const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n if (!qfield)\r\n return null;\r\n\r\n // Create input field\r\n this._inputField = inputClass.create(qfield);\r\n\r\n // create alert\r\n const that = this;\r\n\r\n const c = this._inputField.container();\r\n c.appendChild(this._alert.element());\r\n c.addEventListener('click', function (e) {\r\n if (!this.classList.contains('active')) {\r\n that.show(false);\r\n };\r\n });\r\n\r\n // Move infobox\r\n const inputFieldElement = this._inputField.element();\r\n inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n // Add event listener for key pressed down\r\n let _down = function (e) {\r\n if (_codeFromEvent(e) === 40) {\r\n this.show(false);\r\n e.halt();\r\n };\r\n };\r\n\r\n inputFieldElement.addEventListener(\r\n \"keydown\", _down.bind(this), false\r\n );\r\n\r\n // Add touch events\r\n inputFieldElement.addEventListener(\r\n 'touchstart',\r\n this._touch.bind(this),\r\n false\r\n );\r\n inputFieldElement.addEventListener(\r\n 'touchend',\r\n this._touch.bind(this),\r\n false\r\n );\r\n inputFieldElement.addEventListener(\r\n 'touchmove',\r\n this._touch.bind(this),\r\n false\r\n );\r\n\r\n // Set Analyzer for context\r\n this._analyzer = analyzerClass.create(\r\n param[\"context\"] || KorAP.context\r\n );\r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Return the input field attached to the hint helper.\r\n */\r\n inputField : function () {\r\n return this._inputField;\r\n },\r\n\r\n\r\n /**\r\n * Altert at a specific character position.\r\n */\r\n alert : function (charPos, msg) {\r\n const t = this;\r\n if (arguments.length === 0)\r\n return t._alert;\r\n\r\n // Do not alert if already alerted!\r\n if (t._alert.active)\r\n return false;\r\n\r\n // Move to the correct position\r\n t._inputField.moveto(charPos);\r\n\r\n // Set container to active (aka hide the hint helper button)\r\n\r\n t._alert.show(msg);\r\n t.active(t._alert);\r\n return true;\r\n },\r\n \r\n\r\n /**\r\n * Update input field.\r\n */\r\n update : function () {\r\n this._inputField.update();\r\n if (this._alert.hide())\r\n this.active(null);\r\n },\r\n\r\n\r\n /**\r\n * Return hint menu and probably init based on an action\r\n */\r\n menu : function (action) {\r\n if (this._menu[action] === undefined) {\r\n \r\n // No matching hint menu\r\n if (KorAP.annotationHelper[action] === undefined)\r\n return;\r\n\r\n // Create matching hint menu\r\n this._menu[action] = menuClass.create(\r\n this, action, KorAP.annotationHelper[action]\r\n );\r\n };\r\n\r\n // Return matching hint menu\r\n return this._menu[action];\r\n },\r\n\r\n\r\n /**\r\n * Get the correct menu based on the context\r\n */\r\n contextMenu : function (ifContext) {\r\n const noC = ifContext ? undefined : this.menu(\"-\");\r\n \r\n // Get context (aka left text)\r\n let context = this._inputField.context();\r\n\r\n if (context === undefined || context.length === 0) {\r\n return noC;\r\n };\r\n\r\n // Get context (aka left text matching regex)\r\n context = this._analyzer.test(context);\r\n\r\n if (context === undefined || context.length == 0) {\r\n return noC;\r\n };\r\n\r\n return this.menu(context) || noC;\r\n },\r\n\r\n\r\n /**\r\n * Activate a certain menu.\r\n * If a menu is passed, the menu will be activated.\r\n * If null is passed, the active menu will be deactivated.\r\n * If nothing is passed, returns the active menu.\r\n */\r\n active : function (obj) {\r\n \r\n // A menu or null was passed\r\n if (arguments.length === 1) { \r\n const c = this._inputField.container();\r\n \r\n // Make the menu active\r\n if (obj !== null) {\r\n c.classList.add('active');\r\n this._active = obj;\r\n }\r\n\r\n // Make the menu inactive\r\n else {\r\n c.classList.remove('active');\r\n this._active = null;\r\n }\r\n };\r\n\r\n // Return\r\n return this._active;\r\n },\r\n\r\n\r\n /**\r\n * Show the menu.\r\n * Remove all old menus.\r\n *\r\n * @param {boolean} Boolean value to indicate if context\r\n * is necessary (true) or if the main context should\r\n * be shown if context fails.\r\n * \r\n */\r\n show : function (ifContext) {\r\n\r\n // Remove the active object\r\n this._unshow();\r\n \r\n // Get the menu\r\n let menu;\r\n if (menu = this.contextMenu(ifContext)) {\r\n\r\n this.active(menu);\r\n\r\n let e = menu.element();\r\n // console.log(\"Chrome may send a blur on the old menu here\");\r\n this._active.element().blur();\r\n this._inputField.container().appendChild(e);\r\n\r\n menu.show();\r\n menu.focus();\r\n // Focus on input field\r\n // this.inputField.element.focus();\r\n }\r\n\r\n else {\r\n this._inputField.element().focus();\r\n };\r\n },\r\n \r\n\r\n // This will get the context of the field\r\n getContext : function () {},\r\n\r\n\r\n /**\r\n * Deactivate the current menu and focus on the input field.\r\n */\r\n unshow : function () {\r\n this._unshow();\r\n this._inputField.element().focus();\r\n },\r\n\r\n\r\n // Catch touch events\r\n _touch : function (e) {\r\n if (e.type === 'touchstart') {\r\n this._lastTouch = e.touches[0].clientY;\r\n }\r\n\r\n else if (e.type === 'touchend') {\r\n this._lastTouch = undefined;\r\n }\r\n \r\n else if (e.type == 'touchmove') {\r\n if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n this.show();\r\n this._lastTouch = undefined;\r\n };\r\n e.halt();\r\n }\r\n },\r\n\r\n\r\n // Unshow the hint menu\r\n _unshow : function () {\r\n if (this.active() !== null) {\r\n \r\n // This does not work for alert currently!\r\n if (!this._alert.active) {\r\n\r\n // TODO: This does not work for webkit?\r\n this._inputField\r\n .container()\r\n .removeChild(this._active.element());\r\n }\r\n\r\n else {\r\n this._unshowAlert();\r\n };\r\n \r\n this.active(null);\r\n };\r\n },\r\n\r\n // Unshow alert\r\n _unshowAlert : function () {\r\n this._alert.hide();\r\n this.active(null);\r\n }\r\n };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n /**\r\n * Create a new session.\r\n * Expects a name or defaults to 'korap'\r\n */\r\n create : function (name = 'korap') {\r\n const obj = Object.create(this);\r\n obj._name = name.toLowerCase();\r\n obj._hash = {};\r\n obj._parse();\r\n return obj;\r\n },\r\n\r\n\r\n /**\r\n * Get a value based on a key.\r\n * The value can be complex, as the value is stored as JSON.\r\n */\r\n get : function (key) {\r\n return this._hash[key.toLowerCase()];\r\n },\r\n\r\n\r\n /**\r\n * Set a value based on a key.\r\n * The value can be complex, as the value is stored as JSON.\r\n */\r\n set : function (key, value) {\r\n this._hash[key] = value;\r\n this._store();\r\n },\r\n\r\n\r\n /**\r\n * Clears the session by removing the cookie\r\n */\r\n clear : function () {\r\n this._hash = {};\r\n document.cookie = this._name + '=; expires=-1';\r\n },\r\n\r\n\r\n /* Store cookie */\r\n _store : function () {\r\n document.cookie = this.toString();\r\n },\r\n\r\n\r\n /**\r\n * Stringify session cookie.\r\n */\r\n toString : function () {\r\n /*\r\n var date = new Date();\r\n date.setYear(date.getFullYear() + 1);\r\n */\r\n return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n },\r\n\r\n\r\n /**\r\n * Parse cookie\r\n */\r\n _parse : function () {\r\n document.cookie.split(';').forEach(\r\n function (i) {\r\n const pair = i.split('=');\r\n const name = pair[0].trim().toLowerCase();\r\n if (name === this._name) {\r\n\t if (pair.length === 1 || pair[1].length === 0)\r\n\t return;\r\n this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t return;\r\n };\r\n },\r\n this);\r\n }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n// http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n // Localization values\r\n const loc = KorAP.Locale;\r\n loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n const d = document;\r\n \r\n return {\r\n\r\n /**\r\n * Create new tutorial object.\r\n * Accepts an element to bind the tutorial window to.\r\n */\r\n create : function (obj,session) {\r\n if (!obj)\r\n\t return null;\r\n return Object.create(this)._init(obj,session);\r\n },\r\n\r\n\r\n // Initialize Tutorial object\r\n _init : function (obj, session) {\r\n const t = this;\r\n\r\n if (session === undefined) {\r\n\t t._session = sessionClass.create();\r\n }\r\n else {\r\n\t t._session = session;\r\n };\r\n \r\n if (obj) {\r\n\t t._show = obj;\r\n\t t.start = obj.getAttribute('href');\r\n\r\n // Unknown which tutorial to show\r\n if (!t.start)\r\n return null;\r\n \r\n\t obj.removeAttribute('href');\r\n\r\n\t obj.onclick = function () {\r\n\t this.show();\r\n\t }.bind(t);\r\n\r\n\t // Injects a tutorial div to the body\r\n\t const div = d.createElement('div');\r\n\t div.setAttribute('id', 'tutorial');\r\n\t div.style.display = 'none';\r\n\t d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t t._iframe = null;\r\n\t t._el = div;\r\n\r\n\t // Some fields\r\n\t t._ql = d.getElementById(\"ql-field\");\r\n\t t._q = d.getElementById(\"q-field\")\r\n\t t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n };\r\n\r\n return t;\r\n },\r\n\r\n\r\n /**\r\n * Initialize a search with a defined query.\r\n */\r\n useQuery : function (e) {\r\n const t = this;\r\n const q = e.getAttribute(\"data-query\"),\r\n ql = e.getAttribute(\"data-query-language\"),\r\n qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n if (t._cuttoff)\r\n\t t._cutoff.checked = true;\r\n };\r\n\r\n if (KorAP.QLmenu) {\r\n KorAP.QLmenu.selectValue(ql);\r\n }\r\n\r\n else if (t._ql) {\r\n let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n if (found)\r\n found.selected = true;\r\n };\r\n\r\n if (t._q)\r\n t._q.value = q;\r\n\r\n t.setPage(e);\r\n t.hide();\r\n },\r\n\r\n\r\n /**\r\n * Decorate a page with query event handler.\r\n */\r\n initQueries : function (d) {\r\n let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');\r\n const that = this;\r\n for (var i = 0; i < qs.length; i++) {\r\n\t qs[i].onclick = function (e) {\r\n\t that.useQuery(this,e);\r\n\t };\r\n };\r\n },\r\n\r\n /**\r\n * Decorate a page with documentation links\r\n */\r\n initDocLinks : function (d) {\r\n const that = this;\r\n Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t i =>\r\n i.onclick = function () {\r\n\t that.setPage(this.getAttribute('href'));\r\n\t return true;\r\n\t }\r\n );\r\n },\r\n\r\n\r\n /**\r\n * Show the tutorial page embedded.\r\n */\r\n show : function () {\r\n const t = this;\r\n const element = t._el;\r\n if (element.style.display === 'block')\r\n\t return;\r\n\r\n if (t._iframe === null) {\r\n\t t._iframe = d.createElement('iframe');\r\n\t t._iframe.setAttribute(\r\n\t 'src',\r\n\t (t.getPage() || t.start) + '?embedded=true'\r\n\t );\r\n\r\n const btn = buttonGroupClass.create(\r\n ['action','button-view']\r\n );\r\n\r\n btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n element.style.display = 'none';\r\n });\r\n\r\n element.appendChild(btn.element());\r\n\r\n\t // Add open in new window button\r\n\t // Add scroll to top button\r\n\t /*\r\n\t var info = document.createElement('li');\r\n\t info.appendChild(document.createElement('span'))\r\n\t .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t info.classList.add('info');\r\n\t info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t ul.appendChild(close);\r\n\t element.appendChild(ul);\r\n */\r\n\t element.appendChild(t._iframe);\r\n };\r\n\r\n element.style.display = 'block';\r\n },\r\n\r\n\r\n /**\r\n * Close tutorial window.\r\n */\r\n hide : function () {\r\n this._el.style.display = 'none';\r\n },\r\n\r\n\r\n /**\r\n * Set a page to be the current tutorial page.\r\n * Expects either a string or an element.\r\n */\r\n setPage : function (obj) {\r\n let page = obj;\r\n\r\n if (typeof page != 'string') {\r\n\t const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t page = l.pathname + l.search;\r\n\r\n\t for (let i = 1; i < 5; i++) {\r\n\t if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t page += '#' + obj.getAttribute('id');\r\n\t break;\r\n\t }\r\n\t else {\r\n\t obj = obj.parentNode;\r\n if (obj === null)\r\n break;\r\n\t };\r\n\t };\r\n };\r\n\r\n this._session.set('tutpage', page);\r\n },\r\n\r\n\r\n /**\r\n * Get the current tutorial URL\r\n */\r\n getPage : function () {\r\n return this._session.get('tutpage');\r\n }\r\n };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n window: false, clearInterval: false, document: false,\r\n self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n 'use strict';\r\n\r\n var isTop, testDiv, scrollIntervalId,\r\n isBrowser = typeof window !== \"undefined\" && window.document,\r\n isPageLoaded = !isBrowser,\r\n doc = isBrowser ? document : null,\r\n readyCalls = [];\r\n\r\n function runCallbacks(callbacks) {\r\n var i;\r\n for (i = 0; i < callbacks.length; i += 1) {\r\n callbacks[i](doc);\r\n }\r\n }\r\n\r\n function callReady() {\r\n var callbacks = readyCalls;\r\n\r\n if (isPageLoaded) {\r\n //Call the DOM ready callbacks\r\n if (callbacks.length) {\r\n readyCalls = [];\r\n runCallbacks(callbacks);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the page as loaded.\r\n */\r\n function pageLoaded() {\r\n if (!isPageLoaded) {\r\n isPageLoaded = true;\r\n if (scrollIntervalId) {\r\n clearInterval(scrollIntervalId);\r\n }\r\n\r\n callReady();\r\n }\r\n }\r\n\r\n if (isBrowser) {\r\n if (document.addEventListener) {\r\n //Standards. Hooray! Assumption here that if standards based,\r\n //it knows about DOMContentLoaded.\r\n document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n window.addEventListener(\"load\", pageLoaded, false);\r\n } else if (window.attachEvent) {\r\n window.attachEvent(\"onload\", pageLoaded);\r\n\r\n testDiv = document.createElement('div');\r\n try {\r\n isTop = window.frameElement === null;\r\n } catch (e) {}\r\n\r\n //DOMContentLoaded approximation that uses a doScroll, as found by\r\n //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n //but modified by other contributors, including jdalton\r\n if (testDiv.doScroll && isTop && window.external) {\r\n scrollIntervalId = setInterval(function () {\r\n try {\r\n testDiv.doScroll();\r\n pageLoaded();\r\n } catch (e) {}\r\n }, 30);\r\n }\r\n }\r\n\r\n //Check if document already complete, and if so, just trigger page load\r\n //listeners. Latest webkit browsers also use \"interactive\", and\r\n //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n //entering \"interactive\" or \"complete\". More details:\r\n //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n //Hmm, this is more complicated on further use, see \"firing too early\"\r\n //bug: https://github.com/requirejs/domReady/issues/1\r\n //so removing the || document.readyState === \"interactive\" test.\r\n //There is still a window.onload binding that should get fired if\r\n //DOMContentLoaded is missed.\r\n if (document.readyState === \"complete\") {\r\n pageLoaded();\r\n }\r\n }\r\n\r\n /** START OF PUBLIC API **/\r\n\r\n /**\r\n * Registers a callback for DOM ready. If DOM is already ready, the\r\n * callback is called immediately.\r\n * @param {Function} callback\r\n */\r\n function domReady(callback) {\r\n if (isPageLoaded) {\r\n callback(doc);\r\n } else {\r\n readyCalls.push(callback);\r\n }\r\n return domReady;\r\n }\r\n\r\n domReady.version = '2.0.1';\r\n\r\n /**\r\n * Loader Plugin API method\r\n */\r\n domReady.load = function (name, req, onLoad, config) {\r\n if (config.isBuild) {\r\n onLoad(null);\r\n } else {\r\n domReady(onLoad);\r\n }\r\n };\r\n\r\n /** END OF PUBLIC API **/\r\n\r\n return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n return [\r\n // layerInfo // stored\r\n // tokenSource // stored\r\n ['author', 'text'], // text\r\n // ['biblEditionStatement', 'string'], // stored\r\n ['corpusAuthor', 'text'], // text\r\n // ['corpusEditor', 'string'], // stored\r\n ['corpusSigle', 'string'], // string \r\n ['corpusSubTitle', 'text'] , // text\r\n ['corpusTitle', 'text'], // text\r\n ['creationDate', 'date'], // int\r\n ['docAuthor', 'text'], // text\r\n // ['docEditor', 'string'], // stored\r\n ['docSigle', 'string'], // string\r\n ['docSubTitle', 'text'], // text\r\n ['docTitle', 'text'], // text\r\n // ['editor', 'string'], // stored\r\n // ['fileEditionStatement', 'string'], // stored\r\n ['foundries', 'string'], // keywords\r\n ['keywords', 'string'], // keywords\r\n ['language', 'string'], // string\r\n ['license', 'string'], // string\r\n // ['pages', 'string'], // stored\r\n ['pubDate', 'date'], // int\r\n // ['publisher', 'string'], // stored\r\n ['pubPlace', 'string'], // string\r\n // ['reference', 'string'], // stored\r\n ['subTitle', 'text'], // text\r\n ['textClass', 'string'], // keyword\r\n ['textColumn', 'string'], // string\r\n ['textDomain', 'string'], // string\r\n ['textSigle', 'string'], // string\r\n ['textType', 'string'], // string\r\n ['textTypeArt', 'string'], // string\r\n ['textTypeRef', 'string'], // string\r\n ['title', 'text'] // text\r\n ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t dialogs = {},\r\n\t\t isopen = false,\r\n\t\t keys = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t queue = [],\r\n\t\t $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String} Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t type,\r\n\t\t\t supported = false,\r\n\t\t\t el = document.createElement(\"fakeelement\"),\r\n\t\t\t transitions = {\r\n\t\t\t\t \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t \"MozTransition\" : \"transitionend\",\r\n\t\t\t\t \"OTransition\" : \"otransitionend\",\r\n\t\t\t\t \"transition\" : \"transitionend\"\r\n\t\t\t };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param {String} id A specific element ID\r\n\t\t * @return {Object} HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t hasInput = (typeof input !== \"undefined\"),\r\n\t\t\t\t val = \"\",\r\n\t\t\t\t self = this,\r\n\t\t\t\t ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param {Object} el HTML Object\r\n\t\t\t * @param {Event} event Event to attach to element\r\n\t\t\t * @param {Function} fn Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary The secondary button HTML string\r\n\t\t\t * @param {String} primary The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String} The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param {Object} item Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String} An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html = \"\",\r\n\t\t\t\t type = item.type,\r\n\t\t\t\t message = item.message,\r\n\t\t\t\t css = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param {Object} elem HTML Element of log message to close\r\n\t\t\t * @param {Number} wait [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t self = this,\r\n\t\t\t\t hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param {String} message The message passed from the callee\r\n\t\t\t * @param {String} type Type of dialog to create\r\n\t\t\t * @param {Function} fn [Optional] Callback function\r\n\t\t\t * @param {String} placeholder [Optional] Default value for prompt input field\r\n\t\t\t * @param {String} cssClass [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param {String} type Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param {String} message The message passed from the callee\r\n\t\t\t * @param {String} type [Optional] Optional type of log message\r\n\t\t\t * @param {Number} wait [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param {String} message The message passed from the callee\r\n\t\t\t * @param {String} type [Optional] Type of log message\r\n\t\t\t * @param {Number} wait [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t self = this,\r\n\t\t\t\t transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK = $(\"alertify-ok\") || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput = $(\"alertify-text\") || undefined;\r\n\t\t\t\tform = $(\"alertify-form\") || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param {Object} el HTML Object\r\n\t\t\t * @param {Event} event Event to detach to element\r\n\t\t\t * @param {Function} fn Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend : _alertify.extend,\r\n\t\t\tinit : _alertify.init,\r\n\t\t\tlog : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset : function (args) { _alertify.set(args); },\r\n\t\t\tlabels : _alertify.labels,\r\n\t\t\tdebug : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n /**\r\n * Menu item for select menus.\r\n */\r\n return {\r\n\r\n /**\r\n * Create new menu item\r\n * for tree views.\r\n */\r\n create : function (params) {\r\n return Object.create(itemClass)\r\n\t .upgradeTo(this)._init(params);\r\n },\r\n\r\n\r\n /**\r\n * Override click action of the menu item.\r\n */\r\n onclick : function (e) {\r\n var menu = this.menu();\r\n menu.hide();\r\n // Index was set on initialization\r\n menu.select(this._index);\r\n menu.showTitle();\r\n e.halt();\r\n },\r\n\r\n\r\n /**\r\n * Get title of item.\r\n */\r\n title : function () {\r\n return this.content().textContent;\r\n }\r\n };\r\n});\r\n\n\r\n\r\ndefine(\r\n 'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n function (menuClass, selectMenuItemClass) {\r\n\r\n return {\r\n create : function (element) {\r\n\r\n\t const select = element.getElementsByTagName('select')[0];\r\n\r\n if (select === null)\r\n return;\r\n\r\n\t // Prepare list before object upgras\r\n\t const list = [];\r\n\r\n // Iterate through options list\r\n // Get option item and add to list\r\n Array.from(\r\n select.getElementsByTagName('option')\r\n ).forEach(function(item) {\r\n \r\n\t const opt = [\r\n\t item.textContent,\r\n\t item.getAttribute('value')\r\n\t ];\r\n\r\n // If the item has an attribute - list\r\n\t if (item.hasAttribute('desc'))\r\n\t opt.push(item.getAttribute('desc'));\r\n\r\n\t list.push(opt);\r\n\t });\r\n\r\n\t // Create object with list\r\n\t const obj = Object.create(menuClass).upgradeTo(this)\r\n\t ._init(\r\n list, {\r\n\t itemClass : selectMenuItemClass\r\n\t }\r\n );\r\n \r\n\t obj._container = element;\r\n\t obj._select = select;\r\n\t select.style.display = 'none';\r\n\r\n\t // Create title\r\n\t obj._title = obj._container.addE('span');\r\n\t obj._title.addT('');\r\n\r\n obj._container.appendChild(obj.element());\r\n\r\n // Show the menu\r\n\t obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t // Add index information to each item\r\n\t obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t // This is only domspecific\r\n\t obj.element().addEventListener('blur', function (e) {\r\n\t this.menu.hide();\r\n\t this.menu.showTitle();\r\n\t });\r\n\r\n\t // In case another tool changes\r\n\t // the option via JS - this needs\r\n\t // to be reflected!\r\n\t select.addEventListener('change', function (e) {\r\n\t this.showTitle();\r\n\t }.bind(obj));\r\n\r\n\t obj.showTitle();\r\n\t return obj;\r\n },\r\n\r\n /**\r\n * Get or set the selection index\r\n */\r\n select : function (index) {\r\n const t = this;\r\n\t if (arguments.length > 0) {\r\n\t t._selected = index;\r\n\t t._select.selectedIndex = index;\r\n\t };\r\n\r\n\t return t._selected || t._select.selectedIndex || 0;\r\n },\r\n\r\n\r\n /**\r\n * Set the select value\r\n */\r\n selectValue : function (vParam) {\r\n const t = this;\r\n const qlf = t._select.options;\r\n for (let i = 0; i < qlf.length; i++) {\r\n\t if (qlf[i].value == vParam) {\r\n t.hide();\r\n t.select(i);\r\n t.showTitle();\r\n break;\r\n\t };\r\n };\r\n return t;\r\n },\r\n \r\n\r\n /**\r\n * Show the select menu\r\n */\r\n showSelected : function () {\r\n const t = this;\r\n\t t._title.style.display = 'none';\r\n\t t.show(t._selected = t._select.selectedIndex);\r\n\t t.focus();\r\n },\r\n\r\n\r\n /**\r\n * Show the title\r\n */\r\n showTitle : function () {\r\n\r\n // Get the selection context\r\n const t = this;\r\n\t const s = t.select();\r\n\t t._title.textContent = t.item(\r\n\t t.select()\r\n\t ).title();\r\n\t t._title.style.display = 'inline';\r\n }\r\n }\r\n }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n 'view',\r\n 'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n return {\r\n create : function (classes) {\r\n return Object.create(viewClass)\r\n ._init(classes)\r\n .upgradeTo(this);\r\n },\r\n\r\n /**\r\n * KoralQuery view element\r\n */\r\n show : function () {\r\n if (this._show)\r\n return this._show;\r\n\r\n const kq = document.createElement('div');\r\n kq.setAttribute('id', 'koralquery');\r\n\r\n const kqInner = kq.addE('div');\r\n\r\n kqInner.addT(\r\n JSON.stringify(KorAP.koralQuery || {}, null, ' ')\r\n );\r\n \r\n // Highlight the view\r\n hljs.highlightBlock(kqInner);\r\n\r\n this._show = kq;\r\n return kq;\r\n }\r\n }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n 'panel',\r\n 'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n const d = document;\r\n\r\n // Localization values\r\n const loc = KorAP.Locale;\r\n loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n loc.SHOW_KQ = loc.SHOW_KQ || 'show KoralQuery';\r\n\r\n const aRoll = ['left', 'right','center'];\r\n \r\n return {\r\n create : function (opened) {\r\n return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n },\r\n\r\n // Initialize panel\r\n _init : function (opened) {\r\n this._opened = opened;\r\n\r\n // If plugins are enabled, add all buttons for the result panel\r\n if (KorAP.Plugin) {\r\n\r\n // Add all result buttons in order\r\n KorAP.Plugin\r\n .buttonGroup(\"result\")\r\n .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n KorAP.Plugin.clearButtonGroup(\"result\");\r\n };\r\n \r\n this.prepend = true;\r\n \r\n return this;\r\n },\r\n\r\n\r\n /**\r\n * Add KoralQuery action to panel\r\n */\r\n addKqAction : function () {\r\n\r\n // Open KoralQuery view\r\n const kqButton = this.actions.add(\r\n loc.SHOW_KQ,\r\n {'cls':['show-kq','button-icon']},\r\n function () {\r\n\r\n const t = this;\r\n\r\n // Show only once - otherwise toggle\r\n if (t._kq && t._kq.shown()) {\r\n t._kq.close();\r\n return;\r\n };\r\n \r\n t._kq = kqViewClass.create();\r\n\r\n // On close, remove session info on KQ\r\n t._kq.onClose = function () {\r\n delete this._opened['kq'];\r\n }.bind(t);\r\n\r\n t._opened['kq'] = true;\r\n t.add(t._kq);\r\n }\r\n );\r\n\r\n // Show KoralQuery in case it's meant to be shown\r\n if (this._opened['kq'])\r\n kqButton.click();\r\n },\r\n\r\n\r\n /**\r\n * Add align action to panel\r\n */\r\n addAlignAction : function () {\r\n /**\r\n * Toggle the alignment (left <=> right)\r\n */\r\n this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n var olCl = d.querySelector('#search > ol').classList;\r\n\r\n aRoll.find(function(align, i) {\r\n if (olCl.contains('align-' + align)) {\r\n const n = i >= 2 ? 0 : i+1;\r\n const nn = n >= 2 ? 0 : n+1;\r\n olCl.remove('align-' + align);\r\n olCl.add('align-' + aRoll[n]);\r\n this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n return true;\r\n };\r\n }, this);\r\n }); \r\n }\r\n }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n 'panel'\r\n], function (panelClass) {\r\n\r\n const d = document;\r\n\r\n // Localization values\r\n const loc = KorAP.Locale;\r\n \r\n return {\r\n create : function (opened) {\r\n return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n },\r\n\r\n // Initialize panel\r\n _init : function (opened) {\r\n this._opened = opened;\r\n const a = this.actions;\r\n \r\n // If plugins are enabled, add all buttons for the query panel\r\n if (KorAP.Plugin) {\r\n\r\n // Add all matchbuttons in order\r\n KorAP.Plugin\r\n .buttonGroup(\"query\")\r\n .forEach(i => a.add.apply(a, i));\r\n\r\n KorAP.Plugin.clearButtonGroup(\"query\")\r\n };\r\n \r\n return this;\r\n }\r\n }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n module.exports = f();\r\n // deprecated function\r\n // @since 2.8.0\r\n module.exports.introJs = function () {\r\n console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n // introJs()\r\n return f().apply(this, arguments);\r\n };\r\n } else if (typeof define === \"function\" && define.amd) {\r\n define('lib/intro',[], f);\r\n } else {\r\n var g;\r\n if (typeof window !== \"undefined\") {\r\n g = window;\r\n } else if (typeof global !== \"undefined\") {\r\n g = global;\r\n } else if (typeof self !== \"undefined\") {\r\n g = self;\r\n } else {\r\n g = this;\r\n }\r\n g.introJs = f();\r\n }\r\n})(function () {\r\n //Default config/variables\r\n var VERSION = '2.9.3';\r\n\r\n /**\r\n * IntroJs main class\r\n *\r\n * @class IntroJs\r\n */\r\n function IntroJs(obj) {\r\n this._targetElement = obj;\r\n this._introItems = [];\r\n\r\n this._options = {\r\n /* Next button label in tooltip box */\r\n nextLabel: 'Next &rarr;',\r\n /* Previous button label in tooltip box */\r\n prevLabel: '&larr; Back',\r\n /* Skip button label in tooltip box */\r\n skipLabel: 'Skip',\r\n /* Done button label in tooltip box */\r\n doneLabel: 'Done',\r\n /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n hidePrev: false,\r\n /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n hideNext: false,\r\n /* Default tooltip box position */\r\n tooltipPosition: 'bottom',\r\n /* Next CSS class for tooltip boxes */\r\n tooltipClass: '',\r\n /* CSS class that is added to the helperLayer */\r\n highlightClass: '',\r\n /* Close introduction when pressing Escape button? */\r\n exitOnEsc: true,\r\n /* Close introduction when clicking on overlay layer? */\r\n exitOnOverlayClick: true,\r\n /* Show step numbers in introduction? */\r\n showStepNumbers: true,\r\n /* Let user use keyboard to navigate the tour? */\r\n keyboardNavigation: true,\r\n /* Show tour control buttons? */\r\n showButtons: true,\r\n /* Show tour bullets? */\r\n showBullets: true,\r\n /* Show tour progress? */\r\n showProgress: false,\r\n /* Scroll to highlighted element? */\r\n scrollToElement: true,\r\n /*\r\n * Should we scroll the tooltip or target element?\r\n *\r\n * Options are: 'element' or 'tooltip'\r\n */\r\n scrollTo: 'element',\r\n /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n scrollPadding: 30,\r\n /* Set the overlay opacity */\r\n overlayOpacity: 0.8,\r\n /* Precedence of positions, when auto is enabled */\r\n positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n /* Disable an interaction with element? */\r\n disableInteraction: false,\r\n /* Set how much padding to be used around helper element */\r\n helperElementPadding: 10,\r\n /* Default hint position */\r\n hintPosition: 'top-middle',\r\n /* Hint button label */\r\n hintButtonLabel: 'Got it',\r\n /* Adding animation to hints? */\r\n hintAnimation: true,\r\n /* additional classes to put on the buttons */\r\n buttonClass: \"introjs-button\"\r\n };\r\n }\r\n\r\n /**\r\n * Initiate a new introduction/guide from an element in the page\r\n *\r\n * @api private\r\n * @method _introForElement\r\n * @param {Object} targetElm\r\n * @param {String} group\r\n * @returns {Boolean} Success or not?\r\n */\r\n function _introForElement(targetElm, group) {\r\n var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n introItems = [];\r\n\r\n if (this._options.steps) {\r\n //use steps passed programmatically\r\n _forEach(this._options.steps, function (step) {\r\n var currentItem = _cloneObject(step);\r\n\r\n //set the step\r\n currentItem.step = introItems.length + 1;\r\n\r\n //use querySelector function only when developer used CSS selector\r\n if (typeof (currentItem.element) === 'string') {\r\n //grab the element with given selector from the page\r\n currentItem.element = document.querySelector(currentItem.element);\r\n }\r\n\r\n //intro without element\r\n if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n if (floatingElementQuery === null) {\r\n floatingElementQuery = document.createElement('div');\r\n floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n document.body.appendChild(floatingElementQuery);\r\n }\r\n\r\n currentItem.element = floatingElementQuery;\r\n currentItem.position = 'floating';\r\n }\r\n\r\n currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n currentItem.disableInteraction = this._options.disableInteraction;\r\n }\r\n\r\n if (currentItem.element !== null) {\r\n introItems.push(currentItem);\r\n } \r\n }.bind(this));\r\n\r\n } else {\r\n //use steps from data-* annotations\r\n var elmsLength = allIntroSteps.length;\r\n var disableInteraction;\r\n \r\n //if there's no element to intro\r\n if (elmsLength < 1) {\r\n return false;\r\n }\r\n\r\n _forEach(allIntroSteps, function (currentElement) {\r\n \r\n // PR #80\r\n // start intro for groups of elements\r\n if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n return;\r\n }\r\n\r\n // skip hidden elements\r\n if (currentElement.style.display === 'none') {\r\n return;\r\n }\r\n\r\n var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n } else {\r\n disableInteraction = this._options.disableInteraction;\r\n }\r\n\r\n if (step > 0) {\r\n introItems[step - 1] = {\r\n element: currentElement,\r\n intro: currentElement.getAttribute('data-intro'),\r\n step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n disableInteraction: disableInteraction\r\n };\r\n }\r\n }.bind(this));\r\n\r\n //next add intro items without data-step\r\n //todo: we need a cleanup here, two loops are redundant\r\n var nextStep = 0;\r\n\r\n _forEach(allIntroSteps, function (currentElement) {\r\n \r\n // PR #80\r\n // start intro for groups of elements\r\n if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n return;\r\n }\r\n \r\n if (currentElement.getAttribute('data-step') === null) {\r\n\r\n while (true) {\r\n if (typeof introItems[nextStep] === 'undefined') {\r\n break;\r\n } else {\r\n nextStep++;\r\n }\r\n } \r\n\r\n if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n } else {\r\n disableInteraction = this._options.disableInteraction;\r\n }\r\n\r\n introItems[nextStep] = {\r\n element: currentElement,\r\n intro: currentElement.getAttribute('data-intro'),\r\n step: nextStep + 1,\r\n tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n disableInteraction: disableInteraction\r\n };\r\n }\r\n }.bind(this));\r\n }\r\n\r\n //removing undefined/null elements\r\n var tempIntroItems = [];\r\n for (var z = 0; z < introItems.length; z++) {\r\n if (introItems[z]) {\r\n // copy non-falsy values to the end of the array\r\n tempIntroItems.push(introItems[z]); \r\n } \r\n }\r\n\r\n introItems = tempIntroItems;\r\n\r\n //Ok, sort all items with given steps\r\n introItems.sort(function (a, b) {\r\n return a.step - b.step;\r\n });\r\n\r\n //set it to the introJs object\r\n this._introItems = introItems;\r\n\r\n //add overlay layer to the page\r\n if(_addOverlayLayer.call(this, targetElm)) {\r\n //then, start the show\r\n _nextStep.call(this);\r\n\r\n if (this._options.keyboardNavigation) {\r\n DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n }\r\n //for window resize\r\n DOMEvent.on(window, 'resize', _onResize, this, true);\r\n }\r\n return false;\r\n }\r\n\r\n function _onResize () {\r\n this.refresh.call(this);\r\n }\r\n\r\n /**\r\n * on keyCode:\r\n * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n * This feature has been removed from the Web standards.\r\n * Though some browsers may still support it, it is in\r\n * the process of being dropped.\r\n * Instead, you should use KeyboardEvent.code,\r\n * if it's implemented.\r\n *\r\n * jQuery's approach is to test for\r\n * (1) e.which, then\r\n * (2) e.charCode, then\r\n * (3) e.keyCode\r\n * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n *\r\n * @param type var\r\n * @return type\r\n */\r\n function _onKeyDown (e) {\r\n var code = (e.code === null) ? e.which : e.code;\r\n\r\n // if code/e.which is null\r\n if (code === null) {\r\n code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n }\r\n \r\n if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n //escape key pressed, exit the intro\r\n //check if exit callback is defined\r\n _exitIntro.call(this, this._targetElement);\r\n } else if (code === 'ArrowLeft' || code === 37) {\r\n //left arrow\r\n _previousStep.call(this);\r\n } else if (code === 'ArrowRight' || code === 39) {\r\n //right arrow\r\n _nextStep.call(this);\r\n } else if (code === 'Enter' || code === 13) {\r\n //srcElement === ie\r\n var target = e.target || e.srcElement;\r\n if (target && target.className.match('introjs-prevbutton')) {\r\n //user hit enter while focusing on previous button\r\n _previousStep.call(this);\r\n } else if (target && target.className.match('introjs-skipbutton')) {\r\n //user hit enter while focusing on skip button\r\n if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n this._introCompleteCallback.call(this);\r\n }\r\n\r\n _exitIntro.call(this, this._targetElement);\r\n } else if (target && target.getAttribute('data-stepnumber')) {\r\n // user hit enter while focusing on step bullet\r\n target.click();\r\n } else {\r\n //default behavior for responding to enter\r\n _nextStep.call(this);\r\n }\r\n\r\n //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n if(e.preventDefault) {\r\n e.preventDefault();\r\n } else {\r\n e.returnValue = false;\r\n }\r\n }\r\n }\r\n\r\n /*\r\n * makes a copy of the object\r\n * @api private\r\n * @method _cloneObject\r\n */\r\n function _cloneObject(object) {\r\n if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n return object;\r\n }\r\n var temp = {};\r\n for (var key in object) {\r\n if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n temp[key] = object[key];\r\n } else {\r\n temp[key] = _cloneObject(object[key]);\r\n }\r\n }\r\n return temp;\r\n }\r\n /**\r\n * Go to specific step of introduction\r\n *\r\n * @api private\r\n * @method _goToStep\r\n */\r\n function _goToStep(step) {\r\n //because steps starts with zero\r\n this._currentStep = step - 2;\r\n if (typeof (this._introItems) !== 'undefined') {\r\n _nextStep.call(this);\r\n }\r\n }\r\n\r\n /**\r\n * Go to the specific step of introduction with the explicit [data-step] number\r\n *\r\n * @api private\r\n * @method _goToStepNumber\r\n */\r\n function _goToStepNumber(step) {\r\n this._currentStepNumber = step;\r\n if (typeof (this._introItems) !== 'undefined') {\r\n _nextStep.call(this);\r\n }\r\n }\r\n\r\n /**\r\n * Go to next step on intro\r\n *\r\n * @api private\r\n * @method _nextStep\r\n */\r\n function _nextStep() {\r\n this._direction = 'forward';\r\n\r\n if (typeof (this._currentStepNumber) !== 'undefined') {\r\n _forEach(this._introItems, function (item, i) {\r\n if( item.step === this._currentStepNumber ) {\r\n this._currentStep = i - 1;\r\n this._currentStepNumber = undefined;\r\n }\r\n }.bind(this));\r\n }\r\n\r\n if (typeof (this._currentStep) === 'undefined') {\r\n this._currentStep = 0;\r\n } else {\r\n ++this._currentStep;\r\n }\r\n\r\n var nextStep = this._introItems[this._currentStep];\r\n var continueStep = true;\r\n\r\n if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n }\r\n\r\n // if `onbeforechange` returned `false`, stop displaying the element\r\n if (continueStep === false) {\r\n --this._currentStep;\r\n return false;\r\n }\r\n\r\n if ((this._introItems.length) <= this._currentStep) {\r\n //end of the intro\r\n //check if any callback is defined\r\n if (typeof (this._introCompleteCallback) === 'function') {\r\n this._introCompleteCallback.call(this);\r\n }\r\n _exitIntro.call(this, this._targetElement);\r\n return;\r\n }\r\n\r\n _showElement.call(this, nextStep);\r\n }\r\n\r\n /**\r\n * Go to previous step on intro\r\n *\r\n * @api private\r\n * @method _previousStep\r\n */\r\n function _previousStep() {\r\n this._direction = 'backward';\r\n\r\n if (this._currentStep === 0) {\r\n return false;\r\n }\r\n\r\n --this._currentStep;\r\n\r\n var nextStep = this._introItems[this._currentStep];\r\n var continueStep = true;\r\n\r\n if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n }\r\n\r\n // if `onbeforechange` returned `false`, stop displaying the element\r\n if (continueStep === false) {\r\n ++this._currentStep;\r\n return false;\r\n }\r\n\r\n _showElement.call(this, nextStep);\r\n }\r\n\r\n /**\r\n * Update placement of the intro objects on the screen\r\n * @api private\r\n */\r\n function _refresh() {\r\n // re-align intros\r\n _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n // re-align tooltip\r\n if(this._currentStep !== undefined && this._currentStep !== null) {\r\n var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n oldArrowLayer = document.querySelector('.introjs-arrow'),\r\n oldtooltipContainer = document.querySelector('.introjs-tooltip');\r\n _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n }\r\n\r\n //re-align hints\r\n _reAlignHints.call(this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Exit from intro\r\n *\r\n * @api private\r\n * @method _exitIntro\r\n * @param {Object} targetElement\r\n * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n */\r\n function _exitIntro(targetElement, force) {\r\n var continueExit = true;\r\n\r\n // calling onbeforeexit callback\r\n //\r\n // If this callback return `false`, it would halt the process\r\n if (this._introBeforeExitCallback !== undefined) {\r\n continueExit = this._introBeforeExitCallback.call(this);\r\n }\r\n\r\n // skip this check if `force` parameter is `true`\r\n // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n if (!force && continueExit === false) return;\r\n\r\n //remove overlay layers from the page\r\n var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n if (overlayLayers && overlayLayers.length) {\r\n _forEach(overlayLayers, function (overlayLayer) {\r\n overlayLayer.style.opacity = 0;\r\n window.setTimeout(function () {\r\n if (this.parentNode) {\r\n this.parentNode.removeChild(this);\r\n }\r\n }.bind(overlayLayer), 500);\r\n }.bind(this));\r\n }\r\n\r\n //remove all helper layers\r\n var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n if (helperLayer) {\r\n helperLayer.parentNode.removeChild(helperLayer);\r\n }\r\n\r\n var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n if (referenceLayer) {\r\n referenceLayer.parentNode.removeChild(referenceLayer);\r\n }\r\n\r\n //remove disableInteractionLayer\r\n var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n if (disableInteractionLayer) {\r\n disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n }\r\n\r\n //remove intro floating element\r\n var floatingElement = document.querySelector('.introjsFloatingElement');\r\n if (floatingElement) {\r\n floatingElement.parentNode.removeChild(floatingElement);\r\n }\r\n\r\n _removeShowElement();\r\n\r\n //remove `introjs-fixParent` class from the elements\r\n var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n _forEach(fixParents, function (parent) {\r\n _removeClass(parent, /introjs-fixParent/g);\r\n });\r\n\r\n //clean listeners\r\n DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n //check if any callback is defined\r\n if (this._introExitCallback !== undefined) {\r\n this._introExitCallback.call(this);\r\n }\r\n\r\n //set the step to zero\r\n this._currentStep = undefined;\r\n }\r\n\r\n /**\r\n * Render tooltip box in the page\r\n *\r\n * @api private\r\n * @method _placeTooltip\r\n * @param {HTMLElement} targetElement\r\n * @param {HTMLElement} tooltipLayer\r\n * @param {HTMLElement} arrowLayer\r\n * @param {HTMLElement} helperNumberLayer\r\n * @param {Boolean} hintMode\r\n */\r\n function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n var tooltipCssClass = '',\r\n currentStepObj,\r\n tooltipOffset,\r\n targetOffset,\r\n windowSize,\r\n currentTooltipPosition;\r\n\r\n hintMode = hintMode || false;\r\n\r\n //reset the old style\r\n tooltipLayer.style.top = null;\r\n tooltipLayer.style.right = null;\r\n tooltipLayer.style.bottom = null;\r\n tooltipLayer.style.left = null;\r\n tooltipLayer.style.marginLeft = null;\r\n tooltipLayer.style.marginTop = null;\r\n\r\n arrowLayer.style.display = 'inherit';\r\n\r\n if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n helperNumberLayer.style.top = null;\r\n helperNumberLayer.style.left = null;\r\n }\r\n\r\n //prevent error when `this._currentStep` is undefined\r\n if (!this._introItems[this._currentStep]) return;\r\n\r\n //if we have a custom css class for each step\r\n currentStepObj = this._introItems[this._currentStep];\r\n if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n tooltipCssClass = currentStepObj.tooltipClass;\r\n } else {\r\n tooltipCssClass = this._options.tooltipClass;\r\n }\r\n\r\n tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n // Floating is always valid, no point in calculating\r\n if (currentTooltipPosition !== \"floating\") { \r\n currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n }\r\n\r\n var tooltipLayerStyleLeft;\r\n targetOffset = _getOffset(targetElement);\r\n tooltipOffset = _getOffset(tooltipLayer);\r\n windowSize = _getWinSize();\r\n\r\n _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n switch (currentTooltipPosition) {\r\n case 'top-right-aligned':\r\n arrowLayer.className = 'introjs-arrow bottom-right';\r\n\r\n var tooltipLayerStyleRight = 0;\r\n _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n break;\r\n\r\n case 'top-middle-aligned':\r\n arrowLayer.className = 'introjs-arrow bottom-middle';\r\n\r\n var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n // a fix for middle aligned hints\r\n if (hintMode) {\r\n tooltipLayerStyleLeftRight += 5;\r\n }\r\n\r\n if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n tooltipLayer.style.right = null;\r\n _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n }\r\n tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n break;\r\n\r\n case 'top-left-aligned':\r\n // top-left-aligned is the same as the default top\r\n case 'top':\r\n arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n break;\r\n case 'right':\r\n tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n // In this case, right would have fallen below the bottom of the screen.\r\n // Modify so that the bottom of the tooltip connects with the target\r\n arrowLayer.className = \"introjs-arrow left-bottom\";\r\n tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n } else {\r\n arrowLayer.className = 'introjs-arrow left';\r\n }\r\n break;\r\n case 'left':\r\n if (!hintMode && this._options.showStepNumbers === true) {\r\n tooltipLayer.style.top = '15px';\r\n }\r\n\r\n if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n // In this case, left would have fallen below the bottom of the screen.\r\n // Modify so that the bottom of the tooltip connects with the target\r\n tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n arrowLayer.className = 'introjs-arrow right-bottom';\r\n } else {\r\n arrowLayer.className = 'introjs-arrow right';\r\n }\r\n tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n break;\r\n case 'floating':\r\n arrowLayer.style.display = 'none';\r\n\r\n //we have to adjust the top and left of layer manually for intro items without element\r\n tooltipLayer.style.left = '50%';\r\n tooltipLayer.style.top = '50%';\r\n tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2) + 'px';\r\n tooltipLayer.style.marginTop = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n helperNumberLayer.style.top = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n }\r\n\r\n break;\r\n case 'bottom-right-aligned':\r\n arrowLayer.className = 'introjs-arrow top-right';\r\n\r\n tooltipLayerStyleRight = 0;\r\n _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n break;\r\n\r\n case 'bottom-middle-aligned':\r\n arrowLayer.className = 'introjs-arrow top-middle';\r\n\r\n tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n // a fix for middle aligned hints\r\n if (hintMode) {\r\n tooltipLayerStyleLeftRight += 5;\r\n }\r\n\r\n if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n tooltipLayer.style.right = null;\r\n _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n }\r\n tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n break;\r\n\r\n // case 'bottom-left-aligned':\r\n // Bottom-left-aligned is the same as the default bottom\r\n // case 'bottom':\r\n // Bottom going to follow the default behavior\r\n default:\r\n arrowLayer.className = 'introjs-arrow top';\r\n\r\n tooltipLayerStyleLeft = 0;\r\n _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n }\r\n }\r\n\r\n /**\r\n * Set tooltip left so it doesn't go off the right side of the window\r\n *\r\n * @return boolean true, if tooltipLayerStyleLeft is ok. false, otherwise.\r\n */\r\n function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n // off the right side of the window\r\n tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n return false;\r\n }\r\n tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n return true;\r\n }\r\n\r\n /**\r\n * Set tooltip right so it doesn't go off the left side of the window\r\n *\r\n * @return boolean true, if tooltipLayerStyleRight is ok. false, otherwise.\r\n */\r\n function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n // off the left side of the window\r\n tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n return false;\r\n }\r\n tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n return true;\r\n }\r\n\r\n /**\r\n * Determines the position of the tooltip based on the position precedence and availability\r\n * of screen space.\r\n *\r\n * @param {Object} targetElement\r\n * @param {Object} tooltipLayer\r\n * @param {String} desiredTooltipPosition\r\n * @return {String} calculatedPosition\r\n */\r\n function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n // Take a clone of position precedence. These will be the available\r\n var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n var windowSize = _getWinSize();\r\n var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n var calculatedPosition = \"floating\";\r\n\r\n /*\r\n * auto determine position \r\n */\r\n\r\n // Check for space below\r\n if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n _removeEntry(possiblePositions, \"bottom\");\r\n }\r\n\r\n // Check for space above\r\n if (targetElementRect.top - tooltipHeight < 0) {\r\n _removeEntry(possiblePositions, \"top\");\r\n }\r\n\r\n // Check for space to the right\r\n if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n _removeEntry(possiblePositions, \"right\");\r\n }\r\n\r\n // Check for space to the left\r\n if (targetElementRect.left - tooltipWidth < 0) {\r\n _removeEntry(possiblePositions, \"left\");\r\n }\r\n\r\n // @var {String} ex: 'right-aligned'\r\n var desiredAlignment = (function (pos) {\r\n var hyphenIndex = pos.indexOf('-');\r\n if (hyphenIndex !== -1) {\r\n // has alignment\r\n return pos.substr(hyphenIndex);\r\n }\r\n return '';\r\n })(desiredTooltipPosition || '');\r\n\r\n // strip alignment from position\r\n if (desiredTooltipPosition) {\r\n // ex: \"bottom-right-aligned\"\r\n // should return 'bottom'\r\n desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n }\r\n\r\n if (possiblePositions.length) {\r\n if (desiredTooltipPosition !== \"auto\" &&\r\n possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n // If the requested position is in the list, choose that\r\n calculatedPosition = desiredTooltipPosition;\r\n } else {\r\n // Pick the first valid position, in order\r\n calculatedPosition = possiblePositions[0];\r\n }\r\n }\r\n\r\n // only top and bottom positions have optional alignments\r\n if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n }\r\n\r\n return calculatedPosition;\r\n }\r\n\r\n /**\r\n * auto-determine alignment\r\n * @param {Integer} offsetLeft\r\n * @param {Integer} tooltipWidth\r\n * @param {Object} windowSize\r\n * @param {String} desiredAlignment\r\n * @return {String} calculatedAlignment\r\n */\r\n function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n var halfTooltipWidth = tooltipWidth / 2,\r\n winWidth = Math.min(windowSize.width, window.screen.width),\r\n possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n calculatedAlignment = '';\r\n \r\n // valid left must be at least a tooltipWidth\r\n // away from right side\r\n if (winWidth - offsetLeft < tooltipWidth) {\r\n _removeEntry(possibleAlignments, '-left-aligned');\r\n }\r\n\r\n // valid middle must be at least half \r\n // width away from both sides\r\n if (offsetLeft < halfTooltipWidth || \r\n winWidth - offsetLeft < halfTooltipWidth) {\r\n _removeEntry(possibleAlignments, '-middle-aligned');\r\n }\r\n\r\n // valid right must be at least a tooltipWidth\r\n // width away from left side\r\n if (offsetLeft < tooltipWidth) {\r\n _removeEntry(possibleAlignments, '-right-aligned');\r\n }\r\n\r\n if (possibleAlignments.length) {\r\n if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n // the desired alignment is valid\r\n calculatedAlignment = desiredAlignment;\r\n } else {\r\n // pick the first valid position, in order\r\n calculatedAlignment = possibleAlignments[0];\r\n }\r\n } else {\r\n // if screen width is too small \r\n // for ANY alignment, middle is \r\n // probably the best for visibility\r\n calculatedAlignment = '-middle-aligned';\r\n }\r\n\r\n return calculatedAlignment;\r\n }\r\n\r\n /**\r\n * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n *\r\n * @param {Array} stringArray\r\n * @param {String} stringToRemove\r\n */\r\n function _removeEntry(stringArray, stringToRemove) {\r\n if (stringArray.indexOf(stringToRemove) > -1) {\r\n stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n }\r\n }\r\n\r\n /**\r\n * Update the position of the helper layer on the screen\r\n *\r\n * @api private\r\n * @method _setHelperLayerPosition\r\n * @param {Object} helperLayer\r\n */\r\n function _setHelperLayerPosition(helperLayer) {\r\n if (helperLayer) {\r\n //prevent error when `this._currentStep` in undefined\r\n if (!this._introItems[this._currentStep]) return;\r\n\r\n var currentElement = this._introItems[this._currentStep],\r\n elementPosition = _getOffset(currentElement.element),\r\n widthHeightPadding = this._options.helperElementPadding;\r\n\r\n // If the target element is fixed, the tooltip should be fixed as well.\r\n // Otherwise, remove a fixed class that may be left over from the previous\r\n // step.\r\n if (_isFixed(currentElement.element)) {\r\n _addClass(helperLayer, 'introjs-fixedTooltip');\r\n } else {\r\n _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n }\r\n\r\n if (currentElement.position === 'floating') {\r\n widthHeightPadding = 0;\r\n }\r\n\r\n //set new position to helper layer\r\n helperLayer.style.cssText = 'width: ' + (elementPosition.width + widthHeightPadding) + 'px; ' +\r\n 'height:' + (elementPosition.height + widthHeightPadding) + 'px; ' +\r\n 'top:' + (elementPosition.top - widthHeightPadding / 2) + 'px;' +\r\n 'left: ' + (elementPosition.left - widthHeightPadding / 2) + 'px;';\r\n\r\n }\r\n }\r\n\r\n /**\r\n * Add disableinteraction layer and adjust the size and position of the layer\r\n *\r\n * @api private\r\n * @method _disableInteraction\r\n */\r\n function _disableInteraction() {\r\n var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n if (disableInteractionLayer === null) {\r\n disableInteractionLayer = document.createElement('div');\r\n disableInteractionLayer.className = 'introjs-disableInteraction';\r\n this._targetElement.appendChild(disableInteractionLayer);\r\n }\r\n\r\n _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n }\r\n\r\n /**\r\n * Setting anchors to behave like buttons\r\n *\r\n * @api private\r\n * @method _setAnchorAsButton\r\n */\r\n function _setAnchorAsButton(anchor){\r\n anchor.setAttribute('role', 'button');\r\n anchor.tabIndex = 0;\r\n }\r\n\r\n /**\r\n * Show an element on the page\r\n *\r\n * @api private\r\n * @method _showElement\r\n * @param {Object} targetElement\r\n */\r\n function _showElement(targetElement) {\r\n if (typeof (this._introChangeCallback) !== 'undefined') {\r\n this._introChangeCallback.call(this, targetElement.element);\r\n }\r\n\r\n var self = this,\r\n oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n highlightClass = 'introjs-helperLayer',\r\n nextTooltipButton,\r\n prevTooltipButton,\r\n skipTooltipButton,\r\n scrollParent;\r\n\r\n //check for a current step highlight class\r\n if (typeof (targetElement.highlightClass) === 'string') {\r\n highlightClass += (' ' + targetElement.highlightClass);\r\n }\r\n //check for options highlight class\r\n if (typeof (this._options.highlightClass) === 'string') {\r\n highlightClass += (' ' + this._options.highlightClass);\r\n }\r\n\r\n if (oldHelperLayer !== null) {\r\n var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n oldtooltipLayer = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n oldArrowLayer = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n oldtooltipContainer = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n \r\n skipTooltipButton = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n prevTooltipButton = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n nextTooltipButton = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n //update or reset the helper highlight class\r\n oldHelperLayer.className = highlightClass;\r\n //hide the tooltip\r\n oldtooltipContainer.style.opacity = 0;\r\n oldtooltipContainer.style.display = \"none\";\r\n\r\n if (oldHelperNumberLayer !== null) {\r\n var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n oldHelperNumberLayer.style.opacity = 0;\r\n }\r\n }\r\n\r\n // scroll to element\r\n scrollParent = _getScrollParent( targetElement.element );\r\n\r\n if (scrollParent !== document.body) {\r\n // target is within a scrollable element\r\n _scrollParentToElement(scrollParent, targetElement.element);\r\n }\r\n\r\n // set new position to helper layer\r\n _setHelperLayerPosition.call(self, oldHelperLayer);\r\n _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n //remove `introjs-fixParent` class from the elements\r\n var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n _forEach(fixParents, function (parent) {\r\n _removeClass(parent, /introjs-fixParent/g);\r\n });\r\n \r\n //remove old classes if the element still exist\r\n _removeShowElement();\r\n\r\n //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n if (self._lastShowElementTimer) {\r\n window.clearTimeout(self._lastShowElementTimer);\r\n }\r\n\r\n self._lastShowElementTimer = window.setTimeout(function() {\r\n //set current step to the label\r\n if (oldHelperNumberLayer !== null) {\r\n oldHelperNumberLayer.innerHTML = targetElement.step;\r\n }\r\n //set current tooltip text\r\n oldtooltipLayer.innerHTML = targetElement.intro;\r\n //set the tooltip position\r\n oldtooltipContainer.style.display = \"block\";\r\n _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n //change active bullet\r\n if (self._options.showBullets) {\r\n oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n }\r\n oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n //show the tooltip\r\n oldtooltipContainer.style.opacity = 1;\r\n if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n //reset button focus\r\n if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n // skip button is now \"done\" button\r\n skipTooltipButton.focus();\r\n } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n //still in the tour, focus on next\r\n nextTooltipButton.focus();\r\n }\r\n\r\n // change the scroll of the window, if needed\r\n _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n }, 350);\r\n\r\n // end of old element if-else condition\r\n } else {\r\n var helperLayer = document.createElement('div'),\r\n referenceLayer = document.createElement('div'),\r\n arrowLayer = document.createElement('div'),\r\n tooltipLayer = document.createElement('div'),\r\n tooltipTextLayer = document.createElement('div'),\r\n bulletsLayer = document.createElement('div'),\r\n progressLayer = document.createElement('div'),\r\n buttonsLayer = document.createElement('div');\r\n\r\n helperLayer.className = highlightClass;\r\n referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n // scroll to element\r\n scrollParent = _getScrollParent( targetElement.element );\r\n\r\n if (scrollParent !== document.body) {\r\n // target is within a scrollable element\r\n _scrollParentToElement(scrollParent, targetElement.element);\r\n }\r\n\r\n //set new position to helper layer\r\n _setHelperLayerPosition.call(self, helperLayer);\r\n _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n //add helper layer to target element\r\n this._targetElement.appendChild(helperLayer);\r\n this._targetElement.appendChild(referenceLayer);\r\n\r\n arrowLayer.className = 'introjs-arrow';\r\n\r\n tooltipTextLayer.className = 'introjs-tooltiptext';\r\n tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n bulletsLayer.className = 'introjs-bullets';\r\n\r\n if (this._options.showBullets === false) {\r\n bulletsLayer.style.display = 'none';\r\n }\r\n\r\n var ulContainer = document.createElement('ul');\r\n ulContainer.setAttribute('role', 'tablist');\r\n\r\n var anchorClick = function () {\r\n self.goToStep(this.getAttribute('data-stepnumber'));\r\n };\r\n\r\n _forEach(this._introItems, function (item, i) {\r\n var innerLi = document.createElement('li');\r\n var anchorLink = document.createElement('a');\r\n \r\n innerLi.setAttribute('role', 'presentation');\r\n anchorLink.setAttribute('role', 'tab');\r\n\r\n anchorLink.onclick = anchorClick;\r\n\r\n if (i === (targetElement.step-1)) {\r\n anchorLink.className = 'active';\r\n } \r\n\r\n _setAnchorAsButton(anchorLink);\r\n anchorLink.innerHTML = \"&nbsp;\";\r\n anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n innerLi.appendChild(anchorLink);\r\n ulContainer.appendChild(innerLi);\r\n });\r\n\r\n bulletsLayer.appendChild(ulContainer);\r\n\r\n progressLayer.className = 'introjs-progress';\r\n\r\n if (this._options.showProgress === false) {\r\n progressLayer.style.display = 'none';\r\n }\r\n var progressBar = document.createElement('div');\r\n progressBar.className = 'introjs-progressbar';\r\n progressBar.setAttribute('role', 'progress');\r\n progressBar.setAttribute('aria-valuemin', 0);\r\n progressBar.setAttribute('aria-valuemax', 100);\r\n progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n progressLayer.appendChild(progressBar);\r\n\r\n buttonsLayer.className = 'introjs-tooltipbuttons';\r\n if (this._options.showButtons === false) {\r\n buttonsLayer.style.display = 'none';\r\n }\r\n\r\n tooltipLayer.className = 'introjs-tooltip';\r\n tooltipLayer.appendChild(tooltipTextLayer);\r\n tooltipLayer.appendChild(bulletsLayer);\r\n tooltipLayer.appendChild(progressLayer);\r\n\r\n //add helper layer number\r\n var helperNumberLayer = document.createElement('span');\r\n if (this._options.showStepNumbers === true) {\r\n helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n helperNumberLayer.innerHTML = targetElement.step;\r\n referenceLayer.appendChild(helperNumberLayer);\r\n }\r\n\r\n tooltipLayer.appendChild(arrowLayer);\r\n referenceLayer.appendChild(tooltipLayer);\r\n\r\n //next button\r\n nextTooltipButton = document.createElement('a');\r\n\r\n nextTooltipButton.onclick = function() {\r\n if (self._introItems.length - 1 !== self._currentStep) {\r\n _nextStep.call(self);\r\n }\r\n };\r\n\r\n _setAnchorAsButton(nextTooltipButton);\r\n nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n //previous button\r\n prevTooltipButton = document.createElement('a');\r\n\r\n prevTooltipButton.onclick = function() {\r\n if (self._currentStep !== 0) {\r\n _previousStep.call(self);\r\n }\r\n };\r\n\r\n _setAnchorAsButton(prevTooltipButton);\r\n prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n //skip button\r\n skipTooltipButton = document.createElement('a');\r\n skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n _setAnchorAsButton(skipTooltipButton);\r\n skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n skipTooltipButton.onclick = function() {\r\n if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n self._introCompleteCallback.call(self);\r\n }\r\n\r\n if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n self._introExitCallback.call(self);\r\n }\r\n\r\n if (typeof(self._introSkipCallback) === 'function') {\r\n self._introSkipCallback.call(self);\r\n }\r\n\r\n _exitIntro.call(self, self._targetElement);\r\n };\r\n\r\n buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n //in order to prevent displaying next/previous button always\r\n if (this._introItems.length > 1) {\r\n buttonsLayer.appendChild(prevTooltipButton);\r\n buttonsLayer.appendChild(nextTooltipButton);\r\n }\r\n\r\n tooltipLayer.appendChild(buttonsLayer);\r\n\r\n //set proper position\r\n _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n // change the scroll of the window, if needed\r\n _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n //end of new element if-else condition\r\n }\r\n\r\n // removing previous disable interaction layer\r\n var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n if (disableInteractionLayer) {\r\n disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n }\r\n\r\n //disable interaction\r\n if (targetElement.disableInteraction) {\r\n _disableInteraction.call(self);\r\n }\r\n\r\n // when it's the first step of tour\r\n if (this._currentStep === 0 && this._introItems.length > 1) {\r\n if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n }\r\n if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n }\r\n\r\n if (this._options.hidePrev === true) {\r\n if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n }\r\n if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n }\r\n } else {\r\n if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n }\r\n }\r\n\r\n if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n skipTooltipButton.innerHTML = this._options.skipLabel;\r\n }\r\n } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n // last step of tour\r\n if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n skipTooltipButton.innerHTML = this._options.doneLabel;\r\n // adding donebutton class in addition to skipbutton\r\n _addClass(skipTooltipButton, 'introjs-donebutton');\r\n }\r\n if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n }\r\n\r\n if (this._options.hideNext === true) {\r\n if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n }\r\n if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n }\r\n } else {\r\n if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n }\r\n }\r\n } else {\r\n // steps between start and end\r\n if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n }\r\n if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n }\r\n if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n }\r\n if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n skipTooltipButton.innerHTML = this._options.skipLabel;\r\n }\r\n }\r\n\r\n prevTooltipButton.setAttribute('role', 'button');\r\n nextTooltipButton.setAttribute('role', 'button');\r\n skipTooltipButton.setAttribute('role', 'button');\r\n\r\n //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n nextTooltipButton.focus();\r\n }\r\n\r\n _setShowElement(targetElement);\r\n\r\n if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n this._introAfterChangeCallback.call(this, targetElement.element);\r\n }\r\n }\r\n\r\n /**\r\n * To change the scroll of `window` after highlighting an element\r\n *\r\n * @api private\r\n * @method _scrollTo\r\n * @param {String} scrollTo\r\n * @param {Object} targetElement\r\n * @param {Object} tooltipLayer\r\n */\r\n function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n if (scrollTo === 'off') return; \r\n var rect;\r\n\r\n if (!this._options.scrollToElement) return;\r\n\r\n if (scrollTo === 'tooltip') {\r\n rect = tooltipLayer.getBoundingClientRect();\r\n } else {\r\n rect = targetElement.element.getBoundingClientRect();\r\n }\r\n\r\n if (!_elementInViewport(targetElement.element)) {\r\n var winHeight = _getWinSize().height;\r\n var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n // TODO (afshinm): do we need scroll padding now?\r\n // I have changed the scroll option and now it scrolls the window to\r\n // the center of the target element or tooltip.\r\n\r\n if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n window.scrollBy(0, rect.top - ((winHeight / 2) - (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n //Scroll down\r\n } else {\r\n window.scrollBy(0, rect.top - ((winHeight / 2) - (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * To remove all show element(s)\r\n *\r\n * @api private\r\n * @method _removeShowElement\r\n */\r\n function _removeShowElement() {\r\n var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n _forEach(elms, function (elm) {\r\n _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n });\r\n }\r\n\r\n /**\r\n * To set the show element\r\n * This function set a relative (in most cases) position and changes the z-index\r\n *\r\n * @api private\r\n * @method _setShowElement\r\n * @param {Object} targetElement\r\n */\r\n function _setShowElement(targetElement) {\r\n var parentElm;\r\n // we need to add this show element class to the parent of SVG elements\r\n // because the SVG elements can't have independent z-index\r\n if (targetElement.element instanceof SVGElement) {\r\n parentElm = targetElement.element.parentNode;\r\n\r\n while (targetElement.element.parentNode !== null) {\r\n if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n if (parentElm.tagName.toLowerCase() === 'svg') {\r\n _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n }\r\n\r\n parentElm = parentElm.parentNode;\r\n }\r\n }\r\n\r\n _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n if (currentElementPosition !== 'absolute' &&\r\n currentElementPosition !== 'relative' &&\r\n currentElementPosition !== 'fixed') {\r\n //change to new intro item\r\n _addClass(targetElement.element, 'introjs-relativePosition');\r\n }\r\n\r\n parentElm = targetElement.element.parentNode;\r\n while (parentElm !== null) {\r\n if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n //fix The Stacking Context problem.\r\n //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n var zIndex = _getPropValue(parentElm, 'z-index');\r\n var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n _addClass(parentElm, 'introjs-fixParent');\r\n }\r\n\r\n parentElm = parentElm.parentNode;\r\n }\r\n }\r\n\r\n /**\r\n * Iterates arrays\r\n *\r\n * @param {Array} arr\r\n * @param {Function} forEachFnc\r\n * @param {Function} completeFnc\r\n * @return {Null}\r\n */\r\n function _forEach(arr, forEachFnc, completeFnc) {\r\n // in case arr is an empty query selector node list\r\n if (arr) {\r\n for (var i = 0, len = arr.length; i < len; i++) {\r\n forEachFnc(arr[i], i);\r\n }\r\n }\r\n\r\n if (typeof(completeFnc) === 'function') {\r\n completeFnc();\r\n }\r\n }\r\n\r\n /**\r\n * Mark any object with an incrementing number\r\n * used for keeping track of objects\r\n *\r\n * @param Object obj Any object or DOM Element\r\n * @param String key\r\n * @return Object\r\n */\r\n var _stamp = (function () {\r\n var keys = {};\r\n return function stamp (obj, key) {\r\n \r\n // get group key\r\n key = key || 'introjs-stamp';\r\n\r\n // each group increments from 0\r\n keys[key] = keys[key] || 0;\r\n\r\n // stamp only once per object\r\n if (obj[key] === undefined) {\r\n // increment key for each new object\r\n obj[key] = keys[key]++;\r\n }\r\n\r\n return obj[key];\r\n };\r\n })();\r\n\r\n /**\r\n * DOMEvent Handles all DOM events\r\n *\r\n * methods:\r\n *\r\n * on - add event handler\r\n * off - remove event\r\n */\r\n var DOMEvent = (function () {\r\n function DOMEvent () {\r\n var events_key = 'introjs_event';\r\n \r\n /**\r\n * Gets a unique ID for an event listener\r\n *\r\n * @param Object obj\r\n * @param String type event type\r\n * @param Function listener\r\n * @param Object context\r\n * @return String\r\n */\r\n this._id = function (obj, type, listener, context) {\r\n return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n };\r\n\r\n /**\r\n * Adds event listener\r\n *\r\n * @param Object obj\r\n * @param String type event type\r\n * @param Function listener\r\n * @param Object context\r\n * @param Boolean useCapture\r\n * @return null\r\n */\r\n this.on = function (obj, type, listener, context, useCapture) {\r\n var id = this._id.apply(this, arguments),\r\n handler = function (e) {\r\n return listener.call(context || obj, e || window.event);\r\n };\r\n\r\n if ('addEventListener' in obj) {\r\n obj.addEventListener(type, handler, useCapture);\r\n } else if ('attachEvent' in obj) {\r\n obj.attachEvent('on' + type, handler);\r\n }\r\n\r\n obj[events_key] = obj[events_key] || {};\r\n obj[events_key][id] = handler;\r\n };\r\n\r\n /**\r\n * Removes event listener\r\n *\r\n * @param Object obj\r\n * @param String type event type\r\n * @param Function listener\r\n * @param Object context\r\n * @param Boolean useCapture\r\n * @return null\r\n */\r\n this.off = function (obj, type, listener, context, useCapture) {\r\n var id = this._id.apply(this, arguments),\r\n handler = obj[events_key] && obj[events_key][id];\r\n\r\n if (!handler) {\r\n return;\r\n }\r\n\r\n if ('removeEventListener' in obj) {\r\n obj.removeEventListener(type, handler, useCapture);\r\n } else if ('detachEvent' in obj) {\r\n obj.detachEvent('on' + type, handler);\r\n }\r\n\r\n obj[events_key][id] = null;\r\n };\r\n }\r\n\r\n return new DOMEvent();\r\n })();\r\n\r\n /**\r\n * Append a class to an element\r\n *\r\n * @api private\r\n * @method _addClass\r\n * @param {Object} element\r\n * @param {String} className\r\n * @returns null\r\n */\r\n function _addClass(element, className) {\r\n if (element instanceof SVGElement) {\r\n // svg\r\n var pre = element.getAttribute('class') || '';\r\n\r\n element.setAttribute('class', pre + ' ' + className);\r\n } else {\r\n if (element.classList !== undefined) {\r\n // check for modern classList property\r\n var classes = className.split(' ');\r\n _forEach(classes, function (cls) {\r\n element.classList.add( cls );\r\n });\r\n } else if (!element.className.match( className )) {\r\n // check if element doesn't already have className\r\n element.className += ' ' + className;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove a class from an element\r\n *\r\n * @api private\r\n * @method _removeClass\r\n * @param {Object} element\r\n * @param {RegExp|String} classNameRegex can be regex or string\r\n * @returns null\r\n */\r\n function _removeClass(element, classNameRegex) {\r\n if (element instanceof SVGElement) {\r\n var pre = element.getAttribute('class') || '';\r\n\r\n element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n } else {\r\n element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n }\r\n }\r\n\r\n /**\r\n * Get an element CSS property on the page\r\n * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n *\r\n * @api private\r\n * @method _getPropValue\r\n * @param {Object} element\r\n * @param {String} propName\r\n * @returns Element's property value\r\n */\r\n function _getPropValue (element, propName) {\r\n var propValue = '';\r\n if (element.currentStyle) { //IE\r\n propValue = element.currentStyle[propName];\r\n } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n }\r\n\r\n //Prevent exception in IE\r\n if (propValue && propValue.toLowerCase) {\r\n return propValue.toLowerCase();\r\n } else {\r\n return propValue;\r\n }\r\n }\r\n\r\n /**\r\n * Checks to see if target element (or parents) position is fixed or not\r\n *\r\n * @api private\r\n * @method _isFixed\r\n * @param {Object} element\r\n * @returns Boolean\r\n */\r\n function _isFixed (element) {\r\n var p = element.parentNode;\r\n\r\n if (!p || p.nodeName === 'HTML') {\r\n return false;\r\n }\r\n\r\n if (_getPropValue(element, 'position') === 'fixed') {\r\n return true;\r\n }\r\n\r\n return _isFixed(p);\r\n }\r\n\r\n /**\r\n * Provides a cross-browser way to get the screen dimensions\r\n * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n *\r\n * @api private\r\n * @method _getWinSize\r\n * @returns {Object} width and height attributes\r\n */\r\n function _getWinSize() {\r\n if (window.innerWidth !== undefined) {\r\n return { width: window.innerWidth, height: window.innerHeight };\r\n } else {\r\n var D = document.documentElement;\r\n return { width: D.clientWidth, height: D.clientHeight };\r\n }\r\n }\r\n\r\n /**\r\n * Check to see if the element is in the viewport or not\r\n * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n *\r\n * @api private\r\n * @method _elementInViewport\r\n * @param {Object} el\r\n */\r\n function _elementInViewport(el) {\r\n var rect = el.getBoundingClientRect();\r\n\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n rect.right <= window.innerWidth\r\n );\r\n }\r\n\r\n /**\r\n * Add overlay layer to the page\r\n *\r\n * @api private\r\n * @method _addOverlayLayer\r\n * @param {Object} targetElm\r\n */\r\n function _addOverlayLayer(targetElm) {\r\n var overlayLayer = document.createElement('div'),\r\n styleText = '',\r\n self = this;\r\n\r\n //set css class name\r\n overlayLayer.className = 'introjs-overlay';\r\n\r\n //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n overlayLayer.style.cssText = styleText;\r\n } else {\r\n //set overlay layer position\r\n var elementPosition = _getOffset(targetElm);\r\n if (elementPosition) {\r\n styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n overlayLayer.style.cssText = styleText;\r\n }\r\n }\r\n\r\n targetElm.appendChild(overlayLayer);\r\n\r\n overlayLayer.onclick = function() {\r\n if (self._options.exitOnOverlayClick === true) {\r\n _exitIntro.call(self, targetElm);\r\n }\r\n };\r\n\r\n window.setTimeout(function() {\r\n styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n overlayLayer.style.cssText = styleText;\r\n }, 10);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Removes open hint (tooltip hint)\r\n *\r\n * @api private\r\n * @method _removeHintTooltip\r\n */\r\n function _removeHintTooltip() {\r\n var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n if (tooltip) {\r\n var step = tooltip.getAttribute('data-step');\r\n tooltip.parentNode.removeChild(tooltip);\r\n return step;\r\n }\r\n }\r\n\r\n /**\r\n * Start parsing hint items\r\n *\r\n * @api private\r\n * @param {Object} targetElm\r\n * @method _startHint\r\n */\r\n function _populateHints(targetElm) {\r\n\r\n this._introItems = [];\r\n\r\n if (this._options.hints) {\r\n _forEach(this._options.hints, function (hint) {\r\n var currentItem = _cloneObject(hint);\r\n\r\n if (typeof(currentItem.element) === 'string') {\r\n //grab the element with given selector from the page\r\n currentItem.element = document.querySelector(currentItem.element);\r\n }\r\n\r\n currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n if (currentItem.element !== null) {\r\n this._introItems.push(currentItem);\r\n }\r\n }.bind(this));\r\n } else {\r\n var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n if (!hints || !hints.length) {\r\n return false;\r\n }\r\n\r\n //first add intro items with data-step\r\n _forEach(hints, function (currentElement) {\r\n // hint animation\r\n var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n if (hintAnimation) {\r\n hintAnimation = (hintAnimation === 'true');\r\n } else {\r\n hintAnimation = this._options.hintAnimation;\r\n }\r\n\r\n this._introItems.push({\r\n element: currentElement,\r\n hint: currentElement.getAttribute('data-hint'),\r\n hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n hintAnimation: hintAnimation,\r\n tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n });\r\n }.bind(this));\r\n }\r\n\r\n _addHints.call(this);\r\n\r\n /* \r\n todo:\r\n these events should be removed at some point \r\n */\r\n DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n }\r\n\r\n /**\r\n * Re-aligns all hint elements\r\n *\r\n * @api private\r\n * @method _reAlignHints\r\n */\r\n function _reAlignHints() {\r\n _forEach(this._introItems, function (item) {\r\n if (typeof(item.targetElement) === 'undefined') {\r\n return;\r\n }\r\n\r\n _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n }.bind(this));\r\n }\r\n\r\n /**\r\n * Get a queryselector within the hint wrapper\r\n *\r\n * @param {String} selector\r\n * @return {NodeList|Array}\r\n */\r\n function _hintQuerySelectorAll(selector) {\r\n var hintsWrapper = document.querySelector('.introjs-hints');\r\n return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n }\r\n\r\n /**\r\n * Hide a hint\r\n *\r\n * @api private\r\n * @method _hideHint\r\n */\r\n function _hideHint(stepId) {\r\n var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n \r\n _removeHintTooltip.call(this);\r\n\r\n if (hint) {\r\n _addClass(hint, 'introjs-hidehint');\r\n }\r\n\r\n // call the callback function (if any)\r\n if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n this._hintCloseCallback.call(this, stepId);\r\n }\r\n }\r\n\r\n /**\r\n * Hide all hints\r\n *\r\n * @api private\r\n * @method _hideHints\r\n */\r\n function _hideHints() {\r\n var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n _forEach(hints, function (hint) {\r\n _hideHint.call(this, hint.getAttribute('data-step'));\r\n }.bind(this));\r\n }\r\n\r\n /**\r\n * Show all hints\r\n *\r\n * @api private\r\n * @method _showHints\r\n */\r\n function _showHints() {\r\n var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n if (hints && hints.length) {\r\n _forEach(hints, function (hint) {\r\n _showHint.call(this, hint.getAttribute('data-step'));\r\n }.bind(this));\r\n } else {\r\n _populateHints.call(this, this._targetElement);\r\n }\r\n }\r\n\r\n /**\r\n * Show a hint\r\n *\r\n * @api private\r\n * @method _showHint\r\n */\r\n function _showHint(stepId) {\r\n var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n if (hint) {\r\n _removeClass(hint, /introjs-hidehint/g);\r\n }\r\n }\r\n\r\n /**\r\n * Removes all hint elements on the page\r\n * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n *\r\n * @api private\r\n * @method _removeHints\r\n */\r\n function _removeHints() {\r\n var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n _forEach(hints, function (hint) {\r\n _removeHint.call(this, hint.getAttribute('data-step'));\r\n }.bind(this));\r\n }\r\n\r\n /**\r\n * Remove one single hint element from the page\r\n * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n * Use removeHints if you want to remove all elements.\r\n *\r\n * @api private\r\n * @method _removeHint\r\n */\r\n function _removeHint(stepId) {\r\n var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n if (hint) {\r\n hint.parentNode.removeChild(hint);\r\n }\r\n }\r\n\r\n /**\r\n * Add all available hints to the page\r\n *\r\n * @api private\r\n * @method _addHints\r\n */\r\n function _addHints() {\r\n var self = this;\r\n\r\n var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n if (hintsWrapper === null) {\r\n hintsWrapper = document.createElement('div');\r\n hintsWrapper.className = 'introjs-hints';\r\n }\r\n\r\n /**\r\n * Returns an event handler unique to the hint iteration\r\n * \r\n * @param {Integer} i\r\n * @return {Function}\r\n */\r\n var getHintClick = function (i) {\r\n return function(e) {\r\n var evt = e ? e : window.event;\r\n \r\n if (evt.stopPropagation) {\r\n evt.stopPropagation();\r\n }\r\n\r\n if (evt.cancelBubble !== null) {\r\n evt.cancelBubble = true;\r\n }\r\n\r\n _showHintDialog.call(self, i);\r\n };\r\n };\r\n\r\n _forEach(this._introItems, function(item, i) {\r\n // avoid append a hint twice\r\n if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n return;\r\n }\r\n\r\n var hint = document.createElement('a');\r\n _setAnchorAsButton(hint);\r\n\r\n hint.onclick = getHintClick(i);\r\n\r\n hint.className = 'introjs-hint';\r\n\r\n if (!item.hintAnimation) {\r\n _addClass(hint, 'introjs-hint-no-anim');\r\n }\r\n\r\n // hint's position should be fixed if the target element's position is fixed\r\n if (_isFixed(item.element)) {\r\n _addClass(hint, 'introjs-fixedhint');\r\n }\r\n\r\n var hintDot = document.createElement('div');\r\n hintDot.className = 'introjs-hint-dot';\r\n var hintPulse = document.createElement('div');\r\n hintPulse.className = 'introjs-hint-pulse';\r\n\r\n hint.appendChild(hintDot);\r\n hint.appendChild(hintPulse);\r\n hint.setAttribute('data-step', i);\r\n\r\n // we swap the hint element with target element\r\n // because _setHelperLayerPosition uses `element` property\r\n item.targetElement = item.element;\r\n item.element = hint;\r\n\r\n // align the hint position\r\n _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n hintsWrapper.appendChild(hint);\r\n }.bind(this));\r\n\r\n // adding the hints wrapper\r\n document.body.appendChild(hintsWrapper);\r\n\r\n // call the callback function (if any)\r\n if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n this._hintsAddedCallback.call(this);\r\n }\r\n }\r\n\r\n /**\r\n * Aligns hint position\r\n *\r\n * @api private\r\n * @method _alignHintPosition\r\n * @param {String} position\r\n * @param {Object} hint\r\n * @param {Object} element\r\n */\r\n function _alignHintPosition(position, hint, element) {\r\n // get/calculate offset of target element\r\n var offset = _getOffset.call(this, element);\r\n var iconWidth = 20;\r\n var iconHeight = 20;\r\n\r\n // align the hint element\r\n switch (position) {\r\n default:\r\n case 'top-left':\r\n hint.style.left = offset.left + 'px';\r\n hint.style.top = offset.top + 'px';\r\n break;\r\n case 'top-right':\r\n hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n hint.style.top = offset.top + 'px';\r\n break;\r\n case 'bottom-left':\r\n hint.style.left = offset.left + 'px';\r\n hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n break;\r\n case 'bottom-right':\r\n hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n break;\r\n case 'middle-left':\r\n hint.style.left = offset.left + 'px';\r\n hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n break;\r\n case 'middle-right':\r\n hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n break;\r\n case 'middle-middle':\r\n hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n break;\r\n case 'bottom-middle':\r\n hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n break;\r\n case 'top-middle':\r\n hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n hint.style.top = offset.top + 'px';\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Triggers when user clicks on the hint element\r\n *\r\n * @api private\r\n * @method _showHintDialog\r\n * @param {Number} stepId\r\n */\r\n function _showHintDialog(stepId) {\r\n var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n var item = this._introItems[stepId];\r\n\r\n // call the callback function (if any)\r\n if (typeof (this._hintClickCallback) !== 'undefined') {\r\n this._hintClickCallback.call(this, hintElement, item, stepId);\r\n }\r\n\r\n // remove all open tooltips\r\n var removedStep = _removeHintTooltip.call(this);\r\n\r\n // to toggle the tooltip\r\n if (parseInt(removedStep, 10) === stepId) {\r\n return;\r\n }\r\n\r\n var tooltipLayer = document.createElement('div');\r\n var tooltipTextLayer = document.createElement('div');\r\n var arrowLayer = document.createElement('div');\r\n var referenceLayer = document.createElement('div');\r\n\r\n tooltipLayer.className = 'introjs-tooltip';\r\n\r\n tooltipLayer.onclick = function (e) {\r\n //IE9 & Other Browsers\r\n if (e.stopPropagation) {\r\n e.stopPropagation();\r\n }\r\n //IE8 and Lower\r\n else {\r\n e.cancelBubble = true;\r\n }\r\n };\r\n\r\n tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n var tooltipWrapper = document.createElement('p');\r\n tooltipWrapper.innerHTML = item.hint;\r\n\r\n var closeButton = document.createElement('a');\r\n closeButton.className = this._options.buttonClass;\r\n closeButton.setAttribute('role', 'button');\r\n closeButton.innerHTML = this._options.hintButtonLabel;\r\n closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n tooltipTextLayer.appendChild(tooltipWrapper);\r\n tooltipTextLayer.appendChild(closeButton);\r\n\r\n arrowLayer.className = 'introjs-arrow';\r\n tooltipLayer.appendChild(arrowLayer);\r\n\r\n tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n // set current step for _placeTooltip function\r\n this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n // align reference layer position\r\n referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n referenceLayer.appendChild(tooltipLayer);\r\n document.body.appendChild(referenceLayer);\r\n\r\n //set proper position\r\n _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n }\r\n\r\n /**\r\n * Get an element position on the page\r\n * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n *\r\n * @api private\r\n * @method _getOffset\r\n * @param {Object} element\r\n * @returns Element's position info\r\n */\r\n function _getOffset(element) {\r\n var body = document.body;\r\n var docEl = document.documentElement;\r\n var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n var x = element.getBoundingClientRect();\r\n return {\r\n top: x.top + scrollTop,\r\n width: x.width,\r\n height: x.height,\r\n left: x.left + scrollLeft\r\n };\r\n }\r\n\r\n /**\r\n * Find the nearest scrollable parent\r\n * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n *\r\n * @param Element element\r\n * @return Element\r\n */\r\n function _getScrollParent(element) {\r\n var style = window.getComputedStyle(element);\r\n var excludeStaticParent = (style.position === \"absolute\");\r\n var overflowRegex = /(auto|scroll)/;\r\n\r\n if (style.position === \"fixed\") return document.body;\r\n \r\n for (var parent = element; (parent = parent.parentElement);) {\r\n style = window.getComputedStyle(parent);\r\n if (excludeStaticParent && style.position === \"static\") {\r\n continue;\r\n }\r\n if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n }\r\n\r\n return document.body;\r\n }\r\n\r\n /**\r\n * scroll a scrollable element to a child element\r\n *\r\n * @param Element parent\r\n * @param Element element\r\n * @return Null\r\n */\r\n function _scrollParentToElement (parent, element) {\r\n parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n }\r\n\r\n /**\r\n * Gets the current progress percentage\r\n *\r\n * @api private\r\n * @method _getProgress\r\n * @returns current progress percentage\r\n */\r\n function _getProgress() {\r\n // Steps are 0 indexed\r\n var currentStep = parseInt((this._currentStep + 1), 10);\r\n return ((currentStep / this._introItems.length) * 100);\r\n }\r\n\r\n /**\r\n * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n *\r\n * @param obj1\r\n * @param obj2\r\n * @returns obj3 a new object based on obj1 and obj2\r\n */\r\n function _mergeOptions(obj1,obj2) {\r\n var obj3 = {},\r\n attrname;\r\n for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n return obj3;\r\n }\r\n\r\n var introJs = function (targetElm) {\r\n var instance;\r\n\r\n if (typeof (targetElm) === 'object') {\r\n //Ok, create a new instance\r\n instance = new IntroJs(targetElm);\r\n\r\n } else if (typeof (targetElm) === 'string') {\r\n //select the target element with query selector\r\n var targetElement = document.querySelector(targetElm);\r\n\r\n if (targetElement) {\r\n instance = new IntroJs(targetElement);\r\n } else {\r\n throw new Error('There is no element with given selector.');\r\n }\r\n } else {\r\n instance = new IntroJs(document.body);\r\n }\r\n // add instance to list of _instances\r\n // passing group to _stamp to increment\r\n // from 0 onward somewhat reliably\r\n introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n return instance;\r\n };\r\n\r\n /**\r\n * Current IntroJs version\r\n *\r\n * @property version\r\n * @type String\r\n */\r\n introJs.version = VERSION;\r\n\r\n /**\r\n * key-val object helper for introJs instances\r\n *\r\n * @property instances\r\n * @type Object\r\n */\r\n introJs.instances = {};\r\n\r\n //Prototype\r\n introJs.fn = IntroJs.prototype = {\r\n clone: function () {\r\n return new IntroJs(this);\r\n },\r\n setOption: function(option, value) {\r\n this._options[option] = value;\r\n return this;\r\n },\r\n setOptions: function(options) {\r\n this._options = _mergeOptions(this._options, options);\r\n return this;\r\n },\r\n start: function (group) {\r\n _introForElement.call(this, this._targetElement, group);\r\n return this;\r\n },\r\n goToStep: function(step) {\r\n _goToStep.call(this, step);\r\n return this;\r\n },\r\n addStep: function(options) {\r\n if (!this._options.steps) {\r\n this._options.steps = [];\r\n }\r\n\r\n this._options.steps.push(options);\r\n\r\n return this;\r\n },\r\n addSteps: function(steps) {\r\n if (!steps.length) return;\r\n\r\n for(var index = 0; index < steps.length; index++) {\r\n this.addStep(steps[index]);\r\n }\r\n\r\n return this;\r\n },\r\n goToStepNumber: function(step) {\r\n _goToStepNumber.call(this, step);\r\n\r\n return this;\r\n },\r\n nextStep: function() {\r\n _nextStep.call(this);\r\n return this;\r\n },\r\n previousStep: function() {\r\n _previousStep.call(this);\r\n return this;\r\n },\r\n exit: function(force) {\r\n _exitIntro.call(this, this._targetElement, force);\r\n return this;\r\n },\r\n refresh: function() {\r\n _refresh.call(this);\r\n return this;\r\n },\r\n onbeforechange: function(providedCallback) {\r\n if (typeof (providedCallback) === 'function') {\r\n this._introBeforeChangeCallback = providedCallback;\r\n } else {\r\n throw new Error('Provided callback for onbeforechange was not a function');\r\n }\r\n return this;\r\n },\r\n onchange: function(providedCallback) {\r\n if (typeof (providedCallback) === 'function') {\r\n this._introChangeCallback = providedCallback;\r\n } else {\r\n throw new Error('Provided callback for onchange was not a function.');\r\n }\r\n return this;\r\n },\r\n onafterchange: function(providedCallback) {\r\n if (typeof (providedCallback) === 'function') {\r\n this._introAfterChangeCallback = providedCallback;\r\n } else {\r\n throw new Error('Provided callback for onafterchange was not a function');\r\n }\r\n return this;\r\n },\r\n oncomplete: function(providedCallback) {\r\n if (typeof (providedCallback) === 'function') {\r\n this._introCompleteCallback = providedCallback;\r\n } else {\r\n throw new Error('Provided callback for oncomplete was not a function.');\r\n }\r\n return this;\r\n },\r\n onhintsadded: function(providedCallback) {\r\n if (typeof (providedCallback) === 'function') {\r\n this._hintsAddedCallback = providedCallback;\r\n } else {\r\n throw new Error('Provided callback for onhintsadded was not a function.');\r\n }\r\n return this;\r\n },\r\n onhintclick: function(providedCallback) {\r\n if (typeof (providedCallback) === 'function') {\r\n this._hintClickCallback = providedCallback;\r\n } else {\r\n throw new Error('Provided callback for onhintclick was not a function.');\r\n }\r\n return this;\r\n },\r\n onhintclose: function(providedCallback) {\r\n if (typeof (providedCallback) === 'function') {\r\n this._hintCloseCallback = providedCallback;\r\n } else {\r\n throw new Error('Provided callback for onhintclose was not a function.');\r\n }\r\n return this;\r\n },\r\n onexit: function(providedCallback) {\r\n if (typeof (providedCallback) === 'function') {\r\n this._introExitCallback = providedCallback;\r\n } else {\r\n throw new Error('Provided callback for onexit was not a function.');\r\n }\r\n return this;\r\n },\r\n onskip: function(providedCallback) {\r\n if (typeof (providedCallback) === 'function') {\r\n this._introSkipCallback = providedCallback;\r\n } else {\r\n throw new Error('Provided callback for onskip was not a function.');\r\n }\r\n return this;\r\n },\r\n onbeforeexit: function(providedCallback) {\r\n if (typeof (providedCallback) === 'function') {\r\n this._introBeforeExitCallback = providedCallback;\r\n } else {\r\n throw new Error('Provided callback for onbeforeexit was not a function.');\r\n }\r\n return this;\r\n },\r\n addHints: function() {\r\n _populateHints.call(this, this._targetElement);\r\n return this;\r\n },\r\n hideHint: function (stepId) {\r\n _hideHint.call(this, stepId);\r\n return this;\r\n },\r\n hideHints: function () {\r\n _hideHints.call(this);\r\n return this;\r\n },\r\n showHint: function (stepId) {\r\n _showHint.call(this, stepId);\r\n return this;\r\n },\r\n showHints: function () {\r\n _showHints.call(this);\r\n return this;\r\n },\r\n removeHints: function () {\r\n _removeHints.call(this);\r\n return this;\r\n },\r\n removeHint: function (stepId) {\r\n _removeHint.call(this, stepId);\r\n return this;\r\n },\r\n showHintDialog: function (stepId) {\r\n _showHintDialog.call(this, stepId);\r\n return this;\r\n }\r\n };\r\n\r\n return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n //needed for localization of labels and contents of the tour\r\n const loc = KorAP.Locale;\r\n\r\n //labels for nextStep, previousStep, done and abort\r\n loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n \r\n //localization guided tour gTstartSearch\r\n loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n \t\t \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n \t\t \"We lead you step by step through an example. </p>\"; \r\n loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" + loc.TOUR_Qexample + \"'.\";\r\n loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n loc.TOUR_annotAss = loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\"; \r\n loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\"; \r\n loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n //localization guided Tour gTshowResults\r\n loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n loc.TOUR_snippet = loc.TOUR_snippet || \"Click on a match to show a larger snippet.\";\r\n loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n loc.TOUR_metadatab = loc.TOUR_metadatab || \"Display of metadata\";\r\n loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n \r\n //localization of button labels\r\n let labelOpts= {\r\n 'skipLabel': loc.TOUR_lskip, \r\n 'prevLabel': loc.TOUR_lprev,\r\n 'nextLabel': loc.TOUR_lnext,\r\n 'doneLabel': loc.TOUR_ldone,\r\n 'showStepNumbers': false\r\n };\r\n \r\n //usability options of tours\r\n let usabilityOpts ={\r\n 'showBullets': false,\r\n 'overlayOpacity': 0.7,\r\n 'exitOnOverlayClick': false,\r\n 'disableInteraction': true, \r\n 'hideNext': true,\r\n 'hidePrev': true\r\n };\r\n \r\n var doe = document;\r\n\r\n return{\r\n\r\n /** \r\n * Guided Tour gTstartSearch: Explains the search functionality\r\n */\r\n gTstartSearch:function(elparam){\r\n let intro = introClass();\r\n intro.setOptions(labelOpts);\r\n intro.setOption('tooltipClass', 'gTstartSearch');\r\n /*\r\n * Sets button labels for the last step of the tour\r\n * Because Kalamar is a multipage webapplication, this tours starts by\r\n * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n */\r\n intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n intro.setOptions(usabilityOpts);\r\n \r\n //for testing purposes\r\n if(elparam){\r\n doe = elparam;\r\n }\r\n\r\n let input = doe.querySelector(\"#q-field\");\r\n input.value=\"\";\r\n \r\n\r\n //steps of the example tour\r\n let Steps =[\r\n {\r\n intro: loc.TOUR_welc,\r\n },\r\n {\r\n element: '#q-field',\r\n intro: loc.TOUR_sear1,\r\n position: 'bottom'\r\n },\r\n {\r\n element: '#hint',\r\n intro: loc.TOUR_searAnnot,\r\n position: 'bottom'\r\n },\r\n {\r\n element: doe.querySelector(\"#hint > .menu.hint\"),\r\n intro: loc.TOUR_annotAss,\r\n position: 'bottom',\r\n }, \r\n {\r\n element:'#vc-choose',\r\n intro: loc.TOUR_vccho1,\r\n position: \"bottom\",\r\n },\r\n {\r\n element:'#vc-view',\r\n intro: loc.TOUR_vccho2,\r\n position: \"bottom\",\r\n }, \r\n {\r\n element: doe.querySelector('.statistic'),\r\n intro: loc.TOUR_vcStat1,\r\n position: \"left\",\r\n },\r\n {\r\n element: doe.querySelector('.stattable'),\r\n intro: loc.TOUR_vcStat2,\r\n position: \"bottom\",\r\n },\r\n {\r\n element: doe.querySelector('#ql-field').parentNode,\r\n intro: loc.TOUR_qlfield,\r\n position: \"bottom\",\r\n }, \r\n {\r\n element:'#glimpse',\r\n intro: loc.TOUR_glimpse,\r\n position: \"bottom\",\r\n }, \r\n {\r\n element:'#view-tutorial',\r\n intro: loc.TOUR_help,\r\n position: \"bottom\",\r\n },\r\n {\r\n element: '#qsubmit',\r\n intro: loc.TOUR_seargo,\r\n position: \"bottom\",\r\n },\r\n ];\r\n\r\n //pass in the Steps array created earlier\r\n intro.setOptions({steps: Steps}); \r\n this.testPrerequ(Steps, intro);\r\n\r\n //changes before executing the single steps\r\n intro.onbeforechange(function(targetedElement){\r\n switch(targetedElement.id){\r\n case \"q-field\": \r\n /* \r\n * TODO:\r\n * #268 is not merged at the time beeing: \r\n * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n */\r\n targetedElement.value = loc.TOUR_Qexample;\r\n break;\r\n case \"vc-view\": \r\n let vchoo = doe.querySelector(\"#vc-choose\");\r\n let vcv = doe.querySelector(\"#vc-view\"); \r\n KorAP._delete.apply(KorAP.vc.root());\r\n \r\n KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n if(!(vcv.querySelector(\".active\"))){\r\n vchoo.click();\r\n /*\r\n * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n */\r\n intro._introItems[6].element = doe.querySelector('.statistic');\r\n intro._introItems[6].position = \"left\";\r\n } \r\n break; \r\n \r\n } \r\n \r\n if(this._currentStep == 7){\r\n let statbut = doe.querySelector('.statistic');\r\n statbut.click();\r\n intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n intro._introItems[7].position = \"bottom\";\r\n }\r\n });\r\n\r\n intro.onbeforeexit(function(){\r\n if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n KorAP.Hint.unshow();\r\n }\r\n });\r\n \r\n intro.onchange(function(targetElement) {\r\n var that = this; \r\n switch(this._currentStep){\r\n //hides Hint if back button is pressed \r\n case 2: \r\n if(KorAP.Hint.active()){\r\n KorAP.Hint.unshow(); \r\n }\r\n break;\r\n case 3:\r\n KorAP.Hint.show(false);\r\n KorAP.Hint.active().dontHide = true;\r\n intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n break;\r\n case 4: \r\n KorAP.Hint.unshow(); \r\n break;\r\n }\r\n }); \r\n \r\n // Execute at the end of the tour (By clicking at the done-Button)\r\n intro.oncomplete(function(){\r\n KorAP.session.set(\"tour\", true);\r\n doe.getElementById(\"qsubmit\").click();\r\n });\r\n\r\n return intro;\r\n },\r\n\r\n\r\n /* Guided Tour to explain the different views of the results */ \r\n gTshowResults: function(elparam){ \r\n \r\n let tourR = introClass();\r\n tourR.setOptions(usabilityOpts);\r\n \r\n //for testing purposes\r\n if(elparam){\r\n doe = elparam;\r\n }\r\n let StepsSR = [\r\n //Step 1, intro_item 0\r\n {\r\n element: '#search',\r\n intro: loc.TOUR_kwic ,\r\n position: \"auto\",\r\n },\r\n //Step 2, intro_item 1 \r\n {\r\n element: doe.querySelector(\"#search > ol > li\"),\r\n intro: loc.TOUR_snippet,\r\n position: \"bottom\",\r\n },\r\n //Step 3, intro_item 2 \r\n {\r\n element: doe.querySelector(\"#search > ol > li\"),\r\n intro: loc.TOUR_snippetb,\r\n position: \"bottom\",\r\n },\r\n //Step 4, intro_item 3\r\n {\r\n element: doe.querySelector(\".action > .metatable\"),\r\n intro: loc.TOUR_metadatab,\r\n position: \"bottom\",\r\n },\r\n //Step 5, intro_item 4\r\n {\r\n element: doe.querySelector(\".view.metatable\"),\r\n intro: loc.TOUR_metadata,\r\n position: \"auto\",\r\n },\r\n //Step 6, intro_item 5\r\n { \r\n element: doe.querySelector(\".action > .info\"),\r\n intro: loc.TOUR_tokenb,\r\n position: \"bottom\",\r\n },\r\n //Step 7, intro_item 6\r\n { \r\n element: doe.querySelector(\".view.tokentable\"),\r\n intro: loc.TOUR_token,\r\n position: \"auto\",\r\n },\r\n //Step 8, intro_item 7\r\n { \r\n element: doe.querySelector(\".tree\"),\r\n intro: loc.TOUR_treeb,\r\n position: \"bottom\",\r\n }, \r\n //Step 9, intro_item 8\r\n { \r\n element: doe.querySelector(\".view.relations\"),\r\n intro: loc.TOUR_tree,\r\n position: \"bottom\",\r\n }, \r\n //Step 10, intro_item 9\r\n { \r\n intro: loc.TOUR_tourdone, \r\n } \r\n ]\r\n \r\n tourR.setOptions({steps:StepsSR});\r\n tourR.setOptions(labelOpts);\r\n \r\n tourR.onbeforeexit(function(){\r\n KorAP.session.set(\"tour\", false);\r\n });\r\n //See also: https://introjs.com/docs/intro/options/\r\n tourR.setOption('scrollToElement', true);\r\n tourR.setOption('scrollTo','tooltip');\r\n this.testPrerequ(StepsSR, tourR);\r\n \r\n //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n tourR.onbeforechange(function(targetedElement){\r\n \r\n if(this._currentStep == 1){\r\n KorAP.session.set(\"tour\", false);\r\n }\r\n \r\n if(this._currentStep == 2){\r\n doe.querySelector(\"#search > ol > li\").click();\r\n tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n tourR._introItems[3].position = \"bottom\";\r\n }\r\n \r\n if(this._currentStep == 4){\r\n doe.querySelector(\".metatable\").click();\r\n tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n tourR._introItems[5].position = \"bottom\"; \r\n } \r\n \r\n if(this._currentStep == 6){\r\n doe.querySelector(\".info\").click();\r\n tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n tourR._introItems[7].element = doe.querySelector('.tree');\r\n tourR._introItems[7].position = \"bottom\";\r\n }\r\n \r\n if(this._currentStep == 8){\r\n doe.querySelector(\".tree\").click();\r\n let collect = document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n for(let i = 0; i < collect.length; i++){\r\n if (collect[i].innerText == loc.TOUR_Relations) {\r\n collect[i].click();\r\n break;\r\n }\r\n }\r\n tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n }\r\n }); \r\n \r\n return tourR;\r\n }, \r\n /* \r\n * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n */\r\n testPrerequ: function(steps, tour){\r\n //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n let StepsT = steps;\r\n let gtour = tour; \r\n gtour.stepCount = StepsT.length;\r\n\r\n //Array of intro content needed for efficient testing\r\n gtour.testIntros = [];\r\n\r\n for(let i = 0; i< StepsT.length; i++){\r\n gtour.testIntros.push(StepsT[i].intro);\r\n }\r\n },\r\n\r\n }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n // Limit the supported sandbox permissions, especially\r\n // to disallow 'same-origin'.\r\n let allowed = {\r\n \"scripts\" : 1,\r\n \"presentation\" : 1,\r\n \"forms\": 1,\r\n \"downloads-without-user-activation\" : 1,\r\n \"downloads\" : 1\r\n };\r\n\r\n return {\r\n create : function (data) {\r\n return Object.create(this)._init(data);\r\n },\r\n\r\n // Initialize service\r\n _init : function (data) {\r\n if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n throw Error(\"Service not well defined\");\r\n\r\n this.name = data[\"name\"];\r\n this.src = data[\"src\"];\r\n this.id = data[\"id\"];\r\n this.desc = data[\"desc\"];\r\n let _perm = new Set();\r\n let perm = data[\"permissions\"];\r\n if (perm && Array.isArray(perm)) {\r\n perm.forEach(function (p) {\r\n if (p in allowed) {\r\n _perm.add(p)\r\n }\r\n else {\r\n KorAP.log(0, \"Requested permission not allowed\");\r\n }\r\n });\r\n };\r\n\r\n this._perm = _perm;\r\n \r\n // There is no close method defined yet\r\n if (!this.close) {\r\n this.close = function () {\r\n this._closeIframe();\r\n }\r\n }\r\n \r\n return this;\r\n },\r\n\r\n /**\r\n * The element of the service as embedded in the panel\r\n */\r\n load : function () {\r\n if (this._load)\r\n return this._load;\r\n\r\n if (window.location.protocol == 'https:' &&\r\n this.src.toLowerCase().indexOf('https:') != 0) {\r\n KorAP.log(0, \"Service endpoint is insecure\");\r\n return;\r\n };\r\n\r\n // Spawn new iframe\r\n let e = document.createElement('iframe');\r\n e.setAttribute('allowTransparency',\"true\");\r\n e.setAttribute('frameborder', 0);\r\n // Allow forms in Plugins\r\n e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n e.style.height = '0px';\r\n e.setAttribute('name', this.id);\r\n e.setAttribute('src', this.src);\r\n \r\n this._load = e;\r\n return e;\r\n },\r\n\r\n /**\r\n * Send a message to the embedded service.\r\n */\r\n sendMsg : function (d) {\r\n let iframe = this.load();\r\n iframe.contentWindow.postMessage(\r\n d,\r\n '*'\r\n ); // TODO: Fix origin\r\n },\r\n\r\n // onClose : function () {},\r\n\r\n /**\r\n * Close the service iframe.\r\n */\r\n _closeIframe : function () {\r\n var e = this._load;\r\n if (e && e.parentNode) {\r\n e.parentNode.removeChild(e);\r\n };\r\n this._load = null;\r\n }\r\n };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n return {\r\n\r\n /**\r\n * Create new widget\r\n */\r\n create : function (data) {\r\n return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n },\r\n\r\n // Initialize widget\r\n _init : function () {\r\n this.isWidget = true;\r\n return this;\r\n },\r\n\r\n /**\r\n * The element of the widget as embedded in the view\r\n */\r\n show : function () {\r\n\r\n if (this._load) {\r\n if (this._el)\r\n this._el.classList.add('show');\r\n return this._load;\r\n }\r\n\r\n let obj = this.load();\r\n this._load.classList.add(\"widget\", \"show\");\r\n obj.setAttribute('loading', 'lazy');\r\n\r\n // Per default there should at least be a button\r\n // for settings, if the plugin requires settings.\r\n // Otherwise a button indicating this is a plugin\r\n // is a nice idea as well.\r\n \r\n this.actions.add(\r\n this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n // Temporary\r\n let str = this.name;\r\n if (this.desc !== undefined) {\r\n str += \"\\n\\n\" + this.desc;\r\n };\r\n window.alert(str);\r\n }.bind(this));\r\n \r\n return obj;\r\n },\r\n\r\n // Resize iframe\r\n resize : function (data) {\r\n this.show().style.height = data.height + 'px';\r\n },\r\n\r\n\r\n // On closing the widget view\r\n onClose : function () {\r\n if (this._mgr) {\r\n this._mgr._closeService(this.id);\r\n this._mgr = undefined;\r\n };\r\n }\r\n }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n * Require names for states, that should be quite short, so they\r\n * can easily be serialized and kept between page turns (via cookie\r\n * and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n return {\r\n\r\n /**\r\n * Constructor\r\n */\r\n create : function (value) {\r\n return Object.create(this)._init(value);\r\n },\r\n\r\n\r\n // Initialize\r\n _init : function (values) {\r\n const t = this;\r\n t._assoc = [];\r\n if (values == undefined) {\r\n t.values = [false,true];\r\n }\r\n else if (Array.isArray(values)) {\r\n t.values = values;\r\n }\r\n else {\r\n t.values = [values];\r\n }\r\n t.value = t.values[0];\r\n return t;\r\n },\r\n\r\n\r\n /**\r\n * Associate the state with some objects.\r\n */\r\n associate : function (obj) {\r\n\r\n // Check if the object has a setState() method\r\n if (obj.hasOwnProperty(\"setState\")) {\r\n this._assoc.push(obj);\r\n obj.setState(this.value);\r\n } else {\r\n console.log(\"Object \" + obj + \" has no setState() method\");\r\n }\r\n },\r\n\r\n\r\n /**\r\n * Set the state to a certain value.\r\n * This will set the state to all associated objects as well.\r\n */\r\n set : function (value) {\r\n if (value != this.value) {\r\n this.value = value;\r\n this._assoc.forEach(i => i.setState(value));\r\n };\r\n },\r\n\r\n\r\n /**\r\n * Get the state value\r\n */\r\n get : function () {\r\n return this.value;\r\n },\r\n\r\n\r\n /**\r\n * Get the number of associated objects\r\n */\r\n associates : function () {\r\n return this._assoc.length;\r\n },\r\n\r\n\r\n /**\r\n * Clear all associated objects\r\n */\r\n clear : function () {\r\n return this._assoc = [];\r\n },\r\n\r\n\r\n /**\r\n * Roll to the next value.\r\n * This may be used for toggling.\r\n */\r\n roll : function () {\r\n let next = 0;\r\n for (let i = 0; i < this.values.length - 1; i++) {\r\n if (this.value == this.values[i]) {\r\n next = i+1;\r\n break;\r\n };\r\n };\r\n this.set(this.values[next]);\r\n }\r\n }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n KorAP.Panel = KorAP.Panel || {};\r\n\r\n // Contains all servicess to address with\r\n // messages to them\r\n var services = {};\r\n var plugins = {};\r\n\r\n // TODO:\r\n // These should better be panels and every panel\r\n // has a buttonGroup\r\n\r\n // List of panels with dynamic buttons, i.e.\r\n // panels that may occur multiple times.\r\n var buttons = {\r\n match : []\r\n };\r\n\r\n // List of panels with static buttons, i.e.\r\n // panels that occur only once.\r\n var buttonsSingle = {\r\n query : [],\r\n result : []\r\n } \r\n \r\n // This is a counter to limit acceptable incoming messages\r\n // to a certain amount. For every message, this counter will\r\n // be decreased (down to 0), for every second this will be\r\n // increased (up to 100).\r\n // Once a widget surpasses the limit, it will be killed\r\n // and called suspicious.\r\n var maxMessages = 100;\r\n var limits = {};\r\n\r\n // TODO:\r\n // It may be useful to establish a watcher that pings\r\n // all widgets every second to see if it is still alive,\r\n // otherwise kill\r\n \r\n // Load Plugin server\r\n return {\r\n\r\n /**\r\n * Create new plugin management system\r\n */\r\n create : function () {\r\n return Object.create(this)._init();\r\n },\r\n\r\n /*\r\n * Initialize the plugin manager\r\n */\r\n _init : function () {\r\n return this;\r\n },\r\n\r\n /**\r\n * Register a plugin described as a JSON object.\r\n *\r\n * This is work in progress.\r\n *\r\n * Example:\r\n *\r\n * KorAP.Plugin.register({\r\n * 'name' : 'CatContent',\r\n * 'desc' : 'Some content about cats',\r\n * 'about' : 'https://localhost:5678/',\r\n * 'embed' : [{\r\n * 'panel' : 'match',\r\n * 'title' : loc.TRANSLATE,\r\n * 'classes' : ['translate']\r\n * 'onClick' : {\r\n * 'action' : 'addWidget',\r\n * 'template' : 'https://localhost:5678/?match={matchid}',\r\n * }\r\n * },{\r\n * 'title' : 'glemm',\r\n * 'panel' : 'query',\r\n * 'onClick' : {\r\n * 'action' : 'toggle',\r\n * 'state' : 'glemm',\r\n * 'service' : {\r\n * 'id' : 'glemm',\r\n * 'template' : 'https://localhost:5678/'\r\n * }\r\n * }\r\n * }]\r\n * });\r\n *\r\n */\r\n register : function (obj) {\r\n // TODO:\r\n // These fields need to be localized for display by a structure like\r\n // { de : { name : '..' }, en : { .. } }\r\n var name = obj[\"name\"];\r\n\r\n if (!name)\r\n throw new Error(\"Missing name of plugin\");\r\n\r\n var desc = obj[\"desc\"];\r\n \r\n // Register plugin by name\r\n var plugin = plugins[name] = {\r\n name : name,\r\n desc : desc,\r\n about : obj[\"about\"],\r\n widgets : [],\r\n services : []\r\n };\r\n\r\n if (typeof obj[\"embed\"] !== 'object')\r\n throw new Error(\"Embedding of plugin is no list\");\r\n \r\n // Embed all embeddings of the plugin\r\n var that = this;\r\n obj[\"embed\"].forEach(function(embed) {\r\n\r\n if (typeof embed !== 'object')\r\n throw new Error(\"Embedding of plugin is no object\");\r\n\r\n // Needs to be localized as well\r\n let title = embed[\"title\"]; \r\n let panel = embed[\"panel\"];\r\n let onClick = embed[\"onClick\"];\r\n let icon = embed[\"icon\"];\r\n \r\n if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n // The embedding will open a widget\r\n if (!onClick[\"action\"] ||\r\n onClick[\"action\"] == \"addWidget\" ||\r\n onClick[\"action\"] == \"setWidget\") {\r\n \r\n let cb = function (e) {\r\n\r\n // \"this\" is bind to the panel\r\n // \"this\".button is the button\r\n // \"that\" is the server object\r\n\r\n // The button has a state and the state is associated to the\r\n // a intermediate object to toggle the view\r\n if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n let s = this.button.state;\r\n\r\n // The associated service is existent\r\n if (services[this.button['widgetID']]) {\r\n s.roll();\r\n return;\r\n }\r\n\r\n // The service is not existent\r\n else {\r\n\r\n // Remove broken state associations\r\n s.clear();\r\n s.set(true);\r\n }\r\n };\r\n\r\n // Add the widget to the panel\r\n let id = that.addWidget(this, {\r\n \"name\": name,\r\n \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n \"permissions\": onClick[\"permissions\"],\r\n \"desc\":desc\r\n });\r\n plugin[\"widgets\"].push(id);\r\n \r\n // If a state exists, associate with a mediator object\r\n if ('state' in this.button) {\r\n this.button['widgetID'] = id;\r\n this.button.state.associate({\r\n setState : function (value) {\r\n // Minimize the widget\r\n if (value == false) {\r\n services[id].minimize();\r\n }\r\n else {\r\n services[id].show(); \r\n };\r\n }\r\n });\r\n }\r\n };\r\n\r\n\r\n // Button object\r\n let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n // Create a boolean state value, that initializes to true == opened\r\n obj['state'] = stateClass.create([true, false]);\r\n };\r\n \r\n // Add to dynamic button list (e.g. for matches)\r\n if (buttons[panel]) {\r\n buttons[panel].push([title, obj, cb]);\r\n }\r\n\r\n // Add to static button list (e.g. for query) already loaded\r\n else if (KorAP.Panel[panel]) {\r\n KorAP.Panel[panel].actions.add(title, obj, cb);\r\n }\r\n\r\n // Add to static button list (e.g. for query) not yet loaded\r\n else {\r\n buttonsSingle[panel].push([title, obj, cb]);\r\n }\r\n }\r\n\r\n // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n // TODO:\r\n // Accept a \"value\" list here for toggling, which should\r\n // also allow for \"rolling\" through states via CSS classes\r\n // as 'toggle-true', 'toggle-false' etc.\r\n\r\n let state = stateClass.create([true, false]);\r\n\r\n // TODO:\r\n // Lazy registration (see above!)\r\n KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n // Add the service\r\n let id = this.addService({\r\n \"name\" : name,\r\n // TODO:\r\n // Use the \"service\" keyword\r\n \"src\" : onClick[\"template\"],\r\n \"permissions\" : onClick[\"permissions\"]\r\n });\r\n\r\n // TODO:\r\n // This is a bit stupid to get the service window\r\n let service = services[id];\r\n let iframe = service.load();\r\n\r\n // Create object to communicate the toggle state\r\n // once the iframe is loaded.\r\n iframe.onload = function () {\r\n let sendToggle = {\r\n setState : function (val) {\r\n service.sendMsg({\r\n action: 'state',\r\n key : onClick['state'],\r\n value : val\r\n });\r\n }\r\n };\r\n\r\n // Associate object with the state\r\n state.associate(sendToggle); \r\n };\r\n\r\n plugin[\"services\"].push(id);\r\n };\r\n }, this);\r\n },\r\n\r\n // TODO:\r\n // Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n // but as simple as possible\r\n _interpolateURI : function (uri, obj) {\r\n // ...\r\n },\r\n\r\n\r\n /**\r\n * Get named button group - better rename to \"action\"\r\n */\r\n buttonGroup : function (name) {\r\n if (buttons[name] != undefined) {\r\n return buttons[name];\r\n } else if (buttonsSingle[name] != undefined) {\r\n return buttonsSingle[name];\r\n };\r\n return [];\r\n },\r\n\r\n /**\r\n * Clear named button group - better rename to \"action\"\r\n */\r\n clearButtonGroup : function (name) {\r\n if (buttons[name] != undefined) {\r\n buttons[name] = [];\r\n } else if (buttonsSingle[name] != undefined) {\r\n buttonsSingle[name] = [];\r\n }\r\n },\r\n\r\n // Optionally initialize the service mechanism and get an ID\r\n _getServiceID : function () {\r\n\r\n // Is it the first service?\r\n if (!this._listener) {\r\n\r\n /*\r\n * Establish the global 'message' hook.\r\n */\r\n this._listener = this._receiveMsg.bind(this);\r\n window.addEventListener(\"message\", this._listener);\r\n \r\n // Every second increase the limits of all registered services\r\n this._timer = window.setInterval(function () {\r\n for (let i = 0; i < limits.length; i++) {\r\n if (limits[i]++ >= maxMessages) {\r\n limits[i] = maxMessages;\r\n }\r\n }\r\n }, 1000);\r\n };\r\n\r\n // Create a unique random ID per service\r\n return 'id-' + this._randomID();\r\n },\r\n \r\n /**\r\n * Add a service in a certain panel and return the id.\r\n */\r\n addService : function (data) {\r\n if (!data[\"src\"])\r\n return;\r\n\r\n let id = this._getServiceID();\r\n\r\n data[\"id\"] = id;\r\n\r\n // Create a new service\r\n let service = serviceClass.create(data);\r\n \r\n services[id] = service;\r\n limits[id] = maxMessages;\r\n\r\n // Add service to panel\r\n this.element().appendChild(\r\n service.load()\r\n );\r\n \r\n return id;\r\n },\r\n\r\n \r\n /**\r\n * Open a new widget view in a certain panel and return\r\n * the id.\r\n */\r\n addWidget : function (panel, data) {\r\n // panel, name, src, permissions\r\n\r\n let id = this._getServiceID();\r\n\r\n data[\"id\"] = id;\r\n \r\n // Create a new widget\r\n var widget = widgetClass.create(data);\r\n\r\n // Store the widget based on the identifier\r\n services[id] = widget;\r\n limits[id] = maxMessages;\r\n\r\n widget._mgr = this;\r\n\r\n // Add widget to panel\r\n panel.add(widget);\r\n\r\n return id;\r\n },\r\n\r\n\r\n /**\r\n * Get service by identifier\r\n */\r\n service : function (id) {\r\n return services[id];\r\n },\r\n\r\n \r\n // Receive a call from an embedded service.\r\n // The handling needs to be very careful,\r\n // as this can easily become a security nightmare.\r\n _receiveMsg : function (e) {\r\n // Get event data\r\n var d = e.data;\r\n\r\n // If no data given - fail\r\n // (probably check that it's an assoc array)\r\n if (!d)\r\n return;\r\n\r\n // e.origin is probably set and okay - CHECK!\r\n\r\n // Get origin ID\r\n var id = d[\"originID\"];\r\n\r\n // If no origin ID given - fail\r\n if (!id)\r\n return;\r\n\r\n // Get the service\r\n let service = services[id];\r\n\r\n // If the addressed service does not exist - fail\r\n if (!service)\r\n return;\r\n\r\n // Check for message limits\r\n if (limits[id]-- < 0) {\r\n\r\n // Kill service\r\n KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n // TODO:\r\n // Potentially kill the whole plugin!\r\n\r\n // This removes all connections before closing the service \r\n this._closeService(service.id);\r\n\r\n // if (service.isWidget)\r\n service.close();\r\n \r\n return;\r\n };\r\n\r\n // Resize the iframe\r\n switch (d.action) {\r\n case 'resize':\r\n if (service.isWidget)\r\n service.resize(d);\r\n break;\r\n\r\n // Log message from iframe\r\n case 'log':\r\n KorAP.log(d.code, d.msg, service.src);\r\n break;\r\n\r\n // Modify pipes\r\n case 'pipe':\r\n if (KorAP.Pipe != undefined) {\r\n if (d.job == 'del') {\r\n KorAP.Pipe.remove(d.service);\r\n } else {\r\n KorAP.Pipe.append(d.service);\r\n };\r\n };\r\n break;\r\n\r\n // Get information from the embedding platform\r\n case 'get':\r\n\r\n // Get KoralQuery\r\n if (d.key == 'KQ') {\r\n if (KorAP.koralQuery !== undefined) { \r\n d[\"value\"] = KorAP.koralQuery;\r\n };\r\n }\r\n\r\n // Get Query information from from\r\n else if (d.key == 'QueryForm') {\r\n let doc = document;\r\n let v = d[\"value\"] = {};\r\n\r\n var el;\r\n if (el = doc.getElementById('q-field')) {\r\n v[\"q\"] = el.value;\r\n };\r\n if (el = doc.getElementById('ql-field')) {\r\n v[\"ql\"] = el.value;\r\n };\r\n if (el = KorAP.vc) {\r\n v[\"cq\"] = el.toQuery();\r\n };\r\n }\r\n\r\n // Get Query information from parameters\r\n else if (d.key == 'QueryParam') {\r\n\r\n // Supported in all modern browsers\r\n var p = new URLSearchParams(window.location.search);\r\n let v = d[\"value\"] = {};\r\n v[\"q\"] = p.get('q');\r\n v[\"ql\"] = p.get('ql');\r\n v[\"cq\"] = p.get('cq');\r\n };\r\n };\r\n\r\n // data needs to be mirrored\r\n if (d._id) {\r\n service.sendMsg(d);\r\n };\r\n\r\n // TODO:\r\n // Close\r\n },\r\n\r\n // Close the service\r\n _closeService : function (id) {\r\n delete limits[id];\r\n \r\n // Close the iframe\r\n if (services[id] && services[id]._closeIframe) {\r\n services[id]._closeIframe();\r\n\r\n // Remove from list\r\n delete services[id];\r\n };\r\n\r\n\r\n // Remove listeners in case no widget\r\n // is available any longer\r\n if (Object.keys(limits).length == 0)\r\n this._removeListener();\r\n },\r\n\r\n // Get a random identifier\r\n _randomID : function () {\r\n return randomID(20);\r\n },\r\n\r\n // Remove the listener\r\n _removeListener : function () {\r\n window.clearInterval(this._timer);\r\n this._timer = undefined;\r\n window.removeEventListener(\"message\", this._listener);\r\n this._listener = undefined;\r\n },\r\n\r\n /**\r\n * Return the service element.\r\n */\r\n element : function () {\r\n if (!this._el) {\r\n this._el = document.createElement('div');\r\n this._el.setAttribute(\"id\", \"services\");\r\n }\r\n return this._el;\r\n },\r\n \r\n // Destructor, just for testing scenarios\r\n destroy : function () {\r\n limits = {};\r\n Object.keys(services).forEach(\r\n s => services[s].close()\r\n );\r\n services = {};\r\n Object.keys(buttons).forEach(\r\n b => buttons[b] = []\r\n );\r\n Object.keys(buttonsSingle).forEach(\r\n b => buttonsSingle[b] = []\r\n );\r\n\r\n if (this._el) {\r\n let e = this._el;\r\n if (e.parentNode) {\r\n e.parentNode.removeChild(e);\r\n };\r\n this._el = null;\r\n };\r\n \r\n this._removeListener();\r\n }\r\n };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n // Trim and check\r\n function _notNull (service) {\r\n service = service.trim();\r\n if (service.match(notNullRe)) {\r\n return service;\r\n };\r\n return null;\r\n };\r\n \r\n return {\r\n\r\n /**\r\n * Constructor\r\n */\r\n create : function () {\r\n const obj = Object.create(this);\r\n obj._pipe = [];\r\n return obj;\r\n },\r\n\r\n \r\n /**\r\n * Append service to pipe.\r\n */\r\n append : function (service) {\r\n service = _notNull(service);\r\n if (service) {\r\n this._pipe.push(service);\r\n this._update();\r\n };\r\n },\r\n\r\n \r\n /**\r\n * Prepend service to pipe.\r\n */\r\n prepend : function (service) {\r\n service = _notNull(service);\r\n if (service) {\r\n this._pipe.unshift(service);\r\n this._update();\r\n };\r\n },\r\n\r\n\r\n /**\r\n * Remove service from the pipe.\r\n */\r\n remove : function (service) {\r\n const i = this._pipe.indexOf(service);\r\n if (i != -1) {\r\n this._pipe.splice(i, 1);\r\n this._update();\r\n };\r\n },\r\n\r\n\r\n /**\r\n * The number of services in the pipe.\r\n */\r\n size : function () {\r\n return this._pipe.length;\r\n },\r\n\r\n\r\n /**\r\n * Return the pipe as a string.\r\n */\r\n toString : function () {\r\n return this._pipe.join(',');\r\n },\r\n\r\n\r\n /**\r\n * Update the pipe value.\r\n */\r\n _update : function () {\r\n if (this.e != null) {\r\n this.e.setAttribute(\"value\", this.toString());\r\n };\r\n },\r\n \r\n\r\n /**\r\n * Return the pipe element.\r\n */\r\n element : function () {\r\n let e = this.e;\r\n if (e == null) {\r\n e = this.e = document.createElement('input');\r\n e.setAttribute(\"type\",\"text\");\r\n e.setAttribute(\"name\",\"pipe\");\r\n e.classList.add(\"pipe\");\r\n };\r\n return e;\r\n }\r\n };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n // TODO:\r\n // - https://github.com/honza/140medley/blob/master/140medley.js\r\n // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n // - r.addEventListener(\"progress\", updateProgress, false);\r\n // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n KorAP.API = KorAP.API || {};\r\n\r\n const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n /**\r\n * Retrieve information about a match\r\n */\r\n KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n // match is a KorAP.Match object\r\n let url = KorAP.URL + '/corpus';\r\n /*\r\n url += '/' + match.corpusID;\r\n url += '/' + match.docID;\r\n url += '/' + match.textID;\r\n */\r\n\r\n // This is for legacy support\r\n const legacy = legacySigle.exec(match.textSigle);\r\n let docFragment = \"\";\r\n if (legacy !== null && legacy[0]) {\r\n docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n }\r\n else {\r\n docFragment = match.textSigle;\r\n }\r\n\r\n docFragment += '/' + match.matchID;\r\n url += '/' + docFragment;\r\n\r\n // { spans: true, layer:x, foundry : y}\r\n if (param['spans'] == true) {\r\n url += '?spans=true';\r\n docFragment += ' +spans ';\r\n if (param['foundry'] !== undefined) {\r\n\t url += '&foundry=' + param['foundry'];\r\n docFragment += param['foundry'];\r\n };\r\n if (param['layer'] !== undefined) {\r\n\t url += '&layer=' + param['layer'];\r\n docFragment += '/'+param['layer'];\r\n }\r\n }\r\n \r\n // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n else {\r\n // TODO\r\n docFragment += ' -spans';\r\n url += '?spans=false';\r\n }\r\n\r\n KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n };\r\n\r\n\r\n /**\r\n * Retrieve information about a document.\r\n */\r\n KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n // doc is a KorAP.Match object\r\n let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n if (param['fields'] !== undefined) {\r\n url += '?fields='; // TODO!\r\n }\r\n else {\r\n url += '?fields=@all'; // TODO: Maybe '*'?\r\n }\r\n\r\n KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n };\r\n\r\n\r\n /**\r\n * Retrieve information about virtual corpora\r\n */\r\n KorAP.API.getCollections = function (cb) {\r\n KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n };\r\n\r\n \r\n /**\r\n * Retrieve information about corpus statistic\r\n * \r\n * Example URL: /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n * \r\n * @param cq corpus query (formerly collectionQuery)\r\n * \r\n * Adress the MOJO-Endpoint for example with\r\n * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n */\r\n KorAP.API.getCorpStat = function (cq, cb){\r\n \tlet url = KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n };\r\n\r\n\r\n /**\r\n * Retrieve a list of all plugin objects to\r\n * establish in the frontend.\r\n */\r\n KorAP.API.getPluginList = function (url, cb) {\r\n KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n };\r\n\r\n /**\r\n * General function to communicate JS Objects with the server\r\n * \r\n * @param {HTTMLRequestType} requestType Should be \"GET\", \"PUT\", \"POST\" or \"DELETE\"\r\n * @param {String} url The url that specifies where the JSON file is (\"GET\"), will be (\"PUT\" and \"POST\") or will have been (\"DELETE\")\r\n * @param {String} title How to store this request in the logs\r\n * @param {JSObj} jsObj For \"PUT\" and \"POST\". The JS Object that is getting transfered. This function stringifies it.\r\n * @param {function} returnValueCB For \"GET\". The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n */ \r\n function _actionJSON (requestType, url, title, jsObj, returnValueCB, errorCB) {\r\n const req = new XMLHttpRequest();\r\n req.open(requestType, url, true); \r\n // Dispatch global \"window\" event. See Kalamar::Plugin::Piwik\r\n const reqE = new CustomEvent('korapRequest', {\r\n bubbles : false,\r\n detail: {\r\n \"url\" : url,\r\n \"title\" : title\r\n }\r\n });\r\n window.dispatchEvent(reqE);\r\n \r\n req.setRequestHeader(\"Accept\", \"application/json\");\r\n req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n req.onreadystatechange = function () {\r\n /*\r\n\t States:\r\n\t 0 - unsent (prior to open)\r\n\t 1 - opened (prior to send)\r\n\t 2 - headers received\r\n\t 3 - loading (responseText has partial data)\r\n\t 4 - done\r\n */\r\n if (this.readyState == 4) {\r\n\r\n if (requestType === \"GET\") { //GET\r\n let retJSObj;\r\n try {\r\n retJSObj = JSON.parse(this.responseText);\r\n }\r\n catch (e) {\r\n KorAP.log(0, e);\r\n console.log(e);\r\n returnValueCB(undefined);\r\n return;\r\n };\r\n\r\n if (retJSObj !== undefined && retJSObj[\"errors\"] !== undefined) {\r\n retJSObj[\"errors\"].forEach(\r\n e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n );\r\n }\r\n\r\n else if (this.status !== 200) {\r\n KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n };\r\n\r\n if (this.status === 200) {\r\n returnValueCB(retJSObj);\r\n }\r\n\r\n else {\r\n returnValueCB(undefined);\r\n };\r\n\r\n } else { // PUT, POST, DELETE\r\n if (this.status >= 300 || this.status < 200) { //Error\r\n KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n };\r\n };\r\n // Call the callback function (no matter requestType) if one is given.\r\n if (typeof(errorCB) === \"function\"){\r\n errorCB({\r\n \"status\" : this.status,\r\n \"statusText\" : this.statusText\r\n });\r\n }; \r\n };\r\n };\r\n\r\n /*Set a value for .timeout to use this functionality */\r\n //req.ontimeout = function () {\r\n // KorAP.log(0, 'Request Timeout');\r\n //};\r\n if (requestType === \"POST\" || requestType === \"PUT\") {\r\n req.send(JSON.stringify(jsObj));\r\n } else { //GET, DELETE\r\n req.send();\r\n };\r\n };\r\n\r\n /**\r\n * General method to get JSON information.\r\n * \r\n * @param {String} url The url at which the JSON File will be located\r\n * @param {function} returnValueCB The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n * @param {String} title How to store this request in the logs\r\n * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n */ \r\n KorAP.API.getJSON = function (url, returnValueCB, title, errorCB) {\r\n _actionJSON(\"GET\", url, title, undefined, returnValueCB, errorCB);\r\n };\r\n\r\n /**\r\n * General method to put JSON information.\r\n * \r\n * @param {String} url The url at which the JSON File will be located\r\n * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n * @param {String} title How to store this request in the logs\r\n * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n */ \r\n KorAP.API.putJSON = function (url, jsObj, title, errorCB) {\r\n _actionJSON(\"PUT\", url, title, jsObj, undefined, errorCB);\r\n };\r\n\r\n /**\r\n * General method to post JSON information.\r\n * \r\n * @param {String} url The url at which the JSON File will be located\r\n * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n * @param {String} title How to store this request in the logs\r\n * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n */ \r\n KorAP.API.postJSON = function (url, jsObj, title, errorCB) {\r\n _actionJSON(\"POST\", url, title, jsObj, undefined, errorCB);\r\n };\r\n\r\n /**\r\n * General method to delete a file at a specific URL\r\n * \r\n * @param {String} url The url at which the to be deleted file is located\r\n * @param {String} title How to store this request in the logs\r\n * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n */ \r\n KorAP.API.deleteJSON = function (url, title, errorCB) {\r\n _actionJSON(\"DELETE\", url, title, undefined, undefined, errorCB);\r\n };\r\n\r\n\r\n // Stored query related functions\r\n\r\n /**\r\n * Retrieve saved list of queries\r\n * \r\n * @param {function} returnValueCB The callback function that receives the JS object Listof queries, already parsed\r\n * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n */\r\n KorAP.API.getQueryList = function (returnValueCB, errorCB){\r\n KorAP.API.getJSON(KorAP.URL + \"/query/\", returnValueCB, \"getSavedQueryList\", errorCB);\r\n };\r\n\r\n /**\r\n * Retrieve specific saved query by query name\r\n * \r\n * @param {String} qn The name of the query to be retrieved. Must be a string\r\n * @param {function} returnValueCB The callback function that receives the query JS object Object, already parsed\r\n * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n */\r\n KorAP.API.getQuery = function (qn, returnValueCB, errorCB){\r\n KorAP.API.getJSON(KorAP.URL + \"/query/\" + qn, returnValueCB, \"getSavedQuery of name \"+ qn, errorCB);\r\n };\r\n\r\n /**\r\n * Put new query by query name\r\n * \r\n * @param {String} qn The name of the new query\r\n * @param {JSObj} jsObj The query. This will be stringified\r\n * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n */\r\n KorAP.API.putQuery = function (qn, jsObj, errorCB){\r\n KorAP.API.putJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"putQuery of name \"+ qn, errorCB);\r\n };\r\n\r\n /**\r\n * Post new query by query name\r\n * \r\n * @param {String} qn The name of the new query\r\n * @param {JSObj} jsObj The query. This will be stringified\r\n * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n */\r\n KorAP.API.postQuery = function (qn, jsObj, errorCB){\r\n KorAP.API.postJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"postQuery of name \"+ qn, errorCB);\r\n };\r\n\r\n /**\r\n * delete query by query name\r\n * \r\n * @param {String} qn The name of the to be deleted query\r\n * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n */\r\n KorAP.API.deleteQuery = function (qn, errorCB){\r\n KorAP.API.deleteJSON(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, errorCB);\r\n };\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\n window.PArok=function(k,c){if(c){k=document.createElement('a');k.href=c}var q=k.search,b=RegExp,f=String.fromCharCode,t='il',x=[],o,n=Math.pow;d=k.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);p=function(u){var a=0,e,g='',m;while(a<u.length){m=u.charAt(a++);if(m.match(/[A-Za-z]/)){g+=f((m<='Z'?90:122)>=(m=m.charCodeAt(0)+13)?m:m-26)}else if(m=='-'){e='';m=u.charAt(a++);while(m.match(/\\d/)){e+=m;m=u.charAt(a++)}a--;g+=f(parseInt(e))}else return}l=g.length;r=Math.abs(673%l-l);g=g.substr(r)+g.substr(0,r);o='';for(i=0;i<l;i++){o+=f(g.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)))}return o};while(q){q=q.replace(/^[\\?\\&]([^\\&]+)/,'');o=b.$1;if(o.match(/^(sid|b?cc|to)=(.+)$/)){if(b.$1=='sid')x.push('to='+p(b.$2)+'@'+p(d[2]));else x.push(b.$1+'='+p(b.$2));}else x.push(o.replace(/\\+/g,' '))}location.href='ma'+t+'to:?'+x.join('&');return false};document.querySelectorAll(\".PArok\").forEach(i=>i.addEventListener(\"click\",function(e){e.preventDefault();window.PArok(false,this.href=='#'?this.getAttribute('data-href'):this.href)}))\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n 'match',\r\n 'hint',\r\n 'vc',\r\n 'tutorial',\r\n 'lib/domReady',\r\n 'vc/array',\r\n 'lib/alertify',\r\n 'session',\r\n 'selectMenu',\r\n 'panel/result',\r\n 'panel/query',\r\n 'tour/tours',\r\n 'plugin/server',\r\n 'pipe',\r\n 'api',\r\n 'mailToChiffre',\r\n 'util',\r\n 'state'\r\n], function (matchClass,\r\n hintClass,\r\n vcClass,\r\n tutClass,\r\n domReady,\r\n vcArray,\r\n alertifyClass,\r\n sessionClass,\r\n selectMenuClass,\r\n resultPanelClass,\r\n queryPanelClass,\r\n tourClass,\r\n pluginClass,\r\n pipeClass) {\r\n\r\n const d = document;\r\n\r\n // Set base URL\r\n KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n // Get koralQuery response\r\n const kqe = d.getElementById('koralQuery');\r\n if (kqe !== null) {\r\n KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n };\r\n \r\n // Create suffix if KorAP is run in a subfolder\r\n KorAP.session = sessionClass.create(\r\n KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n );\r\n\r\n // Override KorAP.log\r\n window.alertify = alertifyClass;\r\n KorAP.log = function (code, msg, src) {\r\n\r\n if (src) {\r\n msg += '<code class=\"src\">'+src+'</code>';\r\n };\r\n\r\n // Use alertify to log errors\r\n alertifyClass.log(\r\n (code === 0 ? '' : code + ': ') +\r\n msg,\r\n 'error',\r\n 10000\r\n );\r\n };\r\n\r\n KorAP.vc = vcClass.create(vcArray); \r\n\r\n let gt;\r\n if (gt = document.getElementById('link-guided-tour')) {\r\n gt.setAttribute('href', '#');\r\n gt.addEventListener('click', function(){\r\n tourClass.gTstartSearch().start();\r\n });\r\n \r\n KorAP.tourshowR = function(){\r\n tourClass.gTshowResults().start();\r\n };\r\n };\r\n\r\n domReady(function (event) {\r\n \r\n var obj = {};\r\n\r\n // What should be visible in the beginning?\r\n var show = KorAP.session.get('show') || {};\r\n \r\n KorAP.Panel = KorAP.Panel || {}\r\n\r\n /**\r\n * Release notifications\r\n */\r\n d.querySelectorAll('#notifications div.notify').forEach(\r\n function(e) {\r\n let msg = e.textContent;\r\n\r\n let src = e.getAttribute('data-src');\r\n if (src) {\r\n msg += '<code class=\"src\">'+src+'</code>';\r\n };\r\n\r\n let type = e.getAttribute('data-type') || \"error\";\r\n alertifyClass.log(msg, type, 10000);\r\n }\r\n );\r\n\r\n /**\r\n * Replace Virtual Corpus field\r\n */\r\n var vcname, vcchoose;\r\n var input = d.getElementById('cq');\r\n\r\n var vc = KorAP.vc;\r\n \r\n // Add vc name object\r\n if (input) {\r\n input.style.display = 'none';\r\n vcname = d.createElement('span');\r\n vcname.setAttribute('id', 'vc-choose');\r\n vcname.classList.add('select');\r\n\r\n // Load virtual corpus object\r\n // Supports \"collection\" for legacy reasons\r\n if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n try {\r\n vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n }\r\n catch (e) {\r\n KorAP.log(0,e);\r\n }\r\n };\r\n\r\n vcchoose = vcname.addE('span');\r\n vcchoose.addT(vc.getName());\r\n\r\n if (vc.wasRewritten()) {\r\n vcchoose.classList.add('rewritten');\r\n };\r\n\r\n input.parentNode.insertBefore(vcname, input);\r\n };\r\n\r\n /**\r\n * Add actions to match entries\r\n */\r\n var matchElements = d.querySelectorAll(\r\n '#search > ol > li'\r\n );\r\n\r\n matchElements.forEach(function(e) {\r\n\r\n // Define class for active elements\r\n if (e.classList.contains('active')) {\r\n if (this._match === undefined) {\r\n // lazyLoad\r\n matchClass.create(e).init();\r\n };\r\n }\r\n\r\n // Define class for inactive elements\r\n else {\r\n e.addEventListener('click', function (e) {\r\n if (this._match !== undefined)\r\n this._match.open();\r\n else {\r\n // lazyLoad\r\n matchClass.create(this).open();\r\n };\r\n // This would prevent the sidebar to go back\r\n // e.halt();\r\n });\r\n e.addEventListener('keydown', function (e) {\r\n var code = _codeFromEvent(e);\r\n \r\n switch (code) {\r\n case 32:\r\n if (this._match !== undefined)\r\n this._match.toggle();\r\n else {\r\n // lazyLoad\r\n matchClass.create(this).open();\r\n };\r\n e.halt();\r\n break;\r\n };\r\n });\r\n };\r\n }, this);\r\n \r\n // Add focus listener to aside\r\n var aside = d.getElementsByTagName('aside')[0];\r\n\r\n if (aside && aside.classList.contains('active') == false) {\r\n\r\n // Horrible lock to deal with sidebar clicks\r\n var asideClicked = false;\r\n \r\n // Make aside active on focus\r\n aside.addEventListener('focus', function(e) {\r\n this.classList.add('active');\r\n });\r\n\r\n // Deactivate focus when clicking anywhere else\r\n var body = d.getElementsByTagName('body')[0];\r\n if (body !== null) {\r\n body.addEventListener('click', function() {\r\n if (!asideClicked) {\r\n aside.classList.remove('active');\r\n }\r\n else {\r\n asideClicked = false;\r\n };\r\n });\r\n };\r\n\r\n /* Stop click event on aside\r\n * (to not trickle down to body)\r\n */\r\n aside.addEventListener('click', function(e) {\r\n asideClicked = true;\r\n });\r\n };\r\n\r\n \r\n // Replace QL select menus with KorAP menus\r\n var qlField = d.getElementById('ql-field');\r\n if (qlField !== null) {\r\n KorAP.QLmenu = selectMenuClass.create(\r\n d.getElementById('ql-field').parentNode\r\n ).limit(5);\r\n };\r\n\r\n var resultInfo = d.getElementById('resultinfo');\r\n\r\n /**\r\n * Add result panel\r\n */\r\n var resultPanel = resultPanelClass.create(show);\r\n\r\n if (resultInfo != null) {\r\n\r\n // Move buttons to resultinfo\r\n resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n // The views are at the top of the search results\r\n var sb = d.getElementById('search');\r\n sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n };\r\n\r\n \r\n // There is a koralQuery\r\n if (KorAP.koralQuery !== undefined) { \r\n\r\n // Add KoralQuery view to result panel\r\n if (resultInfo !== null) {\r\n resultPanel.addKqAction()\r\n };\r\n\r\n if (KorAP.koralQuery[\"errors\"]) {\r\n KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n // Malformed query\r\n if (e[0] === 302 && e[2] !== undefined) {\r\n obj.hint = hintClass.create();\r\n obj.hint.alert(e[2], e[1]);\r\n }\r\n\r\n // no query\r\n else if (e[0] === 301) {\r\n obj.hint = hintClass.create();\r\n obj.hint.alert(0, e[1]); \r\n }\r\n });\r\n };\r\n };\r\n\r\n \r\n /*\r\n * There is more than 0 matches, so allow for\r\n * alignment toggling (left <=> right)\r\n */\r\n if (matchElements.length > 0)\r\n resultPanel.addAlignAction();\r\n\r\n KorAP.Panel['result'] = resultPanel;\r\n /*\r\n * Toggle the Virtual Corpus builder\r\n */\r\n if (vcname) {\r\n vc.onMinimize = function () {\r\n vcname.classList.remove('active');\r\n delete show['vc'];\r\n };\r\n\r\n vc.onOpen = function () {\r\n vcname.classList.add('active');\r\n\r\n var view = d.getElementById('vc-view');\r\n if (!view.firstChild)\r\n view.appendChild(this.element());\r\n \r\n show['vc'] = true;\r\n };\r\n \r\n var vcclick = function () {\r\n if (vc.isOpen()) {\r\n vc.minimize()\r\n }\r\n else {\r\n vc.open();\r\n };\r\n };\r\n\r\n vcname.onclick = vcclick;\r\n\r\n // Click, if the VC should be shown\r\n if (show['vc']) {\r\n vcclick.apply();\r\n };\r\n };\r\n\r\n \r\n /**\r\n * Init Tutorial view\r\n */\r\n if (d.getElementById('view-tutorial')) {\r\n window.tutorial = tutClass.create(\r\n d.getElementById('view-tutorial'),\r\n KorAP.session\r\n );\r\n obj.tutorial = window.tutorial;\r\n }\r\n\r\n // Tutorial is in parent\r\n else if (window.parent) {\r\n obj.tutorial = window.parent.tutorial;\r\n };\r\n\r\n // Initialize queries for d\r\n if (obj.tutorial) {\r\n obj.tutorial.initQueries(d);\r\n\r\n // Initialize documentation links\r\n obj.tutorial.initDocLinks(d);\r\n };\r\n\r\n\r\n /**\r\n * Add VC creation on submission.\r\n */\r\n var form = d.getElementById('searchform');\r\n if (form !== null) {\r\n form.addEventListener('submit', function (e) {\r\n var qf = d.getElementById('q-field');\r\n \r\n // No query was defined\r\n if (qf.value === undefined || qf.value === '') {\r\n qf.focus();\r\n e.halt();\r\n KorAP.log(700, \"No query given\");\r\n return;\r\n };\r\n \r\n // Store session information\r\n KorAP.session.set(\"show\", show);\r\n\r\n if (vc !== undefined) {\r\n input.value = vc.toQuery();\r\n if (input.value == '')\r\n input.removeAttribute('name');\r\n }\r\n else {\r\n input.removeAttribute('value');\r\n input.removeAttribute('name');\r\n };\r\n\r\n // This would preferably set the query to be \"disabled\",\r\n // but in that case the query wouldn't be submitted\r\n // at all.\r\n // Setting the cursor to \"progress\" fails in current versions\r\n // of webkit.\r\n qf.classList.add(\"loading\");\r\n d.getElementById('qsubmit').classList.add(\"loading\");\r\n });\r\n };\r\n \r\n \r\n //Starts the guided tour at the next page\r\n if(KorAP.session.get(\"tour\")){\r\n tourClass.gTshowResults().start();\r\n }\r\n \r\n /**\r\n * Init hint helper\r\n * has to be final because of\r\n * reposition\r\n */\r\n // Todo: Pass an element, so this works with\r\n // tutorial pages as well!\r\n if (obj.hint === undefined)\r\n obj.hint = hintClass.create();\r\n\r\n // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n KorAP.Hint = obj.hint;\r\n\r\n\r\n /**\r\n * Add query panel\r\n */\r\n var queryPanel = queryPanelClass.create();\r\n\r\n // Get input field\r\n var sform = d.getElementById(\"searchform\");\r\n var vcView = d.getElementById('vc-view')\r\n if (sform && vcView) {\r\n // The views are below the query bar\r\n sform.insertBefore(queryPanel.element(), vcView);\r\n KorAP.Panel['query'] = queryPanel;\r\n }\r\n\r\n /**\r\n * Initialize Plugin registry.\r\n */\r\n let pe;\r\n if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n let url = pe.getAttribute('data-plugins');\r\n if (url !== undefined) {\r\n KorAP.API.getPluginList(url, function (json) {\r\n if (json && json.length > 0) {\r\n // Load Plugin Server first\r\n KorAP.Plugin = pluginClass.create();\r\n\r\n // Add services container to head\r\n d.head.appendChild(KorAP.Plugin.element());\r\n\r\n // Add pipe form\r\n KorAP.Pipe = pipeClass.create();\r\n d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n \r\n try {\r\n \r\n // Register all plugins\r\n json.forEach(i => KorAP.Plugin.register(i));\r\n }\r\n catch (e) {\r\n KorAP.log(0, e);\r\n }\r\n }\r\n });\r\n };\r\n };\r\n \r\n return obj;\r\n });\r\n \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'loc/de', 'init']);\r\n\ndefine(\"app/de\", function(){});\n\n}());"]}